元に戻す詳細機能
概要
このトピックでは、元に戻す履歴を保存するための高度なメカニズムについて説明します。これは主に、カスタムユーザーインターフェイスとライブラリの開発者向けです。
元に戻す詳細機能が必要になる場合
FlexSimでは、ほとんどの部分で元に戻す/やり直しを使用できます。元に戻す履歴は完全に自動で記録されているため、その内容については特に気にする必要はありません。ただし、元に戻す履歴の記録をニーズに合わせてカスタマイズする必要が生じる場合もあります。元に戻す履歴の記録をカスタマイズする必要がある状況の例を次にいくつか挙げます。
- カスタマイズされたオブジェクトを作成し、そのオブジェクトがモデル内でドラッグされたときに(つまり、オブジェクトのOnPreDrawまたはOnDrag機能で)オブジェクトの特定の変数値が変更される場合。このような状況では、オブジェクトがドラッグされる前に、それらの値を元の状態に戻すことが必要になる場合があります。
- 元に戻す履歴に記録したくないカスタム機能がユーザーライブラリのドロップスクリプトにある場合。デフォルトでは、ユーザーがライブラリアイコングリッドからのドラッグ&ドロップ操作を実行するたびに、FlexSimは「集約された元に戻す」操作を自動で開始します。これにより、行われた変更を記録するためにいくつかの低レベルのコマンドが実質的に修正されます。これについては後ほど詳しく説明しますが、一部のdropscriptでは、元に戻す記録を一時的に「オフ」にしてから機能を実行し、その後で再度オンにする必要が生じる場合があります。たとえば、ウィンドウを開く機能を実行している場合などです。
- [選択したオブジェクトを編集]ツールウィンドウのようなモデルの変更に使用されるツールウィンドウを作成する場合は、それらのウィンドウのボタンに記録を明示的に取り消すコードを追加する必要があります。FlexSimでは、3Dビュー、ツリービュー、テーブルビューで行われるすべての操作と、これらのビュー専用のツールウィンドウで実行されるすべての操作を元に戻すことができます。そのため、これらのビューのいずれかで使用されるツールウィンドウを設計する場合は、ツールウィンドウで元に戻す操作を実行できるようにする必要があります。
元に戻すレコードを明示的に作成する
コードを実行する前に元に戻すレコードを作成するには、beginaggregatedundo()を呼び出します。この元に戻す操作に関連付けられているビューを渡します。ビューとしてNULLを渡すと、FlexSimのグローバルな元に戻す履歴(MAIN:/project/undo/)に関連付けられます。実行されている操作に関する説明を渡します( 「ChangeColor」)。beginaggregatedundo()コマンドは、作成した元に戻すレコードの一意のIDを返します。次に、元に戻せるようにするコードを実行し、endaggregatedundo()を呼び出してビューと元に戻すIDを渡します。
beginaggregatedundo()を呼び出すと、FlexSimはいくつかの低レベルコマンドを修正し、それ以降のそれらのコマンドの呼び出し、または呼び出したその他のコマンドによるそれらのコマンドの呼び出しが変更内容を元に戻す履歴に記録するようにします。修正されるコマンドは次のとおりです。
- nodeadddata()
- setnodenum()/set()
- setnodestr()/sets()
- nodedeldata()
- nodeinsertinto()
- nodeinsertafter()
- nodejoin()
- nodepoint()
- nodebreak()
- setname()
- clearcontents()
- createcopy()
- createinstance()
- switch_cppfunc()、switch_flexscript()...(すべてのswitch_...コマンド)
- transfernode()
- transfernodeobj()
- moveobject()
- setrank()
- destroyobject()
- destroynode()
元に戻す機能を無視する
集約された元に戻すの実行中に、FlexSimで一連のコマンドを無視する場合は、beginignoreundo()を呼び出して実行し、endignoreundo()を呼び出します。これはユーザーライブラリのdropscriptで特に便利です。FlexSimは、ライブラリアイコングリッドからのドラッグ&ドロップ操作の一部として実行されるすべての機能に適用される集約された元に戻すレコードを自動で作成します。そのため、ドロップスクリプトで実行されるコードはすべて、元に戻すの一部として記録されます。特定の機能についてこの処理をバイパスするには、その機能をbeginignoreundo()とendignoreundo()で囲みます。
カスタムオブジェクトのドラッグで追跡を元に戻す
カスタムオブジェクトの変数値に対する変更や、カスタムオブジェクトがドラッグされたときに変更されるオブジェクトの位置、回転、スケールをFlexSimで追跡する場合もあります。これが使用されている例の1つは、FlexSimの標準ライブラリのクレーンオブジェクトです。クレーンのサイザーのいずれかをドラッグした場合、実際には、ユーザーがドラッグしたときにクレーンがサイズ変更するオブジェクトが背後にいくつか存在します。また、クレーンには、クレーンをモデルの別の位置にドラッグすると変更されるクレーンのフレームのx位置、y位置、z位置を定義する3つの変数値もあります。クレーンで元に戻す機能を機能させるには、ユーザーがドラッグしたときに変更されるそれらのオブジェクトに関する元に戻す情報を追跡するようにFlexSimに指示する必要があります。
オブジェクトまたは数値変数に元に戻す追跡を追加するには、applicationcommand("addundotracking", view, obj_or_variable)を呼び出します。ユーザーがクレーンをクリックすると、クレーンはそのOnClickイベントの一部としてこれを実行します。
例
カスタムの元に戻すを使用するコード例のスニペットを次に示します。
単純な元に戻す
int undoId = beginaggregatedundo(c, "Set Object Rank");
setrank(anObj, 5);
endaggregatedundo(c, undoId);
無視して元に戻す
int undoId = beginaggregatedundo(c, "Change Object Shape");
setnodestr(shape(anObj), shapePath);
int index = getshapeindex(gets(shape(anObj)));
beginignoreundo();
if (getshapeindex(shapePath)==0) {
autoloadallmedia(anObj);
index = getshapeindex(gets(shape(anObj)));
}
endignoreundo();
set(shapeindex(anObj), index);
applyshapefactors(anObj);
endaggregatedundo(c, undoId);