終了

Illustratorスクリプト:選択オブジェクトの中心座標を取得するには

積極的な参加者 ,
Mar 22, 2022 Mar 22, 2022

リンクをクリップボードにコピー

コピー完了

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

 

選択しているオブジェクトの中心座標が、X:30、Y:40だったらという分岐をしたいです。

 

var sel = app.activeDocument.selection[0];
alert(sel.visibleBounds) ;

 

これだと上、左、下、右の順番での座標らしいのですが、これを使って計算して中心を取得するという方法しかないんでしょうか?

他にやり方があったら教えていただきたいです。

キーワード
スクリプティング

表示

1.4K

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 2 件の正解

Community Expert , Mar 22, 2022 Mar 22, 2022
visibleBoundsは線幅なども含まれますからgeometricBoundsの方が適している場合もあります。どちらもバウンズなのでtop,left-bottom,rightの座標です。中心点というプロパティはありませんので、何かしらの計算は必要になります。
その他、position(これもtop,left)とwidth、heightを利用して計算する方法もあります。

投票

翻訳

翻訳
Community Expert , Mar 30, 2022 Mar 30, 2022

多忙の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オブジェクトを

...

投票

翻訳

翻訳
Community Expert ,
Mar 22, 2022 Mar 22, 2022

リンクをクリップボードにコピー

コピー完了

visibleBoundsは線幅なども含まれますからgeometricBoundsの方が適している場合もあります。どちらもバウンズなのでtop,left-bottom,rightの座標です。中心点というプロパティはありませんので、何かしらの計算は必要になります。
その他、position(これもtop,left)とwidth、heightを利用して計算する方法もあります。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Mar 30, 2022 Mar 30, 2022

リンクをクリップボードにコピー

コピー完了

返信が遅くなり申し訳ありません。

アドバイスを基に色々調べながら書いてみたら、一応求めたかったものが返ってきました。

 

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にしたかったのでこうなってます。

おかしなところがありまくりだと思うので指摘してもらうと助かります。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Mar 30, 2022 Mar 30, 2022

リンクをクリップボードにコピー

コピー完了

多忙の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(){ }のブロック内に書いたほうがいいかなーと思います(ここは個人の感想の範疇です)。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Mar 30, 2022 Mar 30, 2022

リンクをクリップボードにコピー

コピー完了

ありがとうございます!

お二方とも忙しい中お答え頂いてありがたい限りです。

 

return Math.abs((nagasa1 + nagasa2) / 2);

 

ここなんですが、Math.absなしにするとYの値が負の数値になってしまったので、調べて現状こうなってます。

マイナスになること自体がおかしいのでしょうか・・・イラレの設定上の問題なのかもしれません。正直よく分からないままとりあえずつけてました。。

 

関数をやっと理解し始めたところなので、もっと勉強したいのですが、何かいい書籍とか参考にされてるサイトとかってありますか?ここで質問するのもお門違いで申し訳ないですが、よろしくお願いします。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Mar 30, 2022 Mar 30, 2022

リンクをクリップボードにコピー

コピー完了

スクリプトではY座標は上方向がプラス、下方向がマイナスになっています。

Illustratorはむかし(もう大昔)定規の原点が左下にあって、今のように左上に変更されたあとにスクリプト制御が可能になったんですが、その名残なのかなんなのか、ちゃんとした事情は知らないんですが。

マイナスになること自体とくにおかしくはないです。

スクリーンショット 2022-03-31 10.00.36.pngスクリーンショット 2022-03-31 10.00.58.png

今回は中心の座標値を出すので、プラスマイナスは保持した上で計算しないと結果はおかしくなりますね。

 

勉強に役立つ書籍、とくに思いつかないのですが、

書式の基本は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)が起動できる環境であれば、

オブジェクトモデルを一覧することができます。正直いって完璧に正確なわけではないんですが、

それでもかなり参考にしやすいと思います。

スクリーンショット 2022-03-31 10.24.42.png

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Mar 30, 2022 Mar 30, 2022

リンクをクリップボードにコピー

コピー完了

最新

ajabonさんの指摘の通り「歴史的経緯」の産物です。左下原点で初めてしまったあとで原点を変更したためにDOMとの整合性を図ると今までのものが全く使い物にならなくなる為にあえて変更されなかったってやつです。

基本的にtop - bottomでOKですね。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines