C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

外部のマクロを実行する3

こちらの続きです。
外部のマクロを実行する2 - C#ATIA


外部のマクロを実行する方法がもう一つありました。
同じSystemServiceクラスのEvaluate関数です。
AutomationManualの感じから、
「ソースコードの文字列を、マクロとして実行する」
ようで、サンプルが記載されており、それを参考に
して実行してみます。

作成したコードはこんな感じです。

'vba
Sub Func_Evaluate_Test_txt()
    Dim SourceTxt As String '実行するコードの文字列
    SourceTxt = _
        " Sub CATMain() " + vbNewLine + _
        "     Dim partDocument1 As PartDocument " + vbNewLine + _
        "     Set partDocument1 = CATIA.ActiveDocument " + vbNewLine + _
        "      " + vbNewLine + _
        "     Dim part1 As Part " + vbNewLine + _
        "     Set part1 = partDocument1.Part " + vbNewLine + _
        "      " + vbNewLine + _
        "     Dim hybridBodies1 As HybridBodies " + vbNewLine + _
        "     Set hybridBodies1 = part1.HybridBodies " + vbNewLine + _
        "      " + vbNewLine + _
        "     For I = 1 To 5 " + vbNewLine + _
        "         Call hybridBodies1.Add " + vbNewLine + _
        "     Next " + vbNewLine + _
        "     part1.Update " + vbNewLine + _
        " End Sub "
        
    Dim SourceLanguage As CATScriptLanguage '実行言語
    SourceLanguage = CATVBALanguage
    
    Dim FunctionName As String '関数名
    FunctionName = "CATMain"
    
    Dim Params() As Variant '引数 空でも渡す
    
    Dim SS As Variant ' SystemService
    Set SS = CATIA.SystemService
    
    '外部呼出し
    Call SS.Evaluate(SourceTxt, SourceLanguage, FunctionName, Params)

    Dim Doc As PartDocument
    Set Doc = CATIA.ActiveDocument
    
    Dim HBs As HybridBodies
    Set HBs = Doc.Part.HybridBodies
    
    Dim I As Long
    For I = 1 To HBs.Count
        HBs.Item(I).Name = "Hoge" + CStr(I)
    Next
    Doc.Part.Update
End Sub

SourceTxt変数に前回のAddHBody関数を文字列にして、代入
しました・・・面倒です。 このような感じの事をチマチマやるのが
嫌な人間なので。 どの様な方法が一般的ですかね?

過去にt-homさんがイミディエイトウインドウを利用した方法を記載しています。

マクロにマクロを書かせよう。(VBA) - t-hom’s diary

僕は、コードをExcelにベタっとペーストして、チョコチョコ細工してから
テキストで保存し、メモ帳で置換とかするのですが。(結構やります)

実行結果はこちらです。問題無く動きました。
f:id:kandennti:20160418112330p:plain
って、ちっともこれじゃ外部のマクロじゃないです。
そもそも何のメリットも無い。


それじゃ、外部ファイルにする為に前回のAddHBody関数を
エクスポートします。
f:id:kandennti:20160419122612p:plain
このファイルは「C:\temp\AddHBody.bas」としておきます。
先程のコードをエクスポートしたファイルを読み込み、Evaluate関数で
実行するように修正してみました。

'vba
Sub Func_Evaluate_Test_file()
    Dim SourcePath As String 'ソースコードのパス
    SourcePath = "C:\temp\AddHBody.bas"
    
    Dim SourceTxt As String '実行するコードの文字列
    SourceTxt = ReadFile(SourcePath)
        
    Dim SourceLanguage As CATScriptLanguage '実行言語
    SourceLanguage = CATVBALanguage
    
    Dim FunctionName As String '関数名
    FunctionName = "CATMain"
    
    Dim Params() As Variant '引数 空でも渡す
    
    Dim SS As Variant ' SystemService
    Set SS = CATIA.SystemService
    
    '外部呼出し
    Call SS.Evaluate(SourceTxt, SourceLanguage, FunctionName, Params)

    Dim Doc As PartDocument
    Set Doc = CATIA.ActiveDocument
    
    Dim HBs As HybridBodies
    Set HBs = Doc.Part.HybridBodies
    
    Dim I As Long
    For I = 1 To HBs.Count
        HBs.Item(I).Name = "Hoge" + CStr(I)
    Next
    Doc.Part.Update
End Sub

'FileSystemObject
Private Function GetFSO() As Object
    Set GetFSO = CreateObject("Scripting.FileSystemObject")
End Function

'ファイル読み込み
Private Function ReadFile(ByVal Path) As Variant
    With GetFSO.GetFile(Path).OpenAsTextStream
        ReadFile = .ReadAll
        .Close
    End With
End Function

実行結果はこちらです。
f:id:kandennti:20160418112330p:plain
まぁ画像は使いまわしているんですけどね。
問題無いのですが、全くメリットを感じないんです。

態々この関数を用意した製作者の意図は、きっとこんな事だろうと
思います。 Evaluate関数の第二引数のCATScriptLanguage列挙型を
見ると5つあります。
r1 Enumeration CATScriptLanguage
恐らく"Java" "JScript" を視野に入れていたんじゃないのかな?
と思います。


"外部のマクロを実行する" に、こだわったのはバッチモードが原因です。
バッチモードの"-macro"オプションでは "CATScript" (ひょっとしたら
VBScriptもOKかも)しか利用できなさそうなのですが、開発を考えると
VBAの方が楽なんです。

バッチモードの起動の際は、"CATScript" 内に先日のExecuteScript関数で
VBAのプロジェクトを指定しておけば、VBAで勝負できそうな気がしています。