【入門編】【中級者向け】断面図(Section View)の自動生成と切断線位置パラメータの動的制御 – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

マクロ記録の「壁」を越える。断面図(Section View)の動的生成をマスターする

こんにちは。設計自動化の世界へようこそ。

ここまでマクロの記録機能を使って、「ボタンを押せば決まった動作をする」ツールを作ってきたかもしれません。それは素晴らしい第一歩です。しかし、もしあなたが「アセンブリの形状に合わせて、切断線の位置を自動で変えたい」「ビューの向きによって断面の出し方を変えたい」と感じているなら、あなたはすでに「自動化エンジニア」への入り口に立っています。

マクロの記録は、いわば「あらかじめ決められたレール」の上を走る列車です。しかし、実務で求められるのは、状況に応じて進路を変える「自律走行車」です。

今日は、SolidWorks VBAにおける中級者への登竜門、`CreateSectionViewAt4` メソッドを用いた断面図の自動生成と、切断パラメータの動的制御について、その本質を解き明かしていきましょう。

1. なぜ「マクロ記録」では断面図が制御できないのか?

マクロの記録を実行して断面図を作成すると、コードには以下のような「生々しい数字」が並びます。

' マクロ記録の典型例(これは避けるべき!)
swModel.Extension.SelectByID2 "Section View1", "SECTIONVIEW", 0.1, 0.1, 0, False, 0, Nothing, 0

この `0.1, 0.1` という数値は、「記録した瞬間の、たまたまその場所にあった座標」に過ぎません。部品のサイズが変わったり、図面のシートサイズが変わったりした瞬間に、このコードは無価値なものになります。

プロフェッショナルな自動化では、座標を「固定値」として書くのではなく、「モデルの幾何学的な関係性」から計算して導き出す必要があります。

2. 核心:`CreateSectionViewAt4` メソッドの正体

断面図を生成する際、我々が手懐けるべきは `DrawingDoc.CreateSectionViewAt4` メソッドです。このメソッドの引数を理解することが、制御の鍵となります。

メソッドのシグネチャ(概念図)

Set SectionView = DrawingDoc.CreateSectionViewAt4( _
    BaseView, _
    X, Y, _
    Normal, _
    SectionViewType, _
    ...)

ここで最も重要なのが `Normal`(法線ベクトル) です。

多くの初学者は「どこを切るか」という「線」に注目しますが、APIが求めているのは「どの方向に刃を向けるか」という「面の向き(法線)」なのです。

  • 垂直に切りたいなら: 法線ベクトルは水平方向(例:`1, 0, 0`)
  • 水平に切りたいなら: 法線ベクトルは垂直方向(例:`0, 1, 0`)

この「ベクトル」の概念をマスターすれば、断面図の向きは自由自在です。

3. 実践:動的な断面図生成コード

それでは、実際に使えるレベルのコードを見てみましょう。
このサンプルでは、「指定したビューに対して、指定した座標に、特定の向きで断面図を作成する」というロジックを実装しています。

Option Explicit

''' <summary>
''' 指定したビューに対して動的に断面図を作成する
''' </summary>
Sub CreateDynamicSectionView()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swView As SldWorks.View
    Dim swSectionView As SldWorks.View
    Dim swMath As SldWorks.MathUtility
    Dim vNormal As Variant
    Dim swVector As SldWorks.MathVector
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 1. ドキュメントが図面であることを確認
    If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いてから実行してください。"
        Exit Sub
    End If
    
    Set swDraw = swModel
    Set swMath = swApp.GetMathUtility
    
    ' 2. ベースとなるビューを取得 (ここでは一番手前のビューを取得する例)
    ' 実務ではビュー名や座標で特定するロジックを組みます
    Set swView = swDraw.GetFirstView ' Sheet自体が最初のView
    Set swView = swView.GetNextView  ' 最初の図面ビューへ移動
    
    If swView Is Nothing Then
        MsgBox "ベースとなるビューが見つかりません。"
        Exit Sub
    End If

    ' --- パラメータの設定(ここを計算式に置き換えるのが中級者への道) ---
    Dim targetX As Double: targetX = 0.15 ' 断面図を配置するシート上のX座標(m)
    Dim targetY As Double: targetY = 0.15 ' 断面図を配置するシート上のY座標(m)
    
    ' 3. 切断方向(法線ベクトル)の定義
    ' 例: X軸に対して垂直な面で切る場合、法線は X軸方向(1, 0, 0)
    vNormal = Array(1, 0, 0) 
    Set swVector = swMath.CreateVector(vNormal)
    ' ------------------------------------------------------------------

    ' 4. 断面図の生成
    ' CreateSectionViewAt4(BaseView, X, Y, Normal, Type, ...)
    ' swSectionViewType_e の定数を使用 (例: swSectionViewType_e.swSectionViewTypeFull)
    Set swSectionView = swDraw.CreateSectionViewAt4( _
        swView, _
        targetX, _
        targetY, _
        swVector, _
        swSectionViewType_e.swSectionViewTypeFull, _
        0, 0, 0) ' 残りの引数はデフォルト

    If Not swSectionView Is Nothing Then
        Debug.Print "断面図の作成に成功しました: " & swSectionView.Name
        ' 再構築して表示を更新
        swModel.ForceRebuild3 True
    Else
        MsgBox "断面図の作成に失敗しました。パラメータを確認してください。"
    End If
End Sub

4. 陥りやすい「落とし穴」と回避術

このコードを動かす際、あるいは自分で拡張する際に、必ず直面する壁が3つあります。

① 単位系の罠(メートル vs ミリ)

SolidWorks APIの内部的な数値は、すべて SI単位系(メートル) です。
「100mmの位置に切りたい」と思って `100` と入力すると、100メートルという宇宙規模の座標を指定することになり、断面図は画面外へ消え去ります。
「常に `mm / 1000` を意識する」。これは鉄則です。

② 座標系の混乱(Sheet vs Model)

`CreateSectionViewAt4` で指定する `X, Y` は、「図面シート上の座標」です。
一方、切断の向きを決める `Normal` ベクトルは、「モデル(パーツ/アセンブリ)の座標系」に基づいています。
「シートのどこに置くか」と「モデルのどこを切るか」は、全く別の思考プロセスであることを忘れないでください。

③ オブジェクトのライフサイクル

断面図を作成した直後、そのビューを操作したい場合は、戻り値として受け取った `swSectionView` オブジェクトを必ず保持してください。作成した直後に `swDraw.GetFirstView` などで再取得しようとすると、意図しないビュー(シート自身やベースビュー)を掴んでしまうミスが多発します。

5. 次のステップへ:エンジニアとしての視点

ここまで読んでくれたあなたなら、もう気づいているはずです。
このコードの `targetX`, `targetY`, `vNormal` の部分に、「モデルの境界ボックス(BoundingBox)から計算した値」や「特定の平面の法線」を代入すれば、人間が一切介在しない「完全自動断面図生成マクロ」が完成することを。

マクロの記録から脱却するとは、単にコードを書くことではありません。「幾何学的な関係を、数値のロジックに翻訳すること」なのです。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
さあ、次はもっと複雑な、アセンブリの干渉を避けるための動的断面図作成に挑戦してみましょう。

応援しています。

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