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

AutoCAD VBA:ダイナミック ブロック情報へのアクセス

Issue

AutoCAD のダイナミック ブロックについて、VBA でどの程度操作ができるかわかりません。

モデル空間などに配置されているダイナミック ブロックのパラメータの状態を取得したり、パラメータの値を更新して、形状や表示状態を変更することはできますか?

dynamicblock.jpg

 

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

vba.jpg

コメント

これは ダイナミックブロックをカウントしているだけですね。

私は ダイナミックブロックに定義した変数データを知りたいのですが

再検討願います