AutoCAD – Bản vẽ

Tính diện tích trong CAD và chu vi: bốn cách, và chỗ hay sai

Bốn cách tính diện tích trong CAD và lúc nào dùng cách nào. Kèm chỗ hay sai nhất: đường chưa khép kín vẫn cho diện tích nhưng chu vi lại thiếu hẳn một cạnh.

  • TS. Đỗ Quốc Hoàng
  • 27 phút đọc
Bốn cách lấy diện tích ra khỏi bản vẽ, xếp theo số lượng hình phải đo chứ không theo thứ tự học Ảnh: Sơ đồ của Viện Tin học Xây dựng

Con số diện tích trong CAD đi thẳng vào bảng khối lượng, vào dự toán, vào hợp đồng. Sai một chỗ là sai cả chuỗi, mà phần mềm thì không bao giờ báo cho bạn biết là nó vừa sai.

Bài này gom bốn cách lấy diện tích, nói rõ cái nào hợp lúc nào, rồi dành phần lớn chỗ cho hai cái bẫy im lặng mà hướng dẫn tiếng Việt gần như không nhắc. Muốn học trọn khâu dựng hình và bóc khối lượng thì xem khóa AutoCAD Xây Dựng.

Cách gọi lệnh tính diện tích trong CAD

Bốn lối vào, theo tệp cấu hình của bản 2027.

Lối vàoNội dung
Lệnh đầy đủAREA
Lệnh tắtAA
RibbonHome → Utilities → nút xổ Measure → Area
Menu cổ điểnTools → Inquiry → Area
Thanh công cụMeasurement Tools → Area

Nút trên ribbon nằm trong nhóm Utilities, chung nút xổ với các công cụ đo khác, nên ít người để ý. Chữ tắt AA chỉ hai ký tự.

Từng bước trên dòng lệnh

Cột giữa chép nguyên văn từ bản 2027.

BướcMáy hỏiBạn làm
1Specify first corner point or [Object/Add area/Subtract area] <Object>:Enter để nhận Object, rồi bấm vào hình
2hoặc bấm lần lượt các gócBấm từng đỉnh, rồi Enter

Chỗ quan trọng nhất là giá trị ngầm định trong ngoặc nhọn: Object. Enter ngay là máy chờ bạn chỉ một hình khép kín và đọc luôn diện tích của nó, chính xác tuyệt đối, khỏi bấm từng đỉnh.

Hai lựa chọn còn lại là để cộng dồn và trừ bớt: gõ A rồi chỉ lần lượt nhiều hình là được tổng, gõ S rồi chỉ các lỗ là trừ đi. Đây là cách tính diện tích sàn trừ lỗ thang mà không cần máy tính tay.

Lệnh tính diện tích trong CAD: dòng nhắc thật và ba lựa chọn

Tên đầy đủ là lệnh AREA trong CAD. Trang AREA của Autodesk mô tả lệnh trong một câu: "Calculates the area and perimeter of objects or of defined areas". Chú ý chữ and perimeter: lệnh trả về hai con số, không phải một.

Gõ AA rồi Enter. Dòng nhắc trên AutoCAD 2027, chép nguyên văn từ màn hình.

Specify first corner point or [Object/Add area/Subtract area] <Object>:

Ba lựa chọn ấy là ba việc khác nhau:

  • Object là thứ bạn dùng chín trên mười lần. Bấm vào một hình kín, máy in ra cả hai con số.
  • Add area bật chế độ cộng dồn. Chọn hình thứ nhất, hình thứ hai, máy giữ một tổng chạy.
  • Subtract area trừ đi. Đây là cách bóc sàn có lỗ thang: cộng cả sàn rồi trừ lỗ.

Không có lựa chọn nào hỏi số lượng, và cũng không có lựa chọn nào cho chọn nhiều hình một lúc bằng cửa sổ. Lệnh nhận từng đối tượng một.

Area = 31415.9265, Circumference = 628.3185

Đó là kết quả thật khi đo một đường tròn bán kính 100 tại Viện. Kiểm tay: π nhân 100 bình phương đúng bằng 31415,9265.

Tính chu vi trong CAD: cùng một lệnh, nhưng nhãn đổi theo hình

Người mới hay tưởng máy hỏng khi không thấy chữ Perimeter. Thật ra máy chỉ gọi tên cho đúng hình học.

Bốn nhãn khác nhau mà AutoCAD dùng cho tổng chiều dài đường bao, tuỳ loại đối tượng và tuỳ số hình đang chọn Ảnh: Sơ đồ của Viện Tin học Xây dựng

Nhãn ấy có ích chứ không phải phiền phức: nhìn nhãn là biết hình đã khép kín hay chưa, khỏi phải mở bảng Properties xem dòng Closed. Đây cũng là lời giải cho cái bẫy ngay dưới đây.

Đường chưa khép kín: bẫy im lặng và tốn tiền nhất

Đây là chỗ đáng đọc kỹ nhất trong bài. Autodesk viết thẳng trong trang lệnh:

"If you select an open polyline, the area is calculated as if a line were drawn from the last point entered to the first. When the perimeter is calculated that line length is ignored."

Nghĩa là với một đường chưa khép: diện tích được tính như hình đã kín, còn chu vi thì bỏ qua đúng cạnh còn thiếu. Hai con số mô tả hai hình khác nhau, và không có một lời cảnh báo nào.

Cùng một đường gãy hình chữ L, đo hai lần: khi hở và khi đã khép kín. Diện tích y hệt, chu vi lệch đúng bằng cạnh còn thiếu Ảnh: Sơ đồ của Viện Tin học Xây dựng

Lấy một đường gãy hình chữ L rộng 400, cao 400, khoét một góc 200 nhân 200. Khi đường còn hở:

Area = 120000.0000, Length = 1200.0000

Khép đúng đường ấy lại rồi đo lại:

Area = 120000.0000, Perimeter = 1600.0000

Diện tích không đổi một chữ số. Chu vi lệch 400, đúng bằng cạnh còn thiếu. Và nhãn đổi từ Length sang Perimeter. Với một mặt bằng thật, hai đầu đường chỉ hở vài phần nghìn đơn vị thì mắt không thấy, bản in không thấy, nhưng bảng khối lượng thì lệch.

Đo diện tích trong CAD khi hình vẽ bằng nhiều nét rời

Mặt bằng thật hiếm khi có đường bao kín sẵn. Tường là các đoạn LINE rời, và AREA không cộng hộ.

Trái: lòng phòng giới hạn bởi các nét tường rời. Phải: đường bao kín mà BOUNDARY tự dựng ra, đã dời sang bên để nhìn thấy nó là một đối tượng riêng Ảnh: AutoCAD 2027

Có hai đường xử lý, và trang BOUNDARY là đường nhanh hơn hẳn:

  1. PEDIT với lựa chọn Multiple rồi Join biến một mớ đoạn rời thành một đa tuyến. Cách này sửa chính nét cũ, hợp khi cần giữ đường bao dùng tiếp.
  2. BOUNDARY, gõ tắt BO không đụng gì tới nét cũ. Nó nhìn các nét quanh điểm bạn bấm rồi dựng thêm một đa tuyến mới ôm lấy vùng ấy. Đo xong xoá đi cũng được.

Autodesk còn nhắc thẳng lối này trong chính trang AREA: "You can also use BOUNDARY to create a closed polyline or region and then use LIST or the Properties palette to find the area".

Mẹo làm hồ sơ: đặt các đường bao ấy lên một lớp riêng và tắt cột in của lớp đó. Bản vẽ giao đi không có gì lạ, mà bạn vẫn giữ được đường đo để kiểm lại về sau.

Diện tích hatch trong CAD: con số đáng tin nhất

Mảng tô không chỉ để nhìn. Chọn một mảng tô rồi mở bảng Properties bằng Ctrl và 1 là đọc được ô Area, và con số ấy đã trừ sẵn các đảo bên trong — trừ đúng phần cột, phần tường, phần hộp kỹ thuật.

Đó là lý do đây là con số lát nền đáng tin hơn cả việc đo đường bao rồi trừ tay. Cách tô và các lựa chọn của lệnh nằm ở bài lệnh hatch trong CAD.

Một điều đo được mà nhiều bài nói ngược: lệnh AREA vẫn nhận mảng tô. Chọn một mảng tô 150 nhân 200 bằng lựa chọn Object, máy trả về:

Area = 30000.0000, Perimeter = 700.0000

Tức mảng tô cho cả chu vi chứ không chỉ diện tích, dù bảng Properties của nó không có dòng chu vi nào.

Lisp tính diện tích: phần lớn trường hợp bạn không cần

Đây là lý do thật khiến nhiều người đi tìm tệp lisp. Chọn hết các mảng tô rồi mở bảng Properties, ô Area hiện chữ *VARIES* chứ không hiện số. Người dùng kết luận phần mềm không cộng được, rồi đi tải lisp về.

Chọn đúng ba mảng tô 60000, 40000 và 30000 đơn vị vuông: ô Area hiện VARIES, còn dòng Cumulative ngay dưới đã cộng sẵn ra 130000 Ảnh: AutoCAD 2027

Nhưng hãy nhìn dòng ngay bên dưới ô Area. Nó tên là Cumulative Area, và nó đã cộng sẵn tổng. Tô ba mảng có diện tích 60000, 40000 và 30000 đơn vị vuông rồi chọn cả ba: bảng ghi Hatch (3), ô Area hiện *VARIES*, và dòng Cumulative hiện đúng 130000.

Muốn chọn nhanh mọi mảng tô trong bản vẽ thì gọi QSELECT, đặt Object type là Hatch rồi đồng ý. Ba thao tác, không tệp ngoài nào, không rủi ro chạy mã lạ trên máy.

Lisp vẫn đáng dùng ở chỗ khác: khi bạn cần ghi kết quả thành bảng, gắn nhãn diện tích vào từng phòng, hay lặp cùng một việc trên hàng trăm tệp. Nhưng để lấy một con số tổng thì bạn không cần tải tệp lạ ở đâu về.

Lisp tính tổng diện tích: tệp của Viện, sáu lệnh, tải về dùng ngay

Hai việc dưới đây lệnh sẵn có vẫn làm được, nhưng làm chậm: cộng diện tích của vài chục hình, và ghi con số vào từng phòng. Viện viết sẵn một tệp cho đúng hai việc đó.

Tải tệp TDT-IIC.lspsáu lệnh. Mã để nguyên trong bài để bạn đọc trước khi chạy, vì chạy mã lạ trên máy mình là việc đáng cẩn thận.
LệnhViệc nó làm
TDTchọn theo bất kỳ kiểu nào rồi cộng diện tích các hình kín
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
TDTPXdiện tích phủ thực của 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 cả bản vẽ

Tệp nhận mọi kiểu chọn của AutoCAD: bấm từng cái, kéo cửa sổ, kéo cắt ngang, khoanh đa giác WP và CP, đường cắt F, hay gõ ALL. Nó cũng nhận mọi loại hình có diện tích chứ không riêng mảng tô, gồm đa tuyến kín, đường tròn, elip, spline kín và region.

Hình chưa khép kín thì tệp bỏ qua và báo rõ. Hệ số đơn vị đọc từ biến INSUNITS, nên bản vẽ theo mét không còn lệch một triệu lần.

Tên lệnh: chỗ nhiều tệp lisp phổ biến đang đè lên lệnh có sẵn

Tệp bí danh acad.pgp của AutoCAD 2027 có 387 tên tắt. Dò từng tên trước khi đặt: DT đã là bí danh của TEXT, AA là của AREA, AR là của ARRAY. Đặt lệnh trùng những tên ấy là lấy mất một lệnh sẵn có của người dùng. Sáu tên trên đều còn trống.

Phần chồng nhau: chỗ lisp cộng dồn nào cũng sai

Vẽ hai hình chữ nhật đè lên nhau, một hình 4000 nhân 3000 và một hình 5000 nhân 2500, phần đè là 1000 nhân 1500.

Lisp nào cộng thẳng từng hình cũng trả về 24,5 mét vuông, vì phần đè được cộng hai lần. Diện tích phủ thực chỉ là 23 mét vuông. Gõ TDTP thì máy in ra cả ba con số.

Tổng cộng dồn : 24.500 m2

DIỆN TÍCH PHỦ THỰC: 23.000 m2

Phần chồng nhau : 1.500 m2

Cách làm: nhân bản các hình đã chọn, đổi bản sao thành REGION, gộp lại bằng UNION rồi đo, xong xoá sạch. Bản vẽ gốc không đổi một nét. Mảng tô không đổi thành REGION được nên được báo tách riêng chứ không trộn vào ba con số trên.

Dùng cái nào là tuỳ việc. Bóc khối lượng sàn từng phòng thì cộng dồn mới đúng, vì các phòng vốn không đè nhau. Còn khi các đường bao có thể chồng lên nhau thì TDTP mới cho con số dùng được.

Nạp tệp và hai chỗ hay vướng

Nạp bằng lệnh APPLOAD: gõ APPLOAD, trỏ tới tệp, bấm Load. Muốn nó tự nạp mỗi lần mở máy thì thêm tệp vào ô Startup Suite ngay trong hộp ấy.

Ba phòng 4200x3600, 3200x3000 và 2800x2400 milimét sau khi gọi lệnh GDT: con số mét vuông nằm sẵn trong từng phòng Ảnh: AutoCAD 2027

Nhìn kỹ hình trên: phòng giữa ghi 9.6 m2 chứ không phải 9.60 m2. Đó không phải lỗi của tệp lisp. Hàm rtos cắt số 0 thừa khi biến DIMZIN bằng 8, và 8 đúng là giá trị trên bản vẽ ấy. Đặt DIMZIN về 0 thì cùng dòng mã ấy in ra 9.60.

Nếu máy hiện hộp Security - Unsigned Executable File rồi báo ; error: File load canceled: thì tệp không hỏng. Đó là biến SECURELOAD, mà Autodesk đặt mặc định bằng 1, tức chỉ nạp mã từ thư mục tin cậy. Khai thư mục chứa tệp vào biến TRUSTEDPATHS là nạp được ngay. Thử cả hai chiều trên máy trước khi viết câu này.

Toàn bộ mã nguồn

Đây đúng là tệp bạn tải về, không phải một bản rút gọn. Mọi con số trong bài đều đo bằng chính tệp này.

;;; ==================================================================
;;;  TDT-IIC.LSP  -  cong dien tich va ghi dien tich vao tung hinh
;;;  Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;;  https://iic.huce.edu.vn  -  Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;;  Sau lenh:
;;;    TDT     chon theo bat ky kieu nao roi cong dien tich cac hinh kin
;;;    TDTX    cong moi hinh kin trong ca ban ve, khong phai chon
;;;    TDTP    dien tich PHU THUC, phan chong nhau chi dem mot lan
;;;    TDTPX   dien tich phu thuc cua ca ban ve
;;;    GDT     chon nhieu hinh roi ghi con so vao giua tung hinh
;;;    GDTX    ghi con so vao moi hinh kin trong ca ban ve
;;;
;;;  Ten lenh da do truoc khi dat: tep bi danh acad.pgp cua ban 2027 co
;;;  387 ten tat, trong do DT la bi danh cua TEXT, AA cua AREA, AR cua
;;;  ARRAY. Dat trung nhung ten ay la lay mat mot lenh san co cua nguoi
;;;  dung. Sau ten tren deu con trong.
;;;
;;;  Phan chong nhau: lisp nao cong thang tung hinh cung dem hai lan
;;;  phan de. TDTP nhan ban cac hinh da chon, doi ban sao thanh REGION,
;;;  gop lai bang UNION roi do, xong xoa sach. BAN VE GOC KHONG DOI MOT
;;;  NET. Mang to khong doi thanh REGION duoc nen duoc bao tach rieng.
;;;
;;;  Con so in ra tinh bang MET VUONG. He so doi lay tu bien INSUNITS,
;;;  nen ban ve dung theo met khong con ra ket qua lech mot trieu lan.
;;;
;;;  Luu y ve so le: ham rtos cat sach so 0 thua khi bien DIMZIN bang 8,
;;;  nen nhan co the ra "9.6 m2" thay vi "9.60 m2". Do la DIMZIN cua ban
;;;  ve chu khong phai loi cua tep. Muon du hai so le thi dat DIMZIN ve
;;;  0 truoc khi chay.
;;;
;;;  Nap tep: go APPLOAD, chon tep nay, bam Load.
;;;  Tep luu bang ma UTF-8. Sua bang Notepad thi nho luu lai dung UTF-8.
;;; ==================================================================

(vl-load-com)

;;; ------------------------------------------------------------------
;;;  Phan chung
;;; ------------------------------------------------------------------

(defun iic-bang-ten ()
  (princ "\nLisp được lập trình bởi RDSIC - Viện Tin học Xây dựng")
  (princ "\nwebsite: https://iic.huce.edu.vn")
  (princ "\nTel: 0989 427 809")
  (princ)
)

;; Gop ca lenh vao MOT buoc undo. Dung danh dau cua ActiveX chu khong
;; dung (command "_.UNDO" ...): ban 2027 CAM goi (command) tu trong ham
;; bay loi *error*, con danh dau nay thi goi duoc o moi noi.
(defun iic-tai-lieu () (vla-get-ActiveDocument (vlax-get-acad-object)))
(defun iic-mo-undo () (vla-StartUndoMark (iic-tai-lieu)) (princ))
(defun iic-dong-undo () (vla-EndUndoMark (iic-tai-lieu)) (princ))

(defun iic-cat-bien (ten)
  (mapcar (function (lambda (v) (cons v (getvar v)))) ten)
)
(defun iic-tra-bien (ban)
  (foreach c ban (setvar (car c) (cdr c)))
  (princ)
)

;;; ------------------------------------------------------------------
;;;  Don vi ban ve
;;; ------------------------------------------------------------------
;;  Con so doc ra tinh bang don vi ban ve BINH PHUONG. Ban ve nha o
;;  Viet Nam thuong dung theo milimet, nen mot met vuong bang mot trieu
;;  don vi. He so lay tu INSUNITS chu khong doan.

(defun iic-he-so (/ u)
  (setq u (getvar "insunits"))
  (cond ((= u 4) 1e-6) ((= u 5) 1e-4) ((= u 6) 1.0) (T 1e-6))
)

(defun iic-ten-don-vi (/ u)
  (setq u (getvar "insunits"))
  (cond ((= u 4) "milimét") ((= u 5) "xentimét") ((= u 6) "mét")
        (T "không khai báo, tạm coi là milimét"))
)

(defun iic-ra-m2 (s) (strcat (rtos (* s (iic-he-so)) 2 3) " m2"))

;;; ------------------------------------------------------------------
;;;  Hinh nao co dien tich
;;; ------------------------------------------------------------------
;;  Nhan moi loai hinh co dien tich chu khong rieng mang to: da tuyen
;;  kin, duong tron, elip, spline kin va region. Hinh CHUA khep kin thi
;;  bo qua va bao ro, chu khong khep ho roi tra mot con so sai.

(defun iic-loai (e) (cdr (assoc 0 (entget e))))

(defun iic-kin-p (e / o loai)
  (setq loai (iic-loai e) o (vlax-ename->vla-object e))
  (cond
    ((member loai (list "CIRCLE" "REGION" "HATCH")) T)
    ((member loai (list "ELLIPSE" "LWPOLYLINE" "POLYLINE" "SPLINE"))
     (and (vlax-property-available-p o "Closed")
          (= (vla-get-Closed o) :vlax-true)))
    (T nil)
  )
)

;; Dien tich cua mot hinh kin, hoac nil neu khong lay duoc.
(defun iic-dien-tich (e / r)
  (if (iic-kin-p e)
    (progn
      (setq r (vl-catch-all-apply (function vla-get-Area)
                                  (list (vlax-ename->vla-object e))))
      (if (vl-catch-all-error-p r) nil r)
    )
  )
)

;;; ------------------------------------------------------------------
;;;  Lay bo doi tuong
;;; ------------------------------------------------------------------

(defun iic-chon (nhac)
  (princ nhac)
  (ssget)
)

;; Moi doi tuong cua TAB dang mo, khong lay lan sang to giay khac.
(defun iic-chon-het ()
  (ssget "_X" (list (cons 410 (getvar "ctab"))))
)

;; Tach bo chon thanh (danh-sach-hinh-kin  so-hinh-bo-qua)
(defun iic-loc (bo / i e ds bo-qua)
  (setq i 0 ds (list) bo-qua 0)
  (if bo
    (while (< i (sslength bo))
      (setq e (ssname bo i))
      (if (iic-dien-tich e)
        (setq ds (cons e ds))
        (setq bo-qua (1+ bo-qua))
      )
      (setq i (1+ i))
    )
  )
  (list (reverse ds) bo-qua)
)

(defun iic-cong (ds / s)
  (setq s 0.0)
  (foreach e ds (setq s (+ s (iic-dien-tich e))))
  s
)

;;; ------------------------------------------------------------------
;;;  Lenh TDT va TDTX - tong cong don
;;; ------------------------------------------------------------------

(defun iic-tong (bo rong / goi ds bo-qua s)

  (if (null bo)
    (princ (if rong "\n  Bản vẽ không có hình nào."
                    "\n  Không chọn được hình nào."))
    (progn
      (setq goi (iic-loc bo) ds (car goi) bo-qua (cadr goi))
      (if (null ds)
        (princ (if rong "\n  Bản vẽ không có hình nào có diện tích."
                        "\n  Không chọn được hình nào có diện tích."))
        (progn
          (setq s (iic-cong ds))
          (princ (strcat "\n  Đơn vị bản vẽ: " (iic-ten-don-vi)))
          (princ (strcat "\n  Đã tính   : " (itoa (length ds))))
          (princ (strcat "\n  Đã bỏ qua : " (itoa bo-qua)
                         (if (> bo-qua 0) " hình KHÔNG khép kín" "")))
          (princ (strcat "\n  TỔNG DIỆN TÍCH: " (iic-ra-m2 s)))
          (princ "\n  Đây là tổng CỘNG DỒN. Hình nào chồng lên nhau thì phần chồng được cộng")
          (princ "\n  hai lần — dùng lệnh TDTP để lấy DIỆN TÍCH PHỦ THỰC.")
        )
      )
    )
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  Lenh TDTP va TDTPX - dien tich phu thuc
;;; ------------------------------------------------------------------
;;  Cach lam: nhan ban cac hinh da chon, doi ban sao thanh REGION, gop
;;  bang UNION roi do, xong xoa sach. Ban ve goc khong doi mot net.

;; Goi lenh qua vl-cmdf chu khong qua command: command la DANG DAC BIET
;; chu khong phai ham, nen vl-catch-all-apply nem "bad order function:
;; COMMAND". vl-cmdf la ham that (do tren 2027: type tra ve SUBR).
;;
;; Doi mot danh sach ban sao thanh REGION va gop lai. Tra ve tong dien
;; tich cua phan gop, hoac nil neu khong gop duoc.
(defun iic-gop-vung (ds / ban sao bo g0 e tam s n)
  (setq ban (iic-cat-bien (list "delobj" "cmdecho" "peditaccept"))
        sao (list))
  (setvar "delobj" 3)
  (setvar "cmdecho" 0)
  ;; nhan ban tung hinh
  (foreach e ds
    (setq tam (vl-catch-all-apply (function vla-Copy)
                                  (list (vlax-ename->vla-object e))))
    (if (not (vl-catch-all-error-p tam))
      (setq sao (cons (vlax-vla-object->ename tam) sao))
    )
  )
  (if (null sao)
    (progn (iic-tra-bien ban) nil)
    (progn
      ;; doi ban sao thanh REGION
      (setq bo (ssadd))
      (foreach e sao (if (entget e) (ssadd e bo)))
      (setq g0 (entlast))
      (vl-catch-all-apply (function vl-cmdf) (list "_.REGION" bo ""))
      ;; nhat cac region vua sinh ra
      (setq bo (ssadd) e (entnext g0) n 0)
      (while e
        (if (= "REGION" (iic-loai e)) (progn (ssadd e bo) (setq n (1+ n))))
        (setq e (entnext e))
      )
      ;; xoa nhung ban sao chua thanh region duoc
      (foreach e sao (if (and (entget e) (/= "REGION" (iic-loai e))) (entdel e)))
      (if (= n 0)
        (progn (iic-tra-bien ban) nil)
        (progn
          (if (> n 1) (vl-catch-all-apply (function vl-cmdf) (list "_.UNION" bo "")))
          ;; do lai nhung region con song
          (setq s 0.0 e (entnext g0))
          (while e
            (if (and (entget e) (= "REGION" (iic-loai e)))
              (setq s (+ s (vla-get-Area (vlax-ename->vla-object e)))))
            (setq e (entnext e))
          )
          ;; xoa sach ban sao
          (setq e (entnext g0))
          (while e
            (if (entget e) (entdel e))
            (setq e (entnext e))
          )
          (iic-tra-bien ban)
          s
        )
      )
    )
  )
)

(defun iic-phu-thuc (bo rong / goi ds bo-qua to net s-don s-phu)

  (if (null bo)
    (princ (if rong "\n  Bản vẽ không có hình nào."
                    "\n  Không chọn được hình nào."))
    (progn
      (setq goi (iic-loc bo) ds (car goi) bo-qua (cadr goi))
      (if (null ds)
        (princ (if rong "\n  Bản vẽ không có hình nào có diện tích."
                        "\n  Không chọn được hình nào có diện tích."))
        (progn
          ;; tach mang to ra: chung khong doi thanh REGION duoc
          (setq to  (vl-remove-if-not (function (lambda (e) (= "HATCH" (iic-loai e)))) ds)
                net (vl-remove-if     (function (lambda (e) (= "HATCH" (iic-loai e)))) ds))
          (princ (strcat "\n  Đơn vị bản vẽ: " (iic-ten-don-vi)))
          (princ (strcat "\n  Đã tính   : " (itoa (length net))))
          (princ (strcat "\n  Đã bỏ qua : " (itoa bo-qua)
                         (if (> bo-qua 0) " hình KHÔNG khép kín" "")))
          (if (null net)
            (princ "\n  KHÔNG gộp được vì mảng tô không đổi thành REGION được, nên KHÔNG có diện tích phủ thực. Muốn cộng cả mảng tô thì dùng lệnh TDT.")
            (progn
              (iic-mo-undo)
              (setq s-don (iic-cong net)
                    s-phu (iic-gop-vung net))
              (iic-dong-undo)
              (if (null s-phu)
                (princ "\n  KHÔNG gộp được các hình này thành vùng. Dùng lệnh TDT để lấy tổng cộng dồn.")
                (progn
                  (princ (strcat "\n  Đã gộp    : " (itoa (length net))))
                  (princ (strcat "\n  Tổng cộng dồn     : " (iic-ra-m2 s-don)))
                  (princ (strcat "\n  DIỆN TÍCH PHỦ THỰC: " (iic-ra-m2 s-phu)))
                  (if (> (- s-don s-phu) (* 1e-6 (max s-don 1.0)))
                    (princ (strcat "\n  Phần chồng nhau   : " (iic-ra-m2 (- s-don s-phu))))
                    (princ "\n  (Không có hình nào chồng lên nhau.)")
                  )
                  (princ "\n  Bản vẽ gốc KHÔNG bị thay đổi: phép gộp làm trên bản sao rồi xoá đi.")
                )
              )
            )
          )
          (if to
            (progn
              (princ (strcat "\n  Ngoài ra có " (itoa (length to)) " mảng tô, tổng "
                             (iic-ra-m2 (iic-cong to))))
              (princ "\n  KHÔNG gộp được vì mảng tô không đổi thành REGION được, nên KHÔNG")
              (princ "\n  nằm trong ba con số trên. Muốn cộng cả mảng tô thì dùng lệnh TDT.")
            )
          )
        )
      )
    )
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  Lenh GDT va GDTX - ghi dien tich vao giua tung hinh
;;; ------------------------------------------------------------------

;; Tam cua mot hinh. Duong tron lay thang tam; cac hinh khac lay TRONG
;; TAM tinh qua mot REGION tam thoi, vi tam khung bao cua phong hinh
;; chu L co the roi ra ngoai phong. Khong duoc thi danh lay tam khung.
(defun iic-tam-region (e / ban g0 tam sao vt kq)
  (setq ban (iic-cat-bien (list "delobj" "cmdecho")))
  (setvar "delobj" 3)
  (setvar "cmdecho" 0)
  (setq sao (vl-catch-all-apply (function vla-Copy)
                                (list (vlax-ename->vla-object e))))
  (if (vl-catch-all-error-p sao)
    (progn (iic-tra-bien ban) nil)
    (progn
      (setq g0 (entlast))
      (vl-catch-all-apply (function vl-cmdf)
        (list "_.REGION" (ssadd (vlax-vla-object->ename sao)) ""))
      (setq tam (entnext g0))
      (if (and tam (= "REGION" (iic-loai tam)))
        (progn
          (setq vt (vl-catch-all-apply (function vla-get-Centroid)
                                       (list (vlax-ename->vla-object tam))))
          (if (not (vl-catch-all-error-p vt))
            (setq kq (append (vlax-safearray->list (vlax-variant-value vt)) (list 0.0))))
        )
      )
      ;; xoa sach ban sao du thanh cong hay khong
      (setq tam (entnext g0))
      (while tam (if (entget tam) (entdel tam)) (setq tam (entnext tam)))
      (if (and (null kq) (entget (vlax-vla-object->ename sao)))
        (entdel (vlax-vla-object->ename sao)))
      (iic-tra-bien ban)
      kq
    )
  )
)

(defun iic-tam-khung (e / o g1 g2 r)
  (setq o (vlax-ename->vla-object e)
        r (vl-catch-all-apply (function vla-getBoundingBox)
                              (list o (quote g1) (quote g2))))
  (if (vl-catch-all-error-p r)
    nil
    (progn
      (setq g1 (vlax-safearray->list g1) g2 (vlax-safearray->list g2))
      (list (* 0.5 (+ (car g1) (car g2))) (* 0.5 (+ (cadr g1) (cadr g2))) 0.0)
    )
  )
)

(defun iic-tam-hinh (e)
  (cond
    ((= "CIRCLE" (iic-loai e)) (cdr (assoc 10 (entget e))))
    ((iic-tam-region e))
    ((iic-tam-khung e))
    (T nil)
  )
)

(defun iic-dt-ghi-nhan (bo rong / goi ds bo-qua cao n hut p noi)

  (if (null bo)
    (princ (if rong "\n  Bản vẽ không có hình nào."
                    "\n  Không chọn được hình nào."))
    (progn
      (setq goi (iic-loc bo) ds (car goi) bo-qua (cadr goi))
      (if (null ds)
        (princ (if rong "\n  Bản vẽ không có hình nào có diện tích."
                        "\n  Không chọn được hình nào có diện tích."))
        (progn
          (setq cao (getvar "textsize"))
          (if (<= cao 1e-8) (setq cao 2.5))
          (iic-mo-undo)
          (setq n 0 hut 0)
          (foreach e ds
            (setq p   (iic-tam-hinh e)
                  noi (strcat (rtos (* (iic-dien-tich e) (iic-he-so)) 2 2) " m2"))
            (if p
              (progn
                (entmake (list (cons 0 "TEXT") (cons 10 p) (cons 11 p)
                               (cons 40 cao) (cons 1 noi)
                               (cons 72 1) (cons 73 2)))
                (setq n (1+ n))
              )
              (setq hut (1+ hut))
            )
          )
          (iic-dong-undo)
          (princ (strcat "\n  Đơn vị bản vẽ: " (iic-ten-don-vi)))
          (princ (strcat "\n  Đã ghi nhãn cho " (itoa n) " hình kín."))
          (if (> hut 0)
            (princ (strcat "\n  Có " (itoa hut) " hình kín KHÔNG đặt được nhãn.")))
          (if (> bo-qua 0)
            (princ (strcat "\n  Đã bỏ qua " (itoa bo-qua) " hình KHÔNG khép kín.")))
        )
      )
    )
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  Vo boc cua sau lenh
;;; ------------------------------------------------------------------

(defun iic-chay (ham rong nhac / *error* cu-error ban bo)
  (setq cu-error *error*
        ban      (iic-cat-bien (list "cmdecho" "delobj")))
  (defun *error* (m)
    (if (and m (/= m "Function cancelled") (/= m "quit / exit abort"))
      (princ (strcat "\nIIC lỗi: " m)))
    (iic-tra-bien ban)
    (iic-dong-undo)
    (setq *error* cu-error)
    (princ)
  )
  (iic-bang-ten)
  (setq bo (if rong (iic-chon-het) (iic-chon nhac)))
  (apply ham (list bo rong))
  (iic-tra-bien ban)
  (setq *error* cu-error)
  (princ)
)

(defun c:TDT ()
  (iic-chay (function iic-tong) nil
            "\nChọn đối tượng (bấm từng cái, kéo cửa sổ, kéo cắt ngang, WP, CP, F, ALL...): "))
(defun c:TDTX  () (iic-chay (function iic-tong) T nil))
(defun c:TDTP ()
  (iic-chay (function iic-phu-thuc) nil
            "\nChọn đối tượng (bấm từng cái, kéo cửa sổ, kéo cắt ngang, WP, CP, F, ALL...): "))
(defun c:TDTPX () (iic-chay (function iic-phu-thuc) T nil))
(defun c:GDT ()
  (iic-chay (function iic-dt-ghi-nhan) nil "\nChọn các hình cần ghi diện tích: "))
(defun c:GDTX  () (iic-chay (function iic-dt-ghi-nhan) T nil))

(princ "\nĐã nạp TDT-IIC. Lệnh: TDT, TDTX (tổng cộng dồn), TDTP, TDTPX (diện tích phủ thực), GDT, GDTX (ghi nhãn).")
(princ)

Đơn vị: chỗ sai số hay vào bảng khối lượng nhất

Bốn bước đổi con số máy in ra thành mét vuông trên một bản vẽ dựng theo milimét Ảnh: Sơ đồ của Viện Tin học Xây dựng

Con số đọc ra tính bằng đơn vị bản vẽ bình phương. Bản vẽ nhà ở Việt Nam thường dựng theo milimét, nên một mét vuông bằng một triệu đơn vị. Phòng 3200 nhân 2000 cho 6400000, và đó là 6,4 mét vuông.

Cách kiểm rẻ nhất: đo thử một phòng mà bạn đã biết kích thước trước khi lập cả bảng. Lệch một bậc mười là thấy ngay.

Bước kiểm chéo cuối cùng cũng đáng làm mỗi lần: tổng diện tích các phòng cộng diện tích tường phải bằng diện tích phủ bì. Lệch quá vài phần trăm nghĩa là có phòng bị bỏ sót hoặc có hai đường bao chồng lên nhau.

Ba điều hay nghe nhưng không đúng

Điều hay ngheThực tế trên bản 2027
AutoCAD có ba lệnh tính diện tích là AA, LI và SSGõ SS vào dòng lệnh thì máy trả Unknown command. SS là tên một tệp lisp của bên thứ ba, không phải lệnh của phần mềm
Gõ PE để tính chu viPE gọi PEDIT, và dòng nhắc của nó là Select polyline or [Multiple]:. Đó là lệnh sửa đa tuyến, không in ra con số nào
PERIMETER là một lệnhGõ nó ra PERIMETER = 0.0000 (read only). Đó là biến chỉ đọc, giữ lại chu vi vừa tính, không phải lệnh

Hai biến AREA và PERIMETER khá tiện: sau khi đo xong, gõ tên biến là đọc lại được con số cũ mà không phải đo lần nữa. Muốn biết thêm về cách gõ lệnh và tên tắt thì xem bài vẽ đường song song trong CAD.

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

Lệnh tính diện tích trong CAD gõ tắt là gì?

AA cho lệnh AREA, LI cho lệnh LIST. Lệnh MEASUREGEOM gõ tắt MEA cũng có mục Area và hiện kết quả ngay tại con trỏ.

Vì sao diện tích đúng mà chu vi lại sai?

Đường của bạn chưa khép kín. Phần mềm tự khép cạnh còn thiếu để tính diện tích nhưng bỏ qua chính cạnh ấy khi tính chu vi. Nhìn nhãn: thấy Length thay vì Perimeter là biết.

Đo diện tích một vùng do nhiều đường giao nhau tạo thành thì làm sao?

Gọi BOUNDARY, bấm một điểm bên trong vùng. Phần mềm dựng một đường bao kín mới, đo trên đường đó rồi xoá đi nếu không cần giữ.

Đo diện tích một hình có cạnh cong thì sao?

Dùng MEASUREGEOM mục Area, rồi trong lúc vạch biên gõ A để chuyển sang đoạn cung. Bạn vạch được một biên vừa có đoạn thẳng vừa có cung mà không phải vẽ trước đường bao nào.

Đa tuyến có bề rộng thì máy đo theo mép hay theo tim?

Theo tim. Autodesk ghi rõ "The centerline of a wide polyline is used to make area and perimeter calculations", nên một đường ống vẽ bằng đa tuyến dày sẽ cho diện tích của tim chứ không phải của mép ngoài.

Có cần lisp để cộng diện tích nhiều mảng tô không?

Không. Chọn hết các mảng tô rồi đọc dòng Cumulative Area trong bảng Properties. Ô Area hiện *VARIES* là bình thường, đừng dừng lại ở đó.

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 lập trình phần mềm trong xây dựng