C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

ProductTree の リオーダー2

こちらの続きです。
ProductTree の リオーダー - C#ATIA

サンプル用のマクロを用意していたのですが、Product用のマクロを持っていない為、
以前の物を修正し、インスタンス名でソートするマクロに変更しました。

'vba sample_ReOrder_Product ver0.0.1  using-'KCL0.0.12'  by Kantoku
'インスタンス名でのソート順にTreeを並び替えます

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("ProductDocument") Then Exit Sub
    
    'Doc取得
    Dim ProDoc As ProductDocument: Set ProDoc = CATIA.ActiveDocument
    Dim Pros As Products: Set Pros = ProDoc.Product.Products
    If Pros.Count < 2 Then Exit Sub
    
    'オプション変更
    Dim AssyMode As AsmConstraintSettingAtt
    Set AssyMode = CATIA.SettingControllers.Item("CATAsmConstraintSettingCtrl")
    Dim OriginalMode As CatAsmPasteComponentMode
    OriginalMode = AssyMode.PasteComponentMode
    
    'オプション切り替え
    AssyMode.PasteComponentMode = catPasteWithCstOnCopyAndCut
    
    'ソート済み名前リスト
    Dim Names: Set Names = Get_SortedNames(Pros)
    
    'カット
    Dim Sel As Selection: Set Sel = ProDoc.Selection
    Dim Itm As Variant
    
    CATIA.HSOSynchronized = False
    
    Sel.Clear
    For Each Itm In Names
        Sel.Add Pros.Item(Itm)
    Next
    Sel.Cut
    
    'ペースト
    With Sel
        .Clear
        .Add Pros
        .Paste
        .Clear
    End With
    
    CATIA.HSOSynchronized = True
    
    'オプション戻し,UpDate
    AssyMode.PasteComponentMode = OriginalMode
    ProDoc.Product.Update
End Sub

'インスタンス名でソート済みの名前リスト
Private Function Get_SortedNames(ByVal Pros As Products) As Object
    Dim Lst As Object
    Set Lst = KCL.InitLst()
    
    Dim Pro As Product
    For Each Pro In Pros
        Lst.Add Pro.Name
    Next
    
    Lst.Sort
    
    Set Get_SortedNames = Lst
End Function

又、ソート処理が毎回面倒な為、KCLをVer0.0.12としました。
非常に個人的なCATVBA用ライブラリ - C#ATIA