« C4D ポイントやポリゴンをランダム選択するユーザスクリプト。R10 & R9 | トップページ | C4D C.O.F.F.E.E. ランダム値の取得の為のRandomクラスに似たNoiseクラスを使ってみる。 »

C4D ユーザスクリプトをR9とR10以降に対応させる…

前回のポイントやポリゴンをランラムに選択するユーザスクリプトは、C4D R10以上対応とC4D R9対応を2種類用意しました。

これを1つのユーザスクリプトで対応させるには…?

GetC4DVersion()を使うとC4Dのバージョンを取得できますが…

さて、今回の「エレメントをランダム選択する」スクリプトを、R9とR10以降を分ける必要があったのか?
と言う事だが…

今回のスクリプトからだけ言うと、分ける必要は全く無かったのです。
確かにobject(n)は、選択された複数オブジェクトを扱うには手軽で良いのだけど…
R10以降でもSearchNext(BIT_AOBJ)が使えるわけです。
だから、object()を使ったR10以降タイプとSearchNext()を使ったR9タイプ(R10以降も使える)を分ける必要は無かったのです。
実行した結果は、R9タイプもR10タイプも全く同じなのだから…
もしも、R10タイプがフル機能で、R9が機能限定というなら、意味のある事だろう。

ま、それはそれで…

だけど、C4D R9でSDK R9.5には無いobject()のような関数をソースの中に入れ込んだ場合は、問題ないのだろうか?
if() 等でobject()等を実行されないようにすれば、良いのだろうか?
今回は、それを試してみます。

R10で複数選択されたオブジェクトの名前をコンソールに表示します。

/*
R10で複数選択オブジェクトの名前をコンソールに表示
2009.6.21
*/


main(doc , op)
{
  var i;
  if(!object(0))return;
  println("R10");
  for(i = 0 ; object(i) ; i++){
    println(object(i)->GetName());
  }
}

R10
トーラス
平面
球体
立方体

R9で複数選択されたオブジェクトの名前をコンソールに表示する。

/*
R9で複数選択オブジェクトの名前をコンソールに表示
2009.6.21
*/


main(doc , op)
{
  var obj = GetActiveObject(doc);
  if(!obj)return;
  println("R9");
  for(; obj ; obj = obj->SearchNext(BIT_AOBJ)){
    println(obj->GetName());
  }
}

R9
トーラス
平面
球体
立方体

この2つのスクリプトは、問題なく動作します。

では、この2つのスクリプトを1つにまとめてみます。

/*
R9とR10混在テスト
複数選択オブジェクトの名前をコンソールに表示
2009.6.21
*/


main(doc , op)
{
  var obj;
  var i;

  if(GetC4DVersion() < 10000){//--C4D version R9
    obj = GetActiveObject(doc);
    println("R9");
    if(!obj)return;
    for(; obj ; obj = obj->SearchNext(BIT_AOBJ)){
      println(obj->GetName());
    }
  }else{//------------------------C4D version R10~
    if(!object(0))return;
    println("R10");
    for(i = 0 ; object(i) ; i++){
      println(object(i)->GetName());
    }
  }

  println("ok");
}

R10で実行すると、問題なく動作します。

R10
トーラス
平面
球体
立方体
ok

ではR9では、どうだろう…スクリプトマネージャの実行ボタンを押すと…

[FAIL] Script 'R9とR10混在テスト' Line 20 Pos 16 : Variable or function expected

20行 16文字目のobject()にエラーが出ます。

パレットのアイコンからも、メニューからの実行もエラーが出ます。

結局、実行前にスクリプトの全体をエラーチェックされるので、下位のSDKにしか対応していないバージョンでは、if()で上位のSDKを実行できないようにしていても、無理ですね。
幅広いバージョンで実行するのであれば、下位のSDKで作成すると言う事です。

ただし、C4D R9でSDK R11を使用したスクリプトを作成しエクスポートしたスクリプトは、C4D R10以降でも読み込み実行が可能のようです。

|

« C4D ポイントやポリゴンをランダム選択するユーザスクリプト。R10 & R9 | トップページ | C4D C.O.F.F.E.E. ランダム値の取得の為のRandomクラスに似たNoiseクラスを使ってみる。 »