:note

がしゃんと割って寄せ集めて、また割って固める。みたいなものをつくる

InDesignにてオブジェクトの整列、パスファインダー、三項演算子、自前のScriptUI dialog makerの使い勝手テストを兼ねて、がっしゃんがっしゃんばりばりばりん。

がしゃんと割って寄せ集めて、また割って固める。みたいなものをつくる /images/2010/09/726-crash_and_sweep_dialog.jpg

がしゃんと割って寄せ集めて、また割って固める。みたいなものをつくる /images/2010/09/727-crash_and_sweep.jpg
/**
がしゃんと割って寄せ集めて、また割って固める。みたいなものをつくる
"crash and sweep, crash and stick"
使い方と注意:
実行すると、整列位置、形状(shp)、複製数(dup)、分割値(div)のダイアログが出ます。
適当に設定して、OKすると、最前面ドキュメント(なければ作成)上に、
円又は四角形を複製して、パスファインダ(中マド)を実行、
複合パスを解除して、整列させて、もう一度パスファインダ(中マド)を
実行します。
整列位置;最終的にドキュメントのどこに整列させるか、"frozen"の場合は整列させません。
形状(shp)円又は四角形を選ぶ、大きさはドキュメントの短辺÷分割値(div)のサイズ。
複製数(dup)円又は四角形を複製する数。多すぎると極端に速度低下するので3〜10にリミット設定してます。
分割値(div)はドキュメントの短辺を分割する数。大きいと生成される円又は四角形
が小さくて、中マドが発生しません。
動作確認:OS10.4.11, 10.6.2 InDesign CS3
milligramme
www.milligramme.cc
*/
var dlg=new Window('dialog', 'crash and sweep' , [0, 0, 240, 150]);
dlg.center();
dlg.add('statictext', [90,45,120,59],"val");
var dupValueSlider=dlg.add('slider' , [120, 45, 190, 59] , 5, 2, 10);//min 2, max10, default 5
var dupValueTxt=dlg.add('statictext', [200,45,250,59],"5");
dlg.add('statictext', [90,70,120,84], "div");
var divDocSlider=dlg.add('slider' , [120, 70, 190, 84] , 1.5, 1, 5);//min 1, max 5, default 1.5
var divDocTxt=dlg.add('statictext', [200,70,250,84],"1.5");
dlg.add('statictext', [90,13,120,30], "shp");
var dupShape=dlg.add('dropdownlist' , [120, 10, 230, 27] , ["Rectangle","Oval"]);
dupShape.selection=1; //default: Oval
dlg.add('panel' , [19, 19, 65, 65] , '');
var rbGrp=dlg.add('group',[0,0,100,100]);
with(rbGrp){
  var alignLeftBottom= add('radiobutton' , [10, 56, 28, 74] , '1');
  var alignBottom= add('radiobutton' , [33, 56, 51, 74] , '2');
  var alignRightBottom= add('radiobutton' , [56, 56, 74, 74] , '3');
  var alignLeft= add('radiobutton' , [10, 33, 28, 51] , '4');
  var alignCenter= add('radiobutton' , [33, 33, 51, 51] , '5');
  var alignRight= add('radiobutton' , [56, 33, 74, 51] , '6');
  var alignLeftTop= add('radiobutton' , [10, 10, 28, 28] , '7');
  var alignTop= add('radiobutton' , [33, 10, 51, 28] , '8');
  var alignRightTop= add('radiobutton' , [56, 10, 74, 28] , '9');
  var frozen= add('radiobutton' , [10, 79, 74, 97] , 'frozen');
}
alignLeftTop.value=true; //default position: Left Top
var okButton= dlg.add('button' , [40, 115, 100, 130] , 'ok' , {name: 'ok'});
var cancelButton= dlg.add('button' , [120, 115, 200, 130] , 'cancel' , {name: 'cancel'});
// event
okButton.onClick=function(){
  dlg.close();
  okClick=true;
};
cancelButton.onClick=function(){
  dlg.close();
  okClick=false;
};
dupValueSlider.onChanging=function(){
dupValueTxt.text=Math.round(this.value);
}
divDocSlider.onChanging=function(){
divDocTxt.text=this.value.toFixed(2);
}
// end of event
dlg.show();
// set var
if(okClick == true){
  var RorO= dupShape.selection == 0 ? 'rectangles' : 'ovals'; // 四角か円か
  var valueOfShape= Math.round(dupValueSlider.value); //複製数(整数値)
  var divDoc= divDocSlider.value.toFixed(2); //分割値
  var alignMode;
  for(var i=0, L=rbGrp.children.length; i < L; i++){
    if(rbGrp.children[i].value == true){
      alignMode=rbGrp.children[i].text;
    }
  }
  if(app.documents.length == 0){
    app.documents.add();
  }
  var docObj=app.documents[0];
  //ルーラーを一時的にスプレッドにする
  var rulerBk=docObj.viewPreferences.rulerOrigin;
  var rulerTemp=RulerOrigin.SPREAD_ORIGIN;
  docObj.viewPreferences.rulerOrigin=rulerTemp;
  //メイン処理へ
  main(docObj, divDoc, alignMode, valueOfShape, RorO);
  //ルーラーを元に戻す
  docObj.viewPreferences.rulerOrigin=rulerBk;
}
else{exit();}

//メイン処理:
function main (docObj, divDoc, alignMode, valueOfShape, RorO){
  var dWidth=  docObj.documentPreferences.pageWidth;
  var dHeight= docObj.documentPreferences.pageHeight;
  var dMin=Math.min(dWidth, dHeight);
  var objR=dMin/divDoc;
  var obj=docObj[RorO].add({//[RorO]は.rectangles か .ovals
    geometricBounds: [0, 0, objR, objR],
    fillColor: "Black",
    strokeWeight: 0,
    strokeColor: "None"
    });
  var dupArr=new Array();
  for(var i=0; i < valueOfShape; i++){
    dupObj=obj.duplicate(undefined, [ (dWidth-objR)*Math.random(), (dHeight-objR)*Math.random() ]);
    dupArr.push(dupObj);
  }
  compObj=obj.excludeOverlapPath (dupArr); //パスファインダー中マド
  relCompObj=compObj.releaseCompoundPath();
  //  $.bp()
  for(j=0, L= relCompObj.length; j < L; j++){
    var relCompGBon=relCompObj[j].geometricBounds;
    switch (alignMode){
      case "1":
        try{relCompObj[j].move(undefined,[ -relCompGBon[1], dHeight-relCompGBon[2] ]);}
        catch(e){relCompObj[j].remove();}
        break;
      case "2":
        try{relCompObj[j].move(undefined,[ 0, dHeight-relCompGBon[2] ]);}
        catch(e){relCompObj[j].remove();}
        break;
      case "3":
        try{relCompObj[j].move(undefined,[ dWidth-relCompGBon[3], dHeight-relCompGBon[2] ]);}
        catch(e){relCompObj[j].remove();}
        break;
      case "4":
        try{relCompObj[j].move(undefined,[ -relCompGBon[1], 0 ]);}
        catch(e){relCompObj[j].remove();}
        break;
      case "5":
        try{relCompObj[j].move(undefined, [
          dWidth*0.5-relCompGBon[1]-(relCompGBon[3]-relCompGBon[1])*0.5,
          dHeight*0.5-relCompGBon[0]-(relCompGBon[2]-relCompGBon[0])*0.5
          ])}
        catch(e){relCompObj[j].remove();}
        break;
      case "6":
        try{relCompObj[j].move(undefined,[ dWidth-relCompGBon[3], 0 ]);}
        catch(e){relCompObj[j].remove();}
        break;
      case "7":
        try{relCompObj[j].move(undefined,[ -relCompGBon[1], -relCompGBon[0] ]);}
        catch(e){relCompObj[j].remove();}
        break;
      case "8":
        try{relCompObj[j].move(undefined,[ 0, -relCompGBon[0] ]);}
        catch(e){relCompObj[j].remove();}
        break;
      case "9":
        try{relCompObj[j].move(undefined,[ dWidth-relCompGBon[3], -relCompGBon[0] ]);}
        catch(e){relCompObj[j].remove();}
        break;
      default :// frozen の場合には整列させない
    }
  }
  relCompObj_1=relCompObj.shift();
  relCompObj_1.excludeOverlapPath (relCompObj);//パスファインダー中マド
}
 
comments powered by Disqus
back to top