polyline coordinates to excel list with numbering

polyline coordinates to excel list with numbering

shaniyakovBYJDJ
Community Visitor Community Visitor
1,882 Views
15 Replies
Message 1 of 16

polyline coordinates to excel list with numbering

shaniyakovBYJDJ
Community Visitor
Community Visitor

hi,

i am using lee mac 'poly info' lisp, the lisp create a table of coordintes of a polyline.

how can i add automaticly the numbering on the polyline like the picture attached?

 

1636994283_cadtutor.jpg.708d099f11db2ef03c5ee2dd98d56026.jpg

 

here is lee mac code:

PolyInfoV1-3.lsp © 2023 Lee Mac
DarkLightVLIDE
;;---------------------=={ Polyline Information }==---------------------;;
;;                                                                      ;;
;;  This program provides the user with detailed information about      ;;
;;  every segment of a selected polyline in the form of either an       ;;
;;  AutoCAD Table (if available), Text file, or CSV file.               ;;
;;                                                                      ;;
;;  Upon calling the program with the command syntax 'polyinfo' at the  ;;
;;  AutoCAD command-line, the user is prompted to select an LWPolyline  ;;
;;  to be queried from the active drawing. At this prompt the user      ;;
;;  also has the option to choose the form of output for the            ;;
;;  information harvested by the program; this output format will be    ;;
;;  remembered between drawing sessions to enable streamlined repeated  ;;
;;  program usage.                                                      ;;
;;                                                                      ;;
;;  The program will output LWPolyline segment data to either an        ;;
;;  AutoCAD Table Object created in the active drawing (if such object  ;;
;;  is available in the version of AutoCAD in which the program is      ;;
;;  being executed), or a tab-delimited Text file or CSV file           ;;
;;  automatically created (streamlining the program to minimise         ;;
;;  prompts) in the working directory of the active drawing.            ;;
;;                                                                      ;;
;;  For every segment of the selected LWPolyline, the program will      ;;
;;  extract the following information:                                  ;;
;;                                                                      ;;
;;      • Segment Number                                                ;;
;;      • Segment Start Vertex Coordinate                               ;;
;;      • Segment End Vertex Coordinate                                 ;;
;;      • Segment Start Width                                           ;;
;;      • Segment End Width                                             ;;
;;      • Segment Length                                                ;;
;;      • Arc Centre (if arc segment)                                   ;;
;;      • Arc Radius (if arc segment)                                   ;;
;;                                                                      ;;
;;----------------------------------------------------------------------;;
;;  Author:  Lee Mac, Copyright © 2014  -  www.lee-mac.com              ;;
;;----------------------------------------------------------------------;;
;;  Version 1.0    -    2012-07-10                                      ;;
;;                                                                      ;;
;;  - First release.                                                    ;;
;;----------------------------------------------------------------------;;
;;  Version 1.1    -    2012-07-16                                      ;;
;;                                                                      ;;
;;  - Added Table & Text file output options.                           ;;
;;  - Removed basic LWPolyline properties.                              ;;
;;----------------------------------------------------------------------;;
;;  Version 1.2    -    2014-06-14                                      ;;
;;                                                                      ;;
;;  - Fixed bug causing final segment to be omitted from output data    ;;
;;    when processing closed polylines.                                 ;;
;;----------------------------------------------------------------------;;
;;  Version 1.3    -    2015-04-13                                      ;;
;;                                                                      ;;
;;  - Fixed bug causing the program to crash when processing polylines  ;;
;;    containing arc segments.                                          ;;
;;----------------------------------------------------------------------;;
 
(defun c:polyinfo ( / *error* ent enx flg ins lst out seg tmp )
 
    (defun *error* ( msg )
        (LM:endundo (LM:acdoc))
        (if (= 'str (type out)) (setenv "LMac\\PolyInfo" out))
        (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
            (princ (strcat "\nError: " msg))
        )
        (princ)
    )
   
    (if (null (setq out (getenv "LMac\\PolyInfo")))
        (setq out "TXT")
    )
    (princ
        (strcat "\nOutput Format: "
            (cond
                (   (= out "TXT") "Text File")
                (   (= out "CSV") "CSV File")
                (   "AutoCAD Table"   )
            )
        )
    )
 
    (while
        (progn
            (setvar 'errno 0)
            (initget "Output")
            (setq ent (entsel "\nSelect polyline [Output]: "))
            (cond
                (   (= 7 (getvar 'errno))
                    (princ "\nMissed, try again.")
                )
                (   (null ent)
                    nil
                )
                (   (= "Output" ent)
                    (polyinfo:chooseoutput  'out)
                    (setenv "LMac\\PolyInfo" out)
                    (princ
                        (strcat "\nOutput Format: "
                            (cond
                                (   (= out "TXT") "Text File")
                                (   (= out "CSV") "CSV File")
                                (   "AutoCAD Table"   )
                            )
                        )
                    )
                )
                (   (/= "LWPOLYLINE" (cdr (assoc 0 (entget (setq ent (car ent))))))
                    (princ "\nSelected object is not an LWPolyline.")
                )
            )
        )
    )
    (cond
        (   (and
                (= 'ename (type ent))
                (= "Table" out)
                (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (getvar 'clayer))))))
            )
            (princ "\nCurrent layer locked.")
        )
        (   (= 'ename (type ent))
            (setq seg 0
                  enx (entget ent)
                  lst (LM:lwvertices enx)
                  lst
                (cons
                    (append '("SEG." "START X" "START Y" "END X" "END Y" "WIDTH 1" "WIDTH 2" "LENGTH")
                        (if (setq flg (vl-some '(lambda ( x ) (not (zerop (cdr (assoc 42 x))))) lst))
                           '("CENTRE X" "CENTRE Y" "RADIUS")
                        )
                    )
                    (mapcar
                        (function
                            (lambda ( l1 l2 / b p q )
                                (setq p (cdr (assoc 10 l1))
                                      q (cdr (assoc 10 l2))
                                      b (cdr (assoc 42 l1))
                                )
                                (append
                                    (list (itoa (setq seg (1+ seg))))
                                    (mapcar 'rtos p)
                                    (mapcar 'rtos q)
                                    (list
                                        (rtos (cdr (assoc 40 l1)))
                                        (rtos (cdr (assoc 41 l1)))
                                    )
                                    (if (zerop b)
                                        (cons (rtos (distance p q)) (if flg '("" "" "")))
                                        (append
                                            (list (rtos (abs (* (LM:bulgeradius p q b) (atan b) 4))))
                                            (mapcar 'rtos (LM:bulgecentre p q b))
                                            (list (rtos (LM:bulgeradius p q b)))
                                        )
                                    )
                                )
                            )
                        )
                        lst
                        (if (= 1 (logand 1 (cdr (assoc 70 enx))))
                            (append (cdr lst) (list (car lst)))
                            (cdr lst)
                        )
                    )
                )
            )
            (cond
                (   (= out "TXT")
                    (if (LM:writetxt lst (setq tmp (vl-filename-mktemp (cdr (assoc 5 enx)) (getvar 'dwgprefix) ".txt")))
                        (startapp "explorer" tmp)
                    )
                )
                (   (= out "CSV")
                    (if (LM:writecsv lst (setq tmp (vl-filename-mktemp (cdr (assoc 5 enx)) (getvar 'dwgprefix) ".csv")))
                        (startapp "explorer" tmp)
                    )
                )
                (   (setq ins (getpoint "\nSpecify point for table: "))
                    (LM:startundo (LM:acdoc))
                    (LM:addtable  (vlax-get-property (LM:acdoc) (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace)) (trans ins 1 0) nil lst nil)
                    (LM:endundo   (LM:acdoc))
                )
            )
        )
    )
    (princ)
)
 
;; Add Table  -  Lee Mac
;; Generates a table at the given point, populated with the given data and optional title.
;; spc - [vla] VLA Block object
;; ins - [lst] WCS insertion point for table
;; ttl - [str] [Optional] Table title
;; lst - [lst] Matrix list of table cell data
;; eqc - [bol] If T, columns are of equal width
;; Returns: [vla] VLA Table Object
 
(defun LM:addtable ( spc ins ttl lst eqc / dif hgt i j obj stn sty wid )
    (setq sty
        (vlax-ename->vla-object
            (cdr
                (assoc -1
                    (dictsearch (cdr (assoc -1 (dictsearch (namedobjdict) "acad_tablestyle")))
                        (getvar 'ctablestyle)
                    )
                )
            )
        )
    )
    (setq hgt (vla-gettextheight sty acdatarow))
    (if (LM:annotative-p (setq stn (vla-gettextstyle sty acdatarow)))
        (setq hgt (/ hgt (cond ((getvar 'cannoscalevalue)) (1.0))))
    )
    (setq wid
        (mapcar
           '(lambda ( col )
                (apply 'max
                    (mapcar
                       '(lambda ( str )
                            (   (lambda ( box ) (if box (+ (* 2.5 hgt) (- (caadr box) (caar box))) 0.0))
                                (textbox
                                    (list
                                        (cons 01 str)
                                        (cons 40 hgt)
                                        (cons 07 stn)
                                    )
                                )
                            )
                        )
                        col
                    )
                )
            )
            (apply 'mapcar (cons 'list lst))
        )
    )
    (if 
        (and ttl
            (< 0.0
                (setq dif
                    (/
                        (-
                            (   (lambda ( box ) (if box (+ (* 2.5 hgt) (- (caadr box) (caar box))) 0.0))
                                (textbox
                                    (list
                                        (cons 01 ttl)
                                        (cons 40 hgt)
                                        (cons 07 stn)
                                    )
                                )
                            )
                            (apply '+ wid)
                        )
                        (length wid)
                    )
                )
            )
        )
        (setq wid (mapcar '(lambda ( x ) (+ x dif)) wid))
    )
    (setq obj
        (vla-addtable spc
            (vlax-3D-point ins)
            (1+ (length lst))
            (length (car lst))
            (* 2.0 hgt)
            (if eqc
                (apply 'max wid)
                (/ (apply '+ wid) (float (length (car lst))))
            )
        )
    )
    (vla-put-regeneratetablesuppressed obj :vlax-true)
    (vla-put-stylename obj (getvar 'ctablestyle))
    (setq i -1)
    (if (null eqc)
        (foreach col wid
            (vla-setcolumnwidth obj (setq i (1+ i)) col)
        )
    )
    (if ttl
        (progn
            (vla-settext obj 0 0 ttl)
            (setq i 1)
        )
        (progn
            (vla-deleterows obj 0 1)
            (setq i 0)
        )
    )
    (foreach row lst
        (setq j 0)
        (foreach val row
            (vla-settext obj i j val)
            (setq j (1+ j))
        )
        (setq i (1+ i))
    )
    (vla-put-regeneratetablesuppressed obj :vlax-false)
    obj
)
 
;; Write CSV  -  Lee Mac
;; Writes a matrix list of cell values to a CSV file.
;; lst - [lst] list of lists, sublist is row of cell values
;; csv - [str] filename of CSV file to write
;; Returns T if successful, else nil
 
(defun LM:writecsv ( lst csv / des sep )
    (if (setq des (open csv "w"))
        (progn
            (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (",")))
            (foreach row lst (write-line (LM:lst->csv row sep) des))
            (close des)
            t
        )
    )
)
 
;; List -> CSV  -  Lee Mac
;; Concatenates a row of cell values to be written to a CSV file.
;; lst - [lst] list containing row of CSV cell values
;; sep - [str] CSV separator token
 
(defun LM:lst->csv ( lst sep )
    (if (cdr lst)
        (strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
        (LM:csv-addquotes (car lst) sep)
    )
)
 
(defun LM:csv-addquotes ( str sep / pos )
    (cond
        (   (wcmatch str (strcat "*[`" sep "\"]*"))
            (setq pos 0)    
            (while (setq pos (vl-string-position 34 str pos))
                (setq str (vl-string-subst "\"\"" "\"" str pos)
                      pos (+ pos 2)
                )
            )
            (strcat "\"" str "\"")
        )
        (   str   )
    )
)
 
;; Write Text File  -  Lee Mac
;; Writes a matrix of values to a tab-delimited Text file.
;; lst - [lst] list of lists, sublist is line of text values
;; txt - [str] filename of Text file to write
;; Returns T if successful, else nil
 
(defun LM:writetxt ( lst txt / des )
    (if (setq des (open txt "w"))
        (progn
            (foreach itm lst (write-line (LM:lst->str itm "\t") des))
            (close des)
            t
        )
    )
)
 
;; List to String  -  Lee Mac
;; Concatenates each string in a supplied list, separated by a given delimiter
;; lst - [lst] List of strings to concatenate
;; del - [str] Delimiter string to separate each item
 
(defun LM:lst->str ( lst del )
    (if (cdr lst)
        (strcat (car lst) del (LM:lst->str (cdr lst) del))
        (car lst)
    )
)
 
;; Annotative-p  -  Lee Mac
;; Predicate function to determine whether a Text Style is annotative.
;; sty - [str] Name of Text Style
 
(defun LM:annotative-p ( sty )
    (and (setq sty (tblobjname "style" sty))
         (setq sty (cadr (assoc -3 (entget sty '("AcadAnnotative")))))
         (= 1 (cdr (assoc 1070 (reverse sty))))
    )
)
 
;; LW Vertices  -  Lee Mac
;; Returns a list of lists in which each sublist describes
;; the position, starting width, ending width and bulge of the
;; vertex of a supplied LWPolyline
 
(defun LM:lwvertices ( e )
    (if (setq e (member (assoc 10 e) e))
        (cons
            (list
                (assoc 10 e)
                (assoc 40 e)
                (assoc 41 e)
                (assoc 42 e)
            )
            (LM:lwvertices (cdr e))
        )
    )
)
 
;; Bulge Radius  -  Lee Mac
;; p1 - start vertex
;; p2 - end vertex
;; b  - bulge
;; Returns the radius of the arc described by the given bulge and vertices
 
(defun LM:bulgeradius ( p1 p2 b )
    (/ (* (distance p1 p2) (1+ (* b b))) 4 (abs b))
)
 
;; Bulge Centre  -  Lee Mac
;; p1 - start vertex
;; p2 - end vertex
;; b  - bulge
;; Returns the centre of the arc described by the given bulge and vertices
 
(defun LM:bulgecentre ( p1 p2 b )
    (polar p1
        (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
        (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
    )
)
 
;; Start Undo  -  Lee Mac
;; Opens an Undo Group.
 
(defun LM:startundo ( doc )
    (LM:endundo doc)
    (vla-startundomark doc)
)
 
;; End Undo  -  Lee Mac
;; Closes an Undo Group.
 
(defun LM:endundo ( doc )
    (while (= 8 (logand 8 (getvar 'undoctl)))
        (vla-endundomark doc)
    )
)
 
;; Active Document  -  Lee Mac
;; Returns the VLA Active Document Object
 
(defun LM:acdoc nil
    (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
    (LM:acdoc)
)
 
(vl-load-com)
(eval
    (append
        (list 'defun 'polyinfo:chooseoutput '( sym ))
        (if (vlax-method-applicable-p (vla-get-modelspace (LM:acdoc)) 'addtable)
            (list
               '(initget "Table TXT CSV")
               '(set sym (cond ((getkword (strcat "\nChoose Output [Table/TXT/CSV] <" (eval sym) ">: "))) ((eval sym))))
            )
            (list
               '(initget "TXT CSV")
               '(set sym (cond ((getkword (strcat "\nChoose Output [TXT/CSV] <" (eval sym) ">: "))) ((eval sym))))
            )
        )
    )
)
 
(princ
    (strcat
        "\n:: PolyInfo.lsp | Version 1.3 | \\U+00A9 Lee Mac "
        (menucmd "m=$(edtime,0,yyyy)")
        " www.lee-mac.com ::"
        "\n:: Type \"polyinfo\" to Invoke ::"
    )
)
(princ)
 
;;----------------------------------------------------------------------;;
;;                             End of File                              ;;
;;----------------------------------------------------------------------;;

 

0 Likes
1,883 Views
15 Replies
Replies (15)
Message 2 of 16

Automohan
Advocate
Advocate

Welcome to Autodesk Community !

Polyline Vertex Numbering . . . 

Try this link  !

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/label-polyline-vertex-text-numbering... 

 

Polyline coordinate to Excel

Choose Output "CSV" on the Polyinfo.lsp

Polyinfo.png

"Save Energy"
Did you find this reply helpful? If so please use the Accept as Solution
Message 3 of 16

shaniyakovBYJDJ
Community Visitor
Community Visitor

thank you

this is a great lisp.

is there a way to combine them into one lisp?

so when i enter a command and it will do both lisp together

0 Likes
Message 4 of 16

Automohan
Advocate
Advocate

Choose a name for your second lisp, as i choose example: "polyverexnum"

 

(defun c:mywork ()
 (c:polyinfo)
 (c:polyvertexnum) (princ))

After loading all three routine, just type mywork.

"Save Energy"
Did you find this reply helpful? If so please use the Accept as Solution
0 Likes
Message 5 of 16

Sea-Haven
Mentor
Mentor

My $0.05 demand load Lee's and the other program as required.

 

 

(defun c:mywork ()
(if (not polyinfo)(load "PolyInfoV1-3"))
(c:polyinfo)
(if (not polyvertexnum)(load "polyvertexnum"))
(c:polyvertexnum)
(princ)

 

Message 6 of 16

neam
Collaborator
Collaborator

Hi everyone

how to update polyinfo table with new vertex numbering?????

0 Likes
Message 7 of 16

neam
Collaborator
Collaborator
how to update polyinfo table with new vertex numbering?????
0 Likes
Message 8 of 16

Sea-Haven
Mentor
Mentor

Do a google there will be a label vertices and make a table somewhere out there I think it can be simpler that Lee's code which does more options.

 

 

 

(setq plent (entsel "\nPick pline"))
(if plent (setq co-ord (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car plent))))))

 

 

So this gets the vertices so just add text at each vertex point. 2nd step is make a table using the co-ord points. 

0 Likes
Message 9 of 16

CADaSchtroumpf
Advisor
Advisor

@neam  a écrit :

Hi everyone

how to update polyinfo table with new vertex numbering?????


If you are interested see this post.
If it suits you, you can translate the messages.
Numbering and table are in a single layer, easy to erase and start again!
Manually reset the n_next variable to nil if you want to resume incrementing.

0 Likes
Message 10 of 16

neam
Collaborator
Collaborator

Hi dear Schtroumpf:

Thank you for your attention.

Your program is excellent, like always.

I used the ASMI (TABCORD.lsp) program and made some changes to it for my own work.
But unfortunately, it miscalculates the coordinates of some arc centers.

But most likely the problem is with my file.

Thanks so much from ASMI, I am attaching both the sample file and the original source code of the ASMI program as well as its modified version.

 

Is it possible change your program(num-vertex_pl2Table.lsp) so that:

1) the numbering of the points should be prefixed by name and number for example: P1............Pn
2) to add the coordinates and radius of the arc.
3) numbering center point of arc like this: C1...............Cn

I will be very grateful if you can solve my problem.

0 Likes
Message 11 of 16

CADaSchtroumpf
Advisor
Advisor

And with this modications can be good?

Message 12 of 16

neam
Collaborator
Collaborator

excellent 👍👍👍

Thank you very much for taking the time to solve my problem.

0 Likes
Message 13 of 16

Sea-Haven
Mentor
Mentor

Accidently posted now where is remove.

 

0 Likes
Message 14 of 16

sigmmadesigner
Advocate
Advocate

IT IS POSSIBLE TO ADJUST THE LSP TO DETAIL LIKE THE TABLE, AND AT THE END EXPORT IN WORD

0 Likes
Message 15 of 16

Sea-Haven
Mentor
Mentor

AND AT THE END EXPORT IN WORD.

 

The code appears to just make a text file not actually send to Word. 

 

You can use the Application method to open Word or Excel and talk direct to that document.

 

(or (setq myxl (vlax-get-object "Excel.Application"))
    (setq myxl (vlax-get-or-create-object "excel.Application"))
)


(or (setq myword (vlax-get-object "Word.Application"))
    (setq myword (vlax-get-or-create-object "Word.Application"))
)
0 Likes
Message 16 of 16

sigmmadesigner
Advocate
Advocate

I WILL TRY TO MAKE A LINK WITH THE INFORMATION COLLECTED IN THE POLYGONAL AND MAKE A DESCRIPTIVE MEMORIAL

(setq TITLE " MEMORIAL DESCRIPTION")
(setq Introduction " start this memorial at point")
(setq point_TO_ point" ,and from this point continue to point ")
(setq textDistance " , and a distance of"
(setq Final_point " thus ending the perimeter at the starting point of the survey)
(setq final_text ( All areas and perimeters were calculated in the UTM plane.)

================== exported to word
DESCRIPTIVE MEMORIAL

this memorial begins at point P0001 with coordinate N=10000,000m E= 5000,000m, and from this point it continues to point P0002, with coordinate N=10500,000m 6= 5000,000m, and a distance of X meters, to the point P0003 with coordinate N=10600,000m 6= 7500,000, and a distance of X meters, thus ending the perimeter at the starting point of the survey.
All areas and perimeters were calculated in UTM plane

0 Likes