SolidWorks VBAで魅せる!スイープ&ロフト:インペラ・羽根形状を数秒で自動生成する魔法
皆さん、こんにちは! SolidWorks VBAの世界へようこそ。伝説の業務自動化エンジニアとして、今回は皆さんの「マクロの記録」からの卒業、そして「プロフェッショナルな自動生成ツール開発」への扉を開くお手伝いをしたいと思っています。
特に、ファンの羽根やプロペラのような、複雑で美しい三次元曲面を持つパーツを自動で作りたい!という熱い思いをお持ちの皆さん。そんな夢を叶えるための強力な武器が、SolidWorks VBAにおける スイープ(Sweep) と ロフト(Loft) です。
「でも、VBAって難しそう…」「コードなんて、どこから手をつけていいか分からない…」
そんな心配はご無用です! このブログ記事では、まるで隣で優しく指導してくれる先輩エンジニアのように、基礎から本質までを丁寧に、そして図解的なイメージも交えながら解説していきます。ここをクリアすれば、SolidWorks VBAの基本、そして高度な形状生成の第一歩はバッチリですよ!
なぜスイープとロフトがインペラ・羽根形状生成に最適なのか?
まず、なぜこの二つのフィーチャーがインペラや羽根の形状生成に最適なのか、その理由から紐解いていきましょう。
- スイープ(Sweep):
- イメージ: 「一本のレール(パス)に沿って、決まった形の断面を押し出す」
- 得意な形状: 均一な断面を持ちながら、パスに沿って伸びていく形状。例えば、パイプや、一定の断面を持つ羽根の根元部分などに使えます。
- APIでの操作: `CreateSweptFlange` メソッドなどが該当します。パスとなるスケッチと、断面となるスケッチを指定します。
- ロフト(Loft):
- イメージ: 「複数の断面形状(プロファイル)を、滑らかな曲線で繋ぎ合わせて立体にする」
- 得意な形状: 断面形状が変化していく、ねじれたり、絞られたりする複雑な形状。インペラの羽根の先端に向かって細くなったり、ひねりが加わったりする形状の生成にまさにうってつけです。
- APIでの操作: `CreateLoftFeature` メソッドなどが該当します。複数の断面スケッチを指定し、それらを繋ぐガイドカーブ(オプション)を設定することで、より自由な形状を作り出せます。
マクロの記録だけでは見えない「裏側」の世界
マクロの記録機能は、SolidWorksの操作をVBAコードに変換してくれる便利なツールです。しかし、記録されたコードは、あくまで「操作の履歴」であり、「なぜそのコードが書かれたのか」「もっと効率的に、もっと柔軟に記述するにはどうすれば良いのか」 という本質的な部分は教えてくれません。
特に、スイープやロフトでは、パスや断面のスケッチを動的に生成・操作する必要があります。数値を変更するだけで、インペラの羽根の枚数や角度、形状が自動で変わるような、そんな「賢い」ツールを作るためには、APIの深い理解が不可欠なのです。
プロフェッショナルへの第一歩:APIの基本とオブジェクトのライフサイクル
SolidWorks VBAを使いこなす上で、API(Application Programming Interface)の理解は避けて通れません。APIは、SolidWorksというアプリケーションを、VBAプログラムから操作するための「窓口」のようなものです。
登場人物たち:SolidWorks APIの主要オブジェクト
APIを操作する際に、よく登場する「登場人物」たちがいます。彼らを理解することが、コードを読み解く鍵となります。
- `SldWorks` オブジェクト: SolidWorksアプリケーションそのものを表します。すべての操作は、このオブジェクトから始まると言っても過言ではありません。
- 例: `Set swApp = Application.SldWorks`
- `ModelDoc2` オブジェクト: 開いているSolidWorksのドキュメント(パーツ、アセンブリ、図面)を表します。
- 例: `Set swModel = swApp.ActiveDoc`
- `SketchManager` オブジェクト: スケッチの作成や編集を管理します。
- 例: `Set swSketchMgr = swModel.SketchManager`
- `FeatureManager` オブジェクト: フィーチャー(押し出し、回転、スイープ、ロフトなど)の作成や操作を管理します。
- 例: `Set swFeatureMgr = swModel.FeatureManager`
- `MathUtil` オブジェクト: 数学的な計算(ベクトル、点、角度など)を行うためのユーティリティ。
- 例: `Set swMathUtil = swApp.GetMathUtility`
オブジェクトのライフサイクル:生成、利用、解放
これらのオブジェクトは、プログラムの中で生成され、利用され、そしてプログラムの終了時や不要になった時に「解放」されます。この「ライフサイクル」を意識することが、メモリリークなどのパフォーマンス低下を防ぐ上で非常に重要です。
一般的に、APIオブジェクトは、`Set` ステートメントで代入することで生成・参照されます。不要になったら `Set オブジェクト名 = Nothing` とすることで、明示的に解放できます。
‘ オブジェクトの生成
Dim swApp As SldWorks
Set swApp = Application.SldWorks
‘ オブジェクトの利用
Dim swModel As ModelDoc2
Set swModel = swApp.ActiveDoc
‘ … ここで様々な処理を行う …
‘ オブジェクトの解放
Set swModel = Nothing
Set swApp = Nothing
特に、ループ処理の中で大量のオブジェクトを生成・解放する際には、この解放処理を怠ると、SolidWorksが重くなったり、予期せぬエラーが発生したりする原因になります。
実践!インペラ・羽根形状の自動生成ロジック
さあ、いよいよ本題です。ここでは、インペラや羽根の形状を動的に生成するための、基本的なロジックとVBAコード例を見ていきましょう。
パターン1:スイープフィーチャーでシンプルな羽根を生成する
まずは、比較的シンプルな羽根の形状を、スイープフィーチャーで生成する例です。
考え方:
1. 羽根の「パス」となる線(スケッチ)を、円周上に配置します。
2. 羽根の「断面」となる形状(スケッチ)を、パスの開始点に作成します。
3. これらのスケッチを使って、スイープフィーチャーを作成します。
4. 羽根の枚数を増やしたい場合は、パススケッチを複数配置したり、パターンフィーチャーを使ったりします。
VBAコード例:
Sub CreateSimpleImpellerBlade()
Dim swApp As SldWorks
Dim swModel As ModelDoc2
Dim swSketchMgr As SketchManager
Dim swFeatureMgr As FeatureManager
Dim swMathUtil As MathUtil
Dim swSelMgr As SelectionMgr
‘ SolidWorksアプリケーションとアクティブドキュメントを取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation
Exit Sub
End If
‘ パーツドキュメントであることを確認
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行できます。”, vbExclamation
Exit Sub
End If
‘ 各マネージャーオブジェクトを取得
Set swSketchMgr = swModel.SketchManager
Set swFeatureMgr = swModel.FeatureManager
Set swMathUtil = swApp.GetMathUtility
Set swSelMgr = swModel.SelectionManager
‘ — パラメータ設定 —
Const PI As Double = 3.14159265358979
Dim impellerRadius As Double ‘ インペラの半径
Dim bladeHeight As Double ‘ 羽根の高さ(厚み)
Dim bladeLength As Double ‘ 羽根の長さ(パスの長さ)
Dim numBlades As Integer ‘ 羽根の枚数
Dim bladeAngleOffset As Double ‘ 羽根の開始角度(ラジアン)
Dim bladeTwistAngle As Double ‘ 羽根のねじれ角度(ラジアン)
impellerRadius = 50 ‘ mm
bladeHeight = 5 ‘ mm
bladeLength = 40 ‘ mm
numBlades = 4
bladeAngleOffset = 0 ‘ 最初の羽根は0度から
bladeTwistAngle = PI / 4 ‘ 45度ねじる
‘ — 1. パススケッチの作成 —
‘ トップ面を選択してスケッチを開始
swModel.Extension.SelectByIDV2 “トップ面”, “FACE”, 0, 0, 0, False, 0, Nothing, swSelectOption_Extend
swSketchMgr.InsertSketch True ‘ アクティブスケッチにする
‘ パスとなる円弧を作成
Dim center As Variant: center = Array(0, 0, 0)
Dim startPoint As Variant: startPoint = Array(impellerRadius, 0, 0)
Dim endPoint As Variant
Dim angle As Double: angle = bladeLength / impellerRadius ‘ 円弧の角度 (ラジアン)
‘ 羽根のねじれを考慮した終点座標を計算
Dim endX As Double, endY As Double
endX = impellerRadius Cos(angle)
endY = impellerRadius Sin(angle)
endPoint = Array(endX, endY, 0)
Dim arc As Object ‘ IEntity
Set arc = swSketchMgr.CreateArcByThreePoints(startPoint(0), startPoint(1), startPoint(2), _
center(0), center(1), center(2), _
endPoint(0), endPoint(1), endPoint(2), False)
‘ スケッチを終了
swSketchMgr.InsertSketch True
swModel.ClearSelection2 True
‘ — 2. 断面スケッチの作成 —
‘ パススケッチの開始点(原点)を基準にスケッチを開始
‘ (実際には、パススケッチに垂直な平面に作成するのが一般的ですが、ここでは簡略化)
‘ ここで、パススケッチの始点に垂直な平面(例:XY平面)を選択し、スケッチを作成します。
‘ 実際には、パススケッチに紐づいた基準平面を作成して、そこにスケッチするのがより堅牢です。
‘ 今回は、一時的にXY平面に断面を作成し、後でスイープでパスに沿わせます。
‘ XY平面を選択してスケッチを開始
swModel.Extension.SelectByIDV2 “XY平面”, “PLANE”, 0, 0, 0, False, 0, Nothing, swSelectOption_Extend
swSketchMgr.InsertSketch True
‘ 断面形状(例:長方形)を作成
Dim startX As Double: startX = 0
Dim startY As Double: startY = 0
Dim endX_rect As Double: endX_rect = bladeHeight
Dim endY_rect As Double: endY_rect = 0
‘ 断面形状をパスの開始点(原点)からオフセットさせる場合
‘ (ここでは、原点を中心とした長方形を作成します)
Dim halfHeight As Double: halfHeight = bladeHeight / 2
Dim rectPoints(1 To 4) As Variant
rectPoints(1) = Array(-halfHeight, -halfHeight, 0) ‘ 左下
rectPoints(2) = Array(halfHeight, -halfHeight, 0) ‘ 右下
rectPoints(3) = Array(halfHeight, halfHeight, 0) ‘ 右上
rectPoints(4) = Array(-halfHeight, halfHeight, 0) ‘ 左上
Dim rectEnt(1 To 4) As Object
Set rectEnt(1) = swSketchMgr.CreateLine2(rectPoints(1)(0), rectPoints(1)(1), rectPoints(1)(2), rectPoints(2)(0), rectPoints(2)(1), rectPoints(2)(2))
Set rectEnt(2) = swSketchMgr.CreateLine2(rectPoints(2)(0), rectPoints(2)(1), rectPoints(2)(2), rectPoints(3)(0), rectPoints(3)(1), rectPoints(3)(2))
Set rectEnt(3) = swSketchMgr.CreateLine2(rectPoints(3)(0), rectPoints(3)(1), rectPoints(3)(2), rectPoints(4)(0), rectPoints(4)(1), rectPoints(4)(2))
Set rectEnt(4) = swSketchMgr.CreateLine2(rectPoints(4)(0), rectPoints(4)(1), rectPoints(4)(2), rectPoints(1)(0), rectPoints(1)(1), rectPoints(1)(2))
‘ 断面スケッチを閉じる
swSketchMgr.InsertSketch True
swModel.ClearSelection2 True
‘ — 3. スイープフィーチャーの作成 —
‘ パススケッチと断面スケッチを選択
‘ 選択順序が重要です!通常、パススケッチを先に選択し、次に断面スケッチを選択します。
swModel.Extension.SelectByIDV2 “Arc1”, “SKETCHSEGMENT”, arc.IGetEndPoint(0)(0), arc.IGetEndPoint(0)(1), arc.IGetEndPoint(0)(2), True, 0, Nothing, swSelectOption_Extend
swModel.Extension.SelectByIDV2 “Sketch1”, “SKETCH”, 0, 0, 0, True, 0, Nothing, swSelectOption_Extend ‘ 断面スケッチ(ここではSketch1と仮定)
‘ スイープフィーチャーを作成
‘ CreateSweptFlange2 の引数
‘ Type: 0=Solid, 1=Surface, 2=Thin
‘ ProfileScale: プロファイルのスケーリング
‘ TwistAngle: ねじれ角度 (ラジアン)
‘ PathTwist: パスに沿ってプロファイルをねじるか (True/False)
‘ GuideCurve: ガイドカーブを使用するか (True/False)
‘ Alignment: プロファイルのアライメント (0=Start, 1=End, 2=Center)
‘ TrimToCorner: コーナーでトリムするか (True/False)
‘ Merge: 隣接フィーチャーとマージするか (True/False)
Dim feat As Feature
Set feat = swFeatureMgr.CreateSweptFlange2(1, 1, bladeTwistAngle, True, False, 0, False, True)
If feat Is Nothing Then
MsgBox “スイープフィーチャーの作成に失敗しました。”, vbCritical
Else
‘ スイープフィーチャーに名前を付ける(任意)
feat.Name = “BladeSweep”
End If
swModel.ClearSelection2 True
‘ — 4. 羽根のパターン作成(オプション) —
‘ 円形パターンで残りの羽根を作成
‘ まず、作成したスイープフィーチャーを選択
Dim featSwept As Feature
Set featSwept = swModel.FeatureByPositionReverse(1) ‘ 直前に作成されたフィーチャー
featSwept.Select True
‘ パターンフィーチャーの基準となる円(例:原点を通るXY平面の円)を選択
‘ ここでは、円形パターンを作成するために、原点を通る円(例:モデルの基準円)を選択します。
‘ 実際には、インペラの中心円などを基準にします。
‘ 例として、XY平面を選択して、そこから円形フィーチャーを作成します。
swModel.Extension.SelectByIDV2 “XY平面”, “PLANE”, 0, 0, 0, False, 0, Nothing, swSelectOption_Extend
‘ 円形パターンを作成
‘ CreateCircularPattern5 の引数
‘ Feature: パターン対象のフィーチャー
‘ NumPats: パターンの数
‘ Angle: パターンの角度 (ラジアン)
‘ AxisType: 軸の種類 (0=Features, 1=Faces/Edges, 2=Axes)
‘ Axis: パターン軸 (Vector)
‘ Center: パターンの中心座標 (Variant)
‘ Direction: パターンの方向 (Variant)
Dim axis As Variant: axis = Array(0, 0, 1) ‘ Z軸を中心に回転
Dim patternCenter As Variant: patternCenter = Array(0, 0, 0) ‘ 原点を中心に
Dim featPattern As Feature
Set featPattern = swFeatureMgr.CreateCircularPattern5(feat, numBlades, 2 PI, 0, axis, patternCenter, Array(1, 0, 0)) ‘ 最後の引数は方向ベクトル
If featPattern Is Nothing Then
MsgBox “円形パターンフィーチャーの作成に失敗しました。”, vbCritical
Else
featPattern.Name = “BladePattern”
End If
swModel.ClearSelection2 True
‘ — 後処理 —
‘ マネージャーオブジェクトを解放
Set swSketchMgr = Nothing
Set swFeatureMgr = Nothing
Set swMathUtil = Nothing
Set swSelMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox “インペラ羽根の自動生成が完了しました。”, vbInformation
End Sub
コードのポイントと注意点:
- `CreateSweptFlange2`: このメソッドは、スイープフィーチャーを作成します。`TwistAngle` や `PathTwist` を使うことで、羽根にねじりを加えることができます。
- スケッチの選択順序: `CreateSweptFlange2` を呼び出す前に、パスとなるスケッチを先に選択し、次に断面スケッチを選択する必要があります。この順序を間違えるとエラーになります。
- 断面スケッチの作成場所: 上記コードでは簡略化のため、XY平面に断面を作成し、それをパスに沿わせています。より正確に、パススケッチの始点に垂直な平面を作成し、そこに断面スケッチを作成するのが一般的です。そのためには、`AddReferencePlane` メソッドなどで基準平面を作成し、その平面上にスケッチを作成する必要があります。
- `CreateCircularPattern5`: 作成した羽根を円形に配置するためのメソッドです。パターン軸や中心点を正しく指定することが重要です。
- エラーハンドリング: `If feat Is Nothing Then …` のように、フィーチャー作成が成功したかどうかのチェックは重要です。
- パラメータ化: `impellerRadius` や `numBlades` などの定数を、ユーザー入力や外部ファイルから取得できるようにすることで、より柔軟なツールになります。
パターン2:ロフトフィーチャーで複雑な羽根形状を生成する
次に、ロフトフィーチャーを使って、断面が変化するような、より複雑な羽根形状を生成する例を見てみましょう。
考え方:
1. 羽根の根元、中間、先端など、複数の位置に断面形状(プロファイル)となるスケッチを作成します。
2. これらの断面スケッチと、必要であればガイドカーブを指定して、ロフトフィーチャーを作成します。
3. 断面形状やガイドカーブの定義を数学的に計算することで、滑らかな曲面を持つ羽根を生成します。
VBAコード例:
Sub CreateComplexImpellerBladeWithLoft()
Dim swApp As SldWorks
Dim swModel As ModelDoc2
Dim swSketchMgr As SketchManager
Dim swFeatureMgr As FeatureManager
Dim swMathUtil As MathUtil
Dim swSelMgr As SelectionMgr
‘ SolidWorksアプリケーションとアクティブドキュメントを取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation
Exit Sub
End If
‘ パーツドキュメントであることを確認
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行できます。”, vbExclamation
Exit Sub
End If
‘ 各マネージャーオブジェクトを取得
Set swSketchMgr = swModel.SketchManager
Set swFeatureMgr = swModel.FeatureManager
Set swMathUtil = swApp.GetMathUtility
Set swSelMgr = swModel.SelectionManager
‘ — パラメータ設定 —
Const PI As Double = 3.14159265358979
Dim impellerRadius As Double ‘ インペラの半径
Dim bladeRootRadius As Double ‘ 羽根の根元半径
Dim bladeTipRadius As Double ‘ 羽根の先端半径
Dim bladeRootWidth As Double ‘ 羽根の根元幅
Dim bladeTipWidth As Double ‘ 羽根の先端幅
Dim numBlades As Integer ‘ 羽根の枚数
Dim bladeTwistAngleRoot As Double ‘ 根元でのねじれ角度 (ラジアン)
Dim bladeTwistAngleTip As Double ‘ 先端でのねじれ角度 (ラジアン)
Dim numSections As Integer ‘ ロフト断面の数
impellerRadius = 50 ‘ mm
bladeRootRadius = 10 ‘ mm
bladeTipRadius = 45 ‘ mm
bladeRootWidth = 8 ‘ mm
bladeTipWidth = 4 ‘ mm
numBlades = 3
bladeTwistAngleRoot = PI / 6 ‘ 30度
bladeTwistAngleTip = PI / 3 ‘ 60度
numSections = 3 ‘ 根元、中間、先端の3つの断面を作成
‘ — 基準平面の作成(必要に応じて) —
‘ 羽根を作成するための基準平面をいくつか作成します。
‘ ここでは、Z軸を中心に等間隔で回転した平面を作成します。
Dim planes() As Object ‘ Plane オブジェクトの配列
ReDim planes(1 To numSections)
Dim angleStep As Double
angleStep = (bladeTipRadius – bladeRootRadius) / (numSections – 1) ‘ 半径方向のステップ
Dim twistStep As Double
twistStep = (bladeTwistAngleTip – bladeTwistAngleRoot) / (numSections – 1) ‘ ねじれ角度のステップ
Dim i As Integer
For i = 1 To numSections
Dim currentRadius As Double: currentRadius = bladeRootRadius + (i – 1) angleStep
‘ Z軸を中心に回転した平面を作成 (実際には、羽根のパスに沿った平面を作成するのが理想)
‘ ここでは、原点を通る、Z軸周りの回転平面を作成します。
Dim rotationAngle As Double: rotationAngle = (i – 1) (2 PI / (numBlades 2)) ‘ 適当な回転角度
Dim planeName As String: planeName = “BladePlane_” & i
‘ 基準平面を直接作成するAPIは複雑なので、ここでは一旦、XY平面にスケッチを作成する前提で進めます。
‘ より高度なアプローチとしては、AddReferencePlaneメソッドでパスに垂直な平面を作成します。
‘ 例:swModel.Extension.AddReferencePlane ByRef Plane As Object, Origin As Variant, Normal As Variant, RelativeTo As Variant
‘ TODO: ここで、羽根のパスに沿った基準平面を作成する処理を実装するのが理想です。
‘ 今回は、簡略化のため、各断面をXY平面上に作成し、後でロフトで繋ぎます。
‘ 実際には、羽根のパス(例:半径方向の線)に沿って、そのパスに垂直な平面を作成し、そこに断面スケッチを作成します。
‘ 例として、XY平面にスケッチを作成し、後でロフトで繋ぐ場合
Dim sketchName As String: sketchName = “BladeSection_” & i
Set swSketch = swModel.SketchManager.InsertSketch(True) ‘ 新しいスケッチを作成
‘ スケッチをアクティブにする
swModel.SketchManager.ActiveSketch.Name = sketchName
‘ 断面形状(例:楕円、またはカスタム形状)を作成
Dim currentWidth As Double: currentWidth = bladeRootWidth + (i – 1) (bladeTipWidth – bladeRootWidth) / (numSections – 1)
Dim currentTwist As Double: currentTwist = bladeTwistAngleRoot + (i – 1) twistStep
‘ 断面形状の計算(例:中心が原点、幅 currentWidth の線分)
‘ 実際には、羽根の厚みや形状を考慮したより複雑な形状を作成します。
Dim halfWidth As Double: halfWidth = currentWidth / 2
Dim startPt As Variant: startPt = Array(0, -halfWidth, 0)
Dim endPt As Variant: endPt = Array(0, halfWidth, 0)
‘ ねじりを考慮した断面形状を定義
‘ ここで、currentTwist を使って断面形状を回転させます。
‘ 例:単なる線分ではなく、より複雑な形状(例:楕円、テーパー形状)を作成する。
‘ 今回は、簡略化のため、単なる線分を作成し、ロフトで形状を生成します。
‘ 実際には、この部分の数学的定義が、羽根の形状の肝となります。
Dim seg1 As Object
seg1 = swSketchMgr.CreateLine2(startPt(0), startPt(1), startPt(2), endPt(0), endPt(1), endPt(2))
‘ スケッチを閉じる
swSketchMgr.InsertSketch True
swModel.ClearSelection2 True
‘ スケッチを一時的に保持
‘ (後でロフトフィーチャー作成時に選択するために必要)
‘ ここでは、スケッチ名で検索して選択します。
Next i
‘ — 2. ロフトフィーチャーの作成 —
‘ 作成した各断面スケッチを選択
Dim profileArray() As Object
ReDim profileArray(1 To numSections)
For i = 1 To numSections
Dim sketchName As String: sketchName = “BladeSection_” & i
Dim swSketch As Sketch
Set swSketch = swModel.SketchManager.ActiveSketch ‘ 現在アクティブなスケッチを取得
‘ スケッチ名で検索して選択します。
‘ 実際には、swModel.GetSketchByName(sketchName) などで取得するのがより確実です。
‘ ここでは、簡略化のため、アクティブスケッチを順番に選択していくという想定です。
‘ 確実な方法:
Dim swEnt As SldWorks.Entity
Dim swSketchObj As Object
Set swSketchObj = swModel.Extension.GetSketchByName(sketchName)
If Not swSketchObj Is Nothing Then
swSketchObj.Select True
Set profileArray(i) = swSketchObj
Else
MsgBox “スケッチ ‘” & sketchName & “‘ が見つかりません。”, vbCritical
Exit Sub
End If
swModel.ClearSelection2 True
Next i
‘ プロファイル配列を SolidWorks API が要求する形式に変換
Dim profiles As Variant
ReDim profiles(0 To numSections – 1)
For i = 0 To numSections – 1
profiles(i) = profileArray(i + 1)
Next i
‘ ガイドカーブの作成(オプション)
‘ 羽根の形状をより制御するために、ガイドカーブを作成することもできます。
‘ 例:羽根の端から端までを結ぶ、滑らかな3Dカーブを作成します。
‘ この例では、ガイドカーブは作成しません。
‘ ロフトフィーチャーを作成
‘ CreateLoftFeature2 の引数
‘ Profiles: プロファイルスケッチの配列
‘ GuideCurves: ガイドカーブスケッチの配列 (Variant, Optional)
‘ Type: 0=Solid, 1=Surface
‘ NormalToProfile: プロファイルに垂直に作成するか (True/False)
‘ NormalToEnd: 終端に垂直に作成するか (True/False)
‘ MinimizeTwist: ねじれを最小化するか (True/False)
‘ Optimization: 最適化設定 (0=None, 1=Curvature, 2=SurfaceArea)
‘ Merge: 隣接フィーチャーとマージするか (True/False)
Dim loftFeature As Feature
‘ Profiles引数には、スケッチオブジェクトの配列を渡します。
‘ APIドキュメントを確認すると、ProfilesはVariant型で、Sketchジオメトリの配列を期待します。
‘ ここでの profileArray は Variant 型の配列ではなく、Object 型の配列です。
‘ したがって、Variant型に変換する必要があります。
Dim vProfiles As Variant
ReDim vProfiles(0 To numSections – 1)
For i = 0 To numSections – 1
vProfiles(i) = profileArray(i + 1)
Next i
Set loftFeature = swFeatureMgr.CreateLoftFeature2(vProfiles, Empty, 0, True, False, True, 0, True) ‘ Solid body, Normal to profile, Minimize twist
If loftFeature Is Nothing Then
MsgBox “ロフトフィーチャーの作成に失敗しました。”, vbCritical
Else
loftFeature.Name = “ImpellerBladeLoft”
End If
swModel.ClearSelection2 True
‘ — 3. 羽根のパターン作成(オプション) —
‘ 作成したロフトフィーチャーを円形パターンで複製します。
Dim featLoft As Feature
Set featLoft = swModel.FeatureByPositionReverse(1) ‘ 直前に作成されたフィーチャー
featLoft.Select True
‘ パターン軸としてZ軸を選択
swModel.Extension.SelectByIDV2 “Z軸”, “AXIS”, 0, 0, 0, False, 0, Nothing, swSelectOption_Extend
‘ 円形パターンを作成
Dim featPattern As Feature
Set featPattern = swFeatureMgr.CreateCircularPattern2(featLoft, numBlades, 2 PI, 1) ‘ 1はFaces/Edges軸タイプ
If featPattern Is Nothing Then
MsgBox “円形パターンフィーチャーの作成に失敗しました。”, vbCritical
Else
featPattern.Name = “BladePatternLoft”
End If
swModel.ClearSelection2 True
‘ — 後処理 —
Set swSketchMgr = Nothing
Set swFeatureMgr = Nothing
Set swMathUtil = Nothing
Set swSelMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox “複雑なインペラ羽根の自動生成(ロフト)が完了しました。”, vbInformation
End Sub
コードのポイントと注意点:
- `CreateLoftFeature2`: このメソッドは、複数のプロファイルスケッチを繋いでロフトフィーチャーを作成します。
- プロファイルスケッチの作成: `numSections` で定義した数だけ、羽根の断面となるスケッチを、それぞれ適切な位置(通常は羽根のパスに垂直な平面上)に作成します。
- 断面形状の定義: この部分が、羽根の形状を決定する最も重要な部分です。単なる線分だけでなく、楕円、テーパー形状、あるいはより複雑な曲線を定義することで、多様な羽根形状を作り出せます。数学的な計算(三角関数、補間など)が駆使されます。
- ガイドカーブ(オプション): `CreateLoftFeature2` の `GuideCurves` 引数にスケッチを指定することで、プロファイル間の繋がり方をより細かく制御できます。これにより、ねじれや曲がりを滑らかに表現できます。
- `swModel.Extension.AddReferencePlane`: より高度なツール開発では、羽根のパスに沿った基準平面を動的に作成し、その平面上に断面スケッチを作成することが推奨されます。これにより、羽根の形状がパスに対して常に垂直に保たれます。
- `vProfiles` の型: `CreateLoftFeature2` の `Profiles` 引数には、`Variant` 型の配列でスケッチオブジェクトを渡す必要があります。コード例では、`Object` 型の配列から `Variant` 型の配列へ変換しています。
陥りやすいエラーとその回避策
SolidWorks VBAでの開発では、いくつかの定番のエラーに遭遇することがあります。事前に知っておくことで、開発効率が格段に向上します。
1. 「オブジェクト参照が設定されていません」エラー (Error 91):
- 原因: `Nothing` なオブジェクトに対して、プロパティやメソッドを呼び出そうとした場合に発生します。例えば、ドキュメントが開いていないのに `swModel` を使おうとしたり、フィーチャー作成に失敗して `feat` が `Nothing` なのに `feat.Name = …` とした場合などです。
- 回避策:
- コードの冒頭で、必要なオブジェクト(`swApp`, `swModel` など)が正しく取得できているか確認する(`If swModel Is Nothing Then …`)。
- フィーチャー作成メソッドの戻り値が `Nothing` でないかチェックする(`If feat Is Nothing Then …`)。
- `On Error Resume Next` や `On Error GoTo Handler` を使って、エラー発生時の処理を記述する(ただし、乱用は避ける)。
2. 選択順序の間違い:
- 原因: スイープやロフトなど、複数の要素を選択してフィーチャーを作成する際に、APIが期待する選択順序と異なっている場合に発生します。
- 回避策:
- APIドキュメントで、該当メソッドの引数や選択順序に関する情報を確認する。
- マクロの記録機能で、正しい操作手順をVBAコードに変換させ、そのコードを参考にする。
- `swModel.ClearSelection2 True` で、不要な選択をクリアしてから、改めて正しい順序で選択し直す。
3. 座標系のずれや単位の不一致:
- 原因: SolidWorksの内部単位(メートル法)と、ユーザーが入力する単位(ミリメートルなど)の混同、あるいは座標系の定義ミス。
- 回避策:
- コード内で使用する単位を統一する(例:すべてメートル法で扱う、あるいは入力時に変換する)。
- 原点や軸の定義を明確にし、デバッグ時には `Debug.Print` などで座標値を確認する。
4. スケッチの閉じ忘れ・未完了:
- 原因: スケッチ作成中に `swSketchMgr.InsertSketch True` を実行せずに次の処理に進んだり、スケッチが完全に閉じられていない(閉じたループになっていない)場合に発生します。
- 回避策:
- スケッチ作成の最後には必ず `swSketchMgr.InsertSketch True` を実行する。
- スケッチが完了したら、`swModel.ClearSelection2 True` で選択を解除することを忘れない。
5. フィーチャーの依存関係の問題:
- 原因: 既存のフィーチャーに依存するフィーチャーを作成しようとした際に、依存元のフィーチャーが存在しない、あるいは変更された場合に発生します。
- 回避策:
- フィーチャーの作成順序を考慮する。
- 必要であれば、`swModel.ForceRebuild()` でモデル全体を再構築してから次の処理に進む。
まとめ:あなたも「自動生成の魔術師」に!
いかがでしたでしょうか? 今回は、SolidWorks VBAを使って、インペラや羽根のような高度な形状を自動生成するロジックの基本を、スイープとロフトを中心に解説しました。
- スイープ: パスに沿って均一な断面を押し出す。
- ロフト: 複数の断面を繋いで滑らかな形状を作成する。
- APIの理解: オブジェクトのライフサイクルを意識したコード記述が重要。
- 動的な形状定義: 数学的計算に基づいたパラメータ設定が、自動生成ツールの肝。
マクロの記録から一歩踏み出し、APIを理解し、自分の手でコードを記述することで、SolidWorksの可能性は無限に広がります。今回ご紹介したコードはあくまで基本的な例ですが、これをベースに、さらに複雑な数学的計算や、ユーザーインターフェース(ユーザーフォーム)を組み合わせることで、まさに「数秒で」複雑なパーツを自動生成する、プロフェッショナルなツールが完成します。
ぜひ、この記事を参考に、皆さんもSolidWorks VBAの世界で「自動生成の魔術師」への第一歩を踏み出してください。応援しています!
もし、「もっとこの部分が知りたい!」「こんな形状はどうやって作るの?」といった疑問があれば、ぜひコメントで教えてくださいね。皆さんの声が、次の記事のヒントになります!
