InDesignで円グラフを作成する(3)
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]]);
半円(円の右半分)のポイント座標を配列に突っ込んでいます。下端、右端、上端の順です。あとから
fan.paths[0].entirePath = pp1;
で、図形のパスに対してこの配列を当てることで、少ない命令で形を変えることができます。
この配列がややこしいので、3行に分けていますが、1行で書くと、
[ [ [最初のポイントの左ハンドルのx座標, 最初のポイントの左ハンドルのy座標],
[最初のポイントのアンカーのx座標, 最初のポイントのアンカーのy座標],
[最初のポイントの右ハンドルのx座標, 最初のポイントの右ハンドルのy座標] ],
[ [2番目のポイントの左ハンドルのx座標, 2番目のポイントの左ハンドルのy座標],
[2番目のポイントのアンカーのx座標, 2番目のポイントのアンカーのy座標],
[2番目のポイントの右ハンドルのx座標, 2番目のポイントの右ハンドルのy座標] ],
... ]
となります。やっぱりややこしい。
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]]);
もう一度、半円(円の右半分)のポイント座標を配列に突っ込みます。先ほどの半円と中心が同じ(同心円の半分状態)です。こちらの方が前の半円より1.1倍なのですが、特に1.1である必要はなくて、1よりある程度大きければ構いません。1.01でも2でも問題ありません。この半円は何をするものかは、実際に処理を行う行に来たら説明します。
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]);
グラフの引き出し線用の配列です。0.9、1.1、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];
グラフの円を作成しています。もし値に「100%」が入った場合にこの円を使用します。それ以外には使用しません。残しておいてもよいし後から削除してもよいです。ここには抜けていますが塗りも線も[なし]です。
var grp = doc.groups.add([ttxf, ovl]);
先ほどのテキストフレームと円をグループ化します。グループ化しておくと移動が楽です。以降作成する図形やテキストフレームはこのグループの中に作成します。