スナックelve 本店

バツイチ40代女の日記です

レイヤー操作とか

前回作ったScript
snack.elve.club

これにより、目的のものはできたんですが素材nというレイヤーが10個ほどのファイルになって、クソ重いことに。
それぞれ差し込んだあとに微調整したいし・・・というわけで、素材レイヤーごとのaiファイルを作るScriptです。
(不要な素材レイヤーを削除する)

前提
・非表示にしてるのは素材nレイヤーのみ。
・素材nレイヤーはすべて非表示にする。

//元のファイルを開く
var fileObj = new File("ベースのファイル。フルパス");
var fRef = open(fileObj);

//ファイル名
var bFile = fRef.name;
// 現在のファイルの場所を取得
var mypath = fRef.path;

//n分ループ(ここでは10)
var i;
for (i = 0; i <= 10; i++) {
    //レイヤーを取得
    var layObj = activeDocument.layers;
    //レイヤー数
    var layNum = layObj.length;
    try {
        //素材nが存在する場合
        var newLay = layObj.getByName("素材" + String(i));
        newLay.visible = true;
        // 現在のレイヤの名前を抽出し、ファイル名前に追記
        var myname = newLay.name + bFile;
        // フルパスを作成する
        var newpath = mypath + "/" + myname;
        //非表示レイヤーを削除(今のターゲット意外素材レイヤーを削除)
        for (k = layNum - 1; k >= 0; k--) {
            if (!layObj[k].visible) {
                layObj[k].visible = true;   //表示
                layObj[k].locked = false;  //ロック解除
                layObj[k].remove();         //レイヤー削除
            }
        }

        //イラレを保存する際の構文的なものを書く([https://namayakegadget.com/447/])
        aiOpt = new IllustratorSaveOptions();
        saveFile = new File(newpath);
        activeDocument.saveAs(saveFile, aiOpt);
        //ファイルを閉じる([http://dtp.screen-cre.co.jp/xml0015/])
        app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

        //元のファイルを開く
        fileObj = new File(mypath + "/" + bFile);
        fRef = open(fileObj);
    } catch (e) {
        //存在しない場合(なにもしない)
    }
}

おまけ 開いてるファイルすべてpng出力(前回の応用)

//開いてるファイルの数
var dqcount = app.documents.length;
var i = 0
for (i = 0; i < dqcount; i++) {
    //アクティブファイルを設定
    app.activeDocument = documents[i]

    //ファイル名
    var bFile = activeDocument.name;
    // 現在のファイルの場所を取得
    var mypath = activeDocument.path;

    // pngの書き出しを設定する(デフォルト設定)[設定できる範囲や仕方など][https://namayakegadget.com/1589/]
    var pngOpt = new ImageCaptureOptions();

    // 解像度(150)[72.0-2400.0]
    pngOpt.resolution = 200;

    // アンチエイリアス(false)
    pngOpt.antiAliasing = false;

    // 透過設定(false)
    pngOpt.transparency = false;
    pngOpt.matte = false;
    
    //aiをpngに入れ替えてファイル名生成
    var newname = bFile.replace(/\.ai/g, ".png");

    // 現在のファイルの場所を取得し、フルパスを作成する
    var newpath = mypath + "/" + newname;


    // 保存する範囲を指定するためにアートボードの大きさを取得
    var rect = activeDocument.artboards[0].artboardRect;

    // 書き出しを実行
    saveFile = new File(newpath);
    activeDocument.imageCapture(saveFile, rect, pngOpt);
}

雑感

こう、オブジェクトからレイヤーの名前の配列、とか生成できそうだよなぁ・・・と思ったけど分からなかった。
最初、新規ファイルを作ってそこに指定のレイヤーだけコピーする、みたいなのを考えたけどできなかった(;´Д`)
毎回ファイルを閉じないでやる方法が欲しい・・・。

まともなデバッグ環境がないのできつい。
エラーが起きてるけど実行してみないとなんのエラーかわからん
VScodeからextendScript Toolkit みたいのが立ち上がって一応ステップ実行とかできるけどわかりにくーい。