ご質問頂いたもののサンプルです。
以下の様な状態のファイルがあるとします。
ここでユーザーが形状セットを指定した際、指定した形状セットが存在し
Partに直接ぶら下がっている形状セット内に、新たに空の形状セットを
作成します。 言葉で表現するとややこしいです。
実際にマクロを実行し "a1" の形状セットを選択した際の状態です。
新たに "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") + 形状セットの数です。