UNPKG

echarts

Version:

A powerful charting and visualization library for browser

96 lines (90 loc) 3.02 kB
import { eachAfter, eachBefore } from './traversalHelper'; import { init, firstWalk, secondWalk, separation as sep, radialCoordinate, getViewRect } from './layoutHelper'; export default function (seriesModel, api) { var layoutInfo = getViewRect(seriesModel, api); seriesModel.layoutInfo = layoutInfo; var layout = seriesModel.get('layout'); var width = 0; var height = 0; var separation = null; if (layout === 'radial') { width = 2 * Math.PI; height = Math.min(layoutInfo.height, layoutInfo.width) / 2; separation = sep(function (node1, node2) { return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth; }); } else { width = layoutInfo.width; height = layoutInfo.height; separation = sep(); } var virtualRoot = seriesModel.getData().tree.root; var realRoot = virtualRoot.children[0]; init(virtualRoot); eachAfter(realRoot, firstWalk, separation); virtualRoot.hierNode.modifier = - realRoot.hierNode.prelim; eachBefore(realRoot, secondWalk); var left = realRoot; var right = realRoot; var bottom = realRoot; eachBefore(realRoot, function (node) { var x = node.getLayout().x; if (x < left.getLayout().x) { left = node; } if (x > right.getLayout().x) { right = node; } if (node.depth > bottom.depth) { bottom = node; } }); var delta = left === right ? 1 : separation(left, right) / 2; var tx = delta - left.getLayout().x; var kx = 0; var ky = 0; var coorX = 0; var coorY = 0; if (layout === 'radial') { kx = width / (right.getLayout().x + delta + tx); // here we use (node.depth - 1), bucause the real root's depth is 1 ky = height/ ((bottom.depth - 1) || 1); eachBefore(realRoot, function (node) { coorX = (node.getLayout().x + tx) * kx; coorY = (node.depth - 1) * ky; var finalCoor = radialCoordinate(coorX, coorY); node.setLayout({x: finalCoor.x, y: finalCoor.y, rawX: coorX, rawY: coorY}, true); }); } else { if (seriesModel.get('orient') === 'horizontal') { ky = height / (right.getLayout().x + delta + tx); kx = width / ((bottom.depth - 1) || 1); eachBefore(realRoot, function (node) { coorY = (node.getLayout().x + tx) * ky; coorX = (node.depth - 1) * kx; node.setLayout({x: coorX, y: coorY}, true); }); } else { kx = width / (right.getLayout().x + delta + tx); ky = height / ((bottom.depth - 1) || 1); eachBefore(realRoot, function (node) { coorX = (node.getLayout().x + tx) * kx; coorY = (node.depth - 1) * ky; node.setLayout({x: coorX, y: coorY}, true); }); } } }