SelectionCommandInputのaddSelectionについて

SelectionCommandInputのaddSelectionについて

obatake5TC3R
Advocate Advocate
1,834 Views
8 Replies
Message 1 of 9

SelectionCommandInputのaddSelectionについて

obatake5TC3R
Advocate
Advocate

CommandCreatedEventHandlerで作成しているSelectionCommandInputに

addSelection(body)を行って選択エンティティをAPIを使ってボディを自動選択させるとエラーとなってしまうのですが、どこかにサンプルプログラムはないでしょうか?

 

0 Likes
Accepted solutions (1)
1,835 Views
8 Replies
Replies (8)
Message 2 of 9

kandennti
Mentor
Mentor

@obatake5TC3R さん こんにちは。

 

正式な記述があるかどうか不明なのですが、個人的な印象です。

CommandはCommandCreatedEventを終了した時点で出来上がるのだと思います。

つまりイベント中にSelectionCommandInputのインスタンスを作ってもイベントを

抜けるまではaddSelectionは受け付けてくれないのだろうと思います。

(勝手な想像かも知れません)

 

CommandCreatedEventは、他のEventとはちょっと異なる特別なもののような

気がしますよ。

0 Likes
Message 3 of 9

obatake5TC3R
Advocate
Advocate

SelectionCommandInputはCommandCreatedEventHandlerの中でaddSelectionInputで生成しています。

コマンドを起動後ボタン(BoolValueCommandInput)をクリックすると指定したComponentに登録しているBodyをすべて選択にしたいのですが、APIを使ってできないでしょうか?

0 Likes
Message 4 of 9

kandennti
Mentor
Mentor

以前、こちらに記載していたのですが、やはりCommandCreatedイベント中は出来ないと

Helpに記載されていました。

https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/validateinputseventhandlernoibentoniyoru-hubi-ch... 

 

CommandCreatedイベントを抜け、コマンドのactivateイベント時であれば

addSelectionが出来ます。(当時テストし上手く行った記憶あります)

 

activateイベント時でaddSelectionすれば、ダイアログが表示されるタイミングで

選択された状態になると思いますよ。

 

0 Likes
Message 5 of 9

obatake5TC3R
Advocate
Advocate

ご指定タグはValidateInputsEventHandlerのサポートページに飛んでしまいます。

http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-3b095369-42d6-481f-a6f3-9d45775aba3a

ページでしょうか?

0 Likes
Message 7 of 9

obatake5TC3R
Advocate
Advocate

CommandCreatedEventHandlerで

Ptr<SelectionCommandInput> selectionStitchFacesInput = inputs->itemById("MoldStitchFacesInput");
if (!selectionStitchFacesInput)
{
selectionStitchFacesInput = inputs->addSelectionInput("MoldStitchFacesInput", u8"パーティング面", u8"パーティング面(複数)を選択します。");
if (!selectionStitchFacesInput)
return;
selectionStitchFacesInput->isFullWidth(false);
selectionStitchFacesInput->addSelectionFilter("SurfaceBodies");
selectionStitchFacesInput->setSelectionLimits(0);
}

とselectionStitchFacesInputを生成しています

InputChangedEventHandlerで

Ptr<BRepBodies> bodies = occ->component()->bRepBodies();
if (!bodies)
return;
// サーフェスボディを読み取り
if ( bodies->count() )
{
Ptr<SelectionCommandInput> selectionInput = inputs->itemById("MoldStitchFacesInput");
if (!selectionInput)
return;
for (size_t i = 0; i < bodies->count(); i++)
{
Ptr<BRepBody> body = bodies->item(i);
if (body)
{
if (!selectionInput->addSelection(body))
{
checkLastError();
return;
}
}
}
}

とselectionInput->addSelection(body))部分でコンポーネントに登録されているBodyを指定するとエラーとなります。

エラーの内容は

「invalid argument selection」となっています。

ここのBRepBodyはSurfaceBodyです。

InputChangedEventHandlerの内部ではaddSelection()は使用できないのでしょうか?

0 Likes
Message 8 of 9

kandennti
Mentor
Mentor

pythonで試してみましたが、InputChangedイベント内でaddSelectionは問題無く出来ます。

 

正直な所、試すまではInputChangedイベント内でaddSelectionすると無限ループになるのでは?

と思っていましたが、なりませんでした。

 

C++が分かっていないのですが、IF文での処理では無く(正しくない可能性大)

Ptr<bool> hoge = selectionInput->addSelection(body);

のように変数で受け取るだけの場合もエラーですか?

 

 

もう一つ気になるのが、ネストが深くないでしょうか??

処理したいものをIf文で絞り込んでいくと、ネストが深くなりがちですが、

処理したくないものをIfで拾い出し、ジャンジャンReturn(又はcontinue)

すると残ったものが自然と処理したいものになるので、ネストが浅くなると

思いますが・・・。

 

0 Likes
Message 9 of 9

obatake5TC3R
Advocate
Advocate
Accepted solution

Ptr<BRepBodies> bodies = occ->component()->bRepBodies();

を

Ptr<BRepBodies> bodies = occ->bRepBodies();

に変更するとうまくいきました。

 

0 Likes