可以改一下,即画即显示,加入比例变量,但怎样在多义线绘制中间能够绘制短线,就是说在命令行显示为: 指定下一点或 [圆弧(A)/闭合(C)/半宽(H)/长度(L)/放弃(U)/宽度(W)]: 的时候能运行程序. 我一时还没想到办法(可以用程序去模拟多义线绘制命令,但这样较复杂点),是否注册一个透明命令? (defun C:test (/ scale interval width initlen oldOSMODE plObj ent pt1 pt2 startPoint endPoint initPoint revp len interval num cnt rotang firstDeriv pt stPoint selPoint ) (setq scale (getreal "\n请输入比例1:<1000>")) (if (not scale) (setq scale 1000)) (setq interval scale ; 1m width (* scale 0.5) ; 0.5m initlen 0 ;???? ) (setq oldOSMODE (getvar "OSMODE")) (setq cnt 0) (command "undo" "BE") (command "ucs" "w") (vl-load-com) (setq pt1 (getpoint "\n输入多义线起点")) (setq pt2 (getpoint pt1 "\n输入多义线顶点(下一点)")) (while pt2 (command "_.pline" pt1 pt2 "") (if ent (progn (command "_.pedit" ent "j" (entlast) "" ""))) (setq ent (entlast)) (setq plObj (vlax-ename->vla-object ent ;;; (car ;;; (setq ent (entsel "\nSelect an object: ")) ;;; ) ) ) (if (member (vla-get-objectname plObj) '("AcDbPolyline" "AcDb2dPolyline" "AcDbLine" "AcDbSpline" "AcDbARC" "AcDbCircle" "AcDbEllipse" ) ) (progn ;;; (setq selPoint (cdr (assoc 10 (entget ent)))));(cadr ent)) (setq startPoint (vlax-curve-getStartPoint plObj)) (setq endPoint (vlax-curve-getEndPoint plObj)) ;;; (if (> (distance selPoint startPoint) ;;; (distance selPoint endPoint) ;;; ) ;;; (setq stPoint endPoint ;;; revp T ;;; ) (setq stPoint startPoint revp nil ) ;;; ) (setvar "OSMODE" 0) (setq len (- (vlax-curve-getDistAtParam plObj (vlax-curve-getendparam plObj) ) initlen ) ) (setq num (1+ (fix (/ len interval)))) (while (<= cnt (1- num)) (cond ((= revp nil) (setq pt (vlax-curve-getPointAtDist plObj (+ initlen (* interval cnt)) ) ) (setq firstDeriv (vlax-curve-getFirstDeriv plObj (vlax-curve-getParamAtPoint plObj pt) ) ) (setq rotang (angle '(0 0 0) firstDeriv)) (command "line" (polar pt (+ rotang (* 0.5 pi)) (* 0.5 width)) (polar pt (- rotang (* 0.5 pi)) (* 0.5 width)) "" ) ) ((= revp T) (setq pt (vlax-curve-getPointAtDist plObj (- len (* interval cnt)) ) ) (setq firstDeriv (vlax-curve-getFirstDeriv plObj (vlax-curve-getParamAtPoint plObj pt) ) ) (setq rotang (angle '(0 0 0) firstDeriv)) (command "line" (polar pt (+ rotang (* 0.5 pi)) (* 0.5 width)) (polar pt (- rotang (* 0.5 pi)) (* 0.5 width)) "" ) ) ) ;cond (setq cnt (1+ cnt)) ) ;while ) ;progn (alert "\Invalid object Selected!") ) ;endif (setq pt1 pt2) (setq pt2 (getpoint pt1 "\n输入多义线顶点(下一点)")) ) (vlax-release-object plObj) (command "ucs" "p") (command "undo" "E") (setvar "OSMODE" oldOSMODE) (princ) ) |