2009年2月23日月曜日

Illustratorのページ上のアイテムをeachする

Object.prototype.eachItems=function(funcs){
//Document.pageItemsの時はgroup内のものを除外
var items;
if(this.hasOwnProperty("pageItems")){
items=[];
var ps=this.pageItems;
for(var i=0;i<ps.length;i++){
if(ps[i].parent.typename!="GroupItem") items.push(ps[i]);
}
}else if(this instanceof Array){
items=this;
}else{
items=[this];
};
//引数をArrayにする
var fn=[];
for(var f=0;f<arguments.length;f++){
fn.push(arguments[f]);
};
//内部関数
(function(items,fn){
for(var i=0;i<items.length;i++){
var item=items[i];
if(item.hasOwnProperty("pageItems")){
var groupItems=item.pageItems;
arguments.callee(groupItems,fn);
}else{
for(var j=0;j<fn.length;j++){
fn[j](item);
}
}
}
})(items,fn);
};

function hoge(obj){
if(obj.constructor.name=="TextFrame"){
obj.contents="テキストの中身を入れ替えます";
};
};
function huga(obj){
$.writeln(obj.typename);
};

app.activeDocument.eachItems(
hoge,huga
);
Illustrator CS3にて動作確認。
この間から昔のgroopLoopを引っ張ってごにょごにょやってて、やっと書けたので公開。

Illustratorの図版修正はほぼ自分の仕事になっています。やっててすごくめんどくさい繰り返し作業(全角数字を半角にツメるとか、文字を置換するとか…)を見つけたとき、スクリプトを書いて処理したいなーと思うのですが、
時間さえかければたいていのスクリプトは書ける自信はあるけれど、締め切りは常に迫っていて、スクリプトを書くのに1時間かけていたら意味がない。悶々としながらひたすら作業をくり返すわけです。
単機能の書き捨てスクリプトなら、10分で書けるようにならなきゃ!

方針としては、pageItemごと、TextFlameとかPathItemとかの処理を書いてfunctionにする。それだけなら大した時間はかからないので、その上でeachItemsの引数にfunctionを渡してやる、functionはいくつ渡してもいい。
それで、そういう小さいコードをたくさん書いて保持しておけば…

0 件のコメント: