Hi, recently I coded some sub functions for reversing some curve types, but I have a question about old heavy 2d polyline and splined 3d polyline... I want to have all possible options for reversing curves collected as I want to use and also old CAD releases that didn't have REVERSE command implemented...
Here is what I have now :
(defun rlw ( LW / E X1 X2 X3 X4 X5 X6 )
;; by ElpanovEvgeniy
;; reverse lwpolyline
(if (= (cdr (assoc 0 (setq e (entget lw)))) "LWPOLYLINE")
(progn (foreach a1 e
(cond ((= (car a1) 10) (setq x2 (cons a1 x2)))
((= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)))
((= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)))
((= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)))
((= (car a1) 210) (setq x6 (cons a1 x6)))
(t (setq x1 (cons a1 x1)))
)
)
(entmod (append (reverse x1)
(append (apply (function append)
(apply (function mapcar)
(cons 'list
(list x2
(cdr (reverse (cons (car x3) (reverse x3))))
(cdr (reverse (cons (car x4) (reverse x4))))
(cdr (reverse (cons (car x5) (reverse x5))))
)
)
)
)
x6
)
)
)
(entupd lw)
)
)
)
;; Reverse SPLINE - Marko Ribar, d.i.a.
(defun rspl ( spl / enx x12 x13 x1 x2 x3 x4 x5 )
(if (= (cdr (assoc 0 (setq enx (entget spl)))) "SPLINE")
(progn
(foreach a1 enx
(cond
( (= (car a1) 12) (setq x13 (cons (cons 13 (mapcar '- (cdr a1))) x13)) )
( (= (car a1) 13) (setq x12 (cons (cons 12 (mapcar '- (cdr a1))) x12)) )
( (= (car a1) 40) (setq x2 (cons a1 x2)) )
( (= (car a1) 10) (setq x3 (cons a1 x3)) )
( (= (car a1) 41) (setq x4 (cons a1 x4)) )
( (= (car a1) 11) (setq x5 (cons a1 x5)) )
( t (setq x1 (cons a1 x1)) )
)
)
(entmod
(append
(reverse x1)
x12
x13
(mapcar '(lambda ( x ) (cons 40 (- (cdar x2) (cdr x)))) x2)
(if x4
(apply 'append (mapcar '(lambda ( a b ) (list a b)) x3 x4))
x3
)
x5
)
)
(entupd spl)
)
)
)
;; Reverse HELIX - Marko Ribar, d.i.a.
(defun rhel ( hel / enx enx1 enx2 v x1 x2 x3 )
(if (= (cdr (assoc 0 (setq enx (entget hel)))) "HELIX")
(progn
(setq enx1 (reverse (cdr (member '(100 . "AcDbHelix") (reverse enx)))))
(setq enx2 (member '(100 . "AcDbHelix") enx))
(foreach a1 enx1
(cond
( (= (car a1) 40) (setq x2 (cons a1 x2)) )
( (= (car a1) 10) (setq x3 (cons a1 x3)) )
( t (setq x1 (cons a1 x1)) )
)
)
(setq enx2 (subst (cons 40 (distance (cdr (assoc 10 enx2)) (cdr (assoc 11 enx2)))) (assoc 40 enx2) enx2))
(setq enx2 (subst (cons 10 (mapcar '+ (cdr (assoc 10 enx2)) (mapcar '* (cdr (assoc 12 enx2)) (list (* (cdr (assoc 41 enx2)) (cdr (assoc 42 enx2))) (* (cdr (assoc 41 enx2)) (cdr (assoc 42 enx2))) (* (cdr (assoc 41 enx2)) (cdr (assoc 42 enx2))))))) (assoc 10 enx2) enx2))
(setq enx2 (subst (cons 11 (cdr (car x3))) (assoc 11 enx2) enx2))
(setq enx2 (subst (cons 12 (mapcar '- (cdr (assoc 12 enx2)))) (assoc 12 enx2) enx2))
(entmod
(append
(reverse x1)
(mapcar '(lambda ( x ) (cons 40 (- (cdar x2) (cdr x)))) x2)
x3
enx2
)
)
(entupd hel)
)
)
)
;; Reverse LINE - Marko Ribar, d.i.a.
(defun rli ( li / enx sp ep )
(if (= (cdr (assoc 0 (setq enx (entget li)))) "LINE")
(progn
(setq sp (cdr (assoc 10 enx)) ep (cdr (assoc 11 enx)))
(setq enx (subst (cons 10 ep) (assoc 10 enx) enx))
(setq enx (subst (cons 11 sp) (assoc 11 enx) enx))
(entmod enx)
(entupd li)
)
)
)
;; Reverse 3DPOLYLINE - Marko Ribar, d.i.a.
(defun r3dp ( 3dp / v p pl sfa var )
(vl-load-com)
(if
(and
(= (cdr (assoc 0 (entget 3dp))) "POLYLINE")
(< 7 (cdr (assoc 70 (entget 3dp))) 10)
)
(progn
(setq v 3dp)
(while (= (cdr (assoc 0 (entget (setq v (entnext v))))) "VERTEX")
(setq p (cdr (assoc 10 (entget v))))
(setq pl (cons p pl))
)
(setq pl (apply 'append pl))
(setq sfa (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length pl)))))
(vlax-safearray-fill sfa pl)
(setq var (vlax-make-variant sfa))
(vla-put-coordinates (vlax-ename->vla-object 3dp) var)
(entupd 3dp)
)
)
)
Thanks for attention,
regards, M.R.