【スケッチ自動化の実践】SketchManagerとCreateLine2を駆使したパラメトリックな2D輪郭プロファイルの自動生成
SolidWorks VBAの領域において、手動マウス操作の自動化や、場当たり的なマクロ記録の貼り付けで満足しているうちは、真の自動化エンジニアとは言えない。
特に2Dスケッチの生成は、3Dモデリングの根幹をなす最も重要かつ、最もメモリ管理と座標計算の厳密さが要求されるレイヤーである。
今回は、`SldWorks.ModelDoc2` および `SketchManager` を駆使し、外部データ(CSVやJSON、あるいは計算ロジック)から動的に座標を算出し、ミリ秒単位で正確なパラメトリック輪郭プロファイルを構築する実践的アーキテクチャを解説する。
レガシーなVBA環境であっても、メモリのライフサイクルを完全に制御し、極限まで無駄を削ぎ落としたコードであれば、商用CADのAPIを完全に手足のように操ることが可能だ。
—
1. 座標計算とメモリ管理の哲学
SolidWorks APIを操作する際、開発者が最も陥りやすい罠は「オブジェクトの暗黙的な保持」と「ビューポートの再描画オーバーヘッド」である。
- 画面更新の抑制 (`SetUserPreferenceToggle`): ループ内でスケッチエンティティを作成するたびにグラフィック領域が再描画されていては、パフォーマンスは致命的に低下する。処理の開始前には必ず画面描画を停止せよ。
- COMオブジェクトの明示的解放 (`Set … = Nothing`): VBAのガベージコレクションは頼りにならない。特にDocumentやSelectionManager、SketchManager周辺の参照は、スコープを抜ける前に確実に`Nothing`を代入し、COMコンポーネントの参照カウンタを即座にデクリメントさせなければ、メモリリークの温床となる。
—
2. 実装コード:パラメトリック矩形・切欠きプロファイルの自動生成
以下のコードは、起点・終点の座標を動的に計算し、エラーハンドリングとパフォーマンス最適化を施したプロダクション品質のマクロである。
Option Explicit
‘ =========================================================================
‘ 処理名: パラメトリック2D輪郭プロファイル自動生成エンジン
‘ 概要: 指定されたパラメータに基づき、スケッチ平面上に正確な輪郭を描画する
‘ =========================================================================
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSketchMgr As SldWorks.SketchManager
Dim boolstatus As Boolean
‘ 1. SldWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ アクティブドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “警告”
Exit Sub
End If
‘ アセンブリ図面での暴走を防ぐため、部品(Part)ドキュメントであることを検証
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは部品(Part)ドキュメントでのみ実行可能です。”, vbCritical, “型不一致エラー”
Exit Sub
End If
‘ 2. パフォーマンス最適化:画面描画の完全停止
‘ ※これを怠ると、スケッチ描画のたびにビューが再計算され速度が10分の1以下になる
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewUpdateEntityInRealTime, False
swModel.EnablePerformanceMode True
On Error GoTo ErrorHandler
‘ 3. スケッチマネージャーの取得
Set swSketchMgr = swModel.SketchManager
‘ フロント平面 (Front Plane) を選択してスケッチモードに入る
boolstatus = swModel.Extension.SelectByID2(“フロント”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
Err.Raise 1000, “SketchGen”, “ベースとなるフロント平面の選択に失敗しました。”
End If
‘ 新規スケッチの挿入
swSketchMgr.InsertSketch True
‘ 4. パラメトリックな座標定義 (単位: メートル系 – APIの内部単位は常にメートル)
Dim width As Double, height As Double
Dim notchW As Double, notchH As Double
width = 0.1 # 100mm
height = 0.08 # 80mm
notchW = 0.02 # 20mm
notchH = 0.015 # 15mm
‘ 5. CreateLine2 を駆使した輪郭の連続描画
‘ 座標系: X起点, Y起点, Z起点, X終点, Y終点, Z終点
Dim swSegment As SldWorks.SketchSegment
‘ 原点(0,0,0)から右へ
Set swSegment = swSketchMgr.CreateLine2(0, 0, 0, width, 0, 0)
‘ 右側を上へ (切欠きの手前まで)
Set swSegment = swSketchMgr.CreateLine2(width, 0, 0, width, (height / 2) – (notchH / 2), 0)
‘ 切欠き(内側へ水平)
Set swSegment = swSketchMgr.CreateLine2(width, (height / 2) – (notchH / 2), 0, width – notchW, (height / 2) – (notchH / 2), 0)
‘ 切欠き(上へ垂直)
Set swSegment = swSketchMgr.CreateLine2(width – notchW, (height / 2) – (notchH / 2), 0, width – notchW, (height / 2) + (notchH / 2), 0)
‘ 切欠き(外側へ水平)
Set swSegment = swSketchMgr.CreateLine2(width – notchW, (height / 2) + (notchH / 2), 0, width, (height / 2) + (notchH / 2), 0)
‘ さらに上へ
Set swSegment = swSketchMgr.CreateLine2(width, (height / 2) + (notchH / 2), 0, width, height, 0)
‘ 左へ
Set swSegment = swSketchMgr.CreateLine2(width, height, 0, 0, height, 0)
‘ 原点へ戻る(閉じられた輪郭の形成)
Set swSegment = swSketchMgr.CreateLine2(0, height, 0, 0, 0, 0)
‘ 6. スケッチの確定と終了
swSketchMgr.InsertSketch True
‘ 正常終了処理
GoTo Finally
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
‘ 異常終了時はスケッチを破棄してロールバック
If Not swSketchMgr Is Nothing Then
swSketchMgr.InsertSketch False
End If
Finally:
‘ 7. パフォーマンス設定の復元とメモリの明示的解放
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewUpdateEntityInRealTime, True
swModel.EnablePerformanceMode False
swModel.GraphicsRedraw2
Set swSegment = Nothing
Set swSketchMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox “パラメトリックプロファイルの生成が完了しました。”, vbInformation, “完了”
End Sub
—
3. チーフアーキテクトが指摘する「実務における勘所」
① 単位系の罠 (MKS vs MGS)
SolidWorksのAPI内部では、すべての座標や寸法は「メートル (Meter)」で処理される。
UI上で「mm」表示になっていようとも、APIに渡す数値は `0.1` (`100mm` の意) のようにスケーリングしなければ、意図した形状の1000倍の化け物モデルが生成されることになる。外部ファイル(CSV等)から数値を読み込む際は、必ず単位系の補正ロジックを挟むこと。
② `CreateLine2` と推測拘束 (Relations)
手動でスケッチを描く際、SolidWorksは勝手に水平・垂直・一致などの「推測拘束(Geometric Relations)」を付与する。
しかし、API経由で `CreateLine2` を実行する場合、余計な推測拘束が自動付与されることで、後続の寸法拘束(Dimension)を入れた際に「過剰拘束 (Over-defined)」エラーを引き起こすリスクがある。
完全なパラメトリック設計を目指すのであれば、描画後に不要な拘束をプログラム側で排除するか、あるいは最小限の幾何公差を維持するアルゴリズムを構築する必要がある。
③ エラーハンドリングとトランザクションの意識
CAD自動化において最も恐ろしいのは、「途中で処理がコケた結果、中途半端に開いたスケッチが残骸として残り、次回のバッチ処理が全滅する」という事態である。
上記のコード例のように、`On Error GoTo` を必ず配置し、異常系に陥った場合は `swSketchMgr.InsertSketch False`(変更を破棄してスケッチを閉じる)を呼び出す防衛的プログラミングを徹底せよ。
—
結び
CADの自動化は、単なる「マクロの記録と再生」の延長線上には存在しない。
APIのライフサイクル、メモリ構造、そしてCAD空間特有の数学的モデルを深く理解した者だけが、強靭でメンテナンス性の高い真の自動化システムを構築できる。
このコードを起点に、貴社の設計プロセスを極限まで加速させよ。
