byghbcx
发表于 2007-4-28 15:33:00
看看这样可以了吧
(defun C:test (/ scaleinterval width initlen oldOSMODE
plObj entpt1 pt2angstartPoint endPoint initPoint
revp len interval num cnt
rotang firstDeriv ptstPoint selPoint
);画一条多义线每隔1米加一个0.5米的横短线
(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输入多义线起点"))
(initget "a A")
(setq pt2 (getpoint pt1 "\n输入多义线顶点(下一点)"))
(while pt2
(if (and (= (type pt2) 'str) (= (strcase pt2) "A"))
(progn
(if ent
(progn
(setq firstDeriv(vlax-curve-getFirstDerivent (vlax-curve-getendparam ent)))
(setq ang (angle '(0 0 0) firstDeriv))
(setq ang (* (/ ang pi) 180.0))
)
(setq ang 0)
)
(command "_.pline" pt1 "a" "d" ang pause"")
(setq pt2 (getvar 'lastpoint))
)
(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)
(initget "a A")
(setq pt2 (getpoint pt1 "\n输入多义线顶点(下一点)"))
)
(vlax-release-object plObj)
(command "ucs" "p")
(command "undo" "E")
(setvar "OSMODE" oldOSMODE)
(princ)
)
xyp1964
发表于 2007-4-29 14:04:00
;;;画一条多义线每隔1米加一个0.5米的横短线<br/>(defun c:test ()<br/> (CMDLA0)<br/> (setq ss (ssget '((0 . "*POLYLINE")))<br/> i -1<br/> )<br/> (while (setq s1 (ssname ss (setq i (1+ i))))<br/> (setq ptn (xyp-get-CurveDivPtlst s1 1))<br/> (foreach pt ptn<br/> (xyp-Faxian s1 pt 0.5)<br/> )<br/> )<br/> (CMDLA1)<br/>)
xyf0405
发表于 2007-4-30 10:51:00
<p>用ACAC自带的命令就行了,R14版都有这个命令:定距等分</p><p>把短横线做一个块:qwe,后面的看动画:</p>
mycad
发表于 2007-5-5 09:29:00
用measure或divide命令,可以使用lisp调用这两个命令.
sotop
发表于 2013-4-23 17:07:02
我也想知道,同求