define(function (require) { var SymbolDraw = require('../helper/SymbolDraw'); var LineDraw = require('../helper/LineDraw'); var RoamController = require('../../component/helper/RoamController'); require('../../echarts').extendChartView({ type: 'graph', init: function (ecModel, api) { var symbolDraw = new SymbolDraw(); var lineDraw = new LineDraw(); var group = this.group; group.add(symbolDraw.group); group.add(lineDraw.group); this._symbolDraw = symbolDraw; this._lineDraw = lineDraw; this._controller = new RoamController(api.getZr(), group); }, render: function (seriesModel, ecModel, api) { var coordSys = seriesModel.coordinateSystem; // Only support view and geo coordinate system if (coordSys.type !== 'geo' && coordSys.type !== 'view') { return; } var data = seriesModel.getData(); this._model = seriesModel; var symbolDraw = this._symbolDraw; var lineDraw = this._lineDraw; symbolDraw.updateData( data, seriesModel, api, false ); lineDraw.updateData( data.graph.edgeData, seriesModel, api, false, function (idx) { return data.graph.edges[idx].dataIndex >= 0; } ); // 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'); this._edgeScaleRatio = seriesModel.get('edgeScaleRatio'); this._updateNodeAndLinkScale(); var controller = this._controller; controller.rect = coordSys.getViewRect(); controller.disable(); seriesModel.get('roam') && controller.enable(); controller.on('zoom', this._updateNodeAndLinkScale, this); }, _updateNodeAndLinkScale: function () { var seriesModel = this._model; var data = seriesModel.getData(); var group = this.group; var nodeScaleRatio = this._nodeScaleRatio; var edgeScaleRatio = this._edgeScaleRatio; // Assume scale aspect is 1 var groupScale = group.scale[0]; var nodeScale = (groupScale - 1) * nodeScaleRatio + 1; var edgeScale = (groupScale - 1) * edgeScaleRatio + 1; var invScale = [ nodeScale / groupScale, nodeScale / groupScale ]; data.eachItemGraphicEl(function (el, idx) { el.attr('scale', invScale); }); data.graph.eachEdge(function (edge) { edge.getGraphicEl().setStyle( 'lineWidth', edge.__lineWidth * edgeScale / groupScale ); }); }, updateLayout: function (seriesModel, ecModel) { this._symbolDraw.updateLayout(); this._lineDraw.updateLayout(); }, remove: function (ecModel, api) { this._symbolDraw.remove(); this._lineDraw.remove(); } }); });