InDesignで円グラフを作成する(1)
久々にスクリプト作成中。今回は仕事に使うものなので、完成形は公開できません。なので作りかけのものを公開しますが、これだけでもそれらしく動くので、試してみたい方はどうぞ。
今回はソースコードだけです。次回以降解説しますが、毎度尻切れトンボになるので期待しないでください。
title = "グラフタイトル";
vals = [30, 25, 20, 15, 5, 3, 1, 1]; //パーセンテージ
var r = 30; //半径
var s = 2; //グラフ周囲のアキ
var tw = 6; //数値の枠の幅
var th = 2; //数値の枠の高さ
//円グラフの中心位置
//CS5で回転をトラブルなく行うには座標をページの左端中央にする
var x = 0;
var y = (app.activeWindow.activePage.bounds[2] -
app.activeWindow.activePage.bounds[0]) / 2;
app.activeWindow.transformReferencePoint = [x, y];
var d = 0.552284746666667; //Directionの定数(半径を1)
var pp1 = new Array(); //半円、[[左], [アンカー], [右]]
pp1.push([[x, y+r], [x, y+r], [x+r*d, y+r]]);
pp1.push([[x+r, y+r*d], [x+r, y], [x+r, y-r*d]]);
pp1.push([[x+r*d, y-r], [x, y-r], [x, y-r]]);
var r2 = r * 1.1;
var pp2 = new Array(); //半円マスク
pp2.push([[x, y+r2], [x, y+r2], [x+r2*d, y+r2]]);
pp2.push([[x+r2, y+r2*d], [x+r2, y], [x+r2, y-r2*d]]);
pp2.push([[x+r2*d, y-r2], [x, y-r2], [x, y-r2]]);
var pp3 = new Array(); //引き出し線
pp3.push([x, y-r*0.9]);
pp3.push([x, y-r*1.1]);
pp3.push([x, y-r*1.2]);
var doc = app.activeDocument;
var ttxf = doc.textFrames.add();
ttxf.geometricBounds = [y-40, x-r, y-34, x+r];
ttxf.contents = title;
var ovl = doc.ovals.add();
ovl.geometricBounds = [y-r, x-r, y+r, x+r];
var grp = doc.groups.add([ttxf, ovl]);
ref = 0;
for (i=0; i<vals.length; i++){
if (vals[i]>100 || vals[i]<=0) {
alert("値が0以下か100を超えています");
exit();
}
if (vals[i]==100) {
var txf = grp.textFrames.add();
//txf.appliedObjectStyle = "";
txf.contents = vals[i] + "%";
txf.geometricBounds = [y-th/2, x-tw/2, y+th/2, x+tw/2];
break;
}
//扇形
fan = grp.ovals.add();
fan.paths[0].entirePath = pp1;
if (vals[i]<50){
msk = grp.ovals.add();
msk.paths[0].entirePath = pp2;
msk.rotationAngle = vals[i] * -3.6; fan = msk.subtractPath(fan);
} else if (vals[i]>50){
msk = grp.ovals.add();
msk.paths[0].entirePath = pp2;
msk.rotationAngle = (vals[i] - 50) * -3.6;
fan = msk.subtractPath(fan);
fan.rotationAngle = -180;
fan2 = grp.ovals.add();
fan2.paths[0].entirePath = pp1;
fan = fan.addPath(fan2);
}
fan.rotationAngle = ref * -3.6;
fan.strokeColor = doc.swatches[3];
//数値および引き出し線
if (vals[i] < 3) {
var ln = grp.graphicLines.add();
ln.paths[0].entirePath = pp3;
ln.rotationAngle = (ref + vals[i] / 2) * -3.6;
ln.strokeColor = doc.swatches[3];
var txf = grp.textFrames.add();
//txf.appliedObjectStyle = "";
txf.contents = vals[i] + "%";
if (ln.paths[0].pathPoints[2].anchor[0] > x){
ln.paths[0].pathPoints[2].anchor =
[x + r + s, ln.paths[0].pathPoints[1].anchor[1]];
txf.geometricBounds =
[ln.paths[0].pathPoints[1].anchor[1]-1, x+r+s,
ln.paths[0].pathPoints[1].anchor[1]+1, x+r+s+tw];
} else {
ln.paths[0].pathPoints[2].anchor =
[x-r-s, ln.paths[0].pathPoints[1].anchor[1]];
txf.geometricBounds =
[ln.paths[0].pathPoints[1].anchor[1]-1, x-r-s-tw,
ln.paths[0].pathPoints[1].anchor[1]+1, x-r-s];
}
} else {
var txf = grp.textFrames.add();
//txf.appliedObjectStyle = "";
txf.contents = vals[i] + "%";
txf.geometricBounds =
[y-r*0.8, x-tw/2, y-r*0.8+th, x+tw/2];
txf.rotationAngle = (ref + vals[i] / 2) * -3.6;
app.activeWindow.transformReferencePoint = AnchorPoint.CENTER_ANCHOR;
txf.rotationAngle = 0;
app.activeWindow.transformReferencePoint = [x, y];
}
//次へ
ref = ref + vals[i];
}