はじめに
CCTが提供している調達DX(調達DX ~見積もり自動化技術~ | CCT)ではAIや3D CADのデータを使用して製造業の見積もりの自動化技術を提供しています。技術開発の際、SOLIDWORKSなどで3D CADデータを操作することがしばしばあります。例えば、モデル拡張子の変換や、モデル情報の抽出、コンフィグレーションの切り替えなどがあります。今回は一部事例を紹介したいと思います。
本記事は、この記事(SOLIDWORKS APIで自動化してみよう)の続編です。
SOLIDWORKSとは?
Dassault Systèmes SolidWorks Corporationから発売されている3D CADソフトウェアです。[Wikipedia] メジャーな3D CADソフトウェアのうちの1つであり、「使いやすさ」を主軸に製品開発が行われています。3D CADシステムで達成したい主な操作はすべて可能です。また、APIが豊富に公開されているため、これらを使用することで、操作を自動化するマクロを作成することができます。マクロを利用することで、繰り返し行う作業を自動化することができ、SOLIDWORKSをさらに便利に使うことができます。
マクロの作成
仕様について
今回は、3D CADモデルを読み込み、その情報をExcelに出力するマクロを作ってみます。社内でのみ使用する想定なので、外見などは簡単に済ませます。詳細は以下です。
◆作りたい機能とその背景
今回作成するのは「指定したフォルダに存在する3D CADモデルについて、その質量特性をExcelに出力する機能」です。業務上モデルの質量特性を収集する機会が多く、今まではSOLIDWORKSの機能で都度確認しExcelに転記していましたが、マクロで完結できると大変便利です。VBAを用いることで、Excel APIはSOLIDWORKS上から使用可能です。また今回は、Excel出力が可能であることを簡潔に示すため、対象ファイル形式をSLDPRTに限定しています。
それでは、マクロを作成していきましょう。SOLIDWORKS2021で動作することを目指します。
SOLIDWORKSでのマクロ作成方法(前回記事からの追加手順のみ)
SOLIDWORKSでのマクロ作成方法については、前回記事を参照してください。
ここでは、Excel APIを用いるために必要な追加手順についてのみ言及します。
◆参照設定の追加
Excel APIを用いた開発するにあたり、必要ライブラリへのパスを追加で繋ぎこむ必要があります。これを「参照設定の追加」と呼びます。
SOLIDWORKS画面上部のツールバーから「ツール」→「参照設定」へと遷移し、Microsoft Excel Object Libraryを追加します。これを追加することで、Excel APIを使用することが可能になります。
今回使用したPCではver16.0ですが、ここはお使いのPCによって適宜変更してください。
◆入力フォームを作成しよう
前項と同様、詳細については、前回記事を参照してください。
今回は、以下の操作ができることを目指します。
- フォルダを選択
- 「Start」ボタンを押下
- フォルダ内に”モデル名+.xlsx”がそれぞれ出力される
ここでは結果のみ掲載します。社内ツールのため、簡素なUIにしています(センスもないので……)
◆処理の実装
SWP形式はVBAと同様に実装することができます。
フォルダ読み込み
こちらは前回記事からの流用で済ませました。このように機能ごとに実装を分割することによって、別プログラムでも使用できる場合があります。ぜひ検討してみて下さい。
ファイル読み込み
フォルダ内のファイルのうち、SLDPRTファイルの場合にその質量特性をExcel出力するように実装しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
' [Start]ボタン押下後の処理 Private Sub CommandButton1_Click() ' folderPathを取得する Dim folderPath As String folderPath = TextBox1.Text Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Set swApp = Application.SldWorks ' 処理した件数をカウント Dim count As Integer For Each file In fso.GetFolder(folderPath).files 'ファイルの拡張子を取得する Dim nameArray() As String nameArray = Split(file.path, ".") modelType = nameArray(UBound(nameArray)) If modelType = "SLDPRT" Then ' エクセルに質量特性を出力する関数 Call ToExcel(folderPath, fso.GetFileName(file)) End If count = count + 1 Next ' 出力件数の表示 MsgBox Str(count) & "件出力しました!" Unload Me End Sub |
質量特性のExcel出力
質量特性の取得メソッドはSOLIDWORKS APIで提供されています。また、Excelファイル新規作成、セル書き込み、出力などの機能はExcel APIで提供されています。これらのAPIを組み合わせて、マクロを作っていきましょう。今回はToExcel()関数として実装しています。
〇情報の取得
マクロを動かすためにはまず、SOLIDWORKSオブジェクトを取得します。これは
1 |
Set swApp = Application.SldWorks |
で可能です。これにより、SOLIDWORKSオブジェクトswAppを使用してSOLIDWORKSのAPIを使うことができます。また、立ち上げている3D CADモデルの情報を取得する場合はModelDocメソッドを使用します。
〇ファイルを開く
今回はOpendoc6というSOLIDWORKS APIを使って3D CADファイルを開くことにします。引数で挙動をいくつか制御可能です。
〇質量特性の取得
CreateMassProperty2というSOLIDWORKS APIを使って質量特性を取得可能です。またこのAPIを使用するためにはExtension Propertyを経由します。
1 |
Set myMassProp = swModel.Extension.CreateMassProperty2 |
〇Excelワークシートの新規作成 / 保存
ここからはExcel APIを使用します。Microsoft Learnというページを検索すると、Excelファイルの新規作成についてはAddメソッドを使用すると実現可能であることが分かります。対して、Excelファイルの保存については、SaveAsメソッドを使用すると実現可能であることが分かります。
1 2 3 4 |
'closeFileNameは事前に決める Dim wb As Workbook Set wb = Workbooks.Add wb.SaveAs closeFileName |
〇セルへの書き込み
上記手順で作成したエクセルにおいて、書き込みたい領域のセルをアクティブにします。これはActivateメソッドやRangeメソッドにて実現可能です。
今回は手軽に作る社内ツールということで、横着してある程度ハードコーディング(コード内に番号などを直接実装すること)しています。
単位系などは、お使いのSOLIDWORKSや、出力したい単位に合わせて適宜変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
wb.Worksheets("Sheet1").Activate wb.Worksheets("Sheet1").Range("A1").Value = "Mass[g]" wb.Worksheets("Sheet1").Range("B1").Value = myMassProp.Mass * 1000 wb.Worksheets("Sheet1").Range("A2").Value = "Volume[cm3]" wb.Worksheets("Sheet1").Range("B2").Value = myMassProp.Volume * 100 * 100 * 100 wb.Worksheets("Sheet1").Range("A3").Value = "SurfaceArea[cm2]" wb.Worksheets("Sheet1").Range("B3").Value = myMassProp.SurfaceArea * 100 * 100 ' WorkSheetを閉じる wb.Close True |
これでマクロが作成できました。これらを実装したコードを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim extn As SldWorks.ModelDocExtension Dim myMassProp As SldWorks.MassProperty2 'Excel Dim wb As Workbook Private Sub ToExcel(ByVal folderPath As String, ByVal filePath As String) 'モデルを開く Dim openFileName As String Dim closeFileName As String 'ファイル名の作成 '\\→\にして下さい openFileName = folderPath & "\\" & filePath closeFileName = openFileName & ".xlsx" Dim fileError As Long Dim fileWarning As Long Set swModel = swApp.OpenDoc6(openFileName, swDocPART, swOpenDocOptions_Silent, "", fileError, fileWarning) Set extn = swModel.Extension Set myMassProp = extn.CreateMassProperty2 ' Create New File Dim wb As Workbook Set wb = Workbooks.Add wb.SaveAs closeFileName 'Import Excel info wb.Worksheets("Sheet1").Activate wb.Worksheets("Sheet1").Range("A1").Value = "Mass[g]" wb.Worksheets("Sheet1").Range("B1").Value = myMassProp.Mass * 1000 wb.Worksheets("Sheet1").Range("A2").Value = "Volume[cm3]" wb.Worksheets("Sheet1").Range("B2").Value = myMassProp.Volume * 100 * 100 * 100 wb.Worksheets("Sheet1").Range("A3").Value = "SurfaceArea[cm2]" wb.Worksheets("Sheet1").Range("B3").Value = myMassProp.SurfaceArea * 100 * 100 wb.Close True swApp.CloseDoc (openFileName) End Sub Private Sub CommandButton1_Click() 'FolderPathとFileNameを指定する Dim folderPath As String folderPath = TextBox1.Text Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Set swApp = Application.SldWorks Dim count As Integer For Each file In fso.GetFolder(folderPath).files '各ファイルに対して実行する Dim nameArray() As String nameArray = Split(file.path, ".") modelType = nameArray(UBound(nameArray)) If modelType ="SLDPRT" Then Call ToExcel(folderPath, fso.GetFileName(file)) End If count = count + 1 Next MsgBox Str(count) & "件出力しました!" Unload Me End Sub |
マクロを動かしてみよう
作成したマクロをSOLIDWORKSに適用して動かしてみましょう。SOLIDWORKSにマクロを適用する方法は前回記事をご覧ください。
今回は、7種類のSLDPRTファイルを用意しました。簡単のため、フォルダは”C:\test” 配下とします。
実行完了時にメッセージボックスが表示され、処理件数が表示されます。
マクロ実行後、フォルダにモデル毎のExcelファイルが出力されていることが分かります。実装次第では、まとめて1ファイルにすることも可能です。
肝心のExcelの中身ですが、ちゃんと出力されています。今回密度の設定はデフォルトのままなので、Mass=Volumeになっています。
変換したいモデルが1000個あっても、同様の手順で変換可能です。待ち時間は少し長くなりますが、その間はゆっくりルイボスティーでも飲めばOKです。
おわりに
SOLIDWORKS APIとExcel APIを用いてマクロを作成することができました。APIは豊富に公開されているので、マクロによる3D CADモデル作成の自動化なども可能です。またC++, C#にも対応しているため、用途に合わせて言語を使い分けることができます。加えて、ExcelやWord、さらにはVisioなどへの連携も可能です。
発展的な使用方法としては、これらのデータを収集してグラフ化することでデータ分析を行う などが考えられます。
それではみなさんも、楽しい自動化ライフをおくりましょう~!