Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Cần lisp kiểm tra dim bị edit


  • Please log in to reply
27 replies to this topic

#1 quochuyksxd

quochuyksxd

    biết lệnh fillet

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

Đã gửi 24 December 2014 - 09:51 AM

Kính gửi các bác tiền bối về lisp trong diễn đàn, hiện nay em thấy có nhiều bản vẽ bị edit dim quá nhiều, về mặt hình thức thì không sao nhưng về mặt tương đối hình học thì chưa hợp lý lắm. Việc hiệu chỉnh cũng dễ bị nhầm lẫn (chẳng hạn khi stretch thì kích thước vẫn không đổi). Vì vậy em mong muốn các bác viết 1 lisp để có thể thực hiện việc kiểm tra các dim bị edit kích thước với quy trình như sau:

-Lệnh KTD (hoặc gì đó do các bác đặt)

-Quét toàn bộ bản vẽ cần kiểm tra (có thể quét toàn bộ đối tượng hoặc chỉ yêu cầu quét đối tượng dim, cái này cũng do các bác viết)

-Enter

-Nếu Dim nào bị edit kích thước, lisp sẽ tự động lọc riêng thành 1 layer đồng thời đổi màu theo layer thì càng tốt (tên layer này do các bác lập trình đặt, ví dụ: dimed, layer này các bác nên thiết lập màu sắc lạ tránh trùng với màu dim thông thường hay đặt như màu 8, 253,..để dễ phân biệt chỉnh sửa và chuyển về layer dim chung)

Rất cảm ơn các bác!

 


  • 0

#2 sgcq

sgcq

    Hội Hai Lúa

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

Đã gửi 24 December 2014 - 10:07 AM

:D :D :D

Câu hỏi hay

:D :D :D


  • 1

12728974_230210507314169_718723558582070 HỘI HAI LÚA

           fanpage: https://www.facebook.com/HoiHaiLua/

 

 

 

 

 

 


#3 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 24 December 2014 - 10:43 AM

- hi ^^, nhoc mới viết sơ bộ bạn test thử xem ^^, bạn có thể quét hết bản vẽ nó chỉ nhận đối tượng là dim, cái nào bị edit nó sẽ chuyển sang màu đỏ, layer dimed.

- nếu bạn thấy ok bạn mún thêm mắm múi cho ngon thì bạn trình bày cụ thể , đưa bản vẽ lun càng tốt, chỉnh sữa sẽ sát theo y/c của bạn ^^

(defun c:ktd (/ ss info dxf1 ename)
(prompt "Quet chon cac dim can kiem tra")
(if (setq ss (ssget '((0 .  "DIMENSION"))))
(progn 
 (repeat (sslength ss)
 (setq ename (ssname ss 0))
 (setq info (entget ename))
 (setq dxf1 (cdr (assoc 1 info)))
 (if (/= dxf1 "")
   (entmod (append info (list (cons 62 1) (cons 8 "dimed")) ))
   )
   (ssdel ename ss)
   )
  )
 )
 )

-P/s: có thể phần y/c thêm nhoc ko chỉnh nỗi , bạn thông cảm đợi các anh khác trợ giúp  :P


  • 2
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#4 quochuyksxd

quochuyksxd

    biết lệnh fillet

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

Đã gửi 24 December 2014 - 11:07 AM

Cảm ơn bác @nhoclangbat. Lisp của bác cơ bản đã thực hiện đúng ý tưởng của em rồi, tuy nhiên có 1 vấn đề là bác đã tách được dim bị edit rồi và bác đã lập cho nó chuyển sang màu đỏ nhưng thực tế khi mình đã set màu cố định trong dim rồi thì sau khi thực hiện lệnh dim bị edit vẫn không nhảy màu. Vấn đề này em nghĩ cũng khó, bởi vì nếu mình tách hẳn thành 1 dim mới thì được. em gửi cho bác 1 bản vẽ e sẽ edit 1 vài dim để bác thử kiểm nghiệm lisp xem sao  :mellow:

http://www.cadviet.c...4/100618_vd.dwg


  • 0

#5 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 24 December 2014 - 11:42 AM

Thử xem :)

(defun C:KTD( / ss ena txt n kq) 
 (setq ss (ssget "X" '((0 . "DIMENSION"))))
(setq n 0)
(if (not (tblsearch "layer" "Dimed"))
  (vl-cmdf "Layer" "N" "Dimed" "C" "1" "Dimed" "")
)
(while (setq ena (ssname ss 0))
  (setq txt (cdr (assoc 1 (entget ena))))
  (if (not (or (= txt "") (vl-string-search "<>" txt))) (progn
    (vl-cmdf "change" ena "" "p" "LA" "Dimed" "")
(vl-cmdf "._DIMOVERRIDE" "dimclrt" 1 "" ena "" )
    (setq n (1+ n))
  ))
  (ssdel ena ss)
)
(if (= n 0) (setq kq "Ket qua check: OK")
  (setq kq (strcat "Co " (itoa n) " Dimensions bi sua Text"
           "\nda duoc chuyen sang layer Dimed co mau 1!")
  )
)
(alert kq)
(princ))

Test bản vẽ bạn đâu thấy dim nào thay đổi text override <_<


  • 3

#6 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 24 December 2014 - 11:58 AM

- oh có anh Phung tham gia ^^, nhoc cũng mới sữa xong ^^, bạn xem sao


(defun c:ktd (/ ss info dxf1 ename obj)
(vl-load-com)
(if (null (tblsearch "layer" "dimed")) (K:layer "dimed" 1))
(prompt "Quet chon cac dim can kiem tra")
(if (setq ss (ssget '((0 .  "DIMENSION"))))
(progn 
 (repeat (sslength ss)
 (setq ename (ssname ss 0))
 (setq obj (vlax-ename->vla-object ename))
 (setq info (entget ename))
 (setq dxf1 (cdr (assoc 1 info)))
  (if (/= dxf1 "")
   (progn
     ;(entmod (subst (cons 1 "") (assoc 1 info) info))
	(vla-put-DimensionLinecolor obj "1")
	 (vla-put-TextColor obj "1")
	 (vla-put-ExtensionLinecolor obj "1")
	 (vla-put-layer obj "dimed")
    )
   )
   
   (ssdel ename ss)
   )
  )
 )
 (princ)
 )
(defun K:layer (ten clr)
(if (null (tblsearch "LAYER" ten))
(entmakex (list 
               '(0 . "LAYER")
               '(100 . "AcDbSymbolTableRecord")
               '(100 . "AcDbLayerTableRecord")
			   '(70 . 0)
                (cons 2 ten)
                (cons 62 clr))
)
)
) 

 

-p/s: sau khi nhận thấy các dim bị edit , đổi layer chuyển màu, nó sẽ edit lun về kích thước thật của dim


  • 2
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#7 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 24 December 2014 - 12:42 PM

- hi nhoc bị lẫn xíu quên kiểm tra, nó chạy chưa như ý , nhoc đã sữa lại ở trên ^^


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#8 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 24 December 2014 - 01:00 PM

Nhoc:
Chỉ cần đánh dấu những dim đã ed, ko cần sửa, Vì có nhiều BV cần ed kích thước, nếu chạy xong lisp này sẽ bị nhảy lung tung.
Cũng vì thế mà cad cho ed dim mà :D
  • 2

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#9 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 24 December 2014 - 01:20 PM

- thanks Hiep bên nhoc ít dùng dim nên ko rành, thấy sữa đc nên sữa lun ^^, đã edit lại chỉ đánh dấu ^^


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#10 Hoan1111

Hoan1111

    biết lệnh adcenter

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

Đã gửi 24 December 2014 - 02:05 PM

:D :D :D

Câu hỏi hay

:D :D :D

 

Cũng chẳng hay ho gì lắm vì làm thủ công cũng biết được có bao nhiêu kích thước đã bị edit,  đỡ phải hao tổn nowtron nhớ tên lisp! :) :) :)


  • 0

66 Câu Phật Học Cho Cuộc Sống : http://ngocchinh.com...-cho-cuoc-song/

Gió đưa cây cải về trời / Rau răm ở lại chịu lời đắng cay...

 

 


#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 24 December 2014 - 02:12 PM

CAD đã có lệnh lọc ra dim bị edit đâu cần đến Lisp!


  • 0

#12 quochuyksxd

quochuyksxd

    biết lệnh fillet

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

Đã gửi 24 December 2014 - 02:24 PM

Thử xem :)

(defun C:KTD( / ss ena txt n kq) 
 (setq ss (ssget "X" '((0 . "DIMENSION"))))
(setq n 0)
(if (not (tblsearch "layer" "Dimed"))
  (vl-cmdf "Layer" "N" "Dimed" "C" "1" "Dimed" "")
)
(while (setq ena (ssname ss 0))
  (setq txt (cdr (assoc 1 (entget ena))))
  (if (not (or (= txt "") (vl-string-search "<>" txt))) (progn
    (vl-cmdf "change" ena "" "p" "LA" "Dimed" "")
(vl-cmdf "._DIMOVERRIDE" "dimclrt" 1 "" ena "" )
    (setq n (1+ n))
  ))
  (ssdel ena ss)
)
(if (= n 0) (setq kq "Ket qua check: OK")
  (setq kq (strcat "Co " (itoa n) " Dimensions bi sua Text"
           "\nda duoc chuyen sang layer Dimed co mau 1!")
  )
)
(alert kq)
(princ))

Test bản vẽ bạn đâu thấy dim nào thay đổi text override <_<

Chuẩn rồi bác Nhoclangbat. Cảm ơn bác nhiều nhé. Nể mấy bác "cao thủ" làm thủ công vẫn tìm hết dim bị ed quá  :)


  • 0

#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 24 December 2014 - 02:26 PM

Chuẩn rồi bác Nhoclangbat. Cảm ơn bác nhiều nhé. Nể mấy bác "cao thủ" làm thủ công vẫn tìm hết dim bị ed quá  :)

 

Lệnh FIND nó tự tìm cho mình hết đó bạn!

 

Dùng lệnh Find tìm chuỗi "~*<>*"
Dùng chức năng Select_All của lệnh Find
Chọn được rồi -> Muốn đổi gì thì cũng sẽ đơn giản rồi
Ra tiệm in mà quên mang theo Lisp thì sử dụng cái này bạn nhé! :D

 


  • 0

#14 quochuyksxd

quochuyksxd

    biết lệnh fillet

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

Đã gửi 24 December 2014 - 03:00 PM

Được cái em hay cop lưu vào usb nên đi đâu in cũng an tâm bác Tue_NV ah  :)  :)  :)


  • 0

#15 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 24 December 2014 - 09:20 PM

Dùng Vlax cải thiện tốc độ, nếu không có Text override thì khỏi tạo Layer "dimed", chỉ cần Text Dim đổi màu :)

(defun C:KTD( / ss ena obj txt n kq) 
(vl-load-com)
 (setq ss (ssget "X" '((0 . "DIMENSION"))))
(setq n 0)
 (while (setq ena (ssname ss 0)) (setq obj (vlax-ename->vla-object ena))
  (setq txt (cdr (assoc 1 (entget ena))))
(if (not (or (= txt "") (vl-string-search "<>" txt))) 
(progn
(if (not (tblsearch "layer" "Dimed"))
  (vl-cmdf "Layer" "N" "Dimed" "C" "1" "Dimed" ""))
 (vla-put-TextColor obj "1") 
(vla-put-layer obj "dimed")    (setq n (1+ n))
  ))
  (ssdel ena ss)
)
(if (= n 0) (setq kq "Ket qua check: OK")
  (setq kq (strcat "Co " (itoa n) " Dimensions bi sua Text"
           "\nDa duoc chuyen sang layer Dimed co Text mau 1!")
  )
)
(alert kq)
(princ))

 

- oh có anh Phung tham gia ^^, nhoc cũng mới sữa xong ^^, bạn xem sao

Lisp của Nhoc vẫn chưa xét trường hợp Text override có kí tự <> nên sẽ xem loại Dim này đã bị ED luôn :D

  • 3

#16 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 24 December 2014 - 09:27 PM

Lệnh FIND nó tự tìm cho mình hết đó bạn!

Chuỗi ~*<>* chứa nhiều thứ khác Dim nữa cơ mà.


  • 0

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


#17 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 24 December 2014 - 10:42 PM

Chuỗi ~*<>* chứa nhiều thứ khác Dim nữa cơ mà.

 

Bác có thể dùng tùy chọn option của lệnh Find chỉ cho chọn Dim mà thôi!


  • 1

#18 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 22 (tàm tạm)

Đã gửi 30 December 2014 - 09:22 AM

Dùng Vlax cải thiện tốc độ, nếu không có Text override thì khỏi tạo Layer "dimed", chỉ cần Text Dim đổi màu :)

lisp này hay, dùng nhẹ. Bạn có thể chỉnh mình cái là chọn đổi màu trong những dim được chọn thôi chứ không phải tất cả của bản vẽ?
Cái thứ 2 nữa là. sau khi chỉnh lại kích thước thật bằng tay <> thì nó vẫn bị màu thế. Có cách nào khi gõ lệnh ktd -chọn kích thước các dim được chọn
- dim ed đổi màu như trên, còn những dim khi bị đỏ do gõ ktd lần trc (sau khi sưa thành <> ) sẽ về màu sắc của mặc định dimstyle đó. Thanks


  • 0

#19 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 30 December 2014 - 10:11 AM

1/  Muốn tự chọn thì :

(setq ss (ssget "X" '((0 . "DIMENSION")))) sửa thành (setq ss (ssget '((0 . "DIMENSION"))))

2/ Muốn edit thằng dim nào đã bi sửa thì chọn trước các dim đó rồi dùng lệnh Find như bạn TUE -NV đã nói, Muốn chỉnh lại màu Text thì chọn các dim cần chỉnh, trong hộp properties

chọn màu Text color là xong :) .


  • 1

#20 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 22 (tàm tạm)

Đã gửi 30 December 2014 - 10:40 AM

1/  Muốn tự chọn thì :

(setq ss (ssget "X" '((0 . "DIMENSION")))) sửa thành (setq ss (ssget '((0 . "DIMENSION"))))

2/ Muốn edit thằng dim nào đã bi sửa thì chọn trước các dim đó rồi dùng lệnh Find như bạn TUE -NV đã nói, Muốn chỉnh lại màu Text thì chọn các dim cần chỉnh, trong hộp properties

chọn màu Text color là xong :) .

chỉnh thế thi mình bik nhưng thủ công. muốn gõ lệnh cái. tắt cả dim đã sửa lại đổi màu theo dimstyle :D


  • 0