Thanks for help!
(defun c:foo ( / modVertex myerror
oldError
osm ;OSMODE
pt ;Blockinsrt point
pline ;PolylineEntity
ang ;Angle from moving segment
Pt1 Pt2 ;Segment before moving segment
Pt3 Pt4 ;Segment after moving segment
p ;Segment number integer
cp; controllpoint along the Polyline
block
z
)
(defun modVertex (polyline nVertex coordinate / ent cVertexes)
(setq ent (entget polyline))
(setq cVertexes
(vl-remove-if-not
'(lambda (a / )
(= (car a) 10)
)
ent
)
)
(entmod
(subst
(cons 10 coordinate)
(nth nVertex cVertexes)
ent
)
)
)
(setq oldError *error*)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq *error* MyError)
(defun myError (msg)
(setvar "OSMODE" osm)
(redraw)
(princ (strcat "\nCancel: " msg))
(setq *error* oldError)
)
(while (not (and (setq obj (entsel "\n Select a Polyline"))
(= "LWPOLYLINE" (cdr (assoc 0 (entget (setq pline (car obj))))))
)
)
)
(while (not (and (setq obj (entsel "\n Select a Block"))
(if (= "INSERT" (cdr (assoc 0 (entget (setq block (car obj))))))
(setq z 1)
)
)
)
)
(setq pt (cadr (grread t 13)))
(while
(= 5 (car (setq pt (grread t 13 0))))
(redraw)
(setq pt (cadr pt)
cp (vlax-curve-getclosestpointto pline pt)
)
(grdraw pt cp 1 1)
(entmod (subst (cons 10 pt) (assoc 10 (entget block)) (entget block)))
)
(redraw)
(if pline
(progn
(setq p
(fix
(vlax-curve-getparamatpoint pline
(vlax-curve-getclosestpointtoprojection pline
(trans (cadr pt) 1 0)
'(0.0 0.0 1.0)
)
)
)
)
; looking for especially segment from Polyline
; 1. segment Pt1-Pt2
(setq Pt1 (trans (vlax-curve-getpointatparam pline (if (minusp (1- p))
(progn
(princ "\n Missing segment before")
(exit)
)
(1- p)
)
)
1 0
)
)
(if (setq Pt2 (trans (vlax-curve-getpointatparam pline p) 1 0))
pt2
(princ "\n No 2. segment")
)
; 2. segment Pt2-Pt3, segment should move to new position
(if (setq Pt3 (trans (vlax-curve-getpointatparam pline (1+ p)) 1 0))
pt3
(princ "\n No 3. segment")
)
; 3. segment Pt3-Pt4
(setq Pt4 (trans (if (vlax-curve-getpointatparam pline (+ 2 p))
(vlax-curve-getpointatparam pline (+ 2 p))
(progn
(princ "\n Missing segment after")
(exit)
)
)
1 0)
)
)
)
(if (= "" (getstring "\n Do you want move segm.?"))
(progn
; Calculate angle from segment
(setq ang
(angle '(0 0 0) (vlax-curve-getFirstDeriv pline (vlax-curve-getParamAtPoint pline cp))
)
)
; Move first vertex from segment
(modVertex pline p (inters pt1 (polar pt1 (angle pt1 pt2) 100)
(polar (cadr pt) ang 100)
(polar (cadr pt) ang -100)
)
)
(modVertex pline (1+ p) (inters pt4 (polar pt4 (angle pt4 pt3) 100)
(polar (cadr pt) ang 100)
(polar (cadr pt) ang -100)
)
)
)
)
(setq *error* oldError )
(setvar "OSMODE" osm)
(princ)
)
What are you thinking about my work?
Another question, is it possible to build a reactor which move segment automatically after moving blockposition?