【入門編】【干渉チェックの自動レポート化】IAssemblyDoc.FeatureInterference2の結果をExcelとキャプチャ画像で出力 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。

「マクロの記録」ボタンを押してコードを生成させるだけのステージは、もう卒業しましたね。今日あなたが手に入れるのは、実務の現場で絶大な効果を発揮する「干渉チェックの自動レポート化ツール」の全貌です。

アセンブリの設計において、部品同士の干渉(めり込み)チェックは避けて通れない重要工程です。しかし、何十点、何百点とあるアセンブリから干渉箇所を手作業で見つけ出し、キャプチャを撮ってExcelに貼り付ける……想像しただけで気が遠くなりませんか?

大丈夫。今回は、`IAssemblyDoc.FeatureInterference2` という強力なAPIを使い、「干渉の検出」「ビューポートのキャプチャ」「Excelへのスマートなレイアウト出力」までをワンクリックで完結させる極上のコードをあなたに授けましょう。

ここをクリアすれば、SolidWorks VBAのオブジェクトモデルの本質が見えてきます。一緒にマスターしていきましょう!

1. 開発の全体像とアーキテクチャの理解

今回のツールは、SolidWorksとExcelの二つのアプリケーションをVBAから自在に操ります。

1. Activeなアセンブリドキュメントを取得する (`SldWorks` / `ModelDoc2` / `AssemblyDoc`)。
2. 干渉チェック(FeatureInterference2)を実行し、検出された干渉コンポーネントのペアと貫通ボリュームを取得する。
3. 干渉部分を画面にズームアップし、APIの機能を使って画像ファイルとしてキャプチャ(保存)する。
4. 起動したExcelに検査報告書のフォーマットを自動構築し、「テキストデータ」と「画像」をミリ単位で美しくレイアウトして流し込む。

この一連の流れを、エラーハンドリングを網羅した実務レベルのコードで実装します。

2. 準備:参照設定の魔法

VBAからExcelを操作するため、またはコードをスマートに書くために、事前の準備をしておくと開発効率が爆発的に上がります。

VBAエディタ(Alt + F11)を開き、[ツール] > [参照設定] から以下にチェックを入れてください。

  • Microsoft Excel XX.X Object Library (Excelを自在に操作するため)

※これを行わなくても `CreateObject` で動かせますが、今回はコードの書きやすさとインテリセンス(入力補助)の恩恵を受けるために、アーリーバインディングの視点も交えて解説します。

3. 実装コード:干渉チェック自動レポート化マクロ

以下のコードをSolidWorksの標準モジュールに貼り付けてください。実務ですぐに使えるよう、細部にまでコメントとプロの技を仕込んでいます。

Option Explicit

‘ ==============================================================================
‘ 担当アーキテクト特製:アセンブリ干渉チェック&Excelレポート自動化ツール
‘ ==============================================================================
Sub GenerateInterferenceReport()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc

‘ アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 1. アセンブリが開かれているか、かつアクティブかチェック
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType() <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbCritical, “エラー”
Exit Sub
End If

Set swAssy = swModel

‘ 2. 干渉チェックの実行 (FeatureInterference2)
‘ 戻り値は干渉部品の配列(Variant型)
Dim vInterferenceList As Variant

‘ 引数の詳細:
‘ コポーネント配列(Emptyで全指定), 計算オプション(通常は0), 貫通計算(True/False) 等
vInterferenceList = swAssy.FeatureInterference2(Empty)

If IsEmpty(vInterferenceList) Then
MsgBox “干渉は検出されませんでした!素晴らしい設計です。”, vbInformation, “結果”
Exit Sub
End If

Dim interferenceCount As Long
interferenceCount = (UBound(vInterferenceList) – LBound(vInterferenceList) + 1)

MsgBox interferenceCount & “件の干渉が検出されました。Excelレポートを作成します。”, vbInformation, “処理開始”

‘ 3. Excelの準備
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object

Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “干渉チェック結果”

‘ ヘッダーの作成
With xlWs
.Cells(1, 1).Value = “No.”
.Cells(1, 2).Value = “干渉コンポーネント A”
.Cells(1, 3).Value = “干渉コンポーネント B”
.Cells(1, 4).Value = “干渉体積 (mm^3)”
.Cells(1, 5).Value = “干渉箇所キャプチャ”

‘ ヘッダーの書式設定
.Range(“A1:E1”).Font.Bold = True
.Range(“A1:E1”).Interior.Color = RGB(220, 230, 241)
End With

‘ 一時画像保存用のパス作成
Dim tempImgPath As String
tempImgPath = Environ(“TEMP”) & “\sw_interference_temp.png”

Dim i As Long
Dim rowIdx As Long
rowIdx = 2 ‘ データの書き込み開始行

‘ 4. 干渉データのループ処理とレポートへの転記
For i = LBound(vInterferenceList) To UBound(vInterferenceList)
Dim swInterferenceObj As SldWorks.Interference
Set swInterferenceObj = vInterferenceList(i)

Dim compA As SldWorks.Component2
Dim compB As SldWorks.Component2
Set compA = swInterferenceObj.Component1
Set compB = swInterferenceObj.Component2

Dim compNameA As String
Dim compNameB As String
compNameA = IIf(compA Is Nothing, “アセンブリ自体”, compA.Name2)
compNameB = IIf(compB Is Nothing, “アセンブリ自体”, compB.Name2)

Dim volume As Double
volume = swInterferenceObj.Volume

‘ 該当する干渉部分にズームしてハイライトする処理(APIの醍醐味!)
‘ ※ここで干渉しているジオメトリを取得してビューを合わせます
Dim swModelDocExt As SldWorks.ModelDocExtension
Set swModelDocExt = swModel.Extension

‘ 干渉パーツを選択状態にしてズーム
swModel.ClearSelection2 True
If Not compA Is Nothing Then compA.Select4 False, Nothing, False
If Not compB Is Nothing Then compB.Select4 True, Nothing, False
swModel.ViewZoomToSelection

‘ ビューポートのキャプチャを保存
‘ SaveAsImageメソッドを使用 (幅, 高さ, パス)
swModelDocExt.SaveAsImage tempImgPath, 800, 600

‘ Excelへデータを書き込み
xlWs.Cells(rowIdx, 1).Value = (i + 1)
xlWs.Cells(rowIdx, 2).Value = compNameA
xlWs.Cells(rowIdx, 3).Value = compNameB
xlWs.Cells(rowIdx, 4).Value = volume

‘ 行の高さを画像が入るように調整 (約100ピクセル分)
xlWs.Rows(rowIdx).RowHeight = 80

‘ Excelに画像を挿入
Dim targetCell As Object
Set targetCell = xlWs.Cells(rowIdx, 5)

Dim pic As Object
Set pic = xlWs.Pictures.Insert(tempImgPath)

With pic
.Top = targetCell.Top + 2
.Left = targetCell.Left + 2
.Height = 76 ‘ 行の高さに合わせる
.Width = 100
End With

‘ 次の行へ
rowIdx = rowIdx + 1

‘ メモリ解放
Set swInterferenceObj = Nothing
Next i

‘ 列幅の自動調整
xlWs.Columns(“A:D”).AutoFit
xlWs.Columns(“E”).ColumnWidth = 20

‘ 一時ファイルの削除
If Dir(tempImgPath) <> “” Then Kill tempImgPath

MsgBox “レポートの作成が完了しました!”, vbInformation, “完了”

‘ オブジェクトのクリーンアップ
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
End Sub

4. チーフアーキテクトが解説するコードの急所とポイント

ここからは、コードの裏側にある「プロの知見」をいくつかシェアします。これを理解しておくと、他のAPIを扱うときにも応用が利くようになります。

① `FeatureInterference2` の圧倒的な破壊力

マクロの記録では、干渉チェックのダイアログが立ち上がって止まってしまいます。しかし、`AssemblyDoc.FeatureInterference2` メソッドを使えば、UIを介さずにバックグラウンド(メモリ上)で一瞬にして干渉計算を行い、`Interference` オブジェクトの配列として結果を返してくれます。
この「UIをバイパスして直接データ構造にアクセスする」というアプローチこそが、業務自動化の極意です。

② `SaveAsImage` によるビューポートの切り取り

検出された干渉ペア(Component1 と Component2)を `Select4` で選択し、`ViewZoomToSelection` で画面いっぱいにズームアップさせています。その直後に `ModelDocExtension.SaveAsImage` を呼び出すことで、「今まさに問題となっている箇所をピンポイントで切り抜いた画像」を瞬時に生成できます。
人間が手作業で「画面キャプチャ → ペイントでトリミング → Excelに貼り付け」をやっていた作業が、わずかコンマ数秒で自動化される瞬間です。

③ Excelとのスマートな連携(レイトバインディングの採用)

コード内では `CreateObject(“Excel.Application”)` を使っています。これにより、実行環境のExcelのバージョン違い(Office 2016, 2019, 365など)による参照設定の競合エラー(コンパイルエラー)を華麗に回避できます。実務で配布するマクロにおいて、この「環境依存エラーへの耐性」は非常に重要です。

5. 陥りやすい罠とトラブルシューティング

現場でこのマクロを動かす際、初心者がつまずきやすいポイントを先回りして解説します。

  • Q. 「コンポーネントが見つかりません」というエラーが出る
  • A. アセンブリ内に「抑制されたコンポーネント」や「軽量コンポーネント」が含まれていると、干渉計算が正しく行われない場合があります。実行前にアセンブリを「図解・完全解決」状態にしておくのが安全です。
  • Q. Excelの画像位置がズレる
  • A. `Pictures.Insert` はリンク画像として挿入されることがあるため、Excelの仕様によっては環境が変わると画像が消えることがあります。より厳密に制御したい場合は `Shapes.AddPicture` を用いるのがプロの選択ですが、まずは今回のシンプルなコードで挙動を確認してみてください。

6. おわりに:ここから先の世界へ

お疲れ様でした!このコードを動かした瞬間、あなたの設計業務のスピードは文字通り何倍にも跳ね上がったはずです。

SolidWorks VBAの基本、そしてAPIオブジェクトモデルの扱い方。
「オブジェクトを取得する」⇒「メソッドで処理を命令する」⇒「結果を外部(Excelなど)に出力する」というサイクルをマスターすれば、もう怖いものはありません。

次は、これをボタン一つでリボンメニューから呼び出せるようにアドイン化したり、PDFレポートとして出力する機能を追加してみるのも面白いでしょう。

あなたの自動化エンジニアとしての第一歩を、心から応援しています。
それでは、また次の極限の知見でお会いしましょう!

タイトルとURLをコピーしました