@itwin/core-frontend
Version:
iTwin.js frontend components
382 lines • 16.7 kB
TypeScript
/** @packageDocumentation
* @module LocatingElements
*/
import { Id64String } from "@itwin/core-bentley";
import { CurvePrimitive, Point3d, Transform, Vector3d, XYZProps } from "@itwin/core-geometry";
import { ContourGroup, GeometryClass } from "@itwin/core-common";
import { IModelConnection } from "./IModelConnection";
import { Sprite } from "./Sprites";
import { DecorateContext } from "./ViewContext";
import { ScreenViewport, Viewport } from "./Viewport";
/**
* @public
* @extensions
*/
export declare enum SnapMode {
Nearest = 1,
NearestKeypoint = 2,
MidPoint = 4,
Center = 8,
Origin = 16,
Bisector = 32,
Intersection = 64,
PerpendicularPoint = 128,
TangentPoint = 256
}
/**
* @public
* @extensions
*/
export declare enum SnapHeat {
None = 0,
NotInRange = 1,// "of interest", but out of range
InRange = 2
}
/** The procedure that generated this Hit.
* @public
* @extensions
*/
export declare enum HitSource {
None = 0,
FromUser = 1,
MotionLocate = 2,
AccuSnap = 3,
TentativeSnap = 4,
DataPoint = 5,
Application = 6,
EditAction = 7,
EditActionSS = 8
}
/** What was being tested to generate this hit. This is not the element or
* GeometricPrimitive that generated the Hit, it is an indication of whether it is an edge or interior hit.
* @public
* @extensions
*/
export declare enum HitGeomType {
None = 0,
Point = 1,
Segment = 2,
Curve = 3,
Arc = 4,
Surface = 5
}
/** Classification of GeometricPrimitive that generated the Hit.
* @public
* @extensions
*/
export declare enum HitParentGeomType {
None = 0,
Wire = 1,
Sheet = 2,
Solid = 3,
Mesh = 4,
Text = 5
}
/**
* @public
* @extensions
*/
export declare enum HitPriority {
WireEdge = 0,
PlanarEdge = 1,
NonPlanarEdge = 2,
SilhouetteEdge = 3,
PlanarSurface = 4,
NonPlanarSurface = 5,
Unknown = 6
}
/**
* @public
* @extensions
*/
export declare enum HitDetailType {
Hit = 1,
Snap = 2,
Intersection = 3
}
/** As part of a [[HitPath]], describes the [ViewAttachment]($backend), if any, from which the hit represented by a [[HitDetail]] originated.
* @beta
*/
export interface ViewAttachmentHitInfo {
/** The element Id of the [ViewAttachment]($backend) from which the hit originated. */
readonly id: Id64String;
/** The viewport that renders the contents of the attached view into the [[ScreenViewport]].
* @note Do not alter the state of this viewport.
* @alpha
*/
readonly viewport: Viewport;
}
/** As part of a [[HitPath]], describes the [SectionDrawing]($backend), if any, from which the hit represented by a [[HitDetail]] originated.
* @beta
*/
export interface SectionDrawingAttachmentHitInfo {
/** The viewport that renders the contents of the attached view into the [[ScreenViewport]].
* @note Do not alter the state of this viewport.
* @alpha
*/
readonly viewport: Viewport;
}
/** As part of a [[HitDetail]], describes a series of "attached" views through which the hit was located.
* Typically, the contents of a view are rendered directly to the screen via [[HitDetail.viewport]].
* However, in some contexts one view might be "attached" to the viewport's view via a [ViewAttachment]($backend), [SectionDrawing]($backend), or both.
* HitPath captures this information in one of the following possible ways:
* 1. A [[SheetViewState]] renders another view through a [ViewAttachment]($backend), in which case [[viewAttachment]] will be defined.
* 2. A [[DrawingViewState]] renders a [[SpatialViewState]] through a [SectionDrawing]($backend) attachment, in which case [[sectionDrawingAttachment]] will be defined; or
* 3. A combination of 1 and 2 where a [ViewAttachment]($backend) on a sheet renders a [SectionDrawing]($backend) with an attached [[SpatialViewState]], in which both [viewAttachment]] and [[sectionDrawingAttachment]] will be defined.
* @beta
*/
export interface HitPath {
/** Details about the [ViewAttachment]($backend) through which the hit was obtained. */
viewAttachment?: ViewAttachmentHitInfo;
/** Details about the [SectionDrawing]($backend) attachment through which the hit was obtained. */
sectionDrawingAttachment?: SectionDrawingAttachmentHitInfo;
}
/** Information about a [contour line]($docs/learning/display/ContourDisplay.md) that generated a [[HitDetail]] or [[Pixel]].
* @see [[HitDetail.contour]]
* @see [[Pixel.Data.contour]]
* @beta
*/
export interface ContourHit {
/** The contour group that generated the contour line, as specified by [[ContourDisplay.groups]]. */
readonly group: ContourGroup;
/** True if the contour is a major contour line as specified by the [[group]] from which it originated, false if it is a minor contour line. */
readonly isMajor: boolean;
/** The height in world coordinates of the contour line. This is always a multiple of the [Contour.minorInterval]($common) defined for the [[group]].
* @note The multiple may be approximate due to the limitations of floating-point precision.
*/
readonly elevation: number;
}
/** Arguments supplied to the [[HitDetail]] constructor.
* @public
*/
export interface HitDetailProps {
/** The point in world coordinates that was used as the initial locate point. */
readonly testPoint: Point3d;
/** The viewport in which the locate operation was performed. */
readonly viewport: ScreenViewport;
/** The procedure that requested the locate operation. */
readonly hitSource: HitSource;
/** The approximate location in world coordinates on the geometry identified by this HitDetail. */
readonly hitPoint: Point3d;
/** The source of the geometry. This may be a persistent element Id, or a transient Id used for, e.g., pickable decorations. */
readonly sourceId: Id64String;
/** The hit geometry priority/classification. */
readonly priority: HitPriority;
/** The xy distance to the hit in view coordinates. */
readonly distXY: number;
/** The distance in view coordinates between the hit and the near plane. */
readonly distFraction: number;
/** The [SubCategory]($backend) to which the hit geometry belongs. */
readonly subCategoryId?: Id64String;
/** The class of the hit geometry. */
readonly geometryClass?: GeometryClass;
/** The Id of the [[ModelState]] from which the hit originated. */
readonly modelId?: string;
/** The IModelConnection from which the hit originated.
* This should almost always be left undefined, unless the hit is known to have originated from an iModel
* other than the one associated with the viewport.
* @internal
*/
readonly sourceIModel?: IModelConnection;
/** @internal */
readonly transformFromSourceIModel?: Transform;
/** @internal chiefly for debugging */
readonly tileId?: string;
/** True if the hit originated from a reality model classifier.
* @alpha
*/
readonly isClassifier?: boolean;
/** Describes the path by which the hit was located through a series of attached views.
* @beta
*/
readonly path?: HitPath;
/** Information about the [contour line]($docs/learning/display/ContourDisplay.md), if any, from which this hit originated.
* @beta
*/
readonly contour?: ContourHit;
}
/** A HitDetail stores the result when locating geometry displayed in a view.
* It holds an approximate location on an element (or decoration) from a *pick*.
* @public
* @extensions
*/
export declare class HitDetail {
private readonly _props;
/** The point in world coordinates that was used as the initial locate point. */
get testPoint(): Point3d;
/** The viewport in which the locate operation was performed. */
get viewport(): ScreenViewport;
/** The procedure that requested the locate operation. */
get hitSource(): HitSource;
/** The approximate location in world coordinates on the geometry identified by this HitDetail. */
get hitPoint(): Point3d;
/** The source of the geometry. This may be a persistent element Id, or a transient Id used for, e.g., pickable decorations. */
get sourceId(): Id64String;
/** The hit geometry priority/classification. */
get priority(): HitPriority;
/** The xy distance to the hit in view coordinates. */
get distXY(): number;
/** The distance in view coordinates between the hit and the near plane. */
get distFraction(): number;
/** The [SubCategory]($backend) to which the hit geometry belongs. */
get subCategoryId(): Id64String | undefined;
/** The class of the hit geometry. */
get geometryClass(): GeometryClass | undefined;
/** The Id of the [[ModelState]] from which the hit originated. */
get modelId(): string | undefined;
/** The IModelConnection from which the hit originated.
* This should almost always be left undefined, unless the hit is known to have originated from an iModel
* other than the one associated with the viewport.
* @internal
*/
get sourceIModel(): IModelConnection | undefined;
/** @internal */
get transformFromSourceIModel(): Transform | undefined;
/** @internal chiefly for debugging */
get tileId(): string | undefined;
/** True if the hit originated from a reality model classifier.
* @alpha
*/
get isClassifier(): boolean | undefined;
/** Information about the [ViewAttachment]($backend) within which the hit geometry resides, if any.
* @note Only [[SheetViewState]]s can have view attachments.
* @beta
*/
get viewAttachment(): ViewAttachmentHitInfo | undefined;
/** Describes the path by which the hit was located through a series of attached views.
* @beta
*/
get path(): HitPath | undefined;
/** Information about the [contour line]($docs/learning/display/ContourDisplay.md), if any, from which this hit originated.
* @beta
*/
get contour(): ContourHit | undefined;
/** Create a new HitDetail from the inputs to and results of a locate operation. */
constructor(props: HitDetailProps);
/** @deprecated in 4.1 - will not be removed until after 2026-06-13. Use the overload that takes a [[HitDetailProps]]. */
constructor(testPoint: Point3d, viewport: ScreenViewport, hitSource: HitSource, hitPoint: Point3d, sourceId: string, priority: HitPriority, distXY: number, distFraction: number, subCategoryId?: string, geometryClass?: GeometryClass, modelId?: string, sourceIModel?: IModelConnection, tileId?: string, isClassifier?: boolean);
/** Get the type of HitDetail.
* @returns HitDetailType.Hit if this is a HitDetail, HitDetailType.Snap if it is a SnapDetail
*/
getHitType(): HitDetailType;
/** Get the *hit point* for this HitDetail. Returns the approximate point on the element that caused the hit when not a SnapDetail or IntersectDetail.
* For a snap that is *hot*, the *exact* point on the Element for the snap mode is returned, otherwise the close point on the hit geometry is returned.
*/
getPoint(): Point3d;
/** Determine if this HitPoint is from the same source as another HitDetail. */
isSameHit(otherHit?: HitDetail): boolean;
/** Return whether sourceId is for a persistent element and not a pickable decoration. */
get isElementHit(): boolean;
get isModelHit(): boolean;
get isMapHit(): boolean;
/** Create a deep copy of this HitDetail */
clone(): HitDetail;
/** Draw this HitDetail as a Decoration. Causes the picked element to *flash* */
draw(_context: DecorateContext): void;
/** Get the tooltip content for this HitDetail. */
getToolTip(): Promise<HTMLElement | string>;
/** The IModelConnection from which the hit originated. In some cases this may not be the same as the iModel associated with the Viewport -
* for example, if a [[TiledGraphicsProvider]] is used to display graphics from a different iModel in the viewport.
* This HitDetail's element, subcategory, and model Ids are defined in the context of this IModelConnection.
*/
get iModel(): IModelConnection;
/** Returns true if this hit originated from an [[IModelConnection]] other than the one associated with the [[Viewport]].
* @see [[iModel]].
*/
get isExternalIModelHit(): boolean;
}
/** A SnapDetail is generated from the result of a snap request. In addition to the HitDetail about the reason the element was *picked*,
* it holds the *exact* point on the element from the snapping logic, plus additional information that varies with the type of element and snap mode.
* @public
* @extensions
*/
export declare class SnapDetail extends HitDetail {
snapMode: SnapMode;
heat: SnapHeat;
/** A sprite to show the user the type of snap performed */
sprite?: Sprite;
/** HitPoint adjusted by snap */
readonly snapPoint: Point3d;
/** AccuSnap/AccuDraw can adjust the point after the snap. */
readonly adjustedPoint: Point3d;
/** Curve primitive for snap. */
primitive?: CurvePrimitive;
/** Surface normal at snapPoint */
normal?: Vector3d;
/** The HitGeomType of this SnapDetail */
geomType?: HitGeomType;
/** The HitGeomType of this SnapDetail */
parentGeomType?: HitParentGeomType;
/** Constructor for SnapDetail.
* @param from The HitDetail that created this snap
* @param snapMode The SnapMode used to create this SnapDetail
* @param heat The SnapHeat of this SnapDetail
* @param snapPoint The snapped point in the element
*/
constructor(from: HitDetail, snapMode?: SnapMode, heat?: SnapHeat, snapPoint?: XYZProps);
/** Returns `HitDetailType.Snap` */
getHitType(): HitDetailType;
/** Get the snap point if this SnapDetail is *hot*, the pick point otherwise. */
getPoint(): Point3d;
/** Return true if the pick point was closer than the snap aperture from the generated snap point. */
get isHot(): boolean;
/** Determine whether the [[adjustedPoint]] is different than the [[snapPoint]]. This happens, for example, when points are adjusted for grids, acs plane snap, and AccuDraw. */
get isPointAdjusted(): boolean;
/** Change the snap point. */
setSnapPoint(point: Point3d, heat: SnapHeat): void;
/** Change the snap mode. */
setSnapMode(snapMode: SnapMode): void;
/** Set curve primitive and HitGeometryType for this SnapDetail. */
setCurvePrimitive(primitive?: CurvePrimitive, localToWorld?: Transform, geomType?: HitGeomType): void;
/** Make a copy of this SnapDetail. */
clone(): SnapDetail;
getCurvePrimitive(singleSegment?: boolean): CurvePrimitive | undefined;
draw(context: DecorateContext): void;
private static getSnapSpriteUrl;
}
/**
* @public
* @extensions
*/
export declare class IntersectDetail extends SnapDetail {
readonly otherPrimitive: CurvePrimitive;
readonly otherId: string;
constructor(from: SnapDetail, heat: SnapHeat | undefined, snapPoint: XYZProps, otherPrimitive: CurvePrimitive, otherId: string);
draw(context: DecorateContext): void;
}
/** The result of a "locate" is a sorted list of objects that satisfied the search criteria (a HitList). Earlier hits in the list
* are somehow *better* than those later on.
* @public
* @extensions
*/
export declare class HitList<T extends HitDetail> {
hits: T[];
currHit: number;
get length(): number;
empty(): void;
resetCurrentHit(): void;
/** Get a hit from a particular index into a HitList
* return the requested hit from the HitList or undefined
*/
getHit(hitNum: number): T | undefined;
/** When setting one or more indices to undefined you must call dropNulls afterwards */
setHit(i: number, p: T | undefined): void;
dropNulls(): void;
getNextHit(): T | undefined;
getCurrentHit(): T | undefined;
setCurrentHit(hit: T): void;
/** remove the current hit from the list. */
removeCurrentHit(): void;
/** remove a hit in the list. */
removeHit(hitNum: number): void;
/** search through list and remove any hits that contain a specified element id. */
removeHitsFrom(sourceId: string): boolean;
private getPriorityZOverride;
/** compare two hits for insertion into list. */
compare(hit1: HitDetail | undefined, hit2: HitDetail | undefined): -1 | 1 | 0;
/** Add a new hit to the list. Hits are sorted according to their priority and distance. */
addHit(newHit: T): number;
/** Insert a new hit into the list at the supplied index. */
insertHit(i: number, hit: T): void;
}
//# sourceMappingURL=HitDetail.d.ts.map