@itwin/core-geometry 4.0.0-dev.36 → 4.0.0-dev.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/lib/cjs/Geometry.d.ts +28 -12
  2. package/lib/cjs/Geometry.d.ts.map +1 -1
  3. package/lib/cjs/Geometry.js +33 -17
  4. package/lib/cjs/Geometry.js.map +1 -1
  5. package/lib/cjs/curve/Loop.d.ts.map +1 -1
  6. package/lib/cjs/curve/Loop.js +6 -0
  7. package/lib/cjs/curve/Loop.js.map +1 -1
  8. package/lib/cjs/curve/RegionOps.d.ts +8 -9
  9. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  10. package/lib/cjs/curve/RegionOps.js +8 -9
  11. package/lib/cjs/curve/RegionOps.js.map +1 -1
  12. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  13. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +2 -0
  14. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  15. package/lib/cjs/geometry3d/Matrix3d.d.ts +137 -89
  16. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  17. package/lib/cjs/geometry3d/Matrix3d.js +244 -155
  18. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  19. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +15 -15
  20. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  21. package/lib/cjs/geometry3d/Point3dVector3d.js +16 -19
  22. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  23. package/lib/cjs/geometry3d/PolygonOps.d.ts +7 -9
  24. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  25. package/lib/cjs/geometry3d/PolygonOps.js +7 -9
  26. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  27. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +3 -0
  28. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  29. package/lib/cjs/polyface/PolyfaceBuilder.js +7 -0
  30. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  31. package/lib/cjs/serialization/GeometrySamples.d.ts +4 -5
  32. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  33. package/lib/cjs/serialization/GeometrySamples.js +12 -13
  34. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  35. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  36. package/lib/cjs/solid/SweepContour.js +7 -0
  37. package/lib/cjs/solid/SweepContour.js.map +1 -1
  38. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +2 -1
  39. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  40. package/lib/cjs/topology/HalfEdgeGraphSearch.js +1 -0
  41. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  42. package/lib/esm/Geometry.d.ts +28 -12
  43. package/lib/esm/Geometry.d.ts.map +1 -1
  44. package/lib/esm/Geometry.js +33 -17
  45. package/lib/esm/Geometry.js.map +1 -1
  46. package/lib/esm/curve/Loop.d.ts.map +1 -1
  47. package/lib/esm/curve/Loop.js +6 -0
  48. package/lib/esm/curve/Loop.js.map +1 -1
  49. package/lib/esm/curve/RegionOps.d.ts +8 -9
  50. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  51. package/lib/esm/curve/RegionOps.js +8 -9
  52. package/lib/esm/curve/RegionOps.js.map +1 -1
  53. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  54. package/lib/esm/curve/RegionOpsClassificationSweeps.js +2 -0
  55. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  56. package/lib/esm/geometry3d/Matrix3d.d.ts +137 -89
  57. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  58. package/lib/esm/geometry3d/Matrix3d.js +244 -155
  59. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  60. package/lib/esm/geometry3d/Point3dVector3d.d.ts +15 -15
  61. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  62. package/lib/esm/geometry3d/Point3dVector3d.js +16 -19
  63. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  64. package/lib/esm/geometry3d/PolygonOps.d.ts +7 -9
  65. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  66. package/lib/esm/geometry3d/PolygonOps.js +7 -9
  67. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  68. package/lib/esm/polyface/PolyfaceBuilder.d.ts +3 -0
  69. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  70. package/lib/esm/polyface/PolyfaceBuilder.js +7 -0
  71. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  72. package/lib/esm/serialization/GeometrySamples.d.ts +4 -5
  73. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  74. package/lib/esm/serialization/GeometrySamples.js +12 -13
  75. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  76. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  77. package/lib/esm/solid/SweepContour.js +7 -0
  78. package/lib/esm/solid/SweepContour.js.map +1 -1
  79. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +2 -1
  80. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  81. package/lib/esm/topology/HalfEdgeGraphSearch.js +1 -0
  82. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  83. package/package.json +3 -3
@@ -272,15 +272,14 @@ export declare class RegionOps {
272
272
  */
273
273
  static consolidateAdjacentPrimitives(curves: CurveCollection, options?: ConsolidateAdjacentCurvePrimitivesOptions): void;
274
274
  /**
275
- * If reverse loops as necessary to make them all have CCW orientation for given outward normal.
276
- * * Return an array of arrays which capture the input pointers.
277
- * * In each first level array:
278
- * * The first loop is an outer loop.
279
- * * all subsequent loops are holes
280
- * * The outer loop is CCW
281
- * * The holes are CW.
282
- * * Call PolygonOps.sortOuterAndHoleLoopsXY to have the result returned as an array of arrays of polygons.
283
- * @param loops multiple loops to sort and reverse.
275
+ * Reverse and reorder loops in the xy-plane for consistency and containment.
276
+ * @param loops multiple loops in any order and orientation, z-coordinates ignored
277
+ * @returns a region that captures the input pointers. This region is a:
278
+ * * `Loop` if there is exactly one input loop. It is oriented counterclockwise.
279
+ * * `ParityRegion` if input consists of exactly one outer loop with at least one hole loop.
280
+ * Its first child is an outer loop oriented counterclockwise; all subsequent children are holes oriented clockwise.
281
+ * * `UnionRegion` if any other input configuration. Its children are individually ordered/oriented as in the above cases.
282
+ * @see PolygonOps.sortOuterAndHoleLoopsXY
284
283
  */
285
284
  static sortOuterAndHoleLoopsXY(loops: Array<Loop | IndexedXYZCollection>): AnyRegion;
286
285
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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"}
@@ -532,15 +532,14 @@ class RegionOps {
532
532
  curves.dispatchToGeometryHandler(context);
533
533
  }
534
534
  /**
535
- * If reverse loops as necessary to make them all have CCW orientation for given outward normal.
536
- * * Return an array of arrays which capture the input pointers.
537
- * * In each first level array:
538
- * * The first loop is an outer loop.
539
- * * all subsequent loops are holes
540
- * * The outer loop is CCW
541
- * * The holes are CW.
542
- * * Call PolygonOps.sortOuterAndHoleLoopsXY to have the result returned as an array of arrays of polygons.
543
- * @param loops multiple loops to sort and reverse.
535
+ * Reverse and reorder loops in the xy-plane for consistency and containment.
536
+ * @param loops multiple loops in any order and orientation, z-coordinates ignored
537
+ * @returns a region that captures the input pointers. This region is a:
538
+ * * `Loop` if there is exactly one input loop. It is oriented counterclockwise.
539
+ * * `ParityRegion` if input consists of exactly one outer loop with at least one hole loop.
540
+ * Its first child is an outer loop oriented counterclockwise; all subsequent children are holes oriented clockwise.
541
+ * * `UnionRegion` if any other input configuration. Its children are individually ordered/oriented as in the above cases.
542
+ * @see PolygonOps.sortOuterAndHoleLoopsXY
544
543
  */
545
544
  static sortOuterAndHoleLoopsXY(loops) {
546
545
  const loopAndArea = [];
@@ -1 +1 @@
1
- {"version":3,"file":"RegionOps.js","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolylineCompressionContext } from \"../geometry3d/PolylineCompressionByEdgeOffset\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { SortablePolygon } from \"../geometry3d/SortablePolygon\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { MomentData } from \"../geometry4d/MomentData\";\r\nimport { Polyface } from \"../polyface/Polyface\";\r\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../topology/Graph\";\r\nimport { LineStringDataVariant, MultiLineStringDataVariant, Triangulator } from \"../topology/Triangulation\";\r\nimport { ChainCollectorContext } from \"./ChainCollectorContext\";\r\nimport { AnyCurve, AnyRegion } from \"./CurveChain\";\r\nimport { BagOfCurves, ConsolidateAdjacentCurvePrimitivesOptions, CurveChain, CurveCollection } from \"./CurveCollection\";\r\nimport { CurveCurve } from \"./CurveCurve\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { CurveWireMomentsXYZ } from \"./CurveWireMomentsXYZ\";\r\nimport { CurveChainWireOffsetContext, JointOptions, OffsetOptions, PolygonWireOffsetContext } from \"./internalContexts/PolygonOffsetContext\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { Loop, SignedLoops } from \"./Loop\";\r\nimport { Path } from \"./Path\";\r\nimport { ConsolidateAdjacentCurvePrimitivesContext } from \"./Query/ConsolidateAdjacentPrimitivesContext\";\r\nimport { CurveSplitContext } from \"./Query/CurveSplitContext\";\r\nimport { PointInOnOutContext } from \"./Query/InOutTests\";\r\nimport { PlanarSubdivision } from \"./Query/PlanarSubdivision\";\r\nimport { RegionMomentsXY } from \"./RegionMomentsXY\";\r\nimport { OffsetHelpers } from \"./internalContexts/MultiChainCollector\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { RegionBooleanContext, RegionGroupOpType, RegionOpsFaceToFaceSearch } from \"./RegionOpsClassificationSweeps\";\r\nimport { UnionRegion } from \"./UnionRegion\";\r\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\n/**\r\n * Possible return types from\r\n * @public\r\n */\r\nexport type ChainTypes = CurvePrimitive | Path | BagOfCurves | Loop | undefined;\r\n\r\n/**\r\n * * `properties` is a string with special characters indicating\r\n * * \"U\" -- contains unmerged stick data\r\n * * \"M\" -- merged\r\n * * \"R\" -- regularized\r\n * * \"X\" -- has exterior markup\r\n * @internal\r\n */\r\nexport type GraphCheckPointFunction = (name: string, graph: HalfEdgeGraph, properties: string, extraData?: any) => any;\r\n/**\r\n * Enumeration of the binary operation types for a booleans among regions\r\n * @public\r\n */\r\nexport enum RegionBinaryOpType {\r\n Union = 0,\r\n Parity = 1,\r\n Intersection = 2,\r\n AMinusB = 3,\r\n BMinusA = 4,\r\n}\r\n\r\n/**\r\n * class `RegionOps` has static members for calculations on regions (areas).\r\n * * Regions are represented by these `CurveCollection` subclasses:\r\n * * `Loop` -- a single loop\r\n * * `ParityRegion` -- a collection of loops, interpreted by parity rules.\r\n * * The common \"One outer loop and many Inner loops\" is a parity region.\r\n * * `UnionRegion` -- a collection of `Loop` and `ParityRegion` objects understood as a (probably disjoint) union.\r\n * @beta\r\n */\r\nexport class RegionOps {\r\n /**\r\n * Return moment sums for a loop, parity region, or union region.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYAreaMoments(root: AnyRegion): MomentData | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /** Return an area tolerance for a given xy-range and optional distance tolerance.\r\n * @param range range of planar region to tolerance\r\n * @param distanceTolerance optional absolute distance tolerance\r\n */\r\n public static computeXYAreaTolerance(range: Range3d, distanceTolerance: number=Geometry.smallMetricDistance): number {\r\n // if A = bh and e is distance tolerance, then A' := (b+e/2)(h+e/2) = A + e/2(b+h+e/2), so A'-A = e/2(b+h+e/2).\r\n const halfDistTol = 0.5 * distanceTolerance;\r\n return halfDistTol * (range.xLength() + range.yLength() + halfDistTol);\r\n }\r\n /**\r\n * Return an xy area for a loop, parity region, or union region.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYArea(root: AnyRegion): number | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n return result.quantitySum;\r\n }\r\n return undefined;\r\n }\r\n /** Return MomentData with the sums of wire moments.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n */\r\n public static computeXYZWireMomentSums(root: AnyCurve): MomentData | undefined {\r\n const handler = new CurveWireMomentsXYZ();\r\n handler.visitLeaves(root);\r\n const result = handler.momentData;\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n\r\n /**\r\n * * create loops in the graph.\r\n * @internal\r\n */\r\n public static addLoopsToGraph(graph: HalfEdgeGraph, data: MultiLineStringDataVariant, announceIsolatedLoop: (graph: HalfEdgeGraph, seed: HalfEdge) => void) {\r\n if (data instanceof Loop) {\r\n const points = data.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n } else if (data instanceof ParityRegion) {\r\n for (const child of data.children) {\r\n const points = child.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n }\r\n } else if (data instanceof IndexedXYZCollection) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n } else if (Array.isArray(data)) {\r\n if (data.length > 0) {\r\n if (Point3d.isAnyImmediatePointType(data[0])) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data as LineStringDataVariant);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n\r\n } else if (data[0] instanceof IndexedXYZCollection) {\r\n for (const loop of data) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, loop as IndexedXYZCollection);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n }\r\n } else {\r\n for (const child of data) {\r\n if (Array.isArray(child))\r\n this.addLoopsToGraph(graph, child as MultiLineStringDataVariant, announceIsolatedLoop);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Add multiple loops to a graph.\r\n * * Apply edgeTag and mask to each edge.\r\n * @internal\r\n */\r\n public static addLoopsWithEdgeTagToGraph(graph: HalfEdgeGraph, data: MultiLineStringDataVariant, mask: HalfEdgeMask, edgeTag: any): HalfEdge[] | undefined {\r\n const loopSeeds: HalfEdge[] = [];\r\n this.addLoopsToGraph(graph, data, (_graph: HalfEdgeGraph, seed: HalfEdge) => {\r\n if (seed) {\r\n loopSeeds.push(seed);\r\n seed.setMaskAndEdgeTagAroundFace(mask, edgeTag, true);\r\n }\r\n });\r\n if (loopSeeds.length > 0)\r\n return loopSeeds;\r\n return undefined;\r\n }\r\n /**\r\n * Given a graph just produced by booleans, convert to a polyface\r\n * * \"just produced\" implies exterior face markup.\r\n *\r\n * @param graph\r\n * @param triangulate\r\n */\r\n private static finishGraphToPolyface(graph: HalfEdgeGraph | undefined, triangulate: boolean): Polyface | undefined {\r\n if (graph) {\r\n if (triangulate) {\r\n Triangulator.triangulateAllPositiveAreaFaces(graph);\r\n Triangulator.flipTriangles(graph);\r\n }\r\n return PolyfaceBuilder.graphToPolyface(graph);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * return a polyface containing the area union of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonXYAreaIntersectLoopsToPolyface(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB,\r\n (inA: boolean, inB: boolean) => (inA && inB),\r\n this._graphCheckPointFunction);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n\r\n /**\r\n * return a polyface containing the area union of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonXYAreaUnionLoopsToPolyface(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB,\r\n (inA: boolean, inB: boolean) => (inA || inB),\r\n this._graphCheckPointFunction);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * return a polyface containing the area difference of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonXYAreaDifferenceLoopsToPolyface(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB,\r\n (inA: boolean, inB: boolean) => (inA && !inB),\r\n this._graphCheckPointFunction);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n\r\n /**\r\n * return areas defined by a boolean operation.\r\n * * If there are multiple regions in loopsA, they are treated as a union.\r\n * * If there are multiple regions in loopsB, they are treated as a union.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param mergeTolerance absolute distance tolerance for merging loops\r\n * @alpha\r\n */\r\n public static regionBooleanXY(loopsA: AnyRegion | AnyRegion[] | undefined, loopsB: AnyRegion | AnyRegion[] | undefined, operation: RegionBinaryOpType, mergeTolerance: number = Geometry.smallMetricDistance): AnyRegion | undefined {\r\n const result = UnionRegion.create();\r\n const context = RegionBooleanContext.create(RegionGroupOpType.Union, RegionGroupOpType.Union);\r\n context.addMembers(loopsA, loopsB);\r\n context.annotateAndMergeCurvesInGraph(mergeTolerance);\r\n const range = context.groupA.range().union(context.groupB.range());\r\n const areaTol = this.computeXYAreaTolerance(range);\r\n context.runClassificationSweep(operation, (_graph: HalfEdgeGraph, face: HalfEdge, faceType: -1 | 0 | 1, area: number) => {\r\n // ignore danglers and null faces, but not 2-edge \"banana\" faces with nonzero area\r\n if (face.countEdgesAroundFace() < 2)\r\n return;\r\n if (Math.abs(area) < areaTol)\r\n return;\r\n if (faceType === 1) {\r\n const loop = PlanarSubdivision.createLoopInFace(face);\r\n if (loop)\r\n result.tryAddChild(loop);\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * return a polyface whose facets area a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonBooleanXYToPolyface(inputA: MultiLineStringDataVariant[], operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[], triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA, RegionGroupOpType.Union,\r\n operation,\r\n inputB, RegionGroupOpType.Union, true);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * return loops of linestrings around areas of a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonBooleanXYToLoops(\r\n inputA: MultiLineStringDataVariant[],\r\n operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[]): AnyRegion | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA, RegionGroupOpType.Union,\r\n operation,\r\n inputB, RegionGroupOpType.Union, true);\r\n if (!graph)\r\n return undefined;\r\n const loopEdges = HalfEdgeGraphSearch.collectExtendedBoundaryLoopsInGraph(graph, HalfEdgeMask.EXTERIOR);\r\n const allLoops: Loop[] = [];\r\n for (const graphLoop of loopEdges) {\r\n const points = new GrowableXYZArray();\r\n for (const edge of graphLoop)\r\n points.pushXYZ(edge.x, edge.y, edge.z);\r\n points.pushWrap(1);\r\n const loop = Loop.create();\r\n loop.tryAddChild(LineString3d.createCapture(points));\r\n allLoops.push(loop);\r\n }\r\n return RegionOps.sortOuterAndHoleLoopsXY(allLoops);\r\n }\r\n\r\n /** Construct a wire (not area!!) that is offset from given polyline or polygon.\r\n * * This is a simple wire offset, not an area.\r\n * * The construction algorithm attempts to eliminate some self-intersections within the offsets, but does not guarantee a simple area offset.\r\n * * The construction algorithm is subject to being changed, resulting in different (hopefully better) self-intersection behavior on the future.\r\n * @param points a single loop or path\r\n * @param wrap true to include wraparound\r\n * @param offsetDistance distance of offset from wire. Positive is left.\r\n */\r\n public static constructPolygonWireXYOffset(points: Point3d[], wrap: boolean, offsetDistance: number): CurveCollection | undefined {\r\n const context = new PolygonWireOffsetContext();\r\n return context.constructPolygonWireXYOffset(points, wrap, offsetDistance);\r\n }\r\n /**\r\n * Construct curves that are offset from a Path or Loop as viewed in xy-plane (ignoring z).\r\n * * The construction will remove \"some\" local effects of features smaller than the offset distance, but will not detect self intersection among widely separated edges.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * When the offset needs to do an \"outside\" turn, the first applicable construction is applied:\r\n * * If the turn is larger than `options.minArcDegrees`, a circular arc is constructed.\r\n * * If the turn is less than or equal to `options.maxChamferTurnDegrees`, extend curves along tangent to single intersection point.\r\n * * If the turn is larger than `options.maxChamferDegrees`, the turn is constructed as a sequence of straight lines that are:\r\n * * outside the arc\r\n * * have uniform turn angle less than `options.maxChamferDegrees`\r\n * * each line segment (except first and last) touches the arc at its midpoint.\r\n * @param curves base curves.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object.\r\n */\r\n public static constructCurveXYOffset(curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions): CurveCollection | undefined {\r\n return CurveChainWireOffsetContext.constructCurveXYOffset(curves, offsetDistanceOrOptions);\r\n }\r\n /**\r\n * Test if point (x,y) is IN, OUT or ON a polygon.\r\n * @return (1) for in, (-1) for OUT, (0) for ON\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @param points array of xy coordinates.\r\n */\r\n public static testPointInOnOutRegionXY(curves: AnyRegion, x: number, y: number): number {\r\n return PointInOnOutContext.testPointInOnOutRegionXY(curves, x, y);\r\n }\r\n /** Create curve collection of subtype determined by gaps between the input curves.\r\n * * If (a) wrap is requested and (b) all curves connect head-to-tail (including wraparound), assemble as a `loop`.\r\n * * If all curves connect head-to-tail except for closure, return a `Path`.\r\n * * If there are internal gaps, return a `BagOfCurves`\r\n * * If input array has zero length, return undefined.\r\n */\r\n public static createLoopPathOrBagOfCurves(curves: CurvePrimitive[], wrap: boolean = true, consolidateAdjacentPrimitives: boolean = false): CurveCollection | undefined {\r\n const n = curves.length;\r\n if (n === 0)\r\n return undefined;\r\n let maxGap = 0.0;\r\n let isPath = false;\r\n if (wrap)\r\n maxGap = Geometry.maxXY(maxGap, curves[0].startPoint().distance(curves[n - 1].endPoint()));\r\n for (let i = 0; i + 1 < n; i++)\r\n maxGap = Geometry.maxXY(maxGap, curves[i].endPoint().distance(curves[i + 1].startPoint()));\r\n let collection: Loop | Path | BagOfCurves;\r\n if (Geometry.isSmallMetricDistance(maxGap)) {\r\n collection = wrap ? Loop.create() : Path.create();\r\n isPath = true;\r\n } else {\r\n collection = BagOfCurves.create();\r\n }\r\n for (const c of curves)\r\n collection.tryAddChild(c);\r\n if (isPath && consolidateAdjacentPrimitives)\r\n RegionOps.consolidateAdjacentPrimitives(collection);\r\n return collection;\r\n }\r\n\r\n private static _graphCheckPointFunction?: GraphCheckPointFunction;\r\n /**\r\n * Announce Checkpoint function for use during booleans\r\n * @internal\r\n */\r\n public static setCheckPointFunction(f?: GraphCheckPointFunction) { this._graphCheckPointFunction = f; }\r\n /**\r\n * * Find all intersections among curves in `curvesToCut` and `cutterCurves`\r\n * * Return fragments of `curvesToCut`.\r\n * * For a `Loop`, `ParityRegion`, or `UnionRegion` in `curvesToCut`\r\n * * if it is never cut by any `cutter` curve, it will be left unchanged.\r\n * * if cut, the input is downgraded to a set of `Path` curves joining at the cut points.\r\n * * All cutting is \"as viewed in the xy plane\"\r\n */\r\n public static cloneCurvesWithXYSplitFlags(curvesToCut: CurvePrimitive | CurveCollection | undefined, cutterCurves: CurveCollection): CurveCollection | CurvePrimitive | undefined {\r\n return CurveSplitContext.cloneCurvesWithXYSplitFlags(curvesToCut, cutterCurves);\r\n\r\n }\r\n /**\r\n * Create paths assembled from many curves.\r\n * * Assemble consecutive curves NOT separated by either end flags or gaps into paths.\r\n * * Return simplest form -- single primitive, single path, or bag of curves.\r\n * @param curves\r\n */\r\n public static splitToPathsBetweenFlagBreaks(source: CurveCollection | CurvePrimitive | undefined,\r\n makeClones: boolean): BagOfCurves | Path | CurvePrimitive | Loop | undefined {\r\n if (source === undefined)\r\n return undefined;\r\n if (source instanceof CurvePrimitive)\r\n return source;\r\n // source is a collection . ..\r\n const primitives = source.collectCurvePrimitives();\r\n const chainCollector = new ChainCollectorContext(makeClones);\r\n for (const primitive of primitives) {\r\n chainCollector.announceCurvePrimitive(primitive);\r\n }\r\n return chainCollector.grabResult();\r\n }\r\n /**\r\n * * Restructure curve fragments as chains and offsets\r\n * * Return object with named chains, insideOffsets, outsideOffsets\r\n * * BEWARE that if the input is not a loop the classification of outputs is suspect.\r\n * @param fragments fragments to be chained\r\n * @param offsetDistance offset distance.\r\n */\r\n public static collectInsideAndOutsideOffsets(fragments: GeometryQuery[], offsetDistance: number, gapTolerance: number): { insideOffsets: GeometryQuery[], outsideOffsets: GeometryQuery[], chains: ChainTypes } {\r\n return OffsetHelpers.collectInsideAndOutsideOffsets(fragments, offsetDistance, gapTolerance);\r\n }\r\n /**\r\n * * Restructure curve fragments as chains\r\n * * Return the chains, possibly wrapped in BagOfCurves if there multiple chains.\r\n * @param fragments fragments to be chained\r\n * @param offsetDistance offset distance.\r\n */\r\n public static collectChains(fragments: GeometryQuery[], gapTolerance: number = Geometry.smallMetricDistance): ChainTypes {\r\n return OffsetHelpers.collectChains(fragments, gapTolerance);\r\n }\r\n\r\n /**\r\n * * Find intersections of `curvesToCut` with boundaries of `region`.\r\n * * Break `curvesToCut` into parts inside, outside, and coincident.\r\n * * Return all fragments, split among `insideParts`, `outsideParts`, and `coincidentParts` in the output object.\r\n */\r\n public static splitPathsByRegionInOnOutXY(curvesToCut: CurveCollection | CurvePrimitive | undefined, region: AnyRegion): { insideParts: AnyCurve[], outsideParts: AnyCurve[], coincidentParts: AnyCurve[] } {\r\n const result = { insideParts: [], outsideParts: [], coincidentParts: [] };\r\n const pathWithIntersectionMarkup = RegionOps.cloneCurvesWithXYSplitFlags(curvesToCut, region);\r\n const splitPaths = RegionOps.splitToPathsBetweenFlagBreaks(pathWithIntersectionMarkup, true);\r\n if (splitPaths instanceof CurveCollection) {\r\n for (const child of splitPaths.children) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(child);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(child, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n } else if (splitPaths instanceof CurvePrimitive) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(splitPaths);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(splitPaths, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n return result;\r\n }\r\n /** Test if `data` is one of several forms of a rectangle.\r\n * * If so, return transform with\r\n * * origin at one corner\r\n * * x and y columns extend along two adjacent sides\r\n * * z column is unit normal.\r\n * * The recognized data forms for simple analysis of points are:\r\n * * LineString\r\n * * Loop containing rectangle content\r\n * * Path containing rectangle content\r\n * * Array of Point3d[]\r\n * * IndexedXYZCollection\r\n * * Points are considered a rectangle if\r\n * * Within the first 4 points\r\n * * vectors from 0 to 1 and 0 to 3 are perpendicular and have a non-zero cross product\r\n * * vectors from 0 to 3 and 1 to 2 are the same\r\n * * optionally require a 5th point that closes back to point0\r\n * * If there are other than the basic number of points (4 or 5) the data\r\n */\r\n public static rectangleEdgeTransform(data: AnyCurve | Point3d[] | IndexedXYZCollection, requireClosurePoint: boolean = true): Transform | undefined {\r\n if (data instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.packedPoints);\r\n } else if (data instanceof IndexedXYZCollection) {\r\n let dataToUse;\r\n if (requireClosurePoint && data.length === 5) {\r\n if (!Geometry.isSmallMetricDistance(data.distanceIndexIndex(0, 4)!))\r\n return undefined;\r\n dataToUse = data;\r\n } else if (!requireClosurePoint && data.length === 4)\r\n dataToUse = data;\r\n else if (data.length < (requireClosurePoint ? 5 : 4)) {\r\n return undefined;\r\n } else {\r\n dataToUse = GrowableXYZArray.create(data);\r\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(dataToUse, Geometry.smallMetricDistance);\r\n }\r\n\r\n const vector01 = dataToUse.vectorIndexIndex(0, 1)!;\r\n const vector03 = dataToUse.vectorIndexIndex(0, 3)!;\r\n const vector12 = dataToUse.vectorIndexIndex(1, 2)!;\r\n const normalVector = vector01.crossProduct(vector03);\r\n if (normalVector.normalizeInPlace()\r\n && vector12.isAlmostEqual(vector03)\r\n && vector01.isPerpendicularTo(vector03)) {\r\n return Transform.createOriginAndMatrixColumns(dataToUse.getPoint3dAtUncheckedPointIndex(0), vector01, vector03, normalVector);\r\n }\r\n } else if (Array.isArray(data)) {\r\n return this.rectangleEdgeTransform(new Point3dArrayCarrier(data), requireClosurePoint);\r\n } else if (data instanceof Loop && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, true);\r\n } else if (data instanceof Path && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, requireClosurePoint);\r\n } else if (data instanceof CurveChain) {\r\n if (!data.checkForNonLinearPrimitives()) {\r\n // const linestring = LineString3d.create();\r\n const strokes = data.getPackedStrokes();\r\n if (strokes) {\r\n return this.rectangleEdgeTransform(strokes);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Look for and simplify:\r\n * * Contiguous `LineSegment3d` and `LineString3d` objects.\r\n * * collect all points\r\n * * eliminate duplicated points\r\n * * eliminate points colinear with surrounding points.\r\n * * Contiguous concentric circular or elliptic arcs\r\n * * combine angular ranges\r\n * @param curves Path or loop (or larger collection containing paths and loops) to be simplified\r\n * @param options options for tolerance and selective simplification.\r\n */\r\n public static consolidateAdjacentPrimitives(curves: CurveCollection, options?: ConsolidateAdjacentCurvePrimitivesOptions) {\r\n const context = new ConsolidateAdjacentCurvePrimitivesContext(options);\r\n curves.dispatchToGeometryHandler(context);\r\n }\r\n /**\r\n * If reverse loops as necessary to make them all have CCW orientation for given outward normal.\r\n * * Return an array of arrays which capture the input pointers.\r\n * * In each first level array:\r\n * * The first loop is an outer loop.\r\n * * all subsequent loops are holes\r\n * * The outer loop is CCW\r\n * * The holes are CW.\r\n * * Call PolygonOps.sortOuterAndHoleLoopsXY to have the result returned as an array of arrays of polygons.\r\n * @param loops multiple loops to sort and reverse.\r\n */\r\n public static sortOuterAndHoleLoopsXY(loops: Array<Loop | IndexedXYZCollection>): AnyRegion {\r\n const loopAndArea: SortablePolygon[] = [];\r\n for (const candidate of loops) {\r\n if (candidate instanceof Loop)\r\n SortablePolygon.pushLoop(loopAndArea, candidate);\r\n else if (candidate instanceof IndexedXYZCollection) {\r\n const loop = Loop.createPolygon(candidate);\r\n SortablePolygon.pushLoop(loopAndArea, loop);\r\n }\r\n }\r\n return SortablePolygon.sortAsAnyRegion(loopAndArea);\r\n }\r\n /**\r\n * Find all areas bounded by the unstructured, possibly intersecting curves.\r\n * * In `curvesAndRegions`, Loop/ParityRegion/UnionRegion contribute curve primitives.\r\n * * Each returned [[SignedLoops]] object describes faces in a single connected component.\r\n * * Within the [[SignedLoops]]:\r\n * * positiveAreaLoops contains typical \"interior\" loops with positive area loop ordered counterclockwise\r\n * * negativeAreaLoops contains (probably just one) \"exterior\" loop which is ordered clockwise and\r\n * * slivers contains sliver areas such as appear between coincident curves.\r\n * * edges contains [[LoopCurveLoopCurve]] about each edge within the component. In each edge object\r\n * * loopA = a loop on one side of the edge\r\n * * curveA = a curve that appears as one of loopA.children.\r\n * * loopB = the loop on the other side\r\n * * curveB = a curve that appears as one of loopB.children\r\n * @param curvesAndRegions Any collection of curves.\r\n * @alpha\r\n */\r\n public static constructAllXYRegionLoops(curvesAndRegions: AnyCurve | AnyCurve[]): SignedLoops[] {\r\n const primitivesA = RegionOps.collectCurvePrimitives(curvesAndRegions, undefined, true);\r\n const primitivesB = this.expandLineStrings(primitivesA);\r\n const range = this.curveArrayRange(primitivesB);\r\n const areaTol = this.computeXYAreaTolerance(range);\r\n const intersections = CurveCurve.allIntersectionsAmongPrimitivesXY(primitivesB);\r\n const graph = PlanarSubdivision.assembleHalfEdgeGraph(primitivesB, intersections);\r\n return PlanarSubdivision.collectSignedLoopSetsInHalfEdgeGraph(graph, areaTol);\r\n }\r\n\r\n /**\r\n * collect all `CurvePrimitives` in loosely typed input.\r\n * * This (always) recurses into primitives within collections (Path, Loop, ParityRegion, UnionRegion)\r\n * * It (optionally) recurses to hidden primitives within primitives (i.e. CurveChainWithDistanceIndex)\r\n * * If collectorArray is given, it is NOT cleared -- primitives are appended.\r\n * @param candidates array of various CurvePrimitive and CurveCollection\r\n * @param smallestPossiblePrimitives if false, leave CurveChainWithDistanceIndex as single primitives. If true, recurse to their children.\r\n */\r\n public static collectCurvePrimitives(candidates: AnyCurve | AnyCurve[], collectorArray?: CurvePrimitive[],\r\n smallestPossiblePrimitives: boolean = false,\r\n explodeLinestrings: boolean = false): CurvePrimitive[] {\r\n const results: CurvePrimitive[] = collectorArray === undefined ? [] : collectorArray;\r\n if (candidates instanceof CurvePrimitive) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (candidates instanceof CurveCollection) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (Array.isArray(candidates)) {\r\n for (const c of candidates) {\r\n this.collectCurvePrimitives(c, results, smallestPossiblePrimitives, explodeLinestrings);\r\n }\r\n }\r\n return results;\r\n }\r\n /**\r\n * Copy primitive pointers from candidates to result array.\r\n * * replace LineString3d by individual LineSegment3d.\r\n * * all others unchanged.\r\n * @param candidates\r\n */\r\n public static expandLineStrings(candidates: CurvePrimitive[]): CurvePrimitive[] {\r\n const result: CurvePrimitive[] = [];\r\n for (const c of candidates) {\r\n if (c instanceof LineString3d) {\r\n for (let i = 0; i + 1 < c.packedPoints.length; i++) {\r\n const q = c.getIndexedSegment(i);\r\n if (q !== undefined)\r\n result.push(q);\r\n }\r\n } else {\r\n result.push(c);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return the overall range of given curves.\r\n * @param curves candidate curves\r\n */\r\n public static curveArrayRange(data: any, worldToLocal?: Transform): Range3d {\r\n const range = Range3d.create();\r\n if (data instanceof GeometryQuery)\r\n data.extendRange(range, worldToLocal);\r\n else if (Array.isArray(data)) {\r\n for (const c of data) {\r\n if (c instanceof GeometryQuery)\r\n c.extendRange(range, worldToLocal);\r\n else if (c instanceof Point3d)\r\n range.extendPoint(c, worldToLocal);\r\n else if (c instanceof GrowableXYZArray)\r\n range.extendRange(c.getRange(worldToLocal));\r\n else if (Array.isArray(c))\r\n range.extendRange(this.curveArrayRange(c, worldToLocal));\r\n }\r\n }\r\n return range;\r\n }\r\n}\r\n\r\nfunction pushToInOnOutArrays(curve: AnyCurve, select: number, arrayNegative: AnyCurve[], array0: AnyCurve[], arrayPositive: AnyCurve[]) {\r\n if (select > 0)\r\n arrayPositive.push(curve);\r\n else if (select < 0)\r\n arrayNegative.push(curve);\r\n else\r\n array0.push(curve);\r\n}\r\n"]}
1
+ {"version":3,"file":"RegionOps.js","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,0CAAuC;AACvC,qEAAkE;AAClE,6EAA0E;AAC1E,2EAAwE;AACxE,mEAAwD;AACxD,mGAA2F;AAC3F,+CAA8C;AAC9C,mEAAgE;AAChE,uDAAoD;AACpD,yDAAsD;AAEtD,iEAA8D;AAC9D,6CAA0E;AAC1E,6DAA4G;AAC5G,mEAAgE;AAEhE,uDAAwH;AACxH,6CAA0C;AAC1C,qDAAkD;AAClD,+DAA4D;AAC5D,kFAA6I;AAC7I,iDAA8C;AAC9C,iCAA2C;AAC3C,iCAA8B;AAC9B,uGAAyG;AACzG,iEAA8D;AAC9D,mDAAyD;AACzD,iEAA8D;AAC9D,uDAAoD;AACpD,gFAAuE;AACvE,mDAAgD;AAChD,mFAAqH;AACrH,+CAA4C;AAC5C,yEAAsE;AACtE,iDAA8C;AAgB9C;;;GAGG;AACH,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,6DAAS,CAAA;IACT,+DAAU,CAAA;IACV,2EAAgB,CAAA;IAChB,iEAAW,CAAA;IACX,iEAAW,CAAA;AACb,CAAC,EANW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAM7B;AAED;;;;;;;;GAQG;AACH,MAAa,SAAS;IACpB;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,IAAe;QAChD,MAAM,OAAO,GAAG,IAAI,iCAAe,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,MAAM,YAAY,uBAAU,EAAE;YAChC,MAAM,CAAC,kCAAkC,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC;SACf;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;MAGE;IACK,MAAM,CAAC,sBAAsB,CAAC,KAAc,EAAE,oBAA0B,mBAAQ,CAAC,mBAAmB;QACzG,+GAA+G;QAC/G,MAAM,WAAW,GAAG,GAAG,GAAG,iBAAiB,CAAC;QAC5C,OAAO,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC;IACzE,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,aAAa,CAAC,IAAe;QACzC,MAAM,OAAO,GAAG,IAAI,iCAAe,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,MAAM,YAAY,uBAAU,EAAE;YAChC,OAAO,MAAM,CAAC,WAAW,CAAC;SAC3B;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,wBAAwB,CAAC,IAAc;QACnD,MAAM,OAAO,GAAG,IAAI,yCAAmB,EAAE,CAAC;QAC1C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAClC,MAAM,CAAC,kCAAkC,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,KAAoB,EAAE,IAAgC,EAAE,oBAAoE;QACxJ,IAAI,IAAI,YAAY,WAAI,EAAE;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,MAAM;gBACR,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;SAC7D;aAAM,IAAI,IAAI,YAAY,2BAAY,EAAE;YACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjC,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACxC,IAAI,MAAM;oBACR,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;aAC7D;SACF;aAAM,IAAI,IAAI,YAAY,2CAAoB,EAAE;YAC/C,MAAM,QAAQ,GAAG,4BAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/E,IAAI,QAAQ,KAAK,SAAS;gBACxB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SACzC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,IAAI,yBAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC5C,MAAM,QAAQ,GAAG,4BAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAA6B,CAAC,CAAC;oBACxG,IAAI,QAAQ,KAAK,SAAS;wBACxB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;iBAEzC;qBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,2CAAoB,EAAE;oBAClD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;wBACvB,MAAM,QAAQ,GAAG,4BAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAA4B,CAAC,CAAC;wBACvG,IAAI,QAAQ,KAAK,SAAS;4BACxB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;qBACzC;iBACF;qBAAM;oBACL,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;wBACxB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;4BACtB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAmC,EAAE,oBAAoB,CAAC,CAAC;qBAC1F;iBACF;aACF;SACF;IACH,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,0BAA0B,CAAC,KAAoB,EAAE,IAAgC,EAAE,IAAkB,EAAE,OAAY;QAC/H,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAqB,EAAE,IAAc,EAAE,EAAE;YAC1E,IAAI,IAAI,EAAE;gBACR,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;aACvD;QACH,CAAC,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;OAMG;IACK,MAAM,CAAC,qBAAqB,CAAC,KAAgC,EAAE,WAAoB;QACzF,IAAI,KAAK,EAAE;YACT,IAAI,WAAW,EAAE;gBACf,4BAAY,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;gBACpD,4BAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aACnC;YACD,OAAO,iCAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC/C;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,qCAAqC,CAAC,MAAkC,EAAE,MAAkC,EAAE,cAAuB,KAAK;QACtJ,MAAM,KAAK,GAAG,yDAAyB,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EACrE,CAAC,GAAY,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAC5C,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,iCAAiC,CAAC,MAAkC,EAAE,MAAkC,EAAE,cAAuB,KAAK;QAClJ,MAAM,KAAK,GAAG,yDAAyB,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EACrE,CAAC,GAAY,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAC5C,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,sCAAsC,CAAC,MAAkC,EAAE,MAAkC,EAAE,cAAuB,KAAK;QACvJ,MAAM,KAAK,GAAG,yDAAyB,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EACrE,CAAC,GAAY,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAC7C,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;OASG;IACI,MAAM,CAAC,eAAe,CAAC,MAA2C,EAAE,MAA2C,EAAE,SAA6B,EAAE,iBAAyB,mBAAQ,CAAC,mBAAmB;QAC1M,MAAM,MAAM,GAAG,yBAAW,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,oDAAoB,CAAC,MAAM,CAAC,iDAAiB,CAAC,KAAK,EAAE,iDAAiB,CAAC,KAAK,CAAC,CAAC;QAC9F,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,6BAA6B,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,MAAqB,EAAE,IAAc,EAAE,QAAoB,EAAE,IAAY,EAAE,EAAE;YACtH,kFAAkF;YAClF,IAAI,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC;gBACjC,OAAO;YACT,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO;gBAC1B,OAAO;YACT,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAClB,MAAM,IAAI,GAAG,qCAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACtD,IAAI,IAAI;oBACN,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;aAC5B;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACI,MAAM,CAAC,0BAA0B,CAAC,MAAoC,EAAE,SAA6B,EAC1G,MAAoC,EAAE,cAAuB,KAAK;QAClE,MAAM,KAAK,GAAG,yDAAyB,CAAC,qCAAqC,CAC3E,MAAM,EAAE,iDAAiB,CAAC,KAAK,EAC/B,SAAS,EACT,MAAM,EAAE,iDAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IACD;;;;;;;;;OASG;IACI,MAAM,CAAC,uBAAuB,CACnC,MAAoC,EACpC,SAA6B,EAC7B,MAAoC;QACpC,MAAM,KAAK,GAAG,yDAAyB,CAAC,qCAAqC,CAC3E,MAAM,EAAE,iDAAiB,CAAC,KAAK,EAC/B,SAAS,EACT,MAAM,EAAE,iDAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YACR,OAAO,SAAS,CAAC;QACnB,MAAM,SAAS,GAAG,yCAAmB,CAAC,mCAAmC,CAAC,KAAK,EAAE,oBAAY,CAAC,QAAQ,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE;YACjC,MAAM,MAAM,GAAG,IAAI,mCAAgB,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,SAAS;gBAC1B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,WAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,2BAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACrB;QACD,OAAO,SAAS,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,4BAA4B,CAAC,MAAiB,EAAE,IAAa,EAAE,cAAsB;QACjG,MAAM,OAAO,GAAG,IAAI,+CAAwB,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC,4BAA4B,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC5E,CAAC;IACC;;;;;;;;;;;;;KAaC;IACI,MAAM,CAAC,sBAAsB,CAAC,MAAmB,EAAE,uBAA8D;QACtH,OAAO,kDAA2B,CAAC,sBAAsB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC7F,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,wBAAwB,CAAC,MAAiB,EAAE,CAAS,EAAE,CAAS;QAC5E,OAAO,gCAAmB,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,2BAA2B,CAAC,MAAwB,EAAE,OAAgB,IAAI,EAAE,gCAAyC,KAAK;QACtI,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,IAAI,MAAM,GAAG,GAAG,CAAC;QACjB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI;YACN,MAAM,GAAG,mBAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC5B,MAAM,GAAG,mBAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC7F,IAAI,UAAqC,CAAC;QAC1C,IAAI,mBAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE;YAC1C,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,WAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,WAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,GAAG,IAAI,CAAC;SACf;aAAM;YACL,UAAU,GAAG,6BAAW,CAAC,MAAM,EAAE,CAAC;SACnC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM;YACpB,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,MAAM,IAAI,6BAA6B;YACzC,SAAS,CAAC,6BAA6B,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,UAAU,CAAC;IACpB,CAAC;IAGD;;;OAGG;IACI,MAAM,CAAC,qBAAqB,CAAC,CAA2B,IAAI,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC,CAAC;IACvG;;;;;;;OAOG;IACI,MAAM,CAAC,2BAA2B,CAAC,WAAyD,EAAE,YAA6B;QAChI,OAAO,qCAAiB,CAAC,2BAA2B,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAElF,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,6BAA6B,CAAC,MAAoD,EAC9F,UAAmB;QACnB,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,SAAS,CAAC;QACnB,IAAI,MAAM,YAAY,+BAAc;YAClC,OAAO,MAAM,CAAC;QAChB,+BAA+B;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,sBAAsB,EAAE,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,6CAAqB,CAAC,UAAU,CAAC,CAAC;QAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,cAAc,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;SAClD;QACD,OAAO,cAAc,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,8BAA8B,CAAC,SAA0B,EAAE,cAAsB,EAAE,YAAoB;QACnH,OAAO,mCAAa,CAAC,8BAA8B,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;IAC/F,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,aAAa,CAAC,SAA0B,EAAE,eAAuB,mBAAQ,CAAC,mBAAmB;QACzG,OAAO,mCAAa,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,2BAA2B,CAAC,WAAyD,EAAE,MAAiB;QACpH,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QAC1E,MAAM,0BAA0B,GAAG,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,SAAS,CAAC,6BAA6B,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;QAC7F,IAAI,UAAU,YAAY,iCAAe,EAAE;YACzC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,QAAQ,EAAE;gBACvC,MAAM,YAAY,GAAG,iCAAe,CAAC,4CAA4C,CAAC,KAAK,CAAC,CAAC;gBACzF,IAAI,YAAY,EAAE;oBAChB,MAAM,OAAO,GAAG,SAAS,CAAC,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvG,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;iBACtG;aACF;SACF;aAAM,IAAI,UAAU,YAAY,+BAAc,EAAE;YAC/C,MAAM,YAAY,GAAG,iCAAe,CAAC,4CAA4C,CAAC,UAAU,CAAC,CAAC;YAC9F,IAAI,YAAY,EAAE;gBAChB,MAAM,OAAO,GAAG,SAAS,CAAC,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvG,mBAAmB,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;aAC3G;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;;;;;;;;;;;OAiBG;IACI,MAAM,CAAC,sBAAsB,CAAC,IAAiD,EAAE,sBAA+B,IAAI;QACzH,IAAI,IAAI,YAAY,2BAAY,EAAE;YAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACvD;aAAM,IAAI,IAAI,YAAY,2CAAoB,EAAE;YAC/C,IAAI,SAAS,CAAC;YACd,IAAI,mBAAmB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC5C,IAAI,CAAC,mBAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;oBACjE,OAAO,SAAS,CAAC;gBACnB,SAAS,GAAG,IAAI,CAAC;aAClB;iBAAM,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAClD,SAAS,GAAG,IAAI,CAAC;iBACd,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACpD,OAAO,SAAS,CAAC;aAClB;iBAAM;gBACL,SAAS,GAAG,mCAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1C,4DAA0B,CAAC,gCAAgC,CAAC,SAAS,EAAE,mBAAQ,CAAC,mBAAmB,CAAC,CAAC;aACtG;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;YACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,YAAY,CAAC,gBAAgB,EAAE;mBAC9B,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;mBAChC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE;gBACzC,OAAO,qBAAS,CAAC,4BAA4B,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;aAC/H;SACF;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC9B,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,yCAAmB,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC;SACxF;aAAM,IAAI,IAAI,YAAY,WAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,2BAAY,EAAE;YACzG,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;SACzE;aAAM,IAAI,IAAI,YAAY,WAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,2BAAY,EAAE;YACzG,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;SACxF;aAAM,IAAI,IAAI,YAAY,4BAAU,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE;gBACvC,4CAA4C;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxC,IAAI,OAAO,EAAE;oBACX,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;iBAC7C;aACF;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;;;OAUG;IACI,MAAM,CAAC,6BAA6B,CAAC,MAAuB,EAAE,OAAmD;QACtH,MAAM,OAAO,GAAG,IAAI,gFAAyC,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD;;;;;;;;;OASG;IACI,MAAM,CAAC,uBAAuB,CAAC,KAAyC;QAC7E,MAAM,WAAW,GAAsB,EAAE,CAAC;QAC1C,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE;YAC7B,IAAI,SAAS,YAAY,WAAI;gBAC3B,iCAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;iBAC9C,IAAI,SAAS,YAAY,2CAAoB,EAAE;gBAClD,MAAM,IAAI,GAAG,WAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC3C,iCAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;aAC7C;SACF;QACD,OAAO,iCAAe,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IACD;;;;;;;;;;;;;;;OAeG;IACI,MAAM,CAAC,yBAAyB,CAAC,gBAAuC;QAC7E,MAAM,WAAW,GAAG,SAAS,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACxF,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,uBAAU,CAAC,iCAAiC,CAAC,WAAW,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,qCAAiB,CAAC,qBAAqB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAClF,OAAO,qCAAiB,CAAC,oCAAoC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,sBAAsB,CAAC,UAAiC,EAAE,cAAiC,EACvG,6BAAsC,KAAK,EAC3C,qBAA8B,KAAK;QACnC,MAAM,OAAO,GAAqB,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACrF,IAAI,UAAU,YAAY,+BAAc,EAAE;YACxC,UAAU,CAAC,sBAAsB,CAAC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;SAC5F;aAAM,IAAI,UAAU,YAAY,iCAAe,EAAE;YAChD,UAAU,CAAC,sBAAsB,CAAC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;SAC5F;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACpC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;gBAC1B,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;aACzF;SACF;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAAC,UAA4B;QAC1D,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;YAC1B,IAAI,CAAC,YAAY,2BAAY,EAAE;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAClD,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;oBACjC,IAAI,CAAC,KAAK,SAAS;wBACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAClB;aACF;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAChB;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,IAAS,EAAE,YAAwB;QAC/D,MAAM,KAAK,GAAG,eAAO,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,IAAI,YAAY,6BAAa;YAC/B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;aACnC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;gBACpB,IAAI,CAAC,YAAY,6BAAa;oBAC5B,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;qBAChC,IAAI,CAAC,YAAY,yBAAO;oBAC3B,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;qBAChC,IAAI,CAAC,YAAY,mCAAgB;oBACpC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;qBACzC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBACvB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;aAC5D;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AArlBD,8BAqlBC;AAED,SAAS,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,aAAyB,EAAE,MAAkB,EAAE,aAAyB;IACpI,IAAI,MAAM,GAAG,CAAC;QACZ,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACvB,IAAI,MAAM,GAAG,CAAC;QACjB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;QAE1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolylineCompressionContext } from \"../geometry3d/PolylineCompressionByEdgeOffset\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { SortablePolygon } from \"../geometry3d/SortablePolygon\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { MomentData } from \"../geometry4d/MomentData\";\r\nimport { Polyface } from \"../polyface/Polyface\";\r\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../topology/Graph\";\r\nimport { LineStringDataVariant, MultiLineStringDataVariant, Triangulator } from \"../topology/Triangulation\";\r\nimport { ChainCollectorContext } from \"./ChainCollectorContext\";\r\nimport { AnyCurve, AnyRegion } from \"./CurveChain\";\r\nimport { BagOfCurves, ConsolidateAdjacentCurvePrimitivesOptions, CurveChain, CurveCollection } from \"./CurveCollection\";\r\nimport { CurveCurve } from \"./CurveCurve\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { CurveWireMomentsXYZ } from \"./CurveWireMomentsXYZ\";\r\nimport { CurveChainWireOffsetContext, JointOptions, OffsetOptions, PolygonWireOffsetContext } from \"./internalContexts/PolygonOffsetContext\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { Loop, SignedLoops } from \"./Loop\";\r\nimport { Path } from \"./Path\";\r\nimport { ConsolidateAdjacentCurvePrimitivesContext } from \"./Query/ConsolidateAdjacentPrimitivesContext\";\r\nimport { CurveSplitContext } from \"./Query/CurveSplitContext\";\r\nimport { PointInOnOutContext } from \"./Query/InOutTests\";\r\nimport { PlanarSubdivision } from \"./Query/PlanarSubdivision\";\r\nimport { RegionMomentsXY } from \"./RegionMomentsXY\";\r\nimport { OffsetHelpers } from \"./internalContexts/MultiChainCollector\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { RegionBooleanContext, RegionGroupOpType, RegionOpsFaceToFaceSearch } from \"./RegionOpsClassificationSweeps\";\r\nimport { UnionRegion } from \"./UnionRegion\";\r\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\n/**\r\n * Possible return types from\r\n * @public\r\n */\r\nexport type ChainTypes = CurvePrimitive | Path | BagOfCurves | Loop | undefined;\r\n\r\n/**\r\n * * `properties` is a string with special characters indicating\r\n * * \"U\" -- contains unmerged stick data\r\n * * \"M\" -- merged\r\n * * \"R\" -- regularized\r\n * * \"X\" -- has exterior markup\r\n * @internal\r\n */\r\nexport type GraphCheckPointFunction = (name: string, graph: HalfEdgeGraph, properties: string, extraData?: any) => any;\r\n/**\r\n * Enumeration of the binary operation types for a booleans among regions\r\n * @public\r\n */\r\nexport enum RegionBinaryOpType {\r\n Union = 0,\r\n Parity = 1,\r\n Intersection = 2,\r\n AMinusB = 3,\r\n BMinusA = 4,\r\n}\r\n\r\n/**\r\n * class `RegionOps` has static members for calculations on regions (areas).\r\n * * Regions are represented by these `CurveCollection` subclasses:\r\n * * `Loop` -- a single loop\r\n * * `ParityRegion` -- a collection of loops, interpreted by parity rules.\r\n * * The common \"One outer loop and many Inner loops\" is a parity region.\r\n * * `UnionRegion` -- a collection of `Loop` and `ParityRegion` objects understood as a (probably disjoint) union.\r\n * @beta\r\n */\r\nexport class RegionOps {\r\n /**\r\n * Return moment sums for a loop, parity region, or union region.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYAreaMoments(root: AnyRegion): MomentData | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /** Return an area tolerance for a given xy-range and optional distance tolerance.\r\n * @param range range of planar region to tolerance\r\n * @param distanceTolerance optional absolute distance tolerance\r\n */\r\n public static computeXYAreaTolerance(range: Range3d, distanceTolerance: number=Geometry.smallMetricDistance): number {\r\n // if A = bh and e is distance tolerance, then A' := (b+e/2)(h+e/2) = A + e/2(b+h+e/2), so A'-A = e/2(b+h+e/2).\r\n const halfDistTol = 0.5 * distanceTolerance;\r\n return halfDistTol * (range.xLength() + range.yLength() + halfDistTol);\r\n }\r\n /**\r\n * Return an xy area for a loop, parity region, or union region.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYArea(root: AnyRegion): number | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n return result.quantitySum;\r\n }\r\n return undefined;\r\n }\r\n /** Return MomentData with the sums of wire moments.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n */\r\n public static computeXYZWireMomentSums(root: AnyCurve): MomentData | undefined {\r\n const handler = new CurveWireMomentsXYZ();\r\n handler.visitLeaves(root);\r\n const result = handler.momentData;\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n\r\n /**\r\n * * create loops in the graph.\r\n * @internal\r\n */\r\n public static addLoopsToGraph(graph: HalfEdgeGraph, data: MultiLineStringDataVariant, announceIsolatedLoop: (graph: HalfEdgeGraph, seed: HalfEdge) => void) {\r\n if (data instanceof Loop) {\r\n const points = data.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n } else if (data instanceof ParityRegion) {\r\n for (const child of data.children) {\r\n const points = child.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n }\r\n } else if (data instanceof IndexedXYZCollection) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n } else if (Array.isArray(data)) {\r\n if (data.length > 0) {\r\n if (Point3d.isAnyImmediatePointType(data[0])) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data as LineStringDataVariant);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n\r\n } else if (data[0] instanceof IndexedXYZCollection) {\r\n for (const loop of data) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, loop as IndexedXYZCollection);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n }\r\n } else {\r\n for (const child of data) {\r\n if (Array.isArray(child))\r\n this.addLoopsToGraph(graph, child as MultiLineStringDataVariant, announceIsolatedLoop);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Add multiple loops to a graph.\r\n * * Apply edgeTag and mask to each edge.\r\n * @internal\r\n */\r\n public static addLoopsWithEdgeTagToGraph(graph: HalfEdgeGraph, data: MultiLineStringDataVariant, mask: HalfEdgeMask, edgeTag: any): HalfEdge[] | undefined {\r\n const loopSeeds: HalfEdge[] = [];\r\n this.addLoopsToGraph(graph, data, (_graph: HalfEdgeGraph, seed: HalfEdge) => {\r\n if (seed) {\r\n loopSeeds.push(seed);\r\n seed.setMaskAndEdgeTagAroundFace(mask, edgeTag, true);\r\n }\r\n });\r\n if (loopSeeds.length > 0)\r\n return loopSeeds;\r\n return undefined;\r\n }\r\n /**\r\n * Given a graph just produced by booleans, convert to a polyface\r\n * * \"just produced\" implies exterior face markup.\r\n *\r\n * @param graph\r\n * @param triangulate\r\n */\r\n private static finishGraphToPolyface(graph: HalfEdgeGraph | undefined, triangulate: boolean): Polyface | undefined {\r\n if (graph) {\r\n if (triangulate) {\r\n Triangulator.triangulateAllPositiveAreaFaces(graph);\r\n Triangulator.flipTriangles(graph);\r\n }\r\n return PolyfaceBuilder.graphToPolyface(graph);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * return a polyface containing the area union of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonXYAreaIntersectLoopsToPolyface(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB,\r\n (inA: boolean, inB: boolean) => (inA && inB),\r\n this._graphCheckPointFunction);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n\r\n /**\r\n * return a polyface containing the area union of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonXYAreaUnionLoopsToPolyface(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB,\r\n (inA: boolean, inB: boolean) => (inA || inB),\r\n this._graphCheckPointFunction);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * return a polyface containing the area difference of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonXYAreaDifferenceLoopsToPolyface(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB,\r\n (inA: boolean, inB: boolean) => (inA && !inB),\r\n this._graphCheckPointFunction);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n\r\n /**\r\n * return areas defined by a boolean operation.\r\n * * If there are multiple regions in loopsA, they are treated as a union.\r\n * * If there are multiple regions in loopsB, they are treated as a union.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param mergeTolerance absolute distance tolerance for merging loops\r\n * @alpha\r\n */\r\n public static regionBooleanXY(loopsA: AnyRegion | AnyRegion[] | undefined, loopsB: AnyRegion | AnyRegion[] | undefined, operation: RegionBinaryOpType, mergeTolerance: number = Geometry.smallMetricDistance): AnyRegion | undefined {\r\n const result = UnionRegion.create();\r\n const context = RegionBooleanContext.create(RegionGroupOpType.Union, RegionGroupOpType.Union);\r\n context.addMembers(loopsA, loopsB);\r\n context.annotateAndMergeCurvesInGraph(mergeTolerance);\r\n const range = context.groupA.range().union(context.groupB.range());\r\n const areaTol = this.computeXYAreaTolerance(range);\r\n context.runClassificationSweep(operation, (_graph: HalfEdgeGraph, face: HalfEdge, faceType: -1 | 0 | 1, area: number) => {\r\n // ignore danglers and null faces, but not 2-edge \"banana\" faces with nonzero area\r\n if (face.countEdgesAroundFace() < 2)\r\n return;\r\n if (Math.abs(area) < areaTol)\r\n return;\r\n if (faceType === 1) {\r\n const loop = PlanarSubdivision.createLoopInFace(face);\r\n if (loop)\r\n result.tryAddChild(loop);\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * return a polyface whose facets area a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonBooleanXYToPolyface(inputA: MultiLineStringDataVariant[], operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[], triangulate: boolean = false): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA, RegionGroupOpType.Union,\r\n operation,\r\n inputB, RegionGroupOpType.Union, true);\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * return loops of linestrings around areas of a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n */\r\n public static polygonBooleanXYToLoops(\r\n inputA: MultiLineStringDataVariant[],\r\n operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[]): AnyRegion | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA, RegionGroupOpType.Union,\r\n operation,\r\n inputB, RegionGroupOpType.Union, true);\r\n if (!graph)\r\n return undefined;\r\n const loopEdges = HalfEdgeGraphSearch.collectExtendedBoundaryLoopsInGraph(graph, HalfEdgeMask.EXTERIOR);\r\n const allLoops: Loop[] = [];\r\n for (const graphLoop of loopEdges) {\r\n const points = new GrowableXYZArray();\r\n for (const edge of graphLoop)\r\n points.pushXYZ(edge.x, edge.y, edge.z);\r\n points.pushWrap(1);\r\n const loop = Loop.create();\r\n loop.tryAddChild(LineString3d.createCapture(points));\r\n allLoops.push(loop);\r\n }\r\n return RegionOps.sortOuterAndHoleLoopsXY(allLoops);\r\n }\r\n\r\n /** Construct a wire (not area!!) that is offset from given polyline or polygon.\r\n * * This is a simple wire offset, not an area.\r\n * * The construction algorithm attempts to eliminate some self-intersections within the offsets, but does not guarantee a simple area offset.\r\n * * The construction algorithm is subject to being changed, resulting in different (hopefully better) self-intersection behavior on the future.\r\n * @param points a single loop or path\r\n * @param wrap true to include wraparound\r\n * @param offsetDistance distance of offset from wire. Positive is left.\r\n */\r\n public static constructPolygonWireXYOffset(points: Point3d[], wrap: boolean, offsetDistance: number): CurveCollection | undefined {\r\n const context = new PolygonWireOffsetContext();\r\n return context.constructPolygonWireXYOffset(points, wrap, offsetDistance);\r\n }\r\n /**\r\n * Construct curves that are offset from a Path or Loop as viewed in xy-plane (ignoring z).\r\n * * The construction will remove \"some\" local effects of features smaller than the offset distance, but will not detect self intersection among widely separated edges.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * When the offset needs to do an \"outside\" turn, the first applicable construction is applied:\r\n * * If the turn is larger than `options.minArcDegrees`, a circular arc is constructed.\r\n * * If the turn is less than or equal to `options.maxChamferTurnDegrees`, extend curves along tangent to single intersection point.\r\n * * If the turn is larger than `options.maxChamferDegrees`, the turn is constructed as a sequence of straight lines that are:\r\n * * outside the arc\r\n * * have uniform turn angle less than `options.maxChamferDegrees`\r\n * * each line segment (except first and last) touches the arc at its midpoint.\r\n * @param curves base curves.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object.\r\n */\r\n public static constructCurveXYOffset(curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions): CurveCollection | undefined {\r\n return CurveChainWireOffsetContext.constructCurveXYOffset(curves, offsetDistanceOrOptions);\r\n }\r\n /**\r\n * Test if point (x,y) is IN, OUT or ON a polygon.\r\n * @return (1) for in, (-1) for OUT, (0) for ON\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @param points array of xy coordinates.\r\n */\r\n public static testPointInOnOutRegionXY(curves: AnyRegion, x: number, y: number): number {\r\n return PointInOnOutContext.testPointInOnOutRegionXY(curves, x, y);\r\n }\r\n /** Create curve collection of subtype determined by gaps between the input curves.\r\n * * If (a) wrap is requested and (b) all curves connect head-to-tail (including wraparound), assemble as a `loop`.\r\n * * If all curves connect head-to-tail except for closure, return a `Path`.\r\n * * If there are internal gaps, return a `BagOfCurves`\r\n * * If input array has zero length, return undefined.\r\n */\r\n public static createLoopPathOrBagOfCurves(curves: CurvePrimitive[], wrap: boolean = true, consolidateAdjacentPrimitives: boolean = false): CurveCollection | undefined {\r\n const n = curves.length;\r\n if (n === 0)\r\n return undefined;\r\n let maxGap = 0.0;\r\n let isPath = false;\r\n if (wrap)\r\n maxGap = Geometry.maxXY(maxGap, curves[0].startPoint().distance(curves[n - 1].endPoint()));\r\n for (let i = 0; i + 1 < n; i++)\r\n maxGap = Geometry.maxXY(maxGap, curves[i].endPoint().distance(curves[i + 1].startPoint()));\r\n let collection: Loop | Path | BagOfCurves;\r\n if (Geometry.isSmallMetricDistance(maxGap)) {\r\n collection = wrap ? Loop.create() : Path.create();\r\n isPath = true;\r\n } else {\r\n collection = BagOfCurves.create();\r\n }\r\n for (const c of curves)\r\n collection.tryAddChild(c);\r\n if (isPath && consolidateAdjacentPrimitives)\r\n RegionOps.consolidateAdjacentPrimitives(collection);\r\n return collection;\r\n }\r\n\r\n private static _graphCheckPointFunction?: GraphCheckPointFunction;\r\n /**\r\n * Announce Checkpoint function for use during booleans\r\n * @internal\r\n */\r\n public static setCheckPointFunction(f?: GraphCheckPointFunction) { this._graphCheckPointFunction = f; }\r\n /**\r\n * * Find all intersections among curves in `curvesToCut` and `cutterCurves`\r\n * * Return fragments of `curvesToCut`.\r\n * * For a `Loop`, `ParityRegion`, or `UnionRegion` in `curvesToCut`\r\n * * if it is never cut by any `cutter` curve, it will be left unchanged.\r\n * * if cut, the input is downgraded to a set of `Path` curves joining at the cut points.\r\n * * All cutting is \"as viewed in the xy plane\"\r\n */\r\n public static cloneCurvesWithXYSplitFlags(curvesToCut: CurvePrimitive | CurveCollection | undefined, cutterCurves: CurveCollection): CurveCollection | CurvePrimitive | undefined {\r\n return CurveSplitContext.cloneCurvesWithXYSplitFlags(curvesToCut, cutterCurves);\r\n\r\n }\r\n /**\r\n * Create paths assembled from many curves.\r\n * * Assemble consecutive curves NOT separated by either end flags or gaps into paths.\r\n * * Return simplest form -- single primitive, single path, or bag of curves.\r\n * @param curves\r\n */\r\n public static splitToPathsBetweenFlagBreaks(source: CurveCollection | CurvePrimitive | undefined,\r\n makeClones: boolean): BagOfCurves | Path | CurvePrimitive | Loop | undefined {\r\n if (source === undefined)\r\n return undefined;\r\n if (source instanceof CurvePrimitive)\r\n return source;\r\n // source is a collection . ..\r\n const primitives = source.collectCurvePrimitives();\r\n const chainCollector = new ChainCollectorContext(makeClones);\r\n for (const primitive of primitives) {\r\n chainCollector.announceCurvePrimitive(primitive);\r\n }\r\n return chainCollector.grabResult();\r\n }\r\n /**\r\n * * Restructure curve fragments as chains and offsets\r\n * * Return object with named chains, insideOffsets, outsideOffsets\r\n * * BEWARE that if the input is not a loop the classification of outputs is suspect.\r\n * @param fragments fragments to be chained\r\n * @param offsetDistance offset distance.\r\n */\r\n public static collectInsideAndOutsideOffsets(fragments: GeometryQuery[], offsetDistance: number, gapTolerance: number): { insideOffsets: GeometryQuery[], outsideOffsets: GeometryQuery[], chains: ChainTypes } {\r\n return OffsetHelpers.collectInsideAndOutsideOffsets(fragments, offsetDistance, gapTolerance);\r\n }\r\n /**\r\n * * Restructure curve fragments as chains\r\n * * Return the chains, possibly wrapped in BagOfCurves if there multiple chains.\r\n * @param fragments fragments to be chained\r\n * @param offsetDistance offset distance.\r\n */\r\n public static collectChains(fragments: GeometryQuery[], gapTolerance: number = Geometry.smallMetricDistance): ChainTypes {\r\n return OffsetHelpers.collectChains(fragments, gapTolerance);\r\n }\r\n\r\n /**\r\n * * Find intersections of `curvesToCut` with boundaries of `region`.\r\n * * Break `curvesToCut` into parts inside, outside, and coincident.\r\n * * Return all fragments, split among `insideParts`, `outsideParts`, and `coincidentParts` in the output object.\r\n */\r\n public static splitPathsByRegionInOnOutXY(curvesToCut: CurveCollection | CurvePrimitive | undefined, region: AnyRegion): { insideParts: AnyCurve[], outsideParts: AnyCurve[], coincidentParts: AnyCurve[] } {\r\n const result = { insideParts: [], outsideParts: [], coincidentParts: [] };\r\n const pathWithIntersectionMarkup = RegionOps.cloneCurvesWithXYSplitFlags(curvesToCut, region);\r\n const splitPaths = RegionOps.splitToPathsBetweenFlagBreaks(pathWithIntersectionMarkup, true);\r\n if (splitPaths instanceof CurveCollection) {\r\n for (const child of splitPaths.children) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(child);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(child, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n } else if (splitPaths instanceof CurvePrimitive) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(splitPaths);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(splitPaths, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n return result;\r\n }\r\n /** Test if `data` is one of several forms of a rectangle.\r\n * * If so, return transform with\r\n * * origin at one corner\r\n * * x and y columns extend along two adjacent sides\r\n * * z column is unit normal.\r\n * * The recognized data forms for simple analysis of points are:\r\n * * LineString\r\n * * Loop containing rectangle content\r\n * * Path containing rectangle content\r\n * * Array of Point3d[]\r\n * * IndexedXYZCollection\r\n * * Points are considered a rectangle if\r\n * * Within the first 4 points\r\n * * vectors from 0 to 1 and 0 to 3 are perpendicular and have a non-zero cross product\r\n * * vectors from 0 to 3 and 1 to 2 are the same\r\n * * optionally require a 5th point that closes back to point0\r\n * * If there are other than the basic number of points (4 or 5) the data\r\n */\r\n public static rectangleEdgeTransform(data: AnyCurve | Point3d[] | IndexedXYZCollection, requireClosurePoint: boolean = true): Transform | undefined {\r\n if (data instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.packedPoints);\r\n } else if (data instanceof IndexedXYZCollection) {\r\n let dataToUse;\r\n if (requireClosurePoint && data.length === 5) {\r\n if (!Geometry.isSmallMetricDistance(data.distanceIndexIndex(0, 4)!))\r\n return undefined;\r\n dataToUse = data;\r\n } else if (!requireClosurePoint && data.length === 4)\r\n dataToUse = data;\r\n else if (data.length < (requireClosurePoint ? 5 : 4)) {\r\n return undefined;\r\n } else {\r\n dataToUse = GrowableXYZArray.create(data);\r\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(dataToUse, Geometry.smallMetricDistance);\r\n }\r\n\r\n const vector01 = dataToUse.vectorIndexIndex(0, 1)!;\r\n const vector03 = dataToUse.vectorIndexIndex(0, 3)!;\r\n const vector12 = dataToUse.vectorIndexIndex(1, 2)!;\r\n const normalVector = vector01.crossProduct(vector03);\r\n if (normalVector.normalizeInPlace()\r\n && vector12.isAlmostEqual(vector03)\r\n && vector01.isPerpendicularTo(vector03)) {\r\n return Transform.createOriginAndMatrixColumns(dataToUse.getPoint3dAtUncheckedPointIndex(0), vector01, vector03, normalVector);\r\n }\r\n } else if (Array.isArray(data)) {\r\n return this.rectangleEdgeTransform(new Point3dArrayCarrier(data), requireClosurePoint);\r\n } else if (data instanceof Loop && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, true);\r\n } else if (data instanceof Path && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, requireClosurePoint);\r\n } else if (data instanceof CurveChain) {\r\n if (!data.checkForNonLinearPrimitives()) {\r\n // const linestring = LineString3d.create();\r\n const strokes = data.getPackedStrokes();\r\n if (strokes) {\r\n return this.rectangleEdgeTransform(strokes);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Look for and simplify:\r\n * * Contiguous `LineSegment3d` and `LineString3d` objects.\r\n * * collect all points\r\n * * eliminate duplicated points\r\n * * eliminate points colinear with surrounding points.\r\n * * Contiguous concentric circular or elliptic arcs\r\n * * combine angular ranges\r\n * @param curves Path or loop (or larger collection containing paths and loops) to be simplified\r\n * @param options options for tolerance and selective simplification.\r\n */\r\n public static consolidateAdjacentPrimitives(curves: CurveCollection, options?: ConsolidateAdjacentCurvePrimitivesOptions) {\r\n const context = new ConsolidateAdjacentCurvePrimitivesContext(options);\r\n curves.dispatchToGeometryHandler(context);\r\n }\r\n /**\r\n * Reverse and reorder loops in the xy-plane for consistency and containment.\r\n * @param loops multiple loops in any order and orientation, z-coordinates ignored\r\n * @returns a region that captures the input pointers. This region is a:\r\n * * `Loop` if there is exactly one input loop. It is oriented counterclockwise.\r\n * * `ParityRegion` if input consists of exactly one outer loop with at least one hole loop.\r\n * Its first child is an outer loop oriented counterclockwise; all subsequent children are holes oriented clockwise.\r\n * * `UnionRegion` if any other input configuration. Its children are individually ordered/oriented as in the above cases.\r\n * @see PolygonOps.sortOuterAndHoleLoopsXY\r\n */\r\n public static sortOuterAndHoleLoopsXY(loops: Array<Loop | IndexedXYZCollection>): AnyRegion {\r\n const loopAndArea: SortablePolygon[] = [];\r\n for (const candidate of loops) {\r\n if (candidate instanceof Loop)\r\n SortablePolygon.pushLoop(loopAndArea, candidate);\r\n else if (candidate instanceof IndexedXYZCollection) {\r\n const loop = Loop.createPolygon(candidate);\r\n SortablePolygon.pushLoop(loopAndArea, loop);\r\n }\r\n }\r\n return SortablePolygon.sortAsAnyRegion(loopAndArea);\r\n }\r\n /**\r\n * Find all areas bounded by the unstructured, possibly intersecting curves.\r\n * * In `curvesAndRegions`, Loop/ParityRegion/UnionRegion contribute curve primitives.\r\n * * Each returned [[SignedLoops]] object describes faces in a single connected component.\r\n * * Within the [[SignedLoops]]:\r\n * * positiveAreaLoops contains typical \"interior\" loops with positive area loop ordered counterclockwise\r\n * * negativeAreaLoops contains (probably just one) \"exterior\" loop which is ordered clockwise and\r\n * * slivers contains sliver areas such as appear between coincident curves.\r\n * * edges contains [[LoopCurveLoopCurve]] about each edge within the component. In each edge object\r\n * * loopA = a loop on one side of the edge\r\n * * curveA = a curve that appears as one of loopA.children.\r\n * * loopB = the loop on the other side\r\n * * curveB = a curve that appears as one of loopB.children\r\n * @param curvesAndRegions Any collection of curves.\r\n * @alpha\r\n */\r\n public static constructAllXYRegionLoops(curvesAndRegions: AnyCurve | AnyCurve[]): SignedLoops[] {\r\n const primitivesA = RegionOps.collectCurvePrimitives(curvesAndRegions, undefined, true);\r\n const primitivesB = this.expandLineStrings(primitivesA);\r\n const range = this.curveArrayRange(primitivesB);\r\n const areaTol = this.computeXYAreaTolerance(range);\r\n const intersections = CurveCurve.allIntersectionsAmongPrimitivesXY(primitivesB);\r\n const graph = PlanarSubdivision.assembleHalfEdgeGraph(primitivesB, intersections);\r\n return PlanarSubdivision.collectSignedLoopSetsInHalfEdgeGraph(graph, areaTol);\r\n }\r\n\r\n /**\r\n * collect all `CurvePrimitives` in loosely typed input.\r\n * * This (always) recurses into primitives within collections (Path, Loop, ParityRegion, UnionRegion)\r\n * * It (optionally) recurses to hidden primitives within primitives (i.e. CurveChainWithDistanceIndex)\r\n * * If collectorArray is given, it is NOT cleared -- primitives are appended.\r\n * @param candidates array of various CurvePrimitive and CurveCollection\r\n * @param smallestPossiblePrimitives if false, leave CurveChainWithDistanceIndex as single primitives. If true, recurse to their children.\r\n */\r\n public static collectCurvePrimitives(candidates: AnyCurve | AnyCurve[], collectorArray?: CurvePrimitive[],\r\n smallestPossiblePrimitives: boolean = false,\r\n explodeLinestrings: boolean = false): CurvePrimitive[] {\r\n const results: CurvePrimitive[] = collectorArray === undefined ? [] : collectorArray;\r\n if (candidates instanceof CurvePrimitive) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (candidates instanceof CurveCollection) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (Array.isArray(candidates)) {\r\n for (const c of candidates) {\r\n this.collectCurvePrimitives(c, results, smallestPossiblePrimitives, explodeLinestrings);\r\n }\r\n }\r\n return results;\r\n }\r\n /**\r\n * Copy primitive pointers from candidates to result array.\r\n * * replace LineString3d by individual LineSegment3d.\r\n * * all others unchanged.\r\n * @param candidates\r\n */\r\n public static expandLineStrings(candidates: CurvePrimitive[]): CurvePrimitive[] {\r\n const result: CurvePrimitive[] = [];\r\n for (const c of candidates) {\r\n if (c instanceof LineString3d) {\r\n for (let i = 0; i + 1 < c.packedPoints.length; i++) {\r\n const q = c.getIndexedSegment(i);\r\n if (q !== undefined)\r\n result.push(q);\r\n }\r\n } else {\r\n result.push(c);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return the overall range of given curves.\r\n * @param curves candidate curves\r\n */\r\n public static curveArrayRange(data: any, worldToLocal?: Transform): Range3d {\r\n const range = Range3d.create();\r\n if (data instanceof GeometryQuery)\r\n data.extendRange(range, worldToLocal);\r\n else if (Array.isArray(data)) {\r\n for (const c of data) {\r\n if (c instanceof GeometryQuery)\r\n c.extendRange(range, worldToLocal);\r\n else if (c instanceof Point3d)\r\n range.extendPoint(c, worldToLocal);\r\n else if (c instanceof GrowableXYZArray)\r\n range.extendRange(c.getRange(worldToLocal));\r\n else if (Array.isArray(c))\r\n range.extendRange(this.curveArrayRange(c, worldToLocal));\r\n }\r\n }\r\n return range;\r\n }\r\n}\r\n\r\nfunction pushToInOnOutArrays(curve: AnyCurve, select: number, arrayNegative: AnyCurve[], array0: AnyCurve[], arrayPositive: AnyCurve[]) {\r\n if (select > 0)\r\n arrayPositive.push(curve);\r\n else if (select < 0)\r\n arrayNegative.push(curve);\r\n else\r\n array0.push(curve);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"RegionOpsClassificationSweeps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOpsClassificationSweeps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RegionOpsClassificationSweeps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOpsClassificationSweeps.ts"],"names":[],"mappings":"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"}
@@ -209,6 +209,8 @@ class RegionOpsFaceToFaceSearch {
209
209
  if (graphCheckPoint)
210
210
  graphCheckPoint("After regularize", graph, "MR");
211
211
  const exteriorHalfEdge = HalfEdgeGraphSearch_1.HalfEdgeGraphSearch.findMinimumAreaFace(graph);
212
+ if (exteriorHalfEdge === undefined)
213
+ return undefined;
212
214
  const exteriorMask = Graph_1.HalfEdgeMask.EXTERIOR;
213
215
  const faceVisitedMask = graph.grabMask();
214
216
  const nodeVisitedMask = graph.grabMask();