プロが教える店舗&オフィスのセキュリティ対策術

0,50,10,20,99,

と数字がカンマ区切りで入力されているテキストデータを読み込んで、AfterEffectsのエフェクトにスクリプトでキーフレームを入力したいと考えております。

<スクリプト>
aTime = 0;
fps = 1/30;
layObj = app.project.activeItem.selectedLayers[0];
filename = File.openDialog("ファイルを選択してください","");
fileObj = new File(filename);
if (fileObj.open("r"))
{
while(!fileObj.eof)
{
txt = fileObj.readln();
txt = txt.split(",");
layObj("Effects")("シャープ")["シャープ量"].setValueAtTime(aTime,txt[0]);
layObj("Effects")("シャープ")["シャープ量"].setInterpolationTypeAtKey(1,KeyframeInterpolationType.BEZIER);
aTime = aTime + fps;
}
}

上記のコードだと0フレーム目に0としかキーが打たれません。

0,
50,
10,
20,
99,

と改行すれば、意図したように1フレームずつテキストのキーが打たれてうまくいきます。

『改行されていないカンマ区切りの数値データ』を読み取みとりたいので、どうコードを変更したらよろしいでしょうか?

よろしくおねがいいたします。

A 回答 (1件)

こんにちは



AfterEffectsを存じませんので、原因と対処法の考え方のみですが・・・

ご提示の構文だと
 > while(!fileObj.eof) {
 >  // データ記入の処理
 > }
として、ファイルの最終行まで1行ずつ処理を繰り返すような記述になっていますが…

>と改行すれば、~~~うまくいきます。
と書かれている様に、改行がないカンマ区切りのデータは1行しかありませんので、上記の繰り返しは一度しか行われません。
(最初の1行を読み込んだ際に txt = "0,50,10,20,99,"と同等になります。)
この結果、ご質問のようなことになっているものと思われます。

では、「0」以外のデータはどうなっているかと言えば、
 > txt = txt.split(",");
としているので、変数txtは配列となり、[ 0, 50, 10, 20, 99, ]の値を保持しています。
それなので、ファイルの読み込みでループするのではなく、この配列の値に対してループなされば、意図するようになるはずです。

考え方のイメージとしては、
 for(var i=0; i<txt.length; i++) {
  // データ txt[i] を利用した処理
 }
といった感じです。

※ タイポなのかどうかは不明ですが、ご提示の質問文では99の後にもカンマがあります。
  もしもデータがこの通りであるなら、配列のtxt.lengthは6で、txt[5]の値は""となります。
  想像するところ最後のデータは余分だと思いますので、元データのカンマの有無に応じてループの回数を調整するか、あるいは、データの値をチェックしてから処理するなどの配慮が必要になるかも知れませんね。
    • good
    • 0
この回答へのお礼

ありがとう

意図したスクリプトを書くことができました。ほんとにありがとうございました。

お礼日時:2016/07/23 17:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!