Skip to main content
Participating Frequently
June 1, 2023
Answered

スクリプトで取得したy座標がマイナスで出力される

  • June 1, 2023
  • 2 replies
  • 1379 views

お世話になっております。

スクリプトでオブジェクトの座標を出力したところ、illustratorのプロパティウィンドウで確認できる座標と異なる点があり、質問させていただきます。

<状況>

・x座標は一致するが、y座標の正負が異なる

・以下キャプチャは左上座標だが、最終的にはWとHから計算して中心座標を出力したいため、

スクリプトも正の数で出力したい (計算元の座標がマイナスだと正しく計算できない。)

・illustrator アプリケーションで確認できる座標を正としたい。

(スクリプトのマイナス座標は正しい位置ではありません。)

・なお、座標はobjectのvisibleBoundsを参照しています。

 

<質問>

・何故スクリプトだけマイナス座標で出力されるのでしょうか。

・ウィンドウと同じ座標を出力するには何か座標原点を指定するスクリプトの書き方がありますでしょうか。

・上記がない場合、単純にy座標に-1を掛け算しても良いものでしょうか。

 

 

This topic has been closed for replies.
Correct answer ajabon grinsmith

あ、よろこんで補足します。

 

CCでもCSでもない、もっと昔の6.0(日本語版は5.5Jが最終)までは左下がルーラー原点でした。

それが7.0から「Photoshopに合わせようぜー」と言ったかどうか、それ系の理由で左上に変更されました。

でもそれは外見上のことで、中での座標管理はプラスマイナスおよび座標原点は以前のままなのです。ここまではTen Aさんも言われてます(書きたかったのでわざわざ書いてしまいましたが)。

 

CS4以降はマルチアートボードが実装され、ますますややこしくなりました。

こんなかんじですね。

(※瞬間的に掲示板の不具合が起きているようで画像の配置ができないため、添付ファイルを参照してください…)

 

スクリプトによる座標の原点はアートボード左下に合致していますが、正確には「ウィンドウ定規」が原点となっています。複数のアートボードがあっても原点は常に1つです。

ウィンドウ定規の確認・設定は、ドキュメントのルーラーを右クリックで切り替えることができます。

(※添付画像)

 

以上が「何故」への回答です。

 

・対象アートボードのartboardRectから左上座標を算出し、そこをルーラー原点に設定する

var doc = app.activeDocument;
var aab = doc.artboards[doc.artboards.getActiveArtboardIndex()]; //アクティブアートボード
var rect = aab.artboardRect;
doc.rulerOrigin = [0, rect[1] - rect[3]]; //ウィンドウ定規の原点をアートボード左上にセット

プラマイが反転するのは直りませんので、

出力時だけ、値 * - 1 するのが妥当でしょう。

 

原点を変更したくない場合は

・なんかもうがんばって毎回計算する(関数を通す)

となります。これも一回書いてしまえばあとは使いまわせます。

 

なお、すでにお気づきと思いますが、スクリプトで扱う距離はすべてPoint値です。UI上でミリメートルでも、いつでもポイントの単位で格納されています。

近似値になりますが、

function mm_to_pt(val){
    return val / 72 * 25.4;
}

function pt_to_mm(val){
    return val / 25.4 * 72;
}

などでしのいでいます。

Illustratorの標準パネル上の値はPoint値の小数第4位を四捨五入してあれこれしているので完全に一致させるにはもうちょっとひねらないとだめですが。 

2 replies

ajabon grinsmith
Community Expert
ajabon grinsmithCommunity ExpertCorrect answer
Community Expert
June 1, 2023

あ、よろこんで補足します。

 

CCでもCSでもない、もっと昔の6.0(日本語版は5.5Jが最終)までは左下がルーラー原点でした。

それが7.0から「Photoshopに合わせようぜー」と言ったかどうか、それ系の理由で左上に変更されました。

でもそれは外見上のことで、中での座標管理はプラスマイナスおよび座標原点は以前のままなのです。ここまではTen Aさんも言われてます(書きたかったのでわざわざ書いてしまいましたが)。

 

CS4以降はマルチアートボードが実装され、ますますややこしくなりました。

こんなかんじですね。

(※瞬間的に掲示板の不具合が起きているようで画像の配置ができないため、添付ファイルを参照してください…)

 

スクリプトによる座標の原点はアートボード左下に合致していますが、正確には「ウィンドウ定規」が原点となっています。複数のアートボードがあっても原点は常に1つです。

ウィンドウ定規の確認・設定は、ドキュメントのルーラーを右クリックで切り替えることができます。

(※添付画像)

 

以上が「何故」への回答です。

 

・対象アートボードのartboardRectから左上座標を算出し、そこをルーラー原点に設定する

var doc = app.activeDocument;
var aab = doc.artboards[doc.artboards.getActiveArtboardIndex()]; //アクティブアートボード
var rect = aab.artboardRect;
doc.rulerOrigin = [0, rect[1] - rect[3]]; //ウィンドウ定規の原点をアートボード左上にセット

プラマイが反転するのは直りませんので、

出力時だけ、値 * - 1 するのが妥当でしょう。

 

原点を変更したくない場合は

・なんかもうがんばって毎回計算する(関数を通す)

となります。これも一回書いてしまえばあとは使いまわせます。

 

なお、すでにお気づきと思いますが、スクリプトで扱う距離はすべてPoint値です。UI上でミリメートルでも、いつでもポイントの単位で格納されています。

近似値になりますが、

function mm_to_pt(val){
    return val / 72 * 25.4;
}

function pt_to_mm(val){
    return val / 25.4 * 72;
}

などでしのいでいます。

Illustratorの標準パネル上の値はPoint値の小数第4位を四捨五入してあれこれしているので完全に一致させるにはもうちょっとひねらないとだめですが。 

Participating Frequently
June 1, 2023

ajabon grinsmithさん

ご回答ありがとうございます!

なぜスクリプトとアプリ上で表示が違うのか、詳しくご説明いただき理解することができました。

 

原点は中で左上(0,0)として設定できるものの、性質上正負は反転するということで、マイナスを掛ける考え方で良いということも分かって安心しました。

 

㎜とptの変換も理解しました。

小数点以下まで完全一致させるのは難しいですね…

ご丁寧にありがとうございます。

Ten A
Community Expert
Community Expert
June 1, 2023
これは歴史的経緯ってやつで、ある日突然新しいバージョンから原点座標を左上に変えるからなって事になったためです。当時は文句タラタラだったわけで、Top,Left(左上)を原点としてスクリプトを調整してください。これはなんとかできるものではないので慣れる必要があります。
Participating Frequently
June 1, 2023

Ten Aさん

ご回答ありがとうございます!
スクリプト側での調整が必要ということで、理解しました。