2009年7月27日月曜日

Illustratorで選択したオブジェクトをグループ

調べるのにすごいかかったのでメモ。

グループするには、新しくgroupItemを作ってその中にmoveする。
var doc=app.activeDocument;
var sels=doc.selection;

var grp=doc.groupItems.add();
for(var i=0;i<sels.length;i++){
var sel=sels[i]
sel.move(grp,ElementPlacement.PLACEATEND);
};

このmoveのオプションを調べるのにすごく苦労した。
結局、IllustratorCS3_JavaScript_Reference.pdf の後ろの方、Scripting Constants に載っていたのだが。ここにあったこと覚えておかないと…。

ElementPlacementで選べるオプションは以下の5種類。
  • ElementPlacement.INSIDE
  • ElementPlacement.PLACEATBEGINNING
  • ElementPlacement.PLACEATEND
  • ElementPlacement.PLACEBEFORE
  • ElementPlacement.PLACEAFTER
選ぶのを間違えると,グループした時にオブジェクトの前後が逆になったりします。

2009年7月21日火曜日

Illustratorで扇形を描くスクリプト。


がんばって書いたので公開します。
上の画像のような感じできれいな扇形を描く
//中心点o, 半径 r, 開始角度a, 終了角度b とすると、

var o=[100,100];
var r=100;
var a=20;
var b=320;

var doc=app.activeDocument;
var pObj=circularSector(doc,o,r,a,b);
pObj.filled = false; // 塗りなし
pObj.stroked = true; // 線あり
pObj.strokeWidth = 3; // 線幅3ポイント

//---------------------処理ここまで--------------------------
function circularSector(doc,o,r,a,b){
//扇形を作成する。ドキュメントdoc、中心点o、半径 r、開始角度a、終了角度b
//角度を出す
var shema=(b-a)%360;
//90度以上なら角度を分割
var pointsLength=Math.ceil(Math.abs(shema/90));
var shema2=shema/(pointsLength);
//いっこいっこの角度を配列に入れる
var angleAry=[];
for(var i=0;i<=pointsLength;i++){
angleAry.push(a+shema2*i)
};

//パスのポイントの配列を作る
var pointsAry=[o];
for(var j=0;j<angleAry.length;j++){
pointsAry.push(trigonometric(o, r, angleAry[j]));
};
$.writeln(pointsAry);

//パスオブジェクトを生成
var pObj = doc.pathItems.add();
pObj.setEntirePath(pointsAry);
//パスを閉じる
pObj.closed=true;

//パスを選択
pObj.selected=true;
//ハンドルをのばす
var d=arcDirection(r, shema2);
for(var k=1;k<pointsAry.length;k++){
if(k<pointsAry.length-1){
pObj.selectedPathPoints[k].rightDirection=
trigonometric(pointsAry[k], d, angleAry[k-1]+90);
};
if(k>1){
pObj.selectedPathPoints[k].leftDirection=
trigonometric(pointsAry[k], d, angleAry[k-1]-90);
};
};
//パスの選択解除
pObj.selected=false;
return pObj;
};

function trigonometric(o, r, theta){
//三角関数。原点o、半径r、角度theta
var oo,x,y;
x=r*Math.sin(radian(theta));
if(/e/.test(x.toString())) x=0;
y=r*Math.cos(radian(theta));
if(/e/.test(y.toString())) y=0;
oo=[o[0]+x,o[1]+y];
return oo;
};

function arcDirection(r, theta){
//円弧のハンドルまでの距離を出す。半径r、角度theta
var k = (Math.tan(radian(theta)/4))*4/3
return r * k;
};

function radian(theta){
//ラジアンを計算する。角度theta
var rad=theta*Math.PI/180;
return rad;
};