Shade online フォーラム
ログイン
ユーザ名:

パスワード:

IDとパスワードを記憶

パスワード紛失
スレッド表示 | 古いものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | 下へ
投稿者 スレッド
gon
投稿数: 82
投稿日時: 2005-09-21 22:40
Re: ポイントではなく形状丸ごとのUNDOの
有り難うございます無事出来ました。
これでまたちょっと小物作れそうです。
助かりました。
投稿数: 34
投稿日時: 2005-09-20 22:45
Re: ポイントではなく形状丸ごとのUNDOの
失礼しました。
creator_interfaceではundoableが機能していないのを確認しました。
Undoの必要な処理は、
modifier_interface::modify関数か、plugin_interface::do_it関数
で行うようにしてください。

あと、set_undo_actionの使い方に間違いがあったので
サンプルコードを訂正します。
単一形状に対しては、shape_saver_interface::set_undo関数を使い、
複数形状の場合は、scene_interface::reset_undo関数を呼んだあとに、
各形状ごとにshape_saver_interface::set_undo_actionを呼びUndoアクションリストに登録します。
reset_undoが呼ばれたあとに、set_undo_actionで登録されたUndoアクションは、
1回のUndoコマンドでまとめてUndoされます。


struct plugin_component : modifier_interface {
    virtual int get_shade_version () const { return SHADE_VERSION; }
    virtual int get_id (void * = 0) { return SIMPLE_UNDO_ID; }
    virtual bool undoable (void * = 0) const { return true; } //Undoをサポートする場合はtrueを返す。/
    virtual bool modify (scene_interface *scene, void * = 0) {
        int n = scene->get_number_of_active_shapes();
        if (n == 1) {
            shape_class &shape = scene->active_shape();
            //shape_saver_interfaceを作成。形状の幾何属性を保持。/
            compointer<shape_saver_interface> shape_saver(shape.create_shape_saver_interface()); 
            if (shape_saver) {
                shape.set_point(0, vec3(0,0,0));
                shape_saver->set_undo(); //単一形状のUndoを登録する。/
            }
        }
        else {
            //複数の形状に対する処理を1つのUndoとして登録する場合はreset_undoを呼ぶ。/
            scene->reset_undo(); 
            array_<shape_class *> shapes(new shape_class*[n]);
            scene->get_active_shapes(shapes);
            for (int i = 0;i < n; ++i) {
                shape_class &shape = *(shapes[i]);
                compointer<shape_saver_interface> shape_saver(shape.create_shape_saver_interface());
                if (shape_saver) {
                    shape.set_point(0, vec3(0,0,0));
                    shape_saver->set_undo_action(); //Undoアクションを登録する。/
                }
            }
        }
        return true;
    }
};

gon
投稿数: 82
投稿日時: 2005-09-20 20:45
Re: ポイントではなく形状丸ごとのUNDOの
またすいません。
私のの環境では下記の様にmodifier_interfaceとps->set_undo();
にしたら
modifier_interfaceは動きましたが、
creator_interfaceでは動きません...orz


struct modifier_0_component : modifier_interface {
virtual int get_shade_version () const { return SHADE_VERSION; }
virtual int get_id (void * = 0) { return 0x1ff00000; }
virtual bool undoable (void * = 0) const { return true; }
virtual bool modify (scene_interface *scene, void * = 0) {

shape_class &shape = scene->active_shape(); //shape_saver_interfaceを作成。形状の幾何属性を保持。/
compointer<shape_saver_interface> ps(shape.create_shape_saver_interface());
if (ps) {
ps->set_undo();
shape.set_point(0, vec3(0,0,0));
ps->set_undo_action(); //Undoアクションを登録する。/
}


return true;
}
};
gon
投稿数: 82
投稿日時: 2005-09-20 16:30
Re: ポイントではなく形状丸ごとのUNDOの
追記
8と7.5両方で試してみました。
お手数おかけいたします...orz
gon
投稿数: 82
投稿日時: 2005-09-20 16:26
Re: ポイントではなく形状丸ごとのUNDOの
有り難うございます。
自分のでは出来なかったため、
教えて頂いたように丸ごと新規の所に張ってみたのですが、
同じように実行後 線が動いた後に、
取り消しが効かなくなり、
なぜか Undo出来ないどころか以前のUndoまで消えてしまいました..orz
もちろん
virtual bool undoable (void * = 0) const { return true; } //Undoをサポートする場合はtrueを返す。/
も入れました。

取り消しが効かなくなる(前のUndoまで消える)のに何かお心当たりはないでしょうか?

マルチプラグインではだめって事ないですよね...orz
すいません よろしくお願いいたします。

struct creator_2_component : creator_interface {
virtual int get_shade_version () const { return SHADE_VERSION; }
virtual int get_id (void * = 0) { return 0x1ff00000; }
virtual bool undoable (void * = 0) const { return true; } //Undoをサポートする場合はtrueを返す。/
virtual bool create (scene_interface *scene, void * = 0) {
shape_class &shape = scene->active_shape(); //shape_saver_interfaceを作成。形状の幾何属性を保持。/
compointer<shape_saver_interface> ps(shape.create_shape_saver_interface());
if (ps) { shape.set_point(0, vec3(0,0,0));
ps->set_undo_action(); //Undoアクションを登録する。/
}

return true;
}
};

投稿数: 34
投稿日時: 2005-09-20 11:17
Re: ポイントではなく形状丸ごとのUNDOの
Shade開発課の高橋です。

形状に対する操作をUndoする場合は、
shape_saver_interfaceを使用します。
以下にサンプルコードを示します。


struct plugin_component : creator_interface {
	virtual int get_shade_version () const { return SHADE_VERSION; }
	virtual int get_id (void * = 0) { return SIMPLE_UNDO_ID; }
	virtual bool undoable (void * = 0) const { return true; } //Undoをサポートする場合はtrueを返す。/
	virtual bool create (scene_interface *scene, void * = 0) {
		shape_class &shape = scene->active_shape();
		//shape_saver_interfaceを作成。形状の幾何属性を保持。/
		compointer<shape_saver_interface> ps(shape.create_shape_saver_interface()); 
		if (ps) {
			shape.set_point(0, vec3(0,0,0));
			ps->set_undo_action(); //Undoアクションを登録する。/
		}
	}
};


Undoをサポートする場合は、対象のplugin_interface派生クラスのundoable関数をオーバーライドしてtrueを返している必要があります。

Undo処理の登録は、
Undoの対象となる処理の直前に、
  shape_class::create_shape_saver_interface関数で、形状の情報を保持するshape_saver_interfaceを作成
Undoの対象となる処理の後に、
  shape_saver_interface::set_undo_action関数を呼ぶ
といった形で行います。
複数の形状を対象とする場合は各形状ごとにshape_saver_interfaceを作成してset_undo_actionで登録します。

これで、shape_saver_interfaceを作成してからset_undo_actionまでに形状に対して行った処理をUndoすることができるようになります。
gon
投稿数: 82
投稿日時: 2005-09-19 14:06
ポイントではなく形状丸ごとのUNDOの
ポイントではなく形状丸ごとのUNDOは無いのでしょうか?
ポリゴンに追加して間違えたら、UNDOで追加前に戻したいのです。

ポイントは save_control_pointsで出来たのですが、
見つからないです.....
それとも全ポイントを記憶させるのでしょうか?
creator_interfaceでプラグインを作っています。

よろしくお願いいたします。
スレッド表示 | 古いものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | トップ

最近の投稿

フォーラム スレッド 返信 閲覧 最終投稿
Free Talk DNAの2重らせんの水素結合部位の作成 0 11779 2016-08-01 21:37 Benthos
Free Talk パート内の名前を一括返還 2 14300 2016-03-07 12:21 画像投稿機
Dev Forum イームズシェルチェアーの作成 2 14189 2015-11-25 14:44 CR7
Free Talk MOVファイルについて 17 35333 2014-12-29 17:14 momokuma
Dev Forum 2種類の液体アニメーションを作る方法 0 14273 2014-11-13 10:42 mejapan
Free Talk 面取りについて 0 13395 2014-11-08 15:18 MoonChild
Free Talk 丸太を結ぶ縄の作成について 1 19607 2014-09-18 22:33 kenslab
Free Talk パーティクルフィジックスのメタパーティクルについて 0 13859 2014-09-03 20:40 penta
Free Talk データの保存に関して 2 13708 2014-08-18 01:24 sierra
Free Talk Shade 3D ver14での、ポリゴンメッシュへの変換以上終了 1 14130 2014-04-23 12:04 MASA_