はじめに
Adobe Illustratorにて、JavaScript経由で取得したオブジェクトの
- 重ね順の確認
- ソート方法
の2点について詰まったのでメモを残しておきます。
結論
document.pageItemsなどの*Itemsコレクションとselection配列は、重ね順でソート済みです。
ユーザーが後からソートする必要はありません。
問題の詳細
Adobe Illustrator Extend Scriptとは
Adobe IllustratorにはJavaScriptによる操作が可能です。
定型処理をスクリプト化しておくことで、作業効率を向上させることができます。
ドキュメント上のオブジェクトの取得
このスクリプト上では、さまざまなIllustrator上の情報の確認と操作ができます。
たとえば
activeDocument.selection
で現在選択しているオブジェクトの配列を取得できます。
activeDocument.pageItems
ならばドキュメント上のすべてのアートアイテム(レイヤーを除くテキスト、シェイプ、画像など)を取得できます。
selection以外の〇〇Itemsクラスは、コレクションであり配列ではありません。
そのためfor文で中身を取得することはできますが
- ReadOnlyであり、代入できない。
- sort, reverseなどのArray.prototype関数が使えない。
という違いがあります。
コレクションに対してArray.prototype関数を利用したい場合は、要素をforループで取り出し新規の配列にpushで詰め直すなどの処理が必要になります。
重ね順の取得
これらの配列およびコレクションは取得した段階で、重ね順の最前面から順にソートされています。
ユーザー側が明示的にソートする必要はありません。
最前面からの処理が必要な場合はforループで、最背面からの処理が必要な場合はデクリメントのforループで処理ができます。
zOrderPositionについて
アートアイテムのインスタンスには、zOrderPosition
という変数が設定されていることがあります。これは同一のグループ / レイヤー内での重ね順を示すものです。
最背面にあるアートアイテムにはzOrderPosition自体がありません。undefinedではなくプロパティ自体が存在しないため、アクセスするとエラーでスクリプトが停止します。zOrderPositionにアクセスする場合はtry構文でエラーを避けるか、プロパティ自体にはアクセスせずにzOrder関数を経由して操作することをオススメします。
配列およびコレクションの順序がオブジェクトの重ね順であるということがリファレンスに明示されていないため、しばらく詰まりましたが処理は不要でした。
以上、ありがとうございました。