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

0 件のコメント: