Đến nội dung


Hình ảnh
- - - - -

Nhờ cao thủ sửa giúp em đoạn list Explode !


  • Please log in to reply
14 replies to this topic

#1 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 13 December 2010 - 08:27 AM

Mục đích của lisp là để Explode đối tượng. Ví dụ có 1 Blog, bên trong Blog là các đối tượng, có thể là Blog khác hoặc Mtext gì gì đó. Em muốn chọn đối tượng là Blog mẹ Explode, và sau đó Explode tiếp các phần tử chứa trong blog đó !
CODE
(defun c:x()
( setq ss (ssget) )
(command "explode" ss)
(command "explode" ss) ; ( dòng lệnh này em không biết đối tượng con là gì )

(princ)
)
  • 0
Hoàng Giang

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 13 December 2010 - 12:22 PM

Mục đích của lisp là để Explode đối tượng. Ví dụ có 1 Blog, bên trong Blog là các đối tượng, có thể là Blog khác hoặc Mtext gì gì đó. Em muốn chọn đối tượng là Blog mẹ Explode, và sau đó Explode tiếp các phần tử chứa trong blog đó !
CODE

Chào bạn hhhhgggg,
Bạn xài thử cái này coi sao nhé

(defun c:x ( / ss i n e el)
(command "undo" "be")
( setq ss (ssget) )
(setq i 0
n (sslength ss)
)
(while (< i n)
(setq e (ssname ss i)
el (entget e)
)
(if (= (cdr (assoc 0 el )) "INSERT")
(expl e)
)
(setq i (1+ i))
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun expl (ent / els bln en )
(setq els (entget ent))
(if (= (cdr (assoc 0 els)) "INSERT")
(progn
(setq bln (cdr (assoc 2 els)))
(setq en (cdr (assoc -2 (tblsearch "block" bln))))
(setq en (entnext en))
(command "explode" ent )
)
)
(while en
(if (= (cdr (assoc 0 (entget en))) "INSERT")
(expl en)
)
(setq en (entnext en))
)

)


Có gì chưa ổn hãy post lên nhé. Bạn lưu ý là mình sử dụng lại cái lisp của bạn nên vẫn giữ nguyên lệnh chạy lisp là X . Phải coi chừng việc trùng với lệnh của CAD đó. Tốt nhất bạn nên thay cái tên lệnh này đi nhé.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 13 December 2010 - 02:34 PM

Chào bạn hhhhgggg,
Bạn xài thử cái này coi sao nhé


(defun c:x ( / ss i n e el)
(command "undo" "be")
( setq ss (ssget) )
(setq i 0
n (sslength ss)
)
(while (< i n)
(setq e (ssname ss i)
el (entget e)
)
(if (= (cdr (assoc 0 el )) "INSERT")
(expl e)
)
(setq i (1+ i))
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun expl (ent / els bln en )
(setq els (entget ent))
(if (= (cdr (assoc 0 els)) "INSERT")
(progn
(setq bln (cdr (assoc 2 els)))
(setq en (cdr (assoc -2 (tblsearch "block" bln))))
(setq en (entnext en))
(command "explode" ent )
)
)
(while en
(if (= (cdr (assoc 0 (entget en))) "INSERT")
(expl en)
)
(setq en (entnext en))
)

)


Có gì chưa ổn hãy post lên nhé. Bạn lưu ý là mình sử dụng lại cái lisp của bạn nên vẫn giữ nguyên lệnh chạy lisp là X . Phải coi chừng việc trùng với lệnh của CAD đó. Tốt nhất bạn nên thay cái tên lệnh này đi nhé.

:undecided: hic hic ! Bác check lại giúp em cái. Nó không chạy. E chủ ý thay lệnh của CAD mà. Như thế "X" cho nó vỡ tan ra !!!
  • 0
Hoàng Giang

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 13 December 2010 - 09:34 PM

:undecided: hic hic ! Bác check lại giúp em cái. Nó không chạy. E chủ ý thay lệnh của CAD mà. Như thế "X" cho nó vỡ tan ra !!!

Xin lỗi bạn, mình hơi chủ quan, không kiểm tra lại trường hợp các block chứa block con. Phép đệ quy mình sử dụng ở đây chưa đúng. Để mình kiểm tra và bổ sung lại sau nhé.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 13 December 2010 - 10:02 PM

:undecided: hic hic ! Bác check lại giúp em cái. Nó không chạy. E chủ ý thay lệnh của CAD mà. Như thế "X" cho nó vỡ tan ra !!!

Chào bạn hhhhgggg,
Bạn xem cái mình sửa lại này đã ổn chưa nhé,

(defun c:xbl ( / ss i n e el)
(command "undo" "be")
( setq ss (ssget) )
(setq i 0
n (sslength ss)
)
(while (< i n)
(setq e (ssname ss i)
el (entget e)
)
(if (= (cdr (assoc 0 el )) "INSERT")
(expl e)
)
(setq i (1+ i))
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun expl (ent / )
(setq p1 (car (acet-ent-geomextents ent))
p2 (cadr (acet-ent-geomextents ent))
)
(command "explode" ent )
(setq ssb (acet-ss-to-list (ssget "w" p1 p2 (list (cons 0 "insert")))))
(if ssb
(foreach en ssb
(expl en)
)
)
)

Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#6 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 13 December 2010 - 11:05 PM

Chào bạn hhhhgggg,
Bạn xem cái mình sửa lại này đã ổn chưa nhé,


(defun c:xbl ( / ss i n e el)
(command "undo" "be")
( setq ss (ssget) )
(setq i 0
n (sslength ss)
)
(while (< i n)
(setq e (ssname ss i)
el (entget e)
)
(if (= (cdr (assoc 0 el )) "INSERT")
(expl e)
)
(setq i (1+ i))
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun expl (ent / )
(setq p1 (car (acet-ent-geomextents ent))
p2 (cadr (acet-ent-geomextents ent))
)
(command "explode" ent )
(setq ssb (acet-ss-to-list (ssget "w" p1 p2 (list (cons 0 "insert")))))
(if ssb
(foreach en ssb
(expl en)
)
)
)

Chúc bạn vui.

Chào Bác bình trong cái hàm expl Bác dùng (ssget "w" ...) chi cho mệt lại phải set 2 điểm P1 P2 bác dùng (ssget "p") là được mà.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#7 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 14 December 2010 - 07:23 AM

Chào Bác bình trong cái hàm expl Bác dùng (ssget "w" ...) chi cho mệt lại phải set 2 điểm P1 P2 bác dùng (ssget "p") là được mà.

hic ! Trong trường hợp đối tượng PROXY của Autocad thì nó không chạy được. Cụ thể là em muốn EXPLODE đối tượng PROXY của cad, chứa MTEXT và các line bên trong. Các đối tượng bên trong của nó phải được Explode 1 lần nữa sau khi explode đối tượng PROXY thì ok !
Tức là sau khi explode bằng lisp, ta được các đối tượng là text và line...
Đây là đối tượng đó : http://www.cadviet.c...s/3/proxy_2.dwg
Bác sửa giúp em với !
  • 0
Hoàng Giang

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 14 December 2010 - 10:00 AM

hic ! Trong trường hợp đối tượng PROXY của Autocad thì nó không chạy được. Cụ thể là em muốn EXPLODE đối tượng PROXY của cad, chứa MTEXT và các line bên trong. Các đối tượng bên trong của nó phải được Explode 1 lần nữa sau khi explode đối tượng PROXY thì ok !
Tức là sau khi explode bằng lisp, ta được các đối tượng là text và line...
Đây là đối tượng đó : http://www.cadviet.c...s/3/proxy_2.dwg
Bác sửa giúp em với !

Chào bạn hhhhgggg,
Bạn là thành viên có thâm niên rồi mà như vầy sao??? Hãy xem lại cái yêu cầu đầu tiên bạn đặt ra nhé.
Với đối tượng là acad-proxy-entity thì lisp không chạy là phải vì lisp này mình viết cho đối tượng là block kia mà, đúng với điều bạn đã yêu cầu.
Block khác với acad-proxy-entity bạn ạ. Đừng nói suông như thế. Hãy post cái bản vẽ và cái kết quả bạn cần lên. Cái cách nói của bạn như vầy thật không phải của người làm kỹ thuật bạn ạ. Hãy rút kinh nghiệm nhé.
@ Bác Phamngoctukts: Cái tham số p theo Help là: P Last selection set created. Ở đây mình dã có bộ chọn nào đâu hả bác. Sau khi explode cái block nó mới nổ tung thành các đối tượng mới mà. Vậy nên mình mới phải dùng vầy. Có thể mình chưa hiểu hết ý nghĩa của cái tham số p này chăng????
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 14 December 2010 - 10:16 AM

....
@ Bác Phamngoctukts: Cái tham số p theo Help là: P Last selection set created. Ở đây mình dã có bộ chọn nào đâu hả bác. Sau khi explode cái block nó mới nổ tung thành các đối tượng mới mà. Vậy nên mình mới phải dùng vầy. Có thể mình chưa hiểu hết ý nghĩa của cái tham số p này chăng????

Ý như vầy, bác ạ :
(command "explode" (car(entsel)))
(setq ss (ssget "p"))

Bác có thể mở rộng cho 1 tập chọn nữa
  • 1

#10 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 14 December 2010 - 10:18 AM

Chào bạn hhhhgggg,
Bạn là thành viên có thâm niên rồi mà như vầy sao??? Hãy xem lại cái yêu cầu đầu tiên bạn đặt ra nhé.
Với đối tượng là acad-proxy-entity thì lisp không chạy là phải vì lisp này mình viết cho đối tượng là block kia mà, đúng với điều bạn đã yêu cầu.
Block khác với acad-proxy-entity bạn ạ. Đừng nói suông như thế. Hãy post cái bản vẽ và cái kết quả bạn cần lên. Cái cách nói của bạn như vầy thật không phải của người làm kỹ thuật bạn ạ. Hãy rút kinh nghiệm nhé.
@ Bác Phamngoctukts: Cái tham số p theo Help là: P Last selection set created. Ở đây mình dã có bộ chọn nào đâu hả bác. Sau khi explode cái block nó mới nổ tung thành các đối tượng mới mà. Vậy nên mình mới phải dùng vầy. Có thể mình chưa hiểu hết ý nghĩa của cái tham số p này chăng????

Chào bác Bình.
Tại bác không đọc kỹ yêu cầu của chủ Topic đấy chứ.! <_<

Mục đích của lisp là để Explode đối tượng. Ví dụ có 1 Blog, bên trong Blog là các đối tượng, có thể là Blog khác hoặc Mtext gì gì đó.
Em muốn chọn đối tượng là Blog mẹ Explode, và sau đó Explode tiếp các phần tử chứa trong blog đó !
........

hề hề, nổ tung cái blog là liên quan đến tội danh "HACK..." đấy.

Code : Explode Block dùng kĩ thuật đệ quy.
(defun ExplodeBlock (Blk_Obj); vla_obj
(foreach memb (vlax-invoke Blk_Obj 'Explode)
(if (eq (vla-get-ObjectName memb) "AcDbBlockReference")
(ExplodeBlock memb) ) ))

  • 2

#11 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 14 December 2010 - 11:13 AM

Chào bác Bình.
Tại bác không đọc kỹ yêu cầu của chủ Topic đấy chứ.! <_<
hề hề, nổ tung cái blog là liên quan đến tội danh "HACK..." đấy.

Hê hê! Ủng hộ bác gia_bach.
  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#12 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 14 December 2010 - 11:35 AM

@ Bác Phamngoctukts: Cái tham số p theo Help là: P Last selection set created. Ở đây mình dã có bộ chọn nào đâu hả bác. Sau khi explode cái block nó mới nổ tung thành các đối tượng mới mà. Vậy nên mình mới phải dùng vầy. Có thể mình chưa hiểu hết ý nghĩa của cái tham số p này chăng????

Bác thử chọn một đống hỗn độn gồm tất cả những thứ có thể explode được rồi explode ra say đó dùng (ssget "p") xem sao.
  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#13 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 14 December 2010 - 12:27 PM

Bác thử chọn một đống hỗn độn gồm tất cả những thứ có thể explode được rồi explode ra say đó dùng (ssget "p") xem sao.

File trước và sau EXPLODE :
http://www.cadviet.c...s/3/proxy_3.dwg
  • 0
Hoàng Giang

#14 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 14 December 2010 - 03:57 PM

File trước và sau EXPLODE :
http://www.cadviet.c...s/3/proxy_3.dwg

Chào bạn hhhhgggg,
Dùng cái ni coi đã vừa ý bạn chưa hỉ.

(defun c:xap ( )
(command "undo" "be")
(setq ssa (ssget (list (cons 0 "ACAD_PROXY_ENTITY")))
i 0
n (sslength ssa)
)
(while (< i n)
(setq en (ssname ssa i))
(command "explode" en)
(setq ssl (acet-ss-to-list (ssget "p")))

(foreach x ssl
(command "explode" x "")
)

(setq i (1+ i))
)
(command "undo" "e")
)


PS: khi test với cái bản vẽ bạn gửi thì sau khi chạy lisp nó không ra đúng như cái hình bạn gửi đâu nhé. Việc chỉnh sửa lại nhường cho bạn hỉ.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#15 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 14 December 2010 - 04:15 PM

Chào bạn hhhhgggg,
Dùng cái ni coi đã vừa ý bạn chưa hỉ.


(defun c:xap ( )
(command "undo" "be")
(setq ssa (ssget (list (cons 0 "ACAD_PROXY_ENTITY")))
i 0
n (sslength ssa)
)
(while (< i n)
(setq en (ssname ssa i))
(command "explode" en)
(setq ssl (acet-ss-to-list (ssget "p")))

(foreach x ssl
(command "explode" x "")
)

(setq i (1+ i))
)
(command "undo" "e")
)


PS: khi test với cái bản vẽ bạn gửi thì sau khi chạy lisp nó không ra đúng như cái hình bạn gửi đâu nhé. Việc chỉnh sửa lại nhường cho bạn hỉ.

ok ! chuẩn không cần chỉnh. Cảm ơn bác nhìu nhìu nhé !
  • 0
Hoàng Giang