;;;从AutoCAD 2013 Active Reference帮助中code Examples中提取 ;;;本源代码由 xshrimp 2013.2.20 搜集整理,版权归原作者所有! (vl-load-com) (defun c:Example_SetWidth() ;; The following code prompts you to select a lightweight ;; polyline, then displays the width of each segment of the ;; selected polyline. (setq acadObj (vlax-get-acad-object)) (setq doc (vla-get-ActiveDocument acadObj)) (vla-GetEntity (vla-get-Utility doc) 'returnObj 'basePnt "Select a polyline: ") ;; Make sure the user selected a polyline. (if (/= returnObj nil) (progn (if (= (vla-get-ObjectName returnObj) "AcDbPolyline") (progn ;; Obtain the coordinates of each vertex of the selected polyline. ;; The coordinates are returned in an array of points. (setq retCoord (vlax-variant-value (vla-get-Coordinates returnObj))) (setq segment 0 i (vlax-safearray-get-l-bound retCoord 1) ;; Start index of coordinates array j (vlax-safearray-get-u-bound retCoord 1) ;; End index of coordinates array nbr_of_vertices (+ (/ (- j i) 2) 1)) ;; Number of vertices in the polyline ;; Determine the number of segments in the polyline. ;; A closed polyline has as many segments as it has vertices. ;; An open polyline has one fewer segment than it has vertices. ;; Check the Closed property to determine if the polyline is closed. (if (= (vla-get-Closed returnObj) :vlax-true) (setq nbr_of_segments nbr_of_vertices) (setq nbr_of_segments (1- nbr_of_vertices)) ) ;; Get the width of each segment of the polyline (while (>= nbr_of_segments 0) ;; Get width values from the user (setq promptStart (strcat "\nSpecify the width at the beginning of the segment at " (rtos (vlax-safearray-get-element retCoord i) 2) "," (rtos (vlax-safearray-get-element retCoord (1+ i)) 2) " ==> ")) (setq promptEnd (strcat "\nNow specify the width at the end of that segment ==> ")) (setq StartWidth (vla-GetReal (vla-get-Utility doc) promptStart)) (setq EndWidth (vla-GetReal (vla-get-Utility doc) promptEnd)) ;; Set the width of the current segment (vla-SetWidth returnObj segment StartWidth EndWidth) ;; Prepare to obtain width of next segment, if any (setq i (+ i 2) segment (1+ segment) nbr_of_segments (1- nbr_of_segments)) ) ) (alert "Object selected was not a polyline") ) ) (alert "No object was selected.") ) )