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ị

Mình muốn hỏi thêm chút là: Các kết quả đo chiều dài (CD1) có Field thì có thể thực hiện thêm lệnh nào để cộng các kết quả lại đc không 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
6 giờ trước, nhjngj đã nói:

Mình muốn hỏi thêm chút là: Các kết quả đo chiều dài (CD1) có Field thì có thể thực hiện thêm lệnh nào để cộng các kết quả lại đc không bác?

Đề bài này là + Text rồi bạn nhé, bạn tham khảo các lisp khác trên forum chứ hiện tại mình chưa có lisp liên quan đến vấn đề 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 11/6/2025 tại 16:32, nhjngj đã nói:

Mình muốn hỏi thêm chút là: Các kết quả đo chiều dài (CD1) có Field thì có thể thực hiện thêm lệnh nào để cộng các kết quả lại đc không bác?

Bạn dùng thử cái này xem đúng ý chưa nhé.

SumTextField (Fsum).LSP

ps: Nguồn trên mạng

  • 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

Cảm ơn bạn, lips rất hữu ích. Trong quá trình sử dụng nhận thấy lips có 1 số thiếu sót như:

- Có tồn tại hatch nhưng lips không tính toán được diện tích (ngay cả chính phần mềm cũng không tính được). Phải dùng cách bao hatch lại rồi tính diện tích polyline. Cũng hơi bất tiện

- Trong trường hợp đường thẳng muốn tính là 1 đường Alignment dạng song song (và đường này không liên tục, bị ngắt quãng) thì không tính được

Mong chờ bản update của bạn. Cảm ơn bạn rất nhiều. Dưới có đính kèm tệp dwg. bên trong có ví dụ

 

Rajz2.dwg

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

Mình muốn hỏi thêm một số vấn đề như: Trong trường hợp ở ảnh đính kèm có 2 phần là Mleader (phần chữ) và phần text được tạo ra khi dùng lips của bạn (phần số). Bạn có ý tưởng nào để cho phần số này đi theo phần chữ không. Ví dụ khi di chuyển ,thay đổi góc hoặc thay đổi dòng chữ của phần Mleader thì phần số cũng thay đổi theo nhưng vẫn nằm đúng vị trí phía dưới chữ "vỉa hè". Mình có suy nghĩ đến block động nhưng không khả quan lắm vì Mleader dùng tiện hơn nhiều. Cảm ơn bạn nhiều

Screenshot 2025-06-15 081643.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 13/6/2025 tại 20:06, Tran Minh Hoang đã nói:

Cảm ơn bạn, lips rất hữu ích. Trong quá trình sử dụng nhận thấy lips có 1 số thiếu sót như:

- Có tồn tại hatch nhưng lips không tính toán được diện tích (ngay cả chính phần mềm cũng không tính được). Phải dùng cách bao hatch lại rồi tính diện tích polyline. Cũng hơi bất tiện

- Trong trường hợp đường thẳng muốn tính là 1 đường Alignment dạng song song (và đường này không liên tục, bị ngắt quãng) thì không tính được

Mong chờ bản update của bạn. Cảm ơn bạn rất nhiều. Dưới có đính kèm tệp dwg. bên trong có ví dụ: Rajz2.dwg

- Ý 1: Câu hỏi của bạn chính là câu trả lời bạn nhé, Hatch lỗi đến bản thân AutoCAD cũng không tính được diện tích thì sao lisp có thể tính nổi ?

- Ý 2: Lisp mình chỉ cho phép tính diện tích các đối tượng cơ bản của cad thôi bạn nhé. 

 

19 giờ trước, Tran Minh Hoang đã nói:

Mình muốn hỏi thêm một số vấn đề như: Trong trường hợp ở ảnh đính kèm có 2 phần là Mleader (phần chữ) và phần text được tạo ra khi dùng lips của bạn (phần số). Bạn có ý tưởng nào để cho phần số này đi theo phần chữ không. Ví dụ khi di chuyển ,thay đổi góc hoặc thay đổi dòng chữ của phần Mleader thì phần số cũng thay đổi theo nhưng vẫn nằm đúng vị trí phía dưới chữ "vỉa hè". Mình có suy nghĩ đến block động nhưng không khả quan lắm vì Mleader dùng tiện hơn nhiều. Cảm ơn bạn nhiều

- Ý 3: Mleader cũng có thể chia cụm text thành nhiều dòng, tuy nhiên lisp của mình sẽ ghi đè lên toàn bộ nội dung bao gồm tất cả các dòng (khả năng cũng không thể cải tiến để ghi đè vào 1 dòng được)=> Đối với trường hợp này chỉ có thể sử dụng block động. Đúng như bạn nói, Mleader nó chỉ tiện hơn thôi, còn khi cần chỉnh sửa hàng loạt, thống kê, ... thì chỉ có block mới có thể làm đượ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
Vào lúc 11/6/2025 tại 22:40, Duong Nhat Duy đã nói:

Đề bài này là + Text rồi bạn nhé, bạn tham khảo các lisp khác trên forum chứ hiện tại mình chưa có lisp liên quan đến vấn đề này.

Cảm ơn bác, lisp của bác conghoa đã giải quyết đc nhu cầu của em rồi.

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 chiều dài, 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ông dụng
- Tính chiều dài, diện tích nhiều đối tượng (Line, Pline, Spline, Arc, Circle, Hatch, Region, ...), có thể tính riêng lẻ hoặc cộng gộp.
- Kết quả có thể xuất ra text mới, block att, hoặc cập nhật vào text cũ, block att cũ.

- Kết quả có thể ghi dưới dạng Field, tự động cập nhật khi đối tượng thay đổi.

- Có thể xuất bảng thống kê (định dạng AutoCAD Table).


Tên lệnh
   DTL - Thiết lập

   CD1 - Tính chiều dài các đối tượng đơn lẻ

   CD2 - Tính tổng chiều dài các đối tượng

   CD3 - Tính chiều dài 1 đoạn nằm trên đối tượng

   DT1 - Tính diện tích chọn đối tượng - đơn lẻ

   DT2 - Tính diện tích chọn đối tượng - cộng gộp

   DT3 - Tính diện tích pick điểm - đơn lẻ

   DT4 - Tính diện tích pick điểm - cộng gộp

   DD1 - Tính chiều dài và diện tích đối tượng - đơn lẻ

   DD2 - Tính chiều dài và diện tích đối tượng - cộng gộp

   TH1 - Thống kê chiều dài, diện tích từng đối tượng

   TH2 - Thống kê tổng chiều dài, diện tích theo Layer

 

DTL - Thiết lập

(Không bắt buộc)

DTL.png.1aa37fe575ea1b49cd983f04a4e831ba.png

- Giải thích một số nội dung:

+ Đơn vị bản vẽ - Đơn vị ghi kết quả: Đây là đơn vị quy ước khi vẽ, không phải đơn vị trong Units.

Giả sử bản vẽ vẽ bằng mm, các đoạn 1000, 2000 muốn tính ra 1.0, 2.0 thì đơn vị bản vẽ nhập mm, đơn vị kết quả nhập m.

+ Hệ số scale đối tượng: Mặc định là 1. Sửa khi bản vẽ đã bị scale ví dụ 2, 5 lần => Kết quả sẽ trả về giá trị trước khi scale.

+ Bội số làm tròn: Mặc định là 0 (không làm tròn). Sửa khi muốn làm tròn kết quả đến bội số của X, ví dụ X=0.25 thì kết quả sẽ dạng 10.25, 10.5, 10.75, 11.

+ Tạo Hatch (DT3, DT4): Hiển thị Hatch các vùng tính diện tích khi dùng các lệnh DT3, DT4. Lưu ý: Khi tạo Field thì bắt buộc phải tạo Hatch vì diện tích vùng kín link theo Hatch.

 

CD1 - Tính chiều dài các đối tượng đơn lẻ

CD1.gif.fbeeea099df1aca63a118f8a355c575b.gif

 

CD2 - Tính tổng chiều dài các đối tượng

CD2.gif.11a878073a651fadabe8947b3f91957c.gif

 

CD3 - Tính chiều dài 1 đoạn nằm trên đối tượng

CD3.gif.faced0f7801489da1b3eb72970b767fb.gif

 

DT1 - Tính diện tích chọn đối tượng - đơn lẻ

Text kết quả tạo mới tại trọng tâm các đối tượng

DT1.gif.2f244b4e4a0f53eb05e64788e1f672c7.gif

 

DT2 - Tính diện tích chọn đối tượng - cộng gộp

Text kết quả có thể tạo mới bằng cách bấm vào khoảng trắng hoặc cập nhật vào Text, Att có sẵn trên bản vẽ)

DT2.gif.499e00ef20cd3a774e485bf24f6a09c8.gif

 

DT3 - Tính diện tích pick điểm - đơn lẻ

DT3.gif.7323ef90ec7bcda5564876b9c2c7a9ad.gif

 

DT4 - Tính diện tích pick điểm - cộng gộp

Text kết quả có thể tạo mới bằng cách bấm vào khoảng trắng hoặc cập nhật vào Text, Att có sẵn trên bản vẽ)

DT4.gif.590c69ed1745f6981ee11faa2103feb3.gif

 

DD1 - Tính chiều dài và diện tích đối tượng - đơn lẻ

Gộp của 2 lệnh CD1 và DT1

 

DD2 - Tính chiều dài và diện tích đối tượng - cộng gộp

Gộp của 2 lệnh CD2 và DT2

 

TH1 - Thống kê chiều dài, diện tích từng đối tượng

Giá trị trong bảng có thể khai báo là Field trong lệnh DTL

TH1.png.376d6ce43ecb43b200d18da2b6764311.png

 

TH2 - Thống kê tổng chiều dài, diện tích theo Layer

Giá trị trong bảng có thể khai báo là Field trong lệnh DTL

TH2.png.d5bbb87b115d72dfcffc276b5419a72c.png

 

Một số tính năng khác

- Kết quả xuất ra có thể là Block do người dùng định nghĩa (ví dụ Block tem đất), khai báo trong lệnh DTL

DT-Block.gif.9f2a1964285fa1e98f99b8b3979e2303.gif

 

- Kết quả xuất ra có thể là Field (giá trị tự động cập nhật khi đối tượng thay đổi), khai báo trong lệnh DTL

DT-Field.gif.fd3d6a1368bdff9a7fe23ca89e720b7f.gif

 

- Để tra Field đang liên kết với những đối tượng nào, các bạn dùng lisp của Leemac trong link sau:

https://www.lee-mac.com/fieldobjects.html (Lệnh "fieldobjects", có thể tự đối lại tên)

fieldobjects.gif.cf13022fc5c11dc26c0db9c1fdea7fcd.gif

 

- Có thể thay đổi cài đặt mặc định mỗi khi dùng lisp bằng cách sửa trực tiếp file lisp (bằng Notepad hoặc các phần mềm tương tự)

1918954059_Suathongsomacdinh.thumb.png.5e12a5ba147faa1aea322621b7f2ff06.png


Cập nhật

- v1.00 (01/11/2023): Phiên bản đầu tiên

- v1.01 (01/02/2024): Người dùng có thể sửa file lisp theo cài đặt mặc định mong muốn + Sửa lỗi lệnh DT2 trên CAD2007

- v1.02 (13/06/2024): Thêm tính năng tạo Field (chiều dài, diện tích tự cập nhật khi đối tượng thay đổi)

- v1.03 (07/01/2025):

+ Thêm lệnh: DD1, DD2, TH1, TH2

+ Sửa tên lệnh TL thành DTL

+ Sửa tên lệnh: DT1 và DT2 hoán đổi cho DT3 và DT4 (để tương ứng với các lệnh chọn đối tượng CD1, CD2, DD1, DD2)

+ Lệnh DTL: Tiền tố, hậu tố, Att ghi chiều dài, diện tích là riêng biệt

- v1.03a (09/04/2025): Thêm tính năng ghi kết quả vào bảng (ghi đè)

- v1.03b (17/04/2025): Thêm tính năng ghi kết quả vào cuối text hiện có

 

Link download

https://drive.google.com/drive/folders/1i9s1v8KgnD4weWO6ZpPOB1IOqqgxbEPd


Chúc các bạn thành công :)))

LISP rất hay. Cám ơn bạn đã chi sẽ cho ae cùng ngành nghề. 

- Lênh th1 trong lisp bạn có thể chỉnh cho mình chỉ suất bảng table đượ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
5 giờ trước, 0908494509 đã nói:

LISP rất hay. Cám ơn bạn đã chi sẽ cho ae cùng ngành nghề. 

- Lênh th1 trong lisp bạn có thể chỉnh cho mình chỉ suất bảng table được không. 

Chí suất bảng là sao bạn. Hiện tại TH1 nó làm cái gì, bạn muốn giữ cái gì, bỏ cái gì, thêm cái gì ?

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

1877014418_LENHTH1.png.d21491f37495ae73e1f3e3cafe803c6c.png

Với LISP này mình chủ yếu dùng là lệnh TH1 thì thấy đang hiện "Handle" trên các đối tượng mình chọn ( bạn có thể ko cần ghi lên đối tượng như trên)

Còn bảng table thì kích thước nhỏ (cái này mình có thể tăng kích thước với tỷ lệ bản vẽ)

Thanks bạn đã phản hồi

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
1 giờ} trướ}c, 0908494509 đã nói:

Với LISP này mình chủ yếu dùng là lệnh TH1 thì thấy đang hiện "Handle" trên các đối tượng mình chọn ( bạn có thể ko cần ghi lên đối tượng như trên)

Còn bảng table thì kích thước nhỏ (cái này mình có thể tăng kích thước với tỷ lệ bản vẽ)

Thanks bạn đã phản hồi

Về phần Handle bạn đè đoạn code này vào đoạn code cũ

(defun C:th1 ( / AREA EGLST ELST ENT1 HANDLE HANDLE-F LAYER LEN LST LST_TABLE LST_TK ORDER PT PT_BANG SS STR_AREA STR_LEN STT)
  (setvar "CMDECHO" 0)
  (setvar "DIMZIN" 0)
  (setq elst (vl-remove-if 'listp (mapcar 'cadr (if (ssget) (ssnamex (ssget "_P"))))))
  (setq elst (vl-remove-if-not '(lambda (e)
				  (or (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))))))
				      (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (vla-get-Area (vlax-ename->vla-object e))))))
				      (wcmatch (cdr (assoc 0 (entget e))) "HATCH,REGION")
				      )) elst))
  (if elst
    (progn
      (setq lst
	     (list
	       "U:tren->duoi"
	       "D:duoi->tren"
	       "L:trai->phai"
	       "R:phai->trai"
	       "H:ma-handle"
	       "C:thu-tu-chon"
	       ))
      (setq order (setq 3DUY-TDT-CD-ORDER (ND:get_key lst (if 3DUY-TDT-CD-ORDER 3DUY-TDT-CD-ORDER "H:ma-handle") "Th\\U+1EE9 t\\U+1EF1 s\\U+1EAFp x\\U+1EBFp")))
      (if (not (setq pt_bang (getpoint "\nCh\\U+1ECDn \\U+0111i\\U+1EC3m xu\\U+1EA5t b\\U+1EA3ng: "))) (setq pt_bang (car (cdr (grread t)))) t)
      )
    )
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setq ss (ssadd))
  (setq lst_tk nil)
  (foreach ent elst
    (setq eglst (entget ent))
    (setq handle (cdr (assoc 5 eglst)))
    (setq pt (ND:bb_centroid ent))
    (if (= 3DUY-TDT-LAYER-CUR 1)
      (setq layer (getvar "CLAYER"))
      (setq layer (cdr (assoc 8 eglst)))
      )
    (if (= 3DUY-TDT-FIELD 1)
      (progn
	(setq handle-f (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID (vlax-ename->vla-object ent))) ">%).Handle>%"))
	(if (= (setq len (ND:TDT_convert-field ent "Length" (ND:TDT_fieldfmt "Length"))) "")
	  (setq len (ND:TDT_convert 0 "Length"))
	  )
	(if (= (setq area (ND:TDT_convert-field ent "Area" (ND:TDT_fieldfmt "Area"))) "")
	  (setq area (ND:TDT_convert 0 "Area"))
	  )
	)
      (progn
	(setq handle-f handle)
	(setq len 0)
	(setq area 0)
	(vl-catch-all-error-p (vl-catch-all-apply '(lambda () (setq len (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent))))))
	(vl-catch-all-error-p (vl-catch-all-apply '(lambda () (setq area (vla-get-Area (vlax-ename->vla-object ent))))))
	(setq len (ND:TDT_convert len "Length"))
	(setq area (ND:TDT_convert area "Area"))
	)
      )
;;;    (if (= 3DUY-TDT-BLOCK 1)
;;;      (setq ent1
;;;	     (ND:vla_insert
;;;	       3DUY-TDT-BLOCK-NAME
;;;	       pt
;;;	       layer
;;;	       3DUY-TDT-SCALE
;;;	       0
;;;	       (list (cons 3DUY-TDT-TAG-NAME handle-f))
;;;	       nil
;;;	       )
;;;	    )
;;;      (setq ent1
;;;	     (ND:mk_text
;;;	       handle-f
;;;	       pt
;;;	       layer
;;;	       (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
;;;	       nil
;;;	       )
;;;	    )
;;;      )
;;;    (if (= 3DUY-TDT-FIELD 1) (setq ss (ssadd ent1 ss)))
    (setq lst_tk (append lst_tk (list (list pt handle handle-f len area))))
    )
;;;  (if (and (= 3DUY-TDT-FIELD 1) (> (sslength ss) 0)) (vl-cmdf "_.UPDATEFIELD" ss ""))
  (if lst_tk
    (progn
      (setq lst_tk
	     (cond
	       ((wcmatch order "U*") (vl-sort lst_tk '(lambda (a b) (> (cadr (car a)) (cadr (car b))))))
	       ((wcmatch order "D*") (vl-sort lst_tk '(lambda (a b) (< (cadr (car a)) (cadr (car b))))))
	       ((wcmatch order "L*") (vl-sort lst_tk '(lambda (a b) (< (car (car a)) (car (car b))))))
	       ((wcmatch order "R*") (vl-sort lst_tk '(lambda (a b) (> (car (car a)) (car (car b))))))
	       ((wcmatch order "H*") (vl-sort lst_tk '(lambda (a b) (< (cadr a) (cadr b)))))
	       (t lst_tk)
	       ))
      (if (= 3DUY-TDT-FIELD 1)
	(progn
	  (setq str_len (ND:TDT_sumfield elst "Length"))
	  (setq str_area (ND:TDT_sumfield elst "Area"))
	  )
	(progn
	  (setq str_len (ND:TDT_convert (ND:TDT_sumvalue elst "Length") "Length"))
	  (setq str_area (ND:TDT_convert (ND:TDT_sumvalue elst "Area") "Area"))
	  )
	)
      (setq lst_table (list (list "B\\U+1EA2NG TH\\U+1ED0NG KÊ CHI\\U+1EC0U DÀI, DI\\U+1EC6N TÍCH") (list "STT" "Chi\\U+1EC1u dài" "Di\\U+1EC7n tích")))
      (setq stt 1)
      (foreach lst lst_tk
	(setq lst_table (append lst_table (list (list (itoa stt) (nth 3 lst) (nth 4 lst)))))
	(setq stt (1+ stt))
	)
      (setq lst_table (append lst_table (list (list "T\\U+1ED4NG" str_len str_area))))
      (ND:list->table-AC1
	lst_table
	3DUY-TDT-HEIGHT
	(* 3DUY-TDT-HEIGHT 3.)
	nil
	pt_bang
	(getvar "CTABLESTYLE")
	(if (and (= 3DUY-TDT-AUTO 0) 3DUY-TDT-STYLE-NAME) 3DUY-TDT-STYLE-NAME (getvar "TEXTSTYLE"))
	(getvar "CLAYER")
	)
      (princ (strcat "\n\\U+0110ã th\\U+1ED1ng kê chi\\U+1EC1u dài, di\\U+1EC7n tích " (itoa (length lst_tk)) " \\U+0111\\U+1ED1i t\\U+01B0\\U+1EE3ng"))
      )
    (princ "\nKhông có \\U+0111\\U+1ED1i t\\U+01B0\\U+1EE3ng nào có thu\\U+1ED9c tính chi\\U+1EC1u dài và di\\U+1EC7n tích")
    )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  )

Còn về phần kích thước bảng thì nó scale theo cao chữ, cao chữ nhập trong cài đặt (lệnh DTL)

  • 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

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

×