UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

146 lines (145 loc) 4.74 kB
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 };