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番目のスウォッチということで、初期値であれば[黒]になります。テストなのでこれぐらいのいい加減さです。