@itwin/core-frontend
Version:
iTwin.js frontend components
130 lines • 6.98 kB
JavaScript
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Tiles
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MapTiledGraphicsProvider = void 0;
const core_common_1 = require("@itwin/core-common");
const internal_1 = require("../internal");
const IModelApp_1 = require("../../IModelApp");
/** @internal */
class MapTiledGraphicsProvider {
backgroundMap;
overlayMap;
backgroundDrapeMap;
_detachFromDisplayStyle = [];
*getReferences(viewport) {
if (viewport.viewFlags.backgroundMap) {
yield this.backgroundMap;
yield this.overlayMap;
}
}
forEachTileTreeRef(viewport, func) {
if (viewport.viewFlags.backgroundMap) {
func(this.backgroundMap);
func(this.overlayMap);
}
}
constructor(viewportId, displayStyle) {
const mapSettings = displayStyle.backgroundMapSettings;
const mapImagery = displayStyle.settings.mapImagery;
this.backgroundMap = new internal_1.MapTileTreeReference(mapSettings, mapImagery.backgroundBase, mapImagery.backgroundLayers, displayStyle.iModel, viewportId, false, false, () => displayStyle.overrideTerrainDisplay());
this.overlayMap = new internal_1.MapTileTreeReference(mapSettings, undefined, mapImagery.overlayLayers, displayStyle.iModel, viewportId, true, false);
this.backgroundDrapeMap = new internal_1.MapTileTreeReference(mapSettings, mapImagery.backgroundBase, mapImagery.backgroundLayers, displayStyle.iModel, viewportId, false, true);
const removals = this._detachFromDisplayStyle;
removals.push(displayStyle.settings.onBackgroundMapChanged.addListener((settings) => {
this.backgroundMap.settings = settings;
this.overlayMap.settings = settings;
this.backgroundDrapeMap.settings = settings;
}));
removals.push(displayStyle.settings.onMapImageryChanged.addListener((imagery) => {
this.backgroundMap.layerRefHandler.setBaseLayerSettings(imagery.backgroundBase);
this.backgroundMap.layerRefHandler.setLayerSettings(imagery.backgroundLayers);
this.backgroundDrapeMap.layerRefHandler.setBaseLayerSettings(mapImagery.backgroundBase);
this.backgroundDrapeMap.layerRefHandler.setLayerSettings(mapImagery.backgroundLayers);
this.overlayMap.layerRefHandler.setLayerSettings(imagery.overlayLayers);
}));
// We need to clear imagery tiles assigned to map tiles every time a new ImageryTileTree is loaded,
// otherwise the imagery tiles won't refresh correctly.
const clearMapLayers = (loadedTileTree, mapTileTreeToClear) => {
const trees = new internal_1.DisclosedTileTreeSet();
mapTileTreeToClear.discloseTileTrees(trees);
if (trees.has(loadedTileTree)) {
mapTileTreeToClear.layerRefHandler.clearLayers();
}
};
removals.push(IModelApp_1.IModelApp.tileAdmin.onTileTreeLoad.addListener((tileTree) => {
if (tileTree.tileTree !== undefined) {
clearMapLayers(tileTree.tileTree, this.backgroundMap);
clearMapLayers(tileTree.tileTree, this.overlayMap);
}
}));
}
// This is used in inital view setup and when views are synchronized. If view is being synchronized
// we need to clear the layers which purges tile graphics if the settings or layers are changed.
setView(newView) {
const layersMatch = ((layers1, layers2) => {
if (layers1.length !== layers2.length)
return false;
for (let i = 0; i < layers1.length; i++)
if (!layers1[i].displayMatches(layers2[i]))
return false;
return true;
});
const mapImagery = newView.displayStyle.settings.mapImagery;
if (!newView.displayStyle.backgroundMapSettings.equals(this.backgroundMap.settings)
|| !layersMatch(mapImagery.backgroundLayers, this.backgroundMap.layerSettings)
|| (mapImagery.backgroundBase instanceof core_common_1.BaseMapLayerSettings && !layersMatch([mapImagery.backgroundBase], this.backgroundDrapeMap.layerSettings))) {
this.backgroundMap.layerRefHandler.clearLayers();
this.backgroundDrapeMap.layerRefHandler.clearLayers();
}
if (!layersMatch(mapImagery.overlayLayers, this.overlayMap.layerSettings))
this.overlayMap.layerRefHandler.clearLayers();
}
detachFromDisplayStyle() {
this._detachFromDisplayStyle.forEach((f) => f());
this._detachFromDisplayStyle.length = 0;
}
/** @internal */
getMapLayerImageryProvider(mapLayerIndex) {
const imageryTreeRef = mapLayerIndex.isOverlay ? this.overlayMap.getLayerImageryTreeRef(mapLayerIndex.index) : this.backgroundMap.getLayerImageryTreeRef(mapLayerIndex.index);
return imageryTreeRef?.imageryProvider;
}
resetMapLayer(mapLayerIndex) {
const imageryTreeRef = mapLayerIndex.isOverlay ? this.overlayMap.getLayerImageryTreeRef(mapLayerIndex.index) : this.backgroundMap.getLayerImageryTreeRef(mapLayerIndex.index);
imageryTreeRef?.resetTreeOwner();
}
/** Return a list of map-layers indexes matching a given MapTile tree Id and a layer imagery tree id.
* @internal
*/
getMapLayerIndexesFromIds(mapTreeId, layerTreeId) {
const layers = new Array();
if (mapTreeId === this.backgroundMap.treeOwner.tileTree?.id) {
for (let i = 0; i < this.backgroundMap.layerSettings.length; i++) {
if (this.backgroundMap.getLayerImageryTreeRef(i)?.treeOwner.tileTree?.id === layerTreeId) {
layers.push({ index: i, isOverlay: false });
}
}
}
else if (mapTreeId === this.overlayMap.treeOwner.tileTree?.id) {
for (let i = 0; i < this.overlayMap.layerSettings.length; i++) {
if (this.overlayMap.getLayerImageryTreeRef(i)?.treeOwner.tileTree?.id === layerTreeId) {
layers.push({ index: i, isOverlay: true });
}
}
}
return layers;
}
/** @internal */
mapLayerFromIds(mapTreeId, layerTreeId) {
const bgMapLayers = this.backgroundMap.layerFromTreeModelIds(mapTreeId, layerTreeId);
const ovlMapLayers = this.overlayMap.layerFromTreeModelIds(mapTreeId, layerTreeId);
return [...bgMapLayers, ...ovlMapLayers];
}
}
exports.MapTiledGraphicsProvider = MapTiledGraphicsProvider;
//# sourceMappingURL=MapTiledGraphicsProvider.js.map