« ユーザスクリプトでC4D標準オブジェクトを追加 | トップページ | ユーザスクリプトで階段状のスプライン »

ユーザスクリプトで新規のスプライン

ユーザスクリプトで新規のスプラインオブジェクトを作成する。
最初SendModelingCommand()で出来ると思っていたのですが、追加は出来ても新規で設定することが出来ないことが分かりました。セグメント数を超えた設定も不可能と…
多分、ポリゴンもそうなのでしょう。では、普通の方法で作ってみます。

/*
スプラインを新規で作成
08.06.06
*/


var sl = new(SplineObject);if(!sl)return;//スプラインオブジェクトを作成
var vc = new(VariableChanged);if(!vc)return;//ポイントデータ数の変更のためのVariableChanged

var n = 8;//8ポイント

vc->Init(0 , n);//データ数の無い0からn個のデータ数へ変更
sl->MultiMessage(MSG_POINTS_CHANGED , vc);//変更をスプラインに適用
sl->Message(MSG_UPDATE);//オブジェクトのアップデートをC4Dに伝える

doc->InsertObject(sl , NULL , NULL);//シーンに追加

これで実行すると8個のデータ(0.0 , 0.0 , 0.0)のスプラインがシーンに追加されます。
これにポイントデータを変更するコードを付け足します。

/*
スプラインを新規で作成 正8角形
08.06.06
*/


var sl = new(SplineObject);if(!sl)return;//スプラインオブジェクトを作成
var vc = new(VariableChanged);if(!vc)return;//ポイントデータ数の変更のためのVariableChanged

var n = 8;//8ポイント

vc->Init(0 , n);//データ数の無い0からn個のデータ数へ変更
sl->MultiMessage(MSG_POINTS_CHANGED , vc);//変更をスプラインに適用

//正8角形のデータを作ります
var i;
var rad;

for(i = 0 ; i < n ; i++){
  rad = i * PI2 / n;
  sl->SetPoint(i , vector(cos(rad) * 100.0 , sin(rad) * 100.0 , 0.0));//ポイントデータの設定
}
//正8角形データの終わり

sl#SPLINEOBJECT_CLOSED = TRUE;//スプラインを閉じる
sl->Message(MSG_UPDATE);//オブジェクトのアップデートをC4Dに伝える

doc->InsertObject(sl , NULL , NULL);//シーンに追加

これでシーンに正8角形のスプラインが登場します。但し注意が必要です。このスクリプトには、メモリが少ないと重大なエラーがでるかも。でも8個ぐらいのデータなら大丈夫かな?ま、スクリプトを作成/実行するときは前もって保存しよう。そういえば、ここんとこUndoを組み込んで無かった。ん?オブジェクトの変更は変更前のオブジェクトを保存するけど、新規のオブジェクトは?ドキュメントごと?
そう言えばUndoも分からない所が放ったらかしだった…

|

« ユーザスクリプトでC4D標準オブジェクトを追加 | トップページ | ユーザスクリプトで階段状のスプライン »

コメント

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