Jump to content

Recommended Posts

Posted

I need help to modify this lisp. Credit to the author, my friend just gave this to me.

 

What it does is Select multiple Polylines and creates a table of all the selected polylines showing its Layer name and total Length,

My issue is that our drawings are in millimeter. Can somebody help me to modify the lisp and change the total length in the table to Meters

If we can add a polyline with the layer color in another column of the table, that would be a great addition but not necessary.

 

Here is the lisp : 

 

(defun C:LAYLENGTH ( / *error* acdoc ss p i e a d l) (vl-load-com)
  (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark acdoc)

  (defun *error* (msg)
    (and
      msg
      (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*,*EXIT*"))
      (princ (strcat "\nError: " msg))
    )
    (if
      (= 8 (logand (getvar 'undoctl) 8))
      (vla-endundomark acdoc)
    )
    (princ)
    )
  
  (if
    (and
      (setq ss (ssget ":L" '((0 . "LINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE,ELLIPSE,SPLINE"))))
      (setq p (getpoint "\nTable scale depend on annotation scale.\nSpecify table insert point: "))
      )
    (progn
      (repeat
        (setq i (sslength ss))
        (setq e (ssname ss (setq i (1- i)))
              a (cdr (assoc 8 (entget e)))
              d (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
        )
        (if
          (setq o (assoc a l))
          (setq l (subst (list a (+ (cadr o) d)) o l))
          (setq l (cons (list a d) l))
        )
      )
      (setq l (vl-sort l '(lambda (a b) (< (car a) (car b)))))
      (insert_table l p)
      )
    )
  (*error* nil)
  (princ)
  )

(defun insert_table (lst pct / tab row col ht i n space)
  (setq space (vlax-get acDoc (if (= 1 (getvar 'cvport)) 'PaperSpace 'ModelSpace))
        ht  (/ 2.5 (cond ((getvar 'cannoscalevalue)) (1.0)))
        pct (trans pct 1 0)
        n   (trans '(1 0 0) 1 0 T)
        tab (setq tab (vla-addtable space (vlax-3d-point pct) (+ 2 (length lst)) (length (car lst)) (* 2.5 ht) ht))
        )
  (vlax-put tab 'direction n)
  
  (mapcar
    (function
      (lambda (rowType)
        (vla-SetTextStyle  tab rowType (getvar 'textstyle))
        (vla-SetTextHeight tab rowType ht)
      )
    )
   '(2 4 1)
  )
  
  (vla-put-HorzCellMargin tab (* 0.14 ht))
  (vla-put-VertCellMargin tab (* 0.14 ht))

  (setq lst (cons (mapcar '(lambda (a) (strcat "Col" (itoa (1+ (vl-position a (car lst)))))) (car lst)) lst))

  (setq i 0)
  (foreach col (apply 'mapcar (cons 'list lst))
    (vla-SetColumnWidth tab i
      (apply
        'max
        (mapcar
          '(lambda (x)
             ((lambda (txb) (+ (abs (- (caadr txb) (caar txb))) (* 2.0 ht)))
              (textbox (list (cons 1 (vl-princ-to-string x)) (cons 7 (getvar 'textstyle)) (cons 40 ht)))
              )
             )
          col
          )
        )
      )
    (setq i (1+ i))
    )
  
  (setq lst (cons '("TITLE") lst))
  
  (setq row 0)
  (foreach r lst
    (setq col 0)
    (vla-SetRowHeight tab row (* 1.5 ht))
    (foreach c r
      (vla-SetText tab row col (if (numberp c) (rtos c) (vl-princ-to-string c)))
      (setq col (1+ col))
      )
    (setq row (1+ row))
    )
  )

 

Posted

Divide c by 1000 when its a number. replace the last part of the lisp.

 

  (foreach r lst
    (setq col 0)
    (vla-SetRowHeight tab row (* 1.5 ht))
    (foreach c r
      (vla-SetText tab row col 
        (if (numberp c) 
          (rtos (/ c 1000) 2 3)  ;change 3 to show that many decimal places
          (vl-princ-to-string c)
        )
      )
      (setq col (1+ col))
    )
    (setq row (1+ row))
  )
)

 

 

  • Like 2
Posted (edited)
12 hours ago, mhupp said:

Divide c by 1000 when its a number. replace the last part of the lisp.

 

  (foreach r lst
    (setq col 0)
    (vla-SetRowHeight tab row (* 1.5 ht))
    (foreach c r
      (vla-SetText tab row col 
        (if (numberp c) 
          (rtos (/ c 1000) 2 3)  ;change 3 to show that many decimal places
          (vl-princ-to-string c)
        )
      )
      (setq col (1+ col))
    )
    (setq row (1+ row))
  )
)

 

 

 

 

Thank you so much...

 

I want to do the same to this lisp...Making tables by giving height to polylines - AutoLISP, Visual LISP & DCL - AutoCAD Forums (cadtutor.net)

Edited by CAD_Noob
Posted
13 hours ago, mhupp said:

Divide c by 1000 when its a number. replace the last part of the lisp.

 

  (foreach r lst
    (setq col 0)
    (vla-SetRowHeight tab row (* 1.5 ht))
    (foreach c r
      (vla-SetText tab row col 
        (if (numberp c) 
          (rtos (/ c 1000) 2 3)  ;change 3 to show that many decimal places
          (vl-princ-to-string c)
        )
      )
      (setq col (1+ col))
    )
    (setq row (1+ row))
  )
)

 

 

 

Can i ask for one more? How do i change the Title in the table to match with the drawing filename without the .dwg extension?

Posted (edited)
2 hours ago, CAD_Noob said:

 

Can i ask for one more? How do i change the Title in the table to match with the drawing filename without the .dwg extension?

 

 

(setq lst (cons '("TITLE") lst)) ;replace this line
(setq lst (cons (vl-filename-base (getvar 'dwgname)) lst)) ;with this

 

--edit

also near the end

Edited by mhupp
  • Like 1
Posted
1 hour ago, mhupp said:

 

 

(setq lst (cons '("TITLE") lst)) ;replace this line
(setq lst (cons (vl-filename-base (getvar 'dwgname)) lst)) ;with this

 

--edit

also near the end

 

Thank you so much... 

I only put getvar 'dwgname it doesn't work hehehe.

 

 

 

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...