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

[Yêu cầu] Auto merge layer

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

File cad của mình có rất nhiều layer:

 - Do bản gốc bị copy nhiều đối tượng của các bản vẽ khác nhau vào

 - Do xref rồi bind cũng tạo thêm ra nhiều layer

 

Mình muốn các bạn giúp mình làm 1 lisp tự động Merge cụ thể:

 

- Bước 1: Lisp yêu cầu người dùng chọn layer gốc

- Bước 2: Lisp tự động merge các layer có cùng màu với layer gốc lại thành 1 layer (trong quá trình tìm màu layer thì bỏ qua layer DEFPOINTS và layer bị khóa in)

Thanks All!

 

File cad mẫu để làm lisp

http://www.cadviet.com/upfiles/3/1969_auto_merge_layer.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

File cad của mình có rất nhiều layer:

 - Do bản gốc bị copy nhiều đối tượng của các bản vẽ khác nhau vào

 - Do xref rồi bind cũng tạo thêm ra nhiều layer

 

Mình muốn các bạn giúp mình làm 1 lisp tự động Merge cụ thể:

 

- Bước 1: Lisp yêu cầu người dùng chọn layer gốc

- Bước 2: Lisp tự động merge các layer có cùng màu với layer gốc lại thành 1 layer (trong quá trình tìm màu layer thì bỏ qua layer DEFPOINTS và layer bị khóa in)

Thanks All!

 

File cad mẫu để làm lisp

http://www.cadviet.com/upfiles/3/1969_auto_merge_layer.dwg

 

Như vậy là không tính tới đường nét (linetype của Layer)

Ví dụ Layer Center có nét đứt, merge với Layer Sky area có nét liền có được chăng?

Rồi đối tượng có Layer (A) nhưng có màu trùng với Layer ( B ) thì phải merge thế nào?

  • 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

Thanks bác Tue_NV

 

Mình chưa nghĩ đến cái vụ linetype của layer. Mình chỉnh lại yêu cầu một chút

- Bước 1: Lisp yêu cầu người dùng chọn layer gốc

- Bước 2: Lisp tự động merge những layer nào có cùng color (cả với đối tượng layer (A) nhưng có màu (B)), cùng linetype với layer gốc lại thành 1 layer (trong quá trình tìm màu layer thì bỏ qua layer DEFPOINTS và layer bị khóa in)

 

vì linetype của layer bị đổi tên khi mình bind file xref nên chắc sẽ phải chỉnh thủ công những layer này, lisp làm được việc merge như trên đã tốt với mình lắm rồi. Thanks Tue

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

Thanks bác Tue_NV

 

Mình chưa nghĩ đến cái vụ linetype của layer. Mình chỉnh lại yêu cầu một chút

- Bước 1: Lisp yêu cầu người dùng chọn layer gốc

- Bước 2: Lisp tự động merge những layer nào có cùng color (cả với đối tượng layer (A) nhưng có màu ( B)), cùng linetype với layer gốc lại thành 1 layer (trong quá trình tìm màu layer thì bỏ qua layer DEFPOINTS và layer bị khóa in)

 

vì linetype của layer bị đổi tên khi mình bind file xref nên chắc sẽ phải chỉnh thủ công những layer này, lisp làm được việc merge như trên đã tốt với mình lắm rồi. Thanks Tue

 

Như vậy là bạn bỏ qua linetype và đối tượng có màu không phải là Bylayer?

Nếu Lisp chạy xong là bạn sẽ phải chỉnh thủ công lại Linetype và màu của đối tượng (not Bylayer),

đúng không bạn?

  • 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

-Màu Bylayer: Bỏ qua 

-Linetype: Nếu layer nào có cùng linetype với layer gốc thì merge, không cùng linetype thì không merge. (phần này mình sẽ làm thủ công) :D

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

Thanks bác Tue_NV

 

Mình chưa nghĩ đến cái vụ linetype của layer. Mình chỉnh lại yêu cầu một chút

- Bước 1: Lisp yêu cầu người dùng chọn layer gốc

- Bước 2: Lisp tự động merge những layer nào có cùng color (cả với đối tượng layer (A) nhưng có màu ( B)), cùng linetype với layer gốc lại thành 1 layer (trong quá trình tìm màu layer thì bỏ qua layer DEFPOINTS và layer bị khóa in)

 

vì linetype của layer bị đổi tên khi mình bind file xref nên chắc sẽ phải chỉnh thủ công những layer này, lisp làm được việc merge như trên đã tốt với mình lắm rồi. Thanks Tue

Sài thử Lisp này nha :

(defun C:merLa( / lay_lst)
  ;; By : Gia_Bach 2014    
  (if (setq e (entsel "chon doi tuong :"))
    (progn
      (setq doc (vla-get-activedocument (vlax-get-acad-object))
	    layName (vla-get-Layer (setq obj (vlax-ename->vla-object (car e))))
	    layCol (vla-get-Color (setq obj (vlax-ename->vla-object (tblobjname "layer" layName))))
	    layLty (vla-get-LineTypes obj) )
      (vlax-for each (vla-get-layers doc)	
	(if (and (/= (strcase (setq LayerName (vla-get-name each))) "DEFPOINTS");(/= LayerName "0")
		 (= (vla-get-Color each) layCol)(= (vla-get-LineTypes each) layLty)
		 (/= (vla-get-lock each) :vlax-true))
	  (setq lay_lst (append lay_lst (list LayerName)))	))
      (vlax-for lay (vla-get-layouts doc)
	(vlax-for obj (vla-get-block lay)
	  (if (vl-position (vla-get-layer obj) lay_lst)
	    (vla-put-layer obj layName))))
      (foreach lay (vl-remove layName lay_lst)
	(vl-catch-all-apply (function vla-delete)
	  (list (vlax-ename->vla-object (tblobjname "layer" lay))))) ) )
  (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

Bạn conghoa sử dụng thử Lisp sau:

 

(defun c:mla()
 (setq lst-mrg nil laygoc nil lay nil lst-lay nil i nil ltype nil mau nil)
  (princ "Chon doi tuong goc :")
  (setq ss (ssget) i -1)
  (while (setq ename (ssname ss (setq i (1+ i))))
    (if (and (null (member (setq lay (cdr(assoc 8 (entget ename)))) laygoc))
                 (/= (strcase lay) "DEFPOINTS")
            )
            (setq laygoc (append laygoc (list lay))))
  )
  (setq lay (tblnext "layer" t))
  (setq lst-lay (append lst-lay (list (cdr(assoc 2 lay)))))
  (while (setq lay (tblnext "layer"))
    (if (and (null (member (cdr(assoc 2 lay)) laygoc)) (/= (cdr(assoc 70 lay)) 4) (/= (strcase (cdr(assoc 2 lay))) "DEFPOINTS") )
      (setq lst-lay (append lst-lay (list (cdr(assoc 2 lay)))))
    )
  )
  (foreach x laygoc
     (setq mau (cdr(assoc 62 (tblsearch "layer" x))))
     (setq ltype (cdr(assoc 6 (tblsearch "layer" x))))
     (foreach y lst-lay
                  (if (and (= (cdr(assoc 62 (tblsearch "layer" y))) mau) (= (cdr(assoc 6 (tblsearch "layer" y))) ltype))
                          (setq lst-mrg (append lst-mrg (list (cdr(assoc 2 (tblsearch "layer" y))))))
                  )
      )
            (command "._laymrg")(foreach z lst-mrg (command "N" z))
            (command "")
            (command "N" x "y")
   (setq lst-mrg nil)
  )
)
(defun c:mla()
 (setq lst-mrg nil laygoc nil lay nil lst-lay nil i nil ltype nil mau nil)
  (princ "Chon doi tuong goc :")
  (setq ss (ssget) i -1)
  (while (setq ename (ssname ss (setq i (1+ i))))
    (if (and (null (member (setq lay (cdr(assoc 8 (entget ename)))) laygoc))
                 (/= (strcase lay) "DEFPOINTS")
            )
            (setq laygoc (append laygoc (list lay))))
  )
  (setq lay (tblnext "layer" t))
  (setq lst-lay (append lst-lay (list (cdr(assoc 2 lay)))))
  (while (setq lay (tblnext "layer"))
    (if (and (null (member (cdr(assoc 2 lay)) laygoc)) (/= (cdr(assoc 70 lay)) 4) (/= (strcase (cdr(assoc 2 lay))) "DEFPOINTS") )
      (setq lst-lay (append lst-lay (list (cdr(assoc 2 lay)))))
    )
  )
  (foreach x laygoc
     (setq mau (cdr(assoc 62 (tblsearch "layer" x))))
     (setq ltype (cdr(assoc 6 (tblsearch "layer" x))))
     (foreach y lst-lay
                  (if (and (= (cdr(assoc 62 (tblsearch "layer" y))) mau) (= (cdr(assoc 6 (tblsearch "layer" y))) ltype))
                          (setq lst-mrg (append lst-mrg (list (cdr(assoc 2 (tblsearch "layer" y))))))
                  )
      )
            (command "._laymrg")(foreach z lst-mrg (command "N" z))
            (command "")
            (command "N" x "y")
   (setq lst-mrg nil)
  )
)
(defun c:mla()
 (setq lst-mrg nil laygoc nil lay nil lst-lay nil i nil ltype nil mau nil)
  (princ "Chon doi tuong goc :")
  (setq ss (ssget) i -1)
  (while (setq ename (ssname ss (setq i (1+ i))))
    (if (and (null (member (setq lay (cdr(assoc 8 (entget ename)))) laygoc))
                 (/= (strcase lay) "DEFPOINTS")
            )
            (setq laygoc (append laygoc (list lay))))
  )
  (setq lay (tblnext "layer" t))
  (setq lst-lay (append lst-lay (list (cdr(assoc 2 lay)))))
  (while (setq lay (tblnext "layer"))
    (if (and (null (member (cdr(assoc 2 lay)) laygoc)) (/= (cdr(assoc 70 lay)) 4) (/= (strcase (cdr(assoc 2 lay))) "DEFPOINTS") )
      (setq lst-lay (append lst-lay (list (cdr(assoc 2 lay)))))
    )
  )
  (foreach x laygoc
     (setq mau (cdr(assoc 62 (tblsearch "layer" x))))
     (setq ltype (cdr(assoc 6 (tblsearch "layer" x))))
     (foreach y lst-lay
                  (if (and (= (cdr(assoc 62 (tblsearch "layer" y))) mau) (= (cdr(assoc 6 (tblsearch "layer" y))) ltype))
                          (setq lst-mrg (append lst-mrg (list (cdr(assoc 2 (tblsearch "layer" y))))))
                  )
      )
            (command "._laymrg")(foreach z lst-mrg (command "N" z))
            (command "")
            (command "N" x "y")
   (setq lst-mrg nil)
  )
  • 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 Tuệ kiểm tra lại giúp mình, dùng lisp Mla các layer có cùng màu nhưng khác linetype vẫn bị merge vào layer gốc.

 

Thanks!

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 Tuệ kiểm tra lại giúp mình, dùng lisp Mla các layer có cùng màu nhưng khác linetype vẫn bị merge vào layer gốc.

 

Thanks!

 

Đã update code ở bài viết trên!

Bạn vui lòng check lại nhé!

  • 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

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  

×