C#ATIA

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

選択セットを利用し、再選択を高速化

こちらの続きです。
選択セットを利用する - C#ATIA


通勤中に "ひょっとしたら今回使うかも" と思ったので、
選択セットを利用した "再選択の高速化" をテストしてみました。

選択セットを作成する際、事前に選択状態にしなければならない為
一度だけでは無意味です。 一度選択後クリアし再度選択して
時間を測定するようにしてみました。

'vba test_SelectionSets2  using-'KCL0.08'
'選択スピードテスト-指定形状セット内の点線面を2度選択
Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("PartDocument, ProductDocument") Then Exit Sub
    
    '形状セット選択
    Dim HB As HybridBody
    Set HB = KCL.SelectItem("形状セット選択", "HybridBody")
    If KCL.IsNothing(HB) Then Exit Sub
    Dim Sel As Selection: Set Sel = CATIA.ActiveDocument.Selection
    
    Debug.Print vbNewLine + "**********"
    'ForEachで普通に
    Debug.Print "-- Basic スタート --"
    KCL.SW_Start
    If Not Basic(HB.HybridShapes) Then Debug.Print "NG"
    Debug.Print "2回目合計 :" + CStr(KCL.SW_GetTime) + "s"
    
    '選択セットを利用
    Debug.Print vbNewLine + "-- SelectionSets スタート --"
    KCL.SW_Start
    If Not SelectionSets(HB.HybridShapes) Then Debug.Print "NG"
    Debug.Print "2回目合計 :" + CStr(KCL.SW_GetTime) + "s"
End Sub

'ForEach
Private Function Basic(ByVal Hss As HybridShapes) As Boolean
    Basic = False
    Dim Sel As Selection: Set Sel = KCL.GetParent_Of_T(Hss, "PartDocument").Selection
    Dim Hs As HybridShape
    
    CATIA.HSOSynchronized = False
    Sel.Clear
    For Each Hs In Hss
        Sel.Add Hs
    Next
    Debug.Print CStr(Sel.Count2) + "個" + vbNewLine + "1回目 :" + CStr(KCL.SW_GetTime) + "s"
    Sel.Clear
    For Each Hs In Hss
        Sel.Add Hs
    Next
    CATIA.HSOSynchronized = True
    If Sel.Count2 > 0 Then Basic = True
End Function

'選択セット
Private Function SelectionSets(ByVal Hss As HybridShapes) As Boolean
    SelectionSets = False
    Dim Doc As PartDocument: Set Doc = KCL.GetParent_Of_T(Hss, "PartDocument")
    Dim Sel As Selection: Set Sel = Doc.Selection
    Dim Hs As HybridShape
    
    CATIA.HSOSynchronized = False
    Sel.Clear
    For Each Hs In Hss
        Sel.Add Hs
    Next
    Debug.Print CStr(Sel.Count2) + "個" + vbNewLine + "1回目 :" + CStr(KCL.SW_GetTime) + "s"
    Dim SelSets As SelectionSets: Set SelSets = Doc.Product.GetItem("CATIAVBSelectionSetsImpl")
    With SelSets
        Call .CreateSelectionSet("hoge")
        Call .AddCSOIntoSelectionSet("hoge")
        Sel.Clear
        Call .PutSelectionSetIntoCSO("hoge")
        Call .DeleteSelectionSet("hoge")
    End With
    CATIA.HSOSynchronized = True
    If Sel.Count2 > 0 Then SelectionSets = True
End Function

組み合わせテストの3種類のデータで行いました。結果はこちら

**********
-- Basic スタート --
2個
1回目 :0.015s
2回目合計 :0.031s

-- SelectionSets スタート --
2個
1回目 :0.015s
2回目合計 :0.038s

**********
-- Basic スタート --
263個
1回目 :0.205s
2回目合計 :0.424s

-- SelectionSets スタート --
263個
1回目 :0.199s
2回目合計 :0.266s

**********
-- Basic スタート --
4099個
1回目 :2.936s
2回目合計 :6.069s

-- SelectionSets スタート --
4099個
1回目 :2.991s
2回目合計 :4.573s

4099個の結果を見ると、選択セットを利用した場合の2回目は
ForEachの方法の半分ぐらいの処理時間で終わるようです。
(選択セットの作成・登録・再選択・削除を含めてもです)

SelectionのSearchで検索した結果を維持しつつ、VisPropertySetで
個別に何らかの処理を行いたい場合と言うことが、稀にあります。
"Selectionが2個利用できたら良いのになぁ"
と思うのですが、Selectionは起動しているCATIA毎に1個しか利用できません。
そのような場合は、今回のような方法で一旦選択セットを作成すると
処理が速くなりそうな気がします。 でも、今回使うかな?