Layout renumbering LISP, which leave current name, but write prefix with number

Layout renumbering LISP, which leave current name, but write prefix with number

Anonymous
Not applicable
1,213 Views
4 Replies
Message 1 of 5

Layout renumbering LISP, which leave current name, but write prefix with number

Anonymous
Not applicable

Hello,

 

How to make LIPS which leaves current layout number and just write prefix with layout order number, for example:

I have layouts:

PART15, PART21, PART31, PART05,...

I need rename layouts to:

001-PART15, 002-PART21, 003-PART31, 004-PART05, ...

 

 

 

0 Likes
Accepted solutions (1)
1,214 Views
4 Replies
Replies (4)
Message 2 of 5

dbhunia
Advisor
Advisor

Try this.......

 

(defun c:Ren_Lay_Tab ( / n layt_lst num_string) 
(setvar 'cmdecho 0)
(setq n 1)
(vl-load-com)
(vlax-for layt (vla-get-layouts (vla-get-ActiveDocument (vlax-get-acad-object)))
    (if (> (vla-get-TabOrder layt) 0)
        (setq layt_lst (cons (cons (vla-get-TabOrder layt) (vla-get-Name layt)) layt_lst))
    )
)
(setq layt_lst (vl-sort layt_lst '(lambda (x y) (< (car x) (car y)))))
(if (= 1 (length layt_lst))
    (command "_-layout" "_rename" (cdr (car layt_lst)) (strcat "001-" (cdr (car layt_lst))))
    (foreach layt layt_lst
		(setq num_string (rtos n 2 0))
		(while (< (strlen num_string) 3)
		  (setq num_string (strcat "0" num_string))
		)
        (command "_-layout" "_rename" (cdr layt) (strcat num_string "-" (cdr layt)))
		(setq n (1+ n))
    )
)
(setvar 'cmdecho 1)
(princ)
)

 

or this.......

 

(defun c:Ren_Lay_Tab ( / n lay_lst num_string) 
(setq n 1)
(setq lay_lst nil)
(vlax-for Lay (vla-get-layouts (vla-get-ActiveDocument (vlax-get-acad-object)))
	(if (> (vla-get-TabOrder Lay) 0)
	    (setq lay_lst (cons (cons (vla-get-TabOrder Lay) Lay) lay_lst))
	)
)
(setq lay_lst (vl-sort lay_lst '(lambda (x y) (< (car x) (car y)))))
(if (= 1 (length lay_lst))
	(vla-put-name (cdr (car lay_lst)) (strcat "001-" (vla-get-Name (cdr (car lay_lst)))))
    (foreach Lay lay_lst
		(setq num_string (rtos n 2 0))
		(while (< (strlen num_string) 3)
		  (setq num_string (strcat "0" num_string))
		)
		(vla-put-name (cdr Lay) (strcat num_string "-" (vla-get-Name (cdr Lay))))
		(setq n (1+ n))
    )
)
(princ)
)

Debashis Bhunia
Co-Founder of Geometrifying Trigonometry(C)
________________________________________________
Walking is the First step of Running, Technique comes Next....
0 Likes
Message 3 of 5

Moshe-A
Mentor
Mentor

@Anonymous  hi,

 

check this version.  if a layout already has a prefix (the second time you run it) it won't be renamed again and you will be notify at end how many layouts were actually renamed and how not.

 

enjoy

Moshe

 

 

(vl-load-com) ; load activex support

(defun c:prefLAY (/ already_has_prefix formatIndex summarize ; local functions
		    i lst oldLAY newLAY renamed)

 (defun already_has_prefix (string / i ch flag)
  (setq i 1 ch (substr string i 1)) 

  (while (and (not flag) (/= ch "")) 
   (if (not
	 (and
           (>= (ascii ch) 48)
           (<= (ascii ch) 57)
         )
       )
    (setq flag t)
    (setq i (1+ i) ch (substr string i 1)) 
   ); if
  ); while

  (if (and
	(> i 1)
	(eq ch "-")
      )	
   T ; return
  )  
 ); already_has_prefix

  
 (defun formatIndex (n)
  (setq n (abs n))
   
  (cond
   ((< n 10)
    (strcat "00" (itoa n))
   )
   ((< n 100)
    (strcat "0" (itoa n))
   )
   ( t
    (itoa n)
   )
  ); cond 
 ); formatIndex


 (defun summarize ()
  (cond 
   ((= renamed 0)
    (vlr-beep-reaction)
    (if (and lst (> (vl-list-length lst) 0))
     (prompt (strcat "\n" (itoa (vl-list-length lst)) " layout(s) Not renamed."))	     
     (prompt "\nno layout found.")
    ); if
   ); case
   ( t
    (if (= renamed (vl-list-length lst))
     (prompt (strcat "\n" (itoa renamed) " layout(s) renamed."))
     (progn
      (vlr-beep-reaction) 
      (prompt (strcat "\n" (itoa renamed) " layout(s) renamed but " (itoa (- (vl-list-length lst) renamed)) " Not."))
     ); progn 
    ); if 
   ); case
  ); cond
 ); summarize


 ; here start c:prefLAY 
 (setvar "cmdecho" 0)
 (command "._undo" "_begin")
  
 (setq i 0 renamed 0) 
 (foreach oldLAY (setq lst (layoutlist))
  (if (and
	(not (already_has_prefix oldLAY))
        (null (member (setq newLAY (strcat (formatIndex i) "-" oldLAY)) lst))
      )
   (progn
    (command "._layout" "_rename" oldLAY newLAY)
    (setq renamed (1+ renamed))
   ); progn 
  ); if

  (setq i (1+ i)) 
 ); foreach

 ; echo results to user
 (summarize) 
  
 (command "._undo" "_end")
 (setvar "cmdecho" 1) 
 (princ) 
); c:prefLAY

 

0 Likes
Message 4 of 5

Kent1Cooper
Consultant
Consultant
Accepted solution

Here's a suggestion [untested]  that [I hope] determines not only whether a Layout's name already starts with a prefix like that [in a much simpler way], in which case it bypasses that Layout, but also whether the current prefix it has counted up to is already in use by any  Layout, in which case it keeps counting up, until it reaches a prefix of that format that's not  already in use.

 

(defun RLP (/ laylst prelst n prestr); = Rename Layouts with Prefix [001-, 002-, etc.]
  (setq
    laylst (layoutlist); list of paper-space Layout names
    prelst (mapcar '(lambda (x) (substr x 1 4)) laylst); first 4 characters of each
    n 1; initial counter
    prestr "001-" ; initial prefix string
  ); setq
  (foreach lay laylst
    (while (member prestr prelst); intended prefix already used in a Layout name?
      (setq n (1+ n) prestr (strcat (itoa n) "-")); raise number 1, add hyphen
      (while (< (strlen prestr) 4); shorter than 3 digits + hyphen?
        (setq prestr (strcat "0" prestr)); add preceding 0
      ); while
    ); while -- results in next such prefix not already used
    (if (not (wcmatch lay "###-*")); Layout doesn't already have such a prefix?
      (progn ; then
        (command "_.layout" "_rename" lay (strcat prestr lay))
        (setq prelst (cons prestr prelst)); put prefix into list
      ); progn
    ); if
  ); foreach
  (princ)
); defun

 

 

Kent Cooper, AIA
0 Likes
Message 5 of 5

Anonymous
Not applicable

Hi,

It is possible to upgrade a bit this lisp? It would be best that after entering command appears table with all layout, where is possible to choose which layouts should be renamed. That appears question from what number start renumbering. After that appears the second prefix:

For example:

Before:

001-0-Layout1, 002-0-Layout2, Layout3, Layout4;

After:

Start numbering from 003, second prefix is 0

001-0-Layout1, 002-0-Layout2, 003-0-Layout3, 004-0-Layout4;

 

 

0 Likes