【実務・中級編】【図面注記の自動化】Noteオブジェクト操作で図枠の表題欄や材質情報を一括書き換え – SolidWorks VBA解析バイブル

スポンサーリンク

図面注記の自動化:表題欄書き換えの「泥沼」から脱却するためのアーキテクチャ

SolidWorks APIを扱う多くのエンジニアが陥る罠がある。「とりあえず `Select` して `Note` を取得する」という泥臭い実装だ。

図面の表題欄を一括更新するツールを作る際、GUI上の注記を一つずつクリックして回るようなコードを書いていないだろうか?それは、数千件の図面を扱う現場において、「遅い・壊れる・メンテナンス不能」という三重苦を約束する行為に他ならない。

今日は、SolidWorksのオブジェクトモデルを正しく理解し、堅牢な注記制御を実現するための「プロの作法」を伝授する。

—

1. 勘違いされがちな「注記操作」の最適解

多くの初心者が `Annotation` オブジェクトを直接操作しようとするが、これは大きな誤りだ。図面の表題欄は、多くの場合「シートフォーマット」上に配置されている。

重要な事実:

  • シートとシートフォーマットは別物である。
  • 図面上の注記(Note)は、`ModelDoc2` の階層を深く潜り込んで抽出する必要がある。
  • 最も効率的なのは、注記をループで探すのではなく、「カスタムプロパティとのリンク」を利用したプロパティ値の書き換えである。

もし君が、「テキストを直接書き換える」コードを書こうとしているなら、今すぐ止めろ。プロパティを更新し、`Rebuild` する方が遥かに確実で、SolidWorksの設計思想に合致している。

—

2. 堅牢なプロダクションコード:プロパティ一括更新

以下は、部品のカスタムプロパティを読み取り、図面の表題欄へ流し込むためのテンプレートだ。エラーハンドリングを徹底し、再利用性を高めた構造にしている。

Option Explicit

‘ 伝説的な堅牢性を備えた注記・プロパティ更新モジュール
Public Sub UpdateDrawingProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc

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

‘ トランザクション処理:変更の確定とリビルドを最小限に
On Error GoTo ErrorHandler

‘ 例:図面カスタムプロパティ「材質」を更新
‘ これにより、リンクされた注記が自動的に追従する
Call swModel.AddCustomInfo3(“”, “Material”, swCustomInfoText, “SS400”)

‘ 図面全体のリビルド(注記の同期を強制)
swModel.ForceRebuild3 False

MsgBox “図面の更新が完了しました。”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

—

3. なぜこの設計が「プロ」なのか

① `AddCustomInfo3` を使う理由

直接注記を書き換えるのではなく、カスタムプロパティを更新する。これには二つのメリットがある。
1. 一元管理: 部品と図面でプロパティが同期するため、データの不整合が物理的に発生しない。
2. 高速性: 文字列解析のループ処理を介さないため、数万件の図面に対しても処理時間が一定である。

② エラーハンドリングの徹底

「動けばいい」コードは、ファイルが読み取り専用の時や、シートがロックされている時に即座にクラッシュする。`On Error GoTo` による例外処理は、自動化ツールにおいては「礼儀」である。

③ 階層構造の意識

今回は `CustomInfo` を扱ったが、もしどうしても図面上の特定の注記(リンクされていないもの)を直接操作しなければならない場合は、`GetFirstView` → `GetFirstNote` という階層を辿る必要がある。しかし、それは最後の手段だ。API設計の鉄則は、「手作業の模倣」ではなく「データの同期」である。

—

4. さらなる高みへ:データベース連携の注意点

もし君が、ExcelやSQL Serverから値を引っ張って図面を更新するシステムを組むなら、一点だけ注意してほしい。

「ファイル開閉のオーバーヘッド」だ。
図面を一つずつ `OpenDoc6` で開いて閉じるのは、遅すぎる。APIには `swApp.OpenDoc6` の引数に `swOpenDocOptions_Silent` を指定し、バックグラウンドで処理を行うオプションがある。メモリリークを避けるために、`Set swModel = Nothing` を必ず行い、ガーベジコレクションを意識したコーディングを心がけろ。

結びに代えて

SolidWorks VBAは古い言語だが、その背後にあるオブジェクトモデルは極めて強力だ。
「注記を書き換える」という単純なタスク一つとっても、その裏側にあるデータ構造を理解しているかどうかで、君の作るツールの寿命は数年変わる。

泥臭い作業はコードに任せ、君は設計の本質に集中しろ。それが、我々自動化エンジニアの責務だ。

—
追伸:もし特定の注記が「どうしても更新されない」という地獄のバグに遭遇したら、それは `Annotation.Visible` 属性や、レイヤー設定を確認しろ。SolidWorksは常に、君が指示した通りの「論理」で動いている。

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