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ào | Nội dung |
|---|---|
| Lệnh đầy đủ | AREA |
| Lệnh tắt | AA |
| Ribbon | Home → Utilities → nút xổ Measure → Area |
| Menu cổ điển | Tools → 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ước | Máy hỏi | Bạn làm |
|---|---|---|
| 1 | Specify first corner point or [Object/Add area/Subtract area] <Object>: | Enter để nhận Object, rồi bấm vào hình |
| 2 | hoặc bấm lần lượt các góc | Bấ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.
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.
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ộ.
Có hai đường xử lý, và trang BOUNDARY là đường nhanh hơn hẳn:
PEDITvới lựa chọnMultiplerồiJoinbiế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.BOUNDARY, gõ tắtBOkhô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ề.
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 đó.
| Lệnh | Việc nó làm |
|---|---|
TDT | chọn theo bất kỳ kiểu nào rồi cộng diện tích các hình kín |
TDTX | cộng mọi hình kín trong cả bản vẽ, không phải chọn |
TDTP | diện tích phủ thực, phần chồng nhau chỉ đếm một lần |
TDTPX | diện tích phủ thực của cả bản vẽ |
GDT | chọn nhiều hình rồi ghi con số vào giữa từng hình |
GDTX | ghi 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.
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
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 nghe | Thực tế trên bản 2027 |
|---|---|
AutoCAD có ba lệnh tính diện tích là AA, LI và SS | Gõ 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 vi | PE 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ệnh | Gõ 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 ở đó.