Issue
AutoCAD のダイナミック ブロックについて、VBA でどの程度操作ができるかわかりません。
モデル空間などに配置されているダイナミック ブロックのパラメータの状態を取得したり、パラメータの値を更新して、形状や表示状態を変更することはできますか?
Solution
ダイナミックブロックとして配置されているブロック参照からは、ある程度の情報を取得したり、その値を変化させることができます。ただし、現在のバージョンでは一部制限があるため、すべての情報の制御や、パラメータ間の関連付けを得ることができません。
ブロック参照からダイナミックブロック固有の情報にアクセスするには、AcadBlockReference オブジェクトの GetDynamicBlockProperties メソッドを使用して、パラメータ情報を含むコレクションを取得します。このコレクションには、DynamicBlockReferenceProperty オブジェクトがパラメータ(アクションとの組み合わせ)数分含まれます。
DynamicBlockReferenceProperty オブジェクトを取得した後は、このオブジェクトが持つプロパティを使って、パラメータ別の情報にアクセスできます。つまり、ダイナミック ブロック参照の現在の設定値を得ることが可能です。
なお、パラメータによっては、ルックアップ テーブルや可視テーブルなど、リスト化された情報も存在します。このような場面では、パラメータを表す DynamicBlockReferenceProperty.Value プロパティは配列として返されます。これをチェックすれば、その内容を AllowedValues プロパティから閲覧することもできます。
添付のコードは、ダイナミックブロックの情報を取得する例です。
Dim nDataIndex As Long
Dim vDataInfo As Variant
Dim oData As AcadDynamicBlockReferenceProperty
Dim nListIndex As Long
Dim vListInfo As Variant
Dim nRound As Integer
Dim oEnt As AcadEntity
Dim oBlkRef As AcadBlockReference
nRound = ThisDrawing.GetVariable("LUPREC")
For Each pEnt In ThisDrawing.ModelSpace
If pEnt.ObjectName = "AcDbBlockReference" Then
Set oBlkRef = pEnt
If oBlkRef.IsDynamicBlock Then
ThisDrawing.Utility.Prompt vbCrLf & "***** ダイナミックブロック - "
ThisDrawing.Utility.Prompt oBlkRef.EffectiveName & " : " & oBlkRef.Name
nCtrlIndex = 1
For nDataIndex = LBound(oBlkRef.GetDynamicBlockProperties) To UBound(oBlkRef.GetDynamicBlockProperties)
Set oData = oBlkRef.GetDynamicBlockProperties(nDataIndex)
If oData.show Then
' パラメータ名ラベル
ThisDrawing.Utility.Prompt vbCrLf & oData.PropertyName & " : "
' パラメータが配列か確認
vDataInfo = oData.Value
If IsArray(vDataInfo) Then
' 座標データの場合
ThisDrawing.Utility.Prompt Round(vDataInfo(0), nRound) & "," & Round(vDataInfo(1), nRound) & "," & Round(vDataInfo(2), nRound)
Else
' リスト要素か確認
vListInfo = oData.AllowedValues
If UBound(vListInfo) > 0 Then
' リスト要素の場合
For nListIndex = LBound(vListInfo) To UBound(vListInfo)
If VarType(vDataInfo) = vbDouble Then
ThisDrawing.Utility.Prompt vbCrLf & vbTab & CStr(Round(vListInfo(nListIndex), nRound))
Else
ThisDrawing.Utility.Prompt vbCrLf & vbTab & vListInfo(nListIndex)
End If
Next nListIndex
If VarType(vDataInfo) = vbDouble Then
ThisDrawing.Utility.Prompt vbCrLf & vbTab & "現在値 : " & CStr(Round(vDataInfo, nRound))
Else
ThisDrawing.Utility.Prompt vbCrLf & vbTab & "現在値 : " & vDataInfo
End If
Else
' 通常データの場合
If VarType(vDataInfo) = vbDouble Then
ThisDrawing.Utility.Prompt Round(vDataInfo, nRound)
Else
ThisDrawing.Utility.Prompt vDataInfo
End If
End If
End If
End If
ThisDrawing.Utility.Prompt vbCrLf
Next
End If
End If
Next
これは ダイナミックブロックをカウントしているだけですね。
私は ダイナミックブロックに定義した変数データを知りたいのですが
再検討願います