マクロの記録を卒業せよ。部分断面図の「深さ」をコードで支配する極限のテクニック
こんにちは。設計現場で日々、設計自動化の荒波に揉まれているエンジニアの皆さん。
「マクロの記録」機能を使って、一歩ずつ階段を登ってきた皆さんの努力は素晴らしいものです。しかし、ある時ふと気づくはずです。
「記録したコードをそのまま動かしても、複雑な図面では全く通用しない……」
そう感じた時こそが、あなたが「単なる記録者」から「真のオートメーション・エンジニア」へと進化する分岐点です。
今日扱うテーマは、図面作成における「鬼門」の一つ、部分断面図(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の深淵を楽しんでください。応援していますよ!
