コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

022.【ID】ページの外にあるオブジェクトを削除

書いたコード

// 定規の開始位置がスプレッドの場合限定

var myDoc = app.activeDocument;
var mySprds = app.activeDocument.spreads;

for (var i = 0; i < mySprds.length; i++) {
  var mySprdBound = getSprdBounds(mySprds[i]);
  var myObjs = mySprds[i].pageItems;
  var myObjsLen = myObjs.length - 1;
  for (var j = myObjsLen; j >= 0; j--) {
    if (myObjs[j].geometricBounds[0] > mySprdBound[2]) {
      myObjs[j].remove();
      continue;
    }
    if (myObjs[j].geometricBounds[2] < mySprdBound[0]) {
      myObjs[j].remove();
      continue;
    }
    if (myObjs[j].geometricBounds[1] > mySprdBound[3]) {
      myObjs[j].remove();
      continue;
    }
    if (myObjs[j].geometricBounds[3] < mySprdBound[1]) {
      myObjs[j].remove();
      continue;
    }

  }
}


// スプレッドの座標取得
function getSprdBounds(tgtSprd) {
  var tgtSprdBounds = [0, 0, 0, 0];
  for (var j = 0; j < tgtSprd.pages.length; j++) {
    if (tgtSprd.pages[j].bounds[0] < tgtSprdBounds[0]) {
      tgtSprdBounds[0] = tgtSprd.pages[j].bounds[0]
    }
    if (tgtSprd.pages[j].bounds[1] < tgtSprdBounds[1]) {
      tgtSprdBounds[1] = tgtSprd.pages[j].bounds[1]
    }
    if (tgtSprd.pages[j].bounds[2] > tgtSprdBounds[2]) {
      tgtSprdBounds[2] = tgtSprd.pages[j].bounds[2]
    }
    if (tgtSprd.pages[j].bounds[3] > tgtSprdBounds[3]) {
      tgtSprdBounds[3] = tgtSprd.pages[j].bounds[3]
    }
  }
  return tgtSprdBounds;
}

メモ

分かったこと

pageItemについて、
ページ上にある→parentはpage
完全にペーストボードにある→parentはspread
という思い込みがあったのだけどそんなことはなかった。

分からなかったこと

スプレッドとマスタースプレッド両方を一度に処理しようとして、

var mySprds = app.activeDocument.spreads.everyItem();
var myMasterSprds = myDoc.masterSpreads.everyItem();
mySprds = mySprds.concat(myMasterSprds)

としたがうまくいかなかった。
.everyItem()でコレクションオブジェクトを配列にできると思ったのだけど。

積み残し

  • マスターのページアイテムにも対応
  • 定規の開始位置がページの場合にも対応
  • べたべたな書き方をしてしまったのできれいにしたい