@itwin/ecschema-rpcinterface-tests 4.0.0-dev.100 → 4.0.0-dev.102

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.
@@ -149497,7 +149497,8 @@ class MapTile extends _internal__WEBPACK_IMPORTED_MODULE_7__.RealityTile {
149497
149497
  }
149498
149498
  /** @internal */
149499
149499
  minimumVisibleFactor() {
149500
- return 0.25;
149500
+ // if minimumVisibleFactor is more than 0, it stops parents from loading when children are not ready, to fill in gaps
149501
+ return 0.0;
149501
149502
  }
149502
149503
  /** @internal */
149503
149504
  getDrapeTextures() {
@@ -166781,17 +166782,20 @@ class Geometry {
166781
166782
  if (a2b2 > 0.0) {
166782
166783
  const a2b2r = 1.0 / a2b2; // 1/(a^2+b^2)
166783
166784
  const d2a2b2 = d2 * a2b2r; // d^2/(a^2+b^2)
166784
- const criteria = 1.0 - d2a2b2; // 1 - d^2/(a^2+b^2); the criteria to specify how many solutions we got
166785
- if (criteria < -Geometry.smallMetricDistanceSquared) // nSolution = 0
166785
+ const criterion = 1.0 - d2a2b2; // 1 - d^2/(a^2+b^2);
166786
+ if (criterion < -Geometry.smallMetricDistanceSquared) // nSolution = 0
166786
166787
  return result;
166787
166788
  const da2b2 = -constCoff * a2b2r; // -d/(a^2+b^2)
166789
+ // (c0,s0) is the closest approach of the line to the circle center (origin)
166788
166790
  const c0 = da2b2 * cosCoff; // -ad/(a^2+b^2)
166789
166791
  const s0 = da2b2 * sinCoff; // -bd/(a^2+b^2)
166790
- if (criteria <= 0.0) { // nSolution = 1 (observed criteria = -2.22e-16 in rotated system)
166792
+ if (criterion <= 0.0) { // nSolution = 1
166793
+ // We observed criterion = -2.22e-16 in a rotated tangent system, therefore for negative criteria near
166794
+ // zero, return the near-tangency; for tiny positive criteria, fall through to return both solutions.
166791
166795
  result = [_geometry3d_Point2dVector2d__WEBPACK_IMPORTED_MODULE_1__.Vector2d.create(c0, s0)];
166792
166796
  }
166793
- else if (criteria > 0.0) { // nSolution = 2
166794
- const s = Math.sqrt(criteria * a2b2r); // sqrt(a^2+b^2-d^2)) / (a^2+b^2)
166797
+ else { // nSolution = 2
166798
+ const s = Math.sqrt(criterion * a2b2r); // sqrt(a^2+b^2-d^2)) / (a^2+b^2)
166795
166799
  result = [
166796
166800
  _geometry3d_Point2dVector2d__WEBPACK_IMPORTED_MODULE_1__.Vector2d.create(c0 - s * sinCoff, s0 + s * cosCoff),
166797
166801
  _geometry3d_Point2dVector2d__WEBPACK_IMPORTED_MODULE_1__.Vector2d.create(c0 + s * sinCoff, s0 - s * cosCoff),
@@ -181735,12 +181739,12 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
181735
181739
  extendB, reversed) {
181736
181740
  const inverseA = matrixA.inverse();
181737
181741
  if (inverseA) {
181738
- const localB = inverseA.multiplyMatrixMatrix(matrixB);
181742
+ const localB = inverseA.multiplyMatrixMatrix(matrixB); // localB->localA transform
181739
181743
  const ellipseRadians = [];
181740
181744
  const circleRadians = [];
181741
181745
  _numerics_Polynomials__WEBPACK_IMPORTED_MODULE_6__.TrigPolynomial.solveUnitCircleHomogeneousEllipseIntersection(localB.coffs[2], localB.coffs[5], localB.coffs[8], // center xyw
181742
- localB.coffs[0], localB.coffs[3], localB.coffs[6], // center xyw
181743
- localB.coffs[1], localB.coffs[4], localB.coffs[7], // center xyw
181746
+ localB.coffs[0], localB.coffs[3], localB.coffs[6], // vector0 xyw
181747
+ localB.coffs[1], localB.coffs[4], localB.coffs[7], // vector90 xyw
181744
181748
  ellipseRadians, circleRadians);
181745
181749
  for (let i = 0; i < ellipseRadians.length; i++) {
181746
181750
  const fractionA = cpA.sweep.radiansToSignedPeriodicFraction(circleRadians[i]);
@@ -183687,7 +183691,7 @@ function optionalVectorUpdate(source, result) {
183687
183691
  return undefined;
183688
183692
  }
183689
183693
  /**
183690
- * CurveLocationDetail carries point and paramter data about a point evaluated on a curve.
183694
+ * CurveLocationDetail carries point and parameter data about a point evaluated on a curve.
183691
183695
  * * These are returned by a variety of queries.
183692
183696
  * * Particular contents can vary among the queries.
183693
183697
  * @public
@@ -187931,13 +187935,16 @@ __webpack_require__.r(__webpack_exports__);
187931
187935
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
187932
187936
  /* harmony export */ "PlanarSubdivision": () => (/* binding */ PlanarSubdivision)
187933
187937
  /* harmony export */ });
187934
- /* harmony import */ var _Geometry__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Geometry */ "../../core/geometry/lib/esm/Geometry.js");
187935
- /* harmony import */ var _topology_Graph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../topology/Graph */ "../../core/geometry/lib/esm/topology/Graph.js");
187936
- /* harmony import */ var _topology_HalfEdgeGraphSearch__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../topology/HalfEdgeGraphSearch */ "../../core/geometry/lib/esm/topology/HalfEdgeGraphSearch.js");
187937
- /* harmony import */ var _topology_Merging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../topology/Merging */ "../../core/geometry/lib/esm/topology/Merging.js");
187938
- /* harmony import */ var _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CurveLocationDetail */ "../../core/geometry/lib/esm/curve/CurveLocationDetail.js");
187939
- /* harmony import */ var _Loop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Loop */ "../../core/geometry/lib/esm/curve/Loop.js");
187940
- /* harmony import */ var _RegionOps__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../RegionOps */ "../../core/geometry/lib/esm/curve/RegionOps.js");
187938
+ /* harmony import */ var _Geometry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Geometry */ "../../core/geometry/lib/esm/Geometry.js");
187939
+ /* harmony import */ var _topology_Graph__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../topology/Graph */ "../../core/geometry/lib/esm/topology/Graph.js");
187940
+ /* harmony import */ var _topology_HalfEdgeGraphSearch__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../topology/HalfEdgeGraphSearch */ "../../core/geometry/lib/esm/topology/HalfEdgeGraphSearch.js");
187941
+ /* harmony import */ var _topology_Merging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../topology/Merging */ "../../core/geometry/lib/esm/topology/Merging.js");
187942
+ /* harmony import */ var _Arc3d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Arc3d */ "../../core/geometry/lib/esm/curve/Arc3d.js");
187943
+ /* harmony import */ var _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../CurveLocationDetail */ "../../core/geometry/lib/esm/curve/CurveLocationDetail.js");
187944
+ /* harmony import */ var _LineSegment3d__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../LineSegment3d */ "../../core/geometry/lib/esm/curve/LineSegment3d.js");
187945
+ /* harmony import */ var _LineString3d__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../LineString3d */ "../../core/geometry/lib/esm/curve/LineString3d.js");
187946
+ /* harmony import */ var _Loop__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Loop */ "../../core/geometry/lib/esm/curve/Loop.js");
187947
+ /* harmony import */ var _RegionOps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../RegionOps */ "../../core/geometry/lib/esm/curve/RegionOps.js");
187941
187948
  /*---------------------------------------------------------------------------------------------
187942
187949
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
187943
187950
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -187949,13 +187956,16 @@ __webpack_require__.r(__webpack_exports__);
187949
187956
 
187950
187957
 
187951
187958
 
187959
+
187960
+
187961
+
187952
187962
  /** @packageDocumentation
187953
187963
  * @module Curve
187954
187964
  */
187955
187965
  class MapCurvePrimitiveToCurveLocationDetailPairArray {
187956
187966
  constructor() {
187957
187967
  this.primitiveToPair = new Map();
187958
- // index assigned to this primitive for this calculation.
187968
+ // index assigned to this primitive (for debugging)
187959
187969
  this.primitiveToIndex = new Map();
187960
187970
  this._numIndexedPrimitives = 0;
187961
187971
  }
@@ -187987,54 +187997,63 @@ class MapCurvePrimitiveToCurveLocationDetailPairArray {
187987
187997
  if (primitiveB)
187988
187998
  this.insertPrimitiveToPair(primitiveB, pair);
187989
187999
  }
188000
+ /** Split closed missing primitives in half and add new intersection pairs */
188001
+ splitAndAppendMissingClosedPrimitives(primitives, tolerance = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.smallMetricDistance) {
188002
+ for (const p of primitives) {
188003
+ let closedCurveSplitCandidate = false;
188004
+ if (p instanceof _Arc3d__WEBPACK_IMPORTED_MODULE_1__.Arc3d)
188005
+ closedCurveSplitCandidate = p.sweep.isFullCircle;
188006
+ else if (!(p instanceof _LineSegment3d__WEBPACK_IMPORTED_MODULE_2__.LineSegment3d) && !(p instanceof _LineString3d__WEBPACK_IMPORTED_MODULE_3__.LineString3d))
188007
+ closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);
188008
+ if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {
188009
+ const p0 = p.clonePartialCurve(0.0, 0.5);
188010
+ const p1 = p.clonePartialCurve(0.5, 1.0);
188011
+ if (p0 && p1) {
188012
+ this.insertPair(_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetailPair.createCapture(_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0), _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0)));
188013
+ this.insertPair(_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetailPair.createCapture(_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0), _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0)));
188014
+ }
188015
+ }
188016
+ }
188017
+ }
187990
188018
  }
187991
- /*
187992
- function getDetailString(detail: CurveLocationDetail | undefined): string {
187993
- if (!detail)
187994
- return "{}";
187995
- else return tagString("primitive", this.primitiveToIndex.get(detail.curve!)) + tagString("f0", detail.fraction) + tagString("f1", detail.fraction1);
187996
- }
187997
- }
187998
- function tagString(name: string, value: number | undefined): string {
187999
- if (value !== undefined)
188000
- return "(" + name + " " + value + ")";
188001
- return "";
188002
- }
188003
- */
188004
188019
  /**
188005
188020
  * @internal
188006
188021
  */
188007
188022
  class PlanarSubdivision {
188008
- /** Create a graph from an array of curves, and an array of the curves' precomputed intersections. */
188009
- static assembleHalfEdgeGraph(primitives, allPairs) {
188023
+ /** Create a graph from an array of curves, and an array of the curves' precomputed intersections. Z-coordinates are ignored. */
188024
+ static assembleHalfEdgeGraph(primitives, allPairs, mergeTolerance = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.smallMetricDistance) {
188010
188025
  const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray(); // map from key CurvePrimitive to CurveLocationDetailPair.
188011
- for (const p of primitives)
188012
- detailByPrimitive.assignPrimitiveIndex(p);
188013
- for (const pair of allPairs) {
188026
+ for (const pair of allPairs)
188014
188027
  detailByPrimitive.insertPair(pair);
188015
- }
188016
- const graph = new _topology_Graph__WEBPACK_IMPORTED_MODULE_0__.HalfEdgeGraph();
188028
+ if (primitives.length > detailByPrimitive.primitiveToPair.size)
188029
+ detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance); // otherwise, these single-primitive loops are missing from the graph
188030
+ const graph = new _topology_Graph__WEBPACK_IMPORTED_MODULE_5__.HalfEdgeGraph();
188017
188031
  for (const entry of detailByPrimitive.primitiveToPair.entries()) {
188018
188032
  const p = entry[0];
188019
- const details = entry[1];
188033
+ // convert each interval intersection into two isolated intersections
188034
+ const details = entry[1].reduce((accumulator, detailPair) => {
188035
+ if (!detailPair.detailA.hasFraction1)
188036
+ return [...accumulator, detailPair];
188037
+ const detail = getDetailOnCurve(detailPair, p);
188038
+ const detail0 = _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);
188039
+ const detail1 = _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1, detail.point1);
188040
+ return [...accumulator, _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetailPair.createCapture(detail0, detail0), _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetailPair.createCapture(detail1, detail1)];
188041
+ }, []);
188042
+ // lexical sort on p intersection fraction
188020
188043
  details.sort((pairA, pairB) => {
188021
188044
  const fractionA = getFractionOnCurve(pairA, p);
188022
188045
  const fractionB = getFractionOnCurve(pairB, p);
188023
- if (fractionA === undefined || fractionB === undefined)
188024
- return -1000.0;
188025
188046
  return fractionA - fractionB;
188026
188047
  });
188027
- let detail0 = getDetailOnCurve(details[0], p);
188028
- this.addHalfEdge(graph, p, p.startPoint(), 0.0, detail0.point, detail0.fraction);
188029
- for (let i = 1; i < details.length; i++) {
188030
- // create (both sides of) a graph edge . . .
188031
- const detail1 = getDetailOnCurve(details[i], p);
188032
- this.addHalfEdge(graph, p, detail0.point, detail0.fraction, detail1.point, detail1.fraction);
188033
- detail0 = detail1;
188048
+ let last = { point: p.startPoint(), fraction: 0.0 };
188049
+ for (const detailPair of details) {
188050
+ const detail = getDetailOnCurve(detailPair, p);
188051
+ const detailFraction = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later
188052
+ last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);
188034
188053
  }
188035
- this.addHalfEdge(graph, p, detail0.point, detail0.fraction, p.endPoint(), 1.0);
188054
+ this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);
188036
188055
  }
188037
- _topology_Merging__WEBPACK_IMPORTED_MODULE_1__.HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he) => he.sortAngle);
188056
+ _topology_Merging__WEBPACK_IMPORTED_MODULE_6__.HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he) => he.sortAngle);
188038
188057
  return graph;
188039
188058
  }
188040
188059
  /**
@@ -188046,19 +188065,21 @@ class PlanarSubdivision {
188046
188065
  * @param point0 start point
188047
188066
  * @param fraction1 end fraction
188048
188067
  * @param point1 end point
188049
- */
188050
- static addHalfEdge(graph, p, point0, fraction0, point1, fraction1) {
188051
- if (!point0.isAlmostEqual(point1)) {
188052
- const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);
188053
- const detail01 = _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);
188054
- const mate = halfEdge.edgeMate;
188055
- halfEdge.edgeTag = detail01;
188056
- halfEdge.sortData = 1.0;
188057
- mate.edgeTag = detail01;
188058
- mate.sortData = -1.0;
188059
- halfEdge.sortAngle = sortAngle(detail01.curve, detail01.fraction, false);
188060
- mate.sortAngle = sortAngle(detail01.curve, detail01.fraction1, true);
188061
- }
188068
+ * @returns end point and fraction, or start point and fraction if no action
188069
+ */
188070
+ static addHalfEdge(graph, p, point0, fraction0, point1, fraction1, mergeTolerance = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.smallMetricDistance) {
188071
+ if (point0.isAlmostEqualXY(point1, mergeTolerance))
188072
+ return { point: point0, fraction: fraction0 };
188073
+ const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);
188074
+ const detail01 = _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);
188075
+ const mate = halfEdge.edgeMate;
188076
+ halfEdge.edgeTag = detail01;
188077
+ halfEdge.sortData = 1.0;
188078
+ mate.edgeTag = detail01;
188079
+ mate.sortData = -1.0;
188080
+ halfEdge.sortAngle = sortAngle(p, fraction0, false);
188081
+ mate.sortAngle = sortAngle(p, fraction1, true);
188082
+ return { point: point1, fraction: fraction1 };
188062
188083
  }
188063
188084
  /**
188064
188085
  * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative, or sliver loops.
@@ -188067,7 +188088,7 @@ class PlanarSubdivision {
188067
188088
  * @returns the area (forced to zero if within tolerance)
188068
188089
  */
188069
188090
  static collectSignedLoop(loop, outLoops, zeroAreaTolerance = 1.0e-10, isSliverFace) {
188070
- let area = isSliverFace ? 0.0 : _RegionOps__WEBPACK_IMPORTED_MODULE_3__.RegionOps.computeXYArea(loop);
188091
+ let area = isSliverFace ? 0.0 : _RegionOps__WEBPACK_IMPORTED_MODULE_7__.RegionOps.computeXYArea(loop);
188071
188092
  if (area === undefined)
188072
188093
  area = 0;
188073
188094
  if (Math.abs(area) < zeroAreaTolerance)
@@ -188083,7 +188104,7 @@ class PlanarSubdivision {
188083
188104
  }
188084
188105
  static createLoopInFace(faceSeed, announce) {
188085
188106
  let he = faceSeed;
188086
- const loop = _Loop__WEBPACK_IMPORTED_MODULE_4__.Loop.create();
188107
+ const loop = _Loop__WEBPACK_IMPORTED_MODULE_8__.Loop.create();
188087
188108
  do {
188088
188109
  const detail = he.edgeTag;
188089
188110
  if (detail) {
@@ -188107,9 +188128,9 @@ class PlanarSubdivision {
188107
188128
  const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);
188108
188129
  let faceIsBanana = false;
188109
188130
  if (faceHasTwoEdges) {
188110
- const c0 = _topology_Merging__WEBPACK_IMPORTED_MODULE_1__.HalfEdgeGraphMerge.curvatureSortKey(he);
188111
- const c1 = _topology_Merging__WEBPACK_IMPORTED_MODULE_1__.HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);
188112
- if (!_Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.isSameCoordinate(c0, c1)) // default tol!
188131
+ const c0 = _topology_Merging__WEBPACK_IMPORTED_MODULE_6__.HalfEdgeGraphMerge.curvatureSortKey(he);
188132
+ const c1 = _topology_Merging__WEBPACK_IMPORTED_MODULE_6__.HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);
188133
+ if (!_Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.isSameCoordinate(c0, c1)) // default tol!
188113
188134
  faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...
188114
188135
  }
188115
188136
  return faceHasTwoEdges && !faceIsBanana;
@@ -188127,7 +188148,7 @@ class PlanarSubdivision {
188127
188148
  return e1;
188128
188149
  }
188129
188150
  static collectSignedLoopSetsInHalfEdgeGraph(graph, zeroAreaTolerance = 1.0e-10) {
188130
- const q = _topology_HalfEdgeGraphSearch__WEBPACK_IMPORTED_MODULE_6__.HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);
188151
+ const q = _topology_HalfEdgeGraphSearch__WEBPACK_IMPORTED_MODULE_9__.HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);
188131
188152
  const result = [];
188132
188153
  const edgeMap = new Map();
188133
188154
  for (const faceSeeds of q) {
@@ -188142,10 +188163,10 @@ class PlanarSubdivision {
188142
188163
  const e = edgeMap.get(mate);
188143
188164
  if (e === undefined) {
188144
188165
  // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge
188145
- const e1 = new _Loop__WEBPACK_IMPORTED_MODULE_4__.LoopCurveLoopCurve(loopC, curveC, undefined, undefined);
188166
+ const e1 = new _Loop__WEBPACK_IMPORTED_MODULE_8__.LoopCurveLoopCurve(loopC, curveC, undefined, undefined);
188146
188167
  edgeMap.set(he, e1);
188147
188168
  }
188148
- else if (e instanceof _Loop__WEBPACK_IMPORTED_MODULE_4__.LoopCurveLoopCurve) {
188169
+ else if (e instanceof _Loop__WEBPACK_IMPORTED_MODULE_8__.LoopCurveLoopCurve) {
188149
188170
  e.setB(loopC, curveC);
188150
188171
  edges.push(e);
188151
188172
  edgeMap.delete(mate);
@@ -188993,27 +189014,27 @@ __webpack_require__.r(__webpack_exports__);
188993
189014
  /* harmony import */ var _geometry4d_MomentData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../geometry4d/MomentData */ "../../core/geometry/lib/esm/geometry4d/MomentData.js");
188994
189015
  /* harmony import */ var _polyface_PolyfaceBuilder__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../polyface/PolyfaceBuilder */ "../../core/geometry/lib/esm/polyface/PolyfaceBuilder.js");
188995
189016
  /* harmony import */ var _topology_Graph__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../topology/Graph */ "../../core/geometry/lib/esm/topology/Graph.js");
189017
+ /* harmony import */ var _topology_HalfEdgeGraphSearch__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../topology/HalfEdgeGraphSearch */ "../../core/geometry/lib/esm/topology/HalfEdgeGraphSearch.js");
188996
189018
  /* harmony import */ var _topology_Triangulation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../topology/Triangulation */ "../../core/geometry/lib/esm/topology/Triangulation.js");
188997
189019
  /* harmony import */ var _ChainCollectorContext__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./ChainCollectorContext */ "../../core/geometry/lib/esm/curve/ChainCollectorContext.js");
188998
189020
  /* harmony import */ var _CurveCollection__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./CurveCollection */ "../../core/geometry/lib/esm/curve/CurveCollection.js");
188999
189021
  /* harmony import */ var _CurveCurve__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./CurveCurve */ "../../core/geometry/lib/esm/curve/CurveCurve.js");
189000
189022
  /* harmony import */ var _CurvePrimitive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CurvePrimitive */ "../../core/geometry/lib/esm/curve/CurvePrimitive.js");
189001
189023
  /* harmony import */ var _CurveWireMomentsXYZ__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CurveWireMomentsXYZ */ "../../core/geometry/lib/esm/curve/CurveWireMomentsXYZ.js");
189024
+ /* harmony import */ var _GeometryQuery__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./GeometryQuery */ "../../core/geometry/lib/esm/curve/GeometryQuery.js");
189025
+ /* harmony import */ var _internalContexts_MultiChainCollector__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./internalContexts/MultiChainCollector */ "../../core/geometry/lib/esm/curve/internalContexts/MultiChainCollector.js");
189002
189026
  /* harmony import */ var _internalContexts_PolygonOffsetContext__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./internalContexts/PolygonOffsetContext */ "../../core/geometry/lib/esm/curve/internalContexts/PolygonOffsetContext.js");
189003
189027
  /* harmony import */ var _LineString3d__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./LineString3d */ "../../core/geometry/lib/esm/curve/LineString3d.js");
189004
189028
  /* harmony import */ var _Loop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Loop */ "../../core/geometry/lib/esm/curve/Loop.js");
189029
+ /* harmony import */ var _ParityRegion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ParityRegion */ "../../core/geometry/lib/esm/curve/ParityRegion.js");
189005
189030
  /* harmony import */ var _Path__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Path */ "../../core/geometry/lib/esm/curve/Path.js");
189006
189031
  /* harmony import */ var _Query_ConsolidateAdjacentPrimitivesContext__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Query/ConsolidateAdjacentPrimitivesContext */ "../../core/geometry/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js");
189007
189032
  /* harmony import */ var _Query_CurveSplitContext__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Query/CurveSplitContext */ "../../core/geometry/lib/esm/curve/Query/CurveSplitContext.js");
189008
189033
  /* harmony import */ var _Query_InOutTests__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Query/InOutTests */ "../../core/geometry/lib/esm/curve/Query/InOutTests.js");
189009
189034
  /* harmony import */ var _Query_PlanarSubdivision__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Query/PlanarSubdivision */ "../../core/geometry/lib/esm/curve/Query/PlanarSubdivision.js");
189010
189035
  /* harmony import */ var _RegionMomentsXY__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RegionMomentsXY */ "../../core/geometry/lib/esm/curve/RegionMomentsXY.js");
189011
- /* harmony import */ var _internalContexts_MultiChainCollector__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./internalContexts/MultiChainCollector */ "../../core/geometry/lib/esm/curve/internalContexts/MultiChainCollector.js");
189012
- /* harmony import */ var _GeometryQuery__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./GeometryQuery */ "../../core/geometry/lib/esm/curve/GeometryQuery.js");
189013
189036
  /* harmony import */ var _RegionOpsClassificationSweeps__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./RegionOpsClassificationSweeps */ "../../core/geometry/lib/esm/curve/RegionOpsClassificationSweeps.js");
189014
189037
  /* harmony import */ var _UnionRegion__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./UnionRegion */ "../../core/geometry/lib/esm/curve/UnionRegion.js");
189015
- /* harmony import */ var _topology_HalfEdgeGraphSearch__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../topology/HalfEdgeGraphSearch */ "../../core/geometry/lib/esm/topology/HalfEdgeGraphSearch.js");
189016
- /* harmony import */ var _ParityRegion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ParityRegion */ "../../core/geometry/lib/esm/curve/ParityRegion.js");
189017
189038
  /*---------------------------------------------------------------------------------------------
189018
189039
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
189019
189040
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -189252,7 +189273,7 @@ class RegionOps {
189252
189273
  * @param loopsB second set of loops
189253
189274
  * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA
189254
189275
  * @param mergeTolerance absolute distance tolerance for merging loops
189255
- * @returns a region resulting from merging input loops and the boolean operation. May contain bridge edges connecting interior loops to exterior loops.
189276
+ * @returns a region resulting from merging input loops and the boolean operation. May contain bridge edges added to connect interior loops to exterior loops.
189256
189277
  */
189257
189278
  static regionBooleanXY(loopsA, loopsB, operation, mergeTolerance = _Geometry__WEBPACK_IMPORTED_MODULE_2__.Geometry.smallMetricDistance) {
189258
189279
  const result = _UnionRegion__WEBPACK_IMPORTED_MODULE_11__.UnionRegion.create();
@@ -189260,7 +189281,7 @@ class RegionOps {
189260
189281
  context.addMembers(loopsA, loopsB);
189261
189282
  context.annotateAndMergeCurvesInGraph(mergeTolerance);
189262
189283
  const range = context.groupA.range().union(context.groupB.range());
189263
- const areaTol = this.computeXYAreaTolerance(range);
189284
+ const areaTol = this.computeXYAreaTolerance(range, mergeTolerance);
189264
189285
  context.runClassificationSweep(operation, (_graph, face, faceType, area) => {
189265
189286
  // ignore danglers and null faces, but not 2-edge "banana" faces with nonzero area
189266
189287
  if (face.countEdgesAroundFace() < 2)
@@ -189578,23 +189599,24 @@ class RegionOps {
189578
189599
  }
189579
189600
  /**
189580
189601
  * Find all areas bounded by the unstructured, possibly intersecting curves.
189581
- * * This method performs no merging of nearly coincident edges and vertices, which can lead to unexpected results
189582
- * given sufficiently imprecise input. Input geometry consisting of regions can be merged for better results by pre-processing with
189583
- * [[regionBooleanXY]].
189602
+ * * A common use case of this method is to assemble the bounding "exterior" loop (or loops) containing the input curves.
189603
+ * * This method does not add bridge edges to connect outer loops to inner loops. Each disconnected loop, regardless
189604
+ * of its containment, is returned as its own SignedLoops object. Pre-process with [[regionBooleanXY]] to add bridge edges so that
189605
+ * [[constructAllXYRegionLoops]] will return outer and inner loops in the same SignedLoops object.
189584
189606
  * @param curvesAndRegions Any collection of curves. Each Loop/ParityRegion/UnionRegion contributes its curve primitives.
189607
+ * @param tolerance optional distance tolerance for coincidence
189585
189608
  * @returns array of [[SignedLoops]], each entry of which describes the faces in a single connected component:
189586
189609
  * * `positiveAreaLoops` contains "interior" loops, _including holes in ParityRegion input_. These loops have positive area and counterclockwise orientation.
189587
189610
  * * `negativeAreaLoops` contains (probably just one) "exterior" loop which is ordered clockwise.
189588
189611
  * * `slivers` contains sliver loops that have zero area, such as appear between coincident curves.
189589
189612
  * * `edges` contains a [[LoopCurveLoopCurve]] object for each component edge, collecting both loops adjacent to the edge and a constituent curve in each.
189590
189613
  */
189591
- static constructAllXYRegionLoops(curvesAndRegions) {
189592
- const primitivesA = RegionOps.collectCurvePrimitives(curvesAndRegions, undefined, true);
189593
- const primitivesB = this.expandLineStrings(primitivesA);
189594
- const range = this.curveArrayRange(primitivesB);
189595
- const areaTol = this.computeXYAreaTolerance(range);
189596
- const intersections = _CurveCurve__WEBPACK_IMPORTED_MODULE_30__.CurveCurve.allIntersectionsAmongPrimitivesXY(primitivesB);
189597
- const graph = _Query_PlanarSubdivision__WEBPACK_IMPORTED_MODULE_12__.PlanarSubdivision.assembleHalfEdgeGraph(primitivesB, intersections);
189614
+ static constructAllXYRegionLoops(curvesAndRegions, tolerance = _Geometry__WEBPACK_IMPORTED_MODULE_2__.Geometry.smallMetricDistance) {
189615
+ const primitives = RegionOps.collectCurvePrimitives(curvesAndRegions, undefined, true, true);
189616
+ const range = this.curveArrayRange(primitives);
189617
+ const areaTol = this.computeXYAreaTolerance(range, tolerance);
189618
+ const intersections = _CurveCurve__WEBPACK_IMPORTED_MODULE_30__.CurveCurve.allIntersectionsAmongPrimitivesXY(primitives, tolerance);
189619
+ const graph = _Query_PlanarSubdivision__WEBPACK_IMPORTED_MODULE_12__.PlanarSubdivision.assembleHalfEdgeGraph(primitives, intersections, tolerance);
189598
189620
  return _Query_PlanarSubdivision__WEBPACK_IMPORTED_MODULE_12__.PlanarSubdivision.collectSignedLoopSetsInHalfEdgeGraph(graph, areaTol);
189599
189621
  }
189600
189622
  /**
@@ -190210,7 +190232,7 @@ class RegionBooleanContext {
190210
190232
  }
190211
190233
  // const range = RegionOps.curveArrayRange(allPrimitives);
190212
190234
  const intersections = _CurveCurve__WEBPACK_IMPORTED_MODULE_15__.CurveCurve.allIntersectionsAmongPrimitivesXY(allPrimitives, mergeTolerance);
190213
- const graph = _Query_PlanarSubdivision__WEBPACK_IMPORTED_MODULE_16__.PlanarSubdivision.assembleHalfEdgeGraph(allPrimitives, intersections);
190235
+ const graph = _Query_PlanarSubdivision__WEBPACK_IMPORTED_MODULE_16__.PlanarSubdivision.assembleHalfEdgeGraph(allPrimitives, intersections, mergeTolerance);
190214
190236
  this.graph = graph;
190215
190237
  this.faceAreaFunction = faceAreaFromCurvedEdgeData;
190216
190238
  }
@@ -197309,15 +197331,20 @@ __webpack_require__.r(__webpack_exports__);
197309
197331
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
197310
197332
  /* harmony export */ "CoincidentGeometryQuery": () => (/* binding */ CoincidentGeometryQuery)
197311
197333
  /* harmony export */ });
197312
- /* harmony import */ var _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../curve/CurveLocationDetail */ "../../core/geometry/lib/esm/curve/CurveLocationDetail.js");
197313
- /* harmony import */ var _Geometry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Geometry */ "../../core/geometry/lib/esm/Geometry.js");
197314
- /* harmony import */ var _AngleSweep__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AngleSweep */ "../../core/geometry/lib/esm/geometry3d/AngleSweep.js");
197315
- /* harmony import */ var _Point3dVector3d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Point3dVector3d */ "../../core/geometry/lib/esm/geometry3d/Point3dVector3d.js");
197316
- /* harmony import */ var _Segment1d__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Segment1d */ "../../core/geometry/lib/esm/geometry3d/Segment1d.js");
197334
+ /* harmony import */ var _itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @itwin/core-bentley */ "../../core/bentley/lib/esm/core-bentley.js");
197335
+ /* harmony import */ var _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../curve/CurveLocationDetail */ "../../core/geometry/lib/esm/curve/CurveLocationDetail.js");
197336
+ /* harmony import */ var _Geometry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Geometry */ "../../core/geometry/lib/esm/Geometry.js");
197337
+ /* harmony import */ var _AngleSweep__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AngleSweep */ "../../core/geometry/lib/esm/geometry3d/AngleSweep.js");
197338
+ /* harmony import */ var _Point3dVector3d__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Point3dVector3d */ "../../core/geometry/lib/esm/geometry3d/Point3dVector3d.js");
197339
+ /* harmony import */ var _Segment1d__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Segment1d */ "../../core/geometry/lib/esm/geometry3d/Segment1d.js");
197317
197340
  /*---------------------------------------------------------------------------------------------
197318
197341
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
197319
197342
  * See LICENSE.md in the project root for license terms and full copyright notice.
197320
197343
  *--------------------------------------------------------------------------------------------*/
197344
+ /** @packageDocumentation
197345
+ * @module CartesianGeometry
197346
+ */
197347
+
197321
197348
 
197322
197349
 
197323
197350
 
@@ -197333,10 +197360,10 @@ class CoincidentGeometryQuery {
197333
197360
  get tolerance() {
197334
197361
  return this._tolerance;
197335
197362
  }
197336
- constructor(tolerance = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.smallMetricDistance) {
197363
+ constructor(tolerance = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.smallMetricDistance) {
197337
197364
  this._tolerance = tolerance;
197338
197365
  }
197339
- static create(tolerance = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.smallMetricDistance) {
197366
+ static create(tolerance = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.smallMetricDistance) {
197340
197367
  return new CoincidentGeometryQuery(tolerance);
197341
197368
  }
197342
197369
  /**
@@ -197359,12 +197386,12 @@ class CoincidentGeometryQuery {
197359
197386
  *
197360
197387
  */
197361
197388
  projectPointToSegmentXY(spacePoint, pointA, pointB) {
197362
- this._vectorU = _Point3dVector3d__WEBPACK_IMPORTED_MODULE_1__.Vector3d.createStartEnd(pointA, pointB, this._vectorU);
197363
- this._vectorV = _Point3dVector3d__WEBPACK_IMPORTED_MODULE_1__.Vector3d.createStartEnd(pointA, spacePoint, this._vectorV);
197389
+ this._vectorU = _Point3dVector3d__WEBPACK_IMPORTED_MODULE_2__.Vector3d.createStartEnd(pointA, pointB, this._vectorU);
197390
+ this._vectorV = _Point3dVector3d__WEBPACK_IMPORTED_MODULE_2__.Vector3d.createStartEnd(pointA, spacePoint, this._vectorV);
197364
197391
  const uDotU = this._vectorU.dotProductXY(this._vectorU);
197365
197392
  const uDotV = this._vectorU.dotProductXY(this._vectorV);
197366
- const fraction = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.safeDivideFraction(uDotV, uDotU, 0.0);
197367
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetail.createCurveFractionPoint(undefined, fraction, pointA.interpolate(fraction, pointB));
197393
+ const fraction = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.safeDivideFraction(uDotV, uDotU, 0.0);
197394
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetail.createCurveFractionPoint(undefined, fraction, pointA.interpolate(fraction, pointB));
197368
197395
  }
197369
197396
  /**
197370
197397
  * * project `pointA0` and `pointA1` onto the segment with `pointB0` and `pointB1`
@@ -197375,84 +197402,82 @@ class CoincidentGeometryQuery {
197375
197402
  * @param pointB1 end point of segment B
197376
197403
  */
197377
197404
  coincidentSegmentRangeXY(pointA0, pointA1, pointB0, pointB1, restrictToBounds = true) {
197378
- const detailAOnB = this.projectPointToSegmentXY(pointA0, pointB0, pointB1);
197379
- if (pointA0.distanceXY(detailAOnB.point) > this._tolerance)
197405
+ const detailA0OnB = this.projectPointToSegmentXY(pointA0, pointB0, pointB1);
197406
+ if (pointA0.distanceXY(detailA0OnB.point) > this._tolerance)
197380
197407
  return undefined;
197381
197408
  const detailA1OnB = this.projectPointToSegmentXY(pointA1, pointB0, pointB1);
197382
197409
  if (pointA1.distanceXY(detailA1OnB.point) > this._tolerance)
197383
197410
  return undefined;
197384
- const detailBOnA = this.projectPointToSegmentXY(pointB0, pointA0, pointA1);
197385
- if (pointB0.distanceXY(detailBOnA.point) > this._tolerance)
197411
+ const detailB0OnA = this.projectPointToSegmentXY(pointB0, pointA0, pointA1);
197412
+ if (pointB0.distanceXY(detailB0OnA.point) > this._tolerance)
197386
197413
  return undefined;
197387
197414
  const detailB1OnA = this.projectPointToSegmentXY(pointB1, pointA0, pointA1);
197388
197415
  if (pointB1.distanceXY(detailB1OnA.point) > this._tolerance)
197389
197416
  return undefined;
197390
- detailAOnB.fraction1 = detailA1OnB.fraction;
197391
- detailAOnB.point1 = detailA1OnB.point; // capture -- detailB0OnA is not reused.
197392
- detailBOnA.fraction1 = detailB1OnA.fraction;
197393
- detailBOnA.point1 = detailB1OnA.point;
197417
+ detailA0OnB.fraction1 = detailA1OnB.fraction;
197418
+ detailA0OnB.point1 = detailA1OnB.point; // capture -- detailA1OnB is not reused.
197419
+ detailB0OnA.fraction1 = detailB1OnA.fraction;
197420
+ detailB0OnA.point1 = detailB1OnA.point;
197394
197421
  if (!restrictToBounds)
197395
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetailPair.createCapture(detailBOnA, detailAOnB);
197396
- const segment = _Segment1d__WEBPACK_IMPORTED_MODULE_3__.Segment1d.create(detailBOnA.fraction, detailBOnA.fraction1);
197422
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);
197423
+ const segment = _Segment1d__WEBPACK_IMPORTED_MODULE_4__.Segment1d.create(detailB0OnA.fraction, detailB0OnA.fraction1);
197397
197424
  if (segment.clampDirectedTo01()) {
197398
- segment.reverseIfNeededForDeltaSign(1.0);
197399
197425
  const f0 = segment.x0;
197400
197426
  const f1 = segment.x1;
197401
- const h0 = detailBOnA.inverseInterpolateFraction(f0);
197402
- const h1 = detailBOnA.inverseInterpolateFraction(f1);
197427
+ const h0 = detailB0OnA.inverseInterpolateFraction(f0);
197428
+ const h1 = detailB0OnA.inverseInterpolateFraction(f1);
197403
197429
  // recompute fractions and points..
197404
- CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(detailBOnA, f0, f1, pointA0, pointA1);
197405
- CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(detailAOnB, h0, h1, pointB0, pointB1);
197406
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetailPair.createCapture(detailBOnA, detailAOnB);
197430
+ CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(detailB0OnA, f0, f1, pointA0, pointA1, f0 > f1);
197431
+ CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(detailA0OnB, h0, h1, pointB0, pointB1, h0 > h1);
197432
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);
197407
197433
  }
197408
197434
  else {
197409
197435
  if (segment.signedDelta() < 0.0) {
197410
- if (detailBOnA.point.isAlmostEqual(pointA0)) {
197411
- detailBOnA.collapseToStart();
197412
- detailAOnB.collapseToStart();
197413
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetailPair.createCapture(detailBOnA, detailAOnB);
197436
+ if (detailB0OnA.point.isAlmostEqual(pointA0, this.tolerance)) {
197437
+ detailB0OnA.collapseToStart();
197438
+ detailA0OnB.collapseToStart();
197439
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);
197414
197440
  }
197415
- if (detailBOnA.point1.isAlmostEqual(pointA1)) {
197416
- detailBOnA.collapseToEnd();
197417
- detailAOnB.collapseToEnd();
197418
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetailPair.createCapture(detailBOnA, detailAOnB);
197441
+ if (detailB0OnA.point1.isAlmostEqual(pointA1, this.tolerance)) {
197442
+ detailB0OnA.collapseToEnd();
197443
+ detailA0OnB.collapseToEnd();
197444
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);
197419
197445
  }
197420
197446
  }
197421
197447
  else {
197422
- if (detailBOnA.point.isAlmostEqual(pointA1)) {
197423
- detailBOnA.collapseToStart();
197424
- detailAOnB.collapseToEnd();
197425
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetailPair.createCapture(detailBOnA, detailAOnB);
197448
+ if (detailB0OnA.point.isAlmostEqual(pointA1, this.tolerance)) {
197449
+ detailB0OnA.collapseToStart();
197450
+ detailA0OnB.collapseToEnd();
197451
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);
197426
197452
  }
197427
- if (detailBOnA.point1.isAlmostEqual(pointA0)) {
197428
- detailBOnA.collapseToEnd();
197429
- detailAOnB.collapseToStart();
197430
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetailPair.createCapture(detailBOnA, detailAOnB);
197453
+ if (detailB0OnA.point1.isAlmostEqual(pointA0, this.tolerance)) {
197454
+ detailB0OnA.collapseToEnd();
197455
+ detailA0OnB.collapseToStart();
197456
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);
197431
197457
  }
197432
197458
  }
197433
197459
  }
197434
197460
  return undefined;
197435
197461
  }
197436
197462
  /**
197437
- * Create a CurveLocationDetailPair from . . .
197463
+ * Create a CurveLocationDetailPair for a coincident interval of two overlapping curves
197438
197464
  * @param cpA curveA
197439
- * @param cpB curve B
197440
- * @param fractionsOnA fractions of an active section of curveA
197441
- * @param fractionB0 fraction of an original containing B interval
197442
- * @param fractionB1 end fraction of an original containing B interval
197465
+ * @param cpB curveB
197466
+ * @param fractionsOnA coincident interval of curveB in fraction space of curveA
197467
+ * @param fractionB0 curveB start in fraction space of curveA
197468
+ * @param fractionB1 curveB end in fraction space of curveA
197469
+ * @param reverse whether curveB and curveA have opposite direction
197443
197470
  */
197444
197471
  createDetailPair(cpA, cpB, fractionsOnA, fractionB0, fractionB1, reverse) {
197445
197472
  const deltaB = fractionB1 - fractionB0;
197446
- const g0 = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.conditionalDivideFraction(fractionsOnA.x0 - fractionB0, deltaB);
197447
- const g1 = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.conditionalDivideFraction(fractionsOnA.x1 - fractionB0, deltaB);
197473
+ const g0 = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.conditionalDivideFraction(fractionsOnA.x0 - fractionB0, deltaB);
197474
+ const g1 = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.conditionalDivideFraction(fractionsOnA.x1 - fractionB0, deltaB);
197448
197475
  if (g0 !== undefined && g1 !== undefined) {
197449
- const detailA = _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetail.createCurveEvaluatedFractionFraction(cpA, fractionsOnA.x0, fractionsOnA.x1);
197450
- const detailB = _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetail.createCurveEvaluatedFractionFraction(cpB, g0, g1);
197451
- if (reverse) {
197476
+ const detailA = _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetail.createCurveEvaluatedFractionFraction(cpA, fractionsOnA.x0, fractionsOnA.x1);
197477
+ const detailB = _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetail.createCurveEvaluatedFractionFraction(cpB, g0, g1);
197478
+ if (reverse)
197452
197479
  detailA.swapFractionsAndPoints();
197453
- detailB.swapFractionsAndPoints();
197454
- }
197455
- return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetailPair.createCapture(detailA, detailB);
197480
+ return _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailA, detailB);
197456
197481
  }
197457
197482
  return undefined;
197458
197483
  }
@@ -197469,43 +197494,67 @@ class CoincidentGeometryQuery {
197469
197494
  * @param arcA
197470
197495
  * @param arcB
197471
197496
  * @param _restrictToBounds
197472
- * @return 0, 1, or 2 overlap intervals.
197497
+ * @return 0, 1, or 2 overlap points/intervals
197473
197498
  */
197474
197499
  coincidentArcIntersectionXY(arcA, arcB, _restrictToBounds = true) {
197475
197500
  let result;
197476
- if (arcA.center.isAlmostEqual(arcB.center)) {
197501
+ if (arcA.center.isAlmostEqual(arcB.center, this.tolerance)) {
197477
197502
  const matrixBToA = arcA.matrixRef.multiplyMatrixInverseMatrix(arcB.matrixRef);
197478
197503
  if (matrixBToA) {
197479
197504
  const ux = matrixBToA.at(0, 0);
197480
197505
  const uy = matrixBToA.at(1, 0);
197481
197506
  const vx = matrixBToA.at(0, 1);
197482
197507
  const vy = matrixBToA.at(1, 1);
197483
- const ru = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.hypotenuseXY(ux, uy);
197484
- const rv = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.hypotenuseXY(vx, vy);
197485
- const dot = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.dotProductXYXY(ux, uy, vx, vy);
197486
- const cross = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.crossProductXYXY(ux, uy, vx, vy);
197487
- if (_Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.isAlmostEqualNumber(ru, 1.0)
197488
- && _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.isAlmostEqualNumber(rv, 1.0)
197489
- && _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.isAlmostEqualNumber(0, dot)) {
197490
- const alphaB0Radians = Math.atan2(uy, ux); // angular position of arcB 0 point in A sweep
197491
- const sweepDirection = cross > 0 ? 1.0 : -1.0; // 1 if arcB's parameter space sweeps forward, -1 if reverse
197492
- const betaStartRadians = alphaB0Radians + sweepDirection * arcB.sweep.startRadians;
197493
- const betaEndRadians = alphaB0Radians + sweepDirection * arcB.sweep.endRadians;
197508
+ const ru = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.hypotenuseXY(ux, uy);
197509
+ const rv = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.hypotenuseXY(vx, vy);
197510
+ const dot = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.dotProductXYXY(ux, uy, vx, vy);
197511
+ const cross = _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.crossProductXYXY(ux, uy, vx, vy);
197512
+ if (_Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isAlmostEqualNumber(ru, 1.0)
197513
+ && _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isAlmostEqualNumber(rv, 1.0)
197514
+ && _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isAlmostEqualNumber(0, dot)) {
197515
+ const alphaB0Radians = Math.atan2(uy, ux); // angular position of arcB 0 point in arcA sweep
197516
+ const sweepDirection = cross > 0 ? 1.0 : -1.0; // 1 if arcB parameter space sweeps in same direction as arcA, -1 if opposite
197517
+ const betaStartRadians = alphaB0Radians + sweepDirection * arcB.sweep.startRadians; // arcB start in arcA parameter space
197518
+ const betaEndRadians = alphaB0Radians + sweepDirection * arcB.sweep.endRadians; // arcB end in arcA parameter space
197494
197519
  const fractionSpacesReversed = (sweepDirection * arcA.sweep.sweepRadians * arcB.sweep.sweepRadians) < 0;
197495
- const sweepB = _AngleSweep__WEBPACK_IMPORTED_MODULE_4__.AngleSweep.createStartEndRadians(betaStartRadians, betaEndRadians);
197520
+ const sweepB = _AngleSweep__WEBPACK_IMPORTED_MODULE_5__.AngleSweep.createStartEndRadians(betaStartRadians, betaEndRadians);
197496
197521
  const sweepA = arcA.sweep;
197497
197522
  const fractionPeriodA = sweepA.fractionPeriod();
197498
- const fractionB0 = sweepA.radiansToPositivePeriodicFraction(sweepB.startRadians);
197499
- const fractionSweep = sweepB.sweepRadians / sweepA.sweepRadians;
197500
- const fractionB1 = fractionB0 + fractionSweep;
197501
- const fractionSweepB = _Segment1d__WEBPACK_IMPORTED_MODULE_3__.Segment1d.create(fractionB0, fractionB1);
197502
- if (fractionSweepB.clampDirectedTo01())
197503
- result = this.appendDetailPair(result, this.createDetailPair(arcA, arcB, fractionSweepB, fractionB0, fractionB1, fractionSpacesReversed));
197504
- if (fractionB1 > fractionPeriodA) {
197505
- const fractionSweepBWrap = _Segment1d__WEBPACK_IMPORTED_MODULE_3__.Segment1d.create(fractionB0 - fractionPeriodA, fractionB1 - fractionPeriodA);
197506
- if (fractionSweepBWrap.clampDirectedTo01())
197507
- result = this.appendDetailPair(result, this.createDetailPair(arcA, arcB, fractionSweepBWrap, fractionB0, fractionB1, fractionSpacesReversed));
197508
- }
197523
+ const fractionB0 = sweepA.radiansToPositivePeriodicFraction(sweepB.startRadians); // arcB start in arcA fraction space
197524
+ (0,_itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__.assert)(fractionB0 >= 0.0);
197525
+ const fractionSweep = sweepB.sweepRadians / sweepA.sweepRadians; // arcB sweep in arcA fraction space
197526
+ const fractionB1 = fractionB0 + fractionSweep; // arcB end in arcA fraction space
197527
+ const fractionSweepB = _Segment1d__WEBPACK_IMPORTED_MODULE_4__.Segment1d.create(fractionB0, fractionB1);
197528
+ /** lambda to add a coincident interval or isolated intersection, given inputs in arcA fraction space
197529
+ * @param arcBInArcAFractionSpace span of arcB in arcA fraction space. On return, clamped to [0,1] if nontrivial.
197530
+ * @param testStartOfArcA if no nontrivial coincident interval was found, look for an isolated intersection at the start (true) or end (false) of arcA
197531
+ * @returns whether a detail pair was appended to result
197532
+ */
197533
+ const appendCoincidentIntersection = (arcBInArcAFractionSpace, testStartOfArcA) => {
197534
+ const size = result ? result.length : 0;
197535
+ const arcBStart = arcBInArcAFractionSpace.x0;
197536
+ const arcBEnd = arcBInArcAFractionSpace.x1;
197537
+ if (arcBInArcAFractionSpace.clampDirectedTo01() && !_Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isSmallRelative(arcBInArcAFractionSpace.absoluteDelta())) {
197538
+ result = this.appendDetailPair(result, this.createDetailPair(arcA, arcB, arcBInArcAFractionSpace, arcBStart, arcBEnd, fractionSpacesReversed));
197539
+ }
197540
+ else { // test isolated intersection
197541
+ const testStartOfArcB = fractionSpacesReversed ? testStartOfArcA : !testStartOfArcA;
197542
+ const arcAPt = this._point0 = testStartOfArcA ? arcA.startPoint(this._point0) : arcA.endPoint(this._point0);
197543
+ const arcBPt = this._point1 = testStartOfArcB ? arcB.startPoint(this._point1) : arcB.endPoint(this._point1);
197544
+ if (arcAPt.isAlmostEqual(arcBPt, this.tolerance)) {
197545
+ const detailA = _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetail.createCurveFractionPoint(arcA, testStartOfArcA ? 0 : 1, arcAPt);
197546
+ const detailB = _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetail.createCurveFractionPoint(arcB, testStartOfArcB ? 0 : 1, arcBPt);
197547
+ result = this.appendDetailPair(result, _curve_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_3__.CurveLocationDetailPair.createCapture(detailA, detailB));
197548
+ }
197549
+ }
197550
+ return result !== undefined && result.length > size;
197551
+ };
197552
+ appendCoincidentIntersection(fractionSweepB, false); // compute overlap in strict interior, or at end of arcA
197553
+ // check overlap at start of arcA with a periodic shift of fractionSweepB
197554
+ if (fractionB1 >= fractionPeriodA)
197555
+ appendCoincidentIntersection(_Segment1d__WEBPACK_IMPORTED_MODULE_4__.Segment1d.create(fractionB0 - fractionPeriodA, fractionB1 - fractionPeriodA), true);
197556
+ else if (fractionB0 === 0.0)
197557
+ appendCoincidentIntersection(_Segment1d__WEBPACK_IMPORTED_MODULE_4__.Segment1d.create(fractionB0 + fractionPeriodA, fractionB1 + fractionPeriodA), true);
197509
197558
  }
197510
197559
  }
197511
197560
  }
@@ -204391,7 +204440,7 @@ class Matrix3d {
204391
204440
  * almost independent and matrix is invertible).
204392
204441
  */
204393
204442
  conditionNumber() {
204394
- const determinant = this.determinant();
204443
+ const determinant = Math.abs(this.determinant());
204395
204444
  const columnMagnitudeSum = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[3], this.coffs[6])
204396
204445
  + _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.hypotenuseXYZ(this.coffs[1], this.coffs[4], this.coffs[7])
204397
204446
  + _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.hypotenuseXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);
@@ -249353,6 +249402,7 @@ class HalfEdgeGraphOps {
249353
249402
  }
249354
249403
  }
249355
249404
  /**
249405
+ * Note: this class uses hardcoded micrometer coordinate/cluster tolerance throughout.
249356
249406
  * @internal
249357
249407
  */
249358
249408
  class HalfEdgeGraphMerge {
@@ -282312,7 +282362,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
282312
282362
  /***/ ((module) => {
282313
282363
 
282314
282364
  "use strict";
282315
- module.exports = JSON.parse('{"name":"@itwin/core-frontend","version":"4.0.0-dev.100","description":"iTwin.js frontend components","main":"lib/cjs/core-frontend.js","module":"lib/esm/core-frontend.js","typings":"lib/cjs/core-frontend","license":"MIT","scripts":{"build":"npm run -s copy:public && npm run -s build:cjs && npm run -s build:esm","build:cjs":"npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs","build:esm":"npm run -s copy:js:esm && tsc 1>&2 --module ES2020 --outDir lib/esm","clean":"rimraf lib .rush/temp/package-deps*.json","copy:public":"cpx \\"./src/public/**/*\\" ./lib/public","copy:js:cjs":"cpx \\"./src/**/*.js\\" ./lib/cjs","copy:js:esm":"cpx \\"./src/**/*.js\\" ./lib/esm","docs":"betools docs --includes=../../generated-docs/extract --json=../../generated-docs/core/core-frontend/file.json --tsIndexFile=./core-frontend.ts --onlyJson --excludes=webgl/**/*,**/primitives,**/map/*.d.ts,**/tile/*.d.ts,**/*-css.ts","extract-api":"betools extract-api --entry=core-frontend && npm run extract-extension-api","extract-extension-api":"eslint --no-eslintrc -c \\"./node_modules/@itwin/eslint-plugin/dist/configs/extension-exports-config.js\\" \\"./src/**/*.ts\\" 1>&2","lint":"eslint -f visualstudio \\"./src/**/*.ts\\" 1>&2","pseudolocalize":"betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO","test":"npm run -s webpackTests && certa -r chrome","cover":"npm -s test","test:debug":"certa -r chrome --debug","webpackTests":"webpack --config ./src/test/utils/webpack.config.js 1>&2"},"repository":{"type":"git","url":"https://github.com/iTwin/itwinjs-core.git","directory":"core/frontend"},"keywords":["Bentley","BIM","iModel","digital-twin","iTwin"],"author":{"name":"Bentley Systems, Inc.","url":"http://www.bentley.com"},"peerDependencies":{"@itwin/appui-abstract":"workspace:^4.0.0-dev.100","@itwin/core-bentley":"workspace:^4.0.0-dev.100","@itwin/core-common":"workspace:^4.0.0-dev.100","@itwin/core-geometry":"workspace:^4.0.0-dev.100","@itwin/core-orbitgt":"workspace:^4.0.0-dev.100","@itwin/core-quantity":"workspace:^4.0.0-dev.100"},"//devDependencies":["NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install","NOTE: All tools used by scripts in this package must be listed as devDependencies"],"devDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/build-tools":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/certa":"workspace:*","@itwin/eslint-plugin":"^4.0.0-dev.33","@types/chai":"4.3.1","@types/chai-as-promised":"^7","@types/mocha":"^8.2.2","@types/node":"^18.11.5","@types/sinon":"^9.0.0","babel-loader":"~8.2.5","babel-plugin-istanbul":"~6.1.1","chai":"^4.1.2","chai-as-promised":"^7","cpx2":"^3.0.0","eslint":"^8.36.0","glob":"^7.1.2","mocha":"^10.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.0.2","source-map-loader":"^4.0.0","typescript":"~5.0.2","webpack":"^5.76.0"},"//dependencies":["NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API","NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"],"dependencies":{"@itwin/object-storage-azure":"^1.5.0","@itwin/cloud-agnostic-core":"^1.5.0","@itwin/object-storage-core":"^1.5.0","@itwin/core-i18n":"workspace:*","@itwin/core-telemetry":"workspace:*","@itwin/webgl-compatibility":"workspace:*","@loaders.gl/core":"^3.1.6","@loaders.gl/draco":"^3.1.6","fuse.js":"^3.3.0","wms-capabilities":"0.4.0","reflect-metadata":"0.1.13"},"nyc":{"extends":"./node_modules/@itwin/build-tools/.nycrc"},"eslintConfig":{"plugins":["@itwin"],"extends":"plugin:@itwin/itwinjs-recommended","rules":{"@itwin/no-internal-barrel-imports":["error",{"required-barrel-modules":["./src/tile/internal.ts"]}],"@itwin/public-extension-exports":["error",{"releaseTags":["public","preview"],"outputApiFile":false}]},"overrides":[{"files":["*.test.ts","*.test.tsx","**/test/**/*.ts"],"rules":{"@itwin/no-internal-barrel-imports":"off"}}]}}');
282365
+ module.exports = JSON.parse('{"name":"@itwin/core-frontend","version":"4.0.0-dev.102","description":"iTwin.js frontend components","main":"lib/cjs/core-frontend.js","module":"lib/esm/core-frontend.js","typings":"lib/cjs/core-frontend","license":"MIT","scripts":{"build":"npm run -s copy:public && npm run -s build:cjs && npm run -s build:esm","build:cjs":"npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs","build:esm":"npm run -s copy:js:esm && tsc 1>&2 --module ES2020 --outDir lib/esm","clean":"rimraf lib .rush/temp/package-deps*.json","copy:public":"cpx \\"./src/public/**/*\\" ./lib/public","copy:js:cjs":"cpx \\"./src/**/*.js\\" ./lib/cjs","copy:js:esm":"cpx \\"./src/**/*.js\\" ./lib/esm","docs":"betools docs --includes=../../generated-docs/extract --json=../../generated-docs/core/core-frontend/file.json --tsIndexFile=./core-frontend.ts --onlyJson --excludes=webgl/**/*,**/primitives,**/map/*.d.ts,**/tile/*.d.ts,**/*-css.ts","extract-api":"betools extract-api --entry=core-frontend && npm run extract-extension-api","extract-extension-api":"eslint --no-eslintrc -c \\"./node_modules/@itwin/eslint-plugin/dist/configs/extension-exports-config.js\\" \\"./src/**/*.ts\\" 1>&2","lint":"eslint -f visualstudio \\"./src/**/*.ts\\" 1>&2","pseudolocalize":"betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO","test":"npm run -s webpackTests && certa -r chrome","cover":"npm -s test","test:debug":"certa -r chrome --debug","webpackTests":"webpack --config ./src/test/utils/webpack.config.js 1>&2"},"repository":{"type":"git","url":"https://github.com/iTwin/itwinjs-core.git","directory":"core/frontend"},"keywords":["Bentley","BIM","iModel","digital-twin","iTwin"],"author":{"name":"Bentley Systems, Inc.","url":"http://www.bentley.com"},"peerDependencies":{"@itwin/appui-abstract":"workspace:^4.0.0-dev.102","@itwin/core-bentley":"workspace:^4.0.0-dev.102","@itwin/core-common":"workspace:^4.0.0-dev.102","@itwin/core-geometry":"workspace:^4.0.0-dev.102","@itwin/core-orbitgt":"workspace:^4.0.0-dev.102","@itwin/core-quantity":"workspace:^4.0.0-dev.102"},"//devDependencies":["NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install","NOTE: All tools used by scripts in this package must be listed as devDependencies"],"devDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/build-tools":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/certa":"workspace:*","@itwin/eslint-plugin":"^4.0.0-dev.33","@types/chai":"4.3.1","@types/chai-as-promised":"^7","@types/mocha":"^8.2.2","@types/node":"^18.11.5","@types/sinon":"^9.0.0","babel-loader":"~8.2.5","babel-plugin-istanbul":"~6.1.1","chai":"^4.1.2","chai-as-promised":"^7","cpx2":"^3.0.0","eslint":"^8.36.0","glob":"^7.1.2","mocha":"^10.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.0.2","source-map-loader":"^4.0.0","typescript":"~5.0.2","webpack":"^5.76.0"},"//dependencies":["NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API","NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"],"dependencies":{"@itwin/object-storage-azure":"^1.5.0","@itwin/cloud-agnostic-core":"^1.5.0","@itwin/object-storage-core":"^1.5.0","@itwin/core-i18n":"workspace:*","@itwin/core-telemetry":"workspace:*","@itwin/webgl-compatibility":"workspace:*","@loaders.gl/core":"^3.1.6","@loaders.gl/draco":"^3.1.6","fuse.js":"^3.3.0","wms-capabilities":"0.4.0","reflect-metadata":"0.1.13"},"nyc":{"extends":"./node_modules/@itwin/build-tools/.nycrc"},"eslintConfig":{"plugins":["@itwin"],"extends":"plugin:@itwin/itwinjs-recommended","rules":{"@itwin/no-internal-barrel-imports":["error",{"required-barrel-modules":["./src/tile/internal.ts"]}],"@itwin/public-extension-exports":["error",{"releaseTags":["public","preview"],"outputApiFile":false}]},"overrides":[{"files":["*.test.ts","*.test.tsx","**/test/**/*.ts"],"rules":{"@itwin/no-internal-barrel-imports":"off"}}]}}');
282316
282366
 
282317
282367
  /***/ })
282318
282368