fkanehiro / choreonoid-editor

3 stars 3 forks source link

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

Open fkanehiro opened 8 years ago

fkanehiro commented 8 years ago

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

yosuke commented 8 years ago

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

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

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

fkanehiro commented 8 years ago

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

s-nakaoka commented 8 years ago

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

fkanehiro commented 8 years ago

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

yosuke commented 8 years ago

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

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

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

fkanehiro commented 8 years ago

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

s-nakaoka commented 8 years ago

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

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

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

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

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

yosuke commented 8 years ago

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

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

yosuke commented 8 years ago

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

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

s-nakaoka commented 8 years ago

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

s-nakaoka commented 8 years ago

実装しました。 https://github.com/s-nakaoka/choreonoid/issues/50

fkanehiro commented 8 years ago

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

yosuke commented 8 years ago

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

fkanehiro commented 8 years ago

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