座標・サイズ
座標を取得
左上のXY、右下のXYの順で座標を配列で取得できます。[左のX, 上のY, 右のX, 下のY]です。
線幅・効果を含まない座標
var bns=obj.geometricBounds;
var x1=bns[0];//左上のX
var y1=bns[1];//左上のY
var x2=bns[2];//右下のX
var y2=bns[3];//右下のY
線幅・効果を含む(プレビュー境界使用時)の座標
var bns=obj.visibleBounds;
var x1=bns[0];//左上のX
var y1=bns[1];//左上のY
var x2=bns[2];//右下のX
var y2=bns[3];//右下のY
コントロールポイント・線幅・効果込みの座標
var bns=obj.ControlBounds;
var x1=bns[0];//左上のX
var y1=bns[1];//左上のY
var x2=bns[2];//右下のX
var y2=bns[3];//右下のY
ControlBoundsってどういうシーンで使うのかなぁ。今までみたことない。
サイズを計算する
オブジェクトサイズ(上記の座標から計算)
var w=x2−x1;
var h=y1−y2;
で、これ座標によってはマイナスになることがあるので、絶対値を取り出すようにすると
オブジェクトサイズの絶対値
var w=Math.abs(x2−x1);
var h=Math.abs(y1−y2);
これで+の値になります。
オブジェクトサイズ
geometricBounds(線幅を含まない)のサイズならHeight、widthでも取得できる
var h=obj.width;
var w=obj.height;
IllustratorのY座標は要注意(涙)
X軸は右に行くほど、Y軸は上に行くほど、数が増える。多分普通に思う座標はそう。Illustratorのスクリプトもそう。
でもIllustrator上ではY軸は逆、下にいくほど増える。変形パネルで下に移動させようと思ったら数値は+(プラス)するんですよ。でもスクリプトで下に移動させるときは-(マイナス)するんですよ。
なんで逆やねん!いっつも大混乱だわ。
あとCS4以前ではまた座標系が違うのだとか。
使用例
選択されている最前面のオブジェクトの座標をオブジェクト上に表示する
//最前面選択オブジェクトの座標を表示
var sel = app.activeDocument.selection;
var bns=sel[0].geometricBounds;
var txtObj = activeDocument.textFrames.add();
txtObj.contents = "X1(左):"+bns[0]+" Y1(上):"+bns[1];
txtObj.paragraphs.add("X2(右):"+bns[2]+" Y2(下):"+bns[3]);
txtObj.left = bns[0];
txtObj.top = bns[1];
環境設定のプレビュー境界使用有無によって
//プレビュー境界(線幅・効果を含む見た目のサイズ)を使用するか
//0:環境設定に準ずる 1:常にプレビュー境界を使用しない 2:常にプレビュー境界を使用する
var ubns=0;
if(ubns==0){
//プレビュー境界使用有無
var ksbns = app.preferences.getBooleanPreference("includeStrokeInBounds");
if(ksbns==true){ubns=2;}else{ubns=1;}
}
//座標を取得
try{
if(sel[i].typename == "GroupItem" && sel[i].clipped == true){
//クリッピングマスクの場合
var bbns=getbnd(sel[i].pageItems[0]);
}else{
var bbns=getbnd(sel[i]);
}
}catch(e){
alert("テキストはフレームを選択してください");
}
var msg=getsize (bbns);
//座標取得関数 オブジェクトの座標を返す
function getbnd ( aobj ) {
if(ubns==1){
var abns=aobj.geometricBounds;
}else{
var abns=aobj.visibleBounds;
}
return abns;
}
オブジェクトのサイズを アラート表示(クリッピングマスク対応)
var sel=app.activeDocument.selection;
for (var i=0; i<sel.length; i++){
var bns="[];
get_size(sel[i])
w="Math.abs(bns[2]-bns[0]);
h="Math.abs(bns[1]-bns[3]);
alert("オブジェクトのサイズは"+w+" × "+h+"pxです");
}
function get_size(obj){
if(obj.typename="="GroupItem"){
if(obj.clipped== true){
getbnd(obj.pageItems[0]);
}else{
for(var j=0;j<obj.pageItems.length;j++){
get_size(obj.pageitems[j]);
}
}else{
getbnd(obj);
}
return;
}
function getbnd ( aobj ) {//座標取得関数
var abns="aobj.geometricBounds;
if(bns.length===0){
bns=[abns[0],abns[1],abns[2],abns[3]];
}else{
if(abns[0] < bns[0]){bns[0]=abns[0];}
if(abns[1]> bns[1]){bns[1]=abns[1];}
if(abns[2] > bns[2]){bns[2]=abns[2];}
if(abns[3] < bns[3]){bns[3]=abns[3];}
}
return ;
}