SolidWorks APIの深淵:動的基準面生成とサブスケッチ展開の「作法」
SolidWorks APIを扱う際、多くのエンジニアが陥る罠がある。それは「GUIの操作をそのままコードに翻訳しようとする」ことだ。特に、動的にオフセット平面を生成し、その上にスケッチを展開するような反復的なタスクにおいて、無造作な実装はメモリリークとフィーチャツリーの汚染を招く。
本稿では、レガシー環境においても安定して動作し、かつ大規模アセンブリや複雑なパーツ構成にも耐えうる「極限のフィーチャ操作」の手法を伝授する。
—
1. 基準面生成の解剖学:ISwFeatureManagerの挙動
`InsertRefPlane` メソッドを単に呼ぶだけでは不十分だ。重要なのは「いかにしてそのフィーチャを特定し、制御し続けるか」である。特にオフセット距離をパラメータ化する場合、`RefPlane` オブジェクトのプロパティを直接操作するのではなく、フィーチャの `Definition` を介して更新する設計が、後々の保守性を劇的に高める。
核心となる実装パターン
以下は、既存の基準面から指定オフセット距離で動的に作業面を生成し、その面上にスケッチを作成する堅牢な実装例である。
‘ SolidWorks VBA: 動的基準面生成とスケッチ展開のベストプラクティス
Public Sub CreateOffsetSketch(swModel As SldWorks.ModelDoc2, basePlaneName As String, offsetDistance As Double)
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeature As SldWorks.Feature
Dim swRefPlane As SldWorks.RefPlane
Set swFeatMgr = swModel.FeatureManager
‘ 1. 基準面の選択(パフォーマンスのため、名前で特定)
swModel.Extension.SelectByID2 basePlaneName, “PLANE”, 0, 0, 0, False, 0, Nothing, 0
‘ 2. オフセット平面の生成(単位変換には注意:SolidWorksは内部的にメートル単位)
‘ 複数枚生成する場合は、名前の一意性を担保すること
Set swFeature = swFeatMgr.InsertRefPlane(8, offsetDistance / 1000, 0, 0, 0, 0)
‘ 3. オブジェクトの検証と解放
If swFeature Is Nothing Then Err.Raise vbError, , “基準面の生成に失敗しました。”
‘ 4. 生成した面上にスケッチを展開
swModel.Extension.SelectByID2 swFeature.Name, “PLANE”, 0, 0, 0, False, 0, Nothing, 0
swModel.SketchManager.InsertSketch True
‘ — ここにスケッチエンティティの生成処理を記述 —
‘ メモリリーク防止:明示的な解放
Set swFeature = Nothing
Set swRefPlane = Nothing
End Sub
—
2. メモリ最適化と「幽霊フィーチャ」の排除
大規模なパーツを自動生成する際、最も恐ろしいのは「生成に失敗したフィーチャがツリーに残る」ことだ。VBAはガベージコレクションが甘い。特に `SelectionManager` と `Feature` オブジェクトは、スコープを抜けてもメモリ上に滞留しやすい。
- 明示的解放の鉄則: `Set swObj = Nothing` は単なる儀式ではない。反復処理の中でこれを怠ると、SolidWorksのプロセスが肥大化し、数千回のフィーチャ生成でメモリ不足(Out of Memory)を誘発する。
- エラーハンドリングの多重化: `Err.Clear` をループ内に配置し、フィーチャ生成直後に `swModel.ClearSelection2 True` を呼び出す。これにより、前回選択されたオブジェクトの参照を確実にクリアする。
—
3. Windows APIによる「強制リビルド」と同期
複雑なジオメトリ生成を行うと、SolidWorksの画面更新と計算エンジンが非同期になり、次の処理で「面が見つからない」といったエラーが頻発する。これを防ぐための「伝説級」のTipsを一つ。
システムが重い場合、`swModel.EditRebuild3` を多用しすぎると逆に遅くなる。必要なのは「イベントの同期」だ。
‘ 強制リビルド後の待機(WinAPIを用いてCPUを解放)
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
‘ … 処理内 …
swModel.ForceRebuild3 False ‘ ジオメトリ生成の反映
Sleep 500 ‘ レンダリングとカーネルの同期を待つ極小のバッファ
この `Sleep` は邪道に見えるかもしれないが、SolidWorksのCOM経由の操作において、内部計算エンジンの完了を待機させるための最も確実な「レガシーの知恵」である。
—
4. シニアエンジニアへの提言:システム間連携に向けて
この技術を単なる「自動スケッチ」で終わらせてはならない。次に目指すべきは、外部JSON/XMLファイルからのパラメータ駆動設計だ。
生成されたフィーチャに `swFeature.SetComment` を使用して、「元データとなったID」をメタデータとして埋め込むこと。これにより、後日設計変更が発生した際に、どのフィーチャを削除し、どのフィーチャを更新すべきかをプログラム側で再帰的に判定できるようになる。
自動化とは、単にコードを書くことではない。「後から修正可能な、意味のある構造体(フィーチャツリー)を生成すること」である。
この知見が、貴殿のオートメーション環境を次なるフェーズへと引き上げる一助となれば幸いだ。健闘を祈る。
