こちらの続きです。
インプロセス実行時、一部をアウトプロセスで実行 - C#ATIA
呼び出すだけではなく、戻り値も取得できるものか? 確認して
いなかったので前回のコードを修正し、テストすることにしました。
'vba using-'KCL0.09' Sub CATMain() '*** VBE準備 *** Dim VbPjName$: VbPjName = "Using_KCL_Sample" 'プロジェクト名 Dim VbCpName$: VbCpName = "Test_Func_Evaluate" 'モジュール名 Dim VbFcName$: VbFcName = "SelCrv" '関数名 'VBE Dim Vbe As Object: Set Vbe = GetVBE() If KCL.IsNothing(Vbe) Then Exit Sub 'VBProject Dim Pj As Object: Set Pj = GetVBProject(VbPjName, Vbe) If KCL.IsNothing(Pj) Then Exit Sub 'VBComponent Dim Cp As Object: Set Cp = GetVBComponent(VbCpName, Pj) If KCL.IsNothing(Cp) Then Exit Sub 'CodeModule Dim Cm As Object: Set Cm = Cp.CodeModule 'Component内のコード取得 Dim Code$: Code = GetCode(VbFcName, Cm) If Code = vbNullString Then Exit Sub '*** CATIA *** '選択 Dim Hb As HybridBody: Set Hb = KCL.SelectItem("Select", "HybridBody") If KCL.IsNothing(Hb) Then Exit Sub '実行言語 Dim SLang As CATScriptLanguage: SLang = CATVBALanguage '引数 Dim Prm(0) As Variant: Set Prm(0) = Hb 'SystemService Dim SS As Variant: Set SS = CATIA.SystemService '呼出し Dim Cnt&: Cnt = SS.Evaluate(Code, SLang, VbFcName, Prm) MsgBox "Select Count : " & Cnt End Sub 'アウトプロセス用マクロ - PrivateNG Function SelCrv(Prm) Dim Hb As HybridBody Set Hb = Prm Dim Sel As Selection Set Sel = CATIA.ActiveDocument.Selection Sel.Clear Dim HS As HybridShape For Each HS In Hb.HybridShapes Sel.add HS Next SelCrv = Sel.Count2 End Function ・・・
残りの部分は前回と同じままです。
外部マクロとして呼び出している "SelCrv" を選択後のアイテム数を
返すようにし、最後に受け取ったアイテム数を表示するようにしました。
実行結果はこんな感じです
無事、戻り値は受け取れます。Functionも有効なんですね。
さらに表示できていると言うことは、外部で呼び出した処理が終わる
まで待機していることが確認できます。(投げっぱなしじゃない)
但し、"Private Function" ではNGなんです。
好みと言うより、お作法としては可能な限りスコープを小さくしたい
ので、ちょっと困ります。
最悪、コードを文字列として取得してから実行までのタイムラグがあるので
"Private Function" でコードを書き、実行前に "Private" を削除して
しまうしか無いのかな?
又、昨年末から今年にかけてソート処理をゴニョゴニョ書いていた件も、
この方法で条件となる部分のコードを書き換えて、実行しても可能な
気がしているのですが…、ソート処理程度でここまですべきものか
疑問。