@itwin/editor-frontend 4.4.7 → 4.4.8

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 (33) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/lib/cjs/CreateElementTool.js.map +1 -1
  3. package/lib/cjs/DeleteElementsTool.js.map +1 -1
  4. package/lib/cjs/EditTool.js.map +1 -1
  5. package/lib/cjs/EditToolIpc.js.map +1 -1
  6. package/lib/cjs/ElementGeometryTool.js.map +1 -1
  7. package/lib/cjs/ModifyCurveTools.js.map +1 -1
  8. package/lib/cjs/ModifyElementTool.js.map +1 -1
  9. package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  10. package/lib/cjs/ProjectLocation/ProjectGeolocation.js.map +1 -1
  11. package/lib/cjs/SketchTools.js.map +1 -1
  12. package/lib/cjs/SolidModelingTools.js.map +1 -1
  13. package/lib/cjs/SolidPrimitiveTools.js.map +1 -1
  14. package/lib/cjs/TransformElementsTool.js.map +1 -1
  15. package/lib/cjs/UndoRedoTool.js.map +1 -1
  16. package/lib/cjs/editor-frontend.js.map +1 -1
  17. package/lib/esm/CreateElementTool.js.map +1 -1
  18. package/lib/esm/DeleteElementsTool.js.map +1 -1
  19. package/lib/esm/EditTool.js.map +1 -1
  20. package/lib/esm/EditToolIpc.js.map +1 -1
  21. package/lib/esm/ElementGeometryTool.js.map +1 -1
  22. package/lib/esm/ModifyCurveTools.js.map +1 -1
  23. package/lib/esm/ModifyElementTool.js.map +1 -1
  24. package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  25. package/lib/esm/ProjectLocation/ProjectGeolocation.js.map +1 -1
  26. package/lib/esm/SketchTools.js.map +1 -1
  27. package/lib/esm/SolidModelingTools.js.map +1 -1
  28. package/lib/esm/SolidPrimitiveTools.js.map +1 -1
  29. package/lib/esm/TransformElementsTool.js.map +1 -1
  30. package/lib/esm/UndoRedoTool.js.map +1 -1
  31. package/lib/esm/editor-frontend.js.map +1 -1
  32. package/lib/public/locales/en/Editor.json +490 -490
  33. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"SketchTools.js","sourceRoot":"","sources":["../../src/SketchTools.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport {\n DialogItem, DialogProperty, DialogPropertySyncItem, EnumerationChoice, PropertyDescriptionHelper, PropertyEditorParamTypes, RangeEditorParams,\n} from \"@itwin/appui-abstract\";\nimport { BentleyError, Id64String } from \"@itwin/core-bentley\";\nimport {\n Code, ColorDef, ElementGeometry, ElementGeometryBuilderParams, ElementGeometryInfo, FlatBufferGeometryStream, GeometricElementProps, GeometryParams,\n GeometryStreamProps, isPlacement3dProps, JsonGeometryStream, LinePixels, PlacementProps,\n} from \"@itwin/core-common\";\nimport {\n AccuDrawHintBuilder, AngleDescription, BeButton, BeButtonEvent, BeModifierKeys, CoreTools, DecorateContext, DynamicsContext, EventHandled,\n GraphicType, HitDetail, IModelApp, LengthDescription, NotifyMessageDetails, OutputMessagePriority, SnapDetail, TentativeOrAccuSnap, ToolAssistance,\n ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection,\n} from \"@itwin/core-frontend\";\nimport {\n Angle, AngleSweep, Arc3d, BSplineCurve3d, CurveCollection, CurveFactory, CurvePrimitive, FrameBuilder, Geometry, GeometryQuery, IModelJson,\n InterpolationCurve3d, InterpolationCurve3dOptions, InterpolationCurve3dProps, LineString3d, Loop, Matrix3d, Path, Plane3dByOriginAndUnitNormal,\n Point3d, PointString3d, Ray3d, RegionOps, Transform, Vector3d, YawPitchRollAngles,\n} from \"@itwin/core-geometry\";\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\nimport { CreateElementWithDynamicsTool } from \"./CreateElementTool\";\nimport { EditTools } from \"./EditTool\";\nimport { basicManipulationIpc } from \"./EditToolIpc\";\n\n/** @alpha Values for [[CreateOrContinueTool.createCurvePhase] to support join and closure. */\nexport enum CreateCurvePhase {\n /** Current tool phase changes CurvePrimitive startPoint.\n * ex. Arc defined by center, start would return this when accepted length is 1.\n */\n DefineStart,\n /** Current tool phase changes CurvePrimitive endPoint.\n * ex. Arc defined by start, end, mid would return this when accepted length is 1.\n */\n DefineEnd,\n /** Current tool phase does NOT change CurvePrimitive startPoint or endPoint.\n * ex. When defining arc mid point, or start and end tangents for a bcurve return this.\n */\n DefineOther,\n}\n\n/** @alpha Base class for creating open and closed paths. */\nexport abstract class CreateOrContinuePathTool extends CreateElementWithDynamicsTool {\n protected _createCurvePhase = CreateCurvePhase.DefineOther;\n protected readonly accepted: Point3d[] = [];\n protected current?: CurvePrimitive;\n protected continuationData?: { props: GeometricElementProps, path: Path, params: GeometryParams };\n protected isClosed = false;\n protected isConstruction = false; // Sub-classes can set in createNewCurvePrimitive to bypass creating element graphics...\n protected _snapGeomId?: Id64String;\n protected _startedCmd?: string;\n\n protected async startCommand(): Promise<string> {\n if (undefined !== this._startedCmd)\n return this._startedCmd;\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\n }\n\n protected get allowJoin(): boolean { return this.isControlDown; }\n protected get allowClosure(): boolean { return this.isControlDown; }\n protected get allowSimplify(): boolean { return true; }\n\n protected get wantSmartRotation(): boolean { return this.isContinueExistingPath || this.isControlDown; }\n protected get wantPickableDynamics(): boolean { return false; }\n protected get wantJoin(): boolean { return this.allowJoin; }\n protected get wantClosure(): boolean { return this.isContinueExistingPath && this.allowClosure; }\n protected get wantSimplify(): boolean { return this.allowSimplify; }\n\n protected get showCurveConstructions(): boolean { return false; }\n protected get showJoin(): boolean { return this.isContinueExistingPath && CreateCurvePhase.DefineStart === this.createCurvePhase; }\n protected get showClosure(): boolean { return this.isClosed && CreateCurvePhase.DefineEnd === this.createCurvePhase; }\n protected get createCurvePhase(): CreateCurvePhase { return this._createCurvePhase; }\n\n /** Sub-classes should override unless they don't support join or closure. */\n protected updateCurvePhase(): void { }\n\n /** Implemented by sub-classes to create the new curve or construction curve for placement dynamics.\n * @param ev The current button event from a click or motion event.\n * @param isDynamics true when called for dynamics and the point from ev should be included in the result curve.\n * @internal\n */\n protected abstract createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined;\n\n protected getCurrentRotation(ev: BeButtonEvent): Matrix3d {\n const matrix = (undefined !== ev.viewport ? AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true) : undefined);\n return (undefined !== matrix ? matrix : Matrix3d.createIdentity());\n }\n\n protected getUpVector(ev: BeButtonEvent): Vector3d {\n return this.getCurrentRotation(ev).getColumn(2);\n }\n\n protected async updateCurveAndContinuationData(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\n this.isConstruction = false;\n this.current = this.createNewCurvePrimitive(ev, isDynamics);\n if (CreateCurvePhase.DefineStart === this.createCurvePhase)\n await this.isValidForJoin(); // Updates this.continuationData...\n else if (CreateCurvePhase.DefineEnd === this.createCurvePhase)\n await this.isValidForClosure(); // Updates this.isClosed...\n }\n\n protected override async updateElementData(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\n if (!isDynamics)\n this.accepted.push(ev.point.clone());\n\n await this.updateCurveAndContinuationData(ev, isDynamics);\n\n if (!isDynamics)\n this.updateCurvePhase();\n }\n\n protected override async updateDynamicData(ev: BeButtonEvent): Promise<boolean> {\n // Need to update continuation data for first data point before dynamics has started...\n await this.updateCurveAndContinuationData(ev, true);\n\n // Don't need to create graphic if dynamics aren't yet active or showing construction geometry...\n return (IModelApp.viewManager.inDynamicsMode && !this.isConstruction);\n }\n\n protected get isContinueExistingPath(): boolean { return undefined !== this.continuationData; }\n\n protected async isValidForContinue(snap: SnapDetail): Promise<{ props: GeometricElementProps, path: Path, params: GeometryParams } | undefined> {\n if (!snap.isElementHit)\n return;\n\n const snapCurve = snap.getCurvePrimitive();\n if (undefined === snapCurve)\n return;\n\n const curveS = snapCurve.startPoint();\n const curveE = snapCurve.endPoint();\n\n if (curveS.isAlmostEqual(curveE))\n return; // Reject snap to single physically closed curve primitive...\n\n const snapPt = snap.adjustedPoint;\n if (!(snapPt.isAlmostEqual(curveS) || snapPt.isAlmostEqual(curveE)))\n return; // No point to further checks if snap wasn't to endpoint of curve primitive...\n\n try {\n this._startedCmd = await this.startCommand();\n const info = await basicManipulationIpc.requestElementGeometry(snap.sourceId, { maxDisplayable: 1, geometry: { curves: true, surfaces: false, solids: false } });\n if (undefined === info)\n return;\n\n const data = CreateOrContinuePathTool.isSingleOpenPath(info);\n if (undefined === data)\n return;\n\n const props = await this.iModel.elements.loadProps(snap.sourceId) as GeometricElementProps;\n if (undefined === props)\n return;\n\n return { props, path: data.path, params: data.params };\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n return;\n }\n }\n\n protected async isValidForJoin(): Promise<boolean> {\n this.continuationData = undefined;\n\n if (!this.wantJoin)\n return false;\n\n if (undefined === this.current)\n return false;\n\n const snap = TentativeOrAccuSnap.getCurrentSnap();\n if (undefined === snap)\n return false;\n\n const data = await this.isValidForContinue(snap);\n if (undefined === data)\n return false;\n\n if (!CreateOrContinuePathTool.isPathEndPoint(this.current, data.path))\n return false;\n\n this.continuationData = data;\n return true;\n }\n\n protected async isValidForClosure(): Promise<boolean> {\n this.isClosed = false;\n\n if (!this.wantClosure)\n return false;\n\n if (undefined === this.current)\n return false;\n\n return (this.isClosed = CreateOrContinuePathTool.isPathClosurePoint(this.current, this.continuationData?.path));\n }\n\n public static isSingleOpenPath(info: ElementGeometryInfo): { path: Path, params: GeometryParams } | undefined {\n const it = new ElementGeometry.Iterator(info);\n it.requestWorldCoordinates();\n\n for (const entry of it) {\n const geom = entry.toGeometryQuery();\n if (undefined === geom)\n return;\n\n if (\"curvePrimitive\" === geom.geometryCategory) {\n const curve = geom as CurvePrimitive;\n\n const curveS = curve.startPoint();\n const curveE = curve.endPoint();\n\n if (curveS.isAlmostEqual(curveE))\n return; // Reject zero length lines, physically closed arcs, linestrings, etc...\n\n return { path: Path.create(curve), params: entry.geomParams };\n } else if (\"curveCollection\" === geom.geometryCategory) {\n const curves = geom as CurveCollection;\n if (!curves.isOpenPath)\n return;\n\n const path = curves as Path;\n const curveS = path.children[0].startPoint();\n const curveE = path.children[path.children.length - 1].endPoint();\n\n if (curveS.isAlmostEqual(curveE))\n return; // Reject physically closed path...\n\n return { path, params: entry.geomParams };\n }\n\n break;\n }\n\n return;\n }\n\n public static isPathEndPoint(curve: CurvePrimitive, path: Path): boolean {\n const curveS = curve.startPoint();\n const pathS = path.children[0].startPoint();\n const pathE = path.children[path.children.length - 1].endPoint();\n\n if (!(curveS.isAlmostEqual(pathS) || curveS.isAlmostEqual(pathE)))\n return false;\n\n return true;\n }\n\n public static isPathClosurePoint(curve: CurvePrimitive, path?: Path): boolean {\n const length = curve.quickLength();\n if (length < Geometry.smallMetricDistance)\n return false;\n\n const curveS = curve.startPoint();\n const curveE = curve.endPoint();\n\n if (undefined === path) {\n if (!curveS.isAlmostEqual(curveE))\n return false;\n\n const curveLocalToWorld = FrameBuilder.createRightHandedFrame(undefined, curve);\n if (undefined === curveLocalToWorld)\n return false;\n\n // Don't create a Loop unless new CurvePrimitive is planar...\n const curvePlane = Plane3dByOriginAndUnitNormal.create(curveLocalToWorld.getOrigin(), curveLocalToWorld.matrix.getColumn(2));\n return (undefined !== curvePlane && curve.isInPlane(curvePlane));\n }\n\n const pathS = path.children[0].startPoint();\n const pathE = path.children[path.children.length - 1].endPoint();\n\n if (!(curveS.isAlmostEqual(pathS) && curveE.isAlmostEqual(pathE) || curveS.isAlmostEqual(pathE) && curveE.isAlmostEqual(pathS)))\n return false;\n\n const pathLocalToWorld = FrameBuilder.createRightHandedFrame(undefined, [curve, path]);\n if (undefined === pathLocalToWorld)\n return false;\n\n // Don't create a Loop unless new CurvePrimitive + existing Path is planar...\n const pathPlane = Plane3dByOriginAndUnitNormal.create(pathLocalToWorld.getOrigin(), pathLocalToWorld.matrix.getColumn(2));\n if (undefined === pathPlane)\n return false;\n\n if (!curve.isInPlane(pathPlane))\n return false;\n\n for (const child of path.children) {\n if (!child.isInPlane(pathPlane))\n return false;\n }\n\n return true;\n }\n\n protected addConstructionGraphics(curve: CurvePrimitive, showCurve: boolean, context: DynamicsContext): void {\n if (!showCurve) {\n switch (curve.curvePrimitiveType) {\n case \"arc\":\n case \"bsplineCurve\":\n case \"interpolationCurve\":\n break;\n default:\n return;\n }\n }\n\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 1, LinePixels.Code2);\n\n if (showCurve)\n builder.addPath(Path.create(curve));\n\n switch (curve.curvePrimitiveType) {\n case \"arc\": {\n const arc = curve as Arc3d;\n const start = arc.startPoint();\n const end = arc.endPoint();\n\n builder.addLineString([arc.center, start]);\n if (!start.isAlmostEqual(end))\n builder.addLineString([arc.center, end]);\n\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 5);\n builder.addPointString([arc.center]);\n break;\n }\n\n case \"bsplineCurve\": {\n const bcurve = curve as BSplineCurve3d;\n const poles: Point3d[] = [];\n\n for (let iPole = 0; iPole < bcurve.numPoles; ++iPole) {\n const polePt = bcurve.getPolePoint3d(iPole);\n if (undefined !== polePt)\n poles.push(polePt);\n }\n\n builder.addLineString(poles);\n\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 5);\n builder.addPointString(poles);\n break;\n }\n\n case \"interpolationCurve\": {\n const fitCurve = curve as InterpolationCurve3d;\n\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 5);\n builder.addPointString(fitCurve.options.fitPoints); // deep copy shoulnd't be necessary...\n break;\n }\n\n default:\n break;\n }\n\n context.addGraphic(builder.finish());\n }\n\n protected showConstructionGraphics(_ev: BeButtonEvent, context: DynamicsContext): boolean {\n if (undefined === this.current)\n return false;\n\n if (!this.isConstruction) {\n if (this.showCurveConstructions)\n this.addConstructionGraphics(this.current, false, context);\n return false;\n }\n\n this.addConstructionGraphics(this.current, true, context);\n return true;\n }\n\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\n if (this.showConstructionGraphics(ev, context))\n return; // Don't display element graphics...\n\n super.onDynamicFrame(ev, context);\n }\n\n protected showJoinIndicator(context: DecorateContext, pt: Point3d): void {\n const lengthX = Math.floor(context.viewport.pixelsFromInches(0.08)) + 0.5;\n const lengthY = Math.floor(lengthX * 0.6) + 0.5;\n const offsetX = lengthX * 3;\n const offsetY = lengthY * 3;\n const position = context.viewport.worldToView(pt);\n\n position.x = Math.floor(position.x - offsetX) + 0.5;\n position.y = Math.floor(position.y + offsetY) + 0.5;\n\n const drawDecoration = (ctx: CanvasRenderingContext2D) => {\n ctx.beginPath();\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\n ctx.lineWidth = 3;\n ctx.lineCap = \"round\";\n ctx.moveTo(-lengthX, lengthY);\n ctx.lineTo(0, lengthY);\n ctx.lineTo(0, -lengthY);\n ctx.lineTo(lengthX, -lengthY);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.strokeStyle = \"rgba(255,255,255,.8)\";\n ctx.lineWidth = 1;\n ctx.moveTo(-lengthX, lengthY);\n ctx.lineTo(0, lengthY);\n ctx.lineTo(0, -lengthY);\n ctx.lineTo(lengthX, -lengthY);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\n ctx.fillStyle = \"rgba(0,255,255,.8)\";\n ctx.arc(0, -lengthY, 2.5, 0, 2 * Math.PI);\n ctx.fill();\n ctx.stroke();\n };\n context.addCanvasDecoration({ position, drawDecoration }, true);\n }\n\n protected showClosureIndicator(context: DecorateContext, pt: Point3d): void {\n const radius = Math.floor(context.viewport.pixelsFromInches(0.06)) + 0.5;\n const offset = radius * 2.5;\n const position = context.viewport.worldToView(pt);\n\n position.x = Math.floor(position.x - offset) + 0.5;\n position.y = Math.floor(position.y + offset) + 0.5;\n\n const drawDecoration = (ctx: CanvasRenderingContext2D) => {\n ctx.beginPath();\n ctx.strokeStyle = \"rgba(255,255,255,.8)\";\n ctx.lineWidth = 1;\n ctx.fillStyle = \"rgba(0,0,255,.2)\";\n ctx.arc(0, 0, radius, 0, 2 * Math.PI);\n ctx.fill();\n ctx.stroke();\n\n ctx.beginPath();\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\n ctx.arc(0, 0, radius + 1, 0, 2 * Math.PI);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\n ctx.fillStyle = \"rgba(0,255,255,.8)\";\n ctx.arc(-radius, 0, 2.5, 0, 2 * Math.PI);\n ctx.fill();\n ctx.stroke();\n };\n context.addCanvasDecoration({ position, drawDecoration }, true);\n }\n\n public override testDecorationHit(id: Id64String): boolean {\n return id === this._snapGeomId;\n }\n\n public override async getToolTip(hit: HitDetail): Promise<HTMLElement | string> {\n if (this.testDecorationHit(hit.sourceId))\n return this.description;\n return super.getToolTip(hit);\n }\n\n protected getSnapGeometry(): GeometryQuery | undefined {\n if (this.accepted.length < 2)\n return;\n\n // Treat accepted points as linear segments by default...\n return LineString3d.create(this.accepted);\n }\n\n public override getDecorationGeometry(_hit: HitDetail): GeometryStreamProps | undefined {\n const geomQuery = this.getSnapGeometry();\n if (undefined === geomQuery)\n return;\n\n const geomJson = IModelJson.Writer.toIModelJson(geomQuery);\n return geomJson ? [geomJson] : undefined;\n }\n\n protected addPickableGraphics(context: DecorateContext): void {\n const geomQuery = this.getSnapGeometry();\n if (undefined === geomQuery)\n return;\n\n if (undefined === this._snapGeomId)\n this._snapGeomId = this.iModel.transientIds.getNext();\n\n const builder = context.createGraphic({ type: GraphicType.WorldDecoration, pickable: { id: this._snapGeomId, locateOnly: true } });\n builder.setSymbology(ColorDef.white, ColorDef.white, 1);\n\n switch (geomQuery.geometryCategory) {\n case \"pointCollection\": {\n const pointString = geomQuery as PointString3d;\n builder.addPointString(pointString.points);\n break;\n }\n\n case \"curvePrimitive\": {\n const curvePrimitive = geomQuery as CurvePrimitive;\n switch (curvePrimitive.curvePrimitiveType) {\n case \"lineString\": {\n const lineString = geomQuery as LineString3d;\n builder.addLineString(lineString.points);\n break;\n }\n\n default:\n return; // Don't need to support other types of CurvePrimitive currently...\n }\n break;\n }\n\n default:\n return; // Don't need to support other types of GeometryQuery currently...\n }\n\n context.addDecorationFromBuilder(builder);\n }\n\n public override decorate(context: DecorateContext): void {\n if (this.wantPickableDynamics)\n this.addPickableGraphics(context);\n\n if (undefined === this.current)\n return;\n\n if (this.showJoin)\n this.showJoinIndicator(context, this.current.startPoint());\n else if (this.showClosure)\n this.showClosureIndicator(context, this.current.endPoint());\n }\n\n public override async onModifierKeyTransition(_wentDown: boolean, modifier: BeModifierKeys, _event: KeyboardEvent): Promise<EventHandled> {\n if (BeModifierKeys.Control !== modifier)\n return EventHandled.No;\n\n // Update display for join/closure change w/o waiting for a motion event...\n return EventHandled.Yes;\n }\n\n protected getPlacementProps(): PlacementProps | undefined {\n if (undefined !== this.continuationData)\n return this.continuationData.props.placement;\n\n if (undefined === this.current)\n return;\n\n const vp = this.targetView;\n if (undefined === vp)\n return;\n\n const matrix = AccuDrawHintBuilder.getCurrentRotation(vp, true, true);\n const localToWorld = FrameBuilder.createRightHandedFrame(matrix?.getColumn(2), this.current);\n if (undefined === localToWorld)\n return;\n\n const origin = localToWorld.getOrigin();\n const angles = new YawPitchRollAngles();\n\n YawPitchRollAngles.createFromMatrix3d(localToWorld.matrix, angles);\n\n if (vp.view.is3d())\n return { origin, angles };\n\n return { origin, angle: angles.yaw };\n }\n\n protected createNewPath(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\n if (undefined === this.current)\n return;\n\n const builder = new ElementGeometry.Builder();\n builder.setLocalToWorldFromPlacement(placement);\n\n const geometry = (this.isClosed ? Loop.create(this.current) : this.current);\n if (!builder.appendGeometryQuery(geometry))\n return;\n\n return { format: \"flatbuffer\", data: builder.entries };\n }\n\n protected continueExistingPath(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\n if (undefined === this.current || undefined === this.continuationData)\n return;\n\n const length = this.current.quickLength();\n if (length < Geometry.smallMetricDistance)\n return;\n\n const curveS = this.current.startPoint();\n const pathS = this.continuationData.path.children[0].startPoint();\n const pathE = this.continuationData.path.children[this.continuationData.path.children.length - 1].endPoint();\n\n const append = pathE.isAlmostEqual(curveS);\n if (!append && !pathS.isAlmostEqual(curveS))\n return;\n\n const continuePath = this.continuationData.path.clone() as Path;\n if (undefined === continuePath)\n return;\n\n const current = this.current.clone();\n if (undefined === current)\n return;\n\n if (append) {\n continuePath.tryAddChild(current);\n } else {\n current.reverseInPlace();\n continuePath.children.splice(0, 0, current);\n }\n\n const geometry = (this.isClosed ? Loop.create(...continuePath.children) : continuePath);\n if (this.wantSimplify)\n RegionOps.consolidateAdjacentPrimitives(geometry);\n\n const builder = new ElementGeometry.Builder();\n builder.setLocalToWorldFromPlacement(placement);\n builder.appendGeometryParamsChange(this.continuationData.params);\n\n if (!builder.appendGeometryQuery(geometry))\n return;\n\n return { format: \"flatbuffer\", data: builder.entries };\n }\n\n protected getGeometryProps(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\n if (this.isContinueExistingPath)\n return this.continueExistingPath(placement);\n\n return this.createNewPath(placement);\n }\n\n protected getElementProps(placement: PlacementProps): GeometricElementProps | undefined {\n if (undefined !== this.continuationData)\n return this.continuationData.props;\n\n const model = this.targetModelId;\n const category = this.targetCategory;\n\n if (isPlacement3dProps(placement))\n return { classFullName: \"Generic:PhysicalObject\", model, category, code: Code.createEmpty(), placement };\n\n return { classFullName: \"BisCore:DrawingGraphic\", model, category, code: Code.createEmpty(), placement };\n }\n\n protected override async doCreateElement(props: GeometricElementProps, data?: ElementGeometryBuilderParams): Promise<void> {\n try {\n this._startedCmd = await this.startCommand();\n if (undefined === props.id)\n await basicManipulationIpc.insertGeometricElement(props, data);\n else\n await basicManipulationIpc.updateGeometricElement(props, data);\n await this.saveChanges();\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n }\n }\n\n protected override setupAccuDraw(): void {\n const nPts = this.accepted.length;\n if (0 === nPts)\n return;\n\n const hints = new AccuDrawHintBuilder();\n\n if (this.wantSmartRotation)\n hints.enableSmartRotation = true;\n\n // Rotate AccuDraw to last segment...\n if (nPts > 1 && !this.accepted[nPts - 1].isAlmostEqual(this.accepted[nPts - 2]))\n hints.setXAxis(Vector3d.createStartEnd(this.accepted[nPts - 2], this.accepted[nPts - 1]));\n\n hints.setOrigin(this.accepted[nPts - 1]);\n hints.sendHints();\n }\n\n public override async onUndoPreviousStep(): Promise<boolean> {\n if (0 === this.accepted.length)\n return false;\n\n this.accepted.pop();\n if (0 === this.accepted.length) {\n await this.onReinitialize();\n } else {\n this.updateCurvePhase();\n this.setupAndPromptForNextAction();\n }\n\n return true;\n }\n\n public override async onPostInstall() {\n await super.onPostInstall();\n this.updateCurvePhase();\n }\n}\n\n/** @alpha Creates a line string or shape. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\nexport class CreateLineStringTool extends CreateOrContinuePathTool {\n public static override toolId = \"CreateLineString\";\n public static override iconSpec = \"icon-snaps\"; // Need better icon...\n\n protected override get wantPickableDynamics(): boolean { return true; } // Allow snapping to accepted segments...\n\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\n const nPts = this.accepted.length;\n const mainMsg = CoreTools.translate(0 === nPts ? \"ElementSet.Prompts.StartPoint\" : (1 === nPts ? \"ElementSet.Prompts.EndPoint\" : \"ElementSet.Inputs.AdditionalPoint\"));\n const leftMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\n const rightMsg = CoreTools.translate(nPts > 1 ? \"ElementSet.Inputs.Complete\" : \"ElementSet.Inputs.Cancel\");\n\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, leftMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, leftMsg, false, ToolAssistanceInputMethod.Mouse));\n\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rightMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rightMsg, 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 mainInstruction = ToolAssistance.createInstruction(this.iconSpec, mainMsg);\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n protected override get wantClosure(): boolean {\n // A linestring can support physical closure when creating a new path...\n return this.allowClosure;\n }\n\n protected override updateCurvePhase(): void {\n // The first point changes startPoint and last point changes endPoint.\n this._createCurvePhase = (0 === this.accepted.length ? CreateCurvePhase.DefineStart : CreateCurvePhase.DefineEnd);\n }\n\n protected override isComplete(ev: BeButtonEvent): boolean {\n // Accept on reset with at least 2 points...\n if (BeButton.Reset === ev.button)\n return (this.accepted.length > 1);\n\n // Allow data to complete on physical closure (creates Loop)...\n return this.isClosed;\n }\n\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\n const numRequired = (isDynamics ? 1 : 2);\n if (this.accepted.length < numRequired) {\n this.isConstruction = true; // Create zero length line as construction geometry to support join...\n const pt = (0 !== this.accepted.length ? this.accepted[0] : ev.point);\n return LineString3d.create([pt, pt]);\n }\n\n const pts = (isDynamics ? [...this.accepted, ev.point] : this.accepted);\n return LineString3d.create(pts);\n }\n\n protected override async cancelPoint(ev: BeButtonEvent): Promise<boolean> {\n // NOTE: Starting another tool will not create element...require reset or closure...\n if (this.isComplete(ev)) {\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\n await this.updateCurveAndContinuationData(ev, false);\n await this.createElement();\n }\n return true;\n }\n\n public async onRestartTool() {\n const tool = new CreateLineStringTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** @alpha */\nexport enum ArcMethod {\n CenterStart = 0,\n StartCenter = 1,\n StartMidEnd = 2,\n StartEndMid = 3,\n}\n\n/** @alpha Creates an arc. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\nexport class CreateArcTool extends CreateOrContinuePathTool {\n public static override toolId = \"CreateArc\";\n public static override iconSpec = \"icon-three-points-circular-arc\";\n\n public static override get minArgs() { return 0; }\n public static override get maxArgs() { return 3; } // method, radius, sweep - zero value unlocks associated \"use\" toggle...\n\n protected override get showCurveConstructions(): boolean { return true; } // Display lines from center to start/end...\n\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\n const nPts = this.accepted.length;\n\n switch (this.method) {\n case ArcMethod.CenterStart:\n mainInstrText = (0 === nPts ? EditTools.translate(\"CreateArc.Prompts.CenterPoint\") : (1 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : CoreTools.translate(\"ElementSet.Prompts.EndPoint\")));\n break;\n\n case ArcMethod.StartCenter:\n mainInstrText = (0 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : (1 === nPts ? EditTools.translate(\"CreateArc.Prompts.CenterPoint\") : CoreTools.translate(\"ElementSet.Prompts.EndPoint\")));\n break;\n\n case ArcMethod.StartMidEnd:\n mainInstrText = (0 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : (1 === nPts ? EditTools.translate(\"CreateArc.Prompts.MidPoint\") : CoreTools.translate(\"ElementSet.Prompts.EndPoint\")));\n break;\n\n case ArcMethod.StartEndMid:\n mainInstrText = (0 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : (1 === nPts ? CoreTools.translate(\"ElementSet.Prompts.EndPoint\") : EditTools.translate(\"CreateArc.Prompts.MidPoint\")));\n break;\n }\n\n super.provideToolAssistance(mainInstrText, additionalInstr);\n }\n\n protected override setupAccuDraw(): void {\n const nPts = this.accepted.length;\n if (0 === nPts)\n return;\n\n const hints = new AccuDrawHintBuilder();\n\n if (this.wantSmartRotation)\n hints.enableSmartRotation = true;\n\n switch (this.accepted.length) {\n case 1:\n hints.setOrigin(this.accepted[0]);\n\n if (ArcMethod.CenterStart !== this.method)\n break;\n\n hints.setOriginFixed = true;\n hints.setModePolar();\n break;\n\n case 2:\n switch (this.method) {\n case ArcMethod.CenterStart:\n if (!this.accepted[0].isAlmostEqual(this.accepted[1]))\n hints.setXAxis(Vector3d.createStartEnd(this.accepted[0], this.accepted[1])); // Rotate AccuDraw to major axis...\n break;\n\n case ArcMethod.StartCenter:\n let center = this.accepted[1];\n const start = this.accepted[0];\n const vector0 = center.unitVectorTo(start);\n\n if (undefined === vector0)\n break;\n\n if (this.useRadius)\n center = start.plusScaled(vector0, -this.radius);\n\n hints.setOrigin(center);\n hints.setOriginFixed = true;\n hints.setModePolar();\n hints.setXAxis(vector0);\n break;\n\n default:\n hints.setOrigin(this.accepted[1]);\n break;\n }\n break;\n }\n\n hints.sendHints();\n }\n\n private static methodMessage(str: string) { return EditTools.translate(`CreateArc.Method.${str}`); }\n private static getMethodChoices = (): EnumerationChoice[] => {\n return [\n { label: CreateArcTool.methodMessage(\"CenterStart\"), value: ArcMethod.CenterStart },\n { label: CreateArcTool.methodMessage(\"StartCenter\"), value: ArcMethod.StartCenter },\n { label: CreateArcTool.methodMessage(\"StartMidEnd\"), value: ArcMethod.StartMidEnd },\n { label: CreateArcTool.methodMessage(\"StartEndMid\"), value: ArcMethod.StartEndMid },\n ];\n };\n\n private _methodProperty: DialogProperty<number> | undefined;\n public get methodProperty() {\n if (!this._methodProperty)\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\n \"arcMethod\", EditTools.translate(\"CreateArc.Label.Method\"), CreateArcTool.getMethodChoices()), ArcMethod.StartCenter as number);\n return this._methodProperty;\n }\n\n public get method(): ArcMethod { return this.methodProperty.value as ArcMethod; }\n public set method(method: ArcMethod) { this.methodProperty.value = method; }\n\n private _useRadiusProperty: DialogProperty<boolean> | undefined;\n public get useRadiusProperty() {\n if (!this._useRadiusProperty)\n this._useRadiusProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useArcRadius\"), false);\n return this._useRadiusProperty;\n }\n\n public get useRadius(): boolean { return this.useRadiusProperty.value; }\n public set useRadius(value: boolean) { this.useRadiusProperty.value = value; }\n\n private _radiusProperty: DialogProperty<number> | undefined;\n public get radiusProperty() {\n if (!this._radiusProperty)\n this._radiusProperty = new DialogProperty<number>(new LengthDescription(\"arcRadius\", EditTools.translate(\"CreateArc.Label.Radius\")), 0.1, undefined, !this.useRadius);\n return this._radiusProperty;\n }\n\n public get radius(): number { return this.radiusProperty.value; }\n public set radius(value: number) { this.radiusProperty.value = value; }\n\n private _useSweepProperty: DialogProperty<boolean> | undefined;\n public get useSweepProperty() {\n if (!this._useSweepProperty)\n this._useSweepProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useArcSweep\"), false);\n return this._useSweepProperty;\n }\n\n public get useSweep(): boolean { return this.useSweepProperty.value; }\n public set useSweep(value: boolean) { this.useSweepProperty.value = value; }\n\n private _sweepProperty: DialogProperty<number> | undefined;\n public get sweepProperty() {\n if (!this._sweepProperty)\n this._sweepProperty = new DialogProperty<number>(new AngleDescription(\"arcSweep\", EditTools.translate(\"CreateArc.Label.Sweep\")), Math.PI / 2.0, undefined, !this.useSweep);\n return this._sweepProperty;\n }\n\n public get sweep(): number { return this.sweepProperty.value; }\n public set sweep(value: number) { this.sweepProperty.value = value; }\n\n protected override isComplete(_ev: BeButtonEvent): boolean {\n return (3 === this.accepted.length);\n }\n\n protected override updateCurvePhase(): void {\n switch (this.accepted.length) {\n case 0:\n this._createCurvePhase = ArcMethod.CenterStart === this.method ? CreateCurvePhase.DefineOther : CreateCurvePhase.DefineStart;\n break;\n case 1:\n if (ArcMethod.CenterStart === this.method)\n this._createCurvePhase = CreateCurvePhase.DefineStart;\n else if (ArcMethod.StartEndMid === this.method)\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\n else\n this._createCurvePhase = CreateCurvePhase.DefineOther;\n break;\n default:\n this._createCurvePhase = ArcMethod.StartEndMid === this.method ? CreateCurvePhase.DefineOther : CreateCurvePhase.DefineEnd;\n break;\n }\n }\n\n protected createConstructionCurve(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\n switch (this.accepted.length) {\n case 0: {\n if (ArcMethod.CenterStart === this.method)\n return undefined;\n\n return LineString3d.create([ev.point, ev.point]);\n }\n\n case 1: {\n const pt1 = this.accepted[0];\n const pt2 = (isDynamics ? ev.point : pt1);\n\n switch (this.method) {\n case ArcMethod.CenterStart:\n case ArcMethod.StartCenter: {\n if (pt1.isAlmostEqual(pt2))\n return (ArcMethod.StartCenter === this.method ? LineString3d.create([pt1, pt2]) : undefined);\n\n let center = (ArcMethod.CenterStart === this.method ? pt1 : pt2);\n const start = (ArcMethod.CenterStart === this.method ? pt2 : pt1);\n const normal = this.getUpVector(ev);\n const vector0 = Vector3d.createStartEnd(center, start);\n const vector90 = normal.crossProduct(vector0);\n const radius = (this.useRadius ? this.radius : vector0.magnitude());\n\n if (this.useRadius) {\n if (ArcMethod.StartCenter === this.method) {\n vector0.normalizeInPlace();\n center = start.plusScaled(vector0, -radius);\n }\n } else {\n this.radius = radius;\n this.syncToolSettingsRadiusAndSweep();\n }\n\n vector0.scaleToLength(radius, vector0);\n vector90.scaleToLength(radius, vector90);\n\n return Arc3d.create(center, vector0, vector90);\n }\n\n case ArcMethod.StartMidEnd:\n case ArcMethod.StartEndMid: {\n return LineString3d.create([pt1, pt2]);\n }\n\n default:\n return undefined;\n }\n }\n\n case 2: {\n switch (this.method) {\n case ArcMethod.CenterStart:\n return LineString3d.create([this.accepted[1], this.accepted[0]]);\n\n case ArcMethod.StartCenter:\n case ArcMethod.StartMidEnd:\n case ArcMethod.StartEndMid:\n return LineString3d.create([this.accepted[0], this.accepted[1]]);\n\n default:\n return undefined;\n }\n }\n\n default:\n return undefined;\n }\n }\n\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\n const numRequired = (isDynamics ? 2 : 3);\n if (this.accepted.length < numRequired) {\n this.isConstruction = true; // Create construction geometry to support join...\n return this.createConstructionCurve(ev, isDynamics);\n }\n\n const final = (isDynamics ? ev.point : this.accepted[2]);\n const start = (ArcMethod.CenterStart === this.method ? this.accepted[1] : this.accepted[0]);\n const end = (ArcMethod.StartEndMid === this.method ? this.accepted[1] : final);\n\n switch (this.method) {\n case ArcMethod.CenterStart:\n case ArcMethod.StartCenter:\n let center = (ArcMethod.CenterStart === this.method ? this.accepted[0] : this.accepted[1]);\n if (center.isAlmostEqual(start))\n return undefined; // Don't create 0 radius arc...\n\n const vector0 = Vector3d.createStartEnd(center, start);\n const vector90 = Vector3d.create();\n const radius = (this.useRadius ? this.radius : vector0.magnitude());\n const sweep = Angle.createRadians(this.useSweep ? this.sweep : Angle.pi2Radians);\n\n if (this.useRadius) {\n if (ArcMethod.StartCenter === this.method) {\n vector0.normalizeInPlace();\n center = start.plusScaled(vector0, -radius);\n }\n } else {\n this.radius = radius;\n }\n\n let defaultArc = (undefined !== this.current && \"arc\" === this.current.curvePrimitiveType ? this.current as Arc3d : undefined);\n if (undefined === defaultArc) {\n this.getUpVector(ev).crossProduct(vector0, vector90);\n vector0.scaleToLength(radius, vector0);\n vector90.scaleToLength(radius, vector90);\n\n // Create default arc that follows continuation path start/end tangent...\n if (undefined !== this.continuationData) {\n const pathS = this.continuationData.path.children[0].startPoint();\n\n if (start.isAlmostEqual(pathS)) {\n const tangentS = this.continuationData.path.children[0].fractionToPointAndUnitTangent(0.0);\n\n if (vector90.dotProduct(tangentS.direction) > 0.0)\n sweep.setRadians(-sweep.radians);\n } else {\n const tangentE = this.continuationData.path.children[this.continuationData.path.children.length - 1].fractionToPointAndUnitTangent(1.0);\n\n if (vector90.dotProduct(tangentE.direction) < 0.0)\n sweep.setRadians(-sweep.radians);\n }\n }\n\n defaultArc = Arc3d.create(center, vector0, vector90, AngleSweep.create(sweep));\n }\n\n // Don't have well defined minor axis, continue using previous or default arc...\n if (start.isAlmostEqual(end))\n return defaultArc;\n\n const prevSweep = Angle.createRadians(defaultArc.sweep.sweepRadians);\n Vector3d.createStartEnd(center, end, vector90);\n sweep.setFrom(vector0.planarAngleTo(vector90, defaultArc.perpendicularVector));\n\n defaultArc.perpendicularVector.crossProduct(vector0, vector90);\n vector0.scaleToLength(radius, vector0);\n vector90.scaleToLength(radius, vector90);\n\n if (Math.abs(sweep.radians) < Angle.createDegrees(30.0).radians && prevSweep.isFullCircle && ((sweep.radians < 0.0 && prevSweep.radians > 0.0) || (sweep.radians > 0.0 && prevSweep.radians < 0.0)))\n prevSweep.setRadians(-prevSweep.radians); // Reverse direction...\n\n if (sweep.isAlmostZero)\n sweep.setDegrees(prevSweep.radians < 0.0 ? -360.0 : 360.0); // Create full sweep...\n\n if (this.useSweep) {\n if ((sweep.radians < 0.0 && this.sweep > 0.0) || (sweep.radians > 0.0 && this.sweep < 0.0))\n sweep.setRadians(-this.sweep);\n else\n sweep.setRadians(this.sweep);\n } else {\n if (sweep.radians < 0.0 && prevSweep.radians > 0.0)\n sweep.setRadians(Angle.pi2Radians + sweep.radians);\n else if (sweep.radians > 0.0 && prevSweep.radians < 0.0)\n sweep.setRadians(-(Angle.pi2Radians - sweep.radians));\n\n this.sweep = sweep.radians;\n }\n\n if (!this.useRadius || !this.useSweep)\n this.syncToolSettingsRadiusAndSweep();\n\n return Arc3d.create(center, vector0, vector90, AngleSweep.create(sweep));\n\n case ArcMethod.StartMidEnd:\n case ArcMethod.StartEndMid:\n const mid = (ArcMethod.StartEndMid === this.method ? final : this.accepted[1]);\n return Arc3d.createCircularStartMiddleEnd(start, mid, end);\n }\n }\n\n private syncToolSettingsRadiusAndSweep(): void {\n switch (this.method) {\n case ArcMethod.CenterStart:\n case ArcMethod.StartCenter:\n if (this.useRadius && this.useSweep)\n return;\n break;\n\n default:\n return;\n }\n\n const syncData: DialogPropertySyncItem[] = [];\n\n if (!this.useRadius)\n syncData.push(this.radiusProperty.syncItem);\n\n if (!this.useSweep)\n syncData.push(this.sweepProperty.syncItem);\n\n if (0 !== syncData.length)\n this.syncToolSettingsProperties(syncData);\n }\n\n protected override getToolSettingPropertyLocked(property: DialogProperty<any>): DialogProperty<any> | undefined {\n if (property === this.useRadiusProperty)\n return this.radiusProperty;\n else if (property === this.useSweepProperty)\n return this.sweepProperty;\n return undefined;\n }\n\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\n if (!this.changeToolSettingPropertyValue(updatedValue))\n return false;\n\n if (this.methodProperty.name === updatedValue.propertyName)\n await this.onReinitialize();\n else if (updatedValue.propertyName === this.radiusProperty.name && ArcMethod.StartCenter === this.method && this.useRadius && 2 === this.accepted.length)\n await this.onUndoPreviousStep(); // If radius is changed when creating arc by start/center after center has been defined, back up a step to defined a new center point...\n\n return true;\n }\n\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\n const toolSettings = new Array<DialogItem>();\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 }));\n\n if (ArcMethod.CenterStart === this.method || ArcMethod.StartCenter === this.method) {\n // ensure controls are enabled/disabled base on current lock property state\n this.radiusProperty.isDisabled = !this.useRadius;\n this.sweepProperty.isDisabled = !this.useSweep;\n const useRadiusLock = this.useRadiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 });\n const useSweepLock = this.useSweepProperty.toDialogItem({ rowPriority: 3, columnIndex: 0 });\n toolSettings.push(this.radiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }, useRadiusLock));\n toolSettings.push(this.sweepProperty.toDialogItem({ rowPriority: 3, columnIndex: 1 }, useSweepLock));\n }\n return toolSettings;\n }\n\n public async onRestartTool(): Promise<void> {\n const tool = new CreateArcTool();\n if (!await tool.run())\n return this.exitTool();\n }\n\n public override async onInstall(): Promise<boolean> {\n if (!await super.onInstall())\n return false;\n\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\n this.initializeToolSettingPropertyValues([this.methodProperty, this.radiusProperty, this.useRadiusProperty, this.sweepProperty, this.useSweepProperty]);\n\n if (!this.radius)\n this.useRadius = false;\n\n if (!this.sweep)\n this.useSweep = false;\n\n return true;\n }\n\n /** The keyin takes the following arguments, all of which are optional:\n * - `method=0|1|2|3` How arc will be defined. 0 for center/start, 1 for start/center, 2 for start/mid/end, and 3 for start/end/mid.\n * - `radius=number` Arc radius for start/center or center/start, 0 to define by points.\n * - `sweep=number` Arc sweep angle in degrees for start/center or center/start, 0 to define by points.\n */\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\n let arcMethod;\n let arcRadius;\n let arcSweep;\n\n for (const arg of inputArgs) {\n const parts = arg.split(\"=\");\n if (2 !== parts.length)\n continue;\n\n if (parts[0].toLowerCase().startsWith(\"me\")) {\n const method = Number.parseInt(parts[1], 10);\n if (!Number.isNaN(method)) {\n switch (method) {\n case 0:\n arcMethod = ArcMethod.CenterStart;\n break;\n case 1:\n arcMethod = ArcMethod.StartCenter;\n break;\n case 2:\n arcMethod = ArcMethod.StartMidEnd;\n break;\n case 3:\n arcMethod = ArcMethod.StartEndMid;\n break;\n }\n }\n } else if (parts[0].toLowerCase().startsWith(\"ra\")) {\n const radius = Number.parseFloat(parts[1]);\n if (!Number.isNaN(radius)) {\n arcRadius = radius;\n }\n } else if (parts[0].toLowerCase().startsWith(\"sw\")) {\n const sweep = Number.parseFloat(parts[1]);\n if (!Number.isNaN(sweep)) {\n arcSweep = Angle.createDegrees(sweep).radians;\n }\n }\n }\n\n // Update current session values so keyin args are picked up for tool settings/restart...\n if (undefined !== arcMethod)\n this.saveToolSettingPropertyValue(this.methodProperty, { value: arcMethod });\n\n if (undefined !== arcRadius) {\n if (0.0 !== arcRadius)\n this.saveToolSettingPropertyValue(this.radiusProperty, { value: arcRadius });\n this.saveToolSettingPropertyValue(this.useRadiusProperty, { value: 0.0 !== arcRadius });\n }\n\n if (undefined !== arcSweep) {\n if (0.0 !== arcSweep)\n this.saveToolSettingPropertyValue(this.sweepProperty, { value: arcSweep });\n this.saveToolSettingPropertyValue(this.useSweepProperty, { value: 0.0 !== arcSweep });\n }\n\n return this.run();\n }\n}\n\n/** @alpha */\nexport enum CircleMethod {\n Center = 0,\n Edge = 1,\n}\n\n/** @alpha Creates a circle. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\nexport class CreateCircleTool extends CreateOrContinuePathTool {\n public static override toolId = \"CreateCircle\";\n public static override iconSpec = \"icon-circle\";\n\n public static override get minArgs() { return 0; }\n public static override get maxArgs() { return 2; } // method, radius - zero value unlocks associated \"use\" toggle...\n\n protected override get showCurveConstructions(): boolean { return !(CircleMethod.Center === this.method && this.useRadius); }\n\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\n const nPts = this.accepted.length;\n\n switch (this.method) {\n case CircleMethod.Center:\n mainInstrText = EditTools.translate(0 === nPts ? \"CreateCircle.Prompts.CenterPoint\" : \"CreateCircle.Prompts.EdgePoint\");\n break;\n\n case CircleMethod.Edge:\n mainInstrText = EditTools.translate(0 === nPts ? \"CreateCircle.Prompts.EdgePoint\" : \"CreateCircle.Prompts.CenterPoint\");\n break;\n }\n\n super.provideToolAssistance(mainInstrText, additionalInstr);\n }\n\n protected override setupAccuDraw(): void {\n const nPts = this.accepted.length;\n if (0 === nPts)\n return;\n\n const hints = new AccuDrawHintBuilder();\n\n if (this.wantSmartRotation)\n hints.enableSmartRotation = true;\n\n if (CircleMethod.Center === this.method && 1 === this.accepted.length) {\n hints.setOrigin(this.accepted[0]);\n hints.setOriginFixed = true;\n hints.setModePolar();\n }\n\n hints.sendHints();\n }\n\n private static methodMessage(str: string) { return EditTools.translate(`CreateCircle.Method.${str}`); }\n private static getMethodChoices = (): EnumerationChoice[] => {\n return [\n { label: CreateCircleTool.methodMessage(\"Center\"), value: CircleMethod.Center },\n { label: CreateCircleTool.methodMessage(\"Edge\"), value: CircleMethod.Edge },\n ];\n };\n\n private _methodProperty: DialogProperty<number> | undefined;\n public get methodProperty() {\n if (!this._methodProperty)\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\n \"circleMethod\", EditTools.translate(\"CreateCircle.Label.Method\"), CreateCircleTool.getMethodChoices()), CircleMethod.Center as number);\n return this._methodProperty;\n }\n\n public get method(): CircleMethod { return this.methodProperty.value as CircleMethod; }\n public set method(method: CircleMethod) { this.methodProperty.value = method; }\n\n private _useRadiusProperty: DialogProperty<boolean> | undefined;\n public get useRadiusProperty() {\n if (!this._useRadiusProperty)\n this._useRadiusProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useCircleRadius\"), false);\n return this._useRadiusProperty;\n }\n\n public get useRadius(): boolean { return this.useRadiusProperty.value; }\n public set useRadius(value: boolean) { this.useRadiusProperty.value = value; }\n\n private _radiusProperty: DialogProperty<number> | undefined;\n public get radiusProperty() {\n if (!this._radiusProperty)\n this._radiusProperty = new DialogProperty<number>(new LengthDescription(\"circleRadius\", EditTools.translate(\"CreateCircle.Label.Radius\")), 0.1, undefined, !this.useRadius);\n return this._radiusProperty;\n }\n\n public get radius(): number { return this.radiusProperty.value; }\n public set radius(value: number) { this.radiusProperty.value = value; }\n\n protected override isComplete(_ev: BeButtonEvent): boolean {\n if (CircleMethod.Center === this.method && this.useRadius)\n return (this.accepted.length >= 1); // Could be 2 if radius locked after 1st data point...\n return (2 === this.accepted.length);\n }\n\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\n this.isClosed = true; // Always closed...\n\n const numRequired = (isDynamics ? 1 : 2);\n if (this.accepted.length < numRequired) {\n if (CircleMethod.Center === this.method && this.useRadius)\n return Arc3d.createCenterNormalRadius(isDynamics ? ev.point : this.accepted[0], this.getUpVector(ev), this.radius);\n return undefined;\n }\n\n const pt1 = this.accepted[0];\n const pt2 = (isDynamics ? ev.point : this.accepted[1]);\n\n let center = (CircleMethod.Center === this.method ? pt1 : pt2);\n const edge = (CircleMethod.Center === this.method ? pt2 : pt1);\n\n const normal = this.getUpVector(ev);\n const vector0 = Vector3d.createStartEnd(center, edge);\n const vector90 = normal.crossProduct(vector0);\n const radius = (this.useRadius ? this.radius : vector0.magnitude());\n\n if (this.useRadius) {\n if (CircleMethod.Edge === this.method) {\n vector0.normalizeInPlace();\n center = edge.plusScaled(vector0, -radius);\n }\n } else {\n this.radius = radius;\n this.syncToolSettingPropertyValue(this.radiusProperty);\n }\n\n vector0.scaleToLength(radius, vector0);\n vector90.scaleToLength(radius, vector90);\n\n return Arc3d.create(center, vector0, vector90);\n }\n\n protected override async cancelPoint(_ev: BeButtonEvent): Promise<boolean> {\n if (CircleMethod.Center === this.method && this.useRadius) {\n // Exit instead of restarting to avoid having circle \"stuck\" on cursor...\n await this.exitTool();\n return false;\n }\n return true;\n }\n\n protected override getToolSettingPropertyLocked(property: DialogProperty<any>): DialogProperty<any> | undefined {\n return (property === this.useRadiusProperty ? this.radiusProperty : undefined);\n }\n\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\n if (!this.changeToolSettingPropertyValue(updatedValue))\n return false;\n\n if (this.methodProperty.name === updatedValue.propertyName)\n await this.onReinitialize();\n else if (updatedValue.propertyName === this.useRadiusProperty.name && CircleMethod.Center === this.method && this.useRadius && 0 === this.accepted.length)\n await this.onReinitialize();\n\n return true;\n }\n\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\n const toolSettings = new Array<DialogItem>();\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 }));\n\n // ensure controls are enabled/disabled base on current lock property state\n this.radiusProperty.isDisabled = !this.useRadius;\n const useRadiusLock = this.useRadiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 });\n toolSettings.push(this.radiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }, useRadiusLock));\n\n return toolSettings;\n }\n\n public async onRestartTool(): Promise<void> {\n const tool = new CreateCircleTool();\n if (!await tool.run())\n return this.exitTool();\n }\n\n public override async onReinitialize(): Promise<void> {\n if (CircleMethod.Center === this.method && this.useRadius) {\n // Don't install a new tool instance, we want to preserve current AccuDraw state...\n this.accepted.length = 0;\n this.setupAndPromptForNextAction();\n this.beginDynamics();\n return;\n }\n return super.onReinitialize();\n }\n\n public override async onPostInstall() {\n await super.onPostInstall();\n if (CircleMethod.Center === this.method && this.useRadius) {\n // Start dynamics before 1st data point when placing by center w/locked radius value.\n // Require the user to explicitly enable AccuDraw so that the compass location can be adjusted for changes\n // to locks or view ACS (as opposed to appearing at it's previous or default location).\n AccuDrawHintBuilder.deactivate();\n this.beginDynamics();\n }\n }\n\n public override async onInstall(): Promise<boolean> {\n if (!await super.onInstall())\n return false;\n\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\n this.initializeToolSettingPropertyValues([this.methodProperty, this.radiusProperty, this.useRadiusProperty]);\n\n if (!this.radius)\n this.useRadius = false;\n\n return true;\n }\n\n /** The keyin takes the following arguments, all of which are optional:\n * - `method=0|1` How circle will be defined. 0 for center, 1 for edge.\n * - `radius=number` Circle radius, 0 to define by points.\n */\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\n let circleMethod;\n let circleRadius;\n\n for (const arg of inputArgs) {\n const parts = arg.split(\"=\");\n if (2 !== parts.length)\n continue;\n\n if (parts[0].toLowerCase().startsWith(\"me\")) {\n const method = Number.parseInt(parts[1], 10);\n if (!Number.isNaN(method)) {\n switch (method) {\n case 0:\n circleMethod = CircleMethod.Center;\n break;\n case 1:\n circleMethod = CircleMethod.Edge;\n break;\n }\n }\n } else if (parts[0].toLowerCase().startsWith(\"ra\")) {\n const radius = Number.parseFloat(parts[1]);\n if (!Number.isNaN(radius)) {\n circleRadius = radius;\n }\n }\n }\n\n // Update current session values so keyin args are picked up for tool settings/restart...\n if (undefined !== circleMethod)\n this.saveToolSettingPropertyValue(this.methodProperty, { value: circleMethod });\n\n if (undefined !== circleRadius) {\n if (0.0 !== circleRadius)\n this.saveToolSettingPropertyValue(this.radiusProperty, { value: circleRadius });\n this.saveToolSettingPropertyValue(this.useRadiusProperty, { value: 0.0 !== circleRadius });\n }\n\n return this.run();\n }\n}\n\n/** @alpha Creates an ellipse. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\nexport class CreateEllipseTool extends CreateOrContinuePathTool {\n public static override toolId = \"CreateEllipse\";\n public static override iconSpec = \"icon-ellipse\";\n\n protected override isComplete(_ev: BeButtonEvent): boolean {\n return (3 === this.accepted.length);\n }\n\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\n const nPts = this.accepted.length;\n\n switch (nPts) {\n case 0:\n mainInstrText = EditTools.translate(\"CreateEllipse.Prompts.CenterPoint\");\n break;\n\n case 1:\n mainInstrText = EditTools.translate(\"CreateEllipse.Prompts.MajorAxis\");\n break;\n\n case 2:\n mainInstrText = EditTools.translate(\"CreateEllipse.Prompts.MinorAxis\");\n break;\n }\n\n super.provideToolAssistance(mainInstrText, additionalInstr);\n }\n\n protected override setupAccuDraw(): void {\n const nPts = this.accepted.length;\n if (0 === nPts)\n return;\n\n const hints = new AccuDrawHintBuilder();\n\n if (this.wantSmartRotation)\n hints.enableSmartRotation = true;\n\n switch (nPts) {\n case 1:\n hints.setOrigin(this.accepted[0]);\n hints.setOriginFixed = true;\n break;\n case 2:\n hints.setXAxis(Vector3d.createStartEnd(this.accepted[0], this.accepted[1]));\n hints.setLockX = true;\n break;\n }\n\n hints.sendHints();\n }\n\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\n const numRequired = (isDynamics ? 2 : 3);\n if (this.accepted.length < numRequired) {\n if (this.accepted.length < (numRequired - 1))\n return undefined;\n this.isConstruction = true; // Create construction geometry to show major axis...\n return LineString3d.create([this.accepted[0], (isDynamics ? ev.point : this.accepted[1])]);\n }\n\n this.isClosed = true; // Always closed...\n\n const center = this.accepted[0];\n const major = this.accepted[1];\n\n const normal = this.getUpVector(ev);\n const vector0 = Vector3d.createStartEnd(center, major);\n const vector90 = normal.crossProduct(vector0);\n\n const dir = Ray3d.create(center, vector90);\n const minor = dir.projectPointToRay(isDynamics ? ev.point : this.accepted[2]);\n\n vector90.scaleToLength(center.distance(minor), vector90);\n\n return Arc3d.create(center, vector0, vector90);\n }\n\n public async onRestartTool(): Promise<void> {\n const tool = new CreateEllipseTool();\n if (!await tool.run())\n return this.exitTool();\n }\n}\n\n/** @alpha Creates a rectangle by corner points. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\nexport class CreateRectangleTool extends CreateOrContinuePathTool {\n public static override toolId = \"CreateRectangle\";\n public static override iconSpec = \"icon-rectangle\";\n\n protected localToWorld = Transform.createIdentity();\n protected originLocal?: Point3d;\n protected cornerLocal?: Point3d;\n\n public static override get minArgs() { return 0; }\n public static override get maxArgs() { return 1; } // radius - zero value unlocks associated \"use\" toggle...\n\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\n mainInstrText = CoreTools.translate(0 === this.accepted.length ? \"ElementSet.Prompts.StartCorner\" : \"ElementSet.Prompts.OppositeCorner\");\n super.provideToolAssistance(mainInstrText, additionalInstr);\n }\n\n protected override setupAccuDraw(): void {\n const nPts = this.accepted.length;\n if (0 === nPts)\n return;\n\n const hints = new AccuDrawHintBuilder();\n\n if (this.wantSmartRotation)\n hints.enableSmartRotation = true;\n\n hints.setOrigin(this.accepted[0]);\n hints.sendHints();\n }\n\n private _useRadiusProperty: DialogProperty<boolean> | undefined;\n public get useRadiusProperty() {\n if (!this._useRadiusProperty)\n this._useRadiusProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useCornerRadius\"), false);\n return this._useRadiusProperty;\n }\n\n public get useRadius(): boolean { return this.useRadiusProperty.value; }\n public set useRadius(value: boolean) { this.useRadiusProperty.value = value; }\n\n private _radiusProperty: DialogProperty<number> | undefined;\n public get radiusProperty() {\n if (!this._radiusProperty)\n this._radiusProperty = new DialogProperty<number>(new LengthDescription(\"cornerRadius\", EditTools.translate(\"CreateRectangle.Label.CornerRadius\")), 0.1, undefined, !this.useRadius);\n return this._radiusProperty;\n }\n\n public get radius(): number { return this.radiusProperty.value; }\n public set radius(value: number) { this.radiusProperty.value = value; }\n\n protected override isComplete(_ev: BeButtonEvent): boolean {\n return (2 === this.accepted.length);\n }\n\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\n const numRequired = (isDynamics ? 1 : 2);\n if (this.accepted.length < numRequired)\n return undefined;\n\n const origin = this.accepted[0];\n const corner = (isDynamics ? ev.point : this.accepted[1]);\n const matrix = this.getCurrentRotation(ev);\n\n Transform.createOriginAndMatrix(Point3d.createZero(), matrix, this.localToWorld);\n\n this.originLocal = this.localToWorld.multiplyInversePoint3d(origin);\n this.cornerLocal = this.localToWorld.multiplyInversePoint3d(corner);\n\n if (undefined === this.originLocal || undefined === this.cornerLocal)\n return undefined;\n\n const shapePts: Point3d[] = [];\n\n shapePts[0] = Point3d.create(this.originLocal.x, this.originLocal.y, this.originLocal.z);\n shapePts[1] = Point3d.create(this.cornerLocal.x, this.originLocal.y, this.cornerLocal.z);\n shapePts[2] = Point3d.create(this.cornerLocal.x, this.cornerLocal.y, this.cornerLocal.z);\n shapePts[3] = Point3d.create(this.originLocal.x, this.cornerLocal.y, this.originLocal.z);\n shapePts[4] = shapePts[0].clone();\n\n this.localToWorld.multiplyPoint3dArrayInPlace(shapePts);\n this.isClosed = true; // Always closed...\n\n return LineString3d.create(shapePts);\n }\n\n protected override createNewPath(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\n if (!this.useRadius || 0.0 === this.radius || undefined === this.originLocal || undefined === this.cornerLocal)\n return super.createNewPath(placement);\n\n const builder = new ElementGeometry.Builder();\n builder.setLocalToWorldFromPlacement(placement);\n\n const loop = CurveFactory.createRectangleXY(this.originLocal.x, this.originLocal.y, this.cornerLocal.x, this.cornerLocal.y, this.originLocal.z, this.radius);\n loop.tryTransformInPlace(this.localToWorld);\n\n if (!builder.appendGeometryQuery(loop))\n return;\n\n return { format: \"flatbuffer\", data: builder.entries };\n }\n\n protected override getToolSettingPropertyLocked(property: DialogProperty<any>): DialogProperty<any> | undefined {\n return (property === this.useRadiusProperty ? this.radiusProperty : undefined);\n }\n\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\n return this.changeToolSettingPropertyValue(updatedValue);\n }\n\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\n const toolSettings = new Array<DialogItem>();\n\n // ensure controls are enabled/disabled base on current lock property state\n this.radiusProperty.isDisabled = !this.useRadius;\n const useRadiusLock = this.useRadiusProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 });\n toolSettings.push(this.radiusProperty.toDialogItem({ rowPriority: 1, columnIndex: 1 }, useRadiusLock));\n\n return toolSettings;\n }\n\n public async onRestartTool(): Promise<void> {\n const tool = new CreateRectangleTool();\n if (!await tool.run())\n return this.exitTool();\n }\n\n public override async onInstall(): Promise<boolean> {\n if (!await super.onInstall())\n return false;\n\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\n this.initializeToolSettingPropertyValues([this.radiusProperty, this.useRadiusProperty]);\n\n if (!this.radius)\n this.useRadius = false;\n\n return true;\n }\n\n /** The keyin takes the following arguments, all of which are optional:\n * - `radius=number` Corner radius, 0 for sharp corners.\n */\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\n let cornerRadius;\n\n for (const arg of inputArgs) {\n const parts = arg.split(\"=\");\n if (2 !== parts.length)\n continue;\n\n if (parts[0].toLowerCase().startsWith(\"ra\")) {\n const radius = Number.parseFloat(parts[1]);\n if (!Number.isNaN(radius)) {\n cornerRadius = radius;\n }\n }\n }\n\n // Update current session values so keyin args are picked up for tool settings/restart...\n if (undefined !== cornerRadius) {\n if (0.0 !== cornerRadius)\n this.saveToolSettingPropertyValue(this.radiusProperty, { value: cornerRadius });\n this.saveToolSettingPropertyValue(this.useRadiusProperty, { value: 0.0 !== cornerRadius });\n }\n\n return this.run();\n }\n}\n\n/** @alpha */\nexport enum BCurveMethod {\n ControlPoints = 0,\n ThroughPoints = 1,\n}\n\n/** @alpha Creates a bspline curve by poles or through points. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\nexport class CreateBCurveTool extends CreateOrContinuePathTool {\n public static override toolId = \"CreateBCurve\";\n public static override iconSpec = \"icon-snaps-nearest\"; // Need better icon...\n\n protected _isPhysicallyClosedOrComplete = false;\n protected _tangentPhase = CreateCurvePhase.DefineOther;\n\n public static override get minArgs() { return 0; }\n public static override get maxArgs() { return 3; } // method, order, tangents...\n\n protected override get wantPickableDynamics(): boolean { return true; } // Allow snapping to control polygon or through points...\n protected override get showCurveConstructions(): boolean { return true; } // Display control polygon or through points...\n\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\n const nPts = this.accepted.length;\n let mainMsg;\n\n if (CreateCurvePhase.DefineOther === this._tangentPhase)\n mainMsg = CoreTools.translate(0 === nPts ? \"ElementSet.Prompts.StartPoint\" : \"ElementSet.Inputs.AdditionalPoint\");\n else\n mainMsg = EditTools.translate(CreateCurvePhase.DefineStart === this._tangentPhase ? \"CreateBCurve.Prompts.StartTangent\" : \"CreateBCurve.Prompts.EndTangent\");\n\n const leftMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\n const rightMsg = CoreTools.translate(CreateCurvePhase.DefineOther === this._tangentPhase && nPts >= this.requiredPointCount ? \"ElementSet.Inputs.Complete\" : \"ElementSet.Inputs.Cancel\");\n\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n const touchInstructions: ToolAssistanceInstruction[] = [];\n\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, leftMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, leftMsg, false, ToolAssistanceInputMethod.Mouse));\n\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rightMsg, false, ToolAssistanceInputMethod.Touch));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rightMsg, 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 mainInstruction = ToolAssistance.createInstruction(this.iconSpec, mainMsg);\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n private static methodMessage(str: string) { return EditTools.translate(`CreateBCurve.Method.${str}`); }\n private static getMethodChoices = (): EnumerationChoice[] => {\n return [\n { label: CreateBCurveTool.methodMessage(\"ControlPoints\"), value: BCurveMethod.ControlPoints },\n { label: CreateBCurveTool.methodMessage(\"ThroughPoints\"), value: BCurveMethod.ThroughPoints },\n ];\n };\n\n private _methodProperty: DialogProperty<number> | undefined;\n public get methodProperty() {\n if (!this._methodProperty)\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\n \"bcurveMethod\", EditTools.translate(\"CreateBCurve.Label.Method\"), CreateBCurveTool.getMethodChoices()), BCurveMethod.ControlPoints as number);\n return this._methodProperty;\n }\n\n public get method(): BCurveMethod { return this.methodProperty.value as BCurveMethod; }\n public set method(method: BCurveMethod) { this.methodProperty.value = method; }\n\n private _orderProperty: DialogProperty<number> | undefined;\n public get orderProperty() {\n if (!this._orderProperty)\n this._orderProperty = new DialogProperty<number>(\n PropertyDescriptionHelper.buildNumberEditorDescription(\"bcurveOrder\", EditTools.translate(\"CreateBCurve.Label.Order\"),\n { type: PropertyEditorParamTypes.Range, minimum: this.minOrder, maximum: this.maxOrder } as RangeEditorParams), 3);\n return this._orderProperty;\n }\n\n public get order(): number { return this.orderProperty.value; }\n public set order(value: number) { this.orderProperty.value = value; }\n\n protected get minOrder(): number { return 2; }\n protected get maxOrder(): number { return 16; }\n\n private _tangentsProperty: DialogProperty<boolean> | undefined;\n public get tangentsProperty() {\n if (!this._tangentsProperty)\n this._tangentsProperty = new DialogProperty<boolean>(\n PropertyDescriptionHelper.buildToggleDescription(\"bcurveTangents\", EditTools.translate(\"CreateBCurve.Label.Tangents\")), false);\n return this._tangentsProperty;\n }\n\n public get tangents(): boolean { return this.tangentsProperty.value; }\n public set tangents(value: boolean) { this.tangentsProperty.value = value; }\n\n protected override get wantClosure(): boolean {\n // A bcurve can support physical closure when creating a new path...\n return this.allowClosure;\n }\n\n protected get requiredPointCount(): number {\n if (BCurveMethod.ThroughPoints === this.method)\n return 3; // Interpolation curve is always order 4 with 3 point minimum...\n\n return this.order;\n }\n\n protected override get createCurvePhase(): CreateCurvePhase {\n if (CreateCurvePhase.DefineOther !== this._tangentPhase)\n return CreateCurvePhase.DefineOther;\n\n return super.createCurvePhase;\n }\n\n protected override updateCurvePhase(): void {\n // The first point changes startPoint and last point changes endPoint.\n this._createCurvePhase = (0 === this.accepted.length ? CreateCurvePhase.DefineStart : CreateCurvePhase.DefineEnd);\n }\n\n protected override isComplete(ev: BeButtonEvent): boolean {\n // Accept on reset with sufficient points...\n if (BeButton.Reset === ev.button)\n return (this.accepted.length >= this.requiredPointCount);\n\n // Allow data to complete on physical closure...\n return this.isClosed || this._isPhysicallyClosedOrComplete;\n }\n\n protected override showConstructionGraphics(ev: BeButtonEvent, context: DynamicsContext): boolean {\n if (CreateCurvePhase.DefineOther !== this._tangentPhase && this.current) {\n const fitCurve = this.current as InterpolationCurve3d;\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\n const color = context.viewport.getContrastToBackgroundColor();\n\n builder.setSymbology(color, ColorDef.black, 1, LinePixels.Code2);\n builder.addLineString([ev.point, fitCurve.options.fitPoints[CreateCurvePhase.DefineStart === this._tangentPhase ? 0 : fitCurve.options.fitPoints.length - 1]]);\n\n builder.setSymbology(color, ColorDef.black, 8);\n builder.addPointString([ev.point]);\n\n context.addGraphic(builder.finish());\n }\n\n return super.showConstructionGraphics(ev, context);\n }\n\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\n if (CreateCurvePhase.DefineOther !== this._tangentPhase && this.current) {\n const fitCurve = this.current as InterpolationCurve3d;\n\n if (CreateCurvePhase.DefineStart === this._tangentPhase) {\n const tangentS = Vector3d.createStartEnd(ev.point, fitCurve.options.fitPoints[0]);\n if (tangentS.magnitude() > Geometry.smallMetricDistance)\n fitCurve.options.startTangent = tangentS;\n } else {\n const tangentE = Vector3d.createStartEnd(ev.point, fitCurve.options.fitPoints[fitCurve.options.fitPoints.length - 1]);\n if (tangentE.magnitude() > Geometry.smallMetricDistance)\n fitCurve.options.endTangent = tangentE;\n }\n\n return fitCurve;\n }\n\n // Don't include current point if it's the same as the last accepted point, want dynamics to show an accurate preview of what reset will accept...\n const includeCurrPt = (isDynamics && (0 === this.accepted.length || !ev.point.isAlmostEqual(this.accepted[this.accepted.length - 1])));\n const pts = (includeCurrPt ? [...this.accepted, ev.point] : this.accepted);\n const numRequired = this.requiredPointCount;\n\n if (pts.length < numRequired) {\n // Create point/linestring construction geometry to support join...\n this.isConstruction = true;\n return LineString3d.create(1 === pts.length ? [pts[0], pts[0]] : pts);\n }\n\n // Create periodic-looking curve on physical closure with sufficient points even when not creating a loop/surface...\n this._isPhysicallyClosedOrComplete = (undefined === this.continuationData && pts[0].isAlmostEqual(pts[pts.length - 1]));\n\n if (BCurveMethod.ControlPoints === this.method) {\n if (this._isPhysicallyClosedOrComplete && this.order > 2) {\n const tmpPts = pts.slice(undefined, -1); // Don't include closure point...\n return BSplineCurve3d.createPeriodicUniformKnots(tmpPts, this.order);\n }\n\n return BSplineCurve3d.createUniformKnots(pts, this.order);\n }\n\n const interpProps: InterpolationCurve3dProps = { fitPoints: pts, closed: this._isPhysicallyClosedOrComplete, isChordLenKnots: 1, isColinearTangents: 1 };\n\n // Create interpolation curve tangent to continuation curve...\n if (undefined !== this.continuationData && this.tangents) {\n const tangentS = this.continuationData.path.children[0].fractionToPointAndUnitTangent(0.0);\n const tangentE = this.continuationData.path.children[this.continuationData.path.children.length - 1].fractionToPointAndUnitTangent(1.0);\n\n if (pts[0].isAlmostEqual(tangentS.origin))\n interpProps.startTangent = tangentS.direction.scale(-1);\n else if (pts[0].isAlmostEqual(tangentE.origin))\n interpProps.startTangent = tangentE.direction;\n\n if (pts[pts.length - 1].isAlmostEqual(tangentS.origin))\n interpProps.endTangent = tangentS.direction.scale(-1);\n else if (pts[pts.length - 1].isAlmostEqual(tangentE.origin))\n interpProps.endTangent = tangentE.direction;\n\n this._isPhysicallyClosedOrComplete = (undefined !== interpProps.startTangent && undefined !== interpProps.endTangent);\n }\n\n const interpOpts = InterpolationCurve3dOptions.create(interpProps);\n\n return InterpolationCurve3d.createCapture(interpOpts);\n }\n\n protected override getSnapGeometry(): GeometryQuery | undefined {\n // Only snap to through points...\n if (BCurveMethod.ThroughPoints === this.method)\n return (this.accepted.length > 1 ? PointString3d.create(this.accepted) : undefined);\n\n return super.getSnapGeometry();\n }\n\n protected override async acceptPoint(ev: BeButtonEvent): Promise<boolean> {\n switch (this._tangentPhase) {\n case CreateCurvePhase.DefineOther:\n return super.acceptPoint(ev);\n\n case CreateCurvePhase.DefineStart:\n this._tangentPhase = CreateCurvePhase.DefineEnd;\n break;\n\n case CreateCurvePhase.DefineEnd:\n this._isPhysicallyClosedOrComplete = true;\n break;\n }\n\n await this.updateCurveAndContinuationData(ev, false);\n return true;\n }\n\n protected override async cancelPoint(ev: BeButtonEvent): Promise<boolean> {\n // NOTE: Starting another tool will not create element...require reset or closure...\n if (this.isComplete(ev)) {\n if (BCurveMethod.ThroughPoints === this.method && this.tangents && this.current) {\n const fitCurve = this.current as InterpolationCurve3d;\n\n switch (this._tangentPhase) {\n case CreateCurvePhase.DefineOther:\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\n await this.updateCurveAndContinuationData(ev, false);\n this._tangentPhase = (undefined === fitCurve.options.startTangent ? CreateCurvePhase.DefineStart : CreateCurvePhase.DefineEnd);\n IModelApp.toolAdmin.updateDynamics();\n this.setupAndPromptForNextAction();\n return false;\n\n case CreateCurvePhase.DefineStart:\n fitCurve.options.startTangent = undefined; // Not accepted, compute default start tangent...\n this._tangentPhase = CreateCurvePhase.DefineEnd;\n IModelApp.toolAdmin.updateDynamics();\n this.setupAndPromptForNextAction();\n return false;\n\n case CreateCurvePhase.DefineEnd:\n fitCurve.options.endTangent = undefined; // Not accepted, compute default end tangent...\n await this.createElement();\n return true;\n }\n }\n\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\n await this.updateCurveAndContinuationData(ev, false);\n await this.createElement();\n }\n return true;\n }\n\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\n if (!this.changeToolSettingPropertyValue(updatedValue))\n return false;\n\n if (this.methodProperty.name === updatedValue.propertyName)\n await this.onReinitialize();\n\n return true;\n }\n\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\n const toolSettings = new Array<DialogItem>();\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 }));\n if (BCurveMethod.ThroughPoints === this.method)\n toolSettings.push(this.tangentsProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 }));\n else\n toolSettings.push(this.orderProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }));\n return toolSettings;\n }\n\n public async onRestartTool(): Promise<void> {\n const tool = new CreateBCurveTool();\n if (!await tool.run())\n return this.exitTool();\n }\n\n public override async onInstall(): Promise<boolean> {\n if (!await super.onInstall())\n return false;\n\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\n this.initializeToolSettingPropertyValues([this.methodProperty, this.orderProperty, this.tangentsProperty]);\n\n return true;\n }\n\n /** The keyin takes the following arguments, all of which are optional:\n * - `method=0|1` How bcurve will be defined. 0 for control points, 1 for through points.\n * - `order=number` bcurve order from 2 to 16.\n * - 'tangents=0|1 Whether to specify start/end tangents for through points construction.\n */\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\n let bcurveMethod;\n let bcurveOrder;\n let bcurveTangents;\n\n for (const arg of inputArgs) {\n const parts = arg.split(\"=\");\n if (2 !== parts.length)\n continue;\n\n if (parts[0].toLowerCase().startsWith(\"me\")) {\n const method = Number.parseInt(parts[1], 10);\n if (!Number.isNaN(method)) {\n switch (method) {\n case 0:\n bcurveMethod = BCurveMethod.ControlPoints;\n break;\n case 1:\n bcurveMethod = BCurveMethod.ThroughPoints;\n break;\n }\n }\n } else if (parts[0].toLowerCase().startsWith(\"or\")) {\n const order = Number.parseInt(parts[1], 10);\n if (order >= this.minOrder && order <= this.maxOrder) {\n bcurveOrder = order;\n }\n } else if (parts[0].toLowerCase().startsWith(\"ta\")) {\n const tangents = Number.parseInt(parts[1], 10);\n bcurveTangents = (0 !== tangents);\n }\n }\n\n // Update current session values so keyin args are picked up for tool settings/restart...\n if (undefined !== bcurveMethod)\n this.saveToolSettingPropertyValue(this.methodProperty, { value: bcurveMethod });\n\n if (undefined !== bcurveOrder)\n this.saveToolSettingPropertyValue(this.orderProperty, { value: bcurveOrder });\n\n if (undefined !== bcurveTangents)\n this.saveToolSettingPropertyValue(this.tangentsProperty, { value: bcurveTangents });\n\n return this.run();\n }\n}\n"]}
1
+ {"version":3,"file":"SketchTools.js","sourceRoot":"","sources":["../../src/SketchTools.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport {\r\n DialogItem, DialogProperty, DialogPropertySyncItem, EnumerationChoice, PropertyDescriptionHelper, PropertyEditorParamTypes, RangeEditorParams,\r\n} from \"@itwin/appui-abstract\";\r\nimport { BentleyError, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n Code, ColorDef, ElementGeometry, ElementGeometryBuilderParams, ElementGeometryInfo, FlatBufferGeometryStream, GeometricElementProps, GeometryParams,\r\n GeometryStreamProps, isPlacement3dProps, JsonGeometryStream, LinePixels, PlacementProps,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n AccuDrawHintBuilder, AngleDescription, BeButton, BeButtonEvent, BeModifierKeys, CoreTools, DecorateContext, DynamicsContext, EventHandled,\r\n GraphicType, HitDetail, IModelApp, LengthDescription, NotifyMessageDetails, OutputMessagePriority, SnapDetail, TentativeOrAccuSnap, ToolAssistance,\r\n ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection,\r\n} from \"@itwin/core-frontend\";\r\nimport {\r\n Angle, AngleSweep, Arc3d, BSplineCurve3d, CurveCollection, CurveFactory, CurvePrimitive, FrameBuilder, Geometry, GeometryQuery, IModelJson,\r\n InterpolationCurve3d, InterpolationCurve3dOptions, InterpolationCurve3dProps, LineString3d, Loop, Matrix3d, Path, Plane3dByOriginAndUnitNormal,\r\n Point3d, PointString3d, Ray3d, RegionOps, Transform, Vector3d, YawPitchRollAngles,\r\n} from \"@itwin/core-geometry\";\r\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\r\nimport { CreateElementWithDynamicsTool } from \"./CreateElementTool\";\r\nimport { EditTools } from \"./EditTool\";\r\nimport { basicManipulationIpc } from \"./EditToolIpc\";\r\n\r\n/** @alpha Values for [[CreateOrContinueTool.createCurvePhase] to support join and closure. */\r\nexport enum CreateCurvePhase {\r\n /** Current tool phase changes CurvePrimitive startPoint.\r\n * ex. Arc defined by center, start would return this when accepted length is 1.\r\n */\r\n DefineStart,\r\n /** Current tool phase changes CurvePrimitive endPoint.\r\n * ex. Arc defined by start, end, mid would return this when accepted length is 1.\r\n */\r\n DefineEnd,\r\n /** Current tool phase does NOT change CurvePrimitive startPoint or endPoint.\r\n * ex. When defining arc mid point, or start and end tangents for a bcurve return this.\r\n */\r\n DefineOther,\r\n}\r\n\r\n/** @alpha Base class for creating open and closed paths. */\r\nexport abstract class CreateOrContinuePathTool extends CreateElementWithDynamicsTool {\r\n protected _createCurvePhase = CreateCurvePhase.DefineOther;\r\n protected readonly accepted: Point3d[] = [];\r\n protected current?: CurvePrimitive;\r\n protected continuationData?: { props: GeometricElementProps, path: Path, params: GeometryParams };\r\n protected isClosed = false;\r\n protected isConstruction = false; // Sub-classes can set in createNewCurvePrimitive to bypass creating element graphics...\r\n protected _snapGeomId?: Id64String;\r\n protected _startedCmd?: string;\r\n\r\n protected async startCommand(): Promise<string> {\r\n if (undefined !== this._startedCmd)\r\n return this._startedCmd;\r\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\r\n }\r\n\r\n protected get allowJoin(): boolean { return this.isControlDown; }\r\n protected get allowClosure(): boolean { return this.isControlDown; }\r\n protected get allowSimplify(): boolean { return true; }\r\n\r\n protected get wantSmartRotation(): boolean { return this.isContinueExistingPath || this.isControlDown; }\r\n protected get wantPickableDynamics(): boolean { return false; }\r\n protected get wantJoin(): boolean { return this.allowJoin; }\r\n protected get wantClosure(): boolean { return this.isContinueExistingPath && this.allowClosure; }\r\n protected get wantSimplify(): boolean { return this.allowSimplify; }\r\n\r\n protected get showCurveConstructions(): boolean { return false; }\r\n protected get showJoin(): boolean { return this.isContinueExistingPath && CreateCurvePhase.DefineStart === this.createCurvePhase; }\r\n protected get showClosure(): boolean { return this.isClosed && CreateCurvePhase.DefineEnd === this.createCurvePhase; }\r\n protected get createCurvePhase(): CreateCurvePhase { return this._createCurvePhase; }\r\n\r\n /** Sub-classes should override unless they don't support join or closure. */\r\n protected updateCurvePhase(): void { }\r\n\r\n /** Implemented by sub-classes to create the new curve or construction curve for placement dynamics.\r\n * @param ev The current button event from a click or motion event.\r\n * @param isDynamics true when called for dynamics and the point from ev should be included in the result curve.\r\n * @internal\r\n */\r\n protected abstract createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined;\r\n\r\n protected getCurrentRotation(ev: BeButtonEvent): Matrix3d {\r\n const matrix = (undefined !== ev.viewport ? AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true) : undefined);\r\n return (undefined !== matrix ? matrix : Matrix3d.createIdentity());\r\n }\r\n\r\n protected getUpVector(ev: BeButtonEvent): Vector3d {\r\n return this.getCurrentRotation(ev).getColumn(2);\r\n }\r\n\r\n protected async updateCurveAndContinuationData(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\r\n this.isConstruction = false;\r\n this.current = this.createNewCurvePrimitive(ev, isDynamics);\r\n if (CreateCurvePhase.DefineStart === this.createCurvePhase)\r\n await this.isValidForJoin(); // Updates this.continuationData...\r\n else if (CreateCurvePhase.DefineEnd === this.createCurvePhase)\r\n await this.isValidForClosure(); // Updates this.isClosed...\r\n }\r\n\r\n protected override async updateElementData(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\r\n if (!isDynamics)\r\n this.accepted.push(ev.point.clone());\r\n\r\n await this.updateCurveAndContinuationData(ev, isDynamics);\r\n\r\n if (!isDynamics)\r\n this.updateCurvePhase();\r\n }\r\n\r\n protected override async updateDynamicData(ev: BeButtonEvent): Promise<boolean> {\r\n // Need to update continuation data for first data point before dynamics has started...\r\n await this.updateCurveAndContinuationData(ev, true);\r\n\r\n // Don't need to create graphic if dynamics aren't yet active or showing construction geometry...\r\n return (IModelApp.viewManager.inDynamicsMode && !this.isConstruction);\r\n }\r\n\r\n protected get isContinueExistingPath(): boolean { return undefined !== this.continuationData; }\r\n\r\n protected async isValidForContinue(snap: SnapDetail): Promise<{ props: GeometricElementProps, path: Path, params: GeometryParams } | undefined> {\r\n if (!snap.isElementHit)\r\n return;\r\n\r\n const snapCurve = snap.getCurvePrimitive();\r\n if (undefined === snapCurve)\r\n return;\r\n\r\n const curveS = snapCurve.startPoint();\r\n const curveE = snapCurve.endPoint();\r\n\r\n if (curveS.isAlmostEqual(curveE))\r\n return; // Reject snap to single physically closed curve primitive...\r\n\r\n const snapPt = snap.adjustedPoint;\r\n if (!(snapPt.isAlmostEqual(curveS) || snapPt.isAlmostEqual(curveE)))\r\n return; // No point to further checks if snap wasn't to endpoint of curve primitive...\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const info = await basicManipulationIpc.requestElementGeometry(snap.sourceId, { maxDisplayable: 1, geometry: { curves: true, surfaces: false, solids: false } });\r\n if (undefined === info)\r\n return;\r\n\r\n const data = CreateOrContinuePathTool.isSingleOpenPath(info);\r\n if (undefined === data)\r\n return;\r\n\r\n const props = await this.iModel.elements.loadProps(snap.sourceId) as GeometricElementProps;\r\n if (undefined === props)\r\n return;\r\n\r\n return { props, path: data.path, params: data.params };\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n return;\r\n }\r\n }\r\n\r\n protected async isValidForJoin(): Promise<boolean> {\r\n this.continuationData = undefined;\r\n\r\n if (!this.wantJoin)\r\n return false;\r\n\r\n if (undefined === this.current)\r\n return false;\r\n\r\n const snap = TentativeOrAccuSnap.getCurrentSnap();\r\n if (undefined === snap)\r\n return false;\r\n\r\n const data = await this.isValidForContinue(snap);\r\n if (undefined === data)\r\n return false;\r\n\r\n if (!CreateOrContinuePathTool.isPathEndPoint(this.current, data.path))\r\n return false;\r\n\r\n this.continuationData = data;\r\n return true;\r\n }\r\n\r\n protected async isValidForClosure(): Promise<boolean> {\r\n this.isClosed = false;\r\n\r\n if (!this.wantClosure)\r\n return false;\r\n\r\n if (undefined === this.current)\r\n return false;\r\n\r\n return (this.isClosed = CreateOrContinuePathTool.isPathClosurePoint(this.current, this.continuationData?.path));\r\n }\r\n\r\n public static isSingleOpenPath(info: ElementGeometryInfo): { path: Path, params: GeometryParams } | undefined {\r\n const it = new ElementGeometry.Iterator(info);\r\n it.requestWorldCoordinates();\r\n\r\n for (const entry of it) {\r\n const geom = entry.toGeometryQuery();\r\n if (undefined === geom)\r\n return;\r\n\r\n if (\"curvePrimitive\" === geom.geometryCategory) {\r\n const curve = geom as CurvePrimitive;\r\n\r\n const curveS = curve.startPoint();\r\n const curveE = curve.endPoint();\r\n\r\n if (curveS.isAlmostEqual(curveE))\r\n return; // Reject zero length lines, physically closed arcs, linestrings, etc...\r\n\r\n return { path: Path.create(curve), params: entry.geomParams };\r\n } else if (\"curveCollection\" === geom.geometryCategory) {\r\n const curves = geom as CurveCollection;\r\n if (!curves.isOpenPath)\r\n return;\r\n\r\n const path = curves as Path;\r\n const curveS = path.children[0].startPoint();\r\n const curveE = path.children[path.children.length - 1].endPoint();\r\n\r\n if (curveS.isAlmostEqual(curveE))\r\n return; // Reject physically closed path...\r\n\r\n return { path, params: entry.geomParams };\r\n }\r\n\r\n break;\r\n }\r\n\r\n return;\r\n }\r\n\r\n public static isPathEndPoint(curve: CurvePrimitive, path: Path): boolean {\r\n const curveS = curve.startPoint();\r\n const pathS = path.children[0].startPoint();\r\n const pathE = path.children[path.children.length - 1].endPoint();\r\n\r\n if (!(curveS.isAlmostEqual(pathS) || curveS.isAlmostEqual(pathE)))\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n public static isPathClosurePoint(curve: CurvePrimitive, path?: Path): boolean {\r\n const length = curve.quickLength();\r\n if (length < Geometry.smallMetricDistance)\r\n return false;\r\n\r\n const curveS = curve.startPoint();\r\n const curveE = curve.endPoint();\r\n\r\n if (undefined === path) {\r\n if (!curveS.isAlmostEqual(curveE))\r\n return false;\r\n\r\n const curveLocalToWorld = FrameBuilder.createRightHandedFrame(undefined, curve);\r\n if (undefined === curveLocalToWorld)\r\n return false;\r\n\r\n // Don't create a Loop unless new CurvePrimitive is planar...\r\n const curvePlane = Plane3dByOriginAndUnitNormal.create(curveLocalToWorld.getOrigin(), curveLocalToWorld.matrix.getColumn(2));\r\n return (undefined !== curvePlane && curve.isInPlane(curvePlane));\r\n }\r\n\r\n const pathS = path.children[0].startPoint();\r\n const pathE = path.children[path.children.length - 1].endPoint();\r\n\r\n if (!(curveS.isAlmostEqual(pathS) && curveE.isAlmostEqual(pathE) || curveS.isAlmostEqual(pathE) && curveE.isAlmostEqual(pathS)))\r\n return false;\r\n\r\n const pathLocalToWorld = FrameBuilder.createRightHandedFrame(undefined, [curve, path]);\r\n if (undefined === pathLocalToWorld)\r\n return false;\r\n\r\n // Don't create a Loop unless new CurvePrimitive + existing Path is planar...\r\n const pathPlane = Plane3dByOriginAndUnitNormal.create(pathLocalToWorld.getOrigin(), pathLocalToWorld.matrix.getColumn(2));\r\n if (undefined === pathPlane)\r\n return false;\r\n\r\n if (!curve.isInPlane(pathPlane))\r\n return false;\r\n\r\n for (const child of path.children) {\r\n if (!child.isInPlane(pathPlane))\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected addConstructionGraphics(curve: CurvePrimitive, showCurve: boolean, context: DynamicsContext): void {\r\n if (!showCurve) {\r\n switch (curve.curvePrimitiveType) {\r\n case \"arc\":\r\n case \"bsplineCurve\":\r\n case \"interpolationCurve\":\r\n break;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 1, LinePixels.Code2);\r\n\r\n if (showCurve)\r\n builder.addPath(Path.create(curve));\r\n\r\n switch (curve.curvePrimitiveType) {\r\n case \"arc\": {\r\n const arc = curve as Arc3d;\r\n const start = arc.startPoint();\r\n const end = arc.endPoint();\r\n\r\n builder.addLineString([arc.center, start]);\r\n if (!start.isAlmostEqual(end))\r\n builder.addLineString([arc.center, end]);\r\n\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 5);\r\n builder.addPointString([arc.center]);\r\n break;\r\n }\r\n\r\n case \"bsplineCurve\": {\r\n const bcurve = curve as BSplineCurve3d;\r\n const poles: Point3d[] = [];\r\n\r\n for (let iPole = 0; iPole < bcurve.numPoles; ++iPole) {\r\n const polePt = bcurve.getPolePoint3d(iPole);\r\n if (undefined !== polePt)\r\n poles.push(polePt);\r\n }\r\n\r\n builder.addLineString(poles);\r\n\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 5);\r\n builder.addPointString(poles);\r\n break;\r\n }\r\n\r\n case \"interpolationCurve\": {\r\n const fitCurve = curve as InterpolationCurve3d;\r\n\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 5);\r\n builder.addPointString(fitCurve.options.fitPoints); // deep copy shoulnd't be necessary...\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n context.addGraphic(builder.finish());\r\n }\r\n\r\n protected showConstructionGraphics(_ev: BeButtonEvent, context: DynamicsContext): boolean {\r\n if (undefined === this.current)\r\n return false;\r\n\r\n if (!this.isConstruction) {\r\n if (this.showCurveConstructions)\r\n this.addConstructionGraphics(this.current, false, context);\r\n return false;\r\n }\r\n\r\n this.addConstructionGraphics(this.current, true, context);\r\n return true;\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (this.showConstructionGraphics(ev, context))\r\n return; // Don't display element graphics...\r\n\r\n super.onDynamicFrame(ev, context);\r\n }\r\n\r\n protected showJoinIndicator(context: DecorateContext, pt: Point3d): void {\r\n const lengthX = Math.floor(context.viewport.pixelsFromInches(0.08)) + 0.5;\r\n const lengthY = Math.floor(lengthX * 0.6) + 0.5;\r\n const offsetX = lengthX * 3;\r\n const offsetY = lengthY * 3;\r\n const position = context.viewport.worldToView(pt);\r\n\r\n position.x = Math.floor(position.x - offsetX) + 0.5;\r\n position.y = Math.floor(position.y + offsetY) + 0.5;\r\n\r\n const drawDecoration = (ctx: CanvasRenderingContext2D) => {\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\r\n ctx.lineWidth = 3;\r\n ctx.lineCap = \"round\";\r\n ctx.moveTo(-lengthX, lengthY);\r\n ctx.lineTo(0, lengthY);\r\n ctx.lineTo(0, -lengthY);\r\n ctx.lineTo(lengthX, -lengthY);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(255,255,255,.8)\";\r\n ctx.lineWidth = 1;\r\n ctx.moveTo(-lengthX, lengthY);\r\n ctx.lineTo(0, lengthY);\r\n ctx.lineTo(0, -lengthY);\r\n ctx.lineTo(lengthX, -lengthY);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\r\n ctx.fillStyle = \"rgba(0,255,255,.8)\";\r\n ctx.arc(0, -lengthY, 2.5, 0, 2 * Math.PI);\r\n ctx.fill();\r\n ctx.stroke();\r\n };\r\n context.addCanvasDecoration({ position, drawDecoration }, true);\r\n }\r\n\r\n protected showClosureIndicator(context: DecorateContext, pt: Point3d): void {\r\n const radius = Math.floor(context.viewport.pixelsFromInches(0.06)) + 0.5;\r\n const offset = radius * 2.5;\r\n const position = context.viewport.worldToView(pt);\r\n\r\n position.x = Math.floor(position.x - offset) + 0.5;\r\n position.y = Math.floor(position.y + offset) + 0.5;\r\n\r\n const drawDecoration = (ctx: CanvasRenderingContext2D) => {\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(255,255,255,.8)\";\r\n ctx.lineWidth = 1;\r\n ctx.fillStyle = \"rgba(0,0,255,.2)\";\r\n ctx.arc(0, 0, radius, 0, 2 * Math.PI);\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\r\n ctx.arc(0, 0, radius + 1, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(0,0,0,.8)\";\r\n ctx.fillStyle = \"rgba(0,255,255,.8)\";\r\n ctx.arc(-radius, 0, 2.5, 0, 2 * Math.PI);\r\n ctx.fill();\r\n ctx.stroke();\r\n };\r\n context.addCanvasDecoration({ position, drawDecoration }, true);\r\n }\r\n\r\n public override testDecorationHit(id: Id64String): boolean {\r\n return id === this._snapGeomId;\r\n }\r\n\r\n public override async getToolTip(hit: HitDetail): Promise<HTMLElement | string> {\r\n if (this.testDecorationHit(hit.sourceId))\r\n return this.description;\r\n return super.getToolTip(hit);\r\n }\r\n\r\n protected getSnapGeometry(): GeometryQuery | undefined {\r\n if (this.accepted.length < 2)\r\n return;\r\n\r\n // Treat accepted points as linear segments by default...\r\n return LineString3d.create(this.accepted);\r\n }\r\n\r\n public override getDecorationGeometry(_hit: HitDetail): GeometryStreamProps | undefined {\r\n const geomQuery = this.getSnapGeometry();\r\n if (undefined === geomQuery)\r\n return;\r\n\r\n const geomJson = IModelJson.Writer.toIModelJson(geomQuery);\r\n return geomJson ? [geomJson] : undefined;\r\n }\r\n\r\n protected addPickableGraphics(context: DecorateContext): void {\r\n const geomQuery = this.getSnapGeometry();\r\n if (undefined === geomQuery)\r\n return;\r\n\r\n if (undefined === this._snapGeomId)\r\n this._snapGeomId = this.iModel.transientIds.getNext();\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldDecoration, pickable: { id: this._snapGeomId, locateOnly: true } });\r\n builder.setSymbology(ColorDef.white, ColorDef.white, 1);\r\n\r\n switch (geomQuery.geometryCategory) {\r\n case \"pointCollection\": {\r\n const pointString = geomQuery as PointString3d;\r\n builder.addPointString(pointString.points);\r\n break;\r\n }\r\n\r\n case \"curvePrimitive\": {\r\n const curvePrimitive = geomQuery as CurvePrimitive;\r\n switch (curvePrimitive.curvePrimitiveType) {\r\n case \"lineString\": {\r\n const lineString = geomQuery as LineString3d;\r\n builder.addLineString(lineString.points);\r\n break;\r\n }\r\n\r\n default:\r\n return; // Don't need to support other types of CurvePrimitive currently...\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n return; // Don't need to support other types of GeometryQuery currently...\r\n }\r\n\r\n context.addDecorationFromBuilder(builder);\r\n }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (this.wantPickableDynamics)\r\n this.addPickableGraphics(context);\r\n\r\n if (undefined === this.current)\r\n return;\r\n\r\n if (this.showJoin)\r\n this.showJoinIndicator(context, this.current.startPoint());\r\n else if (this.showClosure)\r\n this.showClosureIndicator(context, this.current.endPoint());\r\n }\r\n\r\n public override async onModifierKeyTransition(_wentDown: boolean, modifier: BeModifierKeys, _event: KeyboardEvent): Promise<EventHandled> {\r\n if (BeModifierKeys.Control !== modifier)\r\n return EventHandled.No;\r\n\r\n // Update display for join/closure change w/o waiting for a motion event...\r\n return EventHandled.Yes;\r\n }\r\n\r\n protected getPlacementProps(): PlacementProps | undefined {\r\n if (undefined !== this.continuationData)\r\n return this.continuationData.props.placement;\r\n\r\n if (undefined === this.current)\r\n return;\r\n\r\n const vp = this.targetView;\r\n if (undefined === vp)\r\n return;\r\n\r\n const matrix = AccuDrawHintBuilder.getCurrentRotation(vp, true, true);\r\n const localToWorld = FrameBuilder.createRightHandedFrame(matrix?.getColumn(2), this.current);\r\n if (undefined === localToWorld)\r\n return;\r\n\r\n const origin = localToWorld.getOrigin();\r\n const angles = new YawPitchRollAngles();\r\n\r\n YawPitchRollAngles.createFromMatrix3d(localToWorld.matrix, angles);\r\n\r\n if (vp.view.is3d())\r\n return { origin, angles };\r\n\r\n return { origin, angle: angles.yaw };\r\n }\r\n\r\n protected createNewPath(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\r\n if (undefined === this.current)\r\n return;\r\n\r\n const builder = new ElementGeometry.Builder();\r\n builder.setLocalToWorldFromPlacement(placement);\r\n\r\n const geometry = (this.isClosed ? Loop.create(this.current) : this.current);\r\n if (!builder.appendGeometryQuery(geometry))\r\n return;\r\n\r\n return { format: \"flatbuffer\", data: builder.entries };\r\n }\r\n\r\n protected continueExistingPath(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\r\n if (undefined === this.current || undefined === this.continuationData)\r\n return;\r\n\r\n const length = this.current.quickLength();\r\n if (length < Geometry.smallMetricDistance)\r\n return;\r\n\r\n const curveS = this.current.startPoint();\r\n const pathS = this.continuationData.path.children[0].startPoint();\r\n const pathE = this.continuationData.path.children[this.continuationData.path.children.length - 1].endPoint();\r\n\r\n const append = pathE.isAlmostEqual(curveS);\r\n if (!append && !pathS.isAlmostEqual(curveS))\r\n return;\r\n\r\n const continuePath = this.continuationData.path.clone() as Path;\r\n if (undefined === continuePath)\r\n return;\r\n\r\n const current = this.current.clone();\r\n if (undefined === current)\r\n return;\r\n\r\n if (append) {\r\n continuePath.tryAddChild(current);\r\n } else {\r\n current.reverseInPlace();\r\n continuePath.children.splice(0, 0, current);\r\n }\r\n\r\n const geometry = (this.isClosed ? Loop.create(...continuePath.children) : continuePath);\r\n if (this.wantSimplify)\r\n RegionOps.consolidateAdjacentPrimitives(geometry);\r\n\r\n const builder = new ElementGeometry.Builder();\r\n builder.setLocalToWorldFromPlacement(placement);\r\n builder.appendGeometryParamsChange(this.continuationData.params);\r\n\r\n if (!builder.appendGeometryQuery(geometry))\r\n return;\r\n\r\n return { format: \"flatbuffer\", data: builder.entries };\r\n }\r\n\r\n protected getGeometryProps(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\r\n if (this.isContinueExistingPath)\r\n return this.continueExistingPath(placement);\r\n\r\n return this.createNewPath(placement);\r\n }\r\n\r\n protected getElementProps(placement: PlacementProps): GeometricElementProps | undefined {\r\n if (undefined !== this.continuationData)\r\n return this.continuationData.props;\r\n\r\n const model = this.targetModelId;\r\n const category = this.targetCategory;\r\n\r\n if (isPlacement3dProps(placement))\r\n return { classFullName: \"Generic:PhysicalObject\", model, category, code: Code.createEmpty(), placement };\r\n\r\n return { classFullName: \"BisCore:DrawingGraphic\", model, category, code: Code.createEmpty(), placement };\r\n }\r\n\r\n protected override async doCreateElement(props: GeometricElementProps, data?: ElementGeometryBuilderParams): Promise<void> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n if (undefined === props.id)\r\n await basicManipulationIpc.insertGeometricElement(props, data);\r\n else\r\n await basicManipulationIpc.updateGeometricElement(props, data);\r\n await this.saveChanges();\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n }\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n const nPts = this.accepted.length;\r\n if (0 === nPts)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n\r\n if (this.wantSmartRotation)\r\n hints.enableSmartRotation = true;\r\n\r\n // Rotate AccuDraw to last segment...\r\n if (nPts > 1 && !this.accepted[nPts - 1].isAlmostEqual(this.accepted[nPts - 2]))\r\n hints.setXAxis(Vector3d.createStartEnd(this.accepted[nPts - 2], this.accepted[nPts - 1]));\r\n\r\n hints.setOrigin(this.accepted[nPts - 1]);\r\n hints.sendHints();\r\n }\r\n\r\n public override async onUndoPreviousStep(): Promise<boolean> {\r\n if (0 === this.accepted.length)\r\n return false;\r\n\r\n this.accepted.pop();\r\n if (0 === this.accepted.length) {\r\n await this.onReinitialize();\r\n } else {\r\n this.updateCurvePhase();\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n this.updateCurvePhase();\r\n }\r\n}\r\n\r\n/** @alpha Creates a line string or shape. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\r\nexport class CreateLineStringTool extends CreateOrContinuePathTool {\r\n public static override toolId = \"CreateLineString\";\r\n public static override iconSpec = \"icon-snaps\"; // Need better icon...\r\n\r\n protected override get wantPickableDynamics(): boolean { return true; } // Allow snapping to accepted segments...\r\n\r\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\r\n const nPts = this.accepted.length;\r\n const mainMsg = CoreTools.translate(0 === nPts ? \"ElementSet.Prompts.StartPoint\" : (1 === nPts ? \"ElementSet.Prompts.EndPoint\" : \"ElementSet.Inputs.AdditionalPoint\"));\r\n const leftMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\r\n const rightMsg = CoreTools.translate(nPts > 1 ? \"ElementSet.Inputs.Complete\" : \"ElementSet.Inputs.Cancel\");\r\n\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, leftMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, leftMsg, false, ToolAssistanceInputMethod.Mouse));\r\n\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rightMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rightMsg, false, ToolAssistanceInputMethod.Mouse));\r\n\r\n const sections: ToolAssistanceSection[] = [];\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, mainMsg);\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n\r\n protected override get wantClosure(): boolean {\r\n // A linestring can support physical closure when creating a new path...\r\n return this.allowClosure;\r\n }\r\n\r\n protected override updateCurvePhase(): void {\r\n // The first point changes startPoint and last point changes endPoint.\r\n this._createCurvePhase = (0 === this.accepted.length ? CreateCurvePhase.DefineStart : CreateCurvePhase.DefineEnd);\r\n }\r\n\r\n protected override isComplete(ev: BeButtonEvent): boolean {\r\n // Accept on reset with at least 2 points...\r\n if (BeButton.Reset === ev.button)\r\n return (this.accepted.length > 1);\r\n\r\n // Allow data to complete on physical closure (creates Loop)...\r\n return this.isClosed;\r\n }\r\n\r\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\r\n const numRequired = (isDynamics ? 1 : 2);\r\n if (this.accepted.length < numRequired) {\r\n this.isConstruction = true; // Create zero length line as construction geometry to support join...\r\n const pt = (0 !== this.accepted.length ? this.accepted[0] : ev.point);\r\n return LineString3d.create([pt, pt]);\r\n }\r\n\r\n const pts = (isDynamics ? [...this.accepted, ev.point] : this.accepted);\r\n return LineString3d.create(pts);\r\n }\r\n\r\n protected override async cancelPoint(ev: BeButtonEvent): Promise<boolean> {\r\n // NOTE: Starting another tool will not create element...require reset or closure...\r\n if (this.isComplete(ev)) {\r\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\r\n await this.updateCurveAndContinuationData(ev, false);\r\n await this.createElement();\r\n }\r\n return true;\r\n }\r\n\r\n public async onRestartTool() {\r\n const tool = new CreateLineStringTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport enum ArcMethod {\r\n CenterStart = 0,\r\n StartCenter = 1,\r\n StartMidEnd = 2,\r\n StartEndMid = 3,\r\n}\r\n\r\n/** @alpha Creates an arc. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\r\nexport class CreateArcTool extends CreateOrContinuePathTool {\r\n public static override toolId = \"CreateArc\";\r\n public static override iconSpec = \"icon-three-points-circular-arc\";\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 3; } // method, radius, sweep - zero value unlocks associated \"use\" toggle...\r\n\r\n protected override get showCurveConstructions(): boolean { return true; } // Display lines from center to start/end...\r\n\r\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\r\n const nPts = this.accepted.length;\r\n\r\n switch (this.method) {\r\n case ArcMethod.CenterStart:\r\n mainInstrText = (0 === nPts ? EditTools.translate(\"CreateArc.Prompts.CenterPoint\") : (1 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : CoreTools.translate(\"ElementSet.Prompts.EndPoint\")));\r\n break;\r\n\r\n case ArcMethod.StartCenter:\r\n mainInstrText = (0 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : (1 === nPts ? EditTools.translate(\"CreateArc.Prompts.CenterPoint\") : CoreTools.translate(\"ElementSet.Prompts.EndPoint\")));\r\n break;\r\n\r\n case ArcMethod.StartMidEnd:\r\n mainInstrText = (0 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : (1 === nPts ? EditTools.translate(\"CreateArc.Prompts.MidPoint\") : CoreTools.translate(\"ElementSet.Prompts.EndPoint\")));\r\n break;\r\n\r\n case ArcMethod.StartEndMid:\r\n mainInstrText = (0 === nPts ? CoreTools.translate(\"ElementSet.Prompts.StartPoint\") : (1 === nPts ? CoreTools.translate(\"ElementSet.Prompts.EndPoint\") : EditTools.translate(\"CreateArc.Prompts.MidPoint\")));\r\n break;\r\n }\r\n\r\n super.provideToolAssistance(mainInstrText, additionalInstr);\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n const nPts = this.accepted.length;\r\n if (0 === nPts)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n\r\n if (this.wantSmartRotation)\r\n hints.enableSmartRotation = true;\r\n\r\n switch (this.accepted.length) {\r\n case 1:\r\n hints.setOrigin(this.accepted[0]);\r\n\r\n if (ArcMethod.CenterStart !== this.method)\r\n break;\r\n\r\n hints.setOriginFixed = true;\r\n hints.setModePolar();\r\n break;\r\n\r\n case 2:\r\n switch (this.method) {\r\n case ArcMethod.CenterStart:\r\n if (!this.accepted[0].isAlmostEqual(this.accepted[1]))\r\n hints.setXAxis(Vector3d.createStartEnd(this.accepted[0], this.accepted[1])); // Rotate AccuDraw to major axis...\r\n break;\r\n\r\n case ArcMethod.StartCenter:\r\n let center = this.accepted[1];\r\n const start = this.accepted[0];\r\n const vector0 = center.unitVectorTo(start);\r\n\r\n if (undefined === vector0)\r\n break;\r\n\r\n if (this.useRadius)\r\n center = start.plusScaled(vector0, -this.radius);\r\n\r\n hints.setOrigin(center);\r\n hints.setOriginFixed = true;\r\n hints.setModePolar();\r\n hints.setXAxis(vector0);\r\n break;\r\n\r\n default:\r\n hints.setOrigin(this.accepted[1]);\r\n break;\r\n }\r\n break;\r\n }\r\n\r\n hints.sendHints();\r\n }\r\n\r\n private static methodMessage(str: string) { return EditTools.translate(`CreateArc.Method.${str}`); }\r\n private static getMethodChoices = (): EnumerationChoice[] => {\r\n return [\r\n { label: CreateArcTool.methodMessage(\"CenterStart\"), value: ArcMethod.CenterStart },\r\n { label: CreateArcTool.methodMessage(\"StartCenter\"), value: ArcMethod.StartCenter },\r\n { label: CreateArcTool.methodMessage(\"StartMidEnd\"), value: ArcMethod.StartMidEnd },\r\n { label: CreateArcTool.methodMessage(\"StartEndMid\"), value: ArcMethod.StartEndMid },\r\n ];\r\n };\r\n\r\n private _methodProperty: DialogProperty<number> | undefined;\r\n public get methodProperty() {\r\n if (!this._methodProperty)\r\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\r\n \"arcMethod\", EditTools.translate(\"CreateArc.Label.Method\"), CreateArcTool.getMethodChoices()), ArcMethod.StartCenter as number);\r\n return this._methodProperty;\r\n }\r\n\r\n public get method(): ArcMethod { return this.methodProperty.value as ArcMethod; }\r\n public set method(method: ArcMethod) { this.methodProperty.value = method; }\r\n\r\n private _useRadiusProperty: DialogProperty<boolean> | undefined;\r\n public get useRadiusProperty() {\r\n if (!this._useRadiusProperty)\r\n this._useRadiusProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useArcRadius\"), false);\r\n return this._useRadiusProperty;\r\n }\r\n\r\n public get useRadius(): boolean { return this.useRadiusProperty.value; }\r\n public set useRadius(value: boolean) { this.useRadiusProperty.value = value; }\r\n\r\n private _radiusProperty: DialogProperty<number> | undefined;\r\n public get radiusProperty() {\r\n if (!this._radiusProperty)\r\n this._radiusProperty = new DialogProperty<number>(new LengthDescription(\"arcRadius\", EditTools.translate(\"CreateArc.Label.Radius\")), 0.1, undefined, !this.useRadius);\r\n return this._radiusProperty;\r\n }\r\n\r\n public get radius(): number { return this.radiusProperty.value; }\r\n public set radius(value: number) { this.radiusProperty.value = value; }\r\n\r\n private _useSweepProperty: DialogProperty<boolean> | undefined;\r\n public get useSweepProperty() {\r\n if (!this._useSweepProperty)\r\n this._useSweepProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useArcSweep\"), false);\r\n return this._useSweepProperty;\r\n }\r\n\r\n public get useSweep(): boolean { return this.useSweepProperty.value; }\r\n public set useSweep(value: boolean) { this.useSweepProperty.value = value; }\r\n\r\n private _sweepProperty: DialogProperty<number> | undefined;\r\n public get sweepProperty() {\r\n if (!this._sweepProperty)\r\n this._sweepProperty = new DialogProperty<number>(new AngleDescription(\"arcSweep\", EditTools.translate(\"CreateArc.Label.Sweep\")), Math.PI / 2.0, undefined, !this.useSweep);\r\n return this._sweepProperty;\r\n }\r\n\r\n public get sweep(): number { return this.sweepProperty.value; }\r\n public set sweep(value: number) { this.sweepProperty.value = value; }\r\n\r\n protected override isComplete(_ev: BeButtonEvent): boolean {\r\n return (3 === this.accepted.length);\r\n }\r\n\r\n protected override updateCurvePhase(): void {\r\n switch (this.accepted.length) {\r\n case 0:\r\n this._createCurvePhase = ArcMethod.CenterStart === this.method ? CreateCurvePhase.DefineOther : CreateCurvePhase.DefineStart;\r\n break;\r\n case 1:\r\n if (ArcMethod.CenterStart === this.method)\r\n this._createCurvePhase = CreateCurvePhase.DefineStart;\r\n else if (ArcMethod.StartEndMid === this.method)\r\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\r\n else\r\n this._createCurvePhase = CreateCurvePhase.DefineOther;\r\n break;\r\n default:\r\n this._createCurvePhase = ArcMethod.StartEndMid === this.method ? CreateCurvePhase.DefineOther : CreateCurvePhase.DefineEnd;\r\n break;\r\n }\r\n }\r\n\r\n protected createConstructionCurve(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\r\n switch (this.accepted.length) {\r\n case 0: {\r\n if (ArcMethod.CenterStart === this.method)\r\n return undefined;\r\n\r\n return LineString3d.create([ev.point, ev.point]);\r\n }\r\n\r\n case 1: {\r\n const pt1 = this.accepted[0];\r\n const pt2 = (isDynamics ? ev.point : pt1);\r\n\r\n switch (this.method) {\r\n case ArcMethod.CenterStart:\r\n case ArcMethod.StartCenter: {\r\n if (pt1.isAlmostEqual(pt2))\r\n return (ArcMethod.StartCenter === this.method ? LineString3d.create([pt1, pt2]) : undefined);\r\n\r\n let center = (ArcMethod.CenterStart === this.method ? pt1 : pt2);\r\n const start = (ArcMethod.CenterStart === this.method ? pt2 : pt1);\r\n const normal = this.getUpVector(ev);\r\n const vector0 = Vector3d.createStartEnd(center, start);\r\n const vector90 = normal.crossProduct(vector0);\r\n const radius = (this.useRadius ? this.radius : vector0.magnitude());\r\n\r\n if (this.useRadius) {\r\n if (ArcMethod.StartCenter === this.method) {\r\n vector0.normalizeInPlace();\r\n center = start.plusScaled(vector0, -radius);\r\n }\r\n } else {\r\n this.radius = radius;\r\n this.syncToolSettingsRadiusAndSweep();\r\n }\r\n\r\n vector0.scaleToLength(radius, vector0);\r\n vector90.scaleToLength(radius, vector90);\r\n\r\n return Arc3d.create(center, vector0, vector90);\r\n }\r\n\r\n case ArcMethod.StartMidEnd:\r\n case ArcMethod.StartEndMid: {\r\n return LineString3d.create([pt1, pt2]);\r\n }\r\n\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n case 2: {\r\n switch (this.method) {\r\n case ArcMethod.CenterStart:\r\n return LineString3d.create([this.accepted[1], this.accepted[0]]);\r\n\r\n case ArcMethod.StartCenter:\r\n case ArcMethod.StartMidEnd:\r\n case ArcMethod.StartEndMid:\r\n return LineString3d.create([this.accepted[0], this.accepted[1]]);\r\n\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\r\n const numRequired = (isDynamics ? 2 : 3);\r\n if (this.accepted.length < numRequired) {\r\n this.isConstruction = true; // Create construction geometry to support join...\r\n return this.createConstructionCurve(ev, isDynamics);\r\n }\r\n\r\n const final = (isDynamics ? ev.point : this.accepted[2]);\r\n const start = (ArcMethod.CenterStart === this.method ? this.accepted[1] : this.accepted[0]);\r\n const end = (ArcMethod.StartEndMid === this.method ? this.accepted[1] : final);\r\n\r\n switch (this.method) {\r\n case ArcMethod.CenterStart:\r\n case ArcMethod.StartCenter:\r\n let center = (ArcMethod.CenterStart === this.method ? this.accepted[0] : this.accepted[1]);\r\n if (center.isAlmostEqual(start))\r\n return undefined; // Don't create 0 radius arc...\r\n\r\n const vector0 = Vector3d.createStartEnd(center, start);\r\n const vector90 = Vector3d.create();\r\n const radius = (this.useRadius ? this.radius : vector0.magnitude());\r\n const sweep = Angle.createRadians(this.useSweep ? this.sweep : Angle.pi2Radians);\r\n\r\n if (this.useRadius) {\r\n if (ArcMethod.StartCenter === this.method) {\r\n vector0.normalizeInPlace();\r\n center = start.plusScaled(vector0, -radius);\r\n }\r\n } else {\r\n this.radius = radius;\r\n }\r\n\r\n let defaultArc = (undefined !== this.current && \"arc\" === this.current.curvePrimitiveType ? this.current as Arc3d : undefined);\r\n if (undefined === defaultArc) {\r\n this.getUpVector(ev).crossProduct(vector0, vector90);\r\n vector0.scaleToLength(radius, vector0);\r\n vector90.scaleToLength(radius, vector90);\r\n\r\n // Create default arc that follows continuation path start/end tangent...\r\n if (undefined !== this.continuationData) {\r\n const pathS = this.continuationData.path.children[0].startPoint();\r\n\r\n if (start.isAlmostEqual(pathS)) {\r\n const tangentS = this.continuationData.path.children[0].fractionToPointAndUnitTangent(0.0);\r\n\r\n if (vector90.dotProduct(tangentS.direction) > 0.0)\r\n sweep.setRadians(-sweep.radians);\r\n } else {\r\n const tangentE = this.continuationData.path.children[this.continuationData.path.children.length - 1].fractionToPointAndUnitTangent(1.0);\r\n\r\n if (vector90.dotProduct(tangentE.direction) < 0.0)\r\n sweep.setRadians(-sweep.radians);\r\n }\r\n }\r\n\r\n defaultArc = Arc3d.create(center, vector0, vector90, AngleSweep.create(sweep));\r\n }\r\n\r\n // Don't have well defined minor axis, continue using previous or default arc...\r\n if (start.isAlmostEqual(end))\r\n return defaultArc;\r\n\r\n const prevSweep = Angle.createRadians(defaultArc.sweep.sweepRadians);\r\n Vector3d.createStartEnd(center, end, vector90);\r\n sweep.setFrom(vector0.planarAngleTo(vector90, defaultArc.perpendicularVector));\r\n\r\n defaultArc.perpendicularVector.crossProduct(vector0, vector90);\r\n vector0.scaleToLength(radius, vector0);\r\n vector90.scaleToLength(radius, vector90);\r\n\r\n if (Math.abs(sweep.radians) < Angle.createDegrees(30.0).radians && prevSweep.isFullCircle && ((sweep.radians < 0.0 && prevSweep.radians > 0.0) || (sweep.radians > 0.0 && prevSweep.radians < 0.0)))\r\n prevSweep.setRadians(-prevSweep.radians); // Reverse direction...\r\n\r\n if (sweep.isAlmostZero)\r\n sweep.setDegrees(prevSweep.radians < 0.0 ? -360.0 : 360.0); // Create full sweep...\r\n\r\n if (this.useSweep) {\r\n if ((sweep.radians < 0.0 && this.sweep > 0.0) || (sweep.radians > 0.0 && this.sweep < 0.0))\r\n sweep.setRadians(-this.sweep);\r\n else\r\n sweep.setRadians(this.sweep);\r\n } else {\r\n if (sweep.radians < 0.0 && prevSweep.radians > 0.0)\r\n sweep.setRadians(Angle.pi2Radians + sweep.radians);\r\n else if (sweep.radians > 0.0 && prevSweep.radians < 0.0)\r\n sweep.setRadians(-(Angle.pi2Radians - sweep.radians));\r\n\r\n this.sweep = sweep.radians;\r\n }\r\n\r\n if (!this.useRadius || !this.useSweep)\r\n this.syncToolSettingsRadiusAndSweep();\r\n\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.create(sweep));\r\n\r\n case ArcMethod.StartMidEnd:\r\n case ArcMethod.StartEndMid:\r\n const mid = (ArcMethod.StartEndMid === this.method ? final : this.accepted[1]);\r\n return Arc3d.createCircularStartMiddleEnd(start, mid, end);\r\n }\r\n }\r\n\r\n private syncToolSettingsRadiusAndSweep(): void {\r\n switch (this.method) {\r\n case ArcMethod.CenterStart:\r\n case ArcMethod.StartCenter:\r\n if (this.useRadius && this.useSweep)\r\n return;\r\n break;\r\n\r\n default:\r\n return;\r\n }\r\n\r\n const syncData: DialogPropertySyncItem[] = [];\r\n\r\n if (!this.useRadius)\r\n syncData.push(this.radiusProperty.syncItem);\r\n\r\n if (!this.useSweep)\r\n syncData.push(this.sweepProperty.syncItem);\r\n\r\n if (0 !== syncData.length)\r\n this.syncToolSettingsProperties(syncData);\r\n }\r\n\r\n protected override getToolSettingPropertyLocked(property: DialogProperty<any>): DialogProperty<any> | undefined {\r\n if (property === this.useRadiusProperty)\r\n return this.radiusProperty;\r\n else if (property === this.useSweepProperty)\r\n return this.sweepProperty;\r\n return undefined;\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n if (!this.changeToolSettingPropertyValue(updatedValue))\r\n return false;\r\n\r\n if (this.methodProperty.name === updatedValue.propertyName)\r\n await this.onReinitialize();\r\n else if (updatedValue.propertyName === this.radiusProperty.name && ArcMethod.StartCenter === this.method && this.useRadius && 2 === this.accepted.length)\r\n await this.onUndoPreviousStep(); // If radius is changed when creating arc by start/center after center has been defined, back up a step to defined a new center point...\r\n\r\n return true;\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n const toolSettings = new Array<DialogItem>();\r\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 }));\r\n\r\n if (ArcMethod.CenterStart === this.method || ArcMethod.StartCenter === this.method) {\r\n // ensure controls are enabled/disabled base on current lock property state\r\n this.radiusProperty.isDisabled = !this.useRadius;\r\n this.sweepProperty.isDisabled = !this.useSweep;\r\n const useRadiusLock = this.useRadiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 });\r\n const useSweepLock = this.useSweepProperty.toDialogItem({ rowPriority: 3, columnIndex: 0 });\r\n toolSettings.push(this.radiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }, useRadiusLock));\r\n toolSettings.push(this.sweepProperty.toDialogItem({ rowPriority: 3, columnIndex: 1 }, useSweepLock));\r\n }\r\n return toolSettings;\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new CreateArcTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> {\r\n if (!await super.onInstall())\r\n return false;\r\n\r\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\r\n this.initializeToolSettingPropertyValues([this.methodProperty, this.radiusProperty, this.useRadiusProperty, this.sweepProperty, this.useSweepProperty]);\r\n\r\n if (!this.radius)\r\n this.useRadius = false;\r\n\r\n if (!this.sweep)\r\n this.useSweep = false;\r\n\r\n return true;\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `method=0|1|2|3` How arc will be defined. 0 for center/start, 1 for start/center, 2 for start/mid/end, and 3 for start/end/mid.\r\n * - `radius=number` Arc radius for start/center or center/start, 0 to define by points.\r\n * - `sweep=number` Arc sweep angle in degrees for start/center or center/start, 0 to define by points.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n let arcMethod;\r\n let arcRadius;\r\n let arcSweep;\r\n\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"me\")) {\r\n const method = Number.parseInt(parts[1], 10);\r\n if (!Number.isNaN(method)) {\r\n switch (method) {\r\n case 0:\r\n arcMethod = ArcMethod.CenterStart;\r\n break;\r\n case 1:\r\n arcMethod = ArcMethod.StartCenter;\r\n break;\r\n case 2:\r\n arcMethod = ArcMethod.StartMidEnd;\r\n break;\r\n case 3:\r\n arcMethod = ArcMethod.StartEndMid;\r\n break;\r\n }\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"ra\")) {\r\n const radius = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(radius)) {\r\n arcRadius = radius;\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"sw\")) {\r\n const sweep = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(sweep)) {\r\n arcSweep = Angle.createDegrees(sweep).radians;\r\n }\r\n }\r\n }\r\n\r\n // Update current session values so keyin args are picked up for tool settings/restart...\r\n if (undefined !== arcMethod)\r\n this.saveToolSettingPropertyValue(this.methodProperty, { value: arcMethod });\r\n\r\n if (undefined !== arcRadius) {\r\n if (0.0 !== arcRadius)\r\n this.saveToolSettingPropertyValue(this.radiusProperty, { value: arcRadius });\r\n this.saveToolSettingPropertyValue(this.useRadiusProperty, { value: 0.0 !== arcRadius });\r\n }\r\n\r\n if (undefined !== arcSweep) {\r\n if (0.0 !== arcSweep)\r\n this.saveToolSettingPropertyValue(this.sweepProperty, { value: arcSweep });\r\n this.saveToolSettingPropertyValue(this.useSweepProperty, { value: 0.0 !== arcSweep });\r\n }\r\n\r\n return this.run();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport enum CircleMethod {\r\n Center = 0,\r\n Edge = 1,\r\n}\r\n\r\n/** @alpha Creates a circle. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\r\nexport class CreateCircleTool extends CreateOrContinuePathTool {\r\n public static override toolId = \"CreateCircle\";\r\n public static override iconSpec = \"icon-circle\";\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 2; } // method, radius - zero value unlocks associated \"use\" toggle...\r\n\r\n protected override get showCurveConstructions(): boolean { return !(CircleMethod.Center === this.method && this.useRadius); }\r\n\r\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\r\n const nPts = this.accepted.length;\r\n\r\n switch (this.method) {\r\n case CircleMethod.Center:\r\n mainInstrText = EditTools.translate(0 === nPts ? \"CreateCircle.Prompts.CenterPoint\" : \"CreateCircle.Prompts.EdgePoint\");\r\n break;\r\n\r\n case CircleMethod.Edge:\r\n mainInstrText = EditTools.translate(0 === nPts ? \"CreateCircle.Prompts.EdgePoint\" : \"CreateCircle.Prompts.CenterPoint\");\r\n break;\r\n }\r\n\r\n super.provideToolAssistance(mainInstrText, additionalInstr);\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n const nPts = this.accepted.length;\r\n if (0 === nPts)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n\r\n if (this.wantSmartRotation)\r\n hints.enableSmartRotation = true;\r\n\r\n if (CircleMethod.Center === this.method && 1 === this.accepted.length) {\r\n hints.setOrigin(this.accepted[0]);\r\n hints.setOriginFixed = true;\r\n hints.setModePolar();\r\n }\r\n\r\n hints.sendHints();\r\n }\r\n\r\n private static methodMessage(str: string) { return EditTools.translate(`CreateCircle.Method.${str}`); }\r\n private static getMethodChoices = (): EnumerationChoice[] => {\r\n return [\r\n { label: CreateCircleTool.methodMessage(\"Center\"), value: CircleMethod.Center },\r\n { label: CreateCircleTool.methodMessage(\"Edge\"), value: CircleMethod.Edge },\r\n ];\r\n };\r\n\r\n private _methodProperty: DialogProperty<number> | undefined;\r\n public get methodProperty() {\r\n if (!this._methodProperty)\r\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\r\n \"circleMethod\", EditTools.translate(\"CreateCircle.Label.Method\"), CreateCircleTool.getMethodChoices()), CircleMethod.Center as number);\r\n return this._methodProperty;\r\n }\r\n\r\n public get method(): CircleMethod { return this.methodProperty.value as CircleMethod; }\r\n public set method(method: CircleMethod) { this.methodProperty.value = method; }\r\n\r\n private _useRadiusProperty: DialogProperty<boolean> | undefined;\r\n public get useRadiusProperty() {\r\n if (!this._useRadiusProperty)\r\n this._useRadiusProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useCircleRadius\"), false);\r\n return this._useRadiusProperty;\r\n }\r\n\r\n public get useRadius(): boolean { return this.useRadiusProperty.value; }\r\n public set useRadius(value: boolean) { this.useRadiusProperty.value = value; }\r\n\r\n private _radiusProperty: DialogProperty<number> | undefined;\r\n public get radiusProperty() {\r\n if (!this._radiusProperty)\r\n this._radiusProperty = new DialogProperty<number>(new LengthDescription(\"circleRadius\", EditTools.translate(\"CreateCircle.Label.Radius\")), 0.1, undefined, !this.useRadius);\r\n return this._radiusProperty;\r\n }\r\n\r\n public get radius(): number { return this.radiusProperty.value; }\r\n public set radius(value: number) { this.radiusProperty.value = value; }\r\n\r\n protected override isComplete(_ev: BeButtonEvent): boolean {\r\n if (CircleMethod.Center === this.method && this.useRadius)\r\n return (this.accepted.length >= 1); // Could be 2 if radius locked after 1st data point...\r\n return (2 === this.accepted.length);\r\n }\r\n\r\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\r\n this.isClosed = true; // Always closed...\r\n\r\n const numRequired = (isDynamics ? 1 : 2);\r\n if (this.accepted.length < numRequired) {\r\n if (CircleMethod.Center === this.method && this.useRadius)\r\n return Arc3d.createCenterNormalRadius(isDynamics ? ev.point : this.accepted[0], this.getUpVector(ev), this.radius);\r\n return undefined;\r\n }\r\n\r\n const pt1 = this.accepted[0];\r\n const pt2 = (isDynamics ? ev.point : this.accepted[1]);\r\n\r\n let center = (CircleMethod.Center === this.method ? pt1 : pt2);\r\n const edge = (CircleMethod.Center === this.method ? pt2 : pt1);\r\n\r\n const normal = this.getUpVector(ev);\r\n const vector0 = Vector3d.createStartEnd(center, edge);\r\n const vector90 = normal.crossProduct(vector0);\r\n const radius = (this.useRadius ? this.radius : vector0.magnitude());\r\n\r\n if (this.useRadius) {\r\n if (CircleMethod.Edge === this.method) {\r\n vector0.normalizeInPlace();\r\n center = edge.plusScaled(vector0, -radius);\r\n }\r\n } else {\r\n this.radius = radius;\r\n this.syncToolSettingPropertyValue(this.radiusProperty);\r\n }\r\n\r\n vector0.scaleToLength(radius, vector0);\r\n vector90.scaleToLength(radius, vector90);\r\n\r\n return Arc3d.create(center, vector0, vector90);\r\n }\r\n\r\n protected override async cancelPoint(_ev: BeButtonEvent): Promise<boolean> {\r\n if (CircleMethod.Center === this.method && this.useRadius) {\r\n // Exit instead of restarting to avoid having circle \"stuck\" on cursor...\r\n await this.exitTool();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n protected override getToolSettingPropertyLocked(property: DialogProperty<any>): DialogProperty<any> | undefined {\r\n return (property === this.useRadiusProperty ? this.radiusProperty : undefined);\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n if (!this.changeToolSettingPropertyValue(updatedValue))\r\n return false;\r\n\r\n if (this.methodProperty.name === updatedValue.propertyName)\r\n await this.onReinitialize();\r\n else if (updatedValue.propertyName === this.useRadiusProperty.name && CircleMethod.Center === this.method && this.useRadius && 0 === this.accepted.length)\r\n await this.onReinitialize();\r\n\r\n return true;\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n const toolSettings = new Array<DialogItem>();\r\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 }));\r\n\r\n // ensure controls are enabled/disabled base on current lock property state\r\n this.radiusProperty.isDisabled = !this.useRadius;\r\n const useRadiusLock = this.useRadiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 });\r\n toolSettings.push(this.radiusProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }, useRadiusLock));\r\n\r\n return toolSettings;\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new CreateCircleTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n public override async onReinitialize(): Promise<void> {\r\n if (CircleMethod.Center === this.method && this.useRadius) {\r\n // Don't install a new tool instance, we want to preserve current AccuDraw state...\r\n this.accepted.length = 0;\r\n this.setupAndPromptForNextAction();\r\n this.beginDynamics();\r\n return;\r\n }\r\n return super.onReinitialize();\r\n }\r\n\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n if (CircleMethod.Center === this.method && this.useRadius) {\r\n // Start dynamics before 1st data point when placing by center w/locked radius value.\r\n // Require the user to explicitly enable AccuDraw so that the compass location can be adjusted for changes\r\n // to locks or view ACS (as opposed to appearing at it's previous or default location).\r\n AccuDrawHintBuilder.deactivate();\r\n this.beginDynamics();\r\n }\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> {\r\n if (!await super.onInstall())\r\n return false;\r\n\r\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\r\n this.initializeToolSettingPropertyValues([this.methodProperty, this.radiusProperty, this.useRadiusProperty]);\r\n\r\n if (!this.radius)\r\n this.useRadius = false;\r\n\r\n return true;\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `method=0|1` How circle will be defined. 0 for center, 1 for edge.\r\n * - `radius=number` Circle radius, 0 to define by points.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n let circleMethod;\r\n let circleRadius;\r\n\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"me\")) {\r\n const method = Number.parseInt(parts[1], 10);\r\n if (!Number.isNaN(method)) {\r\n switch (method) {\r\n case 0:\r\n circleMethod = CircleMethod.Center;\r\n break;\r\n case 1:\r\n circleMethod = CircleMethod.Edge;\r\n break;\r\n }\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"ra\")) {\r\n const radius = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(radius)) {\r\n circleRadius = radius;\r\n }\r\n }\r\n }\r\n\r\n // Update current session values so keyin args are picked up for tool settings/restart...\r\n if (undefined !== circleMethod)\r\n this.saveToolSettingPropertyValue(this.methodProperty, { value: circleMethod });\r\n\r\n if (undefined !== circleRadius) {\r\n if (0.0 !== circleRadius)\r\n this.saveToolSettingPropertyValue(this.radiusProperty, { value: circleRadius });\r\n this.saveToolSettingPropertyValue(this.useRadiusProperty, { value: 0.0 !== circleRadius });\r\n }\r\n\r\n return this.run();\r\n }\r\n}\r\n\r\n/** @alpha Creates an ellipse. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\r\nexport class CreateEllipseTool extends CreateOrContinuePathTool {\r\n public static override toolId = \"CreateEllipse\";\r\n public static override iconSpec = \"icon-ellipse\";\r\n\r\n protected override isComplete(_ev: BeButtonEvent): boolean {\r\n return (3 === this.accepted.length);\r\n }\r\n\r\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\r\n const nPts = this.accepted.length;\r\n\r\n switch (nPts) {\r\n case 0:\r\n mainInstrText = EditTools.translate(\"CreateEllipse.Prompts.CenterPoint\");\r\n break;\r\n\r\n case 1:\r\n mainInstrText = EditTools.translate(\"CreateEllipse.Prompts.MajorAxis\");\r\n break;\r\n\r\n case 2:\r\n mainInstrText = EditTools.translate(\"CreateEllipse.Prompts.MinorAxis\");\r\n break;\r\n }\r\n\r\n super.provideToolAssistance(mainInstrText, additionalInstr);\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n const nPts = this.accepted.length;\r\n if (0 === nPts)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n\r\n if (this.wantSmartRotation)\r\n hints.enableSmartRotation = true;\r\n\r\n switch (nPts) {\r\n case 1:\r\n hints.setOrigin(this.accepted[0]);\r\n hints.setOriginFixed = true;\r\n break;\r\n case 2:\r\n hints.setXAxis(Vector3d.createStartEnd(this.accepted[0], this.accepted[1]));\r\n hints.setLockX = true;\r\n break;\r\n }\r\n\r\n hints.sendHints();\r\n }\r\n\r\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\r\n const numRequired = (isDynamics ? 2 : 3);\r\n if (this.accepted.length < numRequired) {\r\n if (this.accepted.length < (numRequired - 1))\r\n return undefined;\r\n this.isConstruction = true; // Create construction geometry to show major axis...\r\n return LineString3d.create([this.accepted[0], (isDynamics ? ev.point : this.accepted[1])]);\r\n }\r\n\r\n this.isClosed = true; // Always closed...\r\n\r\n const center = this.accepted[0];\r\n const major = this.accepted[1];\r\n\r\n const normal = this.getUpVector(ev);\r\n const vector0 = Vector3d.createStartEnd(center, major);\r\n const vector90 = normal.crossProduct(vector0);\r\n\r\n const dir = Ray3d.create(center, vector90);\r\n const minor = dir.projectPointToRay(isDynamics ? ev.point : this.accepted[2]);\r\n\r\n vector90.scaleToLength(center.distance(minor), vector90);\r\n\r\n return Arc3d.create(center, vector0, vector90);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new CreateEllipseTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Creates a rectangle by corner points. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\r\nexport class CreateRectangleTool extends CreateOrContinuePathTool {\r\n public static override toolId = \"CreateRectangle\";\r\n public static override iconSpec = \"icon-rectangle\";\r\n\r\n protected localToWorld = Transform.createIdentity();\r\n protected originLocal?: Point3d;\r\n protected cornerLocal?: Point3d;\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 1; } // radius - zero value unlocks associated \"use\" toggle...\r\n\r\n protected override provideToolAssistance(mainInstrText?: string, additionalInstr?: ToolAssistanceInstruction[]): void {\r\n mainInstrText = CoreTools.translate(0 === this.accepted.length ? \"ElementSet.Prompts.StartCorner\" : \"ElementSet.Prompts.OppositeCorner\");\r\n super.provideToolAssistance(mainInstrText, additionalInstr);\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n const nPts = this.accepted.length;\r\n if (0 === nPts)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n\r\n if (this.wantSmartRotation)\r\n hints.enableSmartRotation = true;\r\n\r\n hints.setOrigin(this.accepted[0]);\r\n hints.sendHints();\r\n }\r\n\r\n private _useRadiusProperty: DialogProperty<boolean> | undefined;\r\n public get useRadiusProperty() {\r\n if (!this._useRadiusProperty)\r\n this._useRadiusProperty = new DialogProperty<boolean>(PropertyDescriptionHelper.buildLockPropertyDescription(\"useCornerRadius\"), false);\r\n return this._useRadiusProperty;\r\n }\r\n\r\n public get useRadius(): boolean { return this.useRadiusProperty.value; }\r\n public set useRadius(value: boolean) { this.useRadiusProperty.value = value; }\r\n\r\n private _radiusProperty: DialogProperty<number> | undefined;\r\n public get radiusProperty() {\r\n if (!this._radiusProperty)\r\n this._radiusProperty = new DialogProperty<number>(new LengthDescription(\"cornerRadius\", EditTools.translate(\"CreateRectangle.Label.CornerRadius\")), 0.1, undefined, !this.useRadius);\r\n return this._radiusProperty;\r\n }\r\n\r\n public get radius(): number { return this.radiusProperty.value; }\r\n public set radius(value: number) { this.radiusProperty.value = value; }\r\n\r\n protected override isComplete(_ev: BeButtonEvent): boolean {\r\n return (2 === this.accepted.length);\r\n }\r\n\r\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\r\n const numRequired = (isDynamics ? 1 : 2);\r\n if (this.accepted.length < numRequired)\r\n return undefined;\r\n\r\n const origin = this.accepted[0];\r\n const corner = (isDynamics ? ev.point : this.accepted[1]);\r\n const matrix = this.getCurrentRotation(ev);\r\n\r\n Transform.createOriginAndMatrix(Point3d.createZero(), matrix, this.localToWorld);\r\n\r\n this.originLocal = this.localToWorld.multiplyInversePoint3d(origin);\r\n this.cornerLocal = this.localToWorld.multiplyInversePoint3d(corner);\r\n\r\n if (undefined === this.originLocal || undefined === this.cornerLocal)\r\n return undefined;\r\n\r\n const shapePts: Point3d[] = [];\r\n\r\n shapePts[0] = Point3d.create(this.originLocal.x, this.originLocal.y, this.originLocal.z);\r\n shapePts[1] = Point3d.create(this.cornerLocal.x, this.originLocal.y, this.cornerLocal.z);\r\n shapePts[2] = Point3d.create(this.cornerLocal.x, this.cornerLocal.y, this.cornerLocal.z);\r\n shapePts[3] = Point3d.create(this.originLocal.x, this.cornerLocal.y, this.originLocal.z);\r\n shapePts[4] = shapePts[0].clone();\r\n\r\n this.localToWorld.multiplyPoint3dArrayInPlace(shapePts);\r\n this.isClosed = true; // Always closed...\r\n\r\n return LineString3d.create(shapePts);\r\n }\r\n\r\n protected override createNewPath(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined {\r\n if (!this.useRadius || 0.0 === this.radius || undefined === this.originLocal || undefined === this.cornerLocal)\r\n return super.createNewPath(placement);\r\n\r\n const builder = new ElementGeometry.Builder();\r\n builder.setLocalToWorldFromPlacement(placement);\r\n\r\n const loop = CurveFactory.createRectangleXY(this.originLocal.x, this.originLocal.y, this.cornerLocal.x, this.cornerLocal.y, this.originLocal.z, this.radius);\r\n loop.tryTransformInPlace(this.localToWorld);\r\n\r\n if (!builder.appendGeometryQuery(loop))\r\n return;\r\n\r\n return { format: \"flatbuffer\", data: builder.entries };\r\n }\r\n\r\n protected override getToolSettingPropertyLocked(property: DialogProperty<any>): DialogProperty<any> | undefined {\r\n return (property === this.useRadiusProperty ? this.radiusProperty : undefined);\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n return this.changeToolSettingPropertyValue(updatedValue);\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n const toolSettings = new Array<DialogItem>();\r\n\r\n // ensure controls are enabled/disabled base on current lock property state\r\n this.radiusProperty.isDisabled = !this.useRadius;\r\n const useRadiusLock = this.useRadiusProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 });\r\n toolSettings.push(this.radiusProperty.toDialogItem({ rowPriority: 1, columnIndex: 1 }, useRadiusLock));\r\n\r\n return toolSettings;\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new CreateRectangleTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> {\r\n if (!await super.onInstall())\r\n return false;\r\n\r\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\r\n this.initializeToolSettingPropertyValues([this.radiusProperty, this.useRadiusProperty]);\r\n\r\n if (!this.radius)\r\n this.useRadius = false;\r\n\r\n return true;\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `radius=number` Corner radius, 0 for sharp corners.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n let cornerRadius;\r\n\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"ra\")) {\r\n const radius = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(radius)) {\r\n cornerRadius = radius;\r\n }\r\n }\r\n }\r\n\r\n // Update current session values so keyin args are picked up for tool settings/restart...\r\n if (undefined !== cornerRadius) {\r\n if (0.0 !== cornerRadius)\r\n this.saveToolSettingPropertyValue(this.radiusProperty, { value: cornerRadius });\r\n this.saveToolSettingPropertyValue(this.useRadiusProperty, { value: 0.0 !== cornerRadius });\r\n }\r\n\r\n return this.run();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport enum BCurveMethod {\r\n ControlPoints = 0,\r\n ThroughPoints = 1,\r\n}\r\n\r\n/** @alpha Creates a bspline curve by poles or through points. Uses model and category from [[BriefcaseConnection.editorToolSettings]]. */\r\nexport class CreateBCurveTool extends CreateOrContinuePathTool {\r\n public static override toolId = \"CreateBCurve\";\r\n public static override iconSpec = \"icon-snaps-nearest\"; // Need better icon...\r\n\r\n protected _isPhysicallyClosedOrComplete = false;\r\n protected _tangentPhase = CreateCurvePhase.DefineOther;\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 3; } // method, order, tangents...\r\n\r\n protected override get wantPickableDynamics(): boolean { return true; } // Allow snapping to control polygon or through points...\r\n protected override get showCurveConstructions(): boolean { return true; } // Display control polygon or through points...\r\n\r\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\r\n const nPts = this.accepted.length;\r\n let mainMsg;\r\n\r\n if (CreateCurvePhase.DefineOther === this._tangentPhase)\r\n mainMsg = CoreTools.translate(0 === nPts ? \"ElementSet.Prompts.StartPoint\" : \"ElementSet.Inputs.AdditionalPoint\");\r\n else\r\n mainMsg = EditTools.translate(CreateCurvePhase.DefineStart === this._tangentPhase ? \"CreateBCurve.Prompts.StartTangent\" : \"CreateBCurve.Prompts.EndTangent\");\r\n\r\n const leftMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\r\n const rightMsg = CoreTools.translate(CreateCurvePhase.DefineOther === this._tangentPhase && nPts >= this.requiredPointCount ? \"ElementSet.Inputs.Complete\" : \"ElementSet.Inputs.Cancel\");\r\n\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, leftMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, leftMsg, false, ToolAssistanceInputMethod.Mouse));\r\n\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rightMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rightMsg, false, ToolAssistanceInputMethod.Mouse));\r\n\r\n const sections: ToolAssistanceSection[] = [];\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, mainMsg);\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n\r\n private static methodMessage(str: string) { return EditTools.translate(`CreateBCurve.Method.${str}`); }\r\n private static getMethodChoices = (): EnumerationChoice[] => {\r\n return [\r\n { label: CreateBCurveTool.methodMessage(\"ControlPoints\"), value: BCurveMethod.ControlPoints },\r\n { label: CreateBCurveTool.methodMessage(\"ThroughPoints\"), value: BCurveMethod.ThroughPoints },\r\n ];\r\n };\r\n\r\n private _methodProperty: DialogProperty<number> | undefined;\r\n public get methodProperty() {\r\n if (!this._methodProperty)\r\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\r\n \"bcurveMethod\", EditTools.translate(\"CreateBCurve.Label.Method\"), CreateBCurveTool.getMethodChoices()), BCurveMethod.ControlPoints as number);\r\n return this._methodProperty;\r\n }\r\n\r\n public get method(): BCurveMethod { return this.methodProperty.value as BCurveMethod; }\r\n public set method(method: BCurveMethod) { this.methodProperty.value = method; }\r\n\r\n private _orderProperty: DialogProperty<number> | undefined;\r\n public get orderProperty() {\r\n if (!this._orderProperty)\r\n this._orderProperty = new DialogProperty<number>(\r\n PropertyDescriptionHelper.buildNumberEditorDescription(\"bcurveOrder\", EditTools.translate(\"CreateBCurve.Label.Order\"),\r\n { type: PropertyEditorParamTypes.Range, minimum: this.minOrder, maximum: this.maxOrder } as RangeEditorParams), 3);\r\n return this._orderProperty;\r\n }\r\n\r\n public get order(): number { return this.orderProperty.value; }\r\n public set order(value: number) { this.orderProperty.value = value; }\r\n\r\n protected get minOrder(): number { return 2; }\r\n protected get maxOrder(): number { return 16; }\r\n\r\n private _tangentsProperty: DialogProperty<boolean> | undefined;\r\n public get tangentsProperty() {\r\n if (!this._tangentsProperty)\r\n this._tangentsProperty = new DialogProperty<boolean>(\r\n PropertyDescriptionHelper.buildToggleDescription(\"bcurveTangents\", EditTools.translate(\"CreateBCurve.Label.Tangents\")), false);\r\n return this._tangentsProperty;\r\n }\r\n\r\n public get tangents(): boolean { return this.tangentsProperty.value; }\r\n public set tangents(value: boolean) { this.tangentsProperty.value = value; }\r\n\r\n protected override get wantClosure(): boolean {\r\n // A bcurve can support physical closure when creating a new path...\r\n return this.allowClosure;\r\n }\r\n\r\n protected get requiredPointCount(): number {\r\n if (BCurveMethod.ThroughPoints === this.method)\r\n return 3; // Interpolation curve is always order 4 with 3 point minimum...\r\n\r\n return this.order;\r\n }\r\n\r\n protected override get createCurvePhase(): CreateCurvePhase {\r\n if (CreateCurvePhase.DefineOther !== this._tangentPhase)\r\n return CreateCurvePhase.DefineOther;\r\n\r\n return super.createCurvePhase;\r\n }\r\n\r\n protected override updateCurvePhase(): void {\r\n // The first point changes startPoint and last point changes endPoint.\r\n this._createCurvePhase = (0 === this.accepted.length ? CreateCurvePhase.DefineStart : CreateCurvePhase.DefineEnd);\r\n }\r\n\r\n protected override isComplete(ev: BeButtonEvent): boolean {\r\n // Accept on reset with sufficient points...\r\n if (BeButton.Reset === ev.button)\r\n return (this.accepted.length >= this.requiredPointCount);\r\n\r\n // Allow data to complete on physical closure...\r\n return this.isClosed || this._isPhysicallyClosedOrComplete;\r\n }\r\n\r\n protected override showConstructionGraphics(ev: BeButtonEvent, context: DynamicsContext): boolean {\r\n if (CreateCurvePhase.DefineOther !== this._tangentPhase && this.current) {\r\n const fitCurve = this.current as InterpolationCurve3d;\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n const color = context.viewport.getContrastToBackgroundColor();\r\n\r\n builder.setSymbology(color, ColorDef.black, 1, LinePixels.Code2);\r\n builder.addLineString([ev.point, fitCurve.options.fitPoints[CreateCurvePhase.DefineStart === this._tangentPhase ? 0 : fitCurve.options.fitPoints.length - 1]]);\r\n\r\n builder.setSymbology(color, ColorDef.black, 8);\r\n builder.addPointString([ev.point]);\r\n\r\n context.addGraphic(builder.finish());\r\n }\r\n\r\n return super.showConstructionGraphics(ev, context);\r\n }\r\n\r\n protected createNewCurvePrimitive(ev: BeButtonEvent, isDynamics: boolean): CurvePrimitive | undefined {\r\n if (CreateCurvePhase.DefineOther !== this._tangentPhase && this.current) {\r\n const fitCurve = this.current as InterpolationCurve3d;\r\n\r\n if (CreateCurvePhase.DefineStart === this._tangentPhase) {\r\n const tangentS = Vector3d.createStartEnd(ev.point, fitCurve.options.fitPoints[0]);\r\n if (tangentS.magnitude() > Geometry.smallMetricDistance)\r\n fitCurve.options.startTangent = tangentS;\r\n } else {\r\n const tangentE = Vector3d.createStartEnd(ev.point, fitCurve.options.fitPoints[fitCurve.options.fitPoints.length - 1]);\r\n if (tangentE.magnitude() > Geometry.smallMetricDistance)\r\n fitCurve.options.endTangent = tangentE;\r\n }\r\n\r\n return fitCurve;\r\n }\r\n\r\n // Don't include current point if it's the same as the last accepted point, want dynamics to show an accurate preview of what reset will accept...\r\n const includeCurrPt = (isDynamics && (0 === this.accepted.length || !ev.point.isAlmostEqual(this.accepted[this.accepted.length - 1])));\r\n const pts = (includeCurrPt ? [...this.accepted, ev.point] : this.accepted);\r\n const numRequired = this.requiredPointCount;\r\n\r\n if (pts.length < numRequired) {\r\n // Create point/linestring construction geometry to support join...\r\n this.isConstruction = true;\r\n return LineString3d.create(1 === pts.length ? [pts[0], pts[0]] : pts);\r\n }\r\n\r\n // Create periodic-looking curve on physical closure with sufficient points even when not creating a loop/surface...\r\n this._isPhysicallyClosedOrComplete = (undefined === this.continuationData && pts[0].isAlmostEqual(pts[pts.length - 1]));\r\n\r\n if (BCurveMethod.ControlPoints === this.method) {\r\n if (this._isPhysicallyClosedOrComplete && this.order > 2) {\r\n const tmpPts = pts.slice(undefined, -1); // Don't include closure point...\r\n return BSplineCurve3d.createPeriodicUniformKnots(tmpPts, this.order);\r\n }\r\n\r\n return BSplineCurve3d.createUniformKnots(pts, this.order);\r\n }\r\n\r\n const interpProps: InterpolationCurve3dProps = { fitPoints: pts, closed: this._isPhysicallyClosedOrComplete, isChordLenKnots: 1, isColinearTangents: 1 };\r\n\r\n // Create interpolation curve tangent to continuation curve...\r\n if (undefined !== this.continuationData && this.tangents) {\r\n const tangentS = this.continuationData.path.children[0].fractionToPointAndUnitTangent(0.0);\r\n const tangentE = this.continuationData.path.children[this.continuationData.path.children.length - 1].fractionToPointAndUnitTangent(1.0);\r\n\r\n if (pts[0].isAlmostEqual(tangentS.origin))\r\n interpProps.startTangent = tangentS.direction.scale(-1);\r\n else if (pts[0].isAlmostEqual(tangentE.origin))\r\n interpProps.startTangent = tangentE.direction;\r\n\r\n if (pts[pts.length - 1].isAlmostEqual(tangentS.origin))\r\n interpProps.endTangent = tangentS.direction.scale(-1);\r\n else if (pts[pts.length - 1].isAlmostEqual(tangentE.origin))\r\n interpProps.endTangent = tangentE.direction;\r\n\r\n this._isPhysicallyClosedOrComplete = (undefined !== interpProps.startTangent && undefined !== interpProps.endTangent);\r\n }\r\n\r\n const interpOpts = InterpolationCurve3dOptions.create(interpProps);\r\n\r\n return InterpolationCurve3d.createCapture(interpOpts);\r\n }\r\n\r\n protected override getSnapGeometry(): GeometryQuery | undefined {\r\n // Only snap to through points...\r\n if (BCurveMethod.ThroughPoints === this.method)\r\n return (this.accepted.length > 1 ? PointString3d.create(this.accepted) : undefined);\r\n\r\n return super.getSnapGeometry();\r\n }\r\n\r\n protected override async acceptPoint(ev: BeButtonEvent): Promise<boolean> {\r\n switch (this._tangentPhase) {\r\n case CreateCurvePhase.DefineOther:\r\n return super.acceptPoint(ev);\r\n\r\n case CreateCurvePhase.DefineStart:\r\n this._tangentPhase = CreateCurvePhase.DefineEnd;\r\n break;\r\n\r\n case CreateCurvePhase.DefineEnd:\r\n this._isPhysicallyClosedOrComplete = true;\r\n break;\r\n }\r\n\r\n await this.updateCurveAndContinuationData(ev, false);\r\n return true;\r\n }\r\n\r\n protected override async cancelPoint(ev: BeButtonEvent): Promise<boolean> {\r\n // NOTE: Starting another tool will not create element...require reset or closure...\r\n if (this.isComplete(ev)) {\r\n if (BCurveMethod.ThroughPoints === this.method && this.tangents && this.current) {\r\n const fitCurve = this.current as InterpolationCurve3d;\r\n\r\n switch (this._tangentPhase) {\r\n case CreateCurvePhase.DefineOther:\r\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\r\n await this.updateCurveAndContinuationData(ev, false);\r\n this._tangentPhase = (undefined === fitCurve.options.startTangent ? CreateCurvePhase.DefineStart : CreateCurvePhase.DefineEnd);\r\n IModelApp.toolAdmin.updateDynamics();\r\n this.setupAndPromptForNextAction();\r\n return false;\r\n\r\n case CreateCurvePhase.DefineStart:\r\n fitCurve.options.startTangent = undefined; // Not accepted, compute default start tangent...\r\n this._tangentPhase = CreateCurvePhase.DefineEnd;\r\n IModelApp.toolAdmin.updateDynamics();\r\n this.setupAndPromptForNextAction();\r\n return false;\r\n\r\n case CreateCurvePhase.DefineEnd:\r\n fitCurve.options.endTangent = undefined; // Not accepted, compute default end tangent...\r\n await this.createElement();\r\n return true;\r\n }\r\n }\r\n\r\n this._createCurvePhase = CreateCurvePhase.DefineEnd;\r\n await this.updateCurveAndContinuationData(ev, false);\r\n await this.createElement();\r\n }\r\n return true;\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n if (!this.changeToolSettingPropertyValue(updatedValue))\r\n return false;\r\n\r\n if (this.methodProperty.name === updatedValue.propertyName)\r\n await this.onReinitialize();\r\n\r\n return true;\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n const toolSettings = new Array<DialogItem>();\r\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 }));\r\n if (BCurveMethod.ThroughPoints === this.method)\r\n toolSettings.push(this.tangentsProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 }));\r\n else\r\n toolSettings.push(this.orderProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }));\r\n return toolSettings;\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new CreateBCurveTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> {\r\n if (!await super.onInstall())\r\n return false;\r\n\r\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\r\n this.initializeToolSettingPropertyValues([this.methodProperty, this.orderProperty, this.tangentsProperty]);\r\n\r\n return true;\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `method=0|1` How bcurve will be defined. 0 for control points, 1 for through points.\r\n * - `order=number` bcurve order from 2 to 16.\r\n * - 'tangents=0|1 Whether to specify start/end tangents for through points construction.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n let bcurveMethod;\r\n let bcurveOrder;\r\n let bcurveTangents;\r\n\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"me\")) {\r\n const method = Number.parseInt(parts[1], 10);\r\n if (!Number.isNaN(method)) {\r\n switch (method) {\r\n case 0:\r\n bcurveMethod = BCurveMethod.ControlPoints;\r\n break;\r\n case 1:\r\n bcurveMethod = BCurveMethod.ThroughPoints;\r\n break;\r\n }\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"or\")) {\r\n const order = Number.parseInt(parts[1], 10);\r\n if (order >= this.minOrder && order <= this.maxOrder) {\r\n bcurveOrder = order;\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"ta\")) {\r\n const tangents = Number.parseInt(parts[1], 10);\r\n bcurveTangents = (0 !== tangents);\r\n }\r\n }\r\n\r\n // Update current session values so keyin args are picked up for tool settings/restart...\r\n if (undefined !== bcurveMethod)\r\n this.saveToolSettingPropertyValue(this.methodProperty, { value: bcurveMethod });\r\n\r\n if (undefined !== bcurveOrder)\r\n this.saveToolSettingPropertyValue(this.orderProperty, { value: bcurveOrder });\r\n\r\n if (undefined !== bcurveTangents)\r\n this.saveToolSettingPropertyValue(this.tangentsProperty, { value: bcurveTangents });\r\n\r\n return this.run();\r\n }\r\n}\r\n"]}