:note

パスファインダで文字をスライス

InDesignにてテキストフレームの文字をグラフィック化して、パスファインダ(交差)を利用して分割して、お好みで変形マトリクスを利用して散らしたりしてみます。

GUIは後ほど。とりあえずこの辺の変数を書き換えて使います。

//============================================================
//設定パート
var devW=3; //分割数の設定たて
var devH=2; //分割数の設定よこ
var fitToSmaller=true; //分割して大きさのちいさい方で処理する。
var removeOrg=false; //元のテキストフレームを削除する。
//============================================================
パスファインダで文字をスライス /images/2010/09/699-hachee.jpg

バラすだけで変形をさせない場合はここをコメントアウトします。

transformEachObj (choppingArray); //Fn-2へ。 バラしたオブジェクトを移動・変形しないなら、この行をコメントアウト

回転・移動などの変形をかけると、こんな感じ。 後は煮るなり焼くなり揚げるなり……

パスファインダで文字をスライス /images/2010/09/700-hachee_with_random_transform.jpg
/**
テキストを切り刻む
"sliced or chopped text objects "
使い方:
テキストフレームを選択して実行。
実行するとバラバラに分割したグループオブジェクトになります。
注意;
空のテキストフレームだとエラーになります。
スペースだけなどグラフィック化してもパスにならない文字もエラーになります。
あまり細かくすると変形時に境界線エラーになる場合があります。
動作確認:OS10.4.11 InDesign CS3
milligramme
www.milligramme.cc
*/
if(app.documents.length == 0){exit();}
//============================================================
//設定パート
var devW=3; //分割数の設定たて
var devH=2; //分割数の設定よこ
var fitToSmaller=true; //分割して大きさのちいさい方で処理する。
var removeOrg=false; //元のテキストフレームを削除する。
//============================================================
if(app.selection.length == 1 && app.selection[0].constructor.name == "TextFrame"){
  var docObj=app.documents[0];
  //ルーラーを一時的にスプレッドにする
  var rulerBk=docObj.viewPreferences.rulerOrigin;
  var rulerTemp=RulerOrigin.SPREAD_ORIGIN;
  docObj.viewPreferences.rulerOrigin=rulerTemp;
  //メイン処理へ
  main(docObj, devW, devH, fitToSmaller, removeOrg);
  //ルーラーを元に戻す
  docObj.viewPreferences.rulerOrigin=rulerBk;
}
else{
  alert("テキストフレームを1つだけ選択して実行してください。");
}

//メイン処理
function main(docObj, devW, devH, fitToSmaller, removeOrg){
  //テキストをグラフィック化(元テキストフレームは残す)
  var outTex=docObj.selection[0].createOutlines(false); //文字がないとここでエラー
  var outBon=outTex[0].visibleBounds;
  //グラフィック化後の[黒]対応でオーバープリントを解除しておく
  try{
    outTex[0].overprintFill=false;
  }catch(e){}
  try{
    outTex[0].overprintStroke=false;
  }catch(e){}
  //ばらばらにしたテキストを入れておく配列
  var choppingArray=new Array();
  var tempDup, cuttingRectangle, intersecObj;
  if(outTex[0].pageItems.length > 1){ //multi lines text
    var multiLineOutTex=outTex[0].allPageItems;
    for(var ml=0; ml < multiLineOutTex.length; ml++){
      cuttingRectangle= sliceBounds (
        multiLineOutTex[ml].visibleBounds, devW, devH, fitToSmaller
        ); //Fn-1へ
      for(var ln=0; ln < cuttingRectangle.length; ln++){
        tempDup=multiLineOutTex[ml].duplicate ();
        try{
          intersecObj=cuttingRectangle[ln].intersectPath (tempDup);
          //intersecObj.fillColor="Cyan" //色塗り
          choppingArray.push(intersecObj)
        }catch(e){
          cuttingRectangle[ln].remove();
          tempDup.remove();
        }
      } //for ln
    } // for ml
  }
  else{ //one line text
    cuttingRectangle=sliceBounds (outBon, devW, devH, fitToSmaller); //Fn-1へ
    for(var ln=0; ln < cuttingRectangle.length; ln++){
      tempDup=outTex[0].duplicate ()
      try{
        intersecObj=cuttingRectangle[ln].intersectPath (tempDup);
        //intersecObj.fillColor="Magenta" //色塗り
        choppingArray.push(intersecObj)
      }catch(e){
        cuttingRectangle[ln].remove();
        tempDup.remove();
      }
    } //for ln
  }
  if(removeOrg == true){docObj.selection[0].remove();} //元のテキストフレームを削除する
    outTex[0].remove(); //バラバラ前のグラフィック化オブジェクトを削除する
    transformEachObj(choppingArray); //Fn-2へ。 バラしたオブジェクトを移動・変形しないなら、この行をコメントアウト
    docObj.groups.add(choppingArray); //バラしたオブジェクトをグループ化する
  }

//オブジェクトのサイズの四角形を指定数で分割する。Fn-1
function sliceBounds (svBon, devW, devH, fitToSmaller){
  var selW=svBon[3]-svBon[1];
  var selH=svBon[2]-svBon[0];
  var tempRectangle=app.documents[0].rectangles.add(); //rectanglesをovalsやpolygonsに変えてもよし
  tempRectangle.fillColor="Yellow";
  tempRectangle.strokeWeight=0;
  tempRectangle.strokeColor="None";
  var currX=svBon[1];
  var currY=svBon[0];
  var i=j=0;
  cuttingRectangle=new Array();
  if(fitToSmaller == true){
    var diceSiz=Math.min(selH/devH, selW/devW);
    while(currY <= svBon[2]){
      var tempDup=tempRectangle.duplicate ();
      tempDup.visibleBounds=[
        svBon[0]+j*diceSiz, svBon[1]+i*diceSiz,
        svBon[0]+(j+1)*diceSiz, svBon[1]+(i+1)*diceSiz
        ];
      currX=svBon[1]+(i+1)*diceSiz;
      currY=svBon[0]+(j+1)*diceSiz;
      i++;
      if(currX > svBon[3]){i=0, j++;}
        cuttingRectangle.push(tempDup);
      }
    }
  else{
    while(currY <= svBon[2]){
      var tempDup=tempRectangle.duplicate ();
      tempDup.visibleBounds=[
        svBon[0]+j*selH/devH, svBon[1]+i*selW/devW,
        svBon[0]+(j+1)*selH/devH, svBon[1]+(i+1)*selW/devW
        ];
      currX=svBon[1]+(i+2)*selW/devW;
      currY=svBon[0]+(j+1)*selH/devH;
      i++;
      if(currX > svBon[3]){i=0, j++;}
        cuttingRectangle.push(tempDup);
      }
    }
    tempRectangle.remove();
    lastRec=cuttingRectangle.pop();
    lastRec.remove();
    return cuttingRectangle;
  }

//変形パートFn-2
function transformEachObj(obj){
  for(var t=0; t < obj.length; t++){
    //変形マトリクスオブジェクトをつくる
    var tranMatrix=app.transformationMatrices.add({
      //clockwiseShearAngle: 45-90*Math.random(), //シアー
      counterclockwiseRotationAngle: 5-10*Math.random(), //回転
      //horizontalScaleFactor: 1+1.8*Math.random(), //水平方向の拡大縮小
      //verticalScaleFactor: 1+1.8*Math.random(), //垂直方向の拡大縮小
      horizontalTranslation: 3-6*Math.random(), //水平方向の移動
      verticalTranslation: 3-6*Math.random() //垂直方向の移動
      });
    //変形
    obj[t].transform(
      CoordinateSpaces.PASTEBOARD_COORDINATES, //座標スペースはドキュメント全体
      AnchorPoint.TOP_LEFT_ANCHOR,//アンカーポイントは左上
      tranMatrix,//変形マトリクス
      );
  }
}
 
comments powered by Disqus
back to top