【SolidWorks VBAを掌握する極限の知見】スケッチ自動化の基礎:`CreateCircleByRadius`による2Dプロファイルの極限描画
工業用CADの自動化において、最も頻繁に行われる反復作業は「スケッチの生成と拘束」である。だが、多くのVBAプログラマは、マクロ記録の出力をそのまま引き写し、COMオブジェクトのライフサイクル管理やコンテキストの切り替えコストを無視した脆弱なコードを書いている。
本稿では、`SketchManager.CreateCircleByRadius`を用いた円のプログラム描画を題材に、単なるAPIの使い方の解説にとどまらない。SolidWorks APIの根底にある「ドキュメント・コンテキストの厳格な管理」「COM参照の適切な破棄」「スケッチ平面とビューの同期メカニズム」という、シニアエンジニアが押さえておくべき極限の知見を授ける。
—
1. SolidWorks APIにおけるオブジェクト階層とコンテキストの罠
SolidWorks VBAの根幹をなすのは、`SldWorks.SldWorks`(ルートアプリケーション)と`SldWorks.ModelDoc2`(アクティブドキュメント)の二大巨頭である。
スケッチ描画の自動化で陥る最初の罠は、「どのコンテキスト(面や平面)に対してスケッチマネージャが操作を行っているか」の不整合である。UI上の選択状態(SelectionMgr)に依存したコードは、バックグラウンド処理やアセンブリのコンテキスト変更時に容易に破綻する。
堅牢な自動化システムでは、UIの選択状態に頼らず、Feature(フィーチャー)ツリーから直接ターゲットとなる平面(Plane)を特定し、プログラム的にスケッチモードへ遷移させなければならない。
—
2. 実務仕様:完全修飾されたセキュアな円描画プロシージャ
以下に、実務の現場で耐えうる堅牢性を備えたVBAコードを示す。このコードは、フロント平面(Front Plane)をプログラム的に取得し、その平面上で原点から指定半径の円を描画するものである。
Option Explicit
‘ ==============================================================================
‘ 処理名: CreateTargetCircleOnFrontPlane
‘ 概要 : フロント平面を強制選択してスケッチモードへ移行し、指定半径の円を描画する
‘ 備考 : 予期せぬCOMリークを防ぐため、すべてのオブジェクト変数を明示的に解放する
‘ ==============================================================================
Sub CreateTargetCircleOnFrontPlane()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swSketchMgr As SldWorks.SketchManager
Dim swFeatMgr As SldWorks.FeatureManager
Dim boolstatus As Boolean
‘ 1. アプリケーションインスタンスの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “API Error”
Exit Sub
End If
‘ 2. アクティブドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “有効なドキュメントが開かれていません。”, vbExclamation, “API Error”
Exit Sub
End If
‘ 3. ドキュメントタイプの検証 (ここでは部品(Part)ドキュメントを前提とする)
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは部品(Part)ドキュメントでのみ実行可能です。”, vbCritical, “Type Mismatch”
Exit Sub
End If
Set swPart = swModel
‘ 4. 既存の選択をクリア (コンテキストの汚染を防ぐための必須処理)
swModel.ClearSelection2 True
‘ 5. フィーチャーツリーから “Front Plane” をプログラム的に取得して選択
‘ UIのクリックに依存しないため、言語環境(日本語/英語)によるバグを防ぐ
Set swFeatMgr = swModel.FeatureManager
boolstatus = swModel.Extension.SelectByID2(“Front Plane”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “基準平面 ‘Front Plane’ の取得に失敗しました。”, vbCritical, “Selection Error”
GoTo CleanUp
End If
‘ 6. スケッチモードへの移行
‘ 選択された平面上で2Dスケッチセッションを開始する
swModel.InsertSketch2 True
‘ 7. スケッチマネージャの取得と円の描画
‘ SketchManager.CreateCircleByRadius の引数:
‘ X座標 (m), Y座標 (m), Z座標 (m), 半径 (m)
‘ ※ SolidWorksの内部単位系は常に「メートル法(MKS)」であることを忘れてはならない。
Set swSketchMgr = swModel.SketchManager
‘ 例: 原点(0, 0, 0)を中心に、半径 50mm (0.05m) の円を描画
Dim circleRadius As Double
circleRadius = 0.05 ‘ 50mm
Dim swSketchSegment As SldWorks.SketchSegment
Set swSketchSegment = swSketchMgr.CreateCircleByRadius(0#, 0#, 0#, circleRadius)
If swSketchSegment Is Nothing Then
MsgBox “円の描画に失敗しました。”, vbCritical, “Sketch Error”
End If
‘ 8. スケッチモードの終了 (編集状態を確定させる)
swModel.InsertSketch2 True
‘ ビューの再構築 (グラフィックの整合性保持)
swModel.GraphicsRedraw2
CleanUp:
‘ ==========================================================================
‘ 【極限の知見】COMオブジェクトの明示的解放
‘ VBAのガベージコレクションに依存せず、スコープ終了前にNothingを代入し、
‘ メモリリークおよびSolidWorksプロセス遺残を確実に防止する。
‘ ==========================================================================
Set swSketchSegment = Nothing
Set swSketchMgr = Nothing
Set swFeatMgr = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
Debug.Print “CreateTargetCircleOnFrontPlane: 正常終了”
End Sub
—
3. チーフアーキテクトが指摘する「3つの技術的急所」
上記のコードは一見して標準的なものに見えるが、実務環境において生き残るために組み込まれた3つのアーキテクチャ上のこだわりがある。
① 内部単位系(MKS)の厳格な遵守
SolidWorks APIの数値引数は、ユーザーインターフェース(UI)上の表示単位(mmやinch)に関わらず、常にメートル(Meter)を強制される。
コード内で `circleRadius = 0.05` と記述しているのはそのためである。ミリメートル単位の数値をそのまま渡すと、意図した図形の何千倍もの巨大なスケッチが生成され、ジオメトリ計算エラー(Zero thickness geometry等)の温床となる。
② 言語依存性を排除した `SelectByID2` の活用
多くの初学者は `swModel.Extension.SelectByID2(“フロント”, “PLANE”, …)` のように、UI上のローカライズされた名称を指定しがちである。
しかし、これでは英語OS環境や、テンプレートカスタマイズが行われた環境で容赦なくエラーを起こす。SolidWorksの標準平面(Front Plane, Top Plane, Right Plane)は、言語設定に関わらず内部名が固定されているため、これをプログラムの定数として扱うべきである。
③ 徹底的なCOM参照の破棄(メモリ最適化)
VBAのランタイムはCOMオブジェクトの参照カウントを自動処理しているように見えるが、複雑なアセンブリや長時間のバッチ処理においては、VBA側で解放しきれなかった参照がSolidWorksのプロセス(SLDWORKS.exe)側に残り、メモリリークや「RPCサーバーは利用できません」という致命的なCOM例外を引き起こす。
オブジェクト変数のスコープを意識し、処理の終端で `Set 〇〇 = Nothing` を明示的に記述することは、プロフェッショナルなエンジニアにとっての絶対的な作法である。
—
4. まとめ:自動化の先にあるもの
`SketchManager.CreateCircleByRadius` をはじめとするスケッチAPIの掌握は、単なる作図の代行ではない。それは、社内の設計ノウハウを「数式と論理のコード」へと昇華させ、ヒューマンエラーを根絶するための第一歩である。
レガシーなVBA環境であっても、アーキテクチャの原則を理解し、堅牢なエラーハンドリングとメモリ管理を徹底すれば、企業競争力を支える強力なシステム基盤となり得ます。妥協なきコードで、真の自動化領域を切り拓いてほしい。
