API プログラムから要素を抽出して選択状態にしたい

API プログラムから要素を抽出して選択状態にしたい

Anonymous
適用対象外
1,062件の閲覧回数
9件の返信
メッセージ1/10

API プログラムから要素を抽出して選択状態にしたい

Anonymous
適用対象外

操作で直接要素を選択するのではなく、開設中モデル中の要素を順に抽出して選択状態にしたいです。

(最終的には「パラメーター一覧」のように一覧画面で行選択すると要素が選択状態になるようにしたい)

 

下記のように ui.activeSelections.add(エンティティ)と指定すると、一見できそうに思えますが、

次のような問題がありました。

 

1.参照要素の場合、元の要素モデルの位置・回転方向が選択状態として表示され、
  直接選択またはブラウザで要素選択した場合のように、表示中要素の配置位置・回転方向で選択表示されない

 

2.処理が次の要素に移っても、前の選択状態が残る(activeSelections.clearは関係ない模様)

 

この現象は、Component、BRepBodyのいずれを選択指定しても同じです。

また、画面を用意してSelectionCommandInputを作成してaddSelectionで抽出要素を選択状態にしても同様です。

 


app = adsk.core.Application.get()

ui = app.userInterface

design = app.activeProduct 

rootComp = design.rootComponent

 

for i in range(0, rootComp.allOccurrences.count):

  occ = rootComp.allOccurrences.item(i)

  

  if (occ.isReferencedComponent):

    eComponent = occ.component

    eName = eComponent.name

    ePartNumber = eComponent.partNumber

 

    eVolume = eBody.volume

 

    ui.activeSelections.clear

    ui.activeSelections.add(eComponent)

    ui.messageBox("name:%s partNumber:%s volume:%d"%(eName,ePartNumber,eVolume))

画像.jpg

 

0 件のいいね
解決済み
1,063件の閲覧回数
9件の返信
返信 (9)
メッセージ2/10

kandennti
Mentor
Mentor

aquametさん こんにちは

答えではなく、興味があったもので…

 

サンプルコードですが、eBodyが無かった為エラーになりこんな感じで

試してみました。(体積なしです)

import adsk.core, adsk.fusion, adsk.cam, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
        design = app.activeProduct
        rootComp = design.rootComponent
        
        for occ in rootComp.allOccurrences:
            if (occ.isReferencedComponent):
                eComponent = occ.component
                eName = eComponent.name
                ePartNumber = eComponent.partNumber
                ui.activeSelections.clear
                ui.activeSelections.add(eComponent)
                ui.messageBox("name:%s partNumber:%s"%(eName,ePartNumber))
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

「1」については、確かに元の位置での選択状態に表示されてますね。

 プロパティで重心位置を確認しても、元の位置での重心位置っぽいです。

 

「2」についても、確かに表示が残ったままで(Forの外にしても)

clearが機能していない雰囲気は感じます。

(スプリクト実行後にプロパティを表示させても、最初のものが表示されました)

画面をリフレッシュすれば解決しそうな感じもしますが、Fusion360のスプリクトには

そのような機能が有ったかどうか・・・。

 

>開設中モデル中の要素を順に抽出して選択状態にしたいです。

activeSelectionsがイマイチなので、これを避けて目的を達成する事を

考えても良さそうな気がするのですが、選択後に行いたい処理は何でしょうか?

0 件のいいね
メッセージ3/10

Anonymous
適用対象外

行いたい処理は、開設中モデルにおける参照要素(リンク要素)を画面にて一覧表示し、
各要素にAttributeとして識別記号を(画面からマニュアルで)設定したいと思っています。

その際、要素をひとつずつマウスでクリックしたら漏れや見落としがあるので、
画面上の一覧にチェックボタン等を配置してチェックと同時に要素を選択状態にしたいです。

 

2.の問題(残像が残る)については、画面上にSelectionCommandInputを配置して、
行選択のたびにclearSelectionとaddSelectionを繰り返す方法を模索中です。

 

次善の策として、ブラウザの要素ツリーから(リンク要素)を選択→

(要素一つ分の)画面を表示してAttribute設定 という方法も考えましたが、

ブラウザ要素選択に関するAPIが見当たりません。

(SelectionCommandInputでは、ブラウザ上の要素を選択できません)

0 件のいいね
メッセージ4/10

Anonymous
適用対象外

失礼しました。「ブラウザ上の要素選択」については、想定する処理に矛盾がありました。

画面を先に起動してSelectionCommandInput あるいは ui.selectEntity で要素選択を求める方法
では、(仮にブラウザ上の要素が選択できたとしても)目的は達成できません。

 

ブラウザ上の要素に対するポップアップメニュー(マウス右ボタンで表示)でプログラムを起動→
画面を表示してAttributeを設定 がやりたい処理です。

 

0 件のいいね
メッセージ5/10

kandennti
Mentor
Mentor

既に自分の知識を超えた領域になってしまっているので、
意図している事とは別問題になっているかもしれませんが…。

 

>要素をひとつずつマウスでクリックしたら漏れや見落としがあるので、
要素がコンポーネントと解釈したのですが、こちらのサンプルのTableCommandInputを
利用して一覧を表示させてみてはどうでしょうか?

https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-e5c4dbe8-ee48-11e4-9823- f8b156d7cd97

 

1.png

 

 

とてもコードをUpできる状態ではないので
画像だけですが、こんな感じです。
1行目にコンポーネント名
2行目に任意の属性を表示
です。

 

 

 

 

 

テーブル選択時のイベントでコンポーネントをズームしたり
修正時のイベントでダイアログ上の属性を修正した際、
同期して修正できるようにしたり
等、現状の自分の知識では出来るものかどうかも判断できませんが、
出来るような気もしてます。

 

…よくわかっていないので申し訳ないのですが、Attributeについてです。
Helpを読み、簡単なテストで何となく使い方は理解したつもりなのですが、
手動で操作した際に、これらを視覚的に確認する方法はあるのでしょうか?

0 件のいいね
メッセージ6/10

Anonymous
適用対象外

コメントありがとうございます。

ご指示のあったURLがリンク切れしていましたが、おっしゃることの意味はわかります。

意図していたのは、開設中モデルから参照パーツを収集し、このようなテーブル一覧で表示し、

行選択イベントをキャッチして、「対象要素を選択状態にすることで、どのパーツかを明示的に知らせる」

ということでした。

この「選択状態にする」がうまくいかない(参照元パーツモデルの原点・向きになる)のが問題だった

わけです。

 

現在考えている対策としては、以下の2案です。

 

案1)テーブル上の行選択のタイミングで、一時的に色(Appearance)を変更する

   ・・・次行選択時や画面終了時に元の色(や素材)に戻す必要があるが、

      強制終了・異常終了時にException処理できちんと戻せるかが不安

   ・・・色変更以外に、対象要素以外を一時的に非表示にするなどが考えられますが、

      いずれにしても元の状態にきちんと戻せるかが問題になります。

 

案2)要素ひとつずつ、画面表示→要素クリックによる選択→属性設定 を繰り返す。別コマンドで、

   モデル内の参照要素を一覧表示してすべての参照要素に属性設定されていることを確認する。

   一覧画面で属性設定されていない要素がみつかった場合は、

   一覧画面でパーツ名を確認し記憶→画面を一旦終了→ブラウザでパーツをクリック

   →そのパーツの位置を記憶した上で、再度最初の操作(要素ごとの属性設定)を実施する。

   ・・・オペレーションが煩雑

0 件のいいね
メッセージ7/10

kandennti
Mentor
Mentor
解決済み

恐らく、これで意図した処理になっているかと思われます。

 

import adsk.core, adsk.fusion, adsk.cam, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
        design = app.activeProduct
        rootComp = design.rootComponent
        
        for occ in rootComp.allOccurrences:
            if (occ.isReferencedComponent):
                eName = occ.name
                ePartNumber = occ.component.partNumber
                ui.activeSelections.add(occ)#ここはコンポーネントではなくオカレンス
                ui.messageBox("name:%s \npartNumber:%s"%(eName,ePartNumber))
                ui.activeSelections.clear()#ここでは()を付ける
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

 

>1.参照要素の場合、元の要素モデルの位置・回転方向が~

 選択させる際に追加するのは、コンポーネントではなくオカレンスにすることで

 移動・回転後のものが選択状態になりました。

 本家APIコミュのスーパーマン、エンキンスおじさん(Autodeskは退社)が何処かで

 「コンポーネントは表向きで、本当はオカレンス」のような書き方をした回答が

 あったのを思い出しました。

 オカレンスは画面上には出て来ない(恐らく)ものなので、個人的には戸惑います。

 

>2.処理が次の要素に移っても、前の選択状態が残る~

 メソッドなので引数が必要なくても最後に () を付ける必要があるようです。

 (正直、エラー出して欲しい…)

 

ところで、Attributeは手動で操作した際に、これらを視覚的に

確認する方法はあるのでしょうか???

0 件のいいね
メッセージ8/10

Anonymous
適用対象外
解決済み

意図していた通りの動きになりました。

ありがとうございました。

Componentが参照元のオリジナルモデルに対応し、Occurrenceが移動や回転を加えた現モデル内での姿に
対応しているということですね。

このあたりの関係をよく把握できていませんでした。

clear()に関しては、私Python初心者で、つい普段使用している関数型言語(Scala)の癖が出てしまいました。

以後気をつけるようにします。

0 件のいいね
メッセージ9/10

Anonymous
適用対象外

Attributeを視覚的に確認できる方法があればいいのですが、難しいとおもってあきらめています。

できれば、ブラウザツリー上で、電球アイコンのようにアイコンをつけられればベストなのですが、

さすがにそのようなAPIはないのかなと思っています。

 

解決策として承認を入れ間違えて自分の返信に入れてしまいました。すみません。

0 件のいいね
メッセージ10/10

kandennti
Mentor
Mentor

>Attributeを視覚的に確認できる方法があればいいのですが、

今までこの機能に気が付かなかったので、"すごい事を考えておられるな"

と感じていました。

本当にスプリクトの為の機能のようなものなんですね。

0 件のいいね