選択したボックスをドキュメントサイズの左右センターに移動したい

[5281]選択したボックスをドキュメントサイズの左右センターに移動したい | 投稿者:kangaroo | 投稿日:2010/11/10(Wed) 12:12:10
Mac OS 10.6.3/InDesign CS5
Javascript

いつもお世話になっております。
Javascriptを勉強し始めたばかりです。
選択した画像ボックスをドキュメントサイズの左右センターに移動するスクリプトを作りたいのですが、画像ボックスが複数になるとうまく行きません。
画像ボックスが複数の場合は、それぞれの位置関係をたもったまま移動したいのですが、現状だと全てのボックスがセンターに集まってしまいます。
そもそも考え方(Javascriptの作り方)が間違っているのでしょうか。
ご教授いただけると助かります。

以下、現時点でのスクリプトです。

selected_box(app.selection);
function selected_box(motoobj){
   for(var N = 0; N < motoobj.length;N++){
       var moto_bounds = motoobj[N].geometricBounds;
       var y1 = moto_bounds[0];
       var x1 = moto_bounds[1];
       var Obj_w = moto_bounds[3] - moto_bounds[1];
       var Obj_h = moto_bounds[2] - moto_bounds[0];
       var Doc_w = app.activeDocument.documentPreferences.pageWidth;
       var Doc_h = app.activeDocument.documentPreferences.pageHeight;
       var Doc_w = (Doc_w - Obj_w)/2;
       var Doc_h = (Doc_h - Obj_h)/2;
       var x2 = Doc_w - x1;
       var y2 = Doc_h - y1;
       motoobj[N].move("by",[x2,y2]);    
       }
}

宜しくお願いします。
» 1
なんかいつも回答前に質問し返してるようですみませんが ^;

・画像フレームA,B,Cの3つが横並びしているとする場合、左端にあるフレームAの左端から、右端にあるフレームCの右端の座標まで、の距離のセンターをページのセンターに合わせたい(縦についても同じ)
こういうことですね?

現時点のコードはオブジェクトを1つづつ操作しています。
フレームAを操作する時、他のフレームB、フレームCがどの位置にあろうが関係ない、という事になっています。
「まとめて動いたようにする」には、移動を開始する前にオブジェクト群の左右それぞれの端にある物の座標を割り出す必要があります。それさえ出てしまえば、あとは割り算でオブジェクト群の現状のセンター座標を出し、ページのセンターとの差分だけ各々のオブジェクトを移動する、という流れです。

----------------------
きわめて単純な構造のレイアウトだけを相手にするのであれば(グループとかごちゃごちゃしていなければ)現状の選択範囲でグループを作成、そのグループのgeometricBoundsを拾ってすぐdocument.undo() という手もあります。
» 2
(z-)さん
いつもありがとうございます。

>画像フレームA,B,Cの3つが横並びしているとする場合、左端にあるフレームAの左端から、右端にあるフレームCの右端の座標まで、の距離のセンターをページのセンターに合わせたい(縦についても同じ)
こういうことですね?

はい。そうです。
説明が足りず、すみません。

>オブジェクト群の左右それぞれの端にある物の座標を割り出す
>現状の選択範囲でグループを作成、そのグループのgeometricBoundsを拾ってすぐdocument.undo()

今回は、簡単なレイアウトなのでグループにする方向で勉強してみます。
(どちらもやり方がわからないのですが調べてみます)

ありがとうございました。
» 3
選択した画像フレームをグループ化してドキュメントのセンターに移動することが出来ました!
が、グループ解除の方法がわかりません。
(z-)さんにおっしゃって頂いたdocument.undo() がそれにあたると思うのですが、どこに入れたら良いのでしょうか。
もう少しおつきあい頂けると助かります。
よろしくお願いします。

var selObj = app.activeDocument.groups.add(app.selection);
y1 = selObj .geometricBounds[0];
x1 = selObj .geometricBounds[1];
Obj_w = selObj .geometricBounds[3] - selObj .geometricBounds[1];
Obj_h = selObj .geometricBounds[2] - selObj .geometricBounds[0];
Doc_w = app.activeDocument.documentPreferences.pageWidth;
Doc_h = app.activeDocument.documentPreferences.pageHeight;
Doc_w = (Doc_w - Obj_w)/2;
Doc_h = (Doc_h - Obj_h)/2;
x2 = Doc_w - x1;
y2 = Doc_h - y1;
selObj .move("by",[x2,y2]);
» 4
ええと、「全体のセンター座標を出す」ためのグループです。座標がわかったらグループ作成を取り消しして、1こずつ差分を移動してやって下さい、というニュアンスでしたすみません。
Illustratorなんかだとungroupというのがありますが、InDesignでスクリプトによるグループ解除はちょっと..なので。
» 5
グループにして、まとめて移動して、グループ解除...
という方法かと早とちりしてました。グループ解除はダメなのですね。
もう一度、最初からやってみます。
ありがとうございます。
» 6
selObj .move("by",[x2,y2]);
の後に、
selObj.ungroup();
でグループ解除になりませんか?
» 7
(z-)さん
>「全体のセンター座標を出す」ためのグループです。座標がわかったらグループ作成を取り消しして、1こずつ差分を移動して...

出来ました!ありがとうございます。

>こにさん
グループ解除も出来ました!
ありがとうございます。

いろいろと勉強になりました。
ありがとうございました。
» 8
..すみません、ungroup() がないのはIllustratorの方でした。うそついてすみません。まこと軽卒でした。
» 9
個人的にはグループ化はレイヤーまたがりとか、グループ化前後が同一でないのはいやだな。
素直に各geometricBoundsの最大値最小値取った方がいい気がします。
ちゃんと使うにはルーラをSpreadになってる必要とかあります

var doc = app.documents[0];
var sel = doc.selection;
alert(groupy_bon(sel));

function groupy_bon (sel) {
   var t = [], l = [], b = [], r = [];
   for (var i=0, iL=sel.length; i < iL ; i++) {
       var bo = sel[i].geometricBounds;
       t.push(bo[0]);
       l.push(bo[1]);
       b.push(bo[2]);
       r.push(bo[3]);
   };
   var groupyBon = [
       t.sort(function(a,b){return a > b})[0],
       l.sort(function(a,b){return a > b})[0],
       b.sort(function(a,b){return a < b})[0],
       r.sort(function(a,b){return a < b})[0]
   ];
   return groupyBon;
}
» 10
ちょっと悪知恵ですけど
・オブジェクトの重なり順なんか関係ない
・連結テキストなんかない
・geometricBoundsじゃなくてvisibleBoundsで構わない
という条件下でしか使えませんが

app.clipboardPreferences.pasteRemembersLayers=true;
app.menuActions.item("$ID/Selection Tool").invoke();
app.menuActions.itemByName("スプレッド全体").invoke();
app.cut();
app.paste();

で線幅の外側で計った真ん中にきます。
» 11
>mgさん
今回はレイヤーのまたがり等もなく、ごく単純なレイアウトでの動作を望んでいましたので、グループ化でも問題なさそうでした。
しかし、いろんな事を想定しながらスクリプトを作らなくてはいけないと
勉強になりました。落ち着いたらmgさんに提示していただいたスクリプトも勉強してみたいと思います。(現時点でほとんどわかっていません...)
ありがとうございました。

(z-)さん
また、違った方向からのアプローチをありがとうございます。
条件はほとんど揃っていますが、こちらもまたあとで勉強させていただきたいと思います。
ありがとうございました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)