PageItemが収納されている配列を、ページ、もしくはスプレッドの座標(bounds)でソートしたい場合は、配列に比較関数を渡すことで実現できます(参照:任意の条件で配列をソートする)。

 

以下の例はカレントページにあるPageItemの配列を取得し、boundsに従って左上から右下への序列でソートします。なお、PageItemがテキストフレームだった場合はソート順をそのcontentsに書き込むようになっているので、適当なテキストフレームを幾つか作成して実行すれば、その結果を見ることができます。

//選択されたPageItemをboundsでソート
//-----------------------------------------------ソート用比較関数
//左上から右下用
function comparBnsZ(a, b) {
    //y座標の比較
    if (a.visibleBounds[0]<b.visibleBounds[0]){return -1;}
    if (a.visibleBounds[0]>b.visibleBounds[0]){return 1;}
    //y座標がタイなのでx座標を比較
    return a.visibleBounds[1]-b.visibleBounds[1];
}
//-----------------------------------------------
var cnt; //汎用カウンタ
var cName; //PageItemの種類
var sortedArr; //ソート後の配列
var objz= app.layoutWindows[0].activePage.allPageItems; //現在のページにある全てのPageItem
//比較関数を使って配列をソート
objz.sort (comparBnsZ);
//PageItemがTextFrameだった場合は配列内の順位を書き込む
for (cnt=0; cnt<objz.length; cnt++) {
    cName= objz[cnt].constructor.name; //PageItemの種類
    if ( cName== 'TextFrame' ) {
        objz[cnt].contents= 'n'+cnt; //TextFrameの内容を書き換える
    }
}

 

右上から左下へソートする場合は、以下のような比較関数になります。

//右上から左下用
function comparBnsN(a, b) {
    //x座標の比較
    if (a.visibleBounds[1]<b.visibleBounds[1]){return -1;}
    if (a.visibleBounds[1]>b.visibleBounds[1]){return 1;}
    //x座標がタイなのでy座標を比較
    return a.visibleBounds[0]-b.visibleBounds[0];
}

 

これらはあくまで簡易的なものであり、思ったようにソートされない場合もあります。目的に合わせて比較関数の条件を見直してください。

 

 

Joomla templates by a4joomla