スクリプトを安全に動かすために

モニターをデュアルにして効率化

このサイトをご覧になるにはデュアルモニターが最適です。当WEBページとAEのExtendScript Toolkitを別画面に表示することをお勧めします。ブルーの囲みが実際のプログラムですが、説明を長々としている関係上、プログラム全体を見渡すことができません。特に、波括弧{}の場合、全部を見渡せないと思わぬミスを起こすことがあります。プログラミングは、入れ子構造になっていることほとんどですから最初につけた始まりの波括弧{に対する、閉じる波括弧 }が、かなり後ろのほうに出てくることが頻繁に起こります。波括弧の閉じ忘れで、プログラムが動かないなんてのは日常茶飯事ですので見落とさないようにしてください。JavaScriptはここがあまり美しくないようです。Pyathonなら段組がきれいで整然としているので誰が書いても同じような見た目になります。
毎日、AEを
使われてる方は、多分、デュアルモニター環境だと思いますので、ExtendScript Toolkitと当サイトを左右の画面に並べて表示されることをお勧めします。

スクリプト 1st Step:現在のプロジェクトの保護

{
   var safeToRunScript = true;
   safeToRunScript = app.project != null;

まず、宣言をする単語varによりsafeToRunScriptと命名した変数を定義し、デフォルトは真であることを定義します。
その名の通り「安全にスクリプトを動かす」ことを目的にした変数であることを意味しています。

次に、今開いているアプリケーションのプロジェクトがnullと等しくないという状態を変数safeToRunScriptに代入しなさいと命令しています。 これは、AEがnull(nullは何もないという意味の予約語です)ではない、つまりAEが開いている状態にしなさいと命令しています。
!=は比較演算子で、右辺と左辺の内容が等しくないことを示しています。
appはadobeのアプリケーションを指し、projectはそのアプリケーションで開いているプロジェクトファイルを指します。この場合、AEのプロジェクトファイルが実行中であることを真とするという意味になります。

if (! app.project) {
     alert ("A project must be open to run this script.\r\nこのスクリプトを実行するには、ひとつのプロジェクトが必要です");
}

! は論理NOTで、現在作業中のプロジェクトがない場合という意味です。alertは警告メッセージを出します。ここではif文を使い「このスクリプトを実行するには、ひとつのプロジェクトが必要です」と表現しています。

scr04

ちなみに、AE付録のscriptには日本語の記述はありませんが上記の英文のあとに続いて日本語を入れてやればそのまま日本語表記も可能です。 また、構文中に\r\nと記したのは改行を入れなさいという意味です。(\を使った語句をエスケープシーケンスといいます。)警告ボックスに英語と日本語の2行で表示されるようになります。しかし、この警告メッセージを受ける機会はほとんどお目にかかることはないでしょう。なぜなら、現在進行中のプロジェクトが無いのにレンダリングするなんてことはないからです。では、どのような場合に、このメッセージが発生するのでしょう。
これは、スクリプトから直接レンダリングをする場合が考えられるからです。つまり、バッチレンダリングですね。何らかのスクリプトを作成し、そこから直接実行処理する場合に必要なエラーメッセージです。

if (safeToRunScript) {
    safeToRunScript = false;
      for (i = 1; i <= app.project.renderQueue.numItems; ++i) {
        if (app.project.renderQueue.item(i).status == RQItemStatus.QUEUED) {
    safeToRunScript = true;
   break;
  }
}
if (! safeToRunScript) {
    alert ("You do not have any items set to render.\r\nレンダリングするアイテムがありません");
  }
}

scr16

まず、レンダーキューにレンダリングアイテムがひとつでもあることが前提条件です。if(safeToRunScript)では、もし実行中のプロジェクトがあることが真の場合、{}の中のプログラムを実行します。

次に、{}の中で、一番初めにsafeToRunScriptfalseにしています。これは、活動を停止して、for以下の構文を実行しなさいと命令しています。
for()の中では、レンダーキューに準備されたいくつかのコンポジションを順番にレンダリングしなさいと命じています。
ここでは3つのコンポジションをレンダーキューに既に入れています。
i=1で最初にレンダリングするコンポジション番号は1としています。
app.project.renderQueue.numItemsは、現在開いているアプリケーション”app”のプロジェクト”project”のレンダーキュー”renderQueue”に入っているコンポジションの数”numItem”がいくつあるかを示しています。
この場合、for は、i で代入された番号から++1で順番にカウントアップして作業を繰り返してすすめて行きます。
次にapp.project.renderQueue.numItemsで示されている数字と不等号を示す<=によって等しいか小さくなるまで作業を進めなさいと指示しています。
この場合では、レンダーキューに入っているコンポジションは3つですから、1番目から順にレンダリングし、3番目が終わるまで作業を進めなさいと命令しています。
次のif()では、app.project.renderQueue.item(i).statusによりfor文で3番目まで終わったら3の数値をitem(i)に代入し、コンポジションの3番目が、レンダリング完了したことを確認します。
RQItemStatus.QUEUEDは、レンダリングアイテムのレンダリング完了したという意味です。
つまり、app.project.renderQueue.item(i).statusは、RQItemStatus.QUEUEDと等しいとしています。
ここで使われている==(2つのイコール)は、等しいという意味です。これまで1つのイコールで使われていた代入の意味とは異なります。
if (app.project.renderQueue.item(i).status == RQItemStatus.QUEUED)は、もし、レンダリングが完了したらの意味で、完了した{}内を実行しなさいと命じています。
{}内は、safeToRunScript = true;として活動中のプロジェクトがあることを真として、break;forの構文から抜けています。