cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
146 lines (145 loc) • 4.74 kB
JavaScript
import { parsePercent } from "../../util/number.mjs";
import { isArray, each, isFunction, map } from "../../../../zrender/lib/core/util.mjs";
var RADIAN = Math.PI / 180;
function sunburstLayout(seriesType, ecModel, api) {
ecModel.eachSeriesByType(seriesType, function(seriesModel) {
var center = seriesModel.get("center");
var radius = seriesModel.get("radius");
if (!isArray(radius)) {
radius = [0, radius];
}
if (!isArray(center)) {
center = [center, center];
}
var width = api.getWidth();
var height = api.getHeight();
var size = Math.min(width, height);
var cx = parsePercent(center[0], width);
var cy = parsePercent(center[1], height);
var r0 = parsePercent(radius[0], size / 2);
var r = parsePercent(radius[1], size / 2);
var startAngle = -seriesModel.get("startAngle") * RADIAN;
var minAngle = seriesModel.get("minAngle") * RADIAN;
var virtualRoot = seriesModel.getData().tree.root;
var treeRoot = seriesModel.getViewRoot();
var rootDepth = treeRoot.depth;
var sort2 = seriesModel.get("sort");
if (sort2 != null) {
initChildren(treeRoot, sort2);
}
var validDataCount = 0;
each(treeRoot.children, function(child) {
!isNaN(child.getValue()) && validDataCount++;
});
var sum = treeRoot.getValue();
var unitRadian = Math.PI / (sum || validDataCount) * 2;
var renderRollupNode = treeRoot.depth > 0;
var levels = treeRoot.height - (renderRollupNode ? -1 : 1);
var rPerLevel = (r - r0) / (levels || 1);
var clockwise = seriesModel.get("clockwise");
var stillShowZeroSum = seriesModel.get("stillShowZeroSum");
var dir = clockwise ? 1 : -1;
var renderNode = function(node, startAngle2) {
if (!node) {
return;
}
var endAngle = startAngle2;
if (node !== virtualRoot) {
var value = node.getValue();
var angle2 = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;
if (angle2 < minAngle) {
angle2 = minAngle;
}
endAngle = startAngle2 + dir * angle2;
var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1);
var rStart2 = r0 + rPerLevel * depth;
var rEnd2 = r0 + rPerLevel * (depth + 1);
var levelModel = seriesModel.getLevelModel(node);
if (levelModel) {
var r0_1 = levelModel.get("r0", true);
var r_1 = levelModel.get("r", true);
var radius_1 = levelModel.get("radius", true);
if (radius_1 != null) {
r0_1 = radius_1[0];
r_1 = radius_1[1];
}
r0_1 != null && (rStart2 = parsePercent(r0_1, size / 2));
r_1 != null && (rEnd2 = parsePercent(r_1, size / 2));
}
node.setLayout({
angle: angle2,
startAngle: startAngle2,
endAngle,
clockwise,
cx,
cy,
r0: rStart2,
r: rEnd2
});
}
if (node.children && node.children.length) {
var siblingAngle_1 = 0;
each(node.children, function(node2) {
siblingAngle_1 += renderNode(node2, startAngle2 + siblingAngle_1);
});
}
return endAngle - startAngle2;
};
if (renderRollupNode) {
var rStart = r0;
var rEnd = r0 + rPerLevel;
var angle = Math.PI * 2;
virtualRoot.setLayout({
angle,
startAngle,
endAngle: startAngle + angle,
clockwise,
cx,
cy,
r0: rStart,
r: rEnd
});
}
renderNode(treeRoot, startAngle);
});
}
function initChildren(node, sortOrder) {
var children = node.children || [];
node.children = sort(children, sortOrder);
if (children.length) {
each(node.children, function(child) {
initChildren(child, sortOrder);
});
}
}
function sort(children, sortOrder) {
if (isFunction(sortOrder)) {
var sortTargets = map(children, function(child, idx) {
var value = child.getValue();
return {
params: {
depth: child.depth,
height: child.height,
dataIndex: child.dataIndex,
getValue: function() {
return value;
}
},
index: idx
};
});
sortTargets.sort(function(a, b) {
return sortOrder(a.params, b.params);
});
return map(sortTargets, function(target) {
return children[target.index];
});
} else {
var isAsc_1 = sortOrder === "asc";
return children.sort(function(a, b) {
var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1);
return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff;
});
}
}
export { sunburstLayout as default };