@itwin/core-frontend 3.2.2 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -1
- package/lib/cjs/DisplayStyleState.d.ts +68 -17
- package/lib/cjs/DisplayStyleState.d.ts.map +1 -1
- package/lib/cjs/DisplayStyleState.js +66 -20
- package/lib/cjs/DisplayStyleState.js.map +1 -1
- package/lib/cjs/extension/ExtensionAdmin.d.ts +5 -2
- package/lib/cjs/extension/ExtensionAdmin.d.ts.map +1 -1
- package/lib/cjs/extension/ExtensionAdmin.js +24 -6
- package/lib/cjs/extension/ExtensionAdmin.js.map +1 -1
- package/lib/cjs/extension/providers/ExtensionServiceClient.d.ts +8 -6
- package/lib/cjs/extension/providers/ExtensionServiceClient.d.ts.map +1 -1
- package/lib/cjs/extension/providers/ExtensionServiceClient.js +13 -6
- package/lib/cjs/extension/providers/ExtensionServiceClient.js.map +1 -1
- package/lib/cjs/extension/providers/RemoteExtensionProvider.d.ts +0 -2
- package/lib/cjs/extension/providers/RemoteExtensionProvider.d.ts.map +1 -1
- package/lib/cjs/extension/providers/RemoteExtensionProvider.js +9 -22
- package/lib/cjs/extension/providers/RemoteExtensionProvider.js.map +1 -1
- package/lib/cjs/extension/providers/ServiceExtensionProvider.d.ts +4 -6
- package/lib/cjs/extension/providers/ServiceExtensionProvider.d.ts.map +1 -1
- package/lib/cjs/extension/providers/ServiceExtensionProvider.js +11 -22
- package/lib/cjs/extension/providers/ServiceExtensionProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +46 -2
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapCartoRectangle.d.ts +1 -0
- package/lib/cjs/tile/map/MapCartoRectangle.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapCartoRectangle.js +1 -0
- package/lib/cjs/tile/map/MapCartoRectangle.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts +2 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +2 -0
- package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.js +23 -9
- package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerSources.d.ts +14 -9
- package/lib/cjs/tile/map/MapLayerSources.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerSources.js +14 -6
- package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
- package/lib/esm/DisplayStyleState.d.ts +68 -17
- package/lib/esm/DisplayStyleState.d.ts.map +1 -1
- package/lib/esm/DisplayStyleState.js +66 -20
- package/lib/esm/DisplayStyleState.js.map +1 -1
- package/lib/esm/extension/ExtensionAdmin.d.ts +5 -2
- package/lib/esm/extension/ExtensionAdmin.d.ts.map +1 -1
- package/lib/esm/extension/ExtensionAdmin.js +24 -6
- package/lib/esm/extension/ExtensionAdmin.js.map +1 -1
- package/lib/esm/extension/providers/ExtensionServiceClient.d.ts +8 -6
- package/lib/esm/extension/providers/ExtensionServiceClient.d.ts.map +1 -1
- package/lib/esm/extension/providers/ExtensionServiceClient.js +13 -6
- package/lib/esm/extension/providers/ExtensionServiceClient.js.map +1 -1
- package/lib/esm/extension/providers/RemoteExtensionProvider.d.ts +0 -2
- package/lib/esm/extension/providers/RemoteExtensionProvider.d.ts.map +1 -1
- package/lib/esm/extension/providers/RemoteExtensionProvider.js +9 -22
- package/lib/esm/extension/providers/RemoteExtensionProvider.js.map +1 -1
- package/lib/esm/extension/providers/ServiceExtensionProvider.d.ts +4 -6
- package/lib/esm/extension/providers/ServiceExtensionProvider.d.ts.map +1 -1
- package/lib/esm/extension/providers/ServiceExtensionProvider.js +11 -22
- package/lib/esm/extension/providers/ServiceExtensionProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +46 -2
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapCartoRectangle.d.ts +1 -0
- package/lib/esm/tile/map/MapCartoRectangle.d.ts.map +1 -1
- package/lib/esm/tile/map/MapCartoRectangle.js +1 -0
- package/lib/esm/tile/map/MapCartoRectangle.js.map +1 -1
- package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts +2 -1
- package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +2 -0
- package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.js +24 -10
- package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapLayerSources.d.ts +14 -9
- package/lib/esm/tile/map/MapLayerSources.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerSources.js +14 -6
- package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
- package/package.json +20 -20
|
@@ -129,9 +129,9 @@ export class DisplayStyleState extends ElementState {
|
|
|
129
129
|
}
|
|
130
130
|
/** @internal */
|
|
131
131
|
get globeMode() { return this.settings.backgroundMap.globeMode; }
|
|
132
|
-
/**
|
|
133
|
-
|
|
134
|
-
|
|
132
|
+
/** Settings controlling how the base map is displayed within a view.
|
|
133
|
+
* The base map can be provided by any map imagery source or set to be a single color.
|
|
134
|
+
*/
|
|
135
135
|
get backgroundMapBase() {
|
|
136
136
|
return this.settings.mapImagery.backgroundBase;
|
|
137
137
|
}
|
|
@@ -140,6 +140,8 @@ export class DisplayStyleState extends ElementState {
|
|
|
140
140
|
this._synchBackgroundMapImagery();
|
|
141
141
|
}
|
|
142
142
|
/** @internal */
|
|
143
|
+
get backgroundMapLayers() { return this.settings.mapImagery.backgroundLayers; }
|
|
144
|
+
/** @internal */
|
|
143
145
|
get overlayMapLayers() { return this.settings.mapImagery.overlayLayers; }
|
|
144
146
|
/** The settings controlling how a background map is displayed within a view.
|
|
145
147
|
* @see [[ViewFlags.backgroundMap]] for toggling display of the map on or off.
|
|
@@ -157,6 +159,7 @@ export class DisplayStyleState extends ElementState {
|
|
|
157
159
|
* ``` ts
|
|
158
160
|
* style.changeBackgroundMapProps({ groundBias: 16.2 });
|
|
159
161
|
* ```
|
|
162
|
+
* @public
|
|
160
163
|
*/
|
|
161
164
|
changeBackgroundMapProps(props) {
|
|
162
165
|
const newSettings = this.backgroundMapSettings.clone(props);
|
|
@@ -311,11 +314,21 @@ export class DisplayStyleState extends ElementState {
|
|
|
311
314
|
}
|
|
312
315
|
/** @internal */
|
|
313
316
|
getMapLayers(isOverlay) { return isOverlay ? this.overlayMapLayers : this.backgroundMapLayers; }
|
|
314
|
-
/**
|
|
315
|
-
|
|
316
|
-
|
|
317
|
+
/**
|
|
318
|
+
* Attach a map layer to display style.
|
|
319
|
+
* @param Settings representing the map layer.
|
|
320
|
+
* @param isOverlay true if layer is overlay, otherwise layer is background. Defaults to false.
|
|
321
|
+
* @param index where the layer should be inserted. Defaults to -1, appended to end.
|
|
322
|
+
* @public
|
|
323
|
+
*
|
|
324
|
+
*/
|
|
325
|
+
attachMapLayer(options) {
|
|
326
|
+
var _a, _b;
|
|
327
|
+
const layerSettings = options.settings.clone({});
|
|
317
328
|
if (undefined === layerSettings)
|
|
318
329
|
return;
|
|
330
|
+
const isOverlay = (_a = options.isOverlay) !== null && _a !== void 0 ? _a : false;
|
|
331
|
+
const insertIndex = (_b = options.insertIndex) !== null && _b !== void 0 ? _b : -1;
|
|
319
332
|
const layers = this.getMapLayers(isOverlay);
|
|
320
333
|
if (insertIndex < 0 || insertIndex > (layers.length - 1)) {
|
|
321
334
|
this.getMapLayers(isOverlay).push(layerSettings);
|
|
@@ -326,11 +339,11 @@ export class DisplayStyleState extends ElementState {
|
|
|
326
339
|
this._synchBackgroundMapImagery();
|
|
327
340
|
}
|
|
328
341
|
/** @internal */
|
|
329
|
-
|
|
330
|
-
const
|
|
331
|
-
if (undefined ===
|
|
342
|
+
attachMapLayerProps(options) {
|
|
343
|
+
const settings = MapLayerSettings.fromJSON(options.props);
|
|
344
|
+
if (undefined === settings)
|
|
332
345
|
return;
|
|
333
|
-
this.
|
|
346
|
+
this.attachMapLayer({ settings, isOverlay: options.isOverlay, insertIndex: options.insertIndex });
|
|
334
347
|
}
|
|
335
348
|
/** @internal */
|
|
336
349
|
hasAttachedMapLayer(name, source, isOverlay) {
|
|
@@ -343,7 +356,7 @@ export class DisplayStyleState extends ElementState {
|
|
|
343
356
|
this.detachMapLayerByIndex(index, isOverlay);
|
|
344
357
|
}
|
|
345
358
|
/** Detach map layer at index (-1 to remove all layers)
|
|
346
|
-
* @
|
|
359
|
+
* @public
|
|
347
360
|
*/
|
|
348
361
|
detachMapLayerByIndex(index, isOverlay) {
|
|
349
362
|
const layers = this.getMapLayers(isOverlay);
|
|
@@ -353,22 +366,31 @@ export class DisplayStyleState extends ElementState {
|
|
|
353
366
|
layers.splice(index, 1);
|
|
354
367
|
this._synchBackgroundMapImagery();
|
|
355
368
|
}
|
|
356
|
-
/**
|
|
369
|
+
/**
|
|
370
|
+
* Lookup a maplayer index by name and source.
|
|
371
|
+
* @param name Name of of the layer.
|
|
372
|
+
* @param source Unique string identifying the layer.
|
|
373
|
+
* @param isOverlay true if layer is overlay, otherwise layer is background. Defaults to false.
|
|
374
|
+
* @public
|
|
375
|
+
*
|
|
376
|
+
*/
|
|
357
377
|
findMapLayerIndexByNameAndSource(name, source, isOverlay) {
|
|
358
378
|
return this.getMapLayers(isOverlay).findIndex((layer) => layer.matchesNameAndSource(name, source));
|
|
359
379
|
}
|
|
360
|
-
/** @
|
|
380
|
+
/** @public */
|
|
361
381
|
mapLayerAtIndex(index, isOverlay) {
|
|
362
382
|
const layers = this.getMapLayers(isOverlay);
|
|
363
383
|
return (index < 0 || index >= layers.length) ? undefined : layers[index];
|
|
364
384
|
}
|
|
365
385
|
/** Return map base transparency as a number between 0 and 1.
|
|
366
|
-
* @
|
|
386
|
+
* @public
|
|
367
387
|
*/
|
|
368
388
|
get baseMapTransparency() {
|
|
369
389
|
return this.settings.mapImagery.baseTransparency;
|
|
370
390
|
}
|
|
371
|
-
/**
|
|
391
|
+
/** Change the map base transparency as a number between 0 and 1.
|
|
392
|
+
* @public
|
|
393
|
+
*/
|
|
372
394
|
changeBaseMapTransparency(transparency) {
|
|
373
395
|
if (this.settings.mapImagery.backgroundBase instanceof ColorDef) {
|
|
374
396
|
this.settings.mapImagery.backgroundBase = this.settings.mapImagery.backgroundBase.withTransparency(transparency * 255);
|
|
@@ -378,7 +400,17 @@ export class DisplayStyleState extends ElementState {
|
|
|
378
400
|
}
|
|
379
401
|
this._synchBackgroundMapImagery();
|
|
380
402
|
}
|
|
381
|
-
/**
|
|
403
|
+
/** Modify a subset of a map layer settings.
|
|
404
|
+
* @param props props JSON representation of the properties to change. Any properties not present will retain their current values.
|
|
405
|
+
* @param index where the layer should be inserted.
|
|
406
|
+
* @param isOverlay true if layer is overlay, otherwise layer is background.
|
|
407
|
+
*
|
|
408
|
+
* Example that changes only the visibility of the first overlay map layer.
|
|
409
|
+
* ``` ts
|
|
410
|
+
* style.changeMapLayerProps({ visible: false }, 0, false);
|
|
411
|
+
* ```
|
|
412
|
+
* @public
|
|
413
|
+
*/
|
|
382
414
|
changeMapLayerProps(props, index, isOverlay) {
|
|
383
415
|
const layers = this.getMapLayers(isOverlay);
|
|
384
416
|
if (index < 0 || index >= layers.length)
|
|
@@ -386,6 +418,7 @@ export class DisplayStyleState extends ElementState {
|
|
|
386
418
|
layers[index] = layers[index].clone(props);
|
|
387
419
|
this._synchBackgroundMapImagery();
|
|
388
420
|
}
|
|
421
|
+
/** @public */
|
|
389
422
|
changeMapLayerCredentials(index, isOverlay, userName, password) {
|
|
390
423
|
const layers = this.getMapLayers(isOverlay);
|
|
391
424
|
if (index < 0 || index >= layers.length)
|
|
@@ -396,6 +429,14 @@ export class DisplayStyleState extends ElementState {
|
|
|
396
429
|
this._synchBackgroundMapImagery();
|
|
397
430
|
}
|
|
398
431
|
}
|
|
432
|
+
/** Modify a subset of a sub-layer settings.
|
|
433
|
+
* @param props props JSON representation of the properties to change. Any properties not present will retain their current values.
|
|
434
|
+
* @param subLayerId Id of the sub-layer that should be modified.
|
|
435
|
+
* @param layerIndex of the owning map layer.
|
|
436
|
+
* @param isOverlay true if the map layer is overlay, otherwise layer is background
|
|
437
|
+
*
|
|
438
|
+
* @public
|
|
439
|
+
*/
|
|
399
440
|
changeMapSubLayerProps(props, subLayerId, layerIndex, isOverlay) {
|
|
400
441
|
const mapLayerSettings = this.mapLayerAtIndex(layerIndex, isOverlay);
|
|
401
442
|
if (undefined === mapLayerSettings)
|
|
@@ -410,7 +451,12 @@ export class DisplayStyleState extends ElementState {
|
|
|
410
451
|
}
|
|
411
452
|
this.changeMapLayerProps({ subLayers }, layerIndex, isOverlay);
|
|
412
453
|
}
|
|
413
|
-
/**
|
|
454
|
+
/** Returns the cartographic range of map layer.
|
|
455
|
+
* @param layerIndex of the map layer.
|
|
456
|
+
* @param isOverlay true if the map layer is overlay, otherwise layer is background
|
|
457
|
+
*
|
|
458
|
+
* @internal
|
|
459
|
+
*/
|
|
414
460
|
async getMapLayerRange(layerIndex, isOverlay) {
|
|
415
461
|
var _a;
|
|
416
462
|
const mapLayerSettings = this.mapLayerAtIndex(layerIndex, isOverlay);
|
|
@@ -464,7 +510,7 @@ export class DisplayStyleState extends ElementState {
|
|
|
464
510
|
* Move map layer to top.
|
|
465
511
|
* @param index index of layer to move.
|
|
466
512
|
* @param isOverlay true if layer is overlay.
|
|
467
|
-
* @
|
|
513
|
+
* @public
|
|
468
514
|
*
|
|
469
515
|
*/
|
|
470
516
|
moveMapLayerToTop(index, isOverlay) {
|
|
@@ -479,7 +525,7 @@ export class DisplayStyleState extends ElementState {
|
|
|
479
525
|
* Move map layer to bottom.
|
|
480
526
|
* @param index index of layer to move.
|
|
481
527
|
* @param isOverlay true if layer is overlay.
|
|
482
|
-
* @
|
|
528
|
+
* @public
|
|
483
529
|
*/
|
|
484
530
|
moveMapLayerToBottom(index, isOverlay) {
|
|
485
531
|
const layers = this.getMapLayers(isOverlay);
|
|
@@ -493,7 +539,7 @@ export class DisplayStyleState extends ElementState {
|
|
|
493
539
|
* Reorder map layers
|
|
494
540
|
* @param fromIndex index of map layer to move
|
|
495
541
|
* @param toIndex insert index. If equal to length of map array the map layer is moved to end of array.
|
|
496
|
-
* @
|
|
542
|
+
* @public
|
|
497
543
|
*/
|
|
498
544
|
moveMapLayerToIndex(fromIndex, toIndex, isOverlay) {
|
|
499
545
|
const layers = this.getMapLayers(isOverlay);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisplayStyleState.js","sourceRoot":"","sources":["../../src/DisplayStyleState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\nimport { assert, BeEvent, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Angle, Range1d, Vector3d } from \"@itwin/core-geometry\";\r\nimport {\r\n BackgroundMapProps, BackgroundMapProvider, BackgroundMapProviderProps, BackgroundMapSettings,\r\n BaseLayerSettings, BaseMapLayerSettings, CartographicRange, ColorDef, ContextRealityModelProps, DisplayStyle3dSettings, DisplayStyle3dSettingsProps,\r\n DisplayStyleProps, DisplayStyleSettings, Environment, FeatureAppearance, GlobeMode, ImageMapLayerSettings, LightSettings, MapLayerProps,\r\n MapLayerSettings, MapSubLayerProps, ModelMapLayerSettings, RenderSchedule, RenderTimelineProps,\r\n SolarShadowSettings, SubCategoryOverride, SubLayerId, TerrainHeightOriginMode, ThematicDisplay, ThematicDisplayMode, ThematicGradientMode, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport { ApproximateTerrainHeights } from \"./ApproximateTerrainHeights\";\r\nimport { BackgroundMapGeometry } from \"./BackgroundMapGeometry\";\r\nimport { ContextRealityModelState } from \"./ContextRealityModelState\";\r\nimport { ElementState } from \"./EntityState\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { PlanarClipMaskState } from \"./PlanarClipMaskState\";\r\nimport { RenderScheduleState } from \"./RenderScheduleState\";\r\nimport { getCesiumOSMBuildingsUrl, MapCartoRectangle, TileTreeReference } from \"./tile/internal\";\r\nimport { viewGlobalLocation, ViewGlobalLocationConstants } from \"./ViewGlobalLocation\";\r\nimport { ScreenViewport } from \"./Viewport\";\r\nimport { GeometricModelState } from \"./ModelState\";\r\n\r\n/** @internal */\r\nexport class TerrainDisplayOverrides {\r\n public wantSkirts?: boolean;\r\n public wantNormals?: boolean;\r\n public produceGeometry?: boolean;\r\n}\r\n\r\n/** Options controlling display of [OpenStreetMap Buildings](https://cesium.com/platform/cesium-ion/content/cesium-osm-buildings/).\r\n * @see [[DisplayStyleState.setOSMBuildingDisplay]].\r\n * @public\r\n * @extensions\r\n */\r\nexport interface OsmBuildingDisplayOptions {\r\n /** If defined, enables or disables display of the buildings by attaching or detaching the OpenStreetMap Buildings reality model. */\r\n onOff?: boolean;\r\n /** If defined, overrides aspects of the appearance of the OpenStreetMap building meshes. */\r\n appearanceOverrides?: FeatureAppearance;\r\n}\r\n\r\n/** A DisplayStyle defines the parameters for 'styling' the contents of a [[ViewState]].\r\n * @public\r\n * @extensions\r\n */\r\nexport abstract class DisplayStyleState extends ElementState implements DisplayStyleProps {\r\n /** @internal */\r\n public static override get className() { return \"DisplayStyle\"; }\r\n private _scheduleState?: RenderScheduleState;\r\n private _ellipsoidMapGeometry: BackgroundMapGeometry | undefined;\r\n private _attachedRealityModelPlanarClipMasks = new Map<Id64String, PlanarClipMaskState>();\r\n /** @internal */\r\n protected _queryRenderTimelinePropsPromise?: Promise<RenderTimelineProps | undefined>;\r\n\r\n /** Event raised just before the [[scheduleScriptReference]] property is changed. */\r\n public readonly onScheduleScriptReferenceChanged = new BeEvent<(newScriptReference: RenderSchedule.ScriptReference | undefined) => void>();\r\n /** Event raised just after [[setOSMBuildingDisplay]] changes the enabled state of the OSM buildings. */\r\n public readonly onOSMBuildingDisplayChanged = new BeEvent<(osmBuildingDisplayEnabled: boolean) => void>();\r\n\r\n /** The container for this display style's settings. */\r\n public abstract get settings(): DisplayStyleSettings;\r\n\r\n /** @internal */\r\n public abstract overrideTerrainDisplay(): TerrainDisplayOverrides | undefined;\r\n\r\n /** Construct a new DisplayStyleState from its JSON representation.\r\n * @param props JSON representation of the display style.\r\n * @param iModel IModelConnection containing the display style.\r\n * @param source If the constructor is being invoked from [[EntityState.clone]], the display style that is being cloned.\r\n */\r\n constructor(props: DisplayStyleProps, iModel: IModelConnection, source?: DisplayStyleState) {\r\n super(props, iModel);\r\n const styles = this.jsonProperties.styles;\r\n\r\n if (source)\r\n this._scheduleState = source._scheduleState;\r\n\r\n if (styles) {\r\n // ###TODO Use DisplayStyleSettings.planarClipMasks\r\n if (styles.planarClipOvr)\r\n for (const planarClipOvr of styles.planarClipOvr)\r\n if (Id64.isValid(planarClipOvr.modelId))\r\n this._attachedRealityModelPlanarClipMasks.set(planarClipOvr.modelId, PlanarClipMaskState.fromJSON(planarClipOvr));\r\n }\r\n }\r\n\r\n /** Ensures all of the data required by the display style is loaded. This method is invoked for you by [[ViewState.load]], but if\r\n * you obtain a display style by some other means you should `await` this method before using the display style.\r\n */\r\n public async load(): Promise<void> {\r\n // If we were cloned, we may already have a valid schedule state, and our display style Id may be invalid / different.\r\n // Preserve it if still usable.\r\n if (this._scheduleState) {\r\n if (this.settings.renderTimeline === this._scheduleState.sourceId) {\r\n // The script came from the same RenderTimeline element. Keep it.\r\n return;\r\n }\r\n\r\n if (undefined === this.settings.renderTimeline) {\r\n // The script cam from a display style's JSON properties. Keep it if (1) this style is not persistent or (2) this style has the same Id\r\n if (this.id === this._scheduleState.sourceId || !Id64.isValidId64(this.id))\r\n return;\r\n }\r\n }\r\n\r\n if (undefined !== this.settings.renderTimeline)\r\n await this.loadScheduleStateFromTimeline(this.settings.renderTimeline);\r\n else\r\n this.loadScheduleStateFromScript(this.settings.scheduleScriptProps); // eslint-disable-line deprecation/deprecation\r\n }\r\n\r\n private loadScheduleStateFromScript(scriptProps: Readonly<RenderSchedule.ScriptProps> | undefined): void {\r\n let newState;\r\n if (scriptProps) {\r\n try {\r\n const script = RenderSchedule.Script.fromJSON(scriptProps);\r\n if (script)\r\n newState = new RenderScheduleState(this.id, script);\r\n } catch (_) {\r\n // schedule state is undefined.\r\n }\r\n }\r\n\r\n if (newState !== this._scheduleState) {\r\n this.onScheduleScriptReferenceChanged.raiseEvent(newState);\r\n this._scheduleState = newState;\r\n }\r\n }\r\n\r\n private async loadScheduleStateFromTimeline(timelineId: Id64String): Promise<void> {\r\n let newState;\r\n try {\r\n // If a subsequent call to loadScheduleStateFromTimeline is made while we're awaiting this one, we'll abort this one.\r\n const promise = this._queryRenderTimelinePropsPromise = this.queryRenderTimelineProps(timelineId);\r\n const timeline = await promise;\r\n if (promise !== this._queryRenderTimelinePropsPromise)\r\n return;\r\n\r\n if (timeline) {\r\n const scriptProps = JSON.parse(timeline.script);\r\n const script = RenderSchedule.Script.fromJSON(scriptProps);\r\n if (script)\r\n newState = new RenderScheduleState(timelineId, script);\r\n }\r\n } catch (_) {\r\n // schedule state is undefined.\r\n }\r\n\r\n this._queryRenderTimelinePropsPromise = undefined;\r\n if (newState !== this._scheduleState) {\r\n this.onScheduleScriptReferenceChanged.raiseEvent(newState);\r\n this._scheduleState = newState;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected async queryRenderTimelineProps(timelineId: Id64String): Promise<RenderTimelineProps | undefined> {\r\n try {\r\n return await this.iModel.elements.loadProps(timelineId, { renderTimeline: { omitScriptElementIds: true } }) as RenderTimelineProps;\r\n } catch (_) {\r\n return undefined;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public get displayTerrain() {\r\n return this.viewFlags.backgroundMap && this.settings.backgroundMap.applyTerrain;\r\n }\r\n\r\n /** @internal */\r\n public get globeMode(): GlobeMode { return this.settings.backgroundMap.globeMode; }\r\n\r\n /** @internal */\r\n public get backgroundMapLayers(): MapLayerSettings[] { return this.settings.mapImagery.backgroundLayers; }\r\n\r\n /** @beta */\r\n public get backgroundMapBase(): BaseLayerSettings {\r\n return this.settings.mapImagery.backgroundBase;\r\n }\r\n public set backgroundMapBase(base: BaseLayerSettings) {\r\n this.settings.mapImagery.backgroundBase = base;\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** @internal */\r\n public get overlayMapLayers(): MapLayerSettings[] { return this.settings.mapImagery.overlayLayers; }\r\n\r\n /** The settings controlling how a background map is displayed within a view.\r\n * @see [[ViewFlags.backgroundMap]] for toggling display of the map on or off.\r\n */\r\n public get backgroundMapSettings(): BackgroundMapSettings { return this.settings.backgroundMap; }\r\n public set backgroundMapSettings(settings: BackgroundMapSettings) {\r\n this.settings.backgroundMap = settings;\r\n }\r\n\r\n /** Modify a subset of the background map display settings.\r\n * @param name props JSON representation of the properties to change. Any properties not present will retain their current values in `this.backgroundMapSettings`.\r\n * @see [[ViewFlags.backgroundMap]] for toggling display of the map.\r\n * @see [[changeBackgroundMapProvider]] to change the type of map imagery displayed.\r\n *\r\n * Example that changes only the elevation, leaving the provider and type unchanged:\r\n * ``` ts\r\n * style.changeBackgroundMapProps({ groundBias: 16.2 });\r\n * ```\r\n */\r\n public changeBackgroundMapProps(props: BackgroundMapProps): void {\r\n const newSettings = this.backgroundMapSettings.clone(props);\r\n this.backgroundMapSettings = newSettings;\r\n }\r\n\r\n /** Change aspects of the [BackgroundMapProvider]($common) from which background map imagery is obtained.\r\n * Any properties not explicitly specified by `props` will retain their current values.\r\n * @public\r\n */\r\n public changeBackgroundMapProvider(props: BackgroundMapProviderProps): void {\r\n const base = this.settings.mapImagery.backgroundBase;\r\n if (base instanceof ColorDef) {\r\n this.settings.mapImagery.backgroundBase = BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON(props));\r\n } else {\r\n const provider = base.provider ? base.provider.clone(props) : BackgroundMapProvider.fromJSON(props);\r\n this.settings.mapImagery.backgroundBase = base.cloneWithProvider(provider);\r\n }\r\n\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** Call a function for each reality model attached to this display style.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common).\r\n */\r\n public forEachRealityModel(func: (model: ContextRealityModelState) => void): void {\r\n for (const model of this.settings.contextRealityModels.models) {\r\n assert(model instanceof ContextRealityModelState);\r\n func(model);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public forEachRealityTileTreeRef(func: (ref: TileTreeReference) => void): void {\r\n this.forEachRealityModel((model) => func(model.treeRef));\r\n }\r\n\r\n /** @internal */\r\n public forEachTileTreeRef(func: (ref: TileTreeReference) => void): void {\r\n this.forEachRealityTileTreeRef(func);\r\n }\r\n\r\n /** Performs logical comparison against another display style. Two display styles are logically equivalent if they have the same name, Id, and settings.\r\n * @param other The display style to which to compare.\r\n * @returns true if the specified display style is logically equivalent to this display style - i.e., both styles have the same values for all of their settings.\r\n */\r\n public equalState(other: DisplayStyleState): boolean {\r\n if (this.name !== other.name || this.id !== other.id)\r\n return false;\r\n else\r\n return JSON.stringify(this.settings) === JSON.stringify(other.settings);\r\n }\r\n\r\n /** The name of this DisplayStyle */\r\n public get name(): string { return this.code.value; }\r\n\r\n /** Change the Id of the [RenderTimeline]($backend) element that hosts the [RenderSchedule.Script]($common) to be applied by this display style for\r\n * animating the contents of the view, and update [[scheduleScriptReference]] using the script associated with the [RenderTimeline]($backend) element.\r\n * @see [DisplayStyleSettings.renderTimeline]($common).\r\n */\r\n public async changeRenderTimeline(timelineId: Id64String | undefined): Promise<void> {\r\n // Potentially trigger async loading of new schedule state.\r\n this.settings.renderTimeline = timelineId;\r\n\r\n // Await async loading if necessary.\r\n // Note the `await` in loadScheduleStateFromTimeline will resolve before this one [per the spec](https://262.ecma-international.org/6.0/#sec-triggerpromisereactions).\r\n if (this._queryRenderTimelinePropsPromise)\r\n await this._queryRenderTimelinePropsPromise;\r\n }\r\n\r\n /** The [RenderSchedule.Script]($common) that animates the contents of the view, if any.\r\n * @see [[changeRenderTimeline]] to change the script.\r\n */\r\n public get scheduleScript(): RenderSchedule.Script | undefined {\r\n return this._scheduleState?.script;\r\n }\r\n\r\n /** The [RenderSchedule.Script]($common) that animates the contents of the view, if any, along with the Id of the element that hosts the script.\r\n * @note The host element may be a [RenderTimeline]($backend) or a [DisplayStyle]($backend).\r\n * @see [[changeRenderTimeline]] to change the script.\r\n */\r\n public get scheduleScriptReference(): RenderSchedule.ScriptReference | undefined {\r\n return this._scheduleState;\r\n }\r\n\r\n /** @internal */\r\n public get scheduleState(): RenderScheduleState | undefined {\r\n return this._scheduleState;\r\n }\r\n\r\n /** This is only used by [RealityTransitionTool]($frontend-devtools). It basically can only work if the script contains nothing that requires special tiles to be generated -\r\n * no symbology changes, transforms, or clipping - because the backend tile generator requires a *persistent* element to host the script for those features to work.\r\n * @internal\r\n */\r\n public setScheduleState(state: RenderScheduleState | undefined): void {\r\n if (state === this._scheduleState)\r\n return;\r\n\r\n this.onScheduleScriptReferenceChanged.raiseEvent(state);\r\n this._scheduleState = state;\r\n\r\n // eslint-disable-next-line deprecation/deprecation\r\n this.settings.scheduleScriptProps = state?.script.toJSON();\r\n }\r\n\r\n /** Attach a [ContextRealityModel]($common) to this display style.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common).\r\n * @see [ContextRealityModels.add]($common)\r\n */\r\n public attachRealityModel(props: ContextRealityModelProps): ContextRealityModelState {\r\n const model = this.settings.contextRealityModels.add(props);\r\n assert(model instanceof ContextRealityModelState);\r\n return model;\r\n }\r\n\r\n /** Detach the first [ContextRealityModel]($common) that matches the specified name and url.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common)\r\n * @see [ContextRealityModels.delete]($common)\r\n */\r\n public detachRealityModelByNameAndUrl(name: string, url: string): boolean {\r\n const model = this.settings.contextRealityModels.models.find((x) => x.matchesNameAndUrl(name, url));\r\n return undefined !== model && this.settings.contextRealityModels.delete(model);\r\n }\r\n\r\n /** Get the [[ContextRealityModelState]] that displays the OpenStreetMap worldwide building layer, if enabled.\r\n * @see [[setOSMBuildingDisplay]]\r\n */\r\n public getOSMBuildingRealityModel(): ContextRealityModelState | undefined {\r\n if (!this.iModel.isGeoLocated || this.globeMode !== GlobeMode.Ellipsoid) // The OSM tile tree is ellipsoidal.\r\n return undefined;\r\n\r\n const url = getCesiumOSMBuildingsUrl();\r\n if (undefined === url)\r\n return undefined;\r\n\r\n return this.contextRealityModelStates.find((x) => x.url === url);\r\n }\r\n\r\n /** Set the display of the OpenStreetMap worldwide building layer in this display style by attaching or detaching the reality model displaying the buildings.\r\n * The OSM buildings are displayed from a reality model aggregated and served from Cesium ion.<(https://cesium.com/content/cesium-osm-buildings/>\r\n * The options [[OsmBuildingDisplayOptions]] control the display and appearance overrides.\r\n */\r\n public setOSMBuildingDisplay(options: OsmBuildingDisplayOptions): boolean {\r\n if (!this.iModel.isGeoLocated || this.globeMode !== GlobeMode.Ellipsoid) // The OSM tile tree is ellipsoidal.\r\n return false;\r\n\r\n const url = getCesiumOSMBuildingsUrl();\r\n if (undefined === url)\r\n return false;\r\n\r\n let model = this.settings.contextRealityModels.models.find((x) => x.url === url);\r\n if (options.onOff === false) {\r\n const turnedOff = undefined !== model && this.settings.contextRealityModels.delete(model);\r\n if (turnedOff)\r\n this.onOSMBuildingDisplayChanged.raiseEvent(false);\r\n\r\n return turnedOff;\r\n }\r\n\r\n if (!model) {\r\n const name = IModelApp.localization.getLocalizedString(\"iModelJs:RealityModelNames.OSMBuildings\");\r\n model = this.attachRealityModel({ tilesetUrl: url, name });\r\n this.onOSMBuildingDisplayChanged.raiseEvent(true);\r\n }\r\n\r\n if (options.appearanceOverrides)\r\n model.appearanceOverrides = options.appearanceOverrides;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Return if a context reality model is attached.\r\n * @see [[ContextRealityModelProps]].\r\n * */\r\n public hasAttachedRealityModel(name: string, url: string): boolean {\r\n return undefined !== this.settings.contextRealityModels.models.find((x) => x.matchesNameAndUrl(name, url));\r\n }\r\n\r\n /** @internal */\r\n public getMapLayers(isOverlay: boolean) { return isOverlay ? this.overlayMapLayers : this.backgroundMapLayers; }\r\n\r\n /** @internal */\r\n public attachMapLayerSettings(settings: MapLayerSettings, isOverlay: boolean, insertIndex = -1): void {\r\n const layerSettings = settings.clone({});\r\n if (undefined === layerSettings)\r\n return;\r\n\r\n const layers = this.getMapLayers(isOverlay);\r\n\r\n if (insertIndex < 0 || insertIndex > (layers.length - 1)) {\r\n this.getMapLayers(isOverlay).push(layerSettings);\r\n } else {\r\n layers.splice(insertIndex, 0, layerSettings);\r\n }\r\n\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** @internal */\r\n public attachMapLayer(props: MapLayerProps, isOverlay: boolean, insertIndex = -1): void {\r\n const layerSettings = MapLayerSettings.fromJSON(props);\r\n if (undefined === layerSettings)\r\n return;\r\n\r\n this.attachMapLayerSettings(layerSettings, isOverlay, insertIndex);\r\n }\r\n\r\n /** @internal */\r\n public hasAttachedMapLayer(name: string, source: string, isOverlay: boolean): boolean {\r\n return -1 !== this.findMapLayerIndexByNameAndSource(name, source, isOverlay);\r\n }\r\n\r\n /** @internal */\r\n public detachMapLayerByNameAndSource(name: string, source: string, isOverlay: boolean): void {\r\n const index = this.findMapLayerIndexByNameAndSource(name, source, isOverlay);\r\n if (- 1 !== index)\r\n this.detachMapLayerByIndex(index, isOverlay);\r\n }\r\n\r\n /** Detach map layer at index (-1 to remove all layers)\r\n * @internal\r\n */\r\n public detachMapLayerByIndex(index: number, isOverlay: boolean): void {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index < 0)\r\n layers.length = 0;\r\n else\r\n layers.splice(index, 1);\r\n\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** @internal */\r\n public findMapLayerIndexByNameAndSource(name: string, source: string, isOverlay: boolean) {\r\n return this.getMapLayers(isOverlay).findIndex((layer) => layer.matchesNameAndSource(name, source));\r\n }\r\n\r\n /** @internal */\r\n public mapLayerAtIndex(index: number, isOverlay: boolean): MapLayerSettings | undefined {\r\n const layers = this.getMapLayers(isOverlay);\r\n return (index < 0 || index >= layers.length) ? undefined : layers[index];\r\n }\r\n\r\n /** Return map base transparency as a number between 0 and 1.\r\n * @internal\r\n */\r\n public get baseMapTransparency(): number {\r\n return this.settings.mapImagery.baseTransparency;\r\n }\r\n\r\n /** @internal */\r\n public changeBaseMapTransparency(transparency: number) {\r\n if (this.settings.mapImagery.backgroundBase instanceof ColorDef) {\r\n this.settings.mapImagery.backgroundBase = this.settings.mapImagery.backgroundBase.withTransparency(transparency * 255);\r\n } else {\r\n this.settings.mapImagery.backgroundBase = this.settings.mapImagery.backgroundBase.clone({transparency});\r\n }\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** @internal */\r\n public changeMapLayerProps(props: Partial<MapLayerProps>, index: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index < 0 || index >= layers.length)\r\n return;\r\n layers[index] = layers[index].clone(props);\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n public changeMapLayerCredentials(index: number, isOverlay: boolean, userName?: string, password?: string,) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index < 0 || index >= layers.length)\r\n return;\r\n const layer = layers[index];\r\n if (layer instanceof ImageMapLayerSettings) {\r\n layer.setCredentials(userName, password);\r\n this._synchBackgroundMapImagery();\r\n }\r\n }\r\n\r\n public changeMapSubLayerProps(props: Partial<MapSubLayerProps>, subLayerId: SubLayerId, layerIndex: number, isOverlay: boolean) {\r\n const mapLayerSettings = this.mapLayerAtIndex(layerIndex, isOverlay);\r\n if (undefined === mapLayerSettings)\r\n return;\r\n\r\n if (!(mapLayerSettings instanceof ImageMapLayerSettings)) {\r\n assert (false);\r\n return;\r\n }\r\n\r\n const subLayers = new Array<MapSubLayerProps>();\r\n for (const subLayer of mapLayerSettings.subLayers) {\r\n subLayers.push((subLayerId === -1 || subLayer.id === subLayerId) ? subLayer.clone(props).toJSON() : subLayer.toJSON());\r\n }\r\n\r\n this.changeMapLayerProps({ subLayers }, layerIndex, isOverlay);\r\n }\r\n\r\n /** @internal */\r\n public async getMapLayerRange(layerIndex: number, isOverlay: boolean): Promise<MapCartoRectangle | undefined> {\r\n const mapLayerSettings = this.mapLayerAtIndex(layerIndex, isOverlay);\r\n if (undefined === mapLayerSettings)\r\n return undefined;\r\n\r\n if (mapLayerSettings instanceof ModelMapLayerSettings) {\r\n const ecefTransform = this.iModel.ecefLocation?.getTransform();\r\n if (!ecefTransform)\r\n return undefined;\r\n const model = this.iModel.models.getLoaded(mapLayerSettings.modelId);\r\n if (!model || !(model instanceof GeometricModelState))\r\n return undefined;\r\n\r\n const modelRange = await model.queryModelRange();\r\n const cartoRange = new CartographicRange(modelRange, ecefTransform).getLongitudeLatitudeBoundingBox();\r\n\r\n return MapCartoRectangle.create(cartoRange.low.x, cartoRange.low.y, cartoRange.high.x, cartoRange.high.y);\r\n }\r\n if (! (mapLayerSettings instanceof ImageMapLayerSettings)) {\r\n assert(false);\r\n return undefined;\r\n }\r\n\r\n const imageryProvider = IModelApp.mapLayerFormatRegistry.createImageryProvider(mapLayerSettings);\r\n if (undefined === imageryProvider)\r\n return undefined;\r\n\r\n try {\r\n await imageryProvider.initialize();\r\n return imageryProvider.cartoRange;\r\n\r\n } catch (_error) {\r\n return undefined;\r\n }\r\n return undefined;\r\n }\r\n\r\n /** change viewport to include range of map layer.\r\n * @internal\r\n */\r\n public async viewMapLayerRange(layerIndex: number, isOverlay: boolean, vp: ScreenViewport): Promise<boolean> {\r\n const range = await this.getMapLayerRange(layerIndex, isOverlay);\r\n if (!range)\r\n return false;\r\n\r\n if (range.xLength() > 1.5 * Angle.piRadians)\r\n viewGlobalLocation(vp, true, ViewGlobalLocationConstants.satelliteHeightAboveEarthInMeters, undefined, undefined);\r\n else\r\n viewGlobalLocation(vp, true, undefined, undefined, range.globalLocation);\r\n\r\n return true;\r\n }\r\n\r\n /* @internal */\r\n private _synchBackgroundMapImagery() {\r\n this.settings.synchMapImagery();\r\n }\r\n\r\n /**\r\n * Move map layer to top.\r\n * @param index index of layer to move.\r\n * @param isOverlay true if layer is overlay.\r\n * @internal\r\n *\r\n */\r\n public moveMapLayerToTop(index: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index >= 0 && index < layers.length - 1) {\r\n const layer = layers.splice(index, 1);\r\n layers.push(layer[0]);\r\n this._synchBackgroundMapImagery();\r\n }\r\n }\r\n\r\n /**\r\n * Move map layer to bottom.\r\n * @param index index of layer to move.\r\n * @param isOverlay true if layer is overlay.\r\n * @internal\r\n */\r\n public moveMapLayerToBottom(index: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index > 0 && index < layers.length) {\r\n const layer = layers.splice(index, 1);\r\n layers.unshift(layer[0]);\r\n this._synchBackgroundMapImagery();\r\n }\r\n }\r\n\r\n /**\r\n * Reorder map layers\r\n * @param fromIndex index of map layer to move\r\n * @param toIndex insert index. If equal to length of map array the map layer is moved to end of array.\r\n * @internal\r\n */\r\n public moveMapLayerToIndex(fromIndex: number, toIndex: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (fromIndex === toIndex)\r\n return;\r\n\r\n if (fromIndex < 0 || fromIndex >= layers.length || toIndex > layers.length)\r\n return;\r\n\r\n const layer = layers.splice(fromIndex, 1);\r\n layers.splice(toIndex, 0, layer[0]); // note: if toIndex === settings.mapImagery.backgroundLayers.length item is appended\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** Flags controlling various aspects of the display style.\r\n * @see [DisplayStyleSettings.viewFlags]($common)\r\n */\r\n public get viewFlags(): ViewFlags { return this.settings.viewFlags; }\r\n public set viewFlags(flags: ViewFlags) { this.settings.viewFlags = flags; }\r\n\r\n /** The background color for this DisplayStyle */\r\n public get backgroundColor(): ColorDef { return this.settings.backgroundColor; }\r\n public set backgroundColor(val: ColorDef) { this.settings.backgroundColor = val; }\r\n\r\n /** The color used to draw geometry in monochrome mode.\r\n * @see [ViewFlags.monochrome]($common) for enabling monochrome mode.\r\n */\r\n public get monochromeColor(): ColorDef { return this.settings.monochromeColor; }\r\n public set monochromeColor(val: ColorDef) { this.settings.monochromeColor = val; }\r\n\r\n private _backgroundMapGeometry?: {\r\n bimElevationBias: number;\r\n geometry: BackgroundMapGeometry;\r\n globeMode: GlobeMode;\r\n };\r\n\r\n /** @internal */\r\n public anyMapLayersVisible(overlay: boolean): boolean {\r\n const layers = this.getMapLayers(overlay);\r\n\r\n for (const mapLayer of layers)\r\n if (mapLayer.visible)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public getIsBackgroundMapVisible(): boolean {\r\n return undefined !== this.iModel.ecefLocation && (this.viewFlags.backgroundMap || this.anyMapLayersVisible(false));\r\n }\r\n /** @internal */\r\n public get backgroundMapElevationBias(): number | undefined {\r\n if (this.backgroundMapSettings.applyTerrain) {\r\n const terrainSettings = this.backgroundMapSettings.terrainSettings;\r\n switch (terrainSettings.heightOriginMode) {\r\n case TerrainHeightOriginMode.Ground:\r\n return (undefined === this.iModel.projectCenterAltitude) ? undefined : terrainSettings.heightOrigin + terrainSettings.exaggeration * this.iModel.projectCenterAltitude;\r\n\r\n case TerrainHeightOriginMode.Geodetic:\r\n return terrainSettings.heightOrigin;\r\n\r\n case TerrainHeightOriginMode.Geoid:\r\n return (undefined === this.iModel.geodeticToSeaLevel) ? undefined : terrainSettings.heightOrigin + this.iModel.geodeticToSeaLevel;\r\n }\r\n } else {\r\n return this.backgroundMapSettings.groundBias;\r\n }\r\n\r\n }\r\n\r\n /** @internal */\r\n public getBackgroundMapGeometry(): BackgroundMapGeometry | undefined {\r\n if (undefined === this.iModel.ecefLocation)\r\n return undefined;\r\n\r\n const bimElevationBias = this.backgroundMapElevationBias;\r\n\r\n if (undefined === bimElevationBias)\r\n return undefined;\r\n\r\n const globeMode = this.globeMode;\r\n if (undefined === this._backgroundMapGeometry || this._backgroundMapGeometry.globeMode !== globeMode || this._backgroundMapGeometry.bimElevationBias !== bimElevationBias) {\r\n const geometry = new BackgroundMapGeometry(bimElevationBias, globeMode, this.iModel);\r\n this._backgroundMapGeometry = { bimElevationBias, geometry, globeMode };\r\n }\r\n return this._backgroundMapGeometry.geometry;\r\n }\r\n\r\n /** [[ContextRealityModelState]]s attached to this display style.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common).\r\n */\r\n public get contextRealityModelStates(): ReadonlyArray<ContextRealityModelState> {\r\n return this.settings.contextRealityModels.models as ContextRealityModelState[];\r\n }\r\n\r\n /** @internal */\r\n public getGlobalGeometryAndHeightRange(): { geometry: BackgroundMapGeometry, heightRange: Range1d } | undefined {\r\n let geometry = this.getIsBackgroundMapVisible() ? this.getBackgroundMapGeometry() : undefined;\r\n const terrainRange = ApproximateTerrainHeights.instance.globalHeightRange;\r\n let heightRange = this.displayTerrain ? terrainRange : Range1d.createXX(-1, 1);\r\n if (this.globeMode === GlobeMode.Ellipsoid && this.contextRealityModelStates.find((model) => model.isGlobal)) {\r\n if (!geometry) {\r\n if (!this._ellipsoidMapGeometry)\r\n this._ellipsoidMapGeometry = new BackgroundMapGeometry(0, GlobeMode.Ellipsoid, this.iModel);\r\n\r\n geometry = this._ellipsoidMapGeometry;\r\n }\r\n\r\n heightRange = terrainRange;\r\n }\r\n\r\n return geometry ? { geometry, heightRange } : undefined;\r\n }\r\n\r\n /** Returns true if this is a 3d display style. */\r\n public is3d(): this is DisplayStyle3dState { return this instanceof DisplayStyle3dState; }\r\n\r\n /** Customize the way geometry belonging to a [[SubCategory]] is drawn by this display style.\r\n * @param id The ID of the SubCategory whose appearance is to be overridden.\r\n * @param ovr The overrides to apply to the [[SubCategoryAppearance]].\r\n * @see [[dropSubCategoryOverride]]\r\n */\r\n public overrideSubCategory(id: Id64String, ovr: SubCategoryOverride) { this.settings.overrideSubCategory(id, ovr); }\r\n\r\n /** Remove any [[SubCategoryOverride]] applied to a [[SubCategoryAppearance]] by this style.\r\n * @param id The ID of the [[SubCategory]].\r\n * @see [[overrideSubCategory]]\r\n */\r\n public dropSubCategoryOverride(id: Id64String) { this.settings.dropSubCategoryOverride(id); }\r\n\r\n /** Returns true if an [[SubCategoryOverride]]s are defined by this style. */\r\n public get hasSubCategoryOverride() { return this.settings.hasSubCategoryOverride; }\r\n\r\n /** Obtain the overrides applied to a [[SubCategoryAppearance]] by this style.\r\n * @param id The ID of the [[SubCategory]].\r\n * @returns The corresponding SubCategoryOverride, or undefined if the SubCategory's appearance is not overridden.\r\n * @see [[overrideSubCategory]]\r\n */\r\n public getSubCategoryOverride(id: Id64String): SubCategoryOverride | undefined { return this.settings.getSubCategoryOverride(id); }\r\n\r\n /** @internal */\r\n public get wantShadows(): boolean {\r\n return this.is3d() && this.viewFlags.shadows && false !== IModelApp.renderSystem.options.displaySolarShadows;\r\n }\r\n\r\n /** @internal */\r\n protected registerSettingsEventListeners(): void {\r\n // eslint-disable-next-line deprecation/deprecation\r\n this.settings.onScheduleScriptPropsChanged.addListener((scriptProps) => {\r\n if (undefined === this.settings.renderTimeline)\r\n this.loadScheduleStateFromScript(scriptProps);\r\n });\r\n\r\n this.settings.onRenderTimelineChanged.addListener((newTimeline) => {\r\n // Cancel any in-progress loading of script from timeline.\r\n this._queryRenderTimelinePropsPromise = undefined;\r\n\r\n if (undefined !== newTimeline)\r\n this.loadScheduleStateFromTimeline(newTimeline); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n else\r\n this.loadScheduleStateFromScript(this.settings.scheduleScriptProps); // eslint-disable-line deprecation/deprecation\r\n });\r\n\r\n this.settings.onPlanarClipMaskChanged.addListener((id, newSettings) => {\r\n if (newSettings)\r\n this._attachedRealityModelPlanarClipMasks.set(id, PlanarClipMaskState.create(newSettings));\r\n else\r\n this._attachedRealityModelPlanarClipMasks.delete(id);\r\n });\r\n }\r\n\r\n /** @internal */\r\n protected createRealityModel(props: ContextRealityModelProps): ContextRealityModelState {\r\n return new ContextRealityModelState(props, this.iModel, this);\r\n }\r\n\r\n /** @internal */\r\n public getPlanarClipMaskState(modelId: Id64String): PlanarClipMaskState | undefined {\r\n const model = this.iModel.models.getLoaded(modelId)?.asSpatialModel;\r\n return (model && model.isRealityModel) ? this._attachedRealityModelPlanarClipMasks.get(modelId) : undefined;\r\n }\r\n}\r\n\r\n/** A display style that can be applied to 2d views.\r\n * @public\r\n * @extensions\r\n */\r\nexport class DisplayStyle2dState extends DisplayStyleState {\r\n /** @internal */\r\n public static override get className() { return \"DisplayStyle2d\"; }\r\n private readonly _settings: DisplayStyleSettings;\r\n\r\n public get settings(): DisplayStyleSettings { return this._settings; }\r\n\r\n /** @internal */\r\n public overrideTerrainDisplay(): TerrainDisplayOverrides | undefined { return undefined; }\r\n\r\n constructor(props: DisplayStyleProps, iModel: IModelConnection) {\r\n super(props, iModel);\r\n this._settings = new DisplayStyleSettings(this.jsonProperties, { createContextRealityModel: (modelProps) => this.createRealityModel(modelProps) });\r\n this.registerSettingsEventListeners();\r\n }\r\n}\r\n\r\n/** A [[DisplayStyleState]] that can be applied to spatial views.\r\n * @public\r\n * @extensions\r\n */\r\nexport class DisplayStyle3dState extends DisplayStyleState {\r\n /** @internal */\r\n public static override get className() { return \"DisplayStyle3d\"; }\r\n private _settings: DisplayStyle3dSettings;\r\n\r\n public get settings(): DisplayStyle3dSettings { return this._settings; }\r\n\r\n public constructor(props: DisplayStyleProps, iModel: IModelConnection, source?: DisplayStyle3dState) {\r\n super(props, iModel, source);\r\n this._settings = new DisplayStyle3dSettings(this.jsonProperties, { createContextRealityModel: (modelProps) => this.createRealityModel(modelProps) });\r\n this.registerSettingsEventListeners();\r\n }\r\n\r\n public get environment(): Environment {\r\n return this.settings.environment;\r\n }\r\n public set environment(env: Environment) {\r\n this.settings.environment = env;\r\n }\r\n\r\n public get lights(): LightSettings { return this.settings.lights; }\r\n public set lights(lights: LightSettings) { this.settings.lights = lights; }\r\n\r\n /** The direction of the solar light. */\r\n public get sunDirection(): Readonly<Vector3d> {\r\n return this.settings.lights.solar.direction;\r\n }\r\n\r\n /** Set the solar light direction based on time value\r\n * @param time The time in unix time milliseconds.\r\n * @see [DisplayStyle3dSettings.sunTime]($common) to obtain the current sun time.\r\n * @see [DisplayStyle3dSettings.setSunTime]($common).\r\n */\r\n public setSunTime(time: number) {\r\n this.settings.setSunTime(time, this.iModel);\r\n }\r\n\r\n /** Settings controlling shadow display. */\r\n public get solarShadows(): SolarShadowSettings {\r\n return this.settings.solarShadows;\r\n }\r\n public set solarShadows(settings: SolarShadowSettings) {\r\n this.settings.solarShadows = settings;\r\n }\r\n\r\n /** @internal */\r\n protected override registerSettingsEventListeners(): void {\r\n super.registerSettingsEventListeners();\r\n\r\n this.settings.onOverridesApplied.addListener((overrides: DisplayStyle3dSettingsProps) => {\r\n if (overrides.thematic && this.settings.thematic.displayMode === ThematicDisplayMode.Height && undefined === overrides.thematic.range) {\r\n // Use the project extents as reasonable default height range.\r\n // NB: assumes using Z axis...\r\n const extents = this.iModel.projectExtents;\r\n const props = { ...overrides.thematic };\r\n props.range = { low: extents.zLow, high: extents.zHigh };\r\n this.settings.thematic = ThematicDisplay.fromJSON(props);\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public overrideTerrainDisplay(): TerrainDisplayOverrides | undefined {\r\n if (undefined !== this.settings.thematic) {\r\n const ovr = new TerrainDisplayOverrides();\r\n if (this.viewFlags.thematicDisplay && ThematicGradientMode.IsoLines === this.settings.thematic.gradientSettings.mode)\r\n ovr.wantSkirts = false;\r\n if (this.viewFlags.thematicDisplay && (ThematicDisplayMode.Slope === this.settings.thematic.displayMode || ThematicDisplayMode.HillShade === this.settings.thematic.displayMode))\r\n ovr.wantNormals = true;\r\n return ovr;\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"DisplayStyleState.js","sourceRoot":"","sources":["../../src/DisplayStyleState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\nimport { assert, BeEvent, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Angle, Range1d, Vector3d } from \"@itwin/core-geometry\";\r\nimport {\r\n BackgroundMapProps, BackgroundMapProvider, BackgroundMapProviderProps, BackgroundMapSettings,\r\n BaseLayerSettings, BaseMapLayerSettings, CartographicRange, ColorDef, ContextRealityModelProps, DisplayStyle3dSettings, DisplayStyle3dSettingsProps,\r\n DisplayStyleProps, DisplayStyleSettings, Environment, FeatureAppearance, GlobeMode, ImageMapLayerSettings, LightSettings, MapLayerProps,\r\n MapLayerSettings, MapSubLayerProps, ModelMapLayerSettings, RenderSchedule, RenderTimelineProps,\r\n SolarShadowSettings, SubCategoryOverride, SubLayerId, TerrainHeightOriginMode, ThematicDisplay, ThematicDisplayMode, ThematicGradientMode, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport { ApproximateTerrainHeights } from \"./ApproximateTerrainHeights\";\r\nimport { BackgroundMapGeometry } from \"./BackgroundMapGeometry\";\r\nimport { ContextRealityModelState } from \"./ContextRealityModelState\";\r\nimport { ElementState } from \"./EntityState\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { PlanarClipMaskState } from \"./PlanarClipMaskState\";\r\nimport { RenderScheduleState } from \"./RenderScheduleState\";\r\nimport { getCesiumOSMBuildingsUrl, MapCartoRectangle, TileTreeReference } from \"./tile/internal\";\r\nimport { viewGlobalLocation, ViewGlobalLocationConstants } from \"./ViewGlobalLocation\";\r\nimport { ScreenViewport } from \"./Viewport\";\r\nimport { GeometricModelState } from \"./ModelState\";\r\n\r\n/** @internal */\r\nexport class TerrainDisplayOverrides {\r\n public wantSkirts?: boolean;\r\n public wantNormals?: boolean;\r\n public produceGeometry?: boolean;\r\n}\r\n\r\n/** Options controlling display of [OpenStreetMap Buildings](https://cesium.com/platform/cesium-ion/content/cesium-osm-buildings/).\r\n * @see [[DisplayStyleState.setOSMBuildingDisplay]].\r\n * @public\r\n * @extensions\r\n */\r\nexport interface OsmBuildingDisplayOptions {\r\n /** If defined, enables or disables display of the buildings by attaching or detaching the OpenStreetMap Buildings reality model. */\r\n onOff?: boolean;\r\n /** If defined, overrides aspects of the appearance of the OpenStreetMap building meshes. */\r\n appearanceOverrides?: FeatureAppearance;\r\n}\r\n\r\n/** A DisplayStyle defines the parameters for 'styling' the contents of a [[ViewState]].\r\n * @public\r\n * @extensions\r\n */\r\nexport abstract class DisplayStyleState extends ElementState implements DisplayStyleProps {\r\n /** @internal */\r\n public static override get className() { return \"DisplayStyle\"; }\r\n private _scheduleState?: RenderScheduleState;\r\n private _ellipsoidMapGeometry: BackgroundMapGeometry | undefined;\r\n private _attachedRealityModelPlanarClipMasks = new Map<Id64String, PlanarClipMaskState>();\r\n /** @internal */\r\n protected _queryRenderTimelinePropsPromise?: Promise<RenderTimelineProps | undefined>;\r\n\r\n /** Event raised just before the [[scheduleScriptReference]] property is changed. */\r\n public readonly onScheduleScriptReferenceChanged = new BeEvent<(newScriptReference: RenderSchedule.ScriptReference | undefined) => void>();\r\n /** Event raised just after [[setOSMBuildingDisplay]] changes the enabled state of the OSM buildings. */\r\n public readonly onOSMBuildingDisplayChanged = new BeEvent<(osmBuildingDisplayEnabled: boolean) => void>();\r\n\r\n /** The container for this display style's settings. */\r\n public abstract get settings(): DisplayStyleSettings;\r\n\r\n /** @internal */\r\n public abstract overrideTerrainDisplay(): TerrainDisplayOverrides | undefined;\r\n\r\n /** Construct a new DisplayStyleState from its JSON representation.\r\n * @param props JSON representation of the display style.\r\n * @param iModel IModelConnection containing the display style.\r\n * @param source If the constructor is being invoked from [[EntityState.clone]], the display style that is being cloned.\r\n */\r\n constructor(props: DisplayStyleProps, iModel: IModelConnection, source?: DisplayStyleState) {\r\n super(props, iModel);\r\n const styles = this.jsonProperties.styles;\r\n\r\n if (source)\r\n this._scheduleState = source._scheduleState;\r\n\r\n if (styles) {\r\n // ###TODO Use DisplayStyleSettings.planarClipMasks\r\n if (styles.planarClipOvr)\r\n for (const planarClipOvr of styles.planarClipOvr)\r\n if (Id64.isValid(planarClipOvr.modelId))\r\n this._attachedRealityModelPlanarClipMasks.set(planarClipOvr.modelId, PlanarClipMaskState.fromJSON(planarClipOvr));\r\n }\r\n }\r\n\r\n /** Ensures all of the data required by the display style is loaded. This method is invoked for you by [[ViewState.load]], but if\r\n * you obtain a display style by some other means you should `await` this method before using the display style.\r\n */\r\n public async load(): Promise<void> {\r\n // If we were cloned, we may already have a valid schedule state, and our display style Id may be invalid / different.\r\n // Preserve it if still usable.\r\n if (this._scheduleState) {\r\n if (this.settings.renderTimeline === this._scheduleState.sourceId) {\r\n // The script came from the same RenderTimeline element. Keep it.\r\n return;\r\n }\r\n\r\n if (undefined === this.settings.renderTimeline) {\r\n // The script cam from a display style's JSON properties. Keep it if (1) this style is not persistent or (2) this style has the same Id\r\n if (this.id === this._scheduleState.sourceId || !Id64.isValidId64(this.id))\r\n return;\r\n }\r\n }\r\n\r\n if (undefined !== this.settings.renderTimeline)\r\n await this.loadScheduleStateFromTimeline(this.settings.renderTimeline);\r\n else\r\n this.loadScheduleStateFromScript(this.settings.scheduleScriptProps); // eslint-disable-line deprecation/deprecation\r\n }\r\n\r\n private loadScheduleStateFromScript(scriptProps: Readonly<RenderSchedule.ScriptProps> | undefined): void {\r\n let newState;\r\n if (scriptProps) {\r\n try {\r\n const script = RenderSchedule.Script.fromJSON(scriptProps);\r\n if (script)\r\n newState = new RenderScheduleState(this.id, script);\r\n } catch (_) {\r\n // schedule state is undefined.\r\n }\r\n }\r\n\r\n if (newState !== this._scheduleState) {\r\n this.onScheduleScriptReferenceChanged.raiseEvent(newState);\r\n this._scheduleState = newState;\r\n }\r\n }\r\n\r\n private async loadScheduleStateFromTimeline(timelineId: Id64String): Promise<void> {\r\n let newState;\r\n try {\r\n // If a subsequent call to loadScheduleStateFromTimeline is made while we're awaiting this one, we'll abort this one.\r\n const promise = this._queryRenderTimelinePropsPromise = this.queryRenderTimelineProps(timelineId);\r\n const timeline = await promise;\r\n if (promise !== this._queryRenderTimelinePropsPromise)\r\n return;\r\n\r\n if (timeline) {\r\n const scriptProps = JSON.parse(timeline.script);\r\n const script = RenderSchedule.Script.fromJSON(scriptProps);\r\n if (script)\r\n newState = new RenderScheduleState(timelineId, script);\r\n }\r\n } catch (_) {\r\n // schedule state is undefined.\r\n }\r\n\r\n this._queryRenderTimelinePropsPromise = undefined;\r\n if (newState !== this._scheduleState) {\r\n this.onScheduleScriptReferenceChanged.raiseEvent(newState);\r\n this._scheduleState = newState;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected async queryRenderTimelineProps(timelineId: Id64String): Promise<RenderTimelineProps | undefined> {\r\n try {\r\n return await this.iModel.elements.loadProps(timelineId, { renderTimeline: { omitScriptElementIds: true } }) as RenderTimelineProps;\r\n } catch (_) {\r\n return undefined;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public get displayTerrain() {\r\n return this.viewFlags.backgroundMap && this.settings.backgroundMap.applyTerrain;\r\n }\r\n\r\n /** @internal */\r\n public get globeMode(): GlobeMode { return this.settings.backgroundMap.globeMode; }\r\n\r\n /** Settings controlling how the base map is displayed within a view.\r\n * The base map can be provided by any map imagery source or set to be a single color.\r\n */\r\n public get backgroundMapBase(): BaseLayerSettings {\r\n return this.settings.mapImagery.backgroundBase;\r\n }\r\n public set backgroundMapBase(base: BaseLayerSettings) {\r\n this.settings.mapImagery.backgroundBase = base;\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** @internal */\r\n public get backgroundMapLayers(): MapLayerSettings[] { return this.settings.mapImagery.backgroundLayers; }\r\n\r\n /** @internal */\r\n public get overlayMapLayers(): MapLayerSettings[] { return this.settings.mapImagery.overlayLayers; }\r\n\r\n /** The settings controlling how a background map is displayed within a view.\r\n * @see [[ViewFlags.backgroundMap]] for toggling display of the map on or off.\r\n */\r\n public get backgroundMapSettings(): BackgroundMapSettings { return this.settings.backgroundMap; }\r\n public set backgroundMapSettings(settings: BackgroundMapSettings) {\r\n this.settings.backgroundMap = settings;\r\n }\r\n\r\n /** Modify a subset of the background map display settings.\r\n * @param name props JSON representation of the properties to change. Any properties not present will retain their current values in `this.backgroundMapSettings`.\r\n * @see [[ViewFlags.backgroundMap]] for toggling display of the map.\r\n * @see [[changeBackgroundMapProvider]] to change the type of map imagery displayed.\r\n *\r\n * Example that changes only the elevation, leaving the provider and type unchanged:\r\n * ``` ts\r\n * style.changeBackgroundMapProps({ groundBias: 16.2 });\r\n * ```\r\n * @public\r\n */\r\n public changeBackgroundMapProps(props: BackgroundMapProps): void {\r\n const newSettings = this.backgroundMapSettings.clone(props);\r\n this.backgroundMapSettings = newSettings;\r\n }\r\n\r\n /** Change aspects of the [BackgroundMapProvider]($common) from which background map imagery is obtained.\r\n * Any properties not explicitly specified by `props` will retain their current values.\r\n * @public\r\n */\r\n public changeBackgroundMapProvider(props: BackgroundMapProviderProps): void {\r\n const base = this.settings.mapImagery.backgroundBase;\r\n if (base instanceof ColorDef) {\r\n this.settings.mapImagery.backgroundBase = BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON(props));\r\n } else {\r\n const provider = base.provider ? base.provider.clone(props) : BackgroundMapProvider.fromJSON(props);\r\n this.settings.mapImagery.backgroundBase = base.cloneWithProvider(provider);\r\n }\r\n\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** Call a function for each reality model attached to this display style.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common).\r\n */\r\n public forEachRealityModel(func: (model: ContextRealityModelState) => void): void {\r\n for (const model of this.settings.contextRealityModels.models) {\r\n assert(model instanceof ContextRealityModelState);\r\n func(model);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public forEachRealityTileTreeRef(func: (ref: TileTreeReference) => void): void {\r\n this.forEachRealityModel((model) => func(model.treeRef));\r\n }\r\n\r\n /** @internal */\r\n public forEachTileTreeRef(func: (ref: TileTreeReference) => void): void {\r\n this.forEachRealityTileTreeRef(func);\r\n }\r\n\r\n /** Performs logical comparison against another display style. Two display styles are logically equivalent if they have the same name, Id, and settings.\r\n * @param other The display style to which to compare.\r\n * @returns true if the specified display style is logically equivalent to this display style - i.e., both styles have the same values for all of their settings.\r\n */\r\n public equalState(other: DisplayStyleState): boolean {\r\n if (this.name !== other.name || this.id !== other.id)\r\n return false;\r\n else\r\n return JSON.stringify(this.settings) === JSON.stringify(other.settings);\r\n }\r\n\r\n /** The name of this DisplayStyle */\r\n public get name(): string { return this.code.value; }\r\n\r\n /** Change the Id of the [RenderTimeline]($backend) element that hosts the [RenderSchedule.Script]($common) to be applied by this display style for\r\n * animating the contents of the view, and update [[scheduleScriptReference]] using the script associated with the [RenderTimeline]($backend) element.\r\n * @see [DisplayStyleSettings.renderTimeline]($common).\r\n */\r\n public async changeRenderTimeline(timelineId: Id64String | undefined): Promise<void> {\r\n // Potentially trigger async loading of new schedule state.\r\n this.settings.renderTimeline = timelineId;\r\n\r\n // Await async loading if necessary.\r\n // Note the `await` in loadScheduleStateFromTimeline will resolve before this one [per the spec](https://262.ecma-international.org/6.0/#sec-triggerpromisereactions).\r\n if (this._queryRenderTimelinePropsPromise)\r\n await this._queryRenderTimelinePropsPromise;\r\n }\r\n\r\n /** The [RenderSchedule.Script]($common) that animates the contents of the view, if any.\r\n * @see [[changeRenderTimeline]] to change the script.\r\n */\r\n public get scheduleScript(): RenderSchedule.Script | undefined {\r\n return this._scheduleState?.script;\r\n }\r\n\r\n /** The [RenderSchedule.Script]($common) that animates the contents of the view, if any, along with the Id of the element that hosts the script.\r\n * @note The host element may be a [RenderTimeline]($backend) or a [DisplayStyle]($backend).\r\n * @see [[changeRenderTimeline]] to change the script.\r\n */\r\n public get scheduleScriptReference(): RenderSchedule.ScriptReference | undefined {\r\n return this._scheduleState;\r\n }\r\n\r\n /** @internal */\r\n public get scheduleState(): RenderScheduleState | undefined {\r\n return this._scheduleState;\r\n }\r\n\r\n /** This is only used by [RealityTransitionTool]($frontend-devtools). It basically can only work if the script contains nothing that requires special tiles to be generated -\r\n * no symbology changes, transforms, or clipping - because the backend tile generator requires a *persistent* element to host the script for those features to work.\r\n * @internal\r\n */\r\n public setScheduleState(state: RenderScheduleState | undefined): void {\r\n if (state === this._scheduleState)\r\n return;\r\n\r\n this.onScheduleScriptReferenceChanged.raiseEvent(state);\r\n this._scheduleState = state;\r\n\r\n // eslint-disable-next-line deprecation/deprecation\r\n this.settings.scheduleScriptProps = state?.script.toJSON();\r\n }\r\n\r\n /** Attach a [ContextRealityModel]($common) to this display style.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common).\r\n * @see [ContextRealityModels.add]($common)\r\n */\r\n public attachRealityModel(props: ContextRealityModelProps): ContextRealityModelState {\r\n const model = this.settings.contextRealityModels.add(props);\r\n assert(model instanceof ContextRealityModelState);\r\n return model;\r\n }\r\n\r\n /** Detach the first [ContextRealityModel]($common) that matches the specified name and url.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common)\r\n * @see [ContextRealityModels.delete]($common)\r\n */\r\n public detachRealityModelByNameAndUrl(name: string, url: string): boolean {\r\n const model = this.settings.contextRealityModels.models.find((x) => x.matchesNameAndUrl(name, url));\r\n return undefined !== model && this.settings.contextRealityModels.delete(model);\r\n }\r\n\r\n /** Get the [[ContextRealityModelState]] that displays the OpenStreetMap worldwide building layer, if enabled.\r\n * @see [[setOSMBuildingDisplay]]\r\n */\r\n public getOSMBuildingRealityModel(): ContextRealityModelState | undefined {\r\n if (!this.iModel.isGeoLocated || this.globeMode !== GlobeMode.Ellipsoid) // The OSM tile tree is ellipsoidal.\r\n return undefined;\r\n\r\n const url = getCesiumOSMBuildingsUrl();\r\n if (undefined === url)\r\n return undefined;\r\n\r\n return this.contextRealityModelStates.find((x) => x.url === url);\r\n }\r\n\r\n /** Set the display of the OpenStreetMap worldwide building layer in this display style by attaching or detaching the reality model displaying the buildings.\r\n * The OSM buildings are displayed from a reality model aggregated and served from Cesium ion.<(https://cesium.com/content/cesium-osm-buildings/>\r\n * The options [[OsmBuildingDisplayOptions]] control the display and appearance overrides.\r\n */\r\n public setOSMBuildingDisplay(options: OsmBuildingDisplayOptions): boolean {\r\n if (!this.iModel.isGeoLocated || this.globeMode !== GlobeMode.Ellipsoid) // The OSM tile tree is ellipsoidal.\r\n return false;\r\n\r\n const url = getCesiumOSMBuildingsUrl();\r\n if (undefined === url)\r\n return false;\r\n\r\n let model = this.settings.contextRealityModels.models.find((x) => x.url === url);\r\n if (options.onOff === false) {\r\n const turnedOff = undefined !== model && this.settings.contextRealityModels.delete(model);\r\n if (turnedOff)\r\n this.onOSMBuildingDisplayChanged.raiseEvent(false);\r\n\r\n return turnedOff;\r\n }\r\n\r\n if (!model) {\r\n const name = IModelApp.localization.getLocalizedString(\"iModelJs:RealityModelNames.OSMBuildings\");\r\n model = this.attachRealityModel({ tilesetUrl: url, name });\r\n this.onOSMBuildingDisplayChanged.raiseEvent(true);\r\n }\r\n\r\n if (options.appearanceOverrides)\r\n model.appearanceOverrides = options.appearanceOverrides;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Return if a context reality model is attached.\r\n * @see [[ContextRealityModelProps]].\r\n * */\r\n public hasAttachedRealityModel(name: string, url: string): boolean {\r\n return undefined !== this.settings.contextRealityModels.models.find((x) => x.matchesNameAndUrl(name, url));\r\n }\r\n\r\n /** @internal */\r\n public getMapLayers(isOverlay: boolean) { return isOverlay ? this.overlayMapLayers : this.backgroundMapLayers; }\r\n\r\n /**\r\n * Attach a map layer to display style.\r\n * @param Settings representing the map layer.\r\n * @param isOverlay true if layer is overlay, otherwise layer is background. Defaults to false.\r\n * @param index where the layer should be inserted. Defaults to -1, appended to end.\r\n * @public\r\n *\r\n */\r\n public attachMapLayer(options: { settings: MapLayerSettings, isOverlay?: boolean, insertIndex?: number}): void {\r\n const layerSettings = options.settings.clone({});\r\n if (undefined === layerSettings)\r\n return;\r\n\r\n const isOverlay = options.isOverlay ?? false;\r\n const insertIndex = options.insertIndex ?? -1;\r\n const layers = this.getMapLayers(isOverlay);\r\n\r\n if (insertIndex < 0 || insertIndex > (layers.length - 1)) {\r\n this.getMapLayers(isOverlay).push(layerSettings);\r\n } else {\r\n layers.splice(insertIndex, 0, layerSettings);\r\n }\r\n\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** @internal */\r\n public attachMapLayerProps(options: { props: MapLayerProps, isOverlay?: boolean, insertIndex?: number}): void {\r\n const settings = MapLayerSettings.fromJSON(options.props);\r\n if (undefined === settings)\r\n return;\r\n\r\n this.attachMapLayer({settings, isOverlay: options.isOverlay, insertIndex:options.insertIndex});\r\n }\r\n\r\n /** @internal */\r\n public hasAttachedMapLayer(name: string, source: string, isOverlay: boolean): boolean {\r\n return -1 !== this.findMapLayerIndexByNameAndSource(name, source, isOverlay);\r\n }\r\n\r\n /** @internal */\r\n public detachMapLayerByNameAndSource(name: string, source: string, isOverlay: boolean): void {\r\n const index = this.findMapLayerIndexByNameAndSource(name, source, isOverlay);\r\n if (- 1 !== index)\r\n this.detachMapLayerByIndex(index, isOverlay);\r\n }\r\n\r\n /** Detach map layer at index (-1 to remove all layers)\r\n * @public\r\n */\r\n public detachMapLayerByIndex(index: number, isOverlay: boolean): void {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index < 0)\r\n layers.length = 0;\r\n else\r\n layers.splice(index, 1);\r\n\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /**\r\n * Lookup a maplayer index by name and source.\r\n * @param name Name of of the layer.\r\n * @param source Unique string identifying the layer.\r\n * @param isOverlay true if layer is overlay, otherwise layer is background. Defaults to false.\r\n * @public\r\n *\r\n */\r\n public findMapLayerIndexByNameAndSource(name: string, source: string, isOverlay: boolean) {\r\n return this.getMapLayers(isOverlay).findIndex((layer) => layer.matchesNameAndSource(name, source));\r\n }\r\n\r\n /** @public */\r\n public mapLayerAtIndex(index: number, isOverlay: boolean): MapLayerSettings | undefined {\r\n const layers = this.getMapLayers(isOverlay);\r\n return (index < 0 || index >= layers.length) ? undefined : layers[index];\r\n }\r\n\r\n /** Return map base transparency as a number between 0 and 1.\r\n * @public\r\n */\r\n public get baseMapTransparency(): number {\r\n return this.settings.mapImagery.baseTransparency;\r\n }\r\n\r\n /** Change the map base transparency as a number between 0 and 1.\r\n * @public\r\n */\r\n public changeBaseMapTransparency(transparency: number) {\r\n if (this.settings.mapImagery.backgroundBase instanceof ColorDef) {\r\n this.settings.mapImagery.backgroundBase = this.settings.mapImagery.backgroundBase.withTransparency(transparency * 255);\r\n } else {\r\n this.settings.mapImagery.backgroundBase = this.settings.mapImagery.backgroundBase.clone({transparency});\r\n }\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** Modify a subset of a map layer settings.\r\n * @param props props JSON representation of the properties to change. Any properties not present will retain their current values.\r\n * @param index where the layer should be inserted.\r\n * @param isOverlay true if layer is overlay, otherwise layer is background.\r\n *\r\n * Example that changes only the visibility of the first overlay map layer.\r\n * ``` ts\r\n * style.changeMapLayerProps({ visible: false }, 0, false);\r\n * ```\r\n * @public\r\n */\r\n public changeMapLayerProps(props: Partial<MapLayerProps>, index: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index < 0 || index >= layers.length)\r\n return;\r\n layers[index] = layers[index].clone(props);\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** @public */\r\n public changeMapLayerCredentials(index: number, isOverlay: boolean, userName?: string, password?: string,) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index < 0 || index >= layers.length)\r\n return;\r\n const layer = layers[index];\r\n if (layer instanceof ImageMapLayerSettings) {\r\n layer.setCredentials(userName, password);\r\n this._synchBackgroundMapImagery();\r\n }\r\n }\r\n\r\n /** Modify a subset of a sub-layer settings.\r\n * @param props props JSON representation of the properties to change. Any properties not present will retain their current values.\r\n * @param subLayerId Id of the sub-layer that should be modified.\r\n * @param layerIndex of the owning map layer.\r\n * @param isOverlay true if the map layer is overlay, otherwise layer is background\r\n *\r\n * @public\r\n */\r\n public changeMapSubLayerProps(props: Partial<MapSubLayerProps>, subLayerId: SubLayerId, layerIndex: number, isOverlay: boolean) {\r\n const mapLayerSettings = this.mapLayerAtIndex(layerIndex, isOverlay);\r\n if (undefined === mapLayerSettings)\r\n return;\r\n\r\n if (!(mapLayerSettings instanceof ImageMapLayerSettings)) {\r\n assert (false);\r\n return;\r\n }\r\n\r\n const subLayers = new Array<MapSubLayerProps>();\r\n for (const subLayer of mapLayerSettings.subLayers) {\r\n subLayers.push((subLayerId === -1 || subLayer.id === subLayerId) ? subLayer.clone(props).toJSON() : subLayer.toJSON());\r\n }\r\n\r\n this.changeMapLayerProps({ subLayers }, layerIndex, isOverlay);\r\n }\r\n\r\n /** Returns the cartographic range of map layer.\r\n * @param layerIndex of the map layer.\r\n * @param isOverlay true if the map layer is overlay, otherwise layer is background\r\n *\r\n * @internal\r\n */\r\n public async getMapLayerRange(layerIndex: number, isOverlay: boolean): Promise<MapCartoRectangle | undefined> {\r\n const mapLayerSettings = this.mapLayerAtIndex(layerIndex, isOverlay);\r\n if (undefined === mapLayerSettings)\r\n return undefined;\r\n\r\n if (mapLayerSettings instanceof ModelMapLayerSettings) {\r\n const ecefTransform = this.iModel.ecefLocation?.getTransform();\r\n if (!ecefTransform)\r\n return undefined;\r\n const model = this.iModel.models.getLoaded(mapLayerSettings.modelId);\r\n if (!model || !(model instanceof GeometricModelState))\r\n return undefined;\r\n\r\n const modelRange = await model.queryModelRange();\r\n const cartoRange = new CartographicRange(modelRange, ecefTransform).getLongitudeLatitudeBoundingBox();\r\n\r\n return MapCartoRectangle.create(cartoRange.low.x, cartoRange.low.y, cartoRange.high.x, cartoRange.high.y);\r\n }\r\n if (! (mapLayerSettings instanceof ImageMapLayerSettings)) {\r\n assert(false);\r\n return undefined;\r\n }\r\n\r\n const imageryProvider = IModelApp.mapLayerFormatRegistry.createImageryProvider(mapLayerSettings);\r\n if (undefined === imageryProvider)\r\n return undefined;\r\n\r\n try {\r\n await imageryProvider.initialize();\r\n return imageryProvider.cartoRange;\r\n\r\n } catch (_error) {\r\n return undefined;\r\n }\r\n return undefined;\r\n }\r\n\r\n /** change viewport to include range of map layer.\r\n * @internal\r\n */\r\n public async viewMapLayerRange(layerIndex: number, isOverlay: boolean, vp: ScreenViewport): Promise<boolean> {\r\n const range = await this.getMapLayerRange(layerIndex, isOverlay);\r\n if (!range)\r\n return false;\r\n\r\n if (range.xLength() > 1.5 * Angle.piRadians)\r\n viewGlobalLocation(vp, true, ViewGlobalLocationConstants.satelliteHeightAboveEarthInMeters, undefined, undefined);\r\n else\r\n viewGlobalLocation(vp, true, undefined, undefined, range.globalLocation);\r\n\r\n return true;\r\n }\r\n\r\n /* @internal */\r\n private _synchBackgroundMapImagery() {\r\n this.settings.synchMapImagery();\r\n }\r\n\r\n /**\r\n * Move map layer to top.\r\n * @param index index of layer to move.\r\n * @param isOverlay true if layer is overlay.\r\n * @public\r\n *\r\n */\r\n public moveMapLayerToTop(index: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index >= 0 && index < layers.length - 1) {\r\n const layer = layers.splice(index, 1);\r\n layers.push(layer[0]);\r\n this._synchBackgroundMapImagery();\r\n }\r\n }\r\n\r\n /**\r\n * Move map layer to bottom.\r\n * @param index index of layer to move.\r\n * @param isOverlay true if layer is overlay.\r\n * @public\r\n */\r\n public moveMapLayerToBottom(index: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (index > 0 && index < layers.length) {\r\n const layer = layers.splice(index, 1);\r\n layers.unshift(layer[0]);\r\n this._synchBackgroundMapImagery();\r\n }\r\n }\r\n\r\n /**\r\n * Reorder map layers\r\n * @param fromIndex index of map layer to move\r\n * @param toIndex insert index. If equal to length of map array the map layer is moved to end of array.\r\n * @public\r\n */\r\n public moveMapLayerToIndex(fromIndex: number, toIndex: number, isOverlay: boolean) {\r\n const layers = this.getMapLayers(isOverlay);\r\n if (fromIndex === toIndex)\r\n return;\r\n\r\n if (fromIndex < 0 || fromIndex >= layers.length || toIndex > layers.length)\r\n return;\r\n\r\n const layer = layers.splice(fromIndex, 1);\r\n layers.splice(toIndex, 0, layer[0]); // note: if toIndex === settings.mapImagery.backgroundLayers.length item is appended\r\n this._synchBackgroundMapImagery();\r\n }\r\n\r\n /** Flags controlling various aspects of the display style.\r\n * @see [DisplayStyleSettings.viewFlags]($common)\r\n */\r\n public get viewFlags(): ViewFlags { return this.settings.viewFlags; }\r\n public set viewFlags(flags: ViewFlags) { this.settings.viewFlags = flags; }\r\n\r\n /** The background color for this DisplayStyle */\r\n public get backgroundColor(): ColorDef { return this.settings.backgroundColor; }\r\n public set backgroundColor(val: ColorDef) { this.settings.backgroundColor = val; }\r\n\r\n /** The color used to draw geometry in monochrome mode.\r\n * @see [ViewFlags.monochrome]($common) for enabling monochrome mode.\r\n */\r\n public get monochromeColor(): ColorDef { return this.settings.monochromeColor; }\r\n public set monochromeColor(val: ColorDef) { this.settings.monochromeColor = val; }\r\n\r\n private _backgroundMapGeometry?: {\r\n bimElevationBias: number;\r\n geometry: BackgroundMapGeometry;\r\n globeMode: GlobeMode;\r\n };\r\n\r\n /** @internal */\r\n public anyMapLayersVisible(overlay: boolean): boolean {\r\n const layers = this.getMapLayers(overlay);\r\n\r\n for (const mapLayer of layers)\r\n if (mapLayer.visible)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public getIsBackgroundMapVisible(): boolean {\r\n return undefined !== this.iModel.ecefLocation && (this.viewFlags.backgroundMap || this.anyMapLayersVisible(false));\r\n }\r\n /** @internal */\r\n public get backgroundMapElevationBias(): number | undefined {\r\n if (this.backgroundMapSettings.applyTerrain) {\r\n const terrainSettings = this.backgroundMapSettings.terrainSettings;\r\n switch (terrainSettings.heightOriginMode) {\r\n case TerrainHeightOriginMode.Ground:\r\n return (undefined === this.iModel.projectCenterAltitude) ? undefined : terrainSettings.heightOrigin + terrainSettings.exaggeration * this.iModel.projectCenterAltitude;\r\n\r\n case TerrainHeightOriginMode.Geodetic:\r\n return terrainSettings.heightOrigin;\r\n\r\n case TerrainHeightOriginMode.Geoid:\r\n return (undefined === this.iModel.geodeticToSeaLevel) ? undefined : terrainSettings.heightOrigin + this.iModel.geodeticToSeaLevel;\r\n }\r\n } else {\r\n return this.backgroundMapSettings.groundBias;\r\n }\r\n\r\n }\r\n\r\n /** @internal */\r\n public getBackgroundMapGeometry(): BackgroundMapGeometry | undefined {\r\n if (undefined === this.iModel.ecefLocation)\r\n return undefined;\r\n\r\n const bimElevationBias = this.backgroundMapElevationBias;\r\n\r\n if (undefined === bimElevationBias)\r\n return undefined;\r\n\r\n const globeMode = this.globeMode;\r\n if (undefined === this._backgroundMapGeometry || this._backgroundMapGeometry.globeMode !== globeMode || this._backgroundMapGeometry.bimElevationBias !== bimElevationBias) {\r\n const geometry = new BackgroundMapGeometry(bimElevationBias, globeMode, this.iModel);\r\n this._backgroundMapGeometry = { bimElevationBias, geometry, globeMode };\r\n }\r\n return this._backgroundMapGeometry.geometry;\r\n }\r\n\r\n /** [[ContextRealityModelState]]s attached to this display style.\r\n * @see [DisplayStyleSettings.contextRealityModels]($common).\r\n */\r\n public get contextRealityModelStates(): ReadonlyArray<ContextRealityModelState> {\r\n return this.settings.contextRealityModels.models as ContextRealityModelState[];\r\n }\r\n\r\n /** @internal */\r\n public getGlobalGeometryAndHeightRange(): { geometry: BackgroundMapGeometry, heightRange: Range1d } | undefined {\r\n let geometry = this.getIsBackgroundMapVisible() ? this.getBackgroundMapGeometry() : undefined;\r\n const terrainRange = ApproximateTerrainHeights.instance.globalHeightRange;\r\n let heightRange = this.displayTerrain ? terrainRange : Range1d.createXX(-1, 1);\r\n if (this.globeMode === GlobeMode.Ellipsoid && this.contextRealityModelStates.find((model) => model.isGlobal)) {\r\n if (!geometry) {\r\n if (!this._ellipsoidMapGeometry)\r\n this._ellipsoidMapGeometry = new BackgroundMapGeometry(0, GlobeMode.Ellipsoid, this.iModel);\r\n\r\n geometry = this._ellipsoidMapGeometry;\r\n }\r\n\r\n heightRange = terrainRange;\r\n }\r\n\r\n return geometry ? { geometry, heightRange } : undefined;\r\n }\r\n\r\n /** Returns true if this is a 3d display style. */\r\n public is3d(): this is DisplayStyle3dState { return this instanceof DisplayStyle3dState; }\r\n\r\n /** Customize the way geometry belonging to a [[SubCategory]] is drawn by this display style.\r\n * @param id The ID of the SubCategory whose appearance is to be overridden.\r\n * @param ovr The overrides to apply to the [[SubCategoryAppearance]].\r\n * @see [[dropSubCategoryOverride]]\r\n */\r\n public overrideSubCategory(id: Id64String, ovr: SubCategoryOverride) { this.settings.overrideSubCategory(id, ovr); }\r\n\r\n /** Remove any [[SubCategoryOverride]] applied to a [[SubCategoryAppearance]] by this style.\r\n * @param id The ID of the [[SubCategory]].\r\n * @see [[overrideSubCategory]]\r\n */\r\n public dropSubCategoryOverride(id: Id64String) { this.settings.dropSubCategoryOverride(id); }\r\n\r\n /** Returns true if an [[SubCategoryOverride]]s are defined by this style. */\r\n public get hasSubCategoryOverride() { return this.settings.hasSubCategoryOverride; }\r\n\r\n /** Obtain the overrides applied to a [[SubCategoryAppearance]] by this style.\r\n * @param id The ID of the [[SubCategory]].\r\n * @returns The corresponding SubCategoryOverride, or undefined if the SubCategory's appearance is not overridden.\r\n * @see [[overrideSubCategory]]\r\n */\r\n public getSubCategoryOverride(id: Id64String): SubCategoryOverride | undefined { return this.settings.getSubCategoryOverride(id); }\r\n\r\n /** @internal */\r\n public get wantShadows(): boolean {\r\n return this.is3d() && this.viewFlags.shadows && false !== IModelApp.renderSystem.options.displaySolarShadows;\r\n }\r\n\r\n /** @internal */\r\n protected registerSettingsEventListeners(): void {\r\n // eslint-disable-next-line deprecation/deprecation\r\n this.settings.onScheduleScriptPropsChanged.addListener((scriptProps) => {\r\n if (undefined === this.settings.renderTimeline)\r\n this.loadScheduleStateFromScript(scriptProps);\r\n });\r\n\r\n this.settings.onRenderTimelineChanged.addListener((newTimeline) => {\r\n // Cancel any in-progress loading of script from timeline.\r\n this._queryRenderTimelinePropsPromise = undefined;\r\n\r\n if (undefined !== newTimeline)\r\n this.loadScheduleStateFromTimeline(newTimeline); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n else\r\n this.loadScheduleStateFromScript(this.settings.scheduleScriptProps); // eslint-disable-line deprecation/deprecation\r\n });\r\n\r\n this.settings.onPlanarClipMaskChanged.addListener((id, newSettings) => {\r\n if (newSettings)\r\n this._attachedRealityModelPlanarClipMasks.set(id, PlanarClipMaskState.create(newSettings));\r\n else\r\n this._attachedRealityModelPlanarClipMasks.delete(id);\r\n });\r\n }\r\n\r\n /** @internal */\r\n protected createRealityModel(props: ContextRealityModelProps): ContextRealityModelState {\r\n return new ContextRealityModelState(props, this.iModel, this);\r\n }\r\n\r\n /** @internal */\r\n public getPlanarClipMaskState(modelId: Id64String): PlanarClipMaskState | undefined {\r\n const model = this.iModel.models.getLoaded(modelId)?.asSpatialModel;\r\n return (model && model.isRealityModel) ? this._attachedRealityModelPlanarClipMasks.get(modelId) : undefined;\r\n }\r\n}\r\n\r\n/** A display style that can be applied to 2d views.\r\n * @public\r\n * @extensions\r\n */\r\nexport class DisplayStyle2dState extends DisplayStyleState {\r\n /** @internal */\r\n public static override get className() { return \"DisplayStyle2d\"; }\r\n private readonly _settings: DisplayStyleSettings;\r\n\r\n public get settings(): DisplayStyleSettings { return this._settings; }\r\n\r\n /** @internal */\r\n public overrideTerrainDisplay(): TerrainDisplayOverrides | undefined { return undefined; }\r\n\r\n constructor(props: DisplayStyleProps, iModel: IModelConnection) {\r\n super(props, iModel);\r\n this._settings = new DisplayStyleSettings(this.jsonProperties, { createContextRealityModel: (modelProps) => this.createRealityModel(modelProps) });\r\n this.registerSettingsEventListeners();\r\n }\r\n}\r\n\r\n/** A [[DisplayStyleState]] that can be applied to spatial views.\r\n * @public\r\n * @extensions\r\n */\r\nexport class DisplayStyle3dState extends DisplayStyleState {\r\n /** @internal */\r\n public static override get className() { return \"DisplayStyle3d\"; }\r\n private _settings: DisplayStyle3dSettings;\r\n\r\n public get settings(): DisplayStyle3dSettings { return this._settings; }\r\n\r\n public constructor(props: DisplayStyleProps, iModel: IModelConnection, source?: DisplayStyle3dState) {\r\n super(props, iModel, source);\r\n this._settings = new DisplayStyle3dSettings(this.jsonProperties, { createContextRealityModel: (modelProps) => this.createRealityModel(modelProps) });\r\n this.registerSettingsEventListeners();\r\n }\r\n\r\n public get environment(): Environment {\r\n return this.settings.environment;\r\n }\r\n public set environment(env: Environment) {\r\n this.settings.environment = env;\r\n }\r\n\r\n public get lights(): LightSettings { return this.settings.lights; }\r\n public set lights(lights: LightSettings) { this.settings.lights = lights; }\r\n\r\n /** The direction of the solar light. */\r\n public get sunDirection(): Readonly<Vector3d> {\r\n return this.settings.lights.solar.direction;\r\n }\r\n\r\n /** Set the solar light direction based on time value\r\n * @param time The time in unix time milliseconds.\r\n * @see [DisplayStyle3dSettings.sunTime]($common) to obtain the current sun time.\r\n * @see [DisplayStyle3dSettings.setSunTime]($common).\r\n */\r\n public setSunTime(time: number) {\r\n this.settings.setSunTime(time, this.iModel);\r\n }\r\n\r\n /** Settings controlling shadow display. */\r\n public get solarShadows(): SolarShadowSettings {\r\n return this.settings.solarShadows;\r\n }\r\n public set solarShadows(settings: SolarShadowSettings) {\r\n this.settings.solarShadows = settings;\r\n }\r\n\r\n /** @internal */\r\n protected override registerSettingsEventListeners(): void {\r\n super.registerSettingsEventListeners();\r\n\r\n this.settings.onOverridesApplied.addListener((overrides: DisplayStyle3dSettingsProps) => {\r\n if (overrides.thematic && this.settings.thematic.displayMode === ThematicDisplayMode.Height && undefined === overrides.thematic.range) {\r\n // Use the project extents as reasonable default height range.\r\n // NB: assumes using Z axis...\r\n const extents = this.iModel.projectExtents;\r\n const props = { ...overrides.thematic };\r\n props.range = { low: extents.zLow, high: extents.zHigh };\r\n this.settings.thematic = ThematicDisplay.fromJSON(props);\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public overrideTerrainDisplay(): TerrainDisplayOverrides | undefined {\r\n if (undefined !== this.settings.thematic) {\r\n const ovr = new TerrainDisplayOverrides();\r\n if (this.viewFlags.thematicDisplay && ThematicGradientMode.IsoLines === this.settings.thematic.gradientSettings.mode)\r\n ovr.wantSkirts = false;\r\n if (this.viewFlags.thematicDisplay && (ThematicDisplayMode.Slope === this.settings.thematic.displayMode || ThematicDisplayMode.HillShade === this.settings.thematic.displayMode))\r\n ovr.wantNormals = true;\r\n return ovr;\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
|
|
@@ -29,10 +29,13 @@ export declare class ExtensionAdmin {
|
|
|
29
29
|
*/
|
|
30
30
|
addExtensions(providers: ExtensionProvider[]): Promise<void[]>;
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
32
|
+
* Registers a hostname for an extension.
|
|
33
|
+
* Once a hostname has been registered, only remote extensions from registered hosts are permitted to be added.
|
|
34
|
+
* @param hostUrl (string) Accepts both URLs and hostnames (e.g., http://localhost:3000, yourdomain.com, https://www.yourdomain.com, etc.).
|
|
34
35
|
*/
|
|
35
36
|
registerHost(hostUrl: string): void;
|
|
37
|
+
/** Returns the hostname of an input string. Throws an error if input is not a valid hostname (or URL). */
|
|
38
|
+
private getHostName;
|
|
36
39
|
/** Loops over all enabled Extensions and triggers each one if the provided event is defined. */
|
|
37
40
|
private activateExtensionEvents;
|
|
38
41
|
/** Executes the extension. Catches and logs any errors (so that an extension will not crash the main application). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionAdmin.d.ts","sourceRoot":"","sources":["../../../src/extension/ExtensionAdmin.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA4BxE;;;GAGG;AACH,qBAAa,cAAc;IACzB,2GAA2G;IAC3G,OAAO,CAAC,WAAW,CAA0E;IAC7F,OAAO,CAAC,MAAM,CAAW;IAEzB;;OAEG;IACI,SAAS,sBAEd;;IAMF;;;;;OAKG;IACU,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrE;;;;OAIG;IACU,aAAa,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAM3E
|
|
1
|
+
{"version":3,"file":"ExtensionAdmin.d.ts","sourceRoot":"","sources":["../../../src/extension/ExtensionAdmin.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA4BxE;;;GAGG;AACH,qBAAa,cAAc;IACzB,2GAA2G;IAC3G,OAAO,CAAC,WAAW,CAA0E;IAC7F,OAAO,CAAC,MAAM,CAAW;IAEzB;;OAEG;IACI,SAAS,sBAEd;;IAMF;;;;;OAKG;IACU,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrE;;;;OAIG;IACU,aAAa,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAM3E;;;;OAIG;IACI,YAAY,CAAC,OAAO,EAAE,MAAM;IAOnC,0GAA0G;IAC1G,OAAO,CAAC,WAAW;IAgBnB,gGAAgG;YAClF,uBAAuB;IAWrC,sHAAsH;YACxG,QAAQ;CAOvB"}
|
|
@@ -47,7 +47,7 @@ export class ExtensionAdmin {
|
|
|
47
47
|
provider.execute(); // eslint-disable-line @typescript-eslint/no-floating-promises
|
|
48
48
|
}
|
|
49
49
|
catch (e) {
|
|
50
|
-
throw new Error(`Failed to get manifest
|
|
50
|
+
throw new Error(`Failed to get extension manifest ${provider.hostname ? `at ${provider.hostname}` : ""}: ${e}`);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
@@ -59,13 +59,31 @@ export class ExtensionAdmin {
|
|
|
59
59
|
return Promise.all(providers.map(async (provider) => this.addExtension(provider)));
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
62
|
+
* Registers a hostname for an extension.
|
|
63
|
+
* Once a hostname has been registered, only remote extensions from registered hosts are permitted to be added.
|
|
64
|
+
* @param hostUrl (string) Accepts both URLs and hostnames (e.g., http://localhost:3000, yourdomain.com, https://www.yourdomain.com, etc.).
|
|
64
65
|
*/
|
|
65
66
|
registerHost(hostUrl) {
|
|
66
|
-
const
|
|
67
|
-
if (this._hosts.indexOf(
|
|
68
|
-
this._hosts.push(
|
|
67
|
+
const hostname = this.getHostName(hostUrl);
|
|
68
|
+
if (this._hosts.indexOf(hostname) < 0) {
|
|
69
|
+
this._hosts.push(hostname);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Returns the hostname of an input string. Throws an error if input is not a valid hostname (or URL). */
|
|
73
|
+
getHostName(inputUrl) {
|
|
74
|
+
// inputs without a protocol (e.g., http://) will throw an error in URL constructor
|
|
75
|
+
const inputWithProtocol = /(http|https):\/\//.test(inputUrl) ?
|
|
76
|
+
inputUrl :
|
|
77
|
+
`https://${inputUrl}`;
|
|
78
|
+
try {
|
|
79
|
+
const hostname = new URL(inputWithProtocol).hostname.replace("www.", "");
|
|
80
|
+
return hostname;
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
if (e instanceof TypeError) {
|
|
84
|
+
throw new Error("Argument hostUrl should be a valid URL or hostname (i.e. http://localhost:3000, yourdomain.com, etc.).");
|
|
85
|
+
}
|
|
86
|
+
throw e;
|
|
69
87
|
}
|
|
70
88
|
}
|
|
71
89
|
/** Loops over all enabled Extensions and triggers each one if the provided event is defined. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionAdmin.js","sourceRoot":"","sources":["../../../src/extension/ExtensionAdmin.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AA6BnE;;;GAGG;AACH,MAAM,OAAO,cAAc;IAYzB;QAXA,2GAA2G;QACnG,gBAAW,GAAoC,IAAI,GAAG,EAA8B,CAAC;QAG7F;;WAEG;QACI,cAAS,GAAG,KAAK,IAAI,EAAE;YAC5B,MAAM,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC,CAAC;QAGA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,YAAY,CAAC,QAA2B;QACnD,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACnC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC/D,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,sBAAsB,CAAC,CAAC;aAC7E;SACF;QACD,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAClC,QAAQ;gBACR,QAAQ;aACT,CAAC,CAAC;YACH,2DAA2D;YAC3D,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACjD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,8DAA8D;SACrF;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"ExtensionAdmin.js","sourceRoot":"","sources":["../../../src/extension/ExtensionAdmin.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Extensions\r\n */\r\n\r\nimport { Logger } from \"@itwin/core-bentley\";\r\n\r\nimport { FrontendLoggerCategory } from \"../FrontendLoggerCategory\";\r\nimport type { ExtensionManifest, ExtensionProvider } from \"./Extension\";\r\n\r\n/** The Extensions loading system has the following goals:\r\n * 1. Only fetch what is needed when it is required\r\n * 1. Load a manifest file\r\n * 2. Load the the main module when necessary (usually at an activation event)\r\n * 2. Download the extension's files\r\n *\r\n * 3 ways to load an Extension into the system:\r\n *\r\n * 1. Load both the Extension Manifest and import the main module of the extension from a local file/package.\r\n * 2. A minimum set of properties to get the manifest and javascript from a remote server.\r\n * 3. A minimum set of properties to get the manifest and javascript from Bentley's Extension Service.\r\n *\r\n * An Extension must be added to ExtensionAdmin before it can be executed during activation events.\r\n */\r\n\r\n/**\r\n * A \"ready to use\" Extension (contains a manifest object and an extension provider to help execute).\r\n * Will be used as the type for in-memory extensions in the ExtensionAdmin\r\n */\r\ninterface InstalledExtension {\r\n /** An extension provider that has been added to ExtensionAdmin */\r\n provider: ExtensionProvider;\r\n /** The manifest (package.json) of the extension */\r\n manifest: ExtensionManifest;\r\n}\r\n\r\n/** The Extension Admin controls the list of currently loaded Extensions.\r\n *\r\n * @alpha\r\n */\r\nexport class ExtensionAdmin {\r\n /** Defines the set of extensions that are currently known and can be invoked during activation events. */\r\n private _extensions: Map<string, InstalledExtension> = new Map<string, InstalledExtension>();\r\n private _hosts: string[];\r\n\r\n /** Fired when an Extension has been added or removed.\r\n * @internal\r\n */\r\n public onStartup = async () => {\r\n await this.activateExtensionEvents(\"onStartup\");\r\n };\r\n\r\n public constructor() {\r\n this._hosts = [];\r\n }\r\n\r\n /**\r\n * Adds an extension.\r\n * The manifest will be fetched and the extension will be activated on an activation event.\r\n * @param provider\r\n * @alpha\r\n */\r\n public async addExtension(provider: ExtensionProvider): Promise<void> {\r\n if (provider.hostname) {\r\n const hostName = provider.hostname;\r\n if (this._hosts.length > 0 && this._hosts.indexOf(hostName) < 0) {\r\n throw new Error(`Error loading extension: ${hostName} was not registered.`);\r\n }\r\n }\r\n try {\r\n const manifest = await provider.getManifest();\r\n this._extensions.set(manifest.name, {\r\n manifest,\r\n provider,\r\n });\r\n // TODO - temporary fix to execute the missed startup event\r\n if (manifest.activationEvents.includes(\"onStartup\"))\r\n provider.execute(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n } catch (e) {\r\n throw new Error(`Failed to get extension manifest ${provider.hostname ? `at ${provider.hostname}` : \"\"}: ${e}`);\r\n }\r\n }\r\n\r\n /**\r\n * Adds a list of extensions\r\n * @param providers\r\n * @alpha\r\n */\r\n public async addExtensions(providers: ExtensionProvider[]): Promise<void[]> {\r\n return Promise.all(\r\n providers.map(async (provider) => this.addExtension(provider))\r\n );\r\n }\r\n\r\n /**\r\n * Registers a hostname for an extension.\r\n * Once a hostname has been registered, only remote extensions from registered hosts are permitted to be added.\r\n * @param hostUrl (string) Accepts both URLs and hostnames (e.g., http://localhost:3000, yourdomain.com, https://www.yourdomain.com, etc.).\r\n */\r\n public registerHost(hostUrl: string) {\r\n const hostname = this.getHostName(hostUrl);\r\n if (this._hosts.indexOf(hostname) < 0) {\r\n this._hosts.push(hostname);\r\n }\r\n }\r\n\r\n /** Returns the hostname of an input string. Throws an error if input is not a valid hostname (or URL). */\r\n private getHostName(inputUrl: string): string {\r\n // inputs without a protocol (e.g., http://) will throw an error in URL constructor\r\n const inputWithProtocol = /(http|https):\\/\\//.test(inputUrl) ?\r\n inputUrl :\r\n `https://${inputUrl}`;\r\n try {\r\n const hostname = new URL(inputWithProtocol).hostname.replace(\"www.\", \"\");\r\n return hostname;\r\n } catch (e) {\r\n if (e instanceof TypeError) {\r\n throw new Error(\"Argument hostUrl should be a valid URL or hostname (i.e. http://localhost:3000, yourdomain.com, etc.).\");\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n /** Loops over all enabled Extensions and triggers each one if the provided event is defined. */\r\n private async activateExtensionEvents(event: string) {\r\n for (const extension of this._extensions.values()) {\r\n if (!extension.manifest.activationEvents) continue;\r\n for (const activationEvent of extension.manifest.activationEvents) {\r\n if (activationEvent === event) {\r\n this._execute(extension); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Executes the extension. Catches and logs any errors (so that an extension will not crash the main application). */\r\n private async _execute(extension: InstalledExtension) {\r\n try {\r\n await extension.provider.execute();\r\n } catch (e) {\r\n Logger.logError(FrontendLoggerCategory.Extensions, `Error executing extension ${extension.manifest.name}: ${e}`);\r\n }\r\n }\r\n}\r\n"]}
|