.NET
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page
AcadAttrib ute vs AcadAttrib uteReferen ce
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
What is the difference between the two? I am running some code to pull the .TextString from the attribute but if I pull it from an AcadAttribute I usually just get a '-' and if I pull it from an AcadAttributeReference I get the correct thing.
Currently I'm looping through the entire model spaces entity collection to find blocks and then attributes in that block. Is there an easier way? Can one use selection sets?
Re: AcadAttrib ute vs AcadAttrib uteReferen ce
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Hi,
For example, Block Definition is a template and Block reference is an instance created using that template.
On similar lines, we have an attribute definition and an attribute reference.
For this reason, when you extract the text info from the attribute definition, it returns nothing because it is only a template.
Only the instances will have valid values.
Regarding your other query : You will need to iterate through the model space to find the block references. Selection API do not work on entities not visible in the editor, but a zoom all before you use it may help.
Balaji
Developer Technical Services
Autodesk Developer Network
Re: AcadAttrib ute vs AcadAttrib uteReferen ce
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Thanks for the reply. That clears up my first question. For the second, one I am still a bit confused. For example I have this:
For Each entity As AcadEntity In modelSpaceIf TypeOf entity Is AcadBlockReference Then
Dim block = DirectCast(entity, AcadBlockReference)
'//loop through the attributes
End If Next
Can this be made any faster? Enumerating all the entities in an ACAD drawing can take some time.
Re: AcadAttrib ute vs AcadAttrib uteReferen ce
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
If you're using Interop so you can try this quick code scratch,
just you don't forget to change the drawing name before.
See result in the command line
{code}
Public Sub InteropDemo()
Dim miss As Object = Type.Missing
Dim AcadApp As AcadApplication = New Autodesk.AutoCAD.Interop.AcadApplication()
AcadApp.Visible = True
AcadApp.WindowState = AcWindowState.acMax
Dim adoc As AcadDocument = AcadApp.Documents.Open("c:\test\MyDrawing.dwg")
adoc.Application.ZoomExtents()
Dim util As AcadUtility = adoc.Utility
Dim oSset As AcadSelectionSet = adoc.SelectionSets.Add("mySset")
' get current tab name
Dim layout As Object = adoc.GetVariable("ctab")
' using filter
' important: use short[] for dxf codes:
Dim dxfcode As Short() = New Short() {0, 66, 410}
' use object[] for dxf values:
Dim dxfvalue As Object() = New Object() {"insert", 1, layout}
' select all attributed block instances in the current tab
oSset.Select(AcSelect.acSelectionSetAll, miss, miss, DirectCast(dxfcode, Object), DirectCast(dxfvalue, Object))
' send message to the command line:
adoc.Utility.Prompt(String.Format(vbLf & "Selected: {0} objects", oSset.Count))
For Each ent As AcadEntity In oSset
' important: cast if AcadEntity is AcadBlockReference
Dim oblkRef As AcadBlockReference = TryCast(ent, AcadBlockReference)
If oblkRef IsNot Nothing Then
' send message to the command line:
util.Prompt(String.Format(vbLf & "Block Name:" & vbTab & "{0}", oblkRef.Name))
Dim attVar As Object = oblkRef.GetAttributes()
' important: cast if object is array
If attVar.GetType().IsArray Then
Dim attColl As Object() = TryCast(DirectCast(attVar, Object()), Object())
If attColl IsNot Nothing Then
For i As Integer = attColl.GetLowerBound(0) To attColl.GetUpperBound(0)
' important: cast if object is AcadAttributeReference
Dim attRef As AcadAttributeReference = TryCast(attColl(i), AcadAttributeReference)
If attRef IsNot Nothing Then
' send message to the command line:
util.Prompt(String.Format(vbLf & "Tag: {0}" & vbTab & "Value: {1}", attRef.TagString, attRef.TextString))
End If
Next
End If
End If
End If
Next
End Sub
{code}
~'J'~
C6309D9E0751D165D0934D0621DFF27919
Re: AcadAttrib ute vs AcadAttrib uteReferen ce
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Thanks! I'll dissect your code and see how it turns out.

