初投稿です。
Markdown記法は不慣れなので、ご容赦ください。
今回、社内の環境改善としてAfterEffects(以下AE)のスクリプト開発を行うことになり、その時に詰まったり忘れがちだったこと、あるい便利だったものをメモとして残しておきます。
今回使用していたAEのバージョンはCC2018とCC2020です。
思い出したり、新しく詰まったことがあれば追記していきます。
・Window
show()
cc2018では、何かしらのイベント関数(空でもok)がないとウィンドウが表示されません。
cc2020ではイベント関数がなくても大丈夫です。
表示モード
Windowにはモードが3つあります。
dialog、palette、windowです。
基本的にはdialogかpaletteでいいかなと思います。
私が開発していたスクリプトで、「エクスプレッションを使用して現在のフレームで特定のピクセルのカラーを取得する」という処理があったのですが、CC2018ではdialogでしか動作しませんでした(paletteではrgbが0で返ってくる)。
どうやらCC2018では、paletteでウィンドウを作成した場合、エクスプレッションで動的に設定したvalueは0が返ってくるようです。
ただし、CC2020では問題なく動作していました。
・ListBox
selection
選択した項目(ListItemオブジェクト)を取得するプロパティです。
選択した項目の番号を取得したいときはselection.indexで取れます。
また、selectionは、項目が選択されていないときはnullを返します。
つまり、リストボックス内でクリックした場所がcolumnWidths外の場合、nullチェックしていなければエラーとなります。
しかし、columnWidthsが適切な大きさだったとしても上記が発生する場合があります。
それは、showHeadersプロパティがfalseの場合です。(必ずそうなるかはわかりません、すみません)
その場合、見かけ上の大きさの半分くらいしかクリック範囲が確保されませんでした。
なので、サイズは合っているのにクリックできない場合、showHeadersをtrueにしてみてください。
multiselect
trueにすると項目の複数選択が可能になるプロパティですが、前項で取り上げたselectionの取り扱いが変わってきます。
このプロパティがtrueの場合、selectionが配列で返ってくるようになります。
これは、一つしか選択していない場合でも同様です。
つまり、selection.indexはundefinedになってしまいます。
選択した項目を取得したい場合は下記のようにします。
// 複数選択したいリストボックスの全要素の数でloop
for (var i = 0; i < listbox.items.length; i++) {
// リストボックスの項目から、選択されているものだけを対象に処理
if (listbox.items[i].selected == true) {
// なんかしらの処理
}
}
・numberOfColumns
一つの項目に対して表示したい列が複数(2以上)の場合の管理について。
各列に対応した配列変数を作成しても大丈夫ですが、連想配列で管理するのがベターかなと思います。
var A = [];
var B = [];
var C = [];
A.push(a);
B.push(b);
C.push(c);
//上記よりも
// こっちの方が管理しやすい気がする
var arr = [];
arr.push({"A":a, "B":b, "C":c});
・オブジェクト
ここでいうオブジェクトとは、フッテージやコンポジション、GUIオブジェクトのことです。
言語仕様上のオブジェクトではありません。(Arrayとか)
remove()
フッテージやコンポジションの場合、削除したいオブジェクト.remove()で削除することができます。
このとき、app.project.itemsが切り詰められるので、インデックスでアクセスしている際は注意が必要です。
また、独自の配列でオブジェクトを管理している場合、削除したときにその配列も切り詰めないと、そのインデックスにアクセスした場合エラーとなります(無効なオブジェクト)。
var items = app.project.items;
// NG
for(var i = 1; i <= items.length; i++) {
var item = items[i]; // 切り詰めているため、削除された場合は一つ飛ばしてしまう
if(条件) {
items[i].remove();
}
}
// OK1
for(var i = 1; i <= items.length; i++) {
var item = items[i];
if(条件) {
items[i].remove();
i--;
}
}
// OK2(better)
for(var i = items.length; i > 0; i--) {
var item = items[i];
if(条件) {
items[i].remove();
}
}
// エラー
var arr = [];
arr.push(フッテージA);
arr.push(フッテージB);
arr.push(フッテージC);
alert(arr[1].name); // フッテージB
arr[1].remove();
alert(arr[1].name); // エラー(無効なオブジェクト)
GUIオブジェクトの場合、最上位の親要素(パネル).remove(削除したいオブジェクト)で削除できます。
引数は他にテキスト指定、インデックス指定があるようですが、私は上記しか使ったことがないので詳しくありません・・・。
・滅茶苦茶お世話になった参考サイト様