123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- (function () {
- var h = window.AmCharts;
- h.AmPieChart = h.Class({
- inherits: h.AmSlicedChart,
- construct: function (d) {
- this.type = "pie";
- h.AmPieChart.base.construct.call(this, d);
- this.cname = "AmPieChart";
- this.pieBrightnessStep = 30;
- this.minRadius = 10;
- this.depth3D = 0;
- this.startAngle = 90;
- this.angle = this.innerRadius = 0;
- this.startRadius = "500%";
- this.pullOutRadius = "20%";
- this.labelRadius = 20;
- this.labelText = "[[title]]: [[percents]]%";
- this.balloonText = "[[title]]: [[percents]]% ([[value]])\n[[description]]";
- this.previousScale = 1;
- this.adjustPrecision = !1;
- h.applyTheme(this, d, this.cname)
- },
- drawChart: function () {
- h.AmPieChart.base.drawChart.call(this);
- var d = this.chartData;
- if (h.ifArray(d)) {
- if (0 < this.realWidth && 0 < this.realHeight) {
- h.VML && (this.startAlpha = 1);
- var f = this.startDuration,
- c = this.container,
- b = this.updateWidth();
- this.realWidth = b;
- var m = this.updateHeight();
- this.realHeight = m;
- var e = h.toCoordinate,
- k = e(this.marginLeft, b),
- a = e(this.marginRight, b),
- v = e(this.marginTop, m) + this.getTitleHeight(),
- n = e(this.marginBottom, m),
- y, z, g, x = h.toNumber(this.labelRadius),
- q =
- this.measureMaxLabel();
- q > this.maxLabelWidth && (q = this.maxLabelWidth);
- this.labelText && this.labelsEnabled || (x = q = 0);
- y = void 0 === this.pieX ? (b - k - a) / 2 + k : e(this.pieX, this.realWidth);
- z = void 0 === this.pieY ? (m - v - n) / 2 + v : e(this.pieY, m);
- g = e(this.radius, b, m);
- g || (b = 0 <= x ? b - k - a - 2 * q : b - k - a, m = m - v - n, g = Math.min(b, m), m < b && (g /= 1 - this.angle / 90, g > b && (g = b)), m = h.toCoordinate(this.pullOutRadius, g), g = (0 <= x ? g - 1.8 * (x + m) : g - 1.8 * m) / 2);
- g < this.minRadius && (g = this.minRadius);
- m = e(this.pullOutRadius, g);
- v = h.toCoordinate(this.startRadius, g);
- e = e(this.innerRadius, g);
- e >= g && (e = g - 1);
- n = h.fitToBounds(this.startAngle, 0, 360);
- 0 < this.depth3D && (n = 270 <= n ? 270 : 90);
- n -= 90;
- b = g - g * this.angle / 90;
- for (k = q = 0; k < d.length; k++) a = d[k], !0 !== a.hidden && (q += h.roundTo(a.percents, this.pf.precision));
- q = h.roundTo(q, this.pf.precision);
- this.tempPrec = NaN;
- this.adjustPrecision && 100 != q && (this.tempPrec = this.pf.precision + 1);
- for (k = 0; k < d.length; k++)
- if (a = d[k], !0 !== a.hidden && 0 < a.percents) {
- var r = 360 * a.percents / 100,
- q = Math.sin((n + r / 2) / 180 * Math.PI),
- A = -Math.cos((n + r / 2) / 180 * Math.PI) * (b /
- g),
- p = this.outlineColor;
- p || (p = a.color);
- var B = this.alpha;
- isNaN(a.alpha) || (B = a.alpha);
- p = {
- fill: a.color,
- stroke: p,
- "stroke-width": this.outlineThickness,
- "stroke-opacity": this.outlineAlpha,
- "fill-opacity": B
- };
- a.url && (p.cursor = "pointer");
- p = h.wedge(c, y, z, n, r, g, b, e, this.depth3D, p, this.gradientRatio, a.pattern, this.path);
- h.setCN(this, p, "pie-item");
- h.setCN(this, p.wedge, "pie-slice");
- h.setCN(this, p, a.className, !0);
- this.addEventListeners(p, a);
- a.startAngle = n;
- d[k].wedge = p;
- 0 < f && (this.chartCreated || p.setAttr("opacity", this.startAlpha));
- a.ix = q;
- a.iy = A;
- a.wedge = p;
- a.index = k;
- if (this.labelsEnabled && this.labelText && a.percents >= this.hideLabelsPercent) {
- var l = n + r / 2;
- 360 < l && (l -= 360);
- var t = x;
- isNaN(a.labelRadius) || (t = a.labelRadius);
- var r = y + q * (g + t),
- B = z + A * (g + t),
- C, w = 0;
- if (0 <= t) {
- var D;
- 90 >= l && 0 <= l ? (D = 0, C = "start", w = 8) : 90 <= l && 180 > l ? (D = 1, C = "start", w = 8) : 180 <= l && 270 > l ? (D = 2, C = "end", w = -8) : 270 <= l && 360 > l && (D = 3, C = "end", w = -8);
- a.labelQuarter = D
- } else C = "middle";
- var l = this.formatString(this.labelText, a),
- u = this.labelFunction;
- u && (l = u(a, l));
- u = a.labelColor;
- u || (u = this.color);
- "" !== l && (l = h.wrappedText(c, l, u, this.fontFamily, this.fontSize, C, !1, this.maxLabelWidth), h.setCN(this, l, "pie-label"), h.setCN(this, l, a.className, !0), l.translate(r + 1.5 * w, B), l.node.style.pointerEvents = "none", a.tx = r + 1.5 * w, a.ty = B, 0 <= t ? (t = l.getBBox(), u = h.rect(c, t.width + 5, t.height + 5, "#FFFFFF", .005), u.translate(r + 1.5 * w + t.x, B + t.y), a.hitRect = u, p.push(l), p.push(u)) : this.freeLabelsSet.push(l), a.label = l);
- a.tx = r;
- a.tx2 = r + w;
- a.tx0 = y + q * g;
- a.ty0 = z + A * g
- }
- r = e + (g - e) / 2;
- a.pulled && (r += this.pullOutRadiusReal);
- a.balloonX = q * r + y;
- a.balloonY =
- A * r + z;
- a.startX = Math.round(q * v);
- a.startY = Math.round(A * v);
- a.pullX = Math.round(q * m);
- a.pullY = Math.round(A * m);
- this.graphsSet.push(p);
- (0 === a.alpha || 0 < f && !this.chartCreated) && p.hide();
- n += 360 * a.percents / 100
- } 0 < x && !this.labelRadiusField && this.arrangeLabels();
- this.pieXReal = y;
- this.pieYReal = z;
- this.radiusReal = g;
- this.innerRadiusReal = e;
- 0 < x && this.drawTicks();
- this.initialStart();
- this.setDepths()
- }(d = this.legend) && d.invalidateSize()
- } else this.cleanChart();
- this.dispDUpd();
- this.chartCreated = !0
- },
- setDepths: function () {
- var d =
- this.chartData,
- f;
- for (f = 0; f < d.length; f++) {
- var c = d[f],
- b = c.wedge,
- c = c.startAngle;
- 0 <= c && 180 > c ? b.toFront() : 180 <= c && b.toBack()
- }
- },
- arrangeLabels: function () {
- var d = this.chartData,
- f = d.length,
- c, b;
- for (b = f - 1; 0 <= b; b--) c = d[b], 0 !== c.labelQuarter || c.hidden || this.checkOverlapping(b, c, 0, !0, 0);
- for (b = 0; b < f; b++) c = d[b], 1 != c.labelQuarter || c.hidden || this.checkOverlapping(b, c, 1, !1, 0);
- for (b = f - 1; 0 <= b; b--) c = d[b], 2 != c.labelQuarter || c.hidden || this.checkOverlapping(b, c, 2, !0, 0);
- for (b = 0; b < f; b++) c = d[b], 3 != c.labelQuarter || c.hidden || this.checkOverlapping(b,
- c, 3, !1, 0)
- },
- checkOverlapping: function (d, f, c, b, h) {
- var e, k, a = this.chartData,
- v = a.length,
- n = f.label;
- if (n) {
- if (!0 === b)
- for (k = d + 1; k < v; k++) a[k].labelQuarter == c && (e = this.checkOverlappingReal(f, a[k], c)) && (k = v);
- else
- for (k = d - 1; 0 <= k; k--) a[k].labelQuarter == c && (e = this.checkOverlappingReal(f, a[k], c)) && (k = 0);
- !0 === e && 100 > h && (e = f.ty + 3 * f.iy, f.ty = e, n.translate(f.tx2, e), f.hitRect && (n = n.getBBox(), f.hitRect.translate(f.tx2 + n.x, e + n.y)), this.checkOverlapping(d, f, c, b, h + 1))
- }
- },
- checkOverlappingReal: function (d, f, c) {
- var b = !1,
- m = d.label,
- e = f.label;
- d.labelQuarter != c || d.hidden || f.hidden || !e || (m = m.getBBox(), c = {}, c.width = m.width, c.height = m.height, c.y = d.ty, c.x = d.tx, d = e.getBBox(), e = {}, e.width = d.width, e.height = d.height, e.y = f.ty, e.x = f.tx, h.hitTest(c, e) && (b = !0));
- return b
- }
- })
- })();
|