Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp gom đối tượng dựa vào mã màu


  • Please log in to reply
7 replies to this topic

#1 nguyenkhoadng

nguyenkhoadng

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 25 August 2011 - 01:32 PM

Em vừa nhận được 1 bản vẽ mà chỉ có 1 layer cho tất cả các đối tượng, chỉ thay đổi màu khác nhau thôi.
Nay muốn nhờ các anh trên cadviet viết giúp 1 lisp
mục đích: là tự động gom các đối tượng có cùng màu về cac layer khac nhau để tiện quản lý, và nếu layer nào chưa được tạo thì sẽ tự tạo thêm layer(Dựa vào màu sắc để gom đối tượng chứ không phải quét chọn đối tượng thủ công)
Mong các anh trong cadviet giúp đỡ.
Trân trọng cảm ơn!
  • 0

#2 cd2k44

cd2k44

    Edu level: li5

  • Members
  • PipPipPipPipPipPipPip
  • 648 Bài viết
Điểm đánh giá: 121 (tàm tạm)

Đã gửi 25 August 2011 - 02:30 PM

Em vừa nhận được 1 bản vẽ mà chỉ có 1 layer cho tất cả các đối tượng, chỉ thay đổi màu khác nhau thôi.
Nay muốn nhờ các anh trên cadviet viết giúp 1 lisp
mục đích: là tự động gom các đối tượng có cùng màu về cac layer khac nhau để tiện quản lý, và nếu layer nào chưa được tạo thì sẽ tự tạo thêm layer(Dựa vào màu sắc để gom đối tượng chứ không phải quét chọn đối tượng thủ công)
Mong các anh trong cadviet giúp đỡ.
Trân trọng cảm ơn!

Bạn sử dụng tạm Qselect hoặc filler của cad đi.Mình thấy nhanh hơn đó bạn
  • 0

#3 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 25 August 2011 - 03:33 PM

Em vừa nhận được 1 bản vẽ mà chỉ có 1 layer cho tất cả các đối tượng, chỉ thay đổi màu khác nhau thôi.
Nay muốn nhờ các anh trên cadviet viết giúp 1 lisp
mục đích: là tự động gom các đối tượng có cùng màu về cac layer khac nhau để tiện quản lý, và nếu layer nào chưa được tạo thì sẽ tự tạo thêm layer(Dựa vào màu sắc để gom đối tượng chứ không phải quét chọn đối tượng thủ công)
Mong các anh trong cadviet giúp đỡ.
Trân trọng cảm ơn!

Bạn chạy thử Lisp này :
(defun c:2layer(/ actDoc col layObj)
(setq actDoc (vla-get-activedocument (vlax-get-acad-object) )
layObj (vla-get-layers actDoc ) )
(vlax-for lay (vla-get-layouts actDoc)
(vlax-for obj (vla-get-block lay)
(if (and (/= (setq col (vla-get-ColorIndex(vla-get-truecolor obj))) 0)
(/= col 256))
(progn
(if (not(tblsearch "layer" (itoa col)))
(vlax-put-property (vla-add layObj col) 'Color col) )
(vla-put-layer obj col) ) ) )))

  • 1

#4 t031285

t031285

    biết vẽ rectang

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

Đã gửi 25 August 2011 - 04:14 PM

Bạn chạy thử Lisp này :

(defun c:2layer(/ actDoc col layObj)
(setq actDoc (vla-get-activedocument (vlax-get-acad-object) )
layObj (vla-get-layers actDoc ) )
(vlax-for lay (vla-get-layouts actDoc)
(vlax-for obj (vla-get-block lay)
(if (and (/= (setq col (vla-get-ColorIndex(vla-get-truecolor obj))) 0)
(/= col 256))
(progn
(if (not(tblsearch "layer" (itoa col)))
(vlax-put-property (vla-add layObj col) 'Color col) )
(vla-put-layer obj col) ) ) )))

Lisp này tự động gom theo màu nếu màu đỏ thì nó gom về layer tên là 1,tương tự các layer khác cũng gom về layer đặt tên theo số màu mặc định của cad.Có cách nào cho nó gom về tên layer mình định sẵn không bác,thí dụ màu vàng thì nó gom về layer tên là NET TUONG...Cảm ơn bác nhiều..
  • 0

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 26 August 2011 - 03:30 PM

Lisp này tự động gom theo màu nếu màu đỏ thì nó gom về layer tên là 1,tương tự các layer khác cũng gom về layer đặt tên theo số màu mặc định của cad.Có cách nào cho nó gom về tên layer mình định sẵn không bác,thí dụ màu vàng thì nó gom về layer tên là NET TUONG...Cảm ơn bác nhiều..

Hề hề hề,
Việc này bạn phải tự làm thôi chứ có ai biết trên bản vẽ có những layer nào và bạn muốn gán nó ra sao đâu. Chỉ với một ví dụ như vậy mà trên bản vẽ của bạn chả biết có bao nhiêu layer nữa thì làm sao mà làm được??? Tỷ như màu đỏ thì bạn cho vào lớp nào và màu 255 thì bạn cho vào lớp nào????? Hề hề hề, có nhẽ phải cho cái nhập tên layer từng phát một chăng????
  • 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 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 August 2011 - 04:18 PM

@bác Gia_bach : ngắn gọn và đẹp quá ^^
@t031285 : Bạn phải tự định nghĩa vào list màu - đối tượng trong list lst :
Ví dụ, bạn muốn thêm màu 3, layer 3 thì thêm vào dòng (cons 3 "3") sau dòng màu đỏ :

(setq lst
(list
(cons 1 "test1")
(cons 2 "test2")
;Thêm list tương ứng vào đây
)
)

(defun c:2layer(/ actDoc col layObj lst)
(setq lst
(list
(cons 1 "test1")
(cons 2 "test2")
;Thêm list tương ứng vào đây
)
)
(setq actDoc (vla-get-activedocument (vlax-get-acad-object) )
layObj (vla-get-layers actDoc ) )
(vlax-for lay (vla-get-layouts actDoc)
(vlax-for obj (vla-get-block lay)
(if (and (/= (setq col (vla-get-ColorIndex(vla-get-truecolor obj))) 0)
(/= col 256)
(assoc col lst))
(progn
(if (not (tblsearch "layer" (cdr(assoc col lst))))
(vla-Add layObj (cdr (assoc col lst))))
(vla-put-layer obj (cdr (assoc col lst))))))))


@Nguyenkhoadng : bạn post bài sai quy định, lần này mình sửa, hy vọng bạn không phiền lòng và rút kinh nghiệm :)
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#7 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 26 August 2011 - 05:00 PM

@bác Gia_bach : ngắn gọn và đẹp quá ^^
@t031285 : Bạn phải tự định nghĩa vào list màu - đối tượng trong list lst :
Ví dụ, bạn muốn thêm màu 3, layer 3 thì thêm vào dòng (cons 3 "3") sau dòng màu đỏ :

(defun c:2layer(/ actDoc col layObj lst)
(setq lst
(list
(cons 1 "test1")
(cons 2 "test2")
;Thêm list tương ứng vào đây
)
)
(setq actDoc (vla-get-activedocument (vlax-get-acad-object) )
layObj (vla-get-layers actDoc ) )
(vlax-for lay (vla-get-layouts actDoc)
(vlax-for obj (vla-get-block lay)
(if (and (/= (setq col (vla-get-ColorIndex(vla-get-truecolor obj))) 0)
(/= col 256)
(assoc col lst))
(progn
(if (not (tblsearch "layer" (cdr(assoc col lst))))
(vla-Add layObj (cdr (assoc col lst))))
(vla-put-layer obj (cdr (assoc col lst))))))))


@Nguyenkhoadng : bạn post bài sai quy định, lần này mình sửa, hy vọng bạn không phiền lòng và rút kinh nghiệm :)

Hề hề hề,
Làm kiểu này thì phải chịu khó ngồi thống kê tất cả các màu hiện có trên bản vẽ để tạo ra cái lst, e phi bác t031285 chả ai có thể làm được.
Hề hề hề,...
Bác thử tính cái kiểu tạo vòng lặp và cho người dùng tự chọn nhập tên layer xem sao. (có bao nhiêu màu thì nhập bấy nhiêu tên, thoải mái đặt tên Tí tèo hay eo ếch gì cũng được) ......
Hề hề 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.

#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 August 2011 - 08:00 PM

Vì e nghĩ điều này sẽ lặp đi lặp lại ở nhiều bản vẽ, nên việc nhập theo vòng lặp sẽ... :lol: Đơn giản 1 bản vẽ có 10 màu => Chạy lisp => Nhập tên Layer 10 lần => OK. Sang bản vẽ khác, làm lại như thế .... :mellow: Sang bản vẽ khác nữa => nhập đến 1 nửa tức mình Esc => Hỗn loạn bản vẽ => Chạy lại lisp => Nhập lại ... :excl:
Cái này e vẫn lấy theo ý bác gia_bach, cái nào list thì nó đổi, không list thì nó thôi, tùy ý người yêu cầu thôi. Ngoài ra có thể giữ lại phần chuyển layer theo màu với những màu không list ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC