Chuyển đến nội dung
Diễn đàn CADViet
Duong Nhat Duy

Lisp tính chiều dài, diện tích hàng loạt

Các bài được khuyến nghị

Vào lúc 24/2/2023 tại 14:59, Duong Nhat Duy đã nói:

Ko vấn đề gì bạn ơi, bạn thêm dấu ; vào đầu dòng này là đc. Nếu quên lệnh bạn có thể gõ ?? để hiện cái bảng đó lên.

Lisp mình viết gà nên đăng hẳn code mở lên đây cho ae vừa xem vừa sửa hộ luôn :))

 image.png.7cb954eee095cb42ffed1897a56b8707.png

cảm ơn bác đã chia sẻ, mình là người dùng bình thường không biết về lips, có những người chia sẻ như bác giúp công việc của mọi người hoàn thành nhanh hơn. rất trân trọng!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 26/2/2023 tại 10:21, mr.thanh2610 đã nói:

image.thumb.png.c390d9fdabdab365775aef9297d58fe6.png
Bác @Duong Nhat Duy cho mình hỏi có thể thêm 2 lựa chọn cho cách tính lệnh DT2 pick điểm-nhiều điểm là : 1 lựa chọn trừ lỗ khoét (như lisp hiện tại), 2 pick tới đâu cộng dồn tới đó (thêm vào) được không ạ, Vì mình đang muốn tính kiểu Pick-nhiều điểm S=S1+S2+S3+S4 hoặc S=S1+S2+S3 chẳng hạn.Mong được phản hồi từ bác, cảm ơn ạ
P/s: Mình biết có cách tính DT4 sẽ giải quyết vấn đề trên nhưng ý mình muốn tính trong trường hợp không có hatch và pick nhiều điểm

Bản chất lệnh DT2 là lệnh pick tới đâu cộng dồn tới đó như bạn nói, nhưng cái này là do lisp lỗi nên nó tính nhầm (do biến HPISLANDDETECTION), mình đã fix và update lên đầu topic r nhé, cảm ơn bạn đã tìm ra lỗi này !

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 27/2/2023 tại 16:16, Duong Nhat Duy đã nói:

Bản chất lệnh DT2 là lệnh pick tới đâu cộng dồn tới đó như bạn nói, nhưng cái này là do lisp lỗi nên nó tính nhầm (do biến HPISLANDDETECTION), mình đã fix và update lên đầu topic r nhé, cảm ơn bạn đã tìm ra lỗi này !

Ok bác, dùng ngon lành rồi, 1 lần nước cảm ơn bác

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hiện nay có 1 vấn đề là nếu dùng CAD09 trở xuống thì lệnh DT2 sẽ bị lỗi khi tính diện tích 1 miền có lỗ hổng ở giữa, các bạn phải vào lệnh HATCH, tích vào 2 ô như hình, xong hatch đại 1 cái gì đấy để cho nó lưu cái cài đặt đó lại, xong thì dùng như bình thường.

Lisp mình đã update lại (phiên bản cũ sẽ bị lỗi lệnh DT2 luôn chứ ko phải là ko tính đc), các bạn down lại trên đầu topic.

HPISLANDDETECTION.png.f392a42a23d69227101e0511b1678444.png

Hiện tại mình chưa tìm được tên biến của 2 thằng này ở cad đời thấp, pro nào biết chỉ giúp mình nhé, mình cảm ơn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
18 giờ trước, Duong Nhat Duy đã nói:

Hiện nay có 1 vấn đề là nếu dùng CAD09 trở xuống thì lệnh DT2 sẽ bị lỗi khi tính diện tích 1 miền có lỗ hổng ở giữa, các bạn phải vào lệnh HATCH, tích vào 2 ô như hình, xong hatch đại 1 cái gì đấy để cho nó lưu cái cài đặt đó lại, xong thì dùng như bình thường.

Lisp mình đã update lại (phiên bản cũ sẽ bị lỗi lệnh DT2 luôn chứ ko phải là ko tính đc), các bạn down lại trên đầu topic.

HPISLANDDETECTION.png.f392a42a23d69227101e0511b1678444.png

Hiện tại mình chưa tìm được tên biến của 2 thằng này ở cad đời thấp, pro nào biết chỉ giúp mình nhé, mình cảm ơn!

DT2 sửa như sau:

(defun C:dt2 ( / AREA ENT_LAST STR SUM)
  (setvar "CMDECHO" 0)
  (if (getvar "HPISLANDDETECTIONMODE") (setvar "HPISLANDDETECTIONMODE" 1))
  (if (getvar "HPISLANDDETECTION") (setvar "HPISLANDDETECTION" 0) (setvar "HPNAME" "SOLID,N"))
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setq ent_last (entlast))
  (while (entnext ent_last) (setq ent_last (entnext ent_last)))
  (command "-HATCH")
  (while (> (getvar "CMDACTIVE") 0)
    (command pause)
    )
  (setq sum 0.00)
  (while (setq ent_last (entnext ent_last))
    (if (= (cdr (assoc 0 (entget ent_last))) "HATCH")
      (progn
    (if (vl-catch-all-error-p (vl-catch-all-apply (function (lambda () (setq area (vlax-get (vlax-ename->vla-object ent_last) 'area))))))
      (setq area 0.00)
      )
    (setq sum (+ sum area))
    )
      )
    (entdel ent_last)
    )
  (setq str (tdt_convert sum 3DUY-TDT-UNIT 3DUY-TDT-FACTOR 3DUY-TDT-PRECISION 3DUY-TDT-PREFIX 3DUY-TDT-SUFFIX 3DUY-TDT-COMMA 3DUY-TDT-SWAP 3DUY-TDT-ZERO))
  (mk_text1
    3DUY-TDT-BLOCK
    str
    (nentsel "\nChon vi tri xuat ket qua")
    (getvar "CLAYER")
    (if (and (= 3DUY-TDT-AUTO 0) 3DUY-TDT-STYLE-NAME) 3DUY-TDT-STYLE-NAME (getvar "TEXTSTYLE"))
    (if (= 3DUY-TDT-AUTO 1) (/ (getvar "VIEWSIZE") 50) 3DUY-TDT-HEIGHT)
    3DUY-TDT-WIDTH
    0
    acAlignmentMiddleCenter
    3DUY-TDT-BLOCK-NAME
    3DUY-TDT-SCALE
    (list (cons 3DUY-TDT-TAG-NAME str))
    nil
    )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  )

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2 giờ trước, NTHAHT đã nói:

DT2 sửa như sau:

(defun C:dt2 ( / AREA ENT_LAST STR SUM)
  (setvar "CMDECHO" 0)
  (if (getvar "HPISLANDDETECTIONMODE") (setvar "HPISLANDDETECTIONMODE" 1))
  (if (getvar "HPISLANDDETECTION") (setvar "HPISLANDDETECTION" 0) (setvar "HPNAME" "SOLID,N"))
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setq ent_last (entlast))
  (while (entnext ent_last) (setq ent_last (entnext ent_last)))
  (command "-HATCH")
  (while (> (getvar "CMDACTIVE") 0)
    (command pause)
    )
  (setq sum 0.00)
  (while (setq ent_last (entnext ent_last))
    (if (= (cdr (assoc 0 (entget ent_last))) "HATCH")
      (progn
    (if (vl-catch-all-error-p (vl-catch-all-apply (function (lambda () (setq area (vlax-get (vlax-ename->vla-object ent_last) 'area))))))
      (setq area 0.00)
      )
    (setq sum (+ sum area))
    )
      )
    (entdel ent_last)
    )
  (setq str (tdt_convert sum 3DUY-TDT-UNIT 3DUY-TDT-FACTOR 3DUY-TDT-PRECISION 3DUY-TDT-PREFIX 3DUY-TDT-SUFFIX 3DUY-TDT-COMMA 3DUY-TDT-SWAP 3DUY-TDT-ZERO))
  (mk_text1
    3DUY-TDT-BLOCK
    str
    (nentsel "\nChon vi tri xuat ket qua")
    (getvar "CLAYER")
    (if (and (= 3DUY-TDT-AUTO 0) 3DUY-TDT-STYLE-NAME) 3DUY-TDT-STYLE-NAME (getvar "TEXTSTYLE"))
    (if (= 3DUY-TDT-AUTO 1) (/ (getvar "VIEWSIZE") 50) 3DUY-TDT-HEIGHT)
    3DUY-TDT-WIDTH
    0
    acAlignmentMiddleCenter
    3DUY-TDT-BLOCK-NAME
    3DUY-TDT-SCALE
    (list (cons 3DUY-TDT-TAG-NAME str))
    nil
    )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  )

Mình chưa hiểu bạn ơi, nó đang bị lỗi phần định nghĩa Island chứ có liên quan gì đến Patern đâu nhỉ ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Vào lúc 30/12/2022 tại 12:11, NTHAHT đã nói:

Còn trường hợp này nữa, trong đó:

-> Ngoài là cái Rectang, trong là cái block, block này bao gồm:

- DT1 là Mtext

- TB-01 là ATT (multiline)

 - BLOCK-1 là Multileader.

 - Rectang màu đỏ.

 *** Đối với Hatch thì các đối tượng đó được bỏ qua.

image.png.40c4987e172a8d07e5b2a75729046807.png

 

Như vậy có thể dùng lọc tuỳ chỉnh. không quá khó đâu bạn

(defun BoundaryAreaPoint (pt / ent lst area ss)
  (setq 
    ent (entlast)
    ss (ssget "All" '((0 . "............"))  ;;;>>>>> đối tượng muốn lọc <<<<<;;;;;;
  )
  (vl-cmdf "_.boundary" "A" "B" "N" ss "" "I" "Y" "O" "R" "X" pt "")
  (while (setq ent (entnext ent))
    (setq lst (cons (vlax-ename->vla-object ent) lst))
  )
  (if (< 1 (length lst))
    (progn
      (setq lst (vl-sort lst '(lambda (a b) (> (vla-get-area a) (vla-get-area b)))))
      (foreach item (cddr lst)
        (vla-boolean (cadr lst) acunion item)
      )
      (vla-boolean (car lst) acsubtraction (cadr lst))
    )
  )
  (setq  area (vla-get-area (CAR lst)))
  (LIST area (CAR lst))
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
4 giờ trước, Duong Nhat Duy đã nói:

Mình chưa hiểu bạn ơi, nó đang bị lỗi phần định nghĩa Island chứ có liên quan gì đến Patern đâu nhỉ ?

Tại sao bạn không test nhỉ?

Với cad không có biến HPISLANDDETECTION thì gán HPNAME kèm theo ISLAND

Như vậy, với mỗi Patern có 3 trường hợp, ví dụ với SOLID:

1: "SOLID,N" (Normal) tương đương HPISLANDDETECTION = 0

2: "SOLID,O" (Outer) tương đương HPISLANDDETECTION = 1

3: "SOLID,I" (Ignore) tương đương HPISLANDDETECTION = 2

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 20/12/2022 tại 16:30, Duong Nhat Duy đã nói:

Gửi đến các bạn 1 lisp tính diện tích all-in-one, đơn giản, dễ dùng, và có thể tính được theo nhiều yêu cầu đề bài.
Cách dùng:
- Load lisp, nhập lệnh TL để thiếp lập các thông số như đơn vị, cao chữ,… Chỉ cần khai báo 1 lần
- Các lệnh tính diện tích bao gồm 4 lệnh riêng biệt như sau:


DT1: pick điểm, bấm đâu tính đó

DT1.gif.0e8980740c70a5ddd2656f4d270f0c36.gif


DT2: pick nhiều điểm, cộng gộp vào nhau (text kết quả có thể tạo mới bằng cách bấm vào khoảng trắng hoặc sửa text, att bằng cách bấm chọn 1 text, att đã có sẵn trên bản vẽ)

DT2.gif.7bc8a5799714878d784c014c2aec9add.gif


DT3: chọn đối tượng, có thể chọn được nhiều đối tượng cùng lúc, nhiều kiểu đối tượng ví dụ: Pline, Spline, Hatch, Region,…

DT3.gif.288e8af23418a96767972db83a074da5.gif


DT4: như DT3 nhưng là chọn 1 nhóm đối tượng, kết quả là tổng diện tích các đối tượng (text kết quả có thể tạo mới bằng cách bấm vào khoảng trắng hoặc sửa text, att bằng cách bấm chọn 1 text, att đã có sẵn trên bản vẽ)

DT4.gif.84afc18dbcd2ef285ce343d15c94849f.gif

 

Bonus: kết quả xuất ra có thể là Block do mình định nghĩa (ví dụ Block tem đất), khai báo trong lệnh TL

DT-Block.gif.751fda36f99bff38bb4e9c9b3a85cea9.gif


File lisp (Update 10/02/2023): Tinh dien tich.lsp
Chúc các bạn thành công :)))

Có cách nào cài đặt 1 lần, lần sau không phải cài đặt lại các thông số không bác. vì mỗi lần mở 1 bản vẽ là phải cài đặt lại thông số tính diện tíchimage.png.d91c17862496b4745677812d4e17c68a.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 4/3/2023 tại 15:54, tuan9002 đã nói:

Có cách nào cài đặt 1 lần, lần sau không phải cài đặt lại các thông số không bác. vì mỗi lần mở 1 bản vẽ là phải cài đặt lại thông số tính diện tíchimage.png.d91c17862496b4745677812d4e17c68a.png

Hiện tại lisp vẫn chưa có tính năng này, mình sẽ thêm trong lần cập nhật sau nhé, hiện tại bạn chịu khó chỉnh tay

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 4/3/2023 tại 15:28, NTHAHT đã nói:

Tại sao bạn không test nhỉ?

Với cad không có biến HPISLANDDETECTION thì gán HPNAME kèm theo ISLAND

Như vậy, với mỗi Patern có 3 trường hợp, ví dụ với SOLID:

1: "SOLID,N" (Normal) tương đương HPISLANDDETECTION = 0

2: "SOLID,O" (Outer) tương đương HPISLANDDETECTION = 1

3: "SOLID,I" (Ignore) tương đương HPISLANDDETECTION = 2

Mình hiểu r, vậy còn biến "HPISLANDDETECTIONMODE" giải quyết như nào bạn ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
11 giờ trước, Nguyễn Hà Huy đã nói:

Em có file cad này, có 1 số vùng tính diện tích toàn ra kết quả =0 hoặc lỗi  không tính được mong bác giúp

Test.dwg

Do hatch của bạn bị lỗi, trong Properties cũng ko hiện diện tích thì lisp nó ko tính được. Hatch lỗi thì nhiều lí do lắm, có thể do đường bao bị trùng nét, ...

Cách giải quyết: Hiện đường bao hatch lên, join vào (nếu ko kín) rồi tính diện tích cái đường bao đó = lệnh DT3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 14/3/2023 tại 09:32, Duong Nhat Duy đã nói:

Do hatch của bạn bị lỗi, trong Properties cũng ko hiện diện tích thì lisp nó ko tính được. Hatch lỗi thì nhiều lí do lắm, có thể do đường bao bị trùng nét, ...

Cách giải quyết: Hiện đường bao hatch lên, join vào (nếu ko kín) rồi tính diện tích cái đường bao đó = lệnh DT3

Mình hay dùng để kiểm tra diện tích trắc ngang thường bị lỗi này, giờ có thể bổ sung thêm tính năng khắc phục được nhược điểm này không nhỉ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
20 giờ trước, VoHoan đã nói:

Mình hay dùng để kiểm tra diện tích trắc ngang thường bị lỗi này, giờ có thể bổ sung thêm tính năng khắc phục được nhược điểm này không nhỉ.

Chỉ có cách tắt bớt layer thừa, trùng thôi bạn, bản chất lisp nó cũng như lệnh cad thôi, bạn BO đc, HATCH đc thì lisp nó mới làm đc

Bất đắc dĩ thì dùng đến cái này, tương tự như dùng lệnh Hatch, mà kết quả có thể sẽ có sai số, thậm chí lỗi

image.png.af1bfc9e7fdc47393ae8468fe4bbba09.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không chạy được trên cad 2005 bác ơi , tính diện tích toàn ra 0.00 , mà phần mềm nghề của em toàn chạy trên cad 2005 trở xuống á , bác xem có chỉnh lại đc ko ạ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 1/4/2023 tại 12:07, minhkiboo đã nói:

Không chạy được trên cad 2005 bác ơi , tính diện tích toàn ra 0.00 , mà phần mềm nghề của em toàn chạy trên cad 2005 trở xuống á , bác xem có chỉnh lại đc ko ạ.

Bạn gặp lỗi trong lệnh nào (DT1234?), cho mình xin cái ảnh dòng command sau khi chạy lisp thì mình mới phán đc, tiện bạn gửi luôn bản vẽ ví dụ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
6 giờ trước, Duong Nhat Duy đã nói:

Bạn gặp lỗi trong lệnh nào (DT1234?), cho mình xin cái ảnh dòng command sau khi chạy lisp thì mình mới phán đc, tiện bạn gửi luôn bản vẽ ví dụ

 

trên cad 2005 lệnh DT1,DT2 ko hoạt động dù đó là 1 hình REC kín, DT3 vẫn hoạt độngimage.thumb.png.13432444382b9af325c643c8de89708e.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 24/2/2023 tại 14:59, Duong Nhat Duy đã nói:

Ko vấn đề gì bạn ơi, bạn thêm dấu ; vào đầu dòng này là đc. Nếu quên lệnh bạn có thể gõ ?? để hiện cái bảng đó lên.

Lisp mình viết gà nên đăng hẳn code mở lên đây cho ae vừa xem vừa sửa hộ luôn :))

 image.png.7cb954eee095cb42ffed1897a56b8707.png

với lại bác có thể thêm vào lệnh DT2, Dt4 các đường chỉ từ kết quả vào vùng tính diện tích khi tính gộp nhiều diện tích được không ạ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
22 giờ trước, minhkiboo đã nói:

 

trên cad 2005 lệnh DT1,DT2 ko hoạt động dù đó là 1 hình REC kín, DT3 vẫn hoạt độngimage.thumb.png.13432444382b9af325c643c8de89708e.png

Bạn mở cad, gõ lệnh -hatch, kéo dòng command hiển thị độ 10 dòng mình xem

Mà bạn dùng hệ điều hành gì giao diện trong lạ và đẹp mắt vậy ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2 giờ trước, minhkiboo đã nói:

với lại bác có thể thêm vào lệnh DT2, Dt4 các đường chỉ từ kết quả vào vùng tính diện tích khi tính gộp nhiều diện tích được không ạ

Mình đã thêm vào bản 1.01, bạn down ở đầu topic nhé, cảm ơn bạn đã góp ý !

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
19 giờ trước, Duong Nhat Duy đã nói:

Mình đã thêm vào bản 1.01, bạn down ở đầu topic nhé, cảm ơn bạn đã góp ý !

đây bạn ơi , mình sài giả lập win xp để chạy phần mềm chuyên dụng ,mà khi chạy diện tích dt1 toàn ra 0, cad 2005  

image.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
18 phút trước, OngNguyenVanHan đã nói:

mình nhớ cái p.m bạn đang xài chạy đc trên cad2007 mà nhỉ, mà giờ mk toàn thấy dùng ads với tdt

mình bên mỏ , ko có S mua key, dùng crack trên nền 2005. topo hsmo

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
3 giờ trước, minhkiboo đã nói:

đây bạn ơi , mình sài giả lập win xp để chạy phần mềm chuyên dụng ,mà khi chạy diện tích dt1 toàn ra 0, cad 2005  

image.png

Bạn mở file lisp, dùng lệnh Replace (Ctrl+H), đổi hết -HATCH thành HATCH xem có đc ko

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×