こちらの続きです。
選択セットを利用する - 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個しか利用できません。
そのような場合は、今回のような方法で一旦選択セットを作成すると
処理が速くなりそうな気がします。 でも、今回使うかな?