Author Topic: lisp modification  (Read 4358 times)

0 Members and 1 Guest are viewing this topic.

ronjonp

  • Needs a day job
  • Posts: 7526
lisp modification
« on: September 25, 2004, 03:24:07 PM »
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.

Code: [Select]
(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

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

daron

  • Guest
lisp modification
« Reply #1 on: September 25, 2004, 03:43:19 PM »
try "LWPOLYLINE" instead of "lwpline"

ronjonp

  • Needs a day job
  • Posts: 7526
lisp modification
« Reply #2 on: September 27, 2004, 01:42:11 PM »
Quote
try "LWPOLYLINE" instead of "lwpline"


This is what I have done.......but I still get:

 Error: bad argument type: 2D/3D point: nil.

Any suggestions?

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

whdjr

  • Guest
lisp modification
« Reply #3 on: September 27, 2004, 01:52:26 PM »
Yes this lisp can be modofied to accept polylines.  What exactly is this lisp supposed to do.  I mean no disrespect when I say this, but the code takes so many assumptions that I wasn't sure what it was doing when I tried to run it.

I good explaination would be nice.

SpeedCAD

  • Guest
lisp modification
« Reply #4 on: September 27, 2004, 01:57:58 PM »
Quote from: ronjonp
Quote
try "LWPOLYLINE" instead of "lwpline"


This is what I have done.......but I still get:

 Error: bad argument type: 2D/3D point: nil.

Any suggestions?


Hi...

The error is here:
Code: [Select]
(setq p2 (cdr (assoc 11 b)))
The LWPOLYLINE don't have code 11 only 10...

ronjonp

  • Needs a day job
  • Posts: 7526
lisp modification
« Reply #5 on: September 27, 2004, 06:25:51 PM »
Quote
I good explaination would be nice.


It makes a line "hop" over another. Two points are picked on the line setting the width of the hop (arc). Then the line is proken and the arc is drawn in between the break.

Ron

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

ronjonp

  • Needs a day job
  • Posts: 7526
lisp modification
« Reply #6 on: September 27, 2004, 06:43:54 PM »
Did a little research....looks like a lwpline doesn't have a start and end point group code

Code: [Select]
LWPOLYLINE
72 Has bulge flag
73 Is closed flag
93 Number of polyline vertices
10 Vertex location (in OCS)
DXF: X value; APP: 2D point (multiple entries)
20 DXF: Y value of vertex location (in OCS) (multiple entries)
42 Bulge (optional, default = 0)
LINE
Group codes Description
10 Start point (in OCS)
DXF: X value; APP: 2D point
20 DXF: Y value of start point (in OCS)
11 End point (in OCS)
DXF: X value; APP: 2D point
21 DXF: Y value of end point (in OCS)

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

SMadsen

  • Guest
lisp modification
« Reply #7 on: September 28, 2004, 02:56:52 AM »
Ron
Which version are you working with?

ronjonp

  • Needs a day job
  • Posts: 7526
lisp modification
« Reply #8 on: September 28, 2004, 09:42:21 AM »
Quote
Ron
Which version are you working with?


AutoCAD 2005.

Ron

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

SpeedCAD

  • Guest
lisp modification
« Reply #9 on: September 28, 2004, 11:31:16 AM »
Quote from: ronjonp
Did a little research....looks like a lwpline doesn't have a start and end point group code


Hi...

You need get the start point and end point of a lwpolyline????

ronjonp

  • Needs a day job
  • Posts: 7526
lisp modification
« Reply #10 on: September 28, 2004, 12:09:35 PM »
Quote
You need get the start point and end point of a lwpolyline????


It seems that way.... Need to have two points to get the correct angle to insert the arc (my understanding anyway).

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

daron

  • Guest
lisp modification
« Reply #11 on: September 28, 2004, 01:04:21 PM »
or two points and a bulge factor, if I remember correctly.