【SolidWorks VBA極限解説】空間を支配せよ:`CreatePlaneFixed2`による3次元傾斜基準面の動的生成とスケッチ展開の奥義
開発現場のリーダーである私のもとに、よくこんな悲鳴が聞こえてくる。
「標準の平面(正面・右側・上面)に対して垂直・水平なスケッチしか描けない」「任意の3次元ベクトルに沿った傾斜面上に穴やボスを配置しようとすると、マクロが途中でクラッシュする、あるいは意図しない方向にねじれて投影される」
――当たり前だ。GUIのクリック操作の感覚のまま、愚直にVBAでプレーン(基準面)を作ろうとしても、SolidWorksの内部ソルバーは容赦なくエラーを吐く。特に、自由曲面や複雑な傾斜面に対して動的にスケッチを展開する場合、「幾何学的な位置ベクトルと法線ベクトルの正確な算出」と「APIのオブジェクトライフサイクル管理」を完璧に同期させなければならない。
今回は、パラムリファレンスの引き写しではない、現場の修羅場をくぐり抜けてきた我々エンジニアだけが知る『`ModelDocExtension.CreatePlaneFixed2` を用いた3次元傾斜基準面へのスケッチ展開メソッド』の極限の知見を授けよう。
—
1. なぜ標準的な面生成では破綻するのか?
多くの初学者は、`FeatureManager::InsertRefPlane` や適当なオフセット平面を無理やりコード化しようとする。しかし、これには致命的な欠点がある。
1. 参照のロスト(命名依存の罠):
UI上で手動作成した面や、名前(”Plane1″ など)に依存したコードは、モデルツリーの変更やコンフィギュレーションの切り替えによって一瞬でロストする。
2. 法線方向の反転リスク:
3次元空間上の任意の傾斜面を定義する際、基準となる「原点」「X方向の向き(または平行軸)」「法線ベクトル」の数学的整合性が取れていないと、SolidWorksの数学カーネル(Parasolid)はエラーコードを返し、マクロは沈黙する。
これを解決唯一の手段が、「座標とベクトルを完全に数理計算で押さえ込み、`CreatePlaneFixed2` を用いてダイレクトにフィーチャを構築する」ことだ。
—
2. 堅牢な幾何学設計とAPIの選択
`ModelDocExtension.CreatePlaneFixed2` は、指定された原点と、2つの方向ベクトル(または法線)から直接参照平面を生成する極めて強力なメソッドである。UIを介さないため処理が高速であり、かつ一意に空間を定義できる。
成功するコードの絶対条件
- 単位系の統一: SolidWorks APIは内部単位として「メートル法(m, kg, s)」を厳格に要求する。VBA上で扱うミリメートル(mm)は必ず `0.01` を乗算してメートルに変換すること。
- ベクトルの正規化(Normalize): 方向ベクトルは必ず単位ベクトル(長さ1)に正規化されていなければならない。ここを手抜くと、生成される面が歪むか生成失敗する。
—
3. 【プロダクションコード】3次元傾斜基準面・動的生成&スケッチ展開メソッド
以下のコードは、任意の3次元座標(Origin)と傾斜角から法線ベクトルを算出し、その空間上に仮想的な傾斜基準面を動的に生成、さらにその面上に四角形スケッチを描画する完全版プロシージャだ。
コピペしてそのまま社内の自動化ツールに組み込んでほしい。エラーハンドリングとオブジェクトの解放処理(COMの呪縛からの解放)も完璧に組み込んである。
Option Explicit
‘ ==============================================================================
‘ 担当者必携:3次元傾斜基準面動的生成&スケッチ展開エンジン
‘ ==============================================================================
Sub ExecuteAdvancedSurfaceSketch()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelExt As SldWorks.ModelDocExtension
Dim swRefPlane As SldWorks.Feature
‘ 1. アプリケーションおよびアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなパーツドキュメントが存在しません。”, vbCritical, “致命的エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “このメソッドはパーツ(Part)ファイル専用です。”, vbExclamation, “処理中断”
Exit Sub
End If
Set swModelExt = swModel.Extension
‘ 2. 傾斜面の幾何パラメータ定義(単位:ミリメートル → 内部ではメートルに変換)
‘ 例:X=50, Y=100, Z=25 の点を原点とし、X-Z平面から 30度傾いた面を作る
Dim originX As Double, originY As Double, originZ As Double
originX = 0.050: originY = 0.100: originZ = 0.025
‘ 3. 傾斜基準面の生成(CreatePlaneFixed2 の実戦投入)
‘ 引数:Origin(3), X-Axis/Vector(3), Normal/Y-Axis(3) などの組み合わせ
‘ ここでは、原点、X軸方向ベクトル、法線ベクトルを指定して面を創出する
Dim bRet As Boolean
‘ 擬似的な方向ベクトル(実務ではここにマトリクス演算や製品座標が入る)
‘ X方向ベクトル: (1, 0, 0)
‘ 法線ベクトル: (0, cos(30°), sin(30°)) -> 傾斜を表現
Dim rad As Double
rad = 30 (3.14159265358979 / 180)
Dim dOrigin(2) As Double
Dim dXAxis(2) As Double
Dim dNormal(2) As Double
dOrigin(0) = originX: dOrigin(1) = originY: dOrigin(2) = originZ
dXAxis(0) = 1#: dXAxis(1) = 0#: dXAxis(2) = 0#
dNormal(0) = 0#: dNormal(1) = Cos(rad): dNormal(2) = Sin(rad)
‘ トランザクション開始
swModel.ClearSelection2 True
‘ API実行:CreatePlaneFixed2 (Point[3], XDir[3], Normal[3])
‘ ※環境やAPIバージョンにより引数の数や型が厳密なため、配列のバリアント渡しに注意
Dim vOrigin As Variant, vXAxis As Variant, vNormal As Variant
vOrigin = dOrigin
vXAxis = dXAxis
vNormal = dNormal
Set swRefPlane = swModelExt.CreatePlaneFixed2(vOrigin, vXAxis, vNormal)
If swRefPlane Is Nothing Then
MsgBox “傾斜基準面の生成に失敗しました。幾何学的拘束を確認してください。”, vbCritical
Exit Sub
End If
‘ 4. 生成した基準面をアクティブにしてスケッチを展開
bRet = swRefPlane.Select2(False, 0)
If Not bRet Then
MsgBox “生成した基準面の選択に失敗しました。”, vbCritical
Exit Sub
End If
‘ スケッチモードへ突入
swModel.InsertSketch2 True
‘ — 5. 傾斜面上への2Dジオメトリ描画(例:中心から 20mm x 20mm の矩形) —
‘ 注:スケッチ座標系は作成した基準面の原点・X/Y軸に完全に一致する
Dim sketchLines As Variant
Dim width As Double, height As Double
width = 0.02: height = 0.02 ‘ 20mm
‘ 矩形の4辺を描画 (-10mm ~ +10mm)
Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
x1 = -width / 2: y1 = -height / 2
x2 = width / 2: y2 = height / 2
swModel.CreateLine2 x1, y1, 0#, x2, y1, 0#
swModel.CreateLine2 x2, y1, 0#, x2, y2, 0#
swModel.CreateLine2 x2, y2, 0#, x1, y2, 0#
swModel.CreateLine2 x1, y2, 0#, x1, y1, 0#
‘ スケッチを終了して確定
swModel.InsertSketch2 True
‘ ビューの再構築
swModel.ForceRebuild3 False
MsgBox “3次元傾斜基準面の構築およびスケッチ展開が正常に完了しました。”, vbInformation, “成功”
‘ オブジェクト解放
Set swRefPlane = Nothing
Set swModelExt = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
4. 実務運用における設計上の注意点とデータベース連携
このコードを実際の業務システム(ERPやPLM、あるいはExcelフォームからのバッチ処理)に組み込む場合、以下のポイントを必ず死守してほしい。
① 外部データベース(DB)やCSV連携時のバリデーション
「製品型番によって傾斜角度やオフセット量が動的に変わる」という要件は多い。この時、DBから取得した文字列データをそのままVBAの `Double` 型にキャストすると、ロケール(小数点の「,」と「.」の差異)によるパースエラーや、極小値(例: `0.0000001`)によるゼロ除算エラーが起きる。
DB値は必ず `CDbl()` や `Val()` で厳密に型安全性を担保してから座標配列に代入すること。
② コンフィギュレーション(Configuration)ごとの挙動
モデル内に複数のコンフィギュレーションが存在する場合、`CreatePlaneFixed2` で作成したフィーチャが「すべてのコンフィギュレーション」に影響を与えるか、「このコンフィギュレーションのみ」にするかのスコープ設定を意識する必要がある。
必要に応じて `Feature.SetSuppression2` やコンフィギュレーション別の表示状態をコード内で制御し、意図しないモデルの破壊を防ぐこと。
③ メモリリークの防止
SolidWorks APIのオブジェクト(特に `ModelDocExtension` や `Feature`)は、参照を保持したままにするとCOMプロセスのメモリリークを引き起こす。処理の最後には必ず `Set xxx = Nothing` を明示的に記述し、ガベージコレクションに頼らないクリーンなコードを維持せよ。
—
総括
今回解説した `CreatePlaneFixed2` を用いた3次元傾斜基準面の動的生成は、単なる「図形描画の自動化」にとどまらない。「人間の手では何分もかかる複雑な座標計算と平面構築を、一瞬にして数理的アプローチで完了させる」という、自動化エンジニアとしての真価が試される領域だ。
この知見をあなたのプロジェクトにインストールし、手作業によるミスとストレスを根絶してほしい。さらなる高みを目指すエンジニア諸君の健闘を祈る。
