:note

センタリングされた行の一文字目の座標を知る

とあるラベルをInDesignのデータ結合でつくっていて、

商品名(センタリングしている)の左側にマークがあったり、なかったり、

またそれらが文字数によって重なっていたり、いなかったりするようなデータを、

条件によって後処理を分岐したかったときの判定方法。

文字数によって違うセンタリングされた行の一文字目の座標が知りたい。

というわけで、その一文字目の文字をグラフィック化して、その座標を割り出してみる。

(スクリプトならオリジナルを残してグラフィック化できる。)

マークのグラフィックフレームとテキストフレームにはそれぞれスクリプトラベルを仕込み済み。

センタリングされた行の一文字目の座標を知る /images/2010/09/668-makelabel_1.png
//文字が重なっているか判定
var doc = app.documents[0];

//座標の入れ物
var productArr = new Array();
var markArr = new Array();

//テキストフレームとグラフィックフレームの入れ物
var productTextFrameArr = new Array();
var markGraphicFrameArr = new Array();
pgItem = doc.allPageItems;
for(var i = 0; i < pgItem.length; i++){
  if(pgItem[i].label == "product"){
    var outChar = pgItem[i].characters[0];
    var outP = outChar.createOutlines(false);//オリジナルを残してグラフィック化
    var textLeft = outP[0].geometricBounds[1];//1文字目の左座標
    outP[0].remove();//グラフィック化したのを削除
    productArr.push(textLeft)
    productTextFrameArr.push(pgItem[i])
  }
  if(pgItem[i].label == "mark"){
    var markRight = pgItem[i].visibleBounds[3];
    markArr.push(markRight);
    markGraphicFrameArr.push(pgItem[i]);
  }
}
for(var j = 0; j < productArr.length; j++){
  if(productArr[j]-markArr[j] < 0){
    //重なり判定の結果で処理
    with(markGraphicFrameArr[j].textWrapPreferences){
      textWrapType = TextWrapTypes.BOUNDING_BOX_TEXT_WRAP;
      textWrapOffset = [0,0,0,2];
      textWrapSide = TextWrapSideOptions.BOTH_SIDES;
    }
    productTextFrameArr[j].lines[0].justification = Justification.LEFT_ALIGN;
    //オーバーフロー処理とかはまた別で。
  }
}

判定できればこちらのもの。

センタリングされた行の一文字目の座標を知る /images/2010/09/669-makelabel_2.png
 
comments powered by Disqus
back to top