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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

Các bài được khuyến nghị

Các bác cho mình hỏi chút:

Bình thường khi tạo block mới thì thường dùng lệnh (command "BLOCK" ....)

Nhưng nhiều khi thì cách này có nhiều hạn chế (chậm, không tạo được block khi đang editing reference..)

Vậy em muốn hỏi các bác, ngoài cách dùng lệnh cad ra thì còn cách nào để tạo block mới được không?

(để sử dụng được trong lisp)

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có thể dùng entmake hoặc vla. Ví dụ entmake ở dưới, còn vla tìm chưa ra.


(defun Obj2blk (lstEnt blk pt)
 (entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 blk) (cons 70 2)))
 (mapcar '(lambda(ent) (entmake (entget ent)) (entdel ent)) lstEnt)
 (entmake (list (cons 0 "ENDBLK") (cons 8 "0")))
 (entmake (list (cons 0 "INSERT") (cons 2 blk) (cons 10 pt))))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
27 phút trước, Doan Van Ha đã nói:

Có thể dùng entmake hoặc vla. Ví dụ entmake ở dưới, còn vla tìm chưa ra.

 

  • cadvietlisp.lsp
    lisp help
  •  


(defun Obj2blk (lstEnt blk pt)
 (entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 blk) (cons 70 2)))
 (mapcar '(lambda(ent) (entmake (entget ent)) (entdel ent)) lstEnt)
 (entmake (list (cons 0 "ENDBLK") (cons 8 "0")))
 (entmake (list (cons 0 "INSERT") (cons 2 blk) (cons 10 pt))))

 

 

31 phút trước, duy782006 đã nói:

Dùng make đi bạn.

Hồi trước bác Hà hay bác Thái gì đó cho mình lisp makeentmake dùng sướng lắm

 

MakeEntmake.lsp

 

18 phút trước, ngokiet đã nói:

Em cảm ơn các bác, về Entmake thì đã hiểu, còn Vla theo bác Ngokiet trích link, e có thử mà chưa biết cách để thêm đối tượng là entityname vào block như ví dụ là thêm Circle vào block được, mong đc bác hướng dẫn thêm

Edit: tiện đây Bác @Doan Van Ha cho cháu hỏi, thông số (cons 70 2) có nhất thiết phải khai báo không ạ? và ý nghĩa của nó là gì, vì cháu thấy có bài khai báo khác: (cons 70 0)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hình như bác hỏi là tạo block.

Vla sử dụng vla object. Nên bác chuyển vlax-ename=>vla-object thôi. Mình chưa test cụ thể như thế nào.

Bác có thể tham khảo thêm

http://www.lee-mac.com/addobjectstoblock.html

Còn insert block thì chỉ có sau dòng insert block.

Ví dụ của autodesk gồm cả tạo block và insert block.

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
10 phút trước, Doan Nguyen Van đã nói:

thông số (cons 70 2) có nhất thiết phải khai báo không ạ? và ý nghĩa của nó là gì, vì cháu thấy có bài khai báo khác: (cons 70 0)

Theo mình biết thì 2 là block chứa att còn 0 thì là block thường.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
6 phút trước, ngokiet đã nói:

Hình như bác hỏi là tạo block.

Vla sử dụng vla object. Nên bác chuyển vlax-ename=>vla-object thôi.

Còn insert block thì chỉ có sau dòng insert block.

Ví dụ của autodesk gồm cả tạo block và insert block.

 

Đúng là thế bác, chỉ có điều ở ví dụ autodesk họ chỉ tạo block có tên và điểm point

sau đó add circle vào block đó...

Em đang muốn hỏi cách để add đối tượng khác do mình chọn trong bản vẽ vào block đó bác

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
3 phút trước, Doan Nguyen Van đã nói:

Đúng là thế bác, chỉ có điều ở ví dụ autodesk họ chỉ tạo block có tên và điểm point

sau đó add circle vào block đó...

Em đang muốn hỏi cách để add đối tượng khác do mình chọn trong bản vẽ vào block đó bác

Mình bổ sung link của leemac ở trên đó.

Mình ko trên máy nên chưa thử. Nhưng mình nghĩ là bên vla block cũng giống như ở model hay layout, vì chung nhóm. Nên cứ add trực tiếp là hay nhất.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

VLA của Lê Văn Mác


;----- Visual LISP makes things a lot easier in this case:
;; Objects to Block  -  Lee Mac
;; Converts a selection of objects to a block reference.
(defun c:obj2blk2 (/ b d l n p s)
 (if
  (and 
   (ssget "_:L" '((0 . "~VIEWPORT")))
   (progn
    (while (not (or (= "" (setq n (getstring t "\nSpecify block name <anonymous>: "))) (and (snvalid n) (null (tblsearch "block" n))))) (princ "\nBlock name invalid or already exists."))
    (if (= "" n) (setq n "*U"))
    (setq p (getpoint "\nSpecify base point: "))))
  (progn
   (setq d (vla-get-activedocument (vlax-get-acad-object)))
   (vlax-for o (setq s (vla-get-activeselectionset d))
    (setq l (cons o l)))
   (vla-delete s)
   (vlax-invoke d 'copyobjects l (setq b (vlax-invoke (vla-get-blocks d) 'add (trans p 1 0) n)))
   (vlax-invoke (vlax-get-property d (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace)) 'insertblock (trans p 1 0) (vla-get-name b) 1.0 1.0 1.0 0.0)
   (foreach o l (vla-delete o))))
 (princ))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
3 phút trước, Doan Van Ha đã nói:

VLA của Lê Văn Mác

 



;----- Visual LISP makes things a lot easier in this case:
; Objects to Block  -  Lee Mac
; Converts a selection of objects to a block reference.
(defun c:obj2blk2 (/ b d l n p s)
 (if
  (and 
   (ssget "_:L" '((0 . "~VIEWPORT")))
   (progn
    (while (not (or (= "" (setq n (getstring t "\nSpecify block name <anonymous>: "))) (and (snvalid n) (null (tblsearch "block" n))))) (princ "\nBlock name invalid or already exists."))
    (if (= "" n) (setq n "*U"))
    (setq p (getpoint "\nSpecify base point: "))))
  (progn
   (setq d (vla-get-activedocument (vlax-get-acad-object)))
   (vlax-for o (setq s (vla-get-activeselectionset d))
    (setq l (cons o l)))
   (vla-delete s)
   (vlax-invoke d 'copyobjects l (setq b (vlax-invoke (vla-get-blocks d) 'add (trans p 1 0) n)))
   (vlax-invoke (vlax-get-property d (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace)) 'insertblock (trans p 1 0) (vla-get-name b) 1.0 1.0 1.0 0.0)
   (foreach o l (vla-delete o))))
 (princ))

 

 

7 phút trước, ngokiet đã nói:

Mình bổ sung link của leemac ở trên đó.

Mình ko trên máy nên chưa thử. Nhưng mình nghĩ là bên vla block cũng giống như ở model hay layout, vì chung nhóm. Nên cứ add trực tiếp là hay nhất.

Hàm của bác Hạ chạy ngon lành rồi ạ, ^^, nhưng có vẻ Vla hơi cồng cềnh, cháu vẫn về với đội Ent văn Make trước của bác cho gọn :))

Cảm ơn bác nhiều ạ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vừa xong, Doan Nguyen Van đã nói:

 

Hàm của bác Hạ chạy ngon lành rồi ạ, ^^, nhưng có vẻ Vla hơi cồng cềnh, cháu vẫn về với đội Ent văn Make trước của bác cho gọn :))

Cảm ơn bác nhiều ạ

Bạn lưu ý 1 điều rất quan trọng: entmake xử lý unicode tốt còn vla/vlax xử lý unicode rất trời ơi, nên tốt nhất là dùng entmake cho lành.

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2 phút trước, ngokiet đã nói:

Mình thấy ínert thì vla gọn hơn. Còn tạo block thì entmake dễ hơn.

Nhưng insert mà block có attribute thì rối

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2 phút trước, Doan Van Ha đã nói:

Bạn lưu ý 1 điều rất quan trọng: entmake xử lý unicode tốt còn vla/vlax xử lý unicode rất trời ơi, nên tốt nhất là dùng entmake cho lành.

 

2 phút trước, ngokiet đã nói:

Mình thấy insert thì vla gọn hơn. Còn tạo block thì entmake dễ hơn.

Xin tiếp thu lời khuyên của 2 bác! ^^ 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các bác lại cho mình hỏi chút. 

Mình đang làm 1 thư viện block qua Lisp và DCL, nhưng còn 1 số thắc mắc

Có cách nào để lấy được Preview của block chèn vào Bảng DCL như preview của lệnh Insert trong CAD không các bác.

Mình mới tìm hiểu được cách sử dụng file ảnh *.SLD nhưng thấy hạn chế là phải tự chụp từng block và lưu lại, và phải lưu cho tất cả, điều đó sẽ tốn rất nhiều thời gian.

Mong được các bác quan tâm.

CET.jpg.4188adb562b3ab3d9843a9e1bec502e9.jpgISE.png.30ddd9f4d400ab00b8b8a19d17a61584.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lưu ý là text, mtext, att và hatch không hiển thị nhé và block nhiều đối tượng nó hiển thị chậm gây nên đứng cad. 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×