Chuyển đến nội dung
Diễn đàn CADViet

phamductai1989

Thành viên
  • Số lượng nội dung

    7
  • Đã tham gia

  • Lần ghé thăm cuối

Bài đăng được đăng bởi phamductai1989


  1. Xin đính chính bạn lại rằng VBA up trên forums là mình lập top  cách đây t.g khá lâu rồi. Do yêu cầu của một số mem và report search mình thấy khá nhiều nên mình up lại tiện cho mọi người theo dõi. Những bạn đã load về rồi thì có thể bỏ qua. Trc khi bạn chỉ trích ai xin hãy coi dõ nguồn bạn nhé!. Thân!


  2. Tại trang tin cũng đã có 1 ví dụ về chương trình LISP nhập xuất dữ liệu giữa AutoCAD và Excel.

    http://www.cadviet.com/content/view/20/1/

     

    Đó là chương trình eiPoint (Export Import Point), là chương trình khá đơn giản và cơ bản. Chúng ta có thể cải tiến nó để đáp ứng được từng mục đích riêng của mình.

     

    Dưới đây là mã lệnh của chương trình eiPoint (lấy từ trang tin):

    [code=

    Bản chất của quá trình trao đổi dữ liệu giữa AutoCAD và Excel trong ví dụ trên là tạo ra một tệp có đuôi .txt làm trung gian.


  3. Tại trang tin cũng đã có 1 ví dụ về chương trình LISP nhập xuất dữ liệu giữa AutoCAD và Excel.

    http://www.cadviet.com/content/view/20/1/

     

    Đó là chương trình eiPoint (Export Import Point), là chương trình khá đơn giản và cơ bản. Chúng ta có thể cải tiến nó để đáp ứng được từng mục đích riêng của mình.

     

    Dưới đây là mã lệnh của chương trình eiPoint (lấy từ trang tin):

    [code=

    Bản chất của quá trình trao đổi dữ liệu giữa AutoCAD và Excel trong ví dụ trên là tạo ra một tệp có đuôi .txt làm trung gian.


  4. Phần 1: bắt đầu

     

    Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.

     

    Hãy tạo một file mới và save nó với tên hoclisp.lsp.

    (princ "\nChao cadviet")

    (princ)

    Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao cadviet' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

     

    Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao cadviet" là tham số của hàm princ.

     

    Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao cadviet"\nChao cadviet"' trên màn hình, trong đó "\nChao cadviet" là kết quả của hàm (princ "\nChao cadviet").


  5. Patpat lại khích tướng rồi. Xin giới thiệu phần tiếp theo để mọi người khỏi phải chờ, hy vọng là nó có ích.

     

    Phần 4:

    * Các phần trước, chúng ta đã thực hành được với lệnh lisp tính diện tích của một đối tượng. Phần này, chúng ta sẽ đi vào cải tiến để lệnh tính diện tích sẽ áp dụng cho một tập đối tượng được chọn của chúng ta.

     

    * Trong AutoLisp tập đối tượng được lưu trong biến kiểu tập chọn. Với lệnh (ssget), có thể tạo ra một tập chọn chứa các đối tượng chúng ta chọn. Với lệnh (ssname ss index) chúng ta sẽ lấy được entname đối tượng thứ index trong tập đối tượng ss. lệnh (sslength ss) trả về số đối tượng trong tập chọn.

     

    * Tính diện tích của một tập đối tượng, ta sẽ tính diện tích của từng đối tượng trong tập này và cộng lại với nhau. Để làm được như vậy, chúng ta sẽ làm một hàm lặp như sau:

    (repeat sodoituong

    (setq

    ent_ht (ssname ssdt index)

    index (+ index 1)

    dientich (tinhdientich_one ent_ht)

    tongdientich (+ tongdientich dientich)

    )

    Vòng lặp này sẽ quét qua tất cả các đối tượng và cộng dồn diện tích của đối tượng hiện tại vào diện tích tổng. Trong đoạn mã trên, biến sodoituong chứa số đối tượng có trong tập chọn. index là biến chứa chỉ số của đối tượng hiện tại (index có giá trị từ 0 đến sodoituong-1). ent_ht là tên của đối tượng hiện tại. tinhdientich_one là hàm tính diện tích của một đối tượng được chỉ định, hàm này có được bằng cách gom 2 dòng lệnh của phần trước lại với nhau là: (command ".area" "o" ent)(setq dientich (getvar "area")). Tongdientich chính là diện tích của tất cả các đối tượng, giá trị này có được nhờ cộng dồn tất cả các giá trị của biến dientich lại với nhau.

     

    * Chương trình tính diện tích sẽ tiếp tục được cải tiến như sau:

    --------------------Gốc (xin nhắc lại phần trước):

    (defun c:tdt( / sel ent dientich)

    (princ "\nChao cadviet")

    (setq sel (entsel "\nHay chon doi tuong: "))

    (setq ent (car sel))

    (command ".area" "o" ent)

    (setq dientich (getvar "area"))

    (princ "\nDien tich tap doi tuong vua roi la: ")

    (princ dientich)

    (princ "\nm2")

    (princ)

    )

     

    --------------------Cải tiến (màu xám là đoạn code bỏ đi, màu xanh là đoạn code thêm mới):

    (defun c:tdt( / sel ent dientich)

    (princ "\nChao cadviet")

    ;(setq sel (entsel "\nHay chon doi tuong: "))

    (setq ssdt (ssget))

    ;(setq ent (car sel))

    (defun tinhdientich_one(ent)

    (command ".area" "o" ent)

    (setq dientich (getvar "area"))

    )

    ; khởi tạo các biến

    (setq

    sodoituong (sslength ssdt)

    index 0

    tongdientich 0.0

    )

     

    ; vòng lặp quét qua các đối tượng

    (repeat sodoituong

    (setq

    ent_ht (ssname ssdt index)

    index (1+ index)

    dientich (tinhdientich_one ent_ht)

    tongdientich (+ tongdientich dientich)

    )

    )

    (princ "\nDien tich tap doi tuong vua roi la: ")

    ;(princ dientich)

    ;in tổng diện tích

    (princ tongdientich)

    (princ "\nm2")

    (princ)

    )

     

    * Như vậy, chúng ta đã tạo được một đoạn code tính diện tích của một tập đối tượng. Tuy nhiên, đoạn code này hơi rườm rà, do có một lệnh định nghĩa hàm defun tinhdientich_one nằm ngay giữa đoạn code. Bây giờ, chúng ta sẽ làm sạch lại đoạn code trên bằng cách sắp xếp lại mà không thay đổi bất cứ ý nghĩa của một mã nào:

    (defun c:tdt( / sel ent dientich)

     

    ;định nghĩa hàm tính diện tích 1 đối tượng

    (defun tinhdientich_one(ent)

    (command ".area" "o" ent)

    (setq dientich (getvar "area"))

    )

     

    ; viết lời chào và chọn đối tượng

    (princ "\nChao cadviet")

    (setq ssdt (ssget))

     

    ; khởi tạo các biến

    (setq

    sodoituong (sslength ssdt)

    index 0

    tongdientich 0.0

    )

     

    ; quét qua tất cả các đối tượng trong tập chọn, tính diện tích và cộng dồn diện tích

    (repeat sodoituong

    (setq

    ent_ht (ssname ssdt index)

    index (1+ index)

    dientich (tinhdientich_one ent_ht)

    tongdientich (+ tongdientich dientich)

    )

    )

     

    ; xuất kết quả ra màn hình

    (princ "\nDien tich tap doi tuong vua roi la: ")

    (princ tongdientich)

    (princ "\nm2")

    (princ)

    )

     

    --------------------------------------------------------------------------------------------

    Phần tiếp theo sẽ trình bày phần tinh chỉnh code để:

    - kết xuất kết quả ra đối tượng text

    - lọc các đối tượng được chọn

    - ẩn các đoạn text trung gian.

     

    Cảm ơn các bạn vẫn đang theo dõi.

×