【SolidWorks VBA極限解説】LoftFeatureData.SetStartAndEndDraftが握る、工業デザイン品質のロフト曲面制御
工業デザイン、流体解析用のインテークダクト、あるいは複雑な配管・筐体デザイン。
「SolidWorksのVBAでロフト曲面を自動生成したいが、生成されたボディがねじれる、あるいは端部でカクついてG1(接線)連続性が担保できない」
そんな壁にぶつかったことはないだろうか。
世に溢れる大半のVBAサンプルコードは、単にスケッチを拾って `InsertLoft2` を雑に叩くだけの代物だ。それでは実務に耐えうる「なめらかな流線型ボディ」など到底生成できない。プロダクション環境で求められるのは、数学的に破綻せず、意図したドラフト角度と接線拘束を完全制御したロフト生成である。
今回は、`LoftFeatureData` オブジェクトの心臓部である `SetStartAndEndDraft` メソッドを極限まで使いこなし、プロフェッショナルなサーフェス/ソリッドを自動構築するノウハウを伝授する。
—
1. なぜ「普通のロフトコード」は実務で使い物にならないのか?
VBAによるフィーチャ操作の最大の罠は、「APIのデフォルト値の暴力」にある。
手動操作であれば、PropertyManager(UI)がよしなに計算してくれる開始・終了条件も、API経由では明示的な指示を与えなければ、予期せぬ「なし(None)」や「自由曲面(Free)」として評価される。特に、複数断面を通るロフトや、ガイドカーブを伴う流線型ボディにおいて、この暗黙のパラメータ設定が「ねじれ(Twist)」や「面C0連続(角張った結合)」を引き起こす最大の原因となる。
実務の自動化ツールにおいて、エラーハンドリングや形状破綻の回避を考えるならば、以下の鉄則を死守しなければならない。
1. 参照面(Reference)の法線ベクトルとスケッチの向きをコード側で意識する
2. 端部条件(Start/End Condition)を明示的に `swLoftEndCondition_e` で指定する
3. ドラフト角度(Draft Angle)と大きさ(Magnitude)を `SetStartAndEndDraft` で厳密にバインドする
—
2. アーキテクチャ設計:堅牢なロフト生成モジュールの全貌
今回提供するプロダクションコードは、単なるスニペットではない。
あらかじめ用意された2つのスケッチプロファイルに対し、開始面・終了面のドラフト角度と接線長をコードから完全に支配し、エラーなくソリッドボディを生成するプロシージャだ。
実務でのファイル連携やデータベース(CSV/Excel等)からのパラメータ読み込みを見据え、マジックナンバーを排除した設計にしている。
プロダクションVBAコード
Option Explicit
‘ =================================================================================
‘ módulo名: modLoftBuilder
‘ 概要: 接線連続性とドラフトを完全制御したロフトソリッド生成エンジン
‘ 依存関係: SolidWorks 202X Type Library
‘ =================================================================================
Public Sub CreateAdvancedLoftBody()
Dim swApp As SldWorks.SldWorks
Dim swDoc As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeatMgr As SldWorks.FeatureManager
Dim swLoftData As SldWorks.LoftFeatureData
Dim swFeat As SldWorks.Feature
‘ 1. アプリケーションおよびドキュメントの取得
Set swApp = Application.SldWorks
Set swDoc = swApp.ActiveDoc
If swDoc Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “致命的エラー”
Exit Sub
End If
If swDoc.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation, “型不一致”
Exit Sub
End If
Set swPart = swDoc
Set swFeatMgr = swDoc.FeatureManager
‘ 2. ロフトフィーチャデータの作成
‘ 第1引数: 人体にclosed(閉じたロフト)にするか -> False (Open)
‘ 第2引数: 中間断面がセンターラインに沿うか -> False
‘ 第3引数: ガイドカーブを使用するか -> False (今回はプロファイル間直接接続)
Set swLoftData = swFeatMgr.CreateDefinition(swFeatureLoft)
If swLoftData Is Nothing Then
MsgBox “LoftFeatureDataの初期化に失敗しました。”, vbCritical
Exit Sub
End If
‘ 3. 開始・終了条件およびドラフトの厳密な設定
‘ 【重要】ここが今回のキルスイッチ:SetStartAndEndDraftの適用
‘ 引数構成:
‘ StartCondition (swLoftEndCondition_e): 0=なし, 1=接線, 2=曲率, 3=ドラフト
‘ EndCondition (swLoftEndCondition_e): 同上
‘ StartDraftAngle: 開始面のドラフト角度 (ラジアンではなく「度数」で指定する点に注意)
‘ EndDraftAngle: 終了面のドラフト角度 (度数)
‘ StartDraftMag: 開始面のドラフト/接線マグニチュード (スケール値)
‘ EndDraftMag: 終了面のドラフト/接線マグニチュード (スケール値)
Dim startCond As Long
Dim endCond As Long
Dim startAngle As Double
Dim endAngle As Double
Dim startMag As Double
Dim endMag As Double
‘ 例:両端ともに「接線(Tangent)」拘束を与え、開始面は5度のドラフト、終了面は0度とする
startCond = 1 ‘ swLoftEndCondition_Tangent
endCond = 1 ‘ swLoftEndCondition_Tangent
startAngle = 5.0 ‘ 5度
endAngle = 0.0 ‘ 0度
startMag = 1.0 ‘ 接線ベクトル長(膨らみの強さ)
endMag = 1.0 ‘ 接線ベクトル長
‘ メソッド実行
swLoftData.SetStartAndEndDraft startCond, endCond, startAngle, endAngle, startMag, endMag
‘ 4. アライメント(ねじれ防止)の最適化
‘ 自動的に対応する頂点を結ぶことでねじれを極小化
swLoftData.MaintainTangency = True
swLoftData.Close = False
‘ 5. フィーチャの確定生成
Set swFeat = swFeatMgr.CreateFeature(swLoftData)
If swFeat Is Nothing Then
MsgBox “ロフトフィーチャの生成に失敗しました。スケッチのトポロジを確認してください。”, vbCritical
Exit Sub
End If
‘ ビューの強制更新
swDoc.GraphicsRedraw2
MsgBox “高品質ロフトボディの生成が完了しました。”, vbInformation, “成功”
End Sub
—
3. コードの急所:プロが解説する技術的ポイント
上記のコードベースにおいて、単なるリファレンスには書かれていない「現場の知見」をいくつか共有しよう。
① マグニチュード(Magnitude)の物理的意味
`SetStartAndEndDraft` の引数にある `StartDraftMag` や `EndDraftMag` は、単なる無次元数ではない。これは「接線ベクトルのスケーリングファクター」として機能する。
もしこの値を `0` に設定すると、接線拘束を指定していても実質的に「なし」と同等の鋭い形状になり、逆に過大な値(例: `10.0` 以上)を指定すると、曲面がオーバーシュートして自己交差エラー(Self-Intersection)を起こし、SolidWorksのカーネルがクラッシュする原因になる。
実務では、「0.5 から 2.0 の範囲」で外部データベースから動的に調整できるように設計するのが定石である。
② 角度の単位系(ラジアン vs 度数)
SolidWorks APIの多くのメソッドは内部的にラジアンを要求するが、この `SetStartAndEndDraft` のドラフト角度は「度数(Degrees)」で受け付ける仕様になっている。ここを誤って `Atn(1) 4 / 180` などのラジアン変換をかませると、意図せぬ超急勾配のドラフトがかかり、ジオメトリ計算エラーの元となる。APIリファレンスの型定義を鵜呑みにせず、こうした「メソッドごとの単位の揺れ」を見抜くことがエンジニアの腕の見せ所だ。
③ 複数プロファイル選択時のインデックス管理
実際の自動化ツールでは、2枚だけでなく、N枚の断面スケッチを順番にロフトさせることが多い。その場合、スケッチの選択順序(SelectionData)が狂うと、ロフトのパスが交差し、致命的なねじれを生む。
スケッチエンティティを `Extension.SelectByID2` で取得する際は、必ずフィーチャツリー上の並び順、あるいは事前にCSVから読み込んだ固有のフィーチャ名(例: `Sketch_Station_001`)を動的に生成してバインドする仕組みを構築せよ。
—
4. 外部データ(CSV / Excel)連携への拡張アプローチ
真の業務自動化エンジニアであれば、このコードをハードコーディングのまま放置しない。
例えば、以下のように外部の設計DB(CSVやExcel)から「ドラフト角度」や「接線マグニチュード」を動的に読み込ませるラッパー関数を前段に配置するべきだ。
‘ 設計パラメータ構造体
Public Type LoftParam
StartAngle As Double
EndAngle As Double
StartMag As Double
EndMag As Double
End Type
Public Function LoadParametersFromDB(ByVal csvPath As String) As LoftParam
‘ CSVからパラメータをパースして返す堅牢な実装をここに記述
‘ 例として固定値を返すスタブ
Dim param As LoftParam
param.StartAngle = 7.5
param.EndAngle = 2.5
param.StartMag = 1.2
param.EndMag = 1.0
LoadParametersFromDB = param
End Function
この構造を取り入れることで、人間がCAD画面を何時間も操作して微調整していた「流線型ボディの面質コントロール」を、わずかコンマ数秒のバッチ処理へと昇華させることが可能になる。
—
総括
SolidWorks VBAによる高度なモデリング自動化は、APIの「お作法」をどれだけ深く理解しているかでその成否が決まる。
今回解説した `LoftFeatureData.SetStartAndEndDraft` の完全制御は、単なるコードのテクニックにとどまらず、「CADに意図した通りの数学的制約を強制し、品質のばらつきをゼロにする」ための強力な武器だ。
あなたの開発現場にこのアーキテクチャを導入し、退屈な手作業の地獄から設計者たちを解放してほしい。
