Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

既存のモデルファイルを読み込んだ時に、自動でチェックが入るようにする #2

Open
fkanehiro opened this issue Nov 26, 2015 · 14 comments

Comments

@fkanehiro
Copy link
Owner

本体側の制限かもしれませんが、モデルを読み込んでもチェックが入らず、複雑なロボット全体を表示するには、チェックを入れるために何度もクリックしなければならず大変です。
読み込んだら自動でチェックが入るとか、トップのアイテムにチェックを入れると子供も全てチェックが入るとかできないでしょうか。

@yosuke
Copy link
Contributor

yosuke commented Nov 26, 2015

この問題については私も不便に思っていて、ここなどで自動でチェックするようには書いているのですが、チェックされてくれません。

https://github.com/fkanehiro/choreonoid-editor/blob/master/src/ModelEditPlugin/EditableModelItem.cpp#L163

APIを発行するタイミングの問題なのかな、とも思っているのですが、まだよくわかっていません。

@fkanehiro
Copy link
Owner Author

@s-nakaoka さん、何か分かりますか?

@s-nakaoka
Copy link

新規読み込み時のチェックについては、設計との兼ね合いもあって難しいところなのですが、要望が多いので対処法を考えたいと思います。
とりあえず複数アイテムを選択した状態で右クリックメニューの「チェック」を実行することで、一度にまとめてチェックのオン・オフができます。

@fkanehiro
Copy link
Owner Author

なるほど、そういうやり方もあったのですね。
ただ全て入れたら入れたで、いらないものまで表示されて見づらかったりするので、各アイテムの方でデフォルトで入れる/入れないを選ぶ、選択的に入れるということができるようになるとよいと思います。

@yosuke
Copy link
Contributor

yosuke commented Nov 30, 2015

ロード後(アイテムツリー構築後にシーングラフの構築が行われるのでそのあと?)であればAPIでオンオフできると理解しました。

まとめてオンオフ機能、やるとすれば

  • リンクだけ全てオン、ジョイントだけ全てオン、センサだけ全てオンなど種類ごとのオンオフ制御
  • ツリー構造を意識して親リンクをオンすると子リンクもオンになる

のような制御になるかと思うのですが、こうすると使いやすそう、というアイディアはありますでしょうか?

@fkanehiro
Copy link
Owner Author

デフォルトは形状データだけ全てオンでしょうか。
ジョイントやセンサはごくたまに使いたい時がありそうですが、手動でもよいのかなと。

@s-nakaoka
Copy link

ロード後(アイテムツリー構築後にシーングラフの構築が行われるのでそのあと?)であればAPIでオンオフできると理解しました。

アイテムに関しては、アイテムがrootのアイテムにつながるタイミング(既にrootにつながっているアイテムからaddChildItemする、自身が存在するサブツリーのトップが同様にaddChildされる、等)でその旨のシグナルが発行され、これをItemTreeViewがとらえてItemTreeViewにアイテムが追加されます。その後初めてチェック状態の切り替えが可能になります。チェック状態はアイテム自身ではなく、ItemTreeViewの方がもつ仕様としているからです。

この仕様の理由ですが、ItemTreeViewは複数インスタンスの生成も可能として、機能やビューによってはそれ専用のItemTreeViewを持たせることも考えていたからです。例えば複数のシーンビューごとに専用のItemTreeViewをくっつけて、各シーンビューの表示の管理はそれぞれのItemTreeViewで行うとか。この場合、ひとつのアイテムに対して複数のチェック状態が存在することになるので、アイテム自身にチェック状態を持たせることができません。つまり、ドキュメント・ビューやMVC的な観点で、チェック状態はあくまでビュー側の要素だとした設計になっています。

ただ、ItemTreeViewの複数インスタンスを実際に導入したことはまだありません。上記の複数シーンビューの例では、ItemTreeView上に別のチェック状態を追加するという手段をとることにしました。これはシーンビューの設定ダイアログの「対象アイテム選択用の専用のチェックをアイテムツリービューに追加」をオンにすると利用可能となります。実際に複数のItemTreeViewを導入するなると、わかりにくくなってしまうかもしれませんね。

そうは言っても、この設計は維持しておきたく思っています。その分汎用性は高められると思うのですが、チェック状態をアイテム自身が有する場合と比べて、ちょっと分かりにくくなっている面もあります。

@yosuke
Copy link
Contributor

yosuke commented Nov 30, 2015

なるほど、基底のItemクラスにisEnabledみたいなプロパティを作ってItemツリーを構築するときに見てもらうというような実装でもよいのかな、という気もしていたのですが、アスペクトの違うツリーを構築することを考えると状態はツリーの数だけ存在しますね。

isEnabledByDefaultみたいな苦しいプロパティを作るか、lazy callみたいな仕組みでロード後にAPIを発行できるようにするかですかね。
今でもツリー構築完了のシグナルを拾って自分自身でオンする実装もできなくないような気がしていますが、ちょっと実装が汚くなりそうだな、という予感はしています。

@yosuke
Copy link
Contributor

yosuke commented Nov 30, 2015

それかbool isEnabledOnTree(ItemTreeViewPtr tree)みたいな関数を基底に作るのはどうでしょうか?

変な誤解のもとになってしまう危険はありそうですが、それなりにきれいなのではないかと思うのですが。

@s-nakaoka
Copy link

実は今本件対応のための実装を進めています。
ItemManagerにメニューからファイルダイアログでファイルオープンする際の処理も記述しているのですが、そこである型のアイテムに対してデフォルトでチェックを入れるかどうかの状態をもたせて、それを切り替えるチェックボックスをファイルオープンダイアログに追加でのせます。また、その状態はChoreonoidのconfigファイルに保存します。これでチェックをオンにして読みこめば自動でチェックがされて、チェックのオンもその後維持されるというようにします。

@s-nakaoka
Copy link

実装しました。
s-nakaoka/choreonoid#50

@fkanehiro
Copy link
Owner Author

この機能でEditableModelItemだけはチェックが入るようになりましたが、その先はどうしたらよいということでしょうか?

@yosuke
Copy link
Contributor

yosuke commented Nov 30, 2015

モデル編集機能の場合、EditableModelItem以下に異種のJointItemやLinkItemが独立したアイテムとしてぶら下がる形(ファイルオープンは無い)なので、この対処にプラスしてItemManagerにデフォルトの値を登録するプログラム的な作業が必要かもしれませんね。

@fkanehiro
Copy link
Owner Author

いろいろ表示が豪勢になってきたこともあって、チェックのON/OFFが大変になってきました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants