Increment Numbers after = sign in Multileaders

Increment Numbers after = sign in Multileaders

ShadowJag
Participant Participant
922 Views
9 Replies
Message 1 of 10

Increment Numbers after = sign in Multileaders

ShadowJag
Participant
Participant

Greetings,

We have switched datums and so all Invert levels and Lid Levels need to be globally incremented (added or subtracted) by an amount. This factor varies between different plans so would be a user input value.

Our levels are displayed in a Multileader in the format 

shahrose_chatha_0-1744842700319.png


So the increment should ignore the numbers in the top two lines and should ignore the numbers succeeding the IL letters since they are just a nomenclature that will remain the same. e.g IL1, IL2, IL3, IL4 keep these numbers as is. The numbers that will be adjusted are the ones after the equals sign.

In summary a lisp that increments numbers after an equals sign in selected multileaders.

I have attached an INC lisp that does not have a filter feautre




0 Likes
923 Views
9 Replies
Replies (9)
Message 2 of 10

Sea-Haven
Mentor
Mentor

Post a sample dwg if its a common block used in the leader may be easier to look at attributes and update them.

0 Likes
Message 3 of 10

ShadowJag
Participant
Participant

Please see attached

0 Likes
Message 4 of 10

Moshe-A
Mentor
Mentor

@ShadowJag  hi,

 

check INC-ML command.

 

enjoy

Moshe

 

(vl-load-com) ; load activex support

(defun c:inc-ml (/ askreal  _isNumeric ; local functions
		   adoc definc savDimzin inc ss ename elist mtext i ch digits data^)

 (defun askreal (msg def / ask)
  (initget 2)
  (if (not (setq ask (getreal (strcat "\n" msg " <" (rtos def 2 2) ">: "))))
   (setq ask def)
   (setq def ask)
  )
 ); askreal


 ; return T if 's' is number
 (defun _isNumeric (s)
  (or
    (=  (atoi s) 46)
    (>= (atoi s) 48) (<= (atoi s) 57)
  )
 ); _isNumeric


 ; here start c:inc-ml
 (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startUndomark adoc)

 (if (= (getvar "userr1") 0.0)
  (setq definc (setvar "userr1" 0.1))
  (setq definc (getvar "userr1"))
 )

 (setq savDimzin (getvar "dimzin"))
 (setvar "dimzin" 0)

 (if (and
       (setvar "userr1" (setq inc (askreal "Increment" definc)))
       (setq ss (ssget '((0 . "MULTILEADER"))))
     )
  (progn
   (foreach ename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
    (setq elist (entget ename))
    (setq mtext (cdr (assoc '304 elist)))

    (setq i 1 ch (substr mtext i 1))
    (while (/= ch "")
     (if (eq ch "=")
      (progn
       (setq i (1+ i) ch (substr mtext i 1) digits "")
       (while (and (/= ch "\\") (/= ch ""))
        (if (_isNumeric ch)
         (setq digits (strcat digits ch))
        )
        (setq i (1+ i) ch (substr mtext i 1))
       ); while

       (setq data^ (cons digits data^))
      ); progn
     ); if

     (setq i (1+ i) ch (substr mtext i 1))
    ); while

    (foreach digits data^
     (while (vl-string-search digits mtext)
      (setq mtext (vl-string-subst (rtos (+ (atof digits) inc) 2 2) digits mtext))
     )
    ); foreach

    (entmod (subst (cons '304 mtext) (assoc '304 elist) elist)) ; update mleader text
   ); foreach
  ); progn
 ); if

 (setvar "dimzin" savDimzin)
  
 (vla-endUndomark adoc)
 (vlax-release-object adoc)

 (princ)
); c:inc-ml
Message 5 of 10

komondormrex
Mentor
Mentor

hey you there,

and another one goes below

;*****************************************************************************************************************
;
;	'add_value_mleaderss' custom command adds value to certain numbers within mleader strings
;	komondormrex, apr, 2025
;	totally lm free
;
;*****************************************************************************************************************

(defun string_to_list (string delimiter_string / out_list)
    (setq char_list (vl-string->list string))
  (defun parse_string (char_list delimiter_string / substring)
    (setq char_list_remainder char_list)
    (if (vl-some '(lambda (ascii_code)
              (setq substring (cons ascii_code substring)
                  char_list_remainder (cdr char_list_remainder)
            )
              (member ascii_code (vl-string->list delimiter_string))
              )
              char_list
      )
      (progn
        (setq delimiter_char (chr (car substring)))
          (if (/= "" (setq substring (vl-list->string (reverse (cdr substring)))))
          (setq out_list (append out_list (list substring delimiter_char)))
          (setq out_list (append out_list (list delimiter_char)))
        )
        (parse_string (setq char_list char_list_remainder) delimiter_string)
      )
      (if (/= "" (setq substring (vl-list->string (reverse substring))))
        (setq out_list (append out_list (list substring)))
      )
     )
     out_list
  )
  (parse_string char_list delimiter_string)
)

;*****************************************************************************************************************

(defun c:add_value_mleaders (/ addition mleader_sset new_text_list do_add old_text_group)
  (if (null addition_saved) (setq addition_saved 1.0)) 
  (if (null (setq addition (getreal (strcat "\nEnter addition +-number <" (rtos addition_saved) ">: "))))
	(setq addition addition_saved)
	(setq addition_saved addition)
  )
  (if (setq mleader_sset (ssget '((0 . "multileader") (304 . "*#*"))))
    (foreach text (vl-remove-if 'listp (mapcar 'cadr (ssnamex mleader_sset)))
      (setq new_text_list nil do_add nil old_text_group (assoc 304 (entget text)))
      (foreach sub_string (string_to_list (cdr (setq old_text_group (assoc 304 (entget text)))) "\\P=")
        (if (and (wcmatch (strcase sub_string) "=")
                 (null do_add)
            )
            (setq do_add t)
        )
        (if (and (vl-every '(lambda (asc) (member asc (vl-string->list "0123456789.")))
                   	    (vl-string->list sub_string)
                 )
                 do_add
            )
            (setq new_text_list (append new_text_list (list (rtos (+ (atof sub_string) addition))))
            	  do_add nil
            )
            (setq new_text_list (append new_text_list (list sub_string)))
        )
      )
      (entmod (subst (cons 304 (apply 'strcat new_text_list)) old_text_group (entget text)))
    )
  )
  (princ)
)

;*****************************************************************************************************************

 

0 Likes
Message 6 of 10

ShadowJag
Participant
Participant

Hi Moshe, I have tested your code and it completes majority of the function however it deletes some lines from the multileaders. I have attached another DWG file for better reference. If you run the lisp and compare to the original you can see some lines have been deleted.

0 Likes
Message 7 of 10

ShadowJag
Participant
Participant

Hi Komondor, I have tested your code and it completes majority of the function however it skips some lines and they remain free from the increment applied to the rest. I have attached another DWG file for better reference. If you run the lisp and compare to the original you can see some lines have been skipped. Also i want the numbers to retain a 2dp formating so if its incremented to a number ending in zero say 24.53 to 26.70 I want the zero to be displayed instead of 26.7.
In case there any confusion any number after an equals sign represents a level that needs to be adjusted. 

0 Likes
Message 8 of 10

komondormrex
Mentor
Mentor

hey, check the update

;*****************************************************************************************************************
;
;	'add_value_mleaderss' custom command adds value to certain numbers within mleader strings
;	komondormrex, apr, 2025
;	totally lm free
;
;*****************************************************************************************************************

(defun string_to_list (string delimiter_string / out_list)
    (setq char_list (vl-string->list string))
  	(defun parse_string (char_list delimiter_string / substring)
  	  	(setq char_list_remainder char_list)
  	  	(if (vl-some '(lambda (ascii_code) (setq substring (cons ascii_code substring)
  	  	              							 char_list_remainder (cdr char_list_remainder)
  	  	        						   )
  	  	          						   (member ascii_code (vl-string->list delimiter_string))
  	  	          	  )
  	  	          	  char_list
  	  	    )
  	  	  	(progn
  	  	  	  	(setq delimiter_char (chr (car substring)))
  	  	  	    (if (/= "" (setq substring (vl-list->string (reverse (cdr substring)))))
  	  	  	    	(setq out_list (append out_list (list substring delimiter_char)))
  	  	  	    	(setq out_list (append out_list (list delimiter_char)))
  	  	  	 	)
  	  	  	 	(parse_string (setq char_list char_list_remainder) delimiter_string)
  	  	  	)
  	  	  	(if (/= "" (setq substring (vl-list->string (reverse substring))))
  	  	  	  	(setq out_list (append out_list (list substring)))
  	  	  	)
  	  	 )
  	   	 out_list
  	)
  	(parse_string char_list delimiter_string)
)

;*****************************************************************************************************************

(defun number_format_str (number after_point / zeroes str_number point_pos)
	(setq zeroes "0000000000")
	(cond
		((null (setq point_pos (vl-string-position (ascii ".") (setq str_number (rtos number 2 after_point)))))
			(strcat str_number "." (substr zeroes 1 after_point))
		)
		(t (strcat str_number (substr zeroes 1 (- after_point (- (strlen str_number) (1+ point_pos))))))
	)
)
;*****************************************************************************************************************

(defun c:add_value_mleaders (/ addition mleader_sset new_text_list do_add old_text_group)
  	(if (null addition_saved) (setq addition_saved 1.0))
  	(if (null (setq addition (getreal (strcat "\nEnter addition +-number <" (rtos addition_saved) ">: "))))
  		(setq addition addition_saved)
  		(setq addition_saved addition)
  	)
  	(if (setq mleader_sset (ssget '((0 . "multileader") (304 . "*#*"))))
  	  	(foreach text (vl-remove-if 'listp (mapcar 'cadr (ssnamex mleader_sset)))
  	  	  	(setq new_text_list nil do_add nil old_text_group (assoc 304 (entget text)))
  	  	  	(foreach sub_string (string_to_list (cdr (setq old_text_group (assoc 304 (entget text)))) "\\P=")
  	  	  	  	(if (and (wcmatch (strcase sub_string) "=")
  	  	  	  	         (null do_add)
  	  	  	  	    )
  	  	  	  	    (setq do_add t)
  	  	  	  	)
  	  	  	  	(if (and (vl-every '(lambda (asc) (member asc (vl-string->list "0123456789. ")))
  	  	  	  	           	    (vl-string->list sub_string)
  	  	  	  	         )
  	  	  	  	         do_add
  	  	  	  	    )
  	  	  	  	    (setq new_text_list (append new_text_list (list (number_format_str (+ (atof sub_string) addition) 2)))
  	  	  	  	    	  do_add nil
  	  	  	  	    )
  	  	  	  	    (setq new_text_list (append new_text_list (list sub_string)))
  	  	  	  	)
  	  	  	)
  	  	  	(entmod (subst (cons 304 (apply 'strcat new_text_list)) old_text_group (entget text)))
  	  	)
  	)
  	(princ)
)

;*****************************************************************************************************************
0 Likes
Message 9 of 10

Moshe-A
Mentor
Mentor

@ShadowJag hi,

 

the problem is not in AutoLISP but AutoCAD it self they changing the format of mtext in  database.

attached a fix.

 

enjoy

Moshe

 

0 Likes
Message 10 of 10

john.uhden
Mentor
Mentor

@ShadowJag ,

Can we translate that to "change only the number that is prefixed with LL=?"

John F. Uhden

0 Likes