【実務・中級編】【初心者向け】図面ビューの「接線表示の非表示設定」を全ビューに一括適用するマクロ – SolidWorks VBA解析バイブル

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

図面自動化の真髄:接線表示制御を「単なるループ」で終わらせないための設計思想

設計現場において、図面の美しさはエンジニアの品格を左右する。しかし、多くの図面作成者が「接線(Tangent Edges)」の表示・非表示という、極めて単純ながらも極めて煩雑な作業に、貴重なリソースを浪費している。

「全ビューの接線を一括で消すマクロ」を書くことは、初心者でも可能だ。しかし、「実務で耐えうる、堅牢で保守性の高いツール」として提供できるかどうかが、一介のプログラマと、業務自動化エンジニアの分水嶺となる。

本記事では、単なるコードの提供に留まらず、オブジェクトの階層構造、エラーハンドリング、そしてユーザー体験(UX)を考慮した、プロフェッショナルな設計手法を伝授する。

1. なぜ、あなたのマクロは「現場」で使われないのか

初心者が書くマクロには、共通する「3つの欠陥」がある。

① 階層構造の理解不足

SolidWorksの図面(Drawing)オブジェクトモデルは、`DrawingDoc` -> `Sheet` -> `View` という厳格な階層構造を持っている。多くの初心者は `DrawingDoc.GetViews` のような、あたかも全てのビューがフラットに並んでいるかのような誤ったアプローチを取る。これでは、複数シート構成の図面において、特定のシートのビューを見落とす原因となる。

② エラーハンドリングの欠如

図面には「図面枠(Sheet Format)」という特殊なレイヤーが存在する。もし、マクロが図面枠内の要素に対して接線制御を試みようとしたらどうなるか? プログラムはランタイムエラーを吐いて停止し、ユーザーの作業フローを破壊する。

③ Undo(元に戻す)の考慮漏れ

これが最も致命的だ。100個のビューに対して個別に処理を行うマクロを実行したとき、ユーザーが「あ、失敗した」と思って `Ctrl + Z` を押したとしよう。100回 `Ctrl + Z` を押させるのか? プロフェッショナルなツールは、「一つの操作として一括でUndoできる」設計になっていなければならない。

2. アーキテクチャ設計:堅牢な自動化へのロードマップ

我々が実装すべきロジックは、以下のフェーズに分割される。

1. Validation(検証): 現在開いているドキュメントが「図面」であることを確認する。
2. Transaction Start(トランザクション開始): Undoグループを開始し、一括操作の準備をする。
3. Hierarchy Traversal(階層走査): 全シートをループし、各シート内の全ビューを走査する。
4. Conditional Logic(条件分岐): 対象が「図面枠」ではなく「通常のビュー」であることを判定する。
5. Execution(実行): 接線表示設定を適用する。
6. Cleanup & Commit(クリーンアップ): オブジェクトの解放とUndoグループの終了。

3. プロダクション・グレードのコード例

以下に、これら全ての設計思想を注入したVBAコードを示す。これをそのままコピーして使用しても構わないが、コード内のコメントを読み、「なぜこのように書いているのか」を理解してほしい。

Option Explicit

''
' @description 図面内の全ビューに対して接線表示を非表示に設定する
' @author Lead Automation Architect
''
Public Sub HideAllTangentEdgesInDrawing()
    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 vSheetNames As Variant
    Dim i As Integer
    Dim errorCount As Integer
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' --- 1. Validation: ドキュメントの型チェック ---
    If swModel Is Nothing Then
        MsgBox "ドキュメントが開かれていません。", vbCritical
        Exit Sub
    End If
    
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "このマクロは図面ファイルでのみ実行可能です。", vbExclamation
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    ' --- 2. Transaction Start: Undoグループの開始 ---
    ' これにより、マクロ実行後のCtrl+Zが1回で済むようになる
    swModel.BeginUndoGroup "Hide All Tangent Edges"
    
    On Error GoTo ErrorHandler
    errorCount = 0
    
    ' --- 3. Hierarchy Traversal: シートの走査 ---
    vSheetNames = swDraw.GetSheetNames
    
    For i = 0 To UBound(vSheetNames)
        ' シートの切り替え(各シート内のビューにアクセスするため)
        swDraw.ActivateSheet vSheetNames(i)
        Set swSheet = swDraw.GetCurrentSheet
        
        ' --- 4. Hierarchy Traversal: ビューの走査 ---
        ' GetFirstViewは「シート自体」を指すため、その次のViewからが実際のビュー
        Set swView = swDraw.GetFirstView
        
        Do While Not swView Is Nothing
            ' --- 5. Conditional Logic: 図面枠(Sheet Format)を除外 ---
            ' swView.IsSheetFormat プロパティを使用して、図面枠への干渉を防ぐ
            If swView.IsSheetFormat = False Then
                
                ' 接線表示の設定を変更 (swTangentEdgeDisplayMode_e.swTangentEdgeDisplayMode_None)
                ' 0: None (非表示), 1: All (表示), 2: Selected (選択したもののみ)
                Dim status As Boolean
                status = swView.SetTangentEdgeDisplay(swTangentEdgeDisplayMode_e.swTangentEdgeDisplayMode_None)
                
                If Not status Then errorCount = errorCount + 1
            End If
            
            ' 次のビューへ
            Set swView = swView.GetNextView
        Loop
    Next i
    
    ' --- 6. Finalization ---
    swModel.EndUndoGroup
    
    If errorCount = 0 Then
        MsgBox "全てのビューの接線を非表示に設定しました。", vbInformation
    Else
        MsgBox "処理が完了しましたが、" & errorCount & "個のビューで失敗しました。", vbWarning
    End If
    
    Exit Sub

ErrorHandler:
    ' エラーが発生した場合も、必ずUndoグループを閉じて整合性を保つ
    swModel.EndUndoGroup
    MsgBox "予期せぬエラーが発生しました: " & Err.Description, vbCritical
End Sub

4. アーキテクトによる技術解説:実装のポイント

`BeginUndoGroup` の重要性

実務レベルのツールにおいて、`BeginUndoGroup` と `EndUndoGroup` は必須だ。これを怠ると、ユーザーがマクロの実行結果を修正したい時に、大量の操作履歴を遡るというストレスを与えることになる。これは「ツールの品質」を定義する境界線だ。

`IsSheetFormat` による防護壁

`swView.IsSheetFormat` をチェックせずに全てのビューをループ対象にすると、図面枠(タイトルブロックなど)に含まれる線まで操作対象になってしまう。これは図面テンプレートの破壊に繋がりかねない。「操作して良い対象」と「操作してはいけない対象」を明確に区別するのが、堅牢な設計の鉄則だ。

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

VBAはガベージコレクションが強力だが、大規模なループ内で複雑なオブジェクトを扱う場合、`Set swView = swView.GetNextView` のように、適切に次のオブジェクトへポインタを遷移させていく必要がある。メモリリークを最小限に抑えることは、長時間稼働する自動化環境において極めて重要だ。

5. まとめ:次のステップへ

今回のテーマは「接線の非表示」という局所的なものだった。しかし、今回適用した「バリデーション → トランザクション管理 → 階層走査 → 条件付き実行」という設計パターンは、あらゆるSolidWorks API操作に応用できる。

次にあなたが作るツールが、単なる「便利スクリプト」なのか、それとも「エンジニアリング・インフラ」なのか。その差は、こうした細部への設計思想にある。

さあ、コードを書く前に、まず設計図を描け。

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