Jump to content

Recommended Posts

Posted (edited)

Hi all,

 

I found this LISP routine by Tony Hotchkiss from here.

 

If I understood this correct, it works with LWPolyline, Polyline and Point. For some reason it does not work will all polylines on my drawing. The sample drawing is provided below and attached with this thread

https://drive.google.com/file/d/1bLurrxbnH6c9Fee5L4qIc0okwdVU0b9W/view?usp=sharing

 

 


(defun vert (/		 filterlist  vla-obj-list
     lwlist	 2dlist	     ptlist	 vlist1
     vlist2	 vlist3
    )
 (vl-load-com)
 (setq	filterlist   (make-filter)
vla-obj-list (get-objects filterlist)
lwlist	     (nth 0 vla-obj-list)
2dlist	     (nth 1 vla-obj-list)
ptlist	     (nth 2 vla-obj-list)
vlist1	     nil
vlist2	     nil
vlist3	     nil
 ) ;_ end-of setq
 (if lwlist
   (setq vlist1 (make-list lwlist 2))
 ) ;_ end of if
 (if 2dlist
   (setq vlist2 (make-list 2dlist 3))
 ) ;_ end of if
 (if ptlist
   (setq vlist3 (make-list ptlist 3))
 ) ;_ end of if
 (write-text vlist1 vlist2 vlist3)
 (princ)
) ;_ end of vert

(defun make-list (p-list n / i vlist obj coords ca j x y z xy)
 (setq	i (- 1)
vlist nil
 ) ;_ end of setq
 (repeat (length p-list)
   (setq obj	 (nth (setq i (1+ i)) p-list)
  coords (vlax-get-property obj "coordinates")
  ca	 (vlax-variant-value coords)
  j	 (- 1)
   ) ;_ end-of setq
   (repeat (/ (length (vlax-safearray->list ca)) n)
     (setq x (vlax-safearray-get-element ca (setq j (1+ j))))
     (setq y (vlax-safearray-get-element ca (setq j (1+ j))))
     (if (= n 2)
(setq xy (list x y))
(progn
  (setq z (vlax-safearray-get-element ca (setq j (1+ j))))
  (setq xy (list x y z))
) ;_ end of progn
     ) ;_ end of if
     (setq vlist (append vlist (list xy)))
   ) ;_ end-of repeat
 ) ;_ end-of repeat
) ;_ end-of make-list

(defun make-filter (/ filter)
 (setq	filter '((-4 . "<OR")
	 (0 . "LWPOLYLINE")
	 (0 . "POLYLINE")
	 (0 . "POINT")
	 (-4 . "OR>")
	)
 ) ;_ end of setq
) ;_ end of make-filter

(defun get-objects (filter  /	    ss	    k	    lwp-list
	    2dp-list	    pt-list no-ent  obj	    pl
	    2d	    pt
	   )
 (setq no-ent 1)
 (while no-ent
   (setq ss	   (ssget filter)
  k	   (- 1)
  lwp-list nil
  2dp-list nil
  pt-list  nil
  obj	   nil
  pl	   "AcDbPolyline"
  2d	   "AcDb2dPolyline"
  pt	   "AcDbPoint"
   ) ;_ end-of setq
   (if	ss
     (progn
(setq no-ent nil)
(repeat	(sslength ss)
  (setq	ent (ssname ss (setq k (1+ k)))
	obj (vlax-ename->vla-object ent)
  ) ;_ end-of setq
  (cond
    ((= (vlax-get-property obj "ObjectName") pl)
     (setq lwp-list (append lwp-list (list obj)))
    )
    ((= (vlax-get-property obj "ObjectName") 2d)
     (setq 2dp-list (append 2dp-list (list obj)))
    )
    ((= (vlax-get-property obj "ObjectName") pt)
     (setq pt-list (append pt-list (list obj)))
    )
  ) ;_ end-of cond
) ;_ end-of repeat
     ) ;_ end-of progn
     (prompt "\nNo polylines or points selected, try again.")
   ) ;_ end-of if
 ) ;_ end-of while
 (list lwp-list 2dp-list pt-list)
) ;_ end-of get-objects

(defun write-text (vl1 vl2 vl3)
 (setq	fn (getfiled "Text File" "" "txt" 1)) 
 (setq f (close (open fn "w")))
 (setq msg "Points from LW-Polylines")
 (do-points fn vl1 msg 2)
 (setq msg "Points from 2d-Polylines")
 (do-points fn vl2 msg 3)
 (setq msg "Points from Point entities")
 (do-points fn vl3 msg 3)
 (princ)
) ;_ end of write-text

(defun do-points (fn vl msg n)
 (setq f (open fn "a"))
 (write-line msg f)
 (write-line "  x,  y,  z" f)
 (write-line "" f)
 (foreach point vl
   (setq x (nth 0 point)
  y (nth 1 point)
   ) ;_ end of setq
   (if	(= n 2)
     (setq str (strcat (rtos x) "," (rtos y)))
     (progn
(setq z (nth 2 point))
(setq str (strcat (rtos x) "," (rtos y) "," (rtos z)))
     ) ;_ end of progn
   ) ;_ end of if
   (write-line str f)
 ) ;_ end of foreach
 (setq f (close f))
 (princ)
) ;_ end of defun

(defun c:pts ()
 (vert)
 (princ)
) ;_ end-of defun

(prompt "PLIST.LSP by Tony Hotchkiss - enter PTS to start ")

 

I am new in AutoLISP so I would appreciate if you could suggest me how this code can be modified to export all the coordinates of polylines for my sample drawing. Or maybe my drawing can be modified using another LISP routine.

 

In addition, I want the program to output two files. The first file would be the XY coordinates of all points of the polylines with number (kind of identification).

For example,

 

Node X Y

1 359.663 162.816

2 358.596 163.075

3 358.481 163.08

4 358.379 163.045

5 358.305 162.987

6 358.234 162.857

7 355.779 153.074

8 355.753 152.623

9 355.753 152.247

10 355.804 151.921

 

The second file would include the points and distances between them.

For example,

 

Node_start Node_End Distance

1 2 1.097984517

2 3 0.115108644

3 4 0.107837841

4 5 0.094021274

5 6 0.148124947

6 7 10.08633303

7 8 0.451748824

8 9 0.376

9 10 0.32996515

10 11 0.246221445

 

Thank you

Best wishes,

Jes G

 

Sample.dwg

Edited by jes_g
attached file
Posted

Can you post your drawing here? I can't access cloud sights from work.

Posted (edited)
Can you post your drawing here? I can't access cloud sights from work.

 

Thank you for your response. The drawing has been attached.

Edited by jes_g
Posted

Did you ask for this before or maybe at one of the other forums, theswamp, Augi, pretty sure seen this request previously. An answer was provided.

Posted

One issue is that drawing contains 139 lines in it and the code does not account for them.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...