DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

【InDesign】重なり順でソートする関数

IllustratorにはzOrderPositionというプロパティがあって、オブジェクトの重なり順をなんとなーく調べられるんですけど*1、InDesignにはないのです。
でもあったほうが便利なのは確かなので、とりあえずの関数を作ってみました*2

コード全文

使い方は、重なり順を調べたいオブジェクトをまるっと配列に突っ込んだら、sortByStackingOrder(selectedObjects);という感じで関数を呼んでください。重なり順でソートした、オブジェクトの配列が返ります。
デフォルトでは重なり順の上層から順にソート、第二引数にfalseを渡すと重なり順の下層からソートになります。

使用例

使用例も一応上げておきます。

var doc = app.activeDocument;
var selection = doc.selection;

// 選択されたオブジェクトを配列に変換
var selectedObjects = [];
for (var i = 0; i < selection.length; i++) {
  selectedObjects.push(selection[i]);
}

// 重なり順でソート(下から順)
var sorted = sortByStackingOrder(selectedObjects, false);

// 結果を表示
var message = "選択されたオブジェクトの重なり順(下から順):\n\n";
for (var j = 0; j < sorted.length; j++) {
  message += (j + 1) + ". " + sorted[j].name + " (index: " + sorted[j].index + ")\n";
}

alert(message);

呼び出し方

スクリプトにそのまま全文コピペでももちろん可ですが、この関数を単体で保存しておき、呼び出したいスクリプトの冒頭に//@includeで記述しておくという方法も可能です*3

余談

余談ですけど、VSCodeのRosetta版、動作が遅すぎてもう使うの無理になりました。

*1:なんとなく、というのは、オブジェクトが減ったり増えたりしたときにオブジェクト同士で値が重複するものが出てくることがあるためです。一意ではないらしい。

*2:元ネタはこちら→InD-Board 「ペースとしたオブジェクトの重なり順について質問です」より

*3:随分前に、includeディレクティブの応用的な使い方をテキストにしたので、よければこちらもご参考に→ www.dropbox.com