<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: LISP program for checking drawings in Visual LISP, AutoLISP and General Customization Forum</title>
    <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7512619#M112608</link>
    <description>&lt;P&gt;Works perfectly. I'll study your code and see if I can&amp;nbsp;learn how to expand the functionality. Thank you!&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 02 Nov 2017 18:05:06 GMT</pubDate>
    <dc:creator>emryz</dc:creator>
    <dc:date>2017-11-02T18:05:06Z</dc:date>
    <item>
      <title>LISP program for checking drawings</title>
      <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7507848#M112603</link>
      <description>&lt;P&gt;I've been trying to make a LISP program that checks the value of specific attributes within a block, and if the value is not what it should be, it logs it as an error. I would like to use this as a final check for those little "gotchas" before submitting our&amp;nbsp;drawings.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've tried to use&amp;nbsp;code from various posts across the internet, but&amp;nbsp;don't have enough skills with LISP yet to make it work properly. This is one template that I've found to be closest to my end goal:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;(vl-load-com)

(defun C:demo  (/ blockdata blockdef blockname blockref en ent tmp)
  (if (setq ent (entsel "\n   &amp;gt;&amp;gt;   Select a block instance   &amp;gt;&amp;gt;"))
    (progn
      (setq en	      (car ent)
	    blockref  (vlax-ename-&amp;gt;vla-object en)
	    blockname (vla-get-effectivename blockref)
	    blockdef  (vla-item
			(vla-get-blocks
			  (vla-get-activedocument (vlax-get-acad-object)))
			blockname)
	    )
      (if (equal :vlax-true (vla-get-hasattributes blockref))
	(progn
	(princ "\n")
	(princ en)
	
	(princ "\n")
	(princ blockref)
	
	(princ "\n")
	(princ blockname)
	
	(princ "\n")
	(princ blockdef)
	
	(princ "\n")
	(princ "\n")
	(princ "\n")
	  (foreach attrib  (vlax-invoke blockref 'GetAttributes)
	    (vlax-for item  blockdef
	      (if (equal (vla-get-objectname item) "AcDbAttributeDefinition")
		(progn
		  (if (equal (vla-get-tagstring attrib) (vla-get-tagstring item))
		    (progn
		      (setq tmp	(list
				  (vla-get-promptstring item)
				  (vla-get-tagstring attrib)
				  (vla-get-textstring attrib)))
		      (setq blockdata (cons tmp blockdata))
		      )
		    )
		  )
		)
	      )
	    )
	  (setq blockdata(reverse blockdata)
		)
	  (foreach lst blockdata
	    (princ (strcat "\n Prompt: "
			   (car lst)
			   " *** Tag: "
			   (cadr lst)
			   " *** Value: "
			   (last lst)))
	    )
	  )
	)
      )
    (princ "\n  &amp;gt;&amp;gt;  Nothing selected. Try again...")
    )
  (princ)
  )&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, I would like to delete the following line:&lt;/P&gt;&lt;PRE&gt;&lt;STRIKE&gt;(if (setq ent (entsel "\n   &amp;gt;&amp;gt;   Select a block instance   &amp;gt;&amp;gt;"))
    (progn&lt;/STRIKE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And instead, I would like the block that the LISP program is looking for, to be predefined within the LISP program. So, no user input. From there, the LISP program checks attribute values of that block for other predefined values. Can anyone help?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Rob&lt;/P&gt;</description>
      <pubDate>Wed, 01 Nov 2017 12:58:35 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7507848#M112603</guid>
      <dc:creator>emryz</dc:creator>
      <dc:date>2017-11-01T12:58:35Z</dc:date>
    </item>
    <item>
      <title>Re: LISP program for checking drawings</title>
      <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7508782#M112604</link>
      <description>&lt;P&gt;Give this a try.&amp;nbsp; - Lanny&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;(vl-load-com)

(defun C:demo  (/ blocknames objLayout objEnt blockdata blockdef blockname  en  tmp)
  
  (setq blocknames (list "BLOCK1" "BLOCK6" "BLOCK23")) ; &amp;lt;-- list of all block names you want to check (USE ALL CAPS HERE)

  (vlax-for objLayout (vla-get-Layouts (vla-get-activedocument (vlax-get-acad-object)))
    (vlax-for objEnt (vla-get-Block objLayout)
      (if (and
            (equal (vla-get-objectname objEnt) "AcDbBlockReference")
            (member (strcase (setq blockname (vla-get-effectivename objEnt))) blocknames)
            (equal :vlax-true (vla-get-hasattributes objEnt))
        )
        (progn
            (setq en (vlax-vla-object-&amp;gt;ename objEnt)
                 blockdef  (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) blockname)
            )

            (princ "\n")
            (princ en)
            
            (princ "\n")
            (princ objEnt)
            
            (princ "\n")
            (princ blockname)
            
            (princ "\n")
            (princ blockdef)
            
            (princ "\n")
            (princ "\n")
            (princ "\n")
              (foreach attrib  (vlax-invoke objEnt 'GetAttributes)
                (vlax-for item  blockdef
                  (if (equal (vla-get-objectname item) "AcDbAttributeDefinition")
                    (progn
                      (if (equal (vla-get-tagstring attrib) (vla-get-tagstring item))
                        (progn
                          (setq tmp (list
                              (vla-get-promptstring item)
                              (vla-get-tagstring attrib)
                              (vla-get-textstring attrib)))
                          (setq blockdata (cons tmp blockdata))
                          )
                        )
                      )
                    )
                  )
                )
              (setq blockdata(reverse blockdata))
              (foreach lst blockdata
                (princ (strcat "\n Prompt: "
                       (car lst)
                       " *** Tag: "
                       (cadr lst)
                       " *** Value: "
                       (last lst)))
              )
        )
      )
    )
  )
  (princ)
)&lt;/PRE&gt;</description>
      <pubDate>Wed, 01 Nov 2017 17:23:05 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7508782#M112604</guid>
      <dc:creator>lando7189</dc:creator>
      <dc:date>2017-11-01T17:23:05Z</dc:date>
    </item>
    <item>
      <title>Re: LISP program for checking drawings</title>
      <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7508838#M112605</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/2769686"&gt;@emryz&lt;/a&gt; wrote:&lt;BR /&gt;
&lt;P&gt;I've been trying to make a LISP program that checks the value of specific attributes within a block, and if the value is not what it should be, it logs it as an error. I would like to use this as a final check for those little "gotchas" before submitting our&amp;nbsp;drawings..&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;... And instead, I would like the block that the LISP program is looking for, to be predefined within the LISP program. So, no user input. From there, the LISP program checks attribute values of that block for other predefined values. Can anyone help?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;Rob&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Easy coding, Where would you base the value&amp;nbsp;for checking? from an external source? or a hard-coded value? it would be odd to think that the "correct values" are based on a constant value.&amp;nbsp; More information please.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;pBe&lt;/P&gt;</description>
      <pubDate>Wed, 01 Nov 2017 17:41:41 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7508838#M112605</guid>
      <dc:creator>pbejse</dc:creator>
      <dc:date>2017-11-01T17:41:41Z</dc:date>
    </item>
    <item>
      <title>Re: LISP program for checking drawings</title>
      <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7511811#M112606</link>
      <description>&lt;P&gt;Lanny,&lt;/P&gt;&lt;P&gt;Thanks for the reply. Your code worked as intended. I tried to expound further on the code you wrote, but I didn't get very far. Would you be able to fill in the blanks? BTW....why do the blocknames need to be capitalized?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Lanny/pBe,&lt;/P&gt;&lt;P&gt;The end goal of&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;LISP program will be to check&amp;nbsp;drawings for certain values that I know are always going to be the same. I am ok with adding Block Names, Attribute Names, and expected Attribute Values as hard code in the LISP program. It doesn't need to be sourced externally. At the end, it will output the result of all the checks to a txt file. If one of the values is different than what is expected, it makes an additional note for that Attribute Value on the output file. Sorry for being too vague earlier. Hopefully this clears up the end goal of the program.&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks again for all the help!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;(vl-load-com)

(defun C:test9  (/ blocknames objLayout objEnt blockdata blockdef blockname  en  tmp)
  
  (setq blocknames (list "CAD-STD-FRONTSHEET") ; &amp;lt;-- list of all block names you want to check (USE ALL CAPS HERE)
;;;	attnames (list "DEPARTMENT")
;;;	attvalue (list "ENGINEERING")
  )

;;;******************************************************
;;;Look for predefined blocks

  (vlax-for objLayout (vla-get-Layouts (vla-get-activedocument (vlax-get-acad-object)))
    (vlax-for objEnt (vla-get-Block objLayout)
      (if (and
            (equal (vla-get-objectname objEnt) "AcDbBlockReference")
            (member (strcase (setq blockname (vla-get-effectivename objEnt))) blocknames)
            (equal :vlax-true (vla-get-hasattributes objEnt))
        )
        (progn
            (setq en (vlax-vla-object-&amp;gt;ename objEnt)
                 blockdef  (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) blockname)
            )
;;;
;;;******************************************************
;;;If block is found, look for a predefined attribute name within the block.
;;;
;;;	(if (equal (blocknames "CAD-STD-FRONTSHEET")
;;;		(progn
;;;		   (if (equal attnames "DEPARTMENT")
;;;			????????? 
;;;			????????? 
;;;			????????? 
;;;		   )
;;;	)
;;;
;;;******************************************************
;;;Check value of attribute value.
;;;If attribute value does not equal predefined value, flag the error.
;;;
;;;	????
;;;
;;;
;;;******************************************************
;;;Output log of all checks.
;;;
;;;	   (foreach attname (print attname))
;;;
;;;******************************************************
;;;Output list of attribute values that flag as error.
;;;
;;;	????
;;;
;;;******************************************************

        )
      )
    )
  )
  (princ)
)&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 02 Nov 2017 14:55:57 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7511811#M112606</guid>
      <dc:creator>emryz</dc:creator>
      <dc:date>2017-11-02T14:55:57Z</dc:date>
    </item>
    <item>
      <title>Re: LISP program for checking drawings</title>
      <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7512158#M112607</link>
      <description>&lt;P&gt;It is all caps due to the evaluation to see if the blockname being checked is a member of the blocknames list.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &lt;FONT face="courier new,courier" size="2"&gt;(member (&lt;FONT color="#FF0000"&gt;strcase &lt;/FONT&gt;(setq blockname (vla-get-effectivename objEnt))) blocknames)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you want it to be case sensitive, just remove the strcase:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;FONT face="courier new,courier" size="2"&gt;&lt;STRONG&gt;(member (setq blockname (vla-get-effectivename objEnt)) blocknames)&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Here is the updated routine (note:&amp;nbsp; the entry for 'SHOP-ORDER-PART-ITEM' within 'BlockCheckingInfo' is a test of my own block)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;(vl-load-com)

(defun C:test9  (/ dxf GetAttributeList
                   BlockCheckingInfo
                   blocknames objLayout objEnt blockname chklist attlist errlist)

  ;;;* BEGIN NESTED FUNCTIONS

	(defun dxf (code EnameOrElist / VarType)
	  (setq VarType (type EnameOrElist))
	  (if (= VarType (read "ENAME"))
	    (cdr (assoc code (entget EnameOrElist)))
	    (cdr (assoc code EnameOrElist))
	  )
	)
  
	(defun GetAttributeList  (enam AsEverything / alis)
	  (setq  elis (entget enam)
	  alis nil
	  )
	  (if (and (= (dxf 0 elis) "INSERT")
	     (= (dxf 66 elis) 1)
	     (/= (logand 4 (dxf 70 elis)) 4)
	      )
	;;;* is block, with attributes, not xref
	    (while (/= (dxf 0 elis) "SEQEND")
	      (setq elis (entget (entnext (dxf -1 elis))))
	      (if (/= (dxf 0 elis) "SEQEND")
		  (if AsEverything
		    (setq alis (append alis (list elis)))
		    (setq
		      alis (append alis (list (cons (dxf 2 elis) (dxf 1 elis))))
		    )
		  )
	      )
	    )
	  )
	  alis
	)

  ;;;* END NESTED FUNCTIONS

  
  ;;;* MAIN DATASET CHECK
  (setq BlockCheckingInfo
     (list
       (cons "CAD-STD-FRONTSHEET" (list
         (cons "DEPARTMENT" "ENGINEERING")
       ))
       (cons "BLOCKNAME1" (list
         (cons "ATTNAME1" "ATTVAL1")
         (cons "ATTNAME2" "ATTVAL2")
         (cons "ATTNAME3" "ATTVAL3")
       ))
       (cons "BLOCKNAME2" (list
         (cons "ATTNAME1" "ATTVAL1")
         (cons "ATTNAME2" "ATTVAL2")
       ))
       (cons "BLOCKNAME3" (list
         (cons "ATTNAME1" "ATTVAL1")
         (cons "ATTNAME2" "ATTVAL2")
         (cons "ATTNAME3" "ATTVAL3")
         (cons "ATTNAME4" "ATTVAL4")
       ))
       (cons "SHOP-ORDER-PART-ITEM" (list ;; &amp;lt;- Lando's test block line
         (cons "SURF1" "13841")
         (cons "SURF2" "13841")
       )) 
     )
  )

;;;******************************************************
;;;Look for predefined blocks

  (vlax-for objLayout (vla-get-Layouts (vla-get-activedocument (vlax-get-acad-object)))
    (vlax-for objEnt (vla-get-Block objLayout)
      (if (and
            (equal (vla-get-objectname objEnt) "AcDbBlockReference")
            (setq chklist (cdr (assoc (strcase (setq blockname (vla-get-effectivename objEnt))) BlockCheckingInfo)))
            (equal :vlax-true (vla-get-hasattributes objEnt))
        )
        (progn
          (setq en (vlax-vla-object-&amp;gt;ename objEnt))
          (setq attlist (GetAttributeList en nil))
          (mapcar '(lambda (x / y)
                     (cond
                       ((not (setq y (assoc (car x) attlist)))
                        (setq errlist (cons (list "attrib not found" x y blockname en) errlist))
                       )
                       ((not (equal (cdr x) (cdr y)))
                        (setq errlist (cons (list "invalid value"    x y blockname en) errlist))
                       )
                     )
                   )
             chklist
          )
        )
      )
    )
  )
  (if errlist
    (foreach errset errlist
      (print errset)
    )
    (princ "\nNo errors found.")
  )
  (princ)
)&lt;/PRE&gt;</description>
      <pubDate>Thu, 02 Nov 2017 16:08:51 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7512158#M112607</guid>
      <dc:creator>lando7189</dc:creator>
      <dc:date>2017-11-02T16:08:51Z</dc:date>
    </item>
    <item>
      <title>Re: LISP program for checking drawings</title>
      <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7512619#M112608</link>
      <description>&lt;P&gt;Works perfectly. I'll study your code and see if I can&amp;nbsp;learn how to expand the functionality. Thank you!&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 02 Nov 2017 18:05:06 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/7512619#M112608</guid>
      <dc:creator>emryz</dc:creator>
      <dc:date>2017-11-02T18:05:06Z</dc:date>
    </item>
    <item>
      <title>Re: LISP program for checking drawings</title>
      <link>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/10692588#M112609</link>
      <description>&lt;P&gt;Hello Lany,&lt;/P&gt;&lt;P&gt;I need one help, I am trying to run lisp routine to cross check drawing Bill of material text before closing drawing and send to customer. I want to add alert which will pop up window message saying that ''BOM checked '' and after accepting this my drawing file should get closed or saved. can i do this. can you give me some suggestion&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Sagar&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 16 Oct 2021 12:00:23 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-program-for-checking-drawings/m-p/10692588#M112609</guid>
      <dc:creator>sagar.adhau</dc:creator>
      <dc:date>2021-10-16T12:00:23Z</dc:date>
    </item>
  </channel>
</rss>

