【SolidWorks API】動的オフセット平面とスケッチ自動生成の極意 ― 堅牢なモデリングオートメーションの実装術
SolidWorksの自動化において、最も頻繁に遭遇し、かつ最も多くの「設計的負債」を生み出しやすい領域が、「基準面を介したフィーチャの動的生成」です。
巷には「マクロの記録」をそのまま流用したコードが溢れていますが、あれをそのまま実務で使ってはいけません。マクロ記録はあくまで「操作のトレース」であり、あなたのコードは「ロジックの構築」であるべきだからです。
今日は、既存の平面からオフセットした面を生成し、そこにスケッチを展開する際の「プロフェッショナルな作法」を伝授します。
—
1. なぜ「マクロ記録」のままではいけないのか
多くの初心者が陥る罠は、`SelectByID2` を連発し、画面上の選択状態に依存したコードを書くことです。
- 依存性の問題: モデルの構成変更により、名前やインデックスが変われば即座にエラーとなります。
- パフォーマンスの欠如: 選択(Selection)は、バックグラウンドでUIの再描画を伴うため、処理速度を著しく低下させます。
- 保守性の崩壊: どの面を基準にしているのかがコードから読み取れず、半年後の自分が修正不能なブラックボックス化します。
我々が目指すべきは、「オブジェクト参照による直接制御」です。
—
2. 実装の要諦:ReferencePlaneを動的に扱う
オフセット面を生成する際、重要なのは「名前」ではなく「オブジェクトのポインタ」を保持することです。以下のコードは、既存の平面オブジェクトからオフセット面を生成し、その面上にスケッチを作成するプロダクションレベルのテンプレートです。
プロダクションコード例
Option Explicit
‘ 堅牢なモデリングのための動的オフセット面生成モジュール
Public Sub CreateOffsetSketch()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeatureManager As SldWorks.FeatureManager
Dim swRefPlane As SldWorks.Feature
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swPart = swModel
Set swFeatureManager = swModel.FeatureManager
‘ 1. 基準面の選択 (例: Front Plane)
‘ 実際には名前指定ではなく、特定のプロパティを持つオブジェクトを検索することを推奨
Dim bRet As Boolean
bRet = swModel.Extension.SelectByID2(“Front Plane”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
‘ 2. オフセット面(ReferencePlane)の生成
‘ swFeatureManager.FeatureAddSketch とは異なり、FeatureManager経由で作成
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatureManager.InsertReferencePlane(8, 0.05, 0, 0, 0, 0) ‘ 50mmオフセット
If swFeat Is Nothing Then
MsgBox “平面生成に失敗しました。モデルの整合性を確認してください。”
Exit Sub
End If
‘ 3. 生成した平面を自動選択してスケッチを開く
swModel.ClearSelection2 True
swFeat.Select2 False, 0
‘ スケッチの開始
swModel.SketchManager.InsertSketch True
‘ ここにスケッチエンティティ作成のロジックを追加…
‘ 4. スケッチ終了(コンテキストのクリーンアップ)
swModel.SketchManager.InsertSketch True
‘ 再構築を実行してモデルを正常化
swModel.EditRebuild3
End Sub
—
3. 実務で「バグ」を起こさないための3つの鉄則
① オブジェクトのライフサイクルを管理する
`SelectByID2` で名前を指定するのは危険です。モデルの履歴で平面名が変更される可能性があるからです。可能であれば、`Feature` オブジェクトの `Name` プロパティではなく、`GetSpecificFeature2` 等を使用して、特定の定義(Type)を持つ特徴を直接取得する設計にしましょう。
② ファイル・DB連携時の注意点
もし外部のCSVやデータベースからオフセット寸法を読み込む場合、必ず単位系を確認してください。SolidWorks APIは内部的に「メートル法(m)」で数値を扱います。mm単位で入力された数値をそのまま渡すと、1000倍のスケールで生成されてしまいます。
‘ 良い例: 単位変換を明示的に行う
Dim offsetValue As Double
offsetValue = 50 / 1000 ‘ 50mmをメートルに変換
③ 再構築(Rebuild)のタイミング
フィーチャの生成後は、必ず `swModel.EditRebuild3` を呼び出してください。APIの実行直後はジオメトリが計算されていない状態(ダーティな状態)になりやすく、次のフィーチャが生成できないケースが発生します。
—
最後に:なぜエンジニアは「型」にこだわるのか
自動化スクリプトは、一度作って終わりではありません。チームの誰もが保守でき、かつ、どのようなモデル構成であっても「例外を吐かずに止まる」ことが求められます。
「動けばいい」というコードは、数ヶ月後に必ずあなたを苦しめます。
今回紹介したオブジェクト指向的なアプローチこそが、SolidWorksという巨大なシステムの海を航海するためのコンパスです。
さあ、次はあなたのモデリングプロセスを、この「堅牢なコード」で武装してください。質問があれば、いつでも現場の知見を共有しましょう。
