InDesignで円グラフを作成する(5)
ここからがこのプログラムのキモ。
//扇形 fan = grp.ovals.add(); fan.paths[0].entirePath = pp1;
新たに図形を作成して、あらかじめ定義しておいた配列を与えます。新規に作成する図形は、閉じた図形なら何でも構いません(rectangleでもpolygonでもよい。ovalを選んだのは文字数が一番少ないから)。配列を与えた時点でその形に変わってくれます。
この時点で半円が作成されます。で、値が50%のときは半円のままでOK。
if (vals[i]<50){ msk = grp.ovals.add(); msk.paths[0].entirePath = pp2; msk.rotationAngle = vals[i] * -3.6;
50%未満の時はもうひとつ半円を作成します。この半円は先の半円よりも1.1倍の大きさのものです。そして大きな方を回転させます。角度は「パーセンテージ÷100×360」で、時計回り(マイナス方向)です。回転の中心はtransformReferencePointで指定した場所です。
fan = msk.subtractPath(fan);
そして二つの半円を「前面オブジェクトで型抜き」します。するとグラフの扇形の部分が残るというわけです。
ここで一つの疑問があると思います。なぜ同じ大きさの半円ではだめなの? それはベジエ曲線で作成された円が真円ではないから。同じ大きさにするとはみ出る部分があるのですよ。ですから、少し大きい半円を作成するんです。
} else if (vals[i]>50){
今度は50%よりも大きい場合。
msk = grp.ovals.add(); msk.paths[0].entirePath = pp2; msk.rotationAngle = (vals[i] - 50) * -3.6; fan = msk.subtractPath(fan);
ここまでは前と一緒。
fan.rotationAngle = -180;
出来上がった扇形を180度回転させます。180でも-180でもたぶん同じだと思う。
fan2 = grp.ovals.add(); fan2.paths[0].entirePath = pp1;
ここで新しく半円を作成。
fan = fan.addPath(fan2); }
扇形と半円を合体させます。これで50%より大きい場合も完成。
fan.rotationAngle = ref * -3.6;
出来上がった扇形を回転させます。回転角度は「それ以前のパーセンテージの合計 ÷ 100 × 360」です。これで目的の位置へ移動しました。
fan.strokeColor = doc.swatches[3];
とりあえず線に色をつけています。4番目のスウォッチということで、初期値であれば[黒]になります。テストなのでこれぐらいのいい加減さです。