You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
3.1 KiB
85 lines
3.1 KiB
import retrieve from '../../util/retrieve';
|
|
import graphicGL from '../../util/graphicGL';
|
|
import ViewGL from '../../core/ViewGL';
|
|
export default function (serviceComponentType, ServiceCtor, afterCreate) {
|
|
function resizeMapService3D(mapService3DModel, api) {
|
|
var width = api.getWidth();
|
|
var height = api.getHeight();
|
|
var dpr = api.getDevicePixelRatio();
|
|
this.viewGL.setViewport(0, 0, width, height, dpr);
|
|
this.width = width;
|
|
this.height = height;
|
|
this.altitudeScale = mapService3DModel.get('altitudeScale');
|
|
this.boxHeight = mapService3DModel.get('boxHeight'); // this.updateTransform();
|
|
}
|
|
|
|
function updateService3D(ecModel, api) {
|
|
if (this.model.get('boxHeight') === 'auto') {
|
|
return;
|
|
}
|
|
|
|
var altitudeDataExtent = [Infinity, -Infinity];
|
|
ecModel.eachSeries(function (seriesModel) {
|
|
if (seriesModel.coordinateSystem !== this) {
|
|
return;
|
|
} // Get altitude data extent.
|
|
|
|
|
|
var data = seriesModel.getData();
|
|
var altDim = seriesModel.coordDimToDataDim('alt')[0];
|
|
|
|
if (altDim) {
|
|
// TODO altitiude is in coords of lines.
|
|
var dataExtent = data.getDataExtent(altDim, true);
|
|
altitudeDataExtent[0] = Math.min(altitudeDataExtent[0], dataExtent[0]);
|
|
altitudeDataExtent[1] = Math.max(altitudeDataExtent[1], dataExtent[1]);
|
|
}
|
|
}, this);
|
|
|
|
if (altitudeDataExtent && isFinite(altitudeDataExtent[1] - altitudeDataExtent[0])) {
|
|
this.altitudeExtent = altitudeDataExtent;
|
|
}
|
|
}
|
|
|
|
return {
|
|
dimensions: ServiceCtor.prototype.dimensions,
|
|
create: function (ecModel, api) {
|
|
var mapService3DList = [];
|
|
ecModel.eachComponent(serviceComponentType, function (mapService3DModel) {
|
|
var viewGL = mapService3DModel.__viewGL;
|
|
|
|
if (!viewGL) {
|
|
viewGL = mapService3DModel.__viewGL = new ViewGL();
|
|
viewGL.setRootNode(new graphicGL.Node());
|
|
}
|
|
|
|
var mapService3DCoordSys = new ServiceCtor();
|
|
mapService3DCoordSys.viewGL = mapService3DModel.__viewGL; // Inject resize
|
|
|
|
mapService3DCoordSys.resize = resizeMapService3D;
|
|
mapService3DCoordSys.resize(mapService3DModel, api);
|
|
mapService3DList.push(mapService3DCoordSys);
|
|
mapService3DModel.coordinateSystem = mapService3DCoordSys;
|
|
mapService3DCoordSys.model = mapService3DModel;
|
|
mapService3DCoordSys.update = updateService3D;
|
|
});
|
|
ecModel.eachSeries(function (seriesModel) {
|
|
if (seriesModel.get('coordinateSystem') === serviceComponentType) {
|
|
var mapService3DModel = seriesModel.getReferringComponents(serviceComponentType).models[0];
|
|
|
|
if (!mapService3DModel) {
|
|
mapService3DModel = ecModel.getComponent(serviceComponentType);
|
|
}
|
|
|
|
if (!mapService3DModel) {
|
|
throw new Error(serviceComponentType + ' "' + retrieve.firstNotNull(seriesModel.get(serviceComponentType + 'Index'), seriesModel.get(serviceComponentType + 'Id'), 0) + '" not found');
|
|
}
|
|
|
|
seriesModel.coordinateSystem = mapService3DModel.coordinateSystem;
|
|
}
|
|
});
|
|
afterCreate && afterCreate(mapService3DList, ecModel, api);
|
|
return mapService3DList;
|
|
}
|
|
};
|
|
} |