Could this lisp be easily modified to work with polylines? I changed (if (= (cdr (assoc 0 (entget (car pt2)))) "LINE") (progn to (if (= (cdr (assoc 0 (entget (car pt2)))) "lwpolyLINE") (progn but now it gives me Error: bad argument type: 2D/3D point: nil.
(defun C:JL () (C:JUMPLINE))
(defun C:JUMPLINE ( / errhand rtd ocmd oosm oerr clayer d pt1 pt2 a1 a2
b p1 p2 c ang p3 p4 d1 d2 d3 d4 m e pt2a)
(defun errhand (err) ;----------------------------------------error handler
(if (/= err "Function cancelled") (princ (strcat "\nError: " err)))
(command ".LAYER" "SET" clayer "")
(setvar "OSMODE" oosm)
(setvar "CMDECHO" ocmd)
(setq *error* oerr)
(princ)
)
(defun rtd (a) (/ (* a 180.0) pi)) ;---------------------radians to degrees
(setq ocmd (getvar "CMDECHO"))
(setq oosm (getvar "OSMODE"))
(setq oerr *error*)
(setvar "CMDECHO" 0)
(setvar "OSMODE" 512) ; nearest = 512
(setq *error* errhand)
(setq clayer (getvar "CLAYER"))
(if (null *d) (setq *d "Through"))
(if (/= *d "Through") (setq d (rtos *d)) (setq d "Through"))
(initget (+ 2 4) "Through") ; no zero, negative
(setq d (getdist (strcat "\n Jumpline diameter or Through <" d ">: ")))
(if (null d) (setq d *d) (setq *d d))
(while (setq pt1 (entsel "\n Select line: "))
(if (= (cdr (assoc 0 (entget (car pt1)))) "LINE") (progn
(setq pt2 (entsel "\n Select second point: "))
(if pt2 (progn
(setq a1 (car pt1))
(setq a2 (car pt2))
(if (equal a1 a2) (progn ; same line
(setq b (entget a1))
(setq p1 (cdr (assoc 10 b)))
(setq p2 (cdr (assoc 11 b)))
(setq c (cdr (assoc 8 b)))
(command ".LAYER" "SET" c "")
(if (equal (angle p1 p2) (angle (cadr pt1) (cadr pt2)) 1.0)
(setq ang (angle p1 p2)) ; convert pick angle
(setq ang (angle p2 p1)) ; to line angle
)
(if (= *d "Through") (progn
(command ".BREAK" (cadr pt1) (cadr pt2))
(command ".ARC" (cadr pt1) "E" (cadr pt2) "D" (+ (rtd ang) 90))
) (progn
(command ".BREAK" (cadr pt1) (polar (cadr pt1) ang d))
(command ".ARC" (cadr pt1) "E" (polar (cadr pt1) ang d) "D" (+ (rtd ang) 90))
))
) (progn ; different lines
(if (= (cdr (assoc 0 (entget (car pt2)))) "LINE") (progn
(setq b (entget a1)
p1 (cdr (assoc 10 b))
p2 (cdr (assoc 11 b)))
(setq b (entget a2)
p3 (cdr (assoc 10 b))
p4 (cdr (assoc 11 b)))
(setq c (cdr (assoc 8 b)))
(command ".LAYER" "SET" c "")
(setq d1 (distance p1 p3)
d2 (distance p1 p4)
d3 (distance p2 p3)
d4 (distance p2 p4)
m (eval (list 'min d1 d2 d3 d4)))
(if (equal (angle p1 p2) (angle (cadr pt1) (cadr pt2)) 10.0)
(setq ang (angle p1 p2)) ; convert pick angle
(setq ang (angle p2 p1)) ; to line angle
)
(if (= *d "Through") (progn
(cond ((= m d1) (command ".BREAK" (cadr pt1) p1)
(command ".BREAK" (cadr pt2) p3))
((= m d2) (command ".BREAK" (cadr pt1) p1)
(command ".BREAK" (cadr pt2) p4))
((= m d3) (command ".BREAK" (cadr pt1) p2)
(command ".BREAK" (cadr pt2) p3))
((= m d4) (command ".BREAK" (cadr pt1) p2)
(command ".BREAK" (cadr pt2) p4))
)
(command ".ARC" (cadr pt1) "E" (cadr pt2) "D" (+ (rtd ang) 90))
) (progn
(cond ((= m d1) (command ".BREAK" (cadr pt1) p1)
(setq e (- *d (distance (cadr pt1) p1)))
(setq pt2a (polar p3 (angle p3 p4) e))
(command ".BREAK" pt2a p3))
((= m d2) (command ".BREAK" (cadr pt1) p1)
(setq e (- *d (distance (cadr pt1) p1)))
(setq pt2a (polar p4 (angle p4 p3) e))
(command ".BREAK" pt2a p4))
((= m d3) (command ".BREAK" (cadr pt1) p2)
(setq e (- *d (distance (cadr pt1) p2)))
(setq pt2a (polar p3 (angle p3 p4) e))
(command ".BREAK" pt2a p3))
((= m d4) (command ".BREAK" (cadr pt1) p2)
(setq e (- *d (distance (cadr pt1) p2)))
(setq pt2a (polar p4 (angle p4 p3) e))
(command ".BREAK" pt2a p4))
)
(command ".ARC" (cadr pt1) "E" pt2a "D" (+ (rtd ang) 90))
))
)
(princ "*ERROR* Must select a LINE.")
)
))
))
)
(princ "*ERROR* Must select a LINE.")
)
)
(command ".LAYER" "SET" clayer "")
(setvar "OSMODE" oosm)
(setvar "CMDECHO" ocmd)
(setq *error* oerr)
(princ)
)
;-----------------------------------------------------------------------------
Thanks,
Ron