k_ikiの雑記帳

DTPのこと、創作のことなど、思いつくまま

obj2center.jsx

先日InDesignの勉強部屋のInD-Boardにて、選択オブジェクト群をページのセンターへ移動させるスクリプトの話題が上がっていた。
複数のオブジェクトを位置関係をそのまま、ページの中心へ移動させるというものだ。
グループ化すれば簡単かもしれないが、そうするとひとつのレイヤーにオブジェクトが集まってしまう。
そこで、

・選択オブジェクト群をグループ化せず、かつ位置関係を保ったままセンタリングしたい。
・見開き時、左ページのセンターに揃えたいのか、右ページのセンターに揃えたいのか。はたまたスプレッドのセンターに揃えたいのか。それらを選択できるようにしたい。

それらを踏まえ、書いてみた。
サブルーチンは上記リンク先のレスの中で、mgさんが書いておられたソースをそのまま利用させていただいた。
選択肢の最初のヤツ、(先頭ページ用)は余分だったかも。

ここまで書いてから気付いた。すでにmgさんご自身が書いておられる

書いちゃったもんは晒す。

////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}


////////////////////////////////////////////ラジオダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ラジオボタンに展開するリスト

result	選択したリスト番号
*/
function radioDialog(my_title, my_prompt, my_list){
	var my_dialog = app.dialogs.add({name:my_title, canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:my_prompt});
			with (borderPanels.add()) {
				var my_radio_group = radiobuttonGroups.add();
				with (my_radio_group) {
					for (var i = 0; i < my_list.length; i++){
						if (i == 0) {
							radiobuttonControls.add({staticLabel:my_list[i], checkedState:true});
						} else {
						radiobuttonControls.add({staticLabel:my_list[i]});
						}
					}
				}
			}
		}
	}


	if (my_dialog.show() == true) {
		var ans = my_radio_group.selectedButton;
		//正常にダイアログを片付ける
		my_dialog.destroy();
		//選択したアイテムの番号を返す
		return ans;
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
	}
}


////実行
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var doc = app.activeDocument;
var sel = doc.selection;

////////////////処理の選択
var myList = ["ページのセンターに(先頭ページ用)", 
"ページのセンターに(見開きの左ページ用)", 
"ページのセンターに(見開きの右ページ用)", 
"スプレッドのセンターに",];
var ans_int = radioDialog("obj2center", "選択オブジェクトを移動します。処理を選択してください\n", myList);
//myList[ans_int];

////////////////選択した処理を実行
if (ans_int == 0) {//ページのセンターに(先頭ページ用)
	//ドキュメントのrulerOriginを保存
	var oldRular = doc.viewPreferences.rulerOrigin;
	//ドキュメントのrulerOriginをページに変更
	doc.viewPreferences.rulerOrigin = 1380143215;
	x1 = groupy_bon(sel)[1];
	y1 = groupy_bon(sel)[0];
	Obj_w = groupy_bon(sel)[3] - groupy_bon(sel)[1];
	Obj_h = groupy_bon(sel)[2] - groupy_bon(sel)[0];
	Doc_w = app.activeDocument.documentPreferences.pageWidth;
	Doc_h = app.activeDocument.documentPreferences.pageHeight;
	x2=Doc_w/2-(x1+Obj_w/2);
	y2=Doc_h/2-(y1+Obj_h/2);
	for (var i=0, iL=sel.length; i < iL ; i++) {
		sel[i].move("to",[x2,y2]);
	};
    doc.viewPreferences.rulerOrigin = oldRular;
} else if (ans_int == 1) {//ページのセンターに(見開きの左ページ用)
	//ドキュメントのrulerOriginを保存
	var oldRular = doc.viewPreferences.rulerOrigin;
	//ドキュメントのrulerOriginをスプレッドに変更
	doc.viewPreferences.rulerOrigin = 1380143983;
	x1 = groupy_bon(sel)[1];
	y1 = groupy_bon(sel)[0];
	Obj_w = groupy_bon(sel)[3] - groupy_bon(sel)[1];
	Obj_h = groupy_bon(sel)[2] - groupy_bon(sel)[0];
	Doc_w = app.activeDocument.documentPreferences.pageWidth;
	Doc_h = app.activeDocument.documentPreferences.pageHeight;
	x2=Doc_w-(x1+Obj_w/2);
	y2=Doc_h/2-(y1+Obj_h/2);
	for (var i=0, iL=sel.length; i < iL ; i++) {
		sel[i].move("to",[x2-Doc_w/2,y2]);
	};
    doc.viewPreferences.rulerOrigin = oldRular;
} else if (ans_int == 2) {//ページのセンターに(見開きの右ページ用)
	//ドキュメントのrulerOriginを保存
	var oldRular = doc.viewPreferences.rulerOrigin;
	//ドキュメントのrulerOriginをスプレッドに変更
	doc.viewPreferences.rulerOrigin = 1380143983;
	x1 = groupy_bon(sel)[1];
	y1 = groupy_bon(sel)[0];
	Obj_w = groupy_bon(sel)[3] - groupy_bon(sel)[1];
	Obj_h = groupy_bon(sel)[2] - groupy_bon(sel)[0];
	Doc_w = app.activeDocument.documentPreferences.pageWidth;
	Doc_h = app.activeDocument.documentPreferences.pageHeight;
	x2=Doc_w-(x1+Obj_w/2);
	y2=Doc_h/2-(y1+Obj_h/2);
	for (var i=0, iL=sel.length; i < iL ; i++) {
		sel[i].move("to",[x2+Doc_w/2,y2]);
	};
    doc.viewPreferences.rulerOrigin = oldRular;
} else if (ans_int == 3) {//スプレッドのセンターに
	//ドキュメントのrulerOriginを保存
	var oldRular = doc.viewPreferences.rulerOrigin;
	//ドキュメントのrulerOriginをスプレッドに変更
	doc.viewPreferences.rulerOrigin = 1380143983;
	x1 = groupy_bon(sel)[1];
	y1 = groupy_bon(sel)[0];
	Obj_w = groupy_bon(sel)[3] - groupy_bon(sel)[1];
	Obj_h = groupy_bon(sel)[2] - groupy_bon(sel)[0];
	Doc_w = app.activeDocument.documentPreferences.pageWidth;
	Doc_h = app.activeDocument.documentPreferences.pageHeight;
	x2=Doc_w-(x1+Obj_w/2);
	y2=Doc_h/2-(y1+Obj_h/2);
	for (var i=0, iL=sel.length; i < iL ; i++) {
		sel[i].move("to",[x2,y2]);
	};
    doc.viewPreferences.rulerOrigin = oldRular;
}


///////////サブルーチン
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;
}