Choreonoidのレイアウトとビュー関連の挙動について

2つ質問させてください。

1)Choreonoidのメインメニュー内の「レイアウト」-「終了時のレイアウトの保存」は、
Choreonoidを終了させたときのレイアウトの状態が保持されるということでしょうか。

試しに、「終了時のレイアウトの保存」にチェックを入れて、
メインメニュー内の「レイアウト」-「レイアウトのリセット」を押してから、
Choreonoidを終了→再起動してみたところ、終了時のレイアウトが保存されずに
リセット前のレイアウトでChoreonoidが起動しました。

2)ユーザが追加実装したビューをChoreonoidの初期画面に配置することはできますか。

新しいビュー(以下、名前を**ビューとします)を実装して
ViewManagerに「SINGLE_DEFAULT」で登録したのですが、
Choreonoid起動時にその登録した**ビューが表示されず、
メインメニュー内の「ビューの表示」で作成した**ビューにチェックを入れないと表示されませんでした。

以上、よろしくお願いいたします。

こちらそのはずだったのですが、確認しましたところ、想定通りの挙動となるように実装できていなかったようです。これは紛らわしくてよくないため、とりあえずメニューからこの項目を削除することに致しました。

なお既にご存知かとは思いますが、プロジェクトごとのレイアウトについてはプロジェクトファイルに保存してプロジェクト読み込み時に復帰できます。この機能は最新版のデフォルトではオフになっていますが、メインメニューの「ファイル」ー「プロジェクトファイルオプション」ー「レイアウト」のチェックを入れると機能するようになります。

今回ご指摘いただたメニュー項目はプロジェクトとは関係なくChoreonoid起動時にまずそのレイアウトが復帰するということを意図しておりましたが、やはりそのような機能も必要でしょうか?こちらについてご意見いただければ幸いです。

こちら開発版においはデフォルトのレイアウトというものを用意していて、上記の「プロジェクトごとのレイアウト復帰」をしない場合は、そのレイアウトが適用されるようになっています。このレイアウトはソースのsrc/Base/project/layout.cnoid にて記述されています。このファイルはプロジェクトファイルからレイアウトに関する記述を抜き出したもので、これを用いていかなるレイアウトもデフォルトにすることができます。

ただし現状ではデフォルト以外のレイアウトを起動時に選択して読み込むような機能はありません。(上記layout.cnoidはリソースとして共有ライブラリ内にバイナリで格納されます。)上記の機能1)によってこのレイアウトを置き換えられればよいということかもしれませんね。

ちなみになぜこのようにしたかというと、Choreonoidはいろいろな用途で使用されており、用途ごとに適切なレイアウトが全く異なるとういところがあります。ただその設定をユーザーに委ねてしまうと難しくなってしまうので、用途ごとにカスタマイズした実行ファイルを用意し、その中に上記のレイアウトファイルをリソースとして組み込んでデフォルトにすることで、ユーザーが迷うこと無くアプリケーションに適切なレイアウトを利用できるようにするという意図です。

ですので現状ではレイアウトをカスタマイズしたい場合、実行ファイルchoreonoidとは別にchoreonoid-xのような実行ファイルを用意し、それを用いてchoreonoidを起動するとカスタマイズされたレイアウトがデフォルトで使用できる、という方法があります。この方法ではレイアウト以外にもソースコードレベルでChoreooidのいかなる要素もその実行ファイル用にカスタマイズできます。この例として、choreonoid_rosが提供しているchoreonoidノードは、ROS環境に適した設定をする実行ファイルとして実装しています。

以下がそのソース部分になります。

Choreonoid本体の実行ファイルのソースは以下になります。

https://github.com/choreonoid/choreonoid/blob/master/src/Choreonoid/main.cpp

この最後の

cnoid::ProjectManager::instance()->loadBuiltinProject(":/Base/project/layout.cnoid");

によってデフォルトのレイアウトを読み込んでいます。

同じような実行ファイルプロジェクトを用意して、このレイアウトの部分だけ自前でカスタマイズしたレイアウトファイルに置き換えれば、カスタマイズされた実行ファイルを利用することができます。

ただちょっとした利用でそこまでやるのは大変でしょうから、やはり上記1)の機能を実現した方がよいかもしれませんね。

詳細なご説明ありがとうございました。

1)意図しない挙動だったということですね。承知しました。
私としては、Choreonoid起動時にプロジェクトとは関係なくレイアウトが復帰する機能は必要ないかなと考えています。
シミュレーションやモーション制作等を行う場合は、設定した内容をほぼ確実にプロジェクトを保存すると思いますので、プロジェクトファイルを使用しない特殊な使い方でもない限り、必要になる状況にはならないと思いました。
もし必要だとしても、Choreonoid起動時にレイアウトを保存したプロジェクトファイルを引数として渡せば済む話だと思いますので。

2)経緯と実装についてよくわかりました。
デフォルトのレイアウトを保存したプロジェクトファイルを起動時に読み込んでいるため、ユーザが追加実装したビューは初期画面に表示されないということですね。

ViewManagerに「DEFAULT」でビューを登録した場合と、「OPTIONAL」で登録した場合の
挙動の違いがわからなかったため、今回このような質問をさせていただきましたが、
回答いただきました内容でよく理解できました、ありがとうございました。

せっかくなので、プロジェクトファイルに関連して1点要望?があるのですが、よろしいですか。
プロジェクトを切り替える(別のプロジェクトを読み込む)ときに、アイテムツリーを空っぽにしてからメインメニュー「ファイル」→「プロジェクトファイルの読み込み」という操作をしばしば行うのですが、ときたまに間違えてそのメニューの下にある「プロジェクトの保存」を押してしまい、
アイテムツリーが空っぽになった状態を切替前のプロジェクトに保存してしまって、切替前のプロジェクトが復旧できないということがありました。

上記の事象を回避するために、別のプロジェクトファイルを読み込む際によい方法はありますか。
それとも別のプロジェクトを読み込む際は、Choreonoidを再起動するのがよいですか。
もし可能であれば、上記のような事象が発生しないように修正いただけると助かります。

ご意見ありがとうございます。
こちらも踏まえて、とりあえずこの機能については保留といたします。

こちらも紛らわしくてすみません。
DEFAULTの場合は、ビューが表示されていなかったとしても、内部では生成されていて、プラグインのコードからも利用できるようになっています。一方、OPTIONALとした場合は、デフォルトではビューのインスタンスがデフォルトでは生成されません。この場合、メインメニューの「表示」ー「ビューの生成」で明示的に生成する必要があります。
ビューの生成にはその分の処理時間とメモリが必要になるので、通常必要の無いビューはOPTIONALとすることで、無駄にリソースを消費するのを避けています。また、SINGLEでないビューの場合は同じ操作でインスタンスを複数生成できます。(シーンビューなど)。

以前は別のプロジェクトファイルを読み込む時に元のプロジェクトへの追加読み込みとなっていましたが、これについて最近の開発版バージョンで修正しまして、プロジェクト読み込み時は既存のプロジェクトをクリアしてから読み込むようになりました。従って開発版バージョンにおいては普通にプロジェクトを読み込んでいただければよいかと思います。(さらに読み込み時に「新しいプロジェクトを読み込む前にこのプロジェクトを保存しますか?」と聞いてきます。保存するかどうかでボタンを選択すればOKです。)

ご回答ありがとうございました。DEFAULTとOPTIONALの挙動についてよく理解できました。

また、プロジェクトファイルの読み込みに関して、ご教示ありがとうございました。
さっそく試してみまして、問題なくプロジェクトファイルを読み込むことができました。
ありがとうございます。