前回作った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 みたいのが立ち上がって一応ステップ実行とかできるけどわかりにくーい。
参考
【Illustrator】スクリプト(.jsx)でのファイル操作 | 生焼けプログラマーの雑記帳
Illustratorスクリプトサンプル(1) ファイルを全て閉じる | DTPサポートサービス
JavaScriptZqê
Illustrator CS自動化作戦 with JavaScript
JavaScript | オブジェクトのキー名から配列を作成する方法 | ONE NOTES
【初心者向け】JavaScriptの配列の基礎的な使い方!プログラミングに配列は必須! | アンドエンジニア
get Array[@@species] - JavaScript | MDN
Array.prototype.forEach() - JavaScript | MDN
Object.keys() - JavaScript | MDN
JavaScriptで連想配列に対してforEachループを使う方法 | PisukeCode - Web開発まとめ
JavaScriptにおける連想配列のforループ操作 - Qiita
JavaScript逆引き | Webサイト制作支援 | ShanaBrian Website
演算子とは | JavaScript逆引き | Webサイト制作支援 | ShanaBrian Website
数値を文字列に変換 | JavaScript逆引き | Webサイト制作支援 | ShanaBrian Website
JavaScript | 配列の要素を順に取得する(forEach)
JavaScriptの変数って何? varで宣言や初期化をしてみよう! | 侍エンジニアブログ