いつもお世話になります。
スクリプトについて助言いただければ、と思い書き込みします。
スクリプトの知識としては、既存のものをほんの少し改良する程度のものです。
環境はMacOSX10.5.8、イラストレーターCS3です。
フォルダ内に入っている「.ai」ファイルだけを開くというスクリプトを探しています。
ネットで検索したところ、Kuroさんのサイトにて「フォルダ内の.aiファイルを一括出力する」というスクリプトを見つけ、出力するコードを省いて使用してみると思い通りの動作をしてくれました。それが下記のコードです。
var folderObj = Folder.selectDialog("Illustratorファイルの入っているフォルダを選択してください");
if (folderObj != null){
fileList = new Array;
fileList = folderObj.getFiles("*.ai");
for (f = 0 ; f <= fileList.length-1 ; f++){
var fileObj = new File(fileList[f]);
open(fileObj);
}
}
alert("処理が完了しました。スクリプトを終了します。");
ここから更に改良して、内包されているフォルダの中の.aiファイルまで開くようにしたいのですが、私の知識ではどうすれば良いのか分かりません。。
自分なりに検索をかけて調べてみたものの解決の糸口は見出せませんでした。
どなたかご教授よろしくお願い致します!
[14694] ごえもん (2012/09/28 Fri 15:49)
fileList[f]はすでにFileオブジェクトなので new Filwの部分はいらないですね。
それと先輩が言ってましたが
fileList[f].constructor.name が "Folder"だったらフォルダーで
fileList[f].constructor.name が "File"だったらファイルになるようです。
私には難しすぎて解らないのですが、再帰とかいうのを使うといいみたいです。
[14710] クリステル女川 (2012/10/02 Tue 06:59)
> クリステル女川さん
ありがとうございます!
参考になります!
再帰を調べてチャレンジしてみます。
[14712] ごえもん (2012/10/02 Tue 11:12)
何度も申し訳ありません。。
自分なりに調べて、再帰処理のスクリプトを参考に下記まで改造してみたのですが、結局指定した第一階層のファイルしか見てくれません。。
var folderObj = Folder.selectDialog("Illustratorファイルの入っているフォルダを選択してください");
if(folderObj){
(function(folderObj){
var fileList = folderObj.getFiles("*.ai");
for(var i=0;i<fileList.length;i++){
if(fileList[i].constructor.name=="Folder"){
arguments.callee(fileList[i]);
}else{
var fileObj = (fileList[i]);
open(fileObj);
};
}
})(folderObj);
};
デバッグでは open(fileObj); のところでエラーになりますが、イラレから走らせると一応動くことは動きます。
ここからどういじれば良いのか自分の知識では分かりません。。
厚かましい限りですが、どなたか助言いただければと思います。
よろしくお願い致します。
[14716] ごえもん (2012/10/02 Tue 16:15)
スクリプトが美しいかは別として、動くもの書いてみました。
fol.getFiles("*.ai")では、aiファイルの配列になるので、
とりあえずフォルダ内のファイルリストを取得して、
フォルダなら再帰、拡張子が.aiなら開きます。
var folderObj = Folder.selectDialog("Illustratorファイルの入っているフォルダを選択してください");
if (folderObj != null){
openAI(folderObj);
alert("処理が完了しました。スクリプトを終了します。");
}
function openAI(fol){
var fileList = fol.getFiles();
for (var f = 0 ; f <= fileList.length-1 ; f++){
if(fileList[f].constructor.name=="Folder"){
openAI(fileList[f]);
}else if(fileList[f].name.split(".")[1]=="ai"){
open(fileList[f]);
}
}
}
もっとシンプルで美しい書き方はあると思いますが、
それは他の方にお任せします。
[14717] はげる (2012/10/02 Tue 16:37)
> はげるさん
迅速な返信ありがとうございます!
バッチリ望み通りの動きをしてくれました!
助かりました!
頂いたコードを自分なりに分析して知識を深めたいと思います。
ありがとうございました!
[14718] ごえもん (2012/10/02 Tue 17:11)
クロージャーの無名関数を呼び出して再帰ですか。
難度高。
DTPのjavascript界隈ではなかなかお目にかかれないコードですが、
どこを参考にされたのでしょうか興味あります。
[14733] るまんさるちあ (2012/10/05 Fri 09:24)