(if (not ss) (princ "\nNo objects selected.") (progn (setq total-area 0.0) (setq obj-list '()) (setq cnt 0)
By default, AutoCAD’s MEASUREGEOM or AREA commands require you to select points or objects one by one. A custom LISP routine offers several advantages: total area autocad lisp
Automatically switch between square inches and square feet or hectares. Place Text: (if (not ss) (princ "\nNo objects selected
The raw output of the Lisp is in drawing units . In AutoCAD, one drawing unit can represent 1 millimeter, 1 inch, 1 meter, or 1 foot. This depends on your template. In AutoCAD, one drawing unit can represent 1
: Creates an MText object containing a dynamic "Field Expression". If you modify the original shapes, the total area updates automatically after a AMO (Add Multiple Objects)
(defun c:TOTALAREA (/ ss i ent obj area total scale) (vl-load-com) (setq total 0.0) (setq scale 1.0) ; change if you need to multiply result (e.g., scale factor for units) (if (setq ss (ssget '((0 . "LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE,SPLINE,HATCH,REGION")))) (progn (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i) obj (vlax-ename->vla-object ent)) (cond ;; LWPOLYLINE or POLYLINE: check closed and use Area property ((or (eq "AcDbPolyline" (vla-get-objectname obj)) (eq "AcDbLightWeightPolyline" (vla-get-objectname obj))) (if (= (vla-get-closed obj) :vl-true) (setq area (+ total (* scale (abs (vla-get-Area obj))))) (setq total (+ total 0.0)) ) ) ;; REGION ((eq "AcDbRegion" (vla-get-objectname obj)) (setq total (+ total (* scale (abs (vla-get-Area obj))))) ) ;; HATCH (area property exists) ((eq "AcDbHatch" (vla-get-objectname obj)) (setq total (+ total (* scale (abs (vla-get-Area obj))))) ) ;; CIRCLE ((eq "AcDbCircle" (vla-get-objectname obj)) (setq total (+ total (* scale (abs (vla-get-Area obj))))) ) ;; ELLIPSE and SPLINE - try Area property if present ((member (vla-get-objectname obj) '("AcDbEllipse" "AcDbSpline")) (vl-catch-all-apply (function (lambda () (setq total (+ total (* scale (abs (vla-get-Area obj))))) ))) ) ) ; cond (setq i (1+ i)) ) ; while ;; If we used an accumulating bug above, ensure total includes additions: ;; (the LISP above updates total inside each branch) (setq total (vl-round total 1e-6)) (vl-file-syst-write-line) ; no-op to avoid blocking on some versions (princ (strcat "\nTotal area: " (rtos total 2 4) " square units")) ;; Try to copy to clipboard (Windows only) (vl-cmdf "_.-pasteclip" "") ;; Better approach: use Visual LISP clipboard if available (if (and (fboundp 'vlax-put-property) (vl-string-search "Windows" (getenv "OS"))) (progn (vl-cmdf) ; no-op to ensure environment ) ) ;; Put numeric value on CLIPBOARD using system method if possible (if (and (vl-string-search "Windows" (getenv "OS"))) (progn (setq clipcmd (strcat "cmd /c echo " (rtos total 2 6) " | clip")) (vl-syst-sys (list clipcmd)) ) ) ) (princ "\nNo valid objects selected.") ) (princ) )