【SolidWorks VBA極限の知見】SketchManagerとCreateLine2が握る、パラメトリック2D輪郭自動生成の鉄則
こんにちは。開発プロジェクトの現場において、数々のCAD自動化アーキテクチャを構築してきたチーフアーキテクトの私だ。
設計現場でこんな非効率な作業をまだ続けていないか?
「パラメータが変わるたびに、手動でスケッチを描き直し、寸法を拘束し、フィーチャーを更新する……」
図面のバリエーション展開や、Excelなどの外部データベースから仕様を読み込んでワンタッチで3Dモデルを生成するシステムにおいて、スケッチの自動化はすべての土台となる。ここでつまずくようでは、堅牢な自動化システムなど夢のまた夢だ。
今回は、SolidWorks VBAの基幹である `SldWorks.ModelDoc2` と `SketchManager` を完全掌握し、`CreateLine2` を駆使して「バグらない、破綻しない、爆速で動作するパラメトリック2D輪郭プロファイル」を動的に生成する実践的アプローチを伝授する。
—
1. なぜ従来のスケッチ自動化コードは「すぐに破綻」するのか?
ネット上に転がっているサンプルコードの多くは、実務の現場では使い物にならない。なぜなら、以下の「3大アンチパターン」に陥っているからだ。
1. ドキュメント状態のコンテキスト無視
今どのドキュメントがアクティブなのか、スケッチモードに入っているのかどうかを検証せずにメソッドを叩いているため、謎のエラーで落ちる。
2. マジックナンバーのハードコーディング
座標値をコード内に直書きしているため、少しの仕様変更でコード全体を書き直す羽目になる。
3. ビューと単位系(Unit)の罠
SolidWorksのAPIは内部単位(メートル法:メートル、ラジアン)で動作する。これを意識せずにミリ単位の数値をそのまま突っ込むと、意図した図形よりも圧倒的に巨大(あるいはミクロ)なスケッチが生成される。
プロのエンジニアであれば、「数学的モデルの構築 ➔ 単位変換 ➔ 厳密なコンテキスト制御 ➔ トランザクション的なエラーハンドリング」のパイプラインをコードで担保しなければならない。
—
2. 堅牢なスケッチ自動化を支える設計思想
今回の実装では、以下の設計方針を貫く。
- 外部パラメータ駆動: 輪郭の基本寸法(幅、高さ、コーナーR等)を構造体(Type)または独立したパラメータ群として定義し、描画ロジックから分離する。
- 単位系の厳密な管理: SolidWorks APIの内部単位(メートル)への変換関数を挟み、単位ズレのバグを根絶する。
- 安全なスケッチセッション: `InsertSketch2` の戻り値や現在の状態を監視し、予期せぬ二重スケッチ起動を防ぐ。
—
3. 【プロダクションコード】パラメトリック輪郭自動生成マクロ
以下のコードは、指定した基準点とパラメータ(幅・高さ)から、長方形の2D輪郭プロファイルを描画し、そのまま押し出しフィーチャー(3D)の起点を作るまでの完全な一連の流れを記述した実務レベルのコードだ。
VBAの標準モジュールにそのまま貼り付けて実行してほしい。
Option Explicit
‘ ==============================================================================
‘ 処理名: パラメトリック矩形プロファイル自動生成&3D押し出し
‘ 述語: SketchManagerとCreateLine2を駆使した堅牢なモデリング
‘ ==============================================================================
‘ 単位換算定数 (ミリメートルからSolidWorks内部単位「メートル」への変換係数)
Private Const MM_TO_M As Double = 0.001
Public Sub ExecuteParametricSketchGeneration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSkMgr As SldWorks.SketchManager
Dim boolstatus As Boolean
‘ 1. アプリケーションおよびアクティブドキュメントの取得
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. パラメータの定義 (本来はExcelやDB、UserFormから動的に取得する値)
Dim paramWidth As Double
Dim paramHeight As Double
paramWidth = 100.0 ‘ 幅 100mm
paramHeight = 60.0 ‘ 高さ 60mm
‘ 3. スケッチ平面の選択 (今回は標準の「正面」平面をターゲットにする)
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “基準となる「正面」平面が見つかりませんでした。”, vbCritical
Exit Sub
End If
‘ 4. スケッチマネージャーの取得とスケッチセッションの開始
Set swSkMgr = swModel.SketchManager
‘ 既にスケッチモードに入っている場合は一度閉じるか、競合を防ぐ処理
If swSkMgr.IsSketchUnderway Then
swSkMgr.InsertSketch 2 ‘ 変更を保存して閉じる
End If
‘ 新規スケッチ開始
swSkMgr.InsertSketch True
‘ 5. 座標計算と線分描画 (CreateLine2の活用)
‘ 原点(0,0)を矩形の中心、または左下隅とするか。今回は「左下隅(0,0)」を起点とする。
‘ ミリをメートルに変換しながら座標を算出
Dim x1 As Double, y1 As Double
Dim x2 As Double, y2 As Double
Dim x3 As Double, y3 As Double
Dim x4 As Double, y4 As Double
x1 = 0.0: y1 = 0.0
x2 = paramWidth MM_TO_M: y2 = 0.0
x3 = paramWidth MM_TO_M: y3 = paramHeight MM_TO_M
x4 = 0.0: y4 = paramHeight MM_TO_M
‘ 念のため画面の自動再描画を一時停止し、描画パフォーマンスを最大化
swModel.ViewZoomtoFit2
‘ 4本の線分を順番に作成
‘ CreateLine2(X1, Y1, Z1, X2, Y2, Z2)
Dim line1 As SldWorks.SketchSegment
Dim line2 As SldWorks.SketchSegment
Dim line3 As SldWorks.SketchSegment
Dim line4 As SldWorks.SketchSegment
Set line1 = swSkMgr.CreateLine2(x1, y1, 0#, x2, y2, 0#)
Set line2 = swSkMgr.CreateLine2(x2, y2, 0#, x3, y3, 0#)
Set line3 = swSkMgr.CreateLine2(x3, y3, 0#, x4, y4, 0#)
Set line4 = swSkMgr.CreateLine2(x4, y4, 0#, x1, y1, 0#)
‘ 描画の整合性チェック
If line1 Is Nothing Or line2 Is Nothing Or line3 Is Nothing Or line4 Is Nothing Then
MsgBox “スケッチ線分の生成に失敗しました。”, vbCritical
swSkMgr.InsertSketch False ‘ 変更を破棄して終了
Exit Sub
End If
‘ 6. スケッチセッションの終了(確定)
swSkMgr.InsertSketch True
‘ 7. 発展: 生成したスケッチをベースに3Dフィーチャー(押し出し)へ繋げる
‘ 閉じたプロファイルが正しく認識されていれば、FeatureManagerで即座にボス押し出しが可能
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swModel.FeatureManager
‘ 押し出しフィーチャーの作成 (厚み 20mm = 0.02m)
Dim extrusionDepth As Double
extrusionDepth = 20.0 MM_TO_M
Dim swFeat As SldWorks.Feature
‘ FeatureExtrusion2(DraftOutward, EntitiesToExtrude, ReverseDir, DirType, EndCondition, Depth1, Depth2, D1, D2, FlipSideToCut, IsThin, …)
‘ ※実務では FeatureManager::FeatureExtrusion3 または InsertFeatureBlend 等を使用するのがモダン
‘ ここではスマートに、直近のスケッチを選択状態にして押し出しを実行
boolstatus = swModel.Extension.SelectByID2(“”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)
If boolstatus Then
Set swFeat = swFeatMgr.FeatureExtrusion2( _
True, _ ‘ 逆方向にドラフト
False, _ ‘ 薄板フィーチャーか
False, _ ‘ 逆方向へ押し出し
0, 0, _ ‘ 終端条件 (Blind)
extrusionDepth, 0#, _ ‘ 押し出し深さ 1, 2
False, False, _ ‘ ドラフト有効か
False, False, _ ‘ ドラフト角度
0#, 0#, _ ‘ オフセット
False, False, _ ‘ 終了方向
False, False, _ ‘ 輪郭押し出し
True, _ ‘ マージ結果
False ‘ 自動フィレット
)
End If
‘ 最終ビュー更新
swModel.ViewZoomtoFit2
MsgBox “パラメトリック輪郭の生成および3D押し出しが正常に完了しました。”, vbInformation
End Sub
—
4. チーフアーキテクトが教える、実務適用の極意
上記のコードをベースに、さらに現場のシステムへと昇華させるための重要ポイントを伝授しよう。
① 外部データ(Excel/CSV/DB)との完全非同期結合
実務では、ハードコーディングされた `paramWidth = 100.0` のような記述はありえない。
これを別クラスやCSV読み込み関数からインジェクション(注入)する構造にリファクタリングせよ。
特に、「不正な文字やマイナス値、ゼロが渡された場合のバリデーション(入力値検証)」を必ずコードの入口に設けること。CADエンジンに不正値を投げると、SolidWorks自体がフリーズするリスクがある。
② 拘束(Relations / Dimensions)の戦略
今回のコードでは純粋に座標(`CreateLine2`)だけでプロファイルを置いた。
しかし、厳密なパラメトリック設計を行う場合、スケッチ拘束(水平、垂直、一致、平行など)や、駆動寸法(Dimension)をAPI側(`AddDimension2` や `AddSkRelation`)で付与するかどうかの設計が必要になる。
実務のコツとしては、「単純な形状であれば今回のコードのように正確な座標計算で一筆書きし、厳密な寸法管理が必要な箇所だけ後から寸法駆動を入れる」というハイブリッド戦略が最もバグが少ない。
③ トランザクション管理とエラーハンドリング
もしループ処理で何十枚もの異形板金やプロファイルを連続生成する自動化ツールを作る場合、途中でエラーが起きたときのロールバック(Undo)を考慮しなければならない。
`swModel.EditUndo2` を適切にグループ化するか、エラー発生時に `InsertSketch False` で確実にスケッチモードを解除してゴミを残さないクリーンアップ処理を `On Error GoTo ErrorHandler` で必ず実装すること。
—
5. おわりに
スケッチ自動化は、単に「手動のマウス操作をコードに置き換えるもの」ではない。
「製品仕様という抽象データを、CAD空間の確実な幾何学データへ変換するエンジニアリングそのもの」である。
今回解説した `SketchManager` と `CreateLine2` の制御、そして単位系の厳格なハンドリングをマスターすれば、貴社の設計プロセスの自動化率は飛躍的に向上するはずだ。
あなたの開発プロジェクトの成功を祈る。現場の限界を、コードで突破しろ。
