Change only selected Attribute

Change only selected Attribute

C.Utzinger
Collaborator Collaborator
1,438 Views
11 Replies
Message 1 of 12

Change only selected Attribute

C.Utzinger
Collaborator
Collaborator

Hi

 

I have the following code.

 

It would be great when I Pick an existing Block (entsel) to change only one Attribute (the slected one) and not have to go through every Attribute again.

 

Is that possible? Thanks for help!

 

 

(vl-load-com)
(defun C:<Test2 ( / *error* oATTREQ oATTDIA LM:vl-setattributevalue :roundUpToTens ent ANZAHL HÖHE LÄNGE DECKE)

  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nError: " errmsg)))
         (setvar 'ATTREQ oATTREQ)
         (setvar 'ATTDIA oATTDIA)
    	 (command-s "_.undo" "_end")
    (princ))

  (defun LM:vl-setattributevalue ( blk tag val )
    (setq tag (strcase tag))
    (vl-some '(lambda ( att )
                (if (= tag (strcase (vla-get-tagstring att)))
                  (progn (vla-put-textstring att val) val)))
             (vlax-invoke blk 'getattributes)))

  (defun :roundUpToTens (x / ) (* (atoi (rtos (+ (* x 0.1) 0.49) 2 0)) 10))

  (command "_.undo" "_begin")
  (setq oATTREQ (getvar 'ATTREQ)
        oATTDIA (getvar 'ATTDIA))
  (setvar 'ATTREQ 0)
  (setvar 'ATTDIA 0)

  (if (not KUFU)(setq KUFU "mit"))
  (setq ANZAHL 10)
  (setq HÖHE 20)
  (setq DECKE 25)

 (if (setq ent (car (entsel "\nDistanzkorbtext wählen oder <Neuer einfügen>: ")))		
      (progn 
	 (initget "Mit Ohne")
	 (setq KUFU (cond ((getkword (strcat "\nMit oder ohne KUFU (mit/ ohne) <" KUFU ">: ")))(KUFU)))
	 (setq KUFU (strcase KUFU T))
	 (initget 6)
	 (setq ANZAHL (:roundUpToTens (cond ((getint (strcat "\nAnzahl Körbe <" (itoa ANZAHL) ">: ")))(ANZAHL))))
	 (initget 6)
	 (setq HÖHE (cond ((getint (strcat "\nHöhe der Körbe <" (itoa HÖHE) ">: ")))(HÖHE)))
	 (setq LÄNGE (* ANZAHL 2.5))
	 (initget 6)
	 (setq DECKE (strcat "für Decke d=" (itoa (cond ((getint (strcat "\nDeckenstärke <" (itoa DECKE) ">: ")))(DECKE))) " cm"))
      	 (LM:vl-setattributevalue (vlax-ename->vla-object ent) "KUFU" (strcat "DK " KUFU " KUFU"))
     	 (LM:vl-setattributevalue (vlax-ename->vla-object ent) "ANZAHL" ANZAHL)
         (LM:vl-setattributevalue (vlax-ename->vla-object ent) "HÖHE" HÖHE)
     	 (LM:vl-setattributevalue (vlax-ename->vla-object ent) "LÄNGE" LÄNGE)
    	 (LM:vl-setattributevalue (vlax-ename->vla-object ent) "DECKE" DECKE)
      )
      (progn
  	(if (and (not (command "_.INSERT" "spi-bew-dkm_test" "_s" 1 "_r" 0))			
           (princ "\nIn Eisenliste bei Distanzkörbe einfügen: \n")				
           (not (command PAUSE))
           (setq ent (entlast))
	   (progn 
		(initget "Mit Ohne")
	        (setq KUFU (cond ((getkword (strcat "\nMit oder ohne KUFU (mit/ ohne) <" KUFU ">: ")))(KUFU)))
	   (setq KUFU (strcase KUFU T))
	   (initget 6)
	   (setq ANZAHL (:roundUpToTens (cond ((getint (strcat "\nAnzahl Körbe <" (itoa ANZAHL) ">: ")))(ANZAHL))))
	   (initget 6)
	   (setq HÖHE (cond ((getint (strcat "\nHöhe der Körbe <" (itoa HÖHE) ">: ")))(HÖHE)))
	   (setq LÄNGE (* ANZAHL 2.5))
	   (initget 6) 
	   (setq DECKE (strcat "für Decke d=" (itoa (cond ((getint (strcat "\nDeckenstärke <" (itoa DECKE) ">: ")))(DECKE))) " cm")))
           )
    	(progn
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "KUFU" (strcat "DK " KUFU " KUFU"))
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "ANZAHL" ANZAHL)
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "HÖHE" HÖHE)
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "LÄNGE" LÄNGE)
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "DECKE" DECKE)))))

  (setvar 'ATTREQ oATTREQ)
  (setvar 'ATTDIA oATTDIA)
  (command "_.undo" "_end")
  (prin1)
) ; end of defun
0 Likes
Accepted solutions (2)
1,439 Views
11 Replies
Replies (11)
Message 2 of 12

cadffm
Consultant
Consultant
Accepted solution

"It would be great when I Pick an existing Block (entsel) to change only one Attribute (the slected one) "
 
But you dont have "selected one Attribute" with entsel, Select nested Objects with Nentsel (F1) !

 

 

(setq a (nentsel))
(alert  (vl-princ-to-string (entget(car a))))

Sebastian

0 Likes
Message 3 of 12

C.Utzinger
Collaborator
Collaborator

Sorry but I don't know how to introduce that in my code :(...

0 Likes
Message 4 of 12

ВeekeeCZ
Consultant
Consultant

Keep the standardized selectable prompts.

 

(initget "Mit Ohne")
(setq KUFU (cond ((getkword (strcat "\nMit oder ohne KUFU [Mit/Ohne] <" KUFU ">: "))) (KUFU)))
(setq KUFU (strcase KUFU T))

Message 5 of 12

SeeMSixty7
Advisor
Advisor

Here is something I wrote back in 89 and it works great still. I tis nothing fancy in anyway, but works just fine.

 

Good luck,

by: Clint Moore
Date:11-10-89
(defun c:ac (/ old )
  (setq old AC_VAL)
  (if old 
    (setq AC_VAL (getstring T (strcat "\nEnter new value:<" old ">:")))
    (setq AC_VAL (getstring T "\nEnter new value: "))
  )
  (if (= AC_VAL "")
   (setq AC_VAL old)
  )
  (prompt "\nSelect Attribute: ")
  (command "attedit" "" "" "" "" pause "" "v" "" AC_VAL "")
  (princ)
)

 

Message 6 of 12

C.Utzinger
Collaborator
Collaborator

I'm getting crazy.

 

I'm testing with the LeMac functions, but i'm getting nowhere.

 

How can I after nentsel get the Attribute tag.

 

 

Please help...

0 Likes
Message 7 of 12

ВeekeeCZ
Consultant
Consultant
Accepted solution

@c.utzinger wrote:

 

...

 

How can I after nentsel get the Attribute tag.

 

...

Get entity's definition list: (entget (car (nentsel)))

Then see what entity you have -> ATTRIB

Use HELP, search for "ATTRIB dxf"

See code 2?

then as usual

(cdr (assoc 2 (entget (car (nentsel)))))

Message 8 of 12

C.Utzinger
Collaborator
Collaborator

Thank you

 

I was not so far away, but lost...:)

 

 

Kind regards

0 Likes
Message 9 of 12

SeeMSixty7
Advisor
Advisor

Here is a quick sample for you to see how to use it.

 

Good luck,

(defun c:QCHG()
	(setq mynewvalue "NEWVALUE"
		  myattent (nentsel "\nSelect Attribute to change: ")
	)
	(if myattent
		(progn
			(setq myattdata (entget (car myattent))
				  oldvalue (assoc 1 myattdata)
				  newvalue (cons 1 mynewvalue)
				  myattdata (subst newvalue oldvalue myattdata)
			)
			(entmod myattdata)
			(entupd (cdr (assoc 330 myattdata)))
		)
	)
)
Message 10 of 12

C.Utzinger
Collaborator
Collaborator

HI

 

I have my code now like this:

 

I found no way to select the block once. Is there a possibility to do that?

 

(vl-load-com)
(defun C:<Test7 ( / *error* oATTREQ oATTDIA LM:vl-setattributevalue :roundUpToTens ent ent2 ANZAHL HÖHE LÄNGE DECKE)

  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nError: " errmsg)))
         (setvar 'ATTREQ oATTREQ)
         (setvar 'ATTDIA oATTDIA)
    	 (command-s "_.undo" "_end")
    (princ))

  (defun LM:vl-setattributevalue ( blk tag val )
    (setq tag (strcase tag))
    (vl-some '(lambda ( att )
                (if (= tag (strcase (vla-get-tagstring att)))
                  (progn (vla-put-textstring att val) val)))
             (vlax-invoke blk 'getattributes)))

  (defun :roundUpToTens (x / ) (* (atoi (rtos (+ (* x 0.1) 0.49) 2 0)) 10))

  (command "_.undo" "_begin")
  (setq oATTREQ (getvar 'ATTREQ)
        oATTDIA (getvar 'ATTDIA))
  (setvar 'ATTREQ 0)
  (setvar 'ATTDIA 0)

  (if (not KUFU)(setq KUFU "mit"))
  (setq ANZAHL 10)
  (setq HÖHE 20)
  (setq DECKE 25)

 (if (setq ent (car (entsel "\nDistanzkorbtext wählen oder <Neuer einfügen>: ")))		
      (progn
	 (setq ent2 (cdr (assoc 2 (entget (car (nentsel "\nZu ändernden Text wählen:"))))))
	 (cond ((= ent2 "KUFU")(progn
				 (initget 1 "Mit Ohne")
	 			 (setq KUFU (getkword "\nMit oder ohne KUFU (mit/ ohne): "))
	 			 (setq KUFU (strcase KUFU T))
				 (LM:vl-setattributevalue (vlax-ename->vla-object ent) "KUFU" (strcat "DK " KUFU " KUFU"))))
	       ((= ent2 "ANZAHL")(progn
				   (initget 7)
	 			   (setq ANZAHL (:roundUpToTens (getint "\nAnzahl Körbe: ")))
				   (setq LÄNGE (* ANZAHL 2.5))
				   (LM:vl-setattributevalue (vlax-ename->vla-object ent) "LÄNGE" LÄNGE)
				   (LM:vl-setattributevalue (vlax-ename->vla-object ent) "ANZAHL" ANZAHL)))
	       ((= ent2 "HÖHE")(progn
			         (initget 7)
	 			 (setq HÖHE (getint "\nHöhe der Körbe: "))
				 (LM:vl-setattributevalue (vlax-ename->vla-object ent) "HÖHE" HÖHE)))
	       ((= ent2 "LÄNGE")(alert "Die Länge wird durch die Anzahl Körbe automatisch bestimmt."))
	       ((= ent2 "DECKE")(progn
				 (initget 7)
	 			 (setq DECKE (strcat "für Decke d=" (itoa (getint "\nDeckenstärke: ")) " cm"))
    	 			 (LM:vl-setattributevalue (vlax-ename->vla-object ent) "DECKE" DECKE))))
      )
      (progn
  	(if (and (not (command "_.INSERT" "spi-bew-dkm_test" "_s" 1 "_r" 0))			
           (princ "\nIn Eisenliste bei Distanzkörbe einfügen: \n")				
           (not (command PAUSE))
           (setq ent (entlast))
	   (progn 
		(initget "Mit Ohne")
	        (setq KUFU (cond ((getkword (strcat "\nMit oder ohne KUFU [Mit/ Ohne] <" KUFU ">: ")))(KUFU)))
	   (setq KUFU (strcase KUFU T))
	   (initget 6)
	   (setq ANZAHL (:roundUpToTens (cond ((getint (strcat "\nAnzahl Körbe <" (itoa ANZAHL) ">: ")))(ANZAHL))))
	   (initget 6)
	   (setq HÖHE (cond ((getint (strcat "\nHöhe der Körbe <" (itoa HÖHE) ">: ")))(HÖHE)))
	   (setq LÄNGE (* ANZAHL 2.5))
	   (initget 6) 
	   (setq DECKE (strcat "für Decke d=" (itoa (cond ((getint (strcat "\nDeckenstärke <" (itoa DECKE) ">: ")))(DECKE))) " cm")))
           )
    	(progn
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "KUFU" (strcat "DK " KUFU " KUFU"))
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "ANZAHL" ANZAHL)
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "HÖHE" HÖHE)
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "LÄNGE" LÄNGE)
           (LM:vl-setattributevalue (vlax-ename->vla-object ent) "DECKE" DECKE)))))

  (setvar 'ATTREQ oATTREQ)
  (setvar 'ATTDIA oATTDIA)
  (command "_.undo" "_end")
  (prin1)
) ; end of defun
0 Likes
Message 11 of 12

ВeekeeCZ
Consultant
Consultant

Besides you have the answer right in front of your eyes, 


SeeMSixty7 wrote:

 

...
			(entupd (cdr (assoc 330 myattdata)))
...

 

 

... sometimes is useful the (nentselp) function to re-select the same point again.

 

(and (setq ensel (entsel "\nSelect attribute to change: "))
     (setq atten (car (nentselp (cadr ensel))))
     )

 

 

Message 12 of 12

C.Utzinger
Collaborator
Collaborator

Good morning

 

Thank you, I have it now like this and it works!

 

(if (and (setq ensel (entsel "\nDistanzkorb-Text wählen oder <Neuer einfügen>: "))
     	 (setq ent (car ensel))
     	 (setq ent2 (cdr (assoc 2 (entget (car (nentselp (cadr ensel))))))))

 

Kind regards

0 Likes