170 lines
5.7 KiB
JavaScript
170 lines
5.7 KiB
JavaScript
import Cartesian3D from './grid3D/Cartesian3D';
|
|
import Axis3D from './grid3D/Axis3D';
|
|
import * as echarts from 'echarts/lib/echarts';
|
|
import { getLayoutRect } from 'echarts/lib/util/layout';
|
|
import ViewGL from '../core/ViewGL';
|
|
import retrieve from '../util/retrieve';
|
|
|
|
function resizeCartesian3D(grid3DModel, api) {
|
|
// Use left/top/width/height
|
|
var boxLayoutOption = grid3DModel.getBoxLayoutParams();
|
|
var viewport = getLayoutRect(boxLayoutOption, {
|
|
width: api.getWidth(),
|
|
height: api.getHeight()
|
|
}); // Flip Y
|
|
|
|
viewport.y = api.getHeight() - viewport.y - viewport.height;
|
|
this.viewGL.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, api.getDevicePixelRatio());
|
|
var boxWidth = grid3DModel.get('boxWidth');
|
|
var boxHeight = grid3DModel.get('boxHeight');
|
|
var boxDepth = grid3DModel.get('boxDepth');
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
['x', 'y', 'z'].forEach(function (dim) {
|
|
if (!this.getAxis(dim)) {
|
|
throw new Error('Grid' + grid3DModel.id + ' don\'t have ' + dim + 'Axis');
|
|
}
|
|
}, this);
|
|
}
|
|
|
|
this.getAxis('x').setExtent(-boxWidth / 2, boxWidth / 2); // From near to far
|
|
|
|
this.getAxis('y').setExtent(boxDepth / 2, -boxDepth / 2);
|
|
this.getAxis('z').setExtent(-boxHeight / 2, boxHeight / 2);
|
|
this.size = [boxWidth, boxHeight, boxDepth];
|
|
}
|
|
|
|
function updateCartesian3D(ecModel, api) {
|
|
var dataExtents = {};
|
|
|
|
function unionDataExtents(dim, extent) {
|
|
dataExtents[dim] = dataExtents[dim] || [Infinity, -Infinity];
|
|
dataExtents[dim][0] = Math.min(extent[0], dataExtents[dim][0]);
|
|
dataExtents[dim][1] = Math.max(extent[1], dataExtents[dim][1]);
|
|
} // Get data extents for scale.
|
|
|
|
|
|
ecModel.eachSeries(function (seriesModel) {
|
|
if (seriesModel.coordinateSystem !== this) {
|
|
return;
|
|
}
|
|
|
|
var data = seriesModel.getData();
|
|
['x', 'y', 'z'].forEach(function (coordDim) {
|
|
data.mapDimensionsAll(coordDim, true).forEach(function (dataDim) {
|
|
unionDataExtents(coordDim, data.getDataExtent(dataDim, true));
|
|
});
|
|
});
|
|
}, this);
|
|
['xAxis3D', 'yAxis3D', 'zAxis3D'].forEach(function (axisType) {
|
|
ecModel.eachComponent(axisType, function (axisModel) {
|
|
var dim = axisType.charAt(0);
|
|
var grid3DModel = axisModel.getReferringComponents('grid3D').models[0];
|
|
var cartesian3D = grid3DModel.coordinateSystem;
|
|
|
|
if (cartesian3D !== this) {
|
|
return;
|
|
}
|
|
|
|
var axis = cartesian3D.getAxis(dim);
|
|
|
|
if (axis) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.warn('Can\'t have two %s in one grid3D', axisType);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
var scale = echarts.helper.createScale(dataExtents[dim] || [Infinity, -Infinity], axisModel);
|
|
axis = new Axis3D(dim, scale);
|
|
axis.type = axisModel.get('type');
|
|
var isCategory = axis.type === 'category';
|
|
axis.onBand = isCategory && axisModel.get('boundaryGap');
|
|
axis.inverse = axisModel.get('inverse');
|
|
axisModel.axis = axis;
|
|
axis.model = axisModel; // override `echarts/coord/Axis#getLabelModel`
|
|
|
|
axis.getLabelModel = function () {
|
|
return axisModel.getModel('axisLabel', grid3DModel.getModel('axisLabel'));
|
|
}; // override `echarts/coord/Axis#getTickModel`
|
|
|
|
|
|
axis.getTickModel = function () {
|
|
return axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));
|
|
};
|
|
|
|
cartesian3D.addAxis(axis);
|
|
}, this);
|
|
}, this);
|
|
this.resize(this.model, api);
|
|
}
|
|
|
|
var grid3DCreator = {
|
|
dimensions: Cartesian3D.prototype.dimensions,
|
|
create: function (ecModel, api) {
|
|
var cartesian3DList = [];
|
|
ecModel.eachComponent('grid3D', function (grid3DModel) {
|
|
// FIXME
|
|
grid3DModel.__viewGL = grid3DModel.__viewGL || new ViewGL();
|
|
var cartesian3D = new Cartesian3D();
|
|
cartesian3D.model = grid3DModel;
|
|
cartesian3D.viewGL = grid3DModel.__viewGL;
|
|
grid3DModel.coordinateSystem = cartesian3D;
|
|
cartesian3DList.push(cartesian3D); // Inject resize and update
|
|
|
|
cartesian3D.resize = resizeCartesian3D;
|
|
cartesian3D.update = updateCartesian3D;
|
|
});
|
|
var axesTypes = ['xAxis3D', 'yAxis3D', 'zAxis3D'];
|
|
|
|
function findAxesModels(seriesModel, ecModel) {
|
|
return axesTypes.map(function (axisType) {
|
|
var axisModel = seriesModel.getReferringComponents(axisType).models[0];
|
|
|
|
if (axisModel == null) {
|
|
axisModel = ecModel.getComponent(axisType);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!axisModel) {
|
|
throw new Error(axisType + ' "' + retrieve.firstNotNull(seriesModel.get(axisType + 'Index'), seriesModel.get(axisType + 'Id'), 0) + '" not found');
|
|
}
|
|
}
|
|
|
|
return axisModel;
|
|
});
|
|
}
|
|
|
|
ecModel.eachSeries(function (seriesModel) {
|
|
if (seriesModel.get('coordinateSystem') !== 'cartesian3D') {
|
|
return;
|
|
}
|
|
|
|
var firstGridModel = seriesModel.getReferringComponents('grid3D').models[0];
|
|
|
|
if (firstGridModel == null) {
|
|
var axesModels = findAxesModels(seriesModel, ecModel);
|
|
var firstGridModel = axesModels[0].getCoordSysModel();
|
|
axesModels.forEach(function (axisModel) {
|
|
var grid3DModel = axisModel.getCoordSysModel();
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!grid3DModel) {
|
|
throw new Error('grid3D "' + retrieve.firstNotNull(axisModel.get('gridIndex'), axisModel.get('gridId'), 0) + '" not found');
|
|
}
|
|
|
|
if (grid3DModel !== firstGridModel) {
|
|
throw new Error('xAxis3D, yAxis3D, zAxis3D must use the same grid');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
var coordSys = firstGridModel.coordinateSystem;
|
|
seriesModel.coordinateSystem = coordSys;
|
|
});
|
|
return cartesian3DList;
|
|
}
|
|
};
|
|
export default grid3DCreator; |