153 lines
4.5 KiB
JavaScript
153 lines
4.5 KiB
JavaScript
|
|
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
var zrUtil = require("zrender/lib/core/util");
|
|
|
|
var _number = require("../../util/number");
|
|
|
|
var parsePercent = _number.parsePercent;
|
|
|
|
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
/**
|
|
* @param {module:echarts/data/Graph} graph
|
|
*/
|
|
function layout(graphs, opts) {
|
|
if (!zrUtil.isArray(graphs)) {
|
|
graphs = [graphs];
|
|
}
|
|
|
|
var graph0 = graphs[0];
|
|
var groups = []; // Init groups
|
|
|
|
graph0.eachNode(function (node) {
|
|
var group = {
|
|
size: 0,
|
|
subGroups: [],
|
|
node: node
|
|
};
|
|
groups.push(group);
|
|
});
|
|
zrUtil.each(graphs, function (graph) {
|
|
graph.eachEdge(function (edge) {
|
|
var g1 = groups[edge.node1.dataIndex];
|
|
g1.size += edge.getValue('value') || 0;
|
|
g1.subGroups.push({
|
|
size: edge.getValue('value'),
|
|
edge: edge
|
|
});
|
|
});
|
|
});
|
|
var sumSize = zrUtil.reduce(groups, function (sumSize, group) {
|
|
return sumSize + group.size;
|
|
}, 0);
|
|
|
|
if (opts.sort && opts.sort !== 'none') {
|
|
groups.sort(compareGroups);
|
|
|
|
if (opts.sort === 'descending') {
|
|
groups.reverse();
|
|
}
|
|
}
|
|
|
|
var unitAngle = (Math.PI * 2 - opts.padding * graph0.data.count()) / sumSize;
|
|
var angle = opts.startAngle * Math.PI / 180;
|
|
var sign = opts.clockwise ? -1 : 1;
|
|
zrUtil.each(groups, function (group) {
|
|
if (opts.sortSub && opts.sortSub !== 'none') {
|
|
group.subGroups.sort(compareGroups);
|
|
|
|
if (opts.sortSub === 'descending') {
|
|
group.subGroups.reverse();
|
|
}
|
|
}
|
|
|
|
var endAngle = angle + sign * group.size * unitAngle;
|
|
group.node.setLayout({
|
|
startAngle: -angle,
|
|
endAngle: -endAngle,
|
|
cx: opts.cx,
|
|
cy: opts.cy,
|
|
r0: opts.r0,
|
|
r: opts.r,
|
|
clockwise: opts.clockwise
|
|
});
|
|
zrUtil.each(group.subGroups, function (subGroup) {
|
|
var startAngle = angle;
|
|
var endAngle = angle + sign * subGroup.size * unitAngle;
|
|
var layout = subGroup.edge.getLayout() || {
|
|
cx: opts.cx,
|
|
cy: opts.cy,
|
|
r: opts.r0,
|
|
clockwise: opts.clockwise
|
|
};
|
|
layout.startAngle = -startAngle;
|
|
layout.endAngle = -endAngle;
|
|
subGroup.edge.setLayout(layout);
|
|
angle = endAngle;
|
|
});
|
|
angle = endAngle + sign * opts.padding;
|
|
});
|
|
}
|
|
|
|
var compareGroups = function (a, b) {
|
|
return a.size - b.size;
|
|
};
|
|
|
|
function _default(ecModel, api, payload) {
|
|
ecModel.eachSeriesByType('chord', function (chordSeries) {
|
|
var graph = chordSeries.getGraph();
|
|
var center = chordSeries.get('center');
|
|
var radius = chordSeries.get('radius');
|
|
var viewWidth = api.getWidth();
|
|
var viewHeight = api.getHeight();
|
|
var viewSize = Math.min(viewWidth, viewHeight) / 2;
|
|
layout(graph, {
|
|
sort: chordSeries.get('sort'),
|
|
sortSub: chordSeries.get('sortSub'),
|
|
padding: chordSeries.get('padding'),
|
|
startAngle: chordSeries.get('startAngle'),
|
|
clockwise: chordSeries.get('clockwise'),
|
|
cx: parsePercent(center[0], viewWidth),
|
|
cy: parsePercent(center[1], viewHeight),
|
|
r0: parsePercent(radius[0], viewSize),
|
|
r: parsePercent(radius[1], viewSize)
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = _default; |