こんにちは!SolidWorksの自動化の世界へようこそ。
図面作成の最終段階、幾何公差や表面性状記号、溶接記号の配置で毎度何時間も消耗していませんか?「あっちのエッジにはこの記号、こっちの面にはこの数値……」と手動でポチポチ配置していく作業は、ヒューマンエラーの温床であり、エンジニアの創造的な時間を奪う最も退屈な作業の一つです。
今回は、マクロの記録の殻を完全に脱ぎ捨て、`SketchedSymbolDefinition`(スケッチシンボル定義)と`ModelDoc2`の真の力を引き出して、図面シンボルを一括自動配置する「極限の製図自動化」を伝授します。
ここをクリアすれば、あなたもSolidWorks VBAの基本を完全にマスターし、周囲から一目置かれる自動化エンジニアになれますよ。さあ、一緒に扉を開きましょう!
—
1. なぜ「マクロの記録」だけでは図面シンボルが自動化できないのか?
「マクロの記録」ボタンを押して手動でシンボルを挿入し、生成されたコードを見ると、何やら膨大な関数が並んでいますよね。しかし、それをそのまま別の図面で再生しようとすると、決まって「オブジェクトが見つかりません」というエラーで爆発します。
なぜでしょうか?
それは、マクロの記録が「今、画面上のどこをクリックしたか(座標や固有のID)」という結果論しか記録してくれないからです。
真の自動化エンジニアがやるべきことは異なります。
1. 「どのシンボル定義(テンプレート)を使うか」をライブラリから呼び出し、
2. 「図面のどこ(どのビュー、どのエッジ、どの座標)に」アタッチすべきかを計算し、
3. メモリ上で安全にインスタンス(実体)を生成する
この一連のオブジェクトのライフサイクルをコードで完全にコントロールすることです。
—
2. 現場で即戦力となる!図面シンボル一括配置マクロの全貌
それでは、実務でそのまま使えるVBAコードを公開します。
このコードは、アクティブな図面ドキュメントに対し、指定したスケッチシンボル(例:表面性状記号や独自の会社標準マークなど)を、指定座標へスマートに一括配置するものです。
Option Explicit
‘ ==============================================================================
‘ 処理名: スケッチシンボル一括自動配置マクロ
‘ 概要: 指定したスケッチシンボル定義を読み込み、図面上の指定座標に配置する
‘ ==============================================================================
Sub AutoInsertSketchedSymbol()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDrawing As SldWorks.DrawingDoc
Dim swSymbolDef As SldWorks.SketchedSymbolDefinition
Dim swSymbol As SldWorks.ModelView ‘ または SketchedSymbol インスタンス
‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp is Nothing Then Exit Sub
‘ 2. アクティブなドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “図面ドキュメントを開いて実行してください。”, vbCritical, “エラー”
Exit Sub
End If
‘ 3. ドキュメントタイプが「図面 (Drawing)」かチェック
If swModel.GetType <> swDocDRAWING Then
MsgBox “このマクロは図面ドキュメント専用です。”, vbCritical, “エラー”
Exit Sub
End If
Set swDrawing = swModel
‘ — 設定エリア —
Dim symbolPathName As String
Dim symbolName As String
Dim insertX As Double, insertY As Double
‘ 例: ユーザー定義のシンボル名(あらかじめ図面に登録されている、または外部ファイル)
symbolName = “表面性状記号_基本” ‘ ここを実際のシンボル名に変更してください
‘ 配置座標 (メートル単位で指定するのがAPIの鉄則です! ここ重要!)
‘ 例: X = 100mm, Y = 150mm の場合 -> 0.1m, 0.15m と指定
insertX = 0.1
insertY = 0.15
‘ ——————
‘ 4. スケッチシンボル定義を取得、または外部からロード
‘ ※今回はすでにドキュメント内に定義されている(またはドキュメントテンプレートに含まれる)前提
Set swSymbolDef = swModel.GetSketchedSymbolDefinition(symbolName)
If swSymbolDef Is Nothing Then
MsgBox “指定されたシンボル定義が見つかりません: ” & symbolName, vbCritical, “定義エラー”
Exit Sub
End If
‘ 5. トランザクションの開始(処理の高速化と確実なUndoのため)
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayAnnotationNames, False
‘ 6. シンボルの挿入実行
‘ 引数: X座標, Y座標, 角度(ラジアン), 拡大率
Dim insertedSymbol As Object
Set insertedSymbol = swModel.InsertSketchedSymbol2( _
symbolName, _
insertX, insertY, 0#, _ ‘ X, Y, 角度
1#, 1#, _ ‘ スケールX, スケールY
0, _ ‘ 矢印の有無などのオプション
False, _ ‘ テキストの引き出し線
0, 0, 0 ‘ ほかパラメータ
)
If Not insertedSymbol Is Nothing Then
‘ 成功時の処理
swModel.GraphicsRedraw2
MsgBox “シンボルの配置に成功しました!”, vbInformation, “完了”
Else
MsgBox “シンボルの配置に失敗しました。座標や定義を確認してください。”, vbExclamation, “警告”
End If
End Sub
—
3. 圧倒的な成果を出すための「3つの極意」
上記のコードをあなたの開発環境に導入するにあたり、SolidWorks APIの深淵なる仕様(罠)をいくつか解説しておきます。ここを知っているかどうかで、エンジニアとしての格が分かれます。
① 単位系は「メートル(m)」で思考せよ
SolidWorks APIの内部世界では、長さの基本単位は常に「メートル」です。画面上では「100mm」と表示されていても、コードに渡すときは必ず `0.1` と記述しなければなりません。ここをミリ単位(100)で渡すと、シンボルが宇宙の彼方に吹っ飛ぶか、巨大すぎて画面を埋め尽くします。絶対に忘れないでください。
② `SketchedSymbolDefinition` との実体・参照の関係
図面上のシンボルは、大本にある「定義(スタンプの型)」と、図面に押された「インスタンス(実際のスタンプ)」に分かれています。
- 定義 (`SketchedSymbolDefinition`): ブロックのマスターデータ。
- インスタンス (`InsertSketchedSymbol2` の戻り値): 図面上に配置された個々の図形。
一括処理で文字内容やスケールを後から動的に変更したい場合は、`InsertSketchedSymbol2` の戻り値であるインスタンスオブジェクトを保持し、そのプロパティ(テキストの割り当てなど)を操作することになります。
③ エラーハンドリングの美学
図面テンプレートが変わった瞬間、指定した名前のシンボル(`symbolName`)が消えているといったトラブルは現場で日常茶飯事です。コード内にあるように、`If swSymbolDef Is Nothing Then` でヌルチェック(存在確認)を必ず挟むこと。これが、現場で「壊れないマクロ」を作る唯一にして最大の防御策です。
—
まとめ:自動化の先にある未来へ
今回は、`SketchedSymbolDefinition` を用いた図面シンボルの自動配置の基礎と、APIを操る上での絶対的なルールを解説しました。
最初は難しく感じるかもしれませんが、座標の計算ロジックや、社内標準のエッジ選択ロジックを組み合わせれば、「ボタン一つで図面全体の表面性状と幾何公差が完璧な位置に配置される魔法のツール」を自らの手で作り上げることができます。
ここをクリアしたあなたなら、もう初学者ではありません。ぜひご自身の環境でコードを試し、日々の手作業の地獄から解放されてください。
それでは、次回の極限の知見でお会いしましょう!バッチリ使いこなしてくださいね!
