Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Auto merge layer


  • Please log in to reply
11 replies to this topic

#1 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 22 January 2014 - 10:27 AM

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.c...merge_layer.dwg


  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 22 January 2014 - 12:56 PM

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


  • 1

#3 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 22 January 2014 - 01:26 PM

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


  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 22 January 2014 - 01:31 PM

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?


  • 1

#5 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 22 January 2014 - 01:37 PM

-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


  • 0

#6 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 22 January 2014 - 04:17 PM

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

  • 0

#7 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 22 January 2014 - 04:44 PM

@GiaBach, mình chạy thử lisp Merla nhưng không thấy Merge được :), bác kiểm tra lại giúp


  • 0

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 22 January 2014 - 10:51 PM

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

  • 1

#9 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 23 January 2014 - 01:33 PM

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!


  • 0

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 23 January 2014 - 02:30 PM

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


  • 1

#11 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 23 January 2014 - 04:44 PM

Thanks Tuệ, lisp đã giúp mình tiết kiệm khá nhiều trong việc lọc layer thừa của bản vẽ!


  • 0

#12 juny

juny

    biết zoom

  • Members
  • Pip
  • 17 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 23 January 2014 - 06:42 PM

cái này khó đây :angry2:


  • 0

Hướng dẫn học AutoCAD
AutoCAD Tutorial | AutoCAD Tips | AutoCAD Library