こちらの続きです。
外部のマクロを実行する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さんがイミディエイトウインドウを利用した方法を記載しています。
僕は、コードをExcelにベタっとペーストして、チョコチョコ細工してから
テキストで保存し、メモ帳で置換とかするのですが。(結構やります)
実行結果はこちらです。問題無く動きました。
って、ちっともこれじゃ外部のマクロじゃないです。
そもそも何のメリットも無い。
それじゃ、外部ファイルにする為に前回のAddHBody関数を
エクスポートします。
このファイルは「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
実行結果はこちらです。
まぁ画像は使いまわしているんですけどね。
問題無いのですが、全くメリットを感じないんです。
態々この関数を用意した製作者の意図は、きっとこんな事だろうと
思います。 Evaluate関数の第二引数のCATScriptLanguage列挙型を
見ると5つあります。
r1 Enumeration CATScriptLanguage
恐らく"Java" "JScript" を視野に入れていたんじゃないのかな?
と思います。
"外部のマクロを実行する" に、こだわったのはバッチモードが原因です。
バッチモードの"-macro"オプションでは "CATScript" (ひょっとしたら
VBScriptもOKかも)しか利用できなさそうなのですが、開発を考えると
VBAの方が楽なんです。
バッチモードの起動の際は、"CATScript" 内に先日のExecuteScript関数で
VBAのプロジェクトを指定しておけば、VBAで勝負できそうな気がしています。