Skip to main content
Inspiring
March 23, 2022
Answered

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

  • March 23, 2022
  • 2 replies
  • 2852 views

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

 

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

 

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

 

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

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

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

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

2 replies

Ten A
Community Expert
Community Expert
March 31, 2022

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

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

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

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

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