【SolidWorks VBA極限解説】SketchManager.CreateCircleByRadiusでマスタる堅牢な2Dプロファイル自動描画
こんにちは。開発プロジェクトのリーダーである私だ。
これまで数多の3D CAD自動化案件を統括してきたが、現場から最も頻繁に挙がる要望の一つが「定型的な2Dプロファイルのプログラム描画」である。
特に、フランジやボス、プーリーといった回転体や、規格品のベースプレートなど、パラメータを変えるだけで幾何学形状を自動生成したいというニーズは尽きない。
ネット上には「マクロの記録」をそのまま貼り付けたような、コンテキスト依存の脆弱なコードが溢れているが、実務の現場で耐えうる堅牢なシステムを構築したいなら、APIのオブジェクトモデルの挙動、特に「コンテキストの明確化」と「スケッチのライフサイクル管理」を完全に理解していなければならない。
今回は、`SketchManager.CreateCircleByRadius`を用いた円の描画を題材に、明日から現場で使えるプロダクション品質のコードと、その裏にある設計思想を伝授しよう。
—
1. なぜ「マクロの記録」では実務で破綻するのか?
SolidWorksのマクロ記録機能は優秀だが、出力されるコードは「今画面で何が選択されているか」という暗黙の状態(State)に強く依存している。
例えば、マクロ記録が吐き出すコードの多くは以下のような形をとる:
‘ 【アンチパターン】絶対に書いてはならないコード
SwApp.ActiveDoc.SketchManager.InsertSketch True
‘ 画面上のクリック位置や選択状態に依存するため、ドキュメントが変わると暴走する
実務の自動化ツールにおいて、「画面上の選択状態に依存する」というのは最大のタブーだ。ユーザーが意図しない面をクリックしていたり、ビューの向きが異なっていたりするだけで、プログラムは迷子になり、実行時エラーを吐くか、とんでもない位置にスケッチを描き始める。
我々が書くべきコードは、「どのドキュメントの、どの平面に対し、何をどう操作するか」をコード上で完全に制御・完結させることだ。
—
2. 堅牢なスケッチ自動化の4ステップ
プログラムからスケッチを描画する際、以下の4ステップを厳密に踏む必要がある。
1. アクティブドキュメントの確実な取得と型安全性の担保 (`SldWorks.ModelDoc2`)
2. 描画対象となる平面(Plane)の特定と選択
3. スケッチモードへの強制移行 (`SketchManager.InsertSketch`)
4. プリミティブ(図形)の正確な生成と、スケッチモードの安全な離脱
特に重要なのは、「スケッチを描いたら必ず閉じる(InsertSketch False)」という原則だ。これを怠ると、ドキュメントがスケッチモードにロックされたままになり、後続のフィーチャー作成(押し出しなど)がすべて失敗する。
—
3. 【プロダクションコード】原点中心の円を描画する完全版VBA
以下に、実務の現場でそのまま組み込める、エラーハンドリング付きの堅牢なプロシージャを提示する。
このコードは、新規部品ドキュメントを立ち上げ、「前面 (Front Plane)」に対して原点中心の指定半径の円を描画するものだ。
Option Explicit
‘ =========================================================================
‘ 処理名 : CreateCenterCircle_Production
‘ 概要 : 指定した半径の円を前面(Front Plane)の原点にプログラム描画する
‘ 備考 : 業務システム連携を想定し、エラーハンドリングと状態復帰を徹底
‘ =========================================================================
Sub CreateCenterCircle_Production()
‘ 1. SolidWorksアプリケーションのインスタンス取得
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 2. アクティブドキュメントの取得(型安全性を確保)
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
‘ ドキュメントが開いていない場合は新規パーツ作成
Dim fileTemplate As String
fileTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
Set swModel = swApp.NewDocument(fileTemplate, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “新規パーツドキュメントの作成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
End If
‘ エラーハンドリングの有効化(スケッチモードのロックを防ぐため必須)
On Error GoTo ErrorHandler
‘ 3. 描画対象の平面(前面 / Front Plane)を特定して選択
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager
‘ 選択をクリア
swModel.ClearSelection2 True
‘ FeatureTreeから「Front Plane」を名前で確実に取得して選択する
Dim bRet As Boolean
bRet = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not bRet Then
Err.Raise 1000, “SketchAutomation”, “基準となる「正面 (Front Plane)」が見つかりません。”
End If
‘ 4. スケッチモードへ移行
‘ 引数 True は「選択した平面に対して垂直な視線に向きを変える」挙動を制御
swModel.SketchManager.InsertSketch True
‘ —————————————————————–
‘ 5. 幾何学的図形の描画 (SketchManager.CreateCircleByRadius)
‘ —————————————————————–
‘ 引数説明:
‘ CenterX, CenterY, CenterZ : 円の中心座標 (単位: メートル / SolidWorks内部単位)
‘ Radius : 円の半径 (単位: メートル)
‘
‘ ※実務上の注意: SolidWorksのAPI内部単位は常に「メートル」である。
‘ ミリメートルで思考しがちだが、50mmを指定したい場合は 0.05 と渡すこと。
Dim radiusMeters As Double
radiusMeters = 50# / 1000# ‘ 50mmをメートルに換算
Dim swSketchCircle As SldWorks.SketchSegment
Set swSketchCircle = swModel.SketchManager.CreateCircleByRadius(0, 0, 0, radiusMeters)
If swSketchCircle Is Nothing Then
Err.Raise 1001, “SketchAutomation”, “円の作成に失敗しました。”
End If
‘ 6. スケッチモードの安全な離脱(必ず実行すること)
swModel.SketchManager.InsertSketch False
‘ 選択を再度クリアしてビューを等角投影に
swModel.ClearSelection2 True
swModel.ViewZoomtofit
MsgBox “円のプロファイル描画が正常に完了しました。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 異常終了時もスケッチモードが開きっぱなしになるのを防ぐため強制終了
On Error Resume Next
swModel.SketchManager.InsertSketch False
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “例外発生”
End Sub
—
4. プロフェッショナルが教える「3つの実装上の鉄則」
上記のコードをあなたのプロジェクトに組み込むにあたり、シニアエンジニアとして特に強調しておきたい「3つの鉄則」を伝授する。
① 内部単位(MKS)の罠を忘れるな
SolidWorksのAPIは、ドキュメント側の表示単位(mm, inchなど)に関わらず、座標や寸法を常に「メートル(m)」で受け取る。
コード内で `50` と書けば、それは「50メートル」の巨大な円を描こうとすることを意味し、ジオメトリの崩壊やエラーの原因になる。必ず `50 / 1000` のようにミリメートルからメートルへの換算レイヤーを挟むこと。
② `On Error` によるスケッチモードの保護
もし `CreateCircleByRadius` の実行前後に何らかの予期せぬエラーが発生した場合、SolidWorksは「スケッチ編集中」のままフリーズ状態、あるいはUIがロックされた状態になる。
これを放置すると、ユーザーが手動で復旧するか、SolidWorksを強制終了するハメになる。プロダクションコードでは必ず `On Error GoTo` を仕込み、エラー時であっても確実に `InsertSketch False` を通る構造にしなければならない。
③ 面の名称(言語依存)への対策
コード内で `SelectByID2(“正面”, “PLANE”, …)` と記述しているが、これは日本語環境のSolidWorksを前提としている。もし英語環境や多国籍展開する企業でこのマクロを動かす場合、「正面」という名前は「Front」に変わるためエラーになる。
実務で真に堅牢なシステムを作る場合は、名前で選択するのではなく、`swModel.FeatureManager.GetFeatures` 等でフィーチャーのタイプ(`Plane`)を走査して動的に取得するロジックに昇華させるべきだ。
—
5. 次のステップへ
今回は基本の基として、原点中心の円を描画する手法を解説した。
しかし、実際の業務では「円と円を接線拘束で結ぶ」「長方形の四隅にフィレットをかける」「外部DB(ExcelやCSV)から寸法データをバッチ読み込みして一括生成する」といった複雑な自動化が求められる。
それらの応用テクニックについても、今後このブログで容赦なく公開していく。
あなたの開発する自動化ツールが、現場の無駄な工数を削ぎ落とし、真に価値のある設計業務に集中できる環境をもたらすことを願っている。
妥協のないコードで、最高の自動化を実現してほしい。
