2009年10月17日土曜日

Illustratorのリンク画像を相対パスで使うスクリプト

Illstratorのリンク画像へのパスは絶対パスで保存されています(使っている人でも知らない人が多い!)。
Illustratorで、貼り込み画像をリンクとして使いたい時、よく下の階層にフォルダを作ってまとめてあるのを見ますが、それだと上のフォルダ名が変わったり、ドライブを移動したりするとリンク切れするんですよね。
それならまだいいんですが、フォルダごとコピーして、コピー側を開くと元のフォルダへのリンクが残っていて、画像を修正したと思ってても元に戻っちゃってたりとか……。

それらを解消できないかと思ってちょっと書いてみました。相対パスを画像に保存しておくスクリプト。
作業したあと、必ずこのスクリプトをかけておけば有効かもしれない。

【相対パスを保存_再リンク.jsx】
#target "Illustrator"
if(app.documents.length>0){
var actDoc=app.activeDocument;
if(actDoc.path==""){
//未保存ならばpathがない
alert("ファイルを保存して下さい");
}else{
var reLinkLog="";
var saveLinkLog="";
//ドキュメントの親フォルダのパス
var docPath=File.decode(actDoc.path);
//アイテムをループ
for(var i=0;i<actDoc.pageItems.length;i++){
//もしリンク画像なら
if(actDoc.pageItems[i].constructor.name=="PlacedItem"){
var item=actDoc.pageItems[i];
//メイン処理を実行
var log=main(item,docPath);
if(log[0]){reLinkLog+=("\n"+log[0])};
if(log[1]){saveLinkLog+=("\n"+log[1])};
};
};
//リンク修正アラート
if(reLinkLog!=""){
app.redraw();
alert("以下のリンクを修正しました。"+reLinkLog);
};
//リンク保存アラート
if(saveLinkLog!=""){
alert("以下の相対パスを保存しました。"+saveLinkLog);
};
};
};

function main(item,docPath){
//メイン処理
var ary=[undefined,undefined];
//「name」の値があれば
if(item.name!=""){
var beforeFilePath=docPath+"/"+File.decode(item.name);
var beforeFile=new File(beforeFilePath);
if(beforeFile.exists){
var flag=false;
try{
//ファイルが相対パスの場所と違っていたら
var nowFilePath=File.decode(item.file);
if(nowFilePath!=beforeFilePath){
flag=true;
}else{};
}catch(e){
//ファイルがなければ
flag=true;
};
//flagがtrueならばリンク貼り直し
if(flag){
item.file=beforeFile;
ary[0]=beforeFilePath;
};
};
};
//nameにファイルの相対パスを入れる
try{
var relativePath=item.file.getRelativeURI(docPath);
item.name=relativePath;
ary[1]=File.decode(relativePath);
}catch(e){};
return ary;
};
IllustratorのPlacedItemオブジェクトの、name属性に相対パスをそのまま保存しています。
なので他のnameを使うスクリプトと併用はできません。
MacOSX 10.5.8、 Illustrator CS3にて動作確認。

【使い方】
  1. Illustratorを編集して、最後に保存する前に、あらかじめこのスクリプトをかけておきます。
  2. ファイルを開いた時に『「〜」というリンクファイルが見つかりません』というダイアログが出た場合は、全て「無視」を選択します。
  3. 開いた後再びスクリプトを実行します。

0 件のコメント: