はじめに
CCTが提供している調達DX(調達DX ~見積もり自動化技術~ | CCT)ではAIや3D CADのデータを使用して製造業の見積もりの自動化技術を提供しています。技術開発の際、SOLIDWORKSなどで3D CADデータを操作することがしばしばあるので、今回は一部事例を紹介したいと思います。
SOLIDWORKSとは?
Dassault Systèmes SolidWorks Corporationから発売されている3D CADソフトウェアです。[Wikipedia] メジャーな3D CADソフトウェアのうちの1つであり、「使いやすさ」を主軸に製品開発が行われています。3D CADシステムで達成したい主な操作はすべて可能です。また、APIが豊富に公開されているため、これらを使用することで、操作を自動化するマクロを作成することができます。マクロを利用することで、SOLIDWORKSをさらに便利に使うことができます。
マクロを作ってみよう
1:仕様について
今回は、3D CADファイルを変換するマクロを作ってみます。社内でのみ使用する想定なので、外見などは簡単に済ませます。詳細は以下です。
◆作りたい機能とその背景
今回作成するのは「指定したフォルダに存在する3D CADモデルを特定の形式に変換する機能」です。
製作の背景としては冒頭に述べたように、業務上3D CADモデルの変換が必要な場合がしばしば存在し、今まではSOLIDWORKSの機能で1モデルずつ手作業で変換していましたが、マクロで一括変換できると便利であるためです。
また今回は、同一フォルダ内に「.stp」や「.SLDPRT」など様々な拡張子が存在する場合を想定しています。
◆操作フロー
- フォルダを選択
- 変換元の3D CADモデルの拡張子を選択(テキスト入力も可)
- 変換先の拡張子を選択(テキスト入力も可)
- 実行後、フォルダ内で指定した拡張子を持つ3D CADファイルが全て変換されている
今回はSOLIDWORKS2021を使用して作成します。
2:SOLIDWORKSでのマクロ作成方法
SOLIDWORKS画面上部のツールバーから「ツール」→「マクロ」→「新規」を押下すると新規マクロファイルを作成することができます。今回はマクロ名を「CADFileConverter」としました。
ファイル作成が完了するとSOLIDWORKS内蔵の統合開発環境(IDE)が立ち上がります。SOLIDWORKSのマクロは拡張子が「.swp」であり、これは「SW VBA Macros」という形式です。別途拡張子を「.vb」としたファイルを用意することでVBAとしてVS Codeなどで編集可能になりますが、今回はSOLIDWORKS内蔵IDEを使用します。
このIDEはF9キーでブレークポイントを設定することができます。ブレークポイントを設定することでマクロの実行をその位置で停止させることができるため、変数に格納されている値の確認などといったデバッグ作業が可能になります。
3:入力フォームを作成しよう
各種指定をするための入力フォームを追加しましょう。今回は社内で使用するツールなので簡易的に作成します。
◆入力フォーム
SOLIDWORKS内蔵エディタで「ユーザーフォームの挿入」を押下し、フォームに以下を追加します。
- フォルダパスの指定テキストボックス、フォルダの参照ボタン
- 変換前拡張子の指定テキストボックス
- 変換後拡張子の指定テキストボックス
- 変換実行ボタン
- 各種説明テキスト
上記を実現するようにボタンやテキストボックスを配置してみました。入力フォーム同様、今回は社内で使用するツールなので一旦これで良しとします(しましょう)。
◆処理の実装
SWP形式はVBAと同様に記述することで、実装することができます。
ファイル読み込み
フォルダの参照によって入力フォルダを指定できると便利なので、この方式を使用してみます。
今回はVBAのShell.BrowseForFolder()を使用して、以下のようにフォルダを選択するダイアログボックスを表示させました。
コードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Function OpenFolder() As String Dim Shell, curPath Set Shell = CreateObject("Shell.Application") 'フォルダを参照する方式を採用 Set curPath = Shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\") OpenFolder = curPath.Items.Item.path Set Shell = Nothing Set curPath = Nothing End Function Private Sub CommandButton2_Click() '/** '\brief 「参照」ボタン '*/ Dim openfilename As String openfilename = OpenFolder() FilePath.Text = openfilename End Sub |
ファイル変換
ファイル変換機能はSOLIDWORKSの機能で提供されています。いくつかのSOLIDWORKSのAPIを組み合わせて、マクロを作っていきましょう。
〇情報の取得
マクロを動かすためにはまず、SOLIDWORKSオブジェクトを取得します。これは
1 |
Set swApp = Application.SldWorks |
で可能です。これにより、SOLIDWORKSオブジェクトswAppを使用してSOLIDWORKSのAPIを使うことができます。また、立ち上げている3D CADモデルの情報を取得する場合はModelDocメソッドを使用します。
〇ファイルを開く
今回はOpendoc6というSOLIDWORKS APIを使って3D CADファイルを開くことにします。引数で挙動をいくつか制御可能です。
〇ファイルを変換して保存する
開いたファイルを変換して保存します。対応するSOLIDWORKS APIはSaveAsになります。
また、SOLIDWORKSで開いた3D CADを閉じるAPIはCloseDocになります。
これらを実装したコードは以下です。
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 |
Private Sub CommandButton1_Click() '/** '\brief 「変換する」ボタン '*/ Dim folderPath As String Dim beforeExtension As String Dim afterExtension As String folderPath = FilePath.Text beforeExtension = BeforeType.Text afterExtension = AfterType.Text Call FileConverter(folderPath, beforeExtension, afterExtension) End Sub Sub CADFileConverter(ByVal path As String, ByVal before As String, ByVal after As String) 'before:変換したい拡張子 'after:変換後の拡張子 Dim fso As Object Dim doc As SldWorks.ModelDoc2 Set fso = CreateObject("Scripting.FileSystemObject") Set swApp = Application.SldWorks '取得したフォルダに存在するファイル群の取得 Set files = fso.GetFolder(path).files 'ファイル群を全探索する For Each file In files Dim filename As String Dim extname As String extname = fso.GetExtensionName(file) 'ファイルの拡張子が変換したい拡張子の場合、処理を開始する If extname = before Then filename = fso.GetFileName(file) Dim namearray() As String Dim modelname As String namearray = Split(filename, ".") modelname = namearray(0) Dim fileerror As Long Dim filewarning As Long Dim openfilename As String Dim closefilename As String 'openfilename:開きたいファイルの絶対パス 'closefilename :保存先のファイルパス(変換したい拡張子になっている) openfilename = path & "\" & filename closefilename = path & "\" & modelname & "." & after '3D CADファイルを開く Set doc = swApp.OpenDoc6(openfilename, swDocPART, swOpenDocOptions_Silent, "", fileerror, filewarning) Dim Version As Integer Dim Options As Integer Dim ExportData As Object Dim Errors As Long Dim Warnings As Long Dim value As Boolean '変換後のファイルを保存する value = doc.Extension.SaveAs(closefilename, Version, Options, ExportData, Errors, Warnings) 'ファイルを閉じる swApp.CloseDoc (openfilename) End If Next Unload Me End Sub |
マクロを動かしてみよう
作成したマクロをSOLIDWORKSに適用して動かしてみましょう。まずはSOLIDWORKSにマクロを適用して、CommandManagerにアイコンを表示させてみたいと思います。
ツールバー箇所で「右クリック」→「ユーザー定義」を押下して、新規タブを表示させます。次に、ツールバー上に現れる「新規タブ」の名前を設定し、ユーザ定義から「マクロボタン」をDrag&Dropします。今回はタブ名を「SWマクロ」としました。
これでボタンの登録が完了し、CommandManagerからマクロが実行できるようになりました!
マクロを実際に動かしてみましょう。試しにフォルダを作成して(今回はC:\testとしました)、「.SLDPRT」拡張子を持つ計5モデルを「.stp」へ変換してみます。各テキストボックスを記入し、「変換する」ボタンを押下して待ちます。
30秒ほど経つと変換が終了しました。結果を見ると、SLDPRTファイルのみ変換できていることが分かります。
変換したいモデルが1000個あっても、同様の手順で変換可能です。待ち時間は少し長くなりますが、その間はゆっくりコーヒーでも飲めばOKです。
おわりに
SOLIDWORKS APIを用いてマクロを作成することができました。APIは豊富に公開されているので、マクロによる3D CADモデル作成の自動化なども可能です。またC++, C#にも対応しているため、用途に合わせて言語を使い分けることができます。
筆者は、事前にこの記事を知り合いのFRくんに見せたのですが、大変喜んでいました。自動化は人を笑顔にしますね。
それではみなさんも、楽しい自動化ライフをおくりましょう~!