PPGのイベントを動的に追加する その1

Softimageのインストール方のカスタムプロパティのイベント処理を動的に追加する方法を考えてみました。

※SoftimageのPPG関連の解説についてはJunkiさんのブログの友愛シリーズで詳しく解説して下さっています。非常に分かり易く参考になる記事ですから即読みが吉ですよ!!

で、イベント処理というのはボタンを押した _OnClicked イベントや、値を変化させたときにおこる _OnChanged イベントですね。
このイベントは通常、プラグイン作成時にあらかじめ記述しておく必要があります。

function HOGEHOGE_Botton1_OnClicked(){
	logmessage("ボタン1を押したよー!!");
}
function HOGEHOGE_Botton2_OnClicked(){
	logmessage("ボタン2を押したよー!!");
}

という具合です。

このイベントはあらかじめボタンの数とかが決まっていて、さらに個数がそこまでではない場合には別に苦になるもんだいではありませんね。受け入れます。
しかし、似たような動作をするボタンの数が100個とか1000個あったり、なんてことがあったら対処しきれません!
常考えられる対処としては、あらかじめ最大イベント数を想定してイベントを先に仕込んでおくということですが、それにも限界があります。
というか、ぶっちゃけメンドクサイっす。(そんなケース稀ですが…)

なので、どうにか楽をしてイベントを動的に追加出来んもんかと、ツイッタ―やらなにやらで相談に乗ってもらいつつ検討した結果、JScriptevalメソッドに辿り着きました。
evalメソッドは文字列を引数として渡してやると、あたかもそのファイル内にその文字列を書きこんだかのような動作をしてくれます。
通常は汎用関数なんかを別ファイルから読み取って、ファイル内にぶち込んだりするときに使いますね。
今回はその応用という感じです。

//読み込み用文字列
var sInclude = "";
//イベント関数を文字列として追加していく
for(var i = 1; i < 1000; i++){
	sInclude += "function HOGEHOGE_Botton" + i + "_OnClicked(){logmessage(\"ボタン"+ i + "を押したよー!!\");}";
}
//文字列となったイベント関数を読み込む
eval(sInclude);

上記のような記述をしておくことで、擬似的に以下のような記述がファイル内にされているということになります。

function HOGEHOGE_Botton1_OnClicked(){logmessage("ボタン1を押したよー!!");}
function HOGEHOGE_Botton2_OnClicked(){logmessage("ボタン2を押したよー!!");}
function HOGEHOGE_Botton3_OnClicked(){logmessage("ボタン3を押したよー!!");}
						・
						・
						・
function HOGEHOGE_Botton1000_OnClicked(){logmessage("ボタン1000を押したよー!!");}

Softimageさんにはこんな風(イベント関数が1000個存在している様)にみえてるわけです。
実際にPPG作って試してみると動作してるのがわかります。
これでボタンが100個あろうが、1000個あろうが恐くありません!!
それに、スクリプトファイル内の記述もスッキリしますし、内部の処理が変わっても対処しやすいですね。
注意しなければならないのは、この処理をファイルのグローバルの位置に書くということです。
通常のイベント関数と同じで、他の関数の中(ローカル関数)になってしまっていたら、きちんと動作してくれません。

さらに「PPGの他のパラメータによってボタンの数が変化する」なんてケースにも対応できないか考えてみました。
上手くいったのですが、長くなるので今回の記事はここまでとします。m(_ _)m