MQCommandPluginクラス

(new in Rev2.41)

MQCommandPlugin クラスは MQStationPlugin クラスを継承し、コマンドプラグインの実装に必要な関数を提供します。

この MQCommandPlugin クラスを継承して、必要な仮想関数の実装を行うことにより、本体との複雑なメッセージ処理を隠ぺい化して簡便な実装で常駐型コマンドプラグインを作成することができます。

MQCommandPlugin クラス内には各プラグイン・メッセージ処理関数が仮想関数として宣言されており、継承クラスで各仮想関数を実装する必要があります。

クラス
MQCommandPlugin コンストラクタ
上位クラスの宣言
GetPlugInID プラグインIDの取得
GetPlugInName プラグイン名の取得
EnumString ボタンに表示される文字列を返す
Initialize アプリケーションの初期化
Exit アプリケーションの終了
Activate 表示・非表示切り替え要求
IsActivated 表示・非表示状態の返答
OnMinimize ウインドウの最小化への返答
OnReceiveUserMessage プラグイン独自のメッセージの受け取り
OnDraw 描画時の処理
OnNewDocument ドキュメント初期化時
OnEndDocument ドキュメント終了時
OnSaveDocument ドキュメント保存時
OnUndo アンドゥ実行時
OnRedo リドゥ実行時
OnUpdateUndo アンドゥ状態更新時
OnObjectModified オブジェクトの編集時
OnObjectSelected オブジェクトの選択状態の変更時
OnUpdateObjectList カレントオブジェクトの変更時
OnMaterialModified マテリアルのパラメータ変更時
OnUpdateMaterialList カレントマテリアルの変更時
OnUpdateScene シーン情報の変更時
プラグイン
GetPlugInType プラグインの種類の取得
メッセージ処理
OnLeftButtonDown 左ボタンが押されたとき
OnLeftButtonMove 左ボタンが押されながらマウスが移動したとき
OnLeftButtonUp 左ボタンが離されたとき
OnMiddleButtonDown 中ボタンが押されたとき
OnMiddleButtonMove 中ボタンが押されながらマウスが移動したとき
OnMiddleButtonUp 中ボタンが離されたとき
OnRightButtonDown 右ボタンが押されたとき
OnRightButtonMove 右ボタンが押されながらマウスが移動したとき
OnRightButtonUp 右ボタンが離されたとき
OnMouseMove マウスが移動したとき
OnMouseWheel マウスのホイールが回転したとき
OnKeyDown キーが押されたとき
OnKeyUp キーが離されたとき
上位クラスの補助関数
OpenSetting 設定ファイルを開く
CloseSetting 設定ファイルを閉じる
SendUserMessage 他のプラグインにプラグイン独自のメッセージを送る
WindowClose ウインドウを閉じる
BeginCallback コールバック処理の開始
ExecuteCallback コールバックに対する実装部
CreateDrawingObject OnDraw()時に描画オブジェクトを追加
CreateDrawingMaterial OnDraw()時に描画オブジェクト用マテリアルを追加
DeleteDrawingObject 描画オブジェクトを削除する
DeleteDrawingMaterial 描画オブジェクト用マテリアルを削除する
GetCurrentUndoState 現在のアンドゥの状態カウンタを取得
GetSceneOption シーンの表示オプションを取得
補助関数
UpdateUndo アンドゥバッファを更新する
RedrawScene シーンの再描画を予約する
RedrawAllScene すべてのシーンの再描画を予約する
GetEditOption 編集オプションを取得
GetSnappedPos スナップ位置を取得
HitTest 対象物の検知
HitTestObjects 指定オブジェクト内での対象物の検知
GetResourceCursor 標準マウスカーソルを取得
SetMouseCursor マウスカーソルを設定
SetStatusString ステータスバーの表示文字列を設定
SetHelpPage ヘルプページを設定

struct MOUSE_BUTTON_STATE {
    POINT MousePos;	// マウスカーソルの位置
    int Wheel;		// マウスホイールの回転量(WHEEL_DELTAの倍数または約数)
    BOOL LButton;	// 左ボタンが押されているか
    BOOL MButton;	// 中ボタンが押されているか
    BOOL RButton;	// 右ボタンが押されているか
    BOOL Shift;		// Shiftキーが押されているか
    BOOL Ctrl;		// Ctrlキーが押されているか
    BOOL Alt;		// Altキーが押されているか
    float Pressure; // タブレットやタッチ操作時の圧力 (0-1)
};

マウスボタン・キーボードの状態を格納する構造体です。

(new in Rev4.20)

Pressureが追加されました。


MQCommandPlugin::MQCommandPlugin();

コンストラクタです。


virtual int MQCommandPlugin::GetPlugInType();

戻り値
プラグインタイプ
[MQPLUGIN_TYPE_COMMAND] コマンド

MQBasePlugin::GetPlugInType()で宣言された仮想関数を実装しています。継承クラス内で新たに実装を行う必要はありません。


virtual BOOL MQCommandPlugin::OnLeftButtonDown(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

左ボタンが押されたときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnLeftButtonMove(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

左ボタンが押されながらマウスが移動したときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnLeftButtonUp(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

左ボタンが離されたときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnMiddleButtonDown(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

中ボタンが押されたときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnMiddleButtonMove(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

中ボタンが押されながらマウスが移動したときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnMiddleButtonUp(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

中ボタンが離されたときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnRightButtonDown(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

右ボタンが押されたときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnRightButtonMove(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

右ボタンが押されながらマウスが移動したときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnRightButtonUp(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

右ボタンが離されたときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnMouseMove(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

マウスが移動したときに呼び出されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnMouseWheel(MQDocument doc, MQScene scene, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

マウスのホイールが回転したときに呼び出されます。

ホイールの回転量は state.Wheel に WHEEL_DELTA の倍数または約数で入力されます。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnKeyDown(MQDocument doc, MQScene scene, int key, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
key
仮想キーコード
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

キーが押されたときに呼び出されます。

key の仮想キーコードは WM_KEYDOWN で得られる内容と同じものです。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


virtual BOOL MQCommandPlugin::OnKeyUp(MQDocument doc, MQScene scene, int key, MOUSE_BUTTON_STATE& state);

doc
ドキュメント
scene
シーン
key
仮想キーコード
state
マウスボタンの状態
戻り値
メッセージを処理したかどうか
[TRUE] メッセージを処理した
[FALSE] メッセージを処理しなかった

キーが離されたときに呼び出されます。

key の仮想キーコードは WM_KEYUP で得られる内容と同じものです。

プラグイン独自の動作を行った場合にはTRUEを、独自処理を行わず標準動作を行わせる場合にはFALSEを戻り値として返します。


void MQCommandPlugin::UpdateUndo();

アンドゥバッファを更新します。

この関数はアンドゥバッファの更新を予約するだけであり、実際のアンドゥバッファ・状態カウンタの更新はプラグインのイベント制御処理を終了して Metasequoia 本体側にへ処理が戻ってから行われます。

 

注意:Ver2.4.3または以前のバージョンでは、ExecuteCallback() 内で UpdateUndo() を呼び出しても何も行われません。


void MQCommandPlugin::RedrawScene(MQScene scene);

scene
シーン

シーンの再描画を予約します。

この関数は再描画の更新を予約するだけであり、実際の描画の更新はプラグインのイベント制御処理を終了して Metasequoia 本体側にへ処理が戻ってから行われます。


void MQCommandPlugin::RedrawAllScene();

すべてのシーンの再描画を予約します。

この関数は再描画の更新を予約するだけであり、実際の描画の更新はプラグインのイベント制御処理を終了して Metasequoia 本体側にへ処理が戻ってから行われます。


void MQCommandPlugin::GetEditOption(EDITOPTION& option);

option
編集オプション

編集オプションの状態を取得します。

取得された編集オプションは option に格納されます。

struct EDIT_OPTION {
    BOOL EditVertex;                // 頂点を編集可
    BOOL EditLine;                  // ラインを編集可
    BOOL EditFace;                  // 面を編集可
    BOOL SelectRect;                // 矩形選択
    BOOL SelectRope;                // 投げ縄選択
    BOOL SnapX;                     // X軸に沿った編集
    BOOL SnapY;                     // Y軸に沿った編集
    BOOL SnapZ;                     // Z軸に沿った編集
    COORDINATE_TYPE CoordinateType; // 座標軸の種類
    SNAP_GRID_TYPE SnapGrid;        // グリッドへの吸着
    BOOL Symmetry;                  // 対称編集
    float SymmetryDistance;         // 対称とみなす距離
    BOOL CurrentObjectOnly;         // カレントオブジェクトのみを編集
    SNAP_PLANE_TYPE SnapPlane;      // 平面への吸着 (new in Rev 4.20)
    MQPoint SnapPlanePos;           // 吸着する平面の位置 (new in Rev 4.20)
    MQPoint SnapPlaneDir;           // 吸着する平面の向き (new in Rev 4.20)
    BOOL SnapVertex;                // 頂点への吸着 (new in Rev 4.20)
    BOOL SnapLine;                  // 辺への吸着 (new in Rev 4.20)
    BOOL SnapFace;                  // 面への吸着 (new in Rev 4.20)
};
CoordinateType
座標軸の種類
[COORDINATE_SCREEN] スクリーン座標
[COORDINATE_WORLD] ワールド座標
[COORDINATE_LOCAL] ローカル座標
SnapGrid
グリッドへの吸着(複数指定可のため、&演算子で調べる)
[SNAP_GRID_X] X軸方向に吸着
[SNAP_GRID_Y] Y軸方向に吸着
[SNAP_GRID_Z] Z軸方向に吸着

[旧型式]
MQPoint MQCommandPlugin::GetSnappedPos(MQScene scene, const MQPoint& p, SNAP_GRID_TYPE type);

(new in Rev4.20)
MQPoint MQCommandPlugin::GetSnappedPos(MQScene scene, const MQPoint& p, const EDIT_OPTION& option, const GET_SNAP_PARAM& snap_param);

scene
シーン
p
スナップ前の位置
type
スナップ方向を以下から一つまたは複数を選択
[SNAP_GRID_X] X軸方向に吸着
[SNAP_GRID_Y] Y軸方向に吸着
[SNAP_GRID_Z] Z軸方向に吸着
option
編集オプション
snap_param
スナップ用パラメータ
戻り値
スナップ後の位置

編集オプションで指定されているグリッド・平面・頂点・辺・面などへのスナップが行われたときの位置を取得します。

編集オプションで指定している状態以外へのスナップを行う場合、optionの内容を変更してください。

 

注意:旧型式の関数は互換性のため残されていますが、グリッド以外へのスナップを有効にするため新しい形式へ置換してくだい。

struct GET_SNAP_PARAM {
    BOOL SnapEyeDir;                // 視線方向へのスナップ
    BOOL IgnoreSelected;            // 選択部を無視
    BOOL IgnoreCurObj;              // カレントオブジェクトを無視
};
SnapEyeDir
視線方向へのスナップを有効にするかを指定します。
一般的には頂点を直接操作したり、ハンドルの中心を操作する場合にTRUEを指定します。ハンドルのX/Y/Z軸を操作する場合はFALSEを指定します。
IgnoreSelected
スナップ時に選択された頂点・辺・面を無視するかを指定します。
選択された箇所を移動する際には、移動対象自身にスナップされないようTRUEを指定します。
IgnoreCurObj
スナップ時にカレントオブジェクトを無視するかを指定します。。
カレントオブジェクトを移動する際には、移動対象自身にスナップされないようTRUEを指定します。

BOOL MQCommandPlugin::HitTest(MQScene scene, POINT p, HIT_TEST_PARAM& param);

scene
シーンオブジェクト
p
スクリーン座標
param
パラメータ
戻り値
[TRUE] 頂点・ライン・面のいずれかが検知された
[FALSE] 何も検知されなかった

(new in Rev2.49)

シーン内の指定された位置上または付近にある面・ライン・頂点を検知します。

param内のTestVertex、TestLine、TestFaceにそれぞれ検知を行う対象を入力してこの関数を呼び出すと、戻り値にTRUEが返ったときにHitTypeに対象物の種類、HitPosに位置、ObjectIndex・VertexIndex・LineIndex・FaceIndexにインデックスが格納されます。

struct HIT_TEST_PARAM {
    // input
    BOOL TestVertex;        // 頂点の検知を行う
    BOOL TestLine;          // ラインを検知
    BOOL TestFace;          // 面を検知

    // output
    HIT_TYPE HitType;       // 検知されたタイプ
    MQPoint HitPos;         // 検知された位置
    int ObjectIndex;        // 検知されたオブジェクト
    int VertexIndex;        // 頂点のインデックス(頂点が検知されたときのみ)
    int LineIndex;          // ラインのインデックス(ラインが検知されたときのみ)
    int FaceIndex;          // 面のインデックス(ラインまたは面が検知されたときのみ)
};
TestVertex
頂点の検知を行うかどうか
[TRUE] 頂点の検知を行う
[FALSE] 頂点を検知しない
TestLine
ラインの検知を行うかどうか
[TRUE] ラインの検知を行う
[FALSE] ラインを検知しない
TestFace
面の検知を行うかどうか
[TRUE] 面の検知を行う
[FALSE] 面を検知しない
HitType
検知された対象物の種類
[HIT_TEST_VERTEX] 頂点が検知された
[HIT_TEST_LINE] ラインが検知された
[HIT_TEST_FACE] 面が検知された
[HIT_TEST_NONE] 何も検知されなかった
HitPos
検知された対象物の位置(ワールド座標)
ObjectIndex
検知されたオブジェクトのインデックス
VertexIndex
検知された頂点のインデックス(頂点が検知されたときのみ)
LineIndex
検知されたラインのインデックス(ラインが検知されたときのみ)
FaceIndex
検知された面のインデックス(ラインまたは面が検知されたときのみ)


関数の呼び出し例 (OnLeftButtonDown, OnMouseMove内など)
    // 編集オプションを取得
    EDIT_OPTION option;
    GetEditOption(option);

    // 対象物の検知して選択する
    HIT_TEST_PARAM param;
    param.TestVertex = option.EditVertex;
    param.TestLine = option.EditLine;
    param.TestFace = option.EditFace;
    if(HitTest(scene, state.MousePos, param)){
        if(param.HitType == HIT_TYPE_VERTEX){
            doc->AddSelectVertex(param.ObjectIndex, param.VertexIndex);
        }else if(param.HitType == HIT_TYPE_FACE){
            doc->AddSelectFace(param.ObjectIndex, param.FaceIndex);
        }else if(param.HitType == HIT_TYPE_LINE){
            doc->AddSelectLine(param.ObjectIndex, param.FaceIndex, param.LineIndex);
        }
    }


BOOL MQCommandPlugin::HitTestObjects(MQScene scene, POINT p, const std::vector<MQObject>& objects, HIT_TEST_PARAM& param);

scene
シーンオブジェクト
p
スクリーン座標
objects
オブジェクト配列
param
パラメータ
戻り値
[TRUE] 頂点・ライン・面のいずれかが検知された
[FALSE] 何も検知されなかった

(new in Rev4.02)

指定オブジェクト内から、指定された位置上または付近にある面・ライン・頂点を検知します。

objects にはドキュメント内のオブジェクトだけではなく、CreateDrawingObject() で作成された描画オブジェクトや MQ_CreateObject() で作成されたドキュメント未登録のオブジェクトも含めることができます。

検知された場合、param.ObjectIndex には objects 配列内のインデックスが格納されます。


HCURSOR MQCommandPlugin::GetResourceCursor(MQCURSOR_TYPE cursor_type);

cursor_type
マウスカーソルの種類
[MQCURSOR_SIZEALL] 4方向矢印
[MQCURSOR_HANDPOINT] 指先
[MQCURSOR_HELP] 疑問符付き
[MQCURSOR_NO] 禁止
[MQCURSOR_WAIT] 砂時計
[MQCURSOR_UPARROW] 上向き矢印
[MQCURSOR_SIZEWE] 左右を指す両方向矢印
[MQCURSOR_SIZENWSE] 左上と右下を指す両方向矢印
[MQCURSOR_SIZENS] 上下を指す両方向矢印
[MQCURSOR_SIZENESW] 右上と左下を指す両方向矢印
[MQCURSOR_CROSS] 十字
[MQCURSOR_NONE] 非表示
[MQCURSOR_DEFAULT] 標準
[MQCURSOR_RECT] 範囲
[MQCURSOR_ROPE] 投げ縄
[MQCURSOR_MOVE] 移動
[MQCURSOR_SCALE] 拡大
[MQCURSOR_ROTATE] 回転
戻り値
カーソルハンドル

(new in Rev2.46)

指定された種類のマウスカーソルを取得します。

取得したカーソルはSetMouseCursor()で利用します。


void MQCommandPlugin::SetMouseCursor(HCURSOR cursor);

cursor
カーソル

(new in Rev2.46)

マウスカーソルを設定します。

設定するカーソルはGetResourceCursor()で取得したものか、またはWin32APIのLoadCursor()で得られるDLLのインスタンスが保持するリソースカーソルを指定して下さい。LoadCursor()でインスタンスにNULLを指定して得られる定義済みカーソルを指定した時の動作は保証されません。


void MQCommandPlugin::SetStatusString(const char *str);

void MQCommandPlugin::SetStatusString(const wchar_t *str);

str
表示文字列 (char型の場合はANSI文字コード)

(new in Rev2.49)

ステータスバー上に表示する文字列を設定します。


void MQCommandPlugin::SetHelpPage(const wchar_t *url);

url
ヘルプページのURL

(new in Rev4.11)

コマンドに連動して表示するヘルプページのURLを設定します。

ヘルプページが別途必要になるため通常のプラグインでは使用しません。標準組み込みのプラグインで使用されます。