;;;从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.")
    )
)