@amcharts/amcharts5
Version:
amCharts 5
124 lines • 4.85 kB
JavaScript
import { Percent } from "../../core/util/Percent";
import { PercentChart } from "../percent/PercentChart";
import { p50 } from "../../core/util/Percent";
import * as $utils from "../../core/util/Utils";
import * as $math from "../../core/util/Math";
/**
* Creates a pie chart.
*
* @see {@link https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/} for more info
* @important
*/
export class PieChart extends PercentChart {
constructor() {
super(...arguments);
this._maxRadius = 1;
}
_afterNew() {
super._afterNew();
this.seriesContainer.setAll({ x: p50, y: p50 });
}
_processSeries(series) {
super._processSeries(series);
this.series.each((s) => {
s._markDirtyKey("innerRadius");
});
}
_prepareChildren() {
super._prepareChildren();
const chartContainer = this.chartContainer;
const w = chartContainer.innerWidth();
const h = chartContainer.innerHeight();
const startAngle = this.get("startAngle", 0);
const endAngle = this.get("endAngle", 0);
const innerRadius = this.get("innerRadius");
let bounds = $math.getArcBounds(0, 0, startAngle, endAngle, 1);
const wr = w / (bounds.right - bounds.left);
const hr = h / (bounds.bottom - bounds.top);
let innerBounds = { left: 0, right: 0, top: 0, bottom: 0 };
if (innerRadius instanceof Percent) {
let value = innerRadius.value;
let mr = Math.min(wr, hr);
value = Math.max(mr * value, mr - Math.min(h, w)) / mr;
innerBounds = $math.getArcBounds(0, 0, startAngle, endAngle, value);
this.setPrivateRaw("irModifyer", value / innerRadius.value);
}
bounds = $math.mergeBounds([bounds, innerBounds]);
const prevRadius = this._maxRadius;
this._maxRadius = Math.min(wr, hr);
const radius = $utils.relativeToValue(this.get("radius", 0), this._maxRadius);
this.seriesContainer.setAll({
dy: -radius * (bounds.bottom + bounds.top) / 2, dx: -radius * (bounds.right + bounds.left) / 2
});
if (this.isDirty("startAngle") || this.isDirty("endAngle") || prevRadius != this._maxRadius) {
this.series.each((series) => {
series._markDirtyKey("startAngle");
});
}
if (this.isDirty("innerRadius") || this.isDirty("radius")) {
this.series.each((series) => {
series._markDirtyKey("innerRadius");
});
}
}
/**
* Returns outer radius in pixels.
*
* If optional series parameter is passed in, it will return outer radius
* of that particular series.
*
* @param series Series
* @return Radius in pixels
*/
radius(series) {
let radius = $utils.relativeToValue(this.get("radius", 0), this._maxRadius);
let innerRadius = $utils.relativeToValue(this.get("innerRadius", 0), radius);
if (series) {
let index = this.series.indexOf(series);
let length = this.series.length;
let seriesRadius = series.get("radius");
if (seriesRadius != null) {
return innerRadius + $utils.relativeToValue(seriesRadius, radius - innerRadius);
}
else {
return innerRadius + (radius - innerRadius) / length * (index + 1);
}
}
return radius;
}
/**
* Returns inner radius in pixels.
*
* If optional series parameter is passed in, it will return inner radius
* of that particular series.
*
* @param series Series
* @return Radius in pixels
*/
innerRadius(series) {
const radius = this.radius();
let innerRadius = $utils.relativeToValue(this.get("innerRadius", 0), radius);
if (innerRadius < 0) {
innerRadius = radius + innerRadius;
}
if (series) {
let index = this.series.indexOf(series);
let length = this.series.length;
let seriesInnerRadius = series.get("innerRadius");
if (seriesInnerRadius != null) {
return innerRadius + $utils.relativeToValue(seriesInnerRadius, radius - innerRadius);
}
else {
return innerRadius + (radius - innerRadius) / length * index;
}
}
return innerRadius;
}
_updateSize() {
super._updateSize();
this.markDirtyKey("radius");
}
}
PieChart.className = "PieChart";
PieChart.classNames = PercentChart.classNames.concat([PieChart.className]);
//# sourceMappingURL=PieChart.js.map