【テクニカル・上級編】【上級プロ向け】図面シートフォーマット(.slddrt)のプログラム的動的生成とテンプレートメタデータ検証ツール – SolidWorks VBA解析バイブル

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

テンプレートからの脱却:プログラムによる図面シートフォーマット(.slddrt)の動的生成とメタデータ整合性検証

エンジニアリング・オートメーションの深淵へようこそ。

多くの開発者は、SolidWorksの自動化において「既存のテンプレート(.slddrt)を読み込み、そこにビューを配置する」という手法を選択する。それは一見、効率的で理にかなっているように見える。しかし、大規模なPLM(Product Lifecycle Management)システムや、数千枚の図面を生成する自動化パイプラインを構築する立場からすれば、その手法は「技術的負債」の温床でしかない。

テンプレートファイルは、人間の手による「意図しない改変」に対して脆弱だ。誰かが枠線を1mm動かした、あるいはレイヤー設定を書き換えた――その瞬間、それまで構築してきた自動化ロジックは、沈黙のうちに崩壊を始める。

本稿では、既存のファイルに一切依存せず、VBAコードベースからゼロから図面シートフォーマットを構築し、さらにそのメタデータが設計標準に準拠しているかを厳密に検証する、真にプロフェッショナルなアーキテクチャについて詳説する。

1. テンプレート依存からの脱却:Code-Driven Sheet Construction

真の自動化とは、状態(State)をファイルに持たせるのではなく、ロジック(Logic)に持たせることだ。

図面シートの構成要素(線、文字、表題欄)をプログラムで描画する場合、我々は `DrawingDoc` オブジェクトを介して、シート上の座標系を数学的に制御する必要がある。ここで重要なのは、SolidWorksの座標系が「シートの原点」に基づいているのか、「用紙の端」に基づいているのかを完全に掌握することである。

動的生成のコア・アルゴリズム

以下に、テンプレートを使用せず、コードのみで図面枠(Border)と表題欄(Title Block)の骨格を生成する実装の骨子を示す。

' --- Module: SheetGenerator ---
' Description: ゼロから図面シートフォーマットを構築するプロフェッショナル・エンジン

Option Explicit

' Windows API: 高精度なタイミング制御またはシステム状態確認用(必要に応じて)

If VBA7 Then

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Else

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

End If

Public Sub GenerateDynamicSheet(swApp As SldWorks.SldWorks, sheetName As String) Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swSheet As SldWorks.Sheet Dim swPageSetup As SldWorks.PageSetup On Error GoTo ErrorHandler ' 1. 新規図面ドキュメントの生成(テンプレートなし) ' ※ 第1引数は空、または標準的な白紙を指定 Set swModel = swApp.NewDocument("", swDwgPaperSizes_e.swDwgPaperA3size, 0, 0) If swModel Is Nothing Then Exit Sub Set swDraw = swModel Set swSheet = swDraw.GetCurrentSheet ' 2. シートのプロパティ設定(数学的精度を担保) ' 座標系を安定させるため、原点を明示的に制御 swSheet.SetTemplateSheetFormat "", False, swDwgTemplateFormat_e.swDwgTemplateFormat_Custom ' 3. 図面枠(Border)の描画 ' ここでは A3サイズ (420mm x 297mm) を想定した絶対座標計算を行う DrawBorder swDraw, 420, 297, 10 ' 10mmのマージン ' 4. 表題欄(Title Block)の動的生成 ' テキスト、線、および属性(Property)の埋め込み CreateTitleBlock swDraw, 420, 297 ' 5. メモリ解放の儀式 Cleanup swModel Exit Sub ErrorHandler: Debug.Print "Critical Error in GenerateDynamicSheet: " & Err.Description Cleanup swModel End Sub Private Sub DrawBorder(swDraw As SldWorks.DrawingDoc, width As Double, height As Double, margin As Double) Dim swModel As SldWorks.ModelDoc2 Set swModel = swDraw.GetActiveDoc2 ' 単位変換 (mm -> m) Dim m As Double: m = margin / 1000 Dim w As Double: w = width / 1000 Dim h As Double: h = height / 1000 ' 線を描画 (InsertLine: x1, y1, x2, y2) ' 座標の精度を維持するため、浮動小数点演算に注意を払う swModel.InsertLine m, m, w - m, m swModel.InsertLine w - m, m, w - m, h - m swModel.InsertLine w - m, h - m, m, h - m swModel.InsertLine m, h - m, m, m swModel.EditRebuild3 End Sub Private Sub CreateTitleBlock(swDraw As SldWorks.DrawingDoc, width As Double, height As Double) Dim swModel As SldWorks.ModelDoc2 Set swModel = swDraw.GetActiveDoc2 ' 表題欄の右下エリアに配置 ' 座標計算のロジックをカプセル化し、再利用性を高める Dim bx As Double: bx = (width / 1000) - 0.1 ' 右端から100mmの位置 Dim by As Double: by = 0.02 ' 下端から20mmの位置 ' 表題欄の枠線 swModel.InsertLine bx, by, (width / 1000) - 0.01, by swModel.InsertLine bx, by, bx, by + 0.05 ' 注釈(Note)の挿入 - プロパティリンクによる動的表示 ' "SW-File Name" などのカスタムプロパティを直接コードから叩く Dim swNote As SldWorks.Note Set swNote = swModel.InsertNote("Drawing No: $PRP:""SW-File Name""") If Not swNote Is Nothing Then Dim swAnnotation As SldWorks.Annotation Set swAnnotation = swNote.GetAnnotation swAnnotation.SetPosition bx + 0.005, by + 0.01 End If End Sub Private Sub Cleanup(obj As Object) ' COMオブジェクトの明示的な解放 ' これを怠ると、SolidWorksプロセスがメモリ上に残り続け、 ' 大規模バッチ処理において「ゾンビプロセス」によるリソース枯渇を招く If Not obj Is Nothing Then Set obj = Nothing End If End Sub

2. メタデータ検証:整合性チェックの極致

図面が生成された後、それが「正しい」かどうかを判定するプロセスが必要です。単に「線が引いてあるか」ではなく、「表題欄に規定のプロパティが紐付けられているか」「注記のフォントサイズが標準に準拠しているか」を検証します。

これは、ERPやPDMにデータを送出する前の、いわば「ゲートキーパー」の役割を果たします。

検証ロジックの実装例

Public Function ValidateSheetMetadata(swModel As SldWorks.ModelDoc2) As Boolean
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swNote As SldWorks.Note
    Dim swAnn As SldWorks.Annotation
    Dim foundRequiredNote As Boolean: foundRequiredNote = False
    
    Set swDraw = swModel
    Set swSheet = swDraw.GetCurrentSheet
    
    ' シート上の全注釈(Notes)を走査し、必須項目を検証
    ' 描画オブジェクトのツリーを再帰的に探索するアプローチが必要
    Dim vNotes As Variant
    vNotes = swSheet.GetNotes
    
    If IsEmpty(vNotes) Then
        ValidateSheetMetadata = False
        Exit Function
    End If
    
    Dim i As Integer
    For i = 0 To UBound(vNotes)
        Set swNote = vNotes(i)
        ' 特定の文字列、あるいはカスタムプロパティの参照が含まれているか検証
        If InStr(1, swNote.GetText, "$PRP:", vbTextCompare) > 0 Then
            foundRequiredNote = True
            Exit For
        End If
    Next i
    
    ' 結論:必須プロパティを含む注記が存在する場合のみ、Trueを返す
    ValidateSheetMetadata = foundRequiredNote
End Function

3. パフォーマンスとメモリ管理:伝説的アーキテクチャの作法

大規模な自動化システムを運用する際、エンジニアが最も恐れるべきは「メモリリーク」と「不安定な挙動」です。

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

SolidWorks APIはCOM(Component Object Model)に基づいています。VBAのガベージコレクションは、COMオブジェクトの解放において必ずしも完璧ではありません。

  • 明示的解放: `Set obj = Nothing` は必須です。
  • 再帰的解放: `DrawingDoc` -> `Sheet` -> `Note` と続く階層構造において、親オブジェクトを解放する前に、子オブジェクトの参照を確実にクリアしてください。

Windows APIの活用

長時間稼働する自動化サーバーでは、システムの「静止」を制御する必要があります。例えば、大量の図面生成中にOSのインデックス作成サービスやアンチウイルスソフトがファイルをロックし、APIがエラーを吐くことがあります。
`Sleep` API を用いた微細なウェイトの挿入や、`GetTickCount` による処理時間の計測は、堅牢なシステムを構築するための「現場の知恵」です。

結言:Code as Truth(真実としてのコード)

「テンプレートを修正する」という行為は、不確実性を許容することです。
「コードで生成する」という行為は、決定論的な世界を構築することです。

設計標準をテンプレートファイルという「バイナリの塊」に閉じ込めるのではなく、VBAの「ロジック」として記述する。このパラダイムシフトこそが、レガシーな設計環境を、次世代のデジタル・スレッドへと昇華させる唯一の道です。

貴殿のコードが、単なる自動化ツールを超え、揺るぎない設計基盤となることを願っている。

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