Get value from Attribute

Get value from Attribute

C.Utzinger
Collaborator Collaborator
1,592 Views
4 Replies
Message 1 of 5

Get value from Attribute

C.Utzinger
Collaborator
Collaborator

Hi

 

I have the following code. In the second part of "if" I introduced a "initget" depending of the variable *KUFU*, but I don´t know how to do it in the first part. I Need to get the value of the Attribute from the existing block, but no idea...

 

Please help... 

 

 

(vl-load-com)
(defun C:<Test7 ( / *error* oATTREQ oATTDIA LM:vl-setattributevalue :roundUpToTens ensel tag obj *LÄNGE* *HÖHEo* *loop*)

  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nError: " errmsg)))
         (setvar 'ATTREQ oATTREQ)
         (setvar 'ATTDIA oATTDIA)
         (vla-endundomark doc)
    (princ))

  ;; Lee Mac
  ;; http://www.lee-mac.com/attributefunctions.html

  (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)))

  ;; BeekeeCZ

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


  (vla-endundomark (setq doc (vla-get-activedocument (vlax-get-acad-object))))
  (vla-startundomark doc)
  (setq oATTREQ (getvar 'ATTREQ)
        oATTDIA (getvar 'ATTDIA))
  (setvar 'ATTREQ 0)
  (setvar 'ATTDIA 0)

  (or *KUFU*    (setq *KUFU* "mit"))
  (or *ANZAHL*  (setq *ANZAHL* 10))
  (or *HÖHE*    (setq *HÖHE* "20"))
  (setq *HÖHEo* *HÖHE*)
  (or *ELEMENT* (setq *ELEMENT* 25))

 (if (setq ensel (car (nentsel "\nDistanzkorb-Text wählen oder <Neuer einfügen>: ")))
		
     		 (progn
		    (setq tag (cdr (assoc 2 (entget ensel)))
			  obj (vlax-ename->vla-object (cdr (assoc 330 (entget ensel)))))	    

		    (cond ((= tag "KUFU")
			     (initget 1 "Mit Ohne")
	  		     (setq *KUFU* (strcase (getkword "\nMit oder ohne KUFU (Mit/Ohne): ")T))
			     (LM:vl-setattributevalue obj "KUFU" (strcat "DK " *KUFU* " KUFU")))
	 		  ((= tag "ANZAHL")
			     (initget 7)
			     (setq *ANZAHL* (:roundUpToTens (getint "\nAnzahl Körbe: "))
		                   *LÄNGE* (* *ANZAHL* 2.5))
			     (LM:vl-setattributevalue obj "LÄNGE" *LÄNGE*)
			     (LM:vl-setattributevalue obj "ANZAHL" *ANZAHL*))
			  ((= tag "HÖHE")

??????????????????? (initget 7) (setq *HÖHE* (getint "\nHöhe der Körbe: ")) (LM:vl-setattributevalue obj "HÖHE" *HÖHE*))
((= tag "LÄNGE") (alert "Die Länge wird durch die Anzahl Körbe automatisch bestimmt.")) ((= tag "ELEMENT") (initget 7) (setq *ELEMENT* (getint "\nElementstärke: ")) (LM:vl-setattributevalue obj "ELEMENT" (strcat "für Element d=" (itoa *ELEMENT*) "cm")))) ) (progn (command "_.INSERT" "spi-bew-dkm" "_s" 1 "_r" 0) (princ "\nIn Eisenliste bei Distanzkörbe einfügen: \n") (command PAUSE) (setq obj (vlax-ename->vla-object (entlast))) (initget "Mit Ohne") (setq *KUFU* (strcase (cond ((getkword (strcat "\nMit oder ohne KUFU (Mit/Ohne) <" *KUFU* ">: ")))(*KUFU*))T)) (LM:vl-setattributevalue obj "KUFU" (strcat "DK " *KUFU* " KUFU")) (initget 6) (setq *ANZAHL* (:roundUpToTens (cond ((getint (strcat "\nAnzahl Körbe <" (itoa *ANZAHL*) ">: ")))(*ANZAHL*)))) (LM:vl-setattributevalue obj "ANZAHL" *ANZAHL*) (setq *LÄNGE* (* *ANZAHL* 2.5)) (while (= *loop* nil)
(cond ((= *KUFU* "mit") (initget "2 2.5 3 3.5 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110")) ((= *KUFU* "ohne") (initget "4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110"))) (setq *HÖHE* (getkword (strcat "\nHöhe der Körbe <" *HÖHE* ">: ")) *HÖHE* (if (= *HÖHE* nil) *HÖHEo* *HÖHE*)) (cond ((and (= *KUFU* "mit")(= *HÖHE* "51"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil)) ((and (= *KUFU* "mit")(= *HÖHE* "53"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil)) ((and (= *KUFU* "ohne")(= *HÖHE* "2"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil)) ((and (= *KUFU* "ohne")(= *HÖHE* "2.5"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil)) ((and (= *KUFU* "ohne")(= *HÖHE* "3"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil)) ((and (= *KUFU* "ohne")(= *HÖHE* "3.5"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil)) (setq *loop* 1)) ); end of while (LM:vl-setattributevalue obj "HÖHE" *HÖHE*) (LM:vl-setattributevalue obj "LÄNGE" *LÄNGE*) (initget 6) (setq *ELEMENT* (cond ((getint (strcat "\nElementstärke <" (itoa *ELEMENT*) ">: ")))(*ELEMENT*))) (LM:vl-setattributevalue obj "ELEMENT" (strcat "für Element d=" (itoa *ELEMENT*) "cm")) )) (setvar 'ATTREQ oATTREQ) (setvar 'ATTDIA oATTDIA) (vla-endundomark doc) (prin1) ) ; end of defun
0 Likes
Accepted solutions (1)
1,593 Views
4 Replies
Replies (4)
Message 2 of 5

SeeMSixty7
Advisor
Advisor

I'm ashamed to say I took German for 4 years, and can't read it or maintain a conversation with it. Ignoring all that though. Looking at your code. It looks like you are selecting an attribute using nentsel in the true block of your if statement.

 

(setq tag (cdr (assoc 2 (entget ensel)))
  obj (vlax-ename->vla-object (cdr (assoc 330 (entget ensel)))))

 

If you simply add 

 

(setq tag (cdr (assoc 2 (entget ensel)))
  obj (vlax-ename->vla-object (cdr (assoc 330 (entget ensel))))

  attvalue     (cdr (assoc 2 (entget entsel)))

)

 

Please note I type in entsel and not ensel. I am assuming the German Lisp equivalent is ensel or something as you use in your tag and obj variables.

 

Good luck,

 

 

0 Likes
Message 3 of 5

C.Utzinger
Collaborator
Collaborator

HI, thank you for your answer.

 

This code doesn't work:

      attvalue  (cdr (assoc 2 (entget entsel)))

 

With this i get the selected Attribute value:

      attvalue (cdr (assoc 1 (entget ensel)))

 

But i don´t need this value, i need the value from another attribute from the selected block.

 

I have atrributes: KUFU, ANZAHL, HÖHE, LÄNGE and ELEMENT.

I select HÖHE for changing it, but for the initget function i need the value from KUFU, like in the second progn from the posted code.

 

 

Kind regards

 

 

 

0 Likes
Message 4 of 5

SeeMSixty7
Advisor
Advisor

Ahhh Yes I meant to change that to a 1. DOH! I also now realize my confusion on the ensel variable. I just kept associating it with entsel.

 

You can get the parent block and then search through it till you get to the desired attribute.

 

(setq blockent (cdr (assoc 330 (entget ensel)))) ; This will give you the parent entity. I  believe LeeMac has some functions for getting and setting attributes based on tags providing the block ent. Or you can just write your own to step through using entnext until you find the attribute you want and then get the value with the dxf 1 association.

 

Good luck,

 

 

 

Message 5 of 5

C.Utzinger
Collaborator
Collaborator
Accepted solution

My solution!

 

 

(vl-load-com)
(defun C:<Test7 ( / *error* oATTREQ oATTDIA LM:vl-setattributevalue :roundUpToTens ensel ensel2 tag tag2 obj *LÄNGE* *HÖHEo* *loop*)

  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nError: " errmsg)))
         (setvar 'ATTREQ oATTREQ)
         (setvar 'ATTDIA oATTDIA)
         (vla-endundomark doc)
    (princ))

  ;; Lee Mac
  ;; http://www.lee-mac.com/attributefunctions.html

  (defun LM:getattributevalue ( blk tag / val enx )
    (while
        (and
            (null val)
            (= "ATTRIB" (cdr (assoc 0 (setq enx (entget (setq blk (entnext blk)))))))
        )
        (if (= (strcase tag) (strcase (cdr (assoc 2 enx))))
            (setq val (cdr (assoc 1 enx)))
        )
    )
  )


  ;; Lee Mac
  ;; http://www.lee-mac.com/attributefunctions.html

  (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)))

  ;; BeekeeCZ

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


  (vla-endundomark (setq doc (vla-get-activedocument (vlax-get-acad-object))))
  (vla-startundomark doc)
  (setq oATTREQ (getvar 'ATTREQ)
        oATTDIA (getvar 'ATTDIA))
  (setvar 'ATTREQ 0)
  (setvar 'ATTDIA 0)

  (or *KUFU*    (setq *KUFU* "mit"))
  (or *ANZAHL*  (setq *ANZAHL* 10))
  (or *HÖHE*    (setq *HÖHE* "20"))
  (setq *HÖHEo* *HÖHE*)
  (or *ELEMENT* (setq *ELEMENT* 25))

 (if (and (setq ensel (entsel "\nDistanzkorb-Text wählen oder <Neuer einfügen>: "))
          (setq ensel2 (car (nentselp (cadr ensel)))))
	
     		 (progn
		    (setq tag (cdr (assoc 2 (entget ensel2)))
			  obj (vlax-ename->vla-object (cdr (assoc 330 (entget ensel2))))
                          tag2 (LM:GetAttributeValue (car ensel) "KUFU" )) 	    

		    (cond ((= tag "KUFU")
			     (initget 1 "Mit Ohne")
	  		     (setq *KUFU* (strcase (getkword "\nMit oder ohne KUFU (Mit/Ohne): ")T))
			     (LM:vl-setattributevalue obj "KUFU" (strcat "DK " *KUFU* " KUFU")))
	 		  ((= tag "ANZAHL")
			     (initget 7)
			     (setq *ANZAHL* (:roundUpToTens (getint "\nAnzahl Körbe: "))
		                   *LÄNGE* (* *ANZAHL* 2.5))
			     (LM:vl-setattributevalue obj "LÄNGE" *LÄNGE*)
			     (LM:vl-setattributevalue obj "ANZAHL" *ANZAHL*))
			  ((= tag "HÖHE")
			     (cond ((= tag2 "DK mit KUFU") (initget "2 2.5 3 3.5 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110"))
	   	                   ((= tag2 "DK ohne KUFU") (initget "4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130")))
		       	     (setq *HÖHE* (getkword "\nHöhe der Körbe: "))
		             (LM:vl-setattributevalue obj "HÖHE" *HÖHE*))
			  ((= tag "LÄNGE")
			    (alert "Die Länge wird durch die Anzahl Körbe automatisch bestimmt."))
			  ((= tag "ELEMENT")
		  	     (initget 7)
			     (setq *ELEMENT* (getint "\nElementstärke: "))
  		   	     (LM:vl-setattributevalue obj "ELEMENT" (strcat "für Element d=" (itoa *ELEMENT*) "cm"))))
      		 )
      		 (progn
  		    (command "_.INSERT" "spi-bew-dkm" "_s" 1 "_r" 0)			
           	    (princ "\nIn Eisenliste bei Distanzkörbe einfügen: \n")				
           	    (command PAUSE)
           	    (setq obj (vlax-ename->vla-object (entlast)))

		    (initget "Mit Ohne")
	            (setq *KUFU* (strcase (cond ((getkword (strcat "\nMit oder ohne KUFU (Mit/Ohne) <" *KUFU* ">: ")))(*KUFU*))T))
		    (LM:vl-setattributevalue obj "KUFU" (strcat "DK " *KUFU* " KUFU"))

	   	    (initget 6)
	   	    (setq *ANZAHL* (:roundUpToTens (cond ((getint (strcat "\nAnzahl Körbe <" (itoa *ANZAHL*) ">: ")))(*ANZAHL*))))
		    (LM:vl-setattributevalue obj "ANZAHL" *ANZAHL*)
		    (setq *LÄNGE* (* *ANZAHL* 2.5))

		    (while (= *loop* nil)	
	   	    (cond ((= *KUFU* "mit") (initget "2 2.5 3 3.5 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100  101 102 103 104 105 106 107 108 109 110"))
	   	          ((= *KUFU* "ohne") (initget "4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100  101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130")))
		    (setq *HÖHE* (getkword (strcat "\nHöhe der Körbe <" *HÖHE* ">: "))
			  *HÖHE* (if (= *HÖHE* nil) *HÖHEo* *HÖHE*))
			  
		    (cond ((and (= *KUFU* "mit")(= *HÖHE* "51"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil))
			  ((and (= *KUFU* "mit")(= *HÖHE* "53"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil))
			  ((and (= *KUFU* "ohne")(= *HÖHE* "2"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil))
			  ((and (= *KUFU* "ohne")(= *HÖHE* "2.5"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil))
			  ((and (= *KUFU* "ohne")(= *HÖHE* "3"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil))
			  ((and (= *KUFU* "ohne")(= *HÖHE* "3.5"))(princ "\nKorbhöhe nicht vorhanden!")(setq *loop* nil))
			  (T (setq *loop* 1)))

		    ); end of while

           	    (LM:vl-setattributevalue obj "HÖHE" *HÖHE*)
           	    (LM:vl-setattributevalue obj "LÄNGE" *LÄNGE*)

	   	    (initget 6) 
	   	    (setq *ELEMENT* (cond ((getint (strcat "\nElementstärke <" (itoa *ELEMENT*) ">: ")))(*ELEMENT*)))
		    (LM:vl-setattributevalue obj "ELEMENT" (strcat "für Element d=" (itoa *ELEMENT*) "cm"))
           	   ))

  (setvar 'ATTREQ oATTREQ)
  (setvar 'ATTDIA oATTDIA)
  (vla-endundomark doc)
  (prin1)
) ; end of defun