Posted at

Adobe Illustrator オブジェクトの重ね順の取得


はじめに

Adobe Illustratorにて、JavaScript経由で取得したオブジェクトの


  1. 重ね順の確認

  2. ソート方法

の2点について詰まったのでメモを残しておきます。


結論

document.pageItemsなどの*Itemsコレクションとselection配列は、取得した時点で重ね順でソート済みです。

後からソートする必要はありません。


問題の詳細


Adobe Illustrator Extend Scriptとは

Adobe IllustratorにはJavaScriptによる操作が可能です。

公式リファレンス

定型処理をスクリプト化しておくことで、作業効率を向上させることができます。


ドキュメント上のオブジェクトの取得

このスクリプト上では、様々なIllustrator上の情報の確認と操作ができます。

例えば

activeDocument.selection

で現在選択しているオブジェクトの配列を取得できます。

activeDocument.pageItems

ならばドキュメント上のすべてのアートアイテム(レイヤーを除くテキスト、シェイプ、画像など)を取得できます。

selection以外の〇〇Itemsクラスは、コレクションであり配列ではありません

そのためfor文で中身を取得することはできますが


  1. ReadOnlyであり、代入できない。

  2. sort, reverseなどのArray.prototype関数が使えない。

という違いがあります。

コレクションに対してArray.prototype関数を利用したい場合は、要素をforループで取り出し新規の配列にpushで詰め直すなどの処理が必要になります。


重ね順の取得

これらの配列およびコレクションは取得した段階で、重ね順の最前面から順にソートされています。

ユーザー側が明示的にソートする必要はありません。

最前面からの処理が必要な場合はforループで、最背面からの処理が必要な場合はデクリメントのforループで処理ができます。

アートアイテムのインスタンスには、zOrderPositionという変数が設定されていることがあります。これは同一のグループ / レイヤー内での重ね順を示すものです。

最背面にあるアートアイテムにはzOrderPosition自体がありません。undefinedではなくプロパティ自体が存在しないため、アクセスしようとするとエラーでスクリプトが停止します。zOrderPositionにアクセスする場合はtry構文でエラーを避けるか、プロパティ自体にはアクセスせずにzOrder関数を経由して操作することをお勧めします。

配列およびコレクションの順序がオブジェクトの重ね順であるということがリファレンスに明示されていないため、しばらく詰まりましたが実際には特別な処理は不要でした。

以上、ありがとうございました。