@itwin/core-frontend
Version:
iTwin.js frontend components
288 lines • 12.7 kB
JavaScript
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module ModelState
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.SectionDrawingModelState = exports.DrawingModelState = exports.SpatialLocationModelState = exports.PhysicalModelState = exports.SpatialModelState = exports.SheetModelState = exports.GeometricModel3dState = exports.GeometricModel2dState = exports.GeometricModelState = exports.ModelState = void 0;
const core_bentley_1 = require("@itwin/core-bentley");
const core_common_1 = require("@itwin/core-common");
const core_geometry_1 = require("@itwin/core-geometry");
const EntityState_1 = require("./EntityState");
const RealityDataSource_1 = require("./RealityDataSource");
const internal_1 = require("./tile/internal");
const SpatialClassifiersState_1 = require("./SpatialClassifiersState");
/** Represents the front-end state of a [Model]($backend).
* @public
* @extensions
*/
class ModelState extends EntityState_1.EntityState {
static get className() { return "Model"; }
modeledElement;
name;
parentModel;
isPrivate;
isTemplate;
constructor(props, iModel, state) {
super(props, iModel, state);
this.modeledElement = core_common_1.RelatedElement.fromJSON(props.modeledElement);
this.name = props.name ? props.name : "";
this.parentModel = core_bentley_1.Id64.fromJSON(props.parentModel); // NB! Must always match the model of the modeledElement!
this.isPrivate = core_bentley_1.JsonUtils.asBool(props.isPrivate);
this.isTemplate = core_bentley_1.JsonUtils.asBool(props.isTemplate);
}
/** Add all custom-handled properties of a Model to a json object. */
toJSON() {
const val = super.toJSON();
val.modeledElement = this.modeledElement;
val.parentModel = this.parentModel;
val.name = this.name;
if (this.isPrivate)
val.isPrivate = this.isPrivate;
if (this.isTemplate)
val.isTemplate = this.isTemplate;
return val;
}
/** Determine whether this is a GeometricModel */
get isGeometricModel() { return false; }
/** Attempts to cast this model to a geometric model. */
get asGeometricModel() { return undefined; }
/** Attempts to cast this model to a 3d geometric model. */
get asGeometricModel3d() { return undefined; }
/** Attempts to cast this model to a 2d geometric model. */
get asGeometricModel2d() { return undefined; }
/** Attempts to cast this model to a spatial model. */
get asSpatialModel() { return undefined; }
/**
* Return the tool tip for this model. This is called only if the hit does not return a tooltip.
* @internal
*/
getToolTip(_hit) { return undefined; }
}
exports.ModelState = ModelState;
/** Represents the front-end state of a [GeometricModel]($backend).
* The contents of a GeometricModelState can be rendered inside a [[Viewport]].
* @public
* @extensions
*/
class GeometricModelState extends ModelState {
static get className() { return "GeometricModel"; }
/** @internal */
geometryGuid;
_modelRange;
constructor(props, iModel, state) {
super(props, iModel, state);
this.geometryGuid = props.geometryGuid;
}
get asGeometricModel() { return this; }
/** Returns true if this is a 2d model (a [[GeometricModel2dState]]). */
get is2d() { return !this.is3d; }
get isGeometricModel() { return true; }
/** @internal */
get treeModelId() { return this.id; }
/** Query for the union of the ranges of all the elements in this GeometricModel.
* @note This value is cached after the first time it is called.
* @public
*/
async queryModelRange() {
if (undefined === this._modelRange) {
const ranges = await this.iModel.models.queryExtents(this.id);
this._modelRange = core_geometry_1.Range3d.fromJSON(ranges[0]?.extents);
}
return this._modelRange;
}
/** @internal */
createTileTreeReference(view) {
// If this is a reality model, its tile tree is obtained from reality data service URL.
const spatialModel = this.asSpatialModel;
const rdSourceKey = this.jsonProperties.rdSourceKey;
const getDisplaySettings = () => view.displayStyle.settings.getRealityModelDisplaySettings(this.id) ?? core_common_1.RealityModelDisplaySettings.defaults;
const getBackgroundBase = () => view.displayStyle.settings?.mapImagery.backgroundBase;
const getBackgroundLayers = () => view.displayStyle.settings?.mapImagery.backgroundLayers;
if (rdSourceKey) {
const useOrbitGtTileTreeReference = rdSourceKey.format === core_common_1.RealityDataFormat.OPC;
const treeRef = (!useOrbitGtTileTreeReference) ?
(0, internal_1.createRealityTileTreeReference)({
rdSourceKey,
iModel: this.iModel,
source: view,
modelId: this.id,
// url: tilesetUrl, // If rdSourceKey is defined, url is not used
classifiers: undefined !== spatialModel ? spatialModel.classifiers : undefined,
getDisplaySettings,
getBackgroundBase,
getBackgroundLayers,
}) :
(0, internal_1.createOrbitGtTileTreeReference)({
rdSourceKey,
iModel: this.iModel,
source: view,
modelId: this.id,
// orbitGtBlob: props.orbitGtBlob!, // If rdSourceKey is defined, orbitGtBlob is not used
classifiers: undefined !== spatialModel ? spatialModel.classifiers : undefined,
getDisplaySettings,
});
return treeRef;
}
const orbitGtBlob = this.jsonProperties.orbitGtBlob;
// If this is an OrbitGt reality model, create it's reference
if (orbitGtBlob) {
let orbitGtName = "";
if (orbitGtBlob.blobFileName !== "") {
if (orbitGtBlob.blobFileName[0] === "/")
orbitGtName = orbitGtBlob.blobFileName.substring(1);
else
orbitGtName = orbitGtBlob.blobFileName;
}
// Create rdSourceKey if not provided
const rdSourceKeyOGT = RealityDataSource_1.RealityDataSource.createKeyFromOrbitGtBlobProps(orbitGtBlob);
return (0, internal_1.createOrbitGtTileTreeReference)({
rdSourceKey: rdSourceKeyOGT,
iModel: this.iModel,
source: view,
modelId: this.id,
orbitGtBlob,
name: orbitGtName,
classifiers: undefined !== spatialModel ? spatialModel.classifiers : undefined,
getDisplaySettings,
});
}
// If this is a TileTree reality model, create it's reference
const tilesetUrl = this.jsonProperties.tilesetUrl;
if (tilesetUrl) {
const rdSourceKeyCS = RealityDataSource_1.RealityDataSource.createKeyFromUrl(tilesetUrl);
return (0, internal_1.createRealityTileTreeReference)({
rdSourceKey: rdSourceKeyCS,
url: tilesetUrl,
iModel: this.iModel,
source: view,
modelId: this.id,
tilesetToDbTransform: this.jsonProperties.tilesetToDbTransform,
classifiers: undefined !== spatialModel ? spatialModel.classifiers : undefined,
getDisplaySettings,
getBackgroundBase,
getBackgroundLayers,
});
}
return (0, internal_1.createPrimaryTileTreeReference)(view, this, getBackgroundBase, getBackgroundLayers);
}
}
exports.GeometricModelState = GeometricModelState;
/** Represents the front-end state of a [GeometricModel2d]($backend).
* @public
* @extensions
*/
class GeometricModel2dState extends GeometricModelState {
static get className() { return "GeometricModel2d"; }
/** @internal */
globalOrigin;
constructor(props, iModel, state) {
super(props, iModel, state);
this.globalOrigin = core_geometry_1.Point2d.fromJSON(props.globalOrigin);
}
get is3d() { return false; }
get asGeometricModel2d() { return this; }
toJSON() {
const val = super.toJSON();
val.globalOrigin = this.globalOrigin;
return val;
}
}
exports.GeometricModel2dState = GeometricModel2dState;
/** Represents the front-end state of a [GeometricModel3d]($backend).
* @public
* @extensions
*/
class GeometricModel3dState extends GeometricModelState {
static get className() { return "GeometricModel3d"; }
constructor(props, iModel, state) {
super(props, iModel, state);
this.isNotSpatiallyLocated = core_bentley_1.JsonUtils.asBool(props.isNotSpatiallyLocated);
this.isPlanProjection = core_bentley_1.JsonUtils.asBool(props.isPlanProjection);
}
toJSON() {
const val = super.toJSON();
if (this.isNotSpatiallyLocated)
val.isNotSpatiallyLocated = true;
if (this.isPlanProjection)
val.isPlanProjection = true;
return val;
}
get is3d() { return true; }
get asGeometricModel3d() { return this; }
/** If true, then the elements in this GeometricModel3dState are expected to be in an XY plane.
* @note The associated ECProperty was added to the BisCore schema in version 1.0.8
*/
isPlanProjection;
/** If true, then the elements in this GeometricModel3dState are not in real-world coordinates and will not be in the spatial index.
* @note The associated ECProperty was added to the BisCore schema in version 1.0.8
*/
isNotSpatiallyLocated;
/** If true, then the elements in this GeometricModel3dState are in real-world coordinates and will be in the spatial index. */
get isSpatiallyLocated() { return !this.isNotSpatiallyLocated; }
}
exports.GeometricModel3dState = GeometricModel3dState;
/** Represents the front-end state of a [SheetModel]($backend).
* @public
* @extensions
*/
class SheetModelState extends GeometricModel2dState {
static get className() { return "SheetModel"; }
}
exports.SheetModelState = SheetModelState;
/** Represents the front-end state of a [SpatialModel]($backend).
* @public
* @extensions
*/
class SpatialModelState extends GeometricModel3dState {
/** If this is a reality model, provides access to a list of available spatial classifiers that can be applied to it. */
classifiers;
static get className() { return "SpatialModel"; }
get asSpatialModel() { return this; }
constructor(props, iModel, state) {
super(props, iModel, state);
if (this.isRealityModel)
this.classifiers = SpatialClassifiersState_1.SpatialClassifiersState.create(this.jsonProperties);
}
/** Return true if this is a reality model (represented by a 3d tile set). */
get isRealityModel() {
return !!this.jsonProperties.tilesetUrl || !!this.jsonProperties.rdSourceKey || !!this.jsonProperties.orbitGtBlob;
}
}
exports.SpatialModelState = SpatialModelState;
/** Represents the front-end state of a [PhysicalModel]($backend).
* @public
* @extensions
*/
class PhysicalModelState extends SpatialModelState {
static get className() { return "PhysicalModel"; }
}
exports.PhysicalModelState = PhysicalModelState;
/** Represents the front-end state of a [SpatialLocationModel]($backend).
* @public
* @extensions
*/
class SpatialLocationModelState extends SpatialModelState {
static get className() { return "SpatialLocationModel"; }
}
exports.SpatialLocationModelState = SpatialLocationModelState;
/** Represents the front-end state of a [DrawingModel]($backend).
* @public
* @extensions
*/
class DrawingModelState extends GeometricModel2dState {
static get className() { return "DrawingModel"; }
}
exports.DrawingModelState = DrawingModelState;
/** Represents the front-end state of a [SectionDrawingModel]($backend).
* @public
* @extensions
*/
class SectionDrawingModelState extends DrawingModelState {
static get className() { return "SectionDrawingModel"; }
}
exports.SectionDrawingModelState = SectionDrawingModelState;
//# sourceMappingURL=ModelState.js.map