Metasequoia BBS

| New message | Normal | Tree |
Status
Tag
Keyword
[1233] UpdateUndoについて / sio29
[SDK] Response
コマンドプラグインのUpdateUndoについて質問があります。
メタセコからのイベントOnKeyDownやOnMouseMoveなどのOn~系関数のイベントの中で
UpdateUndoをするときんちと正常にOnUpdateUndoが来るのですが、
独自にダイアログを作りメタセコのイベントが来てない(On~系関数から呼ばれていない)状態で
UpdateUndoを実行していもうまくOnUpdateUndoが来ません。
何かUpdateUndoをうまく実行する方法があったらご教授していただけるようお願いします。
2007-08-13 20:06
[1234] Re: UpdateUndoについて / O.Mizno
おそらくMQStationPlugin::BeginCallback()の呼び出しを行っていないのではないでしょうか?

独自のダイアログ等で発生したウインドウメッセージから処理を行う場合、
まずMQStationPlugin::BeginCallback()を呼び出し、
コールバックとしてMQStationPlugin::ExecuteCallback()が呼び出されるので、
この関数内でイベント処理に必要な実装を行う必要があります。

ExecuteCallback()内でUpdateUndo()を呼び出すと、ExecuteCallback()から処理を抜けた時点でアンドゥ処理が行われるようになっています。
2007-08-13 23:40
[1235] Re: Re: UpdateUndoについて / sio29
レスありがとうございます。
O.Miznoさんの言うとおりExecuteCallback内でUpdateUndoを呼ぶようにしたのですが、
MQDocumentに対して何かしらの書き換えをした場合は正常にOnUpdateUndoに来るのでいすが、
MQDocumentに対して何の操作もしていない状態ではOnUpdateUndoに来ないようです。
ちなみにOn~系の関数内でUpdateUndoをした場合、MQDocumentに対して何の操作をしなくても
OnUpdateUndoはきちんと来るようです。
ExecuteCallback内でドキュメントに対して何の操作もしてない状態でUpdateUndoを呼ぶ場合にはまだ他に処理が必要なのでしょうか?
2007-08-14 02:13
[1236] Re: Re: Re: UpdateUndoについて / O.Mizno
改めて動作確認したところ、ExecuteCallback()内でUpdateUndo()を呼び出しても
アンドゥ処理が行われないことがわかりました。
きちんと動作確認しないまま不正確な答えをしてしまい申し訳ありません。

ExecuteCallback()から呼び出された場合は、UpdateUndo()を呼ばなくても
ドキュメント何らかの変更を加えればアンドゥの更新は行われるので、
対処療法的なものになってしまいますが、UpdateUndo()を呼び出す前に
doc->SetCurrentObjectIndex(doc->GetCurrentObjectIndex());
を入れてください。

また、UpdateUndo()以外にも以下の関数がExecuteCallback()内からは動作しません。
RedrawScene()
RedrawAllScene()
GetEditOption()
GetSnappedPos()
この問題に対処するため今後バージョンで修正予定ですが、これに伴い
SDKの仕様が若干変更される可能性があります。
ただ、バイナリおよびソースコードレベルでの影響は最小限に留めるつもりです。
2007-08-15 00:03
[1247] Re: Re: Re: Re: UpdateUndoについて / O.Mizno
>UpdateUndo()
>RedrawScene()
>RedrawAllScene()
>GetEditOption()
>GetSnappedPos()

Ver2.4.4でこの5つの関数をExecuteCallback()内から呼び出しても大丈夫なようにしました。

APIに変更はないのでそのまま開発を続けていただければ大丈夫だと思いますが、
これらの関数を使うプラグインを作った場合、Ver2.4.4より前のバージョンで
動かすと問題が生じるので、ドキュメント等に注意書きを添えるか、
またはSDKのソースに手を入れてプラグインの起動を制限させるようお願いします。

ソースに手を入れる場合、MQInit.cppのMQCheckVersion()に
if(exe_version < 0x2440) return 0;
の一文を追加します。
2007-08-26 23:34
[1255] Re: Re: Re: Re: Re: UpdateUndoについて / sio29
修正ありがとうごいざいます。
ただし少し疑問があるのですがプラグイン側からUpdateUndoをするとOnUpdateUndoが来る前に必ずOnModifiedObjectがくるようです。
(UpdateUndo→OnModifiedObject→OnUpdateUndoとなる)
本来UpdateUndo→OnUpdateUndoと来るべきだと思うのですがどうでしょうか?
2007-08-27 16:22
[1260] Re: Re: Re: Re: Re: Re: UpdateUndoについて / O.Mizno
>OnUpdateUndoが来る前に必ずOnModifiedObjectがくるようです。
>(UpdateUndo→OnModifiedObject→OnUpdateUndoとなる)
>本来UpdateUndo→OnUpdateUndoと来るべきだと思うのですがどうでしょうか?

内部的な話をすると
UpdateUndo()を呼ぶ→オブジェクト編集フラグが立つ
となっているので、OnModifiedObject()とOnUpdateUndo()の両方が呼び出されます。
なぜこのようになっているかは、単に内部処理ではそれで問題なかったからだけで、
本来としてはご指摘の通りだと思います。

互換性に関わる部分については、プラグインが出回る前の早めの段階で仕様を
固定しないとまずいと思いますが、しばらく時間が取れないので、
対応は早くて10月くらいになりそうです。
それまでの間は細かいタイミングに依存しない作りで進めるようお願いします。
2007-08-28 23:58