More Free AutoLISP and Visual LISP code snippets for AutoCAD If it's not working on AutoCAD for Mac rename defun bom-code to defun bom-code-off and defun bom-code-old to defun bom-code ;;;---------------------------------------------------------------------------; ;;; ;;; bomlengths.lsp ;;; ;;; By Jimmy Bergmark ;;; Copyright (C) 1997-2017 JTB World, All Rights Reserved ;;; Website: http://jtbworld.com ;;; E-mail: info@jtbworld.com ;;; ;;; 1998-03-31 - First release ;;; 2000-05-11 - Fixed for LWPOLYLINES and for A2k ;;; 2003-06-10 - Tested on 2004 and fixed a minor bug ;;; 2004-03-18 - Added (vl-load-com) ;;; 2007-09-24 - Shows the result in the active unit ;;; 2017-06-14 - Added support for circles and ellipses and fixed a bug in the error handler ;;; Tested on AutoCAD 2000, 2004, 2005, 2008, 2018 ;;; should be working on older versions too with minor modifications. ;;; exchange bom-code-old with bom-code ;;; ;;;---------------------------------------------------------------------------; ;;; DESCRIPTION ;;; ;;; BILL OF LENGTHS. Get the accumulated sum length of multiple objects. ;;; c:bomlengths - length of lines, circles, arcs, ellipses, polylines and splines and total. ;;; c:bom_lines - length of lines and total. ;;; c:bom_circles - length of circles, and total. ;;; c:bom_arcs - length of arcs, and total. ;;; c:bom_ellipses - length of ellipses, and total. ;;; c:bom_polylines - length of polylines and total. ;;; c:bom_splines - length of splines and total. ;;;---------------------------------------------------------------------------; (defun dxf (n ed) (cdr (assoc n ed))) (defun bom-code (ssfilter / errexit undox restore *error* olderr oldcmdecho %l %t sset %i en ed p1 p2 ot a1 a2 r ) (defun errexit (s) (princ) (restore) ) (defun undox () (if command-s (command-s "._undo" "_E") (command "._undo" "_E") ) (setvar "cmdecho" oldcmdecho) (setq *error* olderr) (princ) ) (setq olderr *error* restore undox *error* errexit ) (setq oldcmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) (if command-s (command-s "._UNDO" "_BE") (command "._UNDO" "_BE") ) (setq %i 0 %t 0 ) (vl-load-com) (setq sset (ssget ssfilter)) (if sset (progn (princ "\nLengths:") (repeat (sslength sset) (setq en (ssname sset %i)) (setq ed (entget en)) (setq ot (dxf 0 ed)) (setq curve (vlax-ename->vla-object en)) (if (vl-catch-all-error-p (setq len (vl-catch-all-apply 'vlax-curve-getDistAtParam (list curve (vl-catch-all-apply 'vlax-curve-getEndParam (list curve) ) ) ) ) ) nil len ) (setq %l len) (setq %i (1+ %i) %t (+ %l %t) ) (terpri) ;(princ %l ) (princ (rtos %l (getvar "lunits") (getvar "luprec"))) ) (princ "\nTotal = ") ;(princ %t) (princ (rtos %t (getvar "lunits") (getvar "luprec"))) (textpage) ) ) (setq sset nil) (restore) ) (defun bom-code-old (ssfilter / errexit undox restore *error* olderr oldcmdecho %l %t sset %i en ed p1 p2 ot a1 a2 r ) (defun errexit (s) (princ) (restore) ) (defun undox () (if command-s (command-s "._undo" "_E") (command "._undo" "_E") ) (setvar "cmdecho" oldcmdecho) (setq *error* olderr) (princ) ) (setq olderr *error* restore undox *error* errexit ) (setq oldcmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) (if command-s (command-s "._UNDO" "_BE") (command "._UNDO" "_BE") ) (setq %i 0 %t 0 ) (setq sset (ssget ssfilter)) (if sset (progn (princ "\nLengths:") (repeat (sslength sset) (setq en (ssname sset %i)) (setq ed (entget en)) (setq ot (dxf 0 ed)) (cond ((= ot "LINE") (setq p1 (dxf 10 ed) p2 (dxf 11 ed) %l (distance p1 p2) ) ) ((= ot "ARC") (setq a1 (dxf 50 ed) a2 (dxf 51 ed) r (dxf 40 ed) %l (* r (abs (- a2 a1))) ) ) (t (command "._area" "_obj" en) (setq %l (getvar "perimeter")) ) ) (setq %i (1+ %i) %t (+ %l %t) ) (terpri) (princ %l) ) (princ "\nTotal = ") (princ %t) (textpage) ) ) (setq sset nil) (restore) ) (defun c:bomlengths () (initget "Lines Circles Arcs Ellipses Polylines Splines ALL" ) (setq ans (getkword "Enter an option [Lines/Circles/Arcs/Ellipses/Polylines/Splines] : " ) ) (cond ((= ans "Lines") (c:bom_lines)) ((= ans "Circles") (c:bom_circles)) ((= ans "Arcs") (c:bom_arcs)) ((= ans "Ellipses") (c:bom_ellipses)) ((= ans "Polylines") (c:bom_polylines)) ((= ans "Splines") (c:bom_splines)) (t (bom-code '((-4 . "<OR") (0 . "LINE") (0 . "CIRCLE") (0 . "ARC") (0 . "ELLIPSE") (0 . "POLYLINE") (0 . "LWPOLYLINE") (0 . "SPLINE") (-4 . "OR>") ) ) ) ) (princ) ) (defun c:bom_lines () (bom-code '((0 . "LINE"))) (princ) ) (defun c:bom_circles () (bom-code '((0 . "CIRCLE"))) (princ) ) (defun c:bom_arcs () (bom-code '((0 . "ARC"))) (princ) ) (defun c:bom_ellipses () (bom-code '((0 . "ELLIPSE"))) (princ) ) (defun c:bom_polylines () (bom-code '((-4 . "<OR") (0 . "POLYLINE") (0 . "LWPOLYLINE") (-4 . "OR>") ) ) (princ) ) (defun c:bom_splines () (bom-code '((0 . "SPLINE"))) (princ) ) (princ) |