Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCAD VBA:ブロック属性の取得

Issue

VBA コードでブロック参照に設定されているブロック属性を取得する手順を教えてください。

 

Solution

挿入されているブロック参照は AcadBlockReference オブジェクト として取得することが出来ます。

 

AcadBlockReference オブジェクト には属性を取得する GetAttributes メソッド が用意されているので、このメソッドを介して各属性の情報を取得することが出来ます。

 

なお、ブロック参照の定義情報であるブロック定義(Block オブジェクト)には複数の属性定義(Attribute オブジェクト)を登録出来るので、 GetAttributes メソッドが複数が属性(AttributeReference オブジェクト)を扱えるよう、配列を返すことにご注意ください。

 

次の例は、選択したブロック参照から属性のタグと値を表示するコードです。VBA コード上、 GetAttributes メソッドが返すのが Variant 型になっています。

 

Public Sub GetBlockAttribute()

    Dim returnObj As AcadObject
    Dim basePnt As Variant
    
    On Error Resume Next
    
    ThisDrawing.Utility.GetEntity returnObj, basePnt, "ブロック参照を選択:"
    
    If Err = 0 Then
        If returnObj.EntityName = "AcDbBlockReference" Then
            Dim blkRef As AcadBlockReference
            Set blkRef = returnObj
            
            ThisDrawing.Utility.Prompt vbCrLf & blkRef.Name & " ブロック参照が選択されました."
            
            Dim varAttributes As Variant
            varAttributes = blkRef.GetAttributes

            If UBound(varAttributes) < 0 Then
                ThisDrawing.Utility.Prompt vbCrLf & "ブロック参照に属性がありません..."
            Else
                Dim strAttributes As String
                For Each blkAttr In varAttributes
                    strAttributes = ""
                    strAttributes = strAttributes & "  タグ名: " & blkAttr.TagString & " - 属性値 " & blkAttr.TextString & vbLf & "    "
                    ThisDrawing.Utility.Prompt vbCrLf & strAttributes
                Next
            End If
        ElseIf returnObj.EntityName <> " AcDbBlockReference" Then
            ThisDrawing.Utility.Prompt vbCrLf & "ブロック参照ではありません..."
        End If
    Else
        ThisDrawing.Utility.Prompt vbCrLf & "何も選択されませんでした..."
    End If

End Sub

 

 blkattr.jpg