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

[Yêu cầu] lisp chuyển các đối tượng về 1 layer

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

Chào cả nhà.

Các bác giúp em viết lisp chuyển các đối tượng vẽ từ nhiều layer về 1 layer nào đó

Cụ thể:

Chuyển các đối tượng là DIM về layer DIM

Chuyển các đối tượng là HATCH về layer HATCH

Chuyển các đối tượng là TEXT về layer TEXT

Chuyển các đối tượng là BLOCK về layer BLOCK

...

Lips này tương tự như chức năng filter các đối tượng rồi chuyển về layer nào đó của Mr.Lâm trong phần mềm TKXD.

Cảm ơn các bác.

  • 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
Chào cả nhà.

Các bác giúp em viết lisp chuyển các đối tượng vẽ từ nhiều layer về 1 layer nào đó

Cụ thể:

Chuyển các đối tượng là DIM về layer DIM

Chuyển các đối tượng là HATCH về layer HATCH

Chuyển các đối tượng là TEXT về layer TEXT

Chuyển các đối tượng là BLOCK về layer BLOCK

...

Lips này tương tự như chức năng filter các đối tượng rồi chuyển về layer nào đó của Mr.Lâm trong phần mềm TKXD.

Cảm ơn các bác.

 

Lisp O2L (Object to layer) dưới đây sẽ giúp bạn. Nếu bạn muốn chuyển các đối tượng khác, bạn hãy copy rồi thêm dòng lệnh (cons "KIEUDOITUONG" "TENLAYER") vào cụm các lệnh cons phía dưới.

 

(defun c:o2l ( / ss pp lstoblayer)
 (setq
   lstoblayer
    (list
      (cons "DIMENSION" "DIM")		; chuyen doi tuong Dimension ve layer DIM 
      (cons "HATCH" "HATCH")
      (cons "INSERT" "BLOCK")		; BLOCK (la doi tuong insert) ve layer BLOCK
      (cons "*TEXT" "TEXT")		; TEXT va MTEXT ve layer text
    )    
 )

 (foreach pp lstoblayer    
   (setq ss (ssget "X" (list (cons 0 (car pp)))))
   (if (not (tblsearch "layer" (cdr pp)))
     (command ".layer" "m" (cdr pp) "")
   )
   (command ".chprop" ss "" "la" (cdr pp) "")    
 )  
 (princ)
)

  • 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
Lisp O2L (Object to layer) dưới đây sẽ giúp bạn. Nếu bạn muốn chuyển các đối tượng khác, bạn hãy copy rồi thêm dòng lệnh (cons "KIEUDOITUONG" "TENLAYER") vào cụm các lệnh cons phía dưới.

 

(defun c:o2l ( / ss pp lstoblayer)
 (setq
   lstoblayer
    (list
      (cons "DIMENSION" "DIM")		; chuyen doi tuong Dimension ve layer DIM 
      (cons "HATCH" "HATCH")
      (cons "INSERT" "BLOCK")		; BLOCK (la doi tuong insert) ve layer BLOCK
      (cons "*TEXT" "TEXT")		; TEXT va MTEXT ve layer text
    )    
 )

 (foreach pp lstoblayer    
   (setq ss (ssget "X" (list (cons 0 (car pp)))))
   (if (not (tblsearch "layer" (cdr pp)))
     (command ".layer" "m" (cdr pp) "")
   )
   (command ".chprop" ss "" "la" (cdr pp) "")    
 )  
 (princ)
)

 

Cảm ơn bác nhiều lắm, bác giúp nốt e 1 tí nữa, em dốt lisp lắm :cheers:

Như lisp bác viết thì khi ta dùng lệnh o2l nó sẽ chuyển tất cả, trong 1 file lisp em muốn tách riêng biệt từng lệnh có được không?

Ví dụ:

d2d chuyển các dim về layer DIM

h2h: chuyển các hatch về layer HATCH

b2b: chuyển các block về layer BLOCK

t2t: chuyển các text về layer TEXT

(Các lệnh để trong 1 file lisp thôi bác nhé)

  • 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

Xin phép bác NGUYEN HOANH

 

(defun CHANGE-LAYER (_TYPE LAYER / OBJS)
(setq OBJS (ssget "X" (list (cons 0 _TYPE))))
(if (not (tblsearch "layer" LAYER))
 (command ".layer" "m" LAYER "")
);_ end if
(command ".chprop" OBJS "" "la" LAYER "")
(princ)
);_ end defun
(defun C:D2D (/ OBJS) (CHANGE-LAYER "DIMENSION" "DIM"))
(defun C:H2H (/ OBJS) (CHANGE-LAYER "HATCH" "HATCH"))
(defun C:B2B (/ OBJS) (CHANGE-LAYER "INSERT" "BLOCK"))
(defun C:T2T (/ OBJS) (CHANGE-LAYER "*TEXT" "TEXT"))

  • Vote tăng 10

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

Lisp này rất hay, nhưng biến tất cả các đối tượng thành 1 loại, nhưng trên bản vẽ có 2 loại text thì sao???????????

 

Bạn nào có lisp gọi nhanh layer (chỉ cần click vào chọn layer là tự động gọi tên layer đó )

 

Thanks

  • 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

Mở rộng cho chủ đề này đây

http://www.cadviet.com/forum/index.php?showtopic=24994

Mời các bạn theo dõi và tham khảo. Thâ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

Lisp O2L (Object to layer) dưới đây sẽ giúp bạn. Nếu bạn muốn chuyển các đối tượng khác, bạn hãy copy rồi thêm dòng lệnh (cons "KIEUDOITUONG" "TENLAYER") vào cụm các lệnh cons phía dưới.

 

(defun c:o2l ( / ss pp lstoblayer)  (setq    lstoblayer 	(list   	(cons "DIMENSION" "DIM")		; chuyen doi tuong Dimension ve layer DIM        (cons "HATCH" "HATCH")   	(cons "INSERT" "BLOCK")		; BLOCK (la doi tuong insert) ve layer BLOCK   	(cons "*TEXT" "TEXT")		; TEXT va MTEXT ve layer text 	)      )  (foreach pp lstoblayer        (setq ss (ssget "X" (list (cons 0 (car pp)))))    (if (not (tblsearch "layer" (cdr pp)))      (command ".layer" "m" (cdr pp) "")    )    (command ".chprop" ss "" "la" (cdr pp) "")      )    (princ))

Em chào bác Hoành ạ.

Em muốn tìm một đoạn lisp chuyển các đối tượng của Block về cùng một Layer mà tìm chưa thấy được, Em thấy đoạn lisp này của bác là gần với mong muốn của em nhất. Ví dụ Em có một Block A, trong A có 2 đối tượng: 1 đối tượng B thuộc layer 1, 1 đối tượng C thuộc Layer 2. Bây giờ em muốn đối tượng B và đối tượng C chuyển về cùng một Layer là Layer Block. Em đã thử đoạn lisp trên của bác thì nó chuyển đối tượng A về layer Block (Còn B và C thì vẫn giữ nguyên layer của nó). Bác có thể giúp em chuyển luôn cả layer của B và C về layer BLock giống như A được không ạ. Em xin cảm ơn ạ

  • 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

Không có bác nào giúp em với ạ. Em đã thử search, rồi vào từng trang tìm dần rồi mà vẫn chưa thấy đoạn lisp nào giống như yêu cầu.

P/S: Em vẫn đang tìm tiếp, nhưng bác nào biết nó ở chỗ nào chỉ giúp em đường link thì tốt quá. Em xin cảm ơn trước ạ!

  • 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

Em chào bác Hoành ạ.

Em muốn tìm một đoạn lisp chuyển các đối tượng của Block về cùng một Layer mà tìm chưa thấy được, Em thấy đoạn lisp này của bác là gần với mong muốn của em nhất. Ví dụ Em có một Block A, trong A có 2 đối tượng: 1 đối tượng B thuộc layer 1, 1 đối tượng C thuộc Layer 2. Bây giờ em muốn đối tượng B và đối tượng C chuyển về cùng một Layer là Layer Block. Em đã thử đoạn lisp trên của bác thì nó chuyển đối tượng A về layer Block (Còn B và C thì vẫn giữ nguyên layer của nó). Bác có thể giúp em chuyển luôn cả layer của B và C về layer BLock giống như A được không ạ. Em xin cảm ơn ạ

Các bác ơi đoạn lisp như yêu cầu của em có làm được không ạ? Sao không thấy ai ý kiến gì thế? Em tìm trên diễn đàn 3 ngày rồi mà chưa thấy Lisp nào giống như yêu cầu. Các bác 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

Làm được - lúc nào rảnh mình post

Cảm ơn anh Ket.

Em mới tìm thấy đoạn lisp của anh bên xaydungit có tác dụng chuyển layer của tất cả các đối tượng trong block về Layer hiện hành. Đoạn lisp đó em copy về và save dưới dạng .LSP như sau ạ.

http://www.cadviet.com/upfiles/3/110072_coblk.lsp

Em dự định là sẽ dùng đoạn lisp này để áp dụng cho ý định của mình. Nhưng khi add vào Cad thì nó báo lỗi là

Command: aq

APPLOAD CoBlk.Lsp successfully loaded.

Command: ; error: bad argument type: consp "INSERT".

Anh xem em copy có lỗi gì không. Hoặc anh rảnh thì Post đoạn lisp mà anh nói cho em xin với nhé.

Thanks anh nhiều 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

Chào cả nhà.

Các bác giúp em viết lisp chuyển các đối tượng vẽ từ nhiều layer về 1 layer nào đó

Cụ thể:

Chuyển các đối tượng là DIM về layer DIM

Chuyển các đối tượng là HATCH về layer HATCH

Chuyển các đối tượng là TEXT về layer TEXT

Chuyển các đối tượng là BLOCK về layer BLOCK

...

Lips này tương tự như chức năng filter các đối tượng rồi chuyển về layer nào đó của Mr.Lâm trong phần mềm TKXD.

Cảm ơn các 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ảm ơn anh Ket.

Em mới tìm thấy đoạn lisp của anh bên xaydungit có tác dụng chuyển layer của tất cả các đối tượng trong block về Layer hiện hành. Đoạn lisp đó em copy về và save dưới dạng .LSP như sau ạ.

http://www.cadviet.c...10072_coblk.lsp

Em dự định là sẽ dùng đoạn lisp này để áp dụng cho ý định của mình. Nhưng khi add vào Cad thì nó báo lỗi là

Command: aq

APPLOAD CoBlk.Lsp successfully loaded.

Command: ; error: bad argument type: consp "INSERT".

Anh xem em copy có lỗi gì không. Hoặc anh rảnh thì Post đoạn lisp mà anh nói cho em xin với nhé.

Thanks anh nhiều nhiều ạ!

Hề hề hề,

Dùng thử cái này coi sao nhé


(defun c:clb (/ bls)
(vl-load-com)
(if (not (tblsearch "layer" "BLOCK"))
   (command "layer" "m" "Block" "")
)
(alert "\n Chon tap hop cac block muon chuyen layer")
(setq bls (acet-ss-to-list (ssget (list (cons 0 "insert")))))
(foreach b bls
    (cblc B)       
)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun cblc (bl / els a els1)

(setq els (entget bl)
              els (subst (cons 8 "block") (assoc 8 els) els)
               a (entnext bl)  )
    (entmod els)
    (while (/= (cdr (assoc 0 (entget a))) "SEQEND")
           (if (/= (cdr (assoc 0 (entget a))) "INSERT")
               (progn
                    (setq els1 (entget a)
                         els1 (subst (cons 8 "block") (assoc 8 els1) els1) )
                   (entmod els1)
               )
               (cblc a)
            )
            (setq a (entnext a))
     )
)

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ề hề hề,

Dùng thử cái này coi sao nhé


(defun c:clb (/ bls)
(vl-load-com)
(if (not (tblsearch "layer" "BLOCK"))
   (command "layer" "m" "Block" "")
)
(alert "\n Chon tap hop cac block muon chuyen layer")
(setq bls (acet-ss-to-list (ssget (list (cons 0 "insert")))))
(foreach b bls
	(cblc B)      
)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun cblc (bl / els a els1)

(setq els (entget bl)
          	els (subst (cons 8 "block") (assoc 8 els) els)
               a (entnext bl)  )
	(entmod els)
	(while (/= (cdr (assoc 0 (entget a))) "SEQEND")
           (if (/= (cdr (assoc 0 (entget a))) "INSERT")
               (progn
                	(setq els1 (entget a)
                         els1 (subst (cons 8 "block") (assoc 8 els1) els1) )
                   (entmod els1)
               )
               (cblc a)
        	)
        	(setq a (entnext a))
     )
)

Chào bác phamthanhbinh.

Em dùng thử đoạn lisp trên thì cũng thấy báo lỗi là:

 

Command: clb

Select objects: 1 found

Select objects: ; error: bad argument type: lentityp nil

 

Bác xem giúp em bị lỗi ở chỗ nào nhé. Với lại em thấy đoạn này cũng đang chỉ chuyển Block về layer "Block" còn các đối tượng trong block đó vẫn là layer "cũ" của nó. Chắc do em diễn đạt chưa được rõ. Em gửi kèm File lên đây bác xem có rõ hơn không và giúp em với nhé!

http://www.cadviet.com/upfiles/3/110072_block_layer_1.dwg

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

Em dùng thử đoạn lisp trên thì cũng thấy báo lỗi là:

 

Command: clb

Select objects: 1 found

Select objects: ; error: bad argument type: lentityp nil

 

Bác xem giúp em bị lỗi ở chỗ nào nhé. Với lại em thấy đoạn này cũng đang chỉ chuyển Block về layer "Block" còn các đối tượng trong block đó vẫn là layer "cũ" của nó. Chắc do em diễn đạt chưa được rõ. Em gửi kèm File lên đây bác xem có rõ hơn không và giúp em với nhé!

http://www.cadviet.c...ock_layer_1.dwg

Hề hề hề,

Lỗi là do bạn pick chưa trúng đối tượng mà thôi.

Lisp đã đổi tất cả các đối tượng con trong block,( kể cả là các block con) về layer block rồi 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

Cảm ơn anh Ket.

Em mới tìm thấy đoạn lisp của anh bên xaydungit có tác dụng chuyển layer của tất cả các đối tượng trong block về Layer hiện hành. Đoạn lisp đó em copy về và save dưới dạng .LSP như sau ạ.

http://www.cadviet.c...10072_coblk.lsp

Em dự định là sẽ dùng đoạn lisp này để áp dụng cho ý định của mình. Nhưng khi add vào Cad thì nó báo lỗi là

Command: aq

APPLOAD CoBlk.Lsp successfully loaded.

Command: ; error: bad argument type: consp "INSERT".

Anh xem em copy có lỗi gì không. Hoặc anh rảnh thì Post đoạn lisp mà anh nói cho em xin với nhé.

Thanks anh nhiều nhiều ạ!

Nếu bạn dùng lisp mình post thì vui lòng kèm theo cả link nữa để mình dò ^^

Còn lisp trên thì bị thiếu mất dấu '

Bạn thêm dấu ' vào trước đoạn này : ((0 . "INSERT"))

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

Nếu bạn dùng lisp mình post thì vui lòng kèm theo cả link nữa để mình dò ^^

Còn lisp trên thì bị thiếu mất dấu '

Bạn thêm dấu ' vào trước đoạn này : ((0 . "INSERT"))

Chào anh Ket.

Đoạn lisp mà em tìm được nằm ở link này ạ:

http://xaydungit.vn/diendan/showthread.php?8195-Chuy%E1%BB%83n-Layer-t%E1%BA%A5t-c%E1%BA%A3-%C4%91%E1%BB%91i-t%C6%B0%E1%BB%A3ng-trong-Block-v%E1%BB%81-Layer-hi%E1%BB%87n-h%C3%A0nh

Em đã thêm dấu ' như anh nói và đoạn lisp đã chạy được. Nhưng em nhờ anh thêm chút nữa ạ.

1- Em chỉ muốn chuyển layer thôi chứ không muốn chuyển màu của các đối tượng (Cả Block và đối tượng trong Block)

2- Thay vì chuyển về layer hiện hành, có thể chuyển về layer tên là "Block". (cái này chỉ là ý chủ quan của em thôi, không thì em sẽ chọn layer Block làm hiện hành cũng được ạ.)

3- Có 2 tùy chọn khi chuyển là: a/- Tất cả Block trong bản vẽ đều được chuyển Layer (ưu tiên cái này) và b/- Chọn một hoặc một số Block cần chuyển layer.

Em xin cảm ơn 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

Bạn sửa lại như thế này, mình k test, viết tạm bạn test nhé


(defun  C:CoBlk (/  i ss ls la)
(setq la  (if (tblsearch "LAYER" "Block") "Block" (getvar 'clayer))) 
(princ "\n Chon Blocks doi mau bylayer <select all>: ")
(setq i 0 ss (ssget '((0 . "INSERT"))))
(if (not ss)(setq ss (ssget "x" '((0 . "INSERT")))))
(command ".UNDO" "BE")
(repeat (sslength ss)
(CoBylayer (ssname ss i))
(setq i (1+ i))
)
(command ".REGEN")
(command ".UNDO" "E")
(princ)
)
(defun  CoBylayer (blk /  e el s)
(setq s (cdr (assoc 2 (entget blk))))
(if (not (member s ls))
(progn
(setq ls (append ls (list s)))
(setq e (cdr (assoc -2 (tblsearch "BLOCK" s))))
(while e
(setq el (entget e))
(if (= "INSERT" (cdr (assoc 0 el)))
(CoBylayer e)
)
(setq el (subst (cons 8 la) (assoc 8 el) el))
(entmod el)
(setq e (entnext e))
)
)
)
)

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

Em thử đoạn lisp trên thì thấy là hầu như đều Ok rồi. có điều là em chưa biết chọn "Select all" kiểu gì cả. sau khi gõ lệnh mình chọn đối tượng thì được, nhưng nếu enter tiếp (để chọn All) thì báo lỗi ạ. Anh rảnh thì kiểm tra giúp em nhé. Không thì được thế này cũng tốt rồi ạ.

Em cảm ơn anh 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

Để chọn All thì ngay khi hỏi chọn đối tượng bạn Space tiếp.

Chú ý code này có chỗ hay có chỗ dở, nhừng tạm chấp nhận được. Mình vừa test xong

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ọn All thì ngay khi hỏi chọn đối tượng bạn Space tiếp.

Chú ý code này có chỗ hay có chỗ dở, nhừng tạm chấp nhận được. Mình vừa test xong

Cảm ơn anh Ket.

Có điều này không biết có làm được hay không nhưng em cứ xin nêu ra như sau:

Giả sử mình có Block A, trong A có 2 đối tượng với các tính chất như sau:

- đối tượng B có layer là layer 1, màu là Bylayer - giả sử bylayer của layer 1 ở đây là màu đỏ (màu 1)

- đối tượng C có layer là layer 2, màu cũng là Bylayer- giả sử bylayer của layer 2 ở đây là màu vàng (màu 2)

Khi dùng đoạn lisp trên, chuyển toàn bộ layer của đối tượng B và đối tượng C về layer "Block"

thì ta sẽ được màu của B và C là màu Bylayer (của layer Block) và giả sử là màu xanh greeen (màu 3)

Bây giờ em muốn là: Dù ban đầu màu của B và C là Bylayer nhưng sau khi chuyển layer sang layer Block màu của nó vẫn không thay đổi (trong trường hợp trên,

sau khi chuyển thì màu của B vẫn là màu đỏ, màu của C vẫn là màu vàng, dù layer đã chuyển sang layer Block - có màu xanh)

Nôm na là ta chỉ chuyển layer thôi, còn màu thế nào thì cứ giữ y nguyên như ban đầu của nó vậy.

P/S: Đoạn lisp trên sau khi anh sửa lại thì lại chỉ chuyển layer của B và C sang Layer Block thôi, còn của A thì lại giữ nguyên thì phải ạ!

Chúc anh 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

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

×