:note

四角形を八角形にして五角形などにする

InDesignで、フローチャートのオブジェクトのように四角形の任意の辺をとんがらせた矢印っぽい五角形などを作りたいときのスクリプト。 手動でやるならペンツールで中央にアンカーポイントを追加してニョっとやる作業のシミュレートです。グラフィックフレームの四角形だけを相手に(テキストフレームの四角形は無視します)四辺の中央点を引っ張ったり押し込めたりします。回転、シアーがかかってても対応してます。 何も入力せずにOKを押すとアンカーポイントだけ追加して四角形風な八角形になります。

四角形を八角形にして五角形などにする /images/2010/09/693-rec2octagon_memo.jpg

/**
四角形を八角形にして五角形などにする
"convert to octagons, and convert to arrow or pentagon"
使い方:
四角形フレームを選択して実行。
ダイアログに上下左右の拡張値を設定。
プラスが外側、マイナスが内側に拡張します。
動作確認:OS10.4.11 InDesign CS3
milligramme
www.milligramme.cc
*/
if( app.documents.length > 0 && app.selection.length > 0){
  var docObj=app.documents[0];
  var selObj=docObj.selection;
  var pi=Math.PI/180;
  var dlg= new Window('dialog', 'Set Values', [50,50,240,230]);
  dlg.pnl=dlg.add('panel',[10,10,180,110],'外側が+値、内側が−値');
  dlg.pnl.enhValu2=dlg.pnl.add('edittext',[10,40,50,60],'0');
  dlg.pnl.enhValu4=dlg.pnl.add('edittext',[60,60,100,80],'0');
  dlg.pnl.enhValu6=dlg.pnl.add('edittext',[110,40,150,60],'0');
  dlg.pnl.enhValu8=dlg.pnl.add('edittext',[60,20,100,40],'0');
  dlg.resetButton=dlg.add('button',[20,145,80,170],'reset');
  dlg.cancelButton=dlg.add('button',[90,145,170,170],'cancel',{name:'cancel'});
  dlg.okButton=dlg.add('button',[20,120,170,145],'ok',{name:'ok'});
  dlg.okButton.onClick=function(){
  okClick=true;
  dlg.close();
};
dlg.cancelButton.onClick=function(){
  okClick=false;
  dlg.close();
};
dlg.resetButton.onClick=function(){
  dlg.pnl.enhValu2.text="0";
  dlg.pnl.enhValu4.text="0";
  dlg.pnl.enhValu6.text="0";
  dlg.pnl.enhValu8.text="0";
};
dlg.show();
if(okClick == true){
  //edittextの中身はstringなのでnumberにする
  var moveVal2, moveVal4, moveVal6, moveVal8;
  moveVal2=moveVal4=moveVal6=moveVal8=0;
  if(dlg.pnl.enhValu2.text!=""){moveVal2=eval(dlg.pnl.enhValu2.text);}
  if(dlg.pnl.enhValu4.text!=""){moveVal4=eval(dlg.pnl.enhValu4.text);}
  if(dlg.pnl.enhValu6.text!=""){moveVal6=eval(dlg.pnl.enhValu6.text);}
  if(dlg.pnl.enhValu8.text!=""){moveVal8=eval(dlg.pnl.enhValu8.text);}
  //ルーラーを一時的にスプレッドにする
  var rulerBk=docObj.viewPreferences.rulerOrigin;
  var rulerTemp=RulerOrigin.SPREAD_ORIGIN;
  docObj.viewPreferences.rulerOrigin=rulerTemp;
  main (selObj, moveVal2, moveVal4, moveVal6, moveVal8);
  //ルーラーを元に戻す
  docObj.viewPreferences.rulerOrigin=rulerBk;
  }
}
else{
  alert("ドキュメント上の四角形グラフィックフレームを選択してください");
}

function main (selObj, moveVal2, moveVal4, moveVal6, moveVal8){
  for(var i=0; i < selObj.length; i++){
    //$.writeln(selObj[i].constructor.name)
    if(selObj[i].constructor.name!="Rectangle"){
      continue;
    }
    else{
      var roAng=selObj[i].rotationAngle;
      var shAng=selObj[i].shearAngle;
      var pp1, pp2, pp3, pp4, pp5, pp6, pp7, pp8;
      //四角形のパスポイント、左上から反時計回りに
      pp1=selObj[i].paths[0].pathPoints[0].anchor;
      pp3=selObj[i].paths[0].pathPoints[1].anchor;
      pp5=selObj[i].paths[0].pathPoints[2].anchor;
      pp7=selObj[i].paths[0].pathPoints[3].anchor;
      //四角形の中央値を求める
      pp2=[pp1[0]+0.5*(pp3[0]-pp1[0]), pp1[1]+0.5*(pp3[1]-pp1[1])];//左中央
      pp4=[pp3[0]+0.5*(pp5[0]-pp3[0]), pp3[1]+0.5*(pp5[1]-pp3[1])];//下中央
      pp6=[pp5[0]+0.5*(pp7[0]-pp5[0]), pp5[1]+0.5*(pp7[1]-pp5[1])];//右中央
      pp8=[pp7[0]+0.5*(pp1[0]-pp7[0]), pp7[1]+0.5*(pp1[1]-pp7[1])];//上中央
      //八角形として再定義
      selObj[i].paths[0].entirePath=[pp1, pp2, pp3, pp4, pp5, pp6, pp7, pp8];
      //設定量で凸凹させる
      selObj[i].paths[0].pathPoints[1].anchor=[
      selObj[i].paths[0].pathPoints[1].anchor[0]-moveVal2*Math.cos(roAng*pi),
      selObj[i].paths[0].pathPoints[1].anchor[1]+moveVal2*Math.sin(roAng*pi)];
      selObj[i].paths[0].pathPoints[3].anchor=[
      selObj[i].paths[0].pathPoints[3].anchor[0]+moveVal4*Math.sin((roAng-shAng)*pi),
      selObj[i].paths[0].pathPoints[3].anchor[1]+moveVal4*Math.cos((roAng-shAng)*pi)];
      selObj[i].paths[0].pathPoints[5].anchor=[
      selObj[i].paths[0].pathPoints[5].anchor[0]+moveVal6*Math.cos(roAng*pi),
      selObj[i].paths[0].pathPoints[5].anchor[1]-moveVal6*Math.sin(roAng*pi)];
      selObj[i].paths[0].pathPoints[7].anchor=[
      selObj[i].paths[0].pathPoints[7].anchor[0]-moveVal8*Math.sin((roAng-shAng)*pi),
      selObj[i].paths[0].pathPoints[7].anchor[1]-moveVal8*Math.cos((roAng-shAng)*pi)];
    }
  }
}

 
comments powered by Disqus
back to top