« C4D C.O.F.F.E.E. 関数のプロトタイプ | トップページ | C4D C.O.F.F.E.E. 定数 const »

C4D C.O.F.F.E.E. 列挙? enum

enumって何だ?

このブログでは、全く取り上げていませんでしたが…

obj->SearchNext(BIT_AOBJ);や…
op->Message(MSG_UPDATE);等で使っているBIT_AOBJMSG_UPDATEのような定数の宣言に使います。

このBIT_AOBJは"BIT_AOBJ"と言う文字ではない事は知っている事だろう。

println(BIT_AOBJ);

を実行するとわかります。

コンソールに表示された結果は…

2

要するに、これは文字ではなく決められた数値なのですね。

これは、グローバルな定数なのです。

obj->SearchNext(BIT_AOBJ);

の代わりに、

obj->SearchNext(2);

でも、いいわけです。

でもね。

SearchNext(2)って何だっけ?
確か2はオブジェクトの選択フラグだったかなぁ…違ったっけ?

1個や2個なら覚えていられるけど、覚えなければならない数が増えると、こんな事になるわけだ。

BIT_AOBJの方が、覚えやすいだろう。
覚えやすくするために使うわけではないけれど…
プログラムやスクリプトを組みやすく、わかりやすくする為だね。

では、実際に使ってみよう。

/*
現在の編集モードをコンソールに表示します
2009.7.3
*/


enum
{
  EDITING_MODE_POINT,      //0が割り振られます。
  EDITING_MODE_POLYGON,    //1が割り振られます。
  EDITING_MODE_OBJECT,     //2が割り振られます。
  EDITING_MODE_EDGE,       //3が割り振られます。
  EDITING_MODE_OBJECTAXIS, //4が割り振られます。
  EDITING_MODE_MODEL,      //5が割り振られます。
  EDITING_MODE_TEXTURE,    //6が割り振られます。
  EDITING_MODE_TEXTUREAXIS //7が割り振られます。
}

GetEditingMode()
{
  var ed_mode;
  if(IsCommandChecked(12139))ed_mode = EDITING_MODE_POINT;
  if(IsCommandChecked(12187))ed_mode = EDITING_MODE_POLYGON;
  if(IsCommandChecked(12101))ed_mode = EDITING_MODE_OBJECT;
  if(IsCommandChecked(16351))ed_mode = EDITING_MODE_EDGE;
  if(IsCommandChecked(12102))ed_mode = EDITING_MODE_OBJECTAXIS;
  if(IsCommandChecked(12298))ed_mode = EDITING_MODE_MODEL;
  if(IsCommandChecked(12184))ed_mode = EDITING_MODE_TEXTURE;
  if(IsCommandChecked(12185))ed_mode = EDITING_MODE_TEXTUREAXIS;
  return ed_mode;
}

main(doc , op)
{
  switch(GetEditingMode())
 {
    case EDITING_MODE_POINT:
      println("ポイントモード");
      break;

    case EDITING_MODE_POLYGON:
      println("ポリゴンモード");
      break;

    case EDITING_MODE_OBJECT:
      println("オブジェクトモード");
      break;

    case EDITING_MODE_EDGE:
      println("エッジモード");
      break;

    case EDITING_MODE_OBJECTAXIS:
      println("オブジェクト軸モード");
      break;

    case EDITING_MODE_MODEL:
      println("モデルモード");
      break;

    case EDITING_MODE_TEXTURE:
      println("テクスチャモード");
      break;

    case EDITING_MODE_TEXTUREAXIS:
      println("テクスチャ軸モード");
  }
}

モード用の列挙したグローバルな定数
編集モードを取得する関数

を使っています。

これで、スクリプト中で、現在のモードを知る必要性が出たときに、番号ではなく定数の名前で組むことができます。

ま、残念なのは、スクリプトマネージャやエクスプレッションエディタで、色が着かない事です。

では、enumだけを試してみます。

このenumは、列挙した定数に自動的に、連番で整数を与えてくれます。

/*
enumテスト
2009.7.3
*/


enum
{
  TEST_1,
  TEST_2,
  TEST_3,
  TEST_4
}

main(doc , op)
{
  println("TEST_1 : " , TEST_1);
  println("TEST_2 : " , TEST_2);
  println("TEST_3 : " , TEST_3);
  println("TEST_4 : " , TEST_4);
}

実行結果は、

TEST_1 : 0
TEST_2 : 1
TEST_3 : 2
TEST_4 : 3

自動的に0から連番で与えられました。

でも、enumは任意の連番にする事ができます。

次に最初の値を100にします。

/*
enumテスト
2009.7.3
*/


enum
{
  TEST_1 = 100,
  TEST_2,
  TEST_3,
  TEST_4
}

main(doc , op)
{
  println("TEST_1 : " , TEST_1);
  println("TEST_2 : " , TEST_2);
  println("TEST_3 : " , TEST_3);
  println("TEST_4 : " , TEST_4);
}

結果は、100からの連番です。

TEST_1 : 100
TEST_2 : 101
TEST_3 : 102
TEST_4 : 103

では、途中で別の数値を与えると、

/*
enumテスト
2009.7.3
*/


enum
{
  TEST_1 = 100,
  TEST_2,
  TEST_3 = 50,
  TEST_4
}

main(doc , op)
{
  println("TEST_1 : " , TEST_1);
  println("TEST_2 : " , TEST_2);
  println("TEST_3 : " , TEST_3);
  println("TEST_4 : " , TEST_4);
}

新規で与えられた所から、新たな連番になります。

TEST_1 : 100
TEST_2 : 101
TEST_3 : 50
TEST_4 : 51

全てに値を設定することもできます。

/*
enumテスト
2009.7.3
*/


enum
{
  TEST_1 = 100,
  TEST_2 = 135,
  TEST_3 = 50,
  TEST_4 = 7
}

main(doc , op)
{
  println("TEST_1 : " , TEST_1);
  println("TEST_2 : " , TEST_2);
  println("TEST_3 : " , TEST_3);
  println("TEST_4 : " , TEST_4);
}

このような結果になります。

TEST_1 : 100
TEST_2 : 135
TEST_3 : 50
TEST_4 : 7

でもバラバラな値にするならば、constでも良いのでは?

constは、次回にでも…

enumは大文字で指定しているけど小文字はどうなんだ?

/*
enumテスト
2009.7.3
*/


enum
{
  Test_1 = 100,
  Test_2 = 135,
  Test_3 = 50,
  Test_4 = 7
}

main(doc , op)
{
  println("Test_1 : " , Test_1);
  println("Test_2 : " , Test_2);
  println("Test_3 : " , Test_3);
  println("Test_4 : " , Test_4);
}

問題は無いですが、変数や関数を区別し、一目でわかる大文字の方が良いでしょう。

Test_1 : 100
Test_2 : 135
Test_3 : 50
Test_4 : 7

では素朴な疑問。整数以外はどうなんだ?

って、もともと整数を割り振る機能なのにね。
分かってはいるんだけど、やって見たいよね。

/*
enumテスト
2009.7.3
*/


enum
{
  TEST_1 = 100.5,
  TEST_2 = vector(100.0 , 200.0 , 600.0),
  TEST_3 = "ABC",
  TEST_4 = 7
}

main(doc , op)
{
  println("TEST_1 : " , TEST_1);
  println("TEST_2 : " , TEST_2);
  println("TEST_3 : " , TEST_3);
  println("TEST_4 : " , TEST_4);
}

結果は、

[FAIL] Script 'xxxx' Line 8 Pos 18 : Syntax error [Expectid: '<Integer>',found: '<Float>']

そもそも連番の整数を自動で割り振るのだから、無駄な挑戦はしなくても…ね。

これも、実数や文字列の定数ならばconstで…

今回は、ちょっと間抜けなテストでした。

|

« C4D C.O.F.F.E.E. 関数のプロトタイプ | トップページ | C4D C.O.F.F.E.E. 定数 const »