@itwin/core-frontend 5.0.0-dev.111 → 5.0.0-dev.113

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 (188) hide show
  1. package/lib/cjs/AccuDraw.d.ts +2 -0
  2. package/lib/cjs/AccuDraw.d.ts.map +1 -1
  3. package/lib/cjs/AccuDraw.js +2 -0
  4. package/lib/cjs/AccuDraw.js.map +1 -1
  5. package/lib/cjs/IModelApp.d.ts +15 -0
  6. package/lib/cjs/IModelApp.d.ts.map +1 -1
  7. package/lib/cjs/IModelApp.js +20 -1
  8. package/lib/cjs/IModelApp.js.map +1 -1
  9. package/lib/cjs/ViewContext.d.ts +4 -1
  10. package/lib/cjs/ViewContext.d.ts.map +1 -1
  11. package/lib/cjs/ViewContext.js +10 -5
  12. package/lib/cjs/ViewContext.js.map +1 -1
  13. package/lib/cjs/ViewManager.js +2 -2
  14. package/lib/cjs/ViewManager.js.map +1 -1
  15. package/lib/cjs/Viewport.d.ts +3 -1
  16. package/lib/cjs/Viewport.d.ts.map +1 -1
  17. package/lib/cjs/Viewport.js +6 -2
  18. package/lib/cjs/Viewport.js.map +1 -1
  19. package/lib/cjs/core-frontend.d.ts +1 -1
  20. package/lib/cjs/core-frontend.d.ts.map +1 -1
  21. package/lib/cjs/core-frontend.js.map +1 -1
  22. package/lib/cjs/extension/providers/ExtensionLoadScript.js.map +1 -1
  23. package/lib/cjs/internal/render/MockRender.d.ts +1 -1
  24. package/lib/cjs/internal/render/MockRender.d.ts.map +1 -1
  25. package/lib/cjs/internal/render/MockRender.js +1 -1
  26. package/lib/cjs/internal/render/MockRender.js.map +1 -1
  27. package/lib/cjs/internal/render/webgl/RenderCommands.d.ts.map +1 -1
  28. package/lib/cjs/internal/render/webgl/RenderCommands.js +2 -3
  29. package/lib/cjs/internal/render/webgl/RenderCommands.js.map +1 -1
  30. package/lib/cjs/internal/render/webgl/Target.d.ts +1 -1
  31. package/lib/cjs/internal/render/webgl/Target.d.ts.map +1 -1
  32. package/lib/cjs/internal/render/webgl/Target.js +2 -2
  33. package/lib/cjs/internal/render/webgl/Target.js.map +1 -1
  34. package/lib/cjs/internal/render/webgl/TargetGraphics.d.ts +3 -3
  35. package/lib/cjs/internal/render/webgl/TargetGraphics.d.ts.map +1 -1
  36. package/lib/cjs/internal/render/webgl/TargetGraphics.js +10 -7
  37. package/lib/cjs/internal/render/webgl/TargetGraphics.js.map +1 -1
  38. package/lib/cjs/internal/tile/ClassifierTileTree.js +3 -1
  39. package/lib/cjs/internal/tile/ClassifierTileTree.js.map +1 -1
  40. package/lib/cjs/internal/tile/PrimaryTileTree.d.ts.map +1 -1
  41. package/lib/cjs/internal/tile/PrimaryTileTree.js +4 -3
  42. package/lib/cjs/internal/tile/PrimaryTileTree.js.map +1 -1
  43. package/lib/cjs/properties/AngleDescription.d.ts +4 -1
  44. package/lib/cjs/properties/AngleDescription.d.ts.map +1 -1
  45. package/lib/cjs/properties/AngleDescription.js +10 -2
  46. package/lib/cjs/properties/AngleDescription.js.map +1 -1
  47. package/lib/cjs/properties/FormattedQuantityDescription.d.ts +11 -1
  48. package/lib/cjs/properties/FormattedQuantityDescription.d.ts.map +1 -1
  49. package/lib/cjs/properties/FormattedQuantityDescription.js +8 -2
  50. package/lib/cjs/properties/FormattedQuantityDescription.js.map +1 -1
  51. package/lib/cjs/properties/LengthDescription.d.ts +12 -3
  52. package/lib/cjs/properties/LengthDescription.d.ts.map +1 -1
  53. package/lib/cjs/properties/LengthDescription.js +30 -6
  54. package/lib/cjs/properties/LengthDescription.js.map +1 -1
  55. package/lib/cjs/quantity-formatting/QuantityFormatter.d.ts +103 -7
  56. package/lib/cjs/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
  57. package/lib/cjs/quantity-formatting/QuantityFormatter.js +212 -23
  58. package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
  59. package/lib/cjs/render/RenderTarget.d.ts +1 -1
  60. package/lib/cjs/render/RenderTarget.d.ts.map +1 -1
  61. package/lib/cjs/render/RenderTarget.js.map +1 -1
  62. package/lib/cjs/tile/TileAdmin.d.ts +10 -0
  63. package/lib/cjs/tile/TileAdmin.d.ts.map +1 -1
  64. package/lib/cjs/tile/TileAdmin.js +3 -0
  65. package/lib/cjs/tile/TileAdmin.js.map +1 -1
  66. package/lib/cjs/tile/map/MapCartoRectangle.d.ts +10 -0
  67. package/lib/cjs/tile/map/MapCartoRectangle.d.ts.map +1 -1
  68. package/lib/cjs/tile/map/MapCartoRectangle.js +12 -0
  69. package/lib/cjs/tile/map/MapCartoRectangle.js.map +1 -1
  70. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +2 -2
  71. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  72. package/lib/cjs/tile/map/MapLayerImageryProvider.js +8 -4
  73. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  74. package/lib/cjs/tile/map/QuadId.d.ts +15 -0
  75. package/lib/cjs/tile/map/QuadId.d.ts.map +1 -1
  76. package/lib/cjs/tile/map/QuadId.js +12 -0
  77. package/lib/cjs/tile/map/QuadId.js.map +1 -1
  78. package/lib/cjs/tools/AccuDrawViewportUI.d.ts +7 -0
  79. package/lib/cjs/tools/AccuDrawViewportUI.d.ts.map +1 -1
  80. package/lib/cjs/tools/AccuDrawViewportUI.js +14 -0
  81. package/lib/cjs/tools/AccuDrawViewportUI.js.map +1 -1
  82. package/lib/cjs/tools/MeasureTool.d.ts +9 -0
  83. package/lib/cjs/tools/MeasureTool.d.ts.map +1 -1
  84. package/lib/cjs/tools/MeasureTool.js +53 -22
  85. package/lib/cjs/tools/MeasureTool.js.map +1 -1
  86. package/lib/cjs/tools/ToolAdmin.d.ts +1 -0
  87. package/lib/cjs/tools/ToolAdmin.d.ts.map +1 -1
  88. package/lib/cjs/tools/ToolAdmin.js +8 -2
  89. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  90. package/lib/cjs/tools/ViewTool.d.ts.map +1 -1
  91. package/lib/cjs/tools/ViewTool.js +4 -2
  92. package/lib/cjs/tools/ViewTool.js.map +1 -1
  93. package/lib/esm/AccuDraw.d.ts +2 -0
  94. package/lib/esm/AccuDraw.d.ts.map +1 -1
  95. package/lib/esm/AccuDraw.js +2 -0
  96. package/lib/esm/AccuDraw.js.map +1 -1
  97. package/lib/esm/IModelApp.d.ts +15 -0
  98. package/lib/esm/IModelApp.d.ts.map +1 -1
  99. package/lib/esm/IModelApp.js +21 -2
  100. package/lib/esm/IModelApp.js.map +1 -1
  101. package/lib/esm/ViewContext.d.ts +4 -1
  102. package/lib/esm/ViewContext.d.ts.map +1 -1
  103. package/lib/esm/ViewContext.js +10 -5
  104. package/lib/esm/ViewContext.js.map +1 -1
  105. package/lib/esm/ViewManager.js +2 -2
  106. package/lib/esm/ViewManager.js.map +1 -1
  107. package/lib/esm/Viewport.d.ts +3 -1
  108. package/lib/esm/Viewport.d.ts.map +1 -1
  109. package/lib/esm/Viewport.js +6 -2
  110. package/lib/esm/Viewport.js.map +1 -1
  111. package/lib/esm/core-frontend.d.ts +1 -1
  112. package/lib/esm/core-frontend.d.ts.map +1 -1
  113. package/lib/esm/core-frontend.js.map +1 -1
  114. package/lib/esm/extension/providers/ExtensionLoadScript.js +1 -1
  115. package/lib/esm/extension/providers/ExtensionLoadScript.js.map +1 -1
  116. package/lib/esm/internal/render/MockRender.d.ts +1 -1
  117. package/lib/esm/internal/render/MockRender.d.ts.map +1 -1
  118. package/lib/esm/internal/render/MockRender.js +1 -1
  119. package/lib/esm/internal/render/MockRender.js.map +1 -1
  120. package/lib/esm/internal/render/webgl/RenderCommands.d.ts.map +1 -1
  121. package/lib/esm/internal/render/webgl/RenderCommands.js +2 -3
  122. package/lib/esm/internal/render/webgl/RenderCommands.js.map +1 -1
  123. package/lib/esm/internal/render/webgl/Target.d.ts +1 -1
  124. package/lib/esm/internal/render/webgl/Target.d.ts.map +1 -1
  125. package/lib/esm/internal/render/webgl/Target.js +2 -2
  126. package/lib/esm/internal/render/webgl/Target.js.map +1 -1
  127. package/lib/esm/internal/render/webgl/TargetGraphics.d.ts +3 -3
  128. package/lib/esm/internal/render/webgl/TargetGraphics.d.ts.map +1 -1
  129. package/lib/esm/internal/render/webgl/TargetGraphics.js +10 -7
  130. package/lib/esm/internal/render/webgl/TargetGraphics.js.map +1 -1
  131. package/lib/esm/internal/tile/ClassifierTileTree.js +3 -1
  132. package/lib/esm/internal/tile/ClassifierTileTree.js.map +1 -1
  133. package/lib/esm/internal/tile/PrimaryTileTree.d.ts.map +1 -1
  134. package/lib/esm/internal/tile/PrimaryTileTree.js +4 -3
  135. package/lib/esm/internal/tile/PrimaryTileTree.js.map +1 -1
  136. package/lib/esm/properties/AngleDescription.d.ts +4 -1
  137. package/lib/esm/properties/AngleDescription.d.ts.map +1 -1
  138. package/lib/esm/properties/AngleDescription.js +10 -2
  139. package/lib/esm/properties/AngleDescription.js.map +1 -1
  140. package/lib/esm/properties/FormattedQuantityDescription.d.ts +11 -1
  141. package/lib/esm/properties/FormattedQuantityDescription.d.ts.map +1 -1
  142. package/lib/esm/properties/FormattedQuantityDescription.js +8 -2
  143. package/lib/esm/properties/FormattedQuantityDescription.js.map +1 -1
  144. package/lib/esm/properties/LengthDescription.d.ts +12 -3
  145. package/lib/esm/properties/LengthDescription.d.ts.map +1 -1
  146. package/lib/esm/properties/LengthDescription.js +30 -6
  147. package/lib/esm/properties/LengthDescription.js.map +1 -1
  148. package/lib/esm/quantity-formatting/QuantityFormatter.d.ts +103 -7
  149. package/lib/esm/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
  150. package/lib/esm/quantity-formatting/QuantityFormatter.js +210 -23
  151. package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
  152. package/lib/esm/render/RenderTarget.d.ts +1 -1
  153. package/lib/esm/render/RenderTarget.d.ts.map +1 -1
  154. package/lib/esm/render/RenderTarget.js.map +1 -1
  155. package/lib/esm/tile/TileAdmin.d.ts +10 -0
  156. package/lib/esm/tile/TileAdmin.d.ts.map +1 -1
  157. package/lib/esm/tile/TileAdmin.js +3 -0
  158. package/lib/esm/tile/TileAdmin.js.map +1 -1
  159. package/lib/esm/tile/map/MapCartoRectangle.d.ts +10 -0
  160. package/lib/esm/tile/map/MapCartoRectangle.d.ts.map +1 -1
  161. package/lib/esm/tile/map/MapCartoRectangle.js +12 -0
  162. package/lib/esm/tile/map/MapCartoRectangle.js.map +1 -1
  163. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +2 -2
  164. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  165. package/lib/esm/tile/map/MapLayerImageryProvider.js +8 -4
  166. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  167. package/lib/esm/tile/map/QuadId.d.ts +15 -0
  168. package/lib/esm/tile/map/QuadId.d.ts.map +1 -1
  169. package/lib/esm/tile/map/QuadId.js +12 -0
  170. package/lib/esm/tile/map/QuadId.js.map +1 -1
  171. package/lib/esm/tools/AccuDrawViewportUI.d.ts +7 -0
  172. package/lib/esm/tools/AccuDrawViewportUI.d.ts.map +1 -1
  173. package/lib/esm/tools/AccuDrawViewportUI.js +14 -0
  174. package/lib/esm/tools/AccuDrawViewportUI.js.map +1 -1
  175. package/lib/esm/tools/MeasureTool.d.ts +9 -0
  176. package/lib/esm/tools/MeasureTool.d.ts.map +1 -1
  177. package/lib/esm/tools/MeasureTool.js +53 -22
  178. package/lib/esm/tools/MeasureTool.js.map +1 -1
  179. package/lib/esm/tools/ToolAdmin.d.ts +1 -0
  180. package/lib/esm/tools/ToolAdmin.d.ts.map +1 -1
  181. package/lib/esm/tools/ToolAdmin.js +8 -2
  182. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  183. package/lib/esm/tools/ViewTool.d.ts.map +1 -1
  184. package/lib/esm/tools/ViewTool.js +4 -2
  185. package/lib/esm/tools/ViewTool.js.map +1 -1
  186. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  187. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  188. package/package.json +20 -20
@@ -1 +1 @@
1
- {"version":3,"file":"AccuDrawViewportUI.js","sourceRoot":"","sources":["../../../src/tools/AccuDrawViewportUI.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module AccuDraw\n */\nimport { Parser } from \"@itwin/core-quantity\";\nimport { AccuDraw, CompassMode, ItemField } from \"../AccuDraw\";\nimport { ViewRect } from \"../common/ViewRect\";\nimport { IModelApp } from \"../IModelApp\";\nimport { AccuDrawShortcuts } from \"./AccuDrawTool\";\nimport { BeButtonEvent } from \"./Tool\";\nimport { ScreenViewport } from \"../Viewport\";\n\ninterface AccuDrawControls {\n overlay: HTMLDivElement; // Viewport overlay...\n div: HTMLDivElement; // Child of overlay used to position controls...\n itemFields: HTMLInputElement[]; // Text fields indexed by ItemField...\n itemLocks: HTMLButtonElement[]; // Lock toggles indexed by ItemField...\n}\n\n/** Provides an in viewport user interface for AccuDraw that can optionally follow the cursor or remain at a fixed location.\n * @beta\n */\nexport class AccuDrawViewportUI extends AccuDraw {\n private _focusItem: ItemField;\n private _controls?: AccuDrawControls;\n private _toolTipsSuspended?: true;\n private _expression?: { item: ItemField, operator: string };\n\n /** Settings to control the behavior and visual appearance of the viewport controls.\n * @note Colors were chosen for visibility against viewport background and contents.\n */\n public static controlProps = {\n /** Suspend locate tooltip when controls are shown, may wish to disable when using fixed location. */\n suspendLocateToolTip: true,\n /** Show controls at a fixed location in the view (currently bottom middle) instead of following the cursor. */\n fixedLocation: false,\n /** Layout controls in a single row horizontally instead of in columns vertically as an option when using fixed location. */\n horizontalArrangement: false,\n /** When controls follow the cursor, the X and Y offsets applied to the current point to position the top left (values in inches based on screen DPI) */\n cursorOffset: { x: .4, y: .1 },\n /** Replace \"^\", \";\", and \"..\" with \"°\" or \":\" for easier input. */\n simplifiedInput: true,\n /** Enable simple math operations not supported by quantity parser. */\n mathOperations: true,\n /** Number of visible characters to show in text input fields. */\n fieldSize: 12,\n /** Row spacing of text input fields for vertical arrangement. */\n rowSpacingFactor: 1.2,\n /** Column spacing of text input fields and buttons for horizontal arrangement. */\n columnSpacingFactor: 1.1,\n /** Corner radius of text input fields and locks buttons. */\n borderRadius: \"0.5em\",\n /** Background color of unfocused text input fields and unlocked buttons. */\n backgroundColor: \"rgba(150, 150, 150, 0.5)\",\n\n /** Settings specific to text input fields and lock button labels. */\n text: {\n /** Font family to use for text input field values and button labels. */\n fontFamily: \"sans-serif\",\n /** Font size to use for text input field values and button labels. */\n fontSize: \"9pt\",\n /** Font color to use for text input field values and button labels. */\n color: \"white\",\n /** Background color of focused text input field. */\n focusColor: \"rgba(50, 50, 200, 0.75)\",\n },\n\n /** Settings specific to lock buttons. */\n button: {\n /** Background color of locked buttons. */\n pressedColor: \"rgba(50, 50, 50, 0.75)\",\n /** Margin to use on left and right to position relative to text input field. */\n margin: \"0.25em\",\n /** Width of border outline. */\n outlineWidth: \"thin\",\n /** Shadow shown when unlocked to make it appear raised. */\n shadow: \"0.25em 0.25em 0.2em rgb(75, 75, 75)\",\n },\n };\n\n /** Create a new instance of this class to set as [[IModelAppOptions.accuDraw]] for this session. */\n public constructor() {\n super();\n this._focusItem = this.defaultFocusItem();\n }\n\n /** Call to set a vertical layout that follows the cursor. This is the default configuration. */\n public setVerticalCursorLayout() {\n const props = AccuDrawViewportUI.controlProps;\n props.horizontalArrangement = false;\n props.fixedLocation = false;\n props.suspendLocateToolTip = true;\n }\n\n /** Call to set a horizontal layout that is anchored to the bottom middle of the view. */\n public setHorizontalFixedLayout() {\n const props = AccuDrawViewportUI.controlProps;\n props.horizontalArrangement = true;\n props.fixedLocation = true;\n props.suspendLocateToolTip = false;\n }\n\n /** Call to update the currently displayed controls after settings are changed. */\n public refreshControls(): void {\n if (undefined === this._controls)\n return;\n\n this.removeControls();\n if (!this.isActive)\n return;\n\n // Shouldn't need to call IModelApp.toolAdmin.simulateMotionEvent() in this case...\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n this.updateControls(ev);\n }\n\n private suspendToolTips() {\n if (!AccuDrawViewportUI.controlProps.suspendLocateToolTip || undefined === (this._toolTipsSuspended = (IModelApp.accuSnap.userSettings.toolTip ? true : undefined)))\n return;\n IModelApp.accuSnap.userSettings.toolTip = false;\n IModelApp.notifications.clearToolTip();\n }\n\n private unsuspendToolTips() {\n if (undefined === this._toolTipsSuspended)\n return;\n IModelApp.accuSnap.userSettings.toolTip = true;\n this._toolTipsSuspended = undefined;\n }\n\n private setDynamicKeyinStatus(item: ItemField): void {\n // This does nothing if keyin status is already dynamic...\n AccuDrawShortcuts.itemFieldCompletedInput(item);\n }\n\n private setPartialKeyinStatus(item: ItemField, selectAll: boolean): void {\n if (!this.isDynamicKeyinStatus(item))\n return;\n\n AccuDrawShortcuts.itemFieldNewInput(item);\n if (undefined === this._controls || !selectAll)\n return;\n\n const itemField = this._controls.itemFields[item];\n itemField.setSelectionRange(0, itemField.value.length);\n }\n\n private evaluateExpression(operator: string, operandA: number, operandB: number): number {\n switch (operator) {\n case \"+\":\n return operandA + operandB;\n case \"-\":\n return operandA - operandB;\n case \"*\":\n return operandA * operandB;\n case \"/\":\n return operandA / operandB;\n default:\n return operandA;\n }\n }\n\n private parseExpression(currentValue: string, isAngle: boolean): string | undefined {\n if (undefined === this._expression)\n return undefined; // Not an expression...\n\n // Attempt to parse and apply operation to current value...\n const operator = currentValue.lastIndexOf(this._expression.operator)\n if (-1 === operator) {\n this._expression = undefined; // Operator has been edited out of string, parse current value...\n return undefined;\n }\n\n const parserSpec = (isAngle ? this.getAngleParser() : this.getLengthParser());\n const formatterSpec = (isAngle ? this.getAngleFormatter() : this.getLengthFormatter());\n if (undefined === parserSpec || undefined === formatterSpec)\n return undefined; // Nothing to do...\n\n const operandAStr = currentValue.substring(0, operator);\n const parseResultA = parserSpec.parseToQuantityValue(operandAStr);\n if (!Parser.isParsedQuantity(parseResultA))\n return undefined; // First operand isn't valid, try to parse current value (which is also likely to fail)...\n\n const operandBStr = currentValue.substring(operator + this._expression.operator.length);\n const operatorKey = this._expression.operator[1];\n const isNumber = (\"*\" === operatorKey || \"/\" === operatorKey); // Treat as number for */ and quantity for +-...\n let operandB;\n\n if (isNumber) {\n operandB = parseFloat(operandBStr);\n if (Number.isNaN(operandB))\n return operandAStr; // Second operand is invalid number, set value to first operand which is valid...\n } else {\n const parseResultB = parserSpec.parseToQuantityValue(operandBStr);\n if (!Parser.isParsedQuantity(parseResultB))\n return operandAStr; // Second operand is invalid quantity, set value to first operand which is valid...\n operandB = parseResultB.value;\n }\n\n const operandA = parseResultA.value;\n const newValue = this.evaluateExpression(operatorKey, operandA, operandB);\n const newValueStr = IModelApp.quantityFormatter.formatQuantity(newValue, formatterSpec);\n\n return newValueStr;\n }\n\n private async processPartialInput(item: ItemField): Promise<void> {\n if (undefined === this._controls)\n return;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n\n // If value was cleared, unlock field and sync internal state to cursor location while preserving partial keyin status...\n if (0 === currentValue.length) {\n await this.processFieldInput(item, currentValue, false);\n IModelApp.toolAdmin.simulateMotionEvent();\n return;\n }\n\n const isAngle = (ItemField.ANGLE_Item === item);\n const expressionValue = this.parseExpression(currentValue, isAngle);\n return this.processFieldInput(item, expressionValue ?? currentValue, false);\n }\n\n private async acceptPartialInput(item: ItemField, forward?: boolean): Promise<void> {\n if (undefined === this._controls)\n return;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n\n // Accepting with cleared value needs to set state back to dynamic and sync field to internal state...\n if (0 === currentValue.length && undefined === forward) {\n this.setDynamicKeyinStatus(item);\n return this.updateItemFieldValue(itemField, item);\n }\n\n const isAngle = (ItemField.ANGLE_Item === item);\n const expressionValue = this.parseExpression(currentValue, isAngle);\n\n if (undefined === forward)\n return AccuDrawShortcuts.itemFieldAcceptInput(item, expressionValue ?? currentValue);\n\n return AccuDrawShortcuts.itemFieldNavigate(item, expressionValue ?? currentValue, forward);\n }\n\n private acceptSavedValue(item: ItemField, next: boolean): void {\n if (next)\n AccuDrawShortcuts.chooseNextValue(item);\n else\n AccuDrawShortcuts.choosePreviousValue(item);\n }\n\n private doFocusHome(ev: KeyboardEvent, isDown: boolean, _item: ItemField): void {\n ev.preventDefault();\n if (!isDown || this._isFocusHome)\n return;\n\n ev.stopPropagation();\n this.setFocusHome();\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n\n private async doChooseSavedValue(ev: KeyboardEvent, isDown: boolean, item: ItemField, next: boolean): Promise<void> {\n ev.preventDefault();\n ev.stopPropagation();\n\n if (!isDown)\n return;\n\n this.acceptSavedValue(item, next);\n }\n\n private async doNavigate(ev: KeyboardEvent, isDown: boolean, item: ItemField, forward: boolean): Promise<void> {\n ev.preventDefault();\n ev.stopPropagation();\n\n if (!isDown)\n return;\n\n return this.acceptPartialInput(item, forward);\n }\n\n private async doAcceptInput(ev: KeyboardEvent, isDown: boolean, item: ItemField): Promise<void> {\n ev.preventDefault();\n if (!isDown || this.isDynamicKeyinStatus(item))\n return;\n\n ev.stopPropagation();\n return this.acceptPartialInput(item);\n }\n\n private doNewInput(_ev: KeyboardEvent, isDown: boolean, item: ItemField): void {\n if (!isDown)\n return;\n\n this.setPartialKeyinStatus(item, false);\n }\n\n private async doDeleteInput(_ev: KeyboardEvent, isDown: boolean, item: ItemField): Promise<void> {\n if (isDown)\n return this.setPartialKeyinStatus(item, false);\n\n return this.processPartialInput(item);\n }\n\n private processReplacementKey(ev: KeyboardEvent, isDown: boolean, item: ItemField, replacement: string, allowStart: boolean): boolean {\n if (undefined === this._controls)\n return false;\n\n ev.preventDefault()\n if (!isDown || 0 === replacement.length || this.isDynamicKeyinStatus(item))\n return true;\n\n const itemField = this._controls.itemFields[item];\n if (null === itemField.selectionStart || null === itemField.selectionEnd)\n return true;\n\n const currentValue = itemField.value;\n if (!allowStart && (!currentValue.length || !itemField.selectionStart || !itemField.selectionEnd))\n return true;\n\n const selectionStart = (itemField.selectionStart > itemField.selectionEnd ? itemField.selectionEnd : itemField.selectionStart);\n itemField.value = currentValue.substring(0, selectionStart) + replacement + currentValue.substring(itemField.selectionEnd);\n itemField.selectionStart = itemField.selectionEnd = selectionStart + 1;\n\n return false;\n }\n\n private processRepeatedKey(ev: KeyboardEvent, isDown: boolean, item: ItemField, replacement: string): boolean {\n if (undefined === this._controls)\n return false;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n if (!currentValue.length || !itemField.selectionStart || !itemField.selectionEnd)\n return false;\n\n const selectionStart = (itemField.selectionStart > itemField.selectionEnd ? itemField.selectionEnd : itemField.selectionStart);\n if (selectionStart !== itemField.selectionEnd)\n return false;\n\n const selectionPrevious = selectionStart - 1;\n if (currentValue[selectionPrevious] !== (isDown ? ev.key : replacement))\n return false;\n\n ev.preventDefault()\n if (!isDown)\n return false;\n\n itemField.value = currentValue.substring(0, selectionPrevious) + replacement + currentValue.substring(selectionStart);\n itemField.selectionStart = itemField.selectionEnd = selectionPrevious + 1;\n\n return false;\n }\n\n private doProcessOverrideKey(ev: KeyboardEvent, isDown: boolean, item: ItemField): boolean {\n if (undefined === this._controls || !AccuDrawViewportUI.controlProps.simplifiedInput)\n return false;\n\n switch (ev.key) {\n case \"^\":\n return this.processReplacementKey(ev, isDown, item, (ItemField.ANGLE_Item === item ? \"°\" : \"\"), false); // Easier \"°\" input...\n case \";\":\n return this.processReplacementKey(ev, isDown, item, (ItemField.ANGLE_Item === item ? \"°\" : \":\"), false); // Easier \":\" input still useful w/o MU:SU:PU?\n case \".\":\n return this.processRepeatedKey(ev, isDown, item, \":\"); // Still useful replacing \"..\" with \":\" for numeric keypad users w/o MU:SU:PU?\n default:\n return false;\n }\n }\n\n private doProcessExpressionKey(ev: KeyboardEvent, isDown: boolean, item: ItemField): boolean {\n if (undefined === this._controls || !AccuDrawViewportUI.controlProps.mathOperations)\n return false;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n\n switch (ev.key) {\n case \"ArrowLeft\":\n case \"ArrowRight\":\n if (undefined === this._expression || !isDown || this.isDynamicKeyinStatus(item) || !itemField.selectionStart)\n break;\n\n const moveLeft = (\"ArrowLeft\" === ev.key);\n const operatorPosIns = currentValue.lastIndexOf(this._expression.operator);\n if (itemField.selectionStart !== (moveLeft ? operatorPosIns + this._expression.operator.length : operatorPosIns))\n break;\n\n // Treat expression operator string as a single character when moving the text insertion cursor...\n itemField.selectionStart = itemField.selectionEnd = (moveLeft ? operatorPosIns : operatorPosIns + this._expression.operator.length);\n ev.preventDefault();\n return true;\n\n case \"Backspace\":\n case \"Delete\":\n if (undefined === this._expression || !isDown || this.isDynamicKeyinStatus(item) || !itemField.selectionStart)\n break;\n\n const deleteBefore = (\"Backspace\" === ev.key);\n const operatorPosDel = currentValue.lastIndexOf(this._expression.operator);\n if (itemField.selectionStart !== (deleteBefore ? operatorPosDel + this._expression.operator.length : operatorPosDel))\n break;\n\n // Treat expression operator string as single character for delete...\n itemField.value = currentValue.substring(0, operatorPosDel);\n itemField.selectionStart = itemField.selectionEnd = itemField.value.length;\n this._expression = undefined;\n ev.preventDefault();\n return true;\n\n case \" \":\n if (!isDown || !this.isDynamicKeyinStatus(item))\n break;\n\n this.setPartialKeyinStatus(item, false); // Replacing current w/space isn't useful, append to end to support + or - more conveniently...\n return true;\n\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n if (!isDown || undefined !== this._expression)\n break;\n\n if (!currentValue.length || !itemField.selectionStart || itemField.selectionStart !== currentValue.length)\n break;\n\n const haveSpace = (\" \" === currentValue[itemField.selectionStart - 1]);\n const requireSpace = (\"+\" === ev.key || \"-\" === ev.key); // These are valid for 1st character to replace current value...\n\n if (!(requireSpace ? haveSpace : (haveSpace || this.isDynamicKeyinStatus(item))))\n break;\n\n const operator = ` ${ev.key} `\n const expression = `${currentValue + (haveSpace ? operator.substring(1) : operator)}`;\n\n itemField.value = expression;\n itemField.selectionStart = itemField.selectionEnd = itemField.value.length;\n this._expression = { item, operator };\n\n this.setPartialKeyinStatus(item, false);\n ev.preventDefault();\n\n return true;\n }\n\n return false;\n }\n\n private async doProcessKey(ev: KeyboardEvent, isDown: boolean, item: ItemField): Promise<void> {\n if (!this.itemFieldInputIsValid(ev.key, item)) {\n ev.preventDefault(); // Ignore potential shortcuts...\n return;\n }\n\n if (this.doProcessOverrideKey(ev, isDown, item))\n return;\n\n if (this.doProcessExpressionKey(ev, isDown, item))\n return;\n\n if (isDown)\n return this.setPartialKeyinStatus(item, true);\n\n return this.processPartialInput(item);\n }\n\n private async onKeyboardEvent(ev: KeyboardEvent, isDown: boolean): Promise<void> {\n if (ev.ctrlKey || ev.altKey || ev.metaKey)\n return; // Ignore qualifiers other than shift...\n\n switch (ev.key) {\n case \"Escape\":\n return this.doFocusHome(ev, isDown, this._focusItem);\n case \"PageDown\":\n return this.doChooseSavedValue(ev, isDown, this._focusItem, true);\n case \"PageUp\":\n return this.doChooseSavedValue(ev, isDown, this._focusItem, false);\n case \"Tab\":\n return this.doNavigate(ev, isDown, this._focusItem, !ev.shiftKey);\n case \"ArrowDown\":\n if (ev.shiftKey)\n return this.doChooseSavedValue(ev, isDown, this._focusItem, true);\n return this.doNavigate(ev, isDown, this._focusItem, true);\n case \"ArrowUp\":\n if (ev.shiftKey)\n return this.doChooseSavedValue(ev, isDown, this._focusItem, false);\n return this.doNavigate(ev, isDown, this._focusItem, false);\n case \"Enter\":\n return this.doAcceptInput(ev, isDown, this._focusItem);\n case \"Home\":\n case \"End\":\n case \"Insert\":\n return this.doNewInput(ev, isDown, this._focusItem);\n case \"ArrowLeft\":\n case \"ArrowRight\":\n if (this.doProcessExpressionKey(ev, isDown, this._focusItem))\n return;\n return this.doNewInput(ev, isDown, this._focusItem);\n case \"Backspace\":\n case \"Delete\":\n if (this.doProcessExpressionKey(ev, isDown, this._focusItem))\n return;\n return this.doDeleteInput(ev, isDown, this._focusItem);\n default:\n return this.doProcessKey(ev, isDown, this._focusItem);\n }\n }\n\n private removeControls(): void {\n if (undefined === this._controls)\n return;\n\n this._controls.overlay.remove();\n this._controls = undefined;\n this.unsuspendToolTips();\n }\n\n private createControlDiv(): HTMLDivElement {\n const div = document.createElement(\"div\");\n div.className = \"accudraw-controls\";\n\n const style = div.style;\n style.pointerEvents = \"none\";\n style.overflow = \"visible\"; // Don't clip/hide outline or shadow...\n style.position = \"absolute\";\n style.top = style.left = \"0\";\n style.height = style.width = \"100%\";\n\n return div;\n }\n\n private updateItemFieldKeyinStatus(itemField: HTMLInputElement, item: ItemField) {\n const isDynamic = this.isDynamicKeyinStatus(item)\n\n if (isDynamic && item === this._expression?.item)\n this._expression = undefined; // Only valid when entering partial input...\n\n itemField.style.caretColor = isDynamic ? \"transparent\" : itemField.style.color;\n }\n\n private updateItemFieldValue(itemField: HTMLInputElement, item: ItemField) {\n const value = this.getFormattedValueByIndex(item)\n itemField.value = value;\n this.updateItemFieldKeyinStatus(itemField, item);\n }\n\n private updateItemFieldLock(itemLock: HTMLButtonElement, item: ItemField) {\n const locked = this.getFieldLock(item);\n itemLock.style.outlineStyle = locked ? \"inset\" : \"outset\";\n itemLock.style.boxShadow = locked ? \"none\" : AccuDrawViewportUI.controlProps.button.shadow;\n itemLock.style.backgroundColor = locked ? AccuDrawViewportUI.controlProps.button.pressedColor : AccuDrawViewportUI.controlProps.backgroundColor;\n }\n\n private initializeItemStyle(style: CSSStyleDeclaration, isButton: boolean): void {\n style.pointerEvents = \"none\"; // Don't receive pointer events...\n style.position = \"absolute\";\n style.textWrap = \"nowrap\";\n style.textAnchor = \"top\";\n style.textAlign = isButton ? \"center\" : \"left\";\n\n const controlProps = AccuDrawViewportUI.controlProps;\n style.fontFamily = controlProps.text.fontFamily;\n style.fontSize = controlProps.text.fontSize;\n style.color = controlProps.text.color;\n style.backgroundColor = controlProps.backgroundColor;\n style.borderRadius = controlProps.borderRadius;\n }\n\n private createItemField(item: ItemField): HTMLInputElement {\n const itemField = document.createElement(\"input\");\n\n itemField.contentEditable = \"true\";\n itemField.size = AccuDrawViewportUI.controlProps.fieldSize;\n\n const style = itemField.style;\n this.initializeItemStyle(style, false);\n this.updateItemFieldValue(itemField, item);\n\n itemField.onkeydown = async (ev: KeyboardEvent) => { await this.onKeyboardEvent(ev, true); };\n itemField.onkeyup = async (ev: KeyboardEvent) => { await this.onKeyboardEvent(ev, false); };\n itemField.onfocus = (ev: FocusEvent) => { this.onFocusChange(ev, item, true); };\n itemField.onblur = (ev: FocusEvent) => { this.onFocusChange(ev, item, false); };;\n\n return itemField;\n }\n\n private createItemFieldLock(item: ItemField): HTMLButtonElement {\n const itemLock = document.createElement(\"button\");\n\n itemLock.type = \"button\";\n itemLock.contentEditable = \"false\";\n itemLock.disabled = true; // Don't receive focus...\n\n switch (item) {\n case ItemField.DIST_Item:\n itemLock.innerHTML = \"\\u21A6\"; // right arrow from bar...\n break;\n case ItemField.ANGLE_Item:\n itemLock.innerHTML = \"\\u2221\"; // measured angle...\n break;\n case ItemField.X_Item:\n itemLock.innerHTML = \"X\";\n break;\n case ItemField.Y_Item:\n itemLock.innerHTML = \"Y\";\n break;\n case ItemField.Z_Item:\n itemLock.innerHTML = \"Z\";\n break;\n }\n\n const style = itemLock.style;\n this.initializeItemStyle(style, true);\n this.updateItemFieldLock(itemLock, item);\n\n const button = AccuDrawViewportUI.controlProps.button;\n style.paddingLeft = style.paddingRight = \"0\";\n style.marginLeft = style.marginRight = button.margin;\n style.outlineWidth = button.outlineWidth;\n\n return itemLock;\n }\n\n /** Use to override the position of the controls in the supplied view. */\n protected modifyControlRect(_rect: ViewRect, _vp: ScreenViewport): void { }\n\n /** Return the ViewRect currently occupied by the controls in the supplied view. */\n protected currentControlRect(vp: ScreenViewport): ViewRect | undefined {\n if (undefined === this._controls || this._controls.overlay.parentElement !== vp.vpDiv)\n return undefined;\n\n const viewRect = vp.vpDiv.getBoundingClientRect();\n const elemRect = this._controls.div.getBoundingClientRect();\n const controlRect = new ViewRect(elemRect.left - viewRect.left, elemRect.top - viewRect.top, elemRect.right - viewRect.left, elemRect.bottom - viewRect.top);\n\n return controlRect;\n }\n\n private updateControlVisibility(isPolar: boolean, is3d?: boolean): void {\n if (undefined === this._controls)\n return;\n\n this._controls.itemFields[ItemField.ANGLE_Item].hidden = !isPolar;\n this._controls.itemLocks[ItemField.ANGLE_Item].hidden = !isPolar;\n\n this._controls.itemFields[ItemField.DIST_Item].hidden = !isPolar;\n this._controls.itemLocks[ItemField.DIST_Item].hidden = !isPolar;\n\n this._controls.itemFields[ItemField.X_Item].hidden = isPolar;\n this._controls.itemLocks[ItemField.X_Item].hidden = isPolar;\n\n this._controls.itemFields[ItemField.Y_Item].hidden = isPolar;\n this._controls.itemLocks[ItemField.Y_Item].hidden = isPolar;\n\n if (undefined === is3d)\n return;\n\n this._controls.itemFields[ItemField.Z_Item].hidden = !is3d;\n this._controls.itemLocks[ItemField.Z_Item].hidden = !is3d;\n }\n\n private updateControls(ev: BeButtonEvent): void {\n const vp = ev.viewport;\n if (undefined === vp || !this.isActive)\n return;\n\n if (undefined !== this._controls && this._controls.overlay.parentElement !== vp.vpDiv)\n this.removeControls(); // Could be enhanced to save/restore partial input of currently focused item...\n\n const props = AccuDrawViewportUI.controlProps;\n\n if (undefined === this._controls) {\n const overlay = vp.addNewDiv(\"accudraw-overlay\", true, 35);\n const div = this.createControlDiv();\n const is3dLayout = this.is3dCompass(vp);\n const isHorizontalLayout = props.horizontalArrangement;\n\n overlay.appendChild(div);\n\n const createFieldAndLock = (item: ItemField) => {\n const itemField = itemFields[item] = this.createItemField(item);\n itemField.style.top = isHorizontalLayout ? \"0\" : `${rowOffset}px`;\n itemField.style.left = isHorizontalLayout ? `${columnOffset}px` : \"0\";\n\n div.appendChild(itemField);\n\n if (is3dLayout || ItemField.Z_Item !== item)\n rowOffset += itemField.offsetHeight * props.rowSpacingFactor;\n\n itemWidth = itemField.offsetWidth;\n itemHeight = itemField.offsetHeight;\n\n const itemLock = itemLocks[item] = this.createItemFieldLock(item);\n itemLock.style.top = itemField.style.top;\n itemLock.style.left = isHorizontalLayout ? `${columnOffset + itemWidth}px` : `${itemWidth}px`;\n itemLock.style.width = itemLock.style.height = `${itemHeight}px`; // Make square of same height as text field...\n\n div.appendChild(itemLock);\n\n lockWidth = itemLock.offsetWidth;\n\n if (is3dLayout || ItemField.Z_Item !== item)\n columnOffset += (itemWidth + lockWidth) * props.columnSpacingFactor;\n };\n\n let rowOffset = 0;\n let columnOffset = 0;\n let itemWidth = 0;\n let itemHeight = 0;\n let lockWidth = 0;\n\n const itemFields: HTMLInputElement[] = [];\n const itemLocks: HTMLButtonElement[] = [];\n\n createFieldAndLock(ItemField.DIST_Item);\n createFieldAndLock(ItemField.ANGLE_Item);\n\n rowOffset = 0;\n columnOffset = 0;\n\n createFieldAndLock(ItemField.X_Item);\n createFieldAndLock(ItemField.Y_Item);\n createFieldAndLock(ItemField.Z_Item); // Both polar and rectangular modes support Z in 3d views...\n\n div.style.width = isHorizontalLayout ? `${columnOffset}px` : `${itemWidth + lockWidth + 5}px`;\n div.style.height = isHorizontalLayout ? `${itemHeight * props.rowSpacingFactor}px` : `${rowOffset}px`;\n\n this._controls = { overlay, div, itemFields, itemLocks };\n this.updateControlVisibility(CompassMode.Polar === this.compassMode, this.is3dCompass(vp));\n this.setFocusItem(this._focusItem);\n this.suspendToolTips();\n\n vp.onChangeView.addOnce(() => this.removeControls()); // Clear on view change/closure...\n }\n\n const viewRect = vp.viewRect;\n const position = vp.worldToView(ev.point);\n\n if (props.fixedLocation) {\n position.x = (viewRect.left + ((viewRect.width - this._controls.div.offsetWidth) * 0.5));\n position.y = (viewRect.bottom - this._controls.div.offsetHeight);\n } else {\n position.x += Math.floor(vp.pixelsFromInches(props.cursorOffset.x)) + 0.5;\n position.y += Math.floor(vp.pixelsFromInches(props.cursorOffset.y)) + 0.5;\n }\n\n const controlRect = new ViewRect(position.x, position.y, position.x + this._controls.div.offsetWidth, position.y + this._controls.div.offsetHeight);\n this.modifyControlRect(controlRect, vp);\n\n if (!controlRect.isContained(viewRect))\n return; // Keep showing at last valid location...\n\n this._controls.div.style.left = `${controlRect.left}px`;\n this._controls.div.style.top = `${controlRect.top}px`;\n }\n\n private get _isFocusHome(): boolean {\n return (document.body === document.activeElement);\n }\n\n private get _isFocusAccuDraw(): boolean {\n return (undefined !== this._controls && document.activeElement?.parentElement === this._controls.itemFields[this._focusItem].parentElement);\n }\n\n private setFocusHome(): void {\n const element = document.activeElement as HTMLElement;\n if (element && element !== document.body)\n element.blur();\n document.body.focus();\n }\n\n /** Return whether keyboard shortcuts can or can't be used.\n * Used to show a visual indication of whether keyboard shortcuts will be processed.\n * Keyboard shortcuts can be supported when focus is either on AccuDraw or Home.\n * When returning false the compass displays in monochrome.\n */\n public override get hasInputFocus(): boolean {\n // Indicate when keyboard shortcuts can't be used (i.e. focus not at AccuDraw or Home) by changing compass to monochrome...\n return (this._isFocusHome || this._isFocusAccuDraw);\n }\n\n /** Request to set focus to the specified AccuDraw input field to start entering values.\n * The focused input field will be indicated by the background color.\n */\n public override setFocusItem(index: ItemField) {\n this._focusItem = index;\n if (undefined === this._controls)\n return;\n const itemField = this._controls.itemFields[this._focusItem];\n itemField.focus();\n }\n\n /** Request to set focus to the active AccuDraw input field to start entering values.\n * The focused input field will be indicated by the background color.\n */\n public override grabInputFocus() {\n // Set focus to active input field for entering values...\n if (this._isFocusAccuDraw)\n return;\n this.setFocusItem(this._focusItem);\n }\n\n private onFocusChange(_ev: FocusEvent, item: ItemField, focusIn: boolean): void {\n if (undefined === this._controls)\n return;\n\n // NOTE: Using \"setSelectionRange\" while value is changing in dynamics isn't pretty, use background+caret color instead...\n const itemField = this._controls.itemFields[item];\n itemField.style.backgroundColor = (focusIn ? AccuDrawViewportUI.controlProps.text.focusColor : AccuDrawViewportUI.controlProps.backgroundColor);\n this.updateItemFieldKeyinStatus(itemField, item);\n\n if (!focusIn)\n this.setDynamicKeyinStatus(item);\n }\n\n /** Change notification for when the compass is shown or hidden.\n * Used to hide the viewport controls when the compass is no longer displayed.\n */\n public override onCompassDisplayChange(state: \"show\" | \"hide\"): void {\n if (\"show\" === state)\n return;\n this.removeControls();\n }\n\n /** Change notification for when the compass mode switches between polar and rectangular inputs.\n * Used to show or hide the input fields that are applicable to the current mode.\n */\n public override onCompassModeChange(): void {\n this.updateControlVisibility(CompassMode.Polar === this.compassMode);\n this.setFocusItem(this.defaultFocusItem());\n }\n\n /** Change notification for when the supplied input field switches between dynamic and partial input.\n * When an input field is in the dynamic state, its value changes according to the current button event unless the field is locked.\n * When an input field is in the partial state, its value is not changed or formatted to allow the value to be changed.\n * Locking a field is expected to change the input state to partial.\n * Unlocking a field or accepting a value by focusing is expected to change the input state to dynamic.\n */\n public override onFieldKeyinStatusChange(item: ItemField) {\n if (undefined === this._controls)\n return;\n this.updateItemFieldKeyinStatus(this._controls.itemFields[item], item)\n }\n\n /** Change notification for when the supplied input field value has been modified.\n * Used to update the displayed input field with the value from the active angle or distance formatter.\n */\n public override onFieldValueChange(item: ItemField) {\n if (undefined === this._controls)\n return;\n this.updateItemFieldValue(this._controls.itemFields[item], item);\n }\n\n /** Change notification for when the supplied input field lock status is modified.\n * Used to update the displayed lock toggles to reflect the current state.\n */\n public override onFieldLockChange(item: ItemField) {\n if (undefined === this._controls)\n return;\n this.updateItemFieldLock(this._controls.itemLocks[item], item);\n }\n\n /** Change notification of a motion event in the view.\n * Used to show as well as update the dynamic input field values to reflect the current deltas when active.\n * Automatically switches the focused input field between x and y in rectangular mode based on\n * cursor position when axis isn't locked to support more intuitive user input and \"smart lock\" keyboard shortcut.\n */\n public override onMotion(ev: BeButtonEvent): void {\n this.updateControls(ev);\n this.processMotion();\n }\n}\n"]}
1
+ {"version":3,"file":"AccuDrawViewportUI.js","sourceRoot":"","sources":["../../../src/tools/AccuDrawViewportUI.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module AccuDraw\n */\nimport { Parser } from \"@itwin/core-quantity\";\nimport { AccuDraw, CompassMode, ItemField } from \"../AccuDraw\";\nimport { ViewRect } from \"../common/ViewRect\";\nimport { IModelApp } from \"../IModelApp\";\nimport { AccuDrawShortcuts } from \"./AccuDrawTool\";\nimport { BeButtonEvent } from \"./Tool\";\nimport { ScreenViewport } from \"../Viewport\";\n\ninterface AccuDrawControls {\n overlay: HTMLDivElement; // Viewport overlay...\n div: HTMLDivElement; // Child of overlay used to position controls...\n itemFields: HTMLInputElement[]; // Text fields indexed by ItemField...\n itemLocks: HTMLButtonElement[]; // Lock toggles indexed by ItemField...\n}\n\n/** Provides an in viewport user interface for AccuDraw that can optionally follow the cursor or remain at a fixed location.\n * @beta\n */\nexport class AccuDrawViewportUI extends AccuDraw {\n private _focusItem: ItemField;\n private _controls?: AccuDrawControls;\n private _toolTipsSuspended?: true;\n private _expression?: { item: ItemField, operator: string };\n\n /** Settings to control the behavior and visual appearance of the viewport controls.\n * @note Colors were chosen for visibility against viewport background and contents.\n */\n public static controlProps = {\n /** Suspend locate tooltip when controls are shown, may wish to disable when using fixed location. */\n suspendLocateToolTip: true,\n /** Show controls at a fixed location in the view (currently bottom middle) instead of following the cursor. */\n fixedLocation: false,\n /** Layout controls in a single row horizontally instead of in columns vertically as an option when using fixed location. */\n horizontalArrangement: false,\n /** When controls follow the cursor, the X and Y offsets applied to the current point to position the top left (values in inches based on screen DPI) */\n cursorOffset: { x: .4, y: .1 },\n /** Replace \"^\", \";\", and \"..\" with \"°\" or \":\" for easier input. */\n simplifiedInput: true,\n /** Enable simple math operations not supported by quantity parser. */\n mathOperations: true,\n /** Number of visible characters to show in text input fields. */\n fieldSize: 12,\n /** Row spacing of text input fields for vertical arrangement. */\n rowSpacingFactor: 1.2,\n /** Column spacing of text input fields and buttons for horizontal arrangement. */\n columnSpacingFactor: 1.1,\n /** Corner radius of text input fields and locks buttons. */\n borderRadius: \"0.5em\",\n /** Background color of unfocused text input fields and unlocked buttons. */\n backgroundColor: \"rgba(150, 150, 150, 0.5)\",\n\n /** Settings specific to text input fields and lock button labels. */\n text: {\n /** Font family to use for text input field values and button labels. */\n fontFamily: \"sans-serif\",\n /** Font size to use for text input field values and button labels. */\n fontSize: \"9pt\",\n /** Font color to use for text input field values and button labels. */\n color: \"white\",\n /** Background color of focused text input field. */\n focusColor: \"rgba(50, 50, 200, 0.75)\",\n },\n\n /** Settings specific to lock buttons. */\n button: {\n /** Background color of locked buttons. */\n pressedColor: \"rgba(50, 50, 50, 0.75)\",\n /** Margin to use on left and right to position relative to text input field. */\n margin: \"0.25em\",\n /** Width of border outline. */\n outlineWidth: \"thin\",\n /** Shadow shown when unlocked to make it appear raised. */\n shadow: \"0.25em 0.25em 0.2em rgb(75, 75, 75)\",\n },\n };\n\n /** Create a new instance of this class to set as [[IModelAppOptions.accuDraw]] for this session. */\n public constructor() {\n super();\n this._focusItem = this.defaultFocusItem();\n }\n\n /** Call to set a vertical layout that follows the cursor. This is the default configuration. */\n public setVerticalCursorLayout() {\n const props = AccuDrawViewportUI.controlProps;\n props.horizontalArrangement = false;\n props.fixedLocation = false;\n props.suspendLocateToolTip = true;\n }\n\n /** Call to set a horizontal layout that is anchored to the bottom middle of the view. */\n public setHorizontalFixedLayout() {\n const props = AccuDrawViewportUI.controlProps;\n props.horizontalArrangement = true;\n props.fixedLocation = true;\n props.suspendLocateToolTip = false;\n }\n\n /** Call to update the currently displayed controls after settings are changed. */\n public refreshControls(): void {\n if (undefined === this._controls)\n return;\n\n this.removeControls();\n if (!this.isActive)\n return;\n\n // Shouldn't need to call IModelApp.toolAdmin.simulateMotionEvent() in this case...\n const ev = new BeButtonEvent();\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\n this.updateControls(ev);\n }\n\n private suspendToolTips() {\n if (!AccuDrawViewportUI.controlProps.suspendLocateToolTip || undefined === (this._toolTipsSuspended = (IModelApp.accuSnap.userSettings.toolTip ? true : undefined)))\n return;\n IModelApp.accuSnap.userSettings.toolTip = false;\n IModelApp.notifications.clearToolTip();\n }\n\n private unsuspendToolTips() {\n if (undefined === this._toolTipsSuspended)\n return;\n IModelApp.accuSnap.userSettings.toolTip = true;\n this._toolTipsSuspended = undefined;\n }\n\n private setDynamicKeyinStatus(item: ItemField): void {\n // This does nothing if keyin status is already dynamic...\n AccuDrawShortcuts.itemFieldCompletedInput(item);\n }\n\n private setPartialKeyinStatus(item: ItemField, selectAll: boolean): void {\n if (!this.isDynamicKeyinStatus(item))\n return;\n\n AccuDrawShortcuts.itemFieldNewInput(item);\n if (undefined === this._controls || !selectAll)\n return;\n\n const itemField = this._controls.itemFields[item];\n itemField.setSelectionRange(0, itemField.value.length);\n }\n\n private evaluateExpression(operator: string, operandA: number, operandB: number): number {\n switch (operator) {\n case \"+\":\n return operandA + operandB;\n case \"-\":\n return operandA - operandB;\n case \"*\":\n return operandA * operandB;\n case \"/\":\n return operandA / operandB;\n default:\n return operandA;\n }\n }\n\n private parseExpression(currentValue: string, isAngle: boolean): string | undefined {\n if (undefined === this._expression)\n return undefined; // Not an expression...\n\n // Attempt to parse and apply operation to current value...\n const operator = currentValue.lastIndexOf(this._expression.operator)\n if (-1 === operator) {\n this._expression = undefined; // Operator has been edited out of string, parse current value...\n return undefined;\n }\n\n const parserSpec = (isAngle ? this.getAngleParser() : this.getLengthParser());\n const formatterSpec = (isAngle ? this.getAngleFormatter() : this.getLengthFormatter());\n if (undefined === parserSpec || undefined === formatterSpec)\n return undefined; // Nothing to do...\n\n const operandAStr = currentValue.substring(0, operator);\n const parseResultA = parserSpec.parseToQuantityValue(operandAStr);\n if (!Parser.isParsedQuantity(parseResultA))\n return undefined; // First operand isn't valid, try to parse current value (which is also likely to fail)...\n\n const operandBStr = currentValue.substring(operator + this._expression.operator.length);\n const operatorKey = this._expression.operator[1];\n const isNumber = (\"*\" === operatorKey || \"/\" === operatorKey); // Treat as number for */ and quantity for +-...\n let operandB;\n\n if (isNumber) {\n operandB = parseFloat(operandBStr);\n if (Number.isNaN(operandB))\n return operandAStr; // Second operand is invalid number, set value to first operand which is valid...\n } else {\n const parseResultB = parserSpec.parseToQuantityValue(operandBStr);\n if (!Parser.isParsedQuantity(parseResultB))\n return operandAStr; // Second operand is invalid quantity, set value to first operand which is valid...\n operandB = parseResultB.value;\n }\n\n const operandA = parseResultA.value;\n const newValue = this.evaluateExpression(operatorKey, operandA, operandB);\n const newValueStr = IModelApp.quantityFormatter.formatQuantity(newValue, formatterSpec);\n\n return newValueStr;\n }\n\n private async processPartialInput(item: ItemField): Promise<void> {\n if (undefined === this._controls)\n return;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n\n // If value was cleared, unlock field and sync internal state to cursor location while preserving partial keyin status...\n if (0 === currentValue.length) {\n await this.processFieldInput(item, currentValue, false);\n IModelApp.toolAdmin.simulateMotionEvent();\n return;\n }\n\n const isAngle = (ItemField.ANGLE_Item === item);\n const expressionValue = this.parseExpression(currentValue, isAngle);\n return this.processFieldInput(item, expressionValue ?? currentValue, false);\n }\n\n private async acceptPartialInput(item: ItemField, forward?: boolean): Promise<void> {\n if (undefined === this._controls)\n return;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n\n // Accepting with cleared value needs to set state back to dynamic and sync field to internal state...\n if (0 === currentValue.length && undefined === forward) {\n this.setDynamicKeyinStatus(item);\n return this.updateItemFieldValue(itemField, item);\n }\n\n const isAngle = (ItemField.ANGLE_Item === item);\n const expressionValue = this.parseExpression(currentValue, isAngle);\n\n if (undefined === forward)\n return AccuDrawShortcuts.itemFieldAcceptInput(item, expressionValue ?? currentValue);\n\n return AccuDrawShortcuts.itemFieldNavigate(item, expressionValue ?? currentValue, forward);\n }\n\n private acceptSavedValue(item: ItemField, next: boolean): void {\n if (next)\n AccuDrawShortcuts.chooseNextValue(item);\n else\n AccuDrawShortcuts.choosePreviousValue(item);\n }\n\n private doFocusHome(ev: KeyboardEvent, isDown: boolean, _item: ItemField): void {\n ev.preventDefault();\n if (!isDown || this._isFocusHome)\n return;\n\n ev.stopPropagation();\n this.setFocusHome();\n IModelApp.viewManager.invalidateDecorationsAllViews();\n }\n\n private async doChooseSavedValue(ev: KeyboardEvent, isDown: boolean, item: ItemField, next: boolean): Promise<void> {\n ev.preventDefault();\n ev.stopPropagation();\n\n if (!isDown)\n return;\n\n this.acceptSavedValue(item, next);\n }\n\n private async doNavigate(ev: KeyboardEvent, isDown: boolean, item: ItemField, forward: boolean): Promise<void> {\n ev.preventDefault();\n ev.stopPropagation();\n\n if (!isDown)\n return;\n\n return this.acceptPartialInput(item, forward);\n }\n\n private async doAcceptInput(ev: KeyboardEvent, isDown: boolean, item: ItemField): Promise<void> {\n ev.preventDefault();\n if (!isDown || this.isDynamicKeyinStatus(item))\n return;\n\n ev.stopPropagation();\n return this.acceptPartialInput(item);\n }\n\n private doNewInput(_ev: KeyboardEvent, isDown: boolean, item: ItemField): void {\n if (!isDown)\n return;\n\n this.setPartialKeyinStatus(item, false);\n }\n\n private async doDeleteInput(_ev: KeyboardEvent, isDown: boolean, item: ItemField): Promise<void> {\n if (isDown)\n return this.setPartialKeyinStatus(item, false);\n\n return this.processPartialInput(item);\n }\n\n private processReplacementKey(ev: KeyboardEvent, isDown: boolean, item: ItemField, replacement: string, allowStart: boolean): boolean {\n if (undefined === this._controls)\n return false;\n\n ev.preventDefault()\n if (!isDown || 0 === replacement.length || this.isDynamicKeyinStatus(item))\n return true;\n\n const itemField = this._controls.itemFields[item];\n if (null === itemField.selectionStart || null === itemField.selectionEnd)\n return true;\n\n const currentValue = itemField.value;\n if (!allowStart && (!currentValue.length || !itemField.selectionStart || !itemField.selectionEnd))\n return true;\n\n const selectionStart = (itemField.selectionStart > itemField.selectionEnd ? itemField.selectionEnd : itemField.selectionStart);\n itemField.value = currentValue.substring(0, selectionStart) + replacement + currentValue.substring(itemField.selectionEnd);\n itemField.selectionStart = itemField.selectionEnd = selectionStart + 1;\n\n return false;\n }\n\n private processRepeatedKey(ev: KeyboardEvent, isDown: boolean, item: ItemField, replacement: string): boolean {\n if (undefined === this._controls)\n return false;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n if (!currentValue.length || !itemField.selectionStart || !itemField.selectionEnd)\n return false;\n\n const selectionStart = (itemField.selectionStart > itemField.selectionEnd ? itemField.selectionEnd : itemField.selectionStart);\n if (selectionStart !== itemField.selectionEnd)\n return false;\n\n const selectionPrevious = selectionStart - 1;\n if (currentValue[selectionPrevious] !== (isDown ? ev.key : replacement))\n return false;\n\n ev.preventDefault()\n if (!isDown)\n return false;\n\n itemField.value = currentValue.substring(0, selectionPrevious) + replacement + currentValue.substring(selectionStart);\n itemField.selectionStart = itemField.selectionEnd = selectionPrevious + 1;\n\n return false;\n }\n\n private doProcessOverrideKey(ev: KeyboardEvent, isDown: boolean, item: ItemField): boolean {\n if (undefined === this._controls || !AccuDrawViewportUI.controlProps.simplifiedInput)\n return false;\n\n switch (ev.key) {\n case \"^\":\n return this.processReplacementKey(ev, isDown, item, (ItemField.ANGLE_Item === item ? \"°\" : \"\"), false); // Easier \"°\" input...\n case \";\":\n return this.processReplacementKey(ev, isDown, item, (ItemField.ANGLE_Item === item ? \"°\" : \":\"), false); // Easier \":\" input still useful w/o MU:SU:PU?\n case \".\":\n return this.processRepeatedKey(ev, isDown, item, \":\"); // Still useful replacing \"..\" with \":\" for numeric keypad users w/o MU:SU:PU?\n default:\n return false;\n }\n }\n\n private doProcessExpressionKey(ev: KeyboardEvent, isDown: boolean, item: ItemField): boolean {\n if (undefined === this._controls || !AccuDrawViewportUI.controlProps.mathOperations)\n return false;\n\n const itemField = this._controls.itemFields[item];\n const currentValue = itemField.value;\n\n switch (ev.key) {\n case \"ArrowLeft\":\n case \"ArrowRight\":\n if (undefined === this._expression || !isDown || this.isDynamicKeyinStatus(item) || !itemField.selectionStart)\n break;\n\n const moveLeft = (\"ArrowLeft\" === ev.key);\n const operatorPosIns = currentValue.lastIndexOf(this._expression.operator);\n if (itemField.selectionStart !== (moveLeft ? operatorPosIns + this._expression.operator.length : operatorPosIns))\n break;\n\n // Treat expression operator string as a single character when moving the text insertion cursor...\n itemField.selectionStart = itemField.selectionEnd = (moveLeft ? operatorPosIns : operatorPosIns + this._expression.operator.length);\n ev.preventDefault();\n return true;\n\n case \"Backspace\":\n case \"Delete\":\n if (undefined === this._expression || !isDown || this.isDynamicKeyinStatus(item) || !itemField.selectionStart)\n break;\n\n const deleteBefore = (\"Backspace\" === ev.key);\n const operatorPosDel = currentValue.lastIndexOf(this._expression.operator);\n if (itemField.selectionStart !== (deleteBefore ? operatorPosDel + this._expression.operator.length : operatorPosDel))\n break;\n\n // Treat expression operator string as single character for delete...\n itemField.value = currentValue.substring(0, operatorPosDel);\n itemField.selectionStart = itemField.selectionEnd = itemField.value.length;\n this._expression = undefined;\n ev.preventDefault();\n return true;\n\n case \" \":\n if (!isDown || !this.isDynamicKeyinStatus(item))\n break;\n\n this.setPartialKeyinStatus(item, false); // Replacing current w/space isn't useful, append to end to support + or - more conveniently...\n return true;\n\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n if (!isDown || undefined !== this._expression)\n break;\n\n if (!currentValue.length || !itemField.selectionStart || itemField.selectionStart !== currentValue.length)\n break;\n\n const haveSpace = (\" \" === currentValue[itemField.selectionStart - 1]);\n const requireSpace = (\"+\" === ev.key || \"-\" === ev.key); // These are valid for 1st character to replace current value...\n\n if (!(requireSpace ? haveSpace : (haveSpace || this.isDynamicKeyinStatus(item))))\n break;\n\n const operator = ` ${ev.key} `\n const expression = `${currentValue + (haveSpace ? operator.substring(1) : operator)}`;\n\n itemField.value = expression;\n itemField.selectionStart = itemField.selectionEnd = itemField.value.length;\n this._expression = { item, operator };\n\n this.setPartialKeyinStatus(item, false);\n ev.preventDefault();\n\n return true;\n }\n\n return false;\n }\n\n private async doProcessKey(ev: KeyboardEvent, isDown: boolean, item: ItemField): Promise<void> {\n if (!this.itemFieldInputIsValid(ev.key, item)) {\n ev.preventDefault(); // Ignore potential shortcuts...\n return;\n }\n\n if (this.doProcessOverrideKey(ev, isDown, item))\n return;\n\n if (this.doProcessExpressionKey(ev, isDown, item))\n return;\n\n if (isDown)\n return this.setPartialKeyinStatus(item, true);\n\n return this.processPartialInput(item);\n }\n\n private async onKeyboardEvent(ev: KeyboardEvent, isDown: boolean): Promise<void> {\n if (ev.ctrlKey || ev.altKey || ev.metaKey)\n return; // Ignore qualifiers other than shift...\n\n switch (ev.key) {\n case \"Escape\":\n return this.doFocusHome(ev, isDown, this._focusItem);\n case \"PageDown\":\n return this.doChooseSavedValue(ev, isDown, this._focusItem, true);\n case \"PageUp\":\n return this.doChooseSavedValue(ev, isDown, this._focusItem, false);\n case \"Tab\":\n return this.doNavigate(ev, isDown, this._focusItem, !ev.shiftKey);\n case \"ArrowDown\":\n if (ev.shiftKey)\n return this.doChooseSavedValue(ev, isDown, this._focusItem, true);\n return this.doNavigate(ev, isDown, this._focusItem, true);\n case \"ArrowUp\":\n if (ev.shiftKey)\n return this.doChooseSavedValue(ev, isDown, this._focusItem, false);\n return this.doNavigate(ev, isDown, this._focusItem, false);\n case \"Enter\":\n return this.doAcceptInput(ev, isDown, this._focusItem);\n case \"Home\":\n case \"End\":\n case \"Insert\":\n return this.doNewInput(ev, isDown, this._focusItem);\n case \"ArrowLeft\":\n case \"ArrowRight\":\n if (this.doProcessExpressionKey(ev, isDown, this._focusItem))\n return;\n return this.doNewInput(ev, isDown, this._focusItem);\n case \"Backspace\":\n case \"Delete\":\n if (this.doProcessExpressionKey(ev, isDown, this._focusItem))\n return;\n return this.doDeleteInput(ev, isDown, this._focusItem);\n default:\n return this.doProcessKey(ev, isDown, this._focusItem);\n }\n }\n\n private removeControls(): void {\n if (undefined === this._controls)\n return;\n\n this._controls.overlay.remove();\n this._controls = undefined;\n this.unsuspendToolTips();\n this.removedControlRect();\n }\n\n private createControlDiv(): HTMLDivElement {\n const div = document.createElement(\"div\");\n div.className = \"accudraw-controls\";\n\n const style = div.style;\n style.pointerEvents = \"none\";\n style.overflow = \"visible\"; // Don't clip/hide outline or shadow...\n style.position = \"absolute\";\n style.top = style.left = \"0\";\n style.height = style.width = \"100%\";\n\n return div;\n }\n\n private updateItemFieldKeyinStatus(itemField: HTMLInputElement, item: ItemField) {\n const isDynamic = this.isDynamicKeyinStatus(item)\n\n if (isDynamic && item === this._expression?.item)\n this._expression = undefined; // Only valid when entering partial input...\n\n itemField.style.caretColor = isDynamic ? \"transparent\" : itemField.style.color;\n }\n\n private updateItemFieldValue(itemField: HTMLInputElement, item: ItemField) {\n const value = this.getFormattedValueByIndex(item)\n itemField.value = value;\n this.updateItemFieldKeyinStatus(itemField, item);\n }\n\n private updateItemFieldLock(itemLock: HTMLButtonElement, item: ItemField) {\n const locked = this.getFieldLock(item);\n itemLock.style.outlineStyle = locked ? \"inset\" : \"outset\";\n itemLock.style.boxShadow = locked ? \"none\" : AccuDrawViewportUI.controlProps.button.shadow;\n itemLock.style.backgroundColor = locked ? AccuDrawViewportUI.controlProps.button.pressedColor : AccuDrawViewportUI.controlProps.backgroundColor;\n }\n\n private initializeItemStyle(style: CSSStyleDeclaration, isButton: boolean): void {\n style.pointerEvents = \"none\"; // Don't receive pointer events...\n style.position = \"absolute\";\n style.textWrap = \"nowrap\";\n style.textAnchor = \"top\";\n style.textAlign = isButton ? \"center\" : \"left\";\n\n const controlProps = AccuDrawViewportUI.controlProps;\n style.fontFamily = controlProps.text.fontFamily;\n style.fontSize = controlProps.text.fontSize;\n style.color = controlProps.text.color;\n style.backgroundColor = controlProps.backgroundColor;\n style.borderRadius = controlProps.borderRadius;\n }\n\n private createItemField(item: ItemField): HTMLInputElement {\n const itemField = document.createElement(\"input\");\n\n itemField.contentEditable = \"true\";\n itemField.size = AccuDrawViewportUI.controlProps.fieldSize;\n\n const style = itemField.style;\n this.initializeItemStyle(style, false);\n this.updateItemFieldValue(itemField, item);\n\n itemField.onkeydown = async (ev: KeyboardEvent) => { await this.onKeyboardEvent(ev, true); };\n itemField.onkeyup = async (ev: KeyboardEvent) => { await this.onKeyboardEvent(ev, false); };\n itemField.onfocus = (ev: FocusEvent) => { this.onFocusChange(ev, item, true); };\n itemField.onblur = (ev: FocusEvent) => { this.onFocusChange(ev, item, false); };;\n\n return itemField;\n }\n\n private createItemFieldLock(item: ItemField): HTMLButtonElement {\n const itemLock = document.createElement(\"button\");\n\n itemLock.type = \"button\";\n itemLock.contentEditable = \"false\";\n itemLock.disabled = true; // Don't receive focus...\n\n switch (item) {\n case ItemField.DIST_Item:\n itemLock.innerHTML = \"\\u21A6\"; // right arrow from bar...\n break;\n case ItemField.ANGLE_Item:\n itemLock.innerHTML = \"\\u2221\"; // measured angle...\n break;\n case ItemField.X_Item:\n itemLock.innerHTML = \"X\";\n break;\n case ItemField.Y_Item:\n itemLock.innerHTML = \"Y\";\n break;\n case ItemField.Z_Item:\n itemLock.innerHTML = \"Z\";\n break;\n }\n\n const style = itemLock.style;\n this.initializeItemStyle(style, true);\n this.updateItemFieldLock(itemLock, item);\n\n const button = AccuDrawViewportUI.controlProps.button;\n style.paddingLeft = style.paddingRight = \"0\";\n style.marginLeft = style.marginRight = button.margin;\n style.outlineWidth = button.outlineWidth;\n\n return itemLock;\n }\n\n /** Called after the controls have been removed from the view. */\n protected removedControlRect(): void { }\n\n /** Called after the position of the controls in the supplied view is updated. */\n protected changedControlRect(_rect: ViewRect, _vp: ScreenViewport): void { }\n\n /** Use to override the position of the controls in the supplied view. */\n protected modifyControlRect(_rect: ViewRect, _vp: ScreenViewport): void { }\n\n /** Return the ViewRect currently occupied by the controls in the supplied view. */\n protected currentControlRect(vp: ScreenViewport): ViewRect | undefined {\n if (undefined === this._controls || this._controls.overlay.parentElement !== vp.vpDiv)\n return undefined;\n\n const viewRect = vp.vpDiv.getBoundingClientRect();\n const elemRect = this._controls.div.getBoundingClientRect();\n const controlRect = new ViewRect(elemRect.left - viewRect.left, elemRect.top - viewRect.top, elemRect.right - viewRect.left, elemRect.bottom - viewRect.top);\n\n return controlRect;\n }\n\n private updateControlVisibility(isPolar: boolean, is3d?: boolean): void {\n if (undefined === this._controls)\n return;\n\n this._controls.itemFields[ItemField.ANGLE_Item].hidden = !isPolar;\n this._controls.itemLocks[ItemField.ANGLE_Item].hidden = !isPolar;\n\n this._controls.itemFields[ItemField.DIST_Item].hidden = !isPolar;\n this._controls.itemLocks[ItemField.DIST_Item].hidden = !isPolar;\n\n this._controls.itemFields[ItemField.X_Item].hidden = isPolar;\n this._controls.itemLocks[ItemField.X_Item].hidden = isPolar;\n\n this._controls.itemFields[ItemField.Y_Item].hidden = isPolar;\n this._controls.itemLocks[ItemField.Y_Item].hidden = isPolar;\n\n if (undefined === is3d)\n return;\n\n this._controls.itemFields[ItemField.Z_Item].hidden = !is3d;\n this._controls.itemLocks[ItemField.Z_Item].hidden = !is3d;\n }\n\n private updateControls(ev: BeButtonEvent): void {\n const vp = ev.viewport;\n if (undefined === vp || !this.isActive)\n return;\n\n if (undefined !== this._controls && this._controls.overlay.parentElement !== vp.vpDiv)\n this.removeControls(); // Could be enhanced to save/restore partial input of currently focused item...\n\n const props = AccuDrawViewportUI.controlProps;\n\n if (undefined === this._controls) {\n const overlay = vp.addNewDiv(\"accudraw-overlay\", true, 35);\n const div = this.createControlDiv();\n const is3dLayout = this.is3dCompass(vp);\n const isHorizontalLayout = props.horizontalArrangement;\n\n overlay.appendChild(div);\n\n const createFieldAndLock = (item: ItemField) => {\n const itemField = itemFields[item] = this.createItemField(item);\n itemField.style.top = isHorizontalLayout ? \"0\" : `${rowOffset}px`;\n itemField.style.left = isHorizontalLayout ? `${columnOffset}px` : \"0\";\n\n div.appendChild(itemField);\n\n if (is3dLayout || ItemField.Z_Item !== item)\n rowOffset += itemField.offsetHeight * props.rowSpacingFactor;\n\n itemWidth = itemField.offsetWidth;\n itemHeight = itemField.offsetHeight;\n\n const itemLock = itemLocks[item] = this.createItemFieldLock(item);\n itemLock.style.top = itemField.style.top;\n itemLock.style.left = isHorizontalLayout ? `${columnOffset + itemWidth}px` : `${itemWidth}px`;\n itemLock.style.width = itemLock.style.height = `${itemHeight}px`; // Make square of same height as text field...\n\n div.appendChild(itemLock);\n\n lockWidth = itemLock.offsetWidth;\n\n if (is3dLayout || ItemField.Z_Item !== item)\n columnOffset += (itemWidth + lockWidth) * props.columnSpacingFactor;\n };\n\n let rowOffset = 0;\n let columnOffset = 0;\n let itemWidth = 0;\n let itemHeight = 0;\n let lockWidth = 0;\n\n const itemFields: HTMLInputElement[] = [];\n const itemLocks: HTMLButtonElement[] = [];\n\n createFieldAndLock(ItemField.DIST_Item);\n createFieldAndLock(ItemField.ANGLE_Item);\n\n rowOffset = 0;\n columnOffset = 0;\n\n createFieldAndLock(ItemField.X_Item);\n createFieldAndLock(ItemField.Y_Item);\n createFieldAndLock(ItemField.Z_Item); // Both polar and rectangular modes support Z in 3d views...\n\n div.style.width = isHorizontalLayout ? `${columnOffset}px` : `${itemWidth + lockWidth + 5}px`;\n div.style.height = isHorizontalLayout ? `${itemHeight * props.rowSpacingFactor}px` : `${rowOffset}px`;\n\n this._controls = { overlay, div, itemFields, itemLocks };\n this.updateControlVisibility(CompassMode.Polar === this.compassMode, this.is3dCompass(vp));\n this.setFocusItem(this._focusItem);\n this.suspendToolTips();\n\n vp.onChangeView.addOnce(() => this.removeControls()); // Clear on view change/closure...\n }\n\n const viewRect = vp.viewRect;\n const position = vp.worldToView(ev.point);\n\n if (props.fixedLocation) {\n position.x = (viewRect.left + ((viewRect.width - this._controls.div.offsetWidth) * 0.5));\n position.y = (viewRect.bottom - this._controls.div.offsetHeight);\n } else {\n position.x += Math.floor(vp.pixelsFromInches(props.cursorOffset.x)) + 0.5;\n position.y += Math.floor(vp.pixelsFromInches(props.cursorOffset.y)) + 0.5;\n }\n\n const controlRect = new ViewRect(position.x, position.y, position.x + this._controls.div.offsetWidth, position.y + this._controls.div.offsetHeight);\n this.modifyControlRect(controlRect, vp);\n\n if (!controlRect.isContained(viewRect))\n return; // Keep showing at last valid location...\n\n this._controls.div.style.left = `${controlRect.left}px`;\n this._controls.div.style.top = `${controlRect.top}px`;\n\n this.changedControlRect(controlRect, vp);\n return;\n }\n\n private get _isFocusHome(): boolean {\n return (document.body === document.activeElement);\n }\n\n private get _isFocusAccuDraw(): boolean {\n return (undefined !== this._controls && document.activeElement?.parentElement === this._controls.itemFields[this._focusItem].parentElement);\n }\n\n private setFocusHome(): void {\n const element = document.activeElement as HTMLElement;\n if (element && element !== document.body)\n element.blur();\n document.body.focus();\n }\n\n /** Return whether keyboard shortcuts can or can't be used.\n * Used to show a visual indication of whether keyboard shortcuts will be processed.\n * Keyboard shortcuts can be supported when focus is either on AccuDraw or Home.\n * When returning false the compass displays in monochrome.\n */\n public override get hasInputFocus(): boolean {\n // Indicate when keyboard shortcuts can't be used (i.e. focus not at AccuDraw or Home) by changing compass to monochrome...\n return (this._isFocusHome || this._isFocusAccuDraw);\n }\n\n /** Get the item field that currently has input focus.\n */\n public override getFocusItem(): ItemField | undefined {\n if (!this._isFocusAccuDraw)\n return undefined;\n return this._focusItem;\n }\n\n /** Request to set focus to the specified AccuDraw input field to start entering values.\n * The focused input field will be indicated by the background color.\n */\n public override setFocusItem(index: ItemField) {\n this._focusItem = index;\n if (undefined === this._controls)\n return;\n const itemField = this._controls.itemFields[this._focusItem];\n itemField.focus();\n }\n\n /** Request to set focus to the active AccuDraw input field to start entering values.\n * The focused input field will be indicated by the background color.\n */\n public override grabInputFocus() {\n // Set focus to active input field for entering values...\n if (this._isFocusAccuDraw)\n return;\n this.setFocusItem(this._focusItem);\n }\n\n private onFocusChange(_ev: FocusEvent, item: ItemField, focusIn: boolean): void {\n if (undefined === this._controls)\n return;\n\n // NOTE: Using \"setSelectionRange\" while value is changing in dynamics isn't pretty, use background+caret color instead...\n const itemField = this._controls.itemFields[item];\n itemField.style.backgroundColor = (focusIn ? AccuDrawViewportUI.controlProps.text.focusColor : AccuDrawViewportUI.controlProps.backgroundColor);\n this.updateItemFieldKeyinStatus(itemField, item);\n\n if (!focusIn)\n this.setDynamicKeyinStatus(item);\n }\n\n /** Change notification for when the compass is shown or hidden.\n * Used to hide the viewport controls when the compass is no longer displayed.\n */\n public override onCompassDisplayChange(state: \"show\" | \"hide\"): void {\n if (\"show\" === state)\n return;\n this.removeControls();\n }\n\n /** Change notification for when the compass mode switches between polar and rectangular inputs.\n * Used to show or hide the input fields that are applicable to the current mode.\n */\n public override onCompassModeChange(): void {\n this.updateControlVisibility(CompassMode.Polar === this.compassMode);\n this.setFocusItem(this.defaultFocusItem());\n }\n\n /** Change notification for when the supplied input field switches between dynamic and partial input.\n * When an input field is in the dynamic state, its value changes according to the current button event unless the field is locked.\n * When an input field is in the partial state, its value is not changed or formatted to allow the value to be changed.\n * Locking a field is expected to change the input state to partial.\n * Unlocking a field or accepting a value by focusing is expected to change the input state to dynamic.\n */\n public override onFieldKeyinStatusChange(item: ItemField) {\n if (undefined === this._controls)\n return;\n this.updateItemFieldKeyinStatus(this._controls.itemFields[item], item)\n }\n\n /** Change notification for when the supplied input field value has been modified.\n * Used to update the displayed input field with the value from the active angle or distance formatter.\n */\n public override onFieldValueChange(item: ItemField) {\n if (undefined === this._controls)\n return;\n this.updateItemFieldValue(this._controls.itemFields[item], item);\n }\n\n /** Change notification for when the supplied input field lock status is modified.\n * Used to update the displayed lock toggles to reflect the current state.\n */\n public override onFieldLockChange(item: ItemField) {\n if (undefined === this._controls)\n return;\n this.updateItemFieldLock(this._controls.itemLocks[item], item);\n }\n\n /** Change notification of a motion event in the view.\n * Used to show as well as update the dynamic input field values to reflect the current deltas when active.\n * Automatically switches the focused input field between x and y in rectangular mode based on\n * cursor position when axis isn't locked to support more intuitive user input and \"smart lock\" keyboard shortcut.\n */\n public override onMotion(ev: BeButtonEvent): void {\n this.updateControls(ev);\n this.processMotion();\n }\n}\n"]}
@@ -14,6 +14,7 @@ import { DecorateContext } from "../ViewContext";
14
14
  import { Viewport } from "../Viewport";
15
15
  import { PrimitiveTool } from "./PrimitiveTool";
16
16
  import { BeButtonEvent, EventHandled } from "./Tool";
17
+ import { FormatterSpec } from "@itwin/core-quantity";
17
18
  /** @internal */
18
19
  declare class MeasureLabel implements CanvasDecoration {
19
20
  worldLocation: Point3d;
@@ -72,6 +73,12 @@ export declare class MeasureDistanceTool extends PrimitiveTool {
72
73
  /** @internal */
73
74
  protected _lastMotionAdjustedPt?: Point3d;
74
75
  /** @internal */
76
+ protected _lengthFormatterSpec?: FormatterSpec;
77
+ /** @internal */
78
+ protected _angleFormatterSpec?: FormatterSpec;
79
+ /** @internal */
80
+ protected _removeFormatterListener?: () => void;
81
+ /** @internal */
75
82
  protected allowView(vp: Viewport): boolean;
76
83
  /** @internal */
77
84
  isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean;
@@ -82,6 +89,8 @@ export declare class MeasureDistanceTool extends PrimitiveTool {
82
89
  /** @internal */
83
90
  onPostInstall(): Promise<void>;
84
91
  /** @internal */
92
+ onCleanup(): Promise<void>;
93
+ /** @internal */
85
94
  onUnsuspend(): Promise<void>;
86
95
  /** @internal */
87
96
  protected showPrompt(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"MeasureTool.d.ts","sourceRoot":"","sources":["../../../src/tools/MeasureTool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MeasureTool.d.ts","sourceRoot":"","sources":["../../../src/tools/MeasureTool.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,6 @@ import { HitGeomType } from "../HitDetail";
14
14
  import { IModelApp } from "../IModelApp";
15
15
  import { Marker } from "../Marker";
16
16
  import { NotifyMessageDetails, OutputMessagePriority, OutputMessageType } from "../NotificationManager";
17
- import { QuantityType } from "../quantity-formatting/QuantityFormatter";
18
17
  import { PrimitiveTool } from "./PrimitiveTool";
19
18
  import { BeModifierKeys, CoreTools, EventHandled, InputSource } from "./Tool";
20
19
  import { ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod } from "./ToolAssistance";
@@ -22,6 +21,16 @@ import { GraphicType } from "../common/render/GraphicType";
22
21
  function translateBold(key) {
23
22
  return `<b>${CoreTools.translate(`Measure.Labels.${key}`)}:</b> `;
24
23
  }
24
+ async function getFormatterSpecByKoQAndPersistenceUnit(koq, persistenceUnitName) {
25
+ const formatProps = await IModelApp.formatsProvider.getFormat(koq);
26
+ if (undefined === formatProps)
27
+ return undefined;
28
+ return IModelApp.quantityFormatter.createFormatterSpec({
29
+ persistenceUnitName,
30
+ formatProps,
31
+ formatName: koq
32
+ });
33
+ }
25
34
  /** @internal */
26
35
  class MeasureLabel {
27
36
  worldLocation = new Point3d();
@@ -139,6 +148,12 @@ export class MeasureDistanceTool extends PrimitiveTool {
139
148
  /** @internal */
140
149
  _lastMotionAdjustedPt;
141
150
  /** @internal */
151
+ _lengthFormatterSpec;
152
+ /** @internal */
153
+ _angleFormatterSpec;
154
+ /** @internal */
155
+ _removeFormatterListener;
156
+ /** @internal */
142
157
  allowView(vp) { return vp.view.isSpatialView() || vp.view.isDrawingView(); }
143
158
  /** @internal */
144
159
  isCompatibleViewport(vp, isSelectedViewChange) { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }
@@ -149,9 +164,25 @@ export class MeasureDistanceTool extends PrimitiveTool {
149
164
  /** @internal */
150
165
  async onPostInstall() {
151
166
  await super.onPostInstall();
167
+ this._lengthFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
168
+ this._angleFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.ANGLE", "Units.RAD");
169
+ this._removeFormatterListener = IModelApp.formatsProvider.onFormatsChanged.addListener(async (args) => {
170
+ if (args.formatsChanged === "all" || args.formatsChanged.includes("AecUnits.LENGTH"))
171
+ this._lengthFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
172
+ if (args.formatsChanged === "all" || args.formatsChanged.includes("AecUnits.ANGLE"))
173
+ this._angleFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.ANGLE", "Units.RAD");
174
+ });
152
175
  this.setupAndPromptForNextAction();
153
176
  }
154
177
  /** @internal */
178
+ async onCleanup() {
179
+ if (this._removeFormatterListener) {
180
+ this._removeFormatterListener();
181
+ this._removeFormatterListener = undefined;
182
+ }
183
+ await super.onCleanup();
184
+ }
185
+ /** @internal */
155
186
  async onUnsuspend() { this.showPrompt(); }
156
187
  /** @internal */
157
188
  showPrompt() {
@@ -222,8 +253,8 @@ export class MeasureDistanceTool extends PrimitiveTool {
222
253
  totalDistance += adjustedPoints[i].distance(adjustedPoints[i + 1]);
223
254
  if (0.0 === totalDistance)
224
255
  return;
225
- const formatterSpec = IModelApp.quantityFormatter.findFormatterSpecByQuantityType(QuantityType.Length);
226
- if (undefined === formatterSpec)
256
+ const formatterSpec = this._lengthFormatterSpec;
257
+ if (formatterSpec === undefined)
227
258
  return;
228
259
  const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(totalDistance, formatterSpec);
229
260
  const distDyn = new MeasureLabel(points[points.length - 1], formattedTotalDistance);
@@ -360,7 +391,7 @@ export class MeasureDistanceTool extends PrimitiveTool {
360
391
  this._totalDistance += seg.distance;
361
392
  if (0.0 === this._totalDistance)
362
393
  return;
363
- const formatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Length);
394
+ const formatterSpec = this._lengthFormatterSpec;
364
395
  if (undefined === formatterSpec)
365
396
  return;
366
397
  const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(this._totalDistance, formatterSpec);
@@ -371,20 +402,20 @@ export class MeasureDistanceTool extends PrimitiveTool {
371
402
  const is3d = (undefined === this.targetView || this.targetView.view.is3d());
372
403
  const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());
373
404
  const toolTip = document.createElement("div");
374
- const distanceFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Length);
405
+ const distanceFormatterSpec = this._lengthFormatterSpec;
375
406
  if (undefined === distanceFormatterSpec)
376
407
  return toolTip;
377
408
  let toolTipHtml = "";
378
409
  const formattedDistance = IModelApp.quantityFormatter.formatQuantity(distance, distanceFormatterSpec);
379
410
  toolTipHtml += `${translateBold("Distance") + formattedDistance}<br>`;
380
411
  if (is3d) {
381
- const angleFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Angle);
412
+ const angleFormatterSpec = this._angleFormatterSpec;
382
413
  if (undefined !== angleFormatterSpec) {
383
414
  const formattedSlope = IModelApp.quantityFormatter.formatQuantity(slope, angleFormatterSpec);
384
415
  toolTipHtml += `${translateBold("Slope") + formattedSlope}<br>`;
385
416
  }
386
417
  }
387
- const coordFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Coordinate);
418
+ const coordFormatterSpec = this._lengthFormatterSpec;
388
419
  if (undefined !== coordFormatterSpec) {
389
420
  let startAdjusted = start;
390
421
  let endAdjusted = end;
@@ -620,7 +651,7 @@ export class MeasureLocationTool extends PrimitiveTool {
620
651
  const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());
621
652
  const toolTip = document.createElement("div");
622
653
  let toolTipHtml = "";
623
- const coordFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Coordinate);
654
+ const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
624
655
  if (undefined !== coordFormatterSpec) {
625
656
  let pointAdjusted = point;
626
657
  if (isSpatial) {
@@ -636,7 +667,7 @@ export class MeasureLocationTool extends PrimitiveTool {
636
667
  toolTipHtml += "<br>";
637
668
  }
638
669
  if (isSpatial) {
639
- const latLongFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.LatLong);
670
+ const latLongFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.ANGLE", "Units.RAD");
640
671
  if (undefined !== latLongFormatterSpec && undefined !== coordFormatterSpec) {
641
672
  try {
642
673
  const cartographic = await this.iModel.spatialToCartographic(point);
@@ -940,17 +971,17 @@ export class MeasureAreaByPointsTool extends PrimitiveTool {
940
971
  const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());
941
972
  const toolTip = document.createElement("div");
942
973
  let toolTipHtml = "";
943
- const areaFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Area);
974
+ const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.AREA", "Units.SQ_M");
944
975
  if (undefined !== areaFormatterSpec) {
945
976
  const formattedArea = IModelApp.quantityFormatter.formatQuantity(this._area, areaFormatterSpec);
946
977
  toolTipHtml += `${translateBold("Area") + formattedArea}<br>`;
947
978
  }
948
- const perimeterFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Length);
979
+ const perimeterFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
949
980
  if (undefined !== perimeterFormatterSpec) {
950
981
  const formattedPerimeter = IModelApp.quantityFormatter.formatQuantity(this._perimeter, perimeterFormatterSpec);
951
982
  toolTipHtml += `${translateBold("Perimeter") + formattedPerimeter}<br>`;
952
983
  }
953
- const coordFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Coordinate);
984
+ const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
954
985
  if (undefined !== coordFormatterSpec) {
955
986
  let pointAdjusted = this._centroid.clone();
956
987
  if (isSpatial) {
@@ -989,7 +1020,7 @@ export class MeasureAreaByPointsTool extends PrimitiveTool {
989
1020
  const toolTip = await this.getMarkerToolTip();
990
1021
  this._acceptedMeasurement = new MeasureMarker("1", toolTip, this._centroid, Point2d.create(25, 25));
991
1022
  this._marker = undefined;
992
- const areaFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Area);
1023
+ const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.AREA", "Units.SQ_M");
993
1024
  if (undefined === areaFormatterSpec)
994
1025
  return;
995
1026
  const formattedTotalArea = IModelApp.quantityFormatter.formatQuantity(this._area, areaFormatterSpec);
@@ -1171,7 +1202,7 @@ export class MeasureElementTool extends PrimitiveTool {
1171
1202
  let toolTipHtml = "";
1172
1203
  switch (this.getOperation()) {
1173
1204
  case MassPropertiesOperation.AccumulateLengths: {
1174
- const distanceFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Length);
1205
+ const distanceFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
1175
1206
  if (undefined !== distanceFormatterSpec) {
1176
1207
  const formattedLength = IModelApp.quantityFormatter.formatQuantity(responseProps.length ? responseProps.length : 0, distanceFormatterSpec);
1177
1208
  toolTipHtml += `${translateBold("Length") + formattedLength}<br>`;
@@ -1179,13 +1210,13 @@ export class MeasureElementTool extends PrimitiveTool {
1179
1210
  break;
1180
1211
  }
1181
1212
  case MassPropertiesOperation.AccumulateAreas: {
1182
- const areaFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Area);
1213
+ const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.AREA", "Units.SQ_M");
1183
1214
  if (undefined !== areaFormatterSpec) {
1184
1215
  const formattedArea = IModelApp.quantityFormatter.formatQuantity(responseProps.area ? responseProps.area : 0, areaFormatterSpec);
1185
1216
  toolTipHtml += `${translateBold("Area") + formattedArea}<br>`;
1186
1217
  }
1187
1218
  if (responseProps.perimeter) {
1188
- const perimeterFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Length);
1219
+ const perimeterFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
1189
1220
  if (undefined !== perimeterFormatterSpec) {
1190
1221
  const formattedPerimeter = IModelApp.quantityFormatter.formatQuantity(responseProps.perimeter, perimeterFormatterSpec);
1191
1222
  toolTipHtml += `${translateBold("Perimeter") + formattedPerimeter}<br>`;
@@ -1194,13 +1225,13 @@ export class MeasureElementTool extends PrimitiveTool {
1194
1225
  break;
1195
1226
  }
1196
1227
  case MassPropertiesOperation.AccumulateVolumes: {
1197
- const volumeFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Volume);
1228
+ const volumeFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.VOLUME", "Units.CUB_M");
1198
1229
  if (undefined !== volumeFormatterSpec) {
1199
1230
  const formattedVolume = IModelApp.quantityFormatter.formatQuantity(responseProps.volume ? responseProps.volume : 0, volumeFormatterSpec);
1200
1231
  toolTipHtml += `${translateBold("Volume") + formattedVolume}<br>`;
1201
1232
  }
1202
1233
  if (responseProps.area) {
1203
- const areaFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Area);
1234
+ const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.AREA", "Units.SQ_M");
1204
1235
  if (undefined !== areaFormatterSpec) {
1205
1236
  const formattedArea = IModelApp.quantityFormatter.formatQuantity(responseProps.area, areaFormatterSpec);
1206
1237
  toolTipHtml += `${translateBold("Area") + formattedArea}<br>`;
@@ -1210,7 +1241,7 @@ export class MeasureElementTool extends PrimitiveTool {
1210
1241
  }
1211
1242
  }
1212
1243
  if (responseProps.centroid) {
1213
- const coordFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Coordinate);
1244
+ const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
1214
1245
  if (undefined !== coordFormatterSpec) {
1215
1246
  let pointAdjusted = Point3d.fromJSON(responseProps.centroid);
1216
1247
  if (isSpatial) {
@@ -1261,21 +1292,21 @@ export class MeasureElementTool extends PrimitiveTool {
1261
1292
  return;
1262
1293
  switch (operation) {
1263
1294
  case MassPropertiesOperation.AccumulateLengths:
1264
- const distanceFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Length);
1295
+ const distanceFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.LENGTH", "Units.M");
1265
1296
  if (undefined === distanceFormatterSpec)
1266
1297
  return;
1267
1298
  const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(this._totalValue, distanceFormatterSpec);
1268
1299
  this._totalMarker = new MeasureLabel(labelPt, formattedTotalDistance);
1269
1300
  break;
1270
1301
  case MassPropertiesOperation.AccumulateAreas:
1271
- const areaFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Area);
1302
+ const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.AREA", "Units.SQ_M");
1272
1303
  if (undefined === areaFormatterSpec)
1273
1304
  return;
1274
1305
  const formattedTotalArea = IModelApp.quantityFormatter.formatQuantity(this._totalValue, areaFormatterSpec);
1275
1306
  this._totalMarker = new MeasureLabel(labelPt, formattedTotalArea);
1276
1307
  break;
1277
1308
  case MassPropertiesOperation.AccumulateVolumes:
1278
- const volumeFormatterSpec = await IModelApp.quantityFormatter.getFormatterSpecByQuantityType(QuantityType.Volume);
1309
+ const volumeFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit("AecUnits.VOLUME", "Units.CUB_M");
1279
1310
  if (undefined === volumeFormatterSpec)
1280
1311
  return;
1281
1312
  const formattedTotalVolume = IModelApp.quantityFormatter.formatQuantity(this._totalValue, volumeFormatterSpec);