Hello,
I am trying to create a lisp routine that sets all existing MLEADERs to a certain pre-set MLEADERSTYLE, the equivalent of doing a Quick Select for Mleaders, and setting the style under the properties window.
I was able to write a similar routine that selects all dimensions and sets them to a certain DIMSTYLE, using entmod and DXF code 3 for dimstyle. So far, I have not been able to find a group code for MLEADERSTYLE
Any help would be greatly appreciated!
(defun C:dimstylechange (/ ENTITIES NO_OF_ENTITIES SSPOSITION ENTITY_NAME
OLD_ENTLIST NEW_STYLE NEW_ENTLIST)
(setvar "CMDECHO" 0)
(setq ENTITIES (ssget "X" '((0 . "DIMENSION"))))
(setq NO_OF_ENTITIES (sslength ENTITIES))
(setq SSPOSITION 0)
(repeat NO_OF_ENTITIES
;***CHANGE STYLE***
(setq ENTITY_NAME (ssname ENTITIES SSPOSITION))
(setq OLD_ENTLIST (entget ENTITY_NAME))
(setq OLD_STYLE (assoc 3 OLD_ENTLIST))
(setq NEW_STYLE (cons 3 "BCR 11x17"))
(setq NEW_ENTLIST (subst NEW_STYLE OLD_STYLE OLD_ENTLIST))
(entmod NEW_ENTLIST)
;***CHANGE LAYER***
(setq OLD_ENTLIST (entget ENTITY_NAME))
(setq OLD_STYLE (assoc 8 OLD_ENTLIST))
(setq NEW_STYLE (cons 8 "DIM"))
(setq NEW_ENTLIST (subst NEW_STYLE OLD_STYLE OLD_ENTLIST))
(entmod NEW_ENTLIST)
(setq SSPOSITION (1+ SSPOSITION))
)
(command ".CHPROP" ENTITIES "" "C" "BYLAYER" "LT" "BYLAYER" "")
(princ (strcat "\n..." (rtos NO_OF_ENTITIES 2 0) " Dimension(s) changed..."))
(setvar "CMDECHO" 1)
(princ)
)
@Anonymous wrote:.... So far, I have not been able to find a group code for MLEADERSTYLE
....
I don't have MLeaders [too old a version of AutoCAD], but I wonder whether that might be available with a little less work as a VLA Property. Try drawing an MLeader [so it's the last thing in the drawing], then doing:
(vlax-dump-object (vlax-ename->vla-object (entlast)))
and see whether any of the listed Properties contains the current style. [For Text and Mtext and Dimensions, the Property is called "StyleName", and it could very well be the same for MLeaders.] If it does, you can use a (vla-put...) operation on a vla-object conversion of each MLeader found, instead of the whole (entget)/(subst)/(entmod) procedure.
How often do you need to do that? Maybe a Quick Select and change style in properties dialog is enough.
But if you have some reasons to use lisp, try this:
(defun C:TEST ( / *error* acDoc l new e ss) (setq acDoc (vla-get-activeDocument (vlax-get-acad-object))) (vla-StartUndoMark acDoc) (defun *error* (msg) (princ msg) (vla-EndUndoMark acDoc) ) (if (ssget "_X" '((0 . "MULTILEADER"))) (progn (princ "\n\n\n****Mleader Styles****\n\n") (setq l (mapcar (function (lambda (s) (princ (strcat " " (cdr s) "\n")) (cdr s) ) ) (vl-remove-if '(lambda (x) (/= (car x) 3)) (dictsearch (namedobjdict) "ACAD_MLEADERSTYLE") ) ) ) (textscr) (if (member (setq new (getstring T "\nEnter new style name: ")) l) (progn (vlax-for e (setq ss (vla-get-ActiveSelectionSet acDoc)) (vla-put-StyleName e new) ) (vla-delete ss) ) (princ "\nStayle name not found.") ) (graphscr) ) ) (princ) )
Hello, about your lisp is it possible to apply a Mleader Styles in accordance with the dimstyle?
Exemple:
-dimstyle 01_Dim1-1 have the mleader Styles 01_Tender1-1
-dimstyle 01_Dim1-2 have the mleader Styles 01_Tender1-2
When a purge my drawing I lose the mleader style of my annotation and only when I restore them I can add or remove leaders!
For exemple find attached a drawing with 3 different Mleaderstyle.
Thanks for your help
Hi, I lose the mleader style by purge, to have again the mleader style I reinsert the template on which I have all mleader style and all dimstyle
no error trapping but try this - not tested
(defun c:CMS() (vla-com-load) (setq ss (ssget "_X" '((0 . "MULTILEADER"))) i 0 ) (repeat (sslength ss) (setq obj (vlax-ename->vla-object (ssname ss i))) (vla-put-StyleName obj "Your Style") (setq i (1+ i)) ) (princ) )
you can also change "Your Style" to the following code
(vl-string-subst "Tender" "Dim" (vla-get-stylename obj))
This will change the dimention style from *Dim* to *tender*
Good morning,
I tested your lisp but a get an error message: error: no function definition: VLA-COM-LOAD
I modifed (vla-com-load) to (vl-load-com) but i get an oder error message: ; error: Automation Error. Null object ID
Even if I will not have a positive result I thank you for your help
sorry for the first strange function (vla-com-load) i usually don't use it.
I didn't use error trapping .. this error means that you don't have a style that matches the pattern you said about
eg.
for mlstyle called 01_Dim1-1 >> 01_Tender1-1 is not available in the drawing
All needed style are on the drawing
What I need exactly is to assign to the mleader with layer Dim1-1 the mleader style 01_Tender1-1
Mleader with layer Dim1-1 = mleaderstyle 01_Tender1-1
Mleader with layer Dim1-2 = mleaderstyle 02_Tender1-2
Mleader with layer Dim1-3 = mleaderstyle 03_Tender1-3
HI francinez,
Untested...
(vl-load-com) (defun c:demo (/ i lay mlstyles obj ss) (if (setq ss (ssget "_X" '((0 . "MULTILEADER")))) (progn (or adoc (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) (vlax-for ml (vla-item (vla-get-dictionaries adoc) "ACAD_MLEADERSTYLE") (setq mlstyles (cons (vla-get-name ml) mlstyles)) ) (repeat (setq i (sslength ss)) (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i)))) lay (vla-get-layer obj) ) (cond ((and (vl-position "01__Tender 1-1" mlstyles) (= lay "Dim 1-1") (vlax-write-enabled-p obj) ) (vla-put-stylename obj "01__Tender 1-1") ) ((and (vl-position "01__Tender 1-2" mlstyles) (= lay "Dim 1-2") (vlax-write-enabled-p obj) ) (vla-put-stylename obj "01__Tender 1-2") ) ((and (vl-position "01__Tender 1-3" mlstyles) (= lay "Dim 1-3") (vlax-write-enabled-p obj) ) (vla-put-stylename obj "01__Tender 1-3") ) ) ) ) ) (princ) )
Hope this helps,
Henrique