@itwin/core-frontend 4.0.0-dev.33 → 4.0.0-dev.37

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ElementLocateManager.d.ts","sourceRoot":"","sources":["../../src/ElementLocateManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ElementLocateManager.d.ts","sourceRoot":"","sources":["../../src/ElementLocateManager.ts"],"names":[],"mappings":"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"}
@@ -200,6 +200,8 @@ class ElementPicker {
200
200
  const testPointView = new core_geometry_1.Point2d(Math.floor(pickPointView.x + 0.5), Math.floor(pickPointView.y + 0.5));
201
201
  let pixelRadius = Math.floor(pickRadiusView + 0.5);
202
202
  const rect = new ViewRect_1.ViewRect(testPointView.x - pixelRadius, testPointView.y - pixelRadius, testPointView.x + pixelRadius, testPointView.y + pixelRadius);
203
+ if (rect.isNull)
204
+ return 0;
203
205
  let result = 0;
204
206
  vp.readPixels(rect, Pixel_1.Pixel.Selector.All, (pixels) => {
205
207
  if (undefined === pixels)
@@ -1 +1 @@
1
- {"version":3,"file":"ElementLocateManager.js","sourceRoot":"","sources":["../../src/ElementLocateManager.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 { Id64 } from \"@itwin/core-bentley\";\r\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\r\nimport { HitDetail, HitList, HitPriority, HitSource } from \"./HitDetail\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { Pixel } from \"./render/Pixel\";\r\nimport { InputSource, InteractiveTool } from \"./tools/Tool\";\r\nimport { ScreenViewport, Viewport } from \"./Viewport\";\r\nimport { ViewRect } from \"./ViewRect\";\r\n\r\n/** The possible actions for which a locate filter can be called.\r\n * @public\r\n * @extensions\r\n */\r\nexport enum LocateAction {\r\n Identify = 0,\r\n AutoLocate = 1,\r\n}\r\n\r\n/** Values to return from a locate filter.\r\n * Return `Reject` to indicate the element is unacceptable.\r\n * @public\r\n * @extensions\r\n */\r\nexport enum LocateFilterStatus {\r\n Accept = 0,\r\n Reject = 1,\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport enum SnapStatus {\r\n Success = 0,\r\n Aborted = 1,\r\n NoElements = 2,\r\n Disabled = 100,\r\n NoSnapPossible = 200,\r\n NotSnappable = 300,\r\n FilteredByApp = 600,\r\n FilteredByAppQuietly = 700,\r\n}\r\n\r\n/** Options that customize the way element location (i.e. *picking*) works.\r\n * @public\r\n * @extensions\r\n */\r\nexport class LocateOptions {\r\n /** If true, also test graphics from view decorations. */\r\n public allowDecorations = false;\r\n /** If true, also test graphics with non-locatable flag set. */\r\n public allowNonLocatable = false;\r\n /** Maximum number of hits to return. */\r\n public maxHits = 20;\r\n /** The [[HitSource]] identifying the caller. */\r\n public hitSource = HitSource.DataPoint;\r\n /** If true, also test graphics from an IModelConnection other than the one associated with the Viewport. This can occur if, e.g., a\r\n * [[TiledGraphicsProvider]] is used to display graphics from a different iModel into the [[Viewport]].\r\n * @note If you override this, you must be prepared to properly handle [[HitDetail]]s originating from other IModelConnections.\r\n * @see [[HitDetail.iModel]] and [[HitDetail.isExternalIModelHit]]\r\n */\r\n public allowExternalIModels = false;\r\n /** If true, then the world point of a hit on a model will preserve any transforms applied to the model at display time,\r\n * such as those supplied by a [[ModelDisplayTransformProvider]] or [PlanProjectionSettings.elevation]($common).\r\n * Otherwise, the world point will be multiplied by the inverse of any such transforms to correlate it with the model's true coordinate space.\r\n */\r\n public preserveModelDisplayTransforms = false;\r\n\r\n /** Make a copy of this LocateOptions. */\r\n public clone(): LocateOptions {\r\n const other = new LocateOptions();\r\n other.allowDecorations = this.allowDecorations;\r\n other.allowNonLocatable = this.allowNonLocatable;\r\n other.maxHits = this.maxHits;\r\n other.hitSource = this.hitSource;\r\n other.allowExternalIModels = this.allowExternalIModels;\r\n return other;\r\n }\r\n public setFrom(other: LocateOptions): void {\r\n this.allowDecorations = other.allowDecorations;\r\n this.allowNonLocatable = other.allowNonLocatable;\r\n this.maxHits = other.maxHits;\r\n this.hitSource = other.hitSource;\r\n this.allowExternalIModels = other.allowExternalIModels;\r\n }\r\n public init() {\r\n this.allowDecorations = this.allowNonLocatable = this.allowExternalIModels = false;\r\n this.maxHits = 20;\r\n this.hitSource = HitSource.DataPoint;\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport class LocateResponse {\r\n public snapStatus = SnapStatus.Success;\r\n public reason?: string;\r\n public explanation = \"\";\r\n\r\n /** @internal */\r\n public clone(): LocateResponse {\r\n const other = new LocateResponse();\r\n other.snapStatus = this.snapStatus;\r\n other.reason = this.reason;\r\n other.explanation = this.explanation;\r\n return other;\r\n }\r\n\r\n /** @internal */\r\n public setFrom(other: LocateResponse): void {\r\n this.snapStatus = other.snapStatus;\r\n this.reason = other.reason;\r\n this.explanation = other.explanation;\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport interface HitListHolder {\r\n setHitList(list: HitList<HitDetail> | undefined): void;\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport class ElementPicker {\r\n public viewport?: Viewport;\r\n public readonly pickPointWorld = new Point3d();\r\n public hitList?: HitList<HitDetail>;\r\n\r\n public empty() {\r\n this.pickPointWorld.setZero();\r\n this.viewport = undefined;\r\n if (this.hitList)\r\n this.hitList.empty();\r\n else\r\n this.hitList = new HitList<HitDetail>();\r\n }\r\n\r\n /** return the HitList for the last Pick performed. Optionally allows the caller to take ownership of the list. */\r\n public getHitList(takeOwnership: boolean): HitList<HitDetail> {\r\n const list = this.hitList!;\r\n if (takeOwnership)\r\n this.hitList = undefined;\r\n return list;\r\n }\r\n\r\n public getNextHit(): HitDetail | undefined { return this.hitList ? this.hitList.getNextHit() : undefined; }\r\n\r\n /** Return a hit from the list of hits created the last time pickElements was called. */\r\n public getHit(i: number): HitDetail | undefined { return this.hitList ? this.hitList.getHit(i) : undefined; }\r\n\r\n public resetCurrentHit(): void {\r\n if (this.hitList)\r\n this.hitList.resetCurrentHit();\r\n }\r\n\r\n private getPixelPriority(pixel: Pixel.Data) {\r\n switch (pixel.type) {\r\n case Pixel.GeometryType.Surface:\r\n return Pixel.Planarity.Planar === pixel.planarity ? HitPriority.PlanarSurface : HitPriority.NonPlanarSurface;\r\n case Pixel.GeometryType.Linear:\r\n return HitPriority.WireEdge;\r\n case Pixel.GeometryType.Edge:\r\n return Pixel.Planarity.Planar === pixel.planarity ? HitPriority.PlanarEdge : HitPriority.NonPlanarEdge;\r\n case Pixel.GeometryType.Silhouette:\r\n return HitPriority.SilhouetteEdge;\r\n default:\r\n return HitPriority.Unknown;\r\n }\r\n }\r\n\r\n private comparePixel(pixel1: Pixel.Data, pixel2: Pixel.Data, distXY1: number, distXY2: number) {\r\n const priority1 = this.getPixelPriority(pixel1);\r\n const priority2 = this.getPixelPriority(pixel2);\r\n if (priority1 < priority2)\r\n return -1;\r\n if (priority1 > priority2)\r\n return 1;\r\n if (distXY1 < distXY2)\r\n return -1;\r\n if (distXY1 > distXY2)\r\n return 1;\r\n if (pixel1.distanceFraction > pixel2.distanceFraction)\r\n return -1;\r\n if (pixel1.distanceFraction < pixel2.distanceFraction)\r\n return 1;\r\n\r\n return 0;\r\n }\r\n\r\n /** Generate a list of elements that are close to a given point.\r\n * @returns The number of hits in the hitList of this object.\r\n */\r\n public doPick(vp: ScreenViewport, pickPointWorld: Point3d, pickRadiusView: number, options: LocateOptions): number {\r\n if (this.hitList && this.hitList.length > 0 && vp === this.viewport && pickPointWorld.isAlmostEqual(this.pickPointWorld)) {\r\n this.hitList.resetCurrentHit();\r\n return this.hitList.length;\r\n }\r\n\r\n this.empty(); // empty the hit list\r\n this.viewport = vp;\r\n this.pickPointWorld.setFrom(pickPointWorld);\r\n\r\n const pickPointView = vp.worldToView(pickPointWorld);\r\n const testPointView = new Point2d(Math.floor(pickPointView.x + 0.5), Math.floor(pickPointView.y + 0.5));\r\n let pixelRadius = Math.floor(pickRadiusView + 0.5);\r\n const rect = new ViewRect(testPointView.x - pixelRadius, testPointView.y - pixelRadius, testPointView.x + pixelRadius, testPointView.y + pixelRadius);\r\n let result: number = 0;\r\n vp.readPixels(rect, Pixel.Selector.All, (pixels) => {\r\n if (undefined === pixels)\r\n return;\r\n\r\n testPointView.x = vp.cssPixelsToDevicePixels(testPointView.x);\r\n testPointView.y = vp.cssPixelsToDevicePixels(testPointView.y);\r\n pixelRadius = vp.cssPixelsToDevicePixels(pixelRadius);\r\n\r\n const elmHits = new Map<string, Point2d>();\r\n const testPoint = Point2d.createZero();\r\n for (testPoint.x = testPointView.x - pixelRadius; testPoint.x <= testPointView.x + pixelRadius; ++testPoint.x) {\r\n for (testPoint.y = testPointView.y - pixelRadius; testPoint.y <= testPointView.y + pixelRadius; ++testPoint.y) {\r\n const pixel = pixels.getPixel(testPoint.x, testPoint.y);\r\n if (undefined === pixel || undefined === pixel.elementId || Id64.isInvalid(pixel.elementId))\r\n continue; // no geometry at this location...\r\n\r\n const distXY = testPointView.distance(testPoint);\r\n if (distXY > pixelRadius)\r\n continue; // ignore corners. it's a locate circle not square...\r\n\r\n const oldPoint = elmHits.get(pixel.elementId);\r\n if (undefined !== oldPoint) {\r\n if (this.comparePixel(pixel, pixels.getPixel(oldPoint.x, oldPoint.y), distXY, testPointView.distance(oldPoint)) < 0)\r\n oldPoint.setFrom(testPoint); // new hit is better, update location...\r\n } else {\r\n elmHits.set(pixel.elementId, testPoint.clone());\r\n }\r\n }\r\n }\r\n if (0 === elmHits.size)\r\n return;\r\n\r\n for (const elmPoint of elmHits.values()) {\r\n const pixel = pixels.getPixel(elmPoint.x, elmPoint.y);\r\n if (undefined === pixel || undefined === pixel.elementId)\r\n continue;\r\n\r\n const hitPointWorld = vp.getPixelDataWorldPoint({\r\n pixels,\r\n x: elmPoint.x,\r\n y: elmPoint.y,\r\n preserveModelDisplayTransforms: options.preserveModelDisplayTransforms,\r\n });\r\n\r\n if (!hitPointWorld)\r\n continue;\r\n\r\n const modelId = undefined !== pixel.featureTable ? pixel.featureTable.modelId : undefined;\r\n const hit = new HitDetail(pickPointWorld, vp, options.hitSource, hitPointWorld, pixel.elementId, this.getPixelPriority(pixel), testPointView.distance(elmPoint), pixel.distanceFraction, pixel.subCategoryId, pixel.geometryClass, modelId, pixel.iModel, pixel.tileId, pixel.isClassifier);\r\n this.hitList!.addHit(hit);\r\n\r\n if (this.hitList!.hits.length > options.maxHits)\r\n this.hitList!.hits.length = options.maxHits; // truncate array...\r\n }\r\n\r\n result = this.hitList!.length;\r\n }, !options.allowNonLocatable);\r\n\r\n return result;\r\n }\r\n\r\n public testHit(hit: HitDetail, vp: ScreenViewport, pickPointWorld: Point3d, pickRadiusView: number, options: LocateOptions): boolean {\r\n if (0 === this.doPick(vp, pickPointWorld, pickRadiusView, options))\r\n return false;\r\n\r\n return this.hitList!.hits.some((thisHit) => hit.isSameHit(thisHit));\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport class ElementLocateManager {\r\n public hitList?: HitList<HitDetail>;\r\n public currHit?: HitDetail;\r\n public readonly options = new LocateOptions();\r\n public readonly picker = new ElementPicker();\r\n\r\n /** get the full message key for a locate failure */\r\n public static getFailureMessageKey(key: string) { return `LocateFailure.${key}`; }\r\n public onInitialized() { }\r\n public get apertureInches() { return 0.11; }\r\n public get touchApertureInches() { return 0.22; }\r\n\r\n public clear(): void { this.setCurrHit(undefined); }\r\n public setHitList(list?: HitList<HitDetail>) { this.hitList = list; }\r\n public setCurrHit(hit?: HitDetail): void { this.currHit = hit; }\r\n public getNextHit(): HitDetail | undefined { return this.hitList ? this.hitList.getNextHit() : undefined; }\r\n\r\n /** return the current path from either the snapping logic or the pre-locating systems. */\r\n public getPreLocatedHit(): HitDetail | undefined {\r\n // NOTE: Check AccuSnap first as Tentative is used to build intersect snap. For normal snaps when a Tentative is active there should be no AccuSnap.\r\n let preLocated = IModelApp.accuSnap.getHitAndList(this);\r\n\r\n if (!preLocated && !!(preLocated = IModelApp.tentativePoint.getHitAndList(this))) {\r\n const vp = preLocated.viewport;\r\n this.picker.empty(); // Get new hit list at hit point; want reset to cycle hits using adjusted point location...\r\n this.picker.doPick(vp, preLocated.getPoint(), (vp.pixelsFromInches(this.apertureInches) / 2.0) + 1.5, this.options);\r\n this.setHitList(this.picker.getHitList(true));\r\n }\r\n\r\n if (this.hitList)\r\n this.hitList.resetCurrentHit();\r\n\r\n return preLocated;\r\n }\r\n\r\n public async filterHit(hit: HitDetail, _action: LocateAction, out: LocateResponse): Promise<LocateFilterStatus> {\r\n // Tools must opt-in to locate of transient geometry as it requires special treatment.\r\n if (!this.options.allowDecorations && !hit.isElementHit) {\r\n if (hit.isModelHit)\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"RealityModel\");\r\n else if (hit.isMapHit)\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"Map\");\r\n else\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"Transient\");\r\n return LocateFilterStatus.Reject;\r\n }\r\n\r\n // Tools must opt-in to locate geometry from external iModels.\r\n if (!this.options.allowExternalIModels && hit.isExternalIModelHit) {\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"ExternalIModel\");\r\n return LocateFilterStatus.Reject;\r\n }\r\n\r\n if (undefined !== hit.subCategoryId && !hit.isExternalIModelHit) {\r\n const appearance = hit.viewport.getSubCategoryAppearance(hit.subCategoryId);\r\n if (appearance.dontLocate) {\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"NotLocatableSubCategory\");\r\n return LocateFilterStatus.Reject;\r\n }\r\n }\r\n\r\n const tool = IModelApp.toolAdmin.activeTool;\r\n if (!(tool && tool instanceof InteractiveTool))\r\n return LocateFilterStatus.Accept;\r\n\r\n const status = await tool.filterHit(hit, out);\r\n if (LocateFilterStatus.Reject === status)\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"ByApp\");\r\n\r\n return status;\r\n }\r\n\r\n public initLocateOptions() { this.options.init(); }\r\n public initToolLocate() {\r\n this.initLocateOptions();\r\n this.clear();\r\n this.picker.empty();\r\n IModelApp.tentativePoint.clear(true);\r\n }\r\n\r\n private async _doLocate(response: LocateResponse, newSearch: boolean, testPoint: Point3d, vp: ScreenViewport | undefined, source: InputSource, filterHits: boolean): Promise<HitDetail | undefined> {\r\n if (!vp)\r\n return;\r\n\r\n // the \"newSearch\" flag indicates whether the caller wants us to conduct a new search at the testPoint, or just continue returning paths from the previous search.\r\n if (newSearch) {\r\n const hit = this.getPreLocatedHit();\r\n\r\n // if we're snapped to something, that path has the highest priority and becomes the active hit.\r\n if (hit) {\r\n if (!filterHits || LocateFilterStatus.Accept === await this.filterHit(hit, LocateAction.Identify, response))\r\n return hit;\r\n\r\n response = new LocateResponse(); // we have the reason and explanation we want.\r\n }\r\n\r\n this.picker.empty();\r\n this.picker.doPick(vp, testPoint, (vp.pixelsFromInches(InputSource.Touch === source ? this.touchApertureInches : this.apertureInches) / 2.0) + 1.5, this.options);\r\n\r\n const hitList = this.picker.getHitList(true);\r\n this.setHitList(hitList);\r\n }\r\n\r\n let newHit: HitDetail | undefined;\r\n while (undefined !== (newHit = this.getNextHit())) {\r\n if (!filterHits || LocateFilterStatus.Accept === await this.filterHit(newHit, LocateAction.Identify, response))\r\n return newHit;\r\n response = new LocateResponse(); // we have the reason and explanation we want.\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public async doLocate(response: LocateResponse, newSearch: boolean, testPoint: Point3d, view: ScreenViewport | undefined, source: InputSource, filterHits = true): Promise<HitDetail | undefined> {\r\n response.reason = ElementLocateManager.getFailureMessageKey(\"NoElements\");\r\n response.explanation = \"\";\r\n\r\n const hit = await this._doLocate(response, newSearch, testPoint, view, source, filterHits);\r\n this.setCurrHit(hit);\r\n\r\n // if we found a hit, remove it from the list of remaining hits near the current search point.\r\n if (hit && this.hitList)\r\n this.hitList.removeHitsFrom(hit.sourceId);\r\n return hit;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ElementLocateManager.js","sourceRoot":"","sources":["../../src/ElementLocateManager.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 { Id64 } from \"@itwin/core-bentley\";\r\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\r\nimport { HitDetail, HitList, HitPriority, HitSource } from \"./HitDetail\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { Pixel } from \"./render/Pixel\";\r\nimport { InputSource, InteractiveTool } from \"./tools/Tool\";\r\nimport { ScreenViewport, Viewport } from \"./Viewport\";\r\nimport { ViewRect } from \"./ViewRect\";\r\n\r\n/** The possible actions for which a locate filter can be called.\r\n * @public\r\n * @extensions\r\n */\r\nexport enum LocateAction {\r\n Identify = 0,\r\n AutoLocate = 1,\r\n}\r\n\r\n/** Values to return from a locate filter.\r\n * Return `Reject` to indicate the element is unacceptable.\r\n * @public\r\n * @extensions\r\n */\r\nexport enum LocateFilterStatus {\r\n Accept = 0,\r\n Reject = 1,\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport enum SnapStatus {\r\n Success = 0,\r\n Aborted = 1,\r\n NoElements = 2,\r\n Disabled = 100,\r\n NoSnapPossible = 200,\r\n NotSnappable = 300,\r\n FilteredByApp = 600,\r\n FilteredByAppQuietly = 700,\r\n}\r\n\r\n/** Options that customize the way element location (i.e. *picking*) works.\r\n * @public\r\n * @extensions\r\n */\r\nexport class LocateOptions {\r\n /** If true, also test graphics from view decorations. */\r\n public allowDecorations = false;\r\n /** If true, also test graphics with non-locatable flag set. */\r\n public allowNonLocatable = false;\r\n /** Maximum number of hits to return. */\r\n public maxHits = 20;\r\n /** The [[HitSource]] identifying the caller. */\r\n public hitSource = HitSource.DataPoint;\r\n /** If true, also test graphics from an IModelConnection other than the one associated with the Viewport. This can occur if, e.g., a\r\n * [[TiledGraphicsProvider]] is used to display graphics from a different iModel into the [[Viewport]].\r\n * @note If you override this, you must be prepared to properly handle [[HitDetail]]s originating from other IModelConnections.\r\n * @see [[HitDetail.iModel]] and [[HitDetail.isExternalIModelHit]]\r\n */\r\n public allowExternalIModels = false;\r\n /** If true, then the world point of a hit on a model will preserve any transforms applied to the model at display time,\r\n * such as those supplied by a [[ModelDisplayTransformProvider]] or [PlanProjectionSettings.elevation]($common).\r\n * Otherwise, the world point will be multiplied by the inverse of any such transforms to correlate it with the model's true coordinate space.\r\n */\r\n public preserveModelDisplayTransforms = false;\r\n\r\n /** Make a copy of this LocateOptions. */\r\n public clone(): LocateOptions {\r\n const other = new LocateOptions();\r\n other.allowDecorations = this.allowDecorations;\r\n other.allowNonLocatable = this.allowNonLocatable;\r\n other.maxHits = this.maxHits;\r\n other.hitSource = this.hitSource;\r\n other.allowExternalIModels = this.allowExternalIModels;\r\n return other;\r\n }\r\n public setFrom(other: LocateOptions): void {\r\n this.allowDecorations = other.allowDecorations;\r\n this.allowNonLocatable = other.allowNonLocatable;\r\n this.maxHits = other.maxHits;\r\n this.hitSource = other.hitSource;\r\n this.allowExternalIModels = other.allowExternalIModels;\r\n }\r\n public init() {\r\n this.allowDecorations = this.allowNonLocatable = this.allowExternalIModels = false;\r\n this.maxHits = 20;\r\n this.hitSource = HitSource.DataPoint;\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport class LocateResponse {\r\n public snapStatus = SnapStatus.Success;\r\n public reason?: string;\r\n public explanation = \"\";\r\n\r\n /** @internal */\r\n public clone(): LocateResponse {\r\n const other = new LocateResponse();\r\n other.snapStatus = this.snapStatus;\r\n other.reason = this.reason;\r\n other.explanation = this.explanation;\r\n return other;\r\n }\r\n\r\n /** @internal */\r\n public setFrom(other: LocateResponse): void {\r\n this.snapStatus = other.snapStatus;\r\n this.reason = other.reason;\r\n this.explanation = other.explanation;\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport interface HitListHolder {\r\n setHitList(list: HitList<HitDetail> | undefined): void;\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport class ElementPicker {\r\n public viewport?: Viewport;\r\n public readonly pickPointWorld = new Point3d();\r\n public hitList?: HitList<HitDetail>;\r\n\r\n public empty() {\r\n this.pickPointWorld.setZero();\r\n this.viewport = undefined;\r\n if (this.hitList)\r\n this.hitList.empty();\r\n else\r\n this.hitList = new HitList<HitDetail>();\r\n }\r\n\r\n /** return the HitList for the last Pick performed. Optionally allows the caller to take ownership of the list. */\r\n public getHitList(takeOwnership: boolean): HitList<HitDetail> {\r\n const list = this.hitList!;\r\n if (takeOwnership)\r\n this.hitList = undefined;\r\n return list;\r\n }\r\n\r\n public getNextHit(): HitDetail | undefined { return this.hitList ? this.hitList.getNextHit() : undefined; }\r\n\r\n /** Return a hit from the list of hits created the last time pickElements was called. */\r\n public getHit(i: number): HitDetail | undefined { return this.hitList ? this.hitList.getHit(i) : undefined; }\r\n\r\n public resetCurrentHit(): void {\r\n if (this.hitList)\r\n this.hitList.resetCurrentHit();\r\n }\r\n\r\n private getPixelPriority(pixel: Pixel.Data) {\r\n switch (pixel.type) {\r\n case Pixel.GeometryType.Surface:\r\n return Pixel.Planarity.Planar === pixel.planarity ? HitPriority.PlanarSurface : HitPriority.NonPlanarSurface;\r\n case Pixel.GeometryType.Linear:\r\n return HitPriority.WireEdge;\r\n case Pixel.GeometryType.Edge:\r\n return Pixel.Planarity.Planar === pixel.planarity ? HitPriority.PlanarEdge : HitPriority.NonPlanarEdge;\r\n case Pixel.GeometryType.Silhouette:\r\n return HitPriority.SilhouetteEdge;\r\n default:\r\n return HitPriority.Unknown;\r\n }\r\n }\r\n\r\n private comparePixel(pixel1: Pixel.Data, pixel2: Pixel.Data, distXY1: number, distXY2: number) {\r\n const priority1 = this.getPixelPriority(pixel1);\r\n const priority2 = this.getPixelPriority(pixel2);\r\n if (priority1 < priority2)\r\n return -1;\r\n if (priority1 > priority2)\r\n return 1;\r\n if (distXY1 < distXY2)\r\n return -1;\r\n if (distXY1 > distXY2)\r\n return 1;\r\n if (pixel1.distanceFraction > pixel2.distanceFraction)\r\n return -1;\r\n if (pixel1.distanceFraction < pixel2.distanceFraction)\r\n return 1;\r\n\r\n return 0;\r\n }\r\n\r\n /** Generate a list of elements that are close to a given point.\r\n * @returns The number of hits in the hitList of this object.\r\n */\r\n public doPick(vp: ScreenViewport, pickPointWorld: Point3d, pickRadiusView: number, options: LocateOptions): number {\r\n if (this.hitList && this.hitList.length > 0 && vp === this.viewport && pickPointWorld.isAlmostEqual(this.pickPointWorld)) {\r\n this.hitList.resetCurrentHit();\r\n return this.hitList.length;\r\n }\r\n\r\n this.empty(); // empty the hit list\r\n this.viewport = vp;\r\n this.pickPointWorld.setFrom(pickPointWorld);\r\n\r\n const pickPointView = vp.worldToView(pickPointWorld);\r\n const testPointView = new Point2d(Math.floor(pickPointView.x + 0.5), Math.floor(pickPointView.y + 0.5));\r\n let pixelRadius = Math.floor(pickRadiusView + 0.5);\r\n const rect = new ViewRect(testPointView.x - pixelRadius, testPointView.y - pixelRadius, testPointView.x + pixelRadius, testPointView.y + pixelRadius);\r\n if (rect.isNull)\r\n return 0;\r\n let result: number = 0;\r\n vp.readPixels(rect, Pixel.Selector.All, (pixels) => {\r\n if (undefined === pixels)\r\n return;\r\n\r\n testPointView.x = vp.cssPixelsToDevicePixels(testPointView.x);\r\n testPointView.y = vp.cssPixelsToDevicePixels(testPointView.y);\r\n pixelRadius = vp.cssPixelsToDevicePixels(pixelRadius);\r\n\r\n const elmHits = new Map<string, Point2d>();\r\n const testPoint = Point2d.createZero();\r\n for (testPoint.x = testPointView.x - pixelRadius; testPoint.x <= testPointView.x + pixelRadius; ++testPoint.x) {\r\n for (testPoint.y = testPointView.y - pixelRadius; testPoint.y <= testPointView.y + pixelRadius; ++testPoint.y) {\r\n const pixel = pixels.getPixel(testPoint.x, testPoint.y);\r\n if (undefined === pixel || undefined === pixel.elementId || Id64.isInvalid(pixel.elementId))\r\n continue; // no geometry at this location...\r\n\r\n const distXY = testPointView.distance(testPoint);\r\n if (distXY > pixelRadius)\r\n continue; // ignore corners. it's a locate circle not square...\r\n\r\n const oldPoint = elmHits.get(pixel.elementId);\r\n if (undefined !== oldPoint) {\r\n if (this.comparePixel(pixel, pixels.getPixel(oldPoint.x, oldPoint.y), distXY, testPointView.distance(oldPoint)) < 0)\r\n oldPoint.setFrom(testPoint); // new hit is better, update location...\r\n } else {\r\n elmHits.set(pixel.elementId, testPoint.clone());\r\n }\r\n }\r\n }\r\n if (0 === elmHits.size)\r\n return;\r\n\r\n for (const elmPoint of elmHits.values()) {\r\n const pixel = pixels.getPixel(elmPoint.x, elmPoint.y);\r\n if (undefined === pixel || undefined === pixel.elementId)\r\n continue;\r\n\r\n const hitPointWorld = vp.getPixelDataWorldPoint({\r\n pixels,\r\n x: elmPoint.x,\r\n y: elmPoint.y,\r\n preserveModelDisplayTransforms: options.preserveModelDisplayTransforms,\r\n });\r\n\r\n if (!hitPointWorld)\r\n continue;\r\n\r\n const modelId = undefined !== pixel.featureTable ? pixel.featureTable.modelId : undefined;\r\n const hit = new HitDetail(pickPointWorld, vp, options.hitSource, hitPointWorld, pixel.elementId, this.getPixelPriority(pixel), testPointView.distance(elmPoint), pixel.distanceFraction, pixel.subCategoryId, pixel.geometryClass, modelId, pixel.iModel, pixel.tileId, pixel.isClassifier);\r\n this.hitList!.addHit(hit);\r\n\r\n if (this.hitList!.hits.length > options.maxHits)\r\n this.hitList!.hits.length = options.maxHits; // truncate array...\r\n }\r\n\r\n result = this.hitList!.length;\r\n }, !options.allowNonLocatable);\r\n\r\n return result;\r\n }\r\n\r\n public testHit(hit: HitDetail, vp: ScreenViewport, pickPointWorld: Point3d, pickRadiusView: number, options: LocateOptions): boolean {\r\n if (0 === this.doPick(vp, pickPointWorld, pickRadiusView, options))\r\n return false;\r\n\r\n return this.hitList!.hits.some((thisHit) => hit.isSameHit(thisHit));\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n * @extensions\r\n */\r\nexport class ElementLocateManager {\r\n public hitList?: HitList<HitDetail>;\r\n public currHit?: HitDetail;\r\n public readonly options = new LocateOptions();\r\n public readonly picker = new ElementPicker();\r\n\r\n /** get the full message key for a locate failure */\r\n public static getFailureMessageKey(key: string) { return `LocateFailure.${key}`; }\r\n public onInitialized() { }\r\n public get apertureInches() { return 0.11; }\r\n public get touchApertureInches() { return 0.22; }\r\n\r\n public clear(): void { this.setCurrHit(undefined); }\r\n public setHitList(list?: HitList<HitDetail>) { this.hitList = list; }\r\n public setCurrHit(hit?: HitDetail): void { this.currHit = hit; }\r\n public getNextHit(): HitDetail | undefined { return this.hitList ? this.hitList.getNextHit() : undefined; }\r\n\r\n /** return the current path from either the snapping logic or the pre-locating systems. */\r\n public getPreLocatedHit(): HitDetail | undefined {\r\n // NOTE: Check AccuSnap first as Tentative is used to build intersect snap. For normal snaps when a Tentative is active there should be no AccuSnap.\r\n let preLocated = IModelApp.accuSnap.getHitAndList(this);\r\n\r\n if (!preLocated && !!(preLocated = IModelApp.tentativePoint.getHitAndList(this))) {\r\n const vp = preLocated.viewport;\r\n this.picker.empty(); // Get new hit list at hit point; want reset to cycle hits using adjusted point location...\r\n this.picker.doPick(vp, preLocated.getPoint(), (vp.pixelsFromInches(this.apertureInches) / 2.0) + 1.5, this.options);\r\n this.setHitList(this.picker.getHitList(true));\r\n }\r\n\r\n if (this.hitList)\r\n this.hitList.resetCurrentHit();\r\n\r\n return preLocated;\r\n }\r\n\r\n public async filterHit(hit: HitDetail, _action: LocateAction, out: LocateResponse): Promise<LocateFilterStatus> {\r\n // Tools must opt-in to locate of transient geometry as it requires special treatment.\r\n if (!this.options.allowDecorations && !hit.isElementHit) {\r\n if (hit.isModelHit)\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"RealityModel\");\r\n else if (hit.isMapHit)\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"Map\");\r\n else\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"Transient\");\r\n return LocateFilterStatus.Reject;\r\n }\r\n\r\n // Tools must opt-in to locate geometry from external iModels.\r\n if (!this.options.allowExternalIModels && hit.isExternalIModelHit) {\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"ExternalIModel\");\r\n return LocateFilterStatus.Reject;\r\n }\r\n\r\n if (undefined !== hit.subCategoryId && !hit.isExternalIModelHit) {\r\n const appearance = hit.viewport.getSubCategoryAppearance(hit.subCategoryId);\r\n if (appearance.dontLocate) {\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"NotLocatableSubCategory\");\r\n return LocateFilterStatus.Reject;\r\n }\r\n }\r\n\r\n const tool = IModelApp.toolAdmin.activeTool;\r\n if (!(tool && tool instanceof InteractiveTool))\r\n return LocateFilterStatus.Accept;\r\n\r\n const status = await tool.filterHit(hit, out);\r\n if (LocateFilterStatus.Reject === status)\r\n out.reason = ElementLocateManager.getFailureMessageKey(\"ByApp\");\r\n\r\n return status;\r\n }\r\n\r\n public initLocateOptions() { this.options.init(); }\r\n public initToolLocate() {\r\n this.initLocateOptions();\r\n this.clear();\r\n this.picker.empty();\r\n IModelApp.tentativePoint.clear(true);\r\n }\r\n\r\n private async _doLocate(response: LocateResponse, newSearch: boolean, testPoint: Point3d, vp: ScreenViewport | undefined, source: InputSource, filterHits: boolean): Promise<HitDetail | undefined> {\r\n if (!vp)\r\n return;\r\n\r\n // the \"newSearch\" flag indicates whether the caller wants us to conduct a new search at the testPoint, or just continue returning paths from the previous search.\r\n if (newSearch) {\r\n const hit = this.getPreLocatedHit();\r\n\r\n // if we're snapped to something, that path has the highest priority and becomes the active hit.\r\n if (hit) {\r\n if (!filterHits || LocateFilterStatus.Accept === await this.filterHit(hit, LocateAction.Identify, response))\r\n return hit;\r\n\r\n response = new LocateResponse(); // we have the reason and explanation we want.\r\n }\r\n\r\n this.picker.empty();\r\n this.picker.doPick(vp, testPoint, (vp.pixelsFromInches(InputSource.Touch === source ? this.touchApertureInches : this.apertureInches) / 2.0) + 1.5, this.options);\r\n\r\n const hitList = this.picker.getHitList(true);\r\n this.setHitList(hitList);\r\n }\r\n\r\n let newHit: HitDetail | undefined;\r\n while (undefined !== (newHit = this.getNextHit())) {\r\n if (!filterHits || LocateFilterStatus.Accept === await this.filterHit(newHit, LocateAction.Identify, response))\r\n return newHit;\r\n response = new LocateResponse(); // we have the reason and explanation we want.\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public async doLocate(response: LocateResponse, newSearch: boolean, testPoint: Point3d, view: ScreenViewport | undefined, source: InputSource, filterHits = true): Promise<HitDetail | undefined> {\r\n response.reason = ElementLocateManager.getFailureMessageKey(\"NoElements\");\r\n response.explanation = \"\";\r\n\r\n const hit = await this._doLocate(response, newSearch, testPoint, view, source, filterHits);\r\n this.setCurrHit(hit);\r\n\r\n // if we found a hit, remove it from the list of remaining hits near the current search point.\r\n if (hit && this.hitList)\r\n this.hitList.removeHitsFrom(hit.sourceId);\r\n return hit;\r\n }\r\n}\r\n"]}
@@ -29,7 +29,7 @@ export declare class ViewRect {
29
29
  /** The bottommost side of this ViewRect. */
30
30
  get bottom(): number;
31
31
  set bottom(val: number);
32
- /** True if this ViewRect has an area > 0. */
32
+ /** True if this ViewRect has an area <= 0. */
33
33
  get isNull(): boolean;
34
34
  /** True if `!isNull` */
35
35
  get isValid(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ViewRect.d.ts","sourceRoot":"","sources":["../../src/ViewRect.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,IAAI;IAIZ,gCAAgC;gBACb,IAAI,SAAI,EAAE,GAAG,SAAI,EAAE,KAAK,SAAI,EAAE,MAAM,SAAI;IAC3D,0CAA0C;IAC1C,IAAW,IAAI,IAAI,MAAM,CAAuB;IAChD,IAAW,IAAI,CAAC,GAAG,EAAE,MAAM,EAA8B;IACzD,yCAAyC;IACzC,IAAW,GAAG,IAAI,MAAM,CAAsB;IAC9C,IAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAA6B;IACvD,2CAA2C;IAC3C,IAAW,KAAK,IAAI,MAAM,CAAwB;IAClD,IAAW,KAAK,CAAC,GAAG,EAAE,MAAM,EAA+B;IAC3D,4CAA4C;IAC5C,IAAW,MAAM,IAAI,MAAM,CAAyB;IACpD,IAAW,MAAM,CAAC,GAAG,EAAE,MAAM,EAAgC;IAC7D,6CAA6C;IAC7C,IAAW,MAAM,IAAI,OAAO,CAA+D;IAC3F,wBAAwB;IACxB,IAAW,OAAO,IAAI,OAAO,CAAyB;IACtD,+CAA+C;IAC/C,IAAW,KAAK,IACQ,MAAM,CADuB;IACrD,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAAqC;IACnE,gDAAgD;IAChD,IAAW,MAAM,IACS,MAAM,CADsB;IACtD,IAAW,MAAM,CAAC,MAAM,EAAE,MAAM,EAAsC;IACtE,wDAAwD;IACxD,IAAW,MAAM,WAA2D;IAC5E,gDAAgD;IAChD,IAAW,IAAI,WAAyD;IACxE,0EAA0E;IACnE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpE;;;OAGG;IACI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,GAAG,IAAI;IAC/D;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAC/C;;OAEG;IACI,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IACvC,sDAAsD;IAC/C,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IACrC;;OAEG;IACI,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ;IAOlC,MAAM,CAAC,KAAK,EAAE,QAAQ;IAW7B;;;OAGG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAalD;;;OAGG;IACI,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAEzC,0EAA0E;IACnE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ7D;;;;OAIG;IACI,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAE5C,8FAA8F;IACvF,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAE5C;;;OAGG;IACI,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAE3C,wDAAwD;IACjD,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAEzC;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;CAgB7E"}
1
+ {"version":3,"file":"ViewRect.d.ts","sourceRoot":"","sources":["../../src/ViewRect.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,IAAI;IAIZ,gCAAgC;gBACb,IAAI,SAAI,EAAE,GAAG,SAAI,EAAE,KAAK,SAAI,EAAE,MAAM,SAAI;IAC3D,0CAA0C;IAC1C,IAAW,IAAI,IAAI,MAAM,CAAuB;IAChD,IAAW,IAAI,CAAC,GAAG,EAAE,MAAM,EAA8B;IACzD,yCAAyC;IACzC,IAAW,GAAG,IAAI,MAAM,CAAsB;IAC9C,IAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAA6B;IACvD,2CAA2C;IAC3C,IAAW,KAAK,IAAI,MAAM,CAAwB;IAClD,IAAW,KAAK,CAAC,GAAG,EAAE,MAAM,EAA+B;IAC3D,4CAA4C;IAC5C,IAAW,MAAM,IAAI,MAAM,CAAyB;IACpD,IAAW,MAAM,CAAC,GAAG,EAAE,MAAM,EAAgC;IAC7D,8CAA8C;IAC9C,IAAW,MAAM,IAAI,OAAO,CAA+D;IAC3F,wBAAwB;IACxB,IAAW,OAAO,IAAI,OAAO,CAAyB;IACtD,+CAA+C;IAC/C,IAAW,KAAK,IACQ,MAAM,CADuB;IACrD,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAAqC;IACnE,gDAAgD;IAChD,IAAW,MAAM,IACS,MAAM,CADsB;IACtD,IAAW,MAAM,CAAC,MAAM,EAAE,MAAM,EAAsC;IACtE,wDAAwD;IACxD,IAAW,MAAM,WAA2D;IAC5E,gDAAgD;IAChD,IAAW,IAAI,WAAyD;IACxE,0EAA0E;IACnE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpE;;;OAGG;IACI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,GAAG,IAAI;IAC/D;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAC/C;;OAEG;IACI,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IACvC,sDAAsD;IAC/C,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IACrC;;OAEG;IACI,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ;IAOlC,MAAM,CAAC,KAAK,EAAE,QAAQ;IAW7B;;;OAGG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAalD;;;OAGG;IACI,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAEzC,0EAA0E;IACnE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ7D;;;;OAIG;IACI,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAE5C,8FAA8F;IACvF,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAE5C;;;OAGG;IACI,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAE3C,wDAAwD;IACjD,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAEzC;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;CAgB7E"}
@@ -33,7 +33,7 @@ class ViewRect {
33
33
  /** The bottommost side of this ViewRect. */
34
34
  get bottom() { return this._bottom; }
35
35
  set bottom(val) { this._set("_bottom", val); }
36
- /** True if this ViewRect has an area > 0. */
36
+ /** True if this ViewRect has an area <= 0. */
37
37
  get isNull() { return this.right <= this.left || this.bottom <= this.top; }
38
38
  /** True if `!isNull` */
39
39
  get isValid() { return !this.isNull; }
@@ -1 +1 @@
1
- {"version":3,"file":"ViewRect.js","sourceRoot":"","sources":["../../src/ViewRect.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH;;;;;;GAMG;AACH,MAAa,QAAQ;IAUnB,gCAAgC;IAChC,YAAmB,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAL7F,IAAI,CAAC,GAA4C,EAAE,KAAa;QACtE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IAID,0CAA0C;IAC1C,IAAW,IAAI,KAAa,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,IAAW,IAAI,CAAC,GAAW,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACzD,yCAAyC;IACzC,IAAW,GAAG,KAAa,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,IAAW,GAAG,CAAC,GAAW,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACvD,2CAA2C;IAC3C,IAAW,KAAK,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,IAAW,KAAK,CAAC,GAAW,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,4CAA4C;IAC5C,IAAW,MAAM,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,IAAW,MAAM,CAAC,GAAW,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,6CAA6C;IAC7C,IAAW,MAAM,KAAc,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3F,wBAAwB;IACxB,IAAW,OAAO,KAAc,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,+CAA+C;IAC/C,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,IAAW,KAAK,CAAC,KAAa,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;IACnE,gDAAgD;IAChD,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,IAAW,MAAM,CAAC,MAAc,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC;IACtE,wDAAwD;IACxD,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,gDAAgD;IAChD,IAAW,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,0EAA0E;IACnE,IAAI,CAAC,IAAY,EAAE,GAAW,EAAE,KAAa,EAAE,MAAc;QAClE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACzC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,OAAc,EAAE,WAAkB,IAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClI;;OAEG;IACI,aAAa,CAAC,KAAmB,IAAU,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/F;;OAEG;IACI,MAAM,CAAC,KAAe,IAAa,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpK,sDAAsD;IAC/C,OAAO,CAAC,KAAe,IAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtG;;OAEG;IACI,KAAK,CAAC,MAAiB;QAC5B,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,MAAM,CAAC;SACf;QACD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpE,CAAC;IACM,MAAM,CAAC,KAAe;QAC3B,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;YACxB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG;YACtB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;YAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;YAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAc,EAAE,MAAc;QACzC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;YACjE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,OAAO;SACR;QACD,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;QACpB,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,MAAc,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzE,0EAA0E;IACnE,gBAAgB,CAAC,MAAc,EAAE,MAAc;QACpD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;QACxC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,OAAe,IAAU,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzF,8FAA8F;IACvF,WAAW,CAAC,KAAe,IAAa,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAErK;;;OAGG;IACI,aAAa,CAAC,KAAY,IAAa,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpJ,wDAAwD;IACjD,QAAQ,CAAC,KAAe,IAAa,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAElK;;OAEG;IACI,cAAc,CAAC,KAAe,EAAE,GAAc;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,OAAO,GAAG,OAAO,IAAI,OAAO,GAAG,OAAO;YACxC,OAAO,SAAS,CAAC;QAEnB,MAAM,MAAM,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;QACtB,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;QACvB,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC;QACrB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAvJD,4BAuJC","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 Views\r\n */\r\n\r\nimport { LowAndHighXY, XAndY } from \"@itwin/core-geometry\";\r\n\r\n/** A rectangle in unsigned integer view coordinates with (0,0) corresponding to the top-left corner of the view.\r\n * Increasing **x** moves from left to right, and increasing **y** moves from top to bottom.\r\n * [[left]], [[top]], [[right]], and [[bottom]] are required to be non-negative integers; any negative inputs are treated as\r\n * zero and any non-integer inputs are rounded down to the nearest integer.\r\n * @public\r\n * @extensions\r\n */\r\nexport class ViewRect {\r\n private _left!: number;\r\n private _top!: number;\r\n private _right!: number;\r\n private _bottom!: number;\r\n\r\n private _set(key: \"_left\" | \"_right\" | \"_top\" | \"_bottom\", value: number): void {\r\n this[key] = Math.max(0, Math.floor(value));\r\n }\r\n\r\n /** Construct a new ViewRect. */\r\n public constructor(left = 0, top = 0, right = 0, bottom = 0) { this.init(left, top, right, bottom); }\r\n /** The leftmost side of this ViewRect. */\r\n public get left(): number { return this._left; }\r\n public set left(val: number) { this._set(\"_left\", val); }\r\n /** The topmost side of this ViewRect. */\r\n public get top(): number { return this._top; }\r\n public set top(val: number) { this._set(\"_top\", val); }\r\n /** The rightmost side of this ViewRect. */\r\n public get right(): number { return this._right; }\r\n public set right(val: number) { this._set(\"_right\", val); }\r\n /** The bottommost side of this ViewRect. */\r\n public get bottom(): number { return this._bottom; }\r\n public set bottom(val: number) { this._set(\"_bottom\", val); }\r\n /** True if this ViewRect has an area > 0. */\r\n public get isNull(): boolean { return this.right <= this.left || this.bottom <= this.top; }\r\n /** True if `!isNull` */\r\n public get isValid(): boolean { return !this.isNull; }\r\n /** The width (right-left) of this ViewRect. */\r\n public get width() { return this.right - this.left; }\r\n public set width(width: number) { this.right = this.left + width; }\r\n /** The height (bottom-top) of this ViewRect. */\r\n public get height() { return this.bottom - this.top; }\r\n public set height(height: number) { this.bottom = this.top + height; }\r\n /** The aspect ratio (width/height) of this ViewRect. */\r\n public get aspect() { return this.isNull ? 1.0 : this.width / this.height; }\r\n /** The area (width*height) of this ViewRect. */\r\n public get area() { return this.isNull ? 0 : this.width * this.height; }\r\n /** Initialize this ViewRect from its left/top/right/bottom parameters. */\r\n public init(left: number, top: number, right: number, bottom: number) {\r\n this.left = left;\r\n this.bottom = bottom, this.right = right;\r\n this.top = top;\r\n }\r\n\r\n /** Initialize this ViewRect from two points.\r\n * @param topLeft The top-left corner.\r\n * @param bottomRight The bottom-right corner.\r\n */\r\n public initFromPoints(topLeft: XAndY, bottomRight: XAndY): void { this.init(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y); }\r\n /** Initialize this ViewRect from a range.\r\n * @param input The Range to use. `input.low` defines the top-left and `input.high` defines the bottom-right.\r\n */\r\n public initFromRange(input: LowAndHighXY): void { this.initFromPoints(input.low, input.high); }\r\n /** Return true is this ViewRect is exactly equal to another ViewRect.\r\n * @param other The other ViewRect to compare\r\n */\r\n public equals(other: ViewRect): boolean { return this.left === other.left && this.right === other.right && this.bottom === other.bottom && this.top === other.top; }\r\n /** Initialize this ViewRect from another ViewRect. */\r\n public setFrom(other: ViewRect): void { this.init(other.left, other.top, other.right, other.bottom); }\r\n /** Duplicate this ViewRect.\r\n * @param result Optional ViewRect for result. If undefined, a new ViewRect is created.\r\n */\r\n public clone(result?: ViewRect): ViewRect {\r\n if (undefined !== result) {\r\n result.setFrom(this);\r\n return result;\r\n }\r\n return new ViewRect(this.left, this.top, this.right, this.bottom);\r\n }\r\n public extend(other: ViewRect) {\r\n if (this.left > other.left)\r\n this.left = other.left;\r\n if (this.top > other.top)\r\n this.top = other.top;\r\n if (this.right < other.right)\r\n this.right = other.right;\r\n if (this.bottom < other.bottom)\r\n this.bottom = other.bottom;\r\n }\r\n\r\n /** Inset this ViewRect by values in the x and y directions. Positive values make the ViewRect smaller, and negative values will make it larger.\r\n * @param deltaX The distance to inset the ViewRect in the x direction.\r\n * @param deltaY The distance to inset the ViewRect in the y direction.\r\n */\r\n public inset(deltaX: number, deltaY: number): void {\r\n deltaX = Math.floor(deltaX);\r\n deltaY = Math.floor(deltaY);\r\n if (this.width - 2 * deltaX <= 0 || this.height - 2 * deltaY <= 0) {\r\n this.init(0, 0, 0, 0);\r\n return;\r\n }\r\n this._left += deltaX;\r\n this._right -= deltaX;\r\n this._top += deltaY;\r\n this._bottom -= deltaY;\r\n }\r\n\r\n /** Inset this ViewRect by the same value in all directions.\r\n * @param offset The distance to inset this ViewRect. Positive values will make this ViewRect smaller and negative values will make it larger.\r\n * @note The inset operation can cause a previously valid ViewRect to become invalid.\r\n */\r\n public insetUniform(offset: number): void { this.inset(offset, offset); }\r\n\r\n /** Scale this ViewRect about its center by the supplied scale factors. */\r\n public scaleAboutCenter(xScale: number, yScale: number): void {\r\n const w = this.width;\r\n const h = this.height;\r\n const xDelta = (w - (w * xScale)) * 0.5;\r\n const yDelta = (h - (h * yScale)) * 0.5;\r\n this.inset(xDelta, yDelta);\r\n }\r\n\r\n /** Inset this ViewRect by a percentage of its current width.\r\n * @param percent The percentage of this ViewRect's width to inset in all directions.\r\n * @note The ViewRect will become smaller (or larger, if percent is negative) by `percent * width * 2` in each direction, since each side is moved by that distance.\r\n * @see [[inset]]\r\n */\r\n public insetByPercent(percent: number): void { this.insetUniform(this.width * percent); }\r\n\r\n /** Determine if this ViewRect is entirely contained within the bounds of another ViewRect. */\r\n public isContained(other: ViewRect): boolean { return this.left >= other.left && this.right <= other.right && this.bottom <= other.bottom && this.top >= other.top; }\r\n\r\n /** Return true if the supplied point is contained in this ViewRect.\r\n * @param point The point to test.\r\n * @note if the point is exactly on the left or top edges, this method returns true. If the point is exactly on the right or bottom edge, it returns false.\r\n */\r\n public containsPoint(point: XAndY): boolean { return point.x >= this.left && point.x < this.right && point.y >= this.top && point.y < this.bottom; }\r\n\r\n /** Determine whether this ViewRect overlaps another. */\r\n public overlaps(other: ViewRect): boolean { return this.left <= other.right && this.top <= other.bottom && this.right >= other.left && this.bottom >= other.top; }\r\n\r\n /** Return a ViewRect that is the overlap (intersection) of this ViewRect and another ViewRect.\r\n * If the two ViewRects are equal, their value is the result. Otherwise, the result will always be smaller than either of them.\r\n */\r\n public computeOverlap(other: ViewRect, out?: ViewRect): ViewRect | undefined {\r\n const maxOrgX = Math.max(this.left, other.left);\r\n const maxOrgY = Math.max(this.top, other.top);\r\n const minCrnX = Math.min(this.right, other.right);\r\n const minCrnY = Math.min(this.bottom, other.bottom);\r\n\r\n if (maxOrgX > minCrnX || maxOrgY > minCrnY)\r\n return undefined;\r\n\r\n const result = undefined !== out ? out : new ViewRect();\r\n result.left = maxOrgX;\r\n result.right = minCrnX;\r\n result.top = maxOrgY;\r\n result.bottom = minCrnY;\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ViewRect.js","sourceRoot":"","sources":["../../src/ViewRect.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 Views\r\n */\r\n\r\nimport { LowAndHighXY, XAndY } from \"@itwin/core-geometry\";\r\n\r\n/** A rectangle in unsigned integer view coordinates with (0,0) corresponding to the top-left corner of the view.\r\n * Increasing **x** moves from left to right, and increasing **y** moves from top to bottom.\r\n * [[left]], [[top]], [[right]], and [[bottom]] are required to be non-negative integers; any negative inputs are treated as\r\n * zero and any non-integer inputs are rounded down to the nearest integer.\r\n * @public\r\n * @extensions\r\n */\r\nexport class ViewRect {\r\n private _left!: number;\r\n private _top!: number;\r\n private _right!: number;\r\n private _bottom!: number;\r\n\r\n private _set(key: \"_left\" | \"_right\" | \"_top\" | \"_bottom\", value: number): void {\r\n this[key] = Math.max(0, Math.floor(value));\r\n }\r\n\r\n /** Construct a new ViewRect. */\r\n public constructor(left = 0, top = 0, right = 0, bottom = 0) { this.init(left, top, right, bottom); }\r\n /** The leftmost side of this ViewRect. */\r\n public get left(): number { return this._left; }\r\n public set left(val: number) { this._set(\"_left\", val); }\r\n /** The topmost side of this ViewRect. */\r\n public get top(): number { return this._top; }\r\n public set top(val: number) { this._set(\"_top\", val); }\r\n /** The rightmost side of this ViewRect. */\r\n public get right(): number { return this._right; }\r\n public set right(val: number) { this._set(\"_right\", val); }\r\n /** The bottommost side of this ViewRect. */\r\n public get bottom(): number { return this._bottom; }\r\n public set bottom(val: number) { this._set(\"_bottom\", val); }\r\n /** True if this ViewRect has an area <= 0. */\r\n public get isNull(): boolean { return this.right <= this.left || this.bottom <= this.top; }\r\n /** True if `!isNull` */\r\n public get isValid(): boolean { return !this.isNull; }\r\n /** The width (right-left) of this ViewRect. */\r\n public get width() { return this.right - this.left; }\r\n public set width(width: number) { this.right = this.left + width; }\r\n /** The height (bottom-top) of this ViewRect. */\r\n public get height() { return this.bottom - this.top; }\r\n public set height(height: number) { this.bottom = this.top + height; }\r\n /** The aspect ratio (width/height) of this ViewRect. */\r\n public get aspect() { return this.isNull ? 1.0 : this.width / this.height; }\r\n /** The area (width*height) of this ViewRect. */\r\n public get area() { return this.isNull ? 0 : this.width * this.height; }\r\n /** Initialize this ViewRect from its left/top/right/bottom parameters. */\r\n public init(left: number, top: number, right: number, bottom: number) {\r\n this.left = left;\r\n this.bottom = bottom, this.right = right;\r\n this.top = top;\r\n }\r\n\r\n /** Initialize this ViewRect from two points.\r\n * @param topLeft The top-left corner.\r\n * @param bottomRight The bottom-right corner.\r\n */\r\n public initFromPoints(topLeft: XAndY, bottomRight: XAndY): void { this.init(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y); }\r\n /** Initialize this ViewRect from a range.\r\n * @param input The Range to use. `input.low` defines the top-left and `input.high` defines the bottom-right.\r\n */\r\n public initFromRange(input: LowAndHighXY): void { this.initFromPoints(input.low, input.high); }\r\n /** Return true is this ViewRect is exactly equal to another ViewRect.\r\n * @param other The other ViewRect to compare\r\n */\r\n public equals(other: ViewRect): boolean { return this.left === other.left && this.right === other.right && this.bottom === other.bottom && this.top === other.top; }\r\n /** Initialize this ViewRect from another ViewRect. */\r\n public setFrom(other: ViewRect): void { this.init(other.left, other.top, other.right, other.bottom); }\r\n /** Duplicate this ViewRect.\r\n * @param result Optional ViewRect for result. If undefined, a new ViewRect is created.\r\n */\r\n public clone(result?: ViewRect): ViewRect {\r\n if (undefined !== result) {\r\n result.setFrom(this);\r\n return result;\r\n }\r\n return new ViewRect(this.left, this.top, this.right, this.bottom);\r\n }\r\n public extend(other: ViewRect) {\r\n if (this.left > other.left)\r\n this.left = other.left;\r\n if (this.top > other.top)\r\n this.top = other.top;\r\n if (this.right < other.right)\r\n this.right = other.right;\r\n if (this.bottom < other.bottom)\r\n this.bottom = other.bottom;\r\n }\r\n\r\n /** Inset this ViewRect by values in the x and y directions. Positive values make the ViewRect smaller, and negative values will make it larger.\r\n * @param deltaX The distance to inset the ViewRect in the x direction.\r\n * @param deltaY The distance to inset the ViewRect in the y direction.\r\n */\r\n public inset(deltaX: number, deltaY: number): void {\r\n deltaX = Math.floor(deltaX);\r\n deltaY = Math.floor(deltaY);\r\n if (this.width - 2 * deltaX <= 0 || this.height - 2 * deltaY <= 0) {\r\n this.init(0, 0, 0, 0);\r\n return;\r\n }\r\n this._left += deltaX;\r\n this._right -= deltaX;\r\n this._top += deltaY;\r\n this._bottom -= deltaY;\r\n }\r\n\r\n /** Inset this ViewRect by the same value in all directions.\r\n * @param offset The distance to inset this ViewRect. Positive values will make this ViewRect smaller and negative values will make it larger.\r\n * @note The inset operation can cause a previously valid ViewRect to become invalid.\r\n */\r\n public insetUniform(offset: number): void { this.inset(offset, offset); }\r\n\r\n /** Scale this ViewRect about its center by the supplied scale factors. */\r\n public scaleAboutCenter(xScale: number, yScale: number): void {\r\n const w = this.width;\r\n const h = this.height;\r\n const xDelta = (w - (w * xScale)) * 0.5;\r\n const yDelta = (h - (h * yScale)) * 0.5;\r\n this.inset(xDelta, yDelta);\r\n }\r\n\r\n /** Inset this ViewRect by a percentage of its current width.\r\n * @param percent The percentage of this ViewRect's width to inset in all directions.\r\n * @note The ViewRect will become smaller (or larger, if percent is negative) by `percent * width * 2` in each direction, since each side is moved by that distance.\r\n * @see [[inset]]\r\n */\r\n public insetByPercent(percent: number): void { this.insetUniform(this.width * percent); }\r\n\r\n /** Determine if this ViewRect is entirely contained within the bounds of another ViewRect. */\r\n public isContained(other: ViewRect): boolean { return this.left >= other.left && this.right <= other.right && this.bottom <= other.bottom && this.top >= other.top; }\r\n\r\n /** Return true if the supplied point is contained in this ViewRect.\r\n * @param point The point to test.\r\n * @note if the point is exactly on the left or top edges, this method returns true. If the point is exactly on the right or bottom edge, it returns false.\r\n */\r\n public containsPoint(point: XAndY): boolean { return point.x >= this.left && point.x < this.right && point.y >= this.top && point.y < this.bottom; }\r\n\r\n /** Determine whether this ViewRect overlaps another. */\r\n public overlaps(other: ViewRect): boolean { return this.left <= other.right && this.top <= other.bottom && this.right >= other.left && this.bottom >= other.top; }\r\n\r\n /** Return a ViewRect that is the overlap (intersection) of this ViewRect and another ViewRect.\r\n * If the two ViewRects are equal, their value is the result. Otherwise, the result will always be smaller than either of them.\r\n */\r\n public computeOverlap(other: ViewRect, out?: ViewRect): ViewRect | undefined {\r\n const maxOrgX = Math.max(this.left, other.left);\r\n const maxOrgY = Math.max(this.top, other.top);\r\n const minCrnX = Math.min(this.right, other.right);\r\n const minCrnY = Math.min(this.bottom, other.bottom);\r\n\r\n if (maxOrgX > minCrnX || maxOrgY > minCrnY)\r\n return undefined;\r\n\r\n const result = undefined !== out ? out : new ViewRect();\r\n result.left = maxOrgX;\r\n result.right = minCrnX;\r\n result.top = maxOrgY;\r\n result.bottom = minCrnY;\r\n return result;\r\n }\r\n}\r\n"]}
@@ -1994,7 +1994,7 @@ class Viewport {
1994
1994
  */
1995
1995
  readPixels(rect, selector, receiver, excludeNonLocatable = false) {
1996
1996
  const viewRect = this.viewRect;
1997
- if (this.isDisposed || !rect.isContained(viewRect))
1997
+ if (this.isDisposed || rect.isNull || !rect.isContained(viewRect))
1998
1998
  receiver(undefined);
1999
1999
  else
2000
2000
  this.target.readPixels(rect, selector, receiver, excludeNonLocatable);