Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
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