@itwin/editor-frontend 5.0.0-dev.9 → 5.0.0-dev.90

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/lib/cjs/CreateElementTool.js +12 -2
  3. package/lib/cjs/CreateElementTool.js.map +1 -1
  4. package/lib/cjs/EditTool.js +4 -3
  5. package/lib/cjs/EditTool.js.map +1 -1
  6. package/lib/cjs/EditToolIpc.js.map +1 -1
  7. package/lib/cjs/ModifyElementTool.js +5 -8
  8. package/lib/cjs/ModifyElementTool.js.map +1 -1
  9. package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js +31 -21
  10. package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  11. package/lib/cjs/ProjectLocation/ProjectGeolocation.js +23 -15
  12. package/lib/cjs/ProjectLocation/ProjectGeolocation.js.map +1 -1
  13. package/lib/cjs/TransformElementsTool.d.ts.map +1 -1
  14. package/lib/cjs/TransformElementsTool.js +9 -3
  15. package/lib/cjs/TransformElementsTool.js.map +1 -1
  16. package/lib/cjs/UndoRedoTool.js +3 -3
  17. package/lib/cjs/UndoRedoTool.js.map +1 -1
  18. package/lib/cjs/editor-frontend.js.map +1 -1
  19. package/lib/esm/CreateElementTool.js +12 -2
  20. package/lib/esm/CreateElementTool.js.map +1 -1
  21. package/lib/esm/EditTool.js +4 -3
  22. package/lib/esm/EditTool.js.map +1 -1
  23. package/lib/esm/EditToolIpc.js.map +1 -1
  24. package/lib/esm/ModifyElementTool.js +5 -8
  25. package/lib/esm/ModifyElementTool.js.map +1 -1
  26. package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js +31 -21
  27. package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  28. package/lib/esm/ProjectLocation/ProjectGeolocation.js +23 -15
  29. package/lib/esm/ProjectLocation/ProjectGeolocation.js.map +1 -1
  30. package/lib/esm/TransformElementsTool.d.ts.map +1 -1
  31. package/lib/esm/TransformElementsTool.js +10 -4
  32. package/lib/esm/TransformElementsTool.js.map +1 -1
  33. package/lib/esm/UndoRedoTool.js +3 -3
  34. package/lib/esm/UndoRedoTool.js.map +1 -1
  35. package/lib/esm/editor-frontend.js.map +1 -1
  36. package/lib/public/locales/en/Editor.json +79 -79
  37. package/package.json +18 -18
package/CHANGELOG.md CHANGED
@@ -1,6 +1,56 @@
1
1
  # Change Log - @itwin/editor-frontend
2
2
 
3
- This log was last generated on Thu, 14 Nov 2024 18:13:56 GMT and should not be manually modified.
3
+ This log was last generated on Wed, 19 Mar 2025 15:33:24 GMT and should not be manually modified.
4
+
5
+ ## 4.10.11
6
+ Wed, 19 Mar 2025 15:30:39 GMT
7
+
8
+ _Version update only_
9
+
10
+ ## 4.10.10
11
+ Tue, 11 Mar 2025 15:25:11 GMT
12
+
13
+ _Version update only_
14
+
15
+ ## 4.10.9
16
+ Tue, 11 Mar 2025 05:17:33 GMT
17
+
18
+ _Version update only_
19
+
20
+ ## 4.10.8
21
+ Thu, 06 Mar 2025 14:13:37 GMT
22
+
23
+ _Version update only_
24
+
25
+ ## 4.10.7
26
+ Tue, 18 Feb 2025 17:27:03 GMT
27
+
28
+ _Version update only_
29
+
30
+ ## 4.10.6
31
+ Fri, 24 Jan 2025 08:02:40 GMT
32
+
33
+ _Version update only_
34
+
35
+ ## 4.10.5
36
+ Tue, 21 Jan 2025 21:56:45 GMT
37
+
38
+ _Version update only_
39
+
40
+ ## 4.10.4
41
+ Mon, 13 Jan 2025 14:06:43 GMT
42
+
43
+ _Version update only_
44
+
45
+ ## 4.10.3
46
+ Mon, 06 Jan 2025 14:00:13 GMT
47
+
48
+ _Version update only_
49
+
50
+ ## 4.10.2
51
+ Thu, 21 Nov 2024 15:22:20 GMT
52
+
53
+ _Version update only_
4
54
 
5
55
  ## 4.10.1
6
56
  Thu, 14 Nov 2024 18:11:00 GMT
@@ -55,9 +55,18 @@ function computeChordToleranceFromRange(vp, range) {
55
55
  * @beta
56
56
  */
57
57
  class DynamicGraphicsProvider {
58
+ iModel;
59
+ prefix;
60
+ graphic;
61
+ /** Current request for graphic */
62
+ _graphicPromise;
63
+ /** Optional element id generated graphics will be associated to */
64
+ elementId;
65
+ /** Optional model id generated graphics will be associated to */
66
+ modelId;
67
+ /** Chord tolerance to use to stroke the element's geometry in meters */
68
+ chordTolerance = 0.001;
58
69
  constructor(iModel, prefix) {
59
- /** Chord tolerance to use to stroke the element's geometry in meters */
60
- this.chordTolerance = 0.001;
61
70
  this.iModel = iModel;
62
71
  this.prefix = prefix;
63
72
  }
@@ -266,6 +275,7 @@ exports.CreateElementTool = CreateElementTool;
266
275
  * - [[onResetButtonUp]]: See [[cancelPoint]].
267
276
  */
268
277
  class CreateElementWithDynamicsTool extends CreateElementTool {
278
+ _graphicsProvider;
269
279
  get wantAccuSnap() { return true; }
270
280
  get wantDynamics() { return true; }
271
281
  clearGraphics() {
@@ -1 +1 @@
1
- {"version":3,"file":"CreateElementTool.js","sourceRoot":"","sources":["../../src/CreateElementTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { Id64, Id64String, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { Constant, Point3d, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\r\nimport { DynamicGraphicsRequest2dProps, DynamicGraphicsRequest3dProps, FlatBufferGeometryStream, GeometricElementProps, IModelError, isPlacement3dProps, JsonGeometryStream, PlacementProps } from \"@itwin/core-common\";\r\nimport { BeButtonEvent, CoordSystem, CoreTools, DynamicsContext, EventHandled, GraphicBranch, IModelApp, IModelConnection, PrimitiveTool, readElementGraphics, RenderGraphicOwner, ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection, Viewport } from \"@itwin/core-frontend\";\r\n\r\nfunction computeChordToleranceFromPointAndRadius(vp: Viewport, center: Point3d, radius: number): number {\r\n if (vp.view.is3d() && vp.view.isCameraOn) {\r\n const nearFrontCenter = vp.getFrustum(CoordSystem.World).frontCenter;\r\n const toFront = Vector3d.createStartEnd(center, nearFrontCenter);\r\n const viewZ = vp.rotation.rowZ();\r\n\r\n // If the sphere overlaps the near front plane just use near front point. This also handles behind eye conditions.\r\n if (viewZ.dotProduct(toFront) < radius) {\r\n center = nearFrontCenter;\r\n } else {\r\n // Find point on sphere closest to eye.\r\n const toEye = center.unitVectorTo(vp.view.camera.eye);\r\n\r\n // Only if not already behind the eye.\r\n if (toEye) {\r\n toEye.scaleInPlace(radius);\r\n center.addInPlace(toEye);\r\n }\r\n }\r\n }\r\n\r\n const viewPt = vp.worldToViewMap.transform0.multiplyPoint3dQuietNormalize(center);\r\n const viewPt2 = new Point3d(viewPt.x + 1.0, viewPt.y, viewPt.z);\r\n const pixelSize = vp.worldToViewMap.transform1.multiplyPoint3dQuietNormalize(viewPt).distance(vp.worldToViewMap.transform1.multiplyPoint3dQuietNormalize(viewPt2));\r\n\r\n // Return size of a physical pixel in meters.\r\n return (0.0 !== pixelSize ? vp.target.adjustPixelSizeForLOD(pixelSize) : 0.001);\r\n}\r\n\r\n/** Calculate a view based chord tolerance for facetting curved geometry given a world coordinate and optional radius.\r\n * @beta\r\n */\r\nexport function computeChordToleranceFromPoint(vp: Viewport, pt: Point3d, radius?: number): number {\r\n return computeChordToleranceFromPointAndRadius(vp, pt, radius ? radius : Constant.oneCentimeter);\r\n}\r\n\r\n/** Calculate a view based chord tolerance for facetting curved geometry given a world coordinate range box.\r\n * @beta\r\n */\r\nexport function computeChordToleranceFromRange(vp: Viewport, range: Range3d): number {\r\n return computeChordToleranceFromPointAndRadius(vp, range.center, 0.5 * range.low.distance(range.high));\r\n}\r\n\r\n/** A class for creating and managing a RenderGraphic for the purpose of interactive tool dynamics.\r\n * @beta\r\n */\r\nexport class DynamicGraphicsProvider {\r\n public readonly iModel: IModelConnection;\r\n public readonly prefix: string;\r\n public graphic?: RenderGraphicOwner;\r\n /** Current request for graphic */\r\n private _graphicPromise?: Promise<boolean>;\r\n /** Optional element id generated graphics will be associated to */\r\n public elementId?: Id64String;\r\n /** Optional model id generated graphics will be associated to */\r\n public modelId?: Id64String;\r\n /** Chord tolerance to use to stroke the element's geometry in meters */\r\n public chordTolerance = 0.001;\r\n\r\n constructor(iModel: IModelConnection, prefix: string) {\r\n this.iModel = iModel;\r\n this.prefix = prefix;\r\n }\r\n\r\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\r\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\r\n\r\n private async createRequest(categoryId: Id64String, placement: PlacementProps, geometry: JsonGeometryStream | FlatBufferGeometryStream): Promise<RenderGraphicOwner | undefined> {\r\n let graphicData;\r\n let is3d;\r\n\r\n if (is3d = isPlacement3dProps(placement)) {\r\n const requestProps: DynamicGraphicsRequest3dProps = {\r\n id: this.getRequestId(this.elementId ? this.elementId : Id64.invalid),\r\n elementId: this.elementId,\r\n modelId: this.modelId,\r\n toleranceLog10: this.getToleranceLog10(),\r\n type: \"3d\",\r\n placement,\r\n categoryId,\r\n geometry,\r\n };\r\n graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\r\n is3d = true;\r\n } else {\r\n const requestProps: DynamicGraphicsRequest2dProps = {\r\n id: this.getRequestId(this.elementId ? this.elementId : Id64.invalid),\r\n elementId: this.elementId,\r\n modelId: this.modelId,\r\n toleranceLog10: this.getToleranceLog10(),\r\n type: \"2d\",\r\n placement,\r\n categoryId,\r\n geometry,\r\n };\r\n graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\r\n }\r\n\r\n if (undefined === graphicData)\r\n return;\r\n\r\n const graphic = await readElementGraphics(graphicData, this.iModel, this.modelId ? this.modelId : Id64.invalid, is3d, { noFlash: true, noHilite: true });\r\n if (undefined === graphic)\r\n return;\r\n\r\n return IModelApp.renderSystem.createGraphicOwner(graphic);\r\n }\r\n\r\n /** Call to request a RenderGraphic for the supplied geometry and placement.\r\n * @see [[cleanupGraphic]] Must be called when the tool exits.\r\n */\r\n public async createGraphic(categoryId: Id64String, placement: PlacementProps, geometry: JsonGeometryStream | FlatBufferGeometryStream): Promise<boolean> {\r\n try {\r\n const graphic = await this.createRequest(categoryId, placement, geometry);\r\n this.cleanupGraphic();\r\n return (undefined !== (this.graphic = graphic));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Call to request a RenderGraphic for the supplied geometry and trigger a dynamic update upon fulfillment.\r\n * @note May be useful to update a dynamic preview outside of normal button and motion events, ex. modifier key change.\r\n * @see [[cleanupGraphic]] Must be called when the tool exits.\r\n */\r\n public createGraphicAndUpdateDynamics(ev: BeButtonEvent, categoryId: Id64String, placement: PlacementProps, geometry: JsonGeometryStream | FlatBufferGeometryStream): void {\r\n const promise = this._graphicPromise = this.createGraphic(categoryId, placement, geometry);\r\n\r\n promise.then(() => {\r\n if (promise !== this._graphicPromise)\r\n return; // abandoned this request...\r\n\r\n IModelApp.toolAdmin.updateDynamics(ev);\r\n }).catch((_) => { });\r\n }\r\n\r\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]].\r\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\r\n */\r\n public cleanupGraphic(): void {\r\n if (undefined === this.graphic)\r\n return;\r\n this.graphic.disposeGraphic();\r\n this.graphic = undefined;\r\n }\r\n\r\n public addGraphic(context: DynamicsContext, transform?: Transform): void {\r\n if (undefined === this.graphic)\r\n return;\r\n\r\n if (undefined === transform) {\r\n context.addGraphic(this.graphic);\r\n return;\r\n }\r\n\r\n const branch = new GraphicBranch(false);\r\n branch.add(this.graphic);\r\n\r\n const branchGraphic = context.createBranch(branch, transform);\r\n context.addGraphic(branchGraphic);\r\n }\r\n}\r\n\r\n/** Placement tool base class for creating new elements.\r\n * @beta\r\n */\r\nexport abstract class CreateElementTool extends PrimitiveTool {\r\n public get targetCategory(): Id64String {\r\n const category = this.briefcase?.editorToolSettings.category;\r\n if (undefined === category)\r\n throw new IModelError(IModelStatus.InvalidCategory, \"\");\r\n\r\n return category;\r\n }\r\n\r\n public override get targetModelId(): Id64String {\r\n const model = this.briefcase?.editorToolSettings.model;\r\n if (undefined === model)\r\n throw new IModelError(IModelStatus.BadModel, \"\");\r\n\r\n return model;\r\n }\r\n\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean {\r\n if (!vp?.iModel.isBriefcaseConnection())\r\n return false;\r\n\r\n return undefined !== vp.iModel.editorToolSettings.model && super.isCompatibleViewport(vp, isSelectedViewChange);\r\n }\r\n\r\n /** Whether [[setupAndPromptForNextAction]] should call [[AccuSnap.enableSnap]] for current tool phase.\r\n * @return true to enable snapping to elements.\r\n */\r\n protected get wantAccuSnap(): boolean { return false; }\r\n\r\n /** Whether to automatically start element dynamics on button event.\r\n * @return true if tool will implement [[InteractiveTool.onDynamicFrame]] to show element dynamics.\r\n */\r\n protected get wantDynamics(): boolean { return false; }\r\n\r\n /** Whether tool is ready to insert the new element.\r\n * @return true to call [[createElement]].\r\n */\r\n protected isComplete(_ev: BeButtonEvent): boolean { return false; }\r\n\r\n /** Insert new element and call [[saveChanges]] */\r\n protected abstract createElement(): Promise<void>;\r\n\r\n /** Orchestrates advancing the internal state of the tool on a data button event.\r\n * - Gather input: Initiates element dynamics and accepts additional points as required.\r\n * - Complete operation: Create new element, restart or exit tool.\r\n * @returns EventHandled.Yes if onReinitialize was called to restart or exit tool.\r\n */\r\n protected async processDataButton(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (this.isComplete(ev)) {\r\n await this.createElement();\r\n await this.onReinitialize();\r\n\r\n return EventHandled.Yes;\r\n }\r\n\r\n this.setupAndPromptForNextAction();\r\n\r\n if (!this.isDynamicsStarted && this.wantDynamics)\r\n this.beginDynamics();\r\n\r\n return EventHandled.No;\r\n }\r\n\r\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\r\n return this.processDataButton(ev);\r\n }\r\n\r\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\r\n await this.onReinitialize();\r\n return EventHandled.No;\r\n }\r\n\r\n /** Setup initial tool state, prompts, etc. */\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n /** Restore tool assistance after no longer being suspended by either a [[ViewTool]] or [[InputCollector]]. */\r\n public override async onUnsuspend() {\r\n this.provideToolAssistance();\r\n }\r\n\r\n /** Setup auto-locate, AccuSnap, AccuDraw, and supply tool assistance. */\r\n protected setupAndPromptForNextAction(): void {\r\n IModelApp.accuSnap.enableSnap(this.wantAccuSnap);\r\n this.provideToolAssistance();\r\n }\r\n\r\n /** Sub-classes should override to provide tool specific instructions. */\r\n protected provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\r\n const mainMsg = \"ElementSet.Prompts.IdentifyPoint\";\r\n const leftMsg = \"ElementSet.Inputs.AcceptPoint\";\r\n const rightMsg = \"ElementSet.Inputs.Cancel\";\r\n\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(leftMsg), false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(leftMsg), false, ToolAssistanceInputMethod.Mouse));\r\n\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(rightMsg), false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(rightMsg), false, ToolAssistanceInputMethod.Mouse));\r\n\r\n if (undefined !== additionalInstr) {\r\n for (const instr of additionalInstr) {\r\n if (ToolAssistanceInputMethod.Touch === instr.inputMethod)\r\n touchInstructions.push(instr);\r\n else\r\n mouseInstructions.push(instr);\r\n }\r\n }\r\n\r\n const sections: ToolAssistanceSection[] = [];\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, undefined !== mainInstrText ? mainInstrText : CoreTools.translate(mainMsg));\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n}\r\n\r\n/** Placement tool base class for creating new elements that use dynamics to show intermediate results.\r\n * @beta\r\n * @usage Subclasses should override the following methods in addition to the\r\n * abstract methods. See the method descriptions for more details:\r\n * - Override: [[isComplete]], [[updateElementData]], [[doCreateElement]], [[setupAccuDraw]], [[cancelPoint]]\r\n * - As necessary: [[wantAccuSnap]], [[wantDynamics]]\r\n * - Ensure the parent's implementation is called: [[setupAndPromptForNextAction]], [[onPostInstall]]\r\n *\r\n * This class expects subclasses to call [[setupAndPromptForNextAction]] as moving between the subclass's internal state.\r\n * @note To trigger an element to be inserted on [[onDataButtonDown]], ensure [[isComplete]] returns `true`\r\n * @caution Subclasses typically do not override the following methods. Instead, overwrite the methods they call as described here:\r\n * - [[onMouseMotion]]: See [[updateElementData]].\r\n * - [[onDataButtonDown]]:\r\n * - - See [[updateElementData]] for accepting data points.\r\n * - - See [[isComplete]] & [[doCreateElement` for creating the finalized element.\r\n * - - (With caution) See [[acceptPoint]] for preventing the mouse click event from propagating to the base tools.\r\n * - [[onResetButtonUp]]: See [[cancelPoint]].\r\n */\r\nexport abstract class CreateElementWithDynamicsTool extends CreateElementTool {\r\n protected _graphicsProvider?: DynamicGraphicsProvider;\r\n\r\n protected override get wantAccuSnap(): boolean { return true; }\r\n protected override get wantDynamics(): boolean { return true; }\r\n\r\n protected clearGraphics(): void {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n this._graphicsProvider.cleanupGraphic();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n /**\r\n * This method is intended to update the dynamic graphics displayed by the tool.\r\n *\r\n * It expects [[updateDynamicData]] to return `true`. If it returns `false`, no graphics are created.\r\n *\r\n * It expects [[getPlacementProps]] and [[getGeometryProps]] to be defined as it uses these functions to create the dynamic graphic.\r\n */\r\n protected async createGraphics(ev: BeButtonEvent): Promise<void> {\r\n if (!await this.updateDynamicData(ev))\r\n return;\r\n\r\n const placement = this.getPlacementProps();\r\n if (undefined === placement)\r\n return;\r\n\r\n const geometry = this.getGeometryProps(placement);\r\n if (undefined === geometry)\r\n return;\r\n\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);\r\n\r\n // Set chord tolerance for curved surfaces...\r\n if (ev.viewport)\r\n this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);\r\n\r\n await this._graphicsProvider.createGraphic(this.targetCategory, placement, geometry);\r\n }\r\n\r\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphic(context);\r\n }\r\n\r\n /** Invoked when the cursor is moving\r\n * Propagates event to [[updateElementData]].\r\n * @caution Subclasses typically don't override this.\r\n */\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n return this.createGraphics(ev);\r\n }\r\n\r\n protected abstract getPlacementProps(): PlacementProps | undefined;\r\n protected abstract getGeometryProps(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined;\r\n protected abstract getElementProps(placement: PlacementProps): GeometricElementProps | undefined;\r\n\r\n /**\r\n * Creates a new element in the iModel by interfacing with the core/editor backend.\r\n *\r\n * This method is called by [[onDataButtonDown]] only if `isComplete` is true.\r\n *\r\n * @param _props Argument passed in is based on the return value from the [[getElementProps]] method.\r\n */\r\n protected async doCreateElement(_props: GeometricElementProps): Promise<void> {}\r\n\r\n /** This method is intended to update information related to the element. This method is called in 2 scenarios:\r\n * 1. [[onMouseMotion]] as a dynamics\r\n * 2. [[onDataButtonDown]] when accepting the next point of the tool\r\n * @param ev - The mouse event triggering this call.\r\n * @param isDynamics it is `true` in scenario [1] and `false` in scenario [2].\r\n */\r\n protected async updateElementData(_ev: BeButtonEvent, _isDynamics: boolean): Promise<void> {}\r\n\r\n /**\r\n * This function does not handle updating data itself, instead, it directly calls [[updateElementData]] to handle that.\r\n * @returns `true` if dynamics are active, `false` otherwise.\r\n * @caution Subclasses typically don't override this.\r\n */\r\n protected async updateDynamicData(ev: BeButtonEvent): Promise<boolean> {\r\n if (!IModelApp.viewManager.inDynamicsMode)\r\n return false; // Don't need to create graphic if dynamics aren't yet active...\r\n\r\n await this.updateElementData(ev, true);\r\n return true;\r\n }\r\n\r\n protected async createElement(): Promise<void> {\r\n const placement = this.getPlacementProps();\r\n if (undefined === placement)\r\n return;\r\n\r\n const geometry = this.getGeometryProps(placement);\r\n if (undefined === geometry)\r\n return;\r\n\r\n const elemProps = this.getElementProps(placement);\r\n if (undefined === elemProps)\r\n return;\r\n\r\n if (\"flatbuffer\" === geometry.format) {\r\n delete elemProps.geom; // Leave unchanged until replaced by flatbuffer geometry...\r\n elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };\r\n } else {\r\n elemProps.geom = geometry.data;\r\n }\r\n\r\n return this.doCreateElement(elemProps);\r\n }\r\n\r\n /** Intended to be used to setupAccuSnap. Is called by [[setupAndPromptForNextAction]].\r\n * @note Has not checked for [[wantAccuSnap]] at this point. Directly, *after* this method is called in [[setupAndPromptForNextAction]], AccuSnap will be enabled/disabled based on [[wantAccuSnap]].\r\n */\r\n protected setupAccuDraw(): void { }\r\n\r\n protected override setupAndPromptForNextAction(): void {\r\n this.setupAccuDraw();\r\n super.setupAndPromptForNextAction();\r\n }\r\n\r\n /** Called by [[onDataButtonDown]].\r\n * @returns return `false` if the event has been handled.\r\n * @caution Subclasses typically don't override this.\r\n */\r\n protected async acceptPoint(ev: BeButtonEvent): Promise<boolean> {\r\n await this.updateElementData(ev, false);\r\n return true;\r\n }\r\n\r\n /** Invoked when the data button is pressed.\r\n * Propagates event to [[updateElementData]] by way of [[acceptPoint]].\r\n * @caution Subclasses typically don't override this.\r\n */\r\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (!await this.acceptPoint(ev))\r\n return EventHandled.Yes;\r\n return super.onDataButtonDown(ev);\r\n }\r\n\r\n /** Called by [[onResetButtonUp]].\r\n * @returns return `false` if the event has been handled.\r\n */\r\n protected async cancelPoint(_ev: BeButtonEvent): Promise<boolean> { return true; }\r\n\r\n /** Invoked when the reset button is released.\r\n * Propagates event to [[cancelPoint]].\r\n * @caution Subclasses typically don't override this.\r\n */\r\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (!await this.cancelPoint(ev))\r\n return EventHandled.Yes;\r\n return super.onResetButtonUp(ev);\r\n }\r\n\r\n public override async onCleanup() {\r\n this.clearGraphics();\r\n return super.onCleanup();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"CreateElementTool.js","sourceRoot":"","sources":["../../src/CreateElementTool.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\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { Id64, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport { Constant, Point3d, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { DynamicGraphicsRequest2dProps, DynamicGraphicsRequest3dProps, FlatBufferGeometryStream, GeometricElementProps, IModelError, isPlacement3dProps, JsonGeometryStream, PlacementProps } from \"@itwin/core-common\";\nimport { BeButtonEvent, CoordSystem, CoreTools, DynamicsContext, EventHandled, GraphicBranch, IModelApp, IModelConnection, PrimitiveTool, readElementGraphics, RenderGraphicOwner, ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection, Viewport } from \"@itwin/core-frontend\";\n\nfunction computeChordToleranceFromPointAndRadius(vp: Viewport, center: Point3d, radius: number): number {\n if (vp.view.is3d() && vp.view.isCameraOn) {\n const nearFrontCenter = vp.getFrustum(CoordSystem.World).frontCenter;\n const toFront = Vector3d.createStartEnd(center, nearFrontCenter);\n const viewZ = vp.rotation.rowZ();\n\n // If the sphere overlaps the near front plane just use near front point. This also handles behind eye conditions.\n if (viewZ.dotProduct(toFront) < radius) {\n center = nearFrontCenter;\n } else {\n // Find point on sphere closest to eye.\n const toEye = center.unitVectorTo(vp.view.camera.eye);\n\n // Only if not already behind the eye.\n if (toEye) {\n toEye.scaleInPlace(radius);\n center.addInPlace(toEye);\n }\n }\n }\n\n const viewPt = vp.worldToViewMap.transform0.multiplyPoint3dQuietNormalize(center);\n const viewPt2 = new Point3d(viewPt.x + 1.0, viewPt.y, viewPt.z);\n const pixelSize = vp.worldToViewMap.transform1.multiplyPoint3dQuietNormalize(viewPt).distance(vp.worldToViewMap.transform1.multiplyPoint3dQuietNormalize(viewPt2));\n\n // Return size of a physical pixel in meters.\n return (0.0 !== pixelSize ? vp.target.adjustPixelSizeForLOD(pixelSize) : 0.001);\n}\n\n/** Calculate a view based chord tolerance for facetting curved geometry given a world coordinate and optional radius.\n * @beta\n */\nexport function computeChordToleranceFromPoint(vp: Viewport, pt: Point3d, radius?: number): number {\n return computeChordToleranceFromPointAndRadius(vp, pt, radius ? radius : Constant.oneCentimeter);\n}\n\n/** Calculate a view based chord tolerance for facetting curved geometry given a world coordinate range box.\n * @beta\n */\nexport function computeChordToleranceFromRange(vp: Viewport, range: Range3d): number {\n return computeChordToleranceFromPointAndRadius(vp, range.center, 0.5 * range.low.distance(range.high));\n}\n\n/** A class for creating and managing a RenderGraphic for the purpose of interactive tool dynamics.\n * @beta\n */\nexport class DynamicGraphicsProvider {\n public readonly iModel: IModelConnection;\n public readonly prefix: string;\n public graphic?: RenderGraphicOwner;\n /** Current request for graphic */\n private _graphicPromise?: Promise<boolean>;\n /** Optional element id generated graphics will be associated to */\n public elementId?: Id64String;\n /** Optional model id generated graphics will be associated to */\n public modelId?: Id64String;\n /** Chord tolerance to use to stroke the element's geometry in meters */\n public chordTolerance = 0.001;\n\n constructor(iModel: IModelConnection, prefix: string) {\n this.iModel = iModel;\n this.prefix = prefix;\n }\n\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\n\n private async createRequest(categoryId: Id64String, placement: PlacementProps, geometry: JsonGeometryStream | FlatBufferGeometryStream): Promise<RenderGraphicOwner | undefined> {\n let graphicData;\n let is3d;\n\n if (is3d = isPlacement3dProps(placement)) {\n const requestProps: DynamicGraphicsRequest3dProps = {\n id: this.getRequestId(this.elementId ? this.elementId : Id64.invalid),\n elementId: this.elementId,\n modelId: this.modelId,\n toleranceLog10: this.getToleranceLog10(),\n type: \"3d\",\n placement,\n categoryId,\n geometry,\n };\n graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n is3d = true;\n } else {\n const requestProps: DynamicGraphicsRequest2dProps = {\n id: this.getRequestId(this.elementId ? this.elementId : Id64.invalid),\n elementId: this.elementId,\n modelId: this.modelId,\n toleranceLog10: this.getToleranceLog10(),\n type: \"2d\",\n placement,\n categoryId,\n geometry,\n };\n graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n }\n\n if (undefined === graphicData)\n return;\n\n const graphic = await readElementGraphics(graphicData, this.iModel, this.modelId ? this.modelId : Id64.invalid, is3d, { noFlash: true, noHilite: true });\n if (undefined === graphic)\n return;\n\n return IModelApp.renderSystem.createGraphicOwner(graphic);\n }\n\n /** Call to request a RenderGraphic for the supplied geometry and placement.\n * @see [[cleanupGraphic]] Must be called when the tool exits.\n */\n public async createGraphic(categoryId: Id64String, placement: PlacementProps, geometry: JsonGeometryStream | FlatBufferGeometryStream): Promise<boolean> {\n try {\n const graphic = await this.createRequest(categoryId, placement, geometry);\n this.cleanupGraphic();\n return (undefined !== (this.graphic = graphic));\n } catch {\n return false;\n }\n }\n\n /** Call to request a RenderGraphic for the supplied geometry and trigger a dynamic update upon fulfillment.\n * @note May be useful to update a dynamic preview outside of normal button and motion events, ex. modifier key change.\n * @see [[cleanupGraphic]] Must be called when the tool exits.\n */\n public createGraphicAndUpdateDynamics(ev: BeButtonEvent, categoryId: Id64String, placement: PlacementProps, geometry: JsonGeometryStream | FlatBufferGeometryStream): void {\n const promise = this._graphicPromise = this.createGraphic(categoryId, placement, geometry);\n\n promise.then(() => {\n if (promise !== this._graphicPromise)\n return; // abandoned this request...\n\n IModelApp.toolAdmin.updateDynamics(ev);\n }).catch((_) => { });\n }\n\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]].\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\n */\n public cleanupGraphic(): void {\n if (undefined === this.graphic)\n return;\n this.graphic.disposeGraphic();\n this.graphic = undefined;\n }\n\n public addGraphic(context: DynamicsContext, transform?: Transform): void {\n if (undefined === this.graphic)\n return;\n\n if (undefined === transform) {\n context.addGraphic(this.graphic);\n return;\n }\n\n const branch = new GraphicBranch(false);\n branch.add(this.graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n}\n\n/** Placement tool base class for creating new elements.\n * @beta\n */\nexport abstract class CreateElementTool extends PrimitiveTool {\n public get targetCategory(): Id64String {\n const category = this.briefcase?.editorToolSettings.category;\n if (undefined === category)\n throw new IModelError(IModelStatus.InvalidCategory, \"\");\n\n return category;\n }\n\n public override get targetModelId(): Id64String {\n const model = this.briefcase?.editorToolSettings.model;\n if (undefined === model)\n throw new IModelError(IModelStatus.BadModel, \"\");\n\n return model;\n }\n\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean {\n if (!vp?.iModel.isBriefcaseConnection())\n return false;\n\n return undefined !== vp.iModel.editorToolSettings.model && super.isCompatibleViewport(vp, isSelectedViewChange);\n }\n\n /** Whether [[setupAndPromptForNextAction]] should call [[AccuSnap.enableSnap]] for current tool phase.\n * @return true to enable snapping to elements.\n */\n protected get wantAccuSnap(): boolean { return false; }\n\n /** Whether to automatically start element dynamics on button event.\n * @return true if tool will implement [[InteractiveTool.onDynamicFrame]] to show element dynamics.\n */\n protected get wantDynamics(): boolean { return false; }\n\n /** Whether tool is ready to insert the new element.\n * @return true to call [[createElement]].\n */\n protected isComplete(_ev: BeButtonEvent): boolean { return false; }\n\n /** Insert new element and call [[saveChanges]] */\n protected abstract createElement(): Promise<void>;\n\n /** Orchestrates advancing the internal state of the tool on a data button event.\n * - Gather input: Initiates element dynamics and accepts additional points as required.\n * - Complete operation: Create new element, restart or exit tool.\n * @returns EventHandled.Yes if onReinitialize was called to restart or exit tool.\n */\n protected async processDataButton(ev: BeButtonEvent): Promise<EventHandled> {\n if (this.isComplete(ev)) {\n await this.createElement();\n await this.onReinitialize();\n\n return EventHandled.Yes;\n }\n\n this.setupAndPromptForNextAction();\n\n if (!this.isDynamicsStarted && this.wantDynamics)\n this.beginDynamics();\n\n return EventHandled.No;\n }\n\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processDataButton(ev);\n }\n\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n await this.onReinitialize();\n return EventHandled.No;\n }\n\n /** Setup initial tool state, prompts, etc. */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n /** Restore tool assistance after no longer being suspended by either a [[ViewTool]] or [[InputCollector]]. */\n public override async onUnsuspend() {\n this.provideToolAssistance();\n }\n\n /** Setup auto-locate, AccuSnap, AccuDraw, and supply tool assistance. */\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(this.wantAccuSnap);\n this.provideToolAssistance();\n }\n\n /** Sub-classes should override to provide tool specific instructions. */\n protected provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\n const mainMsg = \"ElementSet.Prompts.IdentifyPoint\";\n const leftMsg = \"ElementSet.Inputs.AcceptPoint\";\n const rightMsg = \"ElementSet.Inputs.Cancel\";\n\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(leftMsg), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(leftMsg), false, ToolAssistanceInputMethod.Mouse));\n\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(rightMsg), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(rightMsg), false, ToolAssistanceInputMethod.Mouse));\n\n if (undefined !== additionalInstr) {\n for (const instr of additionalInstr) {\n if (ToolAssistanceInputMethod.Touch === instr.inputMethod)\n touchInstructions.push(instr);\n else\n mouseInstructions.push(instr);\n }\n }\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, undefined !== mainInstrText ? mainInstrText : CoreTools.translate(mainMsg));\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n}\n\n/** Placement tool base class for creating new elements that use dynamics to show intermediate results.\n * @beta\n * @usage Subclasses should override the following methods in addition to the\n * abstract methods. See the method descriptions for more details:\n * - Override: [[isComplete]], [[updateElementData]], [[doCreateElement]], [[setupAccuDraw]], [[cancelPoint]]\n * - As necessary: [[wantAccuSnap]], [[wantDynamics]]\n * - Ensure the parent's implementation is called: [[setupAndPromptForNextAction]], [[onPostInstall]]\n *\n * This class expects subclasses to call [[setupAndPromptForNextAction]] as moving between the subclass's internal state.\n * @note To trigger an element to be inserted on [[onDataButtonDown]], ensure [[isComplete]] returns `true`\n * @caution Subclasses typically do not override the following methods. Instead, overwrite the methods they call as described here:\n * - [[onMouseMotion]]: See [[updateElementData]].\n * - [[onDataButtonDown]]:\n * - - See [[updateElementData]] for accepting data points.\n * - - See [[isComplete]] & [[doCreateElement` for creating the finalized element.\n * - - (With caution) See [[acceptPoint]] for preventing the mouse click event from propagating to the base tools.\n * - [[onResetButtonUp]]: See [[cancelPoint]].\n */\nexport abstract class CreateElementWithDynamicsTool extends CreateElementTool {\n protected _graphicsProvider?: DynamicGraphicsProvider;\n\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n\n protected clearGraphics(): void {\n if (undefined === this._graphicsProvider)\n return;\n this._graphicsProvider.cleanupGraphic();\n this._graphicsProvider = undefined;\n }\n\n /**\n * This method is intended to update the dynamic graphics displayed by the tool.\n *\n * It expects [[updateDynamicData]] to return `true`. If it returns `false`, no graphics are created.\n *\n * It expects [[getPlacementProps]] and [[getGeometryProps]] to be defined as it uses these functions to create the dynamic graphic.\n */\n protected async createGraphics(ev: BeButtonEvent): Promise<void> {\n if (!await this.updateDynamicData(ev))\n return;\n\n const placement = this.getPlacementProps();\n if (undefined === placement)\n return;\n\n const geometry = this.getGeometryProps(placement);\n if (undefined === geometry)\n return;\n\n if (undefined === this._graphicsProvider)\n this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);\n\n // Set chord tolerance for curved surfaces...\n if (ev.viewport)\n this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);\n\n await this._graphicsProvider.createGraphic(this.targetCategory, placement, geometry);\n }\n\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphic(context);\n }\n\n /** Invoked when the cursor is moving\n * Propagates event to [[updateElementData]].\n * @caution Subclasses typically don't override this.\n */\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n return this.createGraphics(ev);\n }\n\n protected abstract getPlacementProps(): PlacementProps | undefined;\n protected abstract getGeometryProps(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined;\n protected abstract getElementProps(placement: PlacementProps): GeometricElementProps | undefined;\n\n /**\n * Creates a new element in the iModel by interfacing with the core/editor backend.\n *\n * This method is called by [[onDataButtonDown]] only if `isComplete` is true.\n *\n * @param _props Argument passed in is based on the return value from the [[getElementProps]] method.\n */\n protected async doCreateElement(_props: GeometricElementProps): Promise<void> {}\n\n /** This method is intended to update information related to the element. This method is called in 2 scenarios:\n * 1. [[onMouseMotion]] as a dynamics\n * 2. [[onDataButtonDown]] when accepting the next point of the tool\n * @param ev - The mouse event triggering this call.\n * @param isDynamics it is `true` in scenario [1] and `false` in scenario [2].\n */\n protected async updateElementData(_ev: BeButtonEvent, _isDynamics: boolean): Promise<void> {}\n\n /**\n * This function does not handle updating data itself, instead, it directly calls [[updateElementData]] to handle that.\n * @returns `true` if dynamics are active, `false` otherwise.\n * @caution Subclasses typically don't override this.\n */\n protected async updateDynamicData(ev: BeButtonEvent): Promise<boolean> {\n if (!IModelApp.viewManager.inDynamicsMode)\n return false; // Don't need to create graphic if dynamics aren't yet active...\n\n await this.updateElementData(ev, true);\n return true;\n }\n\n protected async createElement(): Promise<void> {\n const placement = this.getPlacementProps();\n if (undefined === placement)\n return;\n\n const geometry = this.getGeometryProps(placement);\n if (undefined === geometry)\n return;\n\n const elemProps = this.getElementProps(placement);\n if (undefined === elemProps)\n return;\n\n if (\"flatbuffer\" === geometry.format) {\n delete elemProps.geom; // Leave unchanged until replaced by flatbuffer geometry...\n elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };\n } else {\n elemProps.geom = geometry.data;\n }\n\n return this.doCreateElement(elemProps);\n }\n\n /** Intended to be used to setupAccuSnap. Is called by [[setupAndPromptForNextAction]].\n * @note Has not checked for [[wantAccuSnap]] at this point. Directly, *after* this method is called in [[setupAndPromptForNextAction]], AccuSnap will be enabled/disabled based on [[wantAccuSnap]].\n */\n protected setupAccuDraw(): void { }\n\n protected override setupAndPromptForNextAction(): void {\n this.setupAccuDraw();\n super.setupAndPromptForNextAction();\n }\n\n /** Called by [[onDataButtonDown]].\n * @returns return `false` if the event has been handled.\n * @caution Subclasses typically don't override this.\n */\n protected async acceptPoint(ev: BeButtonEvent): Promise<boolean> {\n await this.updateElementData(ev, false);\n return true;\n }\n\n /** Invoked when the data button is pressed.\n * Propagates event to [[updateElementData]] by way of [[acceptPoint]].\n * @caution Subclasses typically don't override this.\n */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (!await this.acceptPoint(ev))\n return EventHandled.Yes;\n return super.onDataButtonDown(ev);\n }\n\n /** Called by [[onResetButtonUp]].\n * @returns return `false` if the event has been handled.\n */\n protected async cancelPoint(_ev: BeButtonEvent): Promise<boolean> { return true; }\n\n /** Invoked when the reset button is released.\n * Propagates event to [[cancelPoint]].\n * @caution Subclasses typically don't override this.\n */\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n if (!await this.cancelPoint(ev))\n return EventHandled.Yes;\n return super.onResetButtonUp(ev);\n }\n\n public override async onCleanup() {\n this.clearGraphics();\n return super.onCleanup();\n }\n}\n"]}
@@ -19,6 +19,10 @@ const ProjectGeoLocation = require("./ProjectLocation/ProjectGeolocation");
19
19
  * @beta
20
20
  */
21
21
  class EditTools {
22
+ static namespace = "Editor";
23
+ static tools = "Editor:tools.";
24
+ static busyRetry;
25
+ static _initialized = false;
22
26
  static async startCommand(startArg, ...cmdArgs) {
23
27
  let attempt = 0;
24
28
  while (true) {
@@ -78,7 +82,4 @@ class EditTools {
78
82
  }
79
83
  }
80
84
  exports.EditTools = EditTools;
81
- EditTools.namespace = "Editor";
82
- EditTools.tools = "Editor:tools.";
83
- EditTools._initialized = false;
84
85
  //# sourceMappingURL=EditTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditTool.js","sourceRoot":"","sources":["../../src/EditTool.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAAiD;AACjD,wDAA0E;AAC1E,wDAAwD;AAExD,gDAAgD;AAChD,8EAA8E;AAC9E,2EAA2E;AAgB3E;;;GAGG;AACH,MAAa,SAAS;IAMb,MAAM,CAAC,KAAK,CAAC,YAAY,CAAI,QAA6B,EAAE,GAAG,OAAc;QAClF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,MAAO,sBAAM,CAAC,+BAAe,CAAC,CAAC,gCAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,OAAO,CAAgB,CAAC;YACrJ,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,IAAI,KAAK,gCAAgB,CAAC,WAAW;oBACzC,MAAM,CAAC,CAAC,CAAC,wBAAwB;gBACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;gBACnE,MAAM,yBAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,SAAS,CAAC,MAAc;QACpC,OAAO,yBAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IACxE,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAC,UAAU;QAC5B,IAAI,IAAI,CAAC,YAAY;YACnB,OAAO;QAET,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,oCAAoC;QACpC,yBAAS,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE9D,kFAAkF;QAClF,yBAAS,CAAC,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAEhD,MAAM,gBAAgB,GAAG,yBAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAElF,MAAM,KAAK,GAAG,yBAAS,CAAC,KAAK,CAAC;QAC9B,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,4BAA4B;QACxC,IAAI,CAAC,IAAI,CAAC,YAAY;YACpB,OAAO;QACT,MAAM,KAAK,GAAG,yBAAS,CAAC,KAAK,CAAC;QAC9B,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,KAAK,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,KAAK,CAAC,aAAa;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAS,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAEO,MAAM,CAAC,QAAQ;QACrB,yBAAS,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;;AAxEH,8BAyEC;AAxEwB,mBAAS,GAAG,QAAQ,CAAC;AACrB,eAAK,GAAG,eAAe,CAAC;AAEhC,sBAAY,GAAG,KAAK,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { BeDuration } from \"@itwin/core-bentley\";\r\nimport { _callIpcChannel, IModelApp, IpcApp } from \"@itwin/core-frontend\";\r\nimport { editorIpcStrings } from \"@itwin/editor-common\";\r\n\r\nimport * as UndoRedoTools from \"./UndoRedoTool\";\r\nimport * as ProjectLocation from \"./ProjectLocation/ProjectExtentsDecoration\";\r\nimport * as ProjectGeoLocation from \"./ProjectLocation/ProjectGeolocation\";\r\n\r\n/** @beta */\r\nexport namespace EditTools {\r\n export interface StartArgs {\r\n commandId: string;\r\n iModelKey: string;\r\n }\r\n /** handler for retries when an EditTool attempts to start but a backend command is busy and can't finish its work.\r\n * @param attempt the number of times this handler was previously called for this EditTool\r\n * @param msg the message about what's happening from the currently busy EditCommand.\r\n * @returns the delay (in milliseconds) before attempting again. If `undefined` use default (usually 1 second)\r\n */\r\n export type BusyRetry = (attempt: number, msg: string) => Promise<number | undefined>;\r\n}\r\n\r\n/**\r\n * Supports PrimitiveTool and InputCollector sub-classes.\r\n * @beta\r\n */\r\nexport class EditTools {\r\n public static readonly namespace = \"Editor\";\r\n public static readonly tools = \"Editor:tools.\";\r\n public static busyRetry?: EditTools.BusyRetry;\r\n private static _initialized = false;\r\n\r\n public static async startCommand<T>(startArg: EditTools.StartArgs, ...cmdArgs: any[]): Promise<T> {\r\n let attempt = 0;\r\n while (true) {\r\n try {\r\n return await (IpcApp[_callIpcChannel](editorIpcStrings.channel, \"startCommand\", startArg.commandId, startArg.iModelKey, ...cmdArgs) as Promise<T>);\r\n } catch (e: any) {\r\n if (e.name !== editorIpcStrings.commandBusy)\r\n throw e; // unknown backend error\r\n const delay = await this.busyRetry?.(attempt++, e.message) ?? 1000;\r\n await BeDuration.fromMilliseconds(delay).wait();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public static translate(prompt: string) {\r\n return IModelApp.localization.getLocalizedString(this.tools + prompt);\r\n }\r\n\r\n /** Call this before using the package (e.g., before attempting to use any of its tools.)\r\n * To initialize when starting up your app:\r\n * ```ts\r\n * IModelApp.startup();\r\n * await EditorTools.initialize();\r\n * ```\r\n * @note This registers tools for element undo and redo.\r\n */\r\n public static async initialize(): Promise<void> {\r\n if (this._initialized)\r\n return;\r\n\r\n this._initialized = true;\r\n\r\n // clean up if we're being shut down\r\n IModelApp.onBeforeShutdown.addListener(() => this.shutdown());\r\n\r\n // Make sure current edit command finishes before starting a new primitive tool...\r\n IModelApp.toolAdmin.setEditCommandHandler(this);\r\n\r\n const namespacePromise = IModelApp.localization.registerNamespace(this.namespace);\r\n\r\n const tools = IModelApp.tools;\r\n tools.registerModule(UndoRedoTools, this.namespace);\r\n\r\n return namespacePromise;\r\n }\r\n\r\n /** Can be called after initialize to register tools for changing project extents and geolocation.\r\n * @note Requires backend to register BasicManipulationCommand with EditCommandAdmin.\r\n */\r\n public static registerProjectLocationTools(): void {\r\n if (!this._initialized)\r\n return;\r\n const tools = IModelApp.tools;\r\n tools.registerModule(ProjectLocation, this.namespace);\r\n tools.registerModule(ProjectGeoLocation, this.namespace);\r\n }\r\n\r\n /** @internal */\r\n public static async finishCommand(): Promise<string> {\r\n return this.startCommand<string>({ commandId: \"\", iModelKey: \"\" });\r\n }\r\n\r\n private static shutdown() {\r\n IModelApp.toolAdmin.setEditCommandHandler();\r\n this._initialized = false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"EditTool.js","sourceRoot":"","sources":["../../src/EditTool.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAAiD;AACjD,wDAA0E;AAC1E,wDAAwD;AAExD,gDAAgD;AAChD,8EAA8E;AAC9E,2EAA2E;AAgB3E;;;GAGG;AACH,MAAa,SAAS;IACb,MAAM,CAAU,SAAS,GAAG,QAAQ,CAAC;IACrC,MAAM,CAAU,KAAK,GAAG,eAAe,CAAC;IACxC,MAAM,CAAC,SAAS,CAAuB;IACtC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;IAE7B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAI,QAA6B,EAAE,GAAG,OAAc;QAClF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,MAAO,sBAAM,CAAC,+BAAe,CAAC,CAAC,gCAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,OAAO,CAAgB,CAAC;YACrJ,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,IAAI,KAAK,gCAAgB,CAAC,WAAW;oBACzC,MAAM,CAAC,CAAC,CAAC,wBAAwB;gBACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;gBACnE,MAAM,yBAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,SAAS,CAAC,MAAc;QACpC,OAAO,yBAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IACxE,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAC,UAAU;QAC5B,IAAI,IAAI,CAAC,YAAY;YACnB,OAAO;QAET,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,oCAAoC;QACpC,yBAAS,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE9D,kFAAkF;QAClF,yBAAS,CAAC,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAEhD,MAAM,gBAAgB,GAAG,yBAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAElF,MAAM,KAAK,GAAG,yBAAS,CAAC,KAAK,CAAC;QAC9B,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,4BAA4B;QACxC,IAAI,CAAC,IAAI,CAAC,YAAY;YACpB,OAAO;QACT,MAAM,KAAK,GAAG,yBAAS,CAAC,KAAK,CAAC;QAC9B,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,KAAK,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,KAAK,CAAC,aAAa;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAS,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAEO,MAAM,CAAC,QAAQ;QACrB,yBAAS,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;;AAxEH,8BAyEC","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 Editing\n */\n\nimport { BeDuration } from \"@itwin/core-bentley\";\nimport { _callIpcChannel, IModelApp, IpcApp } from \"@itwin/core-frontend\";\nimport { editorIpcStrings } from \"@itwin/editor-common\";\n\nimport * as UndoRedoTools from \"./UndoRedoTool\";\nimport * as ProjectLocation from \"./ProjectLocation/ProjectExtentsDecoration\";\nimport * as ProjectGeoLocation from \"./ProjectLocation/ProjectGeolocation\";\n\n/** @beta */\nexport namespace EditTools {\n export interface StartArgs {\n commandId: string;\n iModelKey: string;\n }\n /** handler for retries when an EditTool attempts to start but a backend command is busy and can't finish its work.\n * @param attempt the number of times this handler was previously called for this EditTool\n * @param msg the message about what's happening from the currently busy EditCommand.\n * @returns the delay (in milliseconds) before attempting again. If `undefined` use default (usually 1 second)\n */\n export type BusyRetry = (attempt: number, msg: string) => Promise<number | undefined>;\n}\n\n/**\n * Supports PrimitiveTool and InputCollector sub-classes.\n * @beta\n */\nexport class EditTools {\n public static readonly namespace = \"Editor\";\n public static readonly tools = \"Editor:tools.\";\n public static busyRetry?: EditTools.BusyRetry;\n private static _initialized = false;\n\n public static async startCommand<T>(startArg: EditTools.StartArgs, ...cmdArgs: any[]): Promise<T> {\n let attempt = 0;\n while (true) {\n try {\n return await (IpcApp[_callIpcChannel](editorIpcStrings.channel, \"startCommand\", startArg.commandId, startArg.iModelKey, ...cmdArgs) as Promise<T>);\n } catch (e: any) {\n if (e.name !== editorIpcStrings.commandBusy)\n throw e; // unknown backend error\n const delay = await this.busyRetry?.(attempt++, e.message) ?? 1000;\n await BeDuration.fromMilliseconds(delay).wait();\n }\n }\n }\n\n /** @internal */\n public static translate(prompt: string) {\n return IModelApp.localization.getLocalizedString(this.tools + prompt);\n }\n\n /** Call this before using the package (e.g., before attempting to use any of its tools.)\n * To initialize when starting up your app:\n * ```ts\n * IModelApp.startup();\n * await EditorTools.initialize();\n * ```\n * @note This registers tools for element undo and redo.\n */\n public static async initialize(): Promise<void> {\n if (this._initialized)\n return;\n\n this._initialized = true;\n\n // clean up if we're being shut down\n IModelApp.onBeforeShutdown.addListener(() => this.shutdown());\n\n // Make sure current edit command finishes before starting a new primitive tool...\n IModelApp.toolAdmin.setEditCommandHandler(this);\n\n const namespacePromise = IModelApp.localization.registerNamespace(this.namespace);\n\n const tools = IModelApp.tools;\n tools.registerModule(UndoRedoTools, this.namespace);\n\n return namespacePromise;\n }\n\n /** Can be called after initialize to register tools for changing project extents and geolocation.\n * @note Requires backend to register BasicManipulationCommand with EditCommandAdmin.\n */\n public static registerProjectLocationTools(): void {\n if (!this._initialized)\n return;\n const tools = IModelApp.tools;\n tools.registerModule(ProjectLocation, this.namespace);\n tools.registerModule(ProjectGeoLocation, this.namespace);\n }\n\n /** @internal */\n public static async finishCommand(): Promise<string> {\n return this.startCommand<string>({ commandId: \"\", iModelKey: \"\" });\n }\n\n private static shutdown() {\n IModelApp.toolAdmin.setEditCommandHandler();\n this._initialized = false;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"EditToolIpc.js","sourceRoot":"","sources":["../../src/EditToolIpc.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAUH,0CAEC;AATD,wDAA8C;AAC9C,wDAAqG;AAErG;;;GAGG;AACH,SAAgB,eAAe;IAC7B,OAAO,sBAAM,CAAC,oBAAoB,CAAI,gCAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAChF,CAAC;AAED;;GAEG;AACU,QAAA,oBAAoB,GAAG,eAAe,EAA+B,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { PickAsyncMethods } from \"@itwin/core-bentley\";\r\nimport { IpcApp } from \"@itwin/core-frontend\";\r\nimport { BasicManipulationCommandIpc, EditCommandIpc, editorIpcStrings } from \"@itwin/editor-common\";\r\n\r\n/**\r\n * Create a type safe Proxy object to make IPC calls from [[EditTools]] to methods of an `EditCommandIpc` interface of the current `EditCommand`.\r\n * @beta\r\n */\r\nexport function makeEditToolIpc<K extends EditCommandIpc>(): PickAsyncMethods<K> {\r\n return IpcApp.makeIpcFunctionProxy<K>(editorIpcStrings.channel, \"callMethod\");\r\n}\r\n\r\n/** Proxy for calling methods in `BasicManipulationCommandIpc`\r\n * @internal\r\n */\r\nexport const basicManipulationIpc = makeEditToolIpc<BasicManipulationCommandIpc>();\r\n\r\n"]}
1
+ {"version":3,"file":"EditToolIpc.js","sourceRoot":"","sources":["../../src/EditToolIpc.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAUH,0CAEC;AATD,wDAA8C;AAC9C,wDAAqG;AAErG;;;GAGG;AACH,SAAgB,eAAe;IAC7B,OAAO,sBAAM,CAAC,oBAAoB,CAAI,gCAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAChF,CAAC;AAED;;GAEG;AACU,QAAA,oBAAoB,GAAG,eAAe,EAA+B,CAAC","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 Editing\n */\n\nimport { PickAsyncMethods } from \"@itwin/core-bentley\";\nimport { IpcApp } from \"@itwin/core-frontend\";\nimport { BasicManipulationCommandIpc, EditCommandIpc, editorIpcStrings } from \"@itwin/editor-common\";\n\n/**\n * Create a type safe Proxy object to make IPC calls from [[EditTools]] to methods of an `EditCommandIpc` interface of the current `EditCommand`.\n * @beta\n */\nexport function makeEditToolIpc<K extends EditCommandIpc>(): PickAsyncMethods<K> {\n return IpcApp.makeIpcFunctionProxy<K>(editorIpcStrings.channel, \"callMethod\");\n}\n\n/** Proxy for calling methods in `BasicManipulationCommandIpc`\n * @internal\n */\nexport const basicManipulationIpc = makeEditToolIpc<BasicManipulationCommandIpc>();\n\n"]}
@@ -16,10 +16,7 @@ const CreateElementTool_1 = require("./CreateElementTool");
16
16
  * @beta
17
17
  */
18
18
  class ModifyElementTool extends core_frontend_1.ElementSetTool {
19
- constructor() {
20
- super(...arguments);
21
- this._checkedIds = new Map();
22
- }
19
+ _checkedIds = new Map();
23
20
  allowView(_vp) { return true; }
24
21
  isCompatibleViewport(vp, isSelectedViewChange) { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }
25
22
  onGeometryFilterChanged() { this._checkedIds.clear(); }
@@ -87,10 +84,10 @@ exports.ModifyElementTool = ModifyElementTool;
87
84
  * @beta
88
85
  */
89
86
  class ModifyElementWithDynamicsTool extends ModifyElementTool {
90
- constructor() {
91
- super(...arguments);
92
- this._firstResult = true;
93
- }
87
+ _graphicsProvider;
88
+ _firstResult = true;
89
+ _agendaAppearanceDefault;
90
+ _agendaAppearanceDynamic;
94
91
  get wantAccuSnap() { return true; }
95
92
  get wantDynamics() { return true; }
96
93
  agendaAppearance(isDynamics) {
@@ -1 +1 @@
1
- {"version":3,"file":"ModifyElementTool.js","sourceRoot":"","sources":["../../src/ModifyElementTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { Id64, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { FeatureAppearance, FlatBufferGeometryStream, GeometricElementProps, JsonGeometryStream } from \"@itwin/core-common\";\r\nimport { BeButtonEvent, DynamicsContext, ElementSetTool, FeatureOverrideProvider, FeatureSymbology, HitDetail, IModelApp, LocateResponse, SelectionMethod, SelectionSet, Viewport } from \"@itwin/core-frontend\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nimport { computeChordToleranceFromPoint, DynamicGraphicsProvider } from \"./CreateElementTool\";\r\n\r\n/** Edit tool base class for updating existing elements.\r\n * @beta\r\n */\r\nexport abstract class ModifyElementTool extends ElementSetTool {\r\n protected readonly _checkedIds = new Map<Id64String, boolean>();\r\n\r\n protected allowView(_vp: Viewport) { return true; }\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\r\n\r\n protected onGeometryFilterChanged(): void { this._checkedIds.clear(); }\r\n\r\n protected async doAcceptElementForOperation(_id: Id64String): Promise<boolean> { return false; }\r\n\r\n protected async acceptElementForOperation(id: Id64String): Promise<boolean> {\r\n if (Id64.isInvalid(id) || Id64.isTransient(id))\r\n return false;\r\n\r\n let accept = this._checkedIds.get(id);\r\n\r\n if (undefined === accept) {\r\n if (this.agenda.isEmpty && this._checkedIds.size > 1000)\r\n this._checkedIds.clear(); // Limit auto-locate cache size to something reasonable...\r\n\r\n accept = await this.doAcceptElementForOperation(id);\r\n this._checkedIds.set(id, accept);\r\n }\r\n\r\n return accept;\r\n }\r\n\r\n protected override async isElementValidForOperation(hit: HitDetail, out?: LocateResponse): Promise<boolean> {\r\n if (!await super.isElementValidForOperation(hit, out))\r\n return false;\r\n\r\n return this.acceptElementForOperation(hit.sourceId);\r\n }\r\n\r\n protected async postFilterIds(arg: Id64Arg): Promise<Id64Arg> {\r\n const ids: Id64Array = [];\r\n\r\n for (const id of Id64.iterable(arg)) {\r\n if (await this.acceptElementForOperation(id))\r\n ids.push(id);\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n protected override async getGroupIds(id: Id64String): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getGroupIds(id));\r\n }\r\n\r\n protected override async getSelectionSetCandidates(ss: SelectionSet): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getSelectionSetCandidates(ss));\r\n }\r\n\r\n protected override async getDragSelectCandidates(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));\r\n }\r\n\r\n protected setupAccuDraw(): void { }\r\n\r\n protected override setupAndPromptForNextAction(): void {\r\n this.setupAccuDraw();\r\n super.setupAndPromptForNextAction();\r\n }\r\n\r\n protected abstract getGeometryProps(ev: BeButtonEvent, isAccept: boolean): JsonGeometryStream | FlatBufferGeometryStream | undefined;\r\n protected abstract getElementProps(ev: BeButtonEvent): GeometricElementProps | undefined;\r\n\r\n protected async doUpdateElement(_props: GeometricElementProps): Promise<boolean> { return false; }\r\n\r\n protected async applyAgendaOperation(ev: BeButtonEvent): Promise<boolean> {\r\n const geometry = this.getGeometryProps(ev, true);\r\n if (undefined === geometry)\r\n return false;\r\n\r\n const elemProps = this.getElementProps(ev);\r\n if (undefined === elemProps)\r\n return false;\r\n\r\n if (\"flatbuffer\" === geometry.format)\r\n elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };\r\n else\r\n elemProps.geom = geometry.data;\r\n\r\n return this.doUpdateElement(elemProps);\r\n }\r\n\r\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\r\n if (await this.applyAgendaOperation(ev))\r\n return this.saveChanges();\r\n }\r\n}\r\n\r\n/** Edit tool base class for updating existing elements that use dynamics to show intermediate results.\r\n * @beta\r\n */\r\nexport abstract class ModifyElementWithDynamicsTool extends ModifyElementTool implements FeatureOverrideProvider {\r\n protected _graphicsProvider?: DynamicGraphicsProvider;\r\n protected _firstResult = true;\r\n protected _agendaAppearanceDefault?: FeatureAppearance;\r\n protected _agendaAppearanceDynamic?: FeatureAppearance;\r\n\r\n protected override get wantAccuSnap(): boolean { return true; }\r\n protected override get wantDynamics(): boolean { return true; }\r\n\r\n protected agendaAppearance(isDynamics: boolean): FeatureAppearance {\r\n if (isDynamics) {\r\n if (undefined === this._agendaAppearanceDynamic)\r\n this._agendaAppearanceDynamic = FeatureAppearance.fromTransparency(0.0);\r\n\r\n return this._agendaAppearanceDynamic;\r\n }\r\n\r\n if (undefined === this._agendaAppearanceDefault)\r\n this._agendaAppearanceDefault = FeatureAppearance.fromTransparency(0.9);\r\n\r\n return this._agendaAppearanceDefault;\r\n }\r\n\r\n protected get wantAgendaAppearanceOverride(): boolean { return false; }\r\n\r\n public addFeatureOverrides(overrides: FeatureSymbology.Overrides, _vp: Viewport): void {\r\n if (this.agenda.isEmpty)\r\n return;\r\n\r\n const appearance = this.agendaAppearance(false);\r\n this.agenda.elements.forEach((elementId) => overrides.override({ elementId, appearance }));\r\n }\r\n\r\n protected updateAgendaAppearanceProvider(drop?: true): void {\r\n if (!this.wantAgendaAppearanceOverride)\r\n return;\r\n\r\n for (const vp of IModelApp.viewManager) {\r\n if (!this.allowView(vp))\r\n continue;\r\n\r\n if (drop || this.agenda.isEmpty)\r\n vp.dropFeatureOverrideProvider(this);\r\n else if (!vp.addFeatureOverrideProvider(this))\r\n vp.setFeatureOverrideProviderChanged();\r\n }\r\n }\r\n\r\n protected clearGraphics(): void {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n this._graphicsProvider.cleanupGraphic();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n protected async createGraphics(ev: BeButtonEvent): Promise<void> {\r\n if (!IModelApp.viewManager.inDynamicsMode)\r\n return; // Don't need to create graphic if dynamics aren't yet active...\r\n\r\n const geometry = this.getGeometryProps(ev, false);\r\n if (undefined === geometry) {\r\n this.clearGraphics();\r\n return;\r\n }\r\n\r\n const elemProps = this.getElementProps(ev);\r\n if (undefined === elemProps?.placement) {\r\n this.clearGraphics();\r\n return;\r\n }\r\n\r\n if (undefined === this._graphicsProvider) {\r\n if (this._firstResult) {\r\n this.updateAgendaAppearanceProvider();\r\n this._firstResult = false;\r\n }\r\n this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);\r\n }\r\n\r\n // Set chord tolerance for non-linear/non-planar geometry...\r\n if (ev.viewport)\r\n this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);\r\n\r\n await this._graphicsProvider.createGraphic(elemProps.category, elemProps.placement, geometry);\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider(); // When Reset cycles between elements, recompute feature overrides...\r\n return super.onAgendaModified();\r\n }\r\n\r\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphic(context);\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n return this.createGraphics(ev);\r\n }\r\n\r\n public override async onUnsuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider();\r\n return super.onUnsuspend();\r\n }\r\n\r\n public override async onSuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider(true);\r\n return super.onSuspend();\r\n }\r\n\r\n public override async onPostInstall(): Promise<void> {\r\n await super.onPostInstall();\r\n if (this.wantAgendaAppearanceOverride)\r\n this.agenda.manageHiliteState = false;\r\n }\r\n\r\n public override async onCleanup(): Promise<void> {\r\n this.clearGraphics();\r\n this.updateAgendaAppearanceProvider(true);\r\n return super.onCleanup();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ModifyElementTool.js","sourceRoot":"","sources":["../../src/ModifyElementTool.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\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { Id64, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport { FeatureAppearance, FlatBufferGeometryStream, GeometricElementProps, JsonGeometryStream } from \"@itwin/core-common\";\nimport { BeButtonEvent, DynamicsContext, ElementSetTool, FeatureOverrideProvider, FeatureSymbology, HitDetail, IModelApp, LocateResponse, SelectionMethod, SelectionSet, Viewport } from \"@itwin/core-frontend\";\nimport { Point3d } from \"@itwin/core-geometry\";\nimport { computeChordToleranceFromPoint, DynamicGraphicsProvider } from \"./CreateElementTool\";\n\n/** Edit tool base class for updating existing elements.\n * @beta\n */\nexport abstract class ModifyElementTool extends ElementSetTool {\n protected readonly _checkedIds = new Map<Id64String, boolean>();\n\n protected allowView(_vp: Viewport) { return true; }\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n\n protected onGeometryFilterChanged(): void { this._checkedIds.clear(); }\n\n protected async doAcceptElementForOperation(_id: Id64String): Promise<boolean> { return false; }\n\n protected async acceptElementForOperation(id: Id64String): Promise<boolean> {\n if (Id64.isInvalid(id) || Id64.isTransient(id))\n return false;\n\n let accept = this._checkedIds.get(id);\n\n if (undefined === accept) {\n if (this.agenda.isEmpty && this._checkedIds.size > 1000)\n this._checkedIds.clear(); // Limit auto-locate cache size to something reasonable...\n\n accept = await this.doAcceptElementForOperation(id);\n this._checkedIds.set(id, accept);\n }\n\n return accept;\n }\n\n protected override async isElementValidForOperation(hit: HitDetail, out?: LocateResponse): Promise<boolean> {\n if (!await super.isElementValidForOperation(hit, out))\n return false;\n\n return this.acceptElementForOperation(hit.sourceId);\n }\n\n protected async postFilterIds(arg: Id64Arg): Promise<Id64Arg> {\n const ids: Id64Array = [];\n\n for (const id of Id64.iterable(arg)) {\n if (await this.acceptElementForOperation(id))\n ids.push(id);\n }\n\n return ids;\n }\n\n protected override async getGroupIds(id: Id64String): Promise<Id64Arg> {\n return this.postFilterIds(await super.getGroupIds(id));\n }\n\n protected override async getSelectionSetCandidates(ss: SelectionSet): Promise<Id64Arg> {\n return this.postFilterIds(await super.getSelectionSetCandidates(ss));\n }\n\n protected override async getDragSelectCandidates(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<Id64Arg> {\n return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));\n }\n\n protected setupAccuDraw(): void { }\n\n protected override setupAndPromptForNextAction(): void {\n this.setupAccuDraw();\n super.setupAndPromptForNextAction();\n }\n\n protected abstract getGeometryProps(ev: BeButtonEvent, isAccept: boolean): JsonGeometryStream | FlatBufferGeometryStream | undefined;\n protected abstract getElementProps(ev: BeButtonEvent): GeometricElementProps | undefined;\n\n protected async doUpdateElement(_props: GeometricElementProps): Promise<boolean> { return false; }\n\n protected async applyAgendaOperation(ev: BeButtonEvent): Promise<boolean> {\n const geometry = this.getGeometryProps(ev, true);\n if (undefined === geometry)\n return false;\n\n const elemProps = this.getElementProps(ev);\n if (undefined === elemProps)\n return false;\n\n if (\"flatbuffer\" === geometry.format)\n elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };\n else\n elemProps.geom = geometry.data;\n\n return this.doUpdateElement(elemProps);\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n if (await this.applyAgendaOperation(ev))\n return this.saveChanges();\n }\n}\n\n/** Edit tool base class for updating existing elements that use dynamics to show intermediate results.\n * @beta\n */\nexport abstract class ModifyElementWithDynamicsTool extends ModifyElementTool implements FeatureOverrideProvider {\n protected _graphicsProvider?: DynamicGraphicsProvider;\n protected _firstResult = true;\n protected _agendaAppearanceDefault?: FeatureAppearance;\n protected _agendaAppearanceDynamic?: FeatureAppearance;\n\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n\n protected agendaAppearance(isDynamics: boolean): FeatureAppearance {\n if (isDynamics) {\n if (undefined === this._agendaAppearanceDynamic)\n this._agendaAppearanceDynamic = FeatureAppearance.fromTransparency(0.0);\n\n return this._agendaAppearanceDynamic;\n }\n\n if (undefined === this._agendaAppearanceDefault)\n this._agendaAppearanceDefault = FeatureAppearance.fromTransparency(0.9);\n\n return this._agendaAppearanceDefault;\n }\n\n protected get wantAgendaAppearanceOverride(): boolean { return false; }\n\n public addFeatureOverrides(overrides: FeatureSymbology.Overrides, _vp: Viewport): void {\n if (this.agenda.isEmpty)\n return;\n\n const appearance = this.agendaAppearance(false);\n this.agenda.elements.forEach((elementId) => overrides.override({ elementId, appearance }));\n }\n\n protected updateAgendaAppearanceProvider(drop?: true): void {\n if (!this.wantAgendaAppearanceOverride)\n return;\n\n for (const vp of IModelApp.viewManager) {\n if (!this.allowView(vp))\n continue;\n\n if (drop || this.agenda.isEmpty)\n vp.dropFeatureOverrideProvider(this);\n else if (!vp.addFeatureOverrideProvider(this))\n vp.setFeatureOverrideProviderChanged();\n }\n }\n\n protected clearGraphics(): void {\n if (undefined === this._graphicsProvider)\n return;\n this._graphicsProvider.cleanupGraphic();\n this._graphicsProvider = undefined;\n }\n\n protected async createGraphics(ev: BeButtonEvent): Promise<void> {\n if (!IModelApp.viewManager.inDynamicsMode)\n return; // Don't need to create graphic if dynamics aren't yet active...\n\n const geometry = this.getGeometryProps(ev, false);\n if (undefined === geometry) {\n this.clearGraphics();\n return;\n }\n\n const elemProps = this.getElementProps(ev);\n if (undefined === elemProps?.placement) {\n this.clearGraphics();\n return;\n }\n\n if (undefined === this._graphicsProvider) {\n if (this._firstResult) {\n this.updateAgendaAppearanceProvider();\n this._firstResult = false;\n }\n this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);\n }\n\n // Set chord tolerance for non-linear/non-planar geometry...\n if (ev.viewport)\n this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);\n\n await this._graphicsProvider.createGraphic(elemProps.category, elemProps.placement, geometry);\n }\n\n protected override async onAgendaModified(): Promise<void> {\n if (!this._firstResult)\n this.updateAgendaAppearanceProvider(); // When Reset cycles between elements, recompute feature overrides...\n return super.onAgendaModified();\n }\n\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphic(context);\n }\n\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n return this.createGraphics(ev);\n }\n\n public override async onUnsuspend(): Promise<void> {\n if (!this._firstResult)\n this.updateAgendaAppearanceProvider();\n return super.onUnsuspend();\n }\n\n public override async onSuspend(): Promise<void> {\n if (!this._firstResult)\n this.updateAgendaAppearanceProvider(true);\n return super.onSuspend();\n }\n\n public override async onPostInstall(): Promise<void> {\n await super.onPostInstall();\n if (this.wantAgendaAppearanceOverride)\n this.agenda.manageHiliteState = false;\n }\n\n public override async onCleanup(): Promise<void> {\n this.clearGraphics();\n this.updateAgendaAppearanceProvider(true);\n return super.onCleanup();\n }\n}\n"]}
@@ -48,10 +48,7 @@ function updateMapDisplay(vp, turnOnMap) {
48
48
  vp.invalidateRenderPlan();
49
49
  }
50
50
  class ProjectExtentsControlArrow extends core_frontend_1.ViewClipControlArrow {
51
- constructor() {
52
- super(...arguments);
53
- this.extentValid = true;
54
- }
51
+ extentValid = true;
55
52
  }
56
53
  /** Values for [[ProjectExtentsClipDecoration.onChanged] event.
57
54
  * @beta
@@ -77,19 +74,32 @@ var ProjectLocationChanged;
77
74
  * @beta
78
75
  */
79
76
  class ProjectExtentsClipDecoration extends core_frontend_1.EditManipulator.HandleProvider {
77
+ viewport;
78
+ static _decorator;
79
+ _clip;
80
+ _clipId;
81
+ _clipShape;
82
+ _clipShapeExtents;
83
+ _clipRange;
84
+ _extentsLengthValid = true;
85
+ _extentsWidthValid = true;
86
+ _extentsHeightValid = true;
87
+ _ecefLocation;
88
+ _allowEcefLocationChange = false;
89
+ _controlIds = [];
90
+ _controls = [];
91
+ _monumentPoint;
92
+ _northDirection;
93
+ _monumentId;
94
+ _northId;
95
+ _suspendDecorator = false;
96
+ _removeViewCloseListener;
97
+ suspendGeolocationDecorations = false;
98
+ /** Called when project extents or geolocation is modified */
99
+ onChanged = new core_bentley_1.BeEvent();
80
100
  constructor(viewport) {
81
101
  super(viewport.iModel);
82
102
  this.viewport = viewport;
83
- this._extentsLengthValid = true;
84
- this._extentsWidthValid = true;
85
- this._extentsHeightValid = true;
86
- this._allowEcefLocationChange = false;
87
- this._controlIds = [];
88
- this._controls = [];
89
- this._suspendDecorator = false;
90
- this.suspendGeolocationDecorations = false;
91
- /** Called when project extents or geolocation is modified */
92
- this.onChanged = new core_bentley_1.BeEvent();
93
103
  if (!this.init())
94
104
  return;
95
105
  this._monumentId = this.iModel.transientIds.getNext();
@@ -103,7 +113,7 @@ class ProjectExtentsClipDecoration extends core_frontend_1.EditManipulator.Handl
103
113
  this.iModel.selectionSet.replace(this._clipId); // Always select decoration on create...
104
114
  }
105
115
  stop() {
106
- const selectedId = (undefined !== this._clipId && this.iModel.selectionSet.has(this._clipId)) ? this._clipId : undefined;
116
+ const selectedId = (undefined !== this._clipId && this.iModel.selectionSet.elements.has(this._clipId)) ? this._clipId : undefined;
107
117
  this._clipId = undefined; // Invalidate id so that decorator will be dropped...
108
118
  super.stop();
109
119
  if (undefined !== selectedId)
@@ -213,7 +223,7 @@ class ProjectExtentsClipDecoration extends core_frontend_1.EditManipulator.Handl
213
223
  }
214
224
  // Show controls if only range box and it's controls are selected, selection set doesn't include any other elements...
215
225
  let showControls = false;
216
- if (this.iModel.selectionSet.size <= this._controlIds.length + 1 && this.iModel.selectionSet.has(this._clipId)) {
226
+ if (this.iModel.selectionSet.size <= this._controlIds.length + 1 && this.iModel.selectionSet.elements.has(this._clipId)) {
217
227
  showControls = true;
218
228
  if (this.iModel.selectionSet.size > 1) {
219
229
  this.iModel.selectionSet.elements.forEach((val) => {
@@ -536,7 +546,7 @@ class ProjectExtentsClipDecoration extends core_frontend_1.EditManipulator.Handl
536
546
  const hidPts = shapePts.map((pt) => pt.clone());
537
547
  const arrowVisBuilder = context.createGraphicBuilder(core_frontend_1.GraphicType.WorldOverlay, transform, this._controlIds[iFace]);
538
548
  const arrowHidBuilder = context.createGraphicBuilder(core_frontend_1.GraphicType.WorldDecoration, transform);
539
- const isSelected = this.iModel.selectionSet.has(this._controlIds[iFace]);
549
+ const isSelected = this.iModel.selectionSet.elements.has(this._controlIds[iFace]);
540
550
  let outlineColorOvr = this._controls[iFace].outline;
541
551
  if (undefined !== outlineColorOvr) {
542
552
  outlineColorOvr = outlineColorOvr.adjustedForContrast(vp.view.backgroundColor);
@@ -729,6 +739,7 @@ exports.ProjectExtentsClipDecoration = ProjectExtentsClipDecoration;
729
739
  * @beta
730
740
  */
731
741
  class ProjectLocationShowTool extends core_frontend_1.Tool {
742
+ static toolId = "ProjectLocation.Show";
732
743
  async run() {
733
744
  const vp = core_frontend_1.IModelApp.viewManager.selectedView;
734
745
  if (undefined === vp || !ProjectExtentsClipDecoration.show(vp))
@@ -738,11 +749,11 @@ class ProjectLocationShowTool extends core_frontend_1.Tool {
738
749
  }
739
750
  }
740
751
  exports.ProjectLocationShowTool = ProjectLocationShowTool;
741
- ProjectLocationShowTool.toolId = "ProjectLocation.Show";
742
752
  /** Hide project location decoration. Preserves changes to project extents view clip and geolocation.
743
753
  * @beta
744
754
  */
745
755
  class ProjectLocationHideTool extends core_frontend_1.Tool {
756
+ static toolId = "ProjectLocation.Hide";
746
757
  async run() {
747
758
  ProjectExtentsClipDecoration.hide();
748
759
  await core_frontend_1.IModelApp.toolAdmin.startDefaultTool();
@@ -750,11 +761,11 @@ class ProjectLocationHideTool extends core_frontend_1.Tool {
750
761
  }
751
762
  }
752
763
  exports.ProjectLocationHideTool = ProjectLocationHideTool;
753
- ProjectLocationHideTool.toolId = "ProjectLocation.Hide";
754
764
  /** Clear project location decoration. Restore modified geolocation and remove view clip.
755
765
  * @beta
756
766
  */
757
767
  class ProjectLocationCancelTool extends core_frontend_1.Tool {
768
+ static toolId = "ProjectLocation.Cancel";
758
769
  async run() {
759
770
  ProjectExtentsClipDecoration.clear();
760
771
  await core_frontend_1.IModelApp.toolAdmin.startDefaultTool();
@@ -762,13 +773,13 @@ class ProjectLocationCancelTool extends core_frontend_1.Tool {
762
773
  }
763
774
  }
764
775
  exports.ProjectLocationCancelTool = ProjectLocationCancelTool;
765
- ProjectLocationCancelTool.toolId = "ProjectLocation.Cancel";
766
776
  /** Save modified project extents and geolocation. Updates decoration to reflect saved state.
767
777
  * @note Allowing this change to be undone is both problematic and undesirable.
768
778
  * Warns the user if called with previous changes to cancel restarting the TxnManager session.
769
779
  * @beta
770
780
  */
771
781
  class ProjectLocationSaveTool extends core_frontend_1.Tool {
782
+ static toolId = "ProjectLocation.Save";
772
783
  async allowRestartTxnSession(iModel) {
773
784
  if (!await iModel.txns.isUndoPossible())
774
785
  return true;
@@ -819,5 +830,4 @@ class ProjectLocationSaveTool extends core_frontend_1.Tool {
819
830
  }
820
831
  }
821
832
  exports.ProjectLocationSaveTool = ProjectLocationSaveTool;
822
- ProjectLocationSaveTool.toolId = "ProjectLocation.Save";
823
833
  //# sourceMappingURL=ProjectExtentsDecoration.js.map