« XPressoのC.O.F.F.E.E.ノードの入出力変数 | トップページ | C4Dのスプラインを微生物のべん毛のように動かすXPresso »

今は、何モード?ポリゴンモード?それとも、ポイントモード?

今回は、C.O.F.F.E.E.ネタです。ユーザスクリプトとプラグインが対照です。

実行するツールの処理する対象が、ポイントなのかポリゴンなのか?
対象がポイントならば、ポイントモードに切り替えたり…
ポイントとポリゴンのハイブリッドなら、現在のモードの対象を処理するだろうし、使う側もそうであって欲しいと思うだろう。

では、現在のモードをチェックしてみよう。

何を使ってチェックするのか…
少し学習した人であれば、BaseDocumentクラスにGetActiveTool()があるから、それを使えばチェックができるかもしれないと思うだろう。

/*
現在の編集モードの確認
ユーザスクリプトです。
2009.3.27
*/


println(doc->GetActiveTool()->GetName());

これを実行すると、現在のツールの名前がコンソールに表示されるのですが、表示されるものは、「移動、回転、スケール、ライブ選択、押し出し、内面に押し出し、ナイフ…」と言う具合で、ポイントモード/ポリゴンモードが表示される事はないのだ。

GetActiveTool()…そうさ、これは現在のツールを取得するもので、モードは取得できないのだ。モードもツールもコマンドマネージャでごちゃ混ぜになっているから、勘違いしやすいのだ。

では、どうすれば…

SDKを一通り目を通している人ならば、Basic FunctionsのCommandAccess系があるのを覚えているだろうか?

CommandAccess

CallCommand(cmd_id) コマンドID[cmd_id]のコマンドの実行
GetCommandName(cmd_id) コマンドID[cmd_id]のコマンドの名前の取得
IsCommandEnabled(cmd_id) コマンドID[cmd_id]のコマンドが実行可能であるか?
IsCommandChecked(cmd_id) コマンドID[cmd_id]のコマンドが選択されているか?

である。

このName/Enabled/Checkedの関数をユーザスクリプトやプラグインで使う場合は普通に使えますが、常時作動しているC.O.F.F.E.E.エクスプレッションのスクリプトでは、思ったように動いてくれないと言う不思議なところがあります。C.O.F.F.E.E.エクスプレッションでは、常にnil/0/0の値を返します。ただ、エクスプレッションエディタの実行ボタンを押したときだけ、正常な数値が返ってきますけどね。
この事から、ユーザスクリプトやプラグインがメニューから実行される処理と、C.O.F.F.E.E.エクスプレッションの常時実行される処理は、違うという事ですかね。
まぁ、この関数をC.O.F.F.E.E.エクスプレッションで使う事はないと思うが?

では、ユーザスクリプトを…

/*
現在はポイントモードですか?それともポリゴンモードですか?
現在のモードに対応した選択状況をコンソールに表示
2009.3.27
*/


if(!instanceof(op , PolygonObject))return//ポリゴンオブジェクト以外は終了

var mode = 0;

//コマンドマネージャより
//ポイントモードのIDは12139です。
//ポリゴンモードのIDは12187です。
//オブジェクトモードは12101です。


if(IsCommandChecked(12139))mode = 1;  //ポイントモードだと:1
if(IsCommandChecked(12187))mode = 2;  //ポリゴンモードだと:2
if(IsCommandChecked(12101))mode = 3;  //オブジェクトモードは:3
                                      //それ以外は:0

var p_c , p_sel , i;

//現在のモードにあわせて選択されたポイント/ポリゴン番号をコンソールに表示
switch(mode){
  case 1:
    println("ポイントモードです。");

    p_c = op->GetPointCount();  //ポイント数の取得
    p_sel = op->GetPointSelection();  //ポイントの選択を取得

    println("選択されたポイントは…");

    break;
  case 2:
    println("ポリゴンモードです。");

    p_c = op->GetPolygonCount();  //ポリゴン数の取得
    p_sel = op->GetPolygonSelection();  //ポリゴンの選択を取得

    println("選択されたポリゴンは…");

    break;
  case 3:
    println("オブジェクトモードです。");
    println(" ");
  default:
    return;
}

//捜査し選択されていれば、番号をコンソールに表示
for(i = 0 ; i < p_c ; i++)if(p_sel->IsSelected(i))println(i);

println(" ");

ポリゴンオブジェクトを選択してユーザスクリプトを実行すると、モードごとに選択されたポイントかポリゴンの番号をコンソールに表示します。
オブジェクトモードは何もしません。

次は…

選択されたポイントを処理するツールなのに、現在ポイントモードでない場合。
ポイントモードに切り替えたいよね…
ん?選択されたポイントに対して適用するツールなら、既にポイントモードになっているんじゃないのかって?そうですね。言うとおりですね。ま、細かいことは抜きにして…

/*
ポイントモード以外のときは、ポイントモードに切り替え
ポイントの位置を縮小する
2009.3.27
*/


if(!instanceof(op , PointObject))return//ポイントオブジェクト以外は終了

//現在ポイントモード以外であって、ポイントモードが実行可能であればポイントモードを実行
if(!IsCommandChecked(12139) && IsCommandEnabled(12139))CallCommand(12139);

var pts = op->GetPoints();  //ポイントの取得
var ptc = op->GetPointCount();  //ポイント数の取得
var sel = op->GetPointSelection();  //選択状況の取得
var i;  //カウンター

//ポイントを捜査する
for(i = 0 ; i < ptc ; i++){
  if(sel->IsSelected(i))pts[i] *= 0.9;  //選択されたポイント値を90%に縮小
}

op->SetPoints(pts);  //オブジェクトにポイントを適用
op->Message(MSG_UPDATE);  //オブジェクトの更新

このスクリプトを実行すると、ポイントモードでなければポイントモードに切り替わり、選択されたポイントが軸を中心に90%に小さくなります。

C.O.F.F.E.E.の残念なところは、未だに対応していない所があるという事です。
エッジモードやN-gonとかね。属性マネージャも使えると良いのにね。

|

« XPressoのC.O.F.F.E.E.ノードの入出力変数 | トップページ | C4Dのスプラインを微生物のべん毛のように動かすXPresso »