Edit AutoCAD attributes

Edit AutoCAD attributes

Anonymous
Not applicable
1,656 Views
9 Replies
Message 1 of 10

Edit AutoCAD attributes

Anonymous
Not applicable

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

 

 

0 Likes
Accepted solutions (1)
1,657 Views
9 Replies
Replies (9)
Message 2 of 10

Anonymous
Not applicable

Hey Michael,

 

Did you ever get this to work?

 

What namespace does AcadAttributesMapping belong to?

 

Thank you

 

0 Likes
Message 3 of 10

Anonymous
Not applicable
Accepted 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.

Message 4 of 10

Anonymous
Not applicable

What a legend! Thank you! 

0 Likes
Message 5 of 10

dave_deane
Advocate
Advocate

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

0 Likes
Message 6 of 10

Anonymous
Not applicable

You have to reference

Autodesk.AutoCAD.Interop

and

Autodesk.AutoCAD.Interop.Common

 
Michael
Message 7 of 10

dave_deane
Advocate
Advocate

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

0 Likes
Message 8 of 10

Anonymous
Not applicable

You need to put the imports namespace names in the code as well.

 

Imports Autodesk.AutoCAD.Interop.Common

Message 9 of 10

dave_deane
Advocate
Advocate

Thank you...it is working now.

 

Dave

Spoiler
 

 

0 Likes
Message 10 of 10

Anonymous
Not applicable

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

0 Likes