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; }