C#ATIA

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

指定した形状セット内に、新たな形状セットを作成する

ご質問頂いたもののサンプルです。

以下の様な状態のファイルがあるとします。
f:id:kandennti:20150811145918p:plain

ここでユーザーが形状セットを指定した際、指定した形状セットが存在し
Partに直接ぶら下がっている形状セット内に、新たに空の形状セットを
作成します。 言葉で表現するとややこしいです。

実際にマクロを実行し "a1" の形状セットを選択した際の状態です。
f:id:kandennti:20150811145927p:plain

新たに "a3" の形状セットが作成されます。
ソースコードです。

'vba
'指定した形状セット内に新たな形状セットを作成
Sub CATMain()
    Call AddNewHybridBodyMain
End Sub

Sub AddNewHybridBodyMain()
    '準備
    Dim Doc As Document
    Set Doc = CATIA.ActiveDocument
    
    Dim Selection1 'As Selection
    Set Selection1 = Doc.Selection
    
    'ユーザー選択
    Dim InputObjectType(0) As Variant
    Dim SelectHybridBody As HybridBody
    InputObjectType(0) = "HybridBody"
    With Selection1
        .Clear
        Result = .SelectElement2(InputObjectType, "形状セットを選択して下さい // [Esc]=キャンセル", False)
        If Result = "Cancel" Then Exit Sub
        Set SelectHybridBody = .Item(1).Value
        .Clear
    End With
    
    '挿入するHybridBodiesを取得
    Dim TargetHybridBodies As HybridBodies
    Set TargetHybridBodies = GetLeafHybridBodies(SelectHybridBody)
    
    'HybridBodyを作成
    Dim AddHybridBody As HybridBody
    Set AddHybridBody = TargetHybridBodies.Add
    AddHybridBody.Name = GetHybridBodyHeaderName(TargetHybridBodies.Name) + CStr(TargetHybridBodies.Count)
End Sub

'パートに直接ぶら下がっている形状セットを取得
Private Function GetLeafHybridBodies(HB As HybridBody) As HybridBodies
    If HB.Parent.Name = "HybridBodies" Then
        Set GetLeafHybridBodies = HB
    Else
        Dim TempHB As HybridBody
        Set TempHB = HB.Parent 'HybridBodiesをHybridBodyに変換
        Set GetLeafHybridBodies = GetLeafHybridBodies(TempHB)
    End If
End Function

'スペースより前の文字列のみを返す
Private Function GetHybridBodyHeaderName(Txt As String) As String
    Dim StringAry() As String
    StringAry = Split(Txt, " ")
    GetHybridBodyHeaderName = StringAry(0)
End Function

・このマクロは、ProductでもPart単体でも実行可能です。
・先程は "a1" を選択しましたが、"a" "a2" "hoge" の何れを指定しても
 "a3" の形状セットが作成されます。
・新たに作成される形状セットの名前は、Partに直接ぶら下がっている形状セット名の
 スペースより前部分(今回は "a") + 形状セットの数です。