C#ATIA

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

"リンクの結果として"のソリッドを分離する

CATIA V5です。

"3Dの分離" の意味を間違えているかもしれないのですが、
表題のサンプルを作ってみました。

"リンクの結果として" でペーストされて出来たボディ内の
ソリッドのリンクを分離します。

探してみた所、仰っていたように "CATIA.StartCommand" を
使用するしか方法が無いようです。
又、言語依存の無いコマンドIDをこちらで探しましたが
見つけることが出来ませんでした。
(ひょっとしたら存在するかもしれませんが、今の所見つかりません)
Free CAD Designs, Files & 3D Models | The GrabCAD Community Library

予測通り、CATIAの設定言語を判断し、"CATIA.StartCommand" しか
方法が無さそうです。
言語の判断はこちらを利用しました。
お手軽に言語判定を行いたい - C#ATIA
※当時思い付きこれを作りましたが、後に海外の方も同様の方法で
 言語判断されているのを見たことがあります。

サンプルはこちらです。

'vba リンクの結果として のリンクを分離

Option Explicit

Sub CATMain()

    Dim partDoc As PartDocument
    Set partDoc = CATIA.ActiveDocument

    'ソリッドの検索
    Dim sel As Selection
    Set sel = partDoc.Selection

    sel.Search "CATPrtSearch.MechanicalFeature,all"
    If sel.Count2 < 1 Then
        MsgBox "対象要素がありません!"
        Exit Sub
    End If

    '外部リンク付きソリッドの取得
    Dim targetFeatures As Collection
    Set targetFeatures = New Collection
    
    Dim feature As Solid
    
    Dim i As Long
    For i = 1 To sel.Count2
        Set feature = sel.Item(i).Value
        
        If has_sourceElement(feature) Then
            targetFeatures.Add feature
        End If
    Next

    If targetFeatures.count < 1 Then
        MsgBox "対象要素がありません!"
        Exit Sub
    End If

    '言語からコマンドID取得
    Dim lang As String
    lang = GetLanguage()
    
    Dim cmd As String
    
    Select Case lang
        Case "ja"
            cmd = "分離"
        Case "en"
            cmd = "Isolate"
        Case Else
            MsgBox "CATIAの言語が判断出来ない為中止します"
            Exit Sub
    End Select

    '分離コマンド実行
    For Each feature In targetFeatures
        sel.Clear
        sel.Add feature
        CATIA.StartCommand cmd
    Next
    sel.Clear
    
    partDoc.Part.Update

    MsgBox "Done"

End Sub

'外部リンクを持っているか判断
Private Function has_sourceElement( _
    ByVal feature As Solid) _
    As Boolean

    Dim dmy As AnyObject

    On Error Resume Next
    
    Set dmy = feature.SourceElement

    On Error GoTo 0
    
    has_sourceElement = IIf(dmy Is Nothing, False, True)

End Function

'言語取得
'return-ISO 639-1 code
'https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7
Private Function GetLanguage() As String
    GetLanguage = "non"
    If CATIA.Windows.count < 1 Then Exit Function
    GetLanguage = "other"
    CATIA.ActiveDocument.Selection.Clear
    Dim st As String: st = CATIA.StatusBar
    Select Case True
        Case ExistsKey(st, "object")
            '英語-Select an object or a command
            GetLanguage = "en"
        Case ExistsKey(st, "objet")
            'フランス語-Selectionnez un objet ou une commande
            GetLanguage = "fr"
        Case ExistsKey(st, "Objekt")
            'ドイツ語-Ein Objekt oder einen Befehl auswahlen
            GetLanguage = "de"
        Case ExistsKey(st, "oggetto")
            'イタリア語-Selezionare un oggetto o un comando
            GetLanguage = "it"
        Case ExistsKey(st, "オブジェクト")
            '日本語-オブジェクトまたはコマンドを選択してください
            GetLanguage = "ja"
        Case ExistsKey(st, "объект")
            'ロシア語-Выберите объект или команду
            GetLanguage = "ru"
        Case ExistsKey(st, "象或")
            '中国語-???象或?羅
            GetLanguage = "zh"
        Case Else
            Select Case Len(st)
                Case 13
                    '韓国語-???? ?? ?? ?? unicode未対応の為
                    GetLanguage = "ko"
                Case 23
                    '日本語-日本語版以外のため
                    GetLanguage = "ja"
                Case Else
                    'それ以外
            End Select
    End Select
End Function

'文字列内に指定文字が存在するか?
'大文字小文字は無視
Private Function ExistsKey(ByVal txt As String, ByVal key As String) As Boolean
    ExistsKey = IIf(InStr(LCase(txt), LCase(key)) > 0, True, False)
End Function