[AE]スクリプトでダイアログを出す

csvを読み込んで配列に格納とか

仕事で動画制作を行う場合にAfterEffectsは頻繁に使うもののスクリプトは全くいじらない。エクスプレッションもほとんど使わないくらいなのだが、今回あえてスクリプトで色々試してみた。

Adobeで使われるスクリプト言語は参考サイトにあるようにAdobeがjavascriptをカスタマイズして作ったExtendScriptというもので、形式はjsxだ。検索する時はjsxよりもExtendScriptで検索した方が見つかるかも(jsxで検索するとDeNA社が提供しているJSXと混合してしまう。両者は別物)。

今回、ローカルにおいた全国市区町村役場csvファイルを読み込んで二次元配列に格納する。そして検索ダイアログを出して、市区町村を検索させて該当する市区町村の役場データをアラートに出す。という謎の行為をスクリプトで作ってみる。

//csvファイルを読み込んで二次元配列dataに格納
var data = [];
var filePath = decodeURI(File("csv/002.csv"));
var f = new File(filePath);
f.open("r");
if (f) {
        var txt = f.read();
        var tmp = txt.split("\n");
        for (var i = 0; i < tmp.length; ++i) {
                data[i] = tmp[i].split(',');
        }
        f.close();
        $.writeln(txt);
}


//入力欄ダイアログを出して検索させる

//Window関数はshowの置き場が重要
//closeしない限りスクリプトはshowから先に進まない
//なのでonClickはshowの前に入れる

win = new Window("dialog", "☆SQメーカーNEO☆");
stati = win.add("StaticText", { width: 300, height: 10, x: 0, y: 0 }, "↓↓↓検索したい市区町村名を入れてね☆");
editext = win.add("edittext", { width: 300, height: 40, x: 400, y: 300 });
srbtn = win.add("button", { width: 80, height: 25, x: 40, y: 25 }, "検索");
clbtn = win.add("button", { width: 80, height: 25, x: 40, y: 25 }, "閉じる");
//閉じるボタンが押されたら
clbtn.onClick = function () {
        win.close();
}

//該当地名格納用の配列を作成
//候補一覧表示用のyakubaリストとその市区町村番号yakubaNumリストを配列番号で紐づける
var yakuba = [];//該当地名の格納用
var yakubaNum = [];//該当地名の番号格納用

//市区町村選択ダイアログの表示関数
//yakubaリストを作成してから呼ばないといけないので関数にした
//this.をつけないとエラーになる 理由は不明
function ChoiceWin() {
        this.win2 = new Window("dialog", "☆SQ候補一覧☆");
        this.statext = this.win2.add("StaticText", { width: 300, height: 10, x: 0, y: 0 }, ("該当数" + yakuba.length + "☆"));
        this.statext2 = this.win2.add("StaticText", { width: 300, height: 10, x: 0, y: 0 }, "該当する市区町村を選んで検索ボタンを押してね☆");
        this.Cholist = this.win2.add("ListBox", { width: 300, height: 300, x: 40, y: 25 }, yakuba);
        this.srbtn2 = this.win2.add("button", { width: 80, height: 25, x: 40, y: 25 }, "検索");
        this.clbtn2 = this.win2.add("button", { width: 80, height: 25, x: 40, y: 25 }, "閉じる");
        this.Cholist.items[0].selected = true;
        var selectedIndex = 0;
        this.show = function () {
                return this.win2.show();
        }
        this.close = function () {
                yakuba.length = 0;
                yakubaNum.length = 0;
                return this.win2.close();
        }
        this.select = function () {
                selectedIndex = this.Cholist.selection.index;
                return;
        }
        this.search = function () {
                n = yakubaNum[selectedIndex];
                alert(data[n][0] + data[n][1] + data[n][8] + " , " + data[n][9]);
                return;
        }
}
//検索ボタンが押されたら
srbtn.onClick = function () {
        var edtxt = editext.text;//入力テキスト取得
        //入力文字から市区町村検索 includesは使えなかったのでindexof
        for (var i = 0; i < data.length; ++i) {
                if (data[i][1].indexOf(edtxt) !== -1) {
                        yakuba.push(data[i][0] + " " + data[i][1]);
                        yakubaNum.push(i);
                }
        }
        //検索結果の候補が二つ以上の場合 ChoiceWinダイアログを出現させる
        if (yakuba.length >= 2) {
                var sd = new ChoiceWin;
                //閉じるボタンを押されたら発動
                sd.clbtn2.onClick = function () {
                        sd.close();
                }
                //候補一覧を選択したら発動
                sd.Cholist.onChange = function () {
                        sd.select();
                }
                //検索ボタンを押したら発動
                sd.srbtn2.onClick = function () {
                        sd.search();
                }
                sd.show();
        }
        //検索結果の候補が一つの場合
        else if (yakuba.length == 1) {
                n = yakubaNum[0];
                alert(data[n][0] + data[n][1] + data[n][8] + " , " + data[n][9]);
        }
        //検索結果の候補がない場合
        else {
                alert("該当する市区町村がないよ☆");
        }
}

win.show();

スクリプトを読み込むとダイアログが出る。

市区町村を検索して複数候補があったら選択画面が出る。

実行すると内容がダイアログに表示される。

参考サイト一覧

[window関連]http://ae-users.com/jp/tutorials/2011/10/

[文字検索]https://marycore.jp/prog/js/includes-method-contains-method/

[ダイアログ関連]https://qiita.com/r-ngtm/items/65f26b1f782f72b18d2a

[リスト関連]https://uxmilk.jp/11586

[パス取得]https://gist.github.com/cg-method/39da41d30fcf69fa0f365437a05caf9b

[構文一覧]http://cg-squid.com/2019/09/29/ae_script%E6%A7%8B%E6%96%87%E3%83%A1%E3%83%A2/

々と調べると作業が捗りそうな項目がたくさんあるので、覚えておいて損はないはず。

コメント