C#ATIA

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

レイヤーの扱いを考える5

こちらの続きです。
レイヤーの扱いを考える4 - C#ATIA
以前、"Unofficial CATIA User Forum"にUPしたVBA
レイヤー毎に形状セットで分割するマクロです。

Partファイルに入っている1番最初の形状セットの
GSD要素を分割するため、複数形状セットが有ったり
リンクしている要素がある場合は想定していません。
(IGESファイル等を開いたばかりの状態を想定しています)

'vba
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Sub CATMain()
    Dim T As Long
    
    T = timeGetTime
    Call LayerStart
    CATIA.RefreshDisplay = True
    MsgBox CDbl(timeGetTime - T) / 1000 & "秒"
End Sub

Sub LayerStart()
    'レイヤ分けマクロ
    Dim ActDoc As partDocument
    Dim oFac As HybridShapeFactory
    Dim oSel 'As Section
    Dim oPart As Part
    Dim HBshapes As HybridShapes
    Dim HBbodies As HybridBodies
    Dim Hbody As HybridBody
    Dim oVisProperties As VisPropertySet
    Dim oRef As Reference
    Dim Layertype As Long
    Dim Layer As Long
    Dim colTemp As Collection
    Dim oSurf As AnyObject
    Dim i As Long
    Dim j As Long
    Dim LoopCount As Long
    
    Set ActDoc = CATIA.ActiveDocument
    Set oPart = ActDoc.Part
    Set HBbodies = oPart.HybridBodies
    Set HBshapes = HBbodies.item(1)
    Set oSel = ActDoc.selection
    Set oFac = oPart.HybridShapeFactory
    
    On Error Resume Next
    If CATIA.HSOSynchronized Then
        CATIA.HSOSynchronized = False'⑦
    End If
    LoopCount = HBshapes.Count
    Do
        i = i + 1
        Set oRef = HBshapes.item(i)
            With oSel
                'サーフェスのレイヤチェック
                Call .Clear
                Call .add(oRef)
                Set oVisProperties = .VisProperties
                Call oVisProperties.GetLayer(Layertype, Layer)'①
                
                'サーフェスのコピーと削除
                Call .Clear
                .Search "CATGmoSearch.&Layer=" & CStr(Layer) & ",all"'②
                Set colTemp = New Collection
                For j = 1 To .Count'③
                    Call colTemp.add(.item(j).Value)
                Next
                .Copy
                .Clear
                Set Hbody = HBbodies.add()'④
                Hbody.name = "Layer" & CStr(Layer)'④
                Call .add(Hbody)
                .Paste
                
                .Clear
                For Each oSurf In colTemp
                    Call oFac.DeleteObjectForDatum(oSurf)'⑤
                Next
                Set colTemp = Nothing
            End With
            '再ループ
            i = i - 1
            LoopCount = HBshapes.Count'⑥
        'End If
    Loop Until i >= LoopCount
    If Not CATIA.HSOSynchronized Then
        CATIA.HSOSynchronized = True'⑦
    End If
    oPart.Update
    
    Set oRef = Nothing
    Set ActDoc = Nothing
    Set oSel = Nothing
    Set oPart = Nothing
    Set HBshapes = Nothing
    Set HBbodies = Nothing
    Set Hbody = Nothing
    Set oVisProperties = Nothing
End Sub

今見ると、結構めちゃくちゃな事してます・・・。
①形状セット内の要素をループさせて、最初の要素のレイヤー
 を取得します。
②Sectionで検索し、同一のレイヤーの物を選択状態にします。
③後に削除するために、選択されたものをコレクションとして
 保持します。
 現在マクロでは「形状セット変更」は見つかっておらず
 代案として コピー → ペースト → 元を削除 を
 行っているためです。
④移動先の形状セット作成とリネーム
⑤③で作成した元データのコレクションを削除
⑥⑤で元の形状セットの要素数が変わってしまっているため
 再度Countを取得してます。(ここがヒドイ・・・)
⑦これは以前教わった関数ですが、比較的遅いとされている
 Sectionのパフォーマンスが改善されるものです。
 オートメーションマニュアルには細々記載されていますが、
 要はTrueは通常の状態で、Falseで高速に処理します
 と言うことですよね?

これと同様の機能をC#化したいと思います。