@itwin/core-frontend 5.4.0-dev.7 → 5.5.0-dev.2

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 (74) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/lib/cjs/IModelApp.d.ts +12 -0
  3. package/lib/cjs/IModelApp.d.ts.map +1 -1
  4. package/lib/cjs/IModelApp.js +9 -0
  5. package/lib/cjs/IModelApp.js.map +1 -1
  6. package/lib/cjs/IModelConnection.d.ts.map +1 -1
  7. package/lib/cjs/IModelConnection.js +6 -2
  8. package/lib/cjs/IModelConnection.js.map +1 -1
  9. package/lib/cjs/SheetViewState.d.ts +7 -5
  10. package/lib/cjs/SheetViewState.d.ts.map +1 -1
  11. package/lib/cjs/SheetViewState.js +52 -683
  12. package/lib/cjs/SheetViewState.js.map +1 -1
  13. package/lib/cjs/internal/SheetViewAttachments.d.ts +57 -0
  14. package/lib/cjs/internal/SheetViewAttachments.d.ts.map +1 -0
  15. package/lib/cjs/internal/SheetViewAttachments.js +336 -0
  16. package/lib/cjs/internal/SheetViewAttachments.js.map +1 -0
  17. package/lib/cjs/internal/ViewAttachmentRenderer.d.ts +32 -0
  18. package/lib/cjs/internal/ViewAttachmentRenderer.d.ts.map +1 -0
  19. package/lib/cjs/internal/ViewAttachmentRenderer.js +462 -0
  20. package/lib/cjs/internal/ViewAttachmentRenderer.js.map +1 -0
  21. package/lib/cjs/internal/render/webgl/SceneCompositor.js +1 -1
  22. package/lib/cjs/internal/render/webgl/SceneCompositor.js.map +1 -1
  23. package/lib/cjs/internal/render/webgl/ShaderBuilder.d.ts.map +1 -1
  24. package/lib/cjs/internal/render/webgl/ShaderBuilder.js +8 -1
  25. package/lib/cjs/internal/render/webgl/ShaderBuilder.js.map +1 -1
  26. package/lib/cjs/properties/AngleDescription.js +4 -4
  27. package/lib/cjs/properties/AngleDescription.js.map +1 -1
  28. package/lib/cjs/properties/LengthDescription.js +9 -9
  29. package/lib/cjs/properties/LengthDescription.js.map +1 -1
  30. package/lib/cjs/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
  31. package/lib/cjs/quantity-formatting/QuantityFormatter.js +9 -8
  32. package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
  33. package/lib/cjs/tools/EventController.js +1 -1
  34. package/lib/cjs/tools/EventController.js.map +1 -1
  35. package/lib/cjs/tools/MeasureTool.js +21 -21
  36. package/lib/cjs/tools/MeasureTool.js.map +1 -1
  37. package/lib/esm/IModelApp.d.ts +12 -0
  38. package/lib/esm/IModelApp.d.ts.map +1 -1
  39. package/lib/esm/IModelApp.js +9 -0
  40. package/lib/esm/IModelApp.js.map +1 -1
  41. package/lib/esm/IModelConnection.d.ts.map +1 -1
  42. package/lib/esm/IModelConnection.js +7 -3
  43. package/lib/esm/IModelConnection.js.map +1 -1
  44. package/lib/esm/SheetViewState.d.ts +7 -5
  45. package/lib/esm/SheetViewState.d.ts.map +1 -1
  46. package/lib/esm/SheetViewState.js +55 -686
  47. package/lib/esm/SheetViewState.js.map +1 -1
  48. package/lib/esm/internal/SheetViewAttachments.d.ts +57 -0
  49. package/lib/esm/internal/SheetViewAttachments.d.ts.map +1 -0
  50. package/lib/esm/internal/SheetViewAttachments.js +332 -0
  51. package/lib/esm/internal/SheetViewAttachments.js.map +1 -0
  52. package/lib/esm/internal/ViewAttachmentRenderer.d.ts +32 -0
  53. package/lib/esm/internal/ViewAttachmentRenderer.d.ts.map +1 -0
  54. package/lib/esm/internal/ViewAttachmentRenderer.js +459 -0
  55. package/lib/esm/internal/ViewAttachmentRenderer.js.map +1 -0
  56. package/lib/esm/internal/render/webgl/SceneCompositor.js +1 -1
  57. package/lib/esm/internal/render/webgl/SceneCompositor.js.map +1 -1
  58. package/lib/esm/internal/render/webgl/ShaderBuilder.d.ts.map +1 -1
  59. package/lib/esm/internal/render/webgl/ShaderBuilder.js +8 -1
  60. package/lib/esm/internal/render/webgl/ShaderBuilder.js.map +1 -1
  61. package/lib/esm/properties/AngleDescription.js +4 -4
  62. package/lib/esm/properties/AngleDescription.js.map +1 -1
  63. package/lib/esm/properties/LengthDescription.js +9 -9
  64. package/lib/esm/properties/LengthDescription.js.map +1 -1
  65. package/lib/esm/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
  66. package/lib/esm/quantity-formatting/QuantityFormatter.js +9 -8
  67. package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
  68. package/lib/esm/tools/EventController.js +1 -1
  69. package/lib/esm/tools/EventController.js.map +1 -1
  70. package/lib/esm/tools/MeasureTool.js +21 -21
  71. package/lib/esm/tools/MeasureTool.js.map +1 -1
  72. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  73. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  74. package/package.json +21 -21
@@ -1 +1 @@
1
- {"version":3,"file":"MeasureTool.js","sourceRoot":"","sources":["../../../src/tools/MeasureTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Measure\n */\n\nimport { BentleyStatus, Id64, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport { AxisOrder, IModelJson, Matrix3d, Plane3dByOriginAndUnitNormal, Point2d, Point3d, PointString3d, PolygonOps, Vector3d, XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { ColorDef, GeometryStreamProps, LinePixels, MassPropertiesOperation, MassPropertiesRequestProps, MassPropertiesResponseProps } from \"@itwin/core-common\";\nimport { DialogItem, DialogItemValue, DialogPropertySyncItem, PropertyDescription } from \"@itwin/appui-abstract\";\nimport { AccuDrawHintBuilder, ContextRotationId } from \"../AccuDraw\";\nimport { LocateFilterStatus, LocateResponse } from \"../ElementLocateManager\";\nimport { HitDetail, HitGeomType } from \"../HitDetail\";\nimport { IModelApp } from \"../IModelApp\";\nimport { Marker } from \"../Marker\";\nimport { NotifyMessageDetails, OutputMessagePriority, OutputMessageType } from \"../NotificationManager\";\nimport { CanvasDecoration } from \"../render/CanvasDecoration\";\nimport { DecorateContext } from \"../ViewContext\";\nimport { Viewport } from \"../Viewport\";\nimport { PrimitiveTool } from \"./PrimitiveTool\";\nimport { BeButtonEvent, BeModifierKeys, CoreTools, EventHandled, InputSource } from \"./Tool\";\nimport { ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection } from \"./ToolAssistance\";\nimport { GraphicType } from \"../common/render/GraphicType\";\nimport { FormatterSpec } from \"@itwin/core-quantity\";\n\nfunction translateBold(key: string) {\n return `<b>${CoreTools.translate(`Measure.Labels.${key}`)}:</b> `;\n}\n\nasync function getFormatterSpecByKoQAndPersistenceUnit(koq: string, persistenceUnitName: string): Promise<FormatterSpec | undefined> {\n const formatProps = await IModelApp.formatsProvider.getFormat(koq);\n if (undefined === formatProps)\n return undefined;\n return IModelApp.quantityFormatter.createFormatterSpec({\n persistenceUnitName,\n formatProps,\n formatName: koq\n });\n}\n\n/** @internal */\nclass MeasureLabel implements CanvasDecoration {\n public worldLocation = new Point3d();\n public position = new Point3d();\n public label: string;\n\n constructor(worldLocation: XYAndZ, label: string) {\n this.worldLocation.setFrom(worldLocation);\n this.label = label;\n }\n\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\n ctx.font = \"16px sans-serif\";\n const labelHeight = ctx.measureText(\"M\").width; // Close enough for border padding...\n const labelWidth = ctx.measureText(this.label).width + labelHeight;\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = \"white\";\n ctx.fillStyle = \"rgba(0,0,0,.4)\";\n ctx.shadowColor = \"black\";\n ctx.shadowBlur = 10;\n ctx.fillRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\n ctx.strokeRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\n\n ctx.fillStyle = \"white\";\n ctx.shadowBlur = 0;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(this.label, 0, 0);\n }\n\n public setPosition(vp: Viewport): boolean {\n vp.worldToView(this.worldLocation, this.position);\n this.position.y -= Math.floor(vp.pixelsFromInches(0.44)) + 0.5; // Offset from snap location...\n return vp.viewRect.containsPoint(this.position);\n }\n\n public addDecoration(context: DecorateContext) {\n if (this.setPosition(context.viewport))\n context.addCanvasDecoration(this);\n }\n}\n\n/** @internal */\nclass MeasureMarker extends Marker {\n public isSelected: boolean = false;\n constructor(label: string, title: HTMLElement, worldLocation: XYAndZ, size: XAndY) {\n super(worldLocation, size);\n\n const markerDrawFunc = (ctx: CanvasRenderingContext2D) => {\n ctx.beginPath();\n ctx.arc(0, 0, this.size.x * 0.5, 0, 2 * Math.PI);\n ctx.lineWidth = 2;\n ctx.strokeStyle = \"black\";\n const hilite = this.isSelected && this._hiliteColor ? this._hiliteColor.colors : undefined;\n ctx.fillStyle = undefined !== hilite ? `rgba(${hilite.r | 0},${hilite.g | 0},${hilite.b | 0}, 0.5)` : \"rgba(255,255,255,.5)\";\n ctx.fill();\n ctx.stroke();\n };\n\n this.drawFunc = markerDrawFunc;\n this.title = title;\n this.label = label;\n this.labelFont = \"16px sans-serif\";\n this.labelColor = \"black\";\n this.labelMaxWidth = this.size.x * 0.75;\n this.labelOffset = { x: 0, y: -1 };\n }\n\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Never forward event to active tool...\n\n public override onMouseEnter(ev: BeButtonEvent) {\n super.onMouseEnter(ev);\n if (this.title && InputSource.Touch === ev.inputSource && ev.viewport)\n ev.viewport.openToolTip(this.title, ev.viewPoint, this.tooltipOptions);\n }\n\n public override onMouseLeave() {\n super.onMouseLeave();\n if (this.title)\n IModelApp.notifications.clearToolTip(); // Clear tool tip from tap since we won't get a motion event...\n }\n}\n\n/** @internal */\ninterface Location { point: Point3d, adjustedPoint: Point3d, refAxes: Matrix3d }\n/** @internal */\ninterface Segment { distance: number, slope: number, start: Point3d, end: Point3d, delta: Vector3d, adjustedStart: Point3d, adjustedEnd: Point3d, adjustedDelta: Vector3d, refAxes: Matrix3d, marker: MeasureMarker }\n\n/** @internal */\nfunction adjustPoint(ev: BeButtonEvent, segments?: Array<Segment>, locations?: Array<Location>): Point3d {\n // If the point was from a hit we must transform it by the display transform of what got hit.\n const hit = IModelApp.accuSnap.currHit;\n if (!hit || !ev.viewport || !hit.modelId)\n return ev.point;\n\n if (\"0\" !== hit.modelId) {\n const transform = ev.viewport.view.computeDisplayTransform({ modelId: hit.modelId, elementId: hit.sourceId });\n return transform?.multiplyInversePoint3d(ev.point) ?? ev.point;\n }\n\n // Must have snapped to a decoration, so look through previous any segments & locations for a match to get an adjusted point.\n if (segments) {\n for (const seg of segments) {\n if (seg.start.isExactEqual(ev.point))\n return seg.adjustedStart.clone();\n\n if (seg.end.isExactEqual(ev.point))\n return seg.adjustedEnd.clone();\n }\n }\n\n if (locations)\n for (const loc of locations)\n if (loc.point.isExactEqual(ev.point))\n return loc.adjustedPoint.clone();\n\n return ev.point;\n}\n\n/** Report distance between 2 points using current quantity formatter for length.\n * @public\n */\nexport class MeasureDistanceTool extends PrimitiveTool {\n public static override toolId = \"Measure.Distance\";\n public static override iconSpec = \"icon-measure-distance\";\n /** @internal */\n protected readonly _locationData = new Array<Location>();\n /** @internal */\n protected readonly _acceptedSegments = new Array<Segment>();\n /** @internal */\n protected _totalDistance: number = 0.0;\n /** @internal */\n protected _totalDistanceMarker?: MeasureLabel;\n /** @internal */\n protected _snapGeomId?: string;\n /** @internal */\n protected _lastMotionPt?: Point3d;\n /** @internal */\n protected _lastMotionAdjustedPt?: Point3d;\n /** @internal */\n protected _lengthFormatterSpec?: FormatterSpec;\n /** @internal */\n protected _angleFormatterSpec?: FormatterSpec;\n /** @internal */\n protected _removeFormatterListener?: () => void;\n\n /** @internal */\n protected allowView(vp: Viewport) { return vp.view.isSpatialView() || vp.view.isDrawingView(); }\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this._lengthFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n this._angleFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.ANGLE\", \"Units.RAD\");\n\n\n this._removeFormatterListener = IModelApp.formatsProvider.onFormatsChanged.addListener(async (args) => {\n if (args.formatsChanged === \"all\" || args.formatsChanged.includes(\"AecUnits.LENGTH\"))\n this._lengthFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n\n if (args.formatsChanged === \"all\" || args.formatsChanged.includes(\"AecUnits.ANGLE\"))\n this._angleFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.ANGLE\", \"Units.RAD\");\n });\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onCleanup(): Promise<void> {\n if (this._removeFormatterListener) {\n this._removeFormatterListener();\n this._removeFormatterListener = undefined;\n }\n\n await super.onCleanup();\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(0 === this._locationData.length ? \"Measure.Distance.Prompts.FirstPoint\" : \"Measure.Distance.Prompts.NextPoint\"));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 === this._locationData.length) {\n if (this._acceptedSegments.length > 0) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Mouse));\n }\n } else {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Cancel\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Cancel\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AdditionalPoint\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createKeyboardInstruction(ToolAssistance.createKeyboardInfo([ToolAssistance.ctrlKey, \"Z\"]), CoreTools.translate(\"ElementSet.Inputs.UndoLastPoint\"), false, ToolAssistanceInputMethod.Mouse));\n }\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n const hints = new AccuDrawHintBuilder();\n hints.enableSmartRotation = true;\n hints.setModeRectangular();\n hints.sendHints(false);\n IModelApp.toolAdmin.setCursor(0 === this._locationData.length ? IModelApp.viewManager.crossHairCursor : IModelApp.viewManager.dynamicsCursor);\n this.showPrompt();\n }\n\n /** @internal */\n public override testDecorationHit(id: string): boolean { return id === this._snapGeomId; }\n\n /** @internal */\n protected getSnapPoints(): Point3d[] | undefined {\n if (this._acceptedSegments.length < 1 && this._locationData.length < 2)\n return undefined;\n\n const snapPoints: Point3d[] = [];\n for (const seg of this._acceptedSegments) {\n if (0 === snapPoints.length || !seg.start.isAlmostEqual(snapPoints[snapPoints.length - 1]))\n snapPoints.push(seg.start);\n if (!seg.end.isAlmostEqual(snapPoints[0]))\n snapPoints.push(seg.end);\n }\n\n if (this._locationData.length > 1)\n for (const loc of this._locationData)\n snapPoints.push(loc.point);\n return snapPoints;\n }\n\n /** @internal */\n public override getDecorationGeometry(_hit: HitDetail): GeometryStreamProps | undefined {\n const snapPoints = this.getSnapPoints();\n if (undefined === snapPoints)\n return undefined;\n const geomData = IModelJson.Writer.toIModelJson(PointString3d.create(snapPoints));\n return (undefined === geomData ? undefined : [geomData]);\n }\n\n /** @internal */\n protected displayDynamicDistance(context: DecorateContext, points: Point3d[], adjustedPoints: Point3d[]): void {\n let totalDistance = 0.0;\n for (let i = 0; i < adjustedPoints.length - 1; i++)\n totalDistance += adjustedPoints[i].distance(adjustedPoints[i + 1]);\n if (0.0 === totalDistance)\n return;\n\n const formatterSpec = this._lengthFormatterSpec;\n if (formatterSpec === undefined)\n return;\n const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(totalDistance, formatterSpec);\n const distDyn = new MeasureLabel(points[points.length - 1], formattedTotalDistance);\n distDyn.addDecoration(context);\n }\n\n /** @internal */\n protected displayDelta(context: DecorateContext, seg: any): void {\n const xVec = new Vector3d(seg.delta.x, 0.0, 0.0);\n const yVec = new Vector3d(0.0, seg.delta.y, 0.0);\n const zVec = new Vector3d(0.0, 0.0, seg.delta.z);\n\n seg.refAxes.multiplyVectorInPlace(xVec);\n seg.refAxes.multiplyVectorInPlace(yVec);\n seg.refAxes.multiplyVectorInPlace(zVec);\n\n const builderAxes = context.createGraphicBuilder(GraphicType.WorldOverlay);\n let basePt = seg.start.clone();\n\n if (xVec.magnitude() > 1.0e-5) {\n const segPoints: Point3d[] = [];\n segPoints.push(basePt);\n basePt = basePt.plus(xVec);\n segPoints.push(basePt);\n const colorX = ColorDef.red.adjustedForContrast(context.viewport.view.backgroundColor);\n builderAxes.setSymbology(colorX, ColorDef.black, 5);\n builderAxes.addLineString(segPoints);\n }\n\n if (yVec.magnitude() > 1.0e-5) {\n const segPoints: Point3d[] = [];\n segPoints.push(basePt);\n basePt = basePt.plus(yVec);\n segPoints.push(basePt);\n const colorY = ColorDef.green.adjustedForContrast(context.viewport.view.backgroundColor);\n builderAxes.setSymbology(colorY, ColorDef.black, 5);\n builderAxes.addLineString(segPoints);\n }\n\n if (zVec.magnitude() > 1.0e-5) {\n const segPoints: Point3d[] = [];\n segPoints.push(basePt);\n basePt = basePt.plus(zVec);\n segPoints.push(basePt);\n const colorZ = ColorDef.blue.adjustedForContrast(context.viewport.view.backgroundColor);\n builderAxes.setSymbology(colorZ, ColorDef.black, 5);\n builderAxes.addLineString(segPoints);\n }\n\n const segGlow = context.viewport.hilite.color.withAlpha(50);\n builderAxes.setSymbology(segGlow, ColorDef.black, 8);\n builderAxes.addLineString([seg.start, seg.end]);\n\n context.addDecorationFromBuilder(builderAxes);\n }\n\n /** @internal */\n protected createDecorations(context: DecorateContext, isSuspended: boolean): void {\n if (!this.isCompatibleViewport(context.viewport, false))\n return;\n\n if (!isSuspended && this._locationData.length > 0 && undefined !== this._lastMotionPt && undefined !== this._lastMotionAdjustedPt) {\n const tmpPoints: Point3d[] = [];\n const tmpAdjustedPoints: Point3d[] = [];\n for (const loc of this._locationData) {\n tmpPoints.push(loc.point); // Deep copy not necessary...\n tmpAdjustedPoints.push(loc.adjustedPoint);\n }\n tmpPoints.push(this._lastMotionPt);\n tmpAdjustedPoints.push(this._lastMotionAdjustedPt);\n\n const builderDynVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\n const colorDynVis = context.viewport.hilite.color;\n\n builderDynVis.setSymbology(colorDynVis, ColorDef.black, 3);\n builderDynVis.addLineString(tmpPoints);\n\n context.addDecorationFromBuilder(builderDynVis);\n\n const builderDynHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\n const colorDynHid = colorDynVis.withAlpha(100);\n\n builderDynHid.setSymbology(colorDynHid, ColorDef.black, 1, LinePixels.Code2);\n builderDynHid.addLineString(tmpPoints);\n\n context.addDecorationFromBuilder(builderDynHid);\n this.displayDynamicDistance(context, tmpPoints, tmpAdjustedPoints);\n }\n\n if (this._acceptedSegments.length > 0) {\n const builderAccVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\n const builderAccHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\n const colorAccVis = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\n const colorAccHid = colorAccVis.withAlpha(100);\n\n builderAccVis.setSymbology(colorAccVis, ColorDef.black, 3);\n builderAccHid.setSymbology(colorAccHid, ColorDef.black, 1, LinePixels.Code2);\n\n for (const seg of this._acceptedSegments) {\n builderAccVis.addLineString([seg.start, seg.end]);\n builderAccHid.addLineString([seg.start, seg.end]);\n seg.marker.addDecoration(context);\n if (seg.marker.isSelected)\n this.displayDelta(context, seg);\n }\n\n context.addDecorationFromBuilder(builderAccVis);\n context.addDecorationFromBuilder(builderAccHid);\n }\n\n if (undefined !== this._totalDistanceMarker)\n this._totalDistanceMarker.addDecoration(context);\n\n const snapPoints = this.getSnapPoints();\n if (undefined === snapPoints)\n return;\n\n if (undefined === this._snapGeomId)\n this._snapGeomId = this.iModel.transientIds.getNext();\n\n const builderSnapPts = context.createGraphicBuilder(GraphicType.WorldOverlay, undefined, this._snapGeomId);\n const colorAccPts = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\n\n builderSnapPts.setSymbology(colorAccPts, ColorDef.black, 7);\n builderSnapPts.addPointString(snapPoints);\n\n context.addDecorationFromBuilder(builderSnapPts);\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void { this.createDecorations(context, false); }\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void { this.createDecorations(context, true); }\n\n /** @internal */\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (this._locationData.length > 0 && undefined !== ev.viewport) {\n const point = ev.point;\n const adjustedPoint = adjustPoint(ev, this._acceptedSegments, this._locationData);\n if (undefined !== this._lastMotionPt) {\n this._lastMotionPt.setFrom(point);\n this._lastMotionAdjustedPt?.setFrom(adjustedPoint);\n } else {\n this._lastMotionPt = point.clone();\n this._lastMotionAdjustedPt = adjustedPoint;\n }\n ev.viewport.invalidateDecorations();\n }\n }\n\n protected reportMeasurements(): void {\n if (undefined === this._totalDistanceMarker)\n return;\n const briefMsg = `${CoreTools.translate(this._acceptedSegments.length > 1 ? \"Measure.Labels.CumulativeDistance\" : \"Measure.Labels.Distance\")}: ${this._totalDistanceMarker.label}`;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n protected async updateTotals(): Promise<void> {\n this._totalDistance = 0.0;\n this._totalDistanceMarker = undefined;\n for (const seg of this._acceptedSegments)\n this._totalDistance += seg.distance;\n if (0.0 === this._totalDistance)\n return;\n\n const formatterSpec = this._lengthFormatterSpec;\n if (undefined === formatterSpec)\n return;\n\n const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(this._totalDistance, formatterSpec);\n this._totalDistanceMarker = new MeasureLabel(this._acceptedSegments[this._acceptedSegments.length - 1].end, formattedTotalDistance);\n this.reportMeasurements();\n }\n\n protected async getMarkerToolTip(distance: number, slope: number, start: Point3d, end: Point3d, delta?: Vector3d): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n\n\n const distanceFormatterSpec = this._lengthFormatterSpec;\n if (undefined === distanceFormatterSpec)\n return toolTip;\n\n let toolTipHtml = \"\";\n const formattedDistance = IModelApp.quantityFormatter.formatQuantity(distance, distanceFormatterSpec);\n toolTipHtml += `${translateBold(\"Distance\") + formattedDistance}<br>`;\n\n if (is3d) {\n const angleFormatterSpec = this._angleFormatterSpec;\n if (undefined !== angleFormatterSpec) {\n const formattedSlope = IModelApp.quantityFormatter.formatQuantity(slope, angleFormatterSpec);\n toolTipHtml += `${translateBold(\"Slope\") + formattedSlope}<br>`;\n }\n }\n\n const coordFormatterSpec = this._lengthFormatterSpec;\n\n if (undefined !== coordFormatterSpec) {\n let startAdjusted = start;\n let endAdjusted = end;\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n startAdjusted = startAdjusted.minus(globalOrigin);\n endAdjusted = endAdjusted.minus(globalOrigin);\n }\n\n {\n const formattedStartX = IModelApp.quantityFormatter.formatQuantity(startAdjusted.x, coordFormatterSpec);\n const formattedStartY = IModelApp.quantityFormatter.formatQuantity(startAdjusted.y, coordFormatterSpec);\n const formattedStartZ = IModelApp.quantityFormatter.formatQuantity(startAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"StartCoord\") + formattedStartX}, ${formattedStartY}`;\n if (is3d)\n toolTipHtml += `, ${formattedStartZ}`;\n toolTipHtml += \"<br>\";\n }\n const formattedEndX = IModelApp.quantityFormatter.formatQuantity(endAdjusted.x, coordFormatterSpec);\n const formattedEndY = IModelApp.quantityFormatter.formatQuantity(endAdjusted.y, coordFormatterSpec);\n const formattedEndZ = IModelApp.quantityFormatter.formatQuantity(endAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"EndCoord\") + formattedEndX}, ${formattedEndY}`;\n if (is3d)\n toolTipHtml += `, ${formattedEndZ}`;\n toolTipHtml += \"<br>\";\n }\n\n if (undefined !== delta) {\n const formattedDeltaX = IModelApp.quantityFormatter.formatQuantity(Math.abs(delta.x), distanceFormatterSpec);\n const formattedDeltaY = IModelApp.quantityFormatter.formatQuantity(Math.abs(delta.y), distanceFormatterSpec);\n const formattedDeltaZ = IModelApp.quantityFormatter.formatQuantity(Math.abs(delta.z), distanceFormatterSpec);\n toolTipHtml += `${translateBold(\"Delta\") + formattedDeltaX}, ${formattedDeltaY}`;\n if (is3d)\n toolTipHtml += `, ${formattedDeltaZ}`;\n toolTipHtml += \"<br>\";\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n /** @internal */\n protected async updateSelectedMarkerToolTip(seg: any, ev: BeButtonEvent, reopenToolTip: boolean): Promise<void> {\n seg.marker.title = await this.getMarkerToolTip(seg.distance, seg.slope, seg.adjustedStart, seg.adjustedEnd, seg.marker.isSelected ? seg.adjustedDelta : undefined);\n if (!reopenToolTip || undefined === ev.viewport || !IModelApp.notifications.isToolTipOpen)\n return;\n IModelApp.notifications.clearToolTip();\n ev.viewport.openToolTip(seg.marker.title, ev.viewPoint);\n }\n\n /** @internal */\n protected async acceptNewSegments(): Promise<void> {\n if (this._locationData.length > 1) {\n for (let i = 0; i <= this._locationData.length - 2; i++) {\n const adjustedStart = this._locationData[i].adjustedPoint;\n const adjustedEnd = this._locationData[i + 1].adjustedPoint;\n const distance = adjustedStart.distance(adjustedEnd);\n const xyDist = adjustedStart.distanceXY(adjustedEnd);\n const zDist = adjustedEnd.z - adjustedStart.z;\n const slope = (0.0 === xyDist ? Math.PI : Math.atan(zDist / xyDist));\n const adjustedDelta = Vector3d.createStartEnd(adjustedStart, adjustedEnd);\n const refAxes = this._locationData[i].refAxes;\n refAxes.multiplyTransposeVectorInPlace(adjustedDelta);\n const start = this._locationData[i].point;\n const end = this._locationData[i + 1].point;\n const delta = Vector3d.createStartEnd(start, end);\n refAxes.multiplyTransposeVectorInPlace(delta);\n\n const toolTip = await this.getMarkerToolTip(distance, slope, adjustedStart, adjustedEnd);\n const marker = new MeasureMarker((this._acceptedSegments.length + 1).toString(), toolTip, start.interpolate(0.5, end), Point2d.create(25, 25));\n\n const segMarkerButtonFunc = (ev: BeButtonEvent) => {\n if (ev.isDown)\n return true;\n\n let selectedMarker: MeasureMarker | undefined;\n let pickedMarker: MeasureMarker | undefined;\n for (const seg of this._acceptedSegments) {\n if (!seg.marker.pick(ev.viewPoint))\n continue;\n selectedMarker = (seg.marker.isSelected ? undefined : seg.marker);\n pickedMarker = seg.marker;\n break;\n }\n\n for (const seg of this._acceptedSegments) {\n const wasSelected = seg.marker.isSelected;\n seg.marker.isSelected = (seg.marker === selectedMarker);\n if (wasSelected !== seg.marker.isSelected)\n this.updateSelectedMarkerToolTip(seg, ev, (seg.marker === pickedMarker)); // eslint-disable-line @typescript-eslint/no-floating-promises\n }\n\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return true;\n };\n\n marker.onMouseButton = segMarkerButtonFunc;\n this._acceptedSegments.push({ distance, slope, start, end, delta, adjustedStart, adjustedEnd, adjustedDelta, refAxes, marker });\n }\n }\n this._locationData.length = 0;\n await this.updateTotals();\n }\n\n /** @internal */\n protected getReferenceAxes(vp?: Viewport): Matrix3d {\n const refAxes = Matrix3d.createIdentity();\n if (undefined !== vp && vp.isContextRotationRequired)\n vp.getAuxCoordRotation(refAxes);\n return refAxes;\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n const point = ev.point.clone();\n const adjustedPoint = adjustPoint(ev, this._acceptedSegments, this._locationData);\n const refAxes = this.getReferenceAxes(ev.viewport);\n const zDir = refAxes.columnZ();\n const normal = refAxes.columnZ();\n const tangent = refAxes.columnX();\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\n\n // Report xyz delta relative to world up. The surface normal and edge tangent help determine the rotation about z...\n if (undefined !== snap) {\n if (undefined !== snap.primitive) {\n const locDetail = snap.primitive.closestPoint(point, false);\n const snapPlane = Plane3dByOriginAndUnitNormal.create(point, undefined !== snap.normal ? snap.normal : normal);\n if (undefined !== locDetail && (HitGeomType.Segment === snap.geomType || (snapPlane && snap.primitive.isInPlane(snapPlane)))) {\n const locRay = snap.primitive.fractionToPointAndUnitTangent(locDetail.fraction);\n tangent.setFrom(locRay.direction);\n if (undefined !== snap.normal)\n normal.setFrom(snap.normal);\n }\n } else if (undefined !== snap.normal) {\n normal.setFrom(snap.normal);\n }\n }\n\n if (!normal.isParallelTo(zDir, true)) {\n const yDir = zDir.unitCrossProduct(normal);\n if (undefined !== yDir) {\n yDir.unitCrossProduct(zDir, normal);\n Matrix3d.createColumnsInAxisOrder(AxisOrder.ZXY, normal, yDir, zDir, refAxes);\n }\n } else if (!tangent.isParallelTo(zDir, true)) {\n const yDir = zDir.unitCrossProduct(tangent);\n if (undefined !== yDir) {\n yDir.unitCrossProduct(zDir, tangent);\n Matrix3d.createColumnsInAxisOrder(AxisOrder.XYZ, tangent, yDir, zDir, refAxes);\n }\n }\n\n this._locationData.push({ point, adjustedPoint, refAxes });\n\n if (this._locationData.length > 1 && !ev.isControlKey)\n await this.acceptNewSegments();\n this.setupAndPromptForNextAction();\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n if (0 === this._locationData.length) {\n await this.onReinitialize();\n return EventHandled.No;\n }\n await this.acceptNewSegments();\n this.setupAndPromptForNextAction();\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._locationData.length && 0 === this._acceptedSegments.length)\n return false;\n\n if (0 !== this._locationData.length) {\n this._locationData.pop();\n } else if (0 !== this._acceptedSegments.length) {\n this._acceptedSegments.pop();\n }\n\n if (0 === this._locationData.length && 0 === this._acceptedSegments.length) {\n await this.onReinitialize();\n } else {\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n }\n return true;\n }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureDistanceTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report spatial coordinate at a point as well as cartographic location for geolocated models using current quantity formatters.\n * @public\n */\nexport class MeasureLocationTool extends PrimitiveTool {\n public static override toolId = \"Measure.Location\";\n public static override iconSpec = \"icon-measure-location\";\n /** @internal */\n protected readonly _acceptedLocations: MeasureMarker[] = [];\n /** @internal */\n protected allowView(vp: Viewport) { return vp.view.isSpatialView() || vp.view.isDrawingView(); }\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(\"Measure.Location.Prompts.EnterPoint\"));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 !== this._acceptedLocations.length) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Mouse));\n }\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n this.showPrompt();\n }\n\n protected async getMarkerToolTip(point: Point3d): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n\n let toolTipHtml = \"\";\n const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n if (undefined !== coordFormatterSpec) {\n let pointAdjusted = point;\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n pointAdjusted = pointAdjusted.minus(globalOrigin);\n }\n const formattedPointX = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.x, coordFormatterSpec);\n const formattedPointY = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.y, coordFormatterSpec);\n const formattedPointZ = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"Coordinate\") + formattedPointX}, ${formattedPointY}`;\n if (is3d)\n toolTipHtml += `, ${formattedPointZ}`;\n\n toolTipHtml += \"<br>\";\n }\n\n if (isSpatial) {\n const latLongFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.ANGLE\", \"Units.RAD\");\n if (undefined !== latLongFormatterSpec && undefined !== coordFormatterSpec) {\n try {\n const cartographic = await this.iModel.spatialToCartographic(point);\n const formattedLat = IModelApp.quantityFormatter.formatQuantity(Math.abs(cartographic.latitude), latLongFormatterSpec);\n const formattedLong = IModelApp.quantityFormatter.formatQuantity(Math.abs(cartographic.longitude), latLongFormatterSpec);\n const formattedHeight = IModelApp.quantityFormatter.formatQuantity(cartographic.height, coordFormatterSpec);\n const latDir = CoreTools.translate(cartographic.latitude < 0 ? \"Measure.Labels.S\" : \"Measure.Labels.N\");\n const longDir = CoreTools.translate(cartographic.longitude < 0 ? \"Measure.Labels.W\" : \"Measure.Labels.E\");\n toolTipHtml += `${translateBold(\"LatLong\") + formattedLat + latDir}, ${formattedLong}${longDir}<br>`;\n toolTipHtml += `${translateBold(\"Altitude\") + formattedHeight}<br>`;\n } catch { }\n }\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void {\n if (!this.isCompatibleViewport(context.viewport, false))\n return;\n\n this._acceptedLocations.forEach((marker) => marker.addDecoration(context));\n }\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void { this.decorate(context); }\n\n protected reportMeasurements(): void {\n if (0 === this._acceptedLocations.length)\n return;\n const briefMsg = this._acceptedLocations[this._acceptedLocations.length - 1].title;\n if (undefined === briefMsg)\n return;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n const point = ev.point.clone();\n const adjustedPoint = adjustPoint(ev);\n const toolTip = await this.getMarkerToolTip(adjustedPoint);\n const marker = new MeasureMarker((this._acceptedLocations.length + 1).toString(), toolTip, point, Point2d.create(25, 25));\n\n this._acceptedLocations.push(marker);\n this.reportMeasurements();\n this.setupAndPromptForNextAction();\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n await this.onReinitialize();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._acceptedLocations.length)\n return false;\n\n this._acceptedLocations.pop();\n if (0 === this._acceptedLocations.length) {\n await this.onReinitialize();\n } else {\n this.reportMeasurements();\n this.setupAndPromptForNextAction();\n }\n return true;\n }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureLocationTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report area defined by points using current quantity formatter for area.\n * @public\n */\nexport class MeasureAreaByPointsTool extends PrimitiveTool {\n public static override toolId = \"Measure.AreaByPoints\";\n public static override iconSpec = \"icon-measure-2d\";\n /** @internal */\n private _orientationValue: DialogItemValue = { value: ContextRotationId.Top };\n /** @internal */\n protected readonly _points: Point3d[] = [];\n /** @internal */\n protected _matrix?: Matrix3d;\n /** @internal */\n protected _isComplete = false;\n /** @internal */\n protected _area = 0.0;\n /** @internal */\n protected _perimeter = 0.0;\n /** @internal */\n protected _centroid = Point3d.createZero();\n /** @internal */\n protected _marker?: MeasureLabel;\n /** @internal */\n protected _acceptedMeasurement?: MeasureMarker;\n /** @internal */\n protected _lastMotionPt?: Point3d;\n\n /** @internal */\n public get orientation(): ContextRotationId { return this._orientationValue.value as ContextRotationId; }\n public set orientation(option: ContextRotationId) { this._orientationValue.value = option; }\n\n /** @internal */\n protected static _orientationName = \"enumAsOrientation\";\n /** @internal */\n protected static enumAsOrientationMessage(str: string) { return CoreTools.translate(`Settings.Orientation.${str}`); }\n /** @internal */\n protected static _getEnumAsOrientationDescription = (): PropertyDescription => {\n return {\n name: MeasureAreaByPointsTool._orientationName,\n displayLabel: CoreTools.translate(\"Settings.Orientation.Label\"),\n typename: \"enum\",\n enum: {\n choices: [\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Top\"), value: ContextRotationId.Top },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Front\"), value: ContextRotationId.Front },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Left\"), value: ContextRotationId.Left },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Bottom\"), value: ContextRotationId.Bottom },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Back\"), value: ContextRotationId.Back },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Right\"), value: ContextRotationId.Right },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"View\"), value: ContextRotationId.View },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Face\"), value: ContextRotationId.Face },\n ],\n },\n };\n };\n\n /** @internal */\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\n const initialValue = IModelApp.toolAdmin.toolSettingsState.getInitialToolSettingValue(this.toolId, MeasureAreaByPointsTool._orientationName);\n initialValue && (this._orientationValue = initialValue);\n const toolSettings = new Array<DialogItem>();\n toolSettings.push({ value: this._orientationValue, property: MeasureAreaByPointsTool._getEnumAsOrientationDescription(), editorPosition: { rowPriority: 0, columnIndex: 2 } });\n return toolSettings;\n }\n\n /** @internal */\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\n if (updatedValue.propertyName === MeasureAreaByPointsTool._orientationName) {\n this._orientationValue = updatedValue.value;\n if (!this._orientationValue)\n return false;\n IModelApp.toolAdmin.toolSettingsState.saveToolSettingProperty(this.toolId, { propertyName: MeasureAreaByPointsTool._orientationName, value: this._orientationValue });\n await this.onReinitialize();\n return true;\n }\n return false;\n }\n\n /** @internal */\n protected allowView(vp: Viewport) { return vp.view.isSpatialView() || vp.view.isDrawingView(); }\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n let mainMsg = \"Measure.AreaByPoints.Prompts.\";\n switch (this._points.length) {\n case 0:\n mainMsg += \"FirstPoint\";\n break;\n case 1:\n mainMsg += \"SecondPoint\";\n break;\n case 2:\n mainMsg += \"ThirdPoint\";\n break;\n default:\n mainMsg += this._isComplete ? \"FirstPoint\" : \"NextPoint\";\n break;\n }\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(mainMsg));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n const acceptMsg = CoreTools.translate(this._isComplete ? \"ElementSet.Inputs.Restart\" : \"ElementSet.Inputs.AcceptPoint\");\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\n\n const resetMsg = CoreTools.translate(\"ElementSet.Inputs.Restart\");\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, resetMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, resetMsg, false, ToolAssistanceInputMethod.Mouse));\n\n if (this._points.length > 1)\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AdditionalPoint\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 !== this._points.length)\n mouseInstructions.push(ToolAssistance.createKeyboardInstruction(ToolAssistance.createKeyboardInfo([ToolAssistance.ctrlKey, \"Z\"]), CoreTools.translate(\"ElementSet.Inputs.UndoLastPoint\"), false, ToolAssistanceInputMethod.Mouse));\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n this.showPrompt();\n\n if (this._isComplete) {\n AccuDrawHintBuilder.deactivate();\n return;\n }\n\n if (0 === this._points.length)\n return;\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this._points[this._points.length - 1]);\n if (this._matrix) {\n if (1 === this._points.length) {\n hints.setMatrix(this._matrix);\n hints.setModeRectangular();\n } else if (this._points.length > 1 && !(this._points[this._points.length - 1].isAlmostEqual(this._points[this._points.length - 2]))) {\n const xVec = Vector3d.createStartEnd(this._points[this._points.length - 2], this._points[this._points.length - 1]);\n const zVec = this._matrix.getColumn(2);\n const matrix = Matrix3d.createRigidFromColumns(xVec, zVec, AxisOrder.XZY);\n if (undefined !== matrix)\n hints.setMatrix(matrix); // Rotate AccuDraw x axis to last segment preserving current up vector...\n }\n }\n hints.setLockZ = true;\n hints.sendHints();\n }\n\n /** @internal */\n protected getShapePoints(cursorPt: Point3d): Point3d[] {\n const points: Point3d[] = [];\n if (undefined === this.targetView || this._points.length < 1)\n return points;\n for (const pt of this._points)\n points.push(pt.clone());\n\n if (this._isComplete || !this._matrix)\n return points;\n\n const normal = this._matrix.getColumn(2);\n let currentPt = AccuDrawHintBuilder.projectPointToPlaneInView(cursorPt, points[0], normal, this.targetView, true);\n if (undefined === currentPt)\n currentPt = cursorPt.clone();\n if (2 === points.length && 0 === (IModelApp.toolAdmin.currentInputState.qualifiers & BeModifierKeys.Control)) {\n const xDir = Vector3d.createStartEnd(points[0], points[1]);\n const xLen = xDir.magnitude();\n xDir.normalizeInPlace();\n const yDir = xDir.crossProduct(normal);\n yDir.normalizeInPlace();\n const cornerPt = AccuDrawHintBuilder.projectPointToLineInView(currentPt, points[1], yDir, this.targetView, true);\n if (undefined !== cornerPt) {\n points.push(cornerPt);\n cornerPt.plusScaled(xDir, -xLen, currentPt);\n }\n }\n points.push(currentPt);\n\n if (points.length > 2)\n points.push(points[0].clone());\n\n return points;\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void {\n if (context.viewport !== this.targetView)\n return;\n\n if (undefined === this._lastMotionPt)\n return;\n const points = this.getShapePoints(this._lastMotionPt);\n if (points.length < 2)\n return;\n\n const builderAccVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\n const builderAccHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\n const colorAccVis = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\n const colorAccHid = colorAccVis.withAlpha(100);\n const fillAccVis = context.viewport.hilite.color.withAlpha(50);\n\n builderAccVis.setSymbology(colorAccVis, fillAccVis, 3);\n builderAccHid.setSymbology(colorAccHid, fillAccVis, 1, LinePixels.Code2);\n\n if (points.length > 2)\n builderAccHid.addShape(points);\n\n builderAccVis.addLineString(points);\n builderAccHid.addLineString(points);\n\n context.addDecorationFromBuilder(builderAccVis);\n context.addDecorationFromBuilder(builderAccHid);\n\n if (undefined !== this._acceptedMeasurement)\n this._acceptedMeasurement.addDecoration(context);\n if (undefined !== this._marker)\n this._marker.addDecoration(context);\n }\n\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void {\n if (this._isComplete)\n this.decorate(context);\n }\n\n /** @internal */\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (this._points.length > 0 && undefined !== ev.viewport && !this._isComplete) {\n if (undefined !== this._lastMotionPt)\n this._lastMotionPt.setFrom(ev.point);\n else\n this._lastMotionPt = ev.point.clone();\n ev.viewport.invalidateDecorations();\n }\n }\n\n protected async getMarkerToolTip(): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n let toolTipHtml = \"\";\n\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.AREA\", \"Units.SQ_M\");\n if (undefined !== areaFormatterSpec) {\n const formattedArea = IModelApp.quantityFormatter.formatQuantity(this._area, areaFormatterSpec);\n toolTipHtml += `${translateBold(\"Area\") + formattedArea}<br>`;\n }\n const perimeterFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n if (undefined !== perimeterFormatterSpec) {\n const formattedPerimeter = IModelApp.quantityFormatter.formatQuantity(this._perimeter, perimeterFormatterSpec);\n toolTipHtml += `${translateBold(\"Perimeter\") + formattedPerimeter}<br>`;\n }\n const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n if (undefined !== coordFormatterSpec) {\n let pointAdjusted = this._centroid.clone();\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n pointAdjusted = pointAdjusted.minus(globalOrigin);\n }\n const formattedPointX = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.x, coordFormatterSpec);\n const formattedPointY = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.y, coordFormatterSpec);\n const formattedPointZ = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"Centroid\") + formattedPointX}, ${formattedPointY}`;\n if (is3d)\n toolTipHtml += `, ${formattedPointZ}`;\n\n toolTipHtml += \"<br>\";\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n protected reportMeasurements(): void {\n if (undefined === this._marker)\n return;\n const briefMsg = `${CoreTools.translate(\"Measure.Labels.Area\")}: ${this._marker.label}`;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n protected async updateTotals(): Promise<void> {\n if (this._points.length < 3)\n return;\n\n const result = PolygonOps.centroidAreaNormal(this._points);\n if (undefined === result)\n return;\n\n this._area = result.a ? result.a : 0.0;\n this._centroid.setFrom(result.origin);\n this._perimeter = 0.0;\n for (let i = 1; i < this._points.length; i++)\n this._perimeter += (this._points[i - 1].distance(this._points[i]));\n\n const toolTip = await this.getMarkerToolTip();\n this._acceptedMeasurement = new MeasureMarker(\"1\", toolTip, this._centroid, Point2d.create(25, 25));\n this._marker = undefined;\n\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.AREA\", \"Units.SQ_M\");\n if (undefined === areaFormatterSpec)\n return;\n const formattedTotalArea = IModelApp.quantityFormatter.formatQuantity(this._area, areaFormatterSpec);\n this._marker = new MeasureLabel(this._centroid, formattedTotalArea);\n\n this.reportMeasurements();\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined === this.targetView)\n return EventHandled.No;\n\n if (this._isComplete)\n await this.onReinitialize();\n\n if (this._points.length > 1 && !ev.isControlKey) {\n const points = this.getShapePoints(ev.point);\n if (points.length < 3)\n return EventHandled.No;\n\n this._isComplete = true;\n this._points.length = 0;\n for (const pt of points)\n this._points.push(pt);\n\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n\n if (undefined === this._matrix && undefined === (this._matrix = AccuDrawHintBuilder.getContextRotation(this.orientation, this.targetView)))\n return EventHandled.No;\n\n const currPt = ev.point.clone();\n if (this._points.length > 0) {\n const vp = ev.viewport;\n const planePt = (vp ? AccuDrawHintBuilder.projectPointToPlaneInView(currPt, this._points[0], this._matrix.getColumn(2), vp, true) : undefined);\n if (undefined !== planePt)\n currPt.setFrom(planePt);\n }\n\n this._points.push(currPt);\n this.setupAndPromptForNextAction();\n\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n await this.onReinitialize();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onReinitialize(): Promise<void> {\n this._acceptedMeasurement = undefined;\n this._marker = undefined;\n this._isComplete = false;\n this._points.length = 0;\n this._matrix = undefined;\n AccuDrawHintBuilder.deactivate();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._points.length || this._isComplete)\n return false;\n\n this._points.pop();\n this.setupAndPromptForNextAction();\n return true;\n }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureAreaByPointsTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Base class for mass properties tools.\n * @public\n */\nexport abstract class MeasureElementTool extends PrimitiveTool {\n /** @internal */\n protected readonly _checkedIds = new Map<Id64String, MassPropertiesResponseProps>();\n /** @internal */\n protected readonly _acceptedIds: Id64Array = [];\n /** @internal */\n protected readonly _acceptedMeasurements: MeasureMarker[] = [];\n /** @internal */\n protected _totalValue: number = 0.0;\n /** @internal */\n protected _totalMarker?: MeasureLabel;\n /** @internal */\n protected _useSelection: boolean = false;\n\n protected abstract getOperation(): MassPropertiesOperation;\n\n /** @internal */\n protected allowView(vp: Viewport) {\n return (MassPropertiesOperation.AccumulateVolumes === this.getOperation() ? vp.view.isSpatialView() : (vp.view.isSpatialView() || vp.view.isDrawingView()));\n }\n\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onCleanup() {\n if (0 !== this._acceptedIds.length)\n this.iModel.hilited.remove({ elements: this._acceptedIds });\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n const mainMsg = (this._useSelection ? (0 === this._acceptedMeasurements.length ? \"ElementSet.Prompts.ConfirmSelection\" : \"ElementSet.Prompts.InspectResult\") : \"ElementSet.Prompts.IdentifyElement\");\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(mainMsg));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (this._useSelection) {\n if (0 === this._acceptedMeasurements.length) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptSelection\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptSelection\"), false, ToolAssistanceInputMethod.Mouse));\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.RejectSelection\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.RejectSelection\"), false, ToolAssistanceInputMethod.Mouse));\n } else {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Exit\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Exit\"), false, ToolAssistanceInputMethod.Mouse));\n }\n } else {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptElement\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptElement\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 !== this._acceptedMeasurements.length) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Mouse));\n }\n }\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n this._useSelection = (undefined !== this.targetView && this.targetView.iModel.selectionSet.isActive);\n if (!this._useSelection)\n this.initLocateElements();\n this.showPrompt();\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void {\n if (!this.isCompatibleViewport(context.viewport, false))\n return;\n\n this._acceptedMeasurements.forEach((marker) => marker.addDecoration(context));\n if (undefined !== this._totalMarker)\n this._totalMarker.addDecoration(context);\n }\n\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void { this.decorate(context); }\n\n protected reportMeasurements(): void {\n if (undefined === this._totalMarker)\n return;\n let label = \"Measure.Labels.\";\n switch (this.getOperation()) {\n case MassPropertiesOperation.AccumulateLengths:\n label += \"Length\";\n break;\n case MassPropertiesOperation.AccumulateAreas:\n label += \"Area\";\n break;\n case MassPropertiesOperation.AccumulateVolumes:\n label += \"Volume\";\n break;\n default:\n return;\n }\n const briefMsg = `${CoreTools.translate(label)}: ${this._totalMarker.label}`;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n protected async getMarkerToolTip(responseProps: MassPropertiesResponseProps): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n let toolTipHtml = \"\";\n\n switch (this.getOperation()) {\n case MassPropertiesOperation.AccumulateLengths: {\n const distanceFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n if (undefined !== distanceFormatterSpec) {\n const formattedLength = IModelApp.quantityFormatter.formatQuantity(responseProps.length ? responseProps.length : 0, distanceFormatterSpec);\n toolTipHtml += `${translateBold(\"Length\") + formattedLength}<br>`;\n }\n break;\n }\n case MassPropertiesOperation.AccumulateAreas: {\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.AREA\", \"Units.SQ_M\");\n if (undefined !== areaFormatterSpec) {\n const formattedArea = IModelApp.quantityFormatter.formatQuantity(responseProps.area ? responseProps.area : 0, areaFormatterSpec);\n toolTipHtml += `${translateBold(\"Area\") + formattedArea}<br>`;\n }\n if (responseProps.perimeter) {\n const perimeterFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n if (undefined !== perimeterFormatterSpec) {\n const formattedPerimeter = IModelApp.quantityFormatter.formatQuantity(responseProps.perimeter, perimeterFormatterSpec);\n toolTipHtml += `${translateBold(\"Perimeter\") + formattedPerimeter}<br>`;\n }\n }\n break;\n }\n case MassPropertiesOperation.AccumulateVolumes: {\n const volumeFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.VOLUME\", \"Units.CUB_M\");\n if (undefined !== volumeFormatterSpec) {\n const formattedVolume = IModelApp.quantityFormatter.formatQuantity(responseProps.volume ? responseProps.volume : 0, volumeFormatterSpec);\n toolTipHtml += `${translateBold(\"Volume\") + formattedVolume}<br>`;\n }\n if (responseProps.area) {\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.AREA\", \"Units.SQ_M\");\n if (undefined !== areaFormatterSpec) {\n const formattedArea = IModelApp.quantityFormatter.formatQuantity(responseProps.area, areaFormatterSpec);\n toolTipHtml += `${translateBold(\"Area\") + formattedArea}<br>`;\n }\n }\n break;\n }\n }\n\n if (responseProps.centroid) {\n const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n if (undefined !== coordFormatterSpec) {\n let pointAdjusted = Point3d.fromJSON(responseProps.centroid);\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n pointAdjusted = pointAdjusted.minus(globalOrigin);\n }\n const formattedPointX = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.x, coordFormatterSpec);\n const formattedPointY = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.y, coordFormatterSpec);\n const formattedPointZ = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"Centroid\") + formattedPointX}, ${formattedPointY}`;\n if (is3d)\n toolTipHtml += `, ${formattedPointZ}`;\n toolTipHtml += \"<br>\";\n }\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n private getResultValue(operation: MassPropertiesOperation, result: MassPropertiesResponseProps): number {\n switch (operation) {\n case MassPropertiesOperation.AccumulateLengths:\n return (result.length ? result.length : 0.0);\n case MassPropertiesOperation.AccumulateAreas:\n return (result.area ? result.area : 0.0);\n case MassPropertiesOperation.AccumulateVolumes:\n return (result.volume ? result.volume : 0.0);\n }\n }\n\n protected async updateTotals(selectionSetResult?: MassPropertiesResponseProps): Promise<void> {\n this._totalValue = 0.0;\n this._totalMarker = undefined;\n\n let labelPt;\n const operation = this.getOperation();\n if (undefined !== selectionSetResult) {\n labelPt = Point3d.fromJSON(selectionSetResult.centroid);\n this._totalValue += this.getResultValue(operation, selectionSetResult);\n } else if (0 !== this._acceptedIds.length) {\n for (const id of this._acceptedIds) {\n const result = this._checkedIds.get(id);\n if (undefined === result)\n continue;\n labelPt = Point3d.fromJSON(result.centroid);\n this._totalValue += this.getResultValue(operation, result);\n }\n }\n if (0.0 === this._totalValue || undefined === labelPt)\n return;\n\n switch (operation) {\n case MassPropertiesOperation.AccumulateLengths:\n const distanceFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.LENGTH\", \"Units.M\");\n if (undefined === distanceFormatterSpec)\n return;\n const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(this._totalValue, distanceFormatterSpec);\n this._totalMarker = new MeasureLabel(labelPt, formattedTotalDistance);\n break;\n case MassPropertiesOperation.AccumulateAreas:\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.AREA\", \"Units.SQ_M\");\n if (undefined === areaFormatterSpec)\n return;\n const formattedTotalArea = IModelApp.quantityFormatter.formatQuantity(this._totalValue, areaFormatterSpec);\n this._totalMarker = new MeasureLabel(labelPt, formattedTotalArea);\n break;\n case MassPropertiesOperation.AccumulateVolumes:\n const volumeFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"AecUnits.VOLUME\", \"Units.CUB_M\");\n\n if (undefined === volumeFormatterSpec)\n return;\n const formattedTotalVolume = IModelApp.quantityFormatter.formatQuantity(this._totalValue, volumeFormatterSpec);\n this._totalMarker = new MeasureLabel(labelPt, formattedTotalVolume);\n break;\n }\n\n this.reportMeasurements();\n }\n\n /** @internal */\n public async doMeasureSelectedElements(viewport: Viewport): Promise<void> {\n const candidates: Id64Array = [];\n viewport.iModel.selectionSet.elements.forEach((val) => {\n if (!Id64.isInvalid(val) && !Id64.isTransient(val))\n candidates.push(val);\n });\n\n if (0 === candidates.length)\n return;\n\n const requestProps: MassPropertiesRequestProps = {\n operation: this.getOperation(),\n candidates,\n };\n const result = await this.iModel.getMassProperties(requestProps);\n if (BentleyStatus.SUCCESS !== result.status)\n return;\n\n const toolTip = await this.getMarkerToolTip(result);\n const point = Point3d.fromJSON(result.centroid);\n const marker = new MeasureMarker((this._acceptedMeasurements.length + 1).toString(), toolTip, point, Point2d.create(25, 25));\n\n this._acceptedMeasurements.push(marker);\n await this.updateTotals(result);\n this.setupAndPromptForNextAction();\n\n if (undefined !== viewport)\n viewport.invalidateDecorations();\n }\n\n /** @internal */\n public override async filterHit(hit: HitDetail, _out?: LocateResponse): Promise<LocateFilterStatus> {\n if (!hit.isElementHit)\n return LocateFilterStatus.Reject;\n\n let result = this._checkedIds.get(hit.sourceId);\n if (undefined === result) {\n const requestProps: MassPropertiesRequestProps = {\n operation: this.getOperation(),\n candidates: [hit.sourceId],\n };\n result = await this.iModel.getMassProperties(requestProps);\n this._checkedIds.set(hit.sourceId, result);\n }\n\n return (BentleyStatus.SUCCESS === result.status ? LocateFilterStatus.Accept : LocateFilterStatus.Reject);\n }\n\n /** @internal */\n public override async onReinitialize(): Promise<void> {\n if (this._useSelection)\n return this.exitTool();\n return this.onRestartTool();\n }\n\n /** @internal */\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n await this.onReinitialize();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (this._useSelection) {\n if (0 === this._acceptedMeasurements.length && undefined !== ev.viewport) {\n await this.doMeasureSelectedElements(ev.viewport);\n if (0 !== this._acceptedMeasurements.length)\n return EventHandled.Yes;\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, CoreTools.translate(\"ElementSet.Error.NotSupportedElmType\")));\n await this.onReinitialize();\n }\n return EventHandled.Yes;\n }\n\n const hit = await IModelApp.locateManager.doLocate(new LocateResponse(), true, ev.point, ev.viewport, ev.inputSource);\n if (undefined === hit || !hit.isElementHit)\n return EventHandled.No;\n\n const result = this._checkedIds.get(hit.sourceId);\n if (undefined === result)\n return EventHandled.No;\n if (-1 !== this._acceptedIds.indexOf(hit.sourceId))\n return EventHandled.Yes; // Already accepted, not rejected in filterHit to avoid showing \"not\" cursor...\n\n const toolTip = await this.getMarkerToolTip(result);\n const point = result.centroid ? Point3d.fromJSON(result.centroid) : ev.point.clone();\n const marker = new MeasureMarker((this._acceptedMeasurements.length + 1).toString(), toolTip, point, Point2d.create(25, 25));\n\n this._acceptedMeasurements.push(marker);\n this._acceptedIds.push(hit.sourceId);\n this.iModel.hilited.add({ elements: hit.sourceId });\n\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._acceptedMeasurements.length)\n return false;\n\n this._acceptedMeasurements.pop();\n if (0 === this._acceptedMeasurements.length) {\n await this.onReinitialize();\n } else {\n if (0 !== this._acceptedIds.length) {\n this.iModel.hilited.remove({ elements: this._acceptedIds[this._acceptedIds.length - 1] });\n this._acceptedIds.pop();\n }\n\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n }\n return true;\n }\n}\n\n/** Report accumulated lengths of selected elements using the current quantity formatter for length.\n * @public\n */\nexport class MeasureLengthTool extends MeasureElementTool {\n public static override toolId = \"Measure.Length\";\n public static override iconSpec = \"icon-measure\";\n protected getOperation(): MassPropertiesOperation { return MassPropertiesOperation.AccumulateLengths; }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureLengthTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report accumulated areas of selected elements using the current quantity formatter for area.\n * @public\n */\nexport class MeasureAreaTool extends MeasureElementTool {\n public static override toolId = \"Measure.Area\";\n public static override iconSpec = \"icon-measure-area\";\n protected getOperation(): MassPropertiesOperation { return MassPropertiesOperation.AccumulateAreas; }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureAreaTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report accumulated volumes of selected elements using the current quantity formatter for volume.\n * @public\n */\nexport class MeasureVolumeTool extends MeasureElementTool {\n public static override toolId = \"Measure.Volume\";\n public static override iconSpec = \"icon-measure-3d\";\n protected getOperation(): MassPropertiesOperation { return MassPropertiesOperation.AccumulateVolumes; }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureVolumeTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n"]}
1
+ {"version":3,"file":"MeasureTool.js","sourceRoot":"","sources":["../../../src/tools/MeasureTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Measure\n */\n\nimport { BentleyStatus, Id64, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport { AxisOrder, IModelJson, Matrix3d, Plane3dByOriginAndUnitNormal, Point2d, Point3d, PointString3d, PolygonOps, Vector3d, XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { ColorDef, GeometryStreamProps, LinePixels, MassPropertiesOperation, MassPropertiesRequestProps, MassPropertiesResponseProps } from \"@itwin/core-common\";\nimport { DialogItem, DialogItemValue, DialogPropertySyncItem, PropertyDescription } from \"@itwin/appui-abstract\";\nimport { AccuDrawHintBuilder, ContextRotationId } from \"../AccuDraw\";\nimport { LocateFilterStatus, LocateResponse } from \"../ElementLocateManager\";\nimport { HitDetail, HitGeomType } from \"../HitDetail\";\nimport { IModelApp } from \"../IModelApp\";\nimport { Marker } from \"../Marker\";\nimport { NotifyMessageDetails, OutputMessagePriority, OutputMessageType } from \"../NotificationManager\";\nimport { CanvasDecoration } from \"../render/CanvasDecoration\";\nimport { DecorateContext } from \"../ViewContext\";\nimport { Viewport } from \"../Viewport\";\nimport { PrimitiveTool } from \"./PrimitiveTool\";\nimport { BeButtonEvent, BeModifierKeys, CoreTools, EventHandled, InputSource } from \"./Tool\";\nimport { ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection } from \"./ToolAssistance\";\nimport { GraphicType } from \"../common/render/GraphicType\";\nimport { FormatterSpec } from \"@itwin/core-quantity\";\n\nfunction translateBold(key: string) {\n return `<b>${CoreTools.translate(`Measure.Labels.${key}`)}:</b> `;\n}\n\nasync function getFormatterSpecByKoQAndPersistenceUnit(koq: string, persistenceUnitName: string): Promise<FormatterSpec | undefined> {\n const formatProps = await IModelApp.formatsProvider.getFormat(koq);\n if (undefined === formatProps)\n return undefined;\n return IModelApp.quantityFormatter.createFormatterSpec({\n persistenceUnitName,\n formatProps,\n formatName: koq\n });\n}\n\n/** @internal */\nclass MeasureLabel implements CanvasDecoration {\n public worldLocation = new Point3d();\n public position = new Point3d();\n public label: string;\n\n constructor(worldLocation: XYAndZ, label: string) {\n this.worldLocation.setFrom(worldLocation);\n this.label = label;\n }\n\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\n ctx.font = \"16px sans-serif\";\n const labelHeight = ctx.measureText(\"M\").width; // Close enough for border padding...\n const labelWidth = ctx.measureText(this.label).width + labelHeight;\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = \"white\";\n ctx.fillStyle = \"rgba(0,0,0,.4)\";\n ctx.shadowColor = \"black\";\n ctx.shadowBlur = 10;\n ctx.fillRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\n ctx.strokeRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\n\n ctx.fillStyle = \"white\";\n ctx.shadowBlur = 0;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(this.label, 0, 0);\n }\n\n public setPosition(vp: Viewport): boolean {\n vp.worldToView(this.worldLocation, this.position);\n this.position.y -= Math.floor(vp.pixelsFromInches(0.44)) + 0.5; // Offset from snap location...\n return vp.viewRect.containsPoint(this.position);\n }\n\n public addDecoration(context: DecorateContext) {\n if (this.setPosition(context.viewport))\n context.addCanvasDecoration(this);\n }\n}\n\n/** @internal */\nclass MeasureMarker extends Marker {\n public isSelected: boolean = false;\n constructor(label: string, title: HTMLElement, worldLocation: XYAndZ, size: XAndY) {\n super(worldLocation, size);\n\n const markerDrawFunc = (ctx: CanvasRenderingContext2D) => {\n ctx.beginPath();\n ctx.arc(0, 0, this.size.x * 0.5, 0, 2 * Math.PI);\n ctx.lineWidth = 2;\n ctx.strokeStyle = \"black\";\n const hilite = this.isSelected && this._hiliteColor ? this._hiliteColor.colors : undefined;\n ctx.fillStyle = undefined !== hilite ? `rgba(${hilite.r | 0},${hilite.g | 0},${hilite.b | 0}, 0.5)` : \"rgba(255,255,255,.5)\";\n ctx.fill();\n ctx.stroke();\n };\n\n this.drawFunc = markerDrawFunc;\n this.title = title;\n this.label = label;\n this.labelFont = \"16px sans-serif\";\n this.labelColor = \"black\";\n this.labelMaxWidth = this.size.x * 0.75;\n this.labelOffset = { x: 0, y: -1 };\n }\n\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Never forward event to active tool...\n\n public override onMouseEnter(ev: BeButtonEvent) {\n super.onMouseEnter(ev);\n if (this.title && InputSource.Touch === ev.inputSource && ev.viewport)\n ev.viewport.openToolTip(this.title, ev.viewPoint, this.tooltipOptions);\n }\n\n public override onMouseLeave() {\n super.onMouseLeave();\n if (this.title)\n IModelApp.notifications.clearToolTip(); // Clear tool tip from tap since we won't get a motion event...\n }\n}\n\n/** @internal */\ninterface Location { point: Point3d, adjustedPoint: Point3d, refAxes: Matrix3d }\n/** @internal */\ninterface Segment { distance: number, slope: number, start: Point3d, end: Point3d, delta: Vector3d, adjustedStart: Point3d, adjustedEnd: Point3d, adjustedDelta: Vector3d, refAxes: Matrix3d, marker: MeasureMarker }\n\n/** @internal */\nfunction adjustPoint(ev: BeButtonEvent, segments?: Array<Segment>, locations?: Array<Location>): Point3d {\n // If the point was from a hit we must transform it by the display transform of what got hit.\n const hit = IModelApp.accuSnap.currHit;\n if (!hit || !ev.viewport || !hit.modelId)\n return ev.point;\n\n if (\"0\" !== hit.modelId) {\n const transform = ev.viewport.view.computeDisplayTransform({ modelId: hit.modelId, elementId: hit.sourceId });\n return transform?.multiplyInversePoint3d(ev.point) ?? ev.point;\n }\n\n // Must have snapped to a decoration, so look through previous any segments & locations for a match to get an adjusted point.\n if (segments) {\n for (const seg of segments) {\n if (seg.start.isExactEqual(ev.point))\n return seg.adjustedStart.clone();\n\n if (seg.end.isExactEqual(ev.point))\n return seg.adjustedEnd.clone();\n }\n }\n\n if (locations)\n for (const loc of locations)\n if (loc.point.isExactEqual(ev.point))\n return loc.adjustedPoint.clone();\n\n return ev.point;\n}\n\n/** Report distance between 2 points using current quantity formatter for length.\n * @public\n */\nexport class MeasureDistanceTool extends PrimitiveTool {\n public static override toolId = \"Measure.Distance\";\n public static override iconSpec = \"icon-measure-distance\";\n /** @internal */\n protected readonly _locationData = new Array<Location>();\n /** @internal */\n protected readonly _acceptedSegments = new Array<Segment>();\n /** @internal */\n protected _totalDistance: number = 0.0;\n /** @internal */\n protected _totalDistanceMarker?: MeasureLabel;\n /** @internal */\n protected _snapGeomId?: string;\n /** @internal */\n protected _lastMotionPt?: Point3d;\n /** @internal */\n protected _lastMotionAdjustedPt?: Point3d;\n /** @internal */\n protected _lengthFormatterSpec?: FormatterSpec;\n /** @internal */\n protected _angleFormatterSpec?: FormatterSpec;\n /** @internal */\n protected _removeFormatterListener?: () => void;\n\n /** @internal */\n protected allowView(vp: Viewport) { return vp.view.isSpatialView() || vp.view.isDrawingView(); }\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this._lengthFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH\", \"Units.M\");\n this._angleFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.ANGLE\", \"Units.RAD\");\n\n\n this._removeFormatterListener = IModelApp.formatsProvider.onFormatsChanged.addListener(async (args) => {\n if (args.formatsChanged === \"all\" || args.formatsChanged.includes(\"DefaultToolsUnits.LENGTH\"))\n this._lengthFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH\", \"Units.M\");\n\n if (args.formatsChanged === \"all\" || args.formatsChanged.includes(\"DefaultToolsUnits.ANGLE\"))\n this._angleFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.ANGLE\", \"Units.RAD\");\n });\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onCleanup(): Promise<void> {\n if (this._removeFormatterListener) {\n this._removeFormatterListener();\n this._removeFormatterListener = undefined;\n }\n\n await super.onCleanup();\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(0 === this._locationData.length ? \"Measure.Distance.Prompts.FirstPoint\" : \"Measure.Distance.Prompts.NextPoint\"));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 === this._locationData.length) {\n if (this._acceptedSegments.length > 0) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Mouse));\n }\n } else {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Cancel\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Cancel\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AdditionalPoint\"), false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createKeyboardInstruction(ToolAssistance.createKeyboardInfo([ToolAssistance.ctrlKey, \"Z\"]), CoreTools.translate(\"ElementSet.Inputs.UndoLastPoint\"), false, ToolAssistanceInputMethod.Mouse));\n }\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n const hints = new AccuDrawHintBuilder();\n hints.enableSmartRotation = true;\n hints.setModeRectangular();\n hints.sendHints(false);\n IModelApp.toolAdmin.setCursor(0 === this._locationData.length ? IModelApp.viewManager.crossHairCursor : IModelApp.viewManager.dynamicsCursor);\n this.showPrompt();\n }\n\n /** @internal */\n public override testDecorationHit(id: string): boolean { return id === this._snapGeomId; }\n\n /** @internal */\n protected getSnapPoints(): Point3d[] | undefined {\n if (this._acceptedSegments.length < 1 && this._locationData.length < 2)\n return undefined;\n\n const snapPoints: Point3d[] = [];\n for (const seg of this._acceptedSegments) {\n if (0 === snapPoints.length || !seg.start.isAlmostEqual(snapPoints[snapPoints.length - 1]))\n snapPoints.push(seg.start);\n if (!seg.end.isAlmostEqual(snapPoints[0]))\n snapPoints.push(seg.end);\n }\n\n if (this._locationData.length > 1)\n for (const loc of this._locationData)\n snapPoints.push(loc.point);\n return snapPoints;\n }\n\n /** @internal */\n public override getDecorationGeometry(_hit: HitDetail): GeometryStreamProps | undefined {\n const snapPoints = this.getSnapPoints();\n if (undefined === snapPoints)\n return undefined;\n const geomData = IModelJson.Writer.toIModelJson(PointString3d.create(snapPoints));\n return (undefined === geomData ? undefined : [geomData]);\n }\n\n /** @internal */\n protected displayDynamicDistance(context: DecorateContext, points: Point3d[], adjustedPoints: Point3d[]): void {\n let totalDistance = 0.0;\n for (let i = 0; i < adjustedPoints.length - 1; i++)\n totalDistance += adjustedPoints[i].distance(adjustedPoints[i + 1]);\n if (0.0 === totalDistance)\n return;\n\n const formatterSpec = this._lengthFormatterSpec;\n if (formatterSpec === undefined)\n return;\n const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(totalDistance, formatterSpec);\n const distDyn = new MeasureLabel(points[points.length - 1], formattedTotalDistance);\n distDyn.addDecoration(context);\n }\n\n /** @internal */\n protected displayDelta(context: DecorateContext, seg: any): void {\n const xVec = new Vector3d(seg.delta.x, 0.0, 0.0);\n const yVec = new Vector3d(0.0, seg.delta.y, 0.0);\n const zVec = new Vector3d(0.0, 0.0, seg.delta.z);\n\n seg.refAxes.multiplyVectorInPlace(xVec);\n seg.refAxes.multiplyVectorInPlace(yVec);\n seg.refAxes.multiplyVectorInPlace(zVec);\n\n const builderAxes = context.createGraphicBuilder(GraphicType.WorldOverlay);\n let basePt = seg.start.clone();\n\n if (xVec.magnitude() > 1.0e-5) {\n const segPoints: Point3d[] = [];\n segPoints.push(basePt);\n basePt = basePt.plus(xVec);\n segPoints.push(basePt);\n const colorX = ColorDef.red.adjustedForContrast(context.viewport.view.backgroundColor);\n builderAxes.setSymbology(colorX, ColorDef.black, 5);\n builderAxes.addLineString(segPoints);\n }\n\n if (yVec.magnitude() > 1.0e-5) {\n const segPoints: Point3d[] = [];\n segPoints.push(basePt);\n basePt = basePt.plus(yVec);\n segPoints.push(basePt);\n const colorY = ColorDef.green.adjustedForContrast(context.viewport.view.backgroundColor);\n builderAxes.setSymbology(colorY, ColorDef.black, 5);\n builderAxes.addLineString(segPoints);\n }\n\n if (zVec.magnitude() > 1.0e-5) {\n const segPoints: Point3d[] = [];\n segPoints.push(basePt);\n basePt = basePt.plus(zVec);\n segPoints.push(basePt);\n const colorZ = ColorDef.blue.adjustedForContrast(context.viewport.view.backgroundColor);\n builderAxes.setSymbology(colorZ, ColorDef.black, 5);\n builderAxes.addLineString(segPoints);\n }\n\n const segGlow = context.viewport.hilite.color.withAlpha(50);\n builderAxes.setSymbology(segGlow, ColorDef.black, 8);\n builderAxes.addLineString([seg.start, seg.end]);\n\n context.addDecorationFromBuilder(builderAxes);\n }\n\n /** @internal */\n protected createDecorations(context: DecorateContext, isSuspended: boolean): void {\n if (!this.isCompatibleViewport(context.viewport, false))\n return;\n\n if (!isSuspended && this._locationData.length > 0 && undefined !== this._lastMotionPt && undefined !== this._lastMotionAdjustedPt) {\n const tmpPoints: Point3d[] = [];\n const tmpAdjustedPoints: Point3d[] = [];\n for (const loc of this._locationData) {\n tmpPoints.push(loc.point); // Deep copy not necessary...\n tmpAdjustedPoints.push(loc.adjustedPoint);\n }\n tmpPoints.push(this._lastMotionPt);\n tmpAdjustedPoints.push(this._lastMotionAdjustedPt);\n\n const builderDynVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\n const colorDynVis = context.viewport.hilite.color;\n\n builderDynVis.setSymbology(colorDynVis, ColorDef.black, 3);\n builderDynVis.addLineString(tmpPoints);\n\n context.addDecorationFromBuilder(builderDynVis);\n\n const builderDynHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\n const colorDynHid = colorDynVis.withAlpha(100);\n\n builderDynHid.setSymbology(colorDynHid, ColorDef.black, 1, LinePixels.Code2);\n builderDynHid.addLineString(tmpPoints);\n\n context.addDecorationFromBuilder(builderDynHid);\n this.displayDynamicDistance(context, tmpPoints, tmpAdjustedPoints);\n }\n\n if (this._acceptedSegments.length > 0) {\n const builderAccVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\n const builderAccHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\n const colorAccVis = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\n const colorAccHid = colorAccVis.withAlpha(100);\n\n builderAccVis.setSymbology(colorAccVis, ColorDef.black, 3);\n builderAccHid.setSymbology(colorAccHid, ColorDef.black, 1, LinePixels.Code2);\n\n for (const seg of this._acceptedSegments) {\n builderAccVis.addLineString([seg.start, seg.end]);\n builderAccHid.addLineString([seg.start, seg.end]);\n seg.marker.addDecoration(context);\n if (seg.marker.isSelected)\n this.displayDelta(context, seg);\n }\n\n context.addDecorationFromBuilder(builderAccVis);\n context.addDecorationFromBuilder(builderAccHid);\n }\n\n if (undefined !== this._totalDistanceMarker)\n this._totalDistanceMarker.addDecoration(context);\n\n const snapPoints = this.getSnapPoints();\n if (undefined === snapPoints)\n return;\n\n if (undefined === this._snapGeomId)\n this._snapGeomId = this.iModel.transientIds.getNext();\n\n const builderSnapPts = context.createGraphicBuilder(GraphicType.WorldOverlay, undefined, this._snapGeomId);\n const colorAccPts = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\n\n builderSnapPts.setSymbology(colorAccPts, ColorDef.black, 7);\n builderSnapPts.addPointString(snapPoints);\n\n context.addDecorationFromBuilder(builderSnapPts);\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void { this.createDecorations(context, false); }\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void { this.createDecorations(context, true); }\n\n /** @internal */\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (this._locationData.length > 0 && undefined !== ev.viewport) {\n const point = ev.point;\n const adjustedPoint = adjustPoint(ev, this._acceptedSegments, this._locationData);\n if (undefined !== this._lastMotionPt) {\n this._lastMotionPt.setFrom(point);\n this._lastMotionAdjustedPt?.setFrom(adjustedPoint);\n } else {\n this._lastMotionPt = point.clone();\n this._lastMotionAdjustedPt = adjustedPoint;\n }\n ev.viewport.invalidateDecorations();\n }\n }\n\n protected reportMeasurements(): void {\n if (undefined === this._totalDistanceMarker)\n return;\n const briefMsg = `${CoreTools.translate(this._acceptedSegments.length > 1 ? \"Measure.Labels.CumulativeDistance\" : \"Measure.Labels.Distance\")}: ${this._totalDistanceMarker.label}`;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n protected async updateTotals(): Promise<void> {\n this._totalDistance = 0.0;\n this._totalDistanceMarker = undefined;\n for (const seg of this._acceptedSegments)\n this._totalDistance += seg.distance;\n if (0.0 === this._totalDistance)\n return;\n\n const formatterSpec = this._lengthFormatterSpec;\n if (undefined === formatterSpec)\n return;\n\n const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(this._totalDistance, formatterSpec);\n this._totalDistanceMarker = new MeasureLabel(this._acceptedSegments[this._acceptedSegments.length - 1].end, formattedTotalDistance);\n this.reportMeasurements();\n }\n\n protected async getMarkerToolTip(distance: number, slope: number, start: Point3d, end: Point3d, delta?: Vector3d): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n\n\n const distanceFormatterSpec = this._lengthFormatterSpec;\n if (undefined === distanceFormatterSpec)\n return toolTip;\n\n let toolTipHtml = \"\";\n const formattedDistance = IModelApp.quantityFormatter.formatQuantity(distance, distanceFormatterSpec);\n toolTipHtml += `${translateBold(\"Distance\") + formattedDistance}<br>`;\n\n if (is3d) {\n const angleFormatterSpec = this._angleFormatterSpec;\n if (undefined !== angleFormatterSpec) {\n const formattedSlope = IModelApp.quantityFormatter.formatQuantity(slope, angleFormatterSpec);\n toolTipHtml += `${translateBold(\"Slope\") + formattedSlope}<br>`;\n }\n }\n\n const coordFormatterSpec = this._lengthFormatterSpec;\n\n if (undefined !== coordFormatterSpec) {\n let startAdjusted = start;\n let endAdjusted = end;\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n startAdjusted = startAdjusted.minus(globalOrigin);\n endAdjusted = endAdjusted.minus(globalOrigin);\n }\n\n {\n const formattedStartX = IModelApp.quantityFormatter.formatQuantity(startAdjusted.x, coordFormatterSpec);\n const formattedStartY = IModelApp.quantityFormatter.formatQuantity(startAdjusted.y, coordFormatterSpec);\n const formattedStartZ = IModelApp.quantityFormatter.formatQuantity(startAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"StartCoord\") + formattedStartX}, ${formattedStartY}`;\n if (is3d)\n toolTipHtml += `, ${formattedStartZ}`;\n toolTipHtml += \"<br>\";\n }\n const formattedEndX = IModelApp.quantityFormatter.formatQuantity(endAdjusted.x, coordFormatterSpec);\n const formattedEndY = IModelApp.quantityFormatter.formatQuantity(endAdjusted.y, coordFormatterSpec);\n const formattedEndZ = IModelApp.quantityFormatter.formatQuantity(endAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"EndCoord\") + formattedEndX}, ${formattedEndY}`;\n if (is3d)\n toolTipHtml += `, ${formattedEndZ}`;\n toolTipHtml += \"<br>\";\n }\n\n if (undefined !== delta) {\n const formattedDeltaX = IModelApp.quantityFormatter.formatQuantity(Math.abs(delta.x), distanceFormatterSpec);\n const formattedDeltaY = IModelApp.quantityFormatter.formatQuantity(Math.abs(delta.y), distanceFormatterSpec);\n const formattedDeltaZ = IModelApp.quantityFormatter.formatQuantity(Math.abs(delta.z), distanceFormatterSpec);\n toolTipHtml += `${translateBold(\"Delta\") + formattedDeltaX}, ${formattedDeltaY}`;\n if (is3d)\n toolTipHtml += `, ${formattedDeltaZ}`;\n toolTipHtml += \"<br>\";\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n /** @internal */\n protected async updateSelectedMarkerToolTip(seg: any, ev: BeButtonEvent, reopenToolTip: boolean): Promise<void> {\n seg.marker.title = await this.getMarkerToolTip(seg.distance, seg.slope, seg.adjustedStart, seg.adjustedEnd, seg.marker.isSelected ? seg.adjustedDelta : undefined);\n if (!reopenToolTip || undefined === ev.viewport || !IModelApp.notifications.isToolTipOpen)\n return;\n IModelApp.notifications.clearToolTip();\n ev.viewport.openToolTip(seg.marker.title, ev.viewPoint);\n }\n\n /** @internal */\n protected async acceptNewSegments(): Promise<void> {\n if (this._locationData.length > 1) {\n for (let i = 0; i <= this._locationData.length - 2; i++) {\n const adjustedStart = this._locationData[i].adjustedPoint;\n const adjustedEnd = this._locationData[i + 1].adjustedPoint;\n const distance = adjustedStart.distance(adjustedEnd);\n const xyDist = adjustedStart.distanceXY(adjustedEnd);\n const zDist = adjustedEnd.z - adjustedStart.z;\n const slope = (0.0 === xyDist ? Math.PI : Math.atan(zDist / xyDist));\n const adjustedDelta = Vector3d.createStartEnd(adjustedStart, adjustedEnd);\n const refAxes = this._locationData[i].refAxes;\n refAxes.multiplyTransposeVectorInPlace(adjustedDelta);\n const start = this._locationData[i].point;\n const end = this._locationData[i + 1].point;\n const delta = Vector3d.createStartEnd(start, end);\n refAxes.multiplyTransposeVectorInPlace(delta);\n\n const toolTip = await this.getMarkerToolTip(distance, slope, adjustedStart, adjustedEnd);\n const marker = new MeasureMarker((this._acceptedSegments.length + 1).toString(), toolTip, start.interpolate(0.5, end), Point2d.create(25, 25));\n\n const segMarkerButtonFunc = (ev: BeButtonEvent) => {\n if (ev.isDown)\n return true;\n\n let selectedMarker: MeasureMarker | undefined;\n let pickedMarker: MeasureMarker | undefined;\n for (const seg of this._acceptedSegments) {\n if (!seg.marker.pick(ev.viewPoint))\n continue;\n selectedMarker = (seg.marker.isSelected ? undefined : seg.marker);\n pickedMarker = seg.marker;\n break;\n }\n\n for (const seg of this._acceptedSegments) {\n const wasSelected = seg.marker.isSelected;\n seg.marker.isSelected = (seg.marker === selectedMarker);\n if (wasSelected !== seg.marker.isSelected)\n this.updateSelectedMarkerToolTip(seg, ev, (seg.marker === pickedMarker)); // eslint-disable-line @typescript-eslint/no-floating-promises\n }\n\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return true;\n };\n\n marker.onMouseButton = segMarkerButtonFunc;\n this._acceptedSegments.push({ distance, slope, start, end, delta, adjustedStart, adjustedEnd, adjustedDelta, refAxes, marker });\n }\n }\n this._locationData.length = 0;\n await this.updateTotals();\n }\n\n /** @internal */\n protected getReferenceAxes(vp?: Viewport): Matrix3d {\n const refAxes = Matrix3d.createIdentity();\n if (undefined !== vp && vp.isContextRotationRequired)\n vp.getAuxCoordRotation(refAxes);\n return refAxes;\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n const point = ev.point.clone();\n const adjustedPoint = adjustPoint(ev, this._acceptedSegments, this._locationData);\n const refAxes = this.getReferenceAxes(ev.viewport);\n const zDir = refAxes.columnZ();\n const normal = refAxes.columnZ();\n const tangent = refAxes.columnX();\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\n\n // Report xyz delta relative to world up. The surface normal and edge tangent help determine the rotation about z...\n if (undefined !== snap) {\n if (undefined !== snap.primitive) {\n const locDetail = snap.primitive.closestPoint(point, false);\n const snapPlane = Plane3dByOriginAndUnitNormal.create(point, undefined !== snap.normal ? snap.normal : normal);\n if (undefined !== locDetail && (HitGeomType.Segment === snap.geomType || (snapPlane && snap.primitive.isInPlane(snapPlane)))) {\n const locRay = snap.primitive.fractionToPointAndUnitTangent(locDetail.fraction);\n tangent.setFrom(locRay.direction);\n if (undefined !== snap.normal)\n normal.setFrom(snap.normal);\n }\n } else if (undefined !== snap.normal) {\n normal.setFrom(snap.normal);\n }\n }\n\n if (!normal.isParallelTo(zDir, true)) {\n const yDir = zDir.unitCrossProduct(normal);\n if (undefined !== yDir) {\n yDir.unitCrossProduct(zDir, normal);\n Matrix3d.createColumnsInAxisOrder(AxisOrder.ZXY, normal, yDir, zDir, refAxes);\n }\n } else if (!tangent.isParallelTo(zDir, true)) {\n const yDir = zDir.unitCrossProduct(tangent);\n if (undefined !== yDir) {\n yDir.unitCrossProduct(zDir, tangent);\n Matrix3d.createColumnsInAxisOrder(AxisOrder.XYZ, tangent, yDir, zDir, refAxes);\n }\n }\n\n this._locationData.push({ point, adjustedPoint, refAxes });\n\n if (this._locationData.length > 1 && !ev.isControlKey)\n await this.acceptNewSegments();\n this.setupAndPromptForNextAction();\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n if (0 === this._locationData.length) {\n await this.onReinitialize();\n return EventHandled.No;\n }\n await this.acceptNewSegments();\n this.setupAndPromptForNextAction();\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._locationData.length && 0 === this._acceptedSegments.length)\n return false;\n\n if (0 !== this._locationData.length) {\n this._locationData.pop();\n } else if (0 !== this._acceptedSegments.length) {\n this._acceptedSegments.pop();\n }\n\n if (0 === this._locationData.length && 0 === this._acceptedSegments.length) {\n await this.onReinitialize();\n } else {\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n }\n return true;\n }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureDistanceTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report spatial coordinate at a point as well as cartographic location for geolocated models using current quantity formatters.\n * @public\n */\nexport class MeasureLocationTool extends PrimitiveTool {\n public static override toolId = \"Measure.Location\";\n public static override iconSpec = \"icon-measure-location\";\n /** @internal */\n protected readonly _acceptedLocations: MeasureMarker[] = [];\n /** @internal */\n protected allowView(vp: Viewport) { return vp.view.isSpatialView() || vp.view.isDrawingView(); }\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(\"Measure.Location.Prompts.EnterPoint\"));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 !== this._acceptedLocations.length) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Mouse));\n }\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n this.showPrompt();\n }\n\n protected async getMarkerToolTip(point: Point3d): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n\n let toolTipHtml = \"\";\n const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH_COORDINATE\", \"Units.M\");\n if (undefined !== coordFormatterSpec) {\n let pointAdjusted = point;\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n pointAdjusted = pointAdjusted.minus(globalOrigin);\n }\n const formattedPointX = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.x, coordFormatterSpec);\n const formattedPointY = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.y, coordFormatterSpec);\n const formattedPointZ = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"Coordinate\") + formattedPointX}, ${formattedPointY}`;\n if (is3d)\n toolTipHtml += `, ${formattedPointZ}`;\n\n toolTipHtml += \"<br>\";\n }\n\n if (isSpatial) {\n const latLongFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.ANGLE\", \"Units.RAD\");\n if (undefined !== latLongFormatterSpec && undefined !== coordFormatterSpec) {\n try {\n const cartographic = await this.iModel.spatialToCartographic(point);\n const formattedLat = IModelApp.quantityFormatter.formatQuantity(Math.abs(cartographic.latitude), latLongFormatterSpec);\n const formattedLong = IModelApp.quantityFormatter.formatQuantity(Math.abs(cartographic.longitude), latLongFormatterSpec);\n const formattedHeight = IModelApp.quantityFormatter.formatQuantity(cartographic.height, coordFormatterSpec);\n const latDir = CoreTools.translate(cartographic.latitude < 0 ? \"Measure.Labels.S\" : \"Measure.Labels.N\");\n const longDir = CoreTools.translate(cartographic.longitude < 0 ? \"Measure.Labels.W\" : \"Measure.Labels.E\");\n toolTipHtml += `${translateBold(\"LatLong\") + formattedLat + latDir}, ${formattedLong}${longDir}<br>`;\n toolTipHtml += `${translateBold(\"Altitude\") + formattedHeight}<br>`;\n } catch { }\n }\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void {\n if (!this.isCompatibleViewport(context.viewport, false))\n return;\n\n this._acceptedLocations.forEach((marker) => marker.addDecoration(context));\n }\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void { this.decorate(context); }\n\n protected reportMeasurements(): void {\n if (0 === this._acceptedLocations.length)\n return;\n const briefMsg = this._acceptedLocations[this._acceptedLocations.length - 1].title;\n if (undefined === briefMsg)\n return;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n const point = ev.point.clone();\n const adjustedPoint = adjustPoint(ev);\n const toolTip = await this.getMarkerToolTip(adjustedPoint);\n const marker = new MeasureMarker((this._acceptedLocations.length + 1).toString(), toolTip, point, Point2d.create(25, 25));\n\n this._acceptedLocations.push(marker);\n this.reportMeasurements();\n this.setupAndPromptForNextAction();\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n await this.onReinitialize();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._acceptedLocations.length)\n return false;\n\n this._acceptedLocations.pop();\n if (0 === this._acceptedLocations.length) {\n await this.onReinitialize();\n } else {\n this.reportMeasurements();\n this.setupAndPromptForNextAction();\n }\n return true;\n }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureLocationTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report area defined by points using current quantity formatter for area.\n * @public\n */\nexport class MeasureAreaByPointsTool extends PrimitiveTool {\n public static override toolId = \"Measure.AreaByPoints\";\n public static override iconSpec = \"icon-measure-2d\";\n /** @internal */\n private _orientationValue: DialogItemValue = { value: ContextRotationId.Top };\n /** @internal */\n protected readonly _points: Point3d[] = [];\n /** @internal */\n protected _matrix?: Matrix3d;\n /** @internal */\n protected _isComplete = false;\n /** @internal */\n protected _area = 0.0;\n /** @internal */\n protected _perimeter = 0.0;\n /** @internal */\n protected _centroid = Point3d.createZero();\n /** @internal */\n protected _marker?: MeasureLabel;\n /** @internal */\n protected _acceptedMeasurement?: MeasureMarker;\n /** @internal */\n protected _lastMotionPt?: Point3d;\n\n /** @internal */\n public get orientation(): ContextRotationId { return this._orientationValue.value as ContextRotationId; }\n public set orientation(option: ContextRotationId) { this._orientationValue.value = option; }\n\n /** @internal */\n protected static _orientationName = \"enumAsOrientation\";\n /** @internal */\n protected static enumAsOrientationMessage(str: string) { return CoreTools.translate(`Settings.Orientation.${str}`); }\n /** @internal */\n protected static _getEnumAsOrientationDescription = (): PropertyDescription => {\n return {\n name: MeasureAreaByPointsTool._orientationName,\n displayLabel: CoreTools.translate(\"Settings.Orientation.Label\"),\n typename: \"enum\",\n enum: {\n choices: [\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Top\"), value: ContextRotationId.Top },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Front\"), value: ContextRotationId.Front },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Left\"), value: ContextRotationId.Left },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Bottom\"), value: ContextRotationId.Bottom },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Back\"), value: ContextRotationId.Back },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Right\"), value: ContextRotationId.Right },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"View\"), value: ContextRotationId.View },\n { label: MeasureAreaByPointsTool.enumAsOrientationMessage(\"Face\"), value: ContextRotationId.Face },\n ],\n },\n };\n };\n\n /** @internal */\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\n const initialValue = IModelApp.toolAdmin.toolSettingsState.getInitialToolSettingValue(this.toolId, MeasureAreaByPointsTool._orientationName);\n initialValue && (this._orientationValue = initialValue);\n const toolSettings = new Array<DialogItem>();\n toolSettings.push({ value: this._orientationValue, property: MeasureAreaByPointsTool._getEnumAsOrientationDescription(), editorPosition: { rowPriority: 0, columnIndex: 2 } });\n return toolSettings;\n }\n\n /** @internal */\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\n if (updatedValue.propertyName === MeasureAreaByPointsTool._orientationName) {\n this._orientationValue = updatedValue.value;\n if (!this._orientationValue)\n return false;\n IModelApp.toolAdmin.toolSettingsState.saveToolSettingProperty(this.toolId, { propertyName: MeasureAreaByPointsTool._orientationName, value: this._orientationValue });\n await this.onReinitialize();\n return true;\n }\n return false;\n }\n\n /** @internal */\n protected allowView(vp: Viewport) { return vp.view.isSpatialView() || vp.view.isDrawingView(); }\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n let mainMsg = \"Measure.AreaByPoints.Prompts.\";\n switch (this._points.length) {\n case 0:\n mainMsg += \"FirstPoint\";\n break;\n case 1:\n mainMsg += \"SecondPoint\";\n break;\n case 2:\n mainMsg += \"ThirdPoint\";\n break;\n default:\n mainMsg += this._isComplete ? \"FirstPoint\" : \"NextPoint\";\n break;\n }\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(mainMsg));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n const acceptMsg = CoreTools.translate(this._isComplete ? \"ElementSet.Inputs.Restart\" : \"ElementSet.Inputs.AcceptPoint\");\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\n\n const resetMsg = CoreTools.translate(\"ElementSet.Inputs.Restart\");\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, resetMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, resetMsg, false, ToolAssistanceInputMethod.Mouse));\n\n if (this._points.length > 1)\n mouseInstructions.push(ToolAssistance.createModifierKeyInstruction(ToolAssistance.ctrlKey, ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AdditionalPoint\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 !== this._points.length)\n mouseInstructions.push(ToolAssistance.createKeyboardInstruction(ToolAssistance.createKeyboardInfo([ToolAssistance.ctrlKey, \"Z\"]), CoreTools.translate(\"ElementSet.Inputs.UndoLastPoint\"), false, ToolAssistanceInputMethod.Mouse));\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n this.showPrompt();\n\n if (this._isComplete) {\n AccuDrawHintBuilder.deactivate();\n return;\n }\n\n if (0 === this._points.length)\n return;\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this._points[this._points.length - 1]);\n if (this._matrix) {\n if (1 === this._points.length) {\n hints.setMatrix(this._matrix);\n hints.setModeRectangular();\n } else if (this._points.length > 1 && !(this._points[this._points.length - 1].isAlmostEqual(this._points[this._points.length - 2]))) {\n const xVec = Vector3d.createStartEnd(this._points[this._points.length - 2], this._points[this._points.length - 1]);\n const zVec = this._matrix.getColumn(2);\n const matrix = Matrix3d.createRigidFromColumns(xVec, zVec, AxisOrder.XZY);\n if (undefined !== matrix)\n hints.setMatrix(matrix); // Rotate AccuDraw x axis to last segment preserving current up vector...\n }\n }\n hints.setLockZ = true;\n hints.sendHints();\n }\n\n /** @internal */\n protected getShapePoints(cursorPt: Point3d): Point3d[] {\n const points: Point3d[] = [];\n if (undefined === this.targetView || this._points.length < 1)\n return points;\n for (const pt of this._points)\n points.push(pt.clone());\n\n if (this._isComplete || !this._matrix)\n return points;\n\n const normal = this._matrix.getColumn(2);\n let currentPt = AccuDrawHintBuilder.projectPointToPlaneInView(cursorPt, points[0], normal, this.targetView, true);\n if (undefined === currentPt)\n currentPt = cursorPt.clone();\n if (2 === points.length && 0 === (IModelApp.toolAdmin.currentInputState.qualifiers & BeModifierKeys.Control)) {\n const xDir = Vector3d.createStartEnd(points[0], points[1]);\n const xLen = xDir.magnitude();\n xDir.normalizeInPlace();\n const yDir = xDir.crossProduct(normal);\n yDir.normalizeInPlace();\n const cornerPt = AccuDrawHintBuilder.projectPointToLineInView(currentPt, points[1], yDir, this.targetView, true);\n if (undefined !== cornerPt) {\n points.push(cornerPt);\n cornerPt.plusScaled(xDir, -xLen, currentPt);\n }\n }\n points.push(currentPt);\n\n if (points.length > 2)\n points.push(points[0].clone());\n\n return points;\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void {\n if (context.viewport !== this.targetView)\n return;\n\n if (undefined === this._lastMotionPt)\n return;\n const points = this.getShapePoints(this._lastMotionPt);\n if (points.length < 2)\n return;\n\n const builderAccVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\n const builderAccHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\n const colorAccVis = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\n const colorAccHid = colorAccVis.withAlpha(100);\n const fillAccVis = context.viewport.hilite.color.withAlpha(50);\n\n builderAccVis.setSymbology(colorAccVis, fillAccVis, 3);\n builderAccHid.setSymbology(colorAccHid, fillAccVis, 1, LinePixels.Code2);\n\n if (points.length > 2)\n builderAccHid.addShape(points);\n\n builderAccVis.addLineString(points);\n builderAccHid.addLineString(points);\n\n context.addDecorationFromBuilder(builderAccVis);\n context.addDecorationFromBuilder(builderAccHid);\n\n if (undefined !== this._acceptedMeasurement)\n this._acceptedMeasurement.addDecoration(context);\n if (undefined !== this._marker)\n this._marker.addDecoration(context);\n }\n\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void {\n if (this._isComplete)\n this.decorate(context);\n }\n\n /** @internal */\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (this._points.length > 0 && undefined !== ev.viewport && !this._isComplete) {\n if (undefined !== this._lastMotionPt)\n this._lastMotionPt.setFrom(ev.point);\n else\n this._lastMotionPt = ev.point.clone();\n ev.viewport.invalidateDecorations();\n }\n }\n\n protected async getMarkerToolTip(): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n let toolTipHtml = \"\";\n\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.AREA\", \"Units.SQ_M\");\n if (undefined !== areaFormatterSpec) {\n const formattedArea = IModelApp.quantityFormatter.formatQuantity(this._area, areaFormatterSpec);\n toolTipHtml += `${translateBold(\"Area\") + formattedArea}<br>`;\n }\n const perimeterFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH\", \"Units.M\");\n if (undefined !== perimeterFormatterSpec) {\n const formattedPerimeter = IModelApp.quantityFormatter.formatQuantity(this._perimeter, perimeterFormatterSpec);\n toolTipHtml += `${translateBold(\"Perimeter\") + formattedPerimeter}<br>`;\n }\n const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH_COORDINATE\", \"Units.M\");\n if (undefined !== coordFormatterSpec) {\n let pointAdjusted = this._centroid.clone();\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n pointAdjusted = pointAdjusted.minus(globalOrigin);\n }\n const formattedPointX = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.x, coordFormatterSpec);\n const formattedPointY = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.y, coordFormatterSpec);\n const formattedPointZ = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"Centroid\") + formattedPointX}, ${formattedPointY}`;\n if (is3d)\n toolTipHtml += `, ${formattedPointZ}`;\n\n toolTipHtml += \"<br>\";\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n protected reportMeasurements(): void {\n if (undefined === this._marker)\n return;\n const briefMsg = `${CoreTools.translate(\"Measure.Labels.Area\")}: ${this._marker.label}`;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n protected async updateTotals(): Promise<void> {\n if (this._points.length < 3)\n return;\n\n const result = PolygonOps.centroidAreaNormal(this._points);\n if (undefined === result)\n return;\n\n this._area = result.a ? result.a : 0.0;\n this._centroid.setFrom(result.origin);\n this._perimeter = 0.0;\n for (let i = 1; i < this._points.length; i++)\n this._perimeter += (this._points[i - 1].distance(this._points[i]));\n\n const toolTip = await this.getMarkerToolTip();\n this._acceptedMeasurement = new MeasureMarker(\"1\", toolTip, this._centroid, Point2d.create(25, 25));\n this._marker = undefined;\n\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.AREA\", \"Units.SQ_M\");\n if (undefined === areaFormatterSpec)\n return;\n const formattedTotalArea = IModelApp.quantityFormatter.formatQuantity(this._area, areaFormatterSpec);\n this._marker = new MeasureLabel(this._centroid, formattedTotalArea);\n\n this.reportMeasurements();\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined === this.targetView)\n return EventHandled.No;\n\n if (this._isComplete)\n await this.onReinitialize();\n\n if (this._points.length > 1 && !ev.isControlKey) {\n const points = this.getShapePoints(ev.point);\n if (points.length < 3)\n return EventHandled.No;\n\n this._isComplete = true;\n this._points.length = 0;\n for (const pt of points)\n this._points.push(pt);\n\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n\n if (undefined === this._matrix && undefined === (this._matrix = AccuDrawHintBuilder.getContextRotation(this.orientation, this.targetView)))\n return EventHandled.No;\n\n const currPt = ev.point.clone();\n if (this._points.length > 0) {\n const vp = ev.viewport;\n const planePt = (vp ? AccuDrawHintBuilder.projectPointToPlaneInView(currPt, this._points[0], this._matrix.getColumn(2), vp, true) : undefined);\n if (undefined !== planePt)\n currPt.setFrom(planePt);\n }\n\n this._points.push(currPt);\n this.setupAndPromptForNextAction();\n\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n await this.onReinitialize();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onReinitialize(): Promise<void> {\n this._acceptedMeasurement = undefined;\n this._marker = undefined;\n this._isComplete = false;\n this._points.length = 0;\n this._matrix = undefined;\n AccuDrawHintBuilder.deactivate();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._points.length || this._isComplete)\n return false;\n\n this._points.pop();\n this.setupAndPromptForNextAction();\n return true;\n }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureAreaByPointsTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Base class for mass properties tools.\n * @public\n */\nexport abstract class MeasureElementTool extends PrimitiveTool {\n /** @internal */\n protected readonly _checkedIds = new Map<Id64String, MassPropertiesResponseProps>();\n /** @internal */\n protected readonly _acceptedIds: Id64Array = [];\n /** @internal */\n protected readonly _acceptedMeasurements: MeasureMarker[] = [];\n /** @internal */\n protected _totalValue: number = 0.0;\n /** @internal */\n protected _totalMarker?: MeasureLabel;\n /** @internal */\n protected _useSelection: boolean = false;\n\n protected abstract getOperation(): MassPropertiesOperation;\n\n /** @internal */\n protected allowView(vp: Viewport) {\n return (MassPropertiesOperation.AccumulateVolumes === this.getOperation() ? vp.view.isSpatialView() : (vp.view.isSpatialView() || vp.view.isDrawingView()));\n }\n\n /** @internal */\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n /** @internal */\n public override requireWriteableTarget(): boolean { return false; }\n /** @internal */\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n /** @internal */\n public override async onCleanup() {\n if (0 !== this._acceptedIds.length)\n this.iModel.hilited.remove({ elements: this._acceptedIds });\n }\n\n /** @internal */\n public override async onUnsuspend() { this.showPrompt(); }\n\n /** @internal */\n protected showPrompt(): void {\n const mainMsg = (this._useSelection ? (0 === this._acceptedMeasurements.length ? \"ElementSet.Prompts.ConfirmSelection\" : \"ElementSet.Prompts.InspectResult\") : \"ElementSet.Prompts.IdentifyElement\");\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, CoreTools.translate(mainMsg));\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (this._useSelection) {\n if (0 === this._acceptedMeasurements.length) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptSelection\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptSelection\"), false, ToolAssistanceInputMethod.Mouse));\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.RejectSelection\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.RejectSelection\"), false, ToolAssistanceInputMethod.Mouse));\n } else {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Exit\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Exit\"), false, ToolAssistanceInputMethod.Mouse));\n }\n } else {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, CoreTools.translate(\"ElementSet.Inputs.AcceptElement\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, CoreTools.translate(\"ElementSet.Inputs.AcceptElement\"), false, ToolAssistanceInputMethod.Mouse));\n if (0 !== this._acceptedMeasurements.length) {\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, CoreTools.translate(\"ElementSet.Inputs.Restart\"), false, ToolAssistanceInputMethod.Mouse));\n }\n }\n\n const sections: ToolAssistanceSection[] = [];\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n /** @internal */\n protected setupAndPromptForNextAction(): void {\n this._useSelection = (undefined !== this.targetView && this.targetView.iModel.selectionSet.isActive);\n if (!this._useSelection)\n this.initLocateElements();\n this.showPrompt();\n }\n\n /** @internal */\n public override decorate(context: DecorateContext): void {\n if (!this.isCompatibleViewport(context.viewport, false))\n return;\n\n this._acceptedMeasurements.forEach((marker) => marker.addDecoration(context));\n if (undefined !== this._totalMarker)\n this._totalMarker.addDecoration(context);\n }\n\n /** @internal */\n public override decorateSuspended(context: DecorateContext): void { this.decorate(context); }\n\n protected reportMeasurements(): void {\n if (undefined === this._totalMarker)\n return;\n let label = \"Measure.Labels.\";\n switch (this.getOperation()) {\n case MassPropertiesOperation.AccumulateLengths:\n label += \"Length\";\n break;\n case MassPropertiesOperation.AccumulateAreas:\n label += \"Area\";\n break;\n case MassPropertiesOperation.AccumulateVolumes:\n label += \"Volume\";\n break;\n default:\n return;\n }\n const briefMsg = `${CoreTools.translate(label)}: ${this._totalMarker.label}`;\n const msgDetail = new NotifyMessageDetails(OutputMessagePriority.Info, briefMsg, undefined, OutputMessageType.Sticky);\n IModelApp.notifications.outputMessage(msgDetail);\n }\n\n protected async getMarkerToolTip(responseProps: MassPropertiesResponseProps): Promise<HTMLElement> {\n const is3d = (undefined === this.targetView || this.targetView.view.is3d());\n const isSpatial = (undefined !== this.targetView && this.targetView.view.isSpatialView());\n const toolTip = document.createElement(\"div\");\n let toolTipHtml = \"\";\n\n switch (this.getOperation()) {\n case MassPropertiesOperation.AccumulateLengths: {\n const distanceFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH\", \"Units.M\");\n if (undefined !== distanceFormatterSpec) {\n const formattedLength = IModelApp.quantityFormatter.formatQuantity(responseProps.length ? responseProps.length : 0, distanceFormatterSpec);\n toolTipHtml += `${translateBold(\"Length\") + formattedLength}<br>`;\n }\n break;\n }\n case MassPropertiesOperation.AccumulateAreas: {\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.AREA\", \"Units.SQ_M\");\n if (undefined !== areaFormatterSpec) {\n const formattedArea = IModelApp.quantityFormatter.formatQuantity(responseProps.area ? responseProps.area : 0, areaFormatterSpec);\n toolTipHtml += `${translateBold(\"Area\") + formattedArea}<br>`;\n }\n if (responseProps.perimeter) {\n const perimeterFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH\", \"Units.M\");\n if (undefined !== perimeterFormatterSpec) {\n const formattedPerimeter = IModelApp.quantityFormatter.formatQuantity(responseProps.perimeter, perimeterFormatterSpec);\n toolTipHtml += `${translateBold(\"Perimeter\") + formattedPerimeter}<br>`;\n }\n }\n break;\n }\n case MassPropertiesOperation.AccumulateVolumes: {\n const volumeFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.VOLUME\", \"Units.CUB_M\");\n if (undefined !== volumeFormatterSpec) {\n const formattedVolume = IModelApp.quantityFormatter.formatQuantity(responseProps.volume ? responseProps.volume : 0, volumeFormatterSpec);\n toolTipHtml += `${translateBold(\"Volume\") + formattedVolume}<br>`;\n }\n if (responseProps.area) {\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.AREA\", \"Units.SQ_M\");\n if (undefined !== areaFormatterSpec) {\n const formattedArea = IModelApp.quantityFormatter.formatQuantity(responseProps.area, areaFormatterSpec);\n toolTipHtml += `${translateBold(\"Area\") + formattedArea}<br>`;\n }\n }\n break;\n }\n }\n\n if (responseProps.centroid) {\n const coordFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH\", \"Units.M\");\n if (undefined !== coordFormatterSpec) {\n let pointAdjusted = Point3d.fromJSON(responseProps.centroid);\n if (isSpatial) {\n const globalOrigin = this.iModel.globalOrigin;\n pointAdjusted = pointAdjusted.minus(globalOrigin);\n }\n const formattedPointX = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.x, coordFormatterSpec);\n const formattedPointY = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.y, coordFormatterSpec);\n const formattedPointZ = IModelApp.quantityFormatter.formatQuantity(pointAdjusted.z, coordFormatterSpec);\n toolTipHtml += `${translateBold(\"Centroid\") + formattedPointX}, ${formattedPointY}`;\n if (is3d)\n toolTipHtml += `, ${formattedPointZ}`;\n toolTipHtml += \"<br>\";\n }\n }\n\n toolTip.innerHTML = toolTipHtml;\n return toolTip;\n }\n\n private getResultValue(operation: MassPropertiesOperation, result: MassPropertiesResponseProps): number {\n switch (operation) {\n case MassPropertiesOperation.AccumulateLengths:\n return (result.length ? result.length : 0.0);\n case MassPropertiesOperation.AccumulateAreas:\n return (result.area ? result.area : 0.0);\n case MassPropertiesOperation.AccumulateVolumes:\n return (result.volume ? result.volume : 0.0);\n }\n }\n\n protected async updateTotals(selectionSetResult?: MassPropertiesResponseProps): Promise<void> {\n this._totalValue = 0.0;\n this._totalMarker = undefined;\n\n let labelPt;\n const operation = this.getOperation();\n if (undefined !== selectionSetResult) {\n labelPt = Point3d.fromJSON(selectionSetResult.centroid);\n this._totalValue += this.getResultValue(operation, selectionSetResult);\n } else if (0 !== this._acceptedIds.length) {\n for (const id of this._acceptedIds) {\n const result = this._checkedIds.get(id);\n if (undefined === result)\n continue;\n labelPt = Point3d.fromJSON(result.centroid);\n this._totalValue += this.getResultValue(operation, result);\n }\n }\n if (0.0 === this._totalValue || undefined === labelPt)\n return;\n\n switch (operation) {\n case MassPropertiesOperation.AccumulateLengths:\n const distanceFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.LENGTH\", \"Units.M\");\n if (undefined === distanceFormatterSpec)\n return;\n const formattedTotalDistance = IModelApp.quantityFormatter.formatQuantity(this._totalValue, distanceFormatterSpec);\n this._totalMarker = new MeasureLabel(labelPt, formattedTotalDistance);\n break;\n case MassPropertiesOperation.AccumulateAreas:\n const areaFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.AREA\", \"Units.SQ_M\");\n if (undefined === areaFormatterSpec)\n return;\n const formattedTotalArea = IModelApp.quantityFormatter.formatQuantity(this._totalValue, areaFormatterSpec);\n this._totalMarker = new MeasureLabel(labelPt, formattedTotalArea);\n break;\n case MassPropertiesOperation.AccumulateVolumes:\n const volumeFormatterSpec = await getFormatterSpecByKoQAndPersistenceUnit(\"DefaultToolsUnits.VOLUME\", \"Units.CUB_M\");\n\n if (undefined === volumeFormatterSpec)\n return;\n const formattedTotalVolume = IModelApp.quantityFormatter.formatQuantity(this._totalValue, volumeFormatterSpec);\n this._totalMarker = new MeasureLabel(labelPt, formattedTotalVolume);\n break;\n }\n\n this.reportMeasurements();\n }\n\n /** @internal */\n public async doMeasureSelectedElements(viewport: Viewport): Promise<void> {\n const candidates: Id64Array = [];\n viewport.iModel.selectionSet.elements.forEach((val) => {\n if (!Id64.isInvalid(val) && !Id64.isTransient(val))\n candidates.push(val);\n });\n\n if (0 === candidates.length)\n return;\n\n const requestProps: MassPropertiesRequestProps = {\n operation: this.getOperation(),\n candidates,\n };\n const result = await this.iModel.getMassProperties(requestProps);\n if (BentleyStatus.SUCCESS !== result.status)\n return;\n\n const toolTip = await this.getMarkerToolTip(result);\n const point = Point3d.fromJSON(result.centroid);\n const marker = new MeasureMarker((this._acceptedMeasurements.length + 1).toString(), toolTip, point, Point2d.create(25, 25));\n\n this._acceptedMeasurements.push(marker);\n await this.updateTotals(result);\n this.setupAndPromptForNextAction();\n\n if (undefined !== viewport)\n viewport.invalidateDecorations();\n }\n\n /** @internal */\n public override async filterHit(hit: HitDetail, _out?: LocateResponse): Promise<LocateFilterStatus> {\n if (!hit.isElementHit)\n return LocateFilterStatus.Reject;\n\n let result = this._checkedIds.get(hit.sourceId);\n if (undefined === result) {\n const requestProps: MassPropertiesRequestProps = {\n operation: this.getOperation(),\n candidates: [hit.sourceId],\n };\n result = await this.iModel.getMassProperties(requestProps);\n this._checkedIds.set(hit.sourceId, result);\n }\n\n return (BentleyStatus.SUCCESS === result.status ? LocateFilterStatus.Accept : LocateFilterStatus.Reject);\n }\n\n /** @internal */\n public override async onReinitialize(): Promise<void> {\n if (this._useSelection)\n return this.exitTool();\n return this.onRestartTool();\n }\n\n /** @internal */\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n await this.onReinitialize();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (this._useSelection) {\n if (0 === this._acceptedMeasurements.length && undefined !== ev.viewport) {\n await this.doMeasureSelectedElements(ev.viewport);\n if (0 !== this._acceptedMeasurements.length)\n return EventHandled.Yes;\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, CoreTools.translate(\"ElementSet.Error.NotSupportedElmType\")));\n await this.onReinitialize();\n }\n return EventHandled.Yes;\n }\n\n const hit = await IModelApp.locateManager.doLocate(new LocateResponse(), true, ev.point, ev.viewport, ev.inputSource);\n if (undefined === hit || !hit.isElementHit)\n return EventHandled.No;\n\n const result = this._checkedIds.get(hit.sourceId);\n if (undefined === result)\n return EventHandled.No;\n if (-1 !== this._acceptedIds.indexOf(hit.sourceId))\n return EventHandled.Yes; // Already accepted, not rejected in filterHit to avoid showing \"not\" cursor...\n\n const toolTip = await this.getMarkerToolTip(result);\n const point = result.centroid ? Point3d.fromJSON(result.centroid) : ev.point.clone();\n const marker = new MeasureMarker((this._acceptedMeasurements.length + 1).toString(), toolTip, point, Point2d.create(25, 25));\n\n this._acceptedMeasurements.push(marker);\n this._acceptedIds.push(hit.sourceId);\n this.iModel.hilited.add({ elements: hit.sourceId });\n\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n\n if (undefined !== ev.viewport)\n ev.viewport.invalidateDecorations();\n return EventHandled.No;\n }\n\n /** @internal */\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this._acceptedMeasurements.length)\n return false;\n\n this._acceptedMeasurements.pop();\n if (0 === this._acceptedMeasurements.length) {\n await this.onReinitialize();\n } else {\n if (0 !== this._acceptedIds.length) {\n this.iModel.hilited.remove({ elements: this._acceptedIds[this._acceptedIds.length - 1] });\n this._acceptedIds.pop();\n }\n\n await this.updateTotals();\n this.setupAndPromptForNextAction();\n }\n return true;\n }\n}\n\n/** Report accumulated lengths of selected elements using the current quantity formatter for length.\n * @public\n */\nexport class MeasureLengthTool extends MeasureElementTool {\n public static override toolId = \"Measure.Length\";\n public static override iconSpec = \"icon-measure\";\n protected getOperation(): MassPropertiesOperation { return MassPropertiesOperation.AccumulateLengths; }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureLengthTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report accumulated areas of selected elements using the current quantity formatter for area.\n * @public\n */\nexport class MeasureAreaTool extends MeasureElementTool {\n public static override toolId = \"Measure.Area\";\n public static override iconSpec = \"icon-measure-area\";\n protected getOperation(): MassPropertiesOperation { return MassPropertiesOperation.AccumulateAreas; }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureAreaTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** Report accumulated volumes of selected elements using the current quantity formatter for volume.\n * @public\n */\nexport class MeasureVolumeTool extends MeasureElementTool {\n public static override toolId = \"Measure.Volume\";\n public static override iconSpec = \"icon-measure-3d\";\n protected getOperation(): MassPropertiesOperation { return MassPropertiesOperation.AccumulateVolumes; }\n\n /** @internal */\n public async onRestartTool(): Promise<void> {\n const tool = new MeasureVolumeTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n"]}