119 lines
3.8 KiB
JavaScript
119 lines
3.8 KiB
JavaScript
import * as echarts from 'echarts/lib/echarts';
|
|
import graphicGL from '../../util/graphicGL';
|
|
import retrieve from '../../util/retrieve';
|
|
import format from '../../util/format';
|
|
import PointsBuilder from '../common/PointsBuilder';
|
|
export default echarts.ChartView.extend({
|
|
type: 'scatter3D',
|
|
hasSymbolVisual: true,
|
|
__ecgl__: true,
|
|
init: function (ecModel, api) {
|
|
this.groupGL = new graphicGL.Node();
|
|
this._pointsBuilderList = [];
|
|
this._currentStep = 0;
|
|
},
|
|
render: function (seriesModel, ecModel, api) {
|
|
this.groupGL.removeAll();
|
|
|
|
if (!seriesModel.getData().count()) {
|
|
return;
|
|
}
|
|
|
|
var coordSys = seriesModel.coordinateSystem;
|
|
|
|
if (coordSys && coordSys.viewGL) {
|
|
coordSys.viewGL.add(this.groupGL);
|
|
this._camera = coordSys.viewGL.camera;
|
|
var pointsBuilder = this._pointsBuilderList[0];
|
|
|
|
if (!pointsBuilder) {
|
|
pointsBuilder = this._pointsBuilderList[0] = new PointsBuilder(false, api);
|
|
}
|
|
|
|
this._pointsBuilderList.length = 1;
|
|
this.groupGL.add(pointsBuilder.rootNode);
|
|
pointsBuilder.update(seriesModel, ecModel, api);
|
|
pointsBuilder.updateView(coordSys.viewGL.camera);
|
|
} else {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
throw new Error('Invalid coordinate system');
|
|
}
|
|
}
|
|
},
|
|
incrementalPrepareRender: function (seriesModel, ecModel, api) {
|
|
var coordSys = seriesModel.coordinateSystem;
|
|
|
|
if (coordSys && coordSys.viewGL) {
|
|
coordSys.viewGL.add(this.groupGL);
|
|
this._camera = coordSys.viewGL.camera;
|
|
} else {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
throw new Error('Invalid coordinate system');
|
|
}
|
|
}
|
|
|
|
this.groupGL.removeAll();
|
|
this._currentStep = 0;
|
|
},
|
|
incrementalRender: function (params, seriesModel, ecModel, api) {
|
|
// TODO Sort transparency.
|
|
if (params.end <= params.start) {
|
|
return;
|
|
}
|
|
|
|
var pointsBuilder = this._pointsBuilderList[this._currentStep];
|
|
|
|
if (!pointsBuilder) {
|
|
pointsBuilder = new PointsBuilder(false, api);
|
|
this._pointsBuilderList[this._currentStep] = pointsBuilder;
|
|
}
|
|
|
|
this.groupGL.add(pointsBuilder.rootNode);
|
|
pointsBuilder.update(seriesModel, ecModel, api, params.start, params.end);
|
|
pointsBuilder.updateView(seriesModel.coordinateSystem.viewGL.camera);
|
|
this._currentStep++;
|
|
},
|
|
updateCamera: function () {
|
|
this._pointsBuilderList.forEach(function (pointsBuilder) {
|
|
pointsBuilder.updateView(this._camera);
|
|
}, this);
|
|
},
|
|
highlight: function (seriesModel, ecModel, api, payload) {
|
|
this._toggleStatus('highlight', seriesModel, ecModel, api, payload);
|
|
},
|
|
downplay: function (seriesModel, ecModel, api, payload) {
|
|
this._toggleStatus('downplay', seriesModel, ecModel, api, payload);
|
|
},
|
|
_toggleStatus: function (status, seriesModel, ecModel, api, payload) {
|
|
var data = seriesModel.getData();
|
|
var dataIndex = retrieve.queryDataIndex(data, payload);
|
|
var isHighlight = status === 'highlight';
|
|
|
|
if (dataIndex != null) {
|
|
echarts.util.each(format.normalizeToArray(dataIndex), function (dataIdx) {
|
|
for (var i = 0; i < this._pointsBuilderList.length; i++) {
|
|
var pointsBuilder = this._pointsBuilderList[i];
|
|
isHighlight ? pointsBuilder.highlight(data, dataIdx) : pointsBuilder.downplay(data, dataIdx);
|
|
}
|
|
}, this);
|
|
} else {
|
|
// PENDING, OPTIMIZE
|
|
data.each(function (dataIdx) {
|
|
for (var i = 0; i < this._pointsBuilderList.length; i++) {
|
|
var pointsBuilder = this._pointsBuilderList[i];
|
|
isHighlight ? pointsBuilder.highlight(data, dataIdx) : pointsBuilder.downplay(data, dataIdx);
|
|
}
|
|
});
|
|
}
|
|
},
|
|
dispose: function () {
|
|
this._pointsBuilderList.forEach(function (pointsBuilder) {
|
|
pointsBuilder.dispose();
|
|
});
|
|
|
|
this.groupGL.removeAll();
|
|
},
|
|
remove: function () {
|
|
this.groupGL.removeAll();
|
|
}
|
|
}); |