@itwin/core-frontend 4.0.0-dev.23 → 4.0.0-dev.28
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 +43 -36
- package/lib/cjs/AccuDraw.js +1 -1
- package/lib/cjs/AccuDraw.js.map +1 -1
- package/lib/cjs/AccuSnap.js +3 -3
- package/lib/cjs/AccuSnap.js.map +1 -1
- package/lib/cjs/BriefcaseConnection.js +9 -11
- package/lib/cjs/BriefcaseConnection.js.map +1 -1
- package/lib/cjs/DisplayStyleState.js +8 -12
- package/lib/cjs/DisplayStyleState.js.map +1 -1
- package/lib/cjs/DrawingViewState.js +4 -6
- package/lib/cjs/DrawingViewState.js.map +1 -1
- package/lib/cjs/EnvironmentDecorations.js +2 -3
- package/lib/cjs/EnvironmentDecorations.js.map +1 -1
- package/lib/cjs/FlashSettings.js +3 -4
- package/lib/cjs/FlashSettings.js.map +1 -1
- package/lib/cjs/GeoServices.js +7 -9
- package/lib/cjs/GeoServices.js.map +1 -1
- package/lib/cjs/IModelApp.js +19 -21
- package/lib/cjs/IModelApp.js.map +1 -1
- package/lib/cjs/IModelConnection.js +1 -1
- package/lib/cjs/IModelConnection.js.map +1 -1
- package/lib/cjs/IpcApp.js +1 -1
- package/lib/cjs/IpcApp.js.map +1 -1
- package/lib/cjs/LocalhostIpcApp.js +3 -4
- package/lib/cjs/LocalhostIpcApp.js.map +1 -1
- package/lib/cjs/ModelState.js +2 -3
- package/lib/cjs/ModelState.js.map +1 -1
- package/lib/cjs/NativeApp.js +4 -7
- package/lib/cjs/NativeApp.js.map +1 -1
- package/lib/cjs/NoRenderApp.js +1 -2
- package/lib/cjs/NoRenderApp.js.map +1 -1
- package/lib/cjs/PlanarClipMaskState.js +1 -1
- package/lib/cjs/PlanarClipMaskState.js.map +1 -1
- package/lib/cjs/RealityDataSourceContextShareImpl.js +2 -4
- package/lib/cjs/RealityDataSourceContextShareImpl.js.map +1 -1
- package/lib/cjs/SheetViewState.js +15 -23
- package/lib/cjs/SheetViewState.js.map +1 -1
- package/lib/cjs/Tiles.js +2 -2
- package/lib/cjs/Tiles.js.map +1 -1
- package/lib/cjs/ViewContext.js +1 -1
- package/lib/cjs/ViewContext.js.map +1 -1
- package/lib/cjs/ViewCreator2d.js +4 -5
- package/lib/cjs/ViewCreator2d.js.map +1 -1
- package/lib/cjs/ViewCreator3d.js +5 -5
- package/lib/cjs/ViewCreator3d.js.map +1 -1
- package/lib/cjs/ViewState.js +17 -24
- package/lib/cjs/ViewState.js.map +1 -1
- package/lib/cjs/Viewport.js +22 -32
- package/lib/cjs/Viewport.js.map +1 -1
- package/lib/cjs/extension/ExtensionImpl.js +1 -1
- package/lib/cjs/extension/ExtensionImpl.js.map +1 -1
- package/lib/cjs/quantity-formatting/BaseUnitFormattingSettingsProvider.js +2 -3
- package/lib/cjs/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
- package/lib/cjs/quantity-formatting/QuantityFormatter.js +7 -9
- package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
- package/lib/cjs/render/FeatureSymbology.js +1 -2
- package/lib/cjs/render/FeatureSymbology.js.map +1 -1
- package/lib/cjs/render/GraphicBuilder.js +7 -9
- package/lib/cjs/render/GraphicBuilder.js.map +1 -1
- package/lib/cjs/render/MockRender.js +1 -2
- package/lib/cjs/render/MockRender.js.map +1 -1
- package/lib/cjs/render/ParticleCollectionBuilder.js +2 -3
- package/lib/cjs/render/ParticleCollectionBuilder.js.map +1 -1
- package/lib/cjs/render/RealityMeshParams.js +7 -10
- package/lib/cjs/render/RealityMeshParams.js.map +1 -1
- package/lib/cjs/render/RenderPlan.js +1 -1
- package/lib/cjs/render/RenderPlan.js.map +1 -1
- package/lib/cjs/render/RenderSystem.js +1 -2
- package/lib/cjs/render/RenderSystem.js.map +1 -1
- package/lib/cjs/render/VisibleFeature.js +2 -4
- package/lib/cjs/render/VisibleFeature.js.map +1 -1
- package/lib/cjs/render/primitives/AuxChannelTable.js +6 -9
- package/lib/cjs/render/primitives/AuxChannelTable.js.map +1 -1
- package/lib/cjs/render/primitives/EdgeParams.js +6 -7
- package/lib/cjs/render/primitives/EdgeParams.js.map +1 -1
- package/lib/cjs/render/primitives/PolylineParams.js +2 -3
- package/lib/cjs/render/primitives/PolylineParams.js.map +1 -1
- package/lib/cjs/render/primitives/VertexKey.js +1 -1
- package/lib/cjs/render/primitives/VertexKey.js.map +1 -1
- package/lib/cjs/render/primitives/VertexTable.js +1 -1
- package/lib/cjs/render/primitives/VertexTable.js.map +1 -1
- package/lib/cjs/render/primitives/VertexTableSplitter.js +6 -8
- package/lib/cjs/render/primitives/VertexTableSplitter.js.map +1 -1
- package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js +9 -11
- package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
- package/lib/cjs/render/primitives/geometry/GeometryListBuilder.js +3 -5
- package/lib/cjs/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
- package/lib/cjs/render/primitives/mesh/MeshBuilder.js +1 -1
- package/lib/cjs/render/primitives/mesh/MeshBuilder.js.map +1 -1
- package/lib/cjs/render/primitives/mesh/MeshPrimitives.js +2 -3
- package/lib/cjs/render/primitives/mesh/MeshPrimitives.js.map +1 -1
- package/lib/cjs/render/webgl/BranchState.js +9 -10
- package/lib/cjs/render/webgl/BranchState.js.map +1 -1
- package/lib/cjs/render/webgl/EDL.js +17 -21
- package/lib/cjs/render/webgl/EDL.js.map +1 -1
- package/lib/cjs/render/webgl/FeatureOverrides.js +2 -2
- package/lib/cjs/render/webgl/FeatureOverrides.js.map +1 -1
- package/lib/cjs/render/webgl/Graphic.js +3 -5
- package/lib/cjs/render/webgl/Graphic.js.map +1 -1
- package/lib/cjs/render/webgl/IndexedEdgeGeometry.js +1 -1
- package/lib/cjs/render/webgl/IndexedEdgeGeometry.js.map +1 -1
- package/lib/cjs/render/webgl/InstancedGeometry.js +2 -3
- package/lib/cjs/render/webgl/InstancedGeometry.js.map +1 -1
- package/lib/cjs/render/webgl/Mesh.js +7 -10
- package/lib/cjs/render/webgl/Mesh.js.map +1 -1
- package/lib/cjs/render/webgl/MeshData.js +1 -2
- package/lib/cjs/render/webgl/MeshData.js.map +1 -1
- package/lib/cjs/render/webgl/PlanarClassifier.js +10 -15
- package/lib/cjs/render/webgl/PlanarClassifier.js.map +1 -1
- package/lib/cjs/render/webgl/RealityMesh.js +5 -8
- package/lib/cjs/render/webgl/RealityMesh.js.map +1 -1
- package/lib/cjs/render/webgl/RealityModelUniforms.js +3 -4
- package/lib/cjs/render/webgl/RealityModelUniforms.js.map +1 -1
- package/lib/cjs/render/webgl/RenderCommands.js +7 -8
- package/lib/cjs/render/webgl/RenderCommands.js.map +1 -1
- package/lib/cjs/render/webgl/SceneCompositor.js +7 -9
- package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
- package/lib/cjs/render/webgl/ShaderBuilder.js +1 -2
- package/lib/cjs/render/webgl/ShaderBuilder.js.map +1 -1
- package/lib/cjs/render/webgl/SolarShadowMap.js +1 -2
- package/lib/cjs/render/webgl/SolarShadowMap.js.map +1 -1
- package/lib/cjs/render/webgl/SurfaceGeometry.js +1 -1
- package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
- package/lib/cjs/render/webgl/System.js +12 -16
- package/lib/cjs/render/webgl/System.js.map +1 -1
- package/lib/cjs/render/webgl/Target.js +9 -14
- package/lib/cjs/render/webgl/Target.js.map +1 -1
- package/lib/cjs/render/webgl/TargetGraphics.js +1 -2
- package/lib/cjs/render/webgl/TargetGraphics.js.map +1 -1
- package/lib/cjs/render/webgl/Texture.js +1 -2
- package/lib/cjs/render/webgl/Texture.js.map +1 -1
- package/lib/cjs/render/webgl/ThematicSensors.js +2 -4
- package/lib/cjs/render/webgl/ThematicSensors.js.map +1 -1
- package/lib/cjs/render/webgl/VisibleTileFeatures.js +1 -2
- package/lib/cjs/render/webgl/VisibleTileFeatures.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Animation.js +6 -9
- package/lib/cjs/render/webgl/glsl/Animation.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +1 -2
- package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Instancing.js +4 -5
- package/lib/cjs/render/webgl/glsl/Instancing.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/RealityMesh.js +2 -4
- package/lib/cjs/render/webgl/glsl/RealityMesh.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.js +1 -2
- package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Thematic.js +1 -2
- package/lib/cjs/render/webgl/glsl/Thematic.js.map +1 -1
- package/lib/cjs/tile/ClassifierTileTree.js +3 -3
- package/lib/cjs/tile/ClassifierTileTree.js.map +1 -1
- package/lib/cjs/tile/GltfReader.js +61 -75
- package/lib/cjs/tile/GltfReader.js.map +1 -1
- package/lib/cjs/tile/IModelTile.js +2 -3
- package/lib/cjs/tile/IModelTile.js.map +1 -1
- package/lib/cjs/tile/IModelTileRequestChannels.js +6 -11
- package/lib/cjs/tile/IModelTileRequestChannels.js.map +1 -1
- package/lib/cjs/tile/IModelTileTree.js +5 -9
- package/lib/cjs/tile/IModelTileTree.js.map +1 -1
- package/lib/cjs/tile/ImdlReader.js +13 -17
- package/lib/cjs/tile/ImdlReader.js.map +1 -1
- package/lib/cjs/tile/OrbitGtTileTree.js +2 -2
- package/lib/cjs/tile/OrbitGtTileTree.js.map +1 -1
- package/lib/cjs/tile/PntsReader.js +4 -5
- package/lib/cjs/tile/PntsReader.js.map +1 -1
- package/lib/cjs/tile/PrimaryTileTree.js +22 -32
- package/lib/cjs/tile/PrimaryTileTree.js.map +1 -1
- package/lib/cjs/tile/RealityModelTileTree.js +12 -19
- package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
- package/lib/cjs/tile/RealityTile.js +3 -5
- package/lib/cjs/tile/RealityTile.js.map +1 -1
- package/lib/cjs/tile/RealityTileLoader.js +2 -2
- package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
- package/lib/cjs/tile/ThreeDTileFormatInterpreter.js +3 -5
- package/lib/cjs/tile/ThreeDTileFormatInterpreter.js.map +1 -1
- package/lib/cjs/tile/Tile.js +1 -1
- package/lib/cjs/tile/Tile.js.map +1 -1
- package/lib/cjs/tile/TileAdmin.js +22 -27
- package/lib/cjs/tile/TileAdmin.js.map +1 -1
- package/lib/cjs/tile/TileDrawArgs.js +3 -6
- package/lib/cjs/tile/TileDrawArgs.js.map +1 -1
- package/lib/cjs/tile/TileRequestChannels.js +1 -1
- package/lib/cjs/tile/TileRequestChannels.js.map +1 -1
- package/lib/cjs/tile/TileTree.js +2 -3
- package/lib/cjs/tile/TileTree.js.map +1 -1
- package/lib/cjs/tile/TiledGraphicsProvider.js +1 -1
- package/lib/cjs/tile/TiledGraphicsProvider.js.map +1 -1
- package/lib/cjs/tile/map/ArcGISTileMap.js +5 -6
- package/lib/cjs/tile/map/ArcGISTileMap.js.map +1 -1
- package/lib/cjs/tile/map/ArcGisUtilities.js +6 -8
- package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +4 -7
- package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +6 -8
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js +1 -2
- package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +14 -19
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +14 -20
- package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapCartoRectangle.js +1 -1
- package/lib/cjs/tile/map/MapCartoRectangle.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.js +5 -6
- package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryFormats.js +11 -14
- package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.js +2 -3
- package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerSources.js +1 -1
- package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
- package/lib/cjs/tile/map/MapTile.js +6 -8
- package/lib/cjs/tile/map/MapTile.js.map +1 -1
- package/lib/cjs/tile/map/MapTileLoader.js +1 -1
- package/lib/cjs/tile/map/MapTileLoader.js.map +1 -1
- package/lib/cjs/tile/map/MapTileTree.js +13 -18
- package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.js +6 -7
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.js.map +1 -1
- package/lib/cjs/tile/map/WmsCapabilities.js +4 -5
- package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/cjs/tile/map/WmtsCapabilities.js +17 -25
- package/lib/cjs/tile/map/WmtsCapabilities.js.map +1 -1
- package/lib/cjs/tools/ClipViewTool.js +1 -1
- package/lib/cjs/tools/ClipViewTool.js.map +1 -1
- package/lib/cjs/tools/MeasureTool.js +2 -4
- package/lib/cjs/tools/MeasureTool.js.map +1 -1
- package/lib/cjs/tools/PrimitiveTool.js +2 -3
- package/lib/cjs/tools/PrimitiveTool.js.map +1 -1
- package/lib/cjs/tools/SelectTool.js +1 -2
- package/lib/cjs/tools/SelectTool.js.map +1 -1
- package/lib/cjs/tools/Tool.js +2 -3
- package/lib/cjs/tools/Tool.js.map +1 -1
- package/lib/cjs/tools/ToolAdmin.js +2 -4
- package/lib/cjs/tools/ToolAdmin.js.map +1 -1
- package/lib/cjs/tools/ViewTool.js +3 -3
- package/lib/cjs/tools/ViewTool.js.map +1 -1
- package/lib/esm/AccuDraw.js +1 -1
- package/lib/esm/AccuDraw.js.map +1 -1
- package/lib/esm/AccuSnap.js +3 -3
- package/lib/esm/AccuSnap.js.map +1 -1
- package/lib/esm/BriefcaseConnection.js +9 -11
- package/lib/esm/BriefcaseConnection.js.map +1 -1
- package/lib/esm/DisplayStyleState.js +8 -12
- package/lib/esm/DisplayStyleState.js.map +1 -1
- package/lib/esm/DrawingViewState.js +4 -6
- package/lib/esm/DrawingViewState.js.map +1 -1
- package/lib/esm/EnvironmentDecorations.js +2 -3
- package/lib/esm/EnvironmentDecorations.js.map +1 -1
- package/lib/esm/FlashSettings.js +3 -4
- package/lib/esm/FlashSettings.js.map +1 -1
- package/lib/esm/GeoServices.js +7 -9
- package/lib/esm/GeoServices.js.map +1 -1
- package/lib/esm/IModelApp.js +19 -21
- package/lib/esm/IModelApp.js.map +1 -1
- package/lib/esm/IModelConnection.js +1 -1
- package/lib/esm/IModelConnection.js.map +1 -1
- package/lib/esm/IpcApp.js +1 -1
- package/lib/esm/IpcApp.js.map +1 -1
- package/lib/esm/LocalhostIpcApp.js +3 -4
- package/lib/esm/LocalhostIpcApp.js.map +1 -1
- package/lib/esm/ModelState.js +2 -3
- package/lib/esm/ModelState.js.map +1 -1
- package/lib/esm/NativeApp.js +4 -7
- package/lib/esm/NativeApp.js.map +1 -1
- package/lib/esm/NoRenderApp.js +1 -2
- package/lib/esm/NoRenderApp.js.map +1 -1
- package/lib/esm/PlanarClipMaskState.js +1 -1
- package/lib/esm/PlanarClipMaskState.js.map +1 -1
- package/lib/esm/RealityDataSourceContextShareImpl.js +2 -4
- package/lib/esm/RealityDataSourceContextShareImpl.js.map +1 -1
- package/lib/esm/SheetViewState.js +15 -23
- package/lib/esm/SheetViewState.js.map +1 -1
- package/lib/esm/Tiles.js +2 -2
- package/lib/esm/Tiles.js.map +1 -1
- package/lib/esm/ViewContext.js +1 -1
- package/lib/esm/ViewContext.js.map +1 -1
- package/lib/esm/ViewCreator2d.js +4 -5
- package/lib/esm/ViewCreator2d.js.map +1 -1
- package/lib/esm/ViewCreator3d.js +5 -5
- package/lib/esm/ViewCreator3d.js.map +1 -1
- package/lib/esm/ViewState.js +17 -24
- package/lib/esm/ViewState.js.map +1 -1
- package/lib/esm/Viewport.js +22 -32
- package/lib/esm/Viewport.js.map +1 -1
- package/lib/esm/extension/ExtensionImpl.js +1 -1
- package/lib/esm/extension/ExtensionImpl.js.map +1 -1
- package/lib/esm/quantity-formatting/BaseUnitFormattingSettingsProvider.js +2 -3
- package/lib/esm/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
- package/lib/esm/quantity-formatting/QuantityFormatter.js +7 -9
- package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
- package/lib/esm/render/FeatureSymbology.js +1 -2
- package/lib/esm/render/FeatureSymbology.js.map +1 -1
- package/lib/esm/render/GraphicBuilder.js +7 -9
- package/lib/esm/render/GraphicBuilder.js.map +1 -1
- package/lib/esm/render/MockRender.js +1 -2
- package/lib/esm/render/MockRender.js.map +1 -1
- package/lib/esm/render/ParticleCollectionBuilder.js +2 -3
- package/lib/esm/render/ParticleCollectionBuilder.js.map +1 -1
- package/lib/esm/render/RealityMeshParams.js +7 -10
- package/lib/esm/render/RealityMeshParams.js.map +1 -1
- package/lib/esm/render/RenderPlan.js +1 -1
- package/lib/esm/render/RenderPlan.js.map +1 -1
- package/lib/esm/render/RenderSystem.js +1 -2
- package/lib/esm/render/RenderSystem.js.map +1 -1
- package/lib/esm/render/VisibleFeature.js +2 -4
- package/lib/esm/render/VisibleFeature.js.map +1 -1
- package/lib/esm/render/primitives/AuxChannelTable.js +6 -9
- package/lib/esm/render/primitives/AuxChannelTable.js.map +1 -1
- package/lib/esm/render/primitives/EdgeParams.js +6 -7
- package/lib/esm/render/primitives/EdgeParams.js.map +1 -1
- package/lib/esm/render/primitives/PolylineParams.js +2 -3
- package/lib/esm/render/primitives/PolylineParams.js.map +1 -1
- package/lib/esm/render/primitives/VertexKey.js +1 -1
- package/lib/esm/render/primitives/VertexKey.js.map +1 -1
- package/lib/esm/render/primitives/VertexTable.js +1 -1
- package/lib/esm/render/primitives/VertexTable.js.map +1 -1
- package/lib/esm/render/primitives/VertexTableSplitter.js +6 -8
- package/lib/esm/render/primitives/VertexTableSplitter.js.map +1 -1
- package/lib/esm/render/primitives/geometry/GeometryAccumulator.js +9 -11
- package/lib/esm/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
- package/lib/esm/render/primitives/geometry/GeometryListBuilder.js +3 -5
- package/lib/esm/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
- package/lib/esm/render/primitives/mesh/MeshBuilder.js +1 -1
- package/lib/esm/render/primitives/mesh/MeshBuilder.js.map +1 -1
- package/lib/esm/render/primitives/mesh/MeshPrimitives.js +2 -3
- package/lib/esm/render/primitives/mesh/MeshPrimitives.js.map +1 -1
- package/lib/esm/render/webgl/BranchState.js +9 -10
- package/lib/esm/render/webgl/BranchState.js.map +1 -1
- package/lib/esm/render/webgl/EDL.js +17 -21
- package/lib/esm/render/webgl/EDL.js.map +1 -1
- package/lib/esm/render/webgl/FeatureOverrides.js +2 -2
- package/lib/esm/render/webgl/FeatureOverrides.js.map +1 -1
- package/lib/esm/render/webgl/Graphic.js +3 -5
- package/lib/esm/render/webgl/Graphic.js.map +1 -1
- package/lib/esm/render/webgl/IndexedEdgeGeometry.js +1 -1
- package/lib/esm/render/webgl/IndexedEdgeGeometry.js.map +1 -1
- package/lib/esm/render/webgl/InstancedGeometry.js +2 -3
- package/lib/esm/render/webgl/InstancedGeometry.js.map +1 -1
- package/lib/esm/render/webgl/Mesh.js +7 -10
- package/lib/esm/render/webgl/Mesh.js.map +1 -1
- package/lib/esm/render/webgl/MeshData.js +1 -2
- package/lib/esm/render/webgl/MeshData.js.map +1 -1
- package/lib/esm/render/webgl/PlanarClassifier.js +10 -15
- package/lib/esm/render/webgl/PlanarClassifier.js.map +1 -1
- package/lib/esm/render/webgl/RealityMesh.js +5 -8
- package/lib/esm/render/webgl/RealityMesh.js.map +1 -1
- package/lib/esm/render/webgl/RealityModelUniforms.js +3 -4
- package/lib/esm/render/webgl/RealityModelUniforms.js.map +1 -1
- package/lib/esm/render/webgl/RenderCommands.js +7 -8
- package/lib/esm/render/webgl/RenderCommands.js.map +1 -1
- package/lib/esm/render/webgl/SceneCompositor.js +7 -9
- package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
- package/lib/esm/render/webgl/ShaderBuilder.js +1 -2
- package/lib/esm/render/webgl/ShaderBuilder.js.map +1 -1
- package/lib/esm/render/webgl/SolarShadowMap.js +1 -2
- package/lib/esm/render/webgl/SolarShadowMap.js.map +1 -1
- package/lib/esm/render/webgl/SurfaceGeometry.js +1 -1
- package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
- package/lib/esm/render/webgl/System.js +12 -16
- package/lib/esm/render/webgl/System.js.map +1 -1
- package/lib/esm/render/webgl/Target.js +9 -14
- package/lib/esm/render/webgl/Target.js.map +1 -1
- package/lib/esm/render/webgl/TargetGraphics.js +1 -2
- package/lib/esm/render/webgl/TargetGraphics.js.map +1 -1
- package/lib/esm/render/webgl/Texture.js +1 -2
- package/lib/esm/render/webgl/Texture.js.map +1 -1
- package/lib/esm/render/webgl/ThematicSensors.js +2 -4
- package/lib/esm/render/webgl/ThematicSensors.js.map +1 -1
- package/lib/esm/render/webgl/VisibleTileFeatures.js +1 -2
- package/lib/esm/render/webgl/VisibleTileFeatures.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Animation.js +6 -9
- package/lib/esm/render/webgl/glsl/Animation.js.map +1 -1
- package/lib/esm/render/webgl/glsl/FeatureSymbology.js +1 -2
- package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Instancing.js +4 -5
- package/lib/esm/render/webgl/glsl/Instancing.js.map +1 -1
- package/lib/esm/render/webgl/glsl/RealityMesh.js +2 -4
- package/lib/esm/render/webgl/glsl/RealityMesh.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.js +1 -2
- package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Thematic.js +1 -2
- package/lib/esm/render/webgl/glsl/Thematic.js.map +1 -1
- package/lib/esm/tile/ClassifierTileTree.js +3 -3
- package/lib/esm/tile/ClassifierTileTree.js.map +1 -1
- package/lib/esm/tile/GltfReader.js +61 -75
- package/lib/esm/tile/GltfReader.js.map +1 -1
- package/lib/esm/tile/IModelTile.js +2 -3
- package/lib/esm/tile/IModelTile.js.map +1 -1
- package/lib/esm/tile/IModelTileRequestChannels.js +6 -11
- package/lib/esm/tile/IModelTileRequestChannels.js.map +1 -1
- package/lib/esm/tile/IModelTileTree.js +5 -9
- package/lib/esm/tile/IModelTileTree.js.map +1 -1
- package/lib/esm/tile/ImdlReader.js +13 -17
- package/lib/esm/tile/ImdlReader.js.map +1 -1
- package/lib/esm/tile/OrbitGtTileTree.js +2 -2
- package/lib/esm/tile/OrbitGtTileTree.js.map +1 -1
- package/lib/esm/tile/PntsReader.js +4 -5
- package/lib/esm/tile/PntsReader.js.map +1 -1
- package/lib/esm/tile/PrimaryTileTree.js +22 -32
- package/lib/esm/tile/PrimaryTileTree.js.map +1 -1
- package/lib/esm/tile/RealityModelTileTree.js +12 -19
- package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
- package/lib/esm/tile/RealityTile.js +3 -5
- package/lib/esm/tile/RealityTile.js.map +1 -1
- package/lib/esm/tile/RealityTileLoader.js +2 -2
- package/lib/esm/tile/RealityTileLoader.js.map +1 -1
- package/lib/esm/tile/ThreeDTileFormatInterpreter.js +3 -5
- package/lib/esm/tile/ThreeDTileFormatInterpreter.js.map +1 -1
- package/lib/esm/tile/Tile.js +1 -1
- package/lib/esm/tile/Tile.js.map +1 -1
- package/lib/esm/tile/TileAdmin.js +22 -27
- package/lib/esm/tile/TileAdmin.js.map +1 -1
- package/lib/esm/tile/TileDrawArgs.js +3 -6
- package/lib/esm/tile/TileDrawArgs.js.map +1 -1
- package/lib/esm/tile/TileRequestChannels.js +1 -1
- package/lib/esm/tile/TileRequestChannels.js.map +1 -1
- package/lib/esm/tile/TileTree.js +2 -3
- package/lib/esm/tile/TileTree.js.map +1 -1
- package/lib/esm/tile/TiledGraphicsProvider.js +1 -1
- package/lib/esm/tile/TiledGraphicsProvider.js.map +1 -1
- package/lib/esm/tile/map/ArcGISTileMap.js +5 -6
- package/lib/esm/tile/map/ArcGISTileMap.js.map +1 -1
- package/lib/esm/tile/map/ArcGisUtilities.js +6 -8
- package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +4 -7
- package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +6 -8
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js +1 -2
- package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +14 -19
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +14 -20
- package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapCartoRectangle.js +1 -1
- package/lib/esm/tile/map/MapCartoRectangle.js.map +1 -1
- package/lib/esm/tile/map/MapLayerFormatRegistry.js +5 -6
- package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryFormats.js +11 -14
- package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.js +2 -3
- package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapLayerSources.js +1 -1
- package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
- package/lib/esm/tile/map/MapTile.js +6 -8
- package/lib/esm/tile/map/MapTile.js.map +1 -1
- package/lib/esm/tile/map/MapTileLoader.js +1 -1
- package/lib/esm/tile/map/MapTileLoader.js.map +1 -1
- package/lib/esm/tile/map/MapTileTree.js +13 -18
- package/lib/esm/tile/map/MapTileTree.js.map +1 -1
- package/lib/esm/tile/map/MapTiledGraphicsProvider.js +6 -7
- package/lib/esm/tile/map/MapTiledGraphicsProvider.js.map +1 -1
- package/lib/esm/tile/map/WmsCapabilities.js +4 -5
- package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/esm/tile/map/WmtsCapabilities.js +17 -25
- package/lib/esm/tile/map/WmtsCapabilities.js.map +1 -1
- package/lib/esm/tools/ClipViewTool.js +1 -1
- package/lib/esm/tools/ClipViewTool.js.map +1 -1
- package/lib/esm/tools/MeasureTool.js +2 -4
- package/lib/esm/tools/MeasureTool.js.map +1 -1
- package/lib/esm/tools/PrimitiveTool.js +2 -3
- package/lib/esm/tools/PrimitiveTool.js.map +1 -1
- package/lib/esm/tools/SelectTool.js +1 -2
- package/lib/esm/tools/SelectTool.js.map +1 -1
- package/lib/esm/tools/Tool.js +2 -3
- package/lib/esm/tools/Tool.js.map +1 -1
- package/lib/esm/tools/ToolAdmin.js +2 -4
- package/lib/esm/tools/ToolAdmin.js.map +1 -1
- package/lib/esm/tools/ViewTool.js +3 -3
- package/lib/esm/tools/ViewTool.js.map +1 -1
- package/package.json +18 -18
package/lib/cjs/AccuSnap.js
CHANGED
|
@@ -637,7 +637,7 @@ class AccuSnap {
|
|
|
637
637
|
};
|
|
638
638
|
const snapPoint = core_geometry_1.Point3d.fromJSON(result.snapPoint);
|
|
639
639
|
const displayTransform = undefined !== thisHit.modelId ? thisHit.viewport.view.computeDisplayTransform({ modelId: thisHit.modelId, elementId: thisHit.sourceId }) : undefined;
|
|
640
|
-
displayTransform
|
|
640
|
+
displayTransform?.multiplyPoint3d(snapPoint, snapPoint);
|
|
641
641
|
const snap = new HitDetail_1.SnapDetail(thisHit, result.snapMode, result.heat, snapPoint);
|
|
642
642
|
snap.setCurvePrimitive(parseCurve(result.curve), displayTransform, result.geomType);
|
|
643
643
|
if (undefined !== result.parentGeomType)
|
|
@@ -645,12 +645,12 @@ class AccuSnap {
|
|
|
645
645
|
// Update hitPoint from readPixels with exact point location corrected to surface/edge geometry.
|
|
646
646
|
if (undefined !== result.hitPoint) {
|
|
647
647
|
snap.hitPoint.setFromJSON(result.hitPoint);
|
|
648
|
-
displayTransform
|
|
648
|
+
displayTransform?.multiplyPoint3d(snap.hitPoint, snap.hitPoint);
|
|
649
649
|
}
|
|
650
650
|
// Apply display transform to normal.
|
|
651
651
|
if (undefined !== result.normal) {
|
|
652
652
|
snap.normal = core_geometry_1.Vector3d.fromJSON(result.normal);
|
|
653
|
-
displayTransform
|
|
653
|
+
displayTransform?.matrix.multiplyVector(snap.normal, snap.normal);
|
|
654
654
|
snap.normal.normalizeInPlace();
|
|
655
655
|
}
|
|
656
656
|
if (HitDetail_1.SnapMode.Intersection !== snap.snapMode)
|
package/lib/cjs/AccuSnap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccuSnap.js","sourceRoot":"","sources":["../../src/AccuSnap.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module LocatingElements\n */\n\nimport { BeDuration, Id64, Id64Arg, Id64Set } from \"@itwin/core-bentley\";\nimport { CurveCurve, CurvePrimitive, GeometryQuery, IModelJson as GeomJson, Point2d, Point3d, Vector3d, XAndY } from \"@itwin/core-geometry\";\nimport { SnapRequestProps } from \"@itwin/core-common\";\nimport { ElementLocateManager, HitListHolder, LocateAction, LocateFilterStatus, LocateResponse, SnapStatus } from \"./ElementLocateManager\";\nimport { HitDetail, HitDetailType, HitGeomType, HitList, HitPriority, HitSource, IntersectDetail, SnapDetail, SnapHeat, SnapMode } from \"./HitDetail\";\nimport { IModelApp } from \"./IModelApp\";\nimport { CanvasDecoration } from \"./render/CanvasDecoration\";\nimport { IconSprites, Sprite, SpriteLocation } from \"./Sprites\";\nimport { BeButton, BeButtonEvent, BeTouchEvent, InputSource } from \"./tools/Tool\";\nimport { ToolSettings } from \"./tools/ToolSettings\";\nimport { DecorateContext } from \"./ViewContext\";\nimport { Decorator } from \"./ViewManager\";\nimport { ScreenViewport, Viewport } from \"./Viewport\";\n\n// cspell:ignore dont primitivetools\n\n/** Virtual cursor for using AccuSnap with touch input.\n * @internal\n */\nexport class TouchCursor implements CanvasDecoration {\n public position = new Point3d();\n public viewport: Viewport;\n protected _offsetPosition = new Point3d();\n protected _size: number;\n protected _yOffset: number;\n protected _isSelected = false;\n protected _isDragging = false;\n protected _inTouchTap = false;\n\n protected constructor(vp: ScreenViewport) {\n this._size = vp.pixelsFromInches(0.3);\n this._yOffset = this._size * 1.75;\n this.viewport = vp;\n }\n\n protected setPosition(vp: Viewport, worldLocation: Point3d): boolean {\n const pointNpc = vp.worldToNpc(worldLocation);\n if (pointNpc.z < 0.0 || pointNpc.z > 1.0)\n pointNpc.z = 0.5; // move inside frustum.\n\n const viewLocation = vp.npcToView(pointNpc);\n if (!vp.viewRect.containsPoint(viewLocation))\n return false; // outside this viewport rect\n\n viewLocation.x = Math.floor(viewLocation.x) + 0.5;\n viewLocation.y = Math.floor(viewLocation.y) + 0.5;\n viewLocation.z = 0.0;\n const offsetLocation = new Point3d(viewLocation.x, viewLocation.y - this._yOffset, viewLocation.z);\n if (!vp.viewRect.containsPoint(offsetLocation))\n return false; // outside this viewport rect\n\n this.position.setFrom(viewLocation);\n this._offsetPosition.setFrom(offsetLocation);\n if (vp !== this.viewport) {\n this.viewport.invalidateDecorations();\n this.viewport = vp;\n }\n vp.invalidateDecorations();\n return true;\n }\n\n protected drawHandle(ctx: CanvasRenderingContext2D, filled: boolean): void {\n ctx.beginPath();\n ctx.moveTo(-this._size, 0);\n ctx.bezierCurveTo(-this._size, -this._size * 0.85, -this._size * 0.6, -this._yOffset * 0.6, 0, -this._yOffset * 0.8);\n ctx.bezierCurveTo(this._size * 0.6, -this._yOffset * 0.6, this._size, -this._size * 0.85, this._size, 0);\n ctx.arc(0, 0, this._size, 0, Math.PI);\n if (filled)\n ctx.fill();\n\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(0, 0, this._size * 0.75, 0, 2 * Math.PI);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(-this._size * 0.4, 0);\n ctx.lineTo(this._size * 0.4, 0);\n ctx.moveTo(-this._size * 0.4, this._size * 0.25);\n ctx.lineTo(this._size * 0.4, this._size * 0.25);\n ctx.stroke();\n }\n\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\n ctx.lineWidth = 1;\n ctx.strokeStyle = \"rgba(0,0,0,.75)\";\n ctx.fillStyle = \"white\";\n ctx.strokeRect(-2, -(this._yOffset + 2), 5, 5);\n ctx.fillRect(-1, -(this._yOffset + 1), 3, 3);\n\n ctx.lineWidth = 3.5;\n ctx.lineCap = \"round\";\n ctx.fillStyle = this._isSelected ? \"rgba(35,187,252,.25)\" : \"rgba(255,215,0,.25)\";\n ctx.shadowColor = \"black\";\n ctx.shadowBlur = 10;\n this.drawHandle(ctx, true);\n\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = this._isSelected ? \"rgba(35,187,252,.75)\" : \"rgba(255,215,0,.75)\";\n ctx.shadowBlur = 0;\n this.drawHandle(ctx, false);\n }\n\n protected isSelected(pt: XAndY): boolean { return this.position.distance(Point3d.create(pt.x, pt.y)) < this._size; }\n public isButtonHandled(ev: BeButtonEvent): boolean { return (BeButton.Data === ev.button && InputSource.Touch === ev.inputSource && !this._inTouchTap); }\n\n public doTouchMove(ev: BeTouchEvent): boolean {\n if (undefined === ev.viewport || !ev.isSingleTouch)\n return false;\n if (!this._isDragging || !this.setPosition(ev.viewport, ev.point))\n return false;\n ev.viewPoint = this._offsetPosition;\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\n return true;\n }\n\n public doTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\n if (undefined === ev.viewport || !ev.isSingleTouch)\n return false;\n return (this._isDragging = this.isSelected(startEv.viewPoint));\n }\n\n public doTouchStart(ev: BeTouchEvent): void {\n this._isSelected = ev.isSingleTouch && this.isSelected(ev.viewPoint);\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n }\n\n public doTouchEnd(ev: BeTouchEvent): void {\n if (this._isDragging && undefined !== ev.viewport)\n IModelApp.toolAdmin.currentInputState.fromPoint(ev.viewport, this._offsetPosition, InputSource.Touch); // Current location should reflect virtual cursor offset...\n this._isSelected = this._isDragging = false;\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n }\n\n public async doTouchTap(ev: BeTouchEvent): Promise<boolean> {\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\n return false;\n if (!this.isSelected(ev.viewPoint)) {\n if (!this.setPosition(ev.viewport, ev.point))\n return false;\n ev.viewPoint = this._offsetPosition;\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\n return false;\n }\n ev.viewPoint = this._offsetPosition;\n this._inTouchTap = true;\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev);\n this._inTouchTap = false;\n return true;\n }\n\n public static createFromTouchTap(ev: BeTouchEvent): TouchCursor | undefined {\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\n return undefined;\n const touchCursor = new TouchCursor(ev.viewport);\n if (!touchCursor.setPosition(ev.viewport, ev.point) && !touchCursor.setPosition(ev.viewport, ev.viewport.view.getCenter()))\n return undefined;\n ev.viewPoint = touchCursor._offsetPosition;\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\n return touchCursor;\n }\n}\n\n/** AccuSnap is an aide for snapping to interesting points on elements or decorations as the cursor moves over them.\n * @see [Using AccuSnap]($docs/learning/frontend/primitivetools.md#AccuSnap)\n * @public\n * @extensions\n */\nexport class AccuSnap implements Decorator {\n /** Currently active hit */\n public currHit?: HitDetail;\n /** Current list of hits. */\n public aSnapHits?: HitList<HitDetail>;\n /** Views that need to be flashed */\n public readonly needFlash = new Set<Viewport>();\n /** Views that are already flashed */\n public readonly areFlashed = new Set<Viewport>();\n /** The \"+\" that indicates where the snap point is */\n public readonly cross = new SpriteLocation();\n /** The icon that indicates what type of snap is active */\n public readonly icon = new SpriteLocation();\n /** The icon that indicates an error */\n public readonly errorIcon = new SpriteLocation();\n /** Reason key for last error */\n public errorKey?: string;\n /** localized message explaining why last error was generated. */\n public explanation?: string;\n /** Number of times \"suppress\" has been called -- unlike suspend this is not automatically cleared by tools */\n private _suppressed = 0;\n /** Location of cursor when we last checked for motion */\n private readonly _lastCursorPos = new Point2d();\n /** @internal */\n public readonly toolState = new AccuSnap.ToolState();\n /** @internal */\n protected _settings = new AccuSnap.Settings();\n /** @internal */\n public touchCursor?: TouchCursor;\n /** Current request for tooltip message. */\n private _toolTipPromise?: Promise<Promise<void>>;\n\n /** @internal */\n public onInitialized() { }\n private get _searchDistance(): number { return this.isLocateEnabled ? 1.0 : this._settings.searchDistance; }\n private get _hotDistanceInches(): number { return IModelApp.locateManager.apertureInches * this._settings.hotDistanceFactor; }\n /** Whether locate of elements under the cursor is enabled by the current InteractiveTool.\n * @public\n */\n public get isLocateEnabled(): boolean { return this.toolState.locate; }\n /** Whether snapping to elements under the cursor is enabled by the current InteractiveTool.\n * @public\n */\n public get isSnapEnabled(): boolean { return this.toolState.enabled; }\n /** Whether the user setting for snapping is enabled. Snapping is done only when both the user and current InteractiveTool have enabled it.\n * @public\n */\n public get isSnapEnabledByUser(): boolean { return this._settings.enableFlag; }\n private isFlashed(view: Viewport): boolean { return (this.areFlashed.has(view)); }\n private needsFlash(view: Viewport): boolean { return (this.needFlash.has(view)); }\n private setNeedsFlash(view: Viewport) {\n this.needFlash.add(view);\n this.clearIsFlashed(view);\n view.invalidateDecorations();\n }\n\n private setIsFlashed(view: Viewport) { this.areFlashed.add(view); }\n private clearIsFlashed(view: Viewport) { this.areFlashed.delete(view); }\n private static toSnapDetail(hit?: HitDetail): SnapDetail | undefined { return (hit && hit instanceof SnapDetail) ? hit : undefined; }\n /** @internal */\n public getCurrSnapDetail(): SnapDetail | undefined { return AccuSnap.toSnapDetail(this.currHit); }\n /** Determine whether there is a current hit that is *hot*. */\n public get isHot(): boolean {\n const currSnap = this.getCurrSnapDetail();\n return !currSnap ? false : currSnap.isHot;\n }\n\n /** Optional ids to never flash. Useful for tools like \"trim curve\" that won't want a flashed segment to obscure a result preview.\n * @note Cleared when a primitive or view tool is started and saved/restored when a primitive tool is suspended/unsuspended.\n * @public\n */\n public neverFlash(ids?: Id64Arg): void {\n if (undefined === ids) {\n this.toolState.neverFlash = undefined;\n return;\n }\n\n const newIds = new Set<string>();\n for (const id of Id64.iterable(ids))\n newIds.add(id);\n\n this.toolState.neverFlash = (0 !== newIds.size ? newIds : undefined);\n }\n\n /** @internal */\n public destroy(): void {\n this.currHit = undefined;\n this.aSnapHits = undefined;\n }\n\n private get _doSnapping(): boolean { return this.isSnapEnabled && this.isSnapEnabledByUser && !this._isSnapSuspended; }\n private get _isSnapSuspended(): boolean { return (0 !== this._suppressed || 0 !== this.toolState.suspended); }\n\n /** Get the current snap divisor to use to use for SnapMode.NearestKeypoint.\n * @public\n */\n public get keypointDivisor() { return 2; }\n\n /** Get the current active SnapModes. SnapMode position determines priority, with the first entry being the highest. The SnapDetail will be returned for the first SnapMode that produces a hot snap.\n * @public\n */\n public getActiveSnapModes(): SnapMode[] {\n const snaps: SnapMode[] = [];\n snaps.push(SnapMode.NearestKeypoint);\n return snaps;\n }\n\n /** Can be implemented by a subclass of AccuSnap to implement a SnapMode override that applies only to the next point.\n * This method will be called whenever a new tool is installed and on button events.\n * @internal\n */\n public synchSnapMode(): void { }\n\n /** Check whether current tentative snap has valid curve geometry for finding extended intersections. */\n private get _searchForExtendedIntersections(): boolean {\n const snap = IModelApp.tentativePoint.getCurrSnap();\n return (undefined !== snap && undefined !== snap.primitive);\n }\n\n /**\n * Check to see whether its appropriate to generate an AccuSnap point, given the current user\n * and command settings, and whether a tentative point is currently active.\n */\n public get isActive(): boolean {\n // Unless we're snapping in intersect mode (to find extended intersections), skip if tentative point active...\n if (IModelApp.tentativePoint.isActive) {\n if (!this._doSnapping || !this._searchForExtendedIntersections)\n return false;\n\n const snaps = this.getActiveSnapModes();\n for (const snap of snaps) {\n if (snap === SnapMode.Intersection)\n return true;\n }\n\n return false;\n }\n\n return this._doSnapping || this.isLocateEnabled;\n }\n\n private initializeForCheckMotion(): void {\n this._lastCursorPos.setFrom(IModelApp.toolAdmin.currentInputState.lastMotion);\n }\n\n /** Clear the current AccuSnap info. */\n public clear(): void { this.setCurrHit(undefined); }\n /** @internal */\n public setCurrHit(newHit?: HitDetail): void {\n const newSnap = AccuSnap.toSnapDetail(newHit);\n const currSnap = this.getCurrSnapDetail();\n const sameElem = (undefined !== newHit && newHit.isSameHit(this.currHit));\n const sameHit = (sameElem && !newSnap);\n const sameSnap = (sameElem && undefined !== newSnap && undefined !== currSnap);\n const samePt = (sameHit || (sameSnap && newSnap.snapPoint.isAlmostEqual(currSnap.snapPoint)));\n const sameHot = (sameHit || (sameSnap && (this.isHot === newSnap.isHot)));\n const sameBaseSnapMode = (!newSnap || !currSnap || newSnap.snapMode === currSnap.snapMode);\n const sameType = (sameHot && (!currSnap || (currSnap.getHitType() === newHit.getHitType())));\n\n // see if it is the same point on the same element, the hot flags are the same multiple snaps, and the snap modes are the same\n if (samePt && sameType && sameBaseSnapMode) {\n // we know that nothing about the screen could change, just save the new hit and return to avoid screen flash\n this.currHit = newHit;\n return;\n }\n\n this.erase();\n\n // if we hit the same element with the same \"hotness\" as last time, we don't need to erase it\n // multiple snaps: but only if the old and new snap modes are the same\n if (!sameHot || !sameBaseSnapMode) {\n this.unFlashViews();\n this.setFlashHit(newHit);\n }\n\n // if we didn't get a new hit, we're done\n if (undefined === (this.currHit = newHit))\n return;\n\n // draw sprites for this hit\n this.showSnapSprite();\n }\n\n /** flash a hit in a single view. */\n private flashHitInView(hit: HitDetail, context: DecorateContext) {\n const viewport = context.viewport;\n if (!viewport || !this.hitShouldBeHilited(hit) || !this.needsFlash(viewport))\n return;\n\n hit.draw(context);\n this.setIsFlashed(viewport);\n }\n\n private setNeedsFlashView(view: Viewport) {\n if (!this.isFlashed(view) && !this.needsFlash(view))\n this.setNeedsFlash(view);\n }\n\n /** flash a hit in its view. */\n private setFlashHit(hit?: HitDetail): void {\n if (hit !== undefined && this.hitShouldBeHilited(hit))\n this.setNeedsFlashView(hit.viewport);\n }\n\n /** @internal */\n public erase(): void {\n this.clearToolTip(undefined); // make sure there's no tooltip up.\n this.clearSprites(); // remove all sprites from the screen\n }\n\n private showElemInfo(viewPt: XAndY, vp: ScreenViewport, hit: HitDetail, delay: BeDuration): void {\n if (!IModelApp.viewManager.doesHostHaveFocus || undefined !== this._toolTipPromise)\n return;\n\n const promise = this._toolTipPromise = delay.executeAfter(async () => {\n if (promise !== this._toolTipPromise)\n return; // we abandoned this request during delay\n try {\n const msg = await IModelApp.toolAdmin.getToolTip(hit);\n if (this._toolTipPromise === promise) // have we abandoned this request while awaiting getToolTip?\n this.showLocateMessage(viewPt, vp, msg);\n } catch (error) { } // happens if getToolTip was canceled\n });\n }\n\n private showLocateMessage(viewPt: XAndY, vp: ScreenViewport, msg: HTMLElement | string) {\n if (IModelApp.viewManager.doesHostHaveFocus)\n vp.openToolTip(msg, viewPt);\n }\n\n /** @internal */\n public displayToolTip(viewPt: XAndY, vp: ScreenViewport, uorPt?: Point3d): void {\n // if the tooltip is already displayed, or if user doesn't want it, quit.\n if (!this._settings.toolTip || !IModelApp.notifications.isToolTipSupported || IModelApp.notifications.isToolTipOpen)\n return;\n\n const accuSnapHit = this.currHit;\n const tpHit = IModelApp.tentativePoint.getCurrSnap();\n\n // if we don't have either an AccuSnap or a tentative point hit, quit.\n if (!accuSnapHit && !tpHit && !this.errorIcon.isActive)\n return;\n\n let theHit: HitDetail | undefined;\n\n // determine which type of hit\n if (tpHit) {\n if (uorPt) {\n // see if he came back somewhere near the currently snapped element\n const aperture = (this._settings.stickyFactor * vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\n if (!IModelApp.locateManager.picker.testHit(tpHit, vp, uorPt, aperture, IModelApp.locateManager.options))\n return;\n }\n theHit = tpHit;\n } else {\n theHit = accuSnapHit;\n }\n\n // if we're currently showing an error, get the error message...otherwise display hit info...\n if (!this.errorIcon.isActive && theHit) {\n this.showElemInfo(viewPt, vp, theHit, this._settings.toolTipDelay);\n return;\n }\n\n // If we have an error explanation...use it as is!\n if (this.explanation) {\n this.showLocateMessage(viewPt, vp, this.explanation);\n return;\n }\n\n // if we don't have an explanation yet, translate the error code.\n if (!this.errorKey)\n return;\n\n this.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${this.errorKey}`);\n if (!this.explanation)\n return;\n\n this.showLocateMessage(viewPt, vp, this.explanation);\n }\n\n /** @internal */\n public clearToolTip(ev?: BeButtonEvent): void {\n // Throw away any stale request for a tooltip message\n this._toolTipPromise = undefined;\n if (!IModelApp.notifications.isToolTipOpen)\n return;\n\n if (ev && (5 > ev.viewPoint.distanceXY(IModelApp.notifications.toolTipLocation)))\n return;\n\n IModelApp.notifications.clearToolTip();\n }\n\n /** Display the sprites for the current snap to indicate its position on the screen and what snap mode it represents. */\n private showSnapSprite(): void {\n const snap = this.getCurrSnapDetail();\n if (!snap)\n return;\n\n const crossPt = snap.snapPoint;\n const viewport = snap.viewport;\n const crossSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}${snap.isHot ? \"sprites/SnapCross.png\" : \"sprites/SnapUnfocused.png\"}`);\n\n this.cross.activate(crossSprite, viewport, crossPt);\n\n const snapSprite = snap.sprite;\n if (snapSprite)\n this.icon.activate(snapSprite, viewport, AccuSnap.adjustIconLocation(viewport, crossPt, snapSprite.size));\n }\n\n private static adjustIconLocation(vp: Viewport, input: Point3d, iconSize: XAndY): Point3d {\n const out = vp.worldToView(input);\n out.x += (iconSize.x / 3.0);\n out.y -= (iconSize.y * 1.3);\n return vp.viewToWorld(out, out);\n }\n\n /** try to indicate what's wrong with the current point (why we're not snapping). */\n private showSnapError(out: LocateResponse, ev: BeButtonEvent) {\n this.explanation = out.explanation;\n this.errorKey = out.reason;\n this.errorIcon.deactivate();\n\n const vp = ev.viewport!;\n let errorSprite: Sprite | undefined;\n switch (out.snapStatus) {\n case SnapStatus.FilteredByApp:\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapAppFiltered.png`);\n break;\n\n case SnapStatus.FilteredByAppQuietly:\n this.errorKey = undefined;\n break;\n\n case SnapStatus.NotSnappable:\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapNotSnappable.png`);\n this.errorKey = ElementLocateManager.getFailureMessageKey(\"NotSnappable\");\n break;\n }\n\n if (!errorSprite)\n return;\n\n const spriteSize = errorSprite.size;\n const pt = AccuSnap.adjustIconLocation(vp, ev.rawPoint, spriteSize);\n\n this.errorIcon.activate(errorSprite, vp, pt);\n }\n\n private clearSprites() {\n this.errorIcon.deactivate();\n this.cross.deactivate();\n this.icon.deactivate();\n }\n\n /** determine whether a hit should be hilited or not. */\n private hitShouldBeHilited(hit: HitDetail | undefined): boolean {\n if (!hit)\n return false;\n\n if (hit.isModelHit || hit.isMapHit)\n return false; // Avoid annoying flashing of reality models.\n\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\n return false;\n\n const snap = AccuSnap.toSnapDetail(hit);\n return !snap || snap.isHot || this._settings.hiliteColdHits;\n }\n\n private unFlashViews() {\n this.needFlash.clear();\n for (const vp of this.areFlashed)\n vp.flashedId = undefined;\n\n this.areFlashed.clear();\n }\n\n /** @internal */\n public adjustPointIfHot(pt: Point3d, view: Viewport): void {\n const currSnap = this.getCurrSnapDetail();\n\n if (!currSnap || !currSnap.isHot || view !== currSnap.viewport)\n return;\n\n pt.setFrom(currSnap.adjustedPoint);\n }\n\n /** Implemented by sub-classes to update ui to show current enabled state.\n * @internal\n */\n public onEnabledStateChange(_isEnabled: boolean, _wasEnabled: boolean) { }\n\n /** @internal */\n public getHitAndList(holder: HitListHolder): HitDetail | undefined {\n const hit = this.currHit;\n if (hit) {\n holder.setHitList(this.aSnapHits);\n this.aSnapHits = undefined;\n }\n return hit;\n }\n\n private initCmdState() {\n this.toolState.suspended = 0;\n this.toolState.neverFlash = undefined;\n }\n\n /** @internal */\n public suspend(doSuspend: boolean) {\n const previousDoSnapping = this._doSnapping;\n if (doSuspend)\n this.toolState.suspended++;\n else if (this.toolState.suspended > 0)\n this.toolState.suspended--;\n\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\n }\n\n /** @internal */\n public suppress(doSuppress: boolean): number {\n const previousDoSnapping = this._doSnapping;\n if (doSuppress)\n this._suppressed++;\n else if (this._suppressed > 0)\n this._suppressed--;\n\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\n return this._suppressed;\n }\n\n /** Turn AccuSnap on or off */\n public enableSnap(yesNo: boolean) {\n const previousDoSnapping = this._doSnapping;\n this.toolState.enabled = yesNo;\n if (!yesNo) {\n this.clear();\n if (undefined !== this.touchCursor && !this.wantVirtualCursor) {\n this.touchCursor = undefined;\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n }\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\n }\n\n /** @internal */\n public intersectXY(tpSnap: SnapDetail, second: SnapDetail): IntersectDetail | undefined {\n // Get single segment curve from each snap to intersect...\n const tpSegment = tpSnap.getCurvePrimitive();\n if (undefined === tpSegment)\n return undefined;\n const segment = second.getCurvePrimitive();\n if (undefined === segment)\n return undefined;\n\n const worldToView = second.viewport.worldToViewMap.transform0;\n const detail = CurveCurve.intersectionProjectedXYPairs(worldToView, tpSegment, true, segment, true);\n if (0 === detail.length)\n return undefined;\n\n let closeIndex = 0;\n if (detail.length > 1) {\n const snapPt = worldToView.multiplyPoint3d(HitGeomType.Point === tpSnap.geomType && HitGeomType.Point !== second.geomType ? second.getPoint() : tpSnap.getPoint(), 1); // Don't check distance from arc centers...\n let lastDist: number | undefined;\n\n for (let i = 0; i < detail.length; i++) {\n const testPt = worldToView.multiplyPoint3d(detail[i].detailA.point, 1);\n const testDist = snapPt.realDistanceXY(testPt);\n\n if (undefined !== testDist && (undefined === lastDist || testDist < lastDist)) {\n lastDist = testDist;\n closeIndex = i;\n }\n }\n }\n\n const intersect = new IntersectDetail(tpSnap, SnapHeat.InRange, detail[closeIndex].detailA.point, segment, second.sourceId); // Should be ok to share hit detail with tentative...\n intersect.primitive = tpSegment; // Just save single segment that was intersected for line strings/shapes...\n\n return intersect;\n }\n\n /** @internal */\n public static async requestSnap(thisHit: HitDetail, snapModes: SnapMode[], hotDistanceInches: number, keypointDivisor: number, hitList?: HitList<HitDetail>, out?: LocateResponse): Promise<SnapDetail | undefined> {\n if (thisHit.isModelHit || thisHit.isMapHit || thisHit.isClassifier) {\n if (snapModes.includes(SnapMode.Nearest)) {\n if (out)\n out.snapStatus = SnapStatus.Success;\n\n return new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.InRange);\n } else if (1 === snapModes.length && snapModes.includes(SnapMode.Intersection)) {\n if (out)\n out.snapStatus = SnapStatus.NoSnapPossible;\n\n return undefined;\n } else {\n if (out)\n out.snapStatus = SnapStatus.Success;\n\n const realitySnap = new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.None);\n realitySnap.sprite = undefined; // Don't show a snap mode that isn't applicable, but still accept hit point...\n return realitySnap;\n }\n }\n\n if (undefined !== thisHit.subCategoryId && !thisHit.isExternalIModelHit) {\n const appearance = thisHit.viewport.getSubCategoryAppearance(thisHit.subCategoryId);\n if (appearance.dontSnap) {\n if (out) {\n out.snapStatus = SnapStatus.NotSnappable;\n out.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${ElementLocateManager.getFailureMessageKey(\"NotSnappableSubCategory\")}`);\n }\n return undefined;\n }\n }\n\n const requestProps: SnapRequestProps = {\n id: thisHit.sourceId,\n testPoint: thisHit.testPoint,\n closePoint: thisHit.hitPoint,\n worldToView: thisHit.viewport.worldToViewMap.transform0.toJSON(),\n viewFlags: thisHit.viewport.viewFlags,\n snapModes,\n snapAperture: thisHit.viewport.pixelsFromInches(hotDistanceInches),\n snapDivisor: keypointDivisor,\n subCategoryId: thisHit.subCategoryId,\n geometryClass: thisHit.geometryClass,\n };\n\n const thisGeom = (thisHit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(thisHit) : IModelApp.viewManager.getDecorationGeometry(thisHit));\n\n if (undefined !== thisGeom) {\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: thisGeom }];\n } else if (!thisHit.isElementHit) {\n if (out)\n out.snapStatus = SnapStatus.NoSnapPossible;\n return undefined;\n }\n\n if (snapModes.includes(SnapMode.Intersection)) {\n if (undefined !== hitList) {\n for (const hit of hitList.hits) {\n if (thisHit.sourceId === hit.sourceId || thisHit.iModel !== hit.iModel)\n continue;\n\n const geom = (hit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(hit) : IModelApp.viewManager.getDecorationGeometry(hit));\n\n if (undefined !== geom) {\n if (undefined === requestProps.decorationGeometry)\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: geom }];\n else\n requestProps.decorationGeometry.push({ id: thisHit.sourceId, geometryStream: geom });\n } else if (!hit.isElementHit) {\n continue;\n }\n\n if (undefined === requestProps.intersectCandidates)\n requestProps.intersectCandidates = [hit.sourceId];\n else\n requestProps.intersectCandidates.push(hit.sourceId);\n\n if (5 === requestProps.intersectCandidates.length)\n break; // Search for intersection with a few of the next best hits...\n }\n }\n\n if (1 === snapModes.length && undefined === requestProps.intersectCandidates) {\n if (out)\n out.snapStatus = SnapStatus.NoSnapPossible;\n\n return undefined; // Don't make back end request when only doing intersection snap when we don't have another hit to intersect with...\n }\n }\n\n try {\n const result = await thisHit.iModel.requestSnap(requestProps);\n\n if (out)\n out.snapStatus = result.status;\n\n if (result.status !== SnapStatus.Success)\n return undefined;\n\n const parseCurve = (json: any): CurvePrimitive | undefined => {\n const parsed = undefined !== json ? GeomJson.Reader.parse(json) : undefined;\n return parsed instanceof GeometryQuery && \"curvePrimitive\" === parsed.geometryCategory ? parsed : undefined;\n };\n\n const snapPoint = Point3d.fromJSON(result.snapPoint);\n const displayTransform = undefined !== thisHit.modelId ? thisHit.viewport.view.computeDisplayTransform({ modelId: thisHit.modelId, elementId: thisHit.sourceId }) : undefined;\n displayTransform?.multiplyPoint3d(snapPoint, snapPoint);\n\n const snap = new SnapDetail(thisHit, result.snapMode, result.heat, snapPoint);\n\n snap.setCurvePrimitive(parseCurve(result.curve), displayTransform, result.geomType);\n if (undefined !== result.parentGeomType)\n snap.parentGeomType = result.parentGeomType;\n\n // Update hitPoint from readPixels with exact point location corrected to surface/edge geometry.\n if (undefined !== result.hitPoint) {\n snap.hitPoint.setFromJSON(result.hitPoint);\n displayTransform?.multiplyPoint3d(snap.hitPoint, snap.hitPoint);\n }\n\n // Apply display transform to normal.\n if (undefined !== result.normal) {\n snap.normal = Vector3d.fromJSON(result.normal);\n displayTransform?.matrix.multiplyVector(snap.normal, snap.normal);\n snap.normal.normalizeInPlace();\n }\n\n if (SnapMode.Intersection !== snap.snapMode)\n return snap;\n\n if (undefined === result.intersectId)\n return undefined;\n\n const otherPrimitive = parseCurve(result.intersectCurve);\n if (undefined === otherPrimitive)\n return undefined;\n\n const intersect = new IntersectDetail(snap, snap.heat, snap.snapPoint, otherPrimitive, result.intersectId);\n return intersect;\n } catch (_err) {\n if (out)\n out.snapStatus = SnapStatus.Aborted;\n\n return undefined;\n }\n }\n\n private async getAccuSnapDetail(hitList: HitList<HitDetail>, out: LocateResponse): Promise<SnapDetail | undefined> {\n const thisHit = hitList.getNextHit();\n if (undefined === thisHit)\n return undefined;\n\n const filterStatus: LocateFilterStatus = (this.isLocateEnabled ? await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, out) : LocateFilterStatus.Accept);\n if (LocateFilterStatus.Accept !== filterStatus) {\n out.snapStatus = SnapStatus.FilteredByApp;\n return undefined;\n }\n\n let snapModes: SnapMode[];\n if (IModelApp.tentativePoint.isActive) {\n snapModes = [];\n snapModes.push(SnapMode.Nearest); // Special case: isActive only allows snapping with tentative to find extended intersections...\n } else {\n snapModes = this.getActiveSnapModes(); // Get the list of point snap modes to consider\n }\n\n const thisSnap = await AccuSnap.requestSnap(thisHit, snapModes, this._hotDistanceInches, this.keypointDivisor, hitList, out);\n if (undefined === thisSnap)\n return undefined;\n\n if (IModelApp.tentativePoint.isActive) {\n const tpSnap = IModelApp.tentativePoint.getCurrSnap();\n if (undefined === tpSnap)\n return undefined;\n const intersectSnap = this.intersectXY(tpSnap, thisSnap);\n if (undefined === intersectSnap)\n return undefined;\n hitList.setCurrentHit(thisHit);\n return intersectSnap;\n }\n\n IModelApp.accuDraw.onSnap(thisSnap); // AccuDraw can adjust nearest snap to intersection of circle (polar distance lock) or line (axis lock) with snapped to curve...\n hitList.setCurrentHit(thisHit);\n return thisSnap;\n }\n\n private findHits(ev: BeButtonEvent, force: boolean = false): SnapStatus {\n // When using AccuSnap to locate elements, we have to start with the datapoint adjusted\n // for locks and not the raw point. Otherwise, when grid/unit lock are on, we locate elements by\n // points not on the grid. This causes them to be \"pulled\" off the grid when they are accepted. On\n // the other hand, when NOT locating, we need to use the raw point so we can snap to elements\n // away from the grid.\n\n const testPoint = this.isLocateEnabled ? ev.point : ev.rawPoint;\n const vp = ev.viewport!;\n const picker = IModelApp.locateManager.picker;\n const options = IModelApp.locateManager.options.clone(); // Copy to avoid changing out from under active Tool...\n\n // NOTE: Since TestHit will use the same HitSource as the input hit we only need to sets this for DoPick...\n options.hitSource = this.isSnapEnabled ? HitSource.AccuSnap : HitSource.MotionLocate;\n\n let aperture = (vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\n this.initializeForCheckMotion();\n aperture *= this._searchDistance;\n\n if (0 === picker.doPick(vp, testPoint, aperture, options)) {\n this.aSnapHits = undefined; // Clear any previous hit list so reset won't cycle through hits cursor is no longer over, etc.\n return SnapStatus.NoElements;\n }\n\n this.aSnapHits = picker.getHitList(true); // take ownership of the pickElem hit list.\n\n // see if we should keep the current hit\n const canBeSticky = !force && this.aSnapHits.length > 1 && this.currHit && (HitDetailType.Intersection !== this.currHit.getHitType() && this.currHit.priority < HitPriority.PlanarSurface);\n if (canBeSticky) {\n for (let iHit = 1; iHit < this.aSnapHits.length; ++iHit) {\n const thisHit = this.aSnapHits.hits[iHit];\n if (!thisHit.isSameHit(this.currHit))\n continue;\n this.aSnapHits.removeHit(iHit);\n this.aSnapHits.insertHit(0, thisHit);\n break;\n }\n }\n\n return SnapStatus.Success;\n }\n\n private async findLocatableHit(ev: BeButtonEvent, newSearch: boolean, out: LocateResponse): Promise<HitDetail | undefined> {\n out.snapStatus = SnapStatus.NoElements;\n\n if (newSearch) {\n this.aSnapHits = undefined;\n // search for new hits, but if the cursor is still close to the current hit, don't throw away list.\n if (SnapStatus.Success !== (out.snapStatus = this.findHits(ev)))\n return undefined;\n } else {\n if (!this.aSnapHits) {\n out.snapStatus = SnapStatus.NoElements;\n return undefined;\n }\n }\n\n const thisList = this.aSnapHits!;\n let thisHit: HitDetail | undefined;\n let firstRejected;\n const filterResponse = new LocateResponse();\n\n // keep looking through hits until we find one that is accu-snappable.\n while (undefined !== (thisHit = thisList.getNextHit())) {\n if (LocateFilterStatus.Accept === await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, filterResponse))\n return thisHit;\n // we only care about the status of the first hit.\n if (undefined !== firstRejected)\n continue;\n firstRejected = filterResponse.clone();\n firstRejected.snapStatus = SnapStatus.FilteredByApp;\n }\n\n if (undefined !== firstRejected)\n out.setFrom(firstRejected);\n\n // Reset current hit index to go back to first hit on next AccuSnap reset event...\n thisList.resetCurrentHit();\n return undefined;\n }\n\n /** When in auto-locate mode, advance to the next hit without searching again.\n * @internal\n */\n public async resetButton(): Promise<SnapStatus> {\n let hit: HitDetail | undefined;\n const out = new LocateResponse();\n out.snapStatus = SnapStatus.Disabled;\n\n this.clearToolTip(undefined);\n\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n\n if (this._doSnapping) {\n // if we don't have any more candidate hits, get a new list at the current location\n if (!this.aSnapHits || (0 === this.aSnapHits.length)) {\n out.snapStatus = this.findHits(ev);\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\n } else {\n // drop the current hit from the list and then retest the list (without the dropped hit) to find the new snap\n this.aSnapHits.removeCurrentHit();\n hit = await this.getAccuSnapDetail(this.aSnapHits, out);\n }\n } else if (this.isLocateEnabled) {\n hit = await this.findLocatableHit(ev, false, out); // get next AccuSnap path (or undefined)\n }\n\n // set the current hit\n if (hit || this.currHit)\n this.setCurrHit(hit);\n\n // indicate errors\n this.showSnapError(out, ev);\n return out.snapStatus;\n }\n\n /** Find the best snap point according to the current cursor location\n * @internal\n */\n public async onMotion(ev: BeButtonEvent): Promise<void> {\n this.clearToolTip(ev);\n const out = new LocateResponse();\n out.snapStatus = SnapStatus.Disabled;\n\n let hit: HitDetail | undefined;\n if (this.isActive) {\n if (this._doSnapping) {\n out.snapStatus = this.findHits(ev);\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\n } else if (this.isLocateEnabled) {\n hit = await this.findLocatableHit(ev, true, out);\n }\n }\n\n // set the current hit and display the sprite (based on snap's KeypointType)\n if (hit || this.currHit)\n this.setCurrHit(hit);\n\n // set up active error before calling displayToolTip to indicate error or show locate message...\n this.showSnapError(out, ev);\n this.displayToolTip(ev.viewPoint, ev.viewport!, ev.rawPoint);\n\n if (undefined !== this.touchCursor && InputSource.Mouse === ev.inputSource) {\n this.touchCursor = undefined;\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n }\n\n /** @internal */\n public onPreButtonEvent(ev: BeButtonEvent): boolean { return (undefined !== this.touchCursor) ? this.touchCursor.isButtonHandled(ev) : false; }\n /** @internal */\n public onTouchStart(ev: BeTouchEvent): void {\n if (undefined !== this.touchCursor)\n this.touchCursor.doTouchStart(ev);\n }\n\n /** @internal */\n public onTouchEnd(ev: BeTouchEvent): void {\n if (undefined !== this.touchCursor && 0 === ev.touchCount)\n this.touchCursor.doTouchEnd(ev);\n }\n\n /** @internal */\n public onTouchCancel(ev: BeTouchEvent): void {\n if (undefined !== this.touchCursor)\n this.touchCursor.doTouchEnd(ev);\n }\n\n /** @internal */\n public onTouchMove(ev: BeTouchEvent): boolean {\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMove(ev) : false;\n }\n\n /** @internal */\n public onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMoveStart(ev, startEv) : false;\n }\n\n /** @internal */\n public get wantVirtualCursor(): boolean {\n return this._doSnapping || (this.isLocateEnabled && ToolSettings.enableVirtualCursorForLocate);\n }\n\n /** @internal */\n public async onTouchTap(ev: BeTouchEvent): Promise<boolean> {\n if (undefined !== this.touchCursor)\n return this.touchCursor.doTouchTap(ev);\n if (!this.wantVirtualCursor)\n return false;\n this.touchCursor = TouchCursor.createFromTouchTap(ev);\n if (undefined === this.touchCursor)\n return false;\n // Give active tool an opportunity to update it's tool assistance since event won't be passed along...\n const tool = IModelApp.toolAdmin.activeTool;\n if (undefined === tool)\n return true;\n await tool.onSuspend();\n await tool.onUnsuspend();\n return true;\n }\n\n private flashElements(context: DecorateContext): void {\n const viewport = context.viewport;\n if (this.currHit) {\n if (this.needsFlash(viewport))\n this.flashHitInView(this.currHit, context);\n return;\n }\n\n const hit = IModelApp.tentativePoint.getCurrSnap();\n if (!hit || hit.isModelHit || hit.isMapHit)\n return; // Don't hilite reality models.\n\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\n return;\n\n hit.draw(context);\n }\n\n /** @internal */\n public decorate(context: DecorateContext): void {\n if (undefined !== this.touchCursor && this.touchCursor.viewport === context.viewport)\n context.addCanvasDecoration(this.touchCursor, true);\n\n this.flashElements(context);\n\n if (this.cross.isActive) {\n this.cross.decorate(context);\n this.icon.decorate(context);\n }\n\n this.errorIcon.decorate(context);\n }\n\n private clearElemFromHitList(element: string) {\n if (this.aSnapHits)\n this.aSnapHits.removeHitsFrom(element);\n }\n\n /** @internal */\n public clearIfElement(sourceId: string): void {\n this.clearElemFromHitList(sourceId);\n\n const hit = this.currHit;\n if (hit && hit.sourceId === sourceId) {\n this.destroy();\n }\n }\n\n /** Enable locating elements.\n * @public\n */\n public enableLocate(yesNo: boolean) {\n this.toolState.locate = yesNo;\n if (!yesNo && undefined !== this.touchCursor && !this.wantVirtualCursor) {\n this.touchCursor = undefined;\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n }\n\n /** Called whenever a new [[Tool]] is started.\n * @internal\n */\n public onStartTool(): void {\n this.initCmdState();\n this.enableSnap(false);\n this.enableLocate(false);\n IModelApp.tentativePoint.clear(true);\n }\n\n /**\n * Force AccuSnap to reevaluate the snap at the current cursor location.\n * This is useful of an application changes the snap mode and wants AccuSnap to choose it immediately, without\n * requiring the user to move the mouse.\n * @internal\n */\n public async reEvaluate() {\n if (this.getCurrSnapDetail()) {\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n return this.onMotion(ev);\n }\n }\n}\n\n/** @internal */\nexport class TentativeOrAccuSnap {\n public static get isHot(): boolean { return IModelApp.accuSnap.isHot || IModelApp.tentativePoint.isSnapped; }\n\n public static getCurrentSnap(checkIsHot: boolean = true): SnapDetail | undefined {\n // Checking for a hot AccuSnap hit before checking tentative is probably necessary for extended intersections?\n if (IModelApp.accuSnap.isHot)\n return IModelApp.accuSnap.getCurrSnapDetail();\n\n if (IModelApp.tentativePoint.isSnapped)\n return IModelApp.tentativePoint.currSnap;\n\n return (checkIsHot ? undefined : IModelApp.accuSnap.getCurrSnapDetail());\n }\n\n public static getCurrentPoint(): Point3d {\n if (IModelApp.accuSnap.isHot) {\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\n if (snap)\n return snap.adjustedPoint;\n }\n\n return IModelApp.tentativePoint.getPoint();\n }\n\n public static getCurrentView(): ScreenViewport | undefined {\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\n return snap ? snap.viewport : IModelApp.tentativePoint.viewport;\n }\n}\n\n/** @public */\nexport namespace AccuSnap { // eslint-disable-line no-redeclare\n export class ToolState {\n public enabled = false;\n public locate = false;\n public suspended = 0;\n public neverFlash?: Id64Set;\n public setFrom(other: ToolState): void {\n this.enabled = other.enabled;\n this.locate = other.locate;\n this.suspended = other.suspended;\n this.neverFlash = other.neverFlash;\n }\n public clone(): ToolState {\n const val = new ToolState();\n val.setFrom(this);\n return val;\n }\n }\n\n export class Settings {\n public hotDistanceFactor = 1.2;\n public stickyFactor = 1.0;\n public searchDistance = 2.0;\n public hiliteColdHits = true;\n public enableFlag = true;\n public toolTip = true;\n public toolTipDelay = BeDuration.fromSeconds(.5); // delay before tooltip pops up\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AccuSnap.js","sourceRoot":"","sources":["../../src/AccuSnap.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module LocatingElements\n */\n\nimport { BeDuration, Id64, Id64Arg, Id64Set } from \"@itwin/core-bentley\";\nimport { CurveCurve, CurvePrimitive, GeometryQuery, IModelJson as GeomJson, Point2d, Point3d, Vector3d, XAndY } from \"@itwin/core-geometry\";\nimport { SnapRequestProps } from \"@itwin/core-common\";\nimport { ElementLocateManager, HitListHolder, LocateAction, LocateFilterStatus, LocateResponse, SnapStatus } from \"./ElementLocateManager\";\nimport { HitDetail, HitDetailType, HitGeomType, HitList, HitPriority, HitSource, IntersectDetail, SnapDetail, SnapHeat, SnapMode } from \"./HitDetail\";\nimport { IModelApp } from \"./IModelApp\";\nimport { CanvasDecoration } from \"./render/CanvasDecoration\";\nimport { IconSprites, Sprite, SpriteLocation } from \"./Sprites\";\nimport { BeButton, BeButtonEvent, BeTouchEvent, InputSource } from \"./tools/Tool\";\nimport { ToolSettings } from \"./tools/ToolSettings\";\nimport { DecorateContext } from \"./ViewContext\";\nimport { Decorator } from \"./ViewManager\";\nimport { ScreenViewport, Viewport } from \"./Viewport\";\n\n// cspell:ignore dont primitivetools\n\n/** Virtual cursor for using AccuSnap with touch input.\n * @internal\n */\nexport class TouchCursor implements CanvasDecoration {\n public position = new Point3d();\n public viewport: Viewport;\n protected _offsetPosition = new Point3d();\n protected _size: number;\n protected _yOffset: number;\n protected _isSelected = false;\n protected _isDragging = false;\n protected _inTouchTap = false;\n\n protected constructor(vp: ScreenViewport) {\n this._size = vp.pixelsFromInches(0.3);\n this._yOffset = this._size * 1.75;\n this.viewport = vp;\n }\n\n protected setPosition(vp: Viewport, worldLocation: Point3d): boolean {\n const pointNpc = vp.worldToNpc(worldLocation);\n if (pointNpc.z < 0.0 || pointNpc.z > 1.0)\n pointNpc.z = 0.5; // move inside frustum.\n\n const viewLocation = vp.npcToView(pointNpc);\n if (!vp.viewRect.containsPoint(viewLocation))\n return false; // outside this viewport rect\n\n viewLocation.x = Math.floor(viewLocation.x) + 0.5;\n viewLocation.y = Math.floor(viewLocation.y) + 0.5;\n viewLocation.z = 0.0;\n const offsetLocation = new Point3d(viewLocation.x, viewLocation.y - this._yOffset, viewLocation.z);\n if (!vp.viewRect.containsPoint(offsetLocation))\n return false; // outside this viewport rect\n\n this.position.setFrom(viewLocation);\n this._offsetPosition.setFrom(offsetLocation);\n if (vp !== this.viewport) {\n this.viewport.invalidateDecorations();\n this.viewport = vp;\n }\n vp.invalidateDecorations();\n return true;\n }\n\n protected drawHandle(ctx: CanvasRenderingContext2D, filled: boolean): void {\n ctx.beginPath();\n ctx.moveTo(-this._size, 0);\n ctx.bezierCurveTo(-this._size, -this._size * 0.85, -this._size * 0.6, -this._yOffset * 0.6, 0, -this._yOffset * 0.8);\n ctx.bezierCurveTo(this._size * 0.6, -this._yOffset * 0.6, this._size, -this._size * 0.85, this._size, 0);\n ctx.arc(0, 0, this._size, 0, Math.PI);\n if (filled)\n ctx.fill();\n\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(0, 0, this._size * 0.75, 0, 2 * Math.PI);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(-this._size * 0.4, 0);\n ctx.lineTo(this._size * 0.4, 0);\n ctx.moveTo(-this._size * 0.4, this._size * 0.25);\n ctx.lineTo(this._size * 0.4, this._size * 0.25);\n ctx.stroke();\n }\n\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\n ctx.lineWidth = 1;\n ctx.strokeStyle = \"rgba(0,0,0,.75)\";\n ctx.fillStyle = \"white\";\n ctx.strokeRect(-2, -(this._yOffset + 2), 5, 5);\n ctx.fillRect(-1, -(this._yOffset + 1), 3, 3);\n\n ctx.lineWidth = 3.5;\n ctx.lineCap = \"round\";\n ctx.fillStyle = this._isSelected ? \"rgba(35,187,252,.25)\" : \"rgba(255,215,0,.25)\";\n ctx.shadowColor = \"black\";\n ctx.shadowBlur = 10;\n this.drawHandle(ctx, true);\n\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = this._isSelected ? \"rgba(35,187,252,.75)\" : \"rgba(255,215,0,.75)\";\n ctx.shadowBlur = 0;\n this.drawHandle(ctx, false);\n }\n\n protected isSelected(pt: XAndY): boolean { return this.position.distance(Point3d.create(pt.x, pt.y)) < this._size; }\n public isButtonHandled(ev: BeButtonEvent): boolean { return (BeButton.Data === ev.button && InputSource.Touch === ev.inputSource && !this._inTouchTap); }\n\n public doTouchMove(ev: BeTouchEvent): boolean {\n if (undefined === ev.viewport || !ev.isSingleTouch)\n return false;\n if (!this._isDragging || !this.setPosition(ev.viewport, ev.point))\n return false;\n ev.viewPoint = this._offsetPosition;\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\n return true;\n }\n\n public doTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\n if (undefined === ev.viewport || !ev.isSingleTouch)\n return false;\n return (this._isDragging = this.isSelected(startEv.viewPoint));\n }\n\n public doTouchStart(ev: BeTouchEvent): void {\n this._isSelected = ev.isSingleTouch && this.isSelected(ev.viewPoint);\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n }\n\n public doTouchEnd(ev: BeTouchEvent): void {\n if (this._isDragging && undefined !== ev.viewport)\n IModelApp.toolAdmin.currentInputState.fromPoint(ev.viewport, this._offsetPosition, InputSource.Touch); // Current location should reflect virtual cursor offset...\n this._isSelected = this._isDragging = false;\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n }\n\n public async doTouchTap(ev: BeTouchEvent): Promise<boolean> {\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\n return false;\n if (!this.isSelected(ev.viewPoint)) {\n if (!this.setPosition(ev.viewport, ev.point))\n return false;\n ev.viewPoint = this._offsetPosition;\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\n return false;\n }\n ev.viewPoint = this._offsetPosition;\n this._inTouchTap = true;\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev);\n this._inTouchTap = false;\n return true;\n }\n\n public static createFromTouchTap(ev: BeTouchEvent): TouchCursor | undefined {\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\n return undefined;\n const touchCursor = new TouchCursor(ev.viewport);\n if (!touchCursor.setPosition(ev.viewport, ev.point) && !touchCursor.setPosition(ev.viewport, ev.viewport.view.getCenter()))\n return undefined;\n ev.viewPoint = touchCursor._offsetPosition;\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\n return touchCursor;\n }\n}\n\n/** AccuSnap is an aide for snapping to interesting points on elements or decorations as the cursor moves over them.\n * @see [Using AccuSnap]($docs/learning/frontend/primitivetools.md#AccuSnap)\n * @public\n * @extensions\n */\nexport class AccuSnap implements Decorator {\n /** Currently active hit */\n public currHit?: HitDetail;\n /** Current list of hits. */\n public aSnapHits?: HitList<HitDetail>;\n /** Views that need to be flashed */\n public readonly needFlash = new Set<Viewport>();\n /** Views that are already flashed */\n public readonly areFlashed = new Set<Viewport>();\n /** The \"+\" that indicates where the snap point is */\n public readonly cross = new SpriteLocation();\n /** The icon that indicates what type of snap is active */\n public readonly icon = new SpriteLocation();\n /** The icon that indicates an error */\n public readonly errorIcon = new SpriteLocation();\n /** Reason key for last error */\n public errorKey?: string;\n /** localized message explaining why last error was generated. */\n public explanation?: string;\n /** Number of times \"suppress\" has been called -- unlike suspend this is not automatically cleared by tools */\n private _suppressed = 0;\n /** Location of cursor when we last checked for motion */\n private readonly _lastCursorPos = new Point2d();\n /** @internal */\n public readonly toolState = new AccuSnap.ToolState();\n /** @internal */\n protected _settings = new AccuSnap.Settings();\n /** @internal */\n public touchCursor?: TouchCursor;\n /** Current request for tooltip message. */\n private _toolTipPromise?: Promise<Promise<void>>;\n\n /** @internal */\n public onInitialized() { }\n private get _searchDistance(): number { return this.isLocateEnabled ? 1.0 : this._settings.searchDistance; }\n private get _hotDistanceInches(): number { return IModelApp.locateManager.apertureInches * this._settings.hotDistanceFactor; }\n /** Whether locate of elements under the cursor is enabled by the current InteractiveTool.\n * @public\n */\n public get isLocateEnabled(): boolean { return this.toolState.locate; }\n /** Whether snapping to elements under the cursor is enabled by the current InteractiveTool.\n * @public\n */\n public get isSnapEnabled(): boolean { return this.toolState.enabled; }\n /** Whether the user setting for snapping is enabled. Snapping is done only when both the user and current InteractiveTool have enabled it.\n * @public\n */\n public get isSnapEnabledByUser(): boolean { return this._settings.enableFlag; }\n private isFlashed(view: Viewport): boolean { return (this.areFlashed.has(view)); }\n private needsFlash(view: Viewport): boolean { return (this.needFlash.has(view)); }\n private setNeedsFlash(view: Viewport) {\n this.needFlash.add(view);\n this.clearIsFlashed(view);\n view.invalidateDecorations();\n }\n\n private setIsFlashed(view: Viewport) { this.areFlashed.add(view); }\n private clearIsFlashed(view: Viewport) { this.areFlashed.delete(view); }\n private static toSnapDetail(hit?: HitDetail): SnapDetail | undefined { return (hit && hit instanceof SnapDetail) ? hit : undefined; }\n /** @internal */\n public getCurrSnapDetail(): SnapDetail | undefined { return AccuSnap.toSnapDetail(this.currHit); }\n /** Determine whether there is a current hit that is *hot*. */\n public get isHot(): boolean {\n const currSnap = this.getCurrSnapDetail();\n return !currSnap ? false : currSnap.isHot;\n }\n\n /** Optional ids to never flash. Useful for tools like \"trim curve\" that won't want a flashed segment to obscure a result preview.\n * @note Cleared when a primitive or view tool is started and saved/restored when a primitive tool is suspended/unsuspended.\n * @public\n */\n public neverFlash(ids?: Id64Arg): void {\n if (undefined === ids) {\n this.toolState.neverFlash = undefined;\n return;\n }\n\n const newIds = new Set<string>();\n for (const id of Id64.iterable(ids))\n newIds.add(id);\n\n this.toolState.neverFlash = (0 !== newIds.size ? newIds : undefined);\n }\n\n /** @internal */\n public destroy(): void {\n this.currHit = undefined;\n this.aSnapHits = undefined;\n }\n\n private get _doSnapping(): boolean { return this.isSnapEnabled && this.isSnapEnabledByUser && !this._isSnapSuspended; }\n private get _isSnapSuspended(): boolean { return (0 !== this._suppressed || 0 !== this.toolState.suspended); }\n\n /** Get the current snap divisor to use to use for SnapMode.NearestKeypoint.\n * @public\n */\n public get keypointDivisor() { return 2; }\n\n /** Get the current active SnapModes. SnapMode position determines priority, with the first entry being the highest. The SnapDetail will be returned for the first SnapMode that produces a hot snap.\n * @public\n */\n public getActiveSnapModes(): SnapMode[] {\n const snaps: SnapMode[] = [];\n snaps.push(SnapMode.NearestKeypoint);\n return snaps;\n }\n\n /** Can be implemented by a subclass of AccuSnap to implement a SnapMode override that applies only to the next point.\n * This method will be called whenever a new tool is installed and on button events.\n * @internal\n */\n public synchSnapMode(): void { }\n\n /** Check whether current tentative snap has valid curve geometry for finding extended intersections. */\n private get _searchForExtendedIntersections(): boolean {\n const snap = IModelApp.tentativePoint.getCurrSnap();\n return (undefined !== snap && undefined !== snap.primitive);\n }\n\n /**\n * Check to see whether its appropriate to generate an AccuSnap point, given the current user\n * and command settings, and whether a tentative point is currently active.\n */\n public get isActive(): boolean {\n // Unless we're snapping in intersect mode (to find extended intersections), skip if tentative point active...\n if (IModelApp.tentativePoint.isActive) {\n if (!this._doSnapping || !this._searchForExtendedIntersections)\n return false;\n\n const snaps = this.getActiveSnapModes();\n for (const snap of snaps) {\n if (snap === SnapMode.Intersection)\n return true;\n }\n\n return false;\n }\n\n return this._doSnapping || this.isLocateEnabled;\n }\n\n private initializeForCheckMotion(): void {\n this._lastCursorPos.setFrom(IModelApp.toolAdmin.currentInputState.lastMotion);\n }\n\n /** Clear the current AccuSnap info. */\n public clear(): void { this.setCurrHit(undefined); }\n /** @internal */\n public setCurrHit(newHit?: HitDetail): void {\n const newSnap = AccuSnap.toSnapDetail(newHit);\n const currSnap = this.getCurrSnapDetail();\n const sameElem = (undefined !== newHit && newHit.isSameHit(this.currHit));\n const sameHit = (sameElem && !newSnap);\n const sameSnap = (sameElem && undefined !== newSnap && undefined !== currSnap);\n const samePt = (sameHit || (sameSnap && newSnap.snapPoint.isAlmostEqual(currSnap.snapPoint)));\n const sameHot = (sameHit || (sameSnap && (this.isHot === newSnap.isHot)));\n const sameBaseSnapMode = (!newSnap || !currSnap || newSnap.snapMode === currSnap.snapMode);\n const sameType = (sameHot && (!currSnap || (currSnap.getHitType() === newHit.getHitType())));\n\n // see if it is the same point on the same element, the hot flags are the same multiple snaps, and the snap modes are the same\n if (samePt && sameType && sameBaseSnapMode) {\n // we know that nothing about the screen could change, just save the new hit and return to avoid screen flash\n this.currHit = newHit;\n return;\n }\n\n this.erase();\n\n // if we hit the same element with the same \"hotness\" as last time, we don't need to erase it\n // multiple snaps: but only if the old and new snap modes are the same\n if (!sameHot || !sameBaseSnapMode) {\n this.unFlashViews();\n this.setFlashHit(newHit);\n }\n\n // if we didn't get a new hit, we're done\n if (undefined === (this.currHit = newHit))\n return;\n\n // draw sprites for this hit\n this.showSnapSprite();\n }\n\n /** flash a hit in a single view. */\n private flashHitInView(hit: HitDetail, context: DecorateContext) {\n const viewport = context.viewport;\n if (!viewport || !this.hitShouldBeHilited(hit) || !this.needsFlash(viewport))\n return;\n\n hit.draw(context);\n this.setIsFlashed(viewport);\n }\n\n private setNeedsFlashView(view: Viewport) {\n if (!this.isFlashed(view) && !this.needsFlash(view))\n this.setNeedsFlash(view);\n }\n\n /** flash a hit in its view. */\n private setFlashHit(hit?: HitDetail): void {\n if (hit !== undefined && this.hitShouldBeHilited(hit))\n this.setNeedsFlashView(hit.viewport);\n }\n\n /** @internal */\n public erase(): void {\n this.clearToolTip(undefined); // make sure there's no tooltip up.\n this.clearSprites(); // remove all sprites from the screen\n }\n\n private showElemInfo(viewPt: XAndY, vp: ScreenViewport, hit: HitDetail, delay: BeDuration): void {\n if (!IModelApp.viewManager.doesHostHaveFocus || undefined !== this._toolTipPromise)\n return;\n\n const promise = this._toolTipPromise = delay.executeAfter(async () => {\n if (promise !== this._toolTipPromise)\n return; // we abandoned this request during delay\n try {\n const msg = await IModelApp.toolAdmin.getToolTip(hit);\n if (this._toolTipPromise === promise) // have we abandoned this request while awaiting getToolTip?\n this.showLocateMessage(viewPt, vp, msg);\n } catch (error) { } // happens if getToolTip was canceled\n });\n }\n\n private showLocateMessage(viewPt: XAndY, vp: ScreenViewport, msg: HTMLElement | string) {\n if (IModelApp.viewManager.doesHostHaveFocus)\n vp.openToolTip(msg, viewPt);\n }\n\n /** @internal */\n public displayToolTip(viewPt: XAndY, vp: ScreenViewport, uorPt?: Point3d): void {\n // if the tooltip is already displayed, or if user doesn't want it, quit.\n if (!this._settings.toolTip || !IModelApp.notifications.isToolTipSupported || IModelApp.notifications.isToolTipOpen)\n return;\n\n const accuSnapHit = this.currHit;\n const tpHit = IModelApp.tentativePoint.getCurrSnap();\n\n // if we don't have either an AccuSnap or a tentative point hit, quit.\n if (!accuSnapHit && !tpHit && !this.errorIcon.isActive)\n return;\n\n let theHit: HitDetail | undefined;\n\n // determine which type of hit\n if (tpHit) {\n if (uorPt) {\n // see if he came back somewhere near the currently snapped element\n const aperture = (this._settings.stickyFactor * vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\n if (!IModelApp.locateManager.picker.testHit(tpHit, vp, uorPt, aperture, IModelApp.locateManager.options))\n return;\n }\n theHit = tpHit;\n } else {\n theHit = accuSnapHit;\n }\n\n // if we're currently showing an error, get the error message...otherwise display hit info...\n if (!this.errorIcon.isActive && theHit) {\n this.showElemInfo(viewPt, vp, theHit, this._settings.toolTipDelay);\n return;\n }\n\n // If we have an error explanation...use it as is!\n if (this.explanation) {\n this.showLocateMessage(viewPt, vp, this.explanation);\n return;\n }\n\n // if we don't have an explanation yet, translate the error code.\n if (!this.errorKey)\n return;\n\n this.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${this.errorKey}`);\n if (!this.explanation)\n return;\n\n this.showLocateMessage(viewPt, vp, this.explanation);\n }\n\n /** @internal */\n public clearToolTip(ev?: BeButtonEvent): void {\n // Throw away any stale request for a tooltip message\n this._toolTipPromise = undefined;\n if (!IModelApp.notifications.isToolTipOpen)\n return;\n\n if (ev && (5 > ev.viewPoint.distanceXY(IModelApp.notifications.toolTipLocation)))\n return;\n\n IModelApp.notifications.clearToolTip();\n }\n\n /** Display the sprites for the current snap to indicate its position on the screen and what snap mode it represents. */\n private showSnapSprite(): void {\n const snap = this.getCurrSnapDetail();\n if (!snap)\n return;\n\n const crossPt = snap.snapPoint;\n const viewport = snap.viewport;\n const crossSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}${snap.isHot ? \"sprites/SnapCross.png\" : \"sprites/SnapUnfocused.png\"}`);\n\n this.cross.activate(crossSprite, viewport, crossPt);\n\n const snapSprite = snap.sprite;\n if (snapSprite)\n this.icon.activate(snapSprite, viewport, AccuSnap.adjustIconLocation(viewport, crossPt, snapSprite.size));\n }\n\n private static adjustIconLocation(vp: Viewport, input: Point3d, iconSize: XAndY): Point3d {\n const out = vp.worldToView(input);\n out.x += (iconSize.x / 3.0);\n out.y -= (iconSize.y * 1.3);\n return vp.viewToWorld(out, out);\n }\n\n /** try to indicate what's wrong with the current point (why we're not snapping). */\n private showSnapError(out: LocateResponse, ev: BeButtonEvent) {\n this.explanation = out.explanation;\n this.errorKey = out.reason;\n this.errorIcon.deactivate();\n\n const vp = ev.viewport!;\n let errorSprite: Sprite | undefined;\n switch (out.snapStatus) {\n case SnapStatus.FilteredByApp:\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapAppFiltered.png`);\n break;\n\n case SnapStatus.FilteredByAppQuietly:\n this.errorKey = undefined;\n break;\n\n case SnapStatus.NotSnappable:\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapNotSnappable.png`);\n this.errorKey = ElementLocateManager.getFailureMessageKey(\"NotSnappable\");\n break;\n }\n\n if (!errorSprite)\n return;\n\n const spriteSize = errorSprite.size;\n const pt = AccuSnap.adjustIconLocation(vp, ev.rawPoint, spriteSize);\n\n this.errorIcon.activate(errorSprite, vp, pt);\n }\n\n private clearSprites() {\n this.errorIcon.deactivate();\n this.cross.deactivate();\n this.icon.deactivate();\n }\n\n /** determine whether a hit should be hilited or not. */\n private hitShouldBeHilited(hit: HitDetail | undefined): boolean {\n if (!hit)\n return false;\n\n if (hit.isModelHit || hit.isMapHit)\n return false; // Avoid annoying flashing of reality models.\n\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\n return false;\n\n const snap = AccuSnap.toSnapDetail(hit);\n return !snap || snap.isHot || this._settings.hiliteColdHits;\n }\n\n private unFlashViews() {\n this.needFlash.clear();\n for (const vp of this.areFlashed)\n vp.flashedId = undefined;\n\n this.areFlashed.clear();\n }\n\n /** @internal */\n public adjustPointIfHot(pt: Point3d, view: Viewport): void {\n const currSnap = this.getCurrSnapDetail();\n\n if (!currSnap || !currSnap.isHot || view !== currSnap.viewport)\n return;\n\n pt.setFrom(currSnap.adjustedPoint);\n }\n\n /** Implemented by sub-classes to update ui to show current enabled state.\n * @internal\n */\n public onEnabledStateChange(_isEnabled: boolean, _wasEnabled: boolean) { }\n\n /** @internal */\n public getHitAndList(holder: HitListHolder): HitDetail | undefined {\n const hit = this.currHit;\n if (hit) {\n holder.setHitList(this.aSnapHits);\n this.aSnapHits = undefined;\n }\n return hit;\n }\n\n private initCmdState() {\n this.toolState.suspended = 0;\n this.toolState.neverFlash = undefined;\n }\n\n /** @internal */\n public suspend(doSuspend: boolean) {\n const previousDoSnapping = this._doSnapping;\n if (doSuspend)\n this.toolState.suspended++;\n else if (this.toolState.suspended > 0)\n this.toolState.suspended--;\n\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\n }\n\n /** @internal */\n public suppress(doSuppress: boolean): number {\n const previousDoSnapping = this._doSnapping;\n if (doSuppress)\n this._suppressed++;\n else if (this._suppressed > 0)\n this._suppressed--;\n\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\n return this._suppressed;\n }\n\n /** Turn AccuSnap on or off */\n public enableSnap(yesNo: boolean) {\n const previousDoSnapping = this._doSnapping;\n this.toolState.enabled = yesNo;\n if (!yesNo) {\n this.clear();\n if (undefined !== this.touchCursor && !this.wantVirtualCursor) {\n this.touchCursor = undefined;\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n }\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\n }\n\n /** @internal */\n public intersectXY(tpSnap: SnapDetail, second: SnapDetail): IntersectDetail | undefined {\n // Get single segment curve from each snap to intersect...\n const tpSegment = tpSnap.getCurvePrimitive();\n if (undefined === tpSegment)\n return undefined;\n const segment = second.getCurvePrimitive();\n if (undefined === segment)\n return undefined;\n\n const worldToView = second.viewport.worldToViewMap.transform0;\n const detail = CurveCurve.intersectionProjectedXYPairs(worldToView, tpSegment, true, segment, true);\n if (0 === detail.length)\n return undefined;\n\n let closeIndex = 0;\n if (detail.length > 1) {\n const snapPt = worldToView.multiplyPoint3d(HitGeomType.Point === tpSnap.geomType && HitGeomType.Point !== second.geomType ? second.getPoint() : tpSnap.getPoint(), 1); // Don't check distance from arc centers...\n let lastDist: number | undefined;\n\n for (let i = 0; i < detail.length; i++) {\n const testPt = worldToView.multiplyPoint3d(detail[i].detailA.point, 1);\n const testDist = snapPt.realDistanceXY(testPt);\n\n if (undefined !== testDist && (undefined === lastDist || testDist < lastDist)) {\n lastDist = testDist;\n closeIndex = i;\n }\n }\n }\n\n const intersect = new IntersectDetail(tpSnap, SnapHeat.InRange, detail[closeIndex].detailA.point, segment, second.sourceId); // Should be ok to share hit detail with tentative...\n intersect.primitive = tpSegment; // Just save single segment that was intersected for line strings/shapes...\n\n return intersect;\n }\n\n /** @internal */\n public static async requestSnap(thisHit: HitDetail, snapModes: SnapMode[], hotDistanceInches: number, keypointDivisor: number, hitList?: HitList<HitDetail>, out?: LocateResponse): Promise<SnapDetail | undefined> {\n if (thisHit.isModelHit || thisHit.isMapHit || thisHit.isClassifier) {\n if (snapModes.includes(SnapMode.Nearest)) {\n if (out)\n out.snapStatus = SnapStatus.Success;\n\n return new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.InRange);\n } else if (1 === snapModes.length && snapModes.includes(SnapMode.Intersection)) {\n if (out)\n out.snapStatus = SnapStatus.NoSnapPossible;\n\n return undefined;\n } else {\n if (out)\n out.snapStatus = SnapStatus.Success;\n\n const realitySnap = new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.None);\n realitySnap.sprite = undefined; // Don't show a snap mode that isn't applicable, but still accept hit point...\n return realitySnap;\n }\n }\n\n if (undefined !== thisHit.subCategoryId && !thisHit.isExternalIModelHit) {\n const appearance = thisHit.viewport.getSubCategoryAppearance(thisHit.subCategoryId);\n if (appearance.dontSnap) {\n if (out) {\n out.snapStatus = SnapStatus.NotSnappable;\n out.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${ElementLocateManager.getFailureMessageKey(\"NotSnappableSubCategory\")}`);\n }\n return undefined;\n }\n }\n\n const requestProps: SnapRequestProps = {\n id: thisHit.sourceId,\n testPoint: thisHit.testPoint,\n closePoint: thisHit.hitPoint,\n worldToView: thisHit.viewport.worldToViewMap.transform0.toJSON(),\n viewFlags: thisHit.viewport.viewFlags,\n snapModes,\n snapAperture: thisHit.viewport.pixelsFromInches(hotDistanceInches),\n snapDivisor: keypointDivisor,\n subCategoryId: thisHit.subCategoryId,\n geometryClass: thisHit.geometryClass,\n };\n\n const thisGeom = (thisHit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(thisHit) : IModelApp.viewManager.getDecorationGeometry(thisHit));\n\n if (undefined !== thisGeom) {\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: thisGeom }];\n } else if (!thisHit.isElementHit) {\n if (out)\n out.snapStatus = SnapStatus.NoSnapPossible;\n return undefined;\n }\n\n if (snapModes.includes(SnapMode.Intersection)) {\n if (undefined !== hitList) {\n for (const hit of hitList.hits) {\n if (thisHit.sourceId === hit.sourceId || thisHit.iModel !== hit.iModel)\n continue;\n\n const geom = (hit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(hit) : IModelApp.viewManager.getDecorationGeometry(hit));\n\n if (undefined !== geom) {\n if (undefined === requestProps.decorationGeometry)\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: geom }];\n else\n requestProps.decorationGeometry.push({ id: thisHit.sourceId, geometryStream: geom });\n } else if (!hit.isElementHit) {\n continue;\n }\n\n if (undefined === requestProps.intersectCandidates)\n requestProps.intersectCandidates = [hit.sourceId];\n else\n requestProps.intersectCandidates.push(hit.sourceId);\n\n if (5 === requestProps.intersectCandidates.length)\n break; // Search for intersection with a few of the next best hits...\n }\n }\n\n if (1 === snapModes.length && undefined === requestProps.intersectCandidates) {\n if (out)\n out.snapStatus = SnapStatus.NoSnapPossible;\n\n return undefined; // Don't make back end request when only doing intersection snap when we don't have another hit to intersect with...\n }\n }\n\n try {\n const result = await thisHit.iModel.requestSnap(requestProps);\n\n if (out)\n out.snapStatus = result.status;\n\n if (result.status !== SnapStatus.Success)\n return undefined;\n\n const parseCurve = (json: any): CurvePrimitive | undefined => {\n const parsed = undefined !== json ? GeomJson.Reader.parse(json) : undefined;\n return parsed instanceof GeometryQuery && \"curvePrimitive\" === parsed.geometryCategory ? parsed : undefined;\n };\n\n const snapPoint = Point3d.fromJSON(result.snapPoint);\n const displayTransform = undefined !== thisHit.modelId ? thisHit.viewport.view.computeDisplayTransform({ modelId: thisHit.modelId, elementId: thisHit.sourceId }) : undefined;\n displayTransform?.multiplyPoint3d(snapPoint, snapPoint);\n\n const snap = new SnapDetail(thisHit, result.snapMode, result.heat, snapPoint);\n\n snap.setCurvePrimitive(parseCurve(result.curve), displayTransform, result.geomType);\n if (undefined !== result.parentGeomType)\n snap.parentGeomType = result.parentGeomType;\n\n // Update hitPoint from readPixels with exact point location corrected to surface/edge geometry.\n if (undefined !== result.hitPoint) {\n snap.hitPoint.setFromJSON(result.hitPoint);\n displayTransform?.multiplyPoint3d(snap.hitPoint, snap.hitPoint);\n }\n\n // Apply display transform to normal.\n if (undefined !== result.normal) {\n snap.normal = Vector3d.fromJSON(result.normal);\n displayTransform?.matrix.multiplyVector(snap.normal, snap.normal);\n snap.normal.normalizeInPlace();\n }\n\n if (SnapMode.Intersection !== snap.snapMode)\n return snap;\n\n if (undefined === result.intersectId)\n return undefined;\n\n const otherPrimitive = parseCurve(result.intersectCurve);\n if (undefined === otherPrimitive)\n return undefined;\n\n const intersect = new IntersectDetail(snap, snap.heat, snap.snapPoint, otherPrimitive, result.intersectId);\n return intersect;\n } catch (_err) {\n if (out)\n out.snapStatus = SnapStatus.Aborted;\n\n return undefined;\n }\n }\n\n private async getAccuSnapDetail(hitList: HitList<HitDetail>, out: LocateResponse): Promise<SnapDetail | undefined> {\n const thisHit = hitList.getNextHit();\n if (undefined === thisHit)\n return undefined;\n\n const filterStatus: LocateFilterStatus = (this.isLocateEnabled ? await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, out) : LocateFilterStatus.Accept);\n if (LocateFilterStatus.Accept !== filterStatus) {\n out.snapStatus = SnapStatus.FilteredByApp;\n return undefined;\n }\n\n let snapModes: SnapMode[];\n if (IModelApp.tentativePoint.isActive) {\n snapModes = [];\n snapModes.push(SnapMode.Nearest); // Special case: isActive only allows snapping with tentative to find extended intersections...\n } else {\n snapModes = this.getActiveSnapModes(); // Get the list of point snap modes to consider\n }\n\n const thisSnap = await AccuSnap.requestSnap(thisHit, snapModes, this._hotDistanceInches, this.keypointDivisor, hitList, out);\n if (undefined === thisSnap)\n return undefined;\n\n if (IModelApp.tentativePoint.isActive) {\n const tpSnap = IModelApp.tentativePoint.getCurrSnap();\n if (undefined === tpSnap)\n return undefined;\n const intersectSnap = this.intersectXY(tpSnap, thisSnap);\n if (undefined === intersectSnap)\n return undefined;\n hitList.setCurrentHit(thisHit);\n return intersectSnap;\n }\n\n IModelApp.accuDraw.onSnap(thisSnap); // AccuDraw can adjust nearest snap to intersection of circle (polar distance lock) or line (axis lock) with snapped to curve...\n hitList.setCurrentHit(thisHit);\n return thisSnap;\n }\n\n private findHits(ev: BeButtonEvent, force: boolean = false): SnapStatus {\n // When using AccuSnap to locate elements, we have to start with the datapoint adjusted\n // for locks and not the raw point. Otherwise, when grid/unit lock are on, we locate elements by\n // points not on the grid. This causes them to be \"pulled\" off the grid when they are accepted. On\n // the other hand, when NOT locating, we need to use the raw point so we can snap to elements\n // away from the grid.\n\n const testPoint = this.isLocateEnabled ? ev.point : ev.rawPoint;\n const vp = ev.viewport!;\n const picker = IModelApp.locateManager.picker;\n const options = IModelApp.locateManager.options.clone(); // Copy to avoid changing out from under active Tool...\n\n // NOTE: Since TestHit will use the same HitSource as the input hit we only need to sets this for DoPick...\n options.hitSource = this.isSnapEnabled ? HitSource.AccuSnap : HitSource.MotionLocate;\n\n let aperture = (vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\n this.initializeForCheckMotion();\n aperture *= this._searchDistance;\n\n if (0 === picker.doPick(vp, testPoint, aperture, options)) {\n this.aSnapHits = undefined; // Clear any previous hit list so reset won't cycle through hits cursor is no longer over, etc.\n return SnapStatus.NoElements;\n }\n\n this.aSnapHits = picker.getHitList(true); // take ownership of the pickElem hit list.\n\n // see if we should keep the current hit\n const canBeSticky = !force && this.aSnapHits.length > 1 && this.currHit && (HitDetailType.Intersection !== this.currHit.getHitType() && this.currHit.priority < HitPriority.PlanarSurface);\n if (canBeSticky) {\n for (let iHit = 1; iHit < this.aSnapHits.length; ++iHit) {\n const thisHit = this.aSnapHits.hits[iHit];\n if (!thisHit.isSameHit(this.currHit))\n continue;\n this.aSnapHits.removeHit(iHit);\n this.aSnapHits.insertHit(0, thisHit);\n break;\n }\n }\n\n return SnapStatus.Success;\n }\n\n private async findLocatableHit(ev: BeButtonEvent, newSearch: boolean, out: LocateResponse): Promise<HitDetail | undefined> {\n out.snapStatus = SnapStatus.NoElements;\n\n if (newSearch) {\n this.aSnapHits = undefined;\n // search for new hits, but if the cursor is still close to the current hit, don't throw away list.\n if (SnapStatus.Success !== (out.snapStatus = this.findHits(ev)))\n return undefined;\n } else {\n if (!this.aSnapHits) {\n out.snapStatus = SnapStatus.NoElements;\n return undefined;\n }\n }\n\n const thisList = this.aSnapHits!;\n let thisHit: HitDetail | undefined;\n let firstRejected;\n const filterResponse = new LocateResponse();\n\n // keep looking through hits until we find one that is accu-snappable.\n while (undefined !== (thisHit = thisList.getNextHit())) {\n if (LocateFilterStatus.Accept === await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, filterResponse))\n return thisHit;\n // we only care about the status of the first hit.\n if (undefined !== firstRejected)\n continue;\n firstRejected = filterResponse.clone();\n firstRejected.snapStatus = SnapStatus.FilteredByApp;\n }\n\n if (undefined !== firstRejected)\n out.setFrom(firstRejected);\n\n // Reset current hit index to go back to first hit on next AccuSnap reset event...\n thisList.resetCurrentHit();\n return undefined;\n }\n\n /** When in auto-locate mode, advance to the next hit without searching again.\n * @internal\n */\n public async resetButton(): Promise<SnapStatus> {\n let hit: HitDetail | undefined;\n const out = new LocateResponse();\n out.snapStatus = SnapStatus.Disabled;\n\n this.clearToolTip(undefined);\n\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n\n if (this._doSnapping) {\n // if we don't have any more candidate hits, get a new list at the current location\n if (!this.aSnapHits || (0 === this.aSnapHits.length)) {\n out.snapStatus = this.findHits(ev);\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\n } else {\n // drop the current hit from the list and then retest the list (without the dropped hit) to find the new snap\n this.aSnapHits.removeCurrentHit();\n hit = await this.getAccuSnapDetail(this.aSnapHits, out);\n }\n } else if (this.isLocateEnabled) {\n hit = await this.findLocatableHit(ev, false, out); // get next AccuSnap path (or undefined)\n }\n\n // set the current hit\n if (hit || this.currHit)\n this.setCurrHit(hit);\n\n // indicate errors\n this.showSnapError(out, ev);\n return out.snapStatus;\n }\n\n /** Find the best snap point according to the current cursor location\n * @internal\n */\n public async onMotion(ev: BeButtonEvent): Promise<void> {\n this.clearToolTip(ev);\n const out = new LocateResponse();\n out.snapStatus = SnapStatus.Disabled;\n\n let hit: HitDetail | undefined;\n if (this.isActive) {\n if (this._doSnapping) {\n out.snapStatus = this.findHits(ev);\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\n } else if (this.isLocateEnabled) {\n hit = await this.findLocatableHit(ev, true, out);\n }\n }\n\n // set the current hit and display the sprite (based on snap's KeypointType)\n if (hit || this.currHit)\n this.setCurrHit(hit);\n\n // set up active error before calling displayToolTip to indicate error or show locate message...\n this.showSnapError(out, ev);\n this.displayToolTip(ev.viewPoint, ev.viewport!, ev.rawPoint);\n\n if (undefined !== this.touchCursor && InputSource.Mouse === ev.inputSource) {\n this.touchCursor = undefined;\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n }\n\n /** @internal */\n public onPreButtonEvent(ev: BeButtonEvent): boolean { return (undefined !== this.touchCursor) ? this.touchCursor.isButtonHandled(ev) : false; }\n /** @internal */\n public onTouchStart(ev: BeTouchEvent): void {\n if (undefined !== this.touchCursor)\n this.touchCursor.doTouchStart(ev);\n }\n\n /** @internal */\n public onTouchEnd(ev: BeTouchEvent): void {\n if (undefined !== this.touchCursor && 0 === ev.touchCount)\n this.touchCursor.doTouchEnd(ev);\n }\n\n /** @internal */\n public onTouchCancel(ev: BeTouchEvent): void {\n if (undefined !== this.touchCursor)\n this.touchCursor.doTouchEnd(ev);\n }\n\n /** @internal */\n public onTouchMove(ev: BeTouchEvent): boolean {\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMove(ev) : false;\n }\n\n /** @internal */\n public onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMoveStart(ev, startEv) : false;\n }\n\n /** @internal */\n public get wantVirtualCursor(): boolean {\n return this._doSnapping || (this.isLocateEnabled && ToolSettings.enableVirtualCursorForLocate);\n }\n\n /** @internal */\n public async onTouchTap(ev: BeTouchEvent): Promise<boolean> {\n if (undefined !== this.touchCursor)\n return this.touchCursor.doTouchTap(ev);\n if (!this.wantVirtualCursor)\n return false;\n this.touchCursor = TouchCursor.createFromTouchTap(ev);\n if (undefined === this.touchCursor)\n return false;\n // Give active tool an opportunity to update it's tool assistance since event won't be passed along...\n const tool = IModelApp.toolAdmin.activeTool;\n if (undefined === tool)\n return true;\n await tool.onSuspend();\n await tool.onUnsuspend();\n return true;\n }\n\n private flashElements(context: DecorateContext): void {\n const viewport = context.viewport;\n if (this.currHit) {\n if (this.needsFlash(viewport))\n this.flashHitInView(this.currHit, context);\n return;\n }\n\n const hit = IModelApp.tentativePoint.getCurrSnap();\n if (!hit || hit.isModelHit || hit.isMapHit)\n return; // Don't hilite reality models.\n\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\n return;\n\n hit.draw(context);\n }\n\n /** @internal */\n public decorate(context: DecorateContext): void {\n if (undefined !== this.touchCursor && this.touchCursor.viewport === context.viewport)\n context.addCanvasDecoration(this.touchCursor, true);\n\n this.flashElements(context);\n\n if (this.cross.isActive) {\n this.cross.decorate(context);\n this.icon.decorate(context);\n }\n\n this.errorIcon.decorate(context);\n }\n\n private clearElemFromHitList(element: string) {\n if (this.aSnapHits)\n this.aSnapHits.removeHitsFrom(element);\n }\n\n /** @internal */\n public clearIfElement(sourceId: string): void {\n this.clearElemFromHitList(sourceId);\n\n const hit = this.currHit;\n if (hit && hit.sourceId === sourceId) {\n this.destroy();\n }\n }\n\n /** Enable locating elements.\n * @public\n */\n public enableLocate(yesNo: boolean) {\n this.toolState.locate = yesNo;\n if (!yesNo && undefined !== this.touchCursor && !this.wantVirtualCursor) {\n this.touchCursor = undefined;\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n }\n\n /** Called whenever a new [[Tool]] is started.\n * @internal\n */\n public onStartTool(): void {\n this.initCmdState();\n this.enableSnap(false);\n this.enableLocate(false);\n IModelApp.tentativePoint.clear(true);\n }\n\n /**\n * Force AccuSnap to reevaluate the snap at the current cursor location.\n * This is useful of an application changes the snap mode and wants AccuSnap to choose it immediately, without\n * requiring the user to move the mouse.\n * @internal\n */\n public async reEvaluate() {\n if (this.getCurrSnapDetail()) {\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n return this.onMotion(ev);\n }\n }\n}\n\n/** @internal */\nexport class TentativeOrAccuSnap {\n public static get isHot(): boolean { return IModelApp.accuSnap.isHot || IModelApp.tentativePoint.isSnapped; }\n\n public static getCurrentSnap(checkIsHot: boolean = true): SnapDetail | undefined {\n // Checking for a hot AccuSnap hit before checking tentative is probably necessary for extended intersections?\n if (IModelApp.accuSnap.isHot)\n return IModelApp.accuSnap.getCurrSnapDetail();\n\n if (IModelApp.tentativePoint.isSnapped)\n return IModelApp.tentativePoint.currSnap;\n\n return (checkIsHot ? undefined : IModelApp.accuSnap.getCurrSnapDetail());\n }\n\n public static getCurrentPoint(): Point3d {\n if (IModelApp.accuSnap.isHot) {\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\n if (snap)\n return snap.adjustedPoint;\n }\n\n return IModelApp.tentativePoint.getPoint();\n }\n\n public static getCurrentView(): ScreenViewport | undefined {\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\n return snap ? snap.viewport : IModelApp.tentativePoint.viewport;\n }\n}\n\n/** @public */\nexport namespace AccuSnap { // eslint-disable-line no-redeclare\n export class ToolState {\n public enabled = false;\n public locate = false;\n public suspended = 0;\n public neverFlash?: Id64Set;\n public setFrom(other: ToolState): void {\n this.enabled = other.enabled;\n this.locate = other.locate;\n this.suspended = other.suspended;\n this.neverFlash = other.neverFlash;\n }\n public clone(): ToolState {\n const val = new ToolState();\n val.setFrom(this);\n return val;\n }\n }\n\n export class Settings {\n public hotDistanceFactor = 1.2;\n public stickyFactor = 1.0;\n public searchDistance = 2.0;\n public hiliteColdHits = true;\n public enableFlag = true;\n public toolTip = true;\n public toolTipDelay = BeDuration.fromSeconds(.5); // delay before tooltip pops up\n }\n}\n"]}
|
|
@@ -87,10 +87,9 @@ class ModelChangeMonitor {
|
|
|
87
87
|
return this._editingScope;
|
|
88
88
|
}
|
|
89
89
|
processBuffered() {
|
|
90
|
-
var _a;
|
|
91
90
|
const models = this._briefcase.models;
|
|
92
91
|
for (const [id, guid] of this._modelIdToGuid) {
|
|
93
|
-
const model =
|
|
92
|
+
const model = models.getLoaded(id)?.asGeometricModel;
|
|
94
93
|
if (model)
|
|
95
94
|
model.geometryGuid = guid;
|
|
96
95
|
}
|
|
@@ -244,27 +243,26 @@ class BriefcaseConnection extends IModelConnection_1.IModelConnection {
|
|
|
244
243
|
async pullChanges(toIndex, options) {
|
|
245
244
|
const removeListeners = [];
|
|
246
245
|
// eslint-disable-next-line deprecation/deprecation
|
|
247
|
-
const shouldReportProgress = !!
|
|
246
|
+
const shouldReportProgress = !!options?.progressCallback || !!options?.downloadProgressCallback;
|
|
248
247
|
if (shouldReportProgress) {
|
|
249
248
|
const handleProgress = (_evt, data) => {
|
|
250
|
-
var _a, _b;
|
|
251
249
|
// eslint-disable-next-line deprecation/deprecation
|
|
252
|
-
|
|
253
|
-
|
|
250
|
+
options?.progressCallback?.(data);
|
|
251
|
+
options?.downloadProgressCallback?.(data);
|
|
254
252
|
};
|
|
255
253
|
const removeProgressListener = IpcApp_1.IpcApp.addListener((0, core_common_1.getPullChangesIpcChannel)(this.iModelId), handleProgress);
|
|
256
254
|
removeListeners.push(removeProgressListener);
|
|
257
255
|
}
|
|
258
|
-
if (options
|
|
256
|
+
if (options?.abortSignal) {
|
|
259
257
|
const abort = () => void IpcApp_1.IpcApp.appFunctionIpc.cancelPullChangesRequest(this.key);
|
|
260
|
-
options
|
|
261
|
-
removeListeners.push(() =>
|
|
258
|
+
options?.abortSignal.addEventListener("abort", abort);
|
|
259
|
+
removeListeners.push(() => options?.abortSignal?.removeEventListener("abort", abort));
|
|
262
260
|
}
|
|
263
261
|
this.requireTimeline();
|
|
264
262
|
const ipcAppOptions = {
|
|
265
263
|
reportProgress: shouldReportProgress,
|
|
266
|
-
progressInterval: options
|
|
267
|
-
enableCancellation: !!
|
|
264
|
+
progressInterval: options?.progressInterval,
|
|
265
|
+
enableCancellation: !!options?.abortSignal,
|
|
268
266
|
};
|
|
269
267
|
try {
|
|
270
268
|
this.changeset = await IpcApp_1.IpcApp.appFunctionIpc.pullChanges(this.key, toIndex, ipcAppOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BriefcaseConnection.js","sourceRoot":"","sources":["../../src/BriefcaseConnection.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelConnection\n */\n\nimport { assert, BeEvent, CompressedId64Set, Guid, GuidString, Id64String, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\nimport {\n ChangesetIndex, ChangesetIndexAndId, getPullChangesIpcChannel, IModelConnectionProps, IModelError,\n PullChangesOptions as IpcAppPullChangesOptions, OpenBriefcaseProps, StandaloneOpenOptions,\n} from \"@itwin/core-common\";\nimport { BriefcaseTxns } from \"./BriefcaseTxns\";\nimport { GraphicalEditingScope } from \"./GraphicalEditingScope\";\nimport { IModelApp } from \"./IModelApp\";\nimport { IModelConnection } from \"./IModelConnection\";\nimport { IpcApp } from \"./IpcApp\";\nimport { ProgressCallback } from \"./request/Request\";\nimport { disposeTileTreesForGeometricModels } from \"./tile/internal\";\nimport { Viewport } from \"./Viewport\";\n\n/**\n * Download progress information.\n * @public\n */\nexport interface DownloadProgressInfo {\n /** Bytes downloaded. */\n loaded: number;\n /** Total size of the download in bytes. */\n total: number;\n}\n\n/**\n * Called to show progress during a download.\n * @public\n */\nexport type OnDownloadProgress = (progress: DownloadProgressInfo) => void;\n\n/**\n * Partial interface of AbortSignal.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal\n * @beta\n */\nexport interface GenericAbortSignal {\n /** Add Listener for abort signal. */\n addEventListener: (type: \"abort\", listener: (this: GenericAbortSignal, ev: any) => any) => void;\n /** Remove Listener for abort signal. */\n removeEventListener: (type: \"abort\", listener: (this: GenericAbortSignal, ev: any) => any) => void;\n}\n\n/**\n * Options for pulling iModel changes.\n * @public\n */\nexport interface PullChangesOptions {\n /**\n * Function called regularly to report progress of changes download.\n * @deprecated in 3.6. Use [[downloadProgressCallback]] instead.\n */\n progressCallback?: ProgressCallback;\n /** Function called regularly to report progress of changes download. */\n downloadProgressCallback?: OnDownloadProgress;\n /** Interval for calling progress callback (in milliseconds). */\n progressInterval?: number;\n /** Signal for cancelling the download.\n * @beta\n */\n abortSignal?: GenericAbortSignal;\n}\n\n/** Keeps track of changes to models, buffering them until synchronization points.\n * While a GraphicalEditingScope is open, the changes are buffered until the scope exits, at which point they are processed.\n * Otherwise, the buffered changes are processed after undo/redo, commit, or pull+merge changes.\n */\nclass ModelChangeMonitor {\n private _editingScope?: GraphicalEditingScope;\n private readonly _briefcase: BriefcaseConnection;\n private readonly _deletedModels = new Set<string>();\n private readonly _modelIdToGuid = new Map<string, string>();\n private readonly _removals: VoidFunction[] = [];\n\n public constructor(briefcase: BriefcaseConnection) {\n this._briefcase = briefcase;\n\n // Buffer updated geometry guids.\n this._removals.push(briefcase.txns.onModelGeometryChanged.addListener((changes) => {\n for (const change of changes) {\n this._deletedModels.delete(change.id);\n this._modelIdToGuid.set(change.id, change.guid);\n }\n }));\n\n // Buffer deletions of models.\n this._removals.push(briefcase.txns.onModelsChanged.addListener((changes) => {\n if (changes.deleted) {\n for (const id of CompressedId64Set.iterable(changes.deleted)) {\n this._modelIdToGuid.delete(id);\n this._deletedModels.add(id);\n }\n }\n }));\n\n // Outside of an editing scope, we want to update viewport contents after commit, undo/redo, or merging changes.\n const maybeProcess = async () => {\n if (this.editingScope)\n return;\n\n const modelIds = Array.from(this._modelIdToGuid.keys());\n if (modelIds.length > 0)\n await IModelApp.tileAdmin.purgeTileTrees(this._briefcase, modelIds);\n\n this.processBuffered();\n };\n\n this._removals.push(briefcase.txns.onCommitted.addListener(maybeProcess));\n this._removals.push(briefcase.txns.onAfterUndoRedo.addListener(maybeProcess));\n this._removals.push(briefcase.txns.onChangesPulled.addListener(maybeProcess));\n }\n\n public async close(): Promise<void> {\n for (const removal of this._removals)\n removal();\n\n this._removals.length = 0;\n\n if (this._editingScope) {\n await this._editingScope.exit();\n this._editingScope = undefined;\n }\n }\n\n public get editingScope(): GraphicalEditingScope | undefined {\n return this._editingScope;\n }\n\n public async enterEditingScope(): Promise<GraphicalEditingScope> {\n if (this._editingScope)\n throw new Error(\"Cannot create an editing scope for an iModel that already has one\");\n\n this._editingScope = await GraphicalEditingScope.enter(this._briefcase);\n\n const removeGeomListener = this._editingScope.onGeometryChanges.addListener((changes) => {\n const modelIds = [];\n for (const change of changes)\n modelIds.push(change.id);\n\n this.invalidateScenes(modelIds);\n });\n\n this._editingScope.onExited.addOnce((scope) => {\n assert(scope === this._editingScope);\n this._editingScope = undefined;\n removeGeomListener();\n this.processBuffered();\n });\n\n return this._editingScope;\n }\n\n private processBuffered(): void {\n const models = this._briefcase.models;\n for (const [id, guid] of this._modelIdToGuid) {\n const model = models.getLoaded(id)?.asGeometricModel;\n if (model)\n model.geometryGuid = guid;\n }\n\n const modelIds = new Set<string>(this._modelIdToGuid.keys());\n for (const deleted of this._deletedModels) {\n modelIds.add(deleted);\n models.unload(deleted);\n }\n\n this.invalidateScenes(modelIds);\n disposeTileTreesForGeometricModels(modelIds, this._briefcase);\n\n this._briefcase.onBufferedModelChanges.raiseEvent(modelIds);\n\n this._modelIdToGuid.clear();\n this._deletedModels.clear();\n }\n\n private invalidateScenes(changedModels: Iterable<Id64String>): void {\n for (const user of IModelApp.tileAdmin.tileUsers) {\n if (user instanceof Viewport && user.iModel === this._briefcase) {\n for (const modelId of changedModels) {\n if (user.view.viewsModel(modelId)) {\n user.invalidateScene();\n user.setFeatureOverrideProviderChanged();\n break;\n }\n }\n }\n }\n }\n}\n\n/** Settings that can be used to control the behavior of [[Tool]]s that modify a [[BriefcaseConnection]].\n * For example, tools that want to create new elements can consult the briefcase's editor tool settings to\n * determine into which model and category to insert the elements.\n * Specialized tools are free to ignore these settings.\n * @see [[BriefcaseConnection.editorToolSettings]] to query or modify the current settings for a briefcase.\n * @see [CreateElementTool]($editor-frontend) for an example of a tool that uses these settings.\n * @alpha\n */\nexport class BriefcaseEditorToolSettings {\n private _category?: Id64String;\n private _model?: Id64String;\n\n /** An event raised just after the default [[category]] is changed. */\n public readonly onCategoryChanged = new BeEvent<(previousCategory: Id64String | undefined) => void>();\n\n /** An event raised just after the default [[model]] is changed. */\n public readonly onModelChanged = new BeEvent<(previousModel: Id64String | undefined) => void>();\n\n /** The [Category]($backend) into which new elements should be inserted by default.\n * Specialized tools are free to ignore this setting and instead use their own logic to select an appropriate category.\n * @see [[onCategoryChanged]] to be notified when this property is modified.\n * @see [CreateElementTool.targetCategory]($editor-frontend) for an example of a tool that uses this setting.\n */\n public get category(): Id64String | undefined {\n return this._category;\n }\n public set category(category: Id64String | undefined) {\n const previousCategory = this.category;\n if (category !== this.category) {\n this._category = category;\n this.onCategoryChanged.raiseEvent(previousCategory);\n }\n }\n\n /** The [Model]($backend) into which new elements should be inserted by default.\n * Specialized tools are free to ignore this setting and instead use their own logic to select an appropriate model.\n * @see [[onModelChanged]] to be notified when this property is modified.\n * @see [CreateElementTool.targetModel]($editor-frontend) for an example of a tool that uses this setting.\n */\n public get model(): Id64String | undefined {\n return this._model;\n }\n public set model(model: Id64String | undefined) {\n const previousModel = this.model;\n if (model !== this.model) {\n this._model = model;\n this.onModelChanged.raiseEvent(previousModel);\n }\n }\n}\n\n/** A connection to an editable briefcase on the backend. This class uses [Ipc]($docs/learning/IpcInterface.md) to communicate\n * to the backend and may only be used by [[IpcApp]]s.\n * @public\n */\nexport class BriefcaseConnection extends IModelConnection {\n protected _isClosed?: boolean;\n private readonly _modelsMonitor: ModelChangeMonitor;\n /** Default settings that can be used to control the behavior of [[Tool]]s that modify this briefcase.\n * @alpha\n */\n public readonly editorToolSettings = new BriefcaseEditorToolSettings();\n\n /** Manages local changes to the briefcase via [Txns]($docs/learning/InteractiveEditing.md). */\n public readonly txns: BriefcaseTxns;\n\n /** @internal */\n public override isBriefcaseConnection(): this is BriefcaseConnection { return true; }\n\n /** The Guid that identifies the iTwin that owns this iModel. */\n public override get iTwinId(): GuidString { return super.iTwinId!; } // GuidString | undefined for IModelConnection, but required for BriefcaseConnection\n\n /** The Guid that identifies this iModel. */\n public override get iModelId(): GuidString { return super.iModelId!; } // GuidString | undefined for IModelConnection, but required for BriefcaseConnection\n\n protected constructor(props: IModelConnectionProps, openMode: OpenMode) {\n super(props);\n this._openMode = openMode;\n this.txns = new BriefcaseTxns(this);\n this._modelsMonitor = new ModelChangeMonitor(this);\n }\n\n /** Open a BriefcaseConnection to a [BriefcaseDb]($backend). */\n public static async openFile(briefcaseProps: OpenBriefcaseProps): Promise<BriefcaseConnection> {\n const iModelProps = await IpcApp.appFunctionIpc.openBriefcase(briefcaseProps);\n const connection = new this({ ...briefcaseProps, ...iModelProps }, briefcaseProps.readonly ? OpenMode.Readonly : OpenMode.ReadWrite);\n IModelConnection.onOpen.raiseEvent(connection);\n return connection;\n }\n\n /** Open a BriefcaseConnection to a [StandaloneDb]($backend)\n * @note StandaloneDbs, by definition, may not push or pull changes. Attempting to do so will throw exceptions.\n */\n public static async openStandalone(filePath: string, openMode: OpenMode = OpenMode.ReadWrite, opts?: StandaloneOpenOptions): Promise<BriefcaseConnection> {\n const openResponse = await IpcApp.appFunctionIpc.openStandalone(filePath, openMode, opts);\n const connection = new this(openResponse, openMode);\n IModelConnection.onOpen.raiseEvent(connection);\n return connection;\n }\n\n /** Returns `true` if [[close]] has already been called. */\n public get isClosed(): boolean { return this._isClosed === true; }\n\n /**\n * Close this BriefcaseConnection.\n * @note make sure to call [[saveChanges]] before calling this method. Unsaved local changes are abandoned.\n */\n public async close(): Promise<void> {\n if (this.isClosed)\n return;\n\n await this._modelsMonitor.close();\n\n this.beforeClose();\n this.txns.dispose();\n\n this._isClosed = true;\n await IpcApp.appFunctionIpc.closeIModel(this._fileKey);\n }\n\n private requireTimeline() {\n if (this.iTwinId === Guid.empty)\n throw new IModelError(IModelStatus.WrongIModel, \"iModel has no timeline\");\n }\n\n /** Query if there are any pending Txns in this briefcase that are waiting to be pushed. */\n public async hasPendingTxns(): Promise<boolean> { // eslint-disable-line @itwin/prefer-get\n return this.txns.hasPendingTxns();\n }\n\n /** Commit pending changes to this briefcase.\n * @param description Optional description of the changes.\n */\n public async saveChanges(description?: string): Promise<void> {\n await IpcApp.appFunctionIpc.saveChanges(this.key, description);\n }\n\n /** Pull (and potentially merge if there are local changes) up to a specified changeset from iModelHub into this briefcase\n * @param toIndex The changeset index to pull changes to. If `undefined`, pull all changes.\n * @param options Options for pulling changes.\n * @see [[BriefcaseTxns.onChangesPulled]] for the event dispatched after changes are pulled.\n */\n public async pullChanges(toIndex?: ChangesetIndex, options?: PullChangesOptions): Promise<void> {\n const removeListeners: VoidFunction[] = [];\n // eslint-disable-next-line deprecation/deprecation\n const shouldReportProgress = !!options?.progressCallback || !!options?.downloadProgressCallback;\n\n if (shouldReportProgress) {\n const handleProgress = (_evt: Event, data: { loaded: number, total: number }) => {\n // eslint-disable-next-line deprecation/deprecation\n options?.progressCallback?.(data);\n options?.downloadProgressCallback?.(data);\n };\n\n const removeProgressListener = IpcApp.addListener(\n getPullChangesIpcChannel(this.iModelId),\n handleProgress,\n );\n removeListeners.push(removeProgressListener);\n }\n\n if (options?.abortSignal) {\n const abort = () => void IpcApp.appFunctionIpc.cancelPullChangesRequest(this.key);\n options?.abortSignal.addEventListener(\"abort\", abort);\n removeListeners.push(() => options?.abortSignal?.removeEventListener(\"abort\", abort));\n }\n\n this.requireTimeline();\n const ipcAppOptions: IpcAppPullChangesOptions = {\n reportProgress: shouldReportProgress,\n progressInterval: options?.progressInterval,\n enableCancellation: !!options?.abortSignal,\n };\n try {\n this.changeset = await IpcApp.appFunctionIpc.pullChanges(this.key, toIndex, ipcAppOptions);\n } finally {\n removeListeners.forEach((remove) => remove());\n }\n }\n\n /** Create a changeset from local Txns and push to iModelHub. On success, clear Txn table.\n * @param description The description for the changeset\n * @returns the changesetId of the pushed changes\n * @see [[BriefcaseTxns.onChangesPushed]] for the event dispatched after changes are pushed.\n */\n public async pushChanges(description: string): Promise<ChangesetIndexAndId> {\n this.requireTimeline();\n return IpcApp.appFunctionIpc.pushChanges(this.key, description);\n }\n\n /** The current graphical editing scope, if one is in progress.\n * @see [[enterEditingScope]] to begin graphical editing.\n */\n public get editingScope(): GraphicalEditingScope | undefined {\n return this._modelsMonitor.editingScope;\n }\n\n /** Return whether graphical editing is supported for this briefcase. It is not supported if the briefcase is read-only, or the briefcase contains a version of\n * the BisCore ECSchema older than v0.1.11.\n * @see [[enterEditingScope]] to enable graphical editing.\n */\n public async supportsGraphicalEditing(): Promise<boolean> {\n return IpcApp.appFunctionIpc.isGraphicalEditingSupported(this.key);\n }\n\n /** Begin a new graphical editing scope.\n * @throws Error if an editing scope already exists or one could not be created.\n * @see [[GraphicalEditingScope.exit]] to exit the scope.\n * @see [[supportsGraphicalEditing]] to determine whether this method should be expected to succeed.\n * @see [[editingScope]] to obtain the current editing scope, if one is in progress.\n */\n public async enterEditingScope(): Promise<GraphicalEditingScope> {\n return this._modelsMonitor.enterEditingScope();\n }\n\n /** Strictly for tests - dispatched from ModelChangeMonitor.processBuffered.\n * @internal\n */\n public readonly onBufferedModelChanges = new BeEvent<(changedModelIds: Set<string>) => void>();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"BriefcaseConnection.js","sourceRoot":"","sources":["../../src/BriefcaseConnection.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelConnection\n */\n\nimport { assert, BeEvent, CompressedId64Set, Guid, GuidString, Id64String, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\nimport {\n ChangesetIndex, ChangesetIndexAndId, getPullChangesIpcChannel, IModelConnectionProps, IModelError,\n PullChangesOptions as IpcAppPullChangesOptions, OpenBriefcaseProps, StandaloneOpenOptions,\n} from \"@itwin/core-common\";\nimport { BriefcaseTxns } from \"./BriefcaseTxns\";\nimport { GraphicalEditingScope } from \"./GraphicalEditingScope\";\nimport { IModelApp } from \"./IModelApp\";\nimport { IModelConnection } from \"./IModelConnection\";\nimport { IpcApp } from \"./IpcApp\";\nimport { ProgressCallback } from \"./request/Request\";\nimport { disposeTileTreesForGeometricModels } from \"./tile/internal\";\nimport { Viewport } from \"./Viewport\";\n\n/**\n * Download progress information.\n * @public\n */\nexport interface DownloadProgressInfo {\n /** Bytes downloaded. */\n loaded: number;\n /** Total size of the download in bytes. */\n total: number;\n}\n\n/**\n * Called to show progress during a download.\n * @public\n */\nexport type OnDownloadProgress = (progress: DownloadProgressInfo) => void;\n\n/**\n * Partial interface of AbortSignal.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal\n * @beta\n */\nexport interface GenericAbortSignal {\n /** Add Listener for abort signal. */\n addEventListener: (type: \"abort\", listener: (this: GenericAbortSignal, ev: any) => any) => void;\n /** Remove Listener for abort signal. */\n removeEventListener: (type: \"abort\", listener: (this: GenericAbortSignal, ev: any) => any) => void;\n}\n\n/**\n * Options for pulling iModel changes.\n * @public\n */\nexport interface PullChangesOptions {\n /**\n * Function called regularly to report progress of changes download.\n * @deprecated in 3.6. Use [[downloadProgressCallback]] instead.\n */\n progressCallback?: ProgressCallback;\n /** Function called regularly to report progress of changes download. */\n downloadProgressCallback?: OnDownloadProgress;\n /** Interval for calling progress callback (in milliseconds). */\n progressInterval?: number;\n /** Signal for cancelling the download.\n * @beta\n */\n abortSignal?: GenericAbortSignal;\n}\n\n/** Keeps track of changes to models, buffering them until synchronization points.\n * While a GraphicalEditingScope is open, the changes are buffered until the scope exits, at which point they are processed.\n * Otherwise, the buffered changes are processed after undo/redo, commit, or pull+merge changes.\n */\nclass ModelChangeMonitor {\n private _editingScope?: GraphicalEditingScope;\n private readonly _briefcase: BriefcaseConnection;\n private readonly _deletedModels = new Set<string>();\n private readonly _modelIdToGuid = new Map<string, string>();\n private readonly _removals: VoidFunction[] = [];\n\n public constructor(briefcase: BriefcaseConnection) {\n this._briefcase = briefcase;\n\n // Buffer updated geometry guids.\n this._removals.push(briefcase.txns.onModelGeometryChanged.addListener((changes) => {\n for (const change of changes) {\n this._deletedModels.delete(change.id);\n this._modelIdToGuid.set(change.id, change.guid);\n }\n }));\n\n // Buffer deletions of models.\n this._removals.push(briefcase.txns.onModelsChanged.addListener((changes) => {\n if (changes.deleted) {\n for (const id of CompressedId64Set.iterable(changes.deleted)) {\n this._modelIdToGuid.delete(id);\n this._deletedModels.add(id);\n }\n }\n }));\n\n // Outside of an editing scope, we want to update viewport contents after commit, undo/redo, or merging changes.\n const maybeProcess = async () => {\n if (this.editingScope)\n return;\n\n const modelIds = Array.from(this._modelIdToGuid.keys());\n if (modelIds.length > 0)\n await IModelApp.tileAdmin.purgeTileTrees(this._briefcase, modelIds);\n\n this.processBuffered();\n };\n\n this._removals.push(briefcase.txns.onCommitted.addListener(maybeProcess));\n this._removals.push(briefcase.txns.onAfterUndoRedo.addListener(maybeProcess));\n this._removals.push(briefcase.txns.onChangesPulled.addListener(maybeProcess));\n }\n\n public async close(): Promise<void> {\n for (const removal of this._removals)\n removal();\n\n this._removals.length = 0;\n\n if (this._editingScope) {\n await this._editingScope.exit();\n this._editingScope = undefined;\n }\n }\n\n public get editingScope(): GraphicalEditingScope | undefined {\n return this._editingScope;\n }\n\n public async enterEditingScope(): Promise<GraphicalEditingScope> {\n if (this._editingScope)\n throw new Error(\"Cannot create an editing scope for an iModel that already has one\");\n\n this._editingScope = await GraphicalEditingScope.enter(this._briefcase);\n\n const removeGeomListener = this._editingScope.onGeometryChanges.addListener((changes) => {\n const modelIds = [];\n for (const change of changes)\n modelIds.push(change.id);\n\n this.invalidateScenes(modelIds);\n });\n\n this._editingScope.onExited.addOnce((scope) => {\n assert(scope === this._editingScope);\n this._editingScope = undefined;\n removeGeomListener();\n this.processBuffered();\n });\n\n return this._editingScope;\n }\n\n private processBuffered(): void {\n const models = this._briefcase.models;\n for (const [id, guid] of this._modelIdToGuid) {\n const model = models.getLoaded(id)?.asGeometricModel;\n if (model)\n model.geometryGuid = guid;\n }\n\n const modelIds = new Set<string>(this._modelIdToGuid.keys());\n for (const deleted of this._deletedModels) {\n modelIds.add(deleted);\n models.unload(deleted);\n }\n\n this.invalidateScenes(modelIds);\n disposeTileTreesForGeometricModels(modelIds, this._briefcase);\n\n this._briefcase.onBufferedModelChanges.raiseEvent(modelIds);\n\n this._modelIdToGuid.clear();\n this._deletedModels.clear();\n }\n\n private invalidateScenes(changedModels: Iterable<Id64String>): void {\n for (const user of IModelApp.tileAdmin.tileUsers) {\n if (user instanceof Viewport && user.iModel === this._briefcase) {\n for (const modelId of changedModels) {\n if (user.view.viewsModel(modelId)) {\n user.invalidateScene();\n user.setFeatureOverrideProviderChanged();\n break;\n }\n }\n }\n }\n }\n}\n\n/** Settings that can be used to control the behavior of [[Tool]]s that modify a [[BriefcaseConnection]].\n * For example, tools that want to create new elements can consult the briefcase's editor tool settings to\n * determine into which model and category to insert the elements.\n * Specialized tools are free to ignore these settings.\n * @see [[BriefcaseConnection.editorToolSettings]] to query or modify the current settings for a briefcase.\n * @see [CreateElementTool]($editor-frontend) for an example of a tool that uses these settings.\n * @alpha\n */\nexport class BriefcaseEditorToolSettings {\n private _category?: Id64String;\n private _model?: Id64String;\n\n /** An event raised just after the default [[category]] is changed. */\n public readonly onCategoryChanged = new BeEvent<(previousCategory: Id64String | undefined) => void>();\n\n /** An event raised just after the default [[model]] is changed. */\n public readonly onModelChanged = new BeEvent<(previousModel: Id64String | undefined) => void>();\n\n /** The [Category]($backend) into which new elements should be inserted by default.\n * Specialized tools are free to ignore this setting and instead use their own logic to select an appropriate category.\n * @see [[onCategoryChanged]] to be notified when this property is modified.\n * @see [CreateElementTool.targetCategory]($editor-frontend) for an example of a tool that uses this setting.\n */\n public get category(): Id64String | undefined {\n return this._category;\n }\n public set category(category: Id64String | undefined) {\n const previousCategory = this.category;\n if (category !== this.category) {\n this._category = category;\n this.onCategoryChanged.raiseEvent(previousCategory);\n }\n }\n\n /** The [Model]($backend) into which new elements should be inserted by default.\n * Specialized tools are free to ignore this setting and instead use their own logic to select an appropriate model.\n * @see [[onModelChanged]] to be notified when this property is modified.\n * @see [CreateElementTool.targetModel]($editor-frontend) for an example of a tool that uses this setting.\n */\n public get model(): Id64String | undefined {\n return this._model;\n }\n public set model(model: Id64String | undefined) {\n const previousModel = this.model;\n if (model !== this.model) {\n this._model = model;\n this.onModelChanged.raiseEvent(previousModel);\n }\n }\n}\n\n/** A connection to an editable briefcase on the backend. This class uses [Ipc]($docs/learning/IpcInterface.md) to communicate\n * to the backend and may only be used by [[IpcApp]]s.\n * @public\n */\nexport class BriefcaseConnection extends IModelConnection {\n protected _isClosed?: boolean;\n private readonly _modelsMonitor: ModelChangeMonitor;\n /** Default settings that can be used to control the behavior of [[Tool]]s that modify this briefcase.\n * @alpha\n */\n public readonly editorToolSettings = new BriefcaseEditorToolSettings();\n\n /** Manages local changes to the briefcase via [Txns]($docs/learning/InteractiveEditing.md). */\n public readonly txns: BriefcaseTxns;\n\n /** @internal */\n public override isBriefcaseConnection(): this is BriefcaseConnection { return true; }\n\n /** The Guid that identifies the iTwin that owns this iModel. */\n public override get iTwinId(): GuidString { return super.iTwinId!; } // GuidString | undefined for IModelConnection, but required for BriefcaseConnection\n\n /** The Guid that identifies this iModel. */\n public override get iModelId(): GuidString { return super.iModelId!; } // GuidString | undefined for IModelConnection, but required for BriefcaseConnection\n\n protected constructor(props: IModelConnectionProps, openMode: OpenMode) {\n super(props);\n this._openMode = openMode;\n this.txns = new BriefcaseTxns(this);\n this._modelsMonitor = new ModelChangeMonitor(this);\n }\n\n /** Open a BriefcaseConnection to a [BriefcaseDb]($backend). */\n public static async openFile(briefcaseProps: OpenBriefcaseProps): Promise<BriefcaseConnection> {\n const iModelProps = await IpcApp.appFunctionIpc.openBriefcase(briefcaseProps);\n const connection = new this({ ...briefcaseProps, ...iModelProps }, briefcaseProps.readonly ? OpenMode.Readonly : OpenMode.ReadWrite);\n IModelConnection.onOpen.raiseEvent(connection);\n return connection;\n }\n\n /** Open a BriefcaseConnection to a [StandaloneDb]($backend)\n * @note StandaloneDbs, by definition, may not push or pull changes. Attempting to do so will throw exceptions.\n */\n public static async openStandalone(filePath: string, openMode: OpenMode = OpenMode.ReadWrite, opts?: StandaloneOpenOptions): Promise<BriefcaseConnection> {\n const openResponse = await IpcApp.appFunctionIpc.openStandalone(filePath, openMode, opts);\n const connection = new this(openResponse, openMode);\n IModelConnection.onOpen.raiseEvent(connection);\n return connection;\n }\n\n /** Returns `true` if [[close]] has already been called. */\n public get isClosed(): boolean { return this._isClosed === true; }\n\n /**\n * Close this BriefcaseConnection.\n * @note make sure to call [[saveChanges]] before calling this method. Unsaved local changes are abandoned.\n */\n public async close(): Promise<void> {\n if (this.isClosed)\n return;\n\n await this._modelsMonitor.close();\n\n this.beforeClose();\n this.txns.dispose();\n\n this._isClosed = true;\n await IpcApp.appFunctionIpc.closeIModel(this._fileKey);\n }\n\n private requireTimeline() {\n if (this.iTwinId === Guid.empty)\n throw new IModelError(IModelStatus.WrongIModel, \"iModel has no timeline\");\n }\n\n /** Query if there are any pending Txns in this briefcase that are waiting to be pushed. */\n public async hasPendingTxns(): Promise<boolean> { // eslint-disable-line @itwin/prefer-get\n return this.txns.hasPendingTxns();\n }\n\n /** Commit pending changes to this briefcase.\n * @param description Optional description of the changes.\n */\n public async saveChanges(description?: string): Promise<void> {\n await IpcApp.appFunctionIpc.saveChanges(this.key, description);\n }\n\n /** Pull (and potentially merge if there are local changes) up to a specified changeset from iModelHub into this briefcase\n * @param toIndex The changeset index to pull changes to. If `undefined`, pull all changes.\n * @param options Options for pulling changes.\n * @see [[BriefcaseTxns.onChangesPulled]] for the event dispatched after changes are pulled.\n */\n public async pullChanges(toIndex?: ChangesetIndex, options?: PullChangesOptions): Promise<void> {\n const removeListeners: VoidFunction[] = [];\n // eslint-disable-next-line deprecation/deprecation\n const shouldReportProgress = !!options?.progressCallback || !!options?.downloadProgressCallback;\n\n if (shouldReportProgress) {\n const handleProgress = (_evt: Event, data: { loaded: number, total: number }) => {\n // eslint-disable-next-line deprecation/deprecation\n options?.progressCallback?.(data);\n options?.downloadProgressCallback?.(data);\n };\n\n const removeProgressListener = IpcApp.addListener(\n getPullChangesIpcChannel(this.iModelId),\n handleProgress,\n );\n removeListeners.push(removeProgressListener);\n }\n\n if (options?.abortSignal) {\n const abort = () => void IpcApp.appFunctionIpc.cancelPullChangesRequest(this.key);\n options?.abortSignal.addEventListener(\"abort\", abort);\n removeListeners.push(() => options?.abortSignal?.removeEventListener(\"abort\", abort));\n }\n\n this.requireTimeline();\n const ipcAppOptions: IpcAppPullChangesOptions = {\n reportProgress: shouldReportProgress,\n progressInterval: options?.progressInterval,\n enableCancellation: !!options?.abortSignal,\n };\n try {\n this.changeset = await IpcApp.appFunctionIpc.pullChanges(this.key, toIndex, ipcAppOptions);\n } finally {\n removeListeners.forEach((remove) => remove());\n }\n }\n\n /** Create a changeset from local Txns and push to iModelHub. On success, clear Txn table.\n * @param description The description for the changeset\n * @returns the changesetId of the pushed changes\n * @see [[BriefcaseTxns.onChangesPushed]] for the event dispatched after changes are pushed.\n */\n public async pushChanges(description: string): Promise<ChangesetIndexAndId> {\n this.requireTimeline();\n return IpcApp.appFunctionIpc.pushChanges(this.key, description);\n }\n\n /** The current graphical editing scope, if one is in progress.\n * @see [[enterEditingScope]] to begin graphical editing.\n */\n public get editingScope(): GraphicalEditingScope | undefined {\n return this._modelsMonitor.editingScope;\n }\n\n /** Return whether graphical editing is supported for this briefcase. It is not supported if the briefcase is read-only, or the briefcase contains a version of\n * the BisCore ECSchema older than v0.1.11.\n * @see [[enterEditingScope]] to enable graphical editing.\n */\n public async supportsGraphicalEditing(): Promise<boolean> {\n return IpcApp.appFunctionIpc.isGraphicalEditingSupported(this.key);\n }\n\n /** Begin a new graphical editing scope.\n * @throws Error if an editing scope already exists or one could not be created.\n * @see [[GraphicalEditingScope.exit]] to exit the scope.\n * @see [[supportsGraphicalEditing]] to determine whether this method should be expected to succeed.\n * @see [[editingScope]] to obtain the current editing scope, if one is in progress.\n */\n public async enterEditingScope(): Promise<GraphicalEditingScope> {\n return this._modelsMonitor.enterEditingScope();\n }\n\n /** Strictly for tests - dispatched from ModelChangeMonitor.processBuffered.\n * @internal\n */\n public readonly onBufferedModelChanges = new BeEvent<(changedModelIds: Set<string>) => void>();\n}\n"]}
|