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ị

8 phút trước, Duong Nhat Duy đã nói:

Hê hê cảm ơn bạn nhé, để mình chỉnh sửa lại lisp cho ngon ngẻ :))

chưa chắc đã ngon hơn đâu bạn

Trong lập trình có 1 câu là cái gì đang hoạt động tốt thì đừng sửa nó. :)

với file cad nhẹ nhàng lệnh của mình chạy nhanh hơn.

nhưng với file nặng thì 1 lệnh command nặng sẽ nhanh hơn 10 lệnh command 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ới phương án Boundary có vẻ chưa được ổn.

1. Khi có 3 miền kín lần lượt lồng vào nhau (ví dụ dễ hình dung nhất là 3 đường tròn đồng tâm có bán kính khác nhau, muốn pick tính dải ngoài cùng thì nó trừ luôn cả diện tích cả 2 đường tròn phía trong.

2. Hàm BoundaryAreaPoint xử lý chưa triệt để nếu vùng pick tính  diện tích có MTEXT nằm trong đó.

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

Ủa vậy hả, qua mình cũng chưa test thử, vậy chắc vẫn dùng command thôi, né được cái thuật toán tính diện tích lồng nhau.

Mà nữa là khi HPQUICKPREVIEW để OFF thì lệnh Hatch khá nhẹ, vùng nào ko hatch đc nó ko ra gì luôn chứ ko quay quay mất time.

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, NTHAHT đã nói:

Với phương án Boundary có vẻ chưa được ổn.

1. Khi có 3 miền kín lần lượt lồng vào nhau (ví dụ dễ hình dung nhất là 3 đường tròn đồng tâm có bán kính khác nhau, muốn pick tính dải ngoài cùng thì nó trừ luôn cả diện tích cả 2 đường tròn phía trong.

 2. Hàm BoundaryAreaPoint xử lý chưa triệt để nếu vùng pick tính  diện tích có MTEXT nằm trong đó.

Vấn đề 1 không thể sảy ra.

Vì mỗi lần pick đã kết thúc lệnh bo và tính toán diện tích rồi.

lần pick thứ 2 lại kết thúc lệnh bo và tính lần tiếp theo

sau đó mới công tổng các lần vừa rồi. không tính gộp

bạn có thể test trực tiếp và đưa ra con số cho mình.

 

Vấn đề thứ 2 bạn sảy ra cả khi dùng hatch và mình cũng có cách sửa cho nó.

 

(setq ss  (ssget "all" '((0 . "LINE,*POLYLINE,CIRCLE,ARC,SPLINE"))))

(VL-cmdf "_.boundary" "A" "B" "N" ss ......

 

các bạn đọc kỹ code của mình rồi hãy phán. please

 

  • Vote giảm 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

1. Mình đã test trên lisp của bạn (chứ không phải chỉ đọc mà phán). Kết quả được 60 khi pick vào cái vùng gạch chéo đó, lẽ ra phải là: 10*10-6*6=64.

2. Mình đã nói là cái hàm BoundaryAreaPoint chưa triệt để ...

Hình chú giải cho mục 1 ở trên.

image.thumb.png.41cbe3a0fe08193114a294eacc0f20b0.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
44 phút trước, tannguyen291 đã nói:

Vấn đề 1 không thể sảy ra.

Vì mỗi lần pick đã kết thúc lệnh bo và tính toán diện tích rồi.

lần pick thứ 2 lại kết thúc lệnh bo và tính lần tiếp theo

sau đó mới công tổng các lần vừa rồi. không tính gộp

bạn có thể test trực tiếp và đưa ra con số cho mình.

 

Vấn đề thứ 2 bạn sảy ra cả khi dùng hatch và mình cũng có cách sửa cho nó.

 

(setq ss  (ssget "all" '((0 . "LINE,*POLYLINE,CIRCLE,ARC,SPLINE"))))

(VL-cmdf "_.boundary" "A" "B" "N" ss ......

 

các bạn đọc kỹ code của mình rồi hãy phán. please

 

Cái này cũng chưa triệt để... Cái hình trong màu trắng là Block.

image.thumb.png.39894f3e60b76b2e43834073680bf6de.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

@NTHAHT Rất xin lỗi vì mình không nghĩ tới trường hợp này

image.png.c58ac660f61bc2f98dce418a9a754f39.png

chỉ cần bo ở vùng xanh nó tạo ra cả đường bên trong.

nhưng không sao mình đã fix lại hàm của mình

(defun BoundaryAreaPoint (pt / ent lst area)
  (setq ent (entlast))
  (vl-cmdf "_.boundary" "A" "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))
)

tks bạn nhé. mình chưa tính hết các khả năng

còn việc thêm bộ lọc là tuỳ ở chủ thớt thích thêm cái nào thì thêm 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

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

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
27 phút trước, tannguyen291 đã nói:

Hatch của mình không hề được bỏ qua bạn ơi.

Vấn đề này người dùng phải quản lý đối tượng của mình thôi. :D

 

Bỏ qua là khi tính diện tích, còn view thì nó vẫn trừ đ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

Nay mình mới xem lại code của bạn @tannguyen291 , hóa ra bạn vẫn dùng command Boundary. Cá nhân mình thì thấy Hatch (sau khi đã tắt HPQUICKPREVIEW) với Boundary nó như nhau, đối với những vùng có nhiều đối tượng phức tạp thì cả 2 lệnh đều chạy lâu, đối với những vùng lỗi thì cả 2 lệnh đều ko chạy ra gì. Tính ra Hatch vẫn hay hơn vì ko tạo ra nhiều đối tượng như Boundary, và diện tích của Hatch nó tự xử lý đc 1 số vấn đề như bạn @NTHAHT đã nói, ví dụ trong Hatch có Mtext thì diện tích Hatch coi như ko có Mtext (mặc dù nó hiển thị phần Mtext ko đc hatch). Còn dùng Boundary thì cần thêm cả tá thuật toán để xử lý kết quả.

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
33 phút trước, Nguyễn Hà Huy đã nói:

cho mk hỏi giờ muốn lisp ra số mà nó tự chia cho 1000 hoặc 1000000 thì sửa như nào vậy, vd: lisp ra 2344750003.626 muốn nó về 2344.75 thôi ấy

Tạm thời bạn chịu khó sửa tay nhé :v, mấy hôm nữa có time mình sẽ thêm cái tỉ lệ này vào sau

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/1/2023 tại 10:25, Duong Nhat Duy đã nói:

Tạm thời bạn chịu khó sửa tay nhé :v, mấy hôm nữa có time mình sẽ thêm cái tỉ lệ này vào sau

Mình cùng câu hỏi và cách sửa dấu chấm sang dấu phẩy để đưa vào exel? Tks b

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, tranducanh18 đã nói:

Mình cùng câu hỏi và cách sửa dấu chấm sang dấu phẩy để đưa vào exel? Tks b

Bạn có thể tham khảo bài viết của mình có tuỳ chọn unit và định dạng số liệu đầ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 6/1/2023 tại 14:31, tranducanh18 đã nói:

Mình cùng câu hỏi và cách sửa dấu chấm sang dấu phẩy để đưa vào exel? Tks b

 

Vào lúc 26/1/2023 tại 11:45, Nguyễn Hà Huy đã nói:

rất mong bác dành thời gian cải tiến lisp, lisp của bác dùng rất tiện là nhanh

 

Vào lúc 23/12/2022 tại 01:41, doanquanghuy đã nói:

Thank bạn!
Mình gặp phải lỗi DT1 too many agruments thì làm sao sửa được ạ?
Mình dùng AutoCAD Architecture 2020.
 

 

Vào lúc 22/12/2022 tại 16:52, tanbqtb03 đã nói:

Cám ơn a

 

 

Mình đã cập nhật lại lisp mới trên đầu topic r nhé, tất cả đều có thể hiệu chỉnh được trong lệnh TL

  • 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 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: Tinh dien tich.lsp
Chúc các bạn thành công :)))

bác cho em hỏi em gõ TL thấy bão lỗi như này là sao ạ, em thử trên cad 21 và cad18 cũng lỗi tương tự

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 giờ trước, Duong Nhat Duy đã nói:

Mình đã fix lại r nhé !

 

Vào lúc 8/2/2023 tại 16:53, Duong Nhat Duy đã nói:

 

 

 

 

Mình đã cập nhật lại lisp mới trên đầu topic r nhé, tất cả đều có thể hiệu chỉnh được trong lệnh TL

Cảm ơn bạn nhiề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 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 :)))

Anh có thể cải thiện cái lisp này khi chọn Block mình có thể thay đổi được tên block rải ra theo mình chọn tên (ví dụ là chọn CX thay vì LK) và nó sẽ rải theo hatch số thứ tự block tăng dần như CX-01 CX-02 theo hướng mình chọn 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
2 giờ trước, tranducanh18 đã nói:

Anh có thể cải thiện cái lisp này khi chọn Block mình có thể thay đổi được tên block rải ra theo mình chọn tên (ví dụ là chọn CX thay vì LK) và nó sẽ rải theo hatch số thứ tự block tăng dần như CX-01 CX-02 theo hướng mình chọn ko ạ?

 

Bạn dùng thêm lisp đánh số tt ở topic này nhé, 2 lisp mục đích nó khác nhau nên mình cũng ko muốn gộp nó vào

 

  • 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 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 xóa thông báo mỗi lần mở cad lên không bác.

image.png

  • Vote giảm 2

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, tuan9002 đã nói:

Có cách nào xóa thông báo mỗi lần mở cad lên không bác.

image.png

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

  • 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

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

  • 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

×