We have a program to update our titleblocks, the following code has worked without problems in Inventor 2010.
But in Inventor 2012, it doesn't work every time. When I insert the titleblock for the first time I can fill the attributes,
but when I want to update the titleblock, I see no change, although it has changed the values, which I can see if I manually do an edit attributes (see screenshot).
Any ideas?
Thanks,
Michael
Public Shared Function SaveAutocadAttributes(ByVal intDocID As Integer, ByRef invApp As Inventor.Application) As Boolean Dim ht As Hashtable = AcadAttributesMapping(intDocID, invApp) Dim i As Integer Dim invDoc As DrawingDocument Dim acadDoc As AcadDatabase Dim objBlock As AcadBlock = Nothing Dim objAcadEntity As AcadEntity = Nothing Dim objAcadBlockReference As AcadBlockReference = Nothing Dim obj() As Object = Nothing Dim objAcadObject As AcadObject = Nothing invDoc = invApp.ActiveDocument acadDoc = invDoc.ContainingDWGDocument For Each objBlock In acadDoc.Blocks For Each objAcadEntity In objBlock If objAcadEntity.ObjectName.ToLower = "AcDbBlockReference".ToLower Then objAcadBlockReference = CType(objAcadEntity, AcadBlockReference) If objAcadBlockReference.HasAttributes Then Select Case objAcadBlockReference.Name Case "A0", "A1", "A2", "A3", "A3D", "A4", "P0", "P1", "P2", "P3", "P4" obj = DirectCast(objAcadBlockReference.GetAttributes, Object()) For i = LBound(obj) To UBound(obj) If ht.ContainsKey(obj(i).TagString) = True Then obj(i).TextString = ht.Item(obj(i).TagString) End If Next i End Select End If End If Next Next invDoc.Update() End Function
Solved! Go to Solution.
The following code code works for me.
Public Shared Sub SaveAttributes(ByVal strFieldVaule() As String, ByVal strFieldName() As String, ByRef invApp As Inventor.Application)
Dim myBlockRef As AcadBlockReference
Dim i As Short
Dim h As Short
Dim myAttributes As Object
Dim invDoc As DrawingDocument
Dim acadDoc As AcadDatabase
invDoc = invApp.ActiveDocument
acadDoc = invDoc.ContainingDWGDocument
For Each Entity In acadDoc.PaperSpace
If TypeOf Entity Is AcadBlockReference Then
myBlockRef = Entity
Select Case myBlockRef.Name
Case "A0", "A1", "A2", "A3", "A4", "P0", "P1", "P2", "P3", "P4"
myAttributes = Entity.GetAttributes
For i = LBound(myAttributes) To UBound(myAttributes)
For h = LBound(strFieldName) To UBound(strFieldName)
If strFieldName(h) = myAttributes(i).TagString Then
myAttributes(i).TextString = strFieldVaule(h)
End If
Next
Next i
End Select
End If
Next
invDoc.Update()
End Sub
AcadAttributesMapping was just a function that i made to put attribute values to a Hashtable.
I am trying to generate some code to read an Autocad created titleblock with attributes that is in a Inventor 2013 .dwg using Visual Studio Express 2010. However, I have three references "not defined" when starting with the code above.
I have referenced the Inventor's interop library, am I missing another reference? Please see attached screenshot..
AcadBlockReference, DrawingDocument, AcadDatabase are the ones missing.
Thanks,
Dave
You have to reference
Autodesk.AutoCAD.Interop
and
Autodesk.AutoCAD.Interop.Common
Thank you for replying Michael but oddly enough the reference is not defined after adding in autodesk.AutoCAD.Interop and Autodesk.AutoCAD.Interop.Common. Screen shot below.
Using Visual Studio 2010 express.
Dave
You need to put the imports namespace names in the code as well.
Imports Autodesk.AutoCAD.Interop.Common
Would it be possible to get a DWG or maybe a short video from someone that uses this? I am learing ilogic in inventor 2015 and I understand some of the code but I need help understanding how to impliment this. I just get errors when I try to add it to a rule. Thanks, Robert