illustratorでUIデザイン:スクリプトでの座標系

スクリプトを作成しているとの座標の計算が上手くいかなかったりすることが多く困ってしまうことがままあります。良い機会なので座標系について調べてみました。

ドキュメント基準/アートボード基準の座標システムの違い

スクリプト上で設定できる座標系にはドキュメント基準/アートボード基準の座標系のどちらかを設定できます。下図のような3つのアートボードを作成し実験してみます。

f:id:two-hats:20150303203717g:plain


DOCUMENTCOORDINATESYSTEM

座標システムをドキュメント基準にするもので、スクリプト上ではデフォルトはこの設定になっています。試しにオブジェクトの座標取得と原点近くに楕円を書くプログラムを実行してみます。3つ目のアートボードにあるオブジェクトを選択してから実行してください。

#target "illustrator"

app.coordinateSystem = CoordinateSystem.DOCUMENTCOORDINATESYSTEM;

$.writeln(app.selection[0].geometricBounds);
app.activeDocument.activeLayer.pathItems.ellipse(0,0,30,50); 

結果は次のようになりました。


f:id:two-hats:20150303203745g:plain

f:id:two-hats:20150303203800g:plain
楕円は1つ目のアートボードの左上付近に作成され、オブジェクトの座標は数値から推測すると同じく1つ目のアートボードの原点から測った距離のようです。
※オブジェクトの座標は「左上のX、左上のY(マイナス)、右下のX、右下のY(マイナス)」の順で表されます。


ARTBOARDCOORDINATESYSTEM

先ほどのCoordinateSystemを次のように書き換えて下さい。

...
app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;
...

実行すると結果はこちらのようになりました。

f:id:two-hats:20150303204141g:plain

f:id:two-hats:20150303204152g:plain

楕円もオブジェクトの座標も3つ目のアートボードの左上を原点にしているようです。
ARTBOARDCOORDINATESYSTEMはアクティブなアートボードの左上を原点とみなすように変更する設定です。つまり、扱いやすいように原点の位置を自動的に調整してくれていると言えます。

UIデザインなどで各画面の座標を扱いたいなどというときは「ARTBOARDCOORDINATESYSTEM」にしておくと必ず画面左上が原点になるため計算が楽になります。

ただ、複数のアートボードをスクリプトで扱う場合は、原点がドキュメント内でただ1点である方が都合がいいので「DOCUMENTCOORDINATESYSTEM」のままにしておくとよいと思います。



ドキュメント生成時の座標系

スクリプトで新規ドキュメントを作ろうとすると座標でつまずいてしまうことがあります。

例えば新規ドキュメントを作成し、ドキュメントサイズと同じ大きさの楕円を描くとします。下記のプログラムを実行してみてください。

#target "illustrator"

//新しいドキュメントを幅200、高さ100のサイズで生成する
var newDoc = app.documents.add(DocumentColorSpace.RGB, 200, 100);

//原点(0,0)が左上の幅200、高さ100の楕円を描く
newDoc.activeLayer.pathItems.ellipse(0, 0, 200, 100);


同じ幅・高さのドキュメントと楕円、さらに楕円の左上は原点(0,0)なので下図のようになると想像してしまいます。
f:id:two-hats:20150303212300g:plain

ですが実際に実行してみるとドキュメントと楕円がズレて生成されます。
f:id:two-hats:20150303212311g:plain


これはillustratorの座標の仕様が~CS4とCS5~で変わってしまったためだと推測します。
CS4まではドキュメントの左下が原点で、CS5からはドキュメントの左上が原点に変更されています。

調べてみるとヘルプページに解説がありました。

座標系は、以前は第 1 象限でしたが、第 4 象限に変更されました。Illustrator CS5 では、下に移動するほど y 軸の値は大きくなり、右に移動するほど x 軸の値は大きくなります。


以前のバージョンの Illustrator に保存する場合、グローバル定規は以前のドキュメントで設定されていた位置から変わりません。ただし、原点は左上に移動しませんが、座標系は第 4 象限に変更されます。


座標系と定規の原点の変更は、スクリプトには適用されず、古いスクリプトを維持できるようにしています。ただし、スクリプトを使用してオブジェクトを変形する場合、Y 座標の値が Illustrator のユーザーインターフェイスから設定した値と異なります。例えば、Y = +10 ポイントの移動操作を適用すると、この同じ移動操作をスクリプトを使用してエミュレートするには、Y = -10 ポイントの変形を適用する必要があります。

https://helpx.adobe.com/jp/illustrator/using/rulers-grids-guides-crop-marks.html


座標系をまるっきり変えてしまうとCS4までのスクリプトが動かなくなるために今までの原点の位置は変えず、Y軸はマイナス側をあたかもプラスであるかのように扱うようにするということですね。このようにすれば原点は変わらずY軸の符号を反転させてあげるだけで一般的なプログラムの座標系と一致することになります。

f:id:two-hats:20150304124924g:plain

新規ドキュメント生成時のアートボードは第1象限にでき、楕円は第4象限にできています。おそらくドキュメント生成するdocuments.add()は古い座標系で、図形を生成するメソッドは新しい座標系で計算されているため位置ずれが起きたのだと思います。

これを解決するために、先ほど話題に上げた座標システムをアートボード基準に変更します。「app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;」を挿入してあげます。

#target "illustrator"

app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;

//新しいドキュメントを幅200、高さ100のサイズで生成する
var newDoc = app.documents.add(DocumentColorSpace.RGB, 200, 100);

//原点(0,0)が左上の幅200、高さ100の楕円を描く
newDoc.activeLayer.pathItems.ellipse(0, 0, 200, 100);


すると、新規ドキュメントのアートボードの左上が原点になるように変更されるで、アートボードと楕円が同じ位置に同じサイズで描かれるようになります。
f:id:two-hats:20150303212300g:plain