【テクニカル・上級編】【図面レイヤー管理】LayerMgrを使った製図規格準拠のレイヤー自動振り分けと線の太さ制御 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA】LayerMgrによる図面レイヤーの静かなる統治 ― 標準化の極限とパフォーマンスの追求

設計現場において、図面は契約書と同義である。線の太さ一本、レイヤーの取り違え一つが、加工現場での誤読を招き、数百万単位の損失を生む。シニアエンジニアやシステム管理者に課せられた使命は、個人の裁量という名の「揺らぎ」を排除し、社内製図規格をプログラムによって強制執行することにある。

今回は、SolidWorks APIの`LayerMgr`を中核に据え、図面内の全エンティティを走査し、規格に準拠したレイヤーへ自動的に再配置する極限の自動化手法を解説する。

1. LayerMgr:図面構造の規律を司る心臓部

SolidWorksの図面ドキュメント(`DrawingDoc`)において、レイヤー管理は`LayerMgr`オブジェクトが担う。しかし、単にレイヤーを作成して割り当てるだけでは不十分だ。真のプロフェッショナルは、「既存レイヤーの存在確認」「色のRGB定義」「線の太さ(LineWeight)の厳密な定義」をアトミックに実行する。

特に、レガシーな図面環境を保守する場合、古いテンプレートで作成された図面には必要なレイヤーが存在しないことが多い。スクリプトの冒頭で環境をクリーンアップし、規格を再定義するプロセスは必須である。

2. パフォーマンスへの執着:画面更新の停止とWindows API

数千の寸法や注記が含まれる複雑な図面を処理する場合、愚直に処理を書けば画面描画のオーバーヘッドで実行時間は指数関数的に増大する。ここでは、SolidWorksの組み込み機能だけでなく、Windows APIを叩いてUIの再描画を完全に抑制し、実行速度を極限まで引き上げる。

‘ Windows APIの宣言:描画停止による高速化
If VBA7 Then
Declare PtrSafe Function LockWindowUpdate Lib “user32” (ByVal hwndLock As LongPtr) As Long
Else
Declare Function LockWindowUpdate Lib “user32” (ByVal hwndLock As Long) As Long
End If

3. 実装:レイヤー自動振り分けの極致

以下のコードは、単なるサンプルではない。ビュー、アノテートアイテム、中心線、寸法を網羅的に走査し、適切なレイヤーへ「強制移送」するためのプロダクションコードの雛形である。

Option Explicit

‘ レイヤー定義の定数化(保守性の向上)
Private Const LAYER_DIM As String = “DIM_Standard”
Private Const LAYER_CENTER As String = “CENTER_Standard”
Private Const LAYER_NOTE As String = “NOTE_Standard”

Sub DrawingLayerOrchestrator()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swLayerMgr As SldWorks.LayerMgr
Dim swView As SldWorks.View
Dim swAnn As SldWorks.Annotation
Dim swDispDim As SldWorks.DisplayDimension
Dim swCLine As SldWorks.Centerline

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

‘ ドキュメントタイプチェック
If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
MsgBox “図面ドキュメントを開いてください。”, vbCritical
Exit Sub
End If

Set swDraw = swModel
Set swLayerMgr = swModel.GetLayerManager

‘ パフォーマンス最適化:描画停止
LockWindowUpdate swApp.GetMainWnd
swModel.EditRebuild3 ‘ 事前の再構築

On Error GoTo ErrorHandler

‘ 1. レイヤーの存在確認と生成(規格の強制)
SetupStandardLayers swLayerMgr

‘ 2. 全シート・全ビューの走査
Set swView = swDraw.GetFirstView ‘ 最初はシートそのもの(Sheet View)

Do While Not swView Is Nothing
‘ ビュー内の注記(Annotation)を走査
Set swAnn = swView.GetFirstAnnotation2
Do While Not swAnn Is Nothing
ProcessAnnotation swAnn
Set swAnn = swAnn.GetNext3
Loop

‘ ビュー内の中心線を走査(注記とは別系統の場合がある)
‘ ※必要に応じて特定の図形要素へのアクセスを追加

Set swView = swView.GetNextView
Loop

‘ 強制再描画
swModel.GraphicsRedraw2
MsgBox “レイヤー振り分け完了。規格準拠を確認してください。”, vbInformation

CleanUp:
LockWindowUpdate 0 ‘ 描画ロック解除
‘ オブジェクトの明示的解放(メモリリーク防止)
Set swLayerMgr = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Exit Sub

ErrorHandler:
Debug.Print “Error: ” & Err.Description
Resume CleanUp
End Sub

‘ 規格レイヤーのセットアップ
Private Sub SetupStandardLayers(ByRef swLayerMgr As SldWorks.LayerMgr)
‘ 引数:LayerName, Color(RGB), Style, Width
‘ Width: swLineWeights_e 列挙型を使用
CreateOrUpdateLayer swLayerMgr, LAYER_DIM, RGB(0, 255, 0), swLineCONTINUOUS, swLineWeight_Thin
CreateOrUpdateLayer swLayerMgr, LAYER_CENTER, RGB(255, 0, 0), swLineCHAIN, swLineWeight_Thin
CreateOrUpdateLayer swLayerMgr, LAYER_NOTE, RGB(255, 255, 0), swLineCONTINUOUS, swLineWeight_Thin
End Sub

Private Sub CreateOrUpdateLayer(swLayerMgr As SldWorks.LayerMgr, name As String, color As Long, style As Integer, width As Integer)
If swLayerMgr.SetCurrentLayer(name) = False Then
‘ レイヤーが存在しない場合は新規作成
swLayerMgr.AddLayer name, “Auto-generated by System”, color, style, width
Else
‘ 既存レイヤーの属性を規格に強制同期
Dim swLayer As SldWorks.Layer
Set swLayer = swLayerMgr.GetLayer(name)
swLayer.color = color
swLayer.Style = style
swLayer.Width = width
End If
End Sub

‘ アノテーションの種類を判定し、レイヤーをセットする
Private Sub ProcessAnnotation(ByRef swAnn As SldWorks.Annotation)
Dim type As Long
type = swAnn.GetType

Select Case type
Case swAnnotationType_e.swDisplayDimension
swAnn.Layer = LAYER_DIM
Case swAnnotationType_e.swNote
swAnn.Layer = LAYER_NOTE
Case swAnnotationType_e.swCenterline, swAnnotationType_e.swCenterMark
swAnn.Layer = LAYER_CENTER
‘ 他の型も必要に応じて追加
End Select
End Sub

4. 深度解説:なぜこの設計なのか

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

VBAにおいて、SolidWorks APIのオブジェクト(特に`Annotation`や`View`)はCOMオブジェクトである。ループ内でこれらを大量に生成・破棄する場合、`Set obj = Nothing`による明示的な解放を行わないと、SolidWorksのプロセスが肥大化し、最終的に「アウトオブメモリ」で沈む。本スクリプトでは、エラートラップを完備し、いかなる状況でも`LockWindowUpdate 0`とオブジェクト解放を通過するように設計している。

`LockWindowUpdate`の重要性

SolidWorksのAPIには`swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swFreezeDisplay, True`という設定もあるが、Windows APIレベルでの描画停止の方が、OSのメッセージキューをバイパスするため、より強力かつ確実なパフォーマンス向上を期待できる。

規格の「強制」と「柔軟性」

`CreateOrUpdateLayer`メソッドの実装に注目してほしい。これは単にレイヤーを作るのではない。もしユーザーが勝手に色を変えていたとしても、実行のたびに「社内規格の色」に引き戻す。これが、システム管理者に求められる「統治」の姿勢である。

5. 今後の拡張:システム間連携への布石

このスクリプトは単体でも機能するが、真価を発揮するのはPDM(Product Data Management)との連携時である。
例えば、PDMのチェックインイベントをトリガーにこのマクロをバックグラウンドで実行させれば、「規格違反の図面は物理的にPDMへ登録できない」という鉄壁の品質管理ワークフローが完成する。

また、線の太さ(`LineWeight`)については、将来的にISO/JISの変更があった場合でも、定数セクションを書き換えるだけで全社展開が可能だ。

結論

図面レイヤー管理の自動化は、単なる時短テクニックではない。それは、設計資産の品質を均一化し、エンジニアを付加価値の低い作業から解放するための「インフラ」である。今回提示したアーキテクチャをベースに、貴社の独自要件を組み込み、揺るぎない設計基盤を構築していただきたい。

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