« C4Dでグラフィック以外でも活動してる人 | トップページ | スクリプトでポリゴンオブジェクトを作成 »

ユーザスクリプトでC.O.F.F.E.E.エラー

このブログで出合うであろうC.O.F.F.E.E.エラーがある。C.O.F.F.E.E.エラーと言っても、軽いエラーだっり重大なエラーだったり。使い方を間違えると、何も言わず強制終了してりする。驚きだね。試す前には大事なファイルは保存して閉じてください。

/*
エラーが起こるスプライン。
08.06.07
*/


if(!instanceof(op , SplineObject))return;//スプラインオブジェクト以外は処理を終了。
var len = op->GetLength();//スプラインの長さを求める。

このスクリプト、if(!instanceof(op , SplineObject))return;が無ければ、どのオブジェクトにも実行できるわけですが、スプライン以外では「Member Not Found(メンバ関数が見つかりません。」と言うエラーが出ます。opがnilだと「Incompatible values...NIL/OBJECT(互換性の無い数値...nilはObjectクラスではない。」と出ます。この程度なら、COFFEEスクリプトが停止するだけなのですが、opがスプラインの場合、重大なエラーになります。次のメッセージを出してC4Dが強制終了します。

Erorr01tif

マニュアルには、「GetLength()とUniformToNatural()を使う前に呼ばれなければならない。」と書いてある。理由は一切書いていない。FleeLength()には「InitLength()で使用したメモリを開放する。」となっている。InitLength()ではメモリを確保しているようですね。まぁスプラインの長さを計算するにはスプラインを線分に細分して、その線分の長さの合計を出すんだろうから、その為のメモリ確保なのかなぁ。で、確保していないのにメモリにアクセスしたとか?UniformToNatural()は、スプライン上の位置を均等に割り出すのに使うので、これもスプラインを細分化して、0.0から1.0の間で均等になるようにマッピングするのかなぁ。まぁ「GetLength()UniformToNatural()を使う前に必ず呼ぶ。」を忘れずに…

もう一つ、BaseObjectクラスのInsertObject()メンバ関数。次のようにオブジェクトマネージャ(シーン)にオブジェクト追加してください。アクティブオブジェクトは”D”です。

Erorrtest

/*
既にオブジェクトマネージャに登録済みのオブジェクトを再登録する。
08.06.07
*/


var obj = doc->FindObject("A");//シーン内の”A”と言うオブジェクトを探す。
doc->InsertObject(op , obj , NULL);//現在のアクティブオブジェクトopをオブジェクト"A"の子オブジェクトとして追加。

これで実行するとオブジェクト”D”がオブジェクト”A”の子オブジェクトになります。だけど、一番下にもオブジェクト”D”が残っています。この下のオブジェクト”D”を選択するとオブジェクト”A”の子オブジジェクト”D”も選択されます。気づかず作業を続けていくと、オブジェクトマネージャのツリー構造が破綻します。

Errortest02

では試して見ましょう。もう一度、一番下のオブジェクト”D”を選択し実行すると「Incompatible values...NIL/OBJECT(互換性の無い数値...nilはObjectクラスではない。」と言うエラーが出ています。同様に他のオブジェクト”C”、”B”を選択して繰り返しスクリプトを実行していきます。更にオブジェクト”A”にも実行してみましょう。乱暴ですが、最終的に「応答なし」になりました。 後は自ら強制終了するのみです。この詳細はBaseDocumentクラスには載っていません。BaceList2DクラスのInsertBefore()/InsertAfter()/Remove()メンバ関数のところに書いてあります。「リスト上にあるオブジェクトは、Remove()を実行しなければならない。」とあります。
まず、移動させるオブジェクトをRemove()でリストから外して、目的の位置にInsertObject()/InsertBefore()/InsertAfter()で挿入する。そうしないとリストが破綻するのでしょう。

9.6SDKも日本語にしてほしいですね。索引も付けて。詳しく説明してほしいものです。ちなみに9.6SDKにはいくつか誤記があります。

|

« C4Dでグラフィック以外でも活動してる人 | トップページ | スクリプトでポリゴンオブジェクトを作成 »

コメント

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