SolidWorks APIの真髄:アセンブリ視覚化を「プロの作法」で自動化する
現場のエンジニア諸君。マウスでポチポチとアセンブリ内のパーツを選択し、色を変える作業に何分費やしている? もし君が1日10回その作業をしているなら、年間で貴重な数時間を浪費していることになる。
自動化は「単に動くコードを書くこと」ではない。「SolidWorksの内部構造(APIの挙動)を理解し、破綻しない堅牢なアーキテクチャを組むこと」だ。今回は、アセンブリ内の特定の部品を名前で抽出し、色を操作する極めて実用的なマクロを、プロの設計思想と共に伝授する。
—
1. なぜ「SelectionManager」を使うのか
多くの初心者は `SelectByID2` という万能薬に頼りたがる。しかし、これは「地雷」だ。アセンブリの階層構造が深くなればなるほど、パス指定が複雑化し、一点の修正で全コードが死ぬ。
我々が採用するのは、「コンポーネントを名前で探索し、メモリ上のオブジェクトとして直接捕獲する」というアプローチだ。これこそが、バグを排除し、保守性を高める唯一の道である。
—
2. 堅牢な実装:パーツ視覚化コード
このコードは、指定した名前を持つコンポーネントをアセンブリ全体から検索し、その色を強制的に変更する。ポイントは、エラーハンドリングとオブジェクトの解放を徹底している点にある。
Option Explicit
‘ 伝説的なコードは、常に明示的であること。
Public Sub HighlightComponentByName()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim targetName As String
‘ 1. セットアップ
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてから実行せよ。”, vbCritical
Exit Sub
End If
Set swAssy = swModel
targetName = “PART_A-1” ‘ ここに検索したいコンポーネント名を入れる
‘ 2. 検索と処理
‘ アセンブリ内の全コンポーネントを取得
Dim vComps As Variant
vComps = swAssy.GetComponents(False)
Dim i As Long
Dim found As Boolean
found = False
For i = 0 To UBound(vComps)
Set swComp = vComps(i)
‘ コンポーネント名の比較(拡張子などを考慮し、Name2プロパティを精査)
If InStr(swComp.Name2, targetName) > 0 Then
‘ 選択状態にする(ハイライト)
swComp.Select4 False, Nothing, False
‘ 色を変更(RGB指定:ここでは赤系)
‘ 注意: 色設定はコンポーネントレベルで行うのが鉄則
Dim color(8) As Double
color(0) = 1#: color(1) = 0#: color(2) = 0# ‘ R, G, B
swComp.MaterialPropertyValues = color
found = True
End If
Next i
If Not found Then MsgBox “対象のコンポーネントが見つからなかった。”, vbExclamation
‘ 3. 画面の再描画(パフォーマンスの要)
swModel.GraphicsRedraw2
End Sub
—
3. プロの視点:なぜこの設計が「最強」なのか
① `GetComponents(False)` の深い理解
`GetComponents(False)` はトップレベルだけでなく、サブアセンブリ内のコンポーネントも再帰的に取得する。もし君が「トップレベルのみ」を対象にしたいなら `True` に切り替えるだけでいい。この柔軟性を知っているかどうかが、大規模アセンブリを扱う際の明暗を分ける。
② `MaterialPropertyValues` の直接操作
多くの初心者は色を変えるために「フィーチャーの色設定ダイアログ」を操作しようとする。それは非効率の極みだ。`MaterialPropertyValues` プロパティを直接操作すれば、APIレベルで一瞬にして視覚情報を書き換えられる。
③ データベース連携への拡張性
このコードは、`targetName` をハードコーディングしているが、実務ではCSVやExcelから読み込むべきだ。
- 注意点: 外部ファイルを読み込む際は、必ず `FileSystemObject` を使い、パスの存在チェックを事前に行うこと。ファイルロックやネットワーク遅延が原因で SolidWorks がフリーズするのを防ぐためだ。
—
4. チーフアーキテクトからの忠告
自動化とは、「動くものを作る」のではなく「壊れない仕組みを作る」ことだ。
1. SelectionManagerのクリア: コードの最後や、新しい操作の直前には必ず `swModel.ClearSelection2 True` を呼び出せ。余計な選択状態を残すことは、後続の処理に致命的なバグを引き起こす。
2. 型定義の徹底: `Dim swComp As Component2` のように、必ず型を明示せよ(Early Binding)。`Object` 型で妥協した瞬間、君のコードの実行速度と安全性は死ぬ。
まずはこのコードを走らせてみろ。そして、自分のアセンブリ構造に合わせて `targetName` の検索アルゴリズムをカスタマイズするんだ。それが、君が「作業者」から「エンジニア」へ進化する第一歩だ。
何か詰まったらまた聞け。次は、合致エラーを自動検出し、レポートを出力するより高度な領域へ案内してやろう。
