@itwin/core-frontend 4.1.0-dev.70 → 4.1.0-dev.71

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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Change Log - @itwin/core-frontend
2
2
 
3
- This log was last generated on Tue, 18 Jul 2023 13:47:06 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 24 Jul 2023 12:35:20 GMT and should not be manually modified.
4
+
5
+ ## 4.0.6
6
+ Mon, 24 Jul 2023 05:07:33 GMT
7
+
8
+ _Version update only_
4
9
 
5
10
  ## 4.0.5
6
11
  Tue, 18 Jul 2023 12:21:56 GMT
@@ -224,11 +224,20 @@ export declare class AccuSnap implements Decorator {
224
224
  */
225
225
  reEvaluate(): Promise<void>;
226
226
  }
227
- /** @internal */
227
+ /** TentativeOrAccuSnap returns information about an active snap generated by either [[AccuSnap]] or [[TentativePoint]].
228
+ * @public
229
+ */
228
230
  export declare class TentativeOrAccuSnap {
231
+ /** @return true if AccuSnap is *hot* or TentativePoint is active and snapped to pickable geometry. */
229
232
  static get isHot(): boolean;
233
+ /** Get the current snap from either AccuSnap or TentativePoint.
234
+ * @param checkIsHot true to only return the snap from AccuSnap when it is *hot*.
235
+ * @return The current snap from AccuSnap, TentativePoint, or undefined.
236
+ */
230
237
  static getCurrentSnap(checkIsHot?: boolean): SnapDetail | undefined;
238
+ /** @return The current snap location from AccuSnap or TentativePoint */
231
239
  static getCurrentPoint(): Point3d;
240
+ /** @return The current snap Viewport from AccuSnap or TentativePoint */
232
241
  static getCurrentView(): ScreenViewport | undefined;
233
242
  }
234
243
  /** @public */
@@ -1 +1 @@
1
- {"version":3,"file":"AccuSnap.d.ts","sourceRoot":"","sources":["../../src/AccuSnap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccuSnap.d.ts","sourceRoot":"","sources":["../../src/AccuSnap.ts"],"names":[],"mappings":"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"}
@@ -970,17 +970,25 @@ class AccuSnap {
970
970
  }
971
971
  }
972
972
  exports.AccuSnap = AccuSnap;
973
- /** @internal */
973
+ /** TentativeOrAccuSnap returns information about an active snap generated by either [[AccuSnap]] or [[TentativePoint]].
974
+ * @public
975
+ */
974
976
  class TentativeOrAccuSnap {
977
+ /** @return true if AccuSnap is *hot* or TentativePoint is active and snapped to pickable geometry. */
975
978
  static get isHot() { return IModelApp_1.IModelApp.accuSnap.isHot || IModelApp_1.IModelApp.tentativePoint.isSnapped; }
979
+ /** Get the current snap from either AccuSnap or TentativePoint.
980
+ * @param checkIsHot true to only return the snap from AccuSnap when it is *hot*.
981
+ * @return The current snap from AccuSnap, TentativePoint, or undefined.
982
+ */
976
983
  static getCurrentSnap(checkIsHot = true) {
977
- // Checking for a hot AccuSnap hit before checking tentative is probably necessary for extended intersections?
984
+ // Checking for a hot AccuSnap before checking TentativePoint is done to support extended intersections...
978
985
  if (IModelApp_1.IModelApp.accuSnap.isHot)
979
986
  return IModelApp_1.IModelApp.accuSnap.getCurrSnapDetail();
980
987
  if (IModelApp_1.IModelApp.tentativePoint.isSnapped)
981
988
  return IModelApp_1.IModelApp.tentativePoint.currSnap;
982
989
  return (checkIsHot ? undefined : IModelApp_1.IModelApp.accuSnap.getCurrSnapDetail());
983
990
  }
991
+ /** @return The current snap location from AccuSnap or TentativePoint */
984
992
  static getCurrentPoint() {
985
993
  if (IModelApp_1.IModelApp.accuSnap.isHot) {
986
994
  const snap = IModelApp_1.IModelApp.accuSnap.getCurrSnapDetail();
@@ -989,6 +997,7 @@ class TentativeOrAccuSnap {
989
997
  }
990
998
  return IModelApp_1.IModelApp.tentativePoint.getPoint();
991
999
  }
1000
+ /** @return The current snap Viewport from AccuSnap or TentativePoint */
992
1001
  static getCurrentView() {
993
1002
  const snap = IModelApp_1.IModelApp.accuSnap.getCurrSnapDetail();
994
1003
  return snap ? snap.viewport : IModelApp_1.IModelApp.tentativePoint.viewport;
@@ -1 +1 @@
1
- {"version":3,"file":"AccuSnap.js","sourceRoot":"","sources":["../../src/AccuSnap.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/** @packageDocumentation\r\n * @module LocatingElements\r\n */\r\n\r\nimport { BeDuration, Id64, Id64Arg, Id64Set } from \"@itwin/core-bentley\";\r\nimport { CurveCurve, CurvePrimitive, GeometryQuery, IModelJson as GeomJson, Point2d, Point3d, Vector3d, XAndY } from \"@itwin/core-geometry\";\r\nimport { SnapRequestProps } from \"@itwin/core-common\";\r\nimport { ElementLocateManager, HitListHolder, LocateAction, LocateFilterStatus, LocateResponse, SnapStatus } from \"./ElementLocateManager\";\r\nimport { HitDetail, HitDetailType, HitGeomType, HitList, HitPriority, HitSource, IntersectDetail, SnapDetail, SnapHeat, SnapMode } from \"./HitDetail\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { CanvasDecoration } from \"./render/CanvasDecoration\";\r\nimport { IconSprites, Sprite, SpriteLocation } from \"./Sprites\";\r\nimport { BeButton, BeButtonEvent, BeTouchEvent, InputSource } from \"./tools/Tool\";\r\nimport { ToolSettings } from \"./tools/ToolSettings\";\r\nimport { DecorateContext } from \"./ViewContext\";\r\nimport { Decorator } from \"./ViewManager\";\r\nimport { ScreenViewport, Viewport } from \"./Viewport\";\r\n\r\n// cspell:ignore dont primitivetools\r\n\r\n/** Virtual cursor for using AccuSnap with touch input.\r\n * @internal\r\n */\r\nexport class TouchCursor implements CanvasDecoration {\r\n public position = new Point3d();\r\n public viewport: Viewport;\r\n protected _offsetPosition = new Point3d();\r\n protected _size: number;\r\n protected _yOffset: number;\r\n protected _isSelected = false;\r\n protected _isDragging = false;\r\n protected _inTouchTap = false;\r\n\r\n protected constructor(vp: ScreenViewport) {\r\n this._size = vp.pixelsFromInches(0.3);\r\n this._yOffset = this._size * 1.75;\r\n this.viewport = vp;\r\n }\r\n\r\n protected setPosition(vp: Viewport, worldLocation: Point3d): boolean {\r\n const pointNpc = vp.worldToNpc(worldLocation);\r\n if (pointNpc.z < 0.0 || pointNpc.z > 1.0)\r\n pointNpc.z = 0.5; // move inside frustum.\r\n\r\n const viewLocation = vp.npcToView(pointNpc);\r\n if (!vp.viewRect.containsPoint(viewLocation))\r\n return false; // outside this viewport rect\r\n\r\n viewLocation.x = Math.floor(viewLocation.x) + 0.5;\r\n viewLocation.y = Math.floor(viewLocation.y) + 0.5;\r\n viewLocation.z = 0.0;\r\n const offsetLocation = new Point3d(viewLocation.x, viewLocation.y - this._yOffset, viewLocation.z);\r\n if (!vp.viewRect.containsPoint(offsetLocation))\r\n return false; // outside this viewport rect\r\n\r\n this.position.setFrom(viewLocation);\r\n this._offsetPosition.setFrom(offsetLocation);\r\n if (vp !== this.viewport) {\r\n this.viewport.invalidateDecorations();\r\n this.viewport = vp;\r\n }\r\n vp.invalidateDecorations();\r\n return true;\r\n }\r\n\r\n protected drawHandle(ctx: CanvasRenderingContext2D, filled: boolean): void {\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size, 0);\r\n ctx.bezierCurveTo(-this._size, -this._size * 0.85, -this._size * 0.6, -this._yOffset * 0.6, 0, -this._yOffset * 0.8);\r\n ctx.bezierCurveTo(this._size * 0.6, -this._yOffset * 0.6, this._size, -this._size * 0.85, this._size, 0);\r\n ctx.arc(0, 0, this._size, 0, Math.PI);\r\n if (filled)\r\n ctx.fill();\r\n\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.arc(0, 0, this._size * 0.75, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size * 0.4, 0);\r\n ctx.lineTo(this._size * 0.4, 0);\r\n ctx.moveTo(-this._size * 0.4, this._size * 0.25);\r\n ctx.lineTo(this._size * 0.4, this._size * 0.25);\r\n ctx.stroke();\r\n }\r\n\r\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = \"rgba(0,0,0,.75)\";\r\n ctx.fillStyle = \"white\";\r\n ctx.strokeRect(-2, -(this._yOffset + 2), 5, 5);\r\n ctx.fillRect(-1, -(this._yOffset + 1), 3, 3);\r\n\r\n ctx.lineWidth = 3.5;\r\n ctx.lineCap = \"round\";\r\n ctx.fillStyle = this._isSelected ? \"rgba(35,187,252,.25)\" : \"rgba(255,215,0,.25)\";\r\n ctx.shadowColor = \"black\";\r\n ctx.shadowBlur = 10;\r\n this.drawHandle(ctx, true);\r\n\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeStyle = this._isSelected ? \"rgba(35,187,252,.75)\" : \"rgba(255,215,0,.75)\";\r\n ctx.shadowBlur = 0;\r\n this.drawHandle(ctx, false);\r\n }\r\n\r\n protected isSelected(pt: XAndY): boolean { return this.position.distance(Point3d.create(pt.x, pt.y)) < this._size; }\r\n public isButtonHandled(ev: BeButtonEvent): boolean { return (BeButton.Data === ev.button && InputSource.Touch === ev.inputSource && !this._inTouchTap); }\r\n\r\n public doTouchMove(ev: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n if (!this._isDragging || !this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return true;\r\n }\r\n\r\n public doTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n return (this._isDragging = this.isSelected(startEv.viewPoint));\r\n }\r\n\r\n public doTouchStart(ev: BeTouchEvent): void {\r\n this._isSelected = ev.isSingleTouch && this.isSelected(ev.viewPoint);\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public doTouchEnd(ev: BeTouchEvent): void {\r\n if (this._isDragging && undefined !== ev.viewport)\r\n IModelApp.toolAdmin.currentInputState.fromPoint(ev.viewport, this._offsetPosition, InputSource.Touch); // Current location should reflect virtual cursor offset...\r\n this._isSelected = this._isDragging = false;\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public async doTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return false;\r\n if (!this.isSelected(ev.viewPoint)) {\r\n if (!this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return false;\r\n }\r\n ev.viewPoint = this._offsetPosition;\r\n this._inTouchTap = true;\r\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev);\r\n this._inTouchTap = false;\r\n return true;\r\n }\r\n\r\n public static createFromTouchTap(ev: BeTouchEvent): TouchCursor | undefined {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return undefined;\r\n const touchCursor = new TouchCursor(ev.viewport);\r\n if (!touchCursor.setPosition(ev.viewport, ev.point) && !touchCursor.setPosition(ev.viewport, ev.viewport.view.getCenter()))\r\n return undefined;\r\n ev.viewPoint = touchCursor._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return touchCursor;\r\n }\r\n}\r\n\r\n/** AccuSnap is an aide for snapping to interesting points on elements or decorations as the cursor moves over them.\r\n * @see [Using AccuSnap]($docs/learning/frontend/primitivetools.md#AccuSnap)\r\n * @public\r\n * @extensions\r\n */\r\nexport class AccuSnap implements Decorator {\r\n /** Currently active hit */\r\n public currHit?: HitDetail;\r\n /** Current list of hits. */\r\n public aSnapHits?: HitList<HitDetail>;\r\n /** Views that need to be flashed */\r\n public readonly needFlash = new Set<Viewport>();\r\n /** Views that are already flashed */\r\n public readonly areFlashed = new Set<Viewport>();\r\n /** The \"+\" that indicates where the snap point is */\r\n public readonly cross = new SpriteLocation();\r\n /** The icon that indicates what type of snap is active */\r\n public readonly icon = new SpriteLocation();\r\n /** The icon that indicates an error */\r\n public readonly errorIcon = new SpriteLocation();\r\n /** Reason key for last error */\r\n public errorKey?: string;\r\n /** localized message explaining why last error was generated. */\r\n public explanation?: string;\r\n /** Number of times \"suppress\" has been called -- unlike suspend this is not automatically cleared by tools */\r\n private _suppressed = 0;\r\n /** Location of cursor when we last checked for motion */\r\n private readonly _lastCursorPos = new Point2d();\r\n /** @internal */\r\n public readonly toolState = new AccuSnap.ToolState();\r\n /** @internal */\r\n protected _settings = new AccuSnap.Settings();\r\n /** @internal */\r\n public touchCursor?: TouchCursor;\r\n /** Current request for tooltip message. */\r\n private _toolTipPromise?: Promise<Promise<void>>;\r\n\r\n /** @internal */\r\n public onInitialized() { }\r\n private get _searchDistance(): number { return this.isLocateEnabled ? 1.0 : this._settings.searchDistance; }\r\n private get _hotDistanceInches(): number { return IModelApp.locateManager.apertureInches * this._settings.hotDistanceFactor; }\r\n /** Whether locate of elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isLocateEnabled(): boolean { return this.toolState.locate; }\r\n /** Whether snapping to elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isSnapEnabled(): boolean { return this.toolState.enabled; }\r\n /** Whether the user setting for snapping is enabled. Snapping is done only when both the user and current InteractiveTool have enabled it. */\r\n public get isSnapEnabledByUser(): boolean { return this._settings.enableFlag; }\r\n /** AccuSnap user settings */\r\n public get userSettings() { return this._settings; }\r\n\r\n private isFlashed(view: Viewport): boolean { return (this.areFlashed.has(view)); }\r\n private needsFlash(view: Viewport): boolean { return (this.needFlash.has(view)); }\r\n private setNeedsFlash(view: Viewport) {\r\n this.needFlash.add(view);\r\n this.clearIsFlashed(view);\r\n view.invalidateDecorations();\r\n }\r\n\r\n private setIsFlashed(view: Viewport) { this.areFlashed.add(view); }\r\n private clearIsFlashed(view: Viewport) { this.areFlashed.delete(view); }\r\n private static toSnapDetail(hit?: HitDetail): SnapDetail | undefined { return (hit && hit instanceof SnapDetail) ? hit : undefined; }\r\n /** Currently active snap */\r\n public getCurrSnapDetail(): SnapDetail | undefined { return AccuSnap.toSnapDetail(this.currHit); }\r\n /** Determine whether there is a current hit that is *hot*. */\r\n public get isHot(): boolean {\r\n const currSnap = this.getCurrSnapDetail();\r\n return !currSnap ? false : currSnap.isHot;\r\n }\r\n\r\n /** Optional ids to never flash. Useful for tools like \"trim curve\" that won't want a flashed segment to obscure a result preview.\r\n * @note Cleared when a primitive or view tool is started and saved/restored when a primitive tool is suspended/unsuspended.\r\n * @public\r\n */\r\n public neverFlash(ids?: Id64Arg): void {\r\n if (undefined === ids) {\r\n this.toolState.neverFlash = undefined;\r\n return;\r\n }\r\n\r\n const newIds = new Set<string>();\r\n for (const id of Id64.iterable(ids))\r\n newIds.add(id);\r\n\r\n this.toolState.neverFlash = (0 !== newIds.size ? newIds : undefined);\r\n }\r\n\r\n /** @internal */\r\n public destroy(): void {\r\n this.currHit = undefined;\r\n this.aSnapHits = undefined;\r\n }\r\n\r\n private get _doSnapping(): boolean { return this.isSnapEnabled && this.isSnapEnabledByUser && !this._isSnapSuspended; }\r\n private get _isSnapSuspended(): boolean { return (0 !== this._suppressed || 0 !== this.toolState.suspended); }\r\n\r\n /** Get the current snap divisor to use to use for SnapMode.NearestKeypoint.\r\n * @public\r\n */\r\n public get keypointDivisor() { return 2; }\r\n\r\n /** Get the current active SnapModes. SnapMode position determines priority, with the first entry being the highest. The SnapDetail will be returned for the first SnapMode that produces a hot snap.\r\n * @public\r\n */\r\n public getActiveSnapModes(): SnapMode[] {\r\n const snaps: SnapMode[] = [];\r\n snaps.push(SnapMode.NearestKeypoint);\r\n return snaps;\r\n }\r\n\r\n /** Can be implemented by a subclass of AccuSnap to implement a SnapMode override that applies only to the next point.\r\n * This method will be called whenever a new tool is installed and on button events.\r\n * @internal\r\n */\r\n public synchSnapMode(): void { }\r\n\r\n /** Check whether current tentative snap has valid curve geometry for finding extended intersections. */\r\n private get _searchForExtendedIntersections(): boolean {\r\n const snap = IModelApp.tentativePoint.getCurrSnap();\r\n return (undefined !== snap && undefined !== snap.primitive);\r\n }\r\n\r\n /**\r\n * Check to see whether its appropriate to generate an AccuSnap point, given the current user\r\n * and command settings, and whether a tentative point is currently active.\r\n */\r\n public get isActive(): boolean {\r\n // Unless we're snapping in intersect mode (to find extended intersections), skip if tentative point active...\r\n if (IModelApp.tentativePoint.isActive) {\r\n if (!this._doSnapping || !this._searchForExtendedIntersections)\r\n return false;\r\n\r\n const snaps = this.getActiveSnapModes();\r\n for (const snap of snaps) {\r\n if (snap === SnapMode.Intersection)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n return this._doSnapping || this.isLocateEnabled;\r\n }\r\n\r\n private initializeForCheckMotion(): void {\r\n this._lastCursorPos.setFrom(IModelApp.toolAdmin.currentInputState.lastMotion);\r\n }\r\n\r\n /** Clear the current AccuSnap info. */\r\n public clear(): void { this.setCurrHit(undefined); }\r\n /** @internal */\r\n public setCurrHit(newHit?: HitDetail): void {\r\n const newSnap = AccuSnap.toSnapDetail(newHit);\r\n const currSnap = this.getCurrSnapDetail();\r\n const sameElem = (undefined !== newHit && newHit.isSameHit(this.currHit));\r\n const sameHit = (sameElem && !newSnap);\r\n const sameSnap = (sameElem && undefined !== newSnap && undefined !== currSnap);\r\n const samePt = (sameHit || (sameSnap && newSnap.snapPoint.isAlmostEqual(currSnap.snapPoint)));\r\n const sameHot = (sameHit || (sameSnap && (this.isHot === newSnap.isHot)));\r\n const sameBaseSnapMode = (!newSnap || !currSnap || newSnap.snapMode === currSnap.snapMode);\r\n const sameType = (sameHot && (!currSnap || (currSnap.getHitType() === newHit.getHitType())));\r\n\r\n // see if it is the same point on the same element, the hot flags are the same multiple snaps, and the snap modes are the same\r\n if (samePt && sameType && sameBaseSnapMode) {\r\n // we know that nothing about the screen could change, just save the new hit and return to avoid screen flash\r\n this.currHit = newHit;\r\n return;\r\n }\r\n\r\n this.erase();\r\n\r\n // if we hit the same element with the same \"hotness\" as last time, we don't need to erase it\r\n // multiple snaps: but only if the old and new snap modes are the same\r\n if (!sameHot || !sameBaseSnapMode) {\r\n this.unFlashViews();\r\n this.setFlashHit(newHit);\r\n }\r\n\r\n // if we didn't get a new hit, we're done\r\n if (undefined === (this.currHit = newHit))\r\n return;\r\n\r\n // draw sprites for this hit\r\n this.showSnapSprite();\r\n }\r\n\r\n /** flash a hit in a single view. */\r\n private flashHitInView(hit: HitDetail, context: DecorateContext) {\r\n const viewport = context.viewport;\r\n if (!viewport || !this.hitShouldBeHilited(hit) || !this.needsFlash(viewport))\r\n return;\r\n\r\n hit.draw(context);\r\n this.setIsFlashed(viewport);\r\n }\r\n\r\n private setNeedsFlashView(view: Viewport) {\r\n if (!this.isFlashed(view) && !this.needsFlash(view))\r\n this.setNeedsFlash(view);\r\n }\r\n\r\n /** flash a hit in its view. */\r\n private setFlashHit(hit?: HitDetail): void {\r\n if (hit !== undefined && this.hitShouldBeHilited(hit))\r\n this.setNeedsFlashView(hit.viewport);\r\n }\r\n\r\n /** @internal */\r\n public erase(): void {\r\n this.clearToolTip(undefined); // make sure there's no tooltip up.\r\n this.clearSprites(); // remove all sprites from the screen\r\n }\r\n\r\n private showElemInfo(viewPt: XAndY, vp: ScreenViewport, hit: HitDetail, delay: BeDuration): void {\r\n if (!IModelApp.viewManager.doesHostHaveFocus || undefined !== this._toolTipPromise)\r\n return;\r\n\r\n const promise = this._toolTipPromise = delay.executeAfter(async () => {\r\n if (promise !== this._toolTipPromise)\r\n return; // we abandoned this request during delay\r\n try {\r\n const msg = await IModelApp.toolAdmin.getToolTip(hit);\r\n if (this._toolTipPromise === promise) // have we abandoned this request while awaiting getToolTip?\r\n this.showLocateMessage(viewPt, vp, msg);\r\n } catch (error) { } // happens if getToolTip was canceled\r\n });\r\n }\r\n\r\n private showLocateMessage(viewPt: XAndY, vp: ScreenViewport, msg: HTMLElement | string) {\r\n if (IModelApp.viewManager.doesHostHaveFocus)\r\n vp.openToolTip(msg, viewPt);\r\n }\r\n\r\n /** @internal */\r\n public displayToolTip(viewPt: XAndY, vp: ScreenViewport, uorPt?: Point3d): void {\r\n // if the tooltip is already displayed, or if user doesn't want it, quit.\r\n if (!this._settings.toolTip || !IModelApp.notifications.isToolTipSupported || IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n const accuSnapHit = this.currHit;\r\n const tpHit = IModelApp.tentativePoint.getCurrSnap();\r\n\r\n // if we don't have either an AccuSnap or a tentative point hit, quit.\r\n if (!accuSnapHit && !tpHit && !this.errorIcon.isActive)\r\n return;\r\n\r\n let theHit: HitDetail | undefined;\r\n\r\n // determine which type of hit\r\n if (tpHit) {\r\n if (uorPt) {\r\n // see if he came back somewhere near the currently snapped element\r\n const aperture = (this._settings.stickyFactor * vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n if (!IModelApp.locateManager.picker.testHit(tpHit, vp, uorPt, aperture, IModelApp.locateManager.options))\r\n return;\r\n }\r\n theHit = tpHit;\r\n } else {\r\n theHit = accuSnapHit;\r\n }\r\n\r\n // if we're currently showing an error, get the error message...otherwise display hit info...\r\n if (!this.errorIcon.isActive && theHit) {\r\n this.showElemInfo(viewPt, vp, theHit, this._settings.toolTipDelay);\r\n return;\r\n }\r\n\r\n // If we have an error explanation...use it as is!\r\n if (this.explanation) {\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n return;\r\n }\r\n\r\n // if we don't have an explanation yet, translate the error code.\r\n if (!this.errorKey)\r\n return;\r\n\r\n this.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${this.errorKey}`);\r\n if (!this.explanation)\r\n return;\r\n\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n }\r\n\r\n /** @internal */\r\n public clearToolTip(ev?: BeButtonEvent): void {\r\n // Throw away any stale request for a tooltip message\r\n this._toolTipPromise = undefined;\r\n if (!IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n if (ev && (5 > ev.viewPoint.distanceXY(IModelApp.notifications.toolTipLocation)))\r\n return;\r\n\r\n IModelApp.notifications.clearToolTip();\r\n }\r\n\r\n /** Display the sprites for the current snap to indicate its position on the screen and what snap mode it represents. */\r\n private showSnapSprite(): void {\r\n const snap = this.getCurrSnapDetail();\r\n if (!snap)\r\n return;\r\n\r\n const crossPt = snap.snapPoint;\r\n const viewport = snap.viewport;\r\n const crossSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}${snap.isHot ? \"sprites/SnapCross.png\" : \"sprites/SnapUnfocused.png\"}`);\r\n\r\n this.cross.activate(crossSprite, viewport, crossPt);\r\n\r\n const snapSprite = snap.sprite;\r\n if (snapSprite)\r\n this.icon.activate(snapSprite, viewport, AccuSnap.adjustIconLocation(viewport, crossPt, snapSprite.size));\r\n }\r\n\r\n private static adjustIconLocation(vp: Viewport, input: Point3d, iconSize: XAndY): Point3d {\r\n const out = vp.worldToView(input);\r\n out.x += (iconSize.x / 3.0);\r\n out.y -= (iconSize.y * 1.3);\r\n return vp.viewToWorld(out, out);\r\n }\r\n\r\n /** try to indicate what's wrong with the current point (why we're not snapping). */\r\n private showSnapError(out: LocateResponse, ev: BeButtonEvent) {\r\n this.explanation = out.explanation;\r\n this.errorKey = out.reason;\r\n this.errorIcon.deactivate();\r\n\r\n const vp = ev.viewport!;\r\n let errorSprite: Sprite | undefined;\r\n switch (out.snapStatus) {\r\n case SnapStatus.FilteredByApp:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapAppFiltered.png`);\r\n break;\r\n\r\n case SnapStatus.FilteredByAppQuietly:\r\n this.errorKey = undefined;\r\n break;\r\n\r\n case SnapStatus.NotSnappable:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapNotSnappable.png`);\r\n this.errorKey = ElementLocateManager.getFailureMessageKey(\"NotSnappable\");\r\n break;\r\n }\r\n\r\n if (!errorSprite)\r\n return;\r\n\r\n const spriteSize = errorSprite.size;\r\n const pt = AccuSnap.adjustIconLocation(vp, ev.rawPoint, spriteSize);\r\n\r\n this.errorIcon.activate(errorSprite, vp, pt);\r\n }\r\n\r\n private clearSprites() {\r\n this.errorIcon.deactivate();\r\n this.cross.deactivate();\r\n this.icon.deactivate();\r\n }\r\n\r\n /** determine whether a hit should be hilited or not. */\r\n private hitShouldBeHilited(hit: HitDetail | undefined): boolean {\r\n if (!hit)\r\n return false;\r\n\r\n if (hit.isModelHit || hit.isMapHit)\r\n return false; // Avoid annoying flashing of reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return false;\r\n\r\n const snap = AccuSnap.toSnapDetail(hit);\r\n return !snap || snap.isHot || this._settings.hiliteColdHits;\r\n }\r\n\r\n private unFlashViews() {\r\n this.needFlash.clear();\r\n for (const vp of this.areFlashed)\r\n vp.flashedId = undefined;\r\n\r\n this.areFlashed.clear();\r\n }\r\n\r\n /** @internal */\r\n public adjustPointIfHot(pt: Point3d, view: Viewport): void {\r\n const currSnap = this.getCurrSnapDetail();\r\n\r\n if (!currSnap || !currSnap.isHot || view !== currSnap.viewport)\r\n return;\r\n\r\n pt.setFrom(currSnap.adjustedPoint);\r\n }\r\n\r\n /** Implemented by sub-classes to update ui to show current enabled state.\r\n * @internal\r\n */\r\n public onEnabledStateChange(_isEnabled: boolean, _wasEnabled: boolean) { }\r\n\r\n /** @internal */\r\n public getHitAndList(holder: HitListHolder): HitDetail | undefined {\r\n const hit = this.currHit;\r\n if (hit) {\r\n holder.setHitList(this.aSnapHits);\r\n this.aSnapHits = undefined;\r\n }\r\n return hit;\r\n }\r\n\r\n private initCmdState() {\r\n this.toolState.suspended = 0;\r\n this.toolState.neverFlash = undefined;\r\n }\r\n\r\n /** @internal */\r\n public suspend(doSuspend: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuspend)\r\n this.toolState.suspended++;\r\n else if (this.toolState.suspended > 0)\r\n this.toolState.suspended--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public suppress(doSuppress: boolean): number {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuppress)\r\n this._suppressed++;\r\n else if (this._suppressed > 0)\r\n this._suppressed--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n return this._suppressed;\r\n }\r\n\r\n /** Turn AccuSnap on or off */\r\n public enableSnap(yesNo: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n this.toolState.enabled = yesNo;\r\n if (!yesNo) {\r\n this.clear();\r\n if (undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public intersectXY(tpSnap: SnapDetail, second: SnapDetail): IntersectDetail | undefined {\r\n // Get single segment curve from each snap to intersect...\r\n const tpSegment = tpSnap.getCurvePrimitive();\r\n if (undefined === tpSegment)\r\n return undefined;\r\n const segment = second.getCurvePrimitive();\r\n if (undefined === segment)\r\n return undefined;\r\n\r\n const worldToView = second.viewport.worldToViewMap.transform0;\r\n const detail = CurveCurve.intersectionProjectedXYPairs(worldToView, tpSegment, true, segment, true);\r\n if (0 === detail.length)\r\n return undefined;\r\n\r\n let closeIndex = 0;\r\n if (detail.length > 1) {\r\n const snapPt = worldToView.multiplyPoint3d(HitGeomType.Point === tpSnap.geomType && HitGeomType.Point !== second.geomType ? second.getPoint() : tpSnap.getPoint(), 1); // Don't check distance from arc centers...\r\n let lastDist: number | undefined;\r\n\r\n for (let i = 0; i < detail.length; i++) {\r\n const testPt = worldToView.multiplyPoint3d(detail[i].detailA.point, 1);\r\n const testDist = snapPt.realDistanceXY(testPt);\r\n\r\n if (undefined !== testDist && (undefined === lastDist || testDist < lastDist)) {\r\n lastDist = testDist;\r\n closeIndex = i;\r\n }\r\n }\r\n }\r\n\r\n const intersect = new IntersectDetail(tpSnap, SnapHeat.InRange, detail[closeIndex].detailA.point, segment, second.sourceId); // Should be ok to share hit detail with tentative...\r\n intersect.primitive = tpSegment; // Just save single segment that was intersected for line strings/shapes...\r\n\r\n return intersect;\r\n }\r\n\r\n /** @internal */\r\n public static async requestSnap(thisHit: HitDetail, snapModes: SnapMode[], hotDistanceInches: number, keypointDivisor: number, hitList?: HitList<HitDetail>, out?: LocateResponse): Promise<SnapDetail | undefined> {\r\n if (thisHit.isModelHit || thisHit.isMapHit || thisHit.isClassifier) {\r\n if (snapModes.includes(SnapMode.Nearest)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n return new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.InRange);\r\n } else if (1 === snapModes.length && snapModes.includes(SnapMode.Intersection)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined;\r\n } else {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n const realitySnap = new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.None);\r\n realitySnap.sprite = undefined; // Don't show a snap mode that isn't applicable, but still accept hit point...\r\n return realitySnap;\r\n }\r\n }\r\n\r\n const hitVp = thisHit.viewAttachment ? thisHit.viewAttachment.viewport : thisHit.viewport;\r\n if (undefined !== thisHit.subCategoryId && !thisHit.isExternalIModelHit) {\r\n const appearance = hitVp.getSubCategoryAppearance(thisHit.subCategoryId);\r\n if (appearance.dontSnap) {\r\n if (out) {\r\n out.snapStatus = SnapStatus.NotSnappable;\r\n out.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${ElementLocateManager.getFailureMessageKey(\"NotSnappableSubCategory\")}`);\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n const requestProps: SnapRequestProps = {\r\n id: thisHit.sourceId,\r\n testPoint: thisHit.testPoint,\r\n closePoint: thisHit.hitPoint,\r\n worldToView: hitVp.worldToViewMap.transform0.toJSON(),\r\n viewFlags: hitVp.viewFlags,\r\n snapModes,\r\n snapAperture: hitVp.pixelsFromInches(hotDistanceInches),\r\n snapDivisor: keypointDivisor,\r\n subCategoryId: thisHit.subCategoryId,\r\n geometryClass: thisHit.geometryClass,\r\n };\r\n\r\n const thisGeom = (thisHit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(thisHit) : IModelApp.viewManager.getDecorationGeometry(thisHit));\r\n\r\n if (undefined !== thisGeom) {\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: thisGeom }];\r\n } else if (!thisHit.isElementHit) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n return undefined;\r\n }\r\n\r\n if (snapModes.includes(SnapMode.Intersection)) {\r\n if (undefined !== hitList) {\r\n for (const hit of hitList.hits) {\r\n if (thisHit.sourceId === hit.sourceId || thisHit.iModel !== hit.iModel)\r\n continue;\r\n\r\n const geom = (hit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(hit) : IModelApp.viewManager.getDecorationGeometry(hit));\r\n\r\n if (undefined !== geom) {\r\n if (undefined === requestProps.decorationGeometry)\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: geom }];\r\n else\r\n requestProps.decorationGeometry.push({ id: thisHit.sourceId, geometryStream: geom });\r\n } else if (!hit.isElementHit) {\r\n continue;\r\n }\r\n\r\n if (undefined === requestProps.intersectCandidates)\r\n requestProps.intersectCandidates = [hit.sourceId];\r\n else\r\n requestProps.intersectCandidates.push(hit.sourceId);\r\n\r\n if (5 === requestProps.intersectCandidates.length)\r\n break; // Search for intersection with a few of the next best hits...\r\n }\r\n }\r\n\r\n if (1 === snapModes.length && undefined === requestProps.intersectCandidates) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined; // Don't make back end request when only doing intersection snap when we don't have another hit to intersect with...\r\n }\r\n }\r\n\r\n try {\r\n const result = await thisHit.iModel.requestSnap(requestProps);\r\n\r\n if (out)\r\n out.snapStatus = result.status;\r\n\r\n if (result.status !== SnapStatus.Success)\r\n return undefined;\r\n\r\n const parseCurve = (json: any): CurvePrimitive | undefined => {\r\n const parsed = undefined !== json ? GeomJson.Reader.parse(json) : undefined;\r\n return parsed instanceof GeometryQuery && \"curvePrimitive\" === parsed.geometryCategory ? parsed : undefined;\r\n };\r\n\r\n const snapPoint = Point3d.fromJSON(result.snapPoint);\r\n const displayTransform = undefined !== thisHit.modelId ? thisHit.viewport.view.computeDisplayTransform({\r\n modelId: thisHit.modelId,\r\n elementId: thisHit.sourceId,\r\n viewAttachmentId: thisHit.viewAttachment?.id,\r\n }) : undefined;\r\n displayTransform?.multiplyPoint3d(snapPoint, snapPoint);\r\n\r\n const snap = new SnapDetail(thisHit, result.snapMode, result.heat, snapPoint);\r\n\r\n snap.setCurvePrimitive(parseCurve(result.curve), displayTransform, result.geomType);\r\n if (undefined !== result.parentGeomType)\r\n snap.parentGeomType = result.parentGeomType;\r\n\r\n // Update hitPoint from readPixels with exact point location corrected to surface/edge geometry.\r\n if (undefined !== result.hitPoint) {\r\n snap.hitPoint.setFromJSON(result.hitPoint);\r\n displayTransform?.multiplyPoint3d(snap.hitPoint, snap.hitPoint);\r\n }\r\n\r\n // Apply display transform to normal.\r\n if (undefined !== result.normal) {\r\n snap.normal = Vector3d.fromJSON(result.normal);\r\n displayTransform?.matrix.multiplyVector(snap.normal, snap.normal);\r\n snap.normal.normalizeInPlace();\r\n }\r\n\r\n if (SnapMode.Intersection !== snap.snapMode)\r\n return snap;\r\n\r\n if (undefined === result.intersectId)\r\n return undefined;\r\n\r\n const otherPrimitive = parseCurve(result.intersectCurve);\r\n if (undefined === otherPrimitive)\r\n return undefined;\r\n\r\n const intersect = new IntersectDetail(snap, snap.heat, snap.snapPoint, otherPrimitive, result.intersectId);\r\n return intersect;\r\n } catch (_err) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Aborted;\r\n\r\n return undefined;\r\n }\r\n }\r\n\r\n private async getAccuSnapDetail(hitList: HitList<HitDetail>, out: LocateResponse): Promise<SnapDetail | undefined> {\r\n const thisHit = hitList.getNextHit();\r\n if (undefined === thisHit)\r\n return undefined;\r\n\r\n const filterStatus: LocateFilterStatus = (this.isLocateEnabled ? await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, out) : LocateFilterStatus.Accept);\r\n if (LocateFilterStatus.Accept !== filterStatus) {\r\n out.snapStatus = SnapStatus.FilteredByApp;\r\n return undefined;\r\n }\r\n\r\n let snapModes: SnapMode[];\r\n if (IModelApp.tentativePoint.isActive) {\r\n snapModes = [];\r\n snapModes.push(SnapMode.Nearest); // Special case: isActive only allows snapping with tentative to find extended intersections...\r\n } else {\r\n snapModes = this.getActiveSnapModes(); // Get the list of point snap modes to consider\r\n }\r\n\r\n const thisSnap = await AccuSnap.requestSnap(thisHit, snapModes, this._hotDistanceInches, this.keypointDivisor, hitList, out);\r\n if (undefined === thisSnap)\r\n return undefined;\r\n\r\n if (IModelApp.tentativePoint.isActive) {\r\n const tpSnap = IModelApp.tentativePoint.getCurrSnap();\r\n if (undefined === tpSnap)\r\n return undefined;\r\n const intersectSnap = this.intersectXY(tpSnap, thisSnap);\r\n if (undefined === intersectSnap)\r\n return undefined;\r\n hitList.setCurrentHit(thisHit);\r\n return intersectSnap;\r\n }\r\n\r\n IModelApp.accuDraw.onSnap(thisSnap); // AccuDraw can adjust nearest snap to intersection of circle (polar distance lock) or line (axis lock) with snapped to curve...\r\n hitList.setCurrentHit(thisHit);\r\n return thisSnap;\r\n }\r\n\r\n /** Request a snap from the backend for the supplied HitDetail.\r\n * @param hit The HitDetail to snap to.\r\n * @param snapMode Optional SnapMode, uses active snap modes if not specified.\r\n * @return A Promise for the SnapDetail or undefined if no snap could be created.\r\n */\r\n public async doSnapRequest(hit: HitDetail, snapMode?: SnapMode): Promise<SnapDetail | undefined> {\r\n let snapModes: SnapMode[];\r\n if (undefined === snapMode)\r\n snapModes = this.getActiveSnapModes();\r\n else\r\n snapModes = [snapMode];\r\n\r\n return AccuSnap.requestSnap(hit, snapModes, this._hotDistanceInches, this.keypointDivisor);\r\n }\r\n\r\n private findHits(ev: BeButtonEvent, force: boolean = false): SnapStatus {\r\n // When using AccuSnap to locate elements, we have to start with the datapoint adjusted\r\n // for locks and not the raw point. Otherwise, when grid/unit lock are on, we locate elements by\r\n // points not on the grid. This causes them to be \"pulled\" off the grid when they are accepted. On\r\n // the other hand, when NOT locating, we need to use the raw point so we can snap to elements\r\n // away from the grid.\r\n\r\n const testPoint = this.isLocateEnabled ? ev.point : ev.rawPoint;\r\n const vp = ev.viewport!;\r\n const picker = IModelApp.locateManager.picker;\r\n const options = IModelApp.locateManager.options.clone(); // Copy to avoid changing out from under active Tool...\r\n\r\n // NOTE: Since TestHit will use the same HitSource as the input hit we only need to sets this for DoPick...\r\n options.hitSource = this.isSnapEnabled ? HitSource.AccuSnap : HitSource.MotionLocate;\r\n\r\n let aperture = (vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n this.initializeForCheckMotion();\r\n aperture *= this._searchDistance;\r\n\r\n if (0 === picker.doPick(vp, testPoint, aperture, options)) {\r\n this.aSnapHits = undefined; // Clear any previous hit list so reset won't cycle through hits cursor is no longer over, etc.\r\n return SnapStatus.NoElements;\r\n }\r\n\r\n this.aSnapHits = picker.getHitList(true); // take ownership of the pickElem hit list.\r\n\r\n // see if we should keep the current hit\r\n const canBeSticky = !force && this.aSnapHits.length > 1 && this.currHit && (HitDetailType.Intersection !== this.currHit.getHitType() && this.currHit.priority < HitPriority.PlanarSurface);\r\n if (canBeSticky) {\r\n for (let iHit = 1; iHit < this.aSnapHits.length; ++iHit) {\r\n const thisHit = this.aSnapHits.hits[iHit];\r\n if (!thisHit.isSameHit(this.currHit))\r\n continue;\r\n this.aSnapHits.removeHit(iHit);\r\n this.aSnapHits.insertHit(0, thisHit);\r\n break;\r\n }\r\n }\r\n\r\n return SnapStatus.Success;\r\n }\r\n\r\n private async findLocatableHit(ev: BeButtonEvent, newSearch: boolean, out: LocateResponse): Promise<HitDetail | undefined> {\r\n out.snapStatus = SnapStatus.NoElements;\r\n\r\n if (newSearch) {\r\n this.aSnapHits = undefined;\r\n // search for new hits, but if the cursor is still close to the current hit, don't throw away list.\r\n if (SnapStatus.Success !== (out.snapStatus = this.findHits(ev)))\r\n return undefined;\r\n } else {\r\n if (!this.aSnapHits) {\r\n out.snapStatus = SnapStatus.NoElements;\r\n return undefined;\r\n }\r\n }\r\n\r\n const thisList = this.aSnapHits!;\r\n let thisHit: HitDetail | undefined;\r\n let firstRejected;\r\n const filterResponse = new LocateResponse();\r\n\r\n // keep looking through hits until we find one that is accu-snappable.\r\n while (undefined !== (thisHit = thisList.getNextHit())) {\r\n if (LocateFilterStatus.Accept === await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, filterResponse))\r\n return thisHit;\r\n // we only care about the status of the first hit.\r\n if (undefined !== firstRejected)\r\n continue;\r\n firstRejected = filterResponse.clone();\r\n firstRejected.snapStatus = SnapStatus.FilteredByApp;\r\n }\r\n\r\n if (undefined !== firstRejected)\r\n out.setFrom(firstRejected);\r\n\r\n // Reset current hit index to go back to first hit on next AccuSnap reset event...\r\n thisList.resetCurrentHit();\r\n return undefined;\r\n }\r\n\r\n /** When in auto-locate mode, advance to the next hit without searching again.\r\n * @internal\r\n */\r\n public async resetButton(): Promise<SnapStatus> {\r\n let hit: HitDetail | undefined;\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n this.clearToolTip(undefined);\r\n\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n\r\n if (this._doSnapping) {\r\n // if we don't have any more candidate hits, get a new list at the current location\r\n if (!this.aSnapHits || (0 === this.aSnapHits.length)) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n } else {\r\n // drop the current hit from the list and then retest the list (without the dropped hit) to find the new snap\r\n this.aSnapHits.removeCurrentHit();\r\n hit = await this.getAccuSnapDetail(this.aSnapHits, out);\r\n }\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, false, out); // get next AccuSnap path (or undefined)\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n\r\n // set the current hit\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // indicate errors\r\n this.showSnapError(out, ev);\r\n return out.snapStatus;\r\n }\r\n\r\n /** Find the best snap point according to the current cursor location\r\n * @internal\r\n */\r\n public async onMotion(ev: BeButtonEvent): Promise<void> {\r\n this.clearToolTip(ev);\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n let hit: HitDetail | undefined;\r\n if (this.isActive) {\r\n if (this._doSnapping) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, true, out);\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n }\r\n\r\n // set the current hit and display the sprite (based on snap's KeypointType)\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // set up active error before calling displayToolTip to indicate error or show locate message...\r\n this.showSnapError(out, ev);\r\n this.displayToolTip(ev.viewPoint, ev.viewport!, ev.rawPoint);\r\n\r\n if (undefined !== this.touchCursor && InputSource.Mouse === ev.inputSource) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onPreButtonEvent(ev: BeButtonEvent): boolean { return (undefined !== this.touchCursor) ? this.touchCursor.isButtonHandled(ev) : false; }\r\n /** @internal */\r\n public onTouchStart(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchStart(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchEnd(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor && 0 === ev.touchCount)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchCancel(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchMove(ev: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMove(ev) : false;\r\n }\r\n\r\n /** @internal */\r\n public onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMoveStart(ev, startEv) : false;\r\n }\r\n\r\n /** @internal */\r\n public get wantVirtualCursor(): boolean {\r\n return this._doSnapping || (this.isLocateEnabled && ToolSettings.enableVirtualCursorForLocate);\r\n }\r\n\r\n /** @internal */\r\n public async onTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined !== this.touchCursor)\r\n return this.touchCursor.doTouchTap(ev);\r\n if (!this.wantVirtualCursor)\r\n return false;\r\n this.touchCursor = TouchCursor.createFromTouchTap(ev);\r\n if (undefined === this.touchCursor)\r\n return false;\r\n // Give active tool an opportunity to update it's tool assistance since event won't be passed along...\r\n const tool = IModelApp.toolAdmin.activeTool;\r\n if (undefined === tool)\r\n return true;\r\n await tool.onSuspend();\r\n await tool.onUnsuspend();\r\n return true;\r\n }\r\n\r\n private flashElements(context: DecorateContext): void {\r\n const viewport = context.viewport;\r\n if (this.currHit) {\r\n if (this.needsFlash(viewport))\r\n this.flashHitInView(this.currHit, context);\r\n return;\r\n }\r\n\r\n const hit = IModelApp.tentativePoint.getCurrSnap();\r\n if (!hit || hit.isModelHit || hit.isMapHit)\r\n return; // Don't hilite reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return;\r\n\r\n hit.draw(context);\r\n }\r\n\r\n /** @internal */\r\n public decorate(context: DecorateContext): void {\r\n if (undefined !== this.touchCursor && this.touchCursor.viewport === context.viewport)\r\n context.addCanvasDecoration(this.touchCursor, true);\r\n\r\n this.flashElements(context);\r\n\r\n if (this.cross.isActive) {\r\n this.cross.decorate(context);\r\n this.icon.decorate(context);\r\n }\r\n\r\n this.errorIcon.decorate(context);\r\n }\r\n\r\n private clearElemFromHitList(element: string) {\r\n if (this.aSnapHits)\r\n this.aSnapHits.removeHitsFrom(element);\r\n }\r\n\r\n /** @internal */\r\n public clearIfElement(sourceId: string): void {\r\n this.clearElemFromHitList(sourceId);\r\n\r\n const hit = this.currHit;\r\n if (hit && hit.sourceId === sourceId) {\r\n this.destroy();\r\n }\r\n }\r\n\r\n /** Enable locating elements.\r\n * @public\r\n */\r\n public enableLocate(yesNo: boolean) {\r\n this.toolState.locate = yesNo;\r\n if (!yesNo && undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** Called whenever a new [[Tool]] is started.\r\n * @internal\r\n */\r\n public onStartTool(): void {\r\n this.initCmdState();\r\n this.enableSnap(false);\r\n this.enableLocate(false);\r\n IModelApp.tentativePoint.clear(true);\r\n }\r\n\r\n /**\r\n * Force AccuSnap to reevaluate the snap at the current cursor location.\r\n * This is useful of an application changes the snap mode and wants AccuSnap to choose it immediately, without\r\n * requiring the user to move the mouse.\r\n * @internal\r\n */\r\n public async reEvaluate() {\r\n if (this.getCurrSnapDetail()) {\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n return this.onMotion(ev);\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class TentativeOrAccuSnap {\r\n public static get isHot(): boolean { return IModelApp.accuSnap.isHot || IModelApp.tentativePoint.isSnapped; }\r\n\r\n public static getCurrentSnap(checkIsHot: boolean = true): SnapDetail | undefined {\r\n // Checking for a hot AccuSnap hit before checking tentative is probably necessary for extended intersections?\r\n if (IModelApp.accuSnap.isHot)\r\n return IModelApp.accuSnap.getCurrSnapDetail();\r\n\r\n if (IModelApp.tentativePoint.isSnapped)\r\n return IModelApp.tentativePoint.currSnap;\r\n\r\n return (checkIsHot ? undefined : IModelApp.accuSnap.getCurrSnapDetail());\r\n }\r\n\r\n public static getCurrentPoint(): Point3d {\r\n if (IModelApp.accuSnap.isHot) {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n if (snap)\r\n return snap.adjustedPoint;\r\n }\r\n\r\n return IModelApp.tentativePoint.getPoint();\r\n }\r\n\r\n public static getCurrentView(): ScreenViewport | undefined {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n return snap ? snap.viewport : IModelApp.tentativePoint.viewport;\r\n }\r\n}\r\n\r\n/** @public */\r\nexport namespace AccuSnap { // eslint-disable-line no-redeclare\r\n export class ToolState {\r\n public enabled = false;\r\n public locate = false;\r\n public suspended = 0;\r\n public neverFlash?: Id64Set;\r\n public setFrom(other: ToolState): void {\r\n this.enabled = other.enabled;\r\n this.locate = other.locate;\r\n this.suspended = other.suspended;\r\n this.neverFlash = other.neverFlash;\r\n }\r\n public clone(): ToolState {\r\n const val = new ToolState();\r\n val.setFrom(this);\r\n return val;\r\n }\r\n }\r\n\r\n export class Settings {\r\n public hotDistanceFactor = 1.2;\r\n public stickyFactor = 1.0;\r\n public searchDistance = 2.0;\r\n public hiliteColdHits = true;\r\n public enableFlag = true;\r\n public toolTip = true;\r\n public toolTipDelay = BeDuration.fromSeconds(.5); // delay before tooltip pops up\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"AccuSnap.js","sourceRoot":"","sources":["../../src/AccuSnap.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/** @packageDocumentation\r\n * @module LocatingElements\r\n */\r\n\r\nimport { BeDuration, Id64, Id64Arg, Id64Set } from \"@itwin/core-bentley\";\r\nimport { CurveCurve, CurvePrimitive, GeometryQuery, IModelJson as GeomJson, Point2d, Point3d, Vector3d, XAndY } from \"@itwin/core-geometry\";\r\nimport { SnapRequestProps } from \"@itwin/core-common\";\r\nimport { ElementLocateManager, HitListHolder, LocateAction, LocateFilterStatus, LocateResponse, SnapStatus } from \"./ElementLocateManager\";\r\nimport { HitDetail, HitDetailType, HitGeomType, HitList, HitPriority, HitSource, IntersectDetail, SnapDetail, SnapHeat, SnapMode } from \"./HitDetail\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { CanvasDecoration } from \"./render/CanvasDecoration\";\r\nimport { IconSprites, Sprite, SpriteLocation } from \"./Sprites\";\r\nimport { BeButton, BeButtonEvent, BeTouchEvent, InputSource } from \"./tools/Tool\";\r\nimport { ToolSettings } from \"./tools/ToolSettings\";\r\nimport { DecorateContext } from \"./ViewContext\";\r\nimport { Decorator } from \"./ViewManager\";\r\nimport { ScreenViewport, Viewport } from \"./Viewport\";\r\n\r\n// cspell:ignore dont primitivetools\r\n\r\n/** Virtual cursor for using AccuSnap with touch input.\r\n * @internal\r\n */\r\nexport class TouchCursor implements CanvasDecoration {\r\n public position = new Point3d();\r\n public viewport: Viewport;\r\n protected _offsetPosition = new Point3d();\r\n protected _size: number;\r\n protected _yOffset: number;\r\n protected _isSelected = false;\r\n protected _isDragging = false;\r\n protected _inTouchTap = false;\r\n\r\n protected constructor(vp: ScreenViewport) {\r\n this._size = vp.pixelsFromInches(0.3);\r\n this._yOffset = this._size * 1.75;\r\n this.viewport = vp;\r\n }\r\n\r\n protected setPosition(vp: Viewport, worldLocation: Point3d): boolean {\r\n const pointNpc = vp.worldToNpc(worldLocation);\r\n if (pointNpc.z < 0.0 || pointNpc.z > 1.0)\r\n pointNpc.z = 0.5; // move inside frustum.\r\n\r\n const viewLocation = vp.npcToView(pointNpc);\r\n if (!vp.viewRect.containsPoint(viewLocation))\r\n return false; // outside this viewport rect\r\n\r\n viewLocation.x = Math.floor(viewLocation.x) + 0.5;\r\n viewLocation.y = Math.floor(viewLocation.y) + 0.5;\r\n viewLocation.z = 0.0;\r\n const offsetLocation = new Point3d(viewLocation.x, viewLocation.y - this._yOffset, viewLocation.z);\r\n if (!vp.viewRect.containsPoint(offsetLocation))\r\n return false; // outside this viewport rect\r\n\r\n this.position.setFrom(viewLocation);\r\n this._offsetPosition.setFrom(offsetLocation);\r\n if (vp !== this.viewport) {\r\n this.viewport.invalidateDecorations();\r\n this.viewport = vp;\r\n }\r\n vp.invalidateDecorations();\r\n return true;\r\n }\r\n\r\n protected drawHandle(ctx: CanvasRenderingContext2D, filled: boolean): void {\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size, 0);\r\n ctx.bezierCurveTo(-this._size, -this._size * 0.85, -this._size * 0.6, -this._yOffset * 0.6, 0, -this._yOffset * 0.8);\r\n ctx.bezierCurveTo(this._size * 0.6, -this._yOffset * 0.6, this._size, -this._size * 0.85, this._size, 0);\r\n ctx.arc(0, 0, this._size, 0, Math.PI);\r\n if (filled)\r\n ctx.fill();\r\n\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.arc(0, 0, this._size * 0.75, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size * 0.4, 0);\r\n ctx.lineTo(this._size * 0.4, 0);\r\n ctx.moveTo(-this._size * 0.4, this._size * 0.25);\r\n ctx.lineTo(this._size * 0.4, this._size * 0.25);\r\n ctx.stroke();\r\n }\r\n\r\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = \"rgba(0,0,0,.75)\";\r\n ctx.fillStyle = \"white\";\r\n ctx.strokeRect(-2, -(this._yOffset + 2), 5, 5);\r\n ctx.fillRect(-1, -(this._yOffset + 1), 3, 3);\r\n\r\n ctx.lineWidth = 3.5;\r\n ctx.lineCap = \"round\";\r\n ctx.fillStyle = this._isSelected ? \"rgba(35,187,252,.25)\" : \"rgba(255,215,0,.25)\";\r\n ctx.shadowColor = \"black\";\r\n ctx.shadowBlur = 10;\r\n this.drawHandle(ctx, true);\r\n\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeStyle = this._isSelected ? \"rgba(35,187,252,.75)\" : \"rgba(255,215,0,.75)\";\r\n ctx.shadowBlur = 0;\r\n this.drawHandle(ctx, false);\r\n }\r\n\r\n protected isSelected(pt: XAndY): boolean { return this.position.distance(Point3d.create(pt.x, pt.y)) < this._size; }\r\n public isButtonHandled(ev: BeButtonEvent): boolean { return (BeButton.Data === ev.button && InputSource.Touch === ev.inputSource && !this._inTouchTap); }\r\n\r\n public doTouchMove(ev: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n if (!this._isDragging || !this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return true;\r\n }\r\n\r\n public doTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n return (this._isDragging = this.isSelected(startEv.viewPoint));\r\n }\r\n\r\n public doTouchStart(ev: BeTouchEvent): void {\r\n this._isSelected = ev.isSingleTouch && this.isSelected(ev.viewPoint);\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public doTouchEnd(ev: BeTouchEvent): void {\r\n if (this._isDragging && undefined !== ev.viewport)\r\n IModelApp.toolAdmin.currentInputState.fromPoint(ev.viewport, this._offsetPosition, InputSource.Touch); // Current location should reflect virtual cursor offset...\r\n this._isSelected = this._isDragging = false;\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public async doTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return false;\r\n if (!this.isSelected(ev.viewPoint)) {\r\n if (!this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return false;\r\n }\r\n ev.viewPoint = this._offsetPosition;\r\n this._inTouchTap = true;\r\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev);\r\n this._inTouchTap = false;\r\n return true;\r\n }\r\n\r\n public static createFromTouchTap(ev: BeTouchEvent): TouchCursor | undefined {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return undefined;\r\n const touchCursor = new TouchCursor(ev.viewport);\r\n if (!touchCursor.setPosition(ev.viewport, ev.point) && !touchCursor.setPosition(ev.viewport, ev.viewport.view.getCenter()))\r\n return undefined;\r\n ev.viewPoint = touchCursor._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return touchCursor;\r\n }\r\n}\r\n\r\n/** AccuSnap is an aide for snapping to interesting points on elements or decorations as the cursor moves over them.\r\n * @see [Using AccuSnap]($docs/learning/frontend/primitivetools.md#AccuSnap)\r\n * @public\r\n * @extensions\r\n */\r\nexport class AccuSnap implements Decorator {\r\n /** Currently active hit */\r\n public currHit?: HitDetail;\r\n /** Current list of hits. */\r\n public aSnapHits?: HitList<HitDetail>;\r\n /** Views that need to be flashed */\r\n public readonly needFlash = new Set<Viewport>();\r\n /** Views that are already flashed */\r\n public readonly areFlashed = new Set<Viewport>();\r\n /** The \"+\" that indicates where the snap point is */\r\n public readonly cross = new SpriteLocation();\r\n /** The icon that indicates what type of snap is active */\r\n public readonly icon = new SpriteLocation();\r\n /** The icon that indicates an error */\r\n public readonly errorIcon = new SpriteLocation();\r\n /** Reason key for last error */\r\n public errorKey?: string;\r\n /** localized message explaining why last error was generated. */\r\n public explanation?: string;\r\n /** Number of times \"suppress\" has been called -- unlike suspend this is not automatically cleared by tools */\r\n private _suppressed = 0;\r\n /** Location of cursor when we last checked for motion */\r\n private readonly _lastCursorPos = new Point2d();\r\n /** @internal */\r\n public readonly toolState = new AccuSnap.ToolState();\r\n /** @internal */\r\n protected _settings = new AccuSnap.Settings();\r\n /** @internal */\r\n public touchCursor?: TouchCursor;\r\n /** Current request for tooltip message. */\r\n private _toolTipPromise?: Promise<Promise<void>>;\r\n\r\n /** @internal */\r\n public onInitialized() { }\r\n private get _searchDistance(): number { return this.isLocateEnabled ? 1.0 : this._settings.searchDistance; }\r\n private get _hotDistanceInches(): number { return IModelApp.locateManager.apertureInches * this._settings.hotDistanceFactor; }\r\n /** Whether locate of elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isLocateEnabled(): boolean { return this.toolState.locate; }\r\n /** Whether snapping to elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isSnapEnabled(): boolean { return this.toolState.enabled; }\r\n /** Whether the user setting for snapping is enabled. Snapping is done only when both the user and current InteractiveTool have enabled it. */\r\n public get isSnapEnabledByUser(): boolean { return this._settings.enableFlag; }\r\n /** AccuSnap user settings */\r\n public get userSettings() { return this._settings; }\r\n\r\n private isFlashed(view: Viewport): boolean { return (this.areFlashed.has(view)); }\r\n private needsFlash(view: Viewport): boolean { return (this.needFlash.has(view)); }\r\n private setNeedsFlash(view: Viewport) {\r\n this.needFlash.add(view);\r\n this.clearIsFlashed(view);\r\n view.invalidateDecorations();\r\n }\r\n\r\n private setIsFlashed(view: Viewport) { this.areFlashed.add(view); }\r\n private clearIsFlashed(view: Viewport) { this.areFlashed.delete(view); }\r\n private static toSnapDetail(hit?: HitDetail): SnapDetail | undefined { return (hit && hit instanceof SnapDetail) ? hit : undefined; }\r\n /** Currently active snap */\r\n public getCurrSnapDetail(): SnapDetail | undefined { return AccuSnap.toSnapDetail(this.currHit); }\r\n /** Determine whether there is a current hit that is *hot*. */\r\n public get isHot(): boolean {\r\n const currSnap = this.getCurrSnapDetail();\r\n return !currSnap ? false : currSnap.isHot;\r\n }\r\n\r\n /** Optional ids to never flash. Useful for tools like \"trim curve\" that won't want a flashed segment to obscure a result preview.\r\n * @note Cleared when a primitive or view tool is started and saved/restored when a primitive tool is suspended/unsuspended.\r\n * @public\r\n */\r\n public neverFlash(ids?: Id64Arg): void {\r\n if (undefined === ids) {\r\n this.toolState.neverFlash = undefined;\r\n return;\r\n }\r\n\r\n const newIds = new Set<string>();\r\n for (const id of Id64.iterable(ids))\r\n newIds.add(id);\r\n\r\n this.toolState.neverFlash = (0 !== newIds.size ? newIds : undefined);\r\n }\r\n\r\n /** @internal */\r\n public destroy(): void {\r\n this.currHit = undefined;\r\n this.aSnapHits = undefined;\r\n }\r\n\r\n private get _doSnapping(): boolean { return this.isSnapEnabled && this.isSnapEnabledByUser && !this._isSnapSuspended; }\r\n private get _isSnapSuspended(): boolean { return (0 !== this._suppressed || 0 !== this.toolState.suspended); }\r\n\r\n /** Get the current snap divisor to use to use for SnapMode.NearestKeypoint.\r\n * @public\r\n */\r\n public get keypointDivisor() { return 2; }\r\n\r\n /** Get the current active SnapModes. SnapMode position determines priority, with the first entry being the highest. The SnapDetail will be returned for the first SnapMode that produces a hot snap.\r\n * @public\r\n */\r\n public getActiveSnapModes(): SnapMode[] {\r\n const snaps: SnapMode[] = [];\r\n snaps.push(SnapMode.NearestKeypoint);\r\n return snaps;\r\n }\r\n\r\n /** Can be implemented by a subclass of AccuSnap to implement a SnapMode override that applies only to the next point.\r\n * This method will be called whenever a new tool is installed and on button events.\r\n * @internal\r\n */\r\n public synchSnapMode(): void { }\r\n\r\n /** Check whether current tentative snap has valid curve geometry for finding extended intersections. */\r\n private get _searchForExtendedIntersections(): boolean {\r\n const snap = IModelApp.tentativePoint.getCurrSnap();\r\n return (undefined !== snap && undefined !== snap.primitive);\r\n }\r\n\r\n /**\r\n * Check to see whether its appropriate to generate an AccuSnap point, given the current user\r\n * and command settings, and whether a tentative point is currently active.\r\n */\r\n public get isActive(): boolean {\r\n // Unless we're snapping in intersect mode (to find extended intersections), skip if tentative point active...\r\n if (IModelApp.tentativePoint.isActive) {\r\n if (!this._doSnapping || !this._searchForExtendedIntersections)\r\n return false;\r\n\r\n const snaps = this.getActiveSnapModes();\r\n for (const snap of snaps) {\r\n if (snap === SnapMode.Intersection)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n return this._doSnapping || this.isLocateEnabled;\r\n }\r\n\r\n private initializeForCheckMotion(): void {\r\n this._lastCursorPos.setFrom(IModelApp.toolAdmin.currentInputState.lastMotion);\r\n }\r\n\r\n /** Clear the current AccuSnap info. */\r\n public clear(): void { this.setCurrHit(undefined); }\r\n /** @internal */\r\n public setCurrHit(newHit?: HitDetail): void {\r\n const newSnap = AccuSnap.toSnapDetail(newHit);\r\n const currSnap = this.getCurrSnapDetail();\r\n const sameElem = (undefined !== newHit && newHit.isSameHit(this.currHit));\r\n const sameHit = (sameElem && !newSnap);\r\n const sameSnap = (sameElem && undefined !== newSnap && undefined !== currSnap);\r\n const samePt = (sameHit || (sameSnap && newSnap.snapPoint.isAlmostEqual(currSnap.snapPoint)));\r\n const sameHot = (sameHit || (sameSnap && (this.isHot === newSnap.isHot)));\r\n const sameBaseSnapMode = (!newSnap || !currSnap || newSnap.snapMode === currSnap.snapMode);\r\n const sameType = (sameHot && (!currSnap || (currSnap.getHitType() === newHit.getHitType())));\r\n\r\n // see if it is the same point on the same element, the hot flags are the same multiple snaps, and the snap modes are the same\r\n if (samePt && sameType && sameBaseSnapMode) {\r\n // we know that nothing about the screen could change, just save the new hit and return to avoid screen flash\r\n this.currHit = newHit;\r\n return;\r\n }\r\n\r\n this.erase();\r\n\r\n // if we hit the same element with the same \"hotness\" as last time, we don't need to erase it\r\n // multiple snaps: but only if the old and new snap modes are the same\r\n if (!sameHot || !sameBaseSnapMode) {\r\n this.unFlashViews();\r\n this.setFlashHit(newHit);\r\n }\r\n\r\n // if we didn't get a new hit, we're done\r\n if (undefined === (this.currHit = newHit))\r\n return;\r\n\r\n // draw sprites for this hit\r\n this.showSnapSprite();\r\n }\r\n\r\n /** flash a hit in a single view. */\r\n private flashHitInView(hit: HitDetail, context: DecorateContext) {\r\n const viewport = context.viewport;\r\n if (!viewport || !this.hitShouldBeHilited(hit) || !this.needsFlash(viewport))\r\n return;\r\n\r\n hit.draw(context);\r\n this.setIsFlashed(viewport);\r\n }\r\n\r\n private setNeedsFlashView(view: Viewport) {\r\n if (!this.isFlashed(view) && !this.needsFlash(view))\r\n this.setNeedsFlash(view);\r\n }\r\n\r\n /** flash a hit in its view. */\r\n private setFlashHit(hit?: HitDetail): void {\r\n if (hit !== undefined && this.hitShouldBeHilited(hit))\r\n this.setNeedsFlashView(hit.viewport);\r\n }\r\n\r\n /** @internal */\r\n public erase(): void {\r\n this.clearToolTip(undefined); // make sure there's no tooltip up.\r\n this.clearSprites(); // remove all sprites from the screen\r\n }\r\n\r\n private showElemInfo(viewPt: XAndY, vp: ScreenViewport, hit: HitDetail, delay: BeDuration): void {\r\n if (!IModelApp.viewManager.doesHostHaveFocus || undefined !== this._toolTipPromise)\r\n return;\r\n\r\n const promise = this._toolTipPromise = delay.executeAfter(async () => {\r\n if (promise !== this._toolTipPromise)\r\n return; // we abandoned this request during delay\r\n try {\r\n const msg = await IModelApp.toolAdmin.getToolTip(hit);\r\n if (this._toolTipPromise === promise) // have we abandoned this request while awaiting getToolTip?\r\n this.showLocateMessage(viewPt, vp, msg);\r\n } catch (error) { } // happens if getToolTip was canceled\r\n });\r\n }\r\n\r\n private showLocateMessage(viewPt: XAndY, vp: ScreenViewport, msg: HTMLElement | string) {\r\n if (IModelApp.viewManager.doesHostHaveFocus)\r\n vp.openToolTip(msg, viewPt);\r\n }\r\n\r\n /** @internal */\r\n public displayToolTip(viewPt: XAndY, vp: ScreenViewport, uorPt?: Point3d): void {\r\n // if the tooltip is already displayed, or if user doesn't want it, quit.\r\n if (!this._settings.toolTip || !IModelApp.notifications.isToolTipSupported || IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n const accuSnapHit = this.currHit;\r\n const tpHit = IModelApp.tentativePoint.getCurrSnap();\r\n\r\n // if we don't have either an AccuSnap or a tentative point hit, quit.\r\n if (!accuSnapHit && !tpHit && !this.errorIcon.isActive)\r\n return;\r\n\r\n let theHit: HitDetail | undefined;\r\n\r\n // determine which type of hit\r\n if (tpHit) {\r\n if (uorPt) {\r\n // see if he came back somewhere near the currently snapped element\r\n const aperture = (this._settings.stickyFactor * vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n if (!IModelApp.locateManager.picker.testHit(tpHit, vp, uorPt, aperture, IModelApp.locateManager.options))\r\n return;\r\n }\r\n theHit = tpHit;\r\n } else {\r\n theHit = accuSnapHit;\r\n }\r\n\r\n // if we're currently showing an error, get the error message...otherwise display hit info...\r\n if (!this.errorIcon.isActive && theHit) {\r\n this.showElemInfo(viewPt, vp, theHit, this._settings.toolTipDelay);\r\n return;\r\n }\r\n\r\n // If we have an error explanation...use it as is!\r\n if (this.explanation) {\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n return;\r\n }\r\n\r\n // if we don't have an explanation yet, translate the error code.\r\n if (!this.errorKey)\r\n return;\r\n\r\n this.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${this.errorKey}`);\r\n if (!this.explanation)\r\n return;\r\n\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n }\r\n\r\n /** @internal */\r\n public clearToolTip(ev?: BeButtonEvent): void {\r\n // Throw away any stale request for a tooltip message\r\n this._toolTipPromise = undefined;\r\n if (!IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n if (ev && (5 > ev.viewPoint.distanceXY(IModelApp.notifications.toolTipLocation)))\r\n return;\r\n\r\n IModelApp.notifications.clearToolTip();\r\n }\r\n\r\n /** Display the sprites for the current snap to indicate its position on the screen and what snap mode it represents. */\r\n private showSnapSprite(): void {\r\n const snap = this.getCurrSnapDetail();\r\n if (!snap)\r\n return;\r\n\r\n const crossPt = snap.snapPoint;\r\n const viewport = snap.viewport;\r\n const crossSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}${snap.isHot ? \"sprites/SnapCross.png\" : \"sprites/SnapUnfocused.png\"}`);\r\n\r\n this.cross.activate(crossSprite, viewport, crossPt);\r\n\r\n const snapSprite = snap.sprite;\r\n if (snapSprite)\r\n this.icon.activate(snapSprite, viewport, AccuSnap.adjustIconLocation(viewport, crossPt, snapSprite.size));\r\n }\r\n\r\n private static adjustIconLocation(vp: Viewport, input: Point3d, iconSize: XAndY): Point3d {\r\n const out = vp.worldToView(input);\r\n out.x += (iconSize.x / 3.0);\r\n out.y -= (iconSize.y * 1.3);\r\n return vp.viewToWorld(out, out);\r\n }\r\n\r\n /** try to indicate what's wrong with the current point (why we're not snapping). */\r\n private showSnapError(out: LocateResponse, ev: BeButtonEvent) {\r\n this.explanation = out.explanation;\r\n this.errorKey = out.reason;\r\n this.errorIcon.deactivate();\r\n\r\n const vp = ev.viewport!;\r\n let errorSprite: Sprite | undefined;\r\n switch (out.snapStatus) {\r\n case SnapStatus.FilteredByApp:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapAppFiltered.png`);\r\n break;\r\n\r\n case SnapStatus.FilteredByAppQuietly:\r\n this.errorKey = undefined;\r\n break;\r\n\r\n case SnapStatus.NotSnappable:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapNotSnappable.png`);\r\n this.errorKey = ElementLocateManager.getFailureMessageKey(\"NotSnappable\");\r\n break;\r\n }\r\n\r\n if (!errorSprite)\r\n return;\r\n\r\n const spriteSize = errorSprite.size;\r\n const pt = AccuSnap.adjustIconLocation(vp, ev.rawPoint, spriteSize);\r\n\r\n this.errorIcon.activate(errorSprite, vp, pt);\r\n }\r\n\r\n private clearSprites() {\r\n this.errorIcon.deactivate();\r\n this.cross.deactivate();\r\n this.icon.deactivate();\r\n }\r\n\r\n /** determine whether a hit should be hilited or not. */\r\n private hitShouldBeHilited(hit: HitDetail | undefined): boolean {\r\n if (!hit)\r\n return false;\r\n\r\n if (hit.isModelHit || hit.isMapHit)\r\n return false; // Avoid annoying flashing of reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return false;\r\n\r\n const snap = AccuSnap.toSnapDetail(hit);\r\n return !snap || snap.isHot || this._settings.hiliteColdHits;\r\n }\r\n\r\n private unFlashViews() {\r\n this.needFlash.clear();\r\n for (const vp of this.areFlashed)\r\n vp.flashedId = undefined;\r\n\r\n this.areFlashed.clear();\r\n }\r\n\r\n /** @internal */\r\n public adjustPointIfHot(pt: Point3d, view: Viewport): void {\r\n const currSnap = this.getCurrSnapDetail();\r\n\r\n if (!currSnap || !currSnap.isHot || view !== currSnap.viewport)\r\n return;\r\n\r\n pt.setFrom(currSnap.adjustedPoint);\r\n }\r\n\r\n /** Implemented by sub-classes to update ui to show current enabled state.\r\n * @internal\r\n */\r\n public onEnabledStateChange(_isEnabled: boolean, _wasEnabled: boolean) { }\r\n\r\n /** @internal */\r\n public getHitAndList(holder: HitListHolder): HitDetail | undefined {\r\n const hit = this.currHit;\r\n if (hit) {\r\n holder.setHitList(this.aSnapHits);\r\n this.aSnapHits = undefined;\r\n }\r\n return hit;\r\n }\r\n\r\n private initCmdState() {\r\n this.toolState.suspended = 0;\r\n this.toolState.neverFlash = undefined;\r\n }\r\n\r\n /** @internal */\r\n public suspend(doSuspend: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuspend)\r\n this.toolState.suspended++;\r\n else if (this.toolState.suspended > 0)\r\n this.toolState.suspended--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public suppress(doSuppress: boolean): number {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuppress)\r\n this._suppressed++;\r\n else if (this._suppressed > 0)\r\n this._suppressed--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n return this._suppressed;\r\n }\r\n\r\n /** Turn AccuSnap on or off */\r\n public enableSnap(yesNo: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n this.toolState.enabled = yesNo;\r\n if (!yesNo) {\r\n this.clear();\r\n if (undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public intersectXY(tpSnap: SnapDetail, second: SnapDetail): IntersectDetail | undefined {\r\n // Get single segment curve from each snap to intersect...\r\n const tpSegment = tpSnap.getCurvePrimitive();\r\n if (undefined === tpSegment)\r\n return undefined;\r\n const segment = second.getCurvePrimitive();\r\n if (undefined === segment)\r\n return undefined;\r\n\r\n const worldToView = second.viewport.worldToViewMap.transform0;\r\n const detail = CurveCurve.intersectionProjectedXYPairs(worldToView, tpSegment, true, segment, true);\r\n if (0 === detail.length)\r\n return undefined;\r\n\r\n let closeIndex = 0;\r\n if (detail.length > 1) {\r\n const snapPt = worldToView.multiplyPoint3d(HitGeomType.Point === tpSnap.geomType && HitGeomType.Point !== second.geomType ? second.getPoint() : tpSnap.getPoint(), 1); // Don't check distance from arc centers...\r\n let lastDist: number | undefined;\r\n\r\n for (let i = 0; i < detail.length; i++) {\r\n const testPt = worldToView.multiplyPoint3d(detail[i].detailA.point, 1);\r\n const testDist = snapPt.realDistanceXY(testPt);\r\n\r\n if (undefined !== testDist && (undefined === lastDist || testDist < lastDist)) {\r\n lastDist = testDist;\r\n closeIndex = i;\r\n }\r\n }\r\n }\r\n\r\n const intersect = new IntersectDetail(tpSnap, SnapHeat.InRange, detail[closeIndex].detailA.point, segment, second.sourceId); // Should be ok to share hit detail with tentative...\r\n intersect.primitive = tpSegment; // Just save single segment that was intersected for line strings/shapes...\r\n\r\n return intersect;\r\n }\r\n\r\n /** @internal */\r\n public static async requestSnap(thisHit: HitDetail, snapModes: SnapMode[], hotDistanceInches: number, keypointDivisor: number, hitList?: HitList<HitDetail>, out?: LocateResponse): Promise<SnapDetail | undefined> {\r\n if (thisHit.isModelHit || thisHit.isMapHit || thisHit.isClassifier) {\r\n if (snapModes.includes(SnapMode.Nearest)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n return new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.InRange);\r\n } else if (1 === snapModes.length && snapModes.includes(SnapMode.Intersection)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined;\r\n } else {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n const realitySnap = new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.None);\r\n realitySnap.sprite = undefined; // Don't show a snap mode that isn't applicable, but still accept hit point...\r\n return realitySnap;\r\n }\r\n }\r\n\r\n const hitVp = thisHit.viewAttachment ? thisHit.viewAttachment.viewport : thisHit.viewport;\r\n if (undefined !== thisHit.subCategoryId && !thisHit.isExternalIModelHit) {\r\n const appearance = hitVp.getSubCategoryAppearance(thisHit.subCategoryId);\r\n if (appearance.dontSnap) {\r\n if (out) {\r\n out.snapStatus = SnapStatus.NotSnappable;\r\n out.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${ElementLocateManager.getFailureMessageKey(\"NotSnappableSubCategory\")}`);\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n const requestProps: SnapRequestProps = {\r\n id: thisHit.sourceId,\r\n testPoint: thisHit.testPoint,\r\n closePoint: thisHit.hitPoint,\r\n worldToView: hitVp.worldToViewMap.transform0.toJSON(),\r\n viewFlags: hitVp.viewFlags,\r\n snapModes,\r\n snapAperture: hitVp.pixelsFromInches(hotDistanceInches),\r\n snapDivisor: keypointDivisor,\r\n subCategoryId: thisHit.subCategoryId,\r\n geometryClass: thisHit.geometryClass,\r\n };\r\n\r\n const thisGeom = (thisHit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(thisHit) : IModelApp.viewManager.getDecorationGeometry(thisHit));\r\n\r\n if (undefined !== thisGeom) {\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: thisGeom }];\r\n } else if (!thisHit.isElementHit) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n return undefined;\r\n }\r\n\r\n if (snapModes.includes(SnapMode.Intersection)) {\r\n if (undefined !== hitList) {\r\n for (const hit of hitList.hits) {\r\n if (thisHit.sourceId === hit.sourceId || thisHit.iModel !== hit.iModel)\r\n continue;\r\n\r\n const geom = (hit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(hit) : IModelApp.viewManager.getDecorationGeometry(hit));\r\n\r\n if (undefined !== geom) {\r\n if (undefined === requestProps.decorationGeometry)\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: geom }];\r\n else\r\n requestProps.decorationGeometry.push({ id: thisHit.sourceId, geometryStream: geom });\r\n } else if (!hit.isElementHit) {\r\n continue;\r\n }\r\n\r\n if (undefined === requestProps.intersectCandidates)\r\n requestProps.intersectCandidates = [hit.sourceId];\r\n else\r\n requestProps.intersectCandidates.push(hit.sourceId);\r\n\r\n if (5 === requestProps.intersectCandidates.length)\r\n break; // Search for intersection with a few of the next best hits...\r\n }\r\n }\r\n\r\n if (1 === snapModes.length && undefined === requestProps.intersectCandidates) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined; // Don't make back end request when only doing intersection snap when we don't have another hit to intersect with...\r\n }\r\n }\r\n\r\n try {\r\n const result = await thisHit.iModel.requestSnap(requestProps);\r\n\r\n if (out)\r\n out.snapStatus = result.status;\r\n\r\n if (result.status !== SnapStatus.Success)\r\n return undefined;\r\n\r\n const parseCurve = (json: any): CurvePrimitive | undefined => {\r\n const parsed = undefined !== json ? GeomJson.Reader.parse(json) : undefined;\r\n return parsed instanceof GeometryQuery && \"curvePrimitive\" === parsed.geometryCategory ? parsed : undefined;\r\n };\r\n\r\n const snapPoint = Point3d.fromJSON(result.snapPoint);\r\n const displayTransform = undefined !== thisHit.modelId ? thisHit.viewport.view.computeDisplayTransform({\r\n modelId: thisHit.modelId,\r\n elementId: thisHit.sourceId,\r\n viewAttachmentId: thisHit.viewAttachment?.id,\r\n }) : undefined;\r\n displayTransform?.multiplyPoint3d(snapPoint, snapPoint);\r\n\r\n const snap = new SnapDetail(thisHit, result.snapMode, result.heat, snapPoint);\r\n\r\n snap.setCurvePrimitive(parseCurve(result.curve), displayTransform, result.geomType);\r\n if (undefined !== result.parentGeomType)\r\n snap.parentGeomType = result.parentGeomType;\r\n\r\n // Update hitPoint from readPixels with exact point location corrected to surface/edge geometry.\r\n if (undefined !== result.hitPoint) {\r\n snap.hitPoint.setFromJSON(result.hitPoint);\r\n displayTransform?.multiplyPoint3d(snap.hitPoint, snap.hitPoint);\r\n }\r\n\r\n // Apply display transform to normal.\r\n if (undefined !== result.normal) {\r\n snap.normal = Vector3d.fromJSON(result.normal);\r\n displayTransform?.matrix.multiplyVector(snap.normal, snap.normal);\r\n snap.normal.normalizeInPlace();\r\n }\r\n\r\n if (SnapMode.Intersection !== snap.snapMode)\r\n return snap;\r\n\r\n if (undefined === result.intersectId)\r\n return undefined;\r\n\r\n const otherPrimitive = parseCurve(result.intersectCurve);\r\n if (undefined === otherPrimitive)\r\n return undefined;\r\n\r\n const intersect = new IntersectDetail(snap, snap.heat, snap.snapPoint, otherPrimitive, result.intersectId);\r\n return intersect;\r\n } catch (_err) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Aborted;\r\n\r\n return undefined;\r\n }\r\n }\r\n\r\n private async getAccuSnapDetail(hitList: HitList<HitDetail>, out: LocateResponse): Promise<SnapDetail | undefined> {\r\n const thisHit = hitList.getNextHit();\r\n if (undefined === thisHit)\r\n return undefined;\r\n\r\n const filterStatus: LocateFilterStatus = (this.isLocateEnabled ? await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, out) : LocateFilterStatus.Accept);\r\n if (LocateFilterStatus.Accept !== filterStatus) {\r\n out.snapStatus = SnapStatus.FilteredByApp;\r\n return undefined;\r\n }\r\n\r\n let snapModes: SnapMode[];\r\n if (IModelApp.tentativePoint.isActive) {\r\n snapModes = [];\r\n snapModes.push(SnapMode.Nearest); // Special case: isActive only allows snapping with tentative to find extended intersections...\r\n } else {\r\n snapModes = this.getActiveSnapModes(); // Get the list of point snap modes to consider\r\n }\r\n\r\n const thisSnap = await AccuSnap.requestSnap(thisHit, snapModes, this._hotDistanceInches, this.keypointDivisor, hitList, out);\r\n if (undefined === thisSnap)\r\n return undefined;\r\n\r\n if (IModelApp.tentativePoint.isActive) {\r\n const tpSnap = IModelApp.tentativePoint.getCurrSnap();\r\n if (undefined === tpSnap)\r\n return undefined;\r\n const intersectSnap = this.intersectXY(tpSnap, thisSnap);\r\n if (undefined === intersectSnap)\r\n return undefined;\r\n hitList.setCurrentHit(thisHit);\r\n return intersectSnap;\r\n }\r\n\r\n IModelApp.accuDraw.onSnap(thisSnap); // AccuDraw can adjust nearest snap to intersection of circle (polar distance lock) or line (axis lock) with snapped to curve...\r\n hitList.setCurrentHit(thisHit);\r\n return thisSnap;\r\n }\r\n\r\n /** Request a snap from the backend for the supplied HitDetail.\r\n * @param hit The HitDetail to snap to.\r\n * @param snapMode Optional SnapMode, uses active snap modes if not specified.\r\n * @return A Promise for the SnapDetail or undefined if no snap could be created.\r\n */\r\n public async doSnapRequest(hit: HitDetail, snapMode?: SnapMode): Promise<SnapDetail | undefined> {\r\n let snapModes: SnapMode[];\r\n if (undefined === snapMode)\r\n snapModes = this.getActiveSnapModes();\r\n else\r\n snapModes = [snapMode];\r\n\r\n return AccuSnap.requestSnap(hit, snapModes, this._hotDistanceInches, this.keypointDivisor);\r\n }\r\n\r\n private findHits(ev: BeButtonEvent, force: boolean = false): SnapStatus {\r\n // When using AccuSnap to locate elements, we have to start with the datapoint adjusted\r\n // for locks and not the raw point. Otherwise, when grid/unit lock are on, we locate elements by\r\n // points not on the grid. This causes them to be \"pulled\" off the grid when they are accepted. On\r\n // the other hand, when NOT locating, we need to use the raw point so we can snap to elements\r\n // away from the grid.\r\n\r\n const testPoint = this.isLocateEnabled ? ev.point : ev.rawPoint;\r\n const vp = ev.viewport!;\r\n const picker = IModelApp.locateManager.picker;\r\n const options = IModelApp.locateManager.options.clone(); // Copy to avoid changing out from under active Tool...\r\n\r\n // NOTE: Since TestHit will use the same HitSource as the input hit we only need to sets this for DoPick...\r\n options.hitSource = this.isSnapEnabled ? HitSource.AccuSnap : HitSource.MotionLocate;\r\n\r\n let aperture = (vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n this.initializeForCheckMotion();\r\n aperture *= this._searchDistance;\r\n\r\n if (0 === picker.doPick(vp, testPoint, aperture, options)) {\r\n this.aSnapHits = undefined; // Clear any previous hit list so reset won't cycle through hits cursor is no longer over, etc.\r\n return SnapStatus.NoElements;\r\n }\r\n\r\n this.aSnapHits = picker.getHitList(true); // take ownership of the pickElem hit list.\r\n\r\n // see if we should keep the current hit\r\n const canBeSticky = !force && this.aSnapHits.length > 1 && this.currHit && (HitDetailType.Intersection !== this.currHit.getHitType() && this.currHit.priority < HitPriority.PlanarSurface);\r\n if (canBeSticky) {\r\n for (let iHit = 1; iHit < this.aSnapHits.length; ++iHit) {\r\n const thisHit = this.aSnapHits.hits[iHit];\r\n if (!thisHit.isSameHit(this.currHit))\r\n continue;\r\n this.aSnapHits.removeHit(iHit);\r\n this.aSnapHits.insertHit(0, thisHit);\r\n break;\r\n }\r\n }\r\n\r\n return SnapStatus.Success;\r\n }\r\n\r\n private async findLocatableHit(ev: BeButtonEvent, newSearch: boolean, out: LocateResponse): Promise<HitDetail | undefined> {\r\n out.snapStatus = SnapStatus.NoElements;\r\n\r\n if (newSearch) {\r\n this.aSnapHits = undefined;\r\n // search for new hits, but if the cursor is still close to the current hit, don't throw away list.\r\n if (SnapStatus.Success !== (out.snapStatus = this.findHits(ev)))\r\n return undefined;\r\n } else {\r\n if (!this.aSnapHits) {\r\n out.snapStatus = SnapStatus.NoElements;\r\n return undefined;\r\n }\r\n }\r\n\r\n const thisList = this.aSnapHits!;\r\n let thisHit: HitDetail | undefined;\r\n let firstRejected;\r\n const filterResponse = new LocateResponse();\r\n\r\n // keep looking through hits until we find one that is accu-snappable.\r\n while (undefined !== (thisHit = thisList.getNextHit())) {\r\n if (LocateFilterStatus.Accept === await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, filterResponse))\r\n return thisHit;\r\n // we only care about the status of the first hit.\r\n if (undefined !== firstRejected)\r\n continue;\r\n firstRejected = filterResponse.clone();\r\n firstRejected.snapStatus = SnapStatus.FilteredByApp;\r\n }\r\n\r\n if (undefined !== firstRejected)\r\n out.setFrom(firstRejected);\r\n\r\n // Reset current hit index to go back to first hit on next AccuSnap reset event...\r\n thisList.resetCurrentHit();\r\n return undefined;\r\n }\r\n\r\n /** When in auto-locate mode, advance to the next hit without searching again.\r\n * @internal\r\n */\r\n public async resetButton(): Promise<SnapStatus> {\r\n let hit: HitDetail | undefined;\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n this.clearToolTip(undefined);\r\n\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n\r\n if (this._doSnapping) {\r\n // if we don't have any more candidate hits, get a new list at the current location\r\n if (!this.aSnapHits || (0 === this.aSnapHits.length)) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n } else {\r\n // drop the current hit from the list and then retest the list (without the dropped hit) to find the new snap\r\n this.aSnapHits.removeCurrentHit();\r\n hit = await this.getAccuSnapDetail(this.aSnapHits, out);\r\n }\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, false, out); // get next AccuSnap path (or undefined)\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n\r\n // set the current hit\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // indicate errors\r\n this.showSnapError(out, ev);\r\n return out.snapStatus;\r\n }\r\n\r\n /** Find the best snap point according to the current cursor location\r\n * @internal\r\n */\r\n public async onMotion(ev: BeButtonEvent): Promise<void> {\r\n this.clearToolTip(ev);\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n let hit: HitDetail | undefined;\r\n if (this.isActive) {\r\n if (this._doSnapping) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, true, out);\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n }\r\n\r\n // set the current hit and display the sprite (based on snap's KeypointType)\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // set up active error before calling displayToolTip to indicate error or show locate message...\r\n this.showSnapError(out, ev);\r\n this.displayToolTip(ev.viewPoint, ev.viewport!, ev.rawPoint);\r\n\r\n if (undefined !== this.touchCursor && InputSource.Mouse === ev.inputSource) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onPreButtonEvent(ev: BeButtonEvent): boolean { return (undefined !== this.touchCursor) ? this.touchCursor.isButtonHandled(ev) : false; }\r\n /** @internal */\r\n public onTouchStart(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchStart(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchEnd(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor && 0 === ev.touchCount)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchCancel(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchMove(ev: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMove(ev) : false;\r\n }\r\n\r\n /** @internal */\r\n public onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMoveStart(ev, startEv) : false;\r\n }\r\n\r\n /** @internal */\r\n public get wantVirtualCursor(): boolean {\r\n return this._doSnapping || (this.isLocateEnabled && ToolSettings.enableVirtualCursorForLocate);\r\n }\r\n\r\n /** @internal */\r\n public async onTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined !== this.touchCursor)\r\n return this.touchCursor.doTouchTap(ev);\r\n if (!this.wantVirtualCursor)\r\n return false;\r\n this.touchCursor = TouchCursor.createFromTouchTap(ev);\r\n if (undefined === this.touchCursor)\r\n return false;\r\n // Give active tool an opportunity to update it's tool assistance since event won't be passed along...\r\n const tool = IModelApp.toolAdmin.activeTool;\r\n if (undefined === tool)\r\n return true;\r\n await tool.onSuspend();\r\n await tool.onUnsuspend();\r\n return true;\r\n }\r\n\r\n private flashElements(context: DecorateContext): void {\r\n const viewport = context.viewport;\r\n if (this.currHit) {\r\n if (this.needsFlash(viewport))\r\n this.flashHitInView(this.currHit, context);\r\n return;\r\n }\r\n\r\n const hit = IModelApp.tentativePoint.getCurrSnap();\r\n if (!hit || hit.isModelHit || hit.isMapHit)\r\n return; // Don't hilite reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return;\r\n\r\n hit.draw(context);\r\n }\r\n\r\n /** @internal */\r\n public decorate(context: DecorateContext): void {\r\n if (undefined !== this.touchCursor && this.touchCursor.viewport === context.viewport)\r\n context.addCanvasDecoration(this.touchCursor, true);\r\n\r\n this.flashElements(context);\r\n\r\n if (this.cross.isActive) {\r\n this.cross.decorate(context);\r\n this.icon.decorate(context);\r\n }\r\n\r\n this.errorIcon.decorate(context);\r\n }\r\n\r\n private clearElemFromHitList(element: string) {\r\n if (this.aSnapHits)\r\n this.aSnapHits.removeHitsFrom(element);\r\n }\r\n\r\n /** @internal */\r\n public clearIfElement(sourceId: string): void {\r\n this.clearElemFromHitList(sourceId);\r\n\r\n const hit = this.currHit;\r\n if (hit && hit.sourceId === sourceId) {\r\n this.destroy();\r\n }\r\n }\r\n\r\n /** Enable locating elements.\r\n * @public\r\n */\r\n public enableLocate(yesNo: boolean) {\r\n this.toolState.locate = yesNo;\r\n if (!yesNo && undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** Called whenever a new [[Tool]] is started.\r\n * @internal\r\n */\r\n public onStartTool(): void {\r\n this.initCmdState();\r\n this.enableSnap(false);\r\n this.enableLocate(false);\r\n IModelApp.tentativePoint.clear(true);\r\n }\r\n\r\n /**\r\n * Force AccuSnap to reevaluate the snap at the current cursor location.\r\n * This is useful of an application changes the snap mode and wants AccuSnap to choose it immediately, without\r\n * requiring the user to move the mouse.\r\n * @internal\r\n */\r\n public async reEvaluate() {\r\n if (this.getCurrSnapDetail()) {\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n return this.onMotion(ev);\r\n }\r\n }\r\n}\r\n\r\n/** TentativeOrAccuSnap returns information about an active snap generated by either [[AccuSnap]] or [[TentativePoint]].\r\n * @public\r\n */\r\nexport class TentativeOrAccuSnap {\r\n /** @return true if AccuSnap is *hot* or TentativePoint is active and snapped to pickable geometry. */\r\n public static get isHot(): boolean { return IModelApp.accuSnap.isHot || IModelApp.tentativePoint.isSnapped; }\r\n\r\n /** Get the current snap from either AccuSnap or TentativePoint.\r\n * @param checkIsHot true to only return the snap from AccuSnap when it is *hot*.\r\n * @return The current snap from AccuSnap, TentativePoint, or undefined.\r\n */\r\n public static getCurrentSnap(checkIsHot: boolean = true): SnapDetail | undefined {\r\n // Checking for a hot AccuSnap before checking TentativePoint is done to support extended intersections...\r\n if (IModelApp.accuSnap.isHot)\r\n return IModelApp.accuSnap.getCurrSnapDetail();\r\n\r\n if (IModelApp.tentativePoint.isSnapped)\r\n return IModelApp.tentativePoint.currSnap;\r\n\r\n return (checkIsHot ? undefined : IModelApp.accuSnap.getCurrSnapDetail());\r\n }\r\n\r\n /** @return The current snap location from AccuSnap or TentativePoint */\r\n public static getCurrentPoint(): Point3d {\r\n if (IModelApp.accuSnap.isHot) {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n if (snap)\r\n return snap.adjustedPoint;\r\n }\r\n\r\n return IModelApp.tentativePoint.getPoint();\r\n }\r\n\r\n /** @return The current snap Viewport from AccuSnap or TentativePoint */\r\n public static getCurrentView(): ScreenViewport | undefined {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n return snap ? snap.viewport : IModelApp.tentativePoint.viewport;\r\n }\r\n}\r\n\r\n/** @public */\r\nexport namespace AccuSnap { // eslint-disable-line no-redeclare\r\n export class ToolState {\r\n public enabled = false;\r\n public locate = false;\r\n public suspended = 0;\r\n public neverFlash?: Id64Set;\r\n public setFrom(other: ToolState): void {\r\n this.enabled = other.enabled;\r\n this.locate = other.locate;\r\n this.suspended = other.suspended;\r\n this.neverFlash = other.neverFlash;\r\n }\r\n public clone(): ToolState {\r\n const val = new ToolState();\r\n val.setFrom(this);\r\n return val;\r\n }\r\n }\r\n\r\n export class Settings {\r\n public hotDistanceFactor = 1.2;\r\n public stickyFactor = 1.0;\r\n public searchDistance = 2.0;\r\n public hiliteColdHits = true;\r\n public enableFlag = true;\r\n public toolTip = true;\r\n public toolTipDelay = BeDuration.fromSeconds(.5); // delay before tooltip pops up\r\n }\r\n}\r\n"]}
@@ -224,11 +224,20 @@ export declare class AccuSnap implements Decorator {
224
224
  */
225
225
  reEvaluate(): Promise<void>;
226
226
  }
227
- /** @internal */
227
+ /** TentativeOrAccuSnap returns information about an active snap generated by either [[AccuSnap]] or [[TentativePoint]].
228
+ * @public
229
+ */
228
230
  export declare class TentativeOrAccuSnap {
231
+ /** @return true if AccuSnap is *hot* or TentativePoint is active and snapped to pickable geometry. */
229
232
  static get isHot(): boolean;
233
+ /** Get the current snap from either AccuSnap or TentativePoint.
234
+ * @param checkIsHot true to only return the snap from AccuSnap when it is *hot*.
235
+ * @return The current snap from AccuSnap, TentativePoint, or undefined.
236
+ */
230
237
  static getCurrentSnap(checkIsHot?: boolean): SnapDetail | undefined;
238
+ /** @return The current snap location from AccuSnap or TentativePoint */
231
239
  static getCurrentPoint(): Point3d;
240
+ /** @return The current snap Viewport from AccuSnap or TentativePoint */
232
241
  static getCurrentView(): ScreenViewport | undefined;
233
242
  }
234
243
  /** @public */
@@ -1 +1 @@
1
- {"version":3,"file":"AccuSnap.d.ts","sourceRoot":"","sources":["../../src/AccuSnap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccuSnap.d.ts","sourceRoot":"","sources":["../../src/AccuSnap.ts"],"names":[],"mappings":"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"}
@@ -965,17 +965,25 @@ export class AccuSnap {
965
965
  }
966
966
  }
967
967
  }
968
- /** @internal */
968
+ /** TentativeOrAccuSnap returns information about an active snap generated by either [[AccuSnap]] or [[TentativePoint]].
969
+ * @public
970
+ */
969
971
  export class TentativeOrAccuSnap {
972
+ /** @return true if AccuSnap is *hot* or TentativePoint is active and snapped to pickable geometry. */
970
973
  static get isHot() { return IModelApp.accuSnap.isHot || IModelApp.tentativePoint.isSnapped; }
974
+ /** Get the current snap from either AccuSnap or TentativePoint.
975
+ * @param checkIsHot true to only return the snap from AccuSnap when it is *hot*.
976
+ * @return The current snap from AccuSnap, TentativePoint, or undefined.
977
+ */
971
978
  static getCurrentSnap(checkIsHot = true) {
972
- // Checking for a hot AccuSnap hit before checking tentative is probably necessary for extended intersections?
979
+ // Checking for a hot AccuSnap before checking TentativePoint is done to support extended intersections...
973
980
  if (IModelApp.accuSnap.isHot)
974
981
  return IModelApp.accuSnap.getCurrSnapDetail();
975
982
  if (IModelApp.tentativePoint.isSnapped)
976
983
  return IModelApp.tentativePoint.currSnap;
977
984
  return (checkIsHot ? undefined : IModelApp.accuSnap.getCurrSnapDetail());
978
985
  }
986
+ /** @return The current snap location from AccuSnap or TentativePoint */
979
987
  static getCurrentPoint() {
980
988
  if (IModelApp.accuSnap.isHot) {
981
989
  const snap = IModelApp.accuSnap.getCurrSnapDetail();
@@ -984,6 +992,7 @@ export class TentativeOrAccuSnap {
984
992
  }
985
993
  return IModelApp.tentativePoint.getPoint();
986
994
  }
995
+ /** @return The current snap Viewport from AccuSnap or TentativePoint */
987
996
  static getCurrentView() {
988
997
  const snap = IModelApp.accuSnap.getCurrSnapDetail();
989
998
  return snap ? snap.viewport : IModelApp.tentativePoint.viewport;
@@ -1 +1 @@
1
- {"version":3,"file":"AccuSnap.js","sourceRoot":"","sources":["../../src/AccuSnap.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/** @packageDocumentation\r\n * @module LocatingElements\r\n */\r\n\r\nimport { BeDuration, Id64, Id64Arg, Id64Set } from \"@itwin/core-bentley\";\r\nimport { CurveCurve, CurvePrimitive, GeometryQuery, IModelJson as GeomJson, Point2d, Point3d, Vector3d, XAndY } from \"@itwin/core-geometry\";\r\nimport { SnapRequestProps } from \"@itwin/core-common\";\r\nimport { ElementLocateManager, HitListHolder, LocateAction, LocateFilterStatus, LocateResponse, SnapStatus } from \"./ElementLocateManager\";\r\nimport { HitDetail, HitDetailType, HitGeomType, HitList, HitPriority, HitSource, IntersectDetail, SnapDetail, SnapHeat, SnapMode } from \"./HitDetail\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { CanvasDecoration } from \"./render/CanvasDecoration\";\r\nimport { IconSprites, Sprite, SpriteLocation } from \"./Sprites\";\r\nimport { BeButton, BeButtonEvent, BeTouchEvent, InputSource } from \"./tools/Tool\";\r\nimport { ToolSettings } from \"./tools/ToolSettings\";\r\nimport { DecorateContext } from \"./ViewContext\";\r\nimport { Decorator } from \"./ViewManager\";\r\nimport { ScreenViewport, Viewport } from \"./Viewport\";\r\n\r\n// cspell:ignore dont primitivetools\r\n\r\n/** Virtual cursor for using AccuSnap with touch input.\r\n * @internal\r\n */\r\nexport class TouchCursor implements CanvasDecoration {\r\n public position = new Point3d();\r\n public viewport: Viewport;\r\n protected _offsetPosition = new Point3d();\r\n protected _size: number;\r\n protected _yOffset: number;\r\n protected _isSelected = false;\r\n protected _isDragging = false;\r\n protected _inTouchTap = false;\r\n\r\n protected constructor(vp: ScreenViewport) {\r\n this._size = vp.pixelsFromInches(0.3);\r\n this._yOffset = this._size * 1.75;\r\n this.viewport = vp;\r\n }\r\n\r\n protected setPosition(vp: Viewport, worldLocation: Point3d): boolean {\r\n const pointNpc = vp.worldToNpc(worldLocation);\r\n if (pointNpc.z < 0.0 || pointNpc.z > 1.0)\r\n pointNpc.z = 0.5; // move inside frustum.\r\n\r\n const viewLocation = vp.npcToView(pointNpc);\r\n if (!vp.viewRect.containsPoint(viewLocation))\r\n return false; // outside this viewport rect\r\n\r\n viewLocation.x = Math.floor(viewLocation.x) + 0.5;\r\n viewLocation.y = Math.floor(viewLocation.y) + 0.5;\r\n viewLocation.z = 0.0;\r\n const offsetLocation = new Point3d(viewLocation.x, viewLocation.y - this._yOffset, viewLocation.z);\r\n if (!vp.viewRect.containsPoint(offsetLocation))\r\n return false; // outside this viewport rect\r\n\r\n this.position.setFrom(viewLocation);\r\n this._offsetPosition.setFrom(offsetLocation);\r\n if (vp !== this.viewport) {\r\n this.viewport.invalidateDecorations();\r\n this.viewport = vp;\r\n }\r\n vp.invalidateDecorations();\r\n return true;\r\n }\r\n\r\n protected drawHandle(ctx: CanvasRenderingContext2D, filled: boolean): void {\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size, 0);\r\n ctx.bezierCurveTo(-this._size, -this._size * 0.85, -this._size * 0.6, -this._yOffset * 0.6, 0, -this._yOffset * 0.8);\r\n ctx.bezierCurveTo(this._size * 0.6, -this._yOffset * 0.6, this._size, -this._size * 0.85, this._size, 0);\r\n ctx.arc(0, 0, this._size, 0, Math.PI);\r\n if (filled)\r\n ctx.fill();\r\n\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.arc(0, 0, this._size * 0.75, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size * 0.4, 0);\r\n ctx.lineTo(this._size * 0.4, 0);\r\n ctx.moveTo(-this._size * 0.4, this._size * 0.25);\r\n ctx.lineTo(this._size * 0.4, this._size * 0.25);\r\n ctx.stroke();\r\n }\r\n\r\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = \"rgba(0,0,0,.75)\";\r\n ctx.fillStyle = \"white\";\r\n ctx.strokeRect(-2, -(this._yOffset + 2), 5, 5);\r\n ctx.fillRect(-1, -(this._yOffset + 1), 3, 3);\r\n\r\n ctx.lineWidth = 3.5;\r\n ctx.lineCap = \"round\";\r\n ctx.fillStyle = this._isSelected ? \"rgba(35,187,252,.25)\" : \"rgba(255,215,0,.25)\";\r\n ctx.shadowColor = \"black\";\r\n ctx.shadowBlur = 10;\r\n this.drawHandle(ctx, true);\r\n\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeStyle = this._isSelected ? \"rgba(35,187,252,.75)\" : \"rgba(255,215,0,.75)\";\r\n ctx.shadowBlur = 0;\r\n this.drawHandle(ctx, false);\r\n }\r\n\r\n protected isSelected(pt: XAndY): boolean { return this.position.distance(Point3d.create(pt.x, pt.y)) < this._size; }\r\n public isButtonHandled(ev: BeButtonEvent): boolean { return (BeButton.Data === ev.button && InputSource.Touch === ev.inputSource && !this._inTouchTap); }\r\n\r\n public doTouchMove(ev: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n if (!this._isDragging || !this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return true;\r\n }\r\n\r\n public doTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n return (this._isDragging = this.isSelected(startEv.viewPoint));\r\n }\r\n\r\n public doTouchStart(ev: BeTouchEvent): void {\r\n this._isSelected = ev.isSingleTouch && this.isSelected(ev.viewPoint);\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public doTouchEnd(ev: BeTouchEvent): void {\r\n if (this._isDragging && undefined !== ev.viewport)\r\n IModelApp.toolAdmin.currentInputState.fromPoint(ev.viewport, this._offsetPosition, InputSource.Touch); // Current location should reflect virtual cursor offset...\r\n this._isSelected = this._isDragging = false;\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public async doTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return false;\r\n if (!this.isSelected(ev.viewPoint)) {\r\n if (!this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return false;\r\n }\r\n ev.viewPoint = this._offsetPosition;\r\n this._inTouchTap = true;\r\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev);\r\n this._inTouchTap = false;\r\n return true;\r\n }\r\n\r\n public static createFromTouchTap(ev: BeTouchEvent): TouchCursor | undefined {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return undefined;\r\n const touchCursor = new TouchCursor(ev.viewport);\r\n if (!touchCursor.setPosition(ev.viewport, ev.point) && !touchCursor.setPosition(ev.viewport, ev.viewport.view.getCenter()))\r\n return undefined;\r\n ev.viewPoint = touchCursor._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return touchCursor;\r\n }\r\n}\r\n\r\n/** AccuSnap is an aide for snapping to interesting points on elements or decorations as the cursor moves over them.\r\n * @see [Using AccuSnap]($docs/learning/frontend/primitivetools.md#AccuSnap)\r\n * @public\r\n * @extensions\r\n */\r\nexport class AccuSnap implements Decorator {\r\n /** Currently active hit */\r\n public currHit?: HitDetail;\r\n /** Current list of hits. */\r\n public aSnapHits?: HitList<HitDetail>;\r\n /** Views that need to be flashed */\r\n public readonly needFlash = new Set<Viewport>();\r\n /** Views that are already flashed */\r\n public readonly areFlashed = new Set<Viewport>();\r\n /** The \"+\" that indicates where the snap point is */\r\n public readonly cross = new SpriteLocation();\r\n /** The icon that indicates what type of snap is active */\r\n public readonly icon = new SpriteLocation();\r\n /** The icon that indicates an error */\r\n public readonly errorIcon = new SpriteLocation();\r\n /** Reason key for last error */\r\n public errorKey?: string;\r\n /** localized message explaining why last error was generated. */\r\n public explanation?: string;\r\n /** Number of times \"suppress\" has been called -- unlike suspend this is not automatically cleared by tools */\r\n private _suppressed = 0;\r\n /** Location of cursor when we last checked for motion */\r\n private readonly _lastCursorPos = new Point2d();\r\n /** @internal */\r\n public readonly toolState = new AccuSnap.ToolState();\r\n /** @internal */\r\n protected _settings = new AccuSnap.Settings();\r\n /** @internal */\r\n public touchCursor?: TouchCursor;\r\n /** Current request for tooltip message. */\r\n private _toolTipPromise?: Promise<Promise<void>>;\r\n\r\n /** @internal */\r\n public onInitialized() { }\r\n private get _searchDistance(): number { return this.isLocateEnabled ? 1.0 : this._settings.searchDistance; }\r\n private get _hotDistanceInches(): number { return IModelApp.locateManager.apertureInches * this._settings.hotDistanceFactor; }\r\n /** Whether locate of elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isLocateEnabled(): boolean { return this.toolState.locate; }\r\n /** Whether snapping to elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isSnapEnabled(): boolean { return this.toolState.enabled; }\r\n /** Whether the user setting for snapping is enabled. Snapping is done only when both the user and current InteractiveTool have enabled it. */\r\n public get isSnapEnabledByUser(): boolean { return this._settings.enableFlag; }\r\n /** AccuSnap user settings */\r\n public get userSettings() { return this._settings; }\r\n\r\n private isFlashed(view: Viewport): boolean { return (this.areFlashed.has(view)); }\r\n private needsFlash(view: Viewport): boolean { return (this.needFlash.has(view)); }\r\n private setNeedsFlash(view: Viewport) {\r\n this.needFlash.add(view);\r\n this.clearIsFlashed(view);\r\n view.invalidateDecorations();\r\n }\r\n\r\n private setIsFlashed(view: Viewport) { this.areFlashed.add(view); }\r\n private clearIsFlashed(view: Viewport) { this.areFlashed.delete(view); }\r\n private static toSnapDetail(hit?: HitDetail): SnapDetail | undefined { return (hit && hit instanceof SnapDetail) ? hit : undefined; }\r\n /** Currently active snap */\r\n public getCurrSnapDetail(): SnapDetail | undefined { return AccuSnap.toSnapDetail(this.currHit); }\r\n /** Determine whether there is a current hit that is *hot*. */\r\n public get isHot(): boolean {\r\n const currSnap = this.getCurrSnapDetail();\r\n return !currSnap ? false : currSnap.isHot;\r\n }\r\n\r\n /** Optional ids to never flash. Useful for tools like \"trim curve\" that won't want a flashed segment to obscure a result preview.\r\n * @note Cleared when a primitive or view tool is started and saved/restored when a primitive tool is suspended/unsuspended.\r\n * @public\r\n */\r\n public neverFlash(ids?: Id64Arg): void {\r\n if (undefined === ids) {\r\n this.toolState.neverFlash = undefined;\r\n return;\r\n }\r\n\r\n const newIds = new Set<string>();\r\n for (const id of Id64.iterable(ids))\r\n newIds.add(id);\r\n\r\n this.toolState.neverFlash = (0 !== newIds.size ? newIds : undefined);\r\n }\r\n\r\n /** @internal */\r\n public destroy(): void {\r\n this.currHit = undefined;\r\n this.aSnapHits = undefined;\r\n }\r\n\r\n private get _doSnapping(): boolean { return this.isSnapEnabled && this.isSnapEnabledByUser && !this._isSnapSuspended; }\r\n private get _isSnapSuspended(): boolean { return (0 !== this._suppressed || 0 !== this.toolState.suspended); }\r\n\r\n /** Get the current snap divisor to use to use for SnapMode.NearestKeypoint.\r\n * @public\r\n */\r\n public get keypointDivisor() { return 2; }\r\n\r\n /** Get the current active SnapModes. SnapMode position determines priority, with the first entry being the highest. The SnapDetail will be returned for the first SnapMode that produces a hot snap.\r\n * @public\r\n */\r\n public getActiveSnapModes(): SnapMode[] {\r\n const snaps: SnapMode[] = [];\r\n snaps.push(SnapMode.NearestKeypoint);\r\n return snaps;\r\n }\r\n\r\n /** Can be implemented by a subclass of AccuSnap to implement a SnapMode override that applies only to the next point.\r\n * This method will be called whenever a new tool is installed and on button events.\r\n * @internal\r\n */\r\n public synchSnapMode(): void { }\r\n\r\n /** Check whether current tentative snap has valid curve geometry for finding extended intersections. */\r\n private get _searchForExtendedIntersections(): boolean {\r\n const snap = IModelApp.tentativePoint.getCurrSnap();\r\n return (undefined !== snap && undefined !== snap.primitive);\r\n }\r\n\r\n /**\r\n * Check to see whether its appropriate to generate an AccuSnap point, given the current user\r\n * and command settings, and whether a tentative point is currently active.\r\n */\r\n public get isActive(): boolean {\r\n // Unless we're snapping in intersect mode (to find extended intersections), skip if tentative point active...\r\n if (IModelApp.tentativePoint.isActive) {\r\n if (!this._doSnapping || !this._searchForExtendedIntersections)\r\n return false;\r\n\r\n const snaps = this.getActiveSnapModes();\r\n for (const snap of snaps) {\r\n if (snap === SnapMode.Intersection)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n return this._doSnapping || this.isLocateEnabled;\r\n }\r\n\r\n private initializeForCheckMotion(): void {\r\n this._lastCursorPos.setFrom(IModelApp.toolAdmin.currentInputState.lastMotion);\r\n }\r\n\r\n /** Clear the current AccuSnap info. */\r\n public clear(): void { this.setCurrHit(undefined); }\r\n /** @internal */\r\n public setCurrHit(newHit?: HitDetail): void {\r\n const newSnap = AccuSnap.toSnapDetail(newHit);\r\n const currSnap = this.getCurrSnapDetail();\r\n const sameElem = (undefined !== newHit && newHit.isSameHit(this.currHit));\r\n const sameHit = (sameElem && !newSnap);\r\n const sameSnap = (sameElem && undefined !== newSnap && undefined !== currSnap);\r\n const samePt = (sameHit || (sameSnap && newSnap.snapPoint.isAlmostEqual(currSnap.snapPoint)));\r\n const sameHot = (sameHit || (sameSnap && (this.isHot === newSnap.isHot)));\r\n const sameBaseSnapMode = (!newSnap || !currSnap || newSnap.snapMode === currSnap.snapMode);\r\n const sameType = (sameHot && (!currSnap || (currSnap.getHitType() === newHit.getHitType())));\r\n\r\n // see if it is the same point on the same element, the hot flags are the same multiple snaps, and the snap modes are the same\r\n if (samePt && sameType && sameBaseSnapMode) {\r\n // we know that nothing about the screen could change, just save the new hit and return to avoid screen flash\r\n this.currHit = newHit;\r\n return;\r\n }\r\n\r\n this.erase();\r\n\r\n // if we hit the same element with the same \"hotness\" as last time, we don't need to erase it\r\n // multiple snaps: but only if the old and new snap modes are the same\r\n if (!sameHot || !sameBaseSnapMode) {\r\n this.unFlashViews();\r\n this.setFlashHit(newHit);\r\n }\r\n\r\n // if we didn't get a new hit, we're done\r\n if (undefined === (this.currHit = newHit))\r\n return;\r\n\r\n // draw sprites for this hit\r\n this.showSnapSprite();\r\n }\r\n\r\n /** flash a hit in a single view. */\r\n private flashHitInView(hit: HitDetail, context: DecorateContext) {\r\n const viewport = context.viewport;\r\n if (!viewport || !this.hitShouldBeHilited(hit) || !this.needsFlash(viewport))\r\n return;\r\n\r\n hit.draw(context);\r\n this.setIsFlashed(viewport);\r\n }\r\n\r\n private setNeedsFlashView(view: Viewport) {\r\n if (!this.isFlashed(view) && !this.needsFlash(view))\r\n this.setNeedsFlash(view);\r\n }\r\n\r\n /** flash a hit in its view. */\r\n private setFlashHit(hit?: HitDetail): void {\r\n if (hit !== undefined && this.hitShouldBeHilited(hit))\r\n this.setNeedsFlashView(hit.viewport);\r\n }\r\n\r\n /** @internal */\r\n public erase(): void {\r\n this.clearToolTip(undefined); // make sure there's no tooltip up.\r\n this.clearSprites(); // remove all sprites from the screen\r\n }\r\n\r\n private showElemInfo(viewPt: XAndY, vp: ScreenViewport, hit: HitDetail, delay: BeDuration): void {\r\n if (!IModelApp.viewManager.doesHostHaveFocus || undefined !== this._toolTipPromise)\r\n return;\r\n\r\n const promise = this._toolTipPromise = delay.executeAfter(async () => {\r\n if (promise !== this._toolTipPromise)\r\n return; // we abandoned this request during delay\r\n try {\r\n const msg = await IModelApp.toolAdmin.getToolTip(hit);\r\n if (this._toolTipPromise === promise) // have we abandoned this request while awaiting getToolTip?\r\n this.showLocateMessage(viewPt, vp, msg);\r\n } catch (error) { } // happens if getToolTip was canceled\r\n });\r\n }\r\n\r\n private showLocateMessage(viewPt: XAndY, vp: ScreenViewport, msg: HTMLElement | string) {\r\n if (IModelApp.viewManager.doesHostHaveFocus)\r\n vp.openToolTip(msg, viewPt);\r\n }\r\n\r\n /** @internal */\r\n public displayToolTip(viewPt: XAndY, vp: ScreenViewport, uorPt?: Point3d): void {\r\n // if the tooltip is already displayed, or if user doesn't want it, quit.\r\n if (!this._settings.toolTip || !IModelApp.notifications.isToolTipSupported || IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n const accuSnapHit = this.currHit;\r\n const tpHit = IModelApp.tentativePoint.getCurrSnap();\r\n\r\n // if we don't have either an AccuSnap or a tentative point hit, quit.\r\n if (!accuSnapHit && !tpHit && !this.errorIcon.isActive)\r\n return;\r\n\r\n let theHit: HitDetail | undefined;\r\n\r\n // determine which type of hit\r\n if (tpHit) {\r\n if (uorPt) {\r\n // see if he came back somewhere near the currently snapped element\r\n const aperture = (this._settings.stickyFactor * vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n if (!IModelApp.locateManager.picker.testHit(tpHit, vp, uorPt, aperture, IModelApp.locateManager.options))\r\n return;\r\n }\r\n theHit = tpHit;\r\n } else {\r\n theHit = accuSnapHit;\r\n }\r\n\r\n // if we're currently showing an error, get the error message...otherwise display hit info...\r\n if (!this.errorIcon.isActive && theHit) {\r\n this.showElemInfo(viewPt, vp, theHit, this._settings.toolTipDelay);\r\n return;\r\n }\r\n\r\n // If we have an error explanation...use it as is!\r\n if (this.explanation) {\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n return;\r\n }\r\n\r\n // if we don't have an explanation yet, translate the error code.\r\n if (!this.errorKey)\r\n return;\r\n\r\n this.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${this.errorKey}`);\r\n if (!this.explanation)\r\n return;\r\n\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n }\r\n\r\n /** @internal */\r\n public clearToolTip(ev?: BeButtonEvent): void {\r\n // Throw away any stale request for a tooltip message\r\n this._toolTipPromise = undefined;\r\n if (!IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n if (ev && (5 > ev.viewPoint.distanceXY(IModelApp.notifications.toolTipLocation)))\r\n return;\r\n\r\n IModelApp.notifications.clearToolTip();\r\n }\r\n\r\n /** Display the sprites for the current snap to indicate its position on the screen and what snap mode it represents. */\r\n private showSnapSprite(): void {\r\n const snap = this.getCurrSnapDetail();\r\n if (!snap)\r\n return;\r\n\r\n const crossPt = snap.snapPoint;\r\n const viewport = snap.viewport;\r\n const crossSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}${snap.isHot ? \"sprites/SnapCross.png\" : \"sprites/SnapUnfocused.png\"}`);\r\n\r\n this.cross.activate(crossSprite, viewport, crossPt);\r\n\r\n const snapSprite = snap.sprite;\r\n if (snapSprite)\r\n this.icon.activate(snapSprite, viewport, AccuSnap.adjustIconLocation(viewport, crossPt, snapSprite.size));\r\n }\r\n\r\n private static adjustIconLocation(vp: Viewport, input: Point3d, iconSize: XAndY): Point3d {\r\n const out = vp.worldToView(input);\r\n out.x += (iconSize.x / 3.0);\r\n out.y -= (iconSize.y * 1.3);\r\n return vp.viewToWorld(out, out);\r\n }\r\n\r\n /** try to indicate what's wrong with the current point (why we're not snapping). */\r\n private showSnapError(out: LocateResponse, ev: BeButtonEvent) {\r\n this.explanation = out.explanation;\r\n this.errorKey = out.reason;\r\n this.errorIcon.deactivate();\r\n\r\n const vp = ev.viewport!;\r\n let errorSprite: Sprite | undefined;\r\n switch (out.snapStatus) {\r\n case SnapStatus.FilteredByApp:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapAppFiltered.png`);\r\n break;\r\n\r\n case SnapStatus.FilteredByAppQuietly:\r\n this.errorKey = undefined;\r\n break;\r\n\r\n case SnapStatus.NotSnappable:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapNotSnappable.png`);\r\n this.errorKey = ElementLocateManager.getFailureMessageKey(\"NotSnappable\");\r\n break;\r\n }\r\n\r\n if (!errorSprite)\r\n return;\r\n\r\n const spriteSize = errorSprite.size;\r\n const pt = AccuSnap.adjustIconLocation(vp, ev.rawPoint, spriteSize);\r\n\r\n this.errorIcon.activate(errorSprite, vp, pt);\r\n }\r\n\r\n private clearSprites() {\r\n this.errorIcon.deactivate();\r\n this.cross.deactivate();\r\n this.icon.deactivate();\r\n }\r\n\r\n /** determine whether a hit should be hilited or not. */\r\n private hitShouldBeHilited(hit: HitDetail | undefined): boolean {\r\n if (!hit)\r\n return false;\r\n\r\n if (hit.isModelHit || hit.isMapHit)\r\n return false; // Avoid annoying flashing of reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return false;\r\n\r\n const snap = AccuSnap.toSnapDetail(hit);\r\n return !snap || snap.isHot || this._settings.hiliteColdHits;\r\n }\r\n\r\n private unFlashViews() {\r\n this.needFlash.clear();\r\n for (const vp of this.areFlashed)\r\n vp.flashedId = undefined;\r\n\r\n this.areFlashed.clear();\r\n }\r\n\r\n /** @internal */\r\n public adjustPointIfHot(pt: Point3d, view: Viewport): void {\r\n const currSnap = this.getCurrSnapDetail();\r\n\r\n if (!currSnap || !currSnap.isHot || view !== currSnap.viewport)\r\n return;\r\n\r\n pt.setFrom(currSnap.adjustedPoint);\r\n }\r\n\r\n /** Implemented by sub-classes to update ui to show current enabled state.\r\n * @internal\r\n */\r\n public onEnabledStateChange(_isEnabled: boolean, _wasEnabled: boolean) { }\r\n\r\n /** @internal */\r\n public getHitAndList(holder: HitListHolder): HitDetail | undefined {\r\n const hit = this.currHit;\r\n if (hit) {\r\n holder.setHitList(this.aSnapHits);\r\n this.aSnapHits = undefined;\r\n }\r\n return hit;\r\n }\r\n\r\n private initCmdState() {\r\n this.toolState.suspended = 0;\r\n this.toolState.neverFlash = undefined;\r\n }\r\n\r\n /** @internal */\r\n public suspend(doSuspend: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuspend)\r\n this.toolState.suspended++;\r\n else if (this.toolState.suspended > 0)\r\n this.toolState.suspended--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public suppress(doSuppress: boolean): number {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuppress)\r\n this._suppressed++;\r\n else if (this._suppressed > 0)\r\n this._suppressed--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n return this._suppressed;\r\n }\r\n\r\n /** Turn AccuSnap on or off */\r\n public enableSnap(yesNo: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n this.toolState.enabled = yesNo;\r\n if (!yesNo) {\r\n this.clear();\r\n if (undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public intersectXY(tpSnap: SnapDetail, second: SnapDetail): IntersectDetail | undefined {\r\n // Get single segment curve from each snap to intersect...\r\n const tpSegment = tpSnap.getCurvePrimitive();\r\n if (undefined === tpSegment)\r\n return undefined;\r\n const segment = second.getCurvePrimitive();\r\n if (undefined === segment)\r\n return undefined;\r\n\r\n const worldToView = second.viewport.worldToViewMap.transform0;\r\n const detail = CurveCurve.intersectionProjectedXYPairs(worldToView, tpSegment, true, segment, true);\r\n if (0 === detail.length)\r\n return undefined;\r\n\r\n let closeIndex = 0;\r\n if (detail.length > 1) {\r\n const snapPt = worldToView.multiplyPoint3d(HitGeomType.Point === tpSnap.geomType && HitGeomType.Point !== second.geomType ? second.getPoint() : tpSnap.getPoint(), 1); // Don't check distance from arc centers...\r\n let lastDist: number | undefined;\r\n\r\n for (let i = 0; i < detail.length; i++) {\r\n const testPt = worldToView.multiplyPoint3d(detail[i].detailA.point, 1);\r\n const testDist = snapPt.realDistanceXY(testPt);\r\n\r\n if (undefined !== testDist && (undefined === lastDist || testDist < lastDist)) {\r\n lastDist = testDist;\r\n closeIndex = i;\r\n }\r\n }\r\n }\r\n\r\n const intersect = new IntersectDetail(tpSnap, SnapHeat.InRange, detail[closeIndex].detailA.point, segment, second.sourceId); // Should be ok to share hit detail with tentative...\r\n intersect.primitive = tpSegment; // Just save single segment that was intersected for line strings/shapes...\r\n\r\n return intersect;\r\n }\r\n\r\n /** @internal */\r\n public static async requestSnap(thisHit: HitDetail, snapModes: SnapMode[], hotDistanceInches: number, keypointDivisor: number, hitList?: HitList<HitDetail>, out?: LocateResponse): Promise<SnapDetail | undefined> {\r\n if (thisHit.isModelHit || thisHit.isMapHit || thisHit.isClassifier) {\r\n if (snapModes.includes(SnapMode.Nearest)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n return new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.InRange);\r\n } else if (1 === snapModes.length && snapModes.includes(SnapMode.Intersection)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined;\r\n } else {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n const realitySnap = new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.None);\r\n realitySnap.sprite = undefined; // Don't show a snap mode that isn't applicable, but still accept hit point...\r\n return realitySnap;\r\n }\r\n }\r\n\r\n const hitVp = thisHit.viewAttachment ? thisHit.viewAttachment.viewport : thisHit.viewport;\r\n if (undefined !== thisHit.subCategoryId && !thisHit.isExternalIModelHit) {\r\n const appearance = hitVp.getSubCategoryAppearance(thisHit.subCategoryId);\r\n if (appearance.dontSnap) {\r\n if (out) {\r\n out.snapStatus = SnapStatus.NotSnappable;\r\n out.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${ElementLocateManager.getFailureMessageKey(\"NotSnappableSubCategory\")}`);\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n const requestProps: SnapRequestProps = {\r\n id: thisHit.sourceId,\r\n testPoint: thisHit.testPoint,\r\n closePoint: thisHit.hitPoint,\r\n worldToView: hitVp.worldToViewMap.transform0.toJSON(),\r\n viewFlags: hitVp.viewFlags,\r\n snapModes,\r\n snapAperture: hitVp.pixelsFromInches(hotDistanceInches),\r\n snapDivisor: keypointDivisor,\r\n subCategoryId: thisHit.subCategoryId,\r\n geometryClass: thisHit.geometryClass,\r\n };\r\n\r\n const thisGeom = (thisHit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(thisHit) : IModelApp.viewManager.getDecorationGeometry(thisHit));\r\n\r\n if (undefined !== thisGeom) {\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: thisGeom }];\r\n } else if (!thisHit.isElementHit) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n return undefined;\r\n }\r\n\r\n if (snapModes.includes(SnapMode.Intersection)) {\r\n if (undefined !== hitList) {\r\n for (const hit of hitList.hits) {\r\n if (thisHit.sourceId === hit.sourceId || thisHit.iModel !== hit.iModel)\r\n continue;\r\n\r\n const geom = (hit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(hit) : IModelApp.viewManager.getDecorationGeometry(hit));\r\n\r\n if (undefined !== geom) {\r\n if (undefined === requestProps.decorationGeometry)\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: geom }];\r\n else\r\n requestProps.decorationGeometry.push({ id: thisHit.sourceId, geometryStream: geom });\r\n } else if (!hit.isElementHit) {\r\n continue;\r\n }\r\n\r\n if (undefined === requestProps.intersectCandidates)\r\n requestProps.intersectCandidates = [hit.sourceId];\r\n else\r\n requestProps.intersectCandidates.push(hit.sourceId);\r\n\r\n if (5 === requestProps.intersectCandidates.length)\r\n break; // Search for intersection with a few of the next best hits...\r\n }\r\n }\r\n\r\n if (1 === snapModes.length && undefined === requestProps.intersectCandidates) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined; // Don't make back end request when only doing intersection snap when we don't have another hit to intersect with...\r\n }\r\n }\r\n\r\n try {\r\n const result = await thisHit.iModel.requestSnap(requestProps);\r\n\r\n if (out)\r\n out.snapStatus = result.status;\r\n\r\n if (result.status !== SnapStatus.Success)\r\n return undefined;\r\n\r\n const parseCurve = (json: any): CurvePrimitive | undefined => {\r\n const parsed = undefined !== json ? GeomJson.Reader.parse(json) : undefined;\r\n return parsed instanceof GeometryQuery && \"curvePrimitive\" === parsed.geometryCategory ? parsed : undefined;\r\n };\r\n\r\n const snapPoint = Point3d.fromJSON(result.snapPoint);\r\n const displayTransform = undefined !== thisHit.modelId ? thisHit.viewport.view.computeDisplayTransform({\r\n modelId: thisHit.modelId,\r\n elementId: thisHit.sourceId,\r\n viewAttachmentId: thisHit.viewAttachment?.id,\r\n }) : undefined;\r\n displayTransform?.multiplyPoint3d(snapPoint, snapPoint);\r\n\r\n const snap = new SnapDetail(thisHit, result.snapMode, result.heat, snapPoint);\r\n\r\n snap.setCurvePrimitive(parseCurve(result.curve), displayTransform, result.geomType);\r\n if (undefined !== result.parentGeomType)\r\n snap.parentGeomType = result.parentGeomType;\r\n\r\n // Update hitPoint from readPixels with exact point location corrected to surface/edge geometry.\r\n if (undefined !== result.hitPoint) {\r\n snap.hitPoint.setFromJSON(result.hitPoint);\r\n displayTransform?.multiplyPoint3d(snap.hitPoint, snap.hitPoint);\r\n }\r\n\r\n // Apply display transform to normal.\r\n if (undefined !== result.normal) {\r\n snap.normal = Vector3d.fromJSON(result.normal);\r\n displayTransform?.matrix.multiplyVector(snap.normal, snap.normal);\r\n snap.normal.normalizeInPlace();\r\n }\r\n\r\n if (SnapMode.Intersection !== snap.snapMode)\r\n return snap;\r\n\r\n if (undefined === result.intersectId)\r\n return undefined;\r\n\r\n const otherPrimitive = parseCurve(result.intersectCurve);\r\n if (undefined === otherPrimitive)\r\n return undefined;\r\n\r\n const intersect = new IntersectDetail(snap, snap.heat, snap.snapPoint, otherPrimitive, result.intersectId);\r\n return intersect;\r\n } catch (_err) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Aborted;\r\n\r\n return undefined;\r\n }\r\n }\r\n\r\n private async getAccuSnapDetail(hitList: HitList<HitDetail>, out: LocateResponse): Promise<SnapDetail | undefined> {\r\n const thisHit = hitList.getNextHit();\r\n if (undefined === thisHit)\r\n return undefined;\r\n\r\n const filterStatus: LocateFilterStatus = (this.isLocateEnabled ? await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, out) : LocateFilterStatus.Accept);\r\n if (LocateFilterStatus.Accept !== filterStatus) {\r\n out.snapStatus = SnapStatus.FilteredByApp;\r\n return undefined;\r\n }\r\n\r\n let snapModes: SnapMode[];\r\n if (IModelApp.tentativePoint.isActive) {\r\n snapModes = [];\r\n snapModes.push(SnapMode.Nearest); // Special case: isActive only allows snapping with tentative to find extended intersections...\r\n } else {\r\n snapModes = this.getActiveSnapModes(); // Get the list of point snap modes to consider\r\n }\r\n\r\n const thisSnap = await AccuSnap.requestSnap(thisHit, snapModes, this._hotDistanceInches, this.keypointDivisor, hitList, out);\r\n if (undefined === thisSnap)\r\n return undefined;\r\n\r\n if (IModelApp.tentativePoint.isActive) {\r\n const tpSnap = IModelApp.tentativePoint.getCurrSnap();\r\n if (undefined === tpSnap)\r\n return undefined;\r\n const intersectSnap = this.intersectXY(tpSnap, thisSnap);\r\n if (undefined === intersectSnap)\r\n return undefined;\r\n hitList.setCurrentHit(thisHit);\r\n return intersectSnap;\r\n }\r\n\r\n IModelApp.accuDraw.onSnap(thisSnap); // AccuDraw can adjust nearest snap to intersection of circle (polar distance lock) or line (axis lock) with snapped to curve...\r\n hitList.setCurrentHit(thisHit);\r\n return thisSnap;\r\n }\r\n\r\n /** Request a snap from the backend for the supplied HitDetail.\r\n * @param hit The HitDetail to snap to.\r\n * @param snapMode Optional SnapMode, uses active snap modes if not specified.\r\n * @return A Promise for the SnapDetail or undefined if no snap could be created.\r\n */\r\n public async doSnapRequest(hit: HitDetail, snapMode?: SnapMode): Promise<SnapDetail | undefined> {\r\n let snapModes: SnapMode[];\r\n if (undefined === snapMode)\r\n snapModes = this.getActiveSnapModes();\r\n else\r\n snapModes = [snapMode];\r\n\r\n return AccuSnap.requestSnap(hit, snapModes, this._hotDistanceInches, this.keypointDivisor);\r\n }\r\n\r\n private findHits(ev: BeButtonEvent, force: boolean = false): SnapStatus {\r\n // When using AccuSnap to locate elements, we have to start with the datapoint adjusted\r\n // for locks and not the raw point. Otherwise, when grid/unit lock are on, we locate elements by\r\n // points not on the grid. This causes them to be \"pulled\" off the grid when they are accepted. On\r\n // the other hand, when NOT locating, we need to use the raw point so we can snap to elements\r\n // away from the grid.\r\n\r\n const testPoint = this.isLocateEnabled ? ev.point : ev.rawPoint;\r\n const vp = ev.viewport!;\r\n const picker = IModelApp.locateManager.picker;\r\n const options = IModelApp.locateManager.options.clone(); // Copy to avoid changing out from under active Tool...\r\n\r\n // NOTE: Since TestHit will use the same HitSource as the input hit we only need to sets this for DoPick...\r\n options.hitSource = this.isSnapEnabled ? HitSource.AccuSnap : HitSource.MotionLocate;\r\n\r\n let aperture = (vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n this.initializeForCheckMotion();\r\n aperture *= this._searchDistance;\r\n\r\n if (0 === picker.doPick(vp, testPoint, aperture, options)) {\r\n this.aSnapHits = undefined; // Clear any previous hit list so reset won't cycle through hits cursor is no longer over, etc.\r\n return SnapStatus.NoElements;\r\n }\r\n\r\n this.aSnapHits = picker.getHitList(true); // take ownership of the pickElem hit list.\r\n\r\n // see if we should keep the current hit\r\n const canBeSticky = !force && this.aSnapHits.length > 1 && this.currHit && (HitDetailType.Intersection !== this.currHit.getHitType() && this.currHit.priority < HitPriority.PlanarSurface);\r\n if (canBeSticky) {\r\n for (let iHit = 1; iHit < this.aSnapHits.length; ++iHit) {\r\n const thisHit = this.aSnapHits.hits[iHit];\r\n if (!thisHit.isSameHit(this.currHit))\r\n continue;\r\n this.aSnapHits.removeHit(iHit);\r\n this.aSnapHits.insertHit(0, thisHit);\r\n break;\r\n }\r\n }\r\n\r\n return SnapStatus.Success;\r\n }\r\n\r\n private async findLocatableHit(ev: BeButtonEvent, newSearch: boolean, out: LocateResponse): Promise<HitDetail | undefined> {\r\n out.snapStatus = SnapStatus.NoElements;\r\n\r\n if (newSearch) {\r\n this.aSnapHits = undefined;\r\n // search for new hits, but if the cursor is still close to the current hit, don't throw away list.\r\n if (SnapStatus.Success !== (out.snapStatus = this.findHits(ev)))\r\n return undefined;\r\n } else {\r\n if (!this.aSnapHits) {\r\n out.snapStatus = SnapStatus.NoElements;\r\n return undefined;\r\n }\r\n }\r\n\r\n const thisList = this.aSnapHits!;\r\n let thisHit: HitDetail | undefined;\r\n let firstRejected;\r\n const filterResponse = new LocateResponse();\r\n\r\n // keep looking through hits until we find one that is accu-snappable.\r\n while (undefined !== (thisHit = thisList.getNextHit())) {\r\n if (LocateFilterStatus.Accept === await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, filterResponse))\r\n return thisHit;\r\n // we only care about the status of the first hit.\r\n if (undefined !== firstRejected)\r\n continue;\r\n firstRejected = filterResponse.clone();\r\n firstRejected.snapStatus = SnapStatus.FilteredByApp;\r\n }\r\n\r\n if (undefined !== firstRejected)\r\n out.setFrom(firstRejected);\r\n\r\n // Reset current hit index to go back to first hit on next AccuSnap reset event...\r\n thisList.resetCurrentHit();\r\n return undefined;\r\n }\r\n\r\n /** When in auto-locate mode, advance to the next hit without searching again.\r\n * @internal\r\n */\r\n public async resetButton(): Promise<SnapStatus> {\r\n let hit: HitDetail | undefined;\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n this.clearToolTip(undefined);\r\n\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n\r\n if (this._doSnapping) {\r\n // if we don't have any more candidate hits, get a new list at the current location\r\n if (!this.aSnapHits || (0 === this.aSnapHits.length)) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n } else {\r\n // drop the current hit from the list and then retest the list (without the dropped hit) to find the new snap\r\n this.aSnapHits.removeCurrentHit();\r\n hit = await this.getAccuSnapDetail(this.aSnapHits, out);\r\n }\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, false, out); // get next AccuSnap path (or undefined)\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n\r\n // set the current hit\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // indicate errors\r\n this.showSnapError(out, ev);\r\n return out.snapStatus;\r\n }\r\n\r\n /** Find the best snap point according to the current cursor location\r\n * @internal\r\n */\r\n public async onMotion(ev: BeButtonEvent): Promise<void> {\r\n this.clearToolTip(ev);\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n let hit: HitDetail | undefined;\r\n if (this.isActive) {\r\n if (this._doSnapping) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, true, out);\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n }\r\n\r\n // set the current hit and display the sprite (based on snap's KeypointType)\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // set up active error before calling displayToolTip to indicate error or show locate message...\r\n this.showSnapError(out, ev);\r\n this.displayToolTip(ev.viewPoint, ev.viewport!, ev.rawPoint);\r\n\r\n if (undefined !== this.touchCursor && InputSource.Mouse === ev.inputSource) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onPreButtonEvent(ev: BeButtonEvent): boolean { return (undefined !== this.touchCursor) ? this.touchCursor.isButtonHandled(ev) : false; }\r\n /** @internal */\r\n public onTouchStart(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchStart(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchEnd(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor && 0 === ev.touchCount)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchCancel(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchMove(ev: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMove(ev) : false;\r\n }\r\n\r\n /** @internal */\r\n public onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMoveStart(ev, startEv) : false;\r\n }\r\n\r\n /** @internal */\r\n public get wantVirtualCursor(): boolean {\r\n return this._doSnapping || (this.isLocateEnabled && ToolSettings.enableVirtualCursorForLocate);\r\n }\r\n\r\n /** @internal */\r\n public async onTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined !== this.touchCursor)\r\n return this.touchCursor.doTouchTap(ev);\r\n if (!this.wantVirtualCursor)\r\n return false;\r\n this.touchCursor = TouchCursor.createFromTouchTap(ev);\r\n if (undefined === this.touchCursor)\r\n return false;\r\n // Give active tool an opportunity to update it's tool assistance since event won't be passed along...\r\n const tool = IModelApp.toolAdmin.activeTool;\r\n if (undefined === tool)\r\n return true;\r\n await tool.onSuspend();\r\n await tool.onUnsuspend();\r\n return true;\r\n }\r\n\r\n private flashElements(context: DecorateContext): void {\r\n const viewport = context.viewport;\r\n if (this.currHit) {\r\n if (this.needsFlash(viewport))\r\n this.flashHitInView(this.currHit, context);\r\n return;\r\n }\r\n\r\n const hit = IModelApp.tentativePoint.getCurrSnap();\r\n if (!hit || hit.isModelHit || hit.isMapHit)\r\n return; // Don't hilite reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return;\r\n\r\n hit.draw(context);\r\n }\r\n\r\n /** @internal */\r\n public decorate(context: DecorateContext): void {\r\n if (undefined !== this.touchCursor && this.touchCursor.viewport === context.viewport)\r\n context.addCanvasDecoration(this.touchCursor, true);\r\n\r\n this.flashElements(context);\r\n\r\n if (this.cross.isActive) {\r\n this.cross.decorate(context);\r\n this.icon.decorate(context);\r\n }\r\n\r\n this.errorIcon.decorate(context);\r\n }\r\n\r\n private clearElemFromHitList(element: string) {\r\n if (this.aSnapHits)\r\n this.aSnapHits.removeHitsFrom(element);\r\n }\r\n\r\n /** @internal */\r\n public clearIfElement(sourceId: string): void {\r\n this.clearElemFromHitList(sourceId);\r\n\r\n const hit = this.currHit;\r\n if (hit && hit.sourceId === sourceId) {\r\n this.destroy();\r\n }\r\n }\r\n\r\n /** Enable locating elements.\r\n * @public\r\n */\r\n public enableLocate(yesNo: boolean) {\r\n this.toolState.locate = yesNo;\r\n if (!yesNo && undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** Called whenever a new [[Tool]] is started.\r\n * @internal\r\n */\r\n public onStartTool(): void {\r\n this.initCmdState();\r\n this.enableSnap(false);\r\n this.enableLocate(false);\r\n IModelApp.tentativePoint.clear(true);\r\n }\r\n\r\n /**\r\n * Force AccuSnap to reevaluate the snap at the current cursor location.\r\n * This is useful of an application changes the snap mode and wants AccuSnap to choose it immediately, without\r\n * requiring the user to move the mouse.\r\n * @internal\r\n */\r\n public async reEvaluate() {\r\n if (this.getCurrSnapDetail()) {\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n return this.onMotion(ev);\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class TentativeOrAccuSnap {\r\n public static get isHot(): boolean { return IModelApp.accuSnap.isHot || IModelApp.tentativePoint.isSnapped; }\r\n\r\n public static getCurrentSnap(checkIsHot: boolean = true): SnapDetail | undefined {\r\n // Checking for a hot AccuSnap hit before checking tentative is probably necessary for extended intersections?\r\n if (IModelApp.accuSnap.isHot)\r\n return IModelApp.accuSnap.getCurrSnapDetail();\r\n\r\n if (IModelApp.tentativePoint.isSnapped)\r\n return IModelApp.tentativePoint.currSnap;\r\n\r\n return (checkIsHot ? undefined : IModelApp.accuSnap.getCurrSnapDetail());\r\n }\r\n\r\n public static getCurrentPoint(): Point3d {\r\n if (IModelApp.accuSnap.isHot) {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n if (snap)\r\n return snap.adjustedPoint;\r\n }\r\n\r\n return IModelApp.tentativePoint.getPoint();\r\n }\r\n\r\n public static getCurrentView(): ScreenViewport | undefined {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n return snap ? snap.viewport : IModelApp.tentativePoint.viewport;\r\n }\r\n}\r\n\r\n/** @public */\r\nexport namespace AccuSnap { // eslint-disable-line no-redeclare\r\n export class ToolState {\r\n public enabled = false;\r\n public locate = false;\r\n public suspended = 0;\r\n public neverFlash?: Id64Set;\r\n public setFrom(other: ToolState): void {\r\n this.enabled = other.enabled;\r\n this.locate = other.locate;\r\n this.suspended = other.suspended;\r\n this.neverFlash = other.neverFlash;\r\n }\r\n public clone(): ToolState {\r\n const val = new ToolState();\r\n val.setFrom(this);\r\n return val;\r\n }\r\n }\r\n\r\n export class Settings {\r\n public hotDistanceFactor = 1.2;\r\n public stickyFactor = 1.0;\r\n public searchDistance = 2.0;\r\n public hiliteColdHits = true;\r\n public enableFlag = true;\r\n public toolTip = true;\r\n public toolTipDelay = BeDuration.fromSeconds(.5); // delay before tooltip pops up\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"AccuSnap.js","sourceRoot":"","sources":["../../src/AccuSnap.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/** @packageDocumentation\r\n * @module LocatingElements\r\n */\r\n\r\nimport { BeDuration, Id64, Id64Arg, Id64Set } from \"@itwin/core-bentley\";\r\nimport { CurveCurve, CurvePrimitive, GeometryQuery, IModelJson as GeomJson, Point2d, Point3d, Vector3d, XAndY } from \"@itwin/core-geometry\";\r\nimport { SnapRequestProps } from \"@itwin/core-common\";\r\nimport { ElementLocateManager, HitListHolder, LocateAction, LocateFilterStatus, LocateResponse, SnapStatus } from \"./ElementLocateManager\";\r\nimport { HitDetail, HitDetailType, HitGeomType, HitList, HitPriority, HitSource, IntersectDetail, SnapDetail, SnapHeat, SnapMode } from \"./HitDetail\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { CanvasDecoration } from \"./render/CanvasDecoration\";\r\nimport { IconSprites, Sprite, SpriteLocation } from \"./Sprites\";\r\nimport { BeButton, BeButtonEvent, BeTouchEvent, InputSource } from \"./tools/Tool\";\r\nimport { ToolSettings } from \"./tools/ToolSettings\";\r\nimport { DecorateContext } from \"./ViewContext\";\r\nimport { Decorator } from \"./ViewManager\";\r\nimport { ScreenViewport, Viewport } from \"./Viewport\";\r\n\r\n// cspell:ignore dont primitivetools\r\n\r\n/** Virtual cursor for using AccuSnap with touch input.\r\n * @internal\r\n */\r\nexport class TouchCursor implements CanvasDecoration {\r\n public position = new Point3d();\r\n public viewport: Viewport;\r\n protected _offsetPosition = new Point3d();\r\n protected _size: number;\r\n protected _yOffset: number;\r\n protected _isSelected = false;\r\n protected _isDragging = false;\r\n protected _inTouchTap = false;\r\n\r\n protected constructor(vp: ScreenViewport) {\r\n this._size = vp.pixelsFromInches(0.3);\r\n this._yOffset = this._size * 1.75;\r\n this.viewport = vp;\r\n }\r\n\r\n protected setPosition(vp: Viewport, worldLocation: Point3d): boolean {\r\n const pointNpc = vp.worldToNpc(worldLocation);\r\n if (pointNpc.z < 0.0 || pointNpc.z > 1.0)\r\n pointNpc.z = 0.5; // move inside frustum.\r\n\r\n const viewLocation = vp.npcToView(pointNpc);\r\n if (!vp.viewRect.containsPoint(viewLocation))\r\n return false; // outside this viewport rect\r\n\r\n viewLocation.x = Math.floor(viewLocation.x) + 0.5;\r\n viewLocation.y = Math.floor(viewLocation.y) + 0.5;\r\n viewLocation.z = 0.0;\r\n const offsetLocation = new Point3d(viewLocation.x, viewLocation.y - this._yOffset, viewLocation.z);\r\n if (!vp.viewRect.containsPoint(offsetLocation))\r\n return false; // outside this viewport rect\r\n\r\n this.position.setFrom(viewLocation);\r\n this._offsetPosition.setFrom(offsetLocation);\r\n if (vp !== this.viewport) {\r\n this.viewport.invalidateDecorations();\r\n this.viewport = vp;\r\n }\r\n vp.invalidateDecorations();\r\n return true;\r\n }\r\n\r\n protected drawHandle(ctx: CanvasRenderingContext2D, filled: boolean): void {\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size, 0);\r\n ctx.bezierCurveTo(-this._size, -this._size * 0.85, -this._size * 0.6, -this._yOffset * 0.6, 0, -this._yOffset * 0.8);\r\n ctx.bezierCurveTo(this._size * 0.6, -this._yOffset * 0.6, this._size, -this._size * 0.85, this._size, 0);\r\n ctx.arc(0, 0, this._size, 0, Math.PI);\r\n if (filled)\r\n ctx.fill();\r\n\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.arc(0, 0, this._size * 0.75, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(-this._size * 0.4, 0);\r\n ctx.lineTo(this._size * 0.4, 0);\r\n ctx.moveTo(-this._size * 0.4, this._size * 0.25);\r\n ctx.lineTo(this._size * 0.4, this._size * 0.25);\r\n ctx.stroke();\r\n }\r\n\r\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = \"rgba(0,0,0,.75)\";\r\n ctx.fillStyle = \"white\";\r\n ctx.strokeRect(-2, -(this._yOffset + 2), 5, 5);\r\n ctx.fillRect(-1, -(this._yOffset + 1), 3, 3);\r\n\r\n ctx.lineWidth = 3.5;\r\n ctx.lineCap = \"round\";\r\n ctx.fillStyle = this._isSelected ? \"rgba(35,187,252,.25)\" : \"rgba(255,215,0,.25)\";\r\n ctx.shadowColor = \"black\";\r\n ctx.shadowBlur = 10;\r\n this.drawHandle(ctx, true);\r\n\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeStyle = this._isSelected ? \"rgba(35,187,252,.75)\" : \"rgba(255,215,0,.75)\";\r\n ctx.shadowBlur = 0;\r\n this.drawHandle(ctx, false);\r\n }\r\n\r\n protected isSelected(pt: XAndY): boolean { return this.position.distance(Point3d.create(pt.x, pt.y)) < this._size; }\r\n public isButtonHandled(ev: BeButtonEvent): boolean { return (BeButton.Data === ev.button && InputSource.Touch === ev.inputSource && !this._inTouchTap); }\r\n\r\n public doTouchMove(ev: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n if (!this._isDragging || !this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return true;\r\n }\r\n\r\n public doTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n if (undefined === ev.viewport || !ev.isSingleTouch)\r\n return false;\r\n return (this._isDragging = this.isSelected(startEv.viewPoint));\r\n }\r\n\r\n public doTouchStart(ev: BeTouchEvent): void {\r\n this._isSelected = ev.isSingleTouch && this.isSelected(ev.viewPoint);\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public doTouchEnd(ev: BeTouchEvent): void {\r\n if (this._isDragging && undefined !== ev.viewport)\r\n IModelApp.toolAdmin.currentInputState.fromPoint(ev.viewport, this._offsetPosition, InputSource.Touch); // Current location should reflect virtual cursor offset...\r\n this._isSelected = this._isDragging = false;\r\n if (undefined !== ev.viewport)\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public async doTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return false;\r\n if (!this.isSelected(ev.viewPoint)) {\r\n if (!this.setPosition(ev.viewport, ev.point))\r\n return false;\r\n ev.viewPoint = this._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return false;\r\n }\r\n ev.viewPoint = this._offsetPosition;\r\n this._inTouchTap = true;\r\n await IModelApp.toolAdmin.convertTouchTapToButtonDownAndUp(ev);\r\n this._inTouchTap = false;\r\n return true;\r\n }\r\n\r\n public static createFromTouchTap(ev: BeTouchEvent): TouchCursor | undefined {\r\n if (undefined === ev.viewport || !ev.isSingleTouch || 1 !== ev.tapCount)\r\n return undefined;\r\n const touchCursor = new TouchCursor(ev.viewport);\r\n if (!touchCursor.setPosition(ev.viewport, ev.point) && !touchCursor.setPosition(ev.viewport, ev.viewport.view.getCenter()))\r\n return undefined;\r\n ev.viewPoint = touchCursor._offsetPosition;\r\n IModelApp.toolAdmin.convertTouchMoveToMotion(ev); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n return touchCursor;\r\n }\r\n}\r\n\r\n/** AccuSnap is an aide for snapping to interesting points on elements or decorations as the cursor moves over them.\r\n * @see [Using AccuSnap]($docs/learning/frontend/primitivetools.md#AccuSnap)\r\n * @public\r\n * @extensions\r\n */\r\nexport class AccuSnap implements Decorator {\r\n /** Currently active hit */\r\n public currHit?: HitDetail;\r\n /** Current list of hits. */\r\n public aSnapHits?: HitList<HitDetail>;\r\n /** Views that need to be flashed */\r\n public readonly needFlash = new Set<Viewport>();\r\n /** Views that are already flashed */\r\n public readonly areFlashed = new Set<Viewport>();\r\n /** The \"+\" that indicates where the snap point is */\r\n public readonly cross = new SpriteLocation();\r\n /** The icon that indicates what type of snap is active */\r\n public readonly icon = new SpriteLocation();\r\n /** The icon that indicates an error */\r\n public readonly errorIcon = new SpriteLocation();\r\n /** Reason key for last error */\r\n public errorKey?: string;\r\n /** localized message explaining why last error was generated. */\r\n public explanation?: string;\r\n /** Number of times \"suppress\" has been called -- unlike suspend this is not automatically cleared by tools */\r\n private _suppressed = 0;\r\n /** Location of cursor when we last checked for motion */\r\n private readonly _lastCursorPos = new Point2d();\r\n /** @internal */\r\n public readonly toolState = new AccuSnap.ToolState();\r\n /** @internal */\r\n protected _settings = new AccuSnap.Settings();\r\n /** @internal */\r\n public touchCursor?: TouchCursor;\r\n /** Current request for tooltip message. */\r\n private _toolTipPromise?: Promise<Promise<void>>;\r\n\r\n /** @internal */\r\n public onInitialized() { }\r\n private get _searchDistance(): number { return this.isLocateEnabled ? 1.0 : this._settings.searchDistance; }\r\n private get _hotDistanceInches(): number { return IModelApp.locateManager.apertureInches * this._settings.hotDistanceFactor; }\r\n /** Whether locate of elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isLocateEnabled(): boolean { return this.toolState.locate; }\r\n /** Whether snapping to elements under the cursor is enabled by the current InteractiveTool. */\r\n public get isSnapEnabled(): boolean { return this.toolState.enabled; }\r\n /** Whether the user setting for snapping is enabled. Snapping is done only when both the user and current InteractiveTool have enabled it. */\r\n public get isSnapEnabledByUser(): boolean { return this._settings.enableFlag; }\r\n /** AccuSnap user settings */\r\n public get userSettings() { return this._settings; }\r\n\r\n private isFlashed(view: Viewport): boolean { return (this.areFlashed.has(view)); }\r\n private needsFlash(view: Viewport): boolean { return (this.needFlash.has(view)); }\r\n private setNeedsFlash(view: Viewport) {\r\n this.needFlash.add(view);\r\n this.clearIsFlashed(view);\r\n view.invalidateDecorations();\r\n }\r\n\r\n private setIsFlashed(view: Viewport) { this.areFlashed.add(view); }\r\n private clearIsFlashed(view: Viewport) { this.areFlashed.delete(view); }\r\n private static toSnapDetail(hit?: HitDetail): SnapDetail | undefined { return (hit && hit instanceof SnapDetail) ? hit : undefined; }\r\n /** Currently active snap */\r\n public getCurrSnapDetail(): SnapDetail | undefined { return AccuSnap.toSnapDetail(this.currHit); }\r\n /** Determine whether there is a current hit that is *hot*. */\r\n public get isHot(): boolean {\r\n const currSnap = this.getCurrSnapDetail();\r\n return !currSnap ? false : currSnap.isHot;\r\n }\r\n\r\n /** Optional ids to never flash. Useful for tools like \"trim curve\" that won't want a flashed segment to obscure a result preview.\r\n * @note Cleared when a primitive or view tool is started and saved/restored when a primitive tool is suspended/unsuspended.\r\n * @public\r\n */\r\n public neverFlash(ids?: Id64Arg): void {\r\n if (undefined === ids) {\r\n this.toolState.neverFlash = undefined;\r\n return;\r\n }\r\n\r\n const newIds = new Set<string>();\r\n for (const id of Id64.iterable(ids))\r\n newIds.add(id);\r\n\r\n this.toolState.neverFlash = (0 !== newIds.size ? newIds : undefined);\r\n }\r\n\r\n /** @internal */\r\n public destroy(): void {\r\n this.currHit = undefined;\r\n this.aSnapHits = undefined;\r\n }\r\n\r\n private get _doSnapping(): boolean { return this.isSnapEnabled && this.isSnapEnabledByUser && !this._isSnapSuspended; }\r\n private get _isSnapSuspended(): boolean { return (0 !== this._suppressed || 0 !== this.toolState.suspended); }\r\n\r\n /** Get the current snap divisor to use to use for SnapMode.NearestKeypoint.\r\n * @public\r\n */\r\n public get keypointDivisor() { return 2; }\r\n\r\n /** Get the current active SnapModes. SnapMode position determines priority, with the first entry being the highest. The SnapDetail will be returned for the first SnapMode that produces a hot snap.\r\n * @public\r\n */\r\n public getActiveSnapModes(): SnapMode[] {\r\n const snaps: SnapMode[] = [];\r\n snaps.push(SnapMode.NearestKeypoint);\r\n return snaps;\r\n }\r\n\r\n /** Can be implemented by a subclass of AccuSnap to implement a SnapMode override that applies only to the next point.\r\n * This method will be called whenever a new tool is installed and on button events.\r\n * @internal\r\n */\r\n public synchSnapMode(): void { }\r\n\r\n /** Check whether current tentative snap has valid curve geometry for finding extended intersections. */\r\n private get _searchForExtendedIntersections(): boolean {\r\n const snap = IModelApp.tentativePoint.getCurrSnap();\r\n return (undefined !== snap && undefined !== snap.primitive);\r\n }\r\n\r\n /**\r\n * Check to see whether its appropriate to generate an AccuSnap point, given the current user\r\n * and command settings, and whether a tentative point is currently active.\r\n */\r\n public get isActive(): boolean {\r\n // Unless we're snapping in intersect mode (to find extended intersections), skip if tentative point active...\r\n if (IModelApp.tentativePoint.isActive) {\r\n if (!this._doSnapping || !this._searchForExtendedIntersections)\r\n return false;\r\n\r\n const snaps = this.getActiveSnapModes();\r\n for (const snap of snaps) {\r\n if (snap === SnapMode.Intersection)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n return this._doSnapping || this.isLocateEnabled;\r\n }\r\n\r\n private initializeForCheckMotion(): void {\r\n this._lastCursorPos.setFrom(IModelApp.toolAdmin.currentInputState.lastMotion);\r\n }\r\n\r\n /** Clear the current AccuSnap info. */\r\n public clear(): void { this.setCurrHit(undefined); }\r\n /** @internal */\r\n public setCurrHit(newHit?: HitDetail): void {\r\n const newSnap = AccuSnap.toSnapDetail(newHit);\r\n const currSnap = this.getCurrSnapDetail();\r\n const sameElem = (undefined !== newHit && newHit.isSameHit(this.currHit));\r\n const sameHit = (sameElem && !newSnap);\r\n const sameSnap = (sameElem && undefined !== newSnap && undefined !== currSnap);\r\n const samePt = (sameHit || (sameSnap && newSnap.snapPoint.isAlmostEqual(currSnap.snapPoint)));\r\n const sameHot = (sameHit || (sameSnap && (this.isHot === newSnap.isHot)));\r\n const sameBaseSnapMode = (!newSnap || !currSnap || newSnap.snapMode === currSnap.snapMode);\r\n const sameType = (sameHot && (!currSnap || (currSnap.getHitType() === newHit.getHitType())));\r\n\r\n // see if it is the same point on the same element, the hot flags are the same multiple snaps, and the snap modes are the same\r\n if (samePt && sameType && sameBaseSnapMode) {\r\n // we know that nothing about the screen could change, just save the new hit and return to avoid screen flash\r\n this.currHit = newHit;\r\n return;\r\n }\r\n\r\n this.erase();\r\n\r\n // if we hit the same element with the same \"hotness\" as last time, we don't need to erase it\r\n // multiple snaps: but only if the old and new snap modes are the same\r\n if (!sameHot || !sameBaseSnapMode) {\r\n this.unFlashViews();\r\n this.setFlashHit(newHit);\r\n }\r\n\r\n // if we didn't get a new hit, we're done\r\n if (undefined === (this.currHit = newHit))\r\n return;\r\n\r\n // draw sprites for this hit\r\n this.showSnapSprite();\r\n }\r\n\r\n /** flash a hit in a single view. */\r\n private flashHitInView(hit: HitDetail, context: DecorateContext) {\r\n const viewport = context.viewport;\r\n if (!viewport || !this.hitShouldBeHilited(hit) || !this.needsFlash(viewport))\r\n return;\r\n\r\n hit.draw(context);\r\n this.setIsFlashed(viewport);\r\n }\r\n\r\n private setNeedsFlashView(view: Viewport) {\r\n if (!this.isFlashed(view) && !this.needsFlash(view))\r\n this.setNeedsFlash(view);\r\n }\r\n\r\n /** flash a hit in its view. */\r\n private setFlashHit(hit?: HitDetail): void {\r\n if (hit !== undefined && this.hitShouldBeHilited(hit))\r\n this.setNeedsFlashView(hit.viewport);\r\n }\r\n\r\n /** @internal */\r\n public erase(): void {\r\n this.clearToolTip(undefined); // make sure there's no tooltip up.\r\n this.clearSprites(); // remove all sprites from the screen\r\n }\r\n\r\n private showElemInfo(viewPt: XAndY, vp: ScreenViewport, hit: HitDetail, delay: BeDuration): void {\r\n if (!IModelApp.viewManager.doesHostHaveFocus || undefined !== this._toolTipPromise)\r\n return;\r\n\r\n const promise = this._toolTipPromise = delay.executeAfter(async () => {\r\n if (promise !== this._toolTipPromise)\r\n return; // we abandoned this request during delay\r\n try {\r\n const msg = await IModelApp.toolAdmin.getToolTip(hit);\r\n if (this._toolTipPromise === promise) // have we abandoned this request while awaiting getToolTip?\r\n this.showLocateMessage(viewPt, vp, msg);\r\n } catch (error) { } // happens if getToolTip was canceled\r\n });\r\n }\r\n\r\n private showLocateMessage(viewPt: XAndY, vp: ScreenViewport, msg: HTMLElement | string) {\r\n if (IModelApp.viewManager.doesHostHaveFocus)\r\n vp.openToolTip(msg, viewPt);\r\n }\r\n\r\n /** @internal */\r\n public displayToolTip(viewPt: XAndY, vp: ScreenViewport, uorPt?: Point3d): void {\r\n // if the tooltip is already displayed, or if user doesn't want it, quit.\r\n if (!this._settings.toolTip || !IModelApp.notifications.isToolTipSupported || IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n const accuSnapHit = this.currHit;\r\n const tpHit = IModelApp.tentativePoint.getCurrSnap();\r\n\r\n // if we don't have either an AccuSnap or a tentative point hit, quit.\r\n if (!accuSnapHit && !tpHit && !this.errorIcon.isActive)\r\n return;\r\n\r\n let theHit: HitDetail | undefined;\r\n\r\n // determine which type of hit\r\n if (tpHit) {\r\n if (uorPt) {\r\n // see if he came back somewhere near the currently snapped element\r\n const aperture = (this._settings.stickyFactor * vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n if (!IModelApp.locateManager.picker.testHit(tpHit, vp, uorPt, aperture, IModelApp.locateManager.options))\r\n return;\r\n }\r\n theHit = tpHit;\r\n } else {\r\n theHit = accuSnapHit;\r\n }\r\n\r\n // if we're currently showing an error, get the error message...otherwise display hit info...\r\n if (!this.errorIcon.isActive && theHit) {\r\n this.showElemInfo(viewPt, vp, theHit, this._settings.toolTipDelay);\r\n return;\r\n }\r\n\r\n // If we have an error explanation...use it as is!\r\n if (this.explanation) {\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n return;\r\n }\r\n\r\n // if we don't have an explanation yet, translate the error code.\r\n if (!this.errorKey)\r\n return;\r\n\r\n this.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${this.errorKey}`);\r\n if (!this.explanation)\r\n return;\r\n\r\n this.showLocateMessage(viewPt, vp, this.explanation);\r\n }\r\n\r\n /** @internal */\r\n public clearToolTip(ev?: BeButtonEvent): void {\r\n // Throw away any stale request for a tooltip message\r\n this._toolTipPromise = undefined;\r\n if (!IModelApp.notifications.isToolTipOpen)\r\n return;\r\n\r\n if (ev && (5 > ev.viewPoint.distanceXY(IModelApp.notifications.toolTipLocation)))\r\n return;\r\n\r\n IModelApp.notifications.clearToolTip();\r\n }\r\n\r\n /** Display the sprites for the current snap to indicate its position on the screen and what snap mode it represents. */\r\n private showSnapSprite(): void {\r\n const snap = this.getCurrSnapDetail();\r\n if (!snap)\r\n return;\r\n\r\n const crossPt = snap.snapPoint;\r\n const viewport = snap.viewport;\r\n const crossSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}${snap.isHot ? \"sprites/SnapCross.png\" : \"sprites/SnapUnfocused.png\"}`);\r\n\r\n this.cross.activate(crossSprite, viewport, crossPt);\r\n\r\n const snapSprite = snap.sprite;\r\n if (snapSprite)\r\n this.icon.activate(snapSprite, viewport, AccuSnap.adjustIconLocation(viewport, crossPt, snapSprite.size));\r\n }\r\n\r\n private static adjustIconLocation(vp: Viewport, input: Point3d, iconSize: XAndY): Point3d {\r\n const out = vp.worldToView(input);\r\n out.x += (iconSize.x / 3.0);\r\n out.y -= (iconSize.y * 1.3);\r\n return vp.viewToWorld(out, out);\r\n }\r\n\r\n /** try to indicate what's wrong with the current point (why we're not snapping). */\r\n private showSnapError(out: LocateResponse, ev: BeButtonEvent) {\r\n this.explanation = out.explanation;\r\n this.errorKey = out.reason;\r\n this.errorIcon.deactivate();\r\n\r\n const vp = ev.viewport!;\r\n let errorSprite: Sprite | undefined;\r\n switch (out.snapStatus) {\r\n case SnapStatus.FilteredByApp:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapAppFiltered.png`);\r\n break;\r\n\r\n case SnapStatus.FilteredByAppQuietly:\r\n this.errorKey = undefined;\r\n break;\r\n\r\n case SnapStatus.NotSnappable:\r\n errorSprite = IconSprites.getSpriteFromUrl(`${IModelApp.publicPath}sprites/SnapNotSnappable.png`);\r\n this.errorKey = ElementLocateManager.getFailureMessageKey(\"NotSnappable\");\r\n break;\r\n }\r\n\r\n if (!errorSprite)\r\n return;\r\n\r\n const spriteSize = errorSprite.size;\r\n const pt = AccuSnap.adjustIconLocation(vp, ev.rawPoint, spriteSize);\r\n\r\n this.errorIcon.activate(errorSprite, vp, pt);\r\n }\r\n\r\n private clearSprites() {\r\n this.errorIcon.deactivate();\r\n this.cross.deactivate();\r\n this.icon.deactivate();\r\n }\r\n\r\n /** determine whether a hit should be hilited or not. */\r\n private hitShouldBeHilited(hit: HitDetail | undefined): boolean {\r\n if (!hit)\r\n return false;\r\n\r\n if (hit.isModelHit || hit.isMapHit)\r\n return false; // Avoid annoying flashing of reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return false;\r\n\r\n const snap = AccuSnap.toSnapDetail(hit);\r\n return !snap || snap.isHot || this._settings.hiliteColdHits;\r\n }\r\n\r\n private unFlashViews() {\r\n this.needFlash.clear();\r\n for (const vp of this.areFlashed)\r\n vp.flashedId = undefined;\r\n\r\n this.areFlashed.clear();\r\n }\r\n\r\n /** @internal */\r\n public adjustPointIfHot(pt: Point3d, view: Viewport): void {\r\n const currSnap = this.getCurrSnapDetail();\r\n\r\n if (!currSnap || !currSnap.isHot || view !== currSnap.viewport)\r\n return;\r\n\r\n pt.setFrom(currSnap.adjustedPoint);\r\n }\r\n\r\n /** Implemented by sub-classes to update ui to show current enabled state.\r\n * @internal\r\n */\r\n public onEnabledStateChange(_isEnabled: boolean, _wasEnabled: boolean) { }\r\n\r\n /** @internal */\r\n public getHitAndList(holder: HitListHolder): HitDetail | undefined {\r\n const hit = this.currHit;\r\n if (hit) {\r\n holder.setHitList(this.aSnapHits);\r\n this.aSnapHits = undefined;\r\n }\r\n return hit;\r\n }\r\n\r\n private initCmdState() {\r\n this.toolState.suspended = 0;\r\n this.toolState.neverFlash = undefined;\r\n }\r\n\r\n /** @internal */\r\n public suspend(doSuspend: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuspend)\r\n this.toolState.suspended++;\r\n else if (this.toolState.suspended > 0)\r\n this.toolState.suspended--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public suppress(doSuppress: boolean): number {\r\n const previousDoSnapping = this._doSnapping;\r\n if (doSuppress)\r\n this._suppressed++;\r\n else if (this._suppressed > 0)\r\n this._suppressed--;\r\n\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n return this._suppressed;\r\n }\r\n\r\n /** Turn AccuSnap on or off */\r\n public enableSnap(yesNo: boolean) {\r\n const previousDoSnapping = this._doSnapping;\r\n this.toolState.enabled = yesNo;\r\n if (!yesNo) {\r\n this.clear();\r\n if (undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n this.onEnabledStateChange(this._doSnapping, previousDoSnapping);\r\n }\r\n\r\n /** @internal */\r\n public intersectXY(tpSnap: SnapDetail, second: SnapDetail): IntersectDetail | undefined {\r\n // Get single segment curve from each snap to intersect...\r\n const tpSegment = tpSnap.getCurvePrimitive();\r\n if (undefined === tpSegment)\r\n return undefined;\r\n const segment = second.getCurvePrimitive();\r\n if (undefined === segment)\r\n return undefined;\r\n\r\n const worldToView = second.viewport.worldToViewMap.transform0;\r\n const detail = CurveCurve.intersectionProjectedXYPairs(worldToView, tpSegment, true, segment, true);\r\n if (0 === detail.length)\r\n return undefined;\r\n\r\n let closeIndex = 0;\r\n if (detail.length > 1) {\r\n const snapPt = worldToView.multiplyPoint3d(HitGeomType.Point === tpSnap.geomType && HitGeomType.Point !== second.geomType ? second.getPoint() : tpSnap.getPoint(), 1); // Don't check distance from arc centers...\r\n let lastDist: number | undefined;\r\n\r\n for (let i = 0; i < detail.length; i++) {\r\n const testPt = worldToView.multiplyPoint3d(detail[i].detailA.point, 1);\r\n const testDist = snapPt.realDistanceXY(testPt);\r\n\r\n if (undefined !== testDist && (undefined === lastDist || testDist < lastDist)) {\r\n lastDist = testDist;\r\n closeIndex = i;\r\n }\r\n }\r\n }\r\n\r\n const intersect = new IntersectDetail(tpSnap, SnapHeat.InRange, detail[closeIndex].detailA.point, segment, second.sourceId); // Should be ok to share hit detail with tentative...\r\n intersect.primitive = tpSegment; // Just save single segment that was intersected for line strings/shapes...\r\n\r\n return intersect;\r\n }\r\n\r\n /** @internal */\r\n public static async requestSnap(thisHit: HitDetail, snapModes: SnapMode[], hotDistanceInches: number, keypointDivisor: number, hitList?: HitList<HitDetail>, out?: LocateResponse): Promise<SnapDetail | undefined> {\r\n if (thisHit.isModelHit || thisHit.isMapHit || thisHit.isClassifier) {\r\n if (snapModes.includes(SnapMode.Nearest)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n return new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.InRange);\r\n } else if (1 === snapModes.length && snapModes.includes(SnapMode.Intersection)) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined;\r\n } else {\r\n if (out)\r\n out.snapStatus = SnapStatus.Success;\r\n\r\n const realitySnap = new SnapDetail(thisHit, SnapMode.Nearest, SnapHeat.None);\r\n realitySnap.sprite = undefined; // Don't show a snap mode that isn't applicable, but still accept hit point...\r\n return realitySnap;\r\n }\r\n }\r\n\r\n const hitVp = thisHit.viewAttachment ? thisHit.viewAttachment.viewport : thisHit.viewport;\r\n if (undefined !== thisHit.subCategoryId && !thisHit.isExternalIModelHit) {\r\n const appearance = hitVp.getSubCategoryAppearance(thisHit.subCategoryId);\r\n if (appearance.dontSnap) {\r\n if (out) {\r\n out.snapStatus = SnapStatus.NotSnappable;\r\n out.explanation = IModelApp.localization.getLocalizedString(`iModelJs:${ElementLocateManager.getFailureMessageKey(\"NotSnappableSubCategory\")}`);\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n const requestProps: SnapRequestProps = {\r\n id: thisHit.sourceId,\r\n testPoint: thisHit.testPoint,\r\n closePoint: thisHit.hitPoint,\r\n worldToView: hitVp.worldToViewMap.transform0.toJSON(),\r\n viewFlags: hitVp.viewFlags,\r\n snapModes,\r\n snapAperture: hitVp.pixelsFromInches(hotDistanceInches),\r\n snapDivisor: keypointDivisor,\r\n subCategoryId: thisHit.subCategoryId,\r\n geometryClass: thisHit.geometryClass,\r\n };\r\n\r\n const thisGeom = (thisHit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(thisHit) : IModelApp.viewManager.getDecorationGeometry(thisHit));\r\n\r\n if (undefined !== thisGeom) {\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: thisGeom }];\r\n } else if (!thisHit.isElementHit) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n return undefined;\r\n }\r\n\r\n if (snapModes.includes(SnapMode.Intersection)) {\r\n if (undefined !== hitList) {\r\n for (const hit of hitList.hits) {\r\n if (thisHit.sourceId === hit.sourceId || thisHit.iModel !== hit.iModel)\r\n continue;\r\n\r\n const geom = (hit.isElementHit ? IModelApp.viewManager.overrideElementGeometry(hit) : IModelApp.viewManager.getDecorationGeometry(hit));\r\n\r\n if (undefined !== geom) {\r\n if (undefined === requestProps.decorationGeometry)\r\n requestProps.decorationGeometry = [{ id: thisHit.sourceId, geometryStream: geom }];\r\n else\r\n requestProps.decorationGeometry.push({ id: thisHit.sourceId, geometryStream: geom });\r\n } else if (!hit.isElementHit) {\r\n continue;\r\n }\r\n\r\n if (undefined === requestProps.intersectCandidates)\r\n requestProps.intersectCandidates = [hit.sourceId];\r\n else\r\n requestProps.intersectCandidates.push(hit.sourceId);\r\n\r\n if (5 === requestProps.intersectCandidates.length)\r\n break; // Search for intersection with a few of the next best hits...\r\n }\r\n }\r\n\r\n if (1 === snapModes.length && undefined === requestProps.intersectCandidates) {\r\n if (out)\r\n out.snapStatus = SnapStatus.NoSnapPossible;\r\n\r\n return undefined; // Don't make back end request when only doing intersection snap when we don't have another hit to intersect with...\r\n }\r\n }\r\n\r\n try {\r\n const result = await thisHit.iModel.requestSnap(requestProps);\r\n\r\n if (out)\r\n out.snapStatus = result.status;\r\n\r\n if (result.status !== SnapStatus.Success)\r\n return undefined;\r\n\r\n const parseCurve = (json: any): CurvePrimitive | undefined => {\r\n const parsed = undefined !== json ? GeomJson.Reader.parse(json) : undefined;\r\n return parsed instanceof GeometryQuery && \"curvePrimitive\" === parsed.geometryCategory ? parsed : undefined;\r\n };\r\n\r\n const snapPoint = Point3d.fromJSON(result.snapPoint);\r\n const displayTransform = undefined !== thisHit.modelId ? thisHit.viewport.view.computeDisplayTransform({\r\n modelId: thisHit.modelId,\r\n elementId: thisHit.sourceId,\r\n viewAttachmentId: thisHit.viewAttachment?.id,\r\n }) : undefined;\r\n displayTransform?.multiplyPoint3d(snapPoint, snapPoint);\r\n\r\n const snap = new SnapDetail(thisHit, result.snapMode, result.heat, snapPoint);\r\n\r\n snap.setCurvePrimitive(parseCurve(result.curve), displayTransform, result.geomType);\r\n if (undefined !== result.parentGeomType)\r\n snap.parentGeomType = result.parentGeomType;\r\n\r\n // Update hitPoint from readPixels with exact point location corrected to surface/edge geometry.\r\n if (undefined !== result.hitPoint) {\r\n snap.hitPoint.setFromJSON(result.hitPoint);\r\n displayTransform?.multiplyPoint3d(snap.hitPoint, snap.hitPoint);\r\n }\r\n\r\n // Apply display transform to normal.\r\n if (undefined !== result.normal) {\r\n snap.normal = Vector3d.fromJSON(result.normal);\r\n displayTransform?.matrix.multiplyVector(snap.normal, snap.normal);\r\n snap.normal.normalizeInPlace();\r\n }\r\n\r\n if (SnapMode.Intersection !== snap.snapMode)\r\n return snap;\r\n\r\n if (undefined === result.intersectId)\r\n return undefined;\r\n\r\n const otherPrimitive = parseCurve(result.intersectCurve);\r\n if (undefined === otherPrimitive)\r\n return undefined;\r\n\r\n const intersect = new IntersectDetail(snap, snap.heat, snap.snapPoint, otherPrimitive, result.intersectId);\r\n return intersect;\r\n } catch (_err) {\r\n if (out)\r\n out.snapStatus = SnapStatus.Aborted;\r\n\r\n return undefined;\r\n }\r\n }\r\n\r\n private async getAccuSnapDetail(hitList: HitList<HitDetail>, out: LocateResponse): Promise<SnapDetail | undefined> {\r\n const thisHit = hitList.getNextHit();\r\n if (undefined === thisHit)\r\n return undefined;\r\n\r\n const filterStatus: LocateFilterStatus = (this.isLocateEnabled ? await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, out) : LocateFilterStatus.Accept);\r\n if (LocateFilterStatus.Accept !== filterStatus) {\r\n out.snapStatus = SnapStatus.FilteredByApp;\r\n return undefined;\r\n }\r\n\r\n let snapModes: SnapMode[];\r\n if (IModelApp.tentativePoint.isActive) {\r\n snapModes = [];\r\n snapModes.push(SnapMode.Nearest); // Special case: isActive only allows snapping with tentative to find extended intersections...\r\n } else {\r\n snapModes = this.getActiveSnapModes(); // Get the list of point snap modes to consider\r\n }\r\n\r\n const thisSnap = await AccuSnap.requestSnap(thisHit, snapModes, this._hotDistanceInches, this.keypointDivisor, hitList, out);\r\n if (undefined === thisSnap)\r\n return undefined;\r\n\r\n if (IModelApp.tentativePoint.isActive) {\r\n const tpSnap = IModelApp.tentativePoint.getCurrSnap();\r\n if (undefined === tpSnap)\r\n return undefined;\r\n const intersectSnap = this.intersectXY(tpSnap, thisSnap);\r\n if (undefined === intersectSnap)\r\n return undefined;\r\n hitList.setCurrentHit(thisHit);\r\n return intersectSnap;\r\n }\r\n\r\n IModelApp.accuDraw.onSnap(thisSnap); // AccuDraw can adjust nearest snap to intersection of circle (polar distance lock) or line (axis lock) with snapped to curve...\r\n hitList.setCurrentHit(thisHit);\r\n return thisSnap;\r\n }\r\n\r\n /** Request a snap from the backend for the supplied HitDetail.\r\n * @param hit The HitDetail to snap to.\r\n * @param snapMode Optional SnapMode, uses active snap modes if not specified.\r\n * @return A Promise for the SnapDetail or undefined if no snap could be created.\r\n */\r\n public async doSnapRequest(hit: HitDetail, snapMode?: SnapMode): Promise<SnapDetail | undefined> {\r\n let snapModes: SnapMode[];\r\n if (undefined === snapMode)\r\n snapModes = this.getActiveSnapModes();\r\n else\r\n snapModes = [snapMode];\r\n\r\n return AccuSnap.requestSnap(hit, snapModes, this._hotDistanceInches, this.keypointDivisor);\r\n }\r\n\r\n private findHits(ev: BeButtonEvent, force: boolean = false): SnapStatus {\r\n // When using AccuSnap to locate elements, we have to start with the datapoint adjusted\r\n // for locks and not the raw point. Otherwise, when grid/unit lock are on, we locate elements by\r\n // points not on the grid. This causes them to be \"pulled\" off the grid when they are accepted. On\r\n // the other hand, when NOT locating, we need to use the raw point so we can snap to elements\r\n // away from the grid.\r\n\r\n const testPoint = this.isLocateEnabled ? ev.point : ev.rawPoint;\r\n const vp = ev.viewport!;\r\n const picker = IModelApp.locateManager.picker;\r\n const options = IModelApp.locateManager.options.clone(); // Copy to avoid changing out from under active Tool...\r\n\r\n // NOTE: Since TestHit will use the same HitSource as the input hit we only need to sets this for DoPick...\r\n options.hitSource = this.isSnapEnabled ? HitSource.AccuSnap : HitSource.MotionLocate;\r\n\r\n let aperture = (vp.pixelsFromInches(IModelApp.locateManager.apertureInches) / 2.0) + 1.5;\r\n this.initializeForCheckMotion();\r\n aperture *= this._searchDistance;\r\n\r\n if (0 === picker.doPick(vp, testPoint, aperture, options)) {\r\n this.aSnapHits = undefined; // Clear any previous hit list so reset won't cycle through hits cursor is no longer over, etc.\r\n return SnapStatus.NoElements;\r\n }\r\n\r\n this.aSnapHits = picker.getHitList(true); // take ownership of the pickElem hit list.\r\n\r\n // see if we should keep the current hit\r\n const canBeSticky = !force && this.aSnapHits.length > 1 && this.currHit && (HitDetailType.Intersection !== this.currHit.getHitType() && this.currHit.priority < HitPriority.PlanarSurface);\r\n if (canBeSticky) {\r\n for (let iHit = 1; iHit < this.aSnapHits.length; ++iHit) {\r\n const thisHit = this.aSnapHits.hits[iHit];\r\n if (!thisHit.isSameHit(this.currHit))\r\n continue;\r\n this.aSnapHits.removeHit(iHit);\r\n this.aSnapHits.insertHit(0, thisHit);\r\n break;\r\n }\r\n }\r\n\r\n return SnapStatus.Success;\r\n }\r\n\r\n private async findLocatableHit(ev: BeButtonEvent, newSearch: boolean, out: LocateResponse): Promise<HitDetail | undefined> {\r\n out.snapStatus = SnapStatus.NoElements;\r\n\r\n if (newSearch) {\r\n this.aSnapHits = undefined;\r\n // search for new hits, but if the cursor is still close to the current hit, don't throw away list.\r\n if (SnapStatus.Success !== (out.snapStatus = this.findHits(ev)))\r\n return undefined;\r\n } else {\r\n if (!this.aSnapHits) {\r\n out.snapStatus = SnapStatus.NoElements;\r\n return undefined;\r\n }\r\n }\r\n\r\n const thisList = this.aSnapHits!;\r\n let thisHit: HitDetail | undefined;\r\n let firstRejected;\r\n const filterResponse = new LocateResponse();\r\n\r\n // keep looking through hits until we find one that is accu-snappable.\r\n while (undefined !== (thisHit = thisList.getNextHit())) {\r\n if (LocateFilterStatus.Accept === await IModelApp.locateManager.filterHit(thisHit, LocateAction.AutoLocate, filterResponse))\r\n return thisHit;\r\n // we only care about the status of the first hit.\r\n if (undefined !== firstRejected)\r\n continue;\r\n firstRejected = filterResponse.clone();\r\n firstRejected.snapStatus = SnapStatus.FilteredByApp;\r\n }\r\n\r\n if (undefined !== firstRejected)\r\n out.setFrom(firstRejected);\r\n\r\n // Reset current hit index to go back to first hit on next AccuSnap reset event...\r\n thisList.resetCurrentHit();\r\n return undefined;\r\n }\r\n\r\n /** When in auto-locate mode, advance to the next hit without searching again.\r\n * @internal\r\n */\r\n public async resetButton(): Promise<SnapStatus> {\r\n let hit: HitDetail | undefined;\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n this.clearToolTip(undefined);\r\n\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n\r\n if (this._doSnapping) {\r\n // if we don't have any more candidate hits, get a new list at the current location\r\n if (!this.aSnapHits || (0 === this.aSnapHits.length)) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n } else {\r\n // drop the current hit from the list and then retest the list (without the dropped hit) to find the new snap\r\n this.aSnapHits.removeCurrentHit();\r\n hit = await this.getAccuSnapDetail(this.aSnapHits, out);\r\n }\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, false, out); // get next AccuSnap path (or undefined)\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n\r\n // set the current hit\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // indicate errors\r\n this.showSnapError(out, ev);\r\n return out.snapStatus;\r\n }\r\n\r\n /** Find the best snap point according to the current cursor location\r\n * @internal\r\n */\r\n public async onMotion(ev: BeButtonEvent): Promise<void> {\r\n this.clearToolTip(ev);\r\n const out = new LocateResponse();\r\n out.snapStatus = SnapStatus.Disabled;\r\n\r\n let hit: HitDetail | undefined;\r\n if (this.isActive) {\r\n if (this._doSnapping) {\r\n out.snapStatus = this.findHits(ev);\r\n hit = (SnapStatus.Success !== out.snapStatus) ? undefined : await this.getAccuSnapDetail(this.aSnapHits!, out);\r\n if (!this._doSnapping)\r\n hit = undefined; // Snap no longer requested...\r\n } else if (this.isLocateEnabled) {\r\n hit = await this.findLocatableHit(ev, true, out);\r\n if (!this.isLocateEnabled)\r\n hit = undefined; // Hit no longer requested...\r\n }\r\n }\r\n\r\n // set the current hit and display the sprite (based on snap's KeypointType)\r\n if (hit || this.currHit)\r\n this.setCurrHit(hit);\r\n\r\n // set up active error before calling displayToolTip to indicate error or show locate message...\r\n this.showSnapError(out, ev);\r\n this.displayToolTip(ev.viewPoint, ev.viewport!, ev.rawPoint);\r\n\r\n if (undefined !== this.touchCursor && InputSource.Mouse === ev.inputSource) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onPreButtonEvent(ev: BeButtonEvent): boolean { return (undefined !== this.touchCursor) ? this.touchCursor.isButtonHandled(ev) : false; }\r\n /** @internal */\r\n public onTouchStart(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchStart(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchEnd(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor && 0 === ev.touchCount)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchCancel(ev: BeTouchEvent): void {\r\n if (undefined !== this.touchCursor)\r\n this.touchCursor.doTouchEnd(ev);\r\n }\r\n\r\n /** @internal */\r\n public onTouchMove(ev: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMove(ev) : false;\r\n }\r\n\r\n /** @internal */\r\n public onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): boolean {\r\n return (undefined !== this.touchCursor) ? this.touchCursor.doTouchMoveStart(ev, startEv) : false;\r\n }\r\n\r\n /** @internal */\r\n public get wantVirtualCursor(): boolean {\r\n return this._doSnapping || (this.isLocateEnabled && ToolSettings.enableVirtualCursorForLocate);\r\n }\r\n\r\n /** @internal */\r\n public async onTouchTap(ev: BeTouchEvent): Promise<boolean> {\r\n if (undefined !== this.touchCursor)\r\n return this.touchCursor.doTouchTap(ev);\r\n if (!this.wantVirtualCursor)\r\n return false;\r\n this.touchCursor = TouchCursor.createFromTouchTap(ev);\r\n if (undefined === this.touchCursor)\r\n return false;\r\n // Give active tool an opportunity to update it's tool assistance since event won't be passed along...\r\n const tool = IModelApp.toolAdmin.activeTool;\r\n if (undefined === tool)\r\n return true;\r\n await tool.onSuspend();\r\n await tool.onUnsuspend();\r\n return true;\r\n }\r\n\r\n private flashElements(context: DecorateContext): void {\r\n const viewport = context.viewport;\r\n if (this.currHit) {\r\n if (this.needsFlash(viewport))\r\n this.flashHitInView(this.currHit, context);\r\n return;\r\n }\r\n\r\n const hit = IModelApp.tentativePoint.getCurrSnap();\r\n if (!hit || hit.isModelHit || hit.isMapHit)\r\n return; // Don't hilite reality models.\r\n\r\n if (this.toolState.neverFlash && this.toolState.neverFlash.has(hit.sourceId))\r\n return;\r\n\r\n hit.draw(context);\r\n }\r\n\r\n /** @internal */\r\n public decorate(context: DecorateContext): void {\r\n if (undefined !== this.touchCursor && this.touchCursor.viewport === context.viewport)\r\n context.addCanvasDecoration(this.touchCursor, true);\r\n\r\n this.flashElements(context);\r\n\r\n if (this.cross.isActive) {\r\n this.cross.decorate(context);\r\n this.icon.decorate(context);\r\n }\r\n\r\n this.errorIcon.decorate(context);\r\n }\r\n\r\n private clearElemFromHitList(element: string) {\r\n if (this.aSnapHits)\r\n this.aSnapHits.removeHitsFrom(element);\r\n }\r\n\r\n /** @internal */\r\n public clearIfElement(sourceId: string): void {\r\n this.clearElemFromHitList(sourceId);\r\n\r\n const hit = this.currHit;\r\n if (hit && hit.sourceId === sourceId) {\r\n this.destroy();\r\n }\r\n }\r\n\r\n /** Enable locating elements.\r\n * @public\r\n */\r\n public enableLocate(yesNo: boolean) {\r\n this.toolState.locate = yesNo;\r\n if (!yesNo && undefined !== this.touchCursor && !this.wantVirtualCursor) {\r\n this.touchCursor = undefined;\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n }\r\n\r\n /** Called whenever a new [[Tool]] is started.\r\n * @internal\r\n */\r\n public onStartTool(): void {\r\n this.initCmdState();\r\n this.enableSnap(false);\r\n this.enableLocate(false);\r\n IModelApp.tentativePoint.clear(true);\r\n }\r\n\r\n /**\r\n * Force AccuSnap to reevaluate the snap at the current cursor location.\r\n * This is useful of an application changes the snap mode and wants AccuSnap to choose it immediately, without\r\n * requiring the user to move the mouse.\r\n * @internal\r\n */\r\n public async reEvaluate() {\r\n if (this.getCurrSnapDetail()) {\r\n const ev = new BeButtonEvent();\r\n IModelApp.toolAdmin.fillEventFromCursorLocation(ev);\r\n return this.onMotion(ev);\r\n }\r\n }\r\n}\r\n\r\n/** TentativeOrAccuSnap returns information about an active snap generated by either [[AccuSnap]] or [[TentativePoint]].\r\n * @public\r\n */\r\nexport class TentativeOrAccuSnap {\r\n /** @return true if AccuSnap is *hot* or TentativePoint is active and snapped to pickable geometry. */\r\n public static get isHot(): boolean { return IModelApp.accuSnap.isHot || IModelApp.tentativePoint.isSnapped; }\r\n\r\n /** Get the current snap from either AccuSnap or TentativePoint.\r\n * @param checkIsHot true to only return the snap from AccuSnap when it is *hot*.\r\n * @return The current snap from AccuSnap, TentativePoint, or undefined.\r\n */\r\n public static getCurrentSnap(checkIsHot: boolean = true): SnapDetail | undefined {\r\n // Checking for a hot AccuSnap before checking TentativePoint is done to support extended intersections...\r\n if (IModelApp.accuSnap.isHot)\r\n return IModelApp.accuSnap.getCurrSnapDetail();\r\n\r\n if (IModelApp.tentativePoint.isSnapped)\r\n return IModelApp.tentativePoint.currSnap;\r\n\r\n return (checkIsHot ? undefined : IModelApp.accuSnap.getCurrSnapDetail());\r\n }\r\n\r\n /** @return The current snap location from AccuSnap or TentativePoint */\r\n public static getCurrentPoint(): Point3d {\r\n if (IModelApp.accuSnap.isHot) {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n if (snap)\r\n return snap.adjustedPoint;\r\n }\r\n\r\n return IModelApp.tentativePoint.getPoint();\r\n }\r\n\r\n /** @return The current snap Viewport from AccuSnap or TentativePoint */\r\n public static getCurrentView(): ScreenViewport | undefined {\r\n const snap = IModelApp.accuSnap.getCurrSnapDetail();\r\n return snap ? snap.viewport : IModelApp.tentativePoint.viewport;\r\n }\r\n}\r\n\r\n/** @public */\r\nexport namespace AccuSnap { // eslint-disable-line no-redeclare\r\n export class ToolState {\r\n public enabled = false;\r\n public locate = false;\r\n public suspended = 0;\r\n public neverFlash?: Id64Set;\r\n public setFrom(other: ToolState): void {\r\n this.enabled = other.enabled;\r\n this.locate = other.locate;\r\n this.suspended = other.suspended;\r\n this.neverFlash = other.neverFlash;\r\n }\r\n public clone(): ToolState {\r\n const val = new ToolState();\r\n val.setFrom(this);\r\n return val;\r\n }\r\n }\r\n\r\n export class Settings {\r\n public hotDistanceFactor = 1.2;\r\n public stickyFactor = 1.0;\r\n public searchDistance = 2.0;\r\n public hiliteColdHits = true;\r\n public enableFlag = true;\r\n public toolTip = true;\r\n public toolTipDelay = BeDuration.fromSeconds(.5); // delay before tooltip pops up\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-frontend",
3
- "version": "4.1.0-dev.70",
3
+ "version": "4.1.0-dev.71",
4
4
  "description": "iTwin.js frontend components",
5
5
  "main": "lib/cjs/core-frontend.js",
6
6
  "module": "lib/esm/core-frontend.js",
@@ -23,12 +23,12 @@
23
23
  "url": "http://www.bentley.com"
24
24
  },
25
25
  "peerDependencies": {
26
- "@itwin/appui-abstract": "^4.1.0-dev.70",
27
- "@itwin/core-bentley": "^4.1.0-dev.70",
28
- "@itwin/core-common": "^4.1.0-dev.70",
29
- "@itwin/core-geometry": "^4.1.0-dev.70",
30
- "@itwin/core-orbitgt": "^4.1.0-dev.70",
31
- "@itwin/core-quantity": "^4.1.0-dev.70"
26
+ "@itwin/appui-abstract": "^4.1.0-dev.71",
27
+ "@itwin/core-bentley": "^4.1.0-dev.71",
28
+ "@itwin/core-common": "^4.1.0-dev.71",
29
+ "@itwin/core-geometry": "^4.1.0-dev.71",
30
+ "@itwin/core-orbitgt": "^4.1.0-dev.71",
31
+ "@itwin/core-quantity": "^4.1.0-dev.71"
32
32
  },
33
33
  "//devDependencies": [
34
34
  "NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install",
@@ -55,14 +55,14 @@
55
55
  "source-map-loader": "^4.0.0",
56
56
  "typescript": "~5.0.2",
57
57
  "webpack": "^5.76.0",
58
- "@itwin/appui-abstract": "4.1.0-dev.70",
59
- "@itwin/build-tools": "4.1.0-dev.70",
60
- "@itwin/core-bentley": "4.1.0-dev.70",
61
- "@itwin/core-geometry": "4.1.0-dev.70",
62
- "@itwin/core-orbitgt": "4.1.0-dev.70",
63
- "@itwin/core-common": "4.1.0-dev.70",
64
- "@itwin/core-quantity": "4.1.0-dev.70",
65
- "@itwin/certa": "4.1.0-dev.70"
58
+ "@itwin/appui-abstract": "4.1.0-dev.71",
59
+ "@itwin/core-bentley": "4.1.0-dev.71",
60
+ "@itwin/build-tools": "4.1.0-dev.71",
61
+ "@itwin/core-common": "4.1.0-dev.71",
62
+ "@itwin/core-geometry": "4.1.0-dev.71",
63
+ "@itwin/core-orbitgt": "4.1.0-dev.71",
64
+ "@itwin/core-quantity": "4.1.0-dev.71",
65
+ "@itwin/certa": "4.1.0-dev.71"
66
66
  },
67
67
  "//dependencies": [
68
68
  "NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API",
@@ -75,9 +75,9 @@
75
75
  "@loaders.gl/draco": "^3.1.6",
76
76
  "fuse.js": "^3.3.0",
77
77
  "wms-capabilities": "0.4.0",
78
- "@itwin/core-i18n": "4.1.0-dev.70",
79
- "@itwin/core-telemetry": "4.1.0-dev.70",
80
- "@itwin/webgl-compatibility": "4.1.0-dev.70"
78
+ "@itwin/core-i18n": "4.1.0-dev.71",
79
+ "@itwin/core-telemetry": "4.1.0-dev.71",
80
+ "@itwin/webgl-compatibility": "4.1.0-dev.71"
81
81
  },
82
82
  "nyc": {
83
83
  "extends": "./node_modules/@itwin/build-tools/.nycrc"