【SolidWorks API】スケッチ自動化の深淵:InsertSketch2の制御と「完全拘束」の論理的構築
SolidWorks APIを操る多くのエンジニアが陥る罠がある。それは「マウス操作をそのままコードに翻訳しようとする」という愚行だ。`InsertSketch2`を単に呼び出し、座標を羅列するだけのコードは、数千回におよぶ自動生成のプロセスにおいて、メモリリークと再構築エラーという名の悪夢をもたらす。
今日は、スケッチ自動化における「完全拘束(Fully Defined)」を、アーキテクトの視点から紐解こう。
—
1. ライフサイクルを掌握せよ:InsertSketch2の正体
`InsertSketch2`は、単なるスケッチ開始のトリガーではない。これはSolidWorksの内部状態マシン(State Machine)を「スケッチ編集モード」へと強制遷移させる命令だ。
ここで肝に銘じるべきは、「状態遷移の直後には、必ず現在の操作対象であるモデルドキュメントへのポインタを再取得する」という鉄則である。これを怠ると、APIの通信経路が不安定になり、特に大規模なアセンブリ環境下では不可解なアクセス違反(Access Violation)が発生する。
‘ 伝説的なエンジニアは、常にオブジェクトの生存期間を意識する
Public Sub InitializeSketch(ByRef swModel As SldWorks.ModelDoc2)
‘ 既にスケッチモードである場合の排他制御(状態チェック)
If swModel.SketchManager.ActiveSketch Is Nothing Then
swModel.InsertSketch2 True
End If
End Sub
2. 幾何拘束の「極限」:座標指定による生成の罠
スケッチを描画する際、多くの初心者は `CreateLine` 等のメソッドで座標を直接入力する。しかし、これでは「位置」は決まっても「関係性」が定義されない。真に堅牢なシステムは、「スケッチ点(SketchPoint)への参照」を保持し、そこに幾何拘束を適用する手順を踏む。
完全拘束を実現するロジックの骨子
1. 点(Point)の生成: 原点(Origin)との一致拘束を前提とした点を配置。
2. 線(Line)の生成: 点の端点情報を取得し、それを結ぶ。
3. 拘束の適用: `AddConstraint`メソッドを用い、`swConstraintType_VERTICAL`や`swConstraintType_HORIZONTAL`を明示的に付与。
‘ 原点を中心とした長方形を生成し、完全拘束するスニペット
Public Sub CreateFullyDefinedRectangle(swModel As SldWorks.ModelDoc2, width As Double, height As Double)
Dim swSketchMgr As SldWorks.SketchManager
Set swSketchMgr = swModel.SketchManager
‘ 1. 中心線(コンストラクションライン)を引くのが最も堅牢
‘ これにより、原点との幾何学的な結びつきが担保される
Dim lines As Variant
lines = swSketchMgr.CreateCenterRectangle(0, 0, 0, width / 2, height / 2, 0)
‘ 2. 完全拘束の検証:自動解決に頼らず、必要に応じて寸法拘束を追加
‘ swModel.AddDimension2 を活用し、パラメータ駆動にするのが実務の鉄則
swModel.AddDimension2 width / 2, height / 2, 0
‘ 3. スケッチ終了(メモリ開放のトリガー)
swModel.InsertSketch2 True
End Sub
3. パフォーマンスとメモリ最適化の極意
VBAはガベージコレクションが脆弱だ。特に`swModel`や`swSketchManager`などのCOMオブジェクトをループ内で何度も取得するのは、メモリの断片化を招く。
- 明示的な解放: `Set swObject = Nothing` をループの最後ではなく、スコープを抜ける直前に記述せよ。
- イベントの無効化: 自動化中にモデルの再構築(Rebuild)が走ると処理が遅延する。`swModel.EditRebuild` を必要なタイミング以外で呼ばないよう、フラグ管理を徹底すること。
4. レガシー環境とWindows APIの連携
大規模な社内システムでは、SolidWorks API単体では手の届かない領域(ダイアログの自動応答や、Windowsハンドルを通じた外部ソフトとのデータ同期)が存在する。`FindWindow` や `SendMessage` を駆使する際は、必ず `DoEvents` を慎重に挿入せよ。
ただし、`DoEvents`の乱用は禁物だ。SolidWorksの内部処理が完了する前に次の命令を投げると、`HRESULT: 0x8001010A`(メッセージフィルターがビジー)が返ってくる。これが「最速の自動化」を阻む最大の壁だ。
アーキテクトの助言:
システム連携においては、`Sleep`関数を用いて非同期的な待機を実装するよりも、`swModel.Extension.Rebuild`の戻り値を確認し、「モデルが安定した状態にあるか」を判定するループ処理を実装すべきだ。
—
結びに代えて
コードは単なる文字列ではない。それは、君がSolidWorksという巨大なエンジンの内部構造をどれだけ理解しているかを示す「設計図」そのものだ。
`InsertSketch2`の先にあるのは、ただの長方形ではない。君が構築した自動化システムが、将来的に何万回もの設計変更を耐え抜き、生産性を劇的に向上させるための「強固な基盤」なのだ。
迷ったら、ドキュメントを見るのではない。「SolidWorksが内部でどのようにオブジェクトを紐付けているか」を想像しろ。それが、レガシーを掌握し、真に自動化を支配する唯一の道である。
