Đến nội dung


Hình ảnh
- - - - -

[Xin] lisp chuyển màu các thuộc tính dynamic block


  • Please log in to reply
96 replies to this topic

#21 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 25 April 2014 - 05:13 AM

Cám ơn bạn Tue_NV đã góp ý. Mình xin trả lời bạn là:

 

Trả lời: Tại vì bản vẽ với tỉ lệ nhỏ, nhiều hình với text rất rối, không để 1 loại được, mình toàn phải dùng loại 2 là có leader để chỉ vô những dầm không có đủ chỗ để bố trí loại 1

 

Thế thì làm thuộc tính Visible ẩn hiện cái Leader thôi. Khi cần có thể dùng chuột "kéo" để "loại 1" thành "loại 2" và ngược lại

Không nên để 4 cái thuộc tính như vậy. Tỉ như bạn sửa tiết diện của KT1 của loại 1 là 200x400, giờ chuyển sang loại 2  (đang có tiết diện 200x350 chẳng hạn) : thì cũng phải sửa lại tiết diện à?


  • 1

#22 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 25 April 2014 - 09:09 AM

Thế thì làm thuộc tính Visible ẩn hiện cái Leader thôi. Khi cần có thể dùng chuột "kéo" để "loại 1" thành "loại 2" và ngược lại

Không nên để 4 cái thuộc tính như vậy. Tỉ như bạn sửa tiết diện của KT1 của loại 1 là 200x400, giờ chuyển sang loại 2  (đang có tiết diện 200x350 chẳng hạn) : thì cũng phải sửa lại tiết diện à?

 

Cám ơn bạn Tue_NV đã góp ý, đúng như bạn nói là khi đổi sang loại 2 thì phải sửa lại tiết diện. mình đã sửa lại dynamic block của mình theo góp ý của bạn, block giờ chỉ còn 2 attribute là SH, KT sẽ đơn giản hơn, khi đó liệt kê bảng thống kê để sửa chỉ cần 2 cột thôi. mình xin nêu lại nội dung lisp theo như block mới này:

 

Mình có 1 file chứa rất nhiều dynamic block tên cấu kiện dầm, trong mỗi block đều có 2 attribute là KT, SH. SH là để chỉ số hiệu dầm. KT là để chỉ kích thước tiết diện dầm (file đính kèm) http://www.cadviet.c...mic_block_2.dwg

Giờ đang có rất nhiều dầm có tiết diện khác nhau và mình muốn những dầm có tiết diện giống nhau thì sẽ cùng 1 mầu như thế dễ quản lí và vẽ sẽ không bị nhầm. giờ dùng lisp của các bạn như trên trao đổi thì đã đảm bảo việc đổi mầu đó rồi nhưng giờ muốn nâng cao hơn nữa để làm nhanh hơn nữa

 

đó là mình sẽ chọn hết 1 loạt tất cả các dynamic block đó, khi đó sẽ hiện lên 1 bảng thống kê tất cả các attribute (tương tự lisp của LeeMac nhưng khác là chỉ những attribute nào có giá trị tiết diện giống nhau mới hiện lên) như trong file mình gửi kèm gồm 2 cột: cột 1 là Value của attribute, cột 2 là màu hiện tại của attribute đó. mình có thể click vào ô mầu để chọn màu cho từng loại attribute trong bảng đã liệt kê, sau khi chọn xong thì OK để kết thúc lệnh

 

Ngoài ra mình cần thêm 1 lisp nữa tương tự như lệnh Machop nhưng dùng được với dynamic block để đổi mầu và value của attribute KT đã chọn theo attribute chọn làm mẫu. lí do là khi thiết kế thay đổi tiết diện dầm mà tiết diện đó đã có sắn rồi thì chỉ việc dùng lisp đó lấy tiết diện và mầu của attribute mẫu gán cho attribute cần thay đổi. nội dung lisp là:

 

1. đưa ra lựa chọn attribute của 1 dynamic block chọn làm mẫu (lựa chọn bằng cách click thẳng vào attribute nào thì lấy luôn attribute đó làm mẫu)

 2. đưa ra lựa chọn những atribute của dynamic block nào muốn đổi theo attribute mẫu

 3. kết thúc lệnh

 

Mong các bạn giúp đỡ. mình cám ơn nhiều

 

http://www.cadviet.c...utecolour_1.lsp


  • 0

#23 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 26 April 2014 - 10:30 PM

Các cao thủ trong diễn đàn đâu hết rồi hic, giúp mình cái


  • 0

#24 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 April 2014 - 11:47 AM

Cái này là 2 trong 1, bạn chọn 1 tag, chọn màu xong quét chọn toàn bộ , cái nào có tag giống cái kia thì đổi màu. Tên lệnh mat.

 

(defun C:mat()
  (defun dxf(id v) (cdr (assoc id (entget v))))
  (defun setColor(tag tval col v)
    (foreach item
      (vlax-safearray->list (vlax-variant-value
(vla-GetAttributes (vlax-ename->vla-object v))))
          (if (and (= tag (vla-get-TagString item)) (= tval (vla-get-TextString item)))
    (vla-put-Color item col)))
  )
  
  (setq a (car (nentsel "\nChon Attribute:"))
col (acad_colordlg (dxf 62 a))
        kt (dxf 1 a)
tag (dxf 2 a))
  
  (setColor tag kt col (dxf 330 a))
  (mapcar '(lambda(x) (setColor tag kt col x))
 (acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))
  (princ)
)

 

Còn việc sửa lisp cùa Lee Mac, nhất là phần giao diện thì chắc hơi mệt, và tôi nghĩ làm vậy thì chỉ có tác dụng về mặt hình thức thôi, tôi nghĩ không cần thiết, cái mình cần là kết quả có ok không thôi.


  • 1

#25 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 27 April 2014 - 01:26 PM

Cái này là 2 trong 1, bạn chọn 1 tag, chọn màu xong quét chọn toàn bộ , cái nào có tag giống cái kia thì đổi màu. Tên lệnh mat.

 

(defun C:mat()
  (defun dxf(id v) (cdr (assoc id (entget v))))
  (defun setColor(tag tval col v)
    (foreach item
      (vlax-safearray->list (vlax-variant-value
(vla-GetAttributes (vlax-ename->vla-object v))))
          (if (and (= tag (vla-get-TagString item)) (= tval (vla-get-TextString item)))
    (vla-put-Color item col)))
  )
  
  (setq a (car (nentsel "\nChon Attribute:"))
col (acad_colordlg (dxf 62 a))
        kt (dxf 1 a)
tag (dxf 2 a))
  
  (setColor tag kt col (dxf 330 a))
  (mapcar '(lambda(x) (setColor tag kt col x))
 (acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))
  (princ)
)

 

Còn việc sửa lisp cùa Lee Mac, nhất là phần giao diện thì chắc hơi mệt, và tôi nghĩ làm vậy thì chỉ có tác dụng về mặt hình thức thôi, tôi nghĩ không cần thiết, cái mình cần là kết quả có ok không thôi.

 

Cám ơn bạn Tot77 nhiều, bạn đúng là cao thủ thật. Lisp của bạn cũng rất hay, chọn màu cho 1 attribute rồi quét chọn cho tất cả những cái còn lại, thế là quá tuyệt rồi, được như này là tốt lắm rồi,đúng là mình cũng chỉ cần thế thôi :)

thế còn cái lisp thứ 2 kiều như lệnh Machop dùng với dynamic block. nội dung lisp là:

1. đưa ra lựa chọn attribute của 1 dynamic block chọn làm mẫu (lựa chọn bằng cách click thẳng vào attribute nào thì lấy luôn attribute đó làm mẫu)

 2. đưa ra lựa chọn những atribute của dynamic block nào muốn đổi theo attribute mẫu

 3. kết thúc lệnh

 

bạn có làm được ko hay có ý kiến gì khác hay hơn không?


  • 0

#26 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 April 2014 - 02:20 PM

Cái danh cao thủ hay thấp thủ thì mình không dám nhận. Viết lisp cho vui thôi, nhân tiện có nhiều cái mới để học.

Bạn nói ngắn gọn thì tôi hiểu, nói càng dài thì tôi càng không hiểu.

Tóm lại ý bạn là có 2 cái lệnh:

1. Đổi màu những tiết diện giống nhau.

2. Đổi cả màu và text của tiết diện theo mẫu.

Thật ra 2 cái cũng gần giống nhau, bạn xài cái dưới đây, lệnh mat1 và mat2.

 

(defun dxf(id v) (cdr (assoc id (entget v))))
(defun setColor(tag tval col v kieu)
    (foreach item
      (vlax-safearray->list (vlax-variant-value
(vla-GetAttributes (vlax-ename->vla-object v))))          
          (cond ((and (not kieu) (= tag (vla-get-TagString item)) (= tval (vla-get-TextString item)))
        (vla-put-Color item col))
((and kieu (= tag (vla-get-TagString item)))
        (vla-put-Color item col)
(vla-put-TextString item tval))
   ))
)
 
(defun C:mat1()  
  (setq a   (car (nentsel "\nChon Attribute:"))
col (acad_colordlg (dxf 62 a))
        kt  (dxf 1 a)
tag (dxf 2 a))  
  (setColor tag kt col (dxf 330 a) nil)
  (mapcar '(lambda(x) (setColor tag kt col x nil))
 (acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))
  (princ)
)
 
(defun C:mat2()  
  (setq a   (car (nentsel "\nChon Attribute:"))
col (dxf 62 a)
        kt  (dxf 1 a)
tag (dxf 2 a))  
  (mapcar '(lambda(x) (setColor tag kt col x t))
    (acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))
  (princ)
)
 


  • 1

#27 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 27 April 2014 - 02:34 PM

Lisp của bạn Tot77 không có tác dụng với Block dynamic vì dòng này:

(acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))

 

Có thể thiết kế giao diện bạn cho đó là hình thức nhưng nó có thể cho mình chọn 1 lần được nhiều tiết diện dầm và đổi màu 1 lần, đương nhiên tốc độ sẽ nhanh hơn so với cách 1 lần chỉ đổi được 1 cái


  • 2

#28 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 April 2014 - 02:42 PM

Test trên file chủ thớt đưa thấy ok là được, trừ khi đổi tên block thì xoá dòng đó đi.
Chắc chỉ có bác Tuệ sửa được lisp của lee mac thôi.
  • 0

#29 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 27 April 2014 - 02:49 PM


Cái danh cao thủ hay thấp thủ thì mình không dám nhận. Viết lisp cho vui thôi, nhân tiện có nhiều cái mới để học.

Bạn nói ngắn gọn thì tôi hiểu, nói càng dài thì tôi càng không hiểu.

Tóm lại ý bạn là có 2 cái lệnh:

1. Đổi màu những tiết diện giống nhau.

2. Đổi cả màu và text của tiết diện theo mẫu.

Thật ra 2 cái cũng gần giống nhau, bạn xài cái dưới đây, lệnh mat1 và mat2.

 

(defun dxf(id v) (cdr (assoc id (entget v))))
(defun setColor(tag tval col v kieu)
    (foreach item
      (vlax-safearray->list (vlax-variant-value
(vla-GetAttributes (vlax-ename->vla-object v))))          
          (cond ((and (not kieu) (= tag (vla-get-TagString item)) (= tval (vla-get-TextString item)))
        (vla-put-Color item col))
((and kieu (= tag (vla-get-TagString item)))
        (vla-put-Color item col)
(vla-put-TextString item tval))
   ))
)
 
(defun C:mat1()  
  (setq a   (car (nentsel "\nChon Attribute:"))
col (acad_colordlg (dxf 62 a))
        kt  (dxf 1 a)
tag (dxf 2 a))  
  (setColor tag kt col (dxf 330 a) nil)
  (mapcar '(lambda(x) (setColor tag kt col x nil))
 (acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))
  (princ)
)
 
(defun C:mat2()  
  (setq a   (car (nentsel "\nChon Attribute:"))
col (dxf 62 a)
        kt  (dxf 1 a)
tag (dxf 2 a))  
  (mapcar '(lambda(x) (setColor tag kt col x t))
    (acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))
  (princ)
)
 

 

 

 

Bạn Tot77 xem lại cho mình lệnh mat1 được không, block của mình khi chuyển sang loại "leader" thì không chọn để đổi được nữa

Ngoài ra mình muốn áp dụng với các dynamic block khác nhưng không được. ví dụ mình có block ghi chú thép (file đính kèm) mình cũng muốn làm là đường kính giông nhau thì màu giống nhau, khoảng cách thép giống nhau thì mầu giống nhau nhưng lisp trên không dùng được.

bạn xem lại hộ mình cái nhé

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


  • 0

#30 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 April 2014 - 03:02 PM

Cái vụ này mới!! cái đó gọi là "chi phí phát sinh", bạn đưa file mới xem sao.
  • 0

#31 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 27 April 2014 - 03:03 PM

Lisp của bạn Tot77 không có tác dụng với Block dynamic vì dòng này:

(acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))

 

Có thể thiết kế giao diện bạn cho đó là hình thức nhưng nó có thể cho mình chọn 1 lần được nhiều tiết diện dầm và đổi màu 1 lần, đương nhiên tốc độ sẽ nhanh hơn so với cách 1 lần chỉ đổi được 1 cái

 

Tất nhiên là nếu tạo được liệt kê dạng bảng thì sẽ nhanh hơn nhiều rồi nhưng mà chắc là cũng khó vì mình thấy lisp tạo bảng của LeeMac dài thế kia cơ mà. Nếu bạn Tue_NV mà làm được thì làm giúp mình cái. cám ơn bạn nhiều


  • 0

#32 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 27 April 2014 - 03:07 PM

Bác Tot77 Chưa biết đấy thôi, cũng trên file của chủ topic đó nếu chưa thay đổi tính năng Dynamic thì mã dxf 2 chính là tên của nó

Còn khi thay đổi tính năng Block dynamic (như thay đổi thuộc tính Visible chẳng hạn) thì mà dxf 2 không phải là tên đó nữa, nó có tên là *U...

Mã code của bác bị ngay dòng mình đã viết  (acet-ss-to-list (ssget (list  '(0 . "INSERT") '(2 . "att_ten dam") (cons 66 1)))))


  • 1

#33 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 April 2014 - 03:45 PM

Vậy bạn xoá chỗ nào có  '(2 . "att_ten dam") đi thôi là xong.


  • 0

#34 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 27 April 2014 - 04:00 PM

Cái vụ này mới!! cái đó gọi là "chi phí phát sinh", bạn đưa file mới xem sao.

 

Mình gửi file rồi mà, mình gửi lại vậy. http://www.cadviet.c...mic_block_4.dwg

Bạn có thể sửa lại lisp sao cho dùng với dynamic block nào cũng được thì tốt quá

Cám ơn bạn nhiều


  • 0

#35 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 27 April 2014 - 09:58 PM

Ý kiến của Tue_NV về vấn đề  '(2 . "att_ten dam")  là 1 ý kiến đáng trân trọng, dù chỉ là delete 1 cặp dấu ngoặc thôi, nhưng nếu không có người chỉ ra thì tai họa sẽ ập đến khi thiết kế những chương trình lớn.

Tôi vote! 


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#36 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 April 2014 - 11:27 AM

Ý kiến của Tue_NV về vấn đề  '(2 . "att_ten dam")  là 1 ý kiến đáng trân trọng, dù chỉ là delete 1 cặp dấu ngoặc thôi, nhưng nếu không có người chỉ ra thì tai họa sẽ ập đến khi thiết kế những chương trình lớn.

Tôi vote! 

 

Lâu lắm mới thấy 2 bác k tranh luận :')  Cháu vote nốt ^^


  • 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


#37 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 28 April 2014 - 07:53 PM

Vậy bạn xoá chỗ nào có  '(2 . "att_ten dam") đi thôi là xong.

 

Đúng là chỉ cần bỏ  '(2 . "att_ten dam")  đi là xài được với cả dynamic block khác nữa. thế là ok rồi. cám ơn các bạn nhiều nhé

Nhưng nếu là được dạng bảng liệt kê như của mình thì khi dùng sẽ tiện hơn và nhanh hơn nhiều nữa. bạn nào làm được thì giúp mình cái nhé. mình cám ơn nhiều


  • 0

#38 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 01 May 2014 - 04:12 PM

Chẳng thấy ai làm, thôi mình làm luôn cho xong. Tên lệnh mat3.

http://www.cadviet.c...168_tmp1_53.lsp


  • 1

#39 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 03 May 2014 - 09:17 AM

Chẳng thấy ai làm, thôi mình làm luôn cho xong. Tên lệnh mat3.

http://www.cadviet.c...168_tmp1_53.lsp

Cảm ơn bạn Tot77 nhiều nhưng bạn xem lại hộ mình cái. sao mình không thể down được nhỉ


  • 0

#40 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 03 May 2014 - 11:57 AM

Tôi gửi lại theo link khác.

 http://www.mediafire...ywzv/attcol.lsp


  • 0