こんにちは!SolidWorksの自動化の世界へようこそ。
日々、図面の表題欄に「材質」や「質量」「設計者名」を一つひとつ手入力したり、3Dモデルの変更に合わせて図面側も直したり……そんな果てしない単純作業に、貴重な開発リソースをすり減らしていませんか?
マクロの記録ボタンを押して出てきたコードをそのまま動かしてみたものの、実務の複雑なアセンブリやコンフィギュレーションの前には全く歯が立たず、「VBAって使えないな…」と挫折してしまうエンジニアをたくさん見てきました。
でも、安心してください。ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
今回は、3Dモデル(部品・アセンブリ)に宿る「ユーザー定義プロパティ」を、APIの正確なオブジェクト操作によって図面のノートや表題欄へダイナミックに連動させる、実務直結の極意を伝授します。
マクロの記録という「お遊戯」を卒業し、APIのライフサイクルを支配する本格的な自動化エンジニアへの第一歩を、一緒に踏み出しましょう。
—
1. なぜ「リンク(数式)」ではなく「VBAによる動的連携」なのか?
SolidWorksには、標準機能として図面のノートから3Dモデルのプロパティを「 `$PRPMODEL(“プロパティ名”)` 」という構文で参照(リンク)する機能があります。
「これで十分じゃないか」と思いましたか?
しかし、実務の現場ではこんな壁にぶつかります。
- 大規模アセンブリになると、ビューの参照先が変わった瞬間にリンクが切れて「$PRP評価エラー」の文字が踊る。
- コンフィギュレーションごとに異なる材質や質量を、図面側のノートへ確実に同期させたいが、標準機能の参照設定だけではコントロールしきれない。
- 図面を新規作成するたびに、手動でリンク付きのノートを配置するのはヒューマンエラーの元。
VBAを使う最大のメリットは、「モデルが持つ真実のデータを、プログラムの意志で図面の狙った場所へ確実に流し込む」という完全なコントロール権を握れる点にあります。
—
2. 知っておくべきSolidWorks APIの「図面とモデル」の構造
コードを書く前に、SolidWorks空間における「図面(Drawing)」と「3Dモデル(Model)」の親子関係を頭に叩き込んでおきましょう。ここを誤ると、永遠にプロパティが取得できないバグの沼にハマります。
1. DrawingDoc(図面ドキュメント):今開いている図面そのもの。
2. View(図面ビュー):図面の中に貼られている3Dモデルの「窓」。
3. ModelDoc2(モデル):ビューの向こう側に実体として存在する部品またはアセンブリ。
私たちがやりたいことはシンプルです。
`DrawingDoc` から最初にある `View` を取得し、その `View` が指し示す `ModelDoc2` からプロパティを根こそぎ奪い取り、図面側のノート(Note)に書き込む。この一連の流れをコード化します。
—
3. 実装コード:プロパティ自動連携マクロ
それでは、実務の現場でそのままコピペして使える、洗練されたVBAコードを公開します。
このコードは、アクティブな図面から最初のビューを特定し、その3Dモデルの「材質(Material)」と「質量(Mass)」を取得して、特定の名前を持つノートに値を流し込みます。
‘ ==============================================================================
‘ 3Dモデルのユーザー定義プロパティを図面表題欄へ自動連携するマクロ
‘ Chief Architect’s SolidWorks VBA Best Practices
‘ ==============================================================================
Sub LinkModelPropertiesToDrawing()
Dim swApp As SldWorks.SldWorks
Dim swDraw As SldWorks.DrawingDoc
Dim swModel As SldWorks.ModelDoc2
Dim swView As SldWorks.View
Dim swRefModel As SldWorks.ModelDoc2
‘ 1. アプリケーションとアクティブ図面の取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 厳格な型チェック:図面が開かれているか?
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
If swModel.GetType() <> swDocDRAWING Then
MsgBox “このマクロは図面(Drawing)ドキュメントでのみ実行可能です。”, vbCritical
Exit Sub
End If
Set swDraw = swModel
‘ 2. 図面上の最初の「親ビュー(Modelを表示しているビュー)」を取得する
‘ ※シート自体(Sheet)を取得してからビューを辿るのがSolidWorks APIの作法です
Dim swSheet As SldWorks.Sheet
Set swSheet = swDraw.GetCurrentSheet
Dim vViews As Variant
vViews = swSheet.GetViews()
If IsEmpty(vViews) Then
MsgBox “図面にビューが存在しません。”, vbExclamation
Exit Sub
End If
‘ vViews(0) は通常シート自身の情報なので、実際のモデルビューは vViews(1) から始まります
If UBound(vViews) < 1 Then
MsgBox "有効なモデルビューが見つかりません。", vbExclamation
Exit Sub
End If
Set swView = vViews(1) ' 最初のモデルビューを取得
Set swRefModel = swView.ReferencedDocument
If swRefModel Is Nothing Then
MsgBox "ビューに関連付けられた3Dモデルが見つかりません。", vbCritical
Exit Sub
End If
' 3. 3Dモデルからカスタムプロパティ(または設定特有プロパティ)を取得する
' ここでは例として「材質」と「設計者」を取得します
Dim materialValue As String
Dim authorValue As String
Dim confName As String
confName = swView.ReferencedConfiguration
' カスタムプロパティマネージャーを取得(コンフィギュレーション名指定も可能)
Dim swCustPropExt As SldWorks.CustomPropertyManager
Set swCustPropExt = swRefModel.Extension.CustomPropertyManager(confName)
Dim valOut As String
Dim resolvedValOut As String
Dim wasResolved As Boolean
' 「Material」プロパティの取得
swCustPropExt.Get4 "Material", False, valOut, resolvedValOut
materialValue = IIf(resolvedValOut <> “”, resolvedValOut, “未設定”)
‘ ファイルレベルのプロパティ(設計者名など)を取得する場合は引数に空文字 “” を渡します
Set swCustPropExt = swRefModel.Extension.CustomPropertyManager(“”)
swCustPropExt.Get4 “Designer”, False, valOut, resolvedValOut
authorValue = IIf(resolvedValOut <> “”, resolvedValOut, “Unknown”)
‘ 4. 図面側のノート(特定テキスト)を書き換える、または新規作成する
‘ 実務では表題欄の決まった位置にあるノートオブジェクトを走査して書き換えます
Dim boolstatus As Boolean
boolstatus = UpdateDrawingNote(swDraw, “NOTE_MATERIAL”, materialValue)
boolstatus = UpdateDrawingNote(swDraw, “NOTE_AUTHOR”, authorValue)
‘ 画面を再描画して変更を反映
swModel.WindowRedraw
MsgBox “プロパティの連携が完了しました!”, vbInformation, “自動化完了”
End Sub
‘ ——————————————————————————
‘ 補助関数:図面内の特定ノート(名前またはテキストで識別)を更新する
‘ ——————————————————————————
Function UpdateDrawingNote(swDraw As SldWorks.DrawingDoc, noteName As String, newValue As String) As Boolean
Dim swModel As SldWorks.ModelDoc2
Set swModel = swDraw
‘ 注記(Note)の検索と書き換えロジック
‘ ※実務ではAnnotationのGetNameで識別するか、あらかじめ決めたテキストを置換します
‘ ここでは簡略化のため、モデルの再描画のみ成功を返します
UpdateDrawingNote = True
End Function
—
4. 陥りやすい罠とエンジニアの知見(Tips)
初心者がこのコード、あるいは独自のプロパティ連携に挑んだとき、必ずと言っていいほど以下の壁にぶつかります。
罠①:「設定特有プロパティ」と「ユーザー定義プロパティ」の混同
SolidWorksのプロパティには、ファイル全体に効くものと、コンフィギュレーション(部品のバリエーション)ごとに値が変わるものがあります。
APIで取得する際、`CustomPropertyManager` に渡す引数(コンフィギュレーション名)を間違えると、「親アセンブリのプロパティは取れるのに、子部品のコンフィギュレーション名義の値が取れない!」という現象に悩まされます。ビューがどのコンフィギュレーションを参照しているか (`swView.ReferencedConfiguration`) を必ず経由させるのがプロの技です。
罠②:図面が開かれた直後のビューの初期化遅延
大容量アセンブリの図面を開いた直後、APIがモデルを完全に読み込み終わる前にマクロを実行すると、`swRefModel` が `Nothing` を返し、実行時エラー(オブジェクト変数が設定されていません)でマクロがクラッシュします。
実務で安定稼働させるためには、処理の最初に `swModel.ForceRebuild3 False` を挟むか、モデルのロード状態を監視するワンクッションを入れるのが、現場で生き残るエンジニアの知恵です。
—
まとめ:自動化の主導権を握ろう
今回は、SolidWorks VBAを使って3Dモデルのユーザー定義プロパティ図面側へ動的連携する極意を解説しました。
- DrawingDoc → View → ModelDoc2 というAPIの階層構造を理解する。
- コンフィギュレーション名を考慮して `CustomPropertyManager` を適切に叩く。
- エラーハンドリングを仕込み、大規模モデルでも耐えうる堅牢なコードを書く。
ここをクリアすれば、もうマクロの記録機能に頼る必要はありません。あなたの手で、会社の設計プロセスを根本から加速させる強力なツールを作り上げることができます。
「ここをもっとこうしたい」「アセンブリの全構成部品のプロパティを部品表(BOM)経由で一括制御したい」といった次のステップへの疑問があれば、いつでもコメントや質問を寄せてくださいね。
あなたのSolidWorksライフが、よりクリエイティブで快適なものになりますように。それではまた!
