2009年2月26日木曜日

フレームグリッドをJPEGで書き出すと上下に余白ができる?

InDesign CS3,CS4にて現象を確認。

フレームグリッドを作り、色をつけてJPEG書き出しします。


出たJPEGが、これ。
わかりにくければ、ダウンロードして開いてみて下さい。
???
ちなみに、タテ組みで出しても、上下に余白ができます。

テキストフレーム、画像フレームならば余白はできません。
これはどういう現象?謎だ……。

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はいくつ渡してもいい。
それで、そういう小さいコードをたくさん書いて保持しておけば…

2009年2月21日土曜日

evalを使わずにテキストになった配列をArrayに戻す

new Function を使います。
var aryText="[\"チョウ\",\"ガ\",\"トンボ\",\"ハチ\",\"カブトムシ\"]";
alert(aryText[4]); // <- ウ

new Function("return ary="+aryText)();
alert(ary.length); // <- 5
alert(ary[4]); // <- カブトムシ

2009年2月17日火曜日

pageItemsとallPageItems

大間違いをしてたようです。お詫びエントリ。
昨年9月に描いたグループをさかのぼれで、InDesignのグループ見つけたらさらにその中を調べる、という処理を書きましたが…InDesignでallPageItemsを使うのであれば、そんな処理はいらないようです。

実験。InDesignはCS3。
まず新規ドキュメントに、てきとうにいろいろなアイテムを10個作り、それの中から3つグループを作ります。


それで、さらにその中の2つのグループをグループします。


準備完了。allPageItemsの中を調べてみます。
var objs=app.activeDocument.allPageItems;
alert(objs+"\n"+objs.length);


14個返ってきます…
allPageItemsは、そのドキュメントのGroupを含めた、全てのアイテムの配列を返しているようです。なのでグループを含めない数は、constructor.nameがGroup以外のものを数えればOK。

ところで、pageItemsだったらどうでしょう?
var objs=app.activeDocument.pageItems;
alert(objs+"\n"+objs.length);

???
pageItemsだと個数は4。ドキュメントの上のアイテムを(グループを1つとして)返してるようなんですが、配列じゃなくpageItemsってオブジェクトを返してくる。
もうちょっと調べてみます。ここからはalertなしで。
var objs=app.activeDocument.pageItems;
$.writeln(objs.properties.toSource());
とやろうとしたら、「エラー: オブジェクトはプロパティまたはメソッド 'properties' をサポートしていません」と出るので、それではと
var objs=app.activeDocument.pageItems;
for (var i in objs) {
$.write(i+":");
try{
$.writeln(objs[i])
}catch(e){
$.writeln(e.toString())
}
};
だと
length:4
しか返らない。
ar objs=app.activeDocument.pageItems;
for (var j=0;j<objs.length;j++) {
$.writeln(objs[j].getElements ());
};
ならば
[object PageItem]
[object PageItem]
[object PageItem]
[object PageItem]
全部「PageItem」なんですよね。constructor.nameで分岐できない…。
オブジェクトモデルを調べてみると、pageItemのところにgetElementsというメソッドがありました。
var objs=app.activeDocument.pageItems;
for (var j=0;j<objs.length;j++) {
$.writeln(objs[j].getElements());
};
[object Group]
[object Rectangle]
[object Group]
[object TextFrame]
うん、OK。

なので、グループをさかのぼれで書いたスクリプトをやるのなら、次のようになります。
#target "InDesign"
selObjs=app.activeDocument.selection;
//↓toolkitのJavaScriptコンソールに表示するよ
$.writeln ("------Groupを1コとするなら------"+selObjs.length);

var count=0;
groupLoop=function(objs){
for(var i=0;i<objs.length;i++){
//↓getElements()は配列で来るみたい、constructorがArrayだった
var obj=objs[i].getElements()[0];
if(obj.constructor.name=="Group"){
var groupObjs=obj.pageItems;
//↓groupRoop(groupObjs);でいいけど一応
arguments.callee(groupObjs);
}else{
//↓ここの処理を書き換えれば、処理が変わる!
count++;
}
}
return count;
}

groupLoop(selObjs);
$.writeln ("------Groupの中を数えるなら------"+count);
#target "InDesign"
selObjs=app.activeDocument.selection;

groupLoop=function(objs){
for(var i=0;i<objs.length;i++){
var obj=objs[i].getElements()[0];
if(obj.constructor.name=="Group"){
var groupObjs=obj.pageItems;
arguments.callee(groupObjs);
}else{
if(obj.constructor.name=="TextFrame"){
obj.parentStory.contents="ほげ";
}
}
}
};

groupLoop(selObjs);

以上です。すみませんでしたm(_ _)m

2009年2月4日水曜日

page2009に

うちの社長開発リーダーが行っています。
(株)ニューキャスト、展示ホールD、52番ブースです。
よろしければ寄っていって下さい。