Đến nội dung


Hình ảnh
- - - - -

Nhờ các anh chị trong forums viết hộ em lisp sau.


  • Please log in to reply
8 replies to this topic

#1 leducthaik41

leducthaik41

    biết pan

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

Đã gửi 07 June 2013 - 04:46 PM

Em có 1 bản vẽ gồm : các dim chuẩn và các dim đã bị ed.

Yêu cầu lisp chuyển màu chữ trong dim đã bị ed khác với màu chữ trong dim chưa bị ed.

Em cám ơn nhiều ạ.


  • 0

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 07 June 2013 - 06:05 PM

Em có 1 bản vẽ gồm : các dim chuẩn và các dim đã bị ed.

Yêu cầu lisp chuyển màu chữ trong dim đã bị ed khác với màu chữ trong dim chưa bị ed.

Em cám ơn nhiều ạ.

Hề hề hề,

Bạn dùng thử cái này coi sao nhé:

Do bạn không chỉ định màu cần đổi nên mình cứ tạm mặc địng đó là màu vàng. Nếu bạn chưa ưng có thể thay bằng màu tùy ý. Lisp này sẽ đổi tất cả các dim đã bị edit mà không quan tâm tới việc edit ấy đúng hay sai.

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

 

 

(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
         (if (= (assoc 62 (entget dm)) nil)
             (setq els (append (entget dm) (list (cons 62 2)) ))
             (setq els (subst (cons 62 2) (assoc 62 (entget dm)) (entget dm)))
          )
     )
     (entmod els)
)
(command "undo" "e")
(princ)
 
(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
         (if (= (assoc 62 (entget dm)) nil)
             (setq els (append (entget dm) (list (cons 62 2)) ))
             (setq els (subst (cons 62 2) (assoc 62 (entget dm)) (entget dm)))
          )
     )
     (entmod els)
)
(command "undo" "e")
(princ)
)
(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
         (if (= (assoc 62 (entget dm)) nil)
             (setq els (append (entget dm) (list (cons 62 2)) ))
             (setq els (subst (cons 62 2) (assoc 62 (entget dm)) (entget dm)))
          )
     )
     (entmod els)
)
(command "undo" "e")
(princ)
)

  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 07 June 2013 - 06:50 PM

Hề hề hề,

Bạn dùng thử cái này coi sao nhé:

Do bạn không chỉ định màu cần đổi nên mình cứ tạm mặc địng đó là màu vàng. Nếu bạn chưa ưng có thể thay bằng màu tùy ý. Lisp này sẽ đổi tất cả các dim đã bị edit mà không quan tâm tới việc edit ấy đúng hay sai.

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

 

 

(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
         (if (= (assoc 62 (entget dm)) nil)
             (setq els (append (entget dm) (list (cons 62 2)) ))
             (setq els (subst (cons 62 2) (assoc 62 (entget dm)) (entget dm)))
          )
     )
     (entmod els)
)
(command "undo" "e")
(princ)
 
(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
         (if (= (assoc 62 (entget dm)) nil)
             (setq els (append (entget dm) (list (cons 62 2)) ))
             (setq els (subst (cons 62 2) (assoc 62 (entget dm)) (entget dm)))
          )
     )
     (entmod els)
)
(command "undo" "e")
(princ)
)
(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
         (if (= (assoc 62 (entget dm)) nil)
             (setq els (append (entget dm) (list (cons 62 2)) ))
             (setq els (subst (cons 62 2) (assoc 62 (entget dm)) (entget dm)))
          )
     )
     (entmod els)
)
(command "undo" "e")
(princ)
)

 

Bác viết vầy là chưa lường hết các TH đổi màu cho dim rồi.

Trên bản vẽ dưới đây, với Dim này, với Lisp bác viết thì cho dù bác edit dim đi chăng nữa thì không chịu đổi màu đâu

http://www.cadviet.c.../3/4652_dim.dwg


  • 1

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 08 June 2013 - 09:31 AM

Bác viết vầy là chưa lường hết các TH đổi màu cho dim rồi.

Trên bản vẽ dưới đây, với Dim này, với Lisp bác viết thì cho dù bác edit dim đi chăng nữa thì không chịu đổi màu đâu

http://www.cadviet.c.../3/4652_dim.dwg

Hề hề hề,

Chân thành cảm ơn sự góp ý của bác Tue_NV.

Quả thực là cái dim của bác mình không đổi được màu bằng cái lisp mình viết. Lý do thì mình chưa rõ, cần phải tìm hiểu thêm vì đây là lần đầu tiên mình gặp cái dim kiểu này. Rõ ràng trong mã dxf của nó thì mã màu là 2, vậy mà hiển thị thì lại là màu số 5. Có điều chi lắt léo ở đây mà mình chưa thủng.

Mình đã thử dùng cả lệnh change-> property->color  để đổi màu, nhưng cũng không được. Chắc cái màu này ăn theo cái dim style rồi nên mình phải ngẫm đã chứ chưa thể giải quyết được.

Hề hề hề,... 

 

PS: Sau khi tò mò, mình mới phát hiện ra là dim của bác Tue_NV được lấy màu là byBlock. Cái Block dim này gồm có 10 đối tượng con tạo thành trong đó có tới 7 đối tượng có màu 5 và 3 đối tượng có màu 0.

Để đổi màu các đối tượng con này. mình phải explode cái block dim này ra và như vậy làm cho tính associate của nó bị phá vỡ cho dù sau đó mình hoàn toàn có thể tạo block lại với các đối tượng con mới này. Điều này có nhẽ là chủ thớt cũng không khoái, nhưng mình chưa biết cách nào hơn nên đành gác tay chờ các bác khác ra sức vậy.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 June 2013 - 09:50 AM

1). Nếu đổi bằng cad trên bản vẽ bác Tue_NV, vào change thì bác đổi ở "Text color" chứ không phải ở "Color".

2). Xử lý Dim là cực kỳ phức tạp, nhất là dim Override, vì nó liên quan tới dữ liệu mở rộng Xdata, mã DXF 1070. Bác dùng (assoc -3 (entget ent '("ACAD"))) sẽ thấy.

3). Chọn dim Override: (ssget '((0 . "DIMENSION") (1 . "~")))

4). Tặng bác file lisp của Terry Miller để nghiên cứu thêm về dim đau khổ.

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


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


#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 June 2013 - 04:20 PM


......

..

PS: Sau khi tò mò, mình mới phát hiện ra là dim của bác Tue_NV được lấy màu là byBlock. Cái Block dim này gồm có 10 đối tượng con tạo thành trong đó có tới 7 đối tượng có màu 5 và 3 đối tượng có màu 0.

Để đổi màu các đối tượng con này. mình phải explode cái block dim này ra và như vậy làm cho tính associate của nó bị phá vỡ cho dù sau đó mình hoàn toàn có thể tạo block lại với các đối tượng con mới này. Điều này có nhẽ là chủ thớt cũng không khoái, nhưng mình chưa biết cách nào hơn nên đành gác tay chờ các bác khác ra sức vậy.

 

Cái này em thấy đơn giản mà bác. Code của bác đây, em chỉnh lại:

 

(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
            (command "._DIMOVERRIDE" "DIMCLRT" "2" "DIMCLRD" "2" "DIMCLRE" "2" "" dm "")
     )
     (entmod els)
)
(command "undo" "e")
(princ)
)

  • 1

#7 leducthaik41

leducthaik41

    biết pan

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

Đã gửi 11 June 2013 - 07:56 AM

em cám ơn nhiều ạ.


  • 0

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 11 June 2013 - 11:28 AM

Cái này em thấy đơn giản mà bác. Code của bác đây, em chỉnh lại:

 

(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
            (command "._DIMOVERRIDE" "DIMCLRT" "2" "DIMCLRD" "2" "DIMCLRE" "2" "" dm "")
     )
     (entmod els)
)
(command "undo" "e")
(princ)
)

Hề hề hề,

Thanks bác Tue_NV. Quả thực là mình không nghĩ tới việc sử dụng các biến hệ thống này. Đây là một bài học tốt cho những người đang tập vỉết lisp.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 11 June 2013 - 04:33 PM

Mình cũng mót được cái này của Ketxu (lisp tìm dim fake) 

(defun c:edd ( / ss)
  (vl-load-com)
  (ssget "_X" '((0 . "*DIMENSION") (1 . "*?*")))
  (vlax-for x (setq ss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (vla-put-TextColor x 2))
  (vla-delete ss)
  (princ)
  )

  • 0