Jump to content

Sequential numbering a single attribute value in multiple attribute block


Guite

Recommended Posts

Hi all,

 

I am starting this new topic in the hope of getting better response. I found a topic which almost met my requirement here in the 8th post by ASMI. The difference is my blocks have multiple attributes.

 

My requirements are these:

1. User selects multiple block instances

2. User enters tag (choose if possible, hard coded also will do)

3. User enters starting number, including leading zeros, but no prefix or suffix

4. Routine puts in sequential numbers with leading zeros in the attribute value, starting at top left block, goes left to right, top to bottom.

 

In step 3 above, if the routine can 'remember' the last number of previous execution and continues, well and good. May be its difficult or impossible. If it can be done, then the routine might just as well 'remember' last tag used so that the user need only press enter on subsequent executions.

 

Can someone please help me on this?

 

Thanks in advance, this forum is wonderful.

 

Guite

Link to comment
Share on other sites

  • Replies 42
  • Created
  • Last Reply

Top Posters In This Topic

  • Guite

    8

  • ASMI

    6

  • fixo

    4

  • jva

    4

Top Posters In This Topic

Posted Images

I'll just work on one problem at a time, your other one. :lol:

 

I'll leave this one for ASMI to sort out. o:)

 

I thought that one was a closed chapter :lol:. Anyway the two are related. If you can provide a solution to that one, it would be great.

 

Guite

Link to comment
Share on other sites

1. Specify start number

2. Pick to wanted attribute

3. Select blocks and press Spacebar

 

Enjoy...

 

(defun c:mnum(/ stStr stNum nLen cAtr dLst blName
      fLst blLst blSet aName sLst lZer aStr)
 (vl-load-com)
 (if
   (and
     (setq stStr(getstring "\nSpecify start number: "))
     (setq stNum(atoi stStr))
     (setq nLen(strlen stStr))
     ); end and
   (progn
     (if
(and
   (setq cAtr(nentsel "\nPick attribute > "))
   (= "ATTRIB"(cdr(assoc 0(setq dLst(entget(car cAtr))))))
  ); end and
(progn
  (setq blName
    (vla-get-Name
       (vla-ObjectIDToObject
	  (vla-get-ActiveDocument
	     (vlax-get-acad-object))
	        (vla-get-OwnerID
	           (vlax-ename->vla-object(car cAtr)))))
	fLst(list '(0 . "INSERT")(cons 2 blName))
	aName(cdr(assoc 2 dLst))
	); end setq
  (princ "\n<<< Select blocks to number >>> ")
  (if
    (setq blSet(ssget fLst))
    (progn
     (setq sLst
                   (mapcar 'vlax-ename->vla-object
	      (mapcar 'car
	       (vl-sort
	        (vl-sort
	          (mapcar '(lambda(x)(list x(cdr(assoc 10(entget x)))))
	            (vl-remove-if 'listp 
                             (mapcar 'cadr(ssnamex blSet))))
	                '(lambda(a b)(<(caadr a)(caadr b))))
		          '(lambda(a b)(>(cadadr a)(cadadr b)))))))
     (foreach i sLst
       (setq lZer "")
       (repeat(- nLen(strlen(itoa stNum)))
	 (setq lZer(strcat lZer "0"))
	 ); end repeat
       (setq atLst
	      (vlax-safearray->list
		 (vlax-variant-value
		   (vla-GetAttributes i))))
       (foreach a atLst
	 (if
	   (= aName(vla-get-TagString a))
	      (vla-put-TextString a
		(strcat lZer(itoa stNum)))
	   ); end if
	 ); end foreach
	 (setq stNum(1+ stNum))
       ); end foreach
      ); end progn
    (princ "\nEmpty selection! Quit. ")
    ); end if
  ); end progn
(princ "\nThis isn't attribute! Quit. ")
); end if
     ); end progn
   (princ "\nInvalid start number! Quit. ")
   ); end if
 (princ)
 ); end of c:mnum

Link to comment
Share on other sites

Hi ASMI,

 

Please look at the attached files. The numbering sequence in your script is based on world UCS. Can it be modified to read local/screen UCS? As it stands now, the sequence will be very difficult to follow/track when the drawing is printed.

 

Anyway, your script works perfectly when everything is aligned to world UCS. Thanks once again for your help this far.

 

Guite

DOOR-DD01.dwg

Door-tags.jpg

Link to comment
Share on other sites

Ok. Try it.

 

(defun c:mnum(/ stStr stNum nLen cAtr dLst blName
      fLst blLst blSet aName sLst lZer aStr)
 (vl-load-com)
 (if
   (and
     (setq stStr(getstring "\nSpecify start number: "))
     (setq stNum(atoi stStr))
     (setq nLen(strlen stStr))
     ); end and
   (progn
     (if
(and
   (setq cAtr(nentsel "\nPick attribute > "))
   (= "ATTRIB"(cdr(assoc 0(setq dLst(entget(car cAtr))))))
  ); end and
(progn
  (setq blName
    (vla-get-Name
       (vla-ObjectIDToObject
	  (vla-get-ActiveDocument
	     (vlax-get-acad-object))
	        (vla-get-OwnerID
	           (vlax-ename->vla-object(car cAtr)))))
	fLst(list '(0 . "INSERT")(cons 2 blName))
	aName(cdr(assoc 2 dLst))
	); end setq
  (princ "\n<<< Select blocks to number >>> ")
  (if
    (setq blSet(ssget fLst))
    (progn
     (setq sLst
                   (mapcar 'vlax-ename->vla-object
	      (mapcar 'car
	       (vl-sort
	        (vl-sort
	          (mapcar '(lambda(x)(list x
		   (trans(cdr(assoc 10(entget x)))0 1)))
	            (vl-remove-if 'listp 
                             (mapcar 'cadr(ssnamex blSet))))
	                '(lambda(a b)(<(caadr a)(caadr b))))
		          '(lambda(a b)(>(cadadr a)(cadadr b)))))))
     (foreach i sLst
       (setq lZer "")
       (repeat(- nLen(strlen(itoa stNum)))
	 (setq lZer(strcat lZer "0"))
	 ); end repeat
       (setq atLst
	      (vlax-safearray->list
		 (vlax-variant-value
		   (vla-GetAttributes i))))
       (foreach a atLst
	 (if
	   (= aName(vla-get-TagString a))
	      (vla-put-TextString a
		(strcat lZer(itoa stNum)))
	   ); end if
	 ); end foreach
	 (setq stNum(1+ stNum))
       ); end foreach
      ); end progn
    (princ "\nEmpty selection! Quit. ")
    ); end if
  ); end progn
(princ "\nThis isn't attribute! Quit. ")
); end if
     ); end progn
   (princ "\nInvalid start number! Quit. ")
   ); end if
 (princ)
 ); end of c:mnum

Link to comment
Share on other sites

  • 3 months later...

I Would Like To Have This Add +2 So Say Your Start # Is 100 Your Next Would Be 102, 104, Etc... How Would I Change It To Do That?

Link to comment
Share on other sites

  • 5 months later...

Sorry to bring up an old thread, but I'm using this lisp, and is there a way to make it change the blocks by select order the way tcount does?

 

Thanks so much.

Link to comment
Share on other sites

Oops! One more submarine come to the surface.

 

... and is there a way to make it change the blocks by select order the way tcount does?

Because not? I will think about it next week. Today I have other work.

Link to comment
Share on other sites

is there a way to make it change the blocks by select order the way tcount does?

 

just a sidenote:

 

express' acettxt.lsp may give a hint how it sorts its entities.

Link to comment
Share on other sites

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