リンクをクリップボードにコピー
コピー完了
お世話になっております。
選択しているオブジェクトの中心座標が、X:30、Y:40だったらという分岐をしたいです。
var sel = app.activeDocument.selection[0];
alert(sel.visibleBounds) ;
これだと上、左、下、右の順番での座標らしいのですが、これを使って計算して中心を取得するという方法しかないんでしょうか?
他にやり方があったら教えていただきたいです。
多忙のTen Aさんに代わりまして(勝手に)
app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;
ここ、変えっぱなしだと(自分使い用ならいいんですが) 使った人が泣く恐れがあるので、
var coordinateSystemOrg = app.coordinateSystem; //元の設定
app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;
//処理本体
app.coordinateSystem = coordinateSystemOrg;
のように、処理後に元の状態に戻してやるといいです。
return Math.abs((nagasa1 + nagasa2) / 2);
このMath.absは不要かと。
試しに、ルーラー原点あたりに中心がくるように長方形かなんか置いて現状のコードを実行してみるといいです。
単位を換算するには、UnitValueオブジェクトを
...リンクをクリップボードにコピー
コピー完了
リンクをクリップボードにコピー
コピー完了
返信が遅くなり申し訳ありません。
アドバイスを基に色々調べながら書いてみたら、一応求めたかったものが返ってきました。
app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;
MAINfn ();
function MAINfn () {
ref = ref();
X = keisan(ref[0],ref[2]) ;
Y = keisan(ref[1],ref[3]) ;
X = coordinate(X);
Y = coordinate(Y);
var X = last(X);
var Y = last(Y);
alert(X + "," + Y);
}
function ref() {
var sel = app.activeDocument.selection[0];
return sel.geometricBounds ;
}
function keisan (nagasa1 , nagasa2) {
return Math.abs((nagasa1 + nagasa2) / 2);
}
function coordinate (obj) {
return obj * 0.3528 ;
}
function last(obj) {
return Math.round(obj * 10) / 10 ;
}
単位はmmにしたかったのでこうなってます。
おかしなところがありまくりだと思うので指摘してもらうと助かります。
リンクをクリップボードにコピー
コピー完了
多忙のTen Aさんに代わりまして(勝手に)
app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;
ここ、変えっぱなしだと(自分使い用ならいいんですが) 使った人が泣く恐れがあるので、
var coordinateSystemOrg = app.coordinateSystem; //元の設定
app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;
//処理本体
app.coordinateSystem = coordinateSystemOrg;
のように、処理後に元の状態に戻してやるといいです。
return Math.abs((nagasa1 + nagasa2) / 2);
このMath.absは不要かと。
試しに、ルーラー原点あたりに中心がくるように長方形かなんか置いて現状のコードを実行してみるといいです。
単位を換算するには、UnitValueオブジェクトを利用するといいんですが、
return obj * 25.4 / 72;
としても、誤差のない値がとれます。0.3528だと端数が出るかと。
とりあえず以上です。関数もうまく使えていて、全体に見やすくていいと思います。
あ、追記(すみません)
MAINfn以外の4つの関数はMAINfn関数の専用で使うのであれば、MAINfn(){ }のブロック内に書いたほうがいいかなーと思います(ここは個人の感想の範疇です)。
リンクをクリップボードにコピー
コピー完了
ありがとうございます!
お二方とも忙しい中お答え頂いてありがたい限りです。
return Math.abs((nagasa1 + nagasa2) / 2);
ここなんですが、Math.absなしにするとYの値が負の数値になってしまったので、調べて現状こうなってます。
マイナスになること自体がおかしいのでしょうか・・・イラレの設定上の問題なのかもしれません。正直よく分からないままとりあえずつけてました。。
関数をやっと理解し始めたところなので、もっと勉強したいのですが、何かいい書籍とか参考にされてるサイトとかってありますか?ここで質問するのもお門違いで申し訳ないですが、よろしくお願いします。
リンクをクリップボードにコピー
コピー完了
スクリプトではY座標は上方向がプラス、下方向がマイナスになっています。
Illustratorはむかし(もう大昔)定規の原点が左下にあって、今のように左上に変更されたあとにスクリプト制御が可能になったんですが、その名残なのかなんなのか、ちゃんとした事情は知らないんですが。
マイナスになること自体とくにおかしくはないです。
今回は中心の座標値を出すので、プラスマイナスは保持した上で計算しないと結果はおかしくなりますね。
勉強に役立つ書籍、とくに思いつかないのですが、
書式の基本はIllustratorを離れてwebで「JavaScript 入門」などで探したほうがいいと思います。
自分はこのあたり今でも参考にさせていただいてます。
https://www.tohoho-web.com/js/
またExtendScriptはES3(ECMAScript 3rd Edition)という1999年頃のJavaScriptがベースになっているので、JavaScript界隈の最新っぽいものを参考にしても対応していないことが多いです。
Illustratorのオブジェクト操作については、
だいたいみんなここを通ってきているかと思います。
http://www.openspc2.org/projectX/
書籍も出されていますね。
あとはESTK(ExtendScript ToolKit)が起動できる環境であれば、
オブジェクトモデルを一覧することができます。正直いって完璧に正確なわけではないんですが、
それでもかなり参考にしやすいと思います。
リンクをクリップボードにコピー
コピー完了
ajabonさんの指摘の通り「歴史的経緯」の産物です。左下原点で初めてしまったあとで原点を変更したためにDOMとの整合性を図ると今までのものが全く使い物にならなくなる為にあえて変更されなかったってやつです。
基本的にtop - bottomでOKですね。