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