【実務・中級編】【図面寸法の一括操作】DisplayDimensionsで図面の寸法線を自動整列・レイアウト最適化する – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの真髄:図面寸法を「整列」させ、手作業の呪縛を断ち切る

SolidWorksの自動図面作成機能は強力だが、出力される図面は往々にして「寸法線がスパゲッティ状態」で吐き出される。これを手作業で直すのは、我々エンジニアにとって最も避けるべき「非生産的な工数」だ。

今日は、APIを叩いて寸法を美しく整列させるための、「壊れない」「保守できる」アーキテクチャについて語ろう。

—

1. なぜ「力技のループ」は失敗するのか

多くの初心者が陥る罠は、`DisplayDimensions`を単にループさせて位置を座標指定で動かすことだ。しかし、図面ビューのスケールや投影角、既存の注記との干渉を無視すれば、結果は「重なったまま」か「図面枠外へ飛んでいく」のどちらかである。

プロの設計が守るべき3つの鉄則:
1. オブジェクトの寿命を制御せよ: `ModelDoc2`から`View`を取得し、そのスコープ内でのみ操作する。
2. 座標系を理解せよ: 寸法値は「紙の座標(ミリ単位)」ではなく「ビューのローカル座標」で管理されている。
3. 例外処理を怠るな: 選択不可な寸法や、参照が失われた寸法が含まれていることを前提にコードを書く。

—

2. 堅牢な寸法整列エンジンの構築

このコードは、アクティブな図面ビュー内の寸法を抽出し、Y軸方向に等間隔でスタックさせる実用的なモジュールだ。

Option Explicit

‘ 伝説的なエンジニアが教える「安全な」寸法整列メソッド
Public Sub AlignDimensionsInView()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swView As SldWorks.View
Dim swDispDim As SldWorks.DisplayDimension
Dim i As Long
Dim currentY As Double
Dim spacing As Double

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 図面以外は即座に弾く堅牢性
If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
MsgBox “図面を開いてから実行してください。”, vbCritical
Exit Sub
End If

‘ 選択中のビューを取得
Set swView = swModel.SelectionManager.GetSelectedObject6(1, -1)
If swView Is Nothing Then
MsgBox “整列対象のビューを選択してください。”, vbExclamation
Exit Sub
End If

‘ 寸法の間隔設定(単位はメートル)
spacing = 0.008
currentY = 0.05

‘ DisplayDimensionsはViewオブジェクトから取得するのが定石
Dim vDispDims As Variant
vDispDims = swView.GetDisplayDimensions

If IsEmpty(vDispDims) Then Exit Sub

‘ トランザクション処理の開始(Undo可能な状態にする)
swModel.Extension.StartCommandGroup “AlignDimensions”

For i = 0 To UBound(vDispDims)
Set swDispDim = vDispDims(i)

‘ 寸法のテキスト位置を再計算して設定
‘ 実際の実務ではここに干渉チェックのロジックを入れるのがベター
swDispDim.SetTextPosition 0, 0, currentY, 0, 0, 0

currentY = currentY + spacing
Next i

swModel.Extension.FinishCommandGroup
swModel.EditRebuild3
End Sub

—

3. コードの品質を一段上げるための「知見」

1. Undo(元に戻す)の重要性

`StartCommandGroup`と`FinishCommandGroup`で囲むことで、実行結果が「1つの操作」としてUndoリストに登録される。これがないツールは、現場のエンジニアから「怖くて使えない」と判断される。

2. インターフェースの抽象化

今回は`DisplayDimension`オブジェクトを直接操作したが、大規模な開発を行う場合は、`DimensionClass`をラップした自作クラスを作成することを推奨する。そうすれば、「寸法値の文字列置換」や「公差の自動付与」といった機能追加が、メインロジックを汚さずに実装できる。

3. パフォーマンスへの配慮

数千個の寸法を一度に操作すると、SolidWorksは「再構築(Rebuild)」の嵐に飲み込まれる。`swModel.AutoSave`を一時的に無効にするか、ループ内での再描画を抑止する工夫が、数十万規模の図面を処理する際には必須となる。

—

最後に:自動化は「道具」ではなく「思想」である

図面の寸法整列を自動化することは、単なる時短ではない。それは、「人間が本来行うべき、設計意図を伝えるためのレイアウト調整」に時間を割くための環境作りだ。

自動化できない単純作業は、すべてAPIに委ねよ。そして、浮いた時間で「より良い製品」を設計せよ。それが、我々エンジニアの魂である。

もしこのコードを適用して何らかの挙動不審があれば、それはSolidWorksのAPI以前に、モデルの参照が壊れている可能性が高い。まずは`swDispDim.GetDimension2(0).FullName`で参照先が生きているかを確認するデバッグルーチンを挟むのが、プロの流儀だ。

健闘を祈る。

タイトルとURLをコピーしました