Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
17 replies to this topic

#1 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 10 October 2011 - 11:09 AM

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á!
  • 0
Hình đã gửi

#2 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 10 October 2011 - 11:14 AM

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!
  • 0
Hình đã gửi

#3 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 10 October 2011 - 12:01 PM

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)
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#4 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 10 October 2011 - 02:39 PM

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!
  • 0
Hình đã gửi

#5 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 10 October 2011 - 03:39 PM

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)
)
)

  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#6 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 10 October 2011 - 03:40 PM

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
)

  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#7 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 10 October 2011 - 04:25 PM

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.
  • 0

#8 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 11 October 2011 - 10:09 AM

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!
  • 0
Hình đã gửi

#9 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 11 October 2011 - 10:28 AM

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 :)
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#10 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 11 October 2011 - 01:13 PM

ok! Thanks các pác!
  • 0
Hình đã gửi

#11 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 11 October 2011 - 03:25 PM

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 :)
  • 0

#12 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 11 October 2011 - 03:59 PM

1 dòng thôi :

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

  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#13 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 11 October 2011 - 04:09 PM

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
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#14 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 11 October 2011 - 04:27 PM

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
  • 4
Hình đã gửi

#15 ptd1987

ptd1987

    biết vẽ ellipse

  • Members
  • PipPip
  • 52 Bài viết
Điểm đánh giá: -5 (bình thường)

Đã gửi 13 March 2014 - 05:23 PM

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


  • 0

#16 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 13 March 2014 - 05:44 PM

Bạn xóa tất cả chữ "All" đi ^^


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#17 ptd1987

ptd1987

    biết vẽ ellipse

  • Members
  • PipPip
  • 52 Bài viết
Điểm đánh giá: -5 (bình thường)

Đã gửi 13 March 2014 - 09:03 PM

Bạn xóa tất cả chữ "All" đi ^^

đã thử và đã thất bại ^.^


  • 0

#18 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 14 March 2014 - 04:48 PM

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.c...ong-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))
  	)
	)
  )


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC