(defun c:ee (/ i j ss lenss eelist en obj zc lst1 lst n) ;任意曲线变多段线一般只用于椭圆;圆弧和样条曲线
(VL-LOAD-COM)(setvar "cmdecho" 0)
(setq ss (ssget '((0 . "ARC,SPLINE,ELLIPSE"))))
(setq lenss (sslength ss)
i 0 eelist '()
)
(repeat lenss;外循环开始
(setq en (ssname ss i);取得图元名
obj (vlax-ename->vla-object en);转换为vla对象
)
(setq zc (vlax-curve-getdistatparam
obj
(vlax-curve-getendparam obj)
);求得图元周长
;;;或者(setq zc(vlax-curve-getDistAtPoint obj (vlax-curve-getEndPoint obj)))
)
(setq j(- zc (fix zc)));取出周长的小数值
(setq start(vlax-curve-getPointAtDist obj 0));取开始点
(setq end(vlax-curve-getEndPoint obj)); 取结束点
(repeat (fix zc);循环周长取整次刚好到端点
(setq lst (vlax-curve-getPointAtDist obj j);取距开始点为j的点
lstlen (vlax-curve-getDistAtPoint obj lst);测量开始点到j点的距离
)
(setq
eelist (append eelist (list (list (nth 0 lst) (nth 1 lst))));加入到点集
)
(setq j (1+ j));递增1
);内循环结束
;(setq eelist(reverse eelist))
(command ".pline" "non" start);开始描点
(foreach n eelist (command "non" n)(grdraw start n 1) (setq start n));模拟描红
(COMMAND end "")(grdraw start end 1);描点结束
(setq eelist '());清空点集
(setq i (1+ i));下一个图元
);外循环结束
(princ)(princ)
)
;|程序对椭圆有效,但对圆弧和样条曲线不对,描出来的线会比实际的短1个距离,不知为什么,请各位帮忙修改下,谢谢;
;精度还算可以,当然还可以更精确,但速度也会相应变慢.|;
;另外为了加快速度,用 ActiveX 函数的vlaaddLightweightPolyline和entmake该怎么来写,没有找到相关实例,请指教!
|