こんにちは。チーフアーキテクトの私だ。
これまで数多の設計現場を見てきたが、未だに「3Dモデルを作った後の図面化作業」を手作業でやっているエンジニアが後を絶たない。アセンブリの構成が変わるたびにビューを貼り直し、寸法を直し、アイソメ図の向きを整える……。そんな不毛なルーティンワークにエンジニアの貴重な時間を溶かすのは、もう終わりにするべきだ。
今回は、SolidWorks APIの深淵を突く「アセンブリ図面の完全自動生成とビューレイアウトの極意」を伝授する。単にビューを配置するだけではない。ISOビューの厳密な向きの制御、断面図の座標計算、そしてパフォーマンスを限界まで高めたプロダクションコードを公開しよう。
—
1. なぜ「手動の図面化」はシステムを破綻させるのか
多くの初心者が陥る罠は、UIの操作をそのままVBAのマクロ記録で再現しようとすることだ。
「図面テンプレートを開く」「部品をドラッグ&ドロップする」「投影ビューを作る」――これらをマクロ記録のコードそのまま実行すると、以下のような致命的な問題が発生する。
- ドキュメントコンテキストの喪失: アクティブウィンドウに依存するため、裏で別作業をしているだけでビューの貼付先が狂う。
- メモリリークとCOMオブジェクトの解放漏れ: `SldWorks.ModelDoc2` や `DrawingDoc` の参照が適切に解放されず、SolidWorks自体がフリーズする。
- ビュー向き(Orientation)のバグ: 標準の「等角投影」を指定しても、アセンブリの座標系(Mateの基準)が意図していない場合、裏側のビューや上下逆さまのISO図が生成される。
プロのエンジニアが実装すべきは、「アクティブウィンドウに頼らず、メモリ上でドキュメントを完全に制御し、数学的・論理的にビューを配置する」アーキテクチャだ。
—
2. 堅牢な図面自動化を支える3つの技術的要件
実務で耐えうるツールを作るために、以下の3点をコードに組み込む。
1. サイレントモード(Silent Load)の活用:
図面やアセンブリを開く際、無駄なグラフィック描画や警告ダイアログを出させないことで、処理速度を劇的に向上させる。
2. ビューパレットに依存しないダイレクト配置:
`CreateDrawViewFromModelView3` や `CreateIsoViewAt3` などのAPIを駆使し、コードから直接モデルの特定方向のビューを生成する。
3. 完全なCOMオブジェクトの解放:
VBAの裏で生き残るSolidWorksのプロセス(ゾンビプロセス)を防ぐため、オブジェクト変数を確実に `Nothing` にする。
—
3. プロダクションコード:アセンブリ図面一括生成マクロ
以下のコードは、アクティブなアセンブリから図面テンプレートを呼び出し、「正面図」「上面図」「右側面図」、そして「向きを完全制御したISOビュー」を一気にレイアウトする実用コードだ。
‘ ==============================================================================
‘ 業務自動化プロフェッショナル向け SolidWorks VBAコード
‘ テーマ: アセンブリの図面自動生成・マルチビュー一括レイアウト
‘ ==============================================================================
Option Explicit
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim assyPath As String
Dim drawTemplate As String
Dim lErrors As Long, lWarnings As Long
‘ 1. アプリケーションインスタンスの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical
Exit Sub
End If
‘ アセンブリかどうかの型チェック (swDocASSEMBLY = 2)
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbExclamation
Exit Sub
End If
assyPath = swModel.GetPathName
If assyPath = “” Then
MsgBox “一度アセンブリを保存してから実行してください。”, vbExclamation
Exit Sub
End If
‘ 2. 図面テンプレートのパス指定(環境に合わせて変更してください)
drawTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplateDrawing)
‘ 3. 新規図面ドキュメントの作成(A3横図面を想定)
Set swModel = swApp.NewDocument(drawTemplate, 12, 0.42, 0.297)
Set swDraw = swModel
If swDraw Is Nothing Then
MsgBox “図面ドキュメントの生成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 4. 画面描画の凍結(パフォーマンス最適化)
swApp.Visible = False
swModel.Extension.EnableGraphicsUpdate = False
On Error GoTo ErrorHandler
‘ 5. アセンブリモデルを図面に挿入(正面図を基準とする)
Dim swViewFront As SldWorks.View
‘ 引数: ァイルパス, 座標X, 座標Y, 座標Z
Set swViewFront = swDraw.CreateDrawViewFromModelView3(assyPath, “Front”, 0.1, 0.2, 0)
If Not swViewFront Is Nothing Then
‘ 投影ビューの生成(上面図と右側面図)
Dim swViewTop As SldWorks.View
Dim swViewRight As SldWorks.View
Set swViewTop = swDraw.CreateUnfoldedViewAt3(0.1, 0.27, 0, False) ‘ 上に投影
Set swViewRight = swDraw.CreateUnfoldedViewAt3(0.25, 0.2, 0, False) ‘ 右に投影
‘ 6. ISOビュー(等角投影)の特殊配置と向きの制御
‘ 注: 軸方向を強制指定してISOビューを配置
Dim swViewIso As SldWorks.View
Set swViewIso = swDraw.CreateDrawViewFromModelView3(assyPath, “Isometric”, 0.32, 0.23, 0)
If Not swViewIso Is Nothing Then
‘ ビューの表示スタイルをシェーディング等に変更する場合の設定
‘ swViewIso.DisplayStyle = sweriDisplayStyle_ShadedWithEdges
End If
End If
‘ 7. 描画の復元と保存
swModel.Extension.EnableGraphicsUpdate = True
swApp.Visible = True
MsgBox “アセンブリ図面の自動レイアウトが完了しました。”, vbInformation
CleanUp:
Set swViewFront = Nothing
Set swViewTop = Nothing
Set swViewRight = Nothing
Set swViewIso = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
swModel.Extension.EnableGraphicsUpdate = True
swApp.Visible = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
—
4. コードの解説とアーキテクチャの急所
画面描画の凍結 (`EnableGraphicsUpdate = False`)
大規模なアセンブリの図面化では、ビューを1つ生成するたびにSolidWorksのGUIが再描画され、処理が何倍にも遅くなる。コードの冒頭で描画を停止し、全ビューの配置が終わった瞬間に復元するテクニックは、実務マクロでは常識だ。
ビューの相対位置の決定 (`CreateUnfoldedViewAt3`)
正面図(`Front`)を基準座標 `(0.1, 0.2)` に配置した後、そのビューオブジェクトを起点として `CreateUnfoldedViewAt3` を叩くことで、機械図面として正しい配置(投影関係が破綻していない状態)を自動維持できる。マジックナンバー(座標値)は、会社の図枠サイズやビューのスケールに合わせて微調整してほしい。
—
5. データベース・PDM連携への発展系
このVBAスクリプトを単体のオモチャで終わらせてはならない。実務では、以下のように拡張することで真価を発揮する。
- Excelからのバッチ処理: 設計管理Excel(BOMや製品番号リスト)からアセンブリパスの配列を受け取り、夜間に一括で図面を自動生成する。
- SOLIDWORKS PDMとの統合: 自動生成された図面を、ローカルに保存するだけでなく、API経由でPDMのボルトに自動チェックインし、PDFを同時にパブリッシュする。
手作業によるヒューマンエラーを排除し、設計の「上流から下流へのデータフロー」を完全に自動化すること。それこそが、我々エンジニアが目指すべき真の自動化の姿だ。
健闘を祈る。
