AutoCAD – Bản vẽ

Lisp tính diện tích hatch: cộng đúng diện tích lát nền, không đếm đôi

Lisp tính diện tích hatch của Viện cộng tổng mảng tô để bóc khối lượng lát nền, kèm cái bẫy làm con số tăng gấp đôi mà không ai báo. Tải miễn phí.

  • TS. Đỗ Quốc Hoàng
  • 9 phút đọc
Dòng lệnh sau khi quét cả bản vẽ: máy tính 7 hình chứ không phải 3 mảng tô, nên tổng lên gấp đôi Ảnh: AutoCAD 2027

Bóc khối lượng lát nền, bạn tô hatch từng phòng rồi cần cộng tổng. Một lisp tính diện tích hatch làm việc đó trong một lệnh, thay vì bấm từng mảng rồi cộng tay trên máy tính bỏ túi.

Nhưng có một cái bẫy làm con số ấy tăng gần gấp đôi mà không dòng nhắc nào báo. Bài này chỉ ra cái bẫy đó trước, rồi mới đến tệp lisp. Muốn học trọn quy trình bóc khối lượng từ bản vẽ, Viện có khoá AutoCAD cho ngành xây dựng.

Diện tích hatch là con số đáng tin, và đây là lý do

Mảng tô không phải một hình vẽ thêm cho đẹp. Nó là một đối tượng có thuộc tính Area, và con số ấy là diện tích thật của phần được tô.

Ba hình dựng với kích thước biết trước, rồi đọc lại thuộc tính Area:

Hình được tôDiện tích đúngMáy trả về
Chữ nhật 600 × 400240.000240.000
Chữ nhật 500 × 300150.000150.000
Tròn bán kính 200125.663,706125.663,706
Chữ nhật 600 × 400 có lỗ vuông 100 × 100230.000230.000

Dòng cuối là dòng quan trọng nhất. Mảng tô có lỗ thủng ở giữa trả về 230.000 chứ không phải 240.000 — nó đã trừ lỗ. Tài liệu Autodesk gọi các vùng kín nằm trong đường bao là island và ghi: "Enclosed areas or text objects inside hatch boundaries are treated as islands."

Đó là lý do mảng tô đáng tin hơn hẳn việc đo đường bao ngoài rồi trừ tay: cột, hộp kỹ thuật, ô thang máy nằm giữa sàn đều tự động bị trừ, không ai phải nhớ.

Nhưng có một trường hợp lỗ không bị trừ, và nó nằm ở lựa chọn kiểu dò island lúc tô chứ không phải lúc đọc. Cùng hình chữ nhật có lỗ ấy, tô ba lần bằng ba kiểu:

Kiểu dò islandDiện tích trả về
Normal230.000 — trừ lỗ
Outer230.000 — trừ lỗ
Ignore240.000 — không trừ lỗ

Kiểu Ignore tô trùm qua lỗ nên cái lỗ được tính là sàn. Hai trong ba kiểu cho con số đúng theo cách người bóc khối lượng mong đợi, một kiểu thì không. Thấy diện tích sàn tròn trịa đáng ngờ thì chọn mảng tô, gọi HATCHEDIT và xem nó đang mang kiểu nào.

Cái bẫy làm tổng diện tích hatch tăng gấp đôi

Đây là phần nên đọc kỹ, vì nó làm sai khối lượng chứ không chỉ sai một con số hiển thị.

Khi bạn tô hatch, đường bao vẫn còn nằm đó. Nếu đường bao ấy là một đa tuyến khép kín, nó cũng là một hình có diện tích. Một lệnh cộng quét cả bản vẽ sẽ cộng cả hai: mảng tô và chính đường bao của nó.

Cùng một bản vẽ chỉ có ba mảng tô, hai cách chọn cho hai kết quả:

Cách làmMáy tính đượcTổng
Quét cả bản vẽ7 hình1,260 m²
Lọc riêng mảng tô3 hình0,620 m²
Máy ghi rõ "Đã tính: 7" trong khi bản vẽ chỉ có ba mảng tô — bốn hình còn lại là đường bao Ảnh: AutoCAD 2027

Bảy hình là ba mảng tô cộng bốn đường bao khép kín, kể cả đường bao của cái lỗ. Con số 1,260 m² không sai về số học, nó chỉ trả lời một câu hỏi khác câu bạn định hỏi.

Rút ra một quy tắc đơn giản: cộng diện tích lát nền thì phải lọc riêng mảng tô, đừng bao giờ quét cả bản vẽ.

Lisp tính tổng diện tích hatch trong cad: tệp DT của Viện

Tải tệp DT-IIC.LSPnạp bằng APPLOAD, hoặc lấy cả bộ trong bài thư viện LISP CAD.

Tệp này có sáu lệnh, chia làm ba cặp:

LệnhViệc
TDTChọn đối tượng rồi cộng diện tích các hình kín, kể cả mảng tô
TDTXCộng mọi hình kín trong cả bản vẽ, không phải chọn
TDTPDiện tích phủ thực: phần chồng nhau chỉ đếm một lần
TDTPXPhủ thực cho cả bản vẽ
GDTChọn nhiều hình rồi ghi con số vào giữa từng hình
GDTXGhi con số vào mọi hình kín trong bản vẽ

Với việc bóc lát nền, dùng TDT rồi chọn riêng mảng tô. Cách chọn nhanh nhất: gõ QSELECT, đặt Object typeHatch, đồng ý — cả bản vẽ chỉ còn mảng tô được chọn, rồi gọi TDT và Enter. Đó là cách dùng một lisp tính diện tích hatch trong cad cho đúng: lọc trước, cộng sau.

Lệnh in ra bốn dòng: đơn vị bản vẽ đang hiểu là gì, đã tính bao nhiêu hình, đã bỏ qua bao nhiêu hình không khép kín, và tổng diện tích. Dòng "đã tính" chính là chỗ để bạn phát hiện cái bẫy ở trên: nếu nó ra số lớn hơn số mảng tô bạn biết mình có, bạn đang cộng cả đường bao.

Tính diện tích hatch trong cad không cần lisp

Nếu chỉ cần con số một lần, tính diện tích hatch trong cad không cần tệp ngoài nào.

Chọn một mảng tô rồi mở bảng Properties bằng Ctrl+1. Ô Area hiện diện tích của nó. Chọn nhiều mảng cùng lúc thì ô Area hiện *VARIES*, nhưng ngay dưới có dòng Cumulative Area đã cộng sẵn tổng.

Ba thao tác, không chạy mã lạ trên máy. Cách này đủ dùng khi bóc một vài phòng.

Lisp hơn ở ba điểm: cộng được cả hình không phải hatch trong cùng một lần, có TDTP để trừ phần chồng nhau, và có GDT ghi thẳng con số lên bản vẽ để người đọc hồ sơ thấy ngay. Các cách đo diện tích khác — AREA, MEASUREGEOM, vùng REGION — nằm ở bài diện tích trong CAD.

Lisp tính tổng diện tích s2a và các tệp sưu tầm: soi ba điểm

Nhiều người tìm theo đúng tên tệp mình từng được cho, chẳng hạn lisp tính tổng diện tích s2a. Tên tệp thì mỗi nơi một khác, nhưng ba điểm cần soi thì giống nhau ở mọi tệp sưu tầm.

Một — nó có lọc riêng mảng tô không. Tệp nào gọi ssget không kèm bộ lọc là tệp cộng tất cả những gì bạn quét trúng, và bạn lại rơi vào cái bẫy đếm đôi.

Hai — nó xử lý phần chồng nhau thế nào. Hai mảng tô đè lên nhau thì phần đè được cộng hai lần, trừ khi tệp có bước gộp thành vùng REGION. Mảng tô không đổi thành REGION được, nên tệp nào hứa "diện tích phủ thực" cho hatch thì nên kiểm lại bằng một ví dụ nhỏ.

Ba — nó quy đổi đơn vị theo gì. Tệp nào chia cứng cho 1.000.000 là mặc định bản vẽ vẽ bằng milimét. Vẽ bằng mét thì con số sai một triệu lần.

Một tệp .lsp là văn bản thuần, mở bằng Notepad là đọc được cả ba điểm trên. Khi tải lisp tính diện tích trong cad từ một nguồn không rõ, mười phút đọc rẻ hơn một bảng khối lượng sai.

Một mảng tô có thể là nhiều vùng

Có một chuyện làm việc đếm mảng tô khó hơn tưởng. Tài liệu Autodesk về làm việc với mảng tô ghi: "By default, when you apply a hatch to multiple areas within one command, the result is a single hatch object."

Nghĩa là bạn bấm một lần lệnh HATCH rồi chỉ vào tám phòng, kết quả là một đối tượng chứ không phải tám. Thuộc tính Area của nó là tổng của cả tám.

Hệ quả thực tế: đếm số đối tượng hatch không cho biết số phòng. Muốn tách riêng từng phòng để lập bảng thì dùng HATCHEDIT tách ra, hoặc tô lại từng phòng một lệnh. Còn nếu chỉ cần tổng để bóc khối lượng thì gộp chung lại càng gọn.

Đơn vị bản vẽ quyết định con số ra m² hay mm²

Bản vẽ xây dựng ở Việt Nam gần như luôn vẽ bằng milimét, nên một sàn 30 m² có diện tích 30.000.000 đơn vị vuông. Con số ấy đọc không nổi.

Lệnh của Viện đọc biến INSUNITS để biết bản vẽ khai đơn vị gì rồi quy đổi. Bản vẽ không khai gì thì nó nói thẳng ra dòng nhắc là đang tạm coi là milimét, để bạn biết mà kiểm. Đây cũng là chỗ lisp đo diện tích trong cad hay sai lặng lẽ: tệp nào không nói gì về đơn vị thì bạn không biết nó vừa chia cho bao nhiêu.

Muốn khai đơn vị cho bản vẽ, gõ UNITS rồi đặt Insertion scaleMillimeters.

Ba điều hay nghe mà không đúng

Hay ngheThực tế đo được
Diện tích hatch tính cả lỗ ở giữaLỗ bị trừ: hình 600×400 có lỗ 100×100 trả về 230.000
Cứ quét cả bản vẽ cho nhanhQuét cả bản vẽ cộng luôn đường bao, ví dụ trên lên gấp đôi
Mỗi phòng tô hatch là một đối tượngMột lệnh tô nhiều vùng chỉ tạo một đối tượng

Câu hỏi thường gặp

Lisp tính diện tích hatch này dùng cho bản AutoCAD nào?

Viết bằng AutoLISP chuẩn và ActiveX, chạy trên mọi bản có Visual LISP. Bộ này kiểm trên AutoCAD 2027.

Tôi chọn cả bản vẽ mà tổng ra gấp đôi thực tế, vì sao?

Vì đường bao khép kín của mảng tô cũng được cộng. Gõ QSELECT, đặt Object type là Hatch để chỉ lấy mảng tô rồi cộng lại.

Hai mảng tô đè lên nhau thì sao?

Phần đè được cộng hai lần. Với hình thường thì TDTP trừ được phần chồng, nhưng mảng tô không đổi thành REGION được nên lệnh sẽ báo rõ thay vì trả con số sai.

Xoá đường bao đi rồi thì mảng tô còn diện tích không?

Còn. Diện tích nằm trong chính đối tượng hatch. Xoá đường bao chỉ làm mất tính liên kết, không làm mất con số.

Làm sao ghi diện tích lên bản vẽ cho người khác đọc?

Dùng GDT, chọn các hình, máy ghi con số vào giữa từng hình. Muốn làm cả bản vẽ thì dùng GDTX.

Con số ra đơn vị gì?

Lệnh quy về mét vuông và in kèm đơn vị. Bản vẽ chưa khai INSUNITS thì lệnh báo rõ là đang tạm coi bản vẽ vẽ bằng milimét.

Về tác giả

TS. Đỗ Quốc Hoàng — Phó Viện trưởng Viện Tin học Xây dựng, Trường Đại học Xây dựng Hà Nội, chuyên gia phát triển phần mềm cho ngành xây dựng