GraphView.js 5.1 KB
Newer Older
L
lang 已提交
1

L
lang 已提交
2 3
define(function (require) {

L
lang 已提交
4 5
    var SymbolDraw = require('../helper/SymbolDraw');
    var LineDraw = require('../helper/LineDraw');
L
lang 已提交
6
    var RoamController = require('../../component/helper/RoamController');
L
lang 已提交
7

L
lang 已提交
8 9
    var modelUtil = require('../../util/model');

L
lang 已提交
10 11 12 13
    require('../../echarts').extendChartView({

        type: 'graph',

L
lang 已提交
14
        init: function (ecModel, api) {
L
lang 已提交
15
            var symbolDraw = new SymbolDraw();
L
lang 已提交
16
            var lineDraw = new LineDraw();
L
lang 已提交
17
            var group = this.group;
L
lang 已提交
18

L
lang 已提交
19 20
            var controller = new RoamController(api.getZr(), group);

L
lang 已提交
21 22
            group.add(symbolDraw.group);
            group.add(lineDraw.group);
L
lang 已提交
23

L
lang 已提交
24
            this._symbolDraw = symbolDraw;
L
lang 已提交
25
            this._lineDraw = lineDraw;
L
lang 已提交
26
            this._controller = controller;
L
lang 已提交
27 28 29
        },

        render: function (seriesModel, ecModel, api) {
L
lang 已提交
30 31 32 33 34 35
            var coordSys = seriesModel.coordinateSystem;
            // Only support view and geo coordinate system
            if (coordSys.type !== 'geo' && coordSys.type !== 'view') {
                return;
            }

L
lang 已提交
36
            var data = seriesModel.getData();
L
lang 已提交
37
            this._model = seriesModel;
L
lang 已提交
38

L
lang 已提交
39 40 41
            var symbolDraw = this._symbolDraw;
            var lineDraw = this._lineDraw;

42
            symbolDraw.updateData(data);
L
lang 已提交
43

L
lang 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
            var edgeData = data.graph.edgeData;
            var rawOption = seriesModel.option;
            var formatModel = modelUtil.createDataFormatModel(
                seriesModel, edgeData, rawOption.edges || rawOption.links
            );
            formatModel.formatTooltip = function (dataIndex) {
                var params = this.getDataParams(dataIndex);
                var rawDataOpt = params.data;
                var html = rawDataOpt.source + ' > ' + rawDataOpt.target;
                if (params.value) {
                    html += ':' + params.value;
                }
                return html;
            };
            lineDraw.updateData(edgeData, null, null);
            edgeData.eachItemGraphicEl(function (el) {
                el.traverse(function (child) {
                    child.hostModel = formatModel;
                });
            });

L
lang 已提交
65

L
lang 已提交
66 67 68 69 70 71 72 73 74 75 76 77
            // Save the original lineWidth
            data.graph.eachEdge(function (edge) {
                edge.__lineWidth = edge.getModel('lineStyle.normal').get('width');
            });

            var group = this.group;
            group.attr({
                position: coordSys.position,
                scale: coordSys.scale
            });

            this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');
L
lang 已提交
78
            // this._edgeScaleRatio = seriesModel.get('edgeScaleRatio');
L
lang 已提交
79 80 81

            this._updateNodeAndLinkScale();

L
lang 已提交
82 83 84 85
            this._updateController(seriesModel, coordSys, api);
        },

        _updateController: function (seriesModel, coordSys, api) {
L
lang 已提交
86 87 88
            var controller = this._controller;
            controller.rect = coordSys.getViewRect();

L
lang 已提交
89
            controller.enable(seriesModel.get('roam'));
L
lang 已提交
90 91 92 93 94

            controller
                .off('pan')
                .off('zoom')
                .on('pan', function (dx, dy) {
L
lang 已提交
95
                    api.dispatchAction({
P
pah100 已提交
96
                        seriesId: seriesModel.id,
L
lang 已提交
97 98 99 100 101 102
                        type: 'graphRoam',
                        dx: dx,
                        dy: dy
                    });
                })
                .on('zoom', function (zoom, mouseX, mouseY) {
L
lang 已提交
103
                    api.dispatchAction({
P
pah100 已提交
104
                        seriesId: seriesModel.id,
L
lang 已提交
105 106 107 108 109 110 111
                        type: 'graphRoam',
                        zoom:  zoom,
                        originX: mouseX,
                        originY: mouseY
                    });
                })
                .on('zoom', this._updateNodeAndLinkScale, this);
L
lang 已提交
112 113 114 115 116 117 118 119
        },

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

            var group = this.group;
            var nodeScaleRatio = this._nodeScaleRatio;
L
lang 已提交
120
            // var edgeScaleRatio = this._edgeScaleRatio;
L
lang 已提交
121 122 123 124 125

            // Assume scale aspect is 1
            var groupScale = group.scale[0];

            var nodeScale = (groupScale - 1) * nodeScaleRatio + 1;
L
lang 已提交
126
            // var edgeScale = (groupScale - 1) * edgeScaleRatio + 1;
L
lang 已提交
127 128 129 130 131
            var invScale = [
                nodeScale / groupScale,
                nodeScale / groupScale
            ];

L
lang 已提交
132
            data.eachItemGraphicEl(function (el, idx) {
L
lang 已提交
133 134
                el.attr('scale', invScale);
            });
L
lang 已提交
135 136 137 138 139 140 141 142
            // data.graph.eachEdge(function (edge) {
            //     var lineGroup = edge.getGraphicEl();
            //     // FIXME
            //     lineGroup.childOfName('line').setStyle(
            //         'lineWidth',
            //         edge.__lineWidth * edgeScale / groupScale
            //     );
            // });
L
lang 已提交
143 144
        },

L
lang 已提交
145 146 147 148
        updateLayout: function (seriesModel, ecModel) {
            this._symbolDraw.updateLayout();
            this._lineDraw.updateLayout();
        },
L
lang 已提交
149

L
lang 已提交
150
        remove: function (ecModel, api) {
L
lang 已提交
151 152
            this._symbolDraw && this._symbolDraw.remove();
            this._lineDraw && this._lineDraw.remove();
L
lang 已提交
153 154 155
        }
    });
});