読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

インプロセス実行時、一部をアウトプロセスで実行 2

こちらの続きです。
インプロセス実行時、一部をアウトプロセスで実行 - 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" を選択後のアイテム数を
返すようにし、最後に受け取ったアイテム数を表示するようにしました。

実行結果はこんな感じです
f:id:kandennti:20170113125207p:plain

無事、戻り値は受け取れます。Functionも有効なんですね。
さらに表示できていると言うことは、外部で呼び出した処理が終わる
まで待機していることが確認できます。(投げっぱなしじゃない)

但し、"Private Function" ではNGなんです。
好みと言うより、お作法としては可能な限りスコープを小さくしたい
ので、ちょっと困ります。
最悪、コードを文字列として取得してから実行までのタイムラグがあるので
"Private Function" でコードを書き、実行前に "Private" を削除して
しまうしか無いのかな?


又、昨年末から今年にかけてソート処理をゴニョゴニョ書いていた件も、
この方法で条件となる部分のコードを書き換えて、実行しても可能な
気がしているのですが…、ソート処理程度でここまですべきものか
疑問。