AutoCAD .NET :: Updating Block Attributes In Each Ps Layout?
Jun 29, 2012
I'm working on a program that cycles through each paperspace layout in a drawing and updates the sheet number and total quantity of sheets in the titleblock attributes. I've updated the block attributes in paperspace before, and it worked fine. Now that I'm trying to cycle through each layout, I cannot get it to work. I have attached my code. I beleive it starts to cycle through the layouts, but it fails when I try to grab the attribute collection.
Public Sub UpdateSheetNumbers() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Dim ed As Editor = doc.Editor Dim layoutCount As Integer =
So I am Loving the use of Attout and Attin for updating block attributes from a spread sheet...Currently I am producing drawings with names on desks. I have created a block with the attributes of Name and desk.
I am currently updating the drawings blocks so that I can input an excel spreadsheet with over 1500 names into the drawing using Attin (changed the .xls to .txt and roberts your mothers brother)
Unfortunately the spreadsheets I have been given have the name as one field. i.e name: Joe Bloggs, Ideally I would have the information as First Name: Joe last name: Bloggs and create two associated attributes which would enable a nicely displayed block..
is there any way that I can format the block so that the attribute displays as a multi line..e.g.
Joe Bloggs
not
Joe Bloggs.
I know I can go into each attribute (although trying to remember that command "A something Edit" I think) and edit it like a piece of txt. I would rather not have to go and do that if there is another work around..
I am working on a set of drawings that include attributes that are numerically sheet specific (page numbers and the like)
I saw a previous post that allows tabs to display block info, but is there a way to get blocks to refer to tab info?
Essentially, I am trying to label match lines from page to page. Being able to have these labels refer to the numeric value of the layout tab, tab previous, and/or tab after would be extremely useful and time saving.
I am trying to update blocks from a selection set and based on two specific attributes. I get and error eLock Violation
Not sure where it comes from since this is a dll.
Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Dim ed As Editor = doc.Editor Dim x As Integer = 0 Dim tr As Transaction = db.TransactionManager.StartTransaction() MsgBox("Going into attribute write", MsgBoxStyle.OkOnly) Try Dim idArray As ObjectId() = selSet.GetObjectIds() For Each blkId As ObjectId In idArray Dim blkRef As BlockReference = [Code]........
The only stipulation is my company uses AutoCAD 2012 LT. I am not familiar with Lisp/VBA programming codes but I have done an "appload" before, but that does not work with LT versions.
Question: How do I update multiple template blocks based off of the first template? Currently we have been using one primary drawing sheet and are now going to be implementing a detail sheet.
We use a number of blocks with block tables for data extraction here, and whenever one of the blocks is modified and updated, all of the block tables reset to the default value. This happens for any block reference change, not just changes to the block table (which makes sense that it would reset).
How can we update these blocks without having to manually change all of the block tables afterwards?
I was curious to see if there's a way to set up Autocad (2010) to recognize when MTEXT objects are edited, and have it adjust their defined width automatically (both single- and multi-line)--versus having to click on the arrow every time to snap the text box "margin" to the actual text. I'd like to do this to keep my background masks the exact width of the text; I just hate it when the mask doesn't cover enough of the text, or when it covers more and the background is unnecessarily obscured. I'm careful about keeping things neat, but my coworkers aren't .
Is there a way to create a block with attributtes that automatically complete x, y, z, lat, long for the insertion point of the block?
I am trying to complete text in paperspace that will automatically fill in the lat long of a point in model space without using a table. I have tried field insertion with reference to a cogo point, but it doesn't give options for position on a cogo point. If I pick a block with attributes, it will let me pick any attributes, and x,y position for the block.
Cogo points show all the information I need to propagate in the properties....but how do I get that to translate into the text using fields or some other method?
Dell Precision T3600 - Windows 7 64-bit NVIDIA Quadro 600 Intel(R) Xenon(R) CPU E5-1607 0 @ 3.00GHz 3.00GHz 8 GB ram - Two 1TB raid
I would like to change sub block from a visibility after setting it. Here an example of code to get the right visibility, I don't really know how to update a sub block by name or by handle(seems to change inside dynamic block).
Dim Block As AcadBlock Dim BlockRef As AcadBlockReference Dim DynEntBlock As AcadEntity Dim DynObjRefH As IAcadBlockReference [Code]........
I can insert a block with block attributes using the Inter op very easily:
Dim theBlock AsAcadBlockReference Dim pickScreenVBA = myDoc.Utility.GetPoint(, "insert the hydrant") theBlock = myDoc.ModelSpace.InsertBlock(pickScreenVBA, "Hydrant", 1.0#, 1.0#, 1.0#, 0) Dim varAttributes AsObject varAttributes = theBlock.GetAttributes varAttributes(0).TextString ="3 Ports" varAttributes(1).TextString ="Salt water"
Works great, but when I try using the non-inter op, all the example insert new Attributes and not add block with existing attribute (so I end up with duplicate attributes for each block - i.e "Salt water" attribute is added to the block each time I run the code),
Are they any examples that does the same as above using the non-interop code?
I'm trying to add some attributes to an existing block using the block editor, but after I save and close it I cannot see any 'placeholders' despite adding a default value and the attributes work fine when I double click the block.
I've tried using the ATTSYNC and BATTMAN commands but nothing works and there are no invisibility states applied to either the attribute or block and all layers are switched on.
I just tried making a quick block from scratch and it seems to have the same affect, except the default value will show, but no 'placeholder' shown if left blank.
I swear with previous version I could see the tag when a value hadn't been applied, so is it that the version I now use (2012) does not have this feature or it's disabled?
I am having an issue with my template that I created from an old drawing: the quick view layout thumbnail still shows the old drawing in model space. All of the paper space thumbnails update themselves as I work, however model space does not. It shows the old drawing both when I hover over the model space tab, and also when I pull up all of my quick view layouts. I am using AutoCAD 2009
For the past 2 days when I switch from one drawing to another, my layout tabs are not updating and stay the same as the previous drawings. I have to do a regen to get the proper tabs in place. All the layouts are there...it is just the tabs that are messed up. Once I click on one of the tabs they straighten themselves out as well, but on that first selection I never get the correct drawing that I want!
I'm trying to chnage the text of the sheet number and total sheet number attributes for each layout in my drawing. I have code that adds and deletes the specified pages, now I need to edit the attributes to reflect the correct page and correct total amount of pages. Here is my code, based on my old VBA version.
I know there is a problem with the line:
For Each item In myBTR.ObjectId
I've used a number of websites and books, but I would really like to find something that teaches about block tables, block table references, block table IDs so I can get a better understanding of breaking stuff down to get the info I need.
Public Sub updatePageNumbers() Dim myDWG As Autodesk.AutoCAD.ApplicationServices.Document Dim myDB As Autodesk.AutoCAD.DatabaseServices.Database Dim myTransManForPageNumbers As Autodesk.AutoCAD.DatabaseServices.TransactionManager Dim myTransForPageNumbers As Transaction
Every time I try to update blocks with attributes of a given layout, this only updates the last active layout. example:
I have three layouts: Layout1, Layout2 and Layout3
layout of the three blocks I would need to update the reference but I can Layout1 default that always takes the last active layout. In the following paper space specific code, but as it would to tell a particular layout.
Private Sub UpdateAttributesInDatabase(ByVal db As Database, ByVal blockName As String, ByVal attbName As String, ByVal attbValue As String) Dim psId As ObjectId Dim tr As Transaction = db.TransactionManager.StartTransaction() Using tr Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable) psId = bt(BlockTableRecord.PaperSpace) tr.Commit() End Using UpdateAttributesInBlock(db, psId, blockName, attbName, attbValue) End Sub
I got too smart for myself today in bringing an old drawing up to current standards...Everyone seems to want their block attributes to be zero - I have blocks where the attributes are best when they match the rotations of each blocks.
I have an old drawing that was rotated (as it should be) at approx 2deg.
I used a lisp routine to global edit all the blocks that needed to be at zero. BUT for some reason (and after hundreds of blocks were corrected), I noticed I now have two blocks that should NOT have been in the set have had their attributes rotated to zero....and the attributes should be at the same rotation as their block's rotation.
Because those two blocks have a fixed tic mark, I can click on the mark to see what the block rotation is, then rotate its attribute to that rotation, but I have hundreds of blocks! One-at-a-time sucks....
Any chance there is a GLOBAL way to edit an attribute rotation to match its own block's rotation?
I have created an annotative block. This block is displayed in a few different viewports at different scales. After I create the block I go and check the viewports and it is displaying well. The linework (polylines and a circle) is annotative as is the text in the block.
However, if I then change the scale/annotative scale of a viewport, the block doesn't seem to update properly. The text within the block updates to the new size although the linework within the block doesn't seem to scale and resets back to the model space size.
I've tried regenning etc with no luck. Is there a command I need to use after changing a viewport scale to force annotative blocks to update?
I have a drawing that has about 450 identical instances of a block. The block has visibility options to show different things. I don't want to edit the block as there isn't anything wrong with it.
What i need to is update the blocks all together to change visibilities.
I have a block that has to be update in a bunch of drawings -more than 20-. I updated in only one drawing, apply coy paste to the following but the block does not update in the drawing that I am pasting my new block. How is possible to update this block in the following 19 drawings?
I've made a block with fields linked to attributes (so when I change the value of the "master" attribute, the field values will change).
*NOTE* the fields are contained within a piece of MTEXT and NOT within another attribute.
The fields will not read the "value" of the attributes they are connected to, unless I explode the block (and change the DEFAULT value), or use regular text instead of attributes.
FIELDEVAL - set to 31
UPDATEFIELD - returns: "2 fields found, 2 fields updated" but it doesn't actually update them.
Regen/Regenall/Save - does nothing
BATTMAN - SYNC - does nothing
Lastly, I noticed that if I use "loose" text outside the block, but still link the fields (that are inside the block) to that text, they will update when I change the text contents after regen. AutoCAD is just having trouble using fields+attributes.
I have a small vba sub wich changes the color and layer of all entities inside a block. It seems to work pretty well for the majority of blocks, but then if I try that on a dynamic block, the definition is correctly altered, but the references aren't updated...
I know for a fact that the definition has been correctly modified because if I type bedit, I can see the definition is modified. Then, in the block editor, if I save the block, the references are correctly updated.
How to force references to update after I made the modifications inside the definition ?
I searched for methods within the VBA Reference and I tried blockRef.Update but it doesn't seem to have any effect.
Fairly versed with Dynamic blocks here, so the first thing I checked was to make sure that my FIELDEVAL was set to 31 to ensure updates but this one isn't working for me and may be a limitation of the software?
I'm making a dynamic block for my users who aren't familiar with electrical wiring so I am developing a series of blocks for our typical wiring configurations. In this instance, I've setup a pair of attributes to allow the changing of wire color codes and I want to use that single attribute entry to used in multiple other locations that are also connected to that conductor in certain situations. I have setup a field within this block to be the "VALUE" of the object (the attribute) in order to accomplish this. Unfortunately it is only displaying the default value I have for the attribute and will not update either upon insertion of the block or after an edit. Is this beyond the capabilities of Dynamic blocks or do I need to take a different approach?
Function ReadDWG(ByVal DWGName As String) Dim AcadApp As AcadApplication Dim AcadDoc As AcadDocument Dim Extracted_title As String RichTextBox1.AppendText(Path.GetFileName(DWGName)) RibbonLabel1.Text = "Opening AutoCAD"
[Code]...
I am using the above code to read block attributes depending on the name. But now I need to read the active drawing (drawing will be open and should read from the active document). In the above code I have referenced interop.dll. without that can I retrieve the block attributes. How to read the block attributes from the active document.
Attached is my latest block that I'm working on. how to keep a field readable (horizontal) when rotated. What I need to do to update a field that is linked to an attribute when the attribute value is changed? The UPDATEFIELD command does not seem to work on it for me.
Using ACAD2014LT. I want to use the first variable attribute value as a variable in subsequent attributes in the same block. This will be extracted and used for tag references in a PLC program.
Along the line, i know I can change the enclosed character ( ' ), but can I remove it?
And I generated this code for read this file and insert one block with attributes for each line of text…..
If txtPath.Text() = "" Then MsgBox("Select DB .txt.", MsgBoxStyle.Exclamation) End If On Error GoTo ControlErroresBD Dim AcadDocPt As Document = [Code] ....
‘To the end of this line I can insert the block,,,,,,, but I don’t know how to write the attributes…… I tried with the next code but it doesn’t work…. My bloque has 3 attributes and every tag named with “PN”, “CD” and “CT”
Dim AcadObj As Entity For Each acObjId As ObjectId In AcadBlockRef.AttributeCollection AcadObj = AcadTransPt.GetObject(acObjId, OpenMode.ForWrite) Dim acAttDef As AttributeDefinition = TryCast(AcadObj, AttributeDefinition)
I have used the FDO to connect to my SHP files. I have used one data attribute to get a rotation for my blocks. I have also used a feature Label to display the text I am interested in.
When I save to DWG, the feature labels come in as Text. I would like the text to go to the correct block attribute.
Is there a way to do this? I did not see anything in the Style Editor to use my blocks' attributes, only the geometry.
I am aware of using MAPIMPORT to set attributes from the data, but they do not come in rotated, and I have more conditions on which block to use, not just one field to decide the block name.