【テクニカル・上級編】【スケッチ自動化】SketchManager.CreateArcByRadiusを用いたフィレット・円弧形状の正確な2次元座標作図テクニック – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】SketchManager.CreateArcByRadiusで制圧する高精度円弧作図の全実務知見

長年、製造業の現場でCADの自動化アーキテクチャを構築してきた者なら誰もが知っている事実がある。それは、「SolidWorksのAPIは、表面的なメソッドの羅列だけでは実務に耐えうる安定性を発揮しない」ということだ。

特にスケッチエンティティの生成、中でも直線と円弧が入り交じる複雑な輪郭の自動生成において、座標計算のミスやコンテキストの取り違えは、一瞬で「再生エラー(Rebuild Error)」という名の例外を招く。

今回は、スケッチマネージャーの隠れた主役である `SketchManager.CreateArcByRadius` メソッドに焦点を当てる。単なる公式リファレンスの引き写しではない。メモリ管理、COMコンテキストの生存期間、そして実務で必ず直面する「浮動小数点誤差」との戦い方を網羅した、極限の知見をここに開示する。

1. なぜ `CreateArcByRadius` なのか?

SolidWorks VBAで円弧を描画する際、主に以下の選択肢が存在する。
1. `CreateArc`(3点指定:始点・終点・通過点)
2. `CreateArcByCenterStartEnd`(中心・始点・終点指定)
3. `CreateArcByRadius`(中心・始点・終点・方向指定+半径)

一見すると、3点指定のほうが直感的思えるかもしれない。しかし、機械設計の自動化においては、中心座標と半径が理論値として確定しているケースが圧倒的に多い。

`CreateArcByRadius` を用いる最大のメリットは、設計意図(Design Intent)を直接コードに落とし込める点にある。計算された中心座標と正確な半径を指定することで、意図しない微小なジオメトリのズレや、それに起因するフィーチャ(押し出しやスイープ)の失敗を根絶できる。

2. アーキテクチャ上の罠:COMオブジェクトのライフサイクルとメモリ最適化

SolidWorks VBAの裏側では、COM(Component Object Model)が稼働している。VBAのランタイムは自動ガベージコレクションを行ってくれるが、CADのAPIにおいてはこれが「悪夢」となることがある。

特に、スケッチ要素を連続生成するループ処理の中で、戻り値の `SketchSegment` オブジェクトを適切に解放せず、あるいは参照を保持し続けた場合、COMの参照カウンタが溢れ、メモリリークや最悪の場合はSolidWorks自体の強制終了(クラッシュ)を誘発する。

鉄則:オブジェクト変数の明示的解放

大量のエンティティを生成するバッチ処理では、必ずループ内で変数スコープを絞り、用済みのオブジェクトは `Nothing` を代入して参照を即座に解放しなければならない。

3. 実装コード:実務仕様の高精度円弧・フィレット自動作図

以下のコードは、単に円弧を描くだけではなく、実務で必須となる「単位系(MKS/MMGS)の厳密な管理」「アクティブスケッチの安全な取得」「エラーハンドリング」を実装したプロダクションレベルのサンプルである。

Option Explicit

‘ =========================================================================
‘ 模範的モジュール: 高精度スケッチ自動生成エンジン
‘ ターゲット: SolidWorks 2021 / 2024 (VBA 7.1)
‘ アーキテクト: チーフ・オートメーション・エンジニア
‘ =========================================================================

Public Sub ExecutePrecisionArcGeneration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSketchMgr As SldWorks.SketchManager
Dim swSkSegment As SldWorks.SketchSegment

‘ 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 “このマクロはパーツファイルでのみ実行可能です。”, vbCritical, “型不一致エラー”
Exit Sub
End If

‘ 2. スケッチモードの確認と移行
Set swSketchMgr = swModel.SketchManager
If Not swSketchMgr.ActiveSketch Then
‘ スケッチがアクティブでない場合、標準平面(例: 前面)を選択して強制展開
Dim swModelDocExt As SldWorks.ModelDocExtension
Set swModelDocExt = swModel.Extension

‘ “Front Plane” を選択してスケッチ開始
Dim boolstatus As Boolean
boolstatus = swModelDocExt.SelectByID2(“Front Plane”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If boolstatus Then
swSketchMgr.InsertSketch True
Else
MsgBox “スケッチプレーンの取得に失敗しました。”, vbCritical
GoTo CleanUp
End If
End If

‘ 3. トランザクション処理の開始(パフォーマンスとundoの統合)
swModel.ClearSelection2 True

‘ — 座標定義(単位: メーター内部表現。UI上のmmではないことに注意!) —
‘ SolidWorks APIの内部単位は常に「メートル法 (MKS)」である。
‘ ここを誤ると、意図したサイズの1000分の1の微小図形が生成される。

Dim centerX As Double, centerY As Double, centerZ As Double
Dim startX As Double, startY As Double, startZ As Double
Dim endX As Double, endY As Double, endZ As Double
Dim sense As Long

‘ 例: 半径 50mm (0.05m) の円弧を作成
‘ 中心座標: (0.1, 0.1, 0)
centerX = 0.100: centerY = 0.100: centerZ = 0#

‘ 始点座標: (0.1, 0.15, 0) -> 上端
startX = 0.100: startY = 0.150: startZ = 0#

‘ 終点座標: (0.15, 0.1, 0) -> 右端
endX = 0.150: endY = 0.100: endZ = 0#

‘ 方向フラグ (sense):
‘ 1 = 時計回り (Clockwise), -1 = 反時計回り (Counter-Clockwise)
sense = -1

‘ 4. メソッド実行とエラー監視
On Error GoTo ErrorHandler

‘ CreateArcByRadius(X中心, Y中心, Z中心, X始点, Y始点, Z始点, X終点, Y終点, Z終点, 方向)
Set swSkSegment = swSketchMgr.CreateArcByRadius( _
centerX, centerY, centerZ, _
startX, startY, startZ, _
endX, endY, endZ, _
sense)

If swSkSegment Is Nothing Then
Err.Raise vbObjectError + 1000, “SketchEngine”, “CreateArcByRadius が無効なジオメトリを返しました。”
End If

‘ 成功時の処理(ビューの更新など)
swModel.ViewZoomtoFit2
MsgBox “高精度円弧の生成に成功しました。”, vbInformation, “完了”

CleanUp:
‘ 5. 厳格なメモリ解放
Set swSkSegment = Nothing
Set swSketchMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “実行時エラー”
Resume CleanUp
End Sub

4. チーフアーキテクトが教える「現場の知見」と落とし穴

上記のコードをそのまま動かすだけでは、プロのエンジニアとは言えない。実務で必ず直面する2大トラップとその回避策を共有する。

知見その1:内部単位(MKS)の呪縛

SolidWorks APIは、ユーザーインターフェース(UI)上の表示単位(mm, inch等)に関わらず、内部的には常に「メートル(Meter)」でデータを処理する
`CreateArcByRadius` に `50` という数値をそのまま渡すと、半径50メートルという巨大な円弧が生成され、ビューポートから完全にロストする。必ず `0.05` のようにメートル換算した値を渡すこと。

知見その2:幾何学的不整合(Geometric Inconsistency)の排除

`CreateArcByRadius` を呼び出す際、指定した「中心から始点までの距離」と「中心から終点までの距離」、そして「指定した半径」の間に数学的な矛盾がある場合、APIは沈黙して `Nothing` を返すか、あるいは不正なスケッチを生成して後続のフィーチャ作成をクラッシュさせる。

これを防ぐためには、VBA側で事前に三平方の定理(ピタゴラスの定理)を用いたバリデーションを挟むのがプロの作法である。

‘ 始点の半径検証
Dim radiusStart As Double
radiusStart = Sqr((startX – centerX) ^ 2 + (startY – centerY) ^ 2)

‘ 浮動小数点の誤差を考慮した許容値(Tolerance: 1ミクロン = 0.000001m)
Const TOLERANCE As Double = 0.000001
Dim targetRadius As Double
targetRadius = 0.05 ‘ 50mm

If Abs(radiusStart – targetRadius) > TOLERANCE Then
Err.Raise vbObjectError + 1001, “Validator”, “指定された始点座標が、定義された半径と一致しません。”
End If

このレベルの防御的プログラミングを実装して初めて、夜間のバッチ処理や外部システム(ERP/PDM)からの連携データによる自動作図が「止まらないシステム」へと昇華する。

総括

SolidWorks VBAによる自動化の領域は、単なるマクロの記録の延長線上にはない。COMのライフサイクル管理、内部単位系の徹底、そして幾何学的な数値計算の裏付け。これらを完全にコントロールできた者だけが、CAD自動化の本当の果実を手にすることができる。

今回の `CreateArcByRadius` の解説が、あなたのシステムを次のステージへと引き上げる確かな礎となることを確信している。妥協なきコードで、現場の生産性を極限まで高めてほしい。

タイトルとURLをコピーしました