SolidWorks APIの深淵:SketchedSymbolを自在に操り、図面自動化の「聖杯」を掴む
多くのエンジニアがSolidWorks APIの入り口で躓くのは、`SldWorks`や`ModelDoc2`の表面的な操作に終始し、オブジェクトのライフサイクルとコンテキスト(文脈)を理解していないからだ。
特に図面上の「スケッチ記号(Sketched Symbol)」の配置は、単に座標を与えるだけでは不十分だ。なぜなら、記号は「図面シート」「ビュー」「エッジ」という階層構造に依存しており、この構造を無視したコードは、図面の縮尺変更やビューの移動一発で崩壊するからだ。
今回は、現場の生産性を劇的に向上させる「堅牢な記号配置」の極意を伝授する。
—
1. なぜ「手動配置」から脱却すべきなのか
設計現場において、溶接記号や表面性状記号の配置は最も退屈で、かつミスが許されない作業だ。しかし、APIによる自動化を試みる者の多くが、以下のような「脆弱なコード」を書いてしまう。
- 絶対座標への依存: ビューが移動した瞬間に記号が宙に浮く。
- 名前指定のハードコーディング: テンプレート名が変わると即座にクラッシュする。
- エラーハンドリングの欠如: 記号定義(Definition)がロードされていない状態を考慮していない。
これらを解決するには、「定義(Definition)」と「インスタンス(Instance)」を厳格に分離し、常に親ビューのコンテキストから位置を算出する設計が必要だ。
—
2. 実践:SketchedSymbol配置のプロダクションコード
以下のコードは、指定したビューに対して記号を挿入する際の「標準テンプレート」だ。単なるコピペ用ではなく、自身のライブラリの核として活用してほしい。
Option Explicit
‘ ———————————————————
‘ 記号を特定のビュー内のエッジに正確に配置するモジュール
‘ ———————————————————
Public Sub InsertSketchedSymbol(ByVal swModel As SldWorks.ModelDoc2, _
ByVal symbolPath As String, _
ByVal viewName As String, _
ByVal x As Double, ByVal y As Double)
Dim swDraw As SldWorks.DrawingDoc
Set swDraw = swModel
‘ 1. 対象ビューの特定(ビューの階層管理は堅牢性の要)
Dim swView As SldWorks.View
Set swView = swDraw.GetFirstView ‘ シート自体
Set swView = swView.GetNextView ‘ 最初の描画ビュー
‘ ビュー名をループで精査(実務では辞書オブジェクト等でキャッシュ推奨)
Do While Not swView Is Nothing
If swView.Name = viewName Then Exit Do
Set swView = swView.GetNextView
Loop
If swView Is Nothing Then Err.Raise vbObjectError + 1, , “指定されたビューが見つかりません”
‘ 2. 記号定義のロード
‘ 注意:外部ファイルから読み込む際は、既に存在するかを確認するのが定石
Dim swSymbolDef As SldWorks.SketchedSymbolDefinition
Set swSymbolDef = swDraw.LoadSketchedSymbolDefinition(symbolPath, “”, True, True)
If swSymbolDef Is Nothing Then Err.Raise vbObjectError + 2, , “記号定義の読み込みに失敗しました”
‘ 3. インスタンスの配置
‘ SetPositionは「ビューのローカル座標」で行うのが鉄則
Dim swSymbol As SldWorks.SketchedSymbol
Set swSymbol = swView.InsertSketchedSymbol(swSymbolDef.Name)
If Not swSymbol Is Nothing Then
swSymbol.SetPosition x, y, 0
swSymbol.Angle = 0 ‘ 必要に応じて回転
swSymbol.Scale = 1.0
End If
swModel.GraphicsRedraw2
End Sub
—
3. 開発現場で勝つための「3つの極意」
① 「定義」のキャッシュ戦略
`LoadSketchedSymbolDefinition`を毎回呼ぶのはパフォーマンスの浪費だ。大規模な図面でこれを繰り返すと、SolidWorksのメモリ管理が悲鳴を上げる。記号定義は一度ロードしたらプログラム内で保持し、インスタンス生成のみを行うように設計せよ。
② ビューのローカル座標系を計算する
APIで座標を指定する際、最も多いミスが「シート座標」と「ビュー座標」の混同だ。常に `swView.GetTransform` を使い、ワールド座標(あるいはシート座標)からビューローカル座標への変換行列を適用すること。これを行わない限り、図面を修正した瞬間に記号は「迷子」になる。
③ データベース連携の注意点
社内標準記号を外部データベースやクラウドで管理する場合、パスの整合性が最大の敵となる。
- UNCパスの使用: ネットワークドライブの割り当て(Z:ドライブなど)に依存せず、`\\Server\Shared\Symbols\…` で指定せよ。
- ハッシュチェック: ロード前にファイルの更新日時やハッシュ値を比較し、ローカルにキャッシュしてある最新版のみを使用するロジックを組むべきだ。
—
結論:自動化は「設計の一部」である
APIを単なる「作業の自動化ツール」として見るな。それは「設計品質を担保するためのインフラ」だ。
コードが汚ければ、出力される図面もまた信頼性を失う。
今回提示した設計思想は、一見遠回りに見えるかもしれない。しかし、この「ビュー階層の意識」と「オブジェクトの分離」さえ徹底すれば、君が作成するツールは、1年後も5年後も、設計現場で文句ひとつ言わずに働き続ける「伝説のコード」へと昇華するはずだ。
さあ、エディタを開き、まずは自分の手元のコードを「疎結合」な設計に書き換えるところから始めてほしい。君の挑戦を期待している。
