Kenneth has a set of blocks that have attributes for the address and location of rooms in a building.
The address codes have a format such as XX: A1-01, and they never change, but the room location values may change, and they are subject to updating in the drawing.
I used a modest drawing with 25 room location attributes (figure 4) to test the code, and the room locations were updated (figure 5).
The program tests each address against the others, meaning it has to perform a number of tests equal to the square of the number of rooms. PROGRAMMING NOTES The program starts with my error handler and system variable manager that I have been using for more than ten years. The main function is ATTRIBUTE-REPLACER that sets up the environment for the object-oriented or Active X functions.
To test the code, I made a drawing with rooms and attributes for address codes and locations.
I named the blocks containing the attributes ROOM-ID, although any block name can be used.
The following code is then used to collect and filter all the blocks with attributes into a selection set of objects:(setq ssobj (vla-add ssets "selection1")) (vla-select ssobj ac Selection Set All) (setq j (- 1)) (setq Insert Obj List nil) (repeat (vla-get-count ssobj) (setq item (vla-item ssobj (setq j (1 j)))) (if (and (= (vla-get-Object Name item) "Ac Db Block Reference" ) ;_ end of = (= (vla-get-Has Attributes item) :vlax-true) ) ;_ end of and (progn (setq Insert Obj List (append Insert Obj List (list item))) ) ;_ end of progn ) ;_ end of if ) ;_ end of repeat I used entirely VLA- functions (methods) to create a list of insert objects with the test that the object name is Ac Db Block Reference.
To verify that the objects have attributes, the VLA-GET-HASATTRIBUTES method is used.
Kenneth Pettit e-mailed a request to take information from a Microsoft Access database and use that information to change Auto CAD attribute blocks.Using this type of object oriented code has benefits downstream because as soon as the list of attributed block references is created, the following while loop is used to finish the job of replacing attributes: The strx variable refers to each record from the comma-delimited file that is passed to the REPLACE-ATTRIB function along with the list of block reference objects.REPLACE-ATTRIB starts by getting the first, fifth, and sixth fields from the database comma-delimited record for the Block Name, Location, and Address, respectively, as shown in this code fragment: A repeat loop for the length of the list of block reference objects is used to process each object and to replace attribute values if necessary.Getting attributes with Visual LISP is easily done with the get Attributes method, as in the following: The variable attribs contains all the attribute objects attached to the block reference, and they are tested in turn to see if the address matches that of the current record (str). Finally, if the address is correct but the location does not match, the location is replaced with the new location in this code fragment:(if (= address (cdr addrpair)) (progn (if (/= location (cdr locpair)) (progn (setq element (car locpair)) (setq attrefobj (vlax-safearray-get-element sarr element)) (vla-put-Text String attrefobj location) ) ;_ end of progn ) ;_ end of if ) ;_ end of progn ) ;_ end of if Changing the attribute is done with the VLA-PUT-PROPERTY method as shown, in which the attribute value is the Text String property of the attribute object, and the new value is the LOCATION variable.As always, keep those requests coming in, and good programming.In this post we'll show the code to update the table from the spreadsheet, and in the next post we'll see some code to update the spreadsheet from the table (should it have been unlocked and edited).Here's the C# code: When you run the S2T (for Spreadsheet-to-Table) command, you will be prompted to select a table.The Microsoft Access table created by the Attribute Extraction tool is shown here (figure 1).The attribute values are Block name, Count, X insertion point, Y insertion point, LOCATION, and ADDRESS, as shown.Kenneth has used the Automatic Attribute Extraction tool to export his attributes directly into Access.It's interesting that this is now possible to do without knowledge of the format or type of data that is being exported, and even a template file is no longer needed.