k_ikiの雑記帳

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

obj2center.jsx修正版

動作確認環境:WindowsXP sp3/InDesign CS3(5.0.4)・CS5(7.0.3)

mgさんのスクリプトを教科書に、書き直してみました。
スクリプト中の
////////////////////選択した処理を実行
ルーチンの中で、 'g' を 'v' に変更すればvisibleBounds――つまり線幅を含んだ状態でオブジェクトを認識します。
 
選択肢は前回と同じ4つ。ただし表現を一箇所変更しました。
最初の選択肢は単ページ(見開きでないドキュメント)用。
他の3つは見開き用。
妙なことに、見開きドキュメントの先頭ページ(見開きスタートにしていない場合)について、右綴じだろうと左綴じだろうとページのセンターに配置させるにはふたつめの選択肢「ページのセンターに(見開きの左ページ用)」を選ぶことで中心に移動させることができます。
いや、考えてみたら妙じゃないのか(^^;
 
InDesign CS5からはスプレッド中にサイズの違うページを混在させられますが、サイズ混在ドキュメントでは正常に動作しないはずです。……未確認ですが。
 

////////////////////エラー処理 
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 dW = doc.documentPreferences.pageWidth;
var dH = doc.documentPreferences.pageHeight;
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;
    var sel_bon = get_group_bounds(sel, 'g');
    var sel_centr = [
    sel_bon[1]+(sel_bon[3]-sel_bon[1]) * 0.5,
    sel_bon[0]+(sel_bon[2]-sel_bon[0]) * 0.5
    ];
    for (var i=0, iL=sel.length; i < iL ; i++) {
        sel[i].move(undefined, [dW*0.5-sel_centr[0], dH*0.5-sel_centr[1]]);
    };
    doc.viewPreferences.rulerOrigin = oldRular;
} else if (ans_int == 1) {//ページのセンターに(見開きの左ページ用)
	//ドキュメントのrulerOriginを保存
	var oldRular = doc.viewPreferences.rulerOrigin;
	//ドキュメントのrulerOriginをスプレッドに変更
	doc.viewPreferences.rulerOrigin = 1380143983;
    var sel_bon = get_group_bounds(sel, 'g');
    var sel_centr = [
    sel_bon[1]+(sel_bon[3]-sel_bon[1]) * 0.5,
    sel_bon[0]+(sel_bon[2]-sel_bon[0]) * 0.5
    ];
    for (var i=0, iL=sel.length; i < iL ; i++) {
        sel[i].move(undefined, [dW*0.5-sel_centr[0], dH*0.5-sel_centr[1]]);
    };
    doc.viewPreferences.rulerOrigin = oldRular;
} else if (ans_int == 2) {//ページのセンターに(見開きの右ページ用)
	//ドキュメントのrulerOriginを保存
	var oldRular = doc.viewPreferences.rulerOrigin;
	//ドキュメントのrulerOriginをスプレッドに変更
	doc.viewPreferences.rulerOrigin = 1380143983;
    var sel_bon = get_group_bounds(sel, 'g');
    var sel_centr = [
    sel_bon[1]+(sel_bon[3]-sel_bon[1]) * 0.5,
    sel_bon[0]+(sel_bon[2]-sel_bon[0]) * 0.5
    ];
    for (var i=0, iL=sel.length; i < iL ; i++) {
        sel[i].move(undefined, [dW*1.5-sel_centr[0], dH*0.5-sel_centr[1]]);
    };
    doc.viewPreferences.rulerOrigin = oldRular;
} else if (ans_int == 3) {//スプレッドのセンターに
	//ドキュメントのrulerOriginを保存
	var oldRular = doc.viewPreferences.rulerOrigin;
	//ドキュメントのrulerOriginをスプレッドに変更
	doc.viewPreferences.rulerOrigin = 1380143983;
    var sel_bon = get_group_bounds(sel, 'g');
    var sel_centr = [
    sel_bon[1]+(sel_bon[3]-sel_bon[1]) * 0.5,
    sel_bon[0]+(sel_bon[2]-sel_bon[0]) * 0.5
    ];
    for (var i=0, iL=sel.length; i < iL ; i++) {
        sel[i].move(undefined, [dW-sel_centr[0], dH*0.5-sel_centr[1]]);
    };
    doc.viewPreferences.rulerOrigin = oldRular;
}

////////////////////サブルーチン
/**
 * get bounds of selections
 *
 * @param {Object} sel Collection of object
 * @param {String} gv 'g':geometricBounds, 'v':visibleBounds
 * @returns {Array} [top, right, bottom, left]
 */
function get_group_bounds (sel, gv) {
  var t = [], l = [], b = [], r = [];
  for (var i=0, iL=sel.length; i < iL ; i++) {
    var bo = gv === 'g' ? sel[i].geometricBounds : sel[i].visibleBounds;
    t.push(bo[0]);
    l.push(bo[1]);
    b.push(bo[2]);
    r.push(bo[3]);
  };
  var groupBon = [
    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 groupBon;
}