C#ATIA

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

指定したドローイングテーブルに、指定した子形状セットの名前を反映

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

指定したドローイングテーブルに、指定した形状セットの子形状セットの名前を反映させます。
仮に、以下の様な状態のファイルがあるとします。
f:id:kandennti:20150812160901p:plain
テーブルは2X2で、形状セット(a)側の子形状セットは、5個(a1~a5)有ります。
又、子形状セットの名前にはそれぞれスペース文字が入った状態です。

予めDraw側をアクティブにし、マクロを実行。 最初にテーブルを指定。
続いて、Product(又はPart)の "a" の形状セットを指定した際
このような状態になります。
f:id:kandennti:20150812160909p:plain

形状セット名の最初のスペースを区切りとし、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
もっと扱いやすいマクロが、作成出来そうな気がするので、
もう少し運用方法等、時間が出来たらお聞きしたいところです。