The AutoCAD DWG has a type of entity called Block which can encloses with the attributes. It is similar to the prompt string in the Inventor drawing. API allows you to access the relevant information.
Assume we have a DWG file as below:
The VBA code below dumps the tags, prompts and result strings.
Public Sub Test1()
Dim oDoc As DrawingDocument
Set oDoc = ThisApplication.ActiveDocument
Dim oTags() As String
Dim oValues() As String
Dim oAcadBlkDef As AutoCADBlockDefinition
Dim oCnt As Integer
Debug.Print ""
For Each oAcadBlkDef In oDoc.AutoCADBlockDefinitions
Call oAcadBlkDef.GetPromptTags(oTags, oValues)
Debug.Print "Block Name=" & oAcadBlkDef.Name
Dim i As Integer
For i = LBound(oTags) To UBound(oTags)
Debug.Print "Tag Name=" & oTags(i) & _
" Prompt= " & oValues(i)
Next
Next
Debug.Print "———————-"
Dim oAcadBlk As AutoCADBlock
For Each oAcadBlk In oDoc.ActiveSheet.AutoCADBlocks
Call oAcadBlk.GetPromptTextValues(oTags, oValues)
Debug.Print "Block Name=" & oAcadBlk.Name
For i = LBound(oTags) To UBound(oTags)
Debug.Print "Tag Name=" & oTags(i) & _
" Prompt= " & oValues(i)
Next
Next
Debug.Print ""
End Sub
The code above could be used in .NET directly except one detail. The arguments of GetPromptTags or GetPromptTextValues require array which must be initialized correctly. The following code explains:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click ' Connect to a running instance of Inventor. Dim invApp As Inventor.Application ' Check to see if a drawing is active invApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application") If invApp.ActiveDocument.DocumentType Inventor.DocumentTypeEnum.kDrawingDocumentObject Then MsgBox("Need to have a drawing document active") Return End If ' Create ref to active drawing document Dim oDrawingDoc As Inventor.DrawingDocument oDrawingDoc = invApp.ActiveDocument ' Create ref to AutoCADBlocks collection in the active sheet Dim cAcadBlocks As Inventor.AutoCADBlocks cAcadBlocks = oDrawingDoc.ActiveSheet.AutoCADBlocks ' Set the name of the block Dim AcadBlockName As String AcadBlockName = "Myblock" ' Create ref to the AutoCAD block object in the active sheet Dim oAcadBlock As Inventor.AutoCADBlock oAcadBlock = cAcadBlocks.Item(AcadBlockName) ' check to see if block object code is working (it does) Debug.Print(oAcadBlock.Scale) Debug.Print(oAcadBlock.LineWeight) Debug.Print(oAcadBlock.Name) Debug.Print(oAcadBlock.AttributeSets.Count) ' Try and display block tags and values 'correct Dim sTags() As String = New String() {} Dim sAttr() As String = New String() {} 'wrong 'Dim sTags() As String = New Object() {} 'Dim sAttr() As String = New Object() {} 'correct only when you have known the count of texts ' e.g. 23 'Dim sTags(23) As String 'Dim sAttr(23) As String 'wrong 'Dim sTags() As String 'Dim sAttr() As String oAcadBlock.GetPromptTextValues(sTags, sAttr) Dim i As Integer Dim iCount As Integer iCount = UBound(sTags) Debug.Print("icount = " & iCount) ' display attribute tag and value For i = 0 To iCount MsgBox(sTags(i) & " = " & sAttr(i)) i = i + 1 Next End Sub


Leave a Reply