Jump to content

Get length of MLeader/QLeader spline.


Recommended Posts

Posted

Anyone have any hints on how to get Spline Leader lengths?

 

Ultimately, I am looking to make several already drawn spline leaders the same length.

Posted

As a spline gives two answers the points answer and another with nodes. So any way if you explode the Mleader then you can get at the spline using this. Just need to check that the spline is last entity, tested in Bricscad. A disclaimer not sure if length is correct. I think it is short by length of arrow. Will try to find arrow length. Yep found it.

 

(defun c:wow ( / plent pt len lenar)
  (setq plent (entsel "\nPick mleader "))
  (setq lenar (cdr (assoc 140 (entget (car plent)))))
  (command "undo" "M")
  (command "explode" (car plent))
  (setq ent (ssname (ssget "L") 0))
  (setq len (getpropertyvalue ent "length"))
  (command "undo" "B")
  (alert (strcat "Total  length is " (rtos (+ lenar len) 2 3)))
  (princ)
)
(c:wow)

 

I think you could do a "I want a length of 100 by drawing something close then move say arrow point till you get approx 100. Via lisp. It would be a two step process explode and move then undo and reset arrow head point.

 

 

 

 

 

 

  • Thanks 1
Posted
17 hours ago, 1958 said:

 

It would be nice if you could put the prompts and comments in English.

 

I saw the Dogleglength when I did a dump on a Mleader. I'll see what I come up with.

 

 

8 hours ago, BIGAL said:

As a spline gives two answers the points answer and another with nodes. So any way if you explode the Mleader then you can get at the spline using this. Just need to check that the spline is last entity, tested in Bricscad. A disclaimer not sure if length is correct. I think it is short by length of arrow. Will try to find arrow length. Yep found it.

 

(defun c:wow ( / plent pt len lenar)
  (setq plent (entsel "\nPick mleader "))
  (setq lenar (cdr (assoc 140 (entget (car plent)))))
  (command "undo" "M")
  (command "explode" (car plent))
  (setq ent (ssname (ssget "L") 0))
  (setq len (getpropertyvalue ent "length"))
  (command "undo" "B")
  (alert (strcat "Total  length is " (rtos (+ lenar len) 2 3)))
  (princ)
)
(c:wow)

 

I think you could do a "I want a length of 100 by drawing something close then move say arrow point till you get approx 100. Via lisp. It would be a two step process explode and move then undo and reset arrow head point.

 

 

 

 

 

 

I know how to get a Spline length, I don't want to explode the Mleaders, defeats the purpose.

Posted (edited)

The Undo un-explodes them though.  On my phone. Will have a look at the lsp tomorrow.

Edited by BIGAL
  • Like 1
Posted

But wouldn't undo change it back to original length?

 

Quote

Ultimately, I am looking to make several already drawn spline leaders the same length.

 

On 8/28/2025 at 12:45 PM, 1958 said:

 

Still looking to decipher this one, probably tomorrow when I get back to work.

Posted

As I suggested can move the vertices and return the new length or say draw something and move say the first point keep repeating till it is the length you want.

 

Will have a play.

 

  • Like 1
Posted

@SLW210

Quote

I saw the Dogleglength when I did a dump on a Mleader. I'll see what I come up with.

You are rigth this is the good direction for your ask. Try this

 

(defun c:length2lead ( / AcDoc Space ss dog_l n sel obj)
  (setq
    AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
    Space
    (if (= 1 (getvar "CVPORT"))
      (vla-get-PaperSpace AcDoc)
      (vla-get-ModelSpace AcDoc)
    )
  )
  (vla-startundomark AcDoc)
  (princ "\nSelect mleader")
  (while
    (not
      (setq ss
        (ssget
          (list
            '(0 . "MULTILEADER")
            (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
            (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
          )
        )
      )
    )
  )
  (initget 7)
  (setq dog_l (getdist (getvar "VIEWCTR") "nNew length for multileader?: "))
  (repeat (setq n (sslength ss))
    (setq
      sel (ssname ss (setq n (1- n)))
      obj (vlax-ename->vla-object sel)
    )
    (vla-put-DoglegLength obj dog_l)
    (vla-regen AcDoc acactiveviewport)
  )
  (vla-endundomark AcDoc)
  (prin1)
)

 

  • Thanks 1
Posted (edited)

I don't think dogleglength is what you want. This example is original mleader was 33 tried dogleglength at 35 can see is way to long. Like twice the length required. it was like 70+

 

image.png.b1843432ff0078148e475f80ce163594.png

 

The only way I have found is to move either the 1st or last point and can get the desired spline length, but a big but must explode and recalc the spline point and then undo and reset the mleader then its length is correct. Or within say 1e-03 etc. I have not found a way to get a length of a mleader spline. Some one else may know. The default dogleg length is in the Mleaderstyle, I have started to play with it set to 0.0 asked me it makes it easier to work out lengths.

 

Starting to look at making a spline so can easy recalc without any explodes.

 

This shows in red what I consider the spline length. Note have to add arrow size. Please confirm. Can you also post a dwg with sample mleaders. 

image.png.d7ae053a23a41f4839f410d3b1e79329.png

 

 

Edited by BIGAL
  • Like 1
Posted

I thought I posted this yesterday.

 

Yes, DOGLEGLENGTH is the landing, they should all be 0, but to make sure, it needs accounted for.

 

May need to dig into something deeper.

 

It's not a super important deal at the moment, I was just curious as to why it's so obscure for methods to manipulate Multileaders/Leaders without exploding.

 

I have no Mtext, just have some routes, and would like them to match lengths, I need the arrow to relocate, not the landing.

 

I have posted a test drawing.

 

 

For future work, drawing them to a specific length would be nice, that seems to be what 1958's LISP does, still trying to decipher it though.

 

 

P.S.

 

After some testing, ml.lsp asks to select a line and then draws an Mleader and places text for the length, best I can decipher.

 

 

MLeader Test.dwg

Posted

I think the translation to 1958's lisp is this, although not quite sure is the best

;;; Multi-length
;;; https://www.cadtutor.net/forum/profile/26931-1958/
;;; 28 august 2025
(defun c:ml (/ ent pline txt p1 p2)
 (vl-load-com)
 (while (setq pline (vlax-ename->vla-object (car (setq ent (entsel "\n indicate the line \n")))))
  (setq txt (strcat "L = " (rtos (vlax-curve-getDistAtParam pline (vlax-curve-getEndParam pline)) 2 2) " m" )
  )
  (setq p1 (vlax-curve-getClosestPointTo pline (cadr ent))
        p2 (getpoint p1 "\n insertion point >> \n")
  )
  (vl-cmdf "_mleader" p1 p2 txt)
  (setq ent (vlax-ename->vla-object (entlast)))
  (vla-put-TextHeight ent 2.00) 			; font size (height)
  (vla-put-TextJustify ent 1) 				; text alignment (1-left)
  (vla-put-TextLeftAttachmentType ent 4)	 	; append text to left
  (vla-put-TextRightAttachmentType ent 4) 		; append text to the right
;;; 0 - top of line 1
;;; 1 - middle of line 1
;;; 2 - bottom of line 1
;;; 3 - underline of line 1
;;; 4 - middle of text
;;; 5 - middle of last line
;;; 6 - bottom of last line
;;; 7 - underline of last line
;;; 8 - underline of all text
  (vla-put-DoglegLength ent 0.5) 			; shelf size (length)
;;; (vla-put-TextStyleName ent "ext til")		; change text style
 )
 (princ)
)
 ;|?Visual LISP  Format Options?
(100 1 2 2 nil " " 80 60 0 0 0 nil nil nil T)
;*** Please add text under the comments! ***|;

 

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