C#ATIA

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

CommandDefinitionsオブジェクト1

マクロやスプリクトでは、常に手動操作と同じ機能を利用する事は出来ません。
それはソフト自体がAPIとして、オブジェクト・メソッド・プロパティ等を公開して
くれているか否かに依存しているのが、正直なところです。

それらが公開されていない場合でも極わずかですが、可能性が有ります。
それはマクロやスプリクトでコマンド自体を実行する事です。
CATIAの場合は、こちらで利用している「StartCommand」です。
ビュー名のテキストを追加する - C#ATIA

これと同等な機能をFusion360では長い間見つける事が出来なかったのですが、
先日たまたま見つけました。

こちらのオブジェクト説明の「ネイティブコマンド用にFusion 360によって
定義されたコマンド定義も含まれています」の文言で気が付きました。
Help

Fusion360のスプリクトを(コード的に)実行する方法には
・単に処理を行う
・コマンドを自作し、コマンドとして処理を行う
(恐らく)2種類有り、後者の方法では必ず使用するオブジェクトです。


こちらのトピに記載されている「選択セット」も質問者さんの書かれている通り
オブジェクト自体は公開されていませんが、スプリクトでコマンドを実行するために
必要なコマンドIDは取得出来ました。(で、それを利用した回答を行いました)
Solved: Re: API for working with Selection Sets - Autodesk Community

最後の部分にコマンドIDリストをファイルに書き出すコードを記載しましたが、
(_ui は ui の間違いです…)IDだけではわかりにくいため、少し修正し
IDとコマンド名をCSVファイルとして書き出すコードにしました。

#fusion360 python
#CommandID Write to File ver0.0.2
import adsk.core, adsk.fusion, traceback
 
#UnicodeEncodeError回避の為に参考になりました
#https://teratail.com/questions/31989
def run(context):
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
        
        path = r'C:\temp\fusion360_commands_list.csv'
        cmds = []
        for cmd in ui.commandDefinitions:
            cmds.append('{},{}'.format(
                cmd.id,cmd.name.encode("CP932", "ignore").decode("CP932")))
        cmds.sort()
        output = open(path, 'w')
        output.writelines('\n'.join(cmds))
        output.close()        
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

基本的に、この方法を利用出来るコマンドは、
・ダイアログが出ない
・事前選択で対応出来る
の条件が必要です。

ビュー名のテキストを追加する

こちらで記載した事の確認です。
複数のビュー名とリンクした状態のテキストを新作 - C#ATIA

属性リンクを持ったテキストの作成は非常に面倒なのですが、
(しかも確認する手段が無い)単純にビュー名とリンクした状態の
テキストの作成であれば単純です。
日本語「図の名前を追加」
英語「Add View Name」
のコマンドをマクロで実行するだけです。

’vba
Option Explicit

Sub CATMain()

    'コマンド - 言語依存しているので適切なものを!
    Dim cmd As String
    'cmd = "図の名前を追加" '日本語
    cmd = "Add View Name" '英語
    
    'ビュー選択
    Dim msg As String
    msg = "ビュー名のテキストを追記するビューを選択してください / ESC-キャンセル"
    
    Dim filter As Variant
    filter = Array("DrawingView")
    
    Dim sel As Variant 'Section
    Set sel = CATIA.ActiveDocument.selection
    
    sel.Clear
    Select Case sel.SelectElement2(filter, msg, False)
        Case "Cancel", "Undo", "Redo"
            Exit Sub
    End Select

    Call CATIA.StartCommand(cmd)
    
End Sub

マクロ内で事前選択して、コマンド実行です。

こちらに記載したコマンドIDが判れば、言語依存が無くなるのですが
見つかりませんでした。
コマンドID - C#ATIA

右クリックのショートカットキー

要はキーボード操作でコンテキストメニューを表示させたいんです。
検索したら出てきました。
【簡単‼】マウスを使わずに右クリックをキーボードで表示させる方法 | カラバリ

あるじゃない! もっと早く調べれば良かった。
アプリケーションキー」か「Shift」+「F10」なんですね。

目的はPowerMillで細々した面を選択した状態で、コンテキストメニュー
表示させたい時等で、選択要素からちょっとズレちゃうと、目的じゃない
メニューが表示されたり、それを回避しようとすると誤って違う事して
細々した選択を再度行う必要があったり・・・。

で、試してみました。
・・・コンテキストメニュー表示されないじゃないですか!
確かに、エクスプローラーやデスクトップ上とかは反応するのですが。

ソフトの作り方なんだろうなぁ。 ちなみにCATIAも反応無しです。

Assy状態の位置を保ちながら、コンポーネント毎にSTLでエクスポート

モデリングFusion360で、レンダリングは他のソフトで と言う
需要があるようです。こちらを見ると。
Solved: Exporting A design to multiple STL's with their location ant rotation data. - Autodesk Community

内容的には、Assy状態丸ごとでSTLでエクスポートするのではなく、
コンポーネント毎に行いたいようです。
・・・Componentでは無く、Occurrenceをエクスポートしているコードなので
間違っていないと思いますね。質問者さんが困惑するのも理解出来ます。

何となく解決出来そうだな と思い挑戦してみましたが最初に投げたコードでは
コンポーネント毎では無く、ボディ毎にエクスポートされちゃうようです。

うーんと悩んだのですが、表示しているもののみがエクスポートされることに
気が付き、ライトのON OFFを切り替えながらエクスポートするように
変更してみました。
Solved: Re: Exporting A design to multiple STL's with their location ant rotation data. - Autodesk Community
孫以下のコンポーネントについては、上手く行かない可能性が高い(未テスト)
のですが、きっと大丈夫でしょう。


お陰様でAPI and ScriptsでTop似なれました。
f:id:kandennti:20190606124955p:plain
前にも一度なったんですけどね。

複数のビュー名とリンクした状態のテキストを新作

恐らく、こちらの2つの目的を一体化したものがお望みだろうと
思われる質問を頂きました。
カレントビューの角度や生成スタイルの取得2 - C#ATIA
検索したテキストの文字を、指定したテキストに追記する - C#ATIA

言葉にすると・・・
「複数のビュー名とリンクした状態のテキストを新作したい」
と解釈しました。

f:id:kandennti:20190604192043p:plain
単に「こちらの青のテキストを削除しちゃって、復活させたい」と言う事では
無いですよね?
これであれば、マクロを使うまでも無く、こちらのコマンドで可能です。
f:id:kandennti:20190604192051p:plain
・・・マクロだと、StartCommandで出来るのかな?


さて本題ですが、DrawingTextって、困った事に "式" が利用できないですよね?
リンクした状態を作る為には、属性リンクを利用する以外方法を知らないです。
こちらの経験が生かせそうです。
2D属性リンクを扱いたい1 - C#ATIA

'vba
Sub CATMain()
    
    'ドキュメント
    Dim dwDoc As DrawingDocument
    Set dwDoc = CATIA.ActiveDocument
    
    'selection
    Dim sel As selection
    Set sel = dwDoc.selection
    
    '検索-紫の文字
    sel.Clear
    sel.Search "CATDrwSearch.DrwText.Color='(128,0,255)',all"
    
    If sel.Count2 < 1 Then
        MsgBox "該当する文字は見つかりませんでした"
        Exit Sub
    End If
    
    '検索でHitした文字のビュ-の取得
    Dim viLst As Collection
    Set viLst = New Collection
    
    Dim i As Long
    For i = 1 To sel.Count2
        viLst.Add sel.Item2(i).Value.Parent.Parent
    Next
    sel.Clear
    
    'ビュ-名のパラメータの取得
    '本当は重複削除チェックすべき
    Dim prmLst As Collection
    Set prmLst = New Collection
    
    Dim vi As DrawingView
    Dim subLst As Parameters
    Dim prm As Parameter
    For Each vi In viLst
        Set subLst = dwDoc.Parameters.SubList(vi, False)
        Set prm = GetParameter("Name", subLst)
        If Not prm Is Nothing Then
            prmLst.Add prm
        End If
    Next
    
    'アクティブビューに空のテキスト新作
    Dim actVi As DrawingView
    Set actVi = dwDoc.Sheets.ActiveSheet.views.ActiveView
    
    Dim txt As DrawingText
    Set txt = actVi.Texts.Add(String(prmLst.Count, vbLf), 0, 0)
    
    '属性リンクを追加
    For i = 1 To prmLst.Count
        txt.InsertVariable Len(txt.Text) - (prmLst.Count - i), 0, prmLst(i)
    Next

    '終わり
    MsgBox "Done"

End Sub

'パラメータ取得
Private Function GetParameter( _
    ByVal key As String, _
    ByVal params As Parameters) As Parameter
    
    Set GetParameter = Nothing
    
    Dim prm As Parameter
    Err.Number = 0
    On Error Resume Next
        Set prm = params.Item(key)
    On Error GoTo 0
    
    Set GetParameter = prm
End Function

こんな感じのデータを用意しました。
f:id:kandennti:20190604192124p:plain
上記のマクロを実行すると、紫のテキストを持つビュー名を取得し、
アクティブビューの原点付近にリンク付きのビュー名リストのテキストが出来上がります。
ややこしいのでこんな感じです。
f:id:kandennti:20190604192134p:plain

簡単に確認したところ、ID・Suffixの修正も反映されます。

正直な所、これ以上先は手動でしか出来そうに有りません。
(マクロで修正すると属性リンクが消えます)
DrawingViewに事前に改行を入れることで対応しましたが、ここが一番難しかった。
DrawingViewの改行はラインフィールド(vbLf)です。

検索したテキストの文字を、指定したテキストに追記する

御質問頂いた内容を正しく理解できているかわからないのですが、
「Drawで検索してHitしたテキストの文字を、他のテキストに追記したい」
と理解しました。

テストするものは、このような感じにしました。
f:id:kandennti:20190604125304p:plain

コードはこちら。

'vba
Sub CATMain()
    
    'ドキュメント
    Dim dwDoc As DrawingDocument
    Set dwDoc = CATIA.ActiveDocument
    
    'selection
    Dim sel As selection
    Set sel = dwDoc.selection
    
    '検索-紫の文字
    sel.Clear
    sel.Search "CATDrwSearch.DrwText.Color='(128,0,255)',all"
    
    If sel.Count2 < 1 Then
        MsgBox "該当する文字は見つかりませんでした"
        Exit Sub
    End If
    
    '文字取得
    Dim txts() As String
    ReDim txts(sel.Count2 - 1)
    
    Dim i As Long
    For i = 1 To sel.Count2
        txts(i - 1) = sel.Item2(i).Value.Text
    Next
    
    '挿入する文字選択
    Dim selVar As Variant
    Set selVar = sel
    
    Dim msg As String
    msg = "挿入するテキストを指定してください"
    
    Dim filter As Variant
    filter = Array("DrawingText")
    
    Select Case selVar.SelectElement2(filter, msg, False)
        Case "Cancel", "Undo", "Redo"
            Exit Sub
    End Select
    
    Dim target As DrawingText
    Set target = selVar.Item2(1).Value
    
    '検索した文字をターゲットに追加-改行入れてます
    target.Text = target.Text & vbCrLf & Join(txts, vbCrLf)
    
    '終わり
    MsgBox "Done"

End Sub

ここから紫色の文字を検索で取得し、指定したテキストに取得した
文字を追記します。
仮に「バージョン 5 の終了」の文字を指定するとこんな感じになります。
f:id:kandennti:20190604125249p:plain

カレントビューの角度や生成スタイルの取得2

こちらの続きです。
カレントビューの角度や生成スタイルの取得 - C#ATIA

前回「IDやSuffixが関係してくると、もうちょっとややこしいです。」と書いた
ビュー名辺りのお話です。

こんな状態のデータです。
f:id:kandennti:20190604111851p:plain
ここでこちらのコードを実行します。

'vba
Sub CATMain()
    
    Dim msg As String
    
    'ドキュメント
    Dim dwDoc As DrawingDocument
    Set dwDoc = CATIA.ActiveDocument
    
    'カレントビュー
    Dim actVi As DrawingView
    Set actVi = dwDoc.Sheets.ActiveSheet.views.ActiveView
    
    'ビュー名変更
    actVi.Name = "HOGE"
    msg = "ビュー名 : " & actVi.Name
    
    MsgBox msg, , "** カレントビュー情報 **"
    
End Sub

ビュー名が変わり、ビュー内のテキストも変更されます。
f:id:kandennti:20190604111925p:plain

ビューのプロパティを見ると、式が利用されているようです。
f:id:kandennti:20190604111939p:plain
(ビュー内のテキストの「1:1」は属性リンクかな?)


御質問頂いた内容は、Prefix・ID・Suffixを扱うと言う内容だと
思いましたので、これからが本題です。
IDとSuffixが空欄では味気ないので、こんな感じにして見ました。
f:id:kandennti:20190604111948p:plain
こちらのマクロを実行します。

'vba
Sub CATMain()
    
    Dim msg As String
    
    'ドキュメント
    Dim dwDoc As DrawingDocument
    Set dwDoc = CATIA.ActiveDocument
    
    'カレントビュー
    Dim actVi As DrawingView
    Set actVi = dwDoc.Sheets.ActiveSheet.views.ActiveView
    
    'ビュー名の取得
    Dim prefix As String, ident As String, suffix As String
    actVi.GetViewName prefix, ident, suffix
    
    MsgBox "Prefix:" & prefix & vbCrLf & _
           "Ident:" & ident & vbCrLf & _
           "Suffix:" & suffix
    
    'ビュー名の変更
    prefix = "PIYO"
    ident = " HUGA"
    suffix = " POYO"
    
    actVi.SetViewName prefix, ident, suffix
    
    MsgBox "Prefix:" & prefix & vbCrLf & _
           "Ident:" & ident & vbCrLf & _
           "Suffix:" & suffix
    
End Sub

一度Get~して、修正時はSet~です。実行後がこちら。
f:id:kandennti:20190604112007p:plain
ん?Tree側のビュー名が変更されていません。 手動でビューのプロパティ
開いたり何らかのアクションを起こせば、正しく表示されるのですが・・・。
ビューのUpdateもダメ、RefreshDisplayもダメ、強制更新すれば良いのかも
知れませんが、重いデータで行うのは気が引けます。

イロイロとお手軽そうな操作で探すと、アクティブなビューを変更すると
正しい表示になったので、一時的にバックグラウンドをアクティブにし
再度元のビューをアクティブにするように変更しました。

・・・
    actVi.SetViewName prefix, ident, suffix
    
    '追加
    Dim vis As DrawingViews
    Set vis = dwDoc.Sheets.ActiveSheet.views

    vis.Item(2).Activate
    actVi.Activate
    'ここまで
    
    MsgBox "Prefix:" & prefix & vbCrLf & _
           "Ident:" & ident & vbCrLf & _
           "Suffix:" & suffix

End Sub

上手く行きました。
f:id:kandennti:20190604112018p:plain