TreeView.js 21.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
* 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.
*/

S
sushuang 已提交
20
import * as zrUtil from 'zrender/src/core/util';
S
sushuang 已提交
21
import * as graphic from '../../util/graphic';
S
sushuang 已提交
22 23
import SymbolClz from '../helper/Symbol';
import {radialCoordinate} from './layoutHelper';
S
sushuang 已提交
24
import * as echarts from '../../echarts';
P
pissang 已提交
25 26 27 28 29
import * as bbox from 'zrender/src/core/bbox';
import View from '../../coord/View';
import * as roamHelper from '../../component/helper/roamHelper';
import RoamController from '../../component/helper/RoamController';
import {onIrrelevantElement} from '../../component/helper/cursorHelper';
30
import { __DEV__ } from '../../config';
31
import {parsePercent} from '../../util/number';
D
deqingli 已提交
32

33 34 35 36
var TreeShape = graphic.extendShape({
    shape: {
        parentPoint: [],
        childPoints: [],
37
        orient: '',
38
        forkPosition: ''
39 40
    },

41 42 43 44 45
    style: {
        stroke: '#000',
        fill: null
    },

46
    buildPath: function (ctx, shape) {
D
deqingli 已提交
47 48
        var childPoints = shape.childPoints;
        var childLen = childPoints.length;
49
        var parentPoint = shape.parentPoint;
D
deqingli 已提交
50 51 52 53 54 55 56 57 58
        var firstChildPos = childPoints[0];
        var lastChildPos = childPoints[childLen - 1];

        if (childLen === 1) {
            ctx.moveTo(parentPoint[0], parentPoint[1]);
            ctx.lineTo(firstChildPos[0], firstChildPos[1]);
            return;
        }

59
        var orient = shape.orient;
D
deqingli 已提交
60 61 62 63 64 65
        var forkDim = (orient === 'TB' || orient === 'BT') ? 0 : 1;
        var otherDim = 1 - forkDim;
        var forkPosition = parsePercent(shape.forkPosition, 1);
        var tmpPoint = [];
        tmpPoint[forkDim] = parentPoint[forkDim];
        tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition;
66

67
        ctx.moveTo(parentPoint[0], parentPoint[1]);
D
deqingli 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80
        ctx.lineTo(tmpPoint[0], tmpPoint[1]);
        ctx.moveTo(firstChildPos[0], firstChildPos[1]);
        tmpPoint[forkDim] = firstChildPos[forkDim];
        ctx.lineTo(tmpPoint[0], tmpPoint[1]);
        tmpPoint[forkDim] = lastChildPos[forkDim];
        ctx.lineTo(tmpPoint[0], tmpPoint[1]);
        ctx.lineTo(lastChildPos[0], lastChildPos[1]);

        for (var i = 1; i < childLen - 1; i++) {
            var point = childPoints[i];
            ctx.moveTo(point[0], point[1]);
            tmpPoint[forkDim] = point[forkDim];
            ctx.lineTo(tmpPoint[0], tmpPoint[1]);
81
        }
82 83 84
    }
});

S
sushuang 已提交
85
export default echarts.extendChartView({
D
deqingli 已提交
86

S
sushuang 已提交
87
    type: 'tree',
D
deqingli 已提交
88

S
sushuang 已提交
89 90 91 92 93 94 95
    /**
     * Init the chart
     * @override
     * @param  {module:echarts/model/Global} ecModel
     * @param  {module:echarts/ExtensionAPI} api
     */
    init: function (ecModel, api) {
D
deqingli 已提交
96

D
deqingli 已提交
97
        /**
S
sushuang 已提交
98 99
         * @private
         * @type {module:echarts/data/Tree}
D
deqingli 已提交
100
         */
S
sushuang 已提交
101
        this._oldTree;
D
deqingli 已提交
102

S
sushuang 已提交
103 104 105 106 107
        /**
         * @private
         * @type {module:zrender/container/Group}
         */
        this._mainGroup = new graphic.Group();
D
deqingli 已提交
108

D
deqingli 已提交
109 110 111 112
        /**
         * @private
         * @type {module:echarts/componet/helper/RoamController}
         */
P
pissang 已提交
113
        this._controller = new RoamController(api.getZr());
D
deqingli 已提交
114

P
pissang 已提交
115
        this._controllerHost = {target: this.group};
D
deqingli 已提交
116 117

        this.group.add(this._mainGroup);
S
sushuang 已提交
118
    },
D
deqingli 已提交
119

S
sushuang 已提交
120 121
    render: function (seriesModel, ecModel, api, payload) {
        var data = seriesModel.getData();
D
deqingli 已提交
122

S
sushuang 已提交
123
        var layoutInfo = seriesModel.layoutInfo;
D
deqingli 已提交
124

S
sushuang 已提交
125
        var group = this._mainGroup;
D
deqingli 已提交
126

S
sushuang 已提交
127
        var layout = seriesModel.get('layout');
D
deqingli 已提交
128

S
sushuang 已提交
129 130 131 132 133 134
        if (layout === 'radial') {
            group.attr('position', [layoutInfo.x + layoutInfo.width / 2, layoutInfo.y + layoutInfo.height / 2]);
        }
        else {
            group.attr('position', [layoutInfo.x, layoutInfo.y]);
        }
D
deqingli 已提交
135

136
        this._updateViewCoordSys(seriesModel, layoutInfo, layout);
P
pissang 已提交
137 138
        this._updateController(seriesModel, ecModel, api);

S
sushuang 已提交
139 140 141 142 143
        var oldData = this._data;

        var seriesScope = {
            expandAndCollapse: seriesModel.get('expandAndCollapse'),
            layout: layout,
144
            edgeShape: seriesModel.get('edgeShape'),
145
            edgeForkPosition: seriesModel.get('edgeForkPosition'),
146
            orient: seriesModel.getOrient(),
147
            curvature: seriesModel.get('lineStyle.curveness'),
S
sushuang 已提交
148 149 150 151 152 153 154 155 156 157
            symbolRotate: seriesModel.get('symbolRotate'),
            symbolOffset: seriesModel.get('symbolOffset'),
            hoverAnimation: seriesModel.get('hoverAnimation'),
            useNameLabel: true,
            fadeIn: true
        };

        data.diff(oldData)
            .add(function (newIdx) {
                if (symbolNeedsDraw(data, newIdx)) {
D
deqingli 已提交
158
                    // Create node and edge
S
sushuang 已提交
159 160 161 162 163 164
                    updateNode(data, newIdx, null, group, seriesModel, seriesScope);
                }
            })
            .update(function (newIdx, oldIdx) {
                var symbolEl = oldData.getItemGraphicEl(oldIdx);
                if (!symbolNeedsDraw(data, newIdx)) {
165
                    symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel, seriesScope);
S
sushuang 已提交
166 167
                    return;
                }
D
deqingli 已提交
168
                // Update node and edge
S
sushuang 已提交
169 170 171 172
                updateNode(data, newIdx, symbolEl, group, seriesModel, seriesScope);
            })
            .remove(function (oldIdx) {
                var symbolEl = oldData.getItemGraphicEl(oldIdx);
173 174 175 176 177 178 179 180
                // When remove a collapsed node of subtree, since the collapsed
                // node haven't been initialized with a symbol element,
                // you can't found it's symbol element through index.
                // so if we want to remove the symbol element we should insure
                // that the symbol element is not null.
                if (symbolEl) {
                    removeNode(oldData, oldIdx, symbolEl, group, seriesModel, seriesScope);
                }
S
sushuang 已提交
181 182 183
            })
            .execute();

P
pissang 已提交
184 185 186 187
        this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');

        this._updateNodeAndLinkScale(seriesModel);

S
sushuang 已提交
188 189 190 191 192 193 194
        if (seriesScope.expandAndCollapse === true) {
            data.eachItemGraphicEl(function (el, dataIndex) {
                el.off('click').on('click', function () {
                    api.dispatchAction({
                        type: 'treeExpandAndCollapse',
                        seriesId: seriesModel.id,
                        dataIndex: dataIndex
D
deqingli 已提交
195
                    });
D
deqingli 已提交
196
                });
S
sushuang 已提交
197 198 199 200
            });
        }
        this._data = data;
    },
D
deqingli 已提交
201

202
    _updateViewCoordSys: function (seriesModel) {
P
pissang 已提交
203
        var data = seriesModel.getData();
204 205 206 207 208 209
        var points = [];
        data.each(function (idx) {
            var layout = data.getItemLayout(idx);
            if (layout && !isNaN(layout.x) && !isNaN(layout.y)) {
                points.push([+layout.x, +layout.y]);
            }
P
pissang 已提交
210 211 212 213
        });
        var min = [];
        var max = [];
        bbox.fromPoints(points, min, max);
214

D
deqingli 已提交
215
        // If don't Store min max when collapse the root node after roam,
216
        // the root node will disappear.
217 218 219
        var oldMin = this._min;
        var oldMax = this._max;

P
pissang 已提交
220 221
        // If width or height is 0
        if (max[0] - min[0] === 0) {
222 223
            min[0] = oldMin ? oldMin[0] : min[0] - 1;
            max[0] = oldMax ? oldMax[0] : max[0] + 1;
P
pissang 已提交
224 225
        }
        if (max[1] - min[1] === 0) {
226 227
            min[1] = oldMin ? oldMin[1] : min[1] - 1;
            max[1] = oldMax ? oldMax[1] : max[1] + 1;
P
pissang 已提交
228 229 230 231 232 233 234 235 236 237
        }

        var viewCoordSys = seriesModel.coordinateSystem = new View();
        viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');

        viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);

        viewCoordSys.setCenter(seriesModel.get('center'));
        viewCoordSys.setZoom(seriesModel.get('zoom'));

D
deqingli 已提交
238
        // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group
239 240 241 242 243
        this.group.attr({
            position: viewCoordSys.position,
            scale: viewCoordSys.scale
        });

P
pissang 已提交
244
        this._viewCoordSys = viewCoordSys;
245 246
        this._min = min;
        this._max = max;
P
pissang 已提交
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
    },

    _updateController: function (seriesModel, ecModel, api) {
        var controller = this._controller;
        var controllerHost = this._controllerHost;
        var group = this.group;
        controller.setPointerChecker(function (e, x, y) {
            var rect = group.getBoundingRect();
            rect.applyTransform(group.transform);
            return rect.contain(x, y)
                && !onIrrelevantElement(e, api, seriesModel);
        });

        controller.enable(seriesModel.get('roam'));
        controllerHost.zoomLimit = seriesModel.get('scaleLimit');
        controllerHost.zoom = seriesModel.coordinateSystem.getZoom();

D
deqingli 已提交
264 265 266
        controller
            .off('pan')
            .off('zoom')
267 268
            .on('pan', function (e) {
                roamHelper.updateViewOnPan(controllerHost, e.dx, e.dy);
P
pissang 已提交
269 270 271
                api.dispatchAction({
                    seriesId: seriesModel.id,
                    type: 'treeRoam',
272 273
                    dx: e.dx,
                    dy: e.dy
P
pissang 已提交
274 275
                });
            }, this)
276 277
            .on('zoom', function (e) {
                roamHelper.updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);
P
pissang 已提交
278 279 280
                api.dispatchAction({
                    seriesId: seriesModel.id,
                    type: 'treeRoam',
281 282 283
                    zoom: e.scale,
                    originX: e.originX,
                    originY: e.originY
P
pissang 已提交
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
                });
                this._updateNodeAndLinkScale(seriesModel);
            }, this);
    },

    _updateNodeAndLinkScale: function (seriesModel) {
        var data = seriesModel.getData();

        var nodeScale = this._getNodeGlobalScale(seriesModel);
        var invScale = [nodeScale, nodeScale];

        data.eachItemGraphicEl(function (el, idx) {
            el.attr('scale', invScale);
        });
    },

    _getNodeGlobalScale: function (seriesModel) {
        var coordSys = seriesModel.coordinateSystem;
        if (coordSys.type !== 'view') {
            return 1;
        }

        var nodeScaleRatio = this._nodeScaleRatio;

        var groupScale = coordSys.scale;
        var groupZoom = (groupScale && groupScale[0]) || 1;
        // Scale node when zoom changes
        var roamZoom = coordSys.getZoom();
        var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;

        return nodeScale / groupZoom;
    },

    dispose: function () {
        this._controller && this._controller.dispose();
        this._controllerHost = {};
    },
D
deqingli 已提交
321

S
sushuang 已提交
322 323 324 325
    remove: function () {
        this._mainGroup.removeAll();
        this._data = null;
    }
D
deqingli 已提交
326

S
sushuang 已提交
327
});
D
deqingli 已提交
328

S
sushuang 已提交
329 330
function symbolNeedsDraw(data, dataIndex) {
    var layout = data.getItemLayout(dataIndex);
D
deqingli 已提交
331

S
sushuang 已提交
332 333 334 335
    return layout
        && !isNaN(layout.x) && !isNaN(layout.y)
        && data.getItemVisual(dataIndex, 'symbol') !== 'none';
}
D
deqingli 已提交
336

S
sushuang 已提交
337 338
function getTreeNodeStyle(node, itemModel, seriesScope) {
    seriesScope.itemModel = itemModel;
339 340 341 342 343
    seriesScope.itemStyle = itemModel.getModel('itemStyle').getItemStyle();
    seriesScope.hoverItemStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();
    seriesScope.lineStyle = itemModel.getModel('lineStyle').getLineStyle();
    seriesScope.labelModel = itemModel.getModel('label');
    seriesScope.hoverLabelModel = itemModel.getModel('emphasis.label');
D
deqingli 已提交
344

S
sushuang 已提交
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
    if (node.isExpand === false && node.children.length !== 0) {
        seriesScope.symbolInnerColor = seriesScope.itemStyle.fill;
    }
    else {
        seriesScope.symbolInnerColor = '#fff';
    }

    return seriesScope;
}

function updateNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {
    var isInit = !symbolEl;
    var node = data.tree.getNodeByDataIndex(dataIndex);
    var itemModel = node.getModel();
    var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);
    var virtualRoot = data.tree.root;

    var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
    var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);
    var sourceLayout = source.getLayout();
    var sourceOldLayout = sourceSymbolEl
        ? {
            x: sourceSymbolEl.position[0],
            y: sourceSymbolEl.position[1],
            rawX: sourceSymbolEl.__radialOldRawX,
            rawY: sourceSymbolEl.__radialOldRawY
D
deqingli 已提交
371
        }
S
sushuang 已提交
372 373
        : sourceLayout;
    var targetLayout = node.getLayout();
D
deqingli 已提交
374

S
sushuang 已提交
375 376 377
    if (isInit) {
        symbolEl = new SymbolClz(data, dataIndex, seriesScope);
        symbolEl.attr('position', [sourceOldLayout.x, sourceOldLayout.y]);
P
plainheart 已提交
378 379 380 381
    }
    else {
        symbolEl.updateData(data, dataIndex, seriesScope);
    }
D
deqingli 已提交
382

S
sushuang 已提交
383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
    symbolEl.__radialOldRawX = symbolEl.__radialRawX;
    symbolEl.__radialOldRawY = symbolEl.__radialRawY;
    symbolEl.__radialRawX = targetLayout.rawX;
    symbolEl.__radialRawY = targetLayout.rawY;

    group.add(symbolEl);
    data.setItemGraphicEl(dataIndex, symbolEl);
    graphic.updateProps(symbolEl, {
        position: [targetLayout.x, targetLayout.y]
    }, seriesModel);

    var symbolPath = symbolEl.getSymbolPath();

    if (seriesScope.layout === 'radial') {
        var realRoot = virtualRoot.children[0];
        var rootLayout = realRoot.getLayout();
        var length = realRoot.children.length;
        var rad;
        var isLeft;

        if (targetLayout.x === rootLayout.x && node.isExpand === true) {
            var center = {};
            center.x = (realRoot.children[0].getLayout().x + realRoot.children[length - 1].getLayout().x) / 2;
            center.y = (realRoot.children[0].getLayout().y + realRoot.children[length - 1].getLayout().y) / 2;
            rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x);
            if (rad < 0) {
                rad = Math.PI * 2 + rad;
            }
            isLeft = center.x < rootLayout.x;
            if (isLeft) {
                rad = rad - Math.PI;
D
deqingli 已提交
414
            }
S
sushuang 已提交
415 416
        }
        else {
S
sushuang 已提交
417 418 419 420 421 422
            rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x);
            if (rad < 0) {
                rad = Math.PI * 2 + rad;
            }
            if (node.children.length === 0 || (node.children.length !== 0 && node.isExpand === false)) {
                isLeft = targetLayout.x < rootLayout.x;
423 424 425 426 427
                if (isLeft) {
                    rad = rad - Math.PI;
                }
            }
            else {
S
sushuang 已提交
428 429 430
                isLeft = targetLayout.x > rootLayout.x;
                if (!isLeft) {
                    rad = rad - Math.PI;
431 432
                }
            }
S
sushuang 已提交
433 434 435
        }

        var textPosition = isLeft ? 'left' : 'right';
D
deqingli 已提交
436 437 438
        var rotate = seriesScope.labelModel.get('rotate');
        var labelRotateRadian = rotate * (Math.PI / 180);

S
sushuang 已提交
439
        symbolPath.setStyle({
D
deqingli 已提交
440 441
            textPosition: seriesScope.labelModel.get('position') || textPosition,
            textRotation: rotate == null ? -rad : labelRotateRadian,
S
sushuang 已提交
442 443 444 445
            textOrigin: 'center',
            verticalAlign: 'middle'
        });
    }
D
deqingli 已提交
446

447
    drawEdge(
448 449
        seriesModel, node, virtualRoot, symbolEl, sourceOldLayout,
        sourceLayout, targetLayout, group, seriesScope
450 451 452 453 454
    );

}

function drawEdge(
455 456
    seriesModel, node, virtualRoot, symbolEl, sourceOldLayout,
    sourceLayout, targetLayout, group, seriesScope
D
deqingli 已提交
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
) {

    var edgeShape = seriesScope.edgeShape;
    var edge = symbolEl.__edge;
    if (edgeShape === 'curve') {
        if (node.parentNode && node.parentNode !== virtualRoot) {
            if (!edge) {
                edge = symbolEl.__edge = new graphic.BezierCurve({
                    shape: getEdgeShape(seriesScope, sourceOldLayout, sourceOldLayout),
                    style: zrUtil.defaults({opacity: 0, strokeNoScale: true}, seriesScope.lineStyle)
                });
            }

            graphic.updateProps(edge, {
                shape: getEdgeShape(seriesScope, sourceLayout, targetLayout),
                style: {opacity: 1}
            }, seriesModel);
        }
    }
    else if (edgeShape === 'polyline') {
        if (seriesScope.layout === 'orthogonal') {
            if (node !== virtualRoot && node.children && (node.children.length !== 0) && (node.isExpand === true)) {
                var children = node.children;
                var childPoints = [];
                for (var i = 0; i < children.length; i++) {
                    var childLayout = children[i].getLayout();
                    childPoints.push([childLayout.x, childLayout.y]);
                }

486
                if (!edge) {
D
deqingli 已提交
487 488 489 490 491 492 493
                    edge = symbolEl.__edge = new TreeShape({
                        shape: {
                            parentPoint: [targetLayout.x, targetLayout.y],
                            childPoints: [[targetLayout.x, targetLayout.y]],
                            orient: seriesScope.orient,
                            forkPosition: seriesScope.edgeForkPosition
                        },
494 495 496 497
                        style: zrUtil.defaults({opacity: 0, strokeNoScale: true}, seriesScope.lineStyle)
                    });
                }
                graphic.updateProps(edge, {
D
deqingli 已提交
498 499 500 501
                    shape: {
                        parentPoint: [targetLayout.x, targetLayout.y],
                        childPoints: childPoints
                    },
502 503 504 505
                    style: {opacity: 1}
                }, seriesModel);
            }
        }
D
deqingli 已提交
506 507 508
        else {
            if (__DEV__) {
                throw new Error('The polyline edgeShape can only be used in orthogonal layout');
509 510
            }
        }
D
deqingli 已提交
511 512
    }
    group.add(edge);
S
sushuang 已提交
513 514 515 516 517 518 519 520 521
}

function removeNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {
    var node = data.tree.getNodeByDataIndex(dataIndex);
    var virtualRoot = data.tree.root;
    var itemModel = node.getModel();
    var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);

    var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
522
    var edgeShape = seriesScope.edgeShape;
S
sushuang 已提交
523 524 525
    var sourceLayout;
    while (sourceLayout = source.getLayout(), sourceLayout == null) {
        source = source.parentNode === virtualRoot ? source : source.parentNode || source;
D
deqingli 已提交
526
    }
D
deqingli 已提交
527

S
sushuang 已提交
528 529 530 531 532 533
    graphic.updateProps(symbolEl, {
        position: [sourceLayout.x + 1, sourceLayout.y + 1]
    }, seriesModel, function () {
        group.remove(symbolEl);
        data.setItemGraphicEl(dataIndex, null);
    });
D
deqingli 已提交
534

S
sushuang 已提交
535
    symbolEl.fadeOut(null, {keepLabel: true});
D
deqingli 已提交
536

537 538
    var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);
    var sourceEdge = sourceSymbolEl.__edge;
539 540 541 542 543 544 545 546

    // 1. when expand the sub tree, delete the children node should delete the edge of
    // the source at the same time. because the polyline edge shape is only owned by the source.
    // 2.when the node is the only children of the source, delete the node should delete the edge of
    // the source at the same time. the same reason as above.
    var edge = symbolEl.__edge
        || ((source.isExpand === false || source.children.length === 1) ? sourceEdge : undefined);

547
    var edgeShape = seriesScope.edgeShape;
548

S
sushuang 已提交
549
    if (edge) {
550
        if (edgeShape === 'curve') {
551 552 553 554 555 556 557 558 559
            graphic.updateProps(edge, {
                shape: getEdgeShape(seriesScope, sourceLayout, sourceLayout),
                style: {
                    opacity: 0
                }
            }, seriesModel, function () {
                group.remove(edge);
            });
        }
560
        else if (edgeShape === 'polyline' && seriesScope.layout === 'orthogonal') {
561 562 563
            graphic.updateProps(edge, {
                shape: {
                    parentPoint: [sourceLayout.x, sourceLayout.y],
564
                    childPoints: [[sourceLayout.x, sourceLayout.y]]
565 566 567 568 569 570 571 572 573
                },
                style: {
                    opacity: 0
                }
            }, seriesModel, function () {
                group.remove(edge);
            });
        }
    }
S
sushuang 已提交
574 575 576 577 578 579 580 581
}

function getEdgeShape(seriesScope, sourceLayout, targetLayout) {
    var cpx1;
    var cpy1;
    var cpx2;
    var cpy2;
    var orient = seriesScope.orient;
D
deqingli 已提交
582 583 584 585
    var x1;
    var x2;
    var y1;
    var y2;
S
sushuang 已提交
586 587

    if (seriesScope.layout === 'radial') {
D
deqingli 已提交
588 589 590 591
        x1 = sourceLayout.rawX;
        y1 = sourceLayout.rawY;
        x2 = targetLayout.rawX;
        y2 = targetLayout.rawY;
S
sushuang 已提交
592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608

        var radialCoor1 = radialCoordinate(x1, y1);
        var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * seriesScope.curvature);
        var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * seriesScope.curvature);
        var radialCoor4 = radialCoordinate(x2, y2);

        return {
            x1: radialCoor1.x,
            y1: radialCoor1.y,
            x2: radialCoor4.x,
            y2: radialCoor4.y,
            cpx1: radialCoor2.x,
            cpy1: radialCoor2.y,
            cpx2: radialCoor3.x,
            cpy2: radialCoor3.y
        };
    }
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
    else {
        x1 = sourceLayout.x;
        y1 = sourceLayout.y;
        x2 = targetLayout.x;
        y2 = targetLayout.y;

        if (orient === 'LR' || orient === 'RL') {
            cpx1 = x1 + (x2 - x1) * seriesScope.curvature;
            cpy1 = y1;
            cpx2 = x2 + (x1 - x2) * seriesScope.curvature;
            cpy2 = y2;
        }
        if (orient === 'TB' || orient === 'BT') {
            cpx1 = x1;
            cpy1 = y1 + (y2 - y1) * seriesScope.curvature;
            cpx2 = x2;
            cpy2 = y2 + (y1 - y2) * seriesScope.curvature;
        }
D
deqingli 已提交
627
    }
D
deqingli 已提交
628 629 630 631 632 633 634 635 636 637 638 639

    return {
        x1: x1,
        y1: y1,
        x2: x2,
        y2: y2,
        cpx1: cpx1,
        cpy1: cpy1,
        cpx2: cpx2,
        cpy2: cpy2
    };

640
}