Community
Inventor Programming - iLogic, Macros, AddIns & Apprentice
Inventor iLogic, Macros, AddIns & Apprentice Forum. Share your knowledge, ask questions, and explore popular Inventor topics related to programming, creating add-ins, macros, working with the API or creating iLogic tools.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Edit AutoCAD attributes

9 REPLIES 9
SOLVED
Reply
Message 1 of 10
VidarDK
1049 Views, 9 Replies

Edit AutoCAD attributes

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

 

 

9 REPLIES 9
Message 2 of 10
RyanBotha
in reply to: VidarDK

Hey Michael,

 

Did you ever get this to work?

 

What namespace does AcadAttributesMapping belong to?

 

Thank you

 

Message 3 of 10
VidarDK
in reply to: RyanBotha

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
RyanBotha
in reply to: VidarDK

What a legend! Thank you! 

Message 5 of 10
dave_deane
in reply to: VidarDK

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

Message 6 of 10
VidarDK
in reply to: dave_deane

You have to reference

Autodesk.AutoCAD.Interop

and

Autodesk.AutoCAD.Interop.Common

 
Michael
Message 7 of 10
dave_deane
in reply to: VidarDK

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

Message 8 of 10
VidarDK
in reply to: dave_deane

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

 

Imports Autodesk.AutoCAD.Interop.Common

Message 9 of 10
dave_deane
in reply to: VidarDK

Thank you...it is working now.

 

Dave

Spoiler
 

 

Message 10 of 10
Strongr412
in reply to: VidarDK

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

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report