- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
I was looking for a way to reverse pline direction in Land Desktop 2009 and found rdir.lsp on this forum. I got exited for a moment but after I appload the lsp and get a message : rdir.lsp successfully loaded...When I try to run it I get ...no function definition: RDIR. I'm coping the code bellow and apologize for doing it since is not mine. I'm new to LISP and just got interested in it but my first encounter is not helping to get me excited :). Thanks in advance guys .
; reverse the polyline direction
(defun getcodelist (code lista / item lout)
(while (setq item (assoc code lista))
(setq lista (cdr (member item lista)) lout (cons item lout)))
lout)
(defun dxfn (code name)
(cdr (assoc code (entget name))))
(defun listrotate (n lista)
(repeat n (setq lista (cdr (append lista (list (car lista)))))))
(defun c:PR (/ poly vt lvt lvt2 new old ed closed polygen arcgen
l_10 l_40 l_41 l_42 i n item ss a e )
(command "undo" "be")
(princ "\nPR - Reverses the direction of a PLINE, ARC or LINE")
(princ "\nLisp Routine Downloaded from Autocad User Group")
(setq ss (cadr (ssgetfirst)))
(if ss (progn
(setq a -1)
(while (< (setq a (1+ a)) (sslength ss))
(setq e (ssname ss a))
(if (or (= (dxfn 0 e) "ARC") (= (dxfn 0 e) "LINE") (= (dxfn 0 e)
"POLYLINE") (= (dxfn 0 e) "LWPOLYLINE"))
(setq a (1+ a))
(ssdel e ss)))
(if (= 0 (sslength ss)) (setq ss nil))
(if ss (progn
(princ "\nFound ") (princ (itoa (sslength ss)))
(princ (if (= 1 (sslength ss)) " entity" " entities"))
(princ " already selected.\nOk to reverse ")
(princ (if (= 1 (sslength ss)) " this entity" " these entities"))
(setq a (substr (strcase (getstring "? (type 'n' to select new
entities) [y/n] <y> ")) 1 1))
(if (= "N" a) (setq ss nil))))))
(if (not ss) (progn
(sssetfirst nil nil)
(princ "\nSelect ARCs, LINEs or POLYLINEs to reverse")
(setq ss (ssget '((0 . "ARC,LINE,POLYLINE,LWPOLYLINE"))))
(if ss (progn
(princ "\nFound ") (princ (itoa (sslength ss)))
(princ (if (= 1 (sslength ss)) " entity" " entities"))
;SECTION REMARKED OUT TO AVOID PROMPT
;(princ "\nOk to reverse ")
;(princ (if (= 1 (sslength ss)) " this entity" " these entities"))
;(setq a (substr (strcase (getstring "? [y/n] <y> ")) 1 1))
;(if (= "N" a) (setq ss nil))
))))
(setq a -1 polygen nil arcgen 0)
(while (and ss (< (setq a (1+ a)) (sslength ss)))
(setq poly (ssname ss a) arc_check nil)
(if (= (dxfn 0 poly) "ARC") (progn
(setq arc_check T)
(command "pedit" poly "" "")
(if (or (entget poly) (and (/= "LWPOLYLINE" (dxfn 0 (entlast))) (/=
"POLYLINE" (dxfn 0 (entlast)))))
(princ "\nCouldn't convert ARC to PLINE")
(setq poly (entlast) arcgen (1+ arcgen)))))
(cond ((= (dxfn 0 poly) "POLYLINE")
(if (/= 128 (logand 128 (dxfn 70 poly))) (progn
(if (not arc_check) (setq polygen T))
(setq ed (entget poly))
(setq ed (subst (cons 70 (logior 128 (cdr (assoc 70 ed))))
(assoc 70 ed) ed))
(entmod ed) (entupd poly)))
(setq closed (= (dxfn 70 poly) 1) vt (entnext poly))
(while (/= (dxfn 0 vt) "SEQEND")
(if (/= 16 (dxfn 70 vt))
(setq lvt (cons (list (dxfn 10 vt) (dxfn 42 vt)) lvt)))
(setq vt (entnext vt)))
(if closed
(setq lvt (cons (last lvt) lvt)
lvt (reverse (cdr (reverse lvt)))))
(setq lvt2 (cdr (append lvt (list (car lvt))))
lvt (mapcar '(lambda (a b) (list (car a) (- (cadr
b)))) lvt lvt2)
lvt2 nil)
(setq vt (entnext poly))
(while (/= (dxfn 0 vt) "SEQEND")
(if (/= 16 (dxfn 70 vt)) (progn
(setq ed (entget vt)
old (assoc 10 ed)
new (cons 10 (caar lvt))
ed (subst new old ed)
old (assoc 42 ed)
new (cons 42 (cadr (car lvt)))
ed (subst new old ed)
lvt (cdr lvt))
(entmod ed)))
(setq vt (entnext vt)))
(entupd poly))
((= (dxfn 0 poly) "LWPOLYLINE")
(if (/= 128 (logand 128 (dxfn 70 poly))) (progn
(if (not arc_check) (setq polygen T))
(setq ed (entget poly))
(setq ed (subst (cons 70 (logior 128 (cdr (assoc 70 ed))))
(assoc 70 ed) ed))
(entmod ed) (entupd poly)))
(setq ed (entget poly)
lvt (member (assoc 10 ed) ed)
lvt (reverse (cdr (reverse lvt)))
l_10 (getcodelist 10 lvt)
l_41 (getcodelist 41 lvt)
l_41 (mapcar '(lambda (a) (cons 40 (cdr a))) l_41)
l_41 (listrotate 1 l_41)
l_40 (getcodelist 40 lvt)
l_40 (mapcar '(lambda (a) (cons 41 (cdr a))) l_40)
l_40 (listrotate 1 l_40)
l_42 (getcodelist 42 lvt)
l_42 (mapcar '(lambda (a) (cons 42 (- (cdr a)))) l_42)
l_42 (listrotate 1 l_42)
n (length l_10)
i -1)
(while (< (setq i (1+ i)) n)
(setq lvt2 (append lvt2 (list (nth i l_10) (nth i l_41)
(nth i l_40) (nth i
l_42)))))
(setq lvt (reverse ed))
(while (setq item (assoc 10 lvt))
(setq lvt (cdr (member item lvt))))
(setq lvt (reverse lvt) lvt2 (append lvt lvt2 (list (assoc
210 ed))))
(entmod lvt2)
(entupd poly))
((= (dxfn 0 poly) "LINE")
(setq ed (entget poly) e (cdr (assoc 10 ed)))
(setq ed (subst (cons 10 (cdr (assoc 11 ed))) (assoc 10 ed)
ed))
(setq ed (subst (cons 11 e) (assoc 11 ed) ed))
(entmod ed)
(entupd poly))
))
(sssetfirst nil nil)
(if (< 0 arcgen) (princ (strcat "\n" (itoa arcgen) "ARC" (if (= 1 arcgen)
" was" "s were")
"converted to " (if (= 1 arcgen) "a
PLINE" "PLINEs"))))
(command "undo" "e")
(princ))
(princ)
Solved! Go to Solution.