見出し画像

ChatGPTを使ったSOLIDWORKSプログラミング その2 ~簡単な動作のプログラムの自動作成にチャレンジ~

前回の記事

前回はChatGPTでSOLIDWRKS APIが使えることを確認しました。
今回はChatGPTに自分が望む動作の内容を指示してコードを書いてもらおうと思います。


早速開始

今回も日本語で指示を出します。

まずはPCに保存してある『TestPart1.sldprt』を開いてもらいます。

出てきたコードはこんな感じ。

Sub OpenSWPartFile()
    Dim swApp As Object
    Dim swModel As Object
    Dim partFilePath As String
    
    ' SOLIDWORKS アプリケーションを開く
    Set swApp = CreateObject("SldWorks.Application")
    
    ' SOLIDWORKS アプリケーションが開かれていない場合は終了
    If swApp Is Nothing Then
        MsgBox "SOLIDWORKSが見つかりません。SOLIDWORKSを開いてから再試行してください。"
        Exit Sub
    End If
    
    ' パーツファイルのパス
    partFilePath = "C:\Test\Testparts1.sldprt"
    
    ' パーツファイルを開く
    Set swModel = swApp.OpenDoc6(partFilePath, swDocPART, swOpenDocOptions_Silent, "", 0, 0)
    
    ' パーツファイルが正常に開かれたか確認
    If swModel Is Nothing Then
        MsgBox "パーツファイルを開くのに失敗しました。ファイルパスを確認してください。"
    Else
        MsgBox "パーツファイルが正常に開かれました。"
    End If
End Sub

とりあえずそのままVBEに貼り付けて実行してみます。

初回の実行結果

はい!エラー出ました~!!
デバッグで確認してみます。

パーツを開くところでのエラーですね。
APIヘルプで「OpenDoc6」メソッドの内容を確認してみます。

一見問題なさそうに見えますが、
「FileName」~「Confguration」までは「ByVal」となっているのでOpenDoc6でファイルを開くために指示する必要がある固定値、「Errors」と「Warnings」は「ByRef」となっているのでメソッドから結果を受け取れる形で変数を指定してやらないとダメですね。
今回のエラーの場合、どちらも『0』と固定値が入っているので『メソッドから出力される結果を格納することができないよ』と言われているわけです。
(以前のSOLIDWORKSバージョンではこれでも開けたような気がするけど…)
VBAやVBの書式に慣れていないとByValとByRefの意味が分かりづらいんですが、こういう場合はC#の定義を見るとわかりやすいです。

先頭に「out」て書いてあるのが変数として指定する必要がある値になります。
まあこの辺も慣れですね。
というわけでこの部分を以下のように修正してみます。

    ' パーツファイルを開く
    'エラーの行をコメントアウト
    'Set swModel = swApp.OpenDoc6(partFilePath, swDocPART, swOpenDocOptions_Silent, "", 0, 0)

    '修正------------------
    Dim nErrors As Long
    Dim nWarnings As Long
    
    Set swModel = swApp.OpenDoc6(partFilePath, swDocPART, 0, "", nErrors, nWarnings)
    '修正ここまで----------

ファイルオープン時にエラーが発生した場合のエラー内容が整数値として格納されるので、このための変数として「nErrors」をLong型(Integer型でも可)で、同様に警告の整数値を格納する変数として「nWarnings」を定義しました。
これらの変数を使ってOpenDoc6の指定を修正しました。
ついでにサイレントで開く必要はないので「swOpenDocOptions_Silent」を指定なしを意味する『0』に置き換えました。

修正後の実行結果

はい、めでたくファイルを開くことができました。
でも前回の保存状態が悪かったのか変な向きで表示もちっちゃい!
これも何とかしたいな~。

命令追加

パーツが必ず等角投影で開くといいなということで、こんな風に命令してみました。

出てきたコードは以下の通り。

Sub OpenAndSetIsoView()
    Dim swApp As Object
    Dim swModel As Object
    Dim partFilePath As String
    Dim swDrawingDoc As Object
    Dim swModelDocExt As Object

    ' SOLIDWORKS アプリケーションを開く
    Set swApp = CreateObject("SldWorks.Application")
    
    ' SOLIDWORKS アプリケーションが開かれていない場合は終了
    If swApp Is Nothing Then
        MsgBox "SOLIDWORKSが見つかりません。SOLIDWORKSを開いてから再試行してください。"
        Exit Sub
    End If
    
    ' パーツファイルのパス
    partFilePath = "C:\Test\Testparts1.sldprt"
    
    ' パーツファイルを開く
    Set swModel = swApp.OpenDoc6(partFilePath, swDocPART, swOpenDocOptions_Silent, "", 0, 0)
    
    ' パーツファイルが正常に開かれたか確認
    If swModel Is Nothing Then
        MsgBox "パーツファイルを開くのに失敗しました。ファイルパスを確認してください。"
    Else
        ' 等角投影に設定
        Set swModelDocExt = swModel.Extension
        swModelDocExt.UseLightSource2 = False
        swModelDocExt.ViewDisplayMode = swViewDisplayMode_e.swViewDisplayMode_ShadedWithEdges
        swModelDocExt.SetDisplayMode swViewDisplayMode_e.swViewDisplayMode_Isometric, True
        MsgBox "パーツファイルが正常に開かれ、等角投影に設定されました。"
    End If
End Sub

親切にも命令にないことも追加してくれてあるようですね。
でも結論から言うとこのコードでは等角投影になりません。
「SetDisplayMode」は図面のビューの見え方の設定なのでパーツモデルでは動かないんですね。
さらに言うと「swViewDisplayMode_e」のメンバーには「swViewDisplayMode_Isometric」は存在しません。

その後何とか正解を出してもらおうと命令の仕方を変えながら頑張ってみましたが…

    ' パーツファイルが正常に開かれたか確認
    If swModel Is Nothing Then
        MsgBox "パーツファイルを開くのに失敗しました。ファイルパスを確認してください。"
    Else
        ' 手動で等角投影に変更するメッセージボックス
        MsgBox "SOLIDWORKSを手動で開き、等角投影に変更してください。"
    End If

はい、強制終了です。
作れない手順は全部メッセージボックスで出されそう(笑)
人を自動で動かすという意味では自動化といえるのか?

今回の結果

単純な動作であれば言葉で指示するだけでChatGPTがプログラムを書いてくれると思いましたが、なかなか厳しいようです。
ただ、ファイルを開く部分に関してはほぼ完璧に仕上がっていたので、SOLIDWORKSの自動化で頻繁に使われるメソッドについてはうまくいく可能性も高そうです。
SOLIDWORKSの自動化はプログラムとしてはニッチな領域なので、SOLIDWORKS APIを満遍なく扱うためにはChatGPTの機械学習に必要な事例が少ないのも要因かもしれませんね。
日本語で説明したら自動でコードを書いてくれるというのはもっと未来の話のようです。
一応等角投影で表示するコードも貼っときますね。

Sub OpenSWPartFile()
    Dim swApp As Object
    Dim swModel As Object
    Dim partFilePath As String
    
    ' SOLIDWORKS アプリケーションを開く
    Set swApp = CreateObject("SldWorks.Application")
    
    ' SOLIDWORKS アプリケーションが開かれていない場合は終了
    If swApp Is Nothing Then
        MsgBox "SOLIDWORKSが見つかりません。SOLIDWORKSを開いてから再試行してください。"
        Exit Sub
    End If
    
    ' パーツファイルのパス
    partFilePath = "C:\Test\Testparts1.sldprt"
    
    ' パーツファイルを開く
    Dim nErrors As Long
    Dim nWarnings As Long    
    Set swModel = swApp.OpenDoc6(partFilePath, swDocPART, 0, "", nErrors, nWarnings)
    
    ' パーツファイルが正常に開かれたか確認
    If swModel Is Nothing Then
        MsgBox "パーツファイルを開くのに失敗しました。ファイルパスを確認してください。"
    Else
        '等角投影で表示する----
        swModel.ShowNamedView2 "*等角投影", 7
        '----------------------
        
        MsgBox "パーツファイルが正常に開かれました。"
    End If
End Sub

このくらいなら「マクロの記録」で確認すれば十分なんですよね。
次回はSOLIDWRKS APIプログラミングでChatGPTを活用するためのもう少し現実的な手法について検討してみたいと思います。

この記事が気に入ったらサポートをしてみませんか?