@itwin/core-frontend 5.1.0-dev.61 → 5.1.0-dev.64

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 (113) hide show
  1. package/lib/cjs/AccuDraw.js +2 -2
  2. package/lib/cjs/AccuDraw.js.map +1 -1
  3. package/lib/cjs/AccuSnap.d.ts.map +1 -1
  4. package/lib/cjs/AccuSnap.js +13 -4
  5. package/lib/cjs/AccuSnap.js.map +1 -1
  6. package/lib/cjs/AuxCoordSys.js +1 -1
  7. package/lib/cjs/AuxCoordSys.js.map +1 -1
  8. package/lib/cjs/core-frontend.d.ts +1 -1
  9. package/lib/cjs/core-frontend.d.ts.map +1 -1
  10. package/lib/cjs/core-frontend.js.map +1 -1
  11. package/lib/cjs/internal/tile/RealityModelTileTree.d.ts +6 -4
  12. package/lib/cjs/internal/tile/RealityModelTileTree.d.ts.map +1 -1
  13. package/lib/cjs/internal/tile/RealityModelTileTree.js +9 -7
  14. package/lib/cjs/internal/tile/RealityModelTileTree.js.map +1 -1
  15. package/lib/cjs/internal/tile/RealityTileLoader.d.ts +2 -2
  16. package/lib/cjs/internal/tile/RealityTileLoader.d.ts.map +1 -1
  17. package/lib/cjs/internal/tile/RealityTileLoader.js +10 -2
  18. package/lib/cjs/internal/tile/RealityTileLoader.js.map +1 -1
  19. package/lib/cjs/tile/RealityTile.d.ts +4 -0
  20. package/lib/cjs/tile/RealityTile.d.ts.map +1 -1
  21. package/lib/cjs/tile/RealityTile.js +7 -0
  22. package/lib/cjs/tile/RealityTile.js.map +1 -1
  23. package/lib/cjs/tile/RealityTileTree.d.ts +4 -0
  24. package/lib/cjs/tile/RealityTileTree.d.ts.map +1 -1
  25. package/lib/cjs/tile/RealityTileTree.js +4 -0
  26. package/lib/cjs/tile/RealityTileTree.js.map +1 -1
  27. package/lib/cjs/tile/TileGeometryCollector.d.ts +5 -0
  28. package/lib/cjs/tile/TileGeometryCollector.d.ts.map +1 -1
  29. package/lib/cjs/tile/TileGeometryCollector.js.map +1 -1
  30. package/lib/cjs/tile/TileTreeReference.d.ts +16 -2
  31. package/lib/cjs/tile/TileTreeReference.d.ts.map +1 -1
  32. package/lib/cjs/tile/TileTreeReference.js +10 -4
  33. package/lib/cjs/tile/TileTreeReference.js.map +1 -1
  34. package/lib/cjs/tools/ClipViewTool.d.ts.map +1 -1
  35. package/lib/cjs/tools/ClipViewTool.js +18 -7
  36. package/lib/cjs/tools/ClipViewTool.js.map +1 -1
  37. package/lib/cjs/tools/ElementSetTool.d.ts.map +1 -1
  38. package/lib/cjs/tools/ElementSetTool.js +2 -0
  39. package/lib/cjs/tools/ElementSetTool.js.map +1 -1
  40. package/lib/cjs/tools/IdleTool.d.ts.map +1 -1
  41. package/lib/cjs/tools/IdleTool.js +4 -1
  42. package/lib/cjs/tools/IdleTool.js.map +1 -1
  43. package/lib/cjs/tools/MeasureTool.d.ts.map +1 -1
  44. package/lib/cjs/tools/MeasureTool.js +4 -2
  45. package/lib/cjs/tools/MeasureTool.js.map +1 -1
  46. package/lib/cjs/tools/PrimitiveTool.d.ts.map +1 -1
  47. package/lib/cjs/tools/PrimitiveTool.js +2 -1
  48. package/lib/cjs/tools/PrimitiveTool.js.map +1 -1
  49. package/lib/cjs/tools/ToolAdmin.d.ts.map +1 -1
  50. package/lib/cjs/tools/ToolAdmin.js +51 -16
  51. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  52. package/lib/cjs/tools/ToolAssistance.d.ts +1 -1
  53. package/lib/cjs/tools/ToolAssistance.js.map +1 -1
  54. package/lib/cjs/tools/ViewTool.d.ts.map +1 -1
  55. package/lib/cjs/tools/ViewTool.js +133 -37
  56. package/lib/cjs/tools/ViewTool.js.map +1 -1
  57. package/lib/esm/AccuDraw.js +2 -2
  58. package/lib/esm/AccuDraw.js.map +1 -1
  59. package/lib/esm/AccuSnap.d.ts.map +1 -1
  60. package/lib/esm/AccuSnap.js +13 -4
  61. package/lib/esm/AccuSnap.js.map +1 -1
  62. package/lib/esm/AuxCoordSys.js +1 -1
  63. package/lib/esm/AuxCoordSys.js.map +1 -1
  64. package/lib/esm/core-frontend.d.ts +1 -1
  65. package/lib/esm/core-frontend.d.ts.map +1 -1
  66. package/lib/esm/core-frontend.js.map +1 -1
  67. package/lib/esm/internal/tile/RealityModelTileTree.d.ts +6 -4
  68. package/lib/esm/internal/tile/RealityModelTileTree.d.ts.map +1 -1
  69. package/lib/esm/internal/tile/RealityModelTileTree.js +10 -8
  70. package/lib/esm/internal/tile/RealityModelTileTree.js.map +1 -1
  71. package/lib/esm/internal/tile/RealityTileLoader.d.ts +2 -2
  72. package/lib/esm/internal/tile/RealityTileLoader.d.ts.map +1 -1
  73. package/lib/esm/internal/tile/RealityTileLoader.js +10 -2
  74. package/lib/esm/internal/tile/RealityTileLoader.js.map +1 -1
  75. package/lib/esm/tile/RealityTile.d.ts +4 -0
  76. package/lib/esm/tile/RealityTile.d.ts.map +1 -1
  77. package/lib/esm/tile/RealityTile.js +7 -0
  78. package/lib/esm/tile/RealityTile.js.map +1 -1
  79. package/lib/esm/tile/RealityTileTree.d.ts +4 -0
  80. package/lib/esm/tile/RealityTileTree.d.ts.map +1 -1
  81. package/lib/esm/tile/RealityTileTree.js +4 -0
  82. package/lib/esm/tile/RealityTileTree.js.map +1 -1
  83. package/lib/esm/tile/TileGeometryCollector.d.ts +5 -0
  84. package/lib/esm/tile/TileGeometryCollector.d.ts.map +1 -1
  85. package/lib/esm/tile/TileGeometryCollector.js.map +1 -1
  86. package/lib/esm/tile/TileTreeReference.d.ts +16 -2
  87. package/lib/esm/tile/TileTreeReference.d.ts.map +1 -1
  88. package/lib/esm/tile/TileTreeReference.js +10 -4
  89. package/lib/esm/tile/TileTreeReference.js.map +1 -1
  90. package/lib/esm/tools/ClipViewTool.d.ts.map +1 -1
  91. package/lib/esm/tools/ClipViewTool.js +18 -7
  92. package/lib/esm/tools/ClipViewTool.js.map +1 -1
  93. package/lib/esm/tools/ElementSetTool.d.ts.map +1 -1
  94. package/lib/esm/tools/ElementSetTool.js +2 -0
  95. package/lib/esm/tools/ElementSetTool.js.map +1 -1
  96. package/lib/esm/tools/IdleTool.d.ts.map +1 -1
  97. package/lib/esm/tools/IdleTool.js +4 -1
  98. package/lib/esm/tools/IdleTool.js.map +1 -1
  99. package/lib/esm/tools/MeasureTool.d.ts.map +1 -1
  100. package/lib/esm/tools/MeasureTool.js +4 -2
  101. package/lib/esm/tools/MeasureTool.js.map +1 -1
  102. package/lib/esm/tools/PrimitiveTool.d.ts.map +1 -1
  103. package/lib/esm/tools/PrimitiveTool.js +2 -1
  104. package/lib/esm/tools/PrimitiveTool.js.map +1 -1
  105. package/lib/esm/tools/ToolAdmin.d.ts.map +1 -1
  106. package/lib/esm/tools/ToolAdmin.js +51 -16
  107. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  108. package/lib/esm/tools/ToolAssistance.d.ts +1 -1
  109. package/lib/esm/tools/ToolAssistance.js.map +1 -1
  110. package/lib/esm/tools/ViewTool.d.ts.map +1 -1
  111. package/lib/esm/tools/ViewTool.js +133 -37
  112. package/lib/esm/tools/ViewTool.js.map +1 -1
  113. package/package.json +20 -20
@@ -1 +1 @@
1
- {"version":3,"file":"ElementSetTool.d.ts","sourceRoot":"","sources":["../../../src/tools/ElementSetTool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ElementSetTool.d.ts","sourceRoot":"","sources":["../../../src/tools/ElementSetTool.ts"],"names":[],"mappings":"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"}
@@ -104,6 +104,8 @@ export class ElementAgenda {
104
104
  return;
105
105
  }
106
106
  const group = this.groupMarks.pop();
107
+ if (undefined === group)
108
+ return;
107
109
  this.setEntriesHiliteState(false, group.start, this.length); // make sure removed entries aren't left hilited...
108
110
  this.elements.splice(group.start);
109
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ElementSetTool.js","sourceRoot":"","sources":["../../../src/tools/ElementSetTool.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 Tools\n */\n\nimport { BentleyStatus, CompressedId64Set, Id64, Id64Arg, Id64Array, Id64String, OrderedId64Array } from \"@itwin/core-bentley\";\nimport { ColorDef, GeometryContainmentRequestProps, QueryRowFormat } from \"@itwin/core-common\";\nimport { ClipPlane, ClipPlaneContainment, ClipPrimitive, ClipUtilities, ClipVector, ConvexClipPlaneSet, Point2d, Point3d, Range2d, Vector3d, XAndY } from \"@itwin/core-geometry\";\nimport { AccuDrawHintBuilder } from \"../AccuDraw\";\nimport { LocateFilterStatus, LocateResponse } from \"../ElementLocateManager\";\nimport { HitDetail } from \"../HitDetail\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { NotifyMessageDetails, OutputMessagePriority } from \"../NotificationManager\";\nimport { Pixel } from \"../render/Pixel\";\nimport { SelectionSet } from \"../SelectionSet\";\nimport { DecorateContext } from \"../ViewContext\";\nimport { Viewport } from \"../Viewport\";\nimport { ViewRect } from \"../common/ViewRect\";\nimport { PrimitiveTool } from \"./PrimitiveTool\";\nimport { SelectionMethod } from \"./SelectTool\";\nimport { BeButton, BeButtonEvent, BeModifierKeys, CoreTools, EventHandled } from \"./Tool\";\nimport { ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection } from \"./ToolAssistance\";\nimport { ToolSettings } from \"./ToolSettings\";\n\n/** Identifies the source of the elements in the agenda.\n * @public\n */\nexport enum ModifyElementSource {\n /** The source for the element is unknown - not caused by a modification command. */\n Unknown = 0,\n /** The element is selected by the user. */\n Selected = 1,\n /** The element is processed because it is in the selection set. */\n SelectionSet = 2, // eslint-disable-line @typescript-eslint/no-shadow\n /** The element is selected by the user using drag box or crossing line selection. */\n DragSelect = 3,\n}\n\n/** Identifies groups of elements added to agenda along with the source.\n * @public\n */\nexport interface GroupMark {\n start: number;\n source: ModifyElementSource;\n}\n\n/** The ElementAgenda class is used by [[ElementSetTool]] to hold the collection of elements it will operate on\n * and to manage their hilite state.\n * @see [[ElementSetTool]]\n * @public\n*/\nexport class ElementAgenda {\n /** The IDs of the elements in this agenda.\n * @note Prefer methods like [[ElementAgenda.add]] instead of modifying directly.\n */\n public readonly elements: Id64Array = [];\n /** The group source identifiers for the elements in this agenda.\n * @note Prefer methods like [[ElementAgenda.add]] instead of modifying directly.\n */\n public readonly groupMarks: GroupMark[] = [];\n public manageHiliteState = true; // Whether entries are hilited/unhilited as they are added/removed...\n public constructor(public iModel: IModelConnection) { }\n\n /** Get the source for the last group added to this agenda, if applicable. The \"source\" is merely an indication of what the collection of elements represents. */\n public getSource() {\n return this.groupMarks.length === 0 ? ModifyElementSource.Unknown : this.groupMarks[this.groupMarks.length - 1].source;\n }\n\n /** Set the source for the last group added to this agenda. */\n public setSource(val: ModifyElementSource) {\n if (this.groupMarks.length > 0)\n this.groupMarks[this.groupMarks.length - 1].source = val;\n }\n\n public get isEmpty() { return this.length === 0; }\n public get count() { return this.length; }\n public get length() { return this.elements.length; }\n\n /** Create [[OrderedId64Array]] from agenda. */\n public orderIds(): OrderedId64Array {\n const ids = new OrderedId64Array();\n this.elements.forEach((id) => ids.insert(id));\n return ids;\n }\n\n /** Create [[CompressedId64Set]] from agenda. */\n public compressIds(): CompressedId64Set {\n const ids = this.orderIds();\n return CompressedId64Set.compressIds(ids);\n }\n\n /** Empties the agenda and clears hilite state when manageHiliteState is true. */\n public clear() {\n this.setEntriesHiliteState(false);\n this.elements.length = 0;\n this.groupMarks.length = 0;\n }\n\n private setEntriesHiliteState(onOff: boolean, groupStart = 0, groupEnd = 0) {\n if (!this.manageHiliteState)\n return;\n\n const ss = this.iModel.selectionSet.elements.size > 0 ? this.iModel.selectionSet.elements : undefined;\n if (undefined === ss && 0 === groupEnd) {\n this.iModel.hilited[onOff ? \"add\" : \"remove\"]({ elements: this.elements });\n return;\n }\n\n const shouldChangeHilite = (id: string, index: number) => {\n if (undefined !== ss && ss.has(id))\n return false; // Don't turn hilite on/off for elements in current selection set...\n return (0 === groupEnd || (index >= groupStart && index < groupEnd));\n };\n\n const group = this.elements.filter((id, index) => shouldChangeHilite(id, index));\n this.iModel.hilited[onOff ? \"add\" : \"remove\"]({ elements: group });\n }\n\n /** Removes the last group of elements added to this agenda. */\n public popGroup() {\n if (this.groupMarks.length <= 1) {\n this.clear();\n return;\n }\n const group = this.groupMarks.pop()!;\n this.setEntriesHiliteState(false, group.start, this.length); // make sure removed entries aren't left hilited...\n this.elements.splice(group.start);\n }\n\n /** Return true if elementId is already in this agenda. */\n public has(id: string) { return this.elements.some((entry) => id === entry); }\n\n /** Return true if elementId is already in this agenda. */\n public find(id: Id64String) { return this.has(id); }\n\n /** Add elements to this agenda. */\n public add(arg: Id64Arg) {\n const groupStart = this.length;\n for (const id of Id64.iterable(arg))\n if (!this.has(id))\n this.elements.push(id);\n\n if (groupStart === this.length)\n return false;\n\n this.groupMarks.push({ start: groupStart, source: ModifyElementSource.Unknown });\n this.setEntriesHiliteState(true, groupStart, this.length);\n\n return true;\n }\n\n private removeOne(id: string) {\n let pos = -1;\n const elements = this.elements;\n const groupMarks = this.groupMarks;\n\n elements.some((entry, index) => {\n if (id !== entry)\n return false;\n\n pos = index;\n return true;\n });\n\n if (pos === -1)\n return false;\n\n if (1 === elements.length || (1 === groupMarks.length && ModifyElementSource.DragSelect !== groupMarks[groupMarks.length - 1].source)) {\n this.clear();\n return true;\n }\n\n const groupIndex = pos;\n let groupStart = 0, groupEnd = 0;\n let markToErase = 0;\n let removeSingleEntry = false;\n\n for (let iMark = 0; iMark < groupMarks.length; ++iMark) {\n if (0 === groupEnd) {\n if (iMark + 1 === groupMarks.length) {\n markToErase = iMark;\n removeSingleEntry = (ModifyElementSource.DragSelect === groupMarks[iMark].source);\n groupStart = groupMarks[iMark].start;\n groupEnd = elements.length;\n } else if (groupMarks[iMark].start <= groupIndex && groupMarks[iMark + 1].start > groupIndex) {\n markToErase = iMark;\n removeSingleEntry = (ModifyElementSource.DragSelect === groupMarks[iMark].source);\n groupStart = groupMarks[iMark].start;\n groupEnd = groupMarks[iMark + 1].start;\n }\n\n continue;\n }\n\n if (removeSingleEntry)\n groupMarks[iMark].start -= 1; // Only removing single entry, not entire group...\n else\n groupMarks[iMark].start -= (groupEnd - groupStart); // Adjust indices...\n }\n\n if (removeSingleEntry) { // Only remove single entry...\n this.setEntriesHiliteState(false, groupIndex, groupIndex + 1); // make sure removed entry isn't left hilited...\n\n elements.splice(groupIndex, 1);\n\n if (groupEnd === groupStart + 1)\n groupMarks.splice(markToErase, 1);\n\n return true;\n }\n\n this.setEntriesHiliteState(false, groupStart, groupEnd); // make sure removed entries aren't left hilited...\n\n elements.splice(groupStart, groupEnd - groupStart);\n groupMarks.splice(markToErase, 1);\n return true;\n }\n\n public remove(arg: Id64Arg) {\n if (0 === this.length)\n return false;\n\n if (0 === Id64.sizeOf(arg))\n return false;\n\n let changed = false;\n for (const elId of Id64.iterable(arg))\n if (this.removeOne(elId))\n changed = true; // NOTE: Removes group associated with this element, not just a single entry...\n\n return changed;\n }\n\n /** Add elements not currently in the agenda and remove elements currently in the agenda. */\n public invert(arg: Id64Arg) {\n if (0 === this.length)\n return this.add(arg);\n\n if (0 === Id64.sizeOf(arg))\n return false;\n\n const adds: string[] = [];\n const removes: string[] = [];\n for (const id of Id64.iterable(arg)) {\n if (this.has(id))\n removes.push(id);\n else\n adds.push(id);\n }\n\n if (adds.length === 0 && removes.length === 0)\n return false;\n\n removes.forEach((id) => this.removeOne(id));\n\n if (adds.length > 0) {\n const groupStart = this.length;\n adds.forEach((id) => this.elements.push(id));\n this.groupMarks.push({ start: groupStart, source: ModifyElementSource.Unknown });\n\n this.setEntriesHiliteState(true, groupStart, this.length); // make sure added entries are hilited (when not also removing)...\n }\n\n return true;\n }\n}\n\n/** The ElementSetTool class is a specialization of [[PrimitiveTool]] designed to unify operations on sets of elements.\n * Use to query or modify existing elements as well as to create new elements from existing elements.\n * Basic tool sequence:\n * - Populate [[ElementSetTool.agenda]] with the element ids to query or modify.\n * - Gather any additional input and if requested, enable dynamics to preview result.\n * - Call [[ElementSetTool.processAgenda]] to apply operation to [[ElementSetTool.agenda]].\n * - Call [[ElementSetTool.onProcessComplete]] to restart or exit.\n * Common element sources:\n * - Pre-selected elements from an active [[SelectionSet]].\n * - Clicking in a view to identify elements using [[ElementLocateManager]].\n * - Drag box and crossing line selection.\n * Default behavior:\n * - Identify a single element with left-click.\n * - Immediately apply operation.\n * - Restart.\n * Sub-classes are required to opt-in to additional element sources, dynamics, AccuSnap, additional input, etc.\n * @public\n */\nexport abstract class ElementSetTool extends PrimitiveTool {\n private _agenda?: ElementAgenda;\n private _useSelectionSet: boolean = false;\n private _processDataButtonUp: boolean = false;\n /** The accept point for a selection set, drag select, or final located element. */\n protected anchorPoint?: Point3d;\n /** The button down location that initiated box or crossing line selection. */\n protected dragStartPoint?: Point3d;\n\n /** Get the [[ElementAgenda]] the tool will operate on. */\n protected get agenda(): ElementAgenda {\n if (undefined === this._agenda)\n this._agenda = new ElementAgenda(this.iModel);\n return this._agenda;\n }\n\n /** Convenience method to get current count from [[ElementSetTool.agenda]]. */\n protected get currentElementCount(): number { return undefined !== this._agenda ? this._agenda.count : 0; }\n\n /** Minimum required number of elements for tool to be able to complete.\n * @return number to compare with [[ElementSetTool.currentElementCount]] to determine if more elements remain to be identified.\n * @note A tool to subtract elements is an example where returning 2 would be necessary.\n */\n protected get requiredElementCount(): number { return 1; }\n\n /** Whether to allow element identification by drag box or crossing line selection.\n * @return true to allow drag select as an element source when the ctrl key is down.\n * @note Use ctrl+left drag for box selection. Inside/overlap is based on left/right direction (shift key inverts).\n * @note Use ctrl+right drag for crossing line selection.\n */\n protected get allowDragSelect(): boolean { return false; }\n\n /** Support operations on groups/assemblies independent of selection scope.\n * @return true to add or remove all members of an assembly from [[ElementSetTool.agenda]] when any single member is identified.\n * @note Applies to [[ElementSetTool.getLocateCandidates]] only.\n */\n protected get allowGroups(): boolean { return false; }\n\n /** Whether [[ElementSetTool.agenda]] should be populated from an active selection set.\n * @return true to allow selection sets as an element source.\n * @note A selection set must have at least [[ElementSetTool.requiredElementCount]] elements to be considered.\n */\n protected get allowSelectionSet(): boolean { return false; }\n\n /** Whether to clear the active selection set for tools that return false for [[ElementSetTool.allowSelectionSet]].\n * @return true to clear unsupported selection sets (desired default behavior).\n * @note It is expected that the selection set be cleared before using [[ElementLocateManager]] to identify elements.\n * This allows the element hilite to be a visual representation of the [[ElementSetTool.agenda]] contents.\n */\n protected get clearSelectionSet(): boolean { return !this.allowSelectionSet; }\n\n /** Whether a selection set should be processed immediately upon installation or require a data button to accept.\n * @return false only for tools without settings or a need for confirmation.\n * @note A tool to delete elements is an example where returning false could be desirable.\n */\n protected get requireAcceptForSelectionSetOperation(): boolean { return true; }\n\n /** Whether to begin dynamics for a selection set immediately or wait for a data button.\n * @return false for tools that can start showing dynamics without any additional input.\n * @note A tool to rotate elements by an active angle setting is an example where returning false could be desirable.\n */\n protected get requireAcceptForSelectionSetDynamics(): boolean { return true; }\n\n /** Whether original source of elements being modified was the active selection set.\n * @return true when [[ElementSetTool.allowSelectionSet]] and active selection set count >= [[ElementSetTool.requiredElementCount]].\n */\n protected get isSelectionSetModify(): boolean { return this._useSelectionSet; }\n\n /** Whether drag box or crossing line selection is currently active.\n * @return true when [[ElementSetTool.allowDragSelect]] and corner points are currently being defined.\n */\n protected get isSelectByPoints(): boolean { return undefined !== this.dragStartPoint; }\n\n /** Whether to continue selection of additional elements by holding the ctrl key down.\n * @return true to continue the element identification phase beyond [[ElementSetTool.requiredElementCount]] by holding down the ctrl key.\n */\n protected get controlKeyContinuesSelection(): boolean { return false; }\n\n /** Whether to invert selection of elements identified with the ctrl key held down.\n * @return true to allow ctrl to deselect already selected elements.\n */\n protected get controlKeyInvertsSelection(): boolean { return this.controlKeyContinuesSelection; }\n\n /** Whether [[ElementSetTool.setupAndPromptForNextAction]] should call [[AccuSnap.enableSnap]] for current tool phase.\n * @return true to enable snapping to elements.\n * @note A tool that just needs to identify elements and doesn't care about location should not enable snapping.\n */\n protected get wantAccuSnap(): boolean { return false; }\n\n /** Whether to automatically start element dynamics after all required elements have been identified.\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 done identifying elements and is ready to move to the next phase.\n * @return true when [[ElementSetTool.requiredElementCount]] is not yet satisfied or ctrl key is being used to extend selection.\n */\n protected get wantAdditionalElements(): boolean {\n if (this.isSelectionSetModify)\n return false;\n\n if (this.currentElementCount < this.requiredElementCount)\n return true;\n\n // A defined anchor indicates input collection phase has begun and ctrl should no longer extend selection...\n return undefined === this.anchorPoint && this.controlKeyContinuesSelection && this.isControlDown;\n }\n\n /** Whether the tool has gathered enough input to call [[ElementSetTool.processAgenda]].\n * Sub-classes should override to check for additional point input they collected in [[ElementSetTool.wantProcessAgenda]].\n * @return true if tool does not yet have enough information to complete.\n * @note When [[ElementSetTool.wantDynamics]] is true an additional point is automatically required to support the dynamic preview.\n */\n protected get wantAdditionalInput(): boolean { return (!this.isDynamicsStarted && this.wantDynamics); }\n\n /** Whether the tool is ready for [[ElementSetTool.processAgenda]] to be called to complete the tool operation.\n * Sub-classes should override to collect additional point input before calling super or [[ElementSetTool.wantAdditionalInput]].\n * @return true if tool has enough information and is ready to complete.\n */\n protected wantProcessAgenda(_ev: BeButtonEvent): boolean { return !this.wantAdditionalInput; }\n\n /** Whether tool should operate on an existing selection set or instead prompt user to identity elements.\n * Unsupported selection sets will be cleared when [[ElementSetTool.clearSelectionSet]] is true.\n */\n protected setPreferredElementSource(): void {\n this._useSelectionSet = false;\n if (!this.iModel.selectionSet.isActive)\n return;\n\n const isSelectionSetValid = (): boolean => {\n if (0 === this.iModel.selectionSet.elements.size) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, CoreTools.translate(\"ElementSet.Error.ActiveSSWithoutElems\")));\n return false;\n }\n\n return (this.iModel.selectionSet.elements.size >= this.requiredElementCount);\n };\n\n if (this.allowSelectionSet && isSelectionSetValid())\n this._useSelectionSet = true;\n else if (this.clearSelectionSet)\n this.iModel.selectionSet.emptyAll();\n }\n\n /** Get element ids to process from the active selection set.\n * Sub-classes may override to support selection scopes or apply tool specific filtering.\n */\n protected async getSelectionSetCandidates(ss: SelectionSet): Promise<Id64Arg> {\n const ids = new Set<Id64String>();\n ss.elements.forEach((val) => {\n if (this.isElementIdValid(val, ModifyElementSource.SelectionSet))\n ids.add(val);\n });\n\n return ids;\n }\n\n /** Populate [[ElementSetTool.agenda]] from a [[SelectionSet]].\n * @see [[ElementSetTool.getSelectionSetCandidates]] to filter or augment the set of elements.\n */\n protected async buildSelectionSetAgenda(ss: SelectionSet): Promise<boolean> {\n const candidates = await this.getSelectionSetCandidates(ss);\n\n if (Id64.sizeOf(candidates) < this.requiredElementCount || !this.agenda.add(candidates)) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, CoreTools.translate(\"ElementSet.Error.NoSSElems\")));\n return false;\n }\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n await this.onAgendaModified();\n return true;\n }\n\n /** If the supplied element is part of an assembly, return all member ids. */\n protected async getGroupIds(id: Id64String): Promise<Id64Arg> {\n const ids = new Set<Id64String>();\n ids.add(id);\n\n try {\n // When assembly parent is selected, pick all geometric elements with it as the parent.\n // When assembly member is selected, pick the parent as well as all the other members.\n const ecsql = `SELECT ECInstanceId as id, Parent.Id as parentId FROM BisCore.GeometricElement WHERE Parent.Id IN (SELECT Parent.Id as parentId FROM BisCore.GeometricElement WHERE (parent.Id IS NOT NULL AND ECInstanceId IN (${id})) OR parent.Id IN (${id}))`;\n for await (const row of this.iModel.createQueryReader(ecsql, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n ids.add(row.parentId as Id64String);\n ids.add(row.id as Id64String);\n }\n } catch { }\n\n return ids;\n }\n\n /** Get element id(s) to process from a [[HitDetail]] already accepted by [[ElementSetTool.isElementValidForOperation]].\n * Sub-classes may override to support selection scopes.\n */\n protected async getLocateCandidates(hit: HitDetail): Promise<Id64Arg> {\n if (!this.allowGroups)\n return hit.sourceId;\n\n return this.getGroupIds(hit.sourceId);\n }\n\n /** Populate [[ElementSetTool.agenda]] from a [[HitDetail]].\n * @see [[ElementSetTool.getLocateCandidates]] to add additional elements.\n */\n protected async buildLocateAgenda(hit: HitDetail): Promise<boolean> {\n if (this.agenda.find(hit.sourceId)) {\n if (this.isControlDown && this.controlKeyInvertsSelection && this.agenda.remove(hit.sourceId)) {\n await this.onAgendaModified();\n return true;\n }\n return false;\n }\n\n const candidates = await this.getLocateCandidates(hit);\n\n if (!this.agenda.add(candidates))\n return false;\n\n this.agenda.setSource(ModifyElementSource.Selected);\n await this.onAgendaModified();\n return true;\n }\n\n /** Get ids of spatial elements to process from a clip volume created by drag box selection. */\n private static async getVolumeSelectionCandidates(vp: Viewport, origin: XAndY, corner: XAndY, allowOverlaps: boolean, filter?: (id: Id64String) => boolean): Promise<Set<Id64String>> {\n const contents = new Set<Id64String>();\n if (!vp.view.isSpatialView())\n return contents;\n\n const boxRange = Range2d.createXYXY(origin.x, origin.y, corner.x, corner.y);\n if (boxRange.isNull || boxRange.isAlmostZeroX || boxRange.isAlmostZeroY)\n return contents;\n\n const getClipPlane = (viewPt: Point2d, viewDir: Vector3d, negate: boolean): ClipPlane | undefined => {\n const point = vp.viewToWorld(Point3d.createFrom(viewPt));\n const boresite = AccuDrawHintBuilder.getBoresite(point, vp);\n const normal = viewDir.crossProduct(boresite.direction);\n\n if (negate)\n normal.negate(normal);\n\n return ClipPlane.createNormalAndPoint(normal, point)\n };\n\n const planeSet = ConvexClipPlaneSet.createEmpty();\n\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.low, vp.rotation.rowX(), true));\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.low, vp.rotation.rowY(), true));\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.high, vp.rotation.rowX(), false));\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.high, vp.rotation.rowY(), false));\n\n if (0 === planeSet.planes.length)\n return contents;\n\n const clip = ClipVector.createCapture([ClipPrimitive.createCapture(planeSet)]);\n const viewRange = vp.computeViewRange();\n const range = ClipUtilities.rangeOfClipperIntersectionWithRange(clip, viewRange);\n\n if (range.isNull)\n return contents;\n\n // TODO: Possible to make UnionOfComplexClipPlaneSets from view clip and planes work and remove 2nd containment check?\n const viewClip = (vp.viewFlags.clipVolume ? vp.view.getViewClip()?.clone() : undefined);\n if (viewClip) {\n const viewClipRange = ClipUtilities.rangeOfClipperIntersectionWithRange(viewClip, viewRange);\n if (viewClipRange.isNull || !viewClipRange.intersectsRange(range))\n return contents;\n }\n\n const candidates: Id64Array = [];\n const categories = new Set<Id64String>();\n\n try {\n const viewedModels = [...vp.view.modelSelector.models].join(\",\");\n const viewedCategories = [...vp.view.categorySelector.categories].join(\",\");\n const ecsql = `SELECT e.ECInstanceId, Category.Id as category FROM bis.SpatialElement e JOIN bis.SpatialIndex i ON e.ECInstanceId=i.ECInstanceId WHERE Model.Id IN (${viewedModels}) AND Category.Id IN (${viewedCategories}) AND i.MinX <= ${range.xHigh} AND i.MinY <= ${range.yHigh} AND i.MinZ <= ${range.zHigh} AND i.MaxX >= ${range.xLow} AND i.MaxY >= ${range.yLow} AND i.MaxZ >= ${range.zLow}`;\n const reader = vp.iModel.createQueryReader(ecsql, undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyNames });\n\n for await (const row of reader) {\n candidates.push(row.ECInstanceId);\n categories.add(row.category);\n }\n } catch { }\n\n if (0 === candidates.length)\n return contents;\n\n let offSubCategories: Id64Array | undefined;\n if (0 !== categories.size) {\n for (const categoryId of categories) {\n const subcategories = vp.iModel.subcategories.getSubCategories(categoryId);\n if (undefined === subcategories)\n continue;\n\n for (const subCategoryId of subcategories) {\n const appearance = vp.iModel.subcategories.getSubCategoryAppearance(subCategoryId);\n if (undefined === appearance || (!appearance.invisible && !appearance.dontLocate))\n continue;\n\n if (undefined === offSubCategories)\n offSubCategories = new Array<Id64String>;\n offSubCategories.push(subCategoryId);\n }\n }\n }\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates,\n clip: clip.toJSON(),\n allowOverlaps,\n viewFlags: vp.viewFlags.toJSON(),\n offSubCategories,\n };\n\n const result = await vp.iModel.getGeometryContainment(requestProps);\n if (BentleyStatus.SUCCESS !== result.status || undefined === result.candidatesContainment)\n return contents;\n\n result.candidatesContainment.forEach((status: ClipPlaneContainment, index: number) => {\n if (ClipPlaneContainment.StronglyOutside !== status && (undefined === filter || filter(candidates[index])))\n contents.add(candidates[index]);\n });\n\n if (0 !== contents.size && viewClip) {\n requestProps.clip = viewClip.toJSON();\n requestProps.candidates.length = 0;\n for (const id of contents)\n requestProps.candidates.push(id);\n contents.clear();\n\n const resultViewClip = await vp.iModel.getGeometryContainment(requestProps);\n if (BentleyStatus.SUCCESS !== resultViewClip.status || undefined === resultViewClip.candidatesContainment)\n return contents;\n\n resultViewClip.candidatesContainment.forEach((status: ClipPlaneContainment, index: number) => {\n if (ClipPlaneContainment.StronglyOutside !== status)\n contents.add(candidates[index]);\n });\n }\n\n return contents;\n }\n\n /** Get ids of visible elements to process from drag box or crossing line selection. */\n private static getAreaSelectionCandidates(vp: Viewport, origin: XAndY, corner: XAndY, method: SelectionMethod, allowOverlaps: boolean, filter?: (id: Id64String) => boolean): Set<Id64String> {\n let contents = new Set<Id64String>();\n\n const pts: Point2d[] = [];\n pts[0] = new Point2d(Math.floor(origin.x + 0.5), Math.floor(origin.y + 0.5));\n pts[1] = new Point2d(Math.floor(corner.x + 0.5), Math.floor(corner.y + 0.5));\n const range = Range2d.createArray(pts);\n\n const rect = new ViewRect();\n rect.initFromRange(range);\n vp.readPixels(rect, Pixel.Selector.Feature, (pixels) => {\n if (undefined === pixels)\n return;\n\n const sRange = Range2d.createNull();\n sRange.extendPoint(Point2d.create(vp.cssPixelsToDevicePixels(range.low.x), vp.cssPixelsToDevicePixels(range.low.y)));\n sRange.extendPoint(Point2d.create(vp.cssPixelsToDevicePixels(range.high.x), vp.cssPixelsToDevicePixels(range.high.y)));\n\n pts[0].x = vp.cssPixelsToDevicePixels(pts[0].x);\n pts[0].y = vp.cssPixelsToDevicePixels(pts[0].y);\n\n pts[1].x = vp.cssPixelsToDevicePixels(pts[1].x);\n pts[1].y = vp.cssPixelsToDevicePixels(pts[1].y);\n\n const testPoint = Point2d.createZero();\n\n const getPixelElementId = (pixel: Pixel.Data) => {\n if (undefined === pixel.elementId || Id64.isInvalid(pixel.elementId))\n return undefined; // no geometry at this location...\n\n if (!vp.isPixelSelectable(pixel))\n return undefined; // reality model, terrain, etc - not selectable\n\n if (undefined !== filter && !filter(pixel.elementId))\n return undefined;\n\n return pixel.elementId;\n };\n\n if (SelectionMethod.Box === method) {\n const outline = allowOverlaps ? undefined : new Set<string>();\n const offset = sRange.clone();\n offset.expandInPlace(-2);\n for (testPoint.x = sRange.low.x; testPoint.x <= sRange.high.x; ++testPoint.x) {\n for (testPoint.y = sRange.low.y; testPoint.y <= sRange.high.y; ++testPoint.y) {\n const pixel = pixels.getPixel(testPoint.x, testPoint.y);\n const elementId = getPixelElementId(pixel);\n if (undefined === elementId)\n continue;\n\n if (undefined !== outline && !offset.containsPoint(testPoint))\n outline.add(elementId.toString());\n else\n contents.add(elementId.toString());\n }\n }\n if (undefined !== outline && 0 !== outline.size) {\n const inside = new Set<string>();\n contents.forEach((id) => {\n if (!outline.has(id))\n inside.add(id);\n });\n\n contents = inside;\n }\n } else {\n const closePoint = Point2d.createZero();\n for (testPoint.x = sRange.low.x; testPoint.x <= sRange.high.x; ++testPoint.x) {\n for (testPoint.y = sRange.low.y; testPoint.y <= sRange.high.y; ++testPoint.y) {\n const pixel = pixels.getPixel(testPoint.x, testPoint.y);\n const elementId = getPixelElementId(pixel);\n if (undefined === elementId)\n continue;\n\n const fraction = testPoint.fractionOfProjectionToLine(pts[0], pts[1], 0.0);\n pts[0].interpolate(fraction, pts[1], closePoint);\n if (closePoint.distance(testPoint) < 1.5)\n contents.add(elementId.toString());\n }\n }\n }\n }, true);\n\n return contents;\n }\n\n /** Get ids of elements to process from drag box or crossing line selection using either the depth buffer or clip vector...\n * @internal\n */\n public static async getAreaOrVolumeSelectionCandidates(vp: Viewport, origin: XAndY, corner: XAndY, method: SelectionMethod, allowOverlaps: boolean, filter?: (id: Id64String) => boolean, includeDecorationsForVolume?: boolean): Promise<Set<Id64String>> {\n let contents;\n\n if (ToolSettings.enableVolumeSelection && SelectionMethod.Box === method && vp.view.isSpatialView()) {\n contents = await ElementSetTool.getVolumeSelectionCandidates(vp, origin, corner, allowOverlaps, filter);\n\n // Use area select to identify pickable transients...\n if (includeDecorationsForVolume) {\n const acceptTransientsFilter = (id: Id64String) => { return Id64.isTransient(id) && (undefined === filter || filter(id)); };\n const transients = ElementSetTool.getAreaSelectionCandidates(vp, origin, corner, method, allowOverlaps, acceptTransientsFilter);\n for (const id of transients)\n contents.add(id);\n }\n } else {\n contents = ElementSetTool.getAreaSelectionCandidates(vp, origin, corner, method, allowOverlaps, filter);\n }\n\n return contents;\n }\n\n /** Get element ids to process from drag box or crossing line selection.\n * Sub-classes may override to support selection scopes or apply tool specific filtering.\n */\n protected async getDragSelectCandidates(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<Id64Arg> {\n const filter = (id: Id64String) => { return this.isElementIdValid(id, ModifyElementSource.DragSelect); };\n return ElementSetTool.getAreaOrVolumeSelectionCandidates(vp, origin, corner, method, overlap, filter, IModelApp.locateManager.options.allowDecorations);\n }\n\n /** Populate [[ElementSetTool.agenda]] by drag box or crossing line information.\n * @see [[ElementSetTool.getDragSelectCandidates]] to filter or augment the set of elements.\n */\n protected async buildDragSelectAgenda(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<boolean> {\n const candidates = await this.getDragSelectCandidates(vp, origin, corner, method, overlap);\n\n if (!this.isControlDown || !this.controlKeyInvertsSelection) {\n if (!this.agenda.add(candidates))\n return false;\n } else {\n if (!this.agenda.invert(candidates))\n return false;\n }\n\n if (ModifyElementSource.Unknown === this.agenda.getSource())\n this.agenda.setSource(ModifyElementSource.DragSelect); // Don't set source if invert only removed entries...\n\n await this.onAgendaModified();\n return true;\n }\n\n /** Quick id validity check. Sub-classes that wish to allow pickable decorations from selection sets can override. */\n protected isElementIdValid(id: Id64String, source: ModifyElementSource): boolean {\n switch (source) {\n case ModifyElementSource.Selected:\n return true; // Locate options already checked prior to calling isElementValidForOperation...\n case ModifyElementSource.SelectionSet:\n return (!Id64.isInvalid(id) && !Id64.isTransient(id)); // Locate options are invalid, locate isn't enabled when processing a selection set...\n case ModifyElementSource.DragSelect:\n return (!Id64.isInvalid(id) && (IModelApp.locateManager.options.allowDecorations || !Id64.isTransient(id))); // Locate options are valid but have not yet been checked...\n default:\n return false;\n }\n }\n\n /** Sub-classes should override to apply tool specific filtering and to provide an explanation for rejection. */\n protected async isElementValidForOperation(hit: HitDetail, _out?: LocateResponse): Promise<boolean> {\n return this.isElementIdValid(hit.sourceId, ModifyElementSource.Selected);\n }\n\n /** Called from [[ElementSetTool.doLocate]] as well as auto-locate to accept or reject elements under the cursor. */\n public override async filterHit(hit: HitDetail, out?: LocateResponse): Promise<LocateFilterStatus> {\n // Support deselect using control key and don't show \"not\" cursor over an already selected element...\n if (undefined !== this._agenda && this._agenda.find(hit.sourceId)) {\n const status = (this.isControlDown || !this.controlKeyInvertsSelection) ? LocateFilterStatus.Accept : LocateFilterStatus.Reject;\n if (out && LocateFilterStatus.Reject === status)\n out.explanation = CoreTools.translate(`ElementSet.Error.AlreadySelected`);\n return status;\n }\n\n return await this.isElementValidForOperation(hit, out) ? LocateFilterStatus.Accept : LocateFilterStatus.Reject;\n }\n\n /** Identify an element and update the element agenda.\n * @param newSearch true to locate new elements, false to cycle between elements within locate tolerance from a previous locate.\n * @return true if [[ElementSetTool.agenda]] was changed.\n */\n protected async doLocate(ev: BeButtonEvent, newSearch: boolean): Promise<boolean> {\n const hit = await IModelApp.locateManager.doLocate(new LocateResponse(), newSearch, ev.point, ev.viewport, ev.inputSource);\n\n if (newSearch)\n return (undefined !== hit && this.buildLocateAgenda(hit));\n\n // If next element is already in agenda (part of a group, etc.) don't re-add group...\n const addNext = (undefined !== hit && !this.agenda.has(hit.sourceId));\n this.agenda.popGroup();\n\n if (!addNext || !await this.buildLocateAgenda(hit))\n await this.onAgendaModified(); // only change was popGroup...\n\n return true;\n }\n\n /** Whether drag box selection only identifies elements that are wholly inside or also allows those that overlap\n * the selection rectangle.\n * @note Inside/overlap is based on left/right direction of corner points (shift key inverts check).\n */\n protected useOverlapSelection(ev: BeButtonEvent): boolean {\n if (undefined === ev.viewport || undefined === this.dragStartPoint)\n return false;\n const pt1 = ev.viewport.worldToView(this.dragStartPoint);\n const pt2 = ev.viewport.worldToView(ev.point);\n const overlapMode = (pt1.x > pt2.x);\n return (ev.isShiftKey ? !overlapMode : overlapMode); // Shift inverts inside/overlap selection...\n }\n\n /** Initiate tool state for start of drag selection. */\n protected async selectByPointsStart(ev: BeButtonEvent): Promise<boolean> {\n if (BeButton.Data !== ev.button && BeButton.Reset !== ev.button)\n return false;\n\n if (!ev.isControlKey || !this.allowDragSelect || !this.wantAdditionalElements)\n return false;\n\n this.dragStartPoint = ev.point.clone();\n this.setupAndPromptForNextAction();\n return true;\n }\n\n /** Finish drag selection and update [[ElementSetTool.agenda]] with any elements that may have been identified. */\n protected async selectByPointsEnd(ev: BeButtonEvent): Promise<boolean> {\n if (undefined === this.dragStartPoint)\n return false;\n\n const vp = ev.viewport;\n if (vp === undefined) {\n this.dragStartPoint = undefined;\n this.setupAndPromptForNextAction();\n return false;\n }\n\n const origin = vp.worldToView(this.dragStartPoint);\n const corner = vp.worldToView(ev.point);\n if (BeButton.Reset === ev.button)\n await this.buildDragSelectAgenda(vp, origin, corner, SelectionMethod.Line, true);\n else\n await this.buildDragSelectAgenda(vp, origin, corner, SelectionMethod.Box, this.useOverlapSelection(ev));\n\n this.dragStartPoint = undefined;\n this.setupAndPromptForNextAction();\n vp.invalidateDecorations();\n return true;\n }\n\n /** Display drag box and crossing line selection graphics. */\n protected selectByPointsDecorate(context: DecorateContext): void {\n if (undefined === this.dragStartPoint)\n return;\n\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n if (undefined === ev.viewport)\n return;\n\n const vp = context.viewport;\n const bestContrastIsBlack = (ColorDef.black === vp.getContrastToBackgroundColor());\n const crossingLine = (BeButton.Reset === ev.button);\n const overlapSelection = (crossingLine || this.useOverlapSelection(ev));\n\n const position = vp.worldToView(this.dragStartPoint);\n position.x = Math.floor(position.x) + 0.5;\n position.y = Math.floor(position.y) + 0.5;\n const position2 = vp.worldToView(ev.point);\n position2.x = Math.floor(position2.x) + 0.5;\n position2.y = Math.floor(position2.y) + 0.5;\n const offset = position2.minus(position);\n\n const drawDecoration = (ctx: CanvasRenderingContext2D) => {\n ctx.strokeStyle = bestContrastIsBlack ? \"black\" : \"white\";\n ctx.lineWidth = 1;\n if (overlapSelection)\n ctx.setLineDash([5, 5]);\n\n if (crossingLine) {\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(offset.x, offset.y);\n ctx.stroke();\n } else {\n ctx.strokeRect(0, 0, offset.x, offset.y);\n ctx.fillStyle = bestContrastIsBlack ? \"rgba(0,0,0,.06)\" : \"rgba(255,255,255,.06)\";\n ctx.fillRect(0, 0, offset.x, offset.y);\n }\n };\n context.addCanvasDecoration({ position, drawDecoration });\n }\n\n /** Show graphics for when drag selection is active. */\n public override decorate(context: DecorateContext): void { this.selectByPointsDecorate(context); }\n\n /** Make sure drag selection graphics are updated when mouse moves. */\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (undefined !== ev.viewport && this.isSelectByPoints)\n ev.viewport.invalidateDecorations();\n }\n\n /** Support initiating drag selection on mouse start drag event when [[ElementSetTool.allowDragSelect]] is true. */\n public override async onMouseStartDrag(ev: BeButtonEvent): Promise<EventHandled> {\n if (await this.selectByPointsStart(ev))\n return EventHandled.Yes;\n return super.onMouseStartDrag(ev);\n }\n\n /** Support completing active drag selection on mouse end drag event and update [[ElementSetTool.agenda]]. */\n public override async onMouseEndDrag(ev: BeButtonEvent): Promise<EventHandled> {\n if (await this.selectByPointsEnd(ev))\n return EventHandled.Yes;\n return super.onMouseEndDrag(ev);\n }\n\n /** Update prompts, cursor, graphics, etc. as appropriate on ctrl and shift key transitions. */\n public override async onModifierKeyTransition(_wentDown: boolean, modifier: BeModifierKeys, _event: KeyboardEvent): Promise<EventHandled> {\n if (this.isSelectionSetModify)\n return EventHandled.No;\n\n if (this.isSelectByPoints)\n return (BeModifierKeys.Shift === modifier ? EventHandled.Yes : EventHandled.No);\n\n if (BeModifierKeys.Control !== modifier || undefined !== this.anchorPoint || !this.controlKeyContinuesSelection)\n return EventHandled.No;\n\n if (this.currentElementCount < this.requiredElementCount && !this.wantAccuSnap)\n return EventHandled.No; // Can only early return if AccuSnap doesn't need to be disabled for ctrl selection...\n\n this.setupAndPromptForNextAction(); // Enable/disable auto-locate, AccuSnap, update prompts...\n return EventHandled.Yes;\n }\n\n /** Allow reset to cycle between elements identified for overlapping the locate circle.\n * Advances to next pre-located hit from [[AccuSnap.aSnapHits]] or changes last accepted hit to next hit from [[ElementLocateManger.hitList]].\n * @returns EventHandled.Yes if onReinitialize was called to restart or exit tool.\n */\n protected async chooseNextHit(ev: BeButtonEvent): Promise<EventHandled> {\n if (this.isSelectionSetModify) {\n await this.onReinitialize();\n return EventHandled.Yes;\n }\n\n if (0 !== this.currentElementCount) {\n let autoLocateChooseNext = false;\n\n if (this.wantAdditionalElements) {\n const lastHit = IModelApp.locateManager.currHit;\n const autoHit = IModelApp.accuSnap.currHit;\n\n // Choose next using auto-locate or normal locate?\n if (undefined !== autoHit && (undefined === lastHit || !autoHit.isSameHit(lastHit)))\n autoLocateChooseNext = true;\n }\n\n if (!autoLocateChooseNext) {\n await this.doLocate(ev, false);\n\n if (this.agenda.isEmpty) {\n await this.onReinitialize();\n return EventHandled.Yes;\n }\n\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n }\n\n await IModelApp.accuSnap.resetButton();\n return EventHandled.No;\n }\n\n /** Orchestrates updating the internal state of the tool on a reset button event.\n * @returns EventHandled.Yes if onReinitialize was called to restart or exit tool.\n */\n protected async processResetButton(ev: BeButtonEvent): Promise<EventHandled> {\n if (ev.isDown)\n return EventHandled.No;\n\n return this.chooseNextHit(ev);\n }\n\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processResetButton(ev);\n }\n\n public override async onResetButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processResetButton(ev);\n }\n\n /** Collect element input until tool has a sufficient number to complete. */\n protected async gatherElements(ev: BeButtonEvent): Promise<EventHandled | undefined> {\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty && !await this.buildSelectionSetAgenda(this.iModel.selectionSet)) {\n await this.onReinitialize();\n return EventHandled.Yes;\n }\n }\n\n if (this.wantAdditionalElements) {\n if (ev.isDown && ev.isControlKey && this.allowDragSelect) {\n this._processDataButtonUp = true;\n return EventHandled.No; // Defer locate to up event so that box select can be initiated while over an element...\n }\n\n if (!await this.doLocate(ev, true))\n return EventHandled.No;\n\n if (this.wantAdditionalElements) {\n this.setupAndPromptForNextAction();\n return EventHandled.No; // Continue identifying elements...\n }\n }\n\n return undefined;\n }\n\n /** Collect point input until tool has a sufficient number to complete. */\n protected async gatherInput(ev: BeButtonEvent): Promise<EventHandled | undefined> {\n if (undefined === this.anchorPoint) {\n this.anchorPoint = ev.point.clone();\n\n const hints = new AccuDrawHintBuilder();\n\n hints.setOriginAlways = true;\n hints.setOrigin(this.anchorPoint);\n hints.sendHints(false); // Default activation on start of dynamics...\n }\n\n if (!this.wantProcessAgenda(ev)) {\n if (this.wantDynamics)\n await this.initAgendaDynamics();\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n\n return undefined;\n }\n\n /** Orchestrates advancing the internal state of the tool on a data button event.\n * - Collect elements: Add to the element agenda until no additional elements are requested.\n * - Gather input: Initiates element dynamics and accepts additional points as required.\n * - Complete operation: Process agenda entries, 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 (!ev.isDown && !this._processDataButtonUp)\n return EventHandled.No;\n this._processDataButtonUp = false;\n\n const elementStatus = await this.gatherElements(ev);\n if (undefined !== elementStatus)\n return elementStatus;\n\n const inputStatus = await this.gatherInput(ev);\n if (undefined !== inputStatus)\n return inputStatus;\n\n await this.processAgenda(ev);\n await this.onProcessComplete();\n return EventHandled.Yes;\n }\n\n public override async onDataButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processDataButton(ev);\n }\n\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processDataButton(ev);\n }\n\n protected async initAgendaDynamics(): Promise<boolean> {\n if (this.isDynamicsStarted)\n return false;\n this.beginDynamics();\n return true;\n }\n\n /** Sub-classes can override to be notified of [[ElementSetTool.agenda]] changes by other methods.\n * @note Tools should not modify [[ElementSetTool.agenda]] in this method, it should merely serve as a convenient place\n * to update information, such as element graphics once dynamics has started, ex. [[ElementSetTool.chooseNextHit]].\n */\n protected async onAgendaModified(): Promise<void> { }\n\n /** Sub-classes can override to continue with current [[ElementSetTool.agenda]] or restart after processing has completed. */\n protected async onProcessComplete(): Promise<void> { return this.onReinitialize(); }\n\n /** Sub-classes that return false for [[ElementSetTool.requireAcceptForSelectionSetOperation]] should override to apply the tool operation to [[ElementSetTool.agenda]]. */\n protected async processAgendaImmediate(): Promise<void> { }\n\n /** Sub-classes that require and use the accept point should override to apply the tool operation to [[ElementSetTool.agenda]].\n * @note Not called for [[ElementSetTool.isSelectionSetModify]] when [[ElementSetTool.requireAcceptForSelectionSetOperation]] is false.\n */\n protected async processAgenda(_ev: BeButtonEvent): Promise<void> { return this.processAgendaImmediate(); }\n\n /** Support either [[ElementSetTool.requireAcceptForSelectionSetOperation]] or [[ElementSetTool.requireAcceptForSelectionSetDynamics]] returning false. */\n protected async doProcessSelectionSetImmediate(): Promise<void> {\n const buildImmediate = (!this.requireAcceptForSelectionSetOperation || (this.wantDynamics && !this.requireAcceptForSelectionSetDynamics));\n if (!buildImmediate)\n return;\n\n if (!await this.buildSelectionSetAgenda(this.iModel.selectionSet))\n return this.onReinitialize();\n\n if (!this.requireAcceptForSelectionSetOperation) {\n await this.processAgendaImmediate();\n await this.onProcessComplete();\n } else {\n await this.initAgendaDynamics();\n }\n }\n\n /** Setup initial element state, prompts, check [[SelectionSet]], etc. */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setPreferredElementSource();\n this.setupAndPromptForNextAction();\n\n if (this.isSelectionSetModify)\n await this.doProcessSelectionSetImmediate();\n }\n\n /** Make sure elements from [[ElementSetTool.agenda]] that aren't also from [[SelectionSet]] aren't left hilited. */\n public override async onCleanup() {\n await super.onCleanup();\n if (undefined !== this._agenda)\n this._agenda.clear();\n }\n\n /** Exit and start default tool when [[ElementSetTool.isSelectionSetModify]] is true to allow [[SelectionSet]] to be modified,\n * or call [[PrimitiveTool.onRestartTool]] to install a new tool instance.\n */\n public override async onReinitialize() {\n if (this.isSelectionSetModify)\n return this.exitTool();\n\n return this.onRestartTool();\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 protected get shouldEnableLocate(): boolean { return this.isSelectByPoints ? false : this.wantAdditionalElements; }\n protected get shouldEnableSnap(): boolean { return this.isSelectByPoints ? false : (this.wantAccuSnap && (!this.isControlDown || !this.controlKeyContinuesSelection || !this.wantAdditionalElements)); }\n\n /** Setup auto-locate, AccuSnap, AccuDraw, and supply tool assistance. */\n protected setupAndPromptForNextAction(): void {\n this.initLocateElements(this.shouldEnableLocate, this.shouldEnableSnap);\n this.provideToolAssistance();\n }\n\n /** Sub-classes should override to provide tool specific instructions. */\n protected provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\n let mainMsg;\n let leftMsg;\n let rightMsg;\n let addDragInstr = false;\n\n if (this.isSelectionSetModify) {\n if (this.wantAdditionalInput) {\n mainMsg = \"ElementSet.Prompts.IdentifyPoint\";\n leftMsg = \"ElementSet.Inputs.AcceptPoint\";\n rightMsg = \"ElementSet.Inputs.Exit\";\n } else if (0 === this.currentElementCount) {\n mainMsg = \"ElementSet.Prompts.ConfirmSelection\";\n leftMsg = \"ElementSet.Inputs.AcceptSelection\";\n rightMsg = \"ElementSet.Inputs.RejectSelection\";\n } else {\n mainMsg = \"ElementSet.Inputs.Complete\";\n leftMsg = \"ElementSet.Inputs.Accept\";\n rightMsg = \"ElementSet.Inputs.Exit\";\n }\n } else {\n if (this.isSelectByPoints) {\n mainMsg = \"ElementSet.Prompts.OppositeCorner\";\n leftMsg = \"ElementSet.Inputs.BoxCorners\";\n rightMsg = \"ElementSet.Inputs.CrossingLine\";\n } else if (this.wantAdditionalElements) {\n mainMsg = \"ElementSet.Prompts.IdentifyElement\";\n leftMsg = \"ElementSet.Inputs.AcceptElement\";\n rightMsg = \"ElementSet.Inputs.Cancel\";\n addDragInstr = this.allowDragSelect;\n } else if (this.wantAdditionalInput) {\n mainMsg = \"ElementSet.Prompts.IdentifyPoint\";\n leftMsg = \"ElementSet.Inputs.AcceptPoint\";\n rightMsg = \"ElementSet.Inputs.Cancel\";\n } else {\n mainMsg = \"ElementSet.Inputs.Complete\";\n leftMsg = \"ElementSet.Inputs.Accept\";\n rightMsg = \"ElementSet.Inputs.Restart\";\n }\n }\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 (addDragInstr) {\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.LeftClickDrag, CoreTools.translate(\"ElementSet.Inputs.BoxCorners\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.RightClickDrag, CoreTools.translate(\"ElementSet.Inputs.CrossingLine\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.shiftKey, ToolAssistanceImage.LeftClickDrag, CoreTools.translate(\"ElementSet.Inputs.OverlapSelection\"), false, ToolAssistanceInputMethod.Mouse));\n }\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"]}
1
+ {"version":3,"file":"ElementSetTool.js","sourceRoot":"","sources":["../../../src/tools/ElementSetTool.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 Tools\n */\n\nimport { BentleyStatus, CompressedId64Set, Id64, Id64Arg, Id64Array, Id64String, OrderedId64Array } from \"@itwin/core-bentley\";\nimport { ColorDef, GeometryContainmentRequestProps, QueryRowFormat } from \"@itwin/core-common\";\nimport { ClipPlane, ClipPlaneContainment, ClipPrimitive, ClipUtilities, ClipVector, ConvexClipPlaneSet, Point2d, Point3d, Range2d, Vector3d, XAndY } from \"@itwin/core-geometry\";\nimport { AccuDrawHintBuilder } from \"../AccuDraw\";\nimport { LocateFilterStatus, LocateResponse } from \"../ElementLocateManager\";\nimport { HitDetail } from \"../HitDetail\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { NotifyMessageDetails, OutputMessagePriority } from \"../NotificationManager\";\nimport { Pixel } from \"../render/Pixel\";\nimport { SelectionSet } from \"../SelectionSet\";\nimport { DecorateContext } from \"../ViewContext\";\nimport { Viewport } from \"../Viewport\";\nimport { ViewRect } from \"../common/ViewRect\";\nimport { PrimitiveTool } from \"./PrimitiveTool\";\nimport { SelectionMethod } from \"./SelectTool\";\nimport { BeButton, BeButtonEvent, BeModifierKeys, CoreTools, EventHandled } from \"./Tool\";\nimport { ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection } from \"./ToolAssistance\";\nimport { ToolSettings } from \"./ToolSettings\";\n\n/** Identifies the source of the elements in the agenda.\n * @public\n */\nexport enum ModifyElementSource {\n /** The source for the element is unknown - not caused by a modification command. */\n Unknown = 0,\n /** The element is selected by the user. */\n Selected = 1,\n /** The element is processed because it is in the selection set. */\n SelectionSet = 2, // eslint-disable-line @typescript-eslint/no-shadow\n /** The element is selected by the user using drag box or crossing line selection. */\n DragSelect = 3,\n}\n\n/** Identifies groups of elements added to agenda along with the source.\n * @public\n */\nexport interface GroupMark {\n start: number;\n source: ModifyElementSource;\n}\n\n/** The ElementAgenda class is used by [[ElementSetTool]] to hold the collection of elements it will operate on\n * and to manage their hilite state.\n * @see [[ElementSetTool]]\n * @public\n*/\nexport class ElementAgenda {\n /** The IDs of the elements in this agenda.\n * @note Prefer methods like [[ElementAgenda.add]] instead of modifying directly.\n */\n public readonly elements: Id64Array = [];\n /** The group source identifiers for the elements in this agenda.\n * @note Prefer methods like [[ElementAgenda.add]] instead of modifying directly.\n */\n public readonly groupMarks: GroupMark[] = [];\n public manageHiliteState = true; // Whether entries are hilited/unhilited as they are added/removed...\n public constructor(public iModel: IModelConnection) { }\n\n /** Get the source for the last group added to this agenda, if applicable. The \"source\" is merely an indication of what the collection of elements represents. */\n public getSource() {\n return this.groupMarks.length === 0 ? ModifyElementSource.Unknown : this.groupMarks[this.groupMarks.length - 1].source;\n }\n\n /** Set the source for the last group added to this agenda. */\n public setSource(val: ModifyElementSource) {\n if (this.groupMarks.length > 0)\n this.groupMarks[this.groupMarks.length - 1].source = val;\n }\n\n public get isEmpty() { return this.length === 0; }\n public get count() { return this.length; }\n public get length() { return this.elements.length; }\n\n /** Create [[OrderedId64Array]] from agenda. */\n public orderIds(): OrderedId64Array {\n const ids = new OrderedId64Array();\n this.elements.forEach((id) => ids.insert(id));\n return ids;\n }\n\n /** Create [[CompressedId64Set]] from agenda. */\n public compressIds(): CompressedId64Set {\n const ids = this.orderIds();\n return CompressedId64Set.compressIds(ids);\n }\n\n /** Empties the agenda and clears hilite state when manageHiliteState is true. */\n public clear() {\n this.setEntriesHiliteState(false);\n this.elements.length = 0;\n this.groupMarks.length = 0;\n }\n\n private setEntriesHiliteState(onOff: boolean, groupStart = 0, groupEnd = 0) {\n if (!this.manageHiliteState)\n return;\n\n const ss = this.iModel.selectionSet.elements.size > 0 ? this.iModel.selectionSet.elements : undefined;\n if (undefined === ss && 0 === groupEnd) {\n this.iModel.hilited[onOff ? \"add\" : \"remove\"]({ elements: this.elements });\n return;\n }\n\n const shouldChangeHilite = (id: string, index: number) => {\n if (undefined !== ss && ss.has(id))\n return false; // Don't turn hilite on/off for elements in current selection set...\n return (0 === groupEnd || (index >= groupStart && index < groupEnd));\n };\n\n const group = this.elements.filter((id, index) => shouldChangeHilite(id, index));\n this.iModel.hilited[onOff ? \"add\" : \"remove\"]({ elements: group });\n }\n\n /** Removes the last group of elements added to this agenda. */\n public popGroup() {\n if (this.groupMarks.length <= 1) {\n this.clear();\n return;\n }\n const group = this.groupMarks.pop();\n if (undefined === group)\n return;\n\n this.setEntriesHiliteState(false, group.start, this.length); // make sure removed entries aren't left hilited...\n this.elements.splice(group.start);\n }\n\n /** Return true if elementId is already in this agenda. */\n public has(id: string) { return this.elements.some((entry) => id === entry); }\n\n /** Return true if elementId is already in this agenda. */\n public find(id: Id64String) { return this.has(id); }\n\n /** Add elements to this agenda. */\n public add(arg: Id64Arg) {\n const groupStart = this.length;\n for (const id of Id64.iterable(arg))\n if (!this.has(id))\n this.elements.push(id);\n\n if (groupStart === this.length)\n return false;\n\n this.groupMarks.push({ start: groupStart, source: ModifyElementSource.Unknown });\n this.setEntriesHiliteState(true, groupStart, this.length);\n\n return true;\n }\n\n private removeOne(id: string) {\n let pos = -1;\n const elements = this.elements;\n const groupMarks = this.groupMarks;\n\n elements.some((entry, index) => {\n if (id !== entry)\n return false;\n\n pos = index;\n return true;\n });\n\n if (pos === -1)\n return false;\n\n if (1 === elements.length || (1 === groupMarks.length && ModifyElementSource.DragSelect !== groupMarks[groupMarks.length - 1].source)) {\n this.clear();\n return true;\n }\n\n const groupIndex = pos;\n let groupStart = 0, groupEnd = 0;\n let markToErase = 0;\n let removeSingleEntry = false;\n\n for (let iMark = 0; iMark < groupMarks.length; ++iMark) {\n if (0 === groupEnd) {\n if (iMark + 1 === groupMarks.length) {\n markToErase = iMark;\n removeSingleEntry = (ModifyElementSource.DragSelect === groupMarks[iMark].source);\n groupStart = groupMarks[iMark].start;\n groupEnd = elements.length;\n } else if (groupMarks[iMark].start <= groupIndex && groupMarks[iMark + 1].start > groupIndex) {\n markToErase = iMark;\n removeSingleEntry = (ModifyElementSource.DragSelect === groupMarks[iMark].source);\n groupStart = groupMarks[iMark].start;\n groupEnd = groupMarks[iMark + 1].start;\n }\n\n continue;\n }\n\n if (removeSingleEntry)\n groupMarks[iMark].start -= 1; // Only removing single entry, not entire group...\n else\n groupMarks[iMark].start -= (groupEnd - groupStart); // Adjust indices...\n }\n\n if (removeSingleEntry) { // Only remove single entry...\n this.setEntriesHiliteState(false, groupIndex, groupIndex + 1); // make sure removed entry isn't left hilited...\n\n elements.splice(groupIndex, 1);\n\n if (groupEnd === groupStart + 1)\n groupMarks.splice(markToErase, 1);\n\n return true;\n }\n\n this.setEntriesHiliteState(false, groupStart, groupEnd); // make sure removed entries aren't left hilited...\n\n elements.splice(groupStart, groupEnd - groupStart);\n groupMarks.splice(markToErase, 1);\n return true;\n }\n\n public remove(arg: Id64Arg) {\n if (0 === this.length)\n return false;\n\n if (0 === Id64.sizeOf(arg))\n return false;\n\n let changed = false;\n for (const elId of Id64.iterable(arg))\n if (this.removeOne(elId))\n changed = true; // NOTE: Removes group associated with this element, not just a single entry...\n\n return changed;\n }\n\n /** Add elements not currently in the agenda and remove elements currently in the agenda. */\n public invert(arg: Id64Arg) {\n if (0 === this.length)\n return this.add(arg);\n\n if (0 === Id64.sizeOf(arg))\n return false;\n\n const adds: string[] = [];\n const removes: string[] = [];\n for (const id of Id64.iterable(arg)) {\n if (this.has(id))\n removes.push(id);\n else\n adds.push(id);\n }\n\n if (adds.length === 0 && removes.length === 0)\n return false;\n\n removes.forEach((id) => this.removeOne(id));\n\n if (adds.length > 0) {\n const groupStart = this.length;\n adds.forEach((id) => this.elements.push(id));\n this.groupMarks.push({ start: groupStart, source: ModifyElementSource.Unknown });\n\n this.setEntriesHiliteState(true, groupStart, this.length); // make sure added entries are hilited (when not also removing)...\n }\n\n return true;\n }\n}\n\n/** The ElementSetTool class is a specialization of [[PrimitiveTool]] designed to unify operations on sets of elements.\n * Use to query or modify existing elements as well as to create new elements from existing elements.\n * Basic tool sequence:\n * - Populate [[ElementSetTool.agenda]] with the element ids to query or modify.\n * - Gather any additional input and if requested, enable dynamics to preview result.\n * - Call [[ElementSetTool.processAgenda]] to apply operation to [[ElementSetTool.agenda]].\n * - Call [[ElementSetTool.onProcessComplete]] to restart or exit.\n * Common element sources:\n * - Pre-selected elements from an active [[SelectionSet]].\n * - Clicking in a view to identify elements using [[ElementLocateManager]].\n * - Drag box and crossing line selection.\n * Default behavior:\n * - Identify a single element with left-click.\n * - Immediately apply operation.\n * - Restart.\n * Sub-classes are required to opt-in to additional element sources, dynamics, AccuSnap, additional input, etc.\n * @public\n */\nexport abstract class ElementSetTool extends PrimitiveTool {\n private _agenda?: ElementAgenda;\n private _useSelectionSet: boolean = false;\n private _processDataButtonUp: boolean = false;\n /** The accept point for a selection set, drag select, or final located element. */\n protected anchorPoint?: Point3d;\n /** The button down location that initiated box or crossing line selection. */\n protected dragStartPoint?: Point3d;\n\n /** Get the [[ElementAgenda]] the tool will operate on. */\n protected get agenda(): ElementAgenda {\n if (undefined === this._agenda)\n this._agenda = new ElementAgenda(this.iModel);\n return this._agenda;\n }\n\n /** Convenience method to get current count from [[ElementSetTool.agenda]]. */\n protected get currentElementCount(): number { return undefined !== this._agenda ? this._agenda.count : 0; }\n\n /** Minimum required number of elements for tool to be able to complete.\n * @return number to compare with [[ElementSetTool.currentElementCount]] to determine if more elements remain to be identified.\n * @note A tool to subtract elements is an example where returning 2 would be necessary.\n */\n protected get requiredElementCount(): number { return 1; }\n\n /** Whether to allow element identification by drag box or crossing line selection.\n * @return true to allow drag select as an element source when the ctrl key is down.\n * @note Use ctrl+left drag for box selection. Inside/overlap is based on left/right direction (shift key inverts).\n * @note Use ctrl+right drag for crossing line selection.\n */\n protected get allowDragSelect(): boolean { return false; }\n\n /** Support operations on groups/assemblies independent of selection scope.\n * @return true to add or remove all members of an assembly from [[ElementSetTool.agenda]] when any single member is identified.\n * @note Applies to [[ElementSetTool.getLocateCandidates]] only.\n */\n protected get allowGroups(): boolean { return false; }\n\n /** Whether [[ElementSetTool.agenda]] should be populated from an active selection set.\n * @return true to allow selection sets as an element source.\n * @note A selection set must have at least [[ElementSetTool.requiredElementCount]] elements to be considered.\n */\n protected get allowSelectionSet(): boolean { return false; }\n\n /** Whether to clear the active selection set for tools that return false for [[ElementSetTool.allowSelectionSet]].\n * @return true to clear unsupported selection sets (desired default behavior).\n * @note It is expected that the selection set be cleared before using [[ElementLocateManager]] to identify elements.\n * This allows the element hilite to be a visual representation of the [[ElementSetTool.agenda]] contents.\n */\n protected get clearSelectionSet(): boolean { return !this.allowSelectionSet; }\n\n /** Whether a selection set should be processed immediately upon installation or require a data button to accept.\n * @return false only for tools without settings or a need for confirmation.\n * @note A tool to delete elements is an example where returning false could be desirable.\n */\n protected get requireAcceptForSelectionSetOperation(): boolean { return true; }\n\n /** Whether to begin dynamics for a selection set immediately or wait for a data button.\n * @return false for tools that can start showing dynamics without any additional input.\n * @note A tool to rotate elements by an active angle setting is an example where returning false could be desirable.\n */\n protected get requireAcceptForSelectionSetDynamics(): boolean { return true; }\n\n /** Whether original source of elements being modified was the active selection set.\n * @return true when [[ElementSetTool.allowSelectionSet]] and active selection set count >= [[ElementSetTool.requiredElementCount]].\n */\n protected get isSelectionSetModify(): boolean { return this._useSelectionSet; }\n\n /** Whether drag box or crossing line selection is currently active.\n * @return true when [[ElementSetTool.allowDragSelect]] and corner points are currently being defined.\n */\n protected get isSelectByPoints(): boolean { return undefined !== this.dragStartPoint; }\n\n /** Whether to continue selection of additional elements by holding the ctrl key down.\n * @return true to continue the element identification phase beyond [[ElementSetTool.requiredElementCount]] by holding down the ctrl key.\n */\n protected get controlKeyContinuesSelection(): boolean { return false; }\n\n /** Whether to invert selection of elements identified with the ctrl key held down.\n * @return true to allow ctrl to deselect already selected elements.\n */\n protected get controlKeyInvertsSelection(): boolean { return this.controlKeyContinuesSelection; }\n\n /** Whether [[ElementSetTool.setupAndPromptForNextAction]] should call [[AccuSnap.enableSnap]] for current tool phase.\n * @return true to enable snapping to elements.\n * @note A tool that just needs to identify elements and doesn't care about location should not enable snapping.\n */\n protected get wantAccuSnap(): boolean { return false; }\n\n /** Whether to automatically start element dynamics after all required elements have been identified.\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 done identifying elements and is ready to move to the next phase.\n * @return true when [[ElementSetTool.requiredElementCount]] is not yet satisfied or ctrl key is being used to extend selection.\n */\n protected get wantAdditionalElements(): boolean {\n if (this.isSelectionSetModify)\n return false;\n\n if (this.currentElementCount < this.requiredElementCount)\n return true;\n\n // A defined anchor indicates input collection phase has begun and ctrl should no longer extend selection...\n return undefined === this.anchorPoint && this.controlKeyContinuesSelection && this.isControlDown;\n }\n\n /** Whether the tool has gathered enough input to call [[ElementSetTool.processAgenda]].\n * Sub-classes should override to check for additional point input they collected in [[ElementSetTool.wantProcessAgenda]].\n * @return true if tool does not yet have enough information to complete.\n * @note When [[ElementSetTool.wantDynamics]] is true an additional point is automatically required to support the dynamic preview.\n */\n protected get wantAdditionalInput(): boolean { return (!this.isDynamicsStarted && this.wantDynamics); }\n\n /** Whether the tool is ready for [[ElementSetTool.processAgenda]] to be called to complete the tool operation.\n * Sub-classes should override to collect additional point input before calling super or [[ElementSetTool.wantAdditionalInput]].\n * @return true if tool has enough information and is ready to complete.\n */\n protected wantProcessAgenda(_ev: BeButtonEvent): boolean { return !this.wantAdditionalInput; }\n\n /** Whether tool should operate on an existing selection set or instead prompt user to identity elements.\n * Unsupported selection sets will be cleared when [[ElementSetTool.clearSelectionSet]] is true.\n */\n protected setPreferredElementSource(): void {\n this._useSelectionSet = false;\n if (!this.iModel.selectionSet.isActive)\n return;\n\n const isSelectionSetValid = (): boolean => {\n if (0 === this.iModel.selectionSet.elements.size) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, CoreTools.translate(\"ElementSet.Error.ActiveSSWithoutElems\")));\n return false;\n }\n\n return (this.iModel.selectionSet.elements.size >= this.requiredElementCount);\n };\n\n if (this.allowSelectionSet && isSelectionSetValid())\n this._useSelectionSet = true;\n else if (this.clearSelectionSet)\n this.iModel.selectionSet.emptyAll();\n }\n\n /** Get element ids to process from the active selection set.\n * Sub-classes may override to support selection scopes or apply tool specific filtering.\n */\n protected async getSelectionSetCandidates(ss: SelectionSet): Promise<Id64Arg> {\n const ids = new Set<Id64String>();\n ss.elements.forEach((val) => {\n if (this.isElementIdValid(val, ModifyElementSource.SelectionSet))\n ids.add(val);\n });\n\n return ids;\n }\n\n /** Populate [[ElementSetTool.agenda]] from a [[SelectionSet]].\n * @see [[ElementSetTool.getSelectionSetCandidates]] to filter or augment the set of elements.\n */\n protected async buildSelectionSetAgenda(ss: SelectionSet): Promise<boolean> {\n const candidates = await this.getSelectionSetCandidates(ss);\n\n if (Id64.sizeOf(candidates) < this.requiredElementCount || !this.agenda.add(candidates)) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, CoreTools.translate(\"ElementSet.Error.NoSSElems\")));\n return false;\n }\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n await this.onAgendaModified();\n return true;\n }\n\n /** If the supplied element is part of an assembly, return all member ids. */\n protected async getGroupIds(id: Id64String): Promise<Id64Arg> {\n const ids = new Set<Id64String>();\n ids.add(id);\n\n try {\n // When assembly parent is selected, pick all geometric elements with it as the parent.\n // When assembly member is selected, pick the parent as well as all the other members.\n const ecsql = `SELECT ECInstanceId as id, Parent.Id as parentId FROM BisCore.GeometricElement WHERE Parent.Id IN (SELECT Parent.Id as parentId FROM BisCore.GeometricElement WHERE (parent.Id IS NOT NULL AND ECInstanceId IN (${id})) OR parent.Id IN (${id}))`;\n for await (const row of this.iModel.createQueryReader(ecsql, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n ids.add(row.parentId as Id64String);\n ids.add(row.id as Id64String);\n }\n } catch { }\n\n return ids;\n }\n\n /** Get element id(s) to process from a [[HitDetail]] already accepted by [[ElementSetTool.isElementValidForOperation]].\n * Sub-classes may override to support selection scopes.\n */\n protected async getLocateCandidates(hit: HitDetail): Promise<Id64Arg> {\n if (!this.allowGroups)\n return hit.sourceId;\n\n return this.getGroupIds(hit.sourceId);\n }\n\n /** Populate [[ElementSetTool.agenda]] from a [[HitDetail]].\n * @see [[ElementSetTool.getLocateCandidates]] to add additional elements.\n */\n protected async buildLocateAgenda(hit: HitDetail): Promise<boolean> {\n if (this.agenda.find(hit.sourceId)) {\n if (this.isControlDown && this.controlKeyInvertsSelection && this.agenda.remove(hit.sourceId)) {\n await this.onAgendaModified();\n return true;\n }\n return false;\n }\n\n const candidates = await this.getLocateCandidates(hit);\n\n if (!this.agenda.add(candidates))\n return false;\n\n this.agenda.setSource(ModifyElementSource.Selected);\n await this.onAgendaModified();\n return true;\n }\n\n /** Get ids of spatial elements to process from a clip volume created by drag box selection. */\n private static async getVolumeSelectionCandidates(vp: Viewport, origin: XAndY, corner: XAndY, allowOverlaps: boolean, filter?: (id: Id64String) => boolean): Promise<Set<Id64String>> {\n const contents = new Set<Id64String>();\n if (!vp.view.isSpatialView())\n return contents;\n\n const boxRange = Range2d.createXYXY(origin.x, origin.y, corner.x, corner.y);\n if (boxRange.isNull || boxRange.isAlmostZeroX || boxRange.isAlmostZeroY)\n return contents;\n\n const getClipPlane = (viewPt: Point2d, viewDir: Vector3d, negate: boolean): ClipPlane | undefined => {\n const point = vp.viewToWorld(Point3d.createFrom(viewPt));\n const boresite = AccuDrawHintBuilder.getBoresite(point, vp);\n const normal = viewDir.crossProduct(boresite.direction);\n\n if (negate)\n normal.negate(normal);\n\n return ClipPlane.createNormalAndPoint(normal, point)\n };\n\n const planeSet = ConvexClipPlaneSet.createEmpty();\n\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.low, vp.rotation.rowX(), true));\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.low, vp.rotation.rowY(), true));\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.high, vp.rotation.rowX(), false));\n planeSet.addPlaneToConvexSet(getClipPlane(boxRange.high, vp.rotation.rowY(), false));\n\n if (0 === planeSet.planes.length)\n return contents;\n\n const clip = ClipVector.createCapture([ClipPrimitive.createCapture(planeSet)]);\n const viewRange = vp.computeViewRange();\n const range = ClipUtilities.rangeOfClipperIntersectionWithRange(clip, viewRange);\n\n if (range.isNull)\n return contents;\n\n // TODO: Possible to make UnionOfComplexClipPlaneSets from view clip and planes work and remove 2nd containment check?\n const viewClip = (vp.viewFlags.clipVolume ? vp.view.getViewClip()?.clone() : undefined);\n if (viewClip) {\n const viewClipRange = ClipUtilities.rangeOfClipperIntersectionWithRange(viewClip, viewRange);\n if (viewClipRange.isNull || !viewClipRange.intersectsRange(range))\n return contents;\n }\n\n const candidates: Id64Array = [];\n const categories = new Set<Id64String>();\n\n try {\n const viewedModels = [...vp.view.modelSelector.models].join(\",\");\n const viewedCategories = [...vp.view.categorySelector.categories].join(\",\");\n const ecsql = `SELECT e.ECInstanceId, Category.Id as category FROM bis.SpatialElement e JOIN bis.SpatialIndex i ON e.ECInstanceId=i.ECInstanceId WHERE Model.Id IN (${viewedModels}) AND Category.Id IN (${viewedCategories}) AND i.MinX <= ${range.xHigh} AND i.MinY <= ${range.yHigh} AND i.MinZ <= ${range.zHigh} AND i.MaxX >= ${range.xLow} AND i.MaxY >= ${range.yLow} AND i.MaxZ >= ${range.zLow}`;\n const reader = vp.iModel.createQueryReader(ecsql, undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyNames });\n\n for await (const row of reader) {\n candidates.push(row.ECInstanceId);\n categories.add(row.category);\n }\n } catch { }\n\n if (0 === candidates.length)\n return contents;\n\n let offSubCategories: Id64Array | undefined;\n if (0 !== categories.size) {\n for (const categoryId of categories) {\n const subcategories = vp.iModel.subcategories.getSubCategories(categoryId);\n if (undefined === subcategories)\n continue;\n\n for (const subCategoryId of subcategories) {\n const appearance = vp.iModel.subcategories.getSubCategoryAppearance(subCategoryId);\n if (undefined === appearance || (!appearance.invisible && !appearance.dontLocate))\n continue;\n\n if (undefined === offSubCategories)\n offSubCategories = new Array<Id64String>;\n offSubCategories.push(subCategoryId);\n }\n }\n }\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates,\n clip: clip.toJSON(),\n allowOverlaps,\n viewFlags: vp.viewFlags.toJSON(),\n offSubCategories,\n };\n\n const result = await vp.iModel.getGeometryContainment(requestProps);\n if (BentleyStatus.SUCCESS !== result.status || undefined === result.candidatesContainment)\n return contents;\n\n result.candidatesContainment.forEach((status: ClipPlaneContainment, index: number) => {\n if (ClipPlaneContainment.StronglyOutside !== status && (undefined === filter || filter(candidates[index])))\n contents.add(candidates[index]);\n });\n\n if (0 !== contents.size && viewClip) {\n requestProps.clip = viewClip.toJSON();\n requestProps.candidates.length = 0;\n for (const id of contents)\n requestProps.candidates.push(id);\n contents.clear();\n\n const resultViewClip = await vp.iModel.getGeometryContainment(requestProps);\n if (BentleyStatus.SUCCESS !== resultViewClip.status || undefined === resultViewClip.candidatesContainment)\n return contents;\n\n resultViewClip.candidatesContainment.forEach((status: ClipPlaneContainment, index: number) => {\n if (ClipPlaneContainment.StronglyOutside !== status)\n contents.add(candidates[index]);\n });\n }\n\n return contents;\n }\n\n /** Get ids of visible elements to process from drag box or crossing line selection. */\n private static getAreaSelectionCandidates(vp: Viewport, origin: XAndY, corner: XAndY, method: SelectionMethod, allowOverlaps: boolean, filter?: (id: Id64String) => boolean): Set<Id64String> {\n let contents = new Set<Id64String>();\n\n const pts: Point2d[] = [];\n pts[0] = new Point2d(Math.floor(origin.x + 0.5), Math.floor(origin.y + 0.5));\n pts[1] = new Point2d(Math.floor(corner.x + 0.5), Math.floor(corner.y + 0.5));\n const range = Range2d.createArray(pts);\n\n const rect = new ViewRect();\n rect.initFromRange(range);\n vp.readPixels(rect, Pixel.Selector.Feature, (pixels) => {\n if (undefined === pixels)\n return;\n\n const sRange = Range2d.createNull();\n sRange.extendPoint(Point2d.create(vp.cssPixelsToDevicePixels(range.low.x), vp.cssPixelsToDevicePixels(range.low.y)));\n sRange.extendPoint(Point2d.create(vp.cssPixelsToDevicePixels(range.high.x), vp.cssPixelsToDevicePixels(range.high.y)));\n\n pts[0].x = vp.cssPixelsToDevicePixels(pts[0].x);\n pts[0].y = vp.cssPixelsToDevicePixels(pts[0].y);\n\n pts[1].x = vp.cssPixelsToDevicePixels(pts[1].x);\n pts[1].y = vp.cssPixelsToDevicePixels(pts[1].y);\n\n const testPoint = Point2d.createZero();\n\n const getPixelElementId = (pixel: Pixel.Data) => {\n if (undefined === pixel.elementId || Id64.isInvalid(pixel.elementId))\n return undefined; // no geometry at this location...\n\n if (!vp.isPixelSelectable(pixel))\n return undefined; // reality model, terrain, etc - not selectable\n\n if (undefined !== filter && !filter(pixel.elementId))\n return undefined;\n\n return pixel.elementId;\n };\n\n if (SelectionMethod.Box === method) {\n const outline = allowOverlaps ? undefined : new Set<string>();\n const offset = sRange.clone();\n offset.expandInPlace(-2);\n for (testPoint.x = sRange.low.x; testPoint.x <= sRange.high.x; ++testPoint.x) {\n for (testPoint.y = sRange.low.y; testPoint.y <= sRange.high.y; ++testPoint.y) {\n const pixel = pixels.getPixel(testPoint.x, testPoint.y);\n const elementId = getPixelElementId(pixel);\n if (undefined === elementId)\n continue;\n\n if (undefined !== outline && !offset.containsPoint(testPoint))\n outline.add(elementId.toString());\n else\n contents.add(elementId.toString());\n }\n }\n if (undefined !== outline && 0 !== outline.size) {\n const inside = new Set<string>();\n contents.forEach((id) => {\n if (!outline.has(id))\n inside.add(id);\n });\n\n contents = inside;\n }\n } else {\n const closePoint = Point2d.createZero();\n for (testPoint.x = sRange.low.x; testPoint.x <= sRange.high.x; ++testPoint.x) {\n for (testPoint.y = sRange.low.y; testPoint.y <= sRange.high.y; ++testPoint.y) {\n const pixel = pixels.getPixel(testPoint.x, testPoint.y);\n const elementId = getPixelElementId(pixel);\n if (undefined === elementId)\n continue;\n\n const fraction = testPoint.fractionOfProjectionToLine(pts[0], pts[1], 0.0);\n pts[0].interpolate(fraction, pts[1], closePoint);\n if (closePoint.distance(testPoint) < 1.5)\n contents.add(elementId.toString());\n }\n }\n }\n }, true);\n\n return contents;\n }\n\n /** Get ids of elements to process from drag box or crossing line selection using either the depth buffer or clip vector...\n * @internal\n */\n public static async getAreaOrVolumeSelectionCandidates(vp: Viewport, origin: XAndY, corner: XAndY, method: SelectionMethod, allowOverlaps: boolean, filter?: (id: Id64String) => boolean, includeDecorationsForVolume?: boolean): Promise<Set<Id64String>> {\n let contents;\n\n if (ToolSettings.enableVolumeSelection && SelectionMethod.Box === method && vp.view.isSpatialView()) {\n contents = await ElementSetTool.getVolumeSelectionCandidates(vp, origin, corner, allowOverlaps, filter);\n\n // Use area select to identify pickable transients...\n if (includeDecorationsForVolume) {\n const acceptTransientsFilter = (id: Id64String) => { return Id64.isTransient(id) && (undefined === filter || filter(id)); };\n const transients = ElementSetTool.getAreaSelectionCandidates(vp, origin, corner, method, allowOverlaps, acceptTransientsFilter);\n for (const id of transients)\n contents.add(id);\n }\n } else {\n contents = ElementSetTool.getAreaSelectionCandidates(vp, origin, corner, method, allowOverlaps, filter);\n }\n\n return contents;\n }\n\n /** Get element ids to process from drag box or crossing line selection.\n * Sub-classes may override to support selection scopes or apply tool specific filtering.\n */\n protected async getDragSelectCandidates(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<Id64Arg> {\n const filter = (id: Id64String) => { return this.isElementIdValid(id, ModifyElementSource.DragSelect); };\n return ElementSetTool.getAreaOrVolumeSelectionCandidates(vp, origin, corner, method, overlap, filter, IModelApp.locateManager.options.allowDecorations);\n }\n\n /** Populate [[ElementSetTool.agenda]] by drag box or crossing line information.\n * @see [[ElementSetTool.getDragSelectCandidates]] to filter or augment the set of elements.\n */\n protected async buildDragSelectAgenda(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<boolean> {\n const candidates = await this.getDragSelectCandidates(vp, origin, corner, method, overlap);\n\n if (!this.isControlDown || !this.controlKeyInvertsSelection) {\n if (!this.agenda.add(candidates))\n return false;\n } else {\n if (!this.agenda.invert(candidates))\n return false;\n }\n\n if (ModifyElementSource.Unknown === this.agenda.getSource())\n this.agenda.setSource(ModifyElementSource.DragSelect); // Don't set source if invert only removed entries...\n\n await this.onAgendaModified();\n return true;\n }\n\n /** Quick id validity check. Sub-classes that wish to allow pickable decorations from selection sets can override. */\n protected isElementIdValid(id: Id64String, source: ModifyElementSource): boolean {\n switch (source) {\n case ModifyElementSource.Selected:\n return true; // Locate options already checked prior to calling isElementValidForOperation...\n case ModifyElementSource.SelectionSet:\n return (!Id64.isInvalid(id) && !Id64.isTransient(id)); // Locate options are invalid, locate isn't enabled when processing a selection set...\n case ModifyElementSource.DragSelect:\n return (!Id64.isInvalid(id) && (IModelApp.locateManager.options.allowDecorations || !Id64.isTransient(id))); // Locate options are valid but have not yet been checked...\n default:\n return false;\n }\n }\n\n /** Sub-classes should override to apply tool specific filtering and to provide an explanation for rejection. */\n protected async isElementValidForOperation(hit: HitDetail, _out?: LocateResponse): Promise<boolean> {\n return this.isElementIdValid(hit.sourceId, ModifyElementSource.Selected);\n }\n\n /** Called from [[ElementSetTool.doLocate]] as well as auto-locate to accept or reject elements under the cursor. */\n public override async filterHit(hit: HitDetail, out?: LocateResponse): Promise<LocateFilterStatus> {\n // Support deselect using control key and don't show \"not\" cursor over an already selected element...\n if (undefined !== this._agenda && this._agenda.find(hit.sourceId)) {\n const status = (this.isControlDown || !this.controlKeyInvertsSelection) ? LocateFilterStatus.Accept : LocateFilterStatus.Reject;\n if (out && LocateFilterStatus.Reject === status)\n out.explanation = CoreTools.translate(`ElementSet.Error.AlreadySelected`);\n return status;\n }\n\n return await this.isElementValidForOperation(hit, out) ? LocateFilterStatus.Accept : LocateFilterStatus.Reject;\n }\n\n /** Identify an element and update the element agenda.\n * @param newSearch true to locate new elements, false to cycle between elements within locate tolerance from a previous locate.\n * @return true if [[ElementSetTool.agenda]] was changed.\n */\n protected async doLocate(ev: BeButtonEvent, newSearch: boolean): Promise<boolean> {\n const hit = await IModelApp.locateManager.doLocate(new LocateResponse(), newSearch, ev.point, ev.viewport, ev.inputSource);\n\n if (newSearch)\n return (undefined !== hit && this.buildLocateAgenda(hit));\n\n // If next element is already in agenda (part of a group, etc.) don't re-add group...\n const addNext = (undefined !== hit && !this.agenda.has(hit.sourceId));\n this.agenda.popGroup();\n\n if (!addNext || !await this.buildLocateAgenda(hit))\n await this.onAgendaModified(); // only change was popGroup...\n\n return true;\n }\n\n /** Whether drag box selection only identifies elements that are wholly inside or also allows those that overlap\n * the selection rectangle.\n * @note Inside/overlap is based on left/right direction of corner points (shift key inverts check).\n */\n protected useOverlapSelection(ev: BeButtonEvent): boolean {\n if (undefined === ev.viewport || undefined === this.dragStartPoint)\n return false;\n const pt1 = ev.viewport.worldToView(this.dragStartPoint);\n const pt2 = ev.viewport.worldToView(ev.point);\n const overlapMode = (pt1.x > pt2.x);\n return (ev.isShiftKey ? !overlapMode : overlapMode); // Shift inverts inside/overlap selection...\n }\n\n /** Initiate tool state for start of drag selection. */\n protected async selectByPointsStart(ev: BeButtonEvent): Promise<boolean> {\n if (BeButton.Data !== ev.button && BeButton.Reset !== ev.button)\n return false;\n\n if (!ev.isControlKey || !this.allowDragSelect || !this.wantAdditionalElements)\n return false;\n\n this.dragStartPoint = ev.point.clone();\n this.setupAndPromptForNextAction();\n return true;\n }\n\n /** Finish drag selection and update [[ElementSetTool.agenda]] with any elements that may have been identified. */\n protected async selectByPointsEnd(ev: BeButtonEvent): Promise<boolean> {\n if (undefined === this.dragStartPoint)\n return false;\n\n const vp = ev.viewport;\n if (vp === undefined) {\n this.dragStartPoint = undefined;\n this.setupAndPromptForNextAction();\n return false;\n }\n\n const origin = vp.worldToView(this.dragStartPoint);\n const corner = vp.worldToView(ev.point);\n if (BeButton.Reset === ev.button)\n await this.buildDragSelectAgenda(vp, origin, corner, SelectionMethod.Line, true);\n else\n await this.buildDragSelectAgenda(vp, origin, corner, SelectionMethod.Box, this.useOverlapSelection(ev));\n\n this.dragStartPoint = undefined;\n this.setupAndPromptForNextAction();\n vp.invalidateDecorations();\n return true;\n }\n\n /** Display drag box and crossing line selection graphics. */\n protected selectByPointsDecorate(context: DecorateContext): void {\n if (undefined === this.dragStartPoint)\n return;\n\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n if (undefined === ev.viewport)\n return;\n\n const vp = context.viewport;\n const bestContrastIsBlack = (ColorDef.black === vp.getContrastToBackgroundColor());\n const crossingLine = (BeButton.Reset === ev.button);\n const overlapSelection = (crossingLine || this.useOverlapSelection(ev));\n\n const position = vp.worldToView(this.dragStartPoint);\n position.x = Math.floor(position.x) + 0.5;\n position.y = Math.floor(position.y) + 0.5;\n const position2 = vp.worldToView(ev.point);\n position2.x = Math.floor(position2.x) + 0.5;\n position2.y = Math.floor(position2.y) + 0.5;\n const offset = position2.minus(position);\n\n const drawDecoration = (ctx: CanvasRenderingContext2D) => {\n ctx.strokeStyle = bestContrastIsBlack ? \"black\" : \"white\";\n ctx.lineWidth = 1;\n if (overlapSelection)\n ctx.setLineDash([5, 5]);\n\n if (crossingLine) {\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(offset.x, offset.y);\n ctx.stroke();\n } else {\n ctx.strokeRect(0, 0, offset.x, offset.y);\n ctx.fillStyle = bestContrastIsBlack ? \"rgba(0,0,0,.06)\" : \"rgba(255,255,255,.06)\";\n ctx.fillRect(0, 0, offset.x, offset.y);\n }\n };\n context.addCanvasDecoration({ position, drawDecoration });\n }\n\n /** Show graphics for when drag selection is active. */\n public override decorate(context: DecorateContext): void { this.selectByPointsDecorate(context); }\n\n /** Make sure drag selection graphics are updated when mouse moves. */\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (undefined !== ev.viewport && this.isSelectByPoints)\n ev.viewport.invalidateDecorations();\n }\n\n /** Support initiating drag selection on mouse start drag event when [[ElementSetTool.allowDragSelect]] is true. */\n public override async onMouseStartDrag(ev: BeButtonEvent): Promise<EventHandled> {\n if (await this.selectByPointsStart(ev))\n return EventHandled.Yes;\n return super.onMouseStartDrag(ev);\n }\n\n /** Support completing active drag selection on mouse end drag event and update [[ElementSetTool.agenda]]. */\n public override async onMouseEndDrag(ev: BeButtonEvent): Promise<EventHandled> {\n if (await this.selectByPointsEnd(ev))\n return EventHandled.Yes;\n return super.onMouseEndDrag(ev);\n }\n\n /** Update prompts, cursor, graphics, etc. as appropriate on ctrl and shift key transitions. */\n public override async onModifierKeyTransition(_wentDown: boolean, modifier: BeModifierKeys, _event: KeyboardEvent): Promise<EventHandled> {\n if (this.isSelectionSetModify)\n return EventHandled.No;\n\n if (this.isSelectByPoints)\n return (BeModifierKeys.Shift === modifier ? EventHandled.Yes : EventHandled.No);\n\n if (BeModifierKeys.Control !== modifier || undefined !== this.anchorPoint || !this.controlKeyContinuesSelection)\n return EventHandled.No;\n\n if (this.currentElementCount < this.requiredElementCount && !this.wantAccuSnap)\n return EventHandled.No; // Can only early return if AccuSnap doesn't need to be disabled for ctrl selection...\n\n this.setupAndPromptForNextAction(); // Enable/disable auto-locate, AccuSnap, update prompts...\n return EventHandled.Yes;\n }\n\n /** Allow reset to cycle between elements identified for overlapping the locate circle.\n * Advances to next pre-located hit from [[AccuSnap.aSnapHits]] or changes last accepted hit to next hit from [[ElementLocateManger.hitList]].\n * @returns EventHandled.Yes if onReinitialize was called to restart or exit tool.\n */\n protected async chooseNextHit(ev: BeButtonEvent): Promise<EventHandled> {\n if (this.isSelectionSetModify) {\n await this.onReinitialize();\n return EventHandled.Yes;\n }\n\n if (0 !== this.currentElementCount) {\n let autoLocateChooseNext = false;\n\n if (this.wantAdditionalElements) {\n const lastHit = IModelApp.locateManager.currHit;\n const autoHit = IModelApp.accuSnap.currHit;\n\n // Choose next using auto-locate or normal locate?\n if (undefined !== autoHit && (undefined === lastHit || !autoHit.isSameHit(lastHit)))\n autoLocateChooseNext = true;\n }\n\n if (!autoLocateChooseNext) {\n await this.doLocate(ev, false);\n\n if (this.agenda.isEmpty) {\n await this.onReinitialize();\n return EventHandled.Yes;\n }\n\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n }\n\n await IModelApp.accuSnap.resetButton();\n return EventHandled.No;\n }\n\n /** Orchestrates updating the internal state of the tool on a reset button event.\n * @returns EventHandled.Yes if onReinitialize was called to restart or exit tool.\n */\n protected async processResetButton(ev: BeButtonEvent): Promise<EventHandled> {\n if (ev.isDown)\n return EventHandled.No;\n\n return this.chooseNextHit(ev);\n }\n\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processResetButton(ev);\n }\n\n public override async onResetButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processResetButton(ev);\n }\n\n /** Collect element input until tool has a sufficient number to complete. */\n protected async gatherElements(ev: BeButtonEvent): Promise<EventHandled | undefined> {\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty && !await this.buildSelectionSetAgenda(this.iModel.selectionSet)) {\n await this.onReinitialize();\n return EventHandled.Yes;\n }\n }\n\n if (this.wantAdditionalElements) {\n if (ev.isDown && ev.isControlKey && this.allowDragSelect) {\n this._processDataButtonUp = true;\n return EventHandled.No; // Defer locate to up event so that box select can be initiated while over an element...\n }\n\n if (!await this.doLocate(ev, true))\n return EventHandled.No;\n\n if (this.wantAdditionalElements) {\n this.setupAndPromptForNextAction();\n return EventHandled.No; // Continue identifying elements...\n }\n }\n\n return undefined;\n }\n\n /** Collect point input until tool has a sufficient number to complete. */\n protected async gatherInput(ev: BeButtonEvent): Promise<EventHandled | undefined> {\n if (undefined === this.anchorPoint) {\n this.anchorPoint = ev.point.clone();\n\n const hints = new AccuDrawHintBuilder();\n\n hints.setOriginAlways = true;\n hints.setOrigin(this.anchorPoint);\n hints.sendHints(false); // Default activation on start of dynamics...\n }\n\n if (!this.wantProcessAgenda(ev)) {\n if (this.wantDynamics)\n await this.initAgendaDynamics();\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n\n return undefined;\n }\n\n /** Orchestrates advancing the internal state of the tool on a data button event.\n * - Collect elements: Add to the element agenda until no additional elements are requested.\n * - Gather input: Initiates element dynamics and accepts additional points as required.\n * - Complete operation: Process agenda entries, 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 (!ev.isDown && !this._processDataButtonUp)\n return EventHandled.No;\n this._processDataButtonUp = false;\n\n const elementStatus = await this.gatherElements(ev);\n if (undefined !== elementStatus)\n return elementStatus;\n\n const inputStatus = await this.gatherInput(ev);\n if (undefined !== inputStatus)\n return inputStatus;\n\n await this.processAgenda(ev);\n await this.onProcessComplete();\n return EventHandled.Yes;\n }\n\n public override async onDataButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processDataButton(ev);\n }\n\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n return this.processDataButton(ev);\n }\n\n protected async initAgendaDynamics(): Promise<boolean> {\n if (this.isDynamicsStarted)\n return false;\n this.beginDynamics();\n return true;\n }\n\n /** Sub-classes can override to be notified of [[ElementSetTool.agenda]] changes by other methods.\n * @note Tools should not modify [[ElementSetTool.agenda]] in this method, it should merely serve as a convenient place\n * to update information, such as element graphics once dynamics has started, ex. [[ElementSetTool.chooseNextHit]].\n */\n protected async onAgendaModified(): Promise<void> { }\n\n /** Sub-classes can override to continue with current [[ElementSetTool.agenda]] or restart after processing has completed. */\n protected async onProcessComplete(): Promise<void> { return this.onReinitialize(); }\n\n /** Sub-classes that return false for [[ElementSetTool.requireAcceptForSelectionSetOperation]] should override to apply the tool operation to [[ElementSetTool.agenda]]. */\n protected async processAgendaImmediate(): Promise<void> { }\n\n /** Sub-classes that require and use the accept point should override to apply the tool operation to [[ElementSetTool.agenda]].\n * @note Not called for [[ElementSetTool.isSelectionSetModify]] when [[ElementSetTool.requireAcceptForSelectionSetOperation]] is false.\n */\n protected async processAgenda(_ev: BeButtonEvent): Promise<void> { return this.processAgendaImmediate(); }\n\n /** Support either [[ElementSetTool.requireAcceptForSelectionSetOperation]] or [[ElementSetTool.requireAcceptForSelectionSetDynamics]] returning false. */\n protected async doProcessSelectionSetImmediate(): Promise<void> {\n const buildImmediate = (!this.requireAcceptForSelectionSetOperation || (this.wantDynamics && !this.requireAcceptForSelectionSetDynamics));\n if (!buildImmediate)\n return;\n\n if (!await this.buildSelectionSetAgenda(this.iModel.selectionSet))\n return this.onReinitialize();\n\n if (!this.requireAcceptForSelectionSetOperation) {\n await this.processAgendaImmediate();\n await this.onProcessComplete();\n } else {\n await this.initAgendaDynamics();\n }\n }\n\n /** Setup initial element state, prompts, check [[SelectionSet]], etc. */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setPreferredElementSource();\n this.setupAndPromptForNextAction();\n\n if (this.isSelectionSetModify)\n await this.doProcessSelectionSetImmediate();\n }\n\n /** Make sure elements from [[ElementSetTool.agenda]] that aren't also from [[SelectionSet]] aren't left hilited. */\n public override async onCleanup() {\n await super.onCleanup();\n if (undefined !== this._agenda)\n this._agenda.clear();\n }\n\n /** Exit and start default tool when [[ElementSetTool.isSelectionSetModify]] is true to allow [[SelectionSet]] to be modified,\n * or call [[PrimitiveTool.onRestartTool]] to install a new tool instance.\n */\n public override async onReinitialize() {\n if (this.isSelectionSetModify)\n return this.exitTool();\n\n return this.onRestartTool();\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 protected get shouldEnableLocate(): boolean { return this.isSelectByPoints ? false : this.wantAdditionalElements; }\n protected get shouldEnableSnap(): boolean { return this.isSelectByPoints ? false : (this.wantAccuSnap && (!this.isControlDown || !this.controlKeyContinuesSelection || !this.wantAdditionalElements)); }\n\n /** Setup auto-locate, AccuSnap, AccuDraw, and supply tool assistance. */\n protected setupAndPromptForNextAction(): void {\n this.initLocateElements(this.shouldEnableLocate, this.shouldEnableSnap);\n this.provideToolAssistance();\n }\n\n /** Sub-classes should override to provide tool specific instructions. */\n protected provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\n let mainMsg;\n let leftMsg;\n let rightMsg;\n let addDragInstr = false;\n\n if (this.isSelectionSetModify) {\n if (this.wantAdditionalInput) {\n mainMsg = \"ElementSet.Prompts.IdentifyPoint\";\n leftMsg = \"ElementSet.Inputs.AcceptPoint\";\n rightMsg = \"ElementSet.Inputs.Exit\";\n } else if (0 === this.currentElementCount) {\n mainMsg = \"ElementSet.Prompts.ConfirmSelection\";\n leftMsg = \"ElementSet.Inputs.AcceptSelection\";\n rightMsg = \"ElementSet.Inputs.RejectSelection\";\n } else {\n mainMsg = \"ElementSet.Inputs.Complete\";\n leftMsg = \"ElementSet.Inputs.Accept\";\n rightMsg = \"ElementSet.Inputs.Exit\";\n }\n } else {\n if (this.isSelectByPoints) {\n mainMsg = \"ElementSet.Prompts.OppositeCorner\";\n leftMsg = \"ElementSet.Inputs.BoxCorners\";\n rightMsg = \"ElementSet.Inputs.CrossingLine\";\n } else if (this.wantAdditionalElements) {\n mainMsg = \"ElementSet.Prompts.IdentifyElement\";\n leftMsg = \"ElementSet.Inputs.AcceptElement\";\n rightMsg = \"ElementSet.Inputs.Cancel\";\n addDragInstr = this.allowDragSelect;\n } else if (this.wantAdditionalInput) {\n mainMsg = \"ElementSet.Prompts.IdentifyPoint\";\n leftMsg = \"ElementSet.Inputs.AcceptPoint\";\n rightMsg = \"ElementSet.Inputs.Cancel\";\n } else {\n mainMsg = \"ElementSet.Inputs.Complete\";\n leftMsg = \"ElementSet.Inputs.Accept\";\n rightMsg = \"ElementSet.Inputs.Restart\";\n }\n }\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 (addDragInstr) {\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.LeftClickDrag, CoreTools.translate(\"ElementSet.Inputs.BoxCorners\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.RightClickDrag, CoreTools.translate(\"ElementSet.Inputs.CrossingLine\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.shiftKey, ToolAssistanceImage.LeftClickDrag, CoreTools.translate(\"ElementSet.Inputs.OverlapSelection\"), false, ToolAssistanceInputMethod.Mouse));\n }\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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IdleTool.d.ts","sourceRoot":"","sources":["../../../src/tools/IdleTool.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAY,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAG5G;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAS,SAAQ,eAAe;IAC3C,OAAuB,MAAM,SAAU;IACvC,OAAuB,MAAM,UAAQ;IAEf,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkD1D,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB1D,YAAY,CAAC,EAAE,EAAE,YAAY;IAE7B,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAKhF,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB5D,QAAQ;IACC,GAAG;CAC1B"}
1
+ {"version":3,"file":"IdleTool.d.ts","sourceRoot":"","sources":["../../../src/tools/IdleTool.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAY,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAG5G;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAS,SAAQ,eAAe;IAC3C,OAAuB,MAAM,SAAU;IACvC,OAAuB,MAAM,UAAQ;IAEf,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkD1D,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB1D,YAAY,CAAC,EAAE,EAAE,YAAY;IAE7B,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAKhF,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB5D,QAAQ;IACC,GAAG;CAC1B"}
@@ -106,8 +106,11 @@ export class IdleTool extends InteractiveTool {
106
106
  return EventHandled.Yes;
107
107
  }
108
108
  else if (ev.isDoubleTap) {
109
+ const vp = ev.viewport;
110
+ if (undefined === vp)
111
+ return EventHandled.No;
109
112
  // Fit view on single finger double tap.
110
- const tool = new FitViewTool(ev.viewport, true);
113
+ const tool = new FitViewTool(vp, true);
111
114
  return await tool.run() ? EventHandled.Yes : EventHandled.No;
112
115
  }
113
116
  return EventHandled.No;
@@ -1 +1 @@
1
- {"version":3,"file":"IdleTool.js","sourceRoot":"","sources":["../../../src/tools/IdleTool.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAA6C,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC5G,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1F;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,QAAS,SAAQ,eAAe;IACpC,MAAM,CAAU,MAAM,GAAG,MAAM,CAAC;IAChC,MAAM,CAAU,MAAM,GAAG,IAAI,CAAC;IAErB,KAAK,CAAC,gBAAgB,CAAC,EAAiB;QACtD,IAAI,CAAC,EAAE,CAAC,QAAQ;YACd,OAAO,YAAY,CAAC,EAAE,CAAC;QAEzB,IAAI,MAAc,CAAC;QACnB,IAAI,QAAwB,CAAC;QAE7B,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,QAAQ,CAAC,MAAM;gBAClB,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;oBACpB,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC/E,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;gBACnG,CAAC;qBAAM,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;oBACzB,MAAM,GAAG,aAAa,CAAC;oBACvB,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,UAAU,CAAC;oBACpB,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC;gBAChC,CAAC;gBACD,MAAM;YAER,KAAK,QAAQ,CAAC,IAAI;gBAChB,iFAAiF;gBACjF,IAAI,SAAS,KAAK,SAAS,CAAC,SAAS,CAAC,UAAU;oBAC9C,OAAO,YAAY,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,aAAa,CAAC;gBACvB,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC;gBACjC,MAAM;YAER;gBACE,+EAA+E;gBAC/E,IAAI,SAAS,KAAK,SAAS,CAAC,SAAS,CAAC,UAAU;oBAC9C,OAAO,YAAY,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,UAAU,CAAC;gBACpB,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC;gBAC9B,MAAM;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,YAAY,SAAS;gBAC/B,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,qFAAqF;YACtI,OAAO,YAAY,CAAC,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAA0B,CAAC;QAClG,IAAI,QAAQ,IAAI,MAAM,QAAQ,CAAC,GAAG,EAAE;YAClC,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACtC,OAAO,YAAY,CAAC,GAAG,CAAC;IAC1B,CAAC;IAEe,KAAK,CAAC,gBAAgB,CAAC,EAAiB;QACtD,IAAI,CAAC,EAAE,CAAC,QAAQ;YACd,OAAO,YAAY,CAAC,EAAE,CAAC;QAEzB,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;QACnE,CAAC;QAED,IAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,UAAU;YAClC,OAAO,YAAY,CAAC,EAAE,CAAC;QAEzB,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,YAAY,CAAC,GAAG,CAAC;IAC1B,CAAC;IAEe,KAAK,CAAC,YAAY,CAAC,EAAgB,IAAI,OAAO,SAAS,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhG,KAAK,CAAC,gBAAgB,CAAC,EAAgB,EAAE,OAAqB;QAC5E,MAAM,IAAI,GAAG,IAAI,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;IAC/D,CAAC;IAEe,KAAK,CAAC,UAAU,CAAC,EAAgB;QAC/C,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACnB,2CAA2C;YAC3C,MAAM,SAAS,CAAC,SAAS,CAAC,gCAAgC,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9E,OAAO,YAAY,CAAC,GAAG,CAAC;QAC1B,CAAC;aAAM,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;YAC7B,yCAAyC;YACzC,MAAM,SAAS,CAAC,SAAS,CAAC,gCAAgC,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC/E,OAAO,YAAY,CAAC,GAAG,CAAC;QAC1B,CAAC;aAAM,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1B,wCAAwC;YACxC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,QAAS,EAAE,IAAI,CAAC,CAAC;YACjD,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,YAAY,CAAC,EAAE,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,QAAQ,KAAK,CAAC;IACX,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,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 Tools\n */\n\nimport { IModelApp } from \"../IModelApp\";\nimport { BeButton, BeButtonEvent, BeTouchEvent, BeWheelEvent, EventHandled, InteractiveTool } from \"./Tool\";\nimport { DefaultViewTouchTool, FitViewTool, ViewHandleType, ViewManip } from \"./ViewTool\";\n\n/**\n * The default \"idle\" tool. If no tool is active, or the active tool does not respond to a given\n * event, input events are forwarded to the idle tool. The default idle tool converts middle mouse button events\n * and touch gestures into view navigation operations like pan, zoom, rotate, and fit.\n *\n * Controls are as follows:\n * - Mouse/keyboard:\n * - mmb: pan\n * - shift-mmb: rotate\n * - wheel: zoom in/out\n * - double-mmb: fit view\n * - Touch:\n * - single-finger drag: rotate\n * - two-finger drag: pan\n * - pinch: zoom in/out\n * - double-tap: fit view\n *\n * Touch inputs can be combined e.g. drag two fingers while moving them closer together => pan + zoom in\n * @public\n */\nexport class IdleTool extends InteractiveTool {\n public static override toolId = \"Idle\";\n public static override hidden = true;\n\n public override async onMouseStartDrag(ev: BeButtonEvent): Promise<EventHandled> {\n if (!ev.viewport)\n return EventHandled.No;\n\n let toolId: string;\n let handleId: ViewHandleType;\n\n switch (ev.button) {\n case BeButton.Middle:\n if (ev.isControlKey) {\n toolId = ev.viewport.view.allow3dManipulations() ? \"View.Look\" : \"View.Scroll\";\n handleId = ev.viewport.view.allow3dManipulations() ? ViewHandleType.Look : ViewHandleType.Scroll;\n } else if (ev.isShiftKey) {\n toolId = \"View.Rotate\";\n handleId = ViewHandleType.Rotate;\n } else {\n toolId = \"View.Pan\";\n handleId = ViewHandleType.Pan;\n }\n break;\n\n case BeButton.Data:\n // When no active tool is present install rotate view tool on drag of data button\n if (undefined !== IModelApp.toolAdmin.activeTool)\n return EventHandled.No;\n toolId = \"View.Rotate\";\n handleId = ViewHandleType.Rotate;\n break;\n\n default:\n // When no active tool is present install pan view tool on drag of reset button\n if (undefined !== IModelApp.toolAdmin.activeTool)\n return EventHandled.No;\n toolId = \"View.Pan\";\n handleId = ViewHandleType.Pan;\n break;\n }\n\n const currTool = IModelApp.toolAdmin.viewTool;\n if (currTool) {\n if (currTool instanceof ViewManip)\n return currTool.startHandleDrag(ev, handleId); // See if current view tool can drag using this handle, leave it active regardless...\n return EventHandled.No;\n }\n const viewTool = IModelApp.tools.create(toolId, ev.viewport, true, true) as ViewManip | undefined;\n if (viewTool && await viewTool.run())\n return viewTool.startHandleDrag(ev);\n return EventHandled.Yes;\n }\n\n public override async onMiddleButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n if (!ev.viewport)\n return EventHandled.No;\n\n if (ev.isDoubleClick) {\n const viewTool = new FitViewTool(ev.viewport, true);\n return await viewTool.run() ? EventHandled.Yes : EventHandled.No;\n }\n\n if (ev.isControlKey || ev.isShiftKey)\n return EventHandled.No;\n\n IModelApp.tentativePoint.process(ev);\n return EventHandled.Yes;\n }\n\n public override async onMouseWheel(ev: BeWheelEvent) { return IModelApp.toolAdmin.processWheelEvent(ev, true); }\n\n public override async onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): Promise<EventHandled> {\n const tool = new DefaultViewTouchTool(startEv, ev);\n return await tool.run() ? EventHandled.Yes : EventHandled.No;\n }\n\n public override async onTouchTap(ev: BeTouchEvent): Promise<EventHandled> {\n if (ev.isSingleTap) {\n // Send data down/up for single finger tap.\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev, BeButton.Data);\n return EventHandled.Yes;\n } else if (ev.isTwoFingerTap) {\n // Send reset down/up for two finger tap.\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev, BeButton.Reset);\n return EventHandled.Yes;\n } else if (ev.isDoubleTap) {\n // Fit view on single finger double tap.\n const tool = new FitViewTool(ev.viewport!, true);\n return await tool.run() ? EventHandled.Yes : EventHandled.No;\n }\n return EventHandled.No;\n }\n\n public async exitTool() { }\n public override async run() { return true; }\n}\n"]}
1
+ {"version":3,"file":"IdleTool.js","sourceRoot":"","sources":["../../../src/tools/IdleTool.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 Tools\n */\n\nimport { IModelApp } from \"../IModelApp\";\nimport { BeButton, BeButtonEvent, BeTouchEvent, BeWheelEvent, EventHandled, InteractiveTool } from \"./Tool\";\nimport { DefaultViewTouchTool, FitViewTool, ViewHandleType, ViewManip } from \"./ViewTool\";\n\n/**\n * The default \"idle\" tool. If no tool is active, or the active tool does not respond to a given\n * event, input events are forwarded to the idle tool. The default idle tool converts middle mouse button events\n * and touch gestures into view navigation operations like pan, zoom, rotate, and fit.\n *\n * Controls are as follows:\n * - Mouse/keyboard:\n * - mmb: pan\n * - shift-mmb: rotate\n * - wheel: zoom in/out\n * - double-mmb: fit view\n * - Touch:\n * - single-finger drag: rotate\n * - two-finger drag: pan\n * - pinch: zoom in/out\n * - double-tap: fit view\n *\n * Touch inputs can be combined e.g. drag two fingers while moving them closer together => pan + zoom in\n * @public\n */\nexport class IdleTool extends InteractiveTool {\n public static override toolId = \"Idle\";\n public static override hidden = true;\n\n public override async onMouseStartDrag(ev: BeButtonEvent): Promise<EventHandled> {\n if (!ev.viewport)\n return EventHandled.No;\n\n let toolId: string;\n let handleId: ViewHandleType;\n\n switch (ev.button) {\n case BeButton.Middle:\n if (ev.isControlKey) {\n toolId = ev.viewport.view.allow3dManipulations() ? \"View.Look\" : \"View.Scroll\";\n handleId = ev.viewport.view.allow3dManipulations() ? ViewHandleType.Look : ViewHandleType.Scroll;\n } else if (ev.isShiftKey) {\n toolId = \"View.Rotate\";\n handleId = ViewHandleType.Rotate;\n } else {\n toolId = \"View.Pan\";\n handleId = ViewHandleType.Pan;\n }\n break;\n\n case BeButton.Data:\n // When no active tool is present install rotate view tool on drag of data button\n if (undefined !== IModelApp.toolAdmin.activeTool)\n return EventHandled.No;\n toolId = \"View.Rotate\";\n handleId = ViewHandleType.Rotate;\n break;\n\n default:\n // When no active tool is present install pan view tool on drag of reset button\n if (undefined !== IModelApp.toolAdmin.activeTool)\n return EventHandled.No;\n toolId = \"View.Pan\";\n handleId = ViewHandleType.Pan;\n break;\n }\n\n const currTool = IModelApp.toolAdmin.viewTool;\n if (currTool) {\n if (currTool instanceof ViewManip)\n return currTool.startHandleDrag(ev, handleId); // See if current view tool can drag using this handle, leave it active regardless...\n return EventHandled.No;\n }\n const viewTool = IModelApp.tools.create(toolId, ev.viewport, true, true) as ViewManip | undefined;\n if (viewTool && await viewTool.run())\n return viewTool.startHandleDrag(ev);\n return EventHandled.Yes;\n }\n\n public override async onMiddleButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n if (!ev.viewport)\n return EventHandled.No;\n\n if (ev.isDoubleClick) {\n const viewTool = new FitViewTool(ev.viewport, true);\n return await viewTool.run() ? EventHandled.Yes : EventHandled.No;\n }\n\n if (ev.isControlKey || ev.isShiftKey)\n return EventHandled.No;\n\n IModelApp.tentativePoint.process(ev);\n return EventHandled.Yes;\n }\n\n public override async onMouseWheel(ev: BeWheelEvent) { return IModelApp.toolAdmin.processWheelEvent(ev, true); }\n\n public override async onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): Promise<EventHandled> {\n const tool = new DefaultViewTouchTool(startEv, ev);\n return await tool.run() ? EventHandled.Yes : EventHandled.No;\n }\n\n public override async onTouchTap(ev: BeTouchEvent): Promise<EventHandled> {\n if (ev.isSingleTap) {\n // Send data down/up for single finger tap.\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev, BeButton.Data);\n return EventHandled.Yes;\n } else if (ev.isTwoFingerTap) {\n // Send reset down/up for two finger tap.\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev, BeButton.Reset);\n return EventHandled.Yes;\n } else if (ev.isDoubleTap) {\n const vp = ev.viewport;\n if (undefined === vp)\n return EventHandled.No;\n // Fit view on single finger double tap.\n const tool = new FitViewTool(vp, true);\n return await tool.run() ? EventHandled.Yes : EventHandled.No;\n }\n return EventHandled.No;\n }\n\n public async exitTool() { }\n public override async run() { return true; }\n}\n"]}