【図面アノテーションの拡張】ISketchHatchを用いた断面ビューへのハッチングパターン自動適用
SolidWorks VBAによる図面自動化において、最もエンジニアの頭を悩ませる領域の一つが「断面ビューのハッチング制御」である。
標準機能での自動ハッチングはアセンブリの材質定義に依存するが、社内規格や特定の図面表現ルール(例えば、同一部品であっても配置されるビューやコンフィギュレーションによってパターンやスケールを動的に変えたい場合など)において、GUI手動操作の介在はヒューマンエラーの温床となる。
今回は、APIの深層に眠る `ISketchHatch` オブジェクトを直接叩き、断面ビュー内のハッチング領域をプログラムから完全に掌握・制御する極限のテクニックを公開する。
—
1. 断面ハッチングAPIのオブジェクトモデル構造と罠
SolidWorksの図面APIにおいて、ハッチングは単なるビューの装飾ではない。
`DrawingDoc` から `View` を取得し、さらにそこからスケッチエンティティ、そしてハッチング定義(`SketchHatch`)へと降りていく構造を持つ。
SldWorks.Application
└─ SldWorks.ModelDoc2 (Drawing)
└─ SldWorks.View (断面ビュー)
└─ SldWorks.Sketch (ビューに紐付くスケッチ)
└─ SldWorks.SketchHatch (ハッチングパターン実体)
シニアエンジニアが知るべき「メモリとポインタの罠」
VBAの抽象レイヤーの裏側では、COMオブジェクトが高速で生成・破棄されている。
特に図面ビューのトラバーサル(走査)を行う際、`ISldWorks::IActiveDoc2` や `IDrawingDoc::ActivateView` を安易にループ内で呼び出すと、ビューの再描画(Rebuild)が走るたびにメモリリークやCOMポインタの不整合(RPC_E_WRONG_THREAD等)を引き起こす。
これを防ぐためには以下の鉄則を遵守する:
1. 画面描画の完全なロック:処理開始前に `SetUserPreferenceToggle(swUserPreferenceToggle_e.swInteractiveState, False)` を実行し、SolidWorksのUIをフリーズさせる。
2. オブジェクトの明示的解放:ループ変数や一時オブジェクトは `Set obj = Nothing` で確実にCOM参照カウンタをデクリメントする。
—
2. 実装コード:断面ビューハッチング動的制御エンジン
以下のコードは、アクティブな図面ドキュメントから指定した断面ビューを特定し、内部のハッチングパターン、スケール、角度を強制的に書き換える実用的なプロシージャである。
‘ ==============================================================================
‘ 担当アーキテクト: 伝説のチーフアーキテクト
‘ 目的: 指定した断面ビュー内の全ハッチングパターンを動的に書き換える
‘ 前提条件: アクティブドキュメントが図面であり、ターゲットの断面ビューが存在すること
‘ ==============================================================================
Public Sub ApplyStandardHatchPattern()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
‘ 1. アプリケーションおよびドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox “このマクロは図面ドキュメントでのみ実行可能です。”, vbCritical
Exit Sub
End If
Set swDraw = swModel
‘ パフォーマンス最大化のためUI描画をロック
swApp.SetUserPreferenceToggle swInteractiveState, False
swModel.EditRebuild
On Error GoTo ErrorHandler
‘ 2. アクティブビュー(または特定名称のビュー)の取得
Set swView = swDraw.GetActiveView()
If swView Is Nothing Then
Err.Raise 1000, “HatchControl”, “アクティブなビューが選択されていません。”
End If
‘ ビューが断面ビュー(Section View)であるか検証
‘ ※ ビュータイプの判定ロジック(必要に応じて拡張)
Debug.Print “処理対象ビュー: ” & swView.Name
‘ 3. ビュー内のスケッチおよびハッチングエンティティの走査
Dim swSketch As SldWorks.Sketch
Set swSketch = swView.GetSketch()
If Not swSketch Is Nothing Then
Dim vHatches As Variant
vHatches = swSketch.GetHatches()
If Not IsEmpty(vHatches) Then
Dim i As Long
Dim swHatch As SldWorks.SketchHatch
For i = LBound(vHatches) To UBound(vHatches)
Set swHatch = vHatches(i)
If Not swHatch Is Nothing Then
‘ — ハッチングプロパティの動的変更 —
‘ 例: ANSI31 (鉄鋼・一般金属系) パターンに変更
swHatch.Pattern = “ANSI31”
‘ スケールを 2.0 に設定 (ミリメートル単位系依存を回避するため比率で指定)
swHatch.Scale2 = 2.0
‘ 角度を 45.0度 に設定
swHatch.Angle = 45.0 (3.14159265358979 / 180#) ‘ ラジアン変換
Debug.Print “ハッチング更新成功: Index ” & i
Set swHatch = Nothing
End If
Next i
Else
MsgBox “対象ビュー内にハッチングエンティティが見つかりませんでした。”, vbInformation
End If
End If
ErrorHandler:
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
‘ 4. クリーンアップとUI復元
swApp.SetUserPreferenceToggle swInteractiveState, True
swModel.WindowRedraw
Set swHatch = Nothing
Set swSketch = Nothing
Set swView = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. レガシー環境・外部システム連携における知見
製造業の現場においては、単体VBAのマクロ実行だけではなく、PDMシステムや外部ERP、あるいはExcelマクロからのバッチ処理(Headless実行)としてこのAPIを叩く要件が日常茶飯事である。
1. 外部プロセス(C# / VB.NET / Excel VBA)からの制御時の注意点
SolidWorksをバックグラウンド(非表示)で起動し、図面をロードしてハッチングを自動適用する場合、`swApp.SetUserPreferenceToggle swInteractiveState, False` は必須である。
GUIを描画するリソースを完全に剥ぎ取ることで、処理速度は最大で3倍以上に跳ね上がり、COMオブジェクトのタイムアウトエラー(RPC Server is unavailable)を劇的に抑制できる。
2. パターン名(`Pattern` プロパティ)の厳密性
`swHatch.Pattern = “ANSI31″` のように文字列でパターンを指定する場合、SolidWorksのカスタムhatchファイル(`sldrtch.pat`)に定義されている正確な名称と一致していなければならない。
社内独自規格のハッチングパターンを適用する場合は、あらかじめローカルのパター定義ファイルを全クライアントの `sketch hatch pattern` 検索パスに同期させるシステム基盤が前提となる。ここを怠ると、APIはエラーを返さずに「デフォルトのパターンにフォールバックする」という、最も気付きにくいサイレント障害を引き起こす。
—
終わりに
`ISketchHatch` をはじめとする図面アノテーションのAPI制御は、手動による図面作成工数をゼロにするための強力な武器となる。
「動けばいい」というアマチュアのコードを捨て、オブジェクトのライフサイクルとメモリ、そして SolidWorksの描画スレッドの挙動までを完全にコントロール下に置いた真の自動化アーキテクチャを、あなたの現場でも構築してほしい。
