図面自動化の真髄:接線表示制御を「単なるループ」で終わらせないための設計思想
設計現場において、図面の美しさはエンジニアの品格を左右する。しかし、多くの図面作成者が「接線(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操作に応用できる。
次にあなたが作るツールが、単なる「便利スクリプト」なのか、それとも「エンジニアリング・インフラ」なのか。その差は、こうした細部への設計思想にある。
さあ、コードを書く前に、まず設計図を描け。
