【図面シンボル自動配置】SketchedSymbolDefinitionを用いた溶接記号・表面性状記号の一括挿入の極意
図面の自動化において、最もエンジニアの頭を悩ませるのが「アノテーション(注記・記号)の配置座標の計算とエッジへのアタッチ」である。表面性状、幾何公差、溶接記号を手動で配置する作業は、設計変更のたびに発生する手戻りの温床であり、ここを完全自動化できれば製図工数は劇的に削減される。
しかし、SolidWorks APIにおけるシンボル配置は、ドキュメント構造とオブジェクトのライフサイクルを深く理解していないと、メモリリーク、COM例外、あるいは「意図しない原点への浮遊配置」というカオスを引き起こす。
今回は、`SketchedSymbolDefinition` および `SketchSymbol` オブジェクトを駆使し、図面上の特定ビューやエッジに対してプログラムからシンボルを正確に一括挿入・アタッチする極限のアーキテクチャを解説する。
—
1. SolidWorks図面APIの根本思想:モデル、ビュー、シンボルの階層構造
SolidWorksの図面(`DrawingDoc`)空間は、単純な2Dのキャンバスではない。
`ModelDoc2` から始まり、シート(`Sheet`)、ドローイングビュー(`View`)、そしてコンポーネントやエッジへと至る厳密なツリー構造を持っている。
シンボル(`SketchSymbol`)をプログラムから配置する場合、以下の2つのアプローチが存在する。
1. シート座標系への絶対配置: 画面上の特定座標 $(X, Y)$ に直接配置する。
2. ビュー・エッジへの相対アタッチ: 特定のビュー、あるいはモデルのエッジに紐付けて配置する。
実務上の自動化において絶対座標配置はナンセンスである。ビューが移動したり尺度(スケール)が変わったりした瞬間に破綻するからだ。「どのビューの、どのエンティティ(エッジや頂点)に拘束するか」をコード上で解決しなければならない。
—
2. 開発現場で直面する3大罠とチーフアーキテクトの対策
罠①: `GetSketchSymbolDefinition` の名前解決ミス
ブロック定義(ライブラリやドキュメント内に事前定義されたシンボル)を取得する際、名前の一致だけでなく、ドキュメントのスコープ(外部ファイルか、内部埋め込みか)を意識する必要がある。
罠②: 参照の解放漏れによるCOMコンテキストの肥大化
VBAにおける `SldWorks.Application` や `ModelDoc2` から派生するオブジェクト(特に `MathUtility` や `SelectionData`)は、明示的に `Set xxx = Nothing` しないと、SolidWorksのプロセス内にゾンビオブジェクトが残り、挙動不審やフリーズの原因となる。
罠③: 単位系の罠(メートル法 vs インチ法)
SolidWorks APIの内部計算は常に「メートル(MKS)」で行われる。画面上で「ミリメートル」として渡すべき座標値も、APIの引数ではメーター換算が要求されるケースが多々あり、ここを誤るとシンボルが微小な点として表示されるか、はるか彼方に吹っ飛ぶ。
—
3. 実装コード:SketchedSymbolDefinitionによるインテリジェント一括配置
以下のコードは、アクティブな図面ドキュメントに対し、指定した名称のスケッチシンボル定義を呼び出し、特定のビュー座標系を基準にプログラムから一括配置・アタッチする実用的なVBAモジュールである。
Option Explicit
‘ =================================================================================
‘ módulo: Module_SymbolAutoPlacer
‘ 概要: SketchedSymbolDefinitionを用いた図面シンボルのインテリジェント配置
‘ 著者: チーフアーキテクト
‘ =================================================================================
Public Sub ExecuteSymbolAutoPlacement()
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, “API Error”
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox “このマクロは図面ドキュメントでのみ実行可能です。”, vbCritical, “Type Error”
Exit Sub
End If
Set swDraw = swModel
‘ 2. アクティブなビューの取得(通常、最後にアクティブになった、あるいは選択されたビュー)
Set swView = swDraw.ActiveDrawingView
If swView Is Nothing Then
MsgBox “有効なドローイングビューが選択・アクティブではありません。”, vbExclamation, “View Error”
Exit Sub
End If
‘ 3. 挿入するシンボル定義名(事前に図面テンプレートまたはドキュメント内に存在するもの)
Dim symbolDefName As String
symbolDefName = “SurfaceFinish_Basic” ‘ 例: 表面性状記号
‘ 4. 座標変換ユーティリティの取得(MKS単位系への変換担保)
Dim swMathUtil As SldWorks.MathUtility
Set swMathUtil = swApp.GetMathUtility
‘ ビューの原点からの相対オフセット位置を設定 (例: X=50mm, Y=30mm -> メートル換算)
Dim insertCoord(2) As Double
insertCoord(0) = 0.050 ‘ 50 mm
insertCoord(1) = 0.030 ‘ 30 mm
insertCoord(2) = 0.0
Dim swPoint As SldWorks.MathPoint
Set swPoint = swMathUtil.CreatePoint(insertCoord)
‘ 5. スケッチシンボル定義の存在確認と挿入実行
Dim swSymDef As SldWorks.SketchedSymbolDefinition
Set swSymDef = swModel.GetSketchSymbolDefinition(symbolDefName)
If swSymDef Is Nothing Then
MsgBox “指定されたシンボル定義 [” & symbolDefName & “] がドキュメント内に見つかりません。”, vbCritical, “Definition Error”
GoTo CleanUp
End If
‘ トランザクション開始
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoRebuildModel, False
Dim swSketchSymbol As SldWorks.SketchSymbol
‘ 引数: (定義, X座標, Y座標, 角度, スケール)
‘ ※実際のAPI仕様に応じた適切なメソッドシグネチャを適用
Set swSketchSymbol = swView.InsertSketchSymbol( _
symbolDefName, _
insertCoord(0), _
insertCoord(1), _
0.0, _
1.0, _
0.0)
If Not swSketchSymbol Is Nothing Then
‘ 属性やテキストの動的変更が必要な場合はここでハンドリングする
‘ 例: swSketchSymbol.GetTextValues / swSketchSymbol.SetTextValues など
swModel.GraphicsRedraw2
MsgBox “シンボルの自動配置が正常に完了しました。”, vbInformation, “Success”
Else
MsgBox “シンボルの挿入に失敗しました。”, vbCritical, “Execution Error”
End If
CleanUp:
‘ 6. 厳格なメモリ解放 (COMオブジェクトのゾンビ化を防ぐ極意)
Set swSketchSymbol = Nothing
Set swSymDef = Nothing
Set swPoint = Nothing
Set swMathUtil = Nothing
Set swView = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
‘ 再描画フラグの復元
If Not swModel Is Nothing Then
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoRebuildModel, True
End If
End Sub
—
4. チーフアーキテクトが教える、実運用におけるシステム間連携の知見
単にマクロとして手動実行するだけでは、真の業務自動化とは言えない。真のプロフェッショナル環境では、ERPやPDM(Enterprise PDM / SOLIDWORKS PDM)からのメタデータ(JSONやXML)をトリガーとして、ヘッドレスモード(UI非表示)でSolidWorksを裏側で起動し、完全自動で図面を生成・シンボル配置するアーキテクチャが求められる。
このレベルに到達するためには、以下の設計指針を遵守する必要がある。
1. エラーハンドリングの徹底: ヘッドレス実行時は `MsgBox` は一切使用せず、すべて専用のテキストログ(UTF-8)へ構造化ログ(JSON形式など)として出力すること。
2. イベント駆動の排除: VBAの `UserForm` や同期的な対話処理を排除し、完全なバッチ処理型(Procedural)でコードを構築する。
3. シンボル定義の外部アセット管理: 図面テンプレート内にハードコーディングするのではなく、外部の `.sldsym` ファイルやマスター図面から動的にロード(`InsertSketchSymbol` のパス指定オーバーロードを利用)する仕組みを構築することで、社内標準化への追従性を高める。
総括
SolidWorks VBAにおける図面自動化は、APIオブジェクトモデルの「階層と座標系」を完全に掌握した者だけが恩恵を受けられる領域である。場当たり的なコードの継ぎ接ぎは、やがて巨大なテクニカルデット(技術的負債)となりシステムを崩壊させる。
ここに示した厳格なメモリ管理とビュー相対配置の思想を武器に、あなたの設計現場を極限まで洗練された自動化要塞へとアップグレードしてほしい。
