ご質問頂いたもののサンプルです。
指定したドローイングテーブルに、指定した形状セットの子形状セットの名前を反映させます。
仮に、以下の様な状態のファイルがあるとします。
テーブルは2X2で、形状セット(a)側の子形状セットは、5個(a1~a5)有ります。
又、子形状セットの名前にはそれぞれスペース文字が入った状態です。
予めDraw側をアクティブにし、マクロを実行。 最初にテーブルを指定。
続いて、Product(又はPart)の "a" の形状セットを指定した際
このような状態になります。
形状セット名の最初のスペースを区切りとし、1列目には前半
2列目には後半が入ります。
又、テーブルの行数は、指定された子形状セット数に応じて調整されます。
ソースコードです。
'vba '指定したテーブルに指定した子形状セット名を反映 Sub CATMain() Call ReflectionDrawingTableMain End Sub Sub ReflectionDrawingTableMain() '準備 Dim Drawing As DrawingDocument Dim DrawingSelection 'As Selection Dim DrawingSheet As DrawingSheet If TryDrawDoc(CATIA.ActiveDocument, Drawing) Then Set DrawingSelection = Drawing.Selection Set DrawingSheet = Drawing.Sheets.ActiveSheet Else MsgBox ("DrawingSheetをアクティブにして下さい") Exit Sub End If '出力先テーブル選択 Dim Status As String Dim InputObjectType(0) As Variant Dim DrawTable As DrawingTable InputObjectType(0) = "DrawingTable" Status = DrawingSelection.SelectElement2(InputObjectType, "出力先テーブルを選択して下さい/ESC-終了", False) If Status = "Cancel" Then Exit Sub Set DrawTable = DrawingSelection.Selection.Item2(1).Value '対象の形状セット選択 Dim partDocument 'As PartDocument ' ←型指定すると、ESC時エラーとなる Dim SelectHybridBody As HybridBody InputObjectType(0) = "HybridBody" Status = DrawingSelection.SelectElement4(InputObjectType, "こちらのテーブルに出力します", _ "対象となる形状セットを選択して下さい", False, partDocument) If Status = "Cancel" Then Exit Sub Set SelectHybridBody = partDocument.Selection.Item2(1).Value '子の形状セット数と選択テーブルの列数を一致させる Dim ChildHBodies As HybridBodies Dim DifferenceLowCount As Long Set ChildHBodies = SelectHybridBody.HybridBodies DifferenceLowCount = DrawTable.NumberOfRows - ChildHBodies.Count Select Case DifferenceLowCount Case Is < 0 Call AddTableRows(DrawTable, Abs(DifferenceLowCount)) Case Is > 0 Call RemoveTableRows(DrawTable, DifferenceLowCount) Case Else '一致しているのでそのまま End Select 'テーブルに反映 Dim i As Long Dim HBodyName() As String Dim SizeTxt As String For i = 1 To ChildHBodies.Count HBodyName = Split(ChildHBodies.Item(i).Name, " ") Call DrawTable.SetCellString(i, 1, HBodyName(0)) 'ヘッダー反映 HBodyName(0) = "" SizeTxt = LTrim(Join(HBodyName, " ")) Call DrawTable.SetCellString(i, 2, SizeTxt) 'サイズ反映 Next End Sub '列追加-最終行には追加できない Private Sub AddTableRows(Tb As DrawingTable, Count As Long) Dim i As Long For i = 1 To Count Call Tb.AddRow(Tb.NumberOfRows) Next End Sub '行削除 Private Sub RemoveTableRows(Tb As DrawingTable, Count As Long) Dim i As Long For i = 1 To Count Call Tb.RemoveRow(Tb.NumberOfRows) Next End Sub 'DrawingDocumentのチェック Private Function TryDrawDoc(ByRef Doc As Document, ByRef ReturnDoc As DrawingDocument) As Boolean On Error Resume Next Set ReturnDoc = Doc If Err.Number = 0 Then TryDrawDoc = True Else TryDrawDoc = False End If On Error GoTo 0 End Function
・このマクロは、ProductでもPart単体でも実行可能です。(Drawも必要です)
こちらをベースに改造した為、個人的にもイマイチな部分あります。
SelectElement4 サンプル - C#ATIA
もっと扱いやすいマクロが、作成出来そうな気がするので、
もう少し運用方法等、時間が出来たらお聞きしたいところです。