Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
hhhhgggg

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

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

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)

)

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
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 (        (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é.

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

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
: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é.

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
: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 (        (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.

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
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à.

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
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.com/upfiles/3/proxy_2.dwg

Bác sửa giúp em vớ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
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.com/upfiles/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????

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

@ 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

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

  • Vote tăng 2

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

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

  • 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
File trước và sau EXPLODE :

http://www.cadviet.com/upfiles/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 (     (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ỉ.

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
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é !

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
Đăng nhập để thực hiện theo  

×