:note

アンカー付オブジェクトで表内に配置された画像の一括処理

InDesignで表組みに限らずアンカー付オブジェクトは、同時に選択出来るのは一つのオブジェクトという制約があります。 表組み内にアンカー付オブジェクトとして配置された画像の調整は一個ずつしないといけないので面倒、たとえば、名簿の顔写真を「垂直/水平比率75%で右下揃えにする」とかそういう処理をしたいときに用にスクリプトを書いてみた。 「ごにょごにょする」って部分の処理を差し替えると色々できる予定(UIもいじらないとだめだけど)。

アンカー付オブジェクトになってて、画像の一括処理ができない

アンカー付オブジェクトで表内に配置された画像の一括処理 /images/2011/02/reseize_table_image_eyes.png

選択箇所だけを一括処理、キーボードによる値の増減はInDesignビルトインDialogオブジェクトだともっと簡単にできる

アンカー付オブジェクトで表内に配置された画像の一括処理 /images/2011/02/reseize_table_image_dlg.png

表組みの選択/選択解除は矢印キーとShiftキーとEscキーでやると便利

アンカー付オブジェクトで表内に配置された画像の一括処理 /images/2011/02/reseize_table_image_result.png

/**
 * resize placed img in table(anchored object)
 */

if (app.documents.length !== 0) {
  var docObj = app.documents[0];
}
else {
  exit();
}

var selObj = app.selection;
// check selection is table or cells?
if (selObj.length === 1 && selObj[0].hasOwnProperty('cells')) {
  // backup ruler origin, change to spread origin
  var bk_ruler = docObj.viewPreferences.rulerOrigin;
  docObj.viewPreferences.rulerOrigin = RulerOrigin.SPREAD_ORIGIN;

  // show dialog, if result isn't invalid, run main
  show_dialog();
  if (scale !== undefined && position !== undefined) {
    main(selObj, scale, position);
  };

  //restore ruler origin
  docObj.viewPreferences.rulerOrigin = bk_ruler;
}

function show_dialog() {
  var dlg = new Window('dialog', "Set scale for Images placed in Table", undefined);
  var pnl = dlg.add('group');
  pnl.orientation = 'column';

  var position_pnl = pnl.add('panel',[0,0,81,93], "Position");
  var rb_arr = [];
  for (var i=0; i < 3; i++) {
    for (var j=0; j < 3; j++) {
      var rb = position_pnl.add('radiobutton',[7+23*j, 7+23*i, 30+23*j, 30+23*i],"");
      rb_arr.push(rb);
    };
  };
  rb_arr[4].value = true;

  var scale_pnl = pnl.add('panel', undefined, "Scale");
  scal_ed = scale_pnl.add('edittext',undefined, "100");

  scale_pnl.add('statictext', undefined, "↑↓: ±1%\nshift+↑↓: ±0.1%", {multiline:true});

  scal_ed.active = true;
  scal_ed.characters = 6;

  // add eventlistener to edit field
  // increase and decrease value with keyboard
  // Shift + up/down => ±0.1%, up/down => ±1%
  scal_ed.addEventListener ("keydown", function (k) {handle_key (k, this);});

  var ok_btn = pnl.add('button', undefined, "OK", {name:'ok'});
  var cancel_btn = pnl.add('button', undefined, "Cancel", {name:'cancel'});

  ok_btn.onClick = function () {
    for (var i=0; i < 9; i++) {
      if (rb_arr[i].value === true) {
        position = i * 1 + 1;
      };
    };
    // minimum scale = 1%
    scale = scal_ed.text * 1 > 1 ? scal_ed.text * 1 : 1;
    dlg.close();
  }

  cancel_btn.onClick = function () {
    scale = undefined;
    position = undefined;
    dlg.close();
  }

  dlg.show();
}

// scan table
/**
 * @param {Object} selObj this must be table or cell
 * @param {Number} scale > 1
 * @param {Number} position 
 *                            1 2 3
 *                            4 5 6
 *                            7 8 9 
 */
function main (selObj, scale, position) {
  var cellObj =  selObj[0].cells;
  for (var cli=0, cliL=cellObj.length; cli < cliL ; cli++) {
    try {
      var img = cellObj[cli].pageItems.everyItem().graphics;
      for (var imi=0, imiL=img.length; imi < imiL ; imi++) {

        // any function 
        resize_image (img[imi], scale, position);
      };
    }catch(e){}
  };
}
/**
* @param {Object} img placed graphic
* @param {Number} scale > 1
* @param {Number} position 
*                            1 2 3
*                            4 5 6
*                            7 8 9 
 */
function resize_image (img, scale, position) {
  // once fit graphic to frame object 
  img.fit(FitOptions.CONTENT_TO_FRAME);
  img.horizontalScale = scale;
  img.verticalScale = scale;

  // image bounds
  var img_gbon = img.geometricBounds;
  var img_w = img_gbon[3] - img_gbon[1];
  var img_h = img_gbon[2] - img_gbon[0];

  // parent frame bounds
  var f_gbon = img.parent.geometricBounds;
  var f_w = f_gbon[3] - f_gbon[1];
  var f_h = f_gbon[2] - f_gbon[0];

  switch(position){
    case 1: img.geometricBounds = [
      f_gbon[0], 
      f_gbon[1], 
      f_gbon[0]+img_h, 
      f_gbon[1]+img_w
      ]; 
      break;
    case 2: img.geometricBounds = [
      f_gbon[0], 
      f_gbon[1]+(f_w/2-img_w/2), 
      f_gbon[0]+img_h, 
      f_gbon[1]+img_w+(f_w/2-img_w/2)
      ]; 
      break;
    case 3: img.geometricBounds = [
      f_gbon[0], 
      f_gbon[3]-img_w, 
      f_gbon[0]+img_h, 
      f_gbon[3]
      ]; 
      break;
    case 4: img.geometricBounds = [
      f_gbon[0]+(f_h/2-img_h/2), 
      f_gbon[1], 
      f_gbon[0]+img_h+(f_h/2-img_h/2), 
      f_gbon[1]+img_w
      ]; 
      break;
    case 5: img.geometricBounds = [
      f_gbon[0]+(f_h/2-img_h/2), 
      f_gbon[1]+(f_w/2-img_w/2), 
      f_gbon[0]+img_h+(f_h/2-img_h/2), 
      f_gbon[1]+img_w+(f_w/2-img_w/2)
      ]; 
      break;
    case 6: img.geometricBounds = [
      f_gbon[0]+(f_h/2-img_h/2), 
      f_gbon[3]-img_w, 
      f_gbon[0]+img_h+(f_h/2-img_h/2), 
      f_gbon[3]
      ]; 
      break;
    case 7: img.geometricBounds = [
      f_gbon[2]-img_h, 
      f_gbon[1], 
      f_gbon[2], 
      f_gbon[1]+img_h
      ]; 
      break;
    case 8: img.geometricBounds = [
      f_gbon[2]-img_h, 
      f_gbon[1]+(f_w/2-img_w/2), 
      f_gbon[2], 
      f_gbon[1]+img_h+(f_w/2-img_w/2)
      ]; 
      break;
    case 9: img.geometricBounds = [
      f_gbon[2]-img_h, 
      f_gbon[3]-img_w, 
      f_gbon[2], 
      f_gbon[3]
      ]; break;

    default: ; break;
  }  
}

// ScriptUI for Dummies v1.3
// from "Using the up and down arrow keys to change numerical data"
function handle_key (key, control){
  var incr;
  key.shiftKey ? step = .1 : step = 1;
  switch (key.keyName){
    case "Up": control.text = String(Number(control.text)+step); break;
    case "Down": control.text = String(Number(control.text)-step);
  }
} // handle_key

 
comments powered by Disqus
back to top