Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
lp_hai

[Đã xong + ?]Lisp chọn nhiều đối tượng giống nhau

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

lp_hai    208

Chào cả nhà! Em viết cái này để chọn những dt giống nhau mà khỏi phải Qslect, hay layiso...

Nguyên lý của nó là chọn theo thuộc tính: loại dt (line, pline, block...), layer. Nếu là block thì sẽ thêm chọn theo blockname. Em thấy cũng hiệu quả lắm. Mà công cụ Select similar thì từ cad 2010 trở đi mới có :)

(defun c:sw(/ aaa ls na lay dt dt1 sdt sdt1 ent ent1 id id1)

 

Các pác chạy thử rồi cho em ý kiến nhá!

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
lp_hai    208

Các pác cho em "tự sướng" luôn - vừa post vừa trả lời?! hehheheh

Lisp có một nhược điểm là ko làm việc được đối với Dynamic Block vì Dy-Block thì ko có tên giống nhau được, mong các pác chỉ giáo!

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
ketxu    2.653

Không bàn về cách hoạt động, Ketxu chỉ góp ý 1 tí để bạn code (có thể) gọn hơn, bạn tham khảo nhé :

- Những biến chỉ dùng 1 lần thì không nên tạo, mà cho luôn vào code (ví dụ sslength cho repeat của bạn)

-

(setq sdt1 (sslength dt1))(repeat sdt1;;repeat2 (setq ent1 (ssname dt1 id1) id1 (1+ id1) .... )

Có thể thay bằng

(while (setq ent1(ssname dt1 (setq id1 (1+ id1)))) => do sth
với id1 khởi trị bằng -1

 

- (cons 0 (cdr(assoc 0 ls)) = (assoc 0 ls)

  • 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
lp_hai    208

Không bàn về cách hoạt động, Ketxu chỉ góp ý 1 tí để bạn code (có thể) gọn hơn, bạn tham khảo nhé :

- Những biến chỉ dùng 1 lần thì không nên tạo, mà cho luôn vào code (ví dụ sslength cho repeat của bạn)

-

 

Có thể thay bằng

với id1 khởi trị bằng -1

 

- (cons 0 (cdr(assoc 0 ls)) = (assoc 0 ls)

vâng, đúng là code dài dòng, Số là em viết cái này lúc tập tành nên muốn nó "rõ ràng" để em xem mà còn hiểu. hehhehe.

Sẵn đây các pác chỉ giáo cái vụ Dynamic block luôn ah!

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
Detailing    278

vâng, đúng là code dài dòng, Số là em viết cái này lúc tập tành nên muốn nó "rõ ràng" để em xem mà còn hiểu. hehhehe.

Sẵn đây các pác chỉ giáo cái vụ Dynamic block luôn ah!

Bạn xem qua đoạn code select Dynamic Block này nha. Hy vọng bạn có thể làm dc như ý.

Nếu ko phải Dynmic Block sẽ trả về tên đối tượng

Goodluck!

(defun getDynBlockName (obj)
(if	(vlax-property-available-p obj 'effectivename)
 	(vla-get-effectivename obj)
 	(vla-get-name obj)
)
 )

  • 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
ketxu    2.653

Dynamic Block có EffectiveName không đổi. Để lấy nó ra bạn có thể :

(vlax-get-property block (if (vlax-property-available-p blockobject 'EffectiveName) 'EffectiveName 'Name) )

Với block là VLA object , bằng (vlax-ename->vla-object ename)

Lưu ý là cách này có thể phá sản nếu tên chứa các ký tự Unicode đặc biệt, tuy nhiên cách xâm nhập vào Dictionary của nó thì khá dài, bạn có xài thì nghiên cứu cái này của LM :

(defun LM:EffectiveName ( blockentity / name repbtag )
 (if (wcmatch (setq name (cdr (assoc 2 (entget blockentity)))) "`**")
(if
 	(and
   	(setq repbtag
     	(cdadr
       	(assoc -3
         	(entget
           	(cdr
             	(assoc 330
               	(entget (tblobjname "BLOCK" name))
             	)
           	)
      		'("AcDbBlockRepBTag")
         	)
       	)
     	)
   	)
   	(setq repbtag (handent (cdr (assoc 1005 repbtag))))
 	)
 	(setq name (cdr (assoc 2 (entget repbtag))))
)
 )
 name
)

  • 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
LoveLisp    20

Chào cả nhà! Em viết cái này để chọn những dt giống nhau mà khỏi phải Qslect, hay layiso...

Nguyên lý của nó là chọn theo thuộc tính: loại dt (line, pline, block...), layer. Nếu là block thì sẽ thêm chọn theo blockname.

 

Với yêu cầu này thì mình thấy trong CAD (phần Express) đã có sẵn rồi. Bạn chỉ việc gõ lệnh SSX và làm theo hướng dẫn.

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
lp_hai    208

Thanks các pác! bi giờ thì e đã có dc Tên block rồi, Tiếp theo là lọc tên block với hàm ssget dc ko ah? kiểu như:

(ssget "all" '((assoc 2 (entget repbtag))))

trong đó reptag la đối số mà ta truy ngược lại theo hướng dẫn của Ket!

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
ketxu    2.653

Block name là giá trị trả về của cả hàm, chứ không phải repbtag bạn ạ :)

- Ngoài ra, nếu không dùng được filter list ngay trong ssget, bạn có thể lọc lại bằng cách lấy toàn bộ Insert rồi kiểm duyệt tên Block :)

  • 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
victor85    10

Mình dùng thử lisp thấy nó hướng dẫn những j á, ko biết làm sao cho dùng được.

Nhân tiện sẵn topic này mình nhờ vả các bác luôn viết dùm cái lisp filter nhanh đối tượng là:

Bước 1: chọn loại đối tượng (dim, line, arc, ...)

Bước 2: Chọn cửa sổ cần bắt các đối tượng

Kết quả bắt được các đối tượng cùng loại nằm trong cửa sổ vừa chọn.

Mình ngại ko muốn lập thêm topic mới vì sợ loãng chủ đề, nên nếu có j ko phải cho mình xin lỗi trước các bác trong ban quản trị diễn đàn cad viet vậy nhé.

Chúc các bác sức khỏe, công tác tố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
ketxu    2.653

1 dòng thôi :

(defun c:test nil (sssetfirst nil (ssget (list (assoc 0 (entget (car (entsel "\nDoi tuong mau :"))))))))

  • 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
lp_hai    208

Mình không down được lisp ở #1. Nhưng các bác làm cho nó giống Qselect thì tuyệt (Có cả DCL)

hehe :D :D

tại mình thấy lisp chưa hoàn thiện với lại có vẻ như "ko ai xài" nên gỡ xuống. Theo hướng dẫn của các pác ở trên mình viết lại đây:

(defun c:sw(/ aaa ls dt dt1 sdt sdt1 ent ent1 id id1)
 (setq AAA(SSGET)
sdt (sslength AAA)
id 0
dt (ssadd)
)
 (repeat sdt;;repeat1
(setq ent (ssname AAA id)
id (1+ id)
);;setq
(setq ls (entget ent))
(if (= (cdr (assoc 0 ls)) "INSERT")
 	(get-block ent)
 	(setq dt1(ssget"all"(list(assoc 0 ls) (assoc 8 ls))))
 	);;if
(setq sdt1 (sslength dt1)
  id1 -1)
(while (setq ent1(ssname dt1 (setq id1 (1+ id1))))
 	(setq dt (ssadd ent1 dt))
 	);;While
(sssetfirst dt dt)
(princ)
);;repeat1
 )
;;;;;;;;;;;;;;;;;;;;;;;;
(defun get-block(entm / sdtb idb ent2 entb dtm namem name BBB entb)
 (setq dtm (vlax-ename->vla-object entm))
 (setq namem (if(vlax-property-available-p dtm 'effectivename)
  (vla-get-effectivename dtm)
  (vla-get-name dtm)
  ));;;
 (setq BBB(SSGET "all" (list(cons 0 "INSERT") (assoc 8 (entget entm))))
sdtb (sslength BBB)
idb 0
dt1 (ssadd)
)
 (repeat sdtb;;repeat1
(setq entb (ssname BBB idb)
idb (1+ idb)
)
(setq ent2(vlax-ename->vla-object entb))
(setq name (if(vlax-property-available-p ent2 'effectivename)
  (vla-get-effectivename ent2)
  (vla-get-name ent2)
  ))
(if (= name namem)
 	(setq dt1 (ssadd entb dt1))
 	)
)
 )

lisp cho phép người dùng chọn nhiều dt mẫu cùng lúc

  • Vote tăng 4

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
ptd1987    5

lisp này xài rất hay nhưng có thể sửa cho chọn vùng giới hạn dc ko ạ, vì nó chọn tất cả bản vẽ trong file thật ko tiện chút nào, nhiều khi đang xóa block ở mb lanh tô mà chọn đối tượng bị dính trong mb dầm sàn, ko để ý là bị xóa mấ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
ketxu    2.653

K biết bạn thất bại cái j, ở đâu, mình cũng thử xoá và vẫn thấy dùng bình thường. Nhớ là xoá chữ All đi rồi thì thao tác chọn sẽ làm 2 lần

 

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/topic/56306-da-xong-lisp-chon-nhieu-doi-tuong-giong-nhau/
(defun c:sw(/ aaa ls dt dt1 sdt sdt1 ent ent1 id id1)
  (setq AAA(SSGET)
sdt (sslength AAA)
id 0
dt (ssadd)
)
  (repeat sdt;;repeat1
	(setq ent (ssname AAA id)
id (1+ id)
);;setq
	(setq ls (entget ent))
	(if (= (cdr (assoc 0 ls)) "INSERT")
  	(get-block ent)
  	(setq dt1 (ssget (list(assoc 0 ls) (assoc 8 ls))))
  	);;if
	(setq sdt1 (sslength dt1)
   id1 -1)
	(while (setq ent1(ssname dt1 (setq id1 (1+ id1))))
  	(setq dt (ssadd ent1 dt))
  	);;While
	(sssetfirst dt dt)
	(princ)
	);;repeat1
  )
;;;;;;;;;;;;;;;;;;;;;;;;
(defun get-block(entm / sdtb idb ent2 entb dtm namem name BBB entb)
  (setq dtm (vlax-ename->vla-object entm))
  (setq namem (if(vlax-property-available-p dtm 'effectivename)
   (vla-get-effectivename dtm)
   (vla-get-name dtm)
   ));;;
  (setq BBB(SSGET  (list(cons 0 "INSERT") (assoc 8 (entget entm))))
sdtb (sslength BBB)
idb 0
dt1 (ssadd)
)
  (repeat sdtb;;repeat1
	(setq entb (ssname BBB idb)
idb (1+ idb)
)
	(setq ent2(vlax-ename->vla-object entb))
	(setq name (if(vlax-property-available-p ent2 'effectivename)
   (vla-get-effectivename ent2)
   (vla-get-name ent2)
   ))
	(if (= name namem)
  	(setq dt1 (ssadd entb dt1))
  	)
	)
  )

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
vodoifx    1

 

K biết bạn thất bại cái j, ở đâu, mình cũng thử xoá và vẫn thấy dùng bình thường. Nhớ là xoá chữ All đi rồi thì thao tác chọn sẽ làm 2 lần

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/topic/56306-da-xong-lisp-chon-nhieu-doi-tuong-giong-nhau/
(defun c:sw(/ aaa ls dt dt1 sdt sdt1 ent ent1 id id1)
  (setq AAA(SSGET)
sdt (sslength AAA)
id 0
dt (ssadd)
)
  (repeat sdt;;repeat1
	(setq ent (ssname AAA id)
id (1+ id)
);;setq
	(setq ls (entget ent))
	(if (= (cdr (assoc 0 ls)) "INSERT")
  	(get-block ent)
  	(setq dt1 (ssget (list(assoc 0 ls) (assoc 8 ls))))
  	);;if
	(setq sdt1 (sslength dt1)
   id1 -1)
	(while (setq ent1(ssname dt1 (setq id1 (1+ id1))))
  	(setq dt (ssadd ent1 dt))
  	);;While
	(sssetfirst dt dt)
	(princ)
	);;repeat1
  )
;;;;;;;;;;;;;;;;;;;;;;;;
(defun get-block(entm / sdtb idb ent2 entb dtm namem name BBB entb)
  (setq dtm (vlax-ename->vla-object entm))
  (setq namem (if(vlax-property-available-p dtm 'effectivename)
   (vla-get-effectivename dtm)
   (vla-get-name dtm)
   ));;;
  (setq BBB(SSGET  (list(cons 0 "INSERT") (assoc 8 (entget entm))))
sdtb (sslength BBB)
idb 0
dt1 (ssadd)
)
  (repeat sdtb;;repeat1
	(setq entb (ssname BBB idb)
idb (1+ idb)
)
	(setq ent2(vlax-ename->vla-object entb))
	(setq name (if(vlax-property-available-p ent2 'effectivename)
   (vla-get-effectivename ent2)
   (vla-get-name ent2)
   ))
	(if (= name namem)
  	(setq dt1 (ssadd entb dt1))
  	)
	)
  )

Em chào anh. Anh xem lại giúp em đối với đối tượng khi là block ạ.

Các đối tượng khác thì ok. Nhưng Block thì chưa được đâ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
Thaistreetz    515

Mình có 1 ứng dụng đang free cho anh em trên AppStore làm đúng cái việc trên. anh em có thể tải về sài theo link dưới.

https://apps.autodesk.com/ACD/en/Detail/Index?id=1455487038690013482&appLang=en&os=Win32_64

 

Đây là lisp mà anh em đồng nghiệp đánh giá là đáng giá nhất trong tất cả các lisp mình đã viết. giúp giảm rất nhiều thời gian làm việc với Cad.

Ps: Không cần like bài này. Anh em tải về đừng quên vote 5* cho app để mềnh lấy tiếng nhớ.  :D

  • Vote tăng 5

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
conghoa    93

Lisp rất hay bác Thaistreetz ah, bác cho em hỏi thêm là muốn hiện cái bảng chỉnh sửa thì làm thế nào vậy?

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
Thaistreetz    515

Mình ghi rõ trong phần help rồi nhỉ. Click chuột phải trước khi chọn đối tượng mẫu để gọi hộp thoại thiết lập bộ lọc

  • 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
txquychk51    2

nhân tiện đây e nhờ các bác viết hộ e lisp chuyển layer cho các đối tượng là block (kể cả dynamic). các block cần chuyển là "Mat cat", "TIEU DE", "Dau co", "CĐ", và nếu cần thêm block nào nữa thì e sẽ tự thêm vào lisp sau. chỉ cần gõ lệnh b2b thì các block có tên

"Mat cat","TIEU DE" thì chuyển sang layer 07.Text3.0

"Dau co" thì chuyển sang layer 08.Center

"CĐ" thì chuyển sang layer 06.Text1.8

dưới đây là file mẫu ạ

 http://www.cadviet.com/upfiles/7/136661_0108_mo_m1_m2.dwg

  • Vote giảm 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
vtd_xd    5

Mình có 1 ứng dụng đang free cho anh em trên AppStore làm đúng cái việc trên. anh em có thể tải về sài theo link dưới.

https://apps.autodesk.com/ACD/en/Detail/Index?id=1455487038690013482&appLang=en&os=Win32_64

 

Đây là lisp mà anh em đồng nghiệp đánh giá là đáng giá nhất trong tất cả các lisp mình đã viết. giúp giảm rất nhiều thời gian làm việc với Cad.

Ps: Không cần like bài này. Anh em tải về đừng quên vote 5* cho app để mềnh lấy tiếng nhớ.  :D

 

Không dùng đuợc cho cad 2007 àh bạn

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
vietanh2108    6

http://www.kimprojects.com/a-much-better-select-similar-autocad/

 

Em kiếm được lisp này quá hay và tiện, tuy nhiên em muốn sửa chút chút, mong bác nào đi qua giúp dùm tí. Ở select block nếu mà bổ sung thêm tính năm chỉ chọn các block có cùng tag value vs block mẫu thì hay quá!

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


×