SolidWorks VBAの極意:機構を自在に操る「合致トグル」の実装術
こんにちは。現場で泥臭い自動化を積み重ね、SolidWorks APIの深淵を覗いてきたエンジニアです。
「マクロの記録」ボタンを押して、生成されたコードを眺めて「これでいいや」と満足していませんか? それはまだ、SolidWorksという巨大なシステムの入り口に立ったに過ぎません。
今回取り上げるのは、アセンブリの機構検討を劇的に加速させる「合致(Mate)の抑制/解除トグル」です。設計の現場では、特定の合致が邪魔をして、機構を動かして干渉を確認したいのに「動かない!」というジレンマがよくありますよね。
これを自動化し、ワンクリックで「固定状態」と「フリー状態」を行き来する、真に実務的なマクロを共に作り上げましょう。
—
1. なぜ「抑制」の操作が重要なのか?
SolidWorksのGUIで合致を一つずつ右クリックして「抑制」を押す……これはエンジニアがやるべき作業ではありません。
APIの世界では、合致は`Feature`オブジェクトとして管理されています。このFeatureのステータスを操作することで、SolidWorksは「計算負荷を無視してモデルを動かせる状態」を作り出します。これこそが、複雑なアセンブリを素早く検証するための「ハック」です。
—
2. 現場で使える「合致トグル」のコード
以下のコードは、アセンブリ内の特定の名前を持つ合致を検索し、有効であれば抑制し、抑制されていれば有効化する「トグル(切り替え)」処理です。
Option Explicit
Sub ToggleMateSuppression()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim mateName As String
‘ 対象となる合致の名前(FeatureManagerで名前を付けておくこと!)
mateName = “検証用合致”
Set swApp = Application.SldWorks
Set swAssy = swApp.ActiveDoc
‘ アセンブリが開かれているかチェック
If swAssy Is Nothing Then
MsgBox “アセンブリを開いてから実行してください。”
Exit Sub
End If
‘ FeatureManagerのツリーを巡回して目的の合致を探す
Set swFeat = swAssy.FirstFeature
Do While Not swFeat Is Nothing
‘ 合致フォルダ内の特定の名前を探す
If swFeat.Name = mateName Then
‘ 抑制状態を判定し、反転させる
If swFeat.IsSuppressed Then
swFeat.SetSuppression2 swFeatureUnsuppressed_Self
Debug.Print mateName & ” を有効化しました。”
Else
swFeat.SetSuppression2 swFeatureSuppressed_Self
Debug.Print mateName & ” を抑制しました。”
End If
‘ 変更をモデルに反映(再構築)
swAssy.EditRebuild3
Exit Sub
End If
Set swFeat = swFeat.GetNextFeature
Loop
MsgBox “指定した合致が見つかりませんでした。”
End Sub
—
3. コードの「急所」を理解する
このコードが「ただのコピペ」にならないよう、3つの重要ポイントを解説します。
- `SetSuppression2` メソッドの威力:
`swFeatureSuppressed_Self` は対象自身を抑制します。`swFeatureUnsuppressed_Self` はその解除です。このメソッドこそが、SolidWorksの計算負荷を制御する心臓部です。
- 名前管理の重要性:
コード内の `mateName` が正確である必要があります。手動で合致を作成した後、F2キーで分かりやすい名前(例:「Swing_Arm_Limit」など)を付けておくのが、プロの設計流儀です。
- `EditRebuild3` の魔法:
抑制状態を変えただけでは、画面上の表示が更新されないことがあります。最後に必ず再構築(Rebuild)をかけることで、即座に動かせる状態へ同期させるのが「落ちないマクロ」の秘訣です。
—
4. 陥りやすいエラーと対処法
初心者が必ずぶつかる壁がいくつかあります。
1. 「Featureが見つからない」:
合致はアセンブリのツリー構造の深い位置にいることがあります。もし階層が深い場合は、`swFeat.GetNextFeature` の再帰処理が必要になります。今回は簡易版として第一階層を検索するようにしていますが、まずはここから始めてください。
2. 「オブジェクト変数またはWithブロック変数が設定されていません」:
これは `Set swAssy = swApp.ActiveDoc` でドキュメントが取得できていない(部品ファイルを開いている等)時に発生します。`If swAssy Is Nothing` という安全装置を必ず入れましょう。
—
次のステップへ
このマクロをツールバーに登録し、アイコンをクリックするだけで、機構の検証速度は劇的に向上します。「手作業」から「コマンド」へ。この意識改革こそが、あなたが単なるCADオペレーターから、設計自動化エンジニアへと進化する第一歩です。
次は、これをさらに発展させて「フォルダ内の全ての合致をまとめてトグルする」といった機能に挑戦してみませんか?
SolidWorks APIは、あなたの設計を加速させる最強の武器です。ぜひ、自分の手でコードを書き、その武器を研ぎ澄ましてください。応援しています!
