给你个交互的版本,测试下,在已经变好的圆弧上, 在倒 圆弧和直线的角。
(defun c:tt1()
(defun _line1(line arc r)
(setq cir (xdge::constructor "kCircArc3d"))
(if (setq data (xdge::setpropertyvalue cir "set" line arc r 0.9 0.1))
(progn
(xdge::getpropertyvalue (car data) "startpoint" "endpoint" "bulge")
(xdrx_polyline_setPointAt e inx #startpoint)
(xdrx_polyline_setBulgeAt e inx #bulge)
(setq bulge1 (/ (* 2 h) (distance #startpoint #endpoint)))
(xdge::setpropertyvalue arc "setinterval" #endpoint ept)
(setq bulge1 (xdge::getpropertyvalue arc "bulge"))
(xdrx_polyline_addVertexAt e (1+ inx) #endpoint bulge1)
)
)
)
(defun _line2(arc line r)
(setq cir (xdge::constructor "kCircArc3d"))
(if (setq data (xdge::setpropertyvalue cir "set" arc line r (- (xdge::getpropertyvalue arc "endparam") 0.2) 0.1 ))
(progn
(xdge::getpropertyvalue (car data) "startpoint" "endpoint" "bulge")
(setq ept #startpoint)
(xdrx_polyline_addVertexAt e inx #startpoint #bulge)
(xdrx_polyline_setPointAt e (1+ inx) #endpoint)
(xdge::setpropertyvalue arc "setinterval" (xdge::getpropertyvalue arc "startpoint") ept)
(setq bulge1 (xdge::getpropertyvalue arc "bulge"))
(xdrx_setpropertyvalue e "bulgeat" (list (1- inx) bulge1))
)
)
)
(if (and (setq r (getreal "\n输入半径<退出>:"))
(setq e (xdrx_entsel "\n拾取多段线弧线段<退出>:" '((0 . "*polyline"))))
(setq pt (cadr e)
e (car e)
)
(if (= "POLYLINE" (car (xdrx_object_classname e)))
(xdrx_polyline_convertfrom e)
t
)
(setq pt (xdrx_curve_getclosestpoint e pt)
inx (xd::polyline:onsegat e pt)
)
(setq arc (xdrx_getpropertyvalue e "arcsegat" inx))
)
(progn
(xdge::getpropertyvalue arc "bulge" "startpoint" "endpoint")
(setq bulge1 #bulge
h (/ (* (distance #startpoint #endpoint) bulge1) 2.0)
ept #endpoint
inxs (xd::polyline:-index+ (entlast) inx))
(if (setq line1 (xdrx_getpropertyvalue e "linesegat" (car inxs)))
(_line1 line1 arc r)
)
(if (> (last inxs) 0)
(setq inx (setq inx (1+ (cadr inxs))))
(setq inx 0)
)
(if (setq line1 (xdrx_getpropertyvalue e "linesegat" inx))
(_line2 arc line1 r)
)
)
)
(princ)
)
|