こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して、出てきたコードを眺めるだけの日々はもう卒業しましょう。今日あなたにお伝えするのは、単なる「操作の自動化」ではありません。SolidWorksの内部エンジンと対話し、設計の品質そのものをプログラムの力で跳ね上げる「最先端のエンジニアリング」です。
テーマは「アセンブリの干渉チェック結果の自動パースと、3D空間へのマークアップ自動配置」。
「干渉チェックをやって、レポートを出して、一つずつ目視で確認して……」なんてアナログな作業、もうあなたの貴重な時間を奪わせません。APIの生データをVBAで鮮やかに料理し、問題のある交差領域を3D空間上にビジュアルとして浮かび上がらせる――そんな鳥肌モノのソリューションを一緒に作り上げていきましょう。
ここをクリアすれば、あなたのVBAスキルは間違いなくアセンブリ自動化のエキスパート領域に到達します。さあ、深呼吸して、最高のコードを書きに行きましょう!
—
1. なぜ「干渉チェックの自動化」が設計現場のゲームチェンジャーなのか?
大規模なアセンブリを設計しているとき、最も恐ろしいのが「部品同士の意図しないめり込み(干渉)」です。
SolidWorksには標準で「干渉チェック(Interference Detection)」機能がありますが、次のようなフラストレーションを感じたことはありませんか?
- 干渉部品のリストがあっても、それが3D空間のどこにあるのか直感的に分かりにくい。
- 設計レビューの資料を作るために、スクリーンショットを撮って、矢印を描き込んで……という作業に膨大な時間がかかる。
これをAPIで完全に自動化します。
「干渉チェックの実行 ➔ 結果配列の解析(パース) ➔ 干渉位置の3D座標取得 ➔ 空間への注記(3Dマークアップ)の自動配置」
この一連の流れをVBAで一気通貫させることで、設計ミスをゼロにし、レビューのスピードを劇的に加速させることができます。
—
2. アーキテクチャの全体像:SolidWorks APIの急所を押さえる
今回のコードで鍵となるのは、`AssemblyDoc::InterferenceDetection2` メソッドです。
このメソッドは非常に強力ですが、返ってくるデータ構造(配列)が少しクセモノです。
1. 干渉しているボディのペアが返される。
2. 同時に、干渉部分の体積(Volume)や、干渉領域の重心座標(Centroid)などの幾何情報が取得できる。
3. 取得した座標を元に、アセンブリの3D空間上に「3D注記(Annotation)」や「参照座標系(Reference Axis/Point)」を動的に生成する。
オブジェクトのライフサイクルや、ドキュメントのコンテキストを正しく理解していれば、恐れることは何もありません。それでは、実際のコードを見ていきましょう。
—
3. 実装コード:干渉チェック&3Dマークアップ自動化マクロ
以下のコードをSolidWorksのVBAエディタ(Module)に貼り付けてください。実務でそのまま使えるよう、細部まで妥協なく作り込んでいます。
‘ =================================================================================
‘ módulo名: ModInterferenceMarkup
‘ 概要: アセンブリの干渉チェックを実行し、干渉領域の重心に3Dマークアップを自動生成する
‘ 執筆者: チーフアーキテクト
‘ =================================================================================
Option Explicit
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
‘ アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 安全装置:ドキュメントが開かれているか、かつアセンブリであるかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリ文書でのみ実行可能です。”, vbExclamation, “警告”
Exit Sub
End If
Set swAssy = swModel
‘ —————————————————————————–
‘ 1. 干渉チェック機能の設定と実行
‘ —————————————————————————–
Dim swIntMgr As SldWorks.InterferenceDetectionMgr
Set swIntMgr = swAssy.InterferenceDetectionMgr
‘ 干渉チェックのオプション設定(必要に応じてカスタマイズ)
swIntMgr.TreatCoincidenceAsInterference = False ‘ 面の接触を干渉とみなさない
swIntMgr.CreateMultiInterferenceFolder = True ‘ 複数干渉フォルダを作成
swIntMgr.IgnoreHiddenBodies = True ‘ 非表示ボディは無視
‘ 干渉チェックの計算を実行(アセンブリ内の全コンポーネント対象 = Nothing)
Dim vIntList As Variant
vIntList = swIntMgr.Run()
If IsEmpty(vIntList) Then
MsgBox “干渉は検出されませんでした。素晴らしい設計です!”, vbInformation, “干渉チェック完了”
Exit Sub
End If
‘ 検出された干渉ペアの数を計算(配列の要素数を評価)
Dim intCount As Long
intCount = swIntMgr.GetInterferenceCount()
MsgBox “干渉が ” & intCount & ” 件検出されました。3Dマークアップを生成します。”, vbInformation, “処理継続”
‘ —————————————————————————–
‘ 2. 干渉結果のパース(解析)と3Dマークアップの配置
‘ —————————————————————————–
Dim i As Long
Dim swInterference As SldWorks.Interference
Dim vCentroid As Variant
Dim intVolume As Double
Dim noteText As String
‘ 干渉マネージャーから結果オブジェクト配列を取得
Dim vInterferences As Variant
vInterferences = swIntMgr.GetInterferences()
For i = LBound(vInterferences) To UBound(vInterferences)
Set swInterference = vInterferences(i)
‘ 干渉領域の体積を取得
intVolume = swInterference.Volume
‘ 干渉領域の重心座標(X, Y, Zの配列 [meters])を取得
vCentroid = swInterference.Centroid
If Not IsEmpty(vCentroid) Then
‘ 注記文字列の組み立て(体積を立方ミリメートルに変換して表示)
noteText = “【干渉検出】” & vbCrLf & _
“体積: ” & Format(intVolume 1000000000#, “0.00”) & ” mm³”
‘ 3D空間へ注記を配置するサブルーチンを呼び出し
Call Create3DAnnotation(swModel, vCentroid(0), vCentroid(1), vCentroid(2), noteText)
End If
Next i
‘ 干渉チェックマネージャーを閉じる(メモリリーク防止の極意!)
swIntMgr.Clear
swModel.EditRebuild3 ‘ モデルの再構築
MsgBox “すべての干渉位置への3Dマークアップ生成が完了しました。”, vbInformation, “完了”
End Sub
‘ =================================================================================
‘ 補助プロシージャ: 指定した3次元座標に3D注記(メモ)を作成する
‘ =================================================================================
Private Sub Create3DAnnotation(swModel As SldWorks.ModelDoc2, ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal text As String)
Dim swPart As SldWorks.PartDoc
Dim swAnnotation As SldWorks.Annotation
Dim swNote As SldWorks.Note
‘ 3D空間上の指定座標にテキスト注記を挿入
‘ 引数: Text, X, Y, Z, Angle, Option, Style
Set swNote = swModel.Insert3DNote(text)
If Not swNote Is Nothing Then
Set swAnnotation = swNote.GetAnnotation()
If Not swAnnotation Is Nothing` Then
‘ 注記のアンカー位置(配置座標)を設定
Dim bRet As Boolean
bRet = swAnnotation.SetPosition3(x, y, z)
‘ 引き出し線(リーダー)を有効にするなどの装飾もここで行えます
swAnnotation.SetLeader3 swLeaderStyle_Straight, 0, True, False, False, False
End If
End If
End Sub
—
4. コードの深掘り:プロが教える「ここがキモ」
上記のコードで、SolidWorks VBAを極めるための非常に重要なポイントがいくつかあります。
① `swIntMgr.Clear` を絶対に忘れないこと(メモリリークの回避)
干渉チェックAPIを使用すると、SolidWorksの内部メモリに膨大な幾何データ(BRep情報)が保持されます。処理が終わった後に `swIntMgr.Clear` を呼ばないと、SolidWorksの動作が重くなったり、最悪の場合はクラッシュする原因になります。リソースの解放はプログラマの責任です。
② 座標系は「メートル法」であることを忘れない
SolidWorksのAPIがやり取りする数値の単位は、内部的に常に「メートル(m)」です。
コード内で `intVolume 1000000000#` としているのは、m³ を mm³ に換算するためです。もし座標を表示・利用する際にも、単位系(mmなのかmなのか)の変換ミスに注意してください。
③ 3D注記(`Insert3DNote`)の魔法
アセンブリの2D図面ではなく、3Dモデル空間そのものに文字や記号を配置するのが `Insert3DNote` です。設計レビューの際、モデルをグリグリと回転させながら「あ、ここに干渉があるんだな」と一目で分かるため、チーム全体のコミュニケーションコストが劇的に下がります。
—
5. よくあるエラーと華麗な回避策
- エラー:「オブジェクト変数が設定されていません。(Run-time error ’91’)」
- 原因: アクティブなドキュメントが開かれていない状態、またはアセンブリ以外のパーツ図面などでマクロを実行したときに発生します。
- 対策: コード前半にある安全装置(`If swModel.GetType <> swDocASSEMBLY Then …`)が確実に機能しているか確認してください。
- 干渉しているのに「干渉なし」と判定される
- 原因: 接触面(Coincident)を干渉とみなすかどうかの設定が影響しています。設計の意図に合わせて `swIntMgr.TreatCoincidenceAsInterference` の値を `True` または `False` に切り替えてください。
—
最後に:自動化の先にある「真のエンジニアリング」へ
お疲れ様でした!ここまで読み進め、コードの意味を理解したあなたなら、もう「マクロの記録」に頼るだけの初心者ではありません。APIの構造を紐解き、設計の面倒なルーティンを自分の手でエレガントに自動化する「エンジニア」そのものです。
ここをクリアすれば、SolidWorks VBAの基本はバッチリです。さらにイベントドリフトな実装や、外部データベース(ExcelやAccess)との連携へステップアップしていくことも容易でしょう。
あなたの自動化ライフが、よりクリエイティブでワクワクするものでありますように。それでは、次の現場でお会いしましょう!
