【SolidWorks VBA極限解説】SketchManager.CreateArcByRadiusで制約地獄を回避する!正確無比な2次元座標作図の極意
業務自動化エンジニアの皆さん、こんにちは。
図面や3Dモデルからのデータ起こし、あるいはパラメータ駆動による自動設計ツールを開発していて、こんな「悪夢」を見たことはないでしょうか。
- 「VBAでスケッチを描いた途端、線がねじれ、予期せぬ幾何拘束(コンストレイント)が暴走してエラー落ちする」
- 「円弧を描いたはずが、端点座標が浮いてしまい、フィーチャ化(ボス押し出しなど)した際に『ゼロ厚みのジオメトリエラー』で弾かれる」
- 「マクロ記録を取ったコードをそのまま貼り付けたのに、アクティブビューや選択状態が変わると全く動かなくなる」
特に「円弧(Arc)」の作図は、SolidWorks API初学者にとって最初の鬼門です。`CreateArc`系メソッドは引数が直感的ではなく、ドキュメントの表面的な理解だけでは、実用に耐えうる堅牢なコードは書けません。
今回は、SolidWorks APIの深層を知り尽くした私が、`SketchManager.CreateArcByRadius`を用いた「バグを完全に排除し、数値計算で完全に制御された正確なスケッチ自動化」の全技術を伝授します。
—
1. なぜ「マクロ記録」のコードでは実務で使えないのか?
SolidWorksのマクロ記録機能は素晴らしいツールですが、出力されるコードは「画面上のマウス操作のトレース」に過ぎません。
例えば、円弧を描くマクロを記録すると、画面上のどこをクリックしたかというピクセル座標や、その場の選択状態(SelectionMgr)に依存したコードが生成されます。これを別のモデルや異なるサイズに適用すると、以下のような致命的な欠陥が露呈します。
1. 選択(Selection)依存の脆さ:
`swModel.Extension.SelectByID2` で面や線を指定して操作するコードは、モデルの変更(フィーチャの順序入れ替え等でInternal IDが変わる)によって一瞬で破綻します。
2. 自動拘束(Auto-Relations)の干渉:
APIでジオメトリを生成する際、デフォルトで有効な「自動拘束」が働くと、意図しない水平・垂直・接線拘束が勝手に付与され、後から数値を変更した際にスケッチが崩壊します。
プロフェッショナルな設計思想:完全修復可能な「数学的アプローチ」
実務で使う自動化ツールは、「GUIに依存せず、数学的な座標と半径のみを指定して一発で正確なジオメトリを生成する」べきです。ここで最強の武器となるのが `SketchManager.CreateArcByRadius` です。
—
2. SketchManager.CreateArcByRadius の仕様と罠
このメソッドは、指定した中心座標と半径、そして始点・終点(またはその方向)を元に円弧を生成します。
メソッドのシグネチャと引数の意味
Set swSketchSegment = swSketchManager.CreateArcByRadius( _
XC, YC, ZC, _ ‘ 円弧の中心座標 (X, Y, Z)
Radius, _ ‘ 半径
StartX, StartY, StartZ, _ ‘ 始点の座標 (X, Y, Z)
EndX, EndY, EndZ, _ ‘ 終点の座標 (X, Y, Z)
Sense ‘ 円弧の方向 (1: 時計回り, -1: 反時計回り)
)
一見すると親切な引数に見えますが、ここに最大の罠があります。
指定した始点・終点の座標が、与えられた「中心座標」と「半径」から計算される円周上に厳密に乗っていない場合、APIはエラーを返すか、あるいは不整合なジオメトリを生成して後続のフィーチャ作成をクラッシュさせます。
【極意】
VBA側で三角関数(Atn, Cos, Sinなど)を用いて、中心座標と半径から厳密な円周上の始点・終点座標を動的に算出して渡すこと。これが堅牢性を担保する唯一の絶対条件です。
—
3. 【プロダクションコード】実用に耐えうる堅牢なスケッチ自動化マクロ
以下に、実務の現場でそのまま組み込める、保守性の高いVBAコードを提示します。
このコードは、アクティブなパーツファイルのエラーを未然にチェックし、原点基準で正確なスロット形状(直線と円弧の組み合わせ)をノーミスで描画します。
Option Explicit
‘ ==============================================================================
‘ 担当者: チーフアーキテクト
‘ 概要: SketchManager.CreateArcByRadiusを用いた堅牢なスロット形状(直線+円弧)作図
‘ 特徴: 選択依存を排除し、数学的座標計算によりエラーを完全に回避
‘ ==============================================================================
Sub Main_CreatePreciseSlotSketch()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swSketchMgr As SldWorks.SketchManager
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. プリチェック(ドキュメントが開かれているか、パーツファイルか)
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If
Set swPart = swModel
‘ 2. スケッチ平面の取得(フロント平面 “Front Plane” を強制的に選択してスケッチ開始)
‘ ※Selectionを使わない安全なフィーチャ走査による面取得がベストですが、
‘ 今回は実用性を考慮し、標準的な平面指定アプローチを採用します。
swModel.ClearSelection2 True
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SelectByID2(“フロント”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “基準となる「フロント」平面が見つかりません。”, vbCritical, “エラー”
Exit Sub
End If
Set swSketchMgr = swModel.SketchManager
‘ スケッチモードへ移行
swSketchMgr.InsertSketch verdadeira
‘ — パラメータ定義 (単位: メートル系推奨だが、ドキュメント単位系に依存するためMKSを前提とする) —
Dim centerX1 As Double, centerY1 As Double, centerZ1 As Double
Dim centerX2 As Double, centerY2 As Double, centerZ2 As Double
Dim radius As Double
radius = 0.025 ‘ 半径 25mm
centerX1 = -0.05 ‘ 左側円弧の中心 X
centerY1 = 0 ‘ 中心 Y
centerZ1 = 0 ‘ 中心 Z
centerX2 = 0.05 ‘ 右側円弧の中心 X
centerY2 = 0 ‘ 中心 Y
centerZ2 = 0 ‘ 中心 Z
On Error GoTo ErrorHandler
‘ 3. 左側円弧の作図 (反時計回り: Sense = -1)
‘ 始点: (CenterX – R, CenterY, 0), 終点: (CenterX + R, CenterY, 0) とし、半円を描く
Dim arc1 As SldWorks.SketchSegment
Set arc1 = swSketchMgr.CreateArcByRadius( _
centerX1, centerY1, centerZ1, _
radius, _
centerX1, centerY1 – radius, centerZ1, _ ‘ 始点 (真下)
centerX1, centerY1 + radius, centerZ1, _ ‘ 終点 (真上)
-1) ‘ 反時計回り
‘ 4. 右側円弧の作図 (反時計回り: Sense = -1)
Dim arc2 As SldWorks.SketchSegment
Set arc2 = swSketchMgr.CreateArcByRadius( _
centerX2, centerY2, centerZ2, _
radius, _
centerX2, centerY2 + radius, centerZ2, _ ‘ 始点 (真上)
centerX2, centerY2 – radius, centerZ2, _ ‘ 終点 (真下)
-1)
‘ 5. 上下の接続線(直線)の作図
‘ CreateLine(X1, Y1, Z1, X2, Y2, Z2)
Dim line1 As SldWorks.SketchSegment
Set line1 = swSketchMgr.CreateLine(centerX1, centerY1 + radius, centerZ1, centerX2, centerY2 + radius, centerZ2)
Dim line2 As SldWorks.SketchSegment
Set line2 = swSketchMgr.CreateLine(centerX1, centerY1 – radius, centerZ1, centerX2, centerY2 – radius, centerZ2)
‘ 6. スケッチの終了
swSketchMgr.InsertSketch True
MsgBox “スロット形状のスケッチ生成に成功しました。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 異常終了時のハンドリング(スケッチモードが開きっぱなしになるのを防ぐ)
swSketchMgr.InsertSketch True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
4. 現場でトラブルを起こさないための「3つの鉄則」
上記のコードをベースに、さらに大規模な自動化システムへ拡張する際、以下のアーキテクチャ上の原則を必ず守ってください。
① 単位系(Unit System)の明示的ハンドリング
SolidWorksは、ドキュメントを開いているユーザーの環境(mmns, ipsなど)によってAPIが受け取る数値の解釈が変わります。
プロダクションコードでは、処理の冒頭で `swModel.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_DefaultUnitLength, swUnitLengthMeter` などを使用するか、すべての座標値をメートル法(MKS)基準でハードコーディング・計算するように統一してください。これを怠ると、「作成したはずの図形が1000倍のサイズになった」といった現場からの悲鳴が上がります。
② エラーハンドリングと「スケッチハング」の防止
APIの実行中にエラーが発生した際、`InsertSketch True`(スケッチを保存して閉じる)または `InsertSketch False`(スケッチ破棄)を呼ばずにマクロが中断すると、SolidWorksの画面が「スケッチ編集モードのままフリーズした状態」になり、ユーザーが手動で復旧せざるを得なくなります。
必ず上記のコードのように、`On Error GoTo` を設置し、異常系であっても確実にスケッチモードを抜け出す安全弁(ガード)を組み込んでください。
③ 外部データベース(Excel / CSV)連携時のバリデーション
もしこの自動化ツールが、Excelなどの外部データから寸法(半径や中心間距離)を読み込んで動く場合、データ読み込み直後に「幾何学的に成立するか」のバリデーションを入れてください。
- 例: 「半径が 0 以下になっていないか」
- 例: 「スロットの中心間距離が、円弧の直径の合計より短いため交差してしまうエラーを防ぐ」
VBA側でこれを弾くことで、SolidWorksの重いジオメトリエンジンに不正なデータを送り込む前にプロセスを安全に停止させることができます。
—
5. おわりに
SolidWorks APIにおけるスケッチ自動化は、単なる「マクロの再生」ではありません。「APIというキャンバスの上に、数学的方程式を正確にプロットしていく建築作業」です。
今回解説した `SketchManager.CreateArcByRadius` の座標計算アプローチをマスターすれば、複雑な切り欠き、ポケット、ブラケット形状の作図も、一切の迷いなく一瞬で生成できるようになります。
あなたの設計・製造現場の生産性を極限まで高める自動化ツール開発の成功を祈る。
