@adaptacad hi,
check this PUSHIN command.
the following declaration are constant but you can change them to meet other requirements
(setq ENTER_LEG 0.5) ; const
(setq CIRC_RAD 1.5) ; const
the first is the 0.5 segment starting the arc
the second is minimum arc radius to check
selecting polyarc is rejected. if you pick too close to endpoint this is also rejected
it works in a big loop so you can pick plines again to push more coils.
oh yes...no need for block it is done with polyline as whole 😀
enjoy
Moshe
(vl-load-com) ; load ActiveX support
(defun c:pushin (/ isStraightSegment calcRad askdist ; local functions
ENTER_LEG CIRC_RAD pick0 pick1 ename0 ename1 elist0 ;| p0 p1 p2|; plen prm rad r)
(defun isStraightSegment (edata t1)
(vl-some
(function
(lambda (t2 blg)
(and
(equal (distance t1 t2) 0.0 1e-3)
(= blg 0.0)
)
); lambda
); function
(setq l1 (mapcar 'cdr (vl-remove-if-not (function (lambda (itm) (= (car itm) 10))) edata))) ; points
(setq l2 (mapcar 'cdr (vl-remove-if-not (function (lambda (itm) (= (car itm) 42))) edata))) ; bulges
); vl-some
); isStraightSegment
; calculate circle radius
; Qr is quote int
(defun calcRad (len Qr / i)
(setq i 1)
(while (> (/ (1- len) i pi 2) CIRC_RAD)
(setq i (1+ i))
)
(set Qr (1- i)) ; indirect set
(/ (1- len) (1- i) pi 2)
); calcRad
(defun askdist (msg def / ask)
(initget (+ 2 4))
(if (not (setq ask (getdist (strcat "\n" msg " <" (rtos def 2) ">: "))))
(setq ask def)
(setq def ask)
)
); askdist
(setvar "cmdecho" 0)
(command "._undo" "_begin")
(setq ENTER_LEG 0.5) ; const
(setq CIRC_RAD 1.5) ; const
(if (= (getvar "userr5") 0.0)
(setvar "userr5" 20.0)
)
(while (and
(setq pick0 (entsel "\nPick pline: "))
(setq ename0 (car pick0))
(setq elist0 (entget ename0))
(= (cdr (assoc '0 elist0)) "LWPOLYLINE")
(setq p0 (cadr pick0))
)
(setq p0 (vlax-curve-getClosestPointToProjection ename0 p0 '(0.0 0.0 1.0)))
(setq prm (vlax-curve-getParamAtpoint ename0 p0))
(setq p1 (vlax-curve-getPointAtParam ename0 (fix prm)))
(setq p2 (vlax-curve-getPointAtParam ename0 (1+ (fix prm))))
(cond
((not (isStraightSegment elist0 p1))
(vlr-beep-reaction)
(princ "\nPick straight polyline segment.")
); case
((or
(< (distance p0 p1) ENTER_LEG)
(< (distance p0 p2) ENTER_LEG)
)
(vlr-beep-reaction)
(princ "\nMove away from vertex.")
); case
((setvar "userr5" (setq plen (askdist "Total length to pushin" (getvar "userr5"))))
(command "._break" ename0 "_None" (polar p0 (angle p2 p1) ENTER_LEG) "_None" (polar p0 (angle p1 p2) ENTER_LEG))
(setq ename1 (entlast))
(setq rad (calcRad plen 'r))
(command "._pline" "_None" (polar p0 (angle p2 p1) ENTER_LEG) "_width" 0 0 "_None" p0 "_Arc")
(repeat r
(command "_None" (polar p0 (- (angle p1 p2) (/ pi 2)) (* rad 2)) "_None" p0)
)
(command "_Line" "_None" (polar p0 (angle p1 p2) ENTER_LEG) "")
(command "._join" ename0 (entlast) ename1 "")
(command "._text" "_Middle" (polar p0 (- (angle p1 p2) (/ pi 2)) rad) ENTER_LEG 0 (rtos plen 2 0))
); case
); cond
); while
(command "._undo" "_end")
(setvar "cmdecho" 1)
(princ)
)