« スクリプトでモーダルダイアログ | トップページ | ユーザスクリプトで新規のスプライン »

ユーザスクリプトでC4D標準オブジェクトを追加

スクリプトでC4Dの標準オブジェクトをシーンに追加する。
追加の方法は何が考えられるだろう?

一番簡単なのは、CallCommand()関数を使う。これなら1行でオブジェクトをシーンに追加できる。例えばプリミティブの立方体ならば、

CallCommand(12480);//シーンに立方体プリミティブを追加

あとは、立方体クラスを作ってシーンに追加する。立方体クラスの作成は2種類ある。
まず、1つ目はAllocObject()関数、もう1つはnew();なぜ2種類あるかは不明。
では1つ目だと

var ob = AllocObject(Ocube);//立方体クラスを作成
doc->InsertObject(ob , NULL , NULL);//シーンに追加

もう1つは

var ob = new(CubeObject);//立方体クラスを作成
doc->InsertObject(ob , NULL , NULL);//シーンに追加

BaseDocumentクラスのInsertObject()メンバ関数は、シーンにオブジェクトを追加する関数で1番目の引数は追加するオブジェクト、2番目にオブジェクトを渡すと、その子オブジェクトとして、3番目にオブジェクトを渡すと、その下に追加される。2、3番がNULLだとシーンのトップに追加される。

CallCommand()で追加するとC4Dに従ってオブジェクトが追加される。オブジェクトの位置などは、追加後に操作することになるでしょう。一方new()やAllocObject()は追加前にでも位置等を操作できる。

//CallCommand()で追加した場合
CallCommand(12480);//立方体をシーンに追加
var ob = doc->GetActiveObject();//アクティブオブジェクトのとして取得
ob->SetName("CallComand()で追加");//名前の変更
ob->SetPosition(vector(100 , 200 , 300));//位置の変更

//new()やAllocObject()で追加した場合
var ob = new(CubeObject);//立方体クラスを作成
ob->SetName("追加立方体");//名前の変更
ob->SetPosition(vector(100 , 200 , 300));//位置の変更
doc->InsertObject(ob , NULL , NULL);//シーンに追加

微妙に違いますが、目的に合った方で好きなほうを使えば良いのかなぁ。もちろんnew()/AllocObject()でも追加後に操作することは可能でGetActiveObject()を使わなくていいですし。

ここで簡単な実験
アクティブオブジェクトとして存在するスプラインオブジェクトの子オブジェクトとしてヌルオブジェクトをスプラインに沿わせて10個配置する。スプラインのセグメントは無し(0)とする。

/*
アクティブなスプラインにヌルオブジェクトを沿わせて10個追加する
08.06.04
*/


if(!instanceof(op , SplineObject))return;//アクティブオブジェクトがスプラインでなければ処理を中止
var ob;//追加するヌルオブジェクト用
var i;//カウンタ

op->InitLength(0);//使用するUniformToNatural()等の為の初期化

for(i = 0 ; i < 10 ; i++){
  ob = new(NullObject);//追加するヌルオブジェクト
  ob->SetName("Null "+ tostring(i));//名前の変更
  ob->SetPosition(op->GetSplinePoint(op->UniformToNatural(i / 9.0) , 0));//ヌルオブジェクトを配置
  doc->InsertObject(ob , op , NULL);//追加する
}
op->FreeLength();//InitLength()で使ったメモリを開放

スクリプトの最初でアクティブオブジェクトがスプラインか確認してますが「メニューの状態」でも同じように。

if(instanceof(op , SplineObject))ENABLE = TRUE; else ENABLE = FALSE;

これで完成。これを改良するとC.O.F.F.E.E.エクスプレッションやエクスプレッソでスプラインオブジェクトの子オブジェクトを常にスプラインに沿わせることができます。

ところで、新規でポリゴンオブジェクトを作るにはどうしたら良いのだ?ダイアログを使ってパラメトリックに…ポリゴンを生成する最も簡単な方法が知りたいね。SendModelingCommand()が使えるかと思ったけど作動しないんだよねぇ。

|

« スクリプトでモーダルダイアログ | トップページ | ユーザスクリプトで新規のスプライン »

コメント

この記事へのコメントは終了しました。