仕事をしていると、MELで自動的にエクスプレッションが組まれるようなツールを作ることが頻繁にあります。
ただ、エクスプレッションが自動に組まれるようなMELを書くのは結構面倒臭い作業なんですよね。
例えば
pCube1.rx=time;
pCube1.ry=time * 0.5;
pCube1.rz=time * 2;
というエクスプレッションを生成するMELは次のようになります。
string $exp = "pCube1.rx=time;\npCube1.ry=time * 0.5;\npCube1.rz=time * 2;";
expression -s $exp;
これは短い文なのでまだ楽ですが、長くなってくるとどこがどうなってるのかわからなくなってきて混乱してしまいます。
さらに、あとで修正するときはもっと大変ですね。どこがどこだか探すだけで一苦労。
そういうわけで、自動的にエクスプレッションが生成できるMELを生成するスクリプトを書きました。
使用方法
1.
エクスプレッションのソースを書いたファイルをテキストファイルでいいのでどこかに保存します。
pCube1.rx=time;
pCube1.ry=time * 0.5;
pCube1.rz=time * 2;
といったような内容でテキストを保存します。
2.
INPUT=先ほど保存したファイルのパス
OUTPUT=生成されたMEL文を保存しておくファイルパス
とすると
コマンドラインに
makeExpGen(INPUT, OUTPUT);
と入力して実行します。
例えば
makeExpGen("C:/exp.txt", "C:/generated.txt");
というような感じです。
3.
保存されたファイルに完成した文が書き込まれているので、それをコピーしてプロシージャの作成などに利用します。
2の例ではC:/にgenerated.txtというファイルが生成されています。
エクスプレッション中のdestinationの名前を変更できるようにしたりはしていないです。
これから、もう少し機能を拡張させようと思います。
以下がソースコードです。
global proc makeExpGen(string $srcFile,string $destFile){
int $srcId = fopen($srcFile,"r");
int $destId = fopen($destFile,"w");
fprint($destId,"$expName = \"expression\";\nstring $exp=\"");
string $nextLine = `fgetline $srcId`;
$nextLine = `substitute "\n" $nextLine " "`;
string $exp = $nextLine;
while ( size( $nextLine ) > 0 ) {
print ( $nextLine );
$nextLine = `fgetline $srcId`;
$nextLine = `substitute "\n" $nextLine " "`;
$nextLine = substituteAllString($nextLine, "\"", "\\\"");
$exp += "\\n"+$nextLine;
}
fprint($destId,($exp +"\";\nexpression -s $exp -n $expName;"));
fclose($srcId);
fclose($destId);
}
ただ、エクスプレッションが自動に組まれるようなMELを書くのは結構面倒臭い作業なんですよね。
例えば
pCube1.rx=time;
pCube1.ry=time * 0.5;
pCube1.rz=time * 2;
というエクスプレッションを生成するMELは次のようになります。
string $exp = "pCube1.rx=time;\npCube1.ry=time * 0.5;\npCube1.rz=time * 2;";
expression -s $exp;
これは短い文なのでまだ楽ですが、長くなってくるとどこがどうなってるのかわからなくなってきて混乱してしまいます。
さらに、あとで修正するときはもっと大変ですね。どこがどこだか探すだけで一苦労。
そういうわけで、自動的にエクスプレッションが生成できるMELを生成するスクリプトを書きました。
使用方法
1.
エクスプレッションのソースを書いたファイルをテキストファイルでいいのでどこかに保存します。
pCube1.rx=time;
pCube1.ry=time * 0.5;
pCube1.rz=time * 2;
といったような内容でテキストを保存します。
2.
INPUT=先ほど保存したファイルのパス
OUTPUT=生成されたMEL文を保存しておくファイルパス
とすると
コマンドラインに
makeExpGen(INPUT, OUTPUT);
と入力して実行します。
例えば
makeExpGen("C:/exp.txt", "C:/generated.txt");
というような感じです。
3.
保存されたファイルに完成した文が書き込まれているので、それをコピーしてプロシージャの作成などに利用します。
2の例ではC:/にgenerated.txtというファイルが生成されています。
エクスプレッション中のdestinationの名前を変更できるようにしたりはしていないです。
これから、もう少し機能を拡張させようと思います。
以下がソースコードです。
global proc makeExpGen(string $srcFile,string $destFile){
int $srcId = fopen($srcFile,"r");
int $destId = fopen($destFile,"w");
fprint($destId,"$expName = \"expression\";\nstring $exp=\"");
string $nextLine = `fgetline $srcId`;
$nextLine = `substitute "\n" $nextLine " "`;
string $exp = $nextLine;
while ( size( $nextLine ) > 0 ) {
print ( $nextLine );
$nextLine = `fgetline $srcId`;
$nextLine = `substitute "\n" $nextLine " "`;
$nextLine = substituteAllString($nextLine, "\"", "\\\"");
$exp += "\\n"+$nextLine;
}
fprint($destId,($exp +"\";\nexpression -s $exp -n $expName;"));
fclose($srcId);
fclose($destId);
}