UNPKG

@itwin/core-frontend

Version:
130 lines 6.98 kB
"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