【入門編】【中級者向け】図面内の特定ビューにおける「部分断面図(Broken-out Section)」の切断深さ自動調整VBA – SolidWorks VBA解析バイブル

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

マクロの記録を卒業せよ。部分断面図の「深さ」をコードで支配する極限のテクニック

こんにちは。設計現場で日々、設計自動化の荒波に揉まれているエンジニアの皆さん。
「マクロの記録」機能を使って、一歩ずつ階段を登ってきた皆さんの努力は素晴らしいものです。しかし、ある時ふと気づくはずです。

「記録したコードをそのまま動かしても、複雑な図面では全く通用しない……」

そう感じた時こそが、あなたが「単なる記録者」から「真のオートメーション・エンジニア」へと進化する分岐点です。

今日扱うテーマは、図面作成における「鬼門」の一つ、部分断面図(Broken-out Section)の切断深さの自動制御です。
「なぜ、記録したマクロでは断面の深さが変わらないのか?」その理由と、オブジェクトの深淵に触れる解決策を伝授しましょう。

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

まず、技術的な本質から話を始めましょう。
「マクロの記録」が生成するコードは、基本的に「ユーザーが画面上のどこをクリックしたか」という座標や選択操作の羅列に過ぎません。

部分断面図の深さを変えるという操作は、UI上では数値入力やドラッグ操作に見えますが、SolidWorks APIの内部では「Viewオブジェクトのプロパティ」、あるいは「断面図を定義するジオメトリのパラメータ」の書き換えとして処理されます。

記録されたコードには「どのビューの、どのパラメータを、どの数値に変更するのか」という論理的な繋がり(オブジェクトのライフサイクル)が欠落しているのです。

これを乗り越えるには、図面という階層構造を理解する必要があります。

図面オブジェクトの階層構造(イメージ)

1. SldWorks (Application): すべての神。
2. DrawingDoc (Document): 図面ファイルそのもの。
3. Sheet (Sheet): 図面の中の「紙」。
4. View (View): 紙の上に置かれた「投影図」や「断面図」。← ここを狙い撃ちする!

2. 実装の核心:部分断面図を「View」として捉える

部分断面図は、APIの視点では「既存のビューの上に重なっている、特殊な属性を持ったView」です。
特定の深さを指定するには、そのビューを特定し、その属性(プロパティ)にアクセスしなければなりません。

以下に、実戦で使える「特定の名前を持つビューを探し出し、そのプロパティを操作する」ための雛形コードを示します。

【実践コード】部分断面図の制御ロジック

Option Explicit

''' <summary>
''' 指定した名前のビューを探し、部分断面図の制御を行うプロトタイプ
''' </summary>
Sub AdjustBrokenOutSectionDepth()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    Dim targetViewName As String
    Dim targetDepth As Double
    
    ' --- 設定エリア ---
    targetViewName = "Section View1" ' 操作したいビューの名前
    targetDepth = 0.05              ' 設定したい深さ (単位はメートル!重要)
    ' ------------------

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    ' 1. ドキュメントが図面であるかチェック(ここがプロの作法)
    If swModel Is Nothing Then Exit Sub
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いてから実行してください。"
        Exit Sub
    End If

    Set swDraw = swModel
    
    ' 2. 最初のビュー(シート自体)からループを開始
    ' SolidWorksでは、最初のViewは「Sheet」そのものを指すので、GetNextViewで次へ行く
    Set swView = swDraw.GetFirstView
    Set swView = swView.GetNextView 

    Dim found As Boolean
    found = False

    ' 3. 全てのビューを走査してターゲットを探す
    Do While Not swView Is Nothing
        If swView.Name = targetViewName Then
            ' ターゲット発見!
            Debug.Print "ターゲット発見: " & swView.Name
            
            ' --- ここで深さの制御ロジックを呼び出す ---
            ' ※注: 部分断面図の深さ変更は、APIのバージョンや断面の作り方により
            ' 直接的なプロパティがない場合があります。その場合は
            ' 断面の境界線(Sketch)を操作するか、SectionViewオブジェクトを介します。
            
            Call ApplyDepthToView(swView, targetDepth)
            
            found = True
            Exit Do
        End If
        Set swView = swView.GetNextView
    Loop

    If Not found Then
        MsgBox "指定されたビュー '" & targetViewName & "' が見つかりませんでした。"
    Else
        ' 4. 画面更新を最後に行う(パフォーマンスへの配慮)
        swModel.GraphicsRedraw
        MsgBox "処理が完了しました。"
    End If
End Sub

''' <summary>
''' ビューに対して深さ等のパラメータを適用する(概念実装)
''' </summary>
Sub ApplyDepthToView(view As SldWorks.View, depth As Double)
    ' ここに具体的なパラメータ操作を記述します。
    ' 部分断面図の場合、Viewのプロパティを操作するか、
    ' 断面を定義しているスケッチのオフセット値を操作するアプローチが一般的です。
    
    Debug.Print "ビュー " & view.Name & " に対して深さ " & depth & " を適用中..."
    
    ' 例: Viewのプロパティを更新するロジック(疑似コード)
    ' view.SetSectionDepth depth 
    
    ' ※実際のAPI仕様に基づき、断面図専用のメソッドを呼び出します。
End Sub

3. 伝説のエンジニアが教える「陥りやすい3つの罠」

コードを書くだけなら初学者でもできます。しかし、現場で「動かない!」「遅い!」と叫ばれないためには、以下の3点をマスターしてください。

① 単位の罠:すべては「メートル」である

SolidWorks APIの世界では、ミリメートル(mm)は通用しません。
`0.05` と書けば 50mm です。`50` と書けば 50メートル になります。
「マクロを動かしたら図面が真っ白になった(巨大すぎて見えない)」というトラブルの9割は、この単位変換ミスです。必ず `mm / 1000` を意識してください。

② 再描画の罠:パフォーマンスの天敵

ループの中で `swModel.GraphicsRedraw` を呼び出していませんか?
これは、一回操作するたびに画面を書き換える命令です。100個のビューを操作する場合、100回画面がチラつき、処理時間は数倍に膨れ上がります。
「計算は裏で行い、描画は最後に一度だけ」。これが鉄則です。

③ 選択(Selection)の罠:オブジェクトを直接触れ

`SelectByID2` を多用して、「名前で選んでから操作する」という書き方をしていませんか?
これは非常に不安定です。もしユーザーが図面上で名前を変えてしまったら、マクロは即死します。
今回紹介したコードのように、`swView.GetNextView` を使ってオブジェクトそのものを変数に格納し、直接操作するスタイルを身につけてください。これが「堅牢なコード」への第一歩です。

最後に:君はもう、マクロの記録者ではない

部分断面図の深さを制御する。一見、地味な作業に見えるかもしれません。
しかし、この「オブジェクトの階層を辿り、適切なプロパティを、正しい単位で叩く」というプロセスは、SolidWorks APIにおけるあらゆる自動化の基礎です。

これができるようになれば、次はアセンブリの構成変更、次は複雑な検図の自動化……と、あなたのできることは無限に広がっていきます。

一歩ずつ、確実に。
SolidWorks VBAの深淵を楽しんでください。応援していますよ!

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