@itwin/core-geometry 4.3.0-dev.17 → 4.3.0-dev.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -1
- package/lib/cjs/curve/CurveOps.d.ts +4 -5
- package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
- package/lib/cjs/curve/CurveOps.js +1 -1
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.d.ts +14 -2
- package/lib/cjs/curve/CurveTypes.d.ts.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +5 -11
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +2 -3
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts +4 -4
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +38 -36
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +8 -0
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +10 -0
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +2 -0
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +12 -2
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +38 -11
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +93 -16
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +4 -5
- package/lib/esm/curve/CurveOps.d.ts.map +1 -1
- package/lib/esm/curve/CurveOps.js +1 -1
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurveTypes.d.ts +14 -2
- package/lib/esm/curve/CurveTypes.d.ts.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +5 -11
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +2 -3
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts +4 -4
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +38 -36
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +8 -0
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +10 -0
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +2 -0
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +12 -2
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +38 -11
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +93 -16
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { AnyCurve } from "../CurveTypes";
|
|
2
1
|
import { CurvePrimitive } from "../CurvePrimitive";
|
|
2
|
+
import { AnyChain, AnyCurve } from "../CurveTypes";
|
|
3
3
|
import { LineString3d } from "../LineString3d";
|
|
4
|
-
import { ChainTypes } from "../RegionOps";
|
|
5
4
|
import { StrokeOptions } from "../StrokeOptions";
|
|
6
5
|
/**
|
|
7
6
|
* Manage a growing array of arrays of curve primitives that are to be joined "head to tail" in paths.
|
|
@@ -96,7 +95,7 @@ export declare class MultiChainCollector {
|
|
|
96
95
|
/** Stroke the curve chain to a line string, de-duplicate the points. */
|
|
97
96
|
private chainToLineString3d;
|
|
98
97
|
/** Return the collected results, structured as the simplest possible type. */
|
|
99
|
-
grabResult(makeLoopIfClosed?: boolean):
|
|
98
|
+
grabResult(makeLoopIfClosed?: boolean): AnyChain | undefined;
|
|
100
99
|
/** Return chains as individual calls to announceChain. */
|
|
101
100
|
announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void;
|
|
102
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,yBAAyB;IACzB,OAAO,CAAC,OAAO,CAAqB;IACpC,oCAAoC;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,qFAAqF;IACrF,OAAO,CAAC,cAAc,CAAS;IAC/B,sEAAsE;IACtE,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IACtC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IACtC,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAU;IAE5B;;;OAGG;gBACgB,YAAY,SAA+B,EAAE,cAAc,GAAE,MAAM,GAAG,SAAwC;IAMjI;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;OAKG;IACI,qBAAqB,CAAC,SAAS,EAAE,cAAc;IAStD;;;;;OAKG;IACI,YAAY,CAAC,SAAS,EAAE,QAAQ;IAQvC,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAejC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAiC7B;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA4CjC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAYjC,wCAAwC;IACxC,OAAO,CAAC,YAAY;IAMpB,qGAAqG;IACrG,OAAO,CAAC,wBAAwB;IAuBhC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA+B5B,wEAAwE;IACxE,OAAO,CAAC,mBAAmB;IAS3B,8EAA8E;IACvE,UAAU,CAAC,gBAAgB,GAAE,OAAe,GAAG,QAAQ,GAAG,SAAS;IAa1E,0DAA0D;IACnD,4BAA4B,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;CAc9G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.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 { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { AnyCurve } from \"../CurveTypes\";\r\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\nimport { ChainTypes, RegionOps } from \"../RegionOps\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\n\r\n/**\r\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\r\n * * The caller makes a sequence of calls to announce individual primitives.\r\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\r\n * * When all curves have been announced, the call to `grabResults` restructures the various active chains into Paths (and optionally, Loops).\r\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\r\n * * Usage pattern is\r\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\r\n * * many times:\r\n * * `context.captureCurve(anyCurve)`\r\n * * `context.captureCurvePrimitive(primitive)`\r\n * * end: `result = context.grabResult(makeLoopIfClosed)`\r\n * @internal\r\n */\r\nexport class MultiChainCollector {\r\n /** accumulated chains */\r\n private _chains: CurvePrimitive[][];\r\n /** largest gap distance to close */\r\n private _gapTolerance: number;\r\n /** end point snap tolerance (assumed to be as tight or tighter than gapTolerance) */\r\n private _snapTolerance: number;\r\n /** tolerance for choosing Path or Loop. If undefined, always Path. */\r\n private _planeTolerance: number | undefined;\r\n\r\n private static _staticPointA: Point3d;\r\n private static _staticPointB: Point3d;\r\n private _xyzWork0?: Point3d;\r\n private _xyzWork1?: Point3d;\r\n\r\n /** Initialize with an empty array of chains.\r\n * @param gapTolerance tolerance for calling endpoints identical\r\n * @param planeTolerance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.\r\n */\r\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance: number | undefined = Geometry.smallMetricDistance) {\r\n this._chains = [];\r\n this._gapTolerance = gapTolerance;\r\n this._snapTolerance = Geometry.smallMetricDistance;\r\n this._planeTolerance = planeTolerance;\r\n }\r\n /**\r\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\r\n * @param xyz endpoint to check\r\n * @param tolerance absolute distance tolerance for equating endpoints\r\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\r\n */\r\n private findAnyChainToConnect(xyz: Point3d, tolerance: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\r\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\r\n if (exceptChainIndex === chainIndexA)\r\n continue;\r\n const chain = this._chains[chainIndexA];\r\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: true };\r\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: false };\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Insert a single curve primitive into the active chains.\r\n * * The primitive is captured (not cloned)\r\n * * The primitive may be reversed in place\r\n * @param candidate curve to add to the context\r\n */\r\n public captureCurvePrimitive(candidate: CurvePrimitive) {\r\n if (this._snapTolerance < this._gapTolerance) {\r\n if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))\r\n return;\r\n }\r\n if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))\r\n return;\r\n this._chains.push([candidate]);\r\n }\r\n /**\r\n * Insert any curve into the collection.\r\n * * This recurses into Path, Loop, BagOfCurves etc\r\n * * All primitives are captured, and may be reversed in place.\r\n * @param candidate curve to add to the context\r\n */\r\n public captureCurve(candidate: AnyCurve) {\r\n if (candidate instanceof CurvePrimitive)\r\n this.captureCurvePrimitive(candidate);\r\n else if (candidate instanceof CurveCollection) {\r\n for (const c of candidate.children)\r\n this.captureCurve(c);\r\n }\r\n }\r\n /** If allowed by the geometry type, move an endpoint. */\r\n private static simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\r\n if (curve instanceof (LineSegment3d)) {\r\n if (atEnd) {\r\n curve.point1Ref.setFrom(to);\r\n } else {\r\n curve.point0Ref.setFrom(to);\r\n }\r\n return true;\r\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\r\n const i = atEnd ? curve.numPoints() - 1 : 0;\r\n curve.packedPoints.setAtCheckedPointIndex(i, to);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\r\n * * All z-coordinates are ignored.\r\n * @param curve0 first curve, assumed to end close to the start of curve1\r\n * @param curve1 second curve, assumed to start close to the end of curve0\r\n * @param gapTolerance max distance to move a curve start/end point\r\n * @returns whether curve start/end point(s) moved\r\n */\r\n private static moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive, gapTolerance: number): boolean {\r\n const xyz0 = curve0.endPoint();\r\n const xyz1 = curve1.startPoint();\r\n const minShift = Geometry.smallMetricDistance * 0.001;\r\n const d01 = xyz0.distanceXY(xyz1);\r\n if (d01 < minShift)\r\n return false;\r\n // try lines and linestrings\r\n if (d01 < gapTolerance) {\r\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\r\n return true;\r\n }\r\n // try other primitive types\r\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\r\n const shiftFactor = 5.0;\r\n for (const pair of intersections) {\r\n const detail0 = pair.detailA;\r\n const detail1 = pair.detailB;\r\n const distance0 = detail0.point.distanceXY(xyz0);\r\n const distance1 = detail1.point.distanceXY(xyz1);\r\n if (distance0 < shiftFactor * gapTolerance && distance1 < shiftFactor * gapTolerance) {\r\n if (curve0 instanceof Arc3d && curve1 instanceof Arc3d) {\r\n const radians0End = curve0.sweep.fractionToRadians(detail0.fraction);\r\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\r\n const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);\r\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\r\n return true;\r\n }\r\n // TODO: other combinations of types\r\n }\r\n }\r\n return false;\r\n }\r\n /** Announce a curve primitive\r\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\r\n * * Otherwise start a new chain.\r\n */\r\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, tolerance: number): boolean {\r\n if (candidate) {\r\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n } else {\r\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Merge two entries in the chain array.\r\n * * Move each primitive from chainB to the end of chainA.\r\n * * Clear chainB.\r\n * * Move the final chain to chainB index.\r\n * * Decrement the array length.\r\n * @param chainIndexA index of chainA\r\n * @param chainIndexB index of chainB\r\n */\r\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\r\n const chainA = this._chains[chainIndexA];\r\n const chainB = this._chains[chainIndexB];\r\n for (const p of chainB) {\r\n chainA.push(p);\r\n }\r\n chainB.length = 0; // chainIndexB is unused\r\n const lastChainIndex = this._chains.length - 1;\r\n if (chainIndexB !== lastChainIndex)\r\n this._chains[chainIndexB] = this._chains[lastChainIndex];\r\n this._chains.pop();\r\n }\r\n /** Reverse the curve chain in place. */\r\n private reverseChain(chainIndex: number) {\r\n const chain = this._chains[chainIndex];\r\n chain.reverse();\r\n for (const p of chain)\r\n p.reverseInPlace();\r\n }\r\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\r\n private searchAndMergeChainIndex(chainIndex: number, tolerance: number): void {\r\n // ASSUME valid index of non-empty chain\r\n const chain = this._chains[chainIndex];\r\n const lastIndexInChain = chain.length - 1;\r\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\r\n // try start with any other chain\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (!connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\r\n return;\r\n }\r\n // try end with any other chain\r\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\r\n return;\r\n }\r\n }\r\n /**\r\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\r\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\r\n * @param makeLoopIfClosed whether to return a Loop from physically closed curves array, otherwise Path\r\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\r\n */\r\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\r\n if (curves.length === 0)\r\n return undefined;\r\n if (makeLoopIfClosed) {\r\n const primitive0 = curves[0];\r\n const primitiveN = curves[curves.length - 1];\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n if (MultiChainCollector.moveHeadOrTail(primitiveN, primitive0, this._gapTolerance)) {\r\n // get the corrected coordinates\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n }\r\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\r\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\r\n if (localToWorld) {\r\n const worldToLocal = localToWorld.inverse();\r\n if (worldToLocal) {\r\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\r\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\r\n return Loop.createArray(curves);\r\n }\r\n }\r\n }\r\n return Path.createArray(curves);\r\n }\r\n }\r\n if (curves.length === 1)\r\n return curves[0];\r\n return Path.createArray(curves);\r\n }\r\n /** Stroke the curve chain to a line string, de-duplicate the points. */\r\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\r\n if (chain.length === 0)\r\n return undefined;\r\n const linestring = LineString3d.create();\r\n for (const curve of chain)\r\n curve.emitStrokes(linestring, options);\r\n linestring.removeDuplicatePoints(this._gapTolerance);\r\n return linestring;\r\n }\r\n /** Return the collected results, structured as the simplest possible type. */\r\n public grabResult(makeLoopIfClosed: boolean = false): ChainTypes {\r\n const chains = this._chains;\r\n if (chains.length === 0)\r\n return undefined;\r\n if (chains.length === 1)\r\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\r\n const bag = BagOfCurves.create();\r\n for (const chain of chains) {\r\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\r\n bag.tryAddChild(q);\r\n }\r\n return bag;\r\n }\r\n /** Return chains as individual calls to announceChain. */\r\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\r\n const chains = this._chains;\r\n if (chains.length === 1) {\r\n const ls = this.chainToLineString3d(chains[0], options);\r\n if (ls)\r\n announceChain(ls);\r\n } else if (chains.length > 1) {\r\n for (const chain of chains) {\r\n const ls = this.chainToLineString3d(chain, options);\r\n if (ls)\r\n announceChain(ls);\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.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 { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyChain, AnyCurve } from \"../CurveTypes\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\n\r\n/**\r\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\r\n * * The caller makes a sequence of calls to announce individual primitives.\r\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\r\n * * When all curves have been announced, the call to `grabResults` restructures the various active chains into Paths (and optionally, Loops).\r\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\r\n * * Usage pattern is\r\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\r\n * * many times:\r\n * * `context.captureCurve(anyCurve)`\r\n * * `context.captureCurvePrimitive(primitive)`\r\n * * end: `result = context.grabResult(makeLoopIfClosed)`\r\n * @internal\r\n */\r\nexport class MultiChainCollector {\r\n /** accumulated chains */\r\n private _chains: CurvePrimitive[][];\r\n /** largest gap distance to close */\r\n private _gapTolerance: number;\r\n /** end point snap tolerance (assumed to be as tight or tighter than gapTolerance) */\r\n private _snapTolerance: number;\r\n /** tolerance for choosing Path or Loop. If undefined, always Path. */\r\n private _planeTolerance: number | undefined;\r\n\r\n private static _staticPointA: Point3d;\r\n private static _staticPointB: Point3d;\r\n private _xyzWork0?: Point3d;\r\n private _xyzWork1?: Point3d;\r\n\r\n /** Initialize with an empty array of chains.\r\n * @param gapTolerance tolerance for calling endpoints identical\r\n * @param planeTolerance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.\r\n */\r\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance: number | undefined = Geometry.smallMetricDistance) {\r\n this._chains = [];\r\n this._gapTolerance = gapTolerance;\r\n this._snapTolerance = Geometry.smallMetricDistance;\r\n this._planeTolerance = planeTolerance;\r\n }\r\n /**\r\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\r\n * @param xyz endpoint to check\r\n * @param tolerance absolute distance tolerance for equating endpoints\r\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\r\n */\r\n private findAnyChainToConnect(xyz: Point3d, tolerance: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\r\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\r\n if (exceptChainIndex === chainIndexA)\r\n continue;\r\n const chain = this._chains[chainIndexA];\r\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: true };\r\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: false };\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Insert a single curve primitive into the active chains.\r\n * * The primitive is captured (not cloned)\r\n * * The primitive may be reversed in place\r\n * @param candidate curve to add to the context\r\n */\r\n public captureCurvePrimitive(candidate: CurvePrimitive) {\r\n if (this._snapTolerance < this._gapTolerance) {\r\n if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))\r\n return;\r\n }\r\n if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))\r\n return;\r\n this._chains.push([candidate]);\r\n }\r\n /**\r\n * Insert any curve into the collection.\r\n * * This recurses into Path, Loop, BagOfCurves etc\r\n * * All primitives are captured, and may be reversed in place.\r\n * @param candidate curve to add to the context\r\n */\r\n public captureCurve(candidate: AnyCurve) {\r\n if (candidate instanceof CurvePrimitive)\r\n this.captureCurvePrimitive(candidate);\r\n else if (candidate instanceof CurveCollection) {\r\n for (const c of candidate.children)\r\n this.captureCurve(c);\r\n }\r\n }\r\n /** If allowed by the geometry type, move an endpoint. */\r\n private static simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\r\n if (curve instanceof (LineSegment3d)) {\r\n if (atEnd) {\r\n curve.point1Ref.setFrom(to);\r\n } else {\r\n curve.point0Ref.setFrom(to);\r\n }\r\n return true;\r\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\r\n const i = atEnd ? curve.numPoints() - 1 : 0;\r\n curve.packedPoints.setAtCheckedPointIndex(i, to);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\r\n * * All z-coordinates are ignored.\r\n * @param curve0 first curve, assumed to end close to the start of curve1\r\n * @param curve1 second curve, assumed to start close to the end of curve0\r\n * @param gapTolerance max distance to move a curve start/end point\r\n * @returns whether curve start/end point(s) moved\r\n */\r\n private static moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive, gapTolerance: number): boolean {\r\n const xyz0 = curve0.endPoint();\r\n const xyz1 = curve1.startPoint();\r\n const minShift = Geometry.smallMetricDistance * 0.001;\r\n const d01 = xyz0.distanceXY(xyz1);\r\n if (d01 < minShift)\r\n return false;\r\n // try lines and linestrings\r\n if (d01 < gapTolerance) {\r\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\r\n return true;\r\n }\r\n // try other primitive types\r\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\r\n const shiftFactor = 5.0;\r\n for (const pair of intersections) {\r\n const detail0 = pair.detailA;\r\n const detail1 = pair.detailB;\r\n const distance0 = detail0.point.distanceXY(xyz0);\r\n const distance1 = detail1.point.distanceXY(xyz1);\r\n if (distance0 < shiftFactor * gapTolerance && distance1 < shiftFactor * gapTolerance) {\r\n if (curve0 instanceof Arc3d && curve1 instanceof Arc3d) {\r\n const radians0End = curve0.sweep.fractionToRadians(detail0.fraction);\r\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\r\n const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);\r\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\r\n return true;\r\n }\r\n // TODO: other combinations of types\r\n }\r\n }\r\n return false;\r\n }\r\n /** Announce a curve primitive\r\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\r\n * * Otherwise start a new chain.\r\n */\r\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, tolerance: number): boolean {\r\n if (candidate) {\r\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n } else {\r\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Merge two entries in the chain array.\r\n * * Move each primitive from chainB to the end of chainA.\r\n * * Clear chainB.\r\n * * Move the final chain to chainB index.\r\n * * Decrement the array length.\r\n * @param chainIndexA index of chainA\r\n * @param chainIndexB index of chainB\r\n */\r\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\r\n const chainA = this._chains[chainIndexA];\r\n const chainB = this._chains[chainIndexB];\r\n for (const p of chainB) {\r\n chainA.push(p);\r\n }\r\n chainB.length = 0; // chainIndexB is unused\r\n const lastChainIndex = this._chains.length - 1;\r\n if (chainIndexB !== lastChainIndex)\r\n this._chains[chainIndexB] = this._chains[lastChainIndex];\r\n this._chains.pop();\r\n }\r\n /** Reverse the curve chain in place. */\r\n private reverseChain(chainIndex: number) {\r\n const chain = this._chains[chainIndex];\r\n chain.reverse();\r\n for (const p of chain)\r\n p.reverseInPlace();\r\n }\r\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\r\n private searchAndMergeChainIndex(chainIndex: number, tolerance: number): void {\r\n // ASSUME valid index of non-empty chain\r\n const chain = this._chains[chainIndex];\r\n const lastIndexInChain = chain.length - 1;\r\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\r\n // try start with any other chain\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (!connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\r\n return;\r\n }\r\n // try end with any other chain\r\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\r\n return;\r\n }\r\n }\r\n /**\r\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\r\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\r\n * @param makeLoopIfClosed whether to return a Loop from physically closed curves array, otherwise Path\r\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\r\n */\r\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\r\n if (curves.length === 0)\r\n return undefined;\r\n if (makeLoopIfClosed) {\r\n const primitive0 = curves[0];\r\n const primitiveN = curves[curves.length - 1];\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n if (MultiChainCollector.moveHeadOrTail(primitiveN, primitive0, this._gapTolerance)) {\r\n // get the corrected coordinates\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n }\r\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\r\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\r\n if (localToWorld) {\r\n const worldToLocal = localToWorld.inverse();\r\n if (worldToLocal) {\r\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\r\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\r\n return Loop.createArray(curves);\r\n }\r\n }\r\n }\r\n return Path.createArray(curves);\r\n }\r\n }\r\n if (curves.length === 1)\r\n return curves[0];\r\n return Path.createArray(curves);\r\n }\r\n /** Stroke the curve chain to a line string, de-duplicate the points. */\r\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\r\n if (chain.length === 0)\r\n return undefined;\r\n const linestring = LineString3d.create();\r\n for (const curve of chain)\r\n curve.emitStrokes(linestring, options);\r\n linestring.removeDuplicatePoints(this._gapTolerance);\r\n return linestring;\r\n }\r\n /** Return the collected results, structured as the simplest possible type. */\r\n public grabResult(makeLoopIfClosed: boolean = false): AnyChain | undefined {\r\n const chains = this._chains;\r\n if (chains.length === 0)\r\n return undefined;\r\n if (chains.length === 1)\r\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\r\n const bag = BagOfCurves.create();\r\n for (const chain of chains) {\r\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\r\n bag.tryAddChild(q);\r\n }\r\n return bag;\r\n }\r\n /** Return chains as individual calls to announceChain. */\r\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\r\n const chains = this._chains;\r\n if (chains.length === 1) {\r\n const ls = this.chainToLineString3d(chains[0], options);\r\n if (ls)\r\n announceChain(ls);\r\n } else if (chains.length > 1) {\r\n for (const chain of chains) {\r\n const ls = this.chainToLineString3d(chain, options);\r\n if (ls)\r\n announceChain(ls);\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -8,7 +8,7 @@ import { Loop } from "../Loop";
|
|
|
8
8
|
import { JointOptions, OffsetOptions } from "../OffsetOptions";
|
|
9
9
|
import { Path } from "../Path";
|
|
10
10
|
/**
|
|
11
|
-
* Context for building a wire offset.
|
|
11
|
+
* Context for building a wire xy-offset.
|
|
12
12
|
* @internal
|
|
13
13
|
*/
|
|
14
14
|
export declare class PolygonWireOffsetContext {
|
|
@@ -20,8 +20,8 @@ export declare class PolygonWireOffsetContext {
|
|
|
20
20
|
private static _offsetB;
|
|
21
21
|
private static createOffsetSegment;
|
|
22
22
|
/**
|
|
23
|
-
* Construct a wire (not area) that is offset from given polyline or polygon
|
|
24
|
-
*
|
|
23
|
+
* Construct a wire (not area) that is offset from given polyline or polygon.
|
|
24
|
+
* * For best results, points should be in a horizontal plane because z-coordinates are ignored.
|
|
25
25
|
* * This is a simple wire offset (in the form of a line string), not an area.
|
|
26
26
|
* * If offsetDistance is given as a number, default OffsetOptions are applied.
|
|
27
27
|
* * See [[JointOptions]] class doc for offset construction rules.
|
|
@@ -33,7 +33,7 @@ export declare class PolygonWireOffsetContext {
|
|
|
33
33
|
constructPolygonWireXYOffset(points: Point3d[], wrap: boolean, leftOffsetDistanceOrOptions: number | JointOptions): CurveChain | undefined;
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
* Context for building a wire offset from a Path or Loop of CurvePrimitives
|
|
36
|
+
* Context for building a wire xy-offset from a Path or Loop of CurvePrimitives
|
|
37
37
|
* @internal
|
|
38
38
|
*/
|
|
39
39
|
export declare class CurveChainWireOffsetContext {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolygonOffsetContext.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,OAAO,EAAY,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"PolygonOffsetContext.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,OAAO,EAAY,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAsa/B;;;GAGG;AACH,qBAAa,wBAAwB;IACnC,2BAA2B;;IAE3B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqB;IAC9C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAqB;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAE3C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAgBlC;;;;;;;;;;OAUG;IACI,4BAA4B,CACjC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,GAAG,YAAY,GACnF,UAAU,GAAG,SAAS;CAmD1B;AAED;;;GAGG;AACH,qBAAa,2BAA2B;IACtC,2BAA2B;;IAE3B;;;;;;OAMG;WACW,eAAe,CAC3B,EAAE,EAAE,cAAc,GAAG,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,GAC7F,cAAc,GAAG,SAAS;IAS7B;;;;;;;OAOG;WACW,6BAA6B,CACzC,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,GAAG,aAAa,GACrE,cAAc,GAAG,cAAc,EAAE,GAAG,SAAS;IAehD;;;;;;;OAOG;WACW,sBAAsB,CAClC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,uBAAuB,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,GAClF,eAAe,GAAG,SAAS;CA6C/B"}
|
|
@@ -168,7 +168,10 @@ class Joint {
|
|
|
168
168
|
return numOut++ < maxTest;
|
|
169
169
|
}, maxTest);
|
|
170
170
|
}
|
|
171
|
-
/**
|
|
171
|
+
/**
|
|
172
|
+
* Execute `joint.annotateJointMode()` at all joints on the chain to set some of the joints' attributes,
|
|
173
|
+
* such as whether to extend both curves to intersection or to fill the gap between curves.
|
|
174
|
+
*/
|
|
172
175
|
static annotateChain(start, options, maxTest = 100) {
|
|
173
176
|
if (start)
|
|
174
177
|
Joint.visitJointsOnChain(start, (joint) => { joint.annotateJointMode(options); return true; }, maxTest);
|
|
@@ -200,6 +203,7 @@ class Joint {
|
|
|
200
203
|
if (this.curve0 && this.curve1) {
|
|
201
204
|
const ray0 = this.curve0.fractionToPointAndDerivative(1.0);
|
|
202
205
|
const ray1 = this.curve1.fractionToPointAndDerivative(0.0);
|
|
206
|
+
ray0.direction.z = ray1.direction.z = 0.0; // xy-offset
|
|
203
207
|
const intersection = Ray3d_1.Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines
|
|
204
208
|
if (intersection.approachType === CurveLocationDetail_1.CurveCurveApproachType.Intersection) {
|
|
205
209
|
if (intersection.detailA.fraction >= 0.0 && intersection.detailB.fraction <= 0.0) {
|
|
@@ -278,7 +282,7 @@ class Joint {
|
|
|
278
282
|
this.fraction0 = 1.0;
|
|
279
283
|
}
|
|
280
284
|
else if (this.curve0 && this.curve1) { // joints at the middle of the chain
|
|
281
|
-
if (this.curve0.endPoint().
|
|
285
|
+
if (this.curve0.endPoint().isAlmostEqualXY(this.curve1.startPoint())) { // joint between colinear xy-segments
|
|
282
286
|
this.fraction0 = 1.0;
|
|
283
287
|
this.fraction1 = 0.0;
|
|
284
288
|
this.flexure = JointMode.Trim;
|
|
@@ -286,8 +290,9 @@ class Joint {
|
|
|
286
290
|
else if (this.curve0 instanceof LineSegment3d_1.LineSegment3d && this.curve1 instanceof LineSegment3d_1.LineSegment3d) { // pair of lines
|
|
287
291
|
const ray0 = this.curve0.fractionToPointAndDerivative(0.0);
|
|
288
292
|
const ray1 = this.curve1.fractionToPointAndDerivative(0.0);
|
|
293
|
+
ray0.direction.z = ray1.direction.z = 0.0; // xy-offset
|
|
289
294
|
const intersection = Ray3d_1.Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines
|
|
290
|
-
if (intersection.approachType === CurveLocationDetail_1.CurveCurveApproachType.Intersection) {
|
|
295
|
+
if (intersection.approachType === CurveLocationDetail_1.CurveCurveApproachType.Intersection || intersection.approachType === CurveLocationDetail_1.CurveCurveApproachType.PerpendicularChord) {
|
|
291
296
|
this.fraction0 = intersection.detailA.fraction;
|
|
292
297
|
this.fraction1 = intersection.detailB.fraction;
|
|
293
298
|
if (this.fraction0 >= 1.0 && this.fraction1 <= 0.0) { // need to extend
|
|
@@ -408,7 +413,7 @@ class Joint {
|
|
|
408
413
|
}
|
|
409
414
|
}
|
|
410
415
|
/**
|
|
411
|
-
* Context for building a wire offset.
|
|
416
|
+
* Context for building a wire xy-offset.
|
|
412
417
|
* @internal
|
|
413
418
|
*/
|
|
414
419
|
class PolygonWireOffsetContext {
|
|
@@ -417,6 +422,7 @@ class PolygonWireOffsetContext {
|
|
|
417
422
|
// Construct a single offset from base points
|
|
418
423
|
static createOffsetSegment(basePointA, basePointB, distance) {
|
|
419
424
|
Point3dVector3d_1.Vector3d.createStartEnd(basePointA, basePointB, this._unitAlong);
|
|
425
|
+
this._unitAlong.z = 0.0; // xy-offset
|
|
420
426
|
if (this._unitAlong.normalizeInPlace()) {
|
|
421
427
|
this._unitAlong.rotate90CCWXY(this._unitPerp);
|
|
422
428
|
const segment = LineSegment3d_1.LineSegment3d.create(basePointA.plusScaled(this._unitPerp, distance, this._offsetA), basePointB.plusScaled(this._unitPerp, distance, this._offsetB));
|
|
@@ -426,8 +432,8 @@ class PolygonWireOffsetContext {
|
|
|
426
432
|
return undefined;
|
|
427
433
|
}
|
|
428
434
|
/**
|
|
429
|
-
* Construct a wire (not area) that is offset from given polyline or polygon
|
|
430
|
-
*
|
|
435
|
+
* Construct a wire (not area) that is offset from given polyline or polygon.
|
|
436
|
+
* * For best results, points should be in a horizontal plane because z-coordinates are ignored.
|
|
431
437
|
* * This is a simple wire offset (in the form of a line string), not an area.
|
|
432
438
|
* * If offsetDistance is given as a number, default OffsetOptions are applied.
|
|
433
439
|
* * See [[JointOptions]] class doc for offset construction rules.
|
|
@@ -437,36 +443,34 @@ class PolygonWireOffsetContext {
|
|
|
437
443
|
* object.
|
|
438
444
|
*/
|
|
439
445
|
constructPolygonWireXYOffset(points, wrap, leftOffsetDistanceOrOptions) {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
*/
|
|
444
|
-
if (wrap && !points[0].isAlmostEqual(points[points.length - 1])) {
|
|
445
|
-
wrap = false;
|
|
446
|
-
}
|
|
447
|
-
/** create raw offsets as a linked list (joint0) */
|
|
446
|
+
if (wrap && !points[0].isAlmostEqual(points[points.length - 1]))
|
|
447
|
+
wrap = false; // no wrap possible for polylines
|
|
448
|
+
// create raw offset segments as a linked list of Joints, starting with joint0
|
|
448
449
|
const options = OffsetOptions_1.JointOptions.create(leftOffsetDistanceOrOptions);
|
|
449
450
|
const numPoints = points.length;
|
|
450
|
-
let fragment0
|
|
451
|
-
let joint0
|
|
452
|
-
let
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
451
|
+
let fragment0;
|
|
452
|
+
let joint0, previousJoint;
|
|
453
|
+
for (let i = 0; i + 1 < numPoints; ++i) {
|
|
454
|
+
if (!previousJoint) { // start the linked list at the first nontrivial xy-segment
|
|
455
|
+
if (fragment0 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance))
|
|
456
|
+
previousJoint = joint0 = new Joint(undefined, fragment0, points[i]);
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
const fragment1 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance);
|
|
460
|
+
if (fragment1) { // append the next nontrivial xy-segment
|
|
461
|
+
const newJoint = new Joint(fragment0, fragment1, points[i]);
|
|
462
|
+
Joint.link(previousJoint, newJoint);
|
|
463
|
+
previousJoint = newJoint;
|
|
464
|
+
fragment0 = fragment1;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
466
467
|
}
|
|
467
|
-
|
|
468
|
+
if (!fragment0 || !previousJoint || !joint0)
|
|
469
|
+
return undefined; // no edge with positive xy-length
|
|
470
|
+
const lastJoint = wrap ? joint0 : new Joint(fragment0, undefined, points[numPoints - 1]);
|
|
471
|
+
Joint.link(previousJoint, lastJoint);
|
|
468
472
|
Joint.annotateChain(joint0, options, numPoints);
|
|
469
|
-
|
|
473
|
+
// make limited passes through the Joint chain until no self-intersections are removed
|
|
470
474
|
for (let pass = 0; pass++ < 5;) {
|
|
471
475
|
const state = Joint.removeDegeneratePrimitives(joint0, options, numPoints);
|
|
472
476
|
joint0 = state.newStart;
|
|
@@ -479,10 +483,8 @@ class PolygonWireOffsetContext {
|
|
|
479
483
|
}
|
|
480
484
|
*/
|
|
481
485
|
}
|
|
482
|
-
// Joint.collectPrimitivesFromChain(joint0, result, numPoints);
|
|
483
|
-
/** turn the Joint linked list into a CurveCollection (Loop or Path). trimming is done in collectStrokesFromChain */
|
|
484
486
|
const chain = LineString3d_1.LineString3d.create();
|
|
485
|
-
Joint.collectStrokesFromChain(joint0, chain, numPoints);
|
|
487
|
+
Joint.collectStrokesFromChain(joint0, chain, numPoints); // compute offset corners (by extension/trim)
|
|
486
488
|
const n = chain.packedPoints.length;
|
|
487
489
|
if (n > 1) {
|
|
488
490
|
if (chain.packedPoints.front().isAlmostEqual(chain.packedPoints.back()))
|
|
@@ -499,7 +501,7 @@ PolygonWireOffsetContext._offsetA = Point3dVector3d_1.Point3d.create();
|
|
|
499
501
|
PolygonWireOffsetContext._offsetB = Point3dVector3d_1.Point3d.create();
|
|
500
502
|
exports.PolygonWireOffsetContext = PolygonWireOffsetContext;
|
|
501
503
|
/**
|
|
502
|
-
* Context for building a wire offset from a Path or Loop of CurvePrimitives
|
|
504
|
+
* Context for building a wire xy-offset from a Path or Loop of CurvePrimitives
|
|
503
505
|
* @internal
|
|
504
506
|
*/
|
|
505
507
|
class CurveChainWireOffsetContext {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolygonOffsetContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurveCurveApproachType, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { JointOptions, OffsetOptions } from \"../OffsetOptions\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n// cspell:word CCWXY\r\n\r\n/**\r\n * Classification of how the joint is constructed.\r\n * @internal\r\n */\r\nenum JointMode {\r\n Unknown = 0, /** used when joint mode is unknown. */\r\n Cap = 1, /** used to annotate a \"Joint\" at the start/end of a curve without wrap (so there's no \"other\" curve). */\r\n Extend = 2, /** used when offset curves do not intersect and needs expanding to connect. */\r\n Trim = -1, /** used when offset curves intersect and still goes beyond the intersection so need trimming. */\r\n JustGeometry = 3, /** unused */\r\n Gap = 4, /** used when joint construction fails, resulting in a gap in the offset filled by a line segment. */\r\n}\r\n\r\n/**\r\n * Description of geometry around a joint.\r\n * @internal\r\n */\r\nclass Joint {\r\n /** Enumeration of how the joint is constructed */\r\n public flexure: JointMode;\r\n /** Curve before the joint */\r\n public curve0?: CurvePrimitive;\r\n /** Fractional position on curve0 (may be a trim or extension) */\r\n public fraction0?: number;\r\n /** Curve after the joint (may be a trim or extension) */\r\n public curve1?: CurvePrimitive;\r\n /** Fractional position on curve1 */\r\n public fraction1?: number;\r\n /** Curve to be added within the joint */\r\n public jointCurve?: CurvePrimitive;\r\n /** Common point on the original curves */\r\n public swingPoint?: Point3d;\r\n /** Pointer to next joint */\r\n public nextJoint?: Joint;\r\n /** Pointer to previous joint */\r\n public previousJoint?: Joint;\r\n // capture references to all data . . .\r\n public constructor(\r\n curve0: CurvePrimitive | undefined, curve1: CurvePrimitive | undefined, swingPoint: Point3d | undefined,\r\n ) {\r\n this.curve0 = curve0;\r\n this.curve1 = curve1;\r\n this.swingPoint = swingPoint;\r\n this.flexure = JointMode.Unknown;\r\n }\r\n /**\r\n * Try to construct an arc transition from ray0 to ray1 with given center.\r\n */\r\n public static constructArc(ray0: Ray3d, center: Point3d | undefined, ray1: Ray3d): Arc3d | undefined {\r\n if (center !== undefined && Geometry.isSameCoordinate(ray0.origin.distance(center), ray1.origin.distance(center))) {\r\n const angle = ray0.direction.angleToXY(ray1.direction);\r\n const vector0 = Vector3d.createStartEnd(center, ray0.origin);\r\n const vector90 = vector0.rotate90CCWXY();\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, angle.radians));\r\n }\r\n return undefined;\r\n }\r\n /** Extract a json object of {curve0:data, fraction0:data, curve1:data, fraction1:data} */\r\n public shallowExtract(): any {\r\n return { curve0: this.curve0, curve1: this.curve1, fraction0: this.fraction0, fraction1: this.fraction1 };\r\n }\r\n /** Establish the nextJoint and previousJoint links from joint0 to joint1. */\r\n public static link(joint0: Joint, joint1: Joint | undefined) {\r\n joint0.nextJoint = joint1;\r\n if (joint1)\r\n joint1.previousJoint = joint0;\r\n if (joint0.curve1 && joint1 && !joint1.curve0)\r\n joint1.curve0 = joint0.curve1;\r\n else if (!joint0.curve1 && joint1 && joint1.curve0)\r\n joint0.curve1 = joint1.curve0;\r\n }\r\n /**\r\n * * If nextJoint and nextJoint.fraction0 are defined, return them.\r\n * * Otherwise return defaultValue\r\n */\r\n public nextJointFraction0(defaultValue: number): number {\r\n if (this.nextJoint && this.nextJoint.fraction0 !== undefined)\r\n return this.nextJoint.fraction0;\r\n return defaultValue;\r\n }\r\n private static addStrokes(destination: LineString3d, curve?: CurvePrimitive) {\r\n if (curve) {\r\n curve.emitStrokes(destination);\r\n }\r\n }\r\n private static addPoint(destination: LineString3d, point: Point3d) {\r\n if (destination.packedPoints.length > 0) {\r\n const pointA = destination.endPoint();\r\n if (!pointA.isAlmostEqual(point))\r\n destination.packedPoints.push(point);\r\n }\r\n }\r\n /** Append stroke points along the offset curve defined by the Joint chain to the destination line string. */\r\n public static collectStrokesFromChain(start: Joint, destination: LineString3d, maxTest: number = 100) {\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.addStrokes(destination, joint.jointCurve);\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n if (curve1) {\r\n if (!joint.jointCurve) {\r\n this.addPoint(destination, curve1.startPoint());\r\n }\r\n }\r\n this.addStrokes(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n private static collectPrimitive(destination: CurvePrimitive[], primitive?: CurvePrimitive) {\r\n if (primitive) {\r\n if (destination.length > 0) {\r\n const pointA = destination[destination.length - 1].endPoint();\r\n const pointB = primitive.startPoint();\r\n if (!pointA.isAlmostEqual(pointB)) {\r\n destination.push(LineSegment3d.create(pointA, pointB));\r\n }\r\n }\r\n destination.push(primitive);\r\n }\r\n }\r\n private static adjustJointToPrimitives(joint: Joint) {\r\n const ls = joint.jointCurve;\r\n if (ls instanceof LineString3d) {\r\n if (joint.curve0) {\r\n const curvePoint = joint.curve0.endPoint();\r\n const jointPoint0 = ls.startPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint0))\r\n ls.packedPoints.setAtCheckedPointIndex(0, curvePoint);\r\n }\r\n if (joint.curve1) {\r\n const curvePoint = joint.curve1.startPoint();\r\n const jointPoint1 = ls.endPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint1))\r\n ls.packedPoints.setAtCheckedPointIndex(ls.packedPoints.length - 1, curvePoint);\r\n }\r\n }\r\n }\r\n /** Append CurvePrimitives along the offset curve defined by the Joint chain to the destination array. */\r\n public static collectCurvesFromChain(start: Joint | undefined, destination: CurvePrimitive[], maxTest: number = 100) {\r\n if (start === undefined)\r\n return;\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.adjustJointToPrimitives(joint);\r\n this.collectPrimitive(destination, joint.jointCurve);\r\n\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n this.collectPrimitive(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n /** Execute `joint.annotateJointMode()` at all joints on the chain to set some of the joints attributes. */\r\n public static annotateChain(start: Joint | undefined, options: JointOptions, maxTest: number = 100) {\r\n if (start)\r\n Joint.visitJointsOnChain(start, (joint: Joint) => { joint.annotateJointMode(options); return true; }, maxTest);\r\n }\r\n /**\r\n * Visit joints on a chain.\r\n * * terminate on `false` return from `callback`\r\n * @param start first (and, for cyclic chain, final) joint\r\n * @param callback function to call with each Joint as a single parameter.\r\n */\r\n public static visitJointsOnChain(start: Joint, callback: (joint: Joint) => boolean, maxTest: number = 100): boolean {\r\n let joint: Joint | undefined = start;\r\n if (joint) {\r\n let numTest = 0;\r\n while (joint !== undefined) {\r\n if (numTest++ >= maxTest + 5) // allow extra things to happen\r\n return true;\r\n if (!callback(joint))\r\n return false;\r\n joint = joint.nextJoint;\r\n if (joint === start)\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n /** NOTE: no assumption on type of curve0, curve1 */\r\n private annotateExtension(options: JointOptions) {\r\n if (this.curve0 && this.curve1) {\r\n const ray0 = this.curve0.fractionToPointAndDerivative(1.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n if (intersection.detailA.fraction >= 0.0 && intersection.detailB.fraction <= 0.0) {\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Extend;\r\n const theta = ray0.getDirectionRef().angleToXY(ray1.getDirectionRef()); // angle between the 2 ray lines\r\n if (options.needArc(theta)) {\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc) {\r\n this.jointCurve = arc;\r\n return;\r\n }\r\n }\r\n const numChamferPoints = options.numChamferPoints(theta); // how many interior points in the linestring\r\n if (numChamferPoints <= 1) { // create sharp corner\r\n this.jointCurve = LineString3d.create(ray0.origin, intersection.detailA.point, ray1.origin);\r\n return;\r\n }\r\n if (numChamferPoints > 1) { // create chamfer corner (a line string)\r\n const radians0 = theta.radians;\r\n const numHalfStep = 2.0 * numChamferPoints;\r\n const halfStepRadians = radians0 / numHalfStep;\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc !== undefined) {\r\n const radialFraction = 1 / Math.cos(halfStepRadians);\r\n const jointCurve = LineString3d.create();\r\n this.jointCurve = jointCurve;\r\n jointCurve.addPoint(ray0.origin); // possibly extend segment or line string\r\n\r\n for (let i = 0; i < numChamferPoints; i++) {\r\n const arcFraction = (1 + 2 * i) / numHalfStep;\r\n jointCurve.addPoint(arc.fractionAndRadialFractionToPoint(arcFraction, radialFraction));\r\n }\r\n jointCurve.addPoint(ray1.origin); // possibly extend segment or line string.\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n // if there is no intersection between the 2 ray lines, fill the gap by a line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n /** Select the index at which summed fraction difference is smallest */\r\n private selectIntersectionIndexByFraction(\r\n fractionA: number, fractionB: number, intersections: CurveLocationDetailPair[],\r\n ): number {\r\n let index = -1;\r\n let aMin = Number.MAX_VALUE;\r\n for (let i = 0; i < intersections.length; i++) {\r\n const a = Math.abs(intersections[i].detailA.fraction - fractionA)\r\n + Math.abs(intersections[i].detailB.fraction - fractionB);\r\n if (a < aMin) {\r\n aMin = a;\r\n index = i;\r\n }\r\n }\r\n return index;\r\n }\r\n /**\r\n * Examine the adjacent geometry to set some of joint attributes:\r\n * * set JointMode: one of Cap, Extend, or Trim\r\n * * set fraction0 and fraction1 of intersection of curve0 and curve1\r\n * * set joint curve\r\n * * this REFERENCES curve0, curve1, fraction0, fraction1\r\n * * this does not reference nextJoint and previousJoint\r\n */\r\n public annotateJointMode(options: JointOptions): void {\r\n if (!this.curve0 && this.curve1) { // joint at the start of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction1 = 0.0;\r\n } else if (this.curve0 && !this.curve1) { // joint at the end of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction0 = 1.0;\r\n } else if (this.curve0 && this.curve1) { // joints at the middle of the chain\r\n if (this.curve0.endPoint().isAlmostEqual(this.curve1.startPoint())) { // joint between colinear segments\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Trim;\r\n } else if (this.curve0 instanceof LineSegment3d && this.curve1 instanceof LineSegment3d) { // pair of lines\r\n const ray0 = this.curve0.fractionToPointAndDerivative(0.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n this.fraction0 = intersection.detailA.fraction;\r\n this.fraction1 = intersection.detailB.fraction;\r\n if (this.fraction0 >= 1.0 && this.fraction1 <= 0.0) { // need to extend\r\n this.annotateExtension(options);\r\n } else if (this.fraction0 < 1.0 && this.fraction1 > 0.0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n } else if (this.fraction0 > 1.0 && this.fraction1 > 1.0) { // need to fill gap with a single line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n } else { // generic pair of curves\r\n const intersections = CurveCurve.intersectionXYPairs(this.curve0, false, this.curve1, false);\r\n const intersectionIndex = this.selectIntersectionIndexByFraction(1.0, 0.0, intersections);\r\n if (intersectionIndex >= 0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n this.fraction0 = intersections[intersectionIndex].detailA.fraction;\r\n this.fraction1 = intersections[intersectionIndex].detailB.fraction;\r\n } else { // need to extend\r\n this.annotateExtension(options);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * * Examine the primitive trim fractions between each pair of joints.\r\n * * If trim fractions indicate the primitive must disappear, replace the joint pair by a new joint pointing at\r\n * surrounding primitives\r\n * @param start\r\n */\r\n public static removeDegeneratePrimitives(\r\n start: Joint, options: JointOptions, maxTest: number,\r\n ): { newStart: Joint, numJointRemoved: number } {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\"\\nENTER removeDegenerates\");\r\n */\r\n let jointA: Joint | undefined = start;\r\n let numRemoved = 0;\r\n const maxRemove = 1;\r\n let numTest = 0;\r\n if (jointA) {\r\n while (jointA !== undefined && numTest++ < maxTest) {\r\n const jointB = jointA.nextJoint;\r\n if (jointA\r\n && jointB\r\n && jointA.previousJoint\r\n && jointB.nextJoint\r\n && jointA.fraction1 !== undefined\r\n && jointB.fraction0 !== undefined\r\n ) {\r\n const f0 = jointA.fraction1;\r\n const f1 = jointB.fraction0;\r\n const g0 = jointB.fraction1;\r\n const g1 = jointB.nextJoint.fraction0;\r\n // f0 and f1 are fractions on the single primitive between these joints.\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\"joint candidate\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointA.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointB.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(\"FRACTIONS \", { fA1: f0, fB0: f1 });\r\n }\r\n */\r\n const eliminateF = f0 >= f1 || f0 > 1.0;\r\n const eliminateG = (g0 !== undefined && g0 > 1.0) || (g0 !== undefined && g1 !== undefined && g0 >= g1);\r\n if (eliminateF && eliminateG) {\r\n const jointC = jointB.nextJoint;\r\n const newJoint: Joint = new Joint(jointA.curve0, jointC.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointC.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n if (newJoint.nextJoint)\r\n newJoint.nextJoint.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW DOUBLE CUT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n } else if (eliminateF) {\r\n const newJoint: Joint = new Joint(jointA.curve0, jointB.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointB.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n newJoint.nextJoint!.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW JOINT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n numRemoved++;\r\n if (jointA === start)\r\n start = newJoint;\r\n jointA = newJoint;\r\n if (numRemoved >= maxRemove) {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\" EXIT removeDegenerates at maxRemove\\n\");\r\n */\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n }\r\n }\r\n jointA = jointA.nextJoint;\r\n if (jointA === start)\r\n break;\r\n }\r\n }\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire offset.\r\n * @internal\r\n */\r\nexport class PolygonWireOffsetContext {\r\n /** Construct a context. */\r\n public constructor() { }\r\n private static _unitAlong = Vector3d.create();\r\n private static _unitPerp = Vector3d.create();\r\n private static _offsetA = Point3d.create();\r\n private static _offsetB = Point3d.create();\r\n // Construct a single offset from base points\r\n private static createOffsetSegment(\r\n basePointA: Point3d, basePointB: Point3d, distance: number,\r\n ): CurvePrimitive | undefined {\r\n Vector3d.createStartEnd(basePointA, basePointB, this._unitAlong);\r\n if (this._unitAlong.normalizeInPlace()) {\r\n this._unitAlong.rotate90CCWXY(this._unitPerp);\r\n const segment = LineSegment3d.create(\r\n basePointA.plusScaled(this._unitPerp, distance, this._offsetA),\r\n basePointB.plusScaled(this._unitPerp, distance, this._offsetB),\r\n );\r\n CurveChainWireOffsetContext.applyBasePoints(segment, basePointA.clone(), basePointB.clone());\r\n return segment;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct a wire (not area) that is offset from given polyline or polygon (which must be in xy-plane or in\r\n * a plane parallel to xy-plane).\r\n * * This is a simple wire offset (in the form of a line string), not an area.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * See [[JointOptions]] class doc for offset construction rules.\r\n * @param points a single loop or path\r\n * @param wrap true to offset the wraparound joint. Assumes first = last point.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or JointOptions\r\n * object.\r\n */\r\n public constructPolygonWireXYOffset(\r\n points: Point3d[], wrap: boolean, leftOffsetDistanceOrOptions: number | JointOptions,\r\n ): CurveChain | undefined {\r\n /**\r\n * if \"wrap = true\", then first and last point in the points array must be close; otherwise\r\n * generated offset will be invalid.\r\n */\r\n if (wrap && !points[0].isAlmostEqual(points[points.length - 1])) {\r\n wrap = false;\r\n }\r\n /** create raw offsets as a linked list (joint0) */\r\n const options = JointOptions.create(leftOffsetDistanceOrOptions);\r\n const numPoints = points.length;\r\n let fragment0 = PolygonWireOffsetContext.createOffsetSegment(points[0], points[1], options.leftOffsetDistance);\r\n let joint0 = new Joint(undefined, fragment0, points[0]);\r\n let newJoint;\r\n let previousJoint = joint0;\r\n for (let i = 1; i + 1 < numPoints; i++) {\r\n const fragment1 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance);\r\n newJoint = new Joint(fragment0, fragment1, points[i]);\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n if (wrap)\r\n Joint.link(previousJoint, joint0);\r\n else {\r\n newJoint = new Joint(fragment0, undefined, points[numPoints - 1]);\r\n Joint.link(previousJoint, newJoint);\r\n }\r\n /** annotateChain sets some of the joints attributes (including how to extend curves or fill the gap between curves) */\r\n Joint.annotateChain(joint0, options, numPoints);\r\n /** make limited passes through the Joint chain until no self-intersections are removed */\r\n for (let pass = 0; pass++ < 5;) {\r\n const state = Joint.removeDegeneratePrimitives(joint0, options, numPoints);\r\n joint0 = state.newStart;\r\n if (state.numJointRemoved === 0)\r\n break;\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" POST REMOVE DEGENERATES \" + state.numJointRemoved);\r\n Joint.visitJointsOnChain(joint0, (joint: Joint) => { GeometryCoreTestIO.consoleLog(prettyPrint(joint.shallowExtract())); return true; });\r\n }\r\n */\r\n }\r\n // Joint.collectPrimitivesFromChain(joint0, result, numPoints);\r\n /** turn the Joint linked list into a CurveCollection (Loop or Path). trimming is done in collectStrokesFromChain */\r\n const chain = LineString3d.create();\r\n Joint.collectStrokesFromChain(joint0, chain, numPoints);\r\n const n = chain.packedPoints.length;\r\n if (n > 1) {\r\n if (chain.packedPoints.front()!.isAlmostEqual(chain.packedPoints.back()!))\r\n return Loop.create(chain);\r\n else\r\n return Path.create(chain);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire offset from a Path or Loop of CurvePrimitives\r\n * @internal\r\n */\r\nexport class CurveChainWireOffsetContext {\r\n /** construct a context. */\r\n public constructor() { }\r\n /**\r\n * Annotate a CurvePrimitive with properties `baseCurveStart` and `baseCurveEnd`.\r\n * @param cp curve primitive to annotate\r\n * @param startPoint optional start point\r\n * @param endPoint optional end point\r\n * @return the input CurvePrimitive with annotations\r\n */\r\n public static applyBasePoints(\r\n cp: CurvePrimitive | undefined, startPoint: Point3d | undefined, endPoint: Point3d | undefined,\r\n ): CurvePrimitive | undefined {\r\n if (cp !== undefined) {\r\n if (startPoint !== undefined)\r\n (cp as any).baseCurveStart = startPoint;\r\n if (endPoint !== undefined)\r\n (cp as any).baseCurveEnd = endPoint;\r\n }\r\n return cp;\r\n }\r\n /**\r\n * Create the offset of a single curve primitive as viewed in the xy-plane (ignoring z).\r\n * * Each primitive may be labeled (as an `any` object) with start or end point of base curve:\r\n * * `(primitive as any).baseCurveStart: Point3d`\r\n * * `(primitive as any).baseCurveEnd: Point3d`\r\n * @param curve primitive to offset\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object\r\n */\r\n public static createSingleOffsetPrimitiveXY(\r\n curve: CurvePrimitive, offsetDistanceOrOptions: number | OffsetOptions,\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const offset = curve.constructOffsetXY(offsetDistanceOrOptions);\r\n if (offset === undefined)\r\n return undefined;\r\n // decorate each offset with its base curve's endpoints\r\n if (Array.isArray(offset)) {\r\n const basePrims = curve.collectCurvePrimitives(undefined, true, true);\r\n if (basePrims.length !== offset.length)\r\n return undefined; // unexpected aggregate curve type!\r\n for (let i = 0; i < basePrims.length; ++i)\r\n this.applyBasePoints(offset[i], basePrims[i].startPoint(), basePrims[i].endPoint());\r\n return offset;\r\n }\r\n return this.applyBasePoints(offset, curve.startPoint(), curve.endPoint());\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\r\n * not detect self intersection among widely separated edges.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Offset\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(\r\n curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions,\r\n ): CurveCollection | undefined {\r\n const wrap: boolean = curves instanceof Loop;\r\n const offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n const simpleOffsets: CurvePrimitive[] = [];\r\n /** traverse primitives (children of curves) and create simple offsets of each primitive as an array */\r\n for (const c of curves.children) {\r\n const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);\r\n if (c1 === undefined) {\r\n // bad .. maybe arc to inside?\r\n } else if (c1 instanceof CurvePrimitive) {\r\n simpleOffsets.push(c1);\r\n } else if (Array.isArray(c1)) {\r\n for (const c2 of c1) {\r\n if (c2 instanceof CurvePrimitive)\r\n simpleOffsets.push(c2);\r\n }\r\n }\r\n }\r\n /** create joints between array elements to make offsets as a linked list (joint0) */\r\n let fragment0;\r\n let newJoint;\r\n let previousJoint;\r\n let joint0;\r\n for (const fragment1 of simpleOffsets) {\r\n if (fragment1) {\r\n newJoint = new Joint(fragment0, fragment1, fragment1.fractionToPoint(0.0));\r\n if (newJoint !== undefined)\r\n if (joint0 === undefined)\r\n joint0 = newJoint;\r\n if (previousJoint)\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n if (joint0 && previousJoint && curves instanceof Loop)\r\n Joint.link(previousJoint, joint0);\r\n /** annotateChain sets some of the joints attributes (including how to extend curves or fill the gap between curves) */\r\n const numOffset = simpleOffsets.length;\r\n Joint.annotateChain(joint0, offsetOptions.jointOptions, numOffset);\r\n /** turn the Joint linked list into a CurveCollection. trimming is done in collectCurvesFromChain */\r\n const outputCurves: CurvePrimitive[] = [];\r\n Joint.collectCurvesFromChain(joint0, outputCurves, numOffset);\r\n return RegionOps.createLoopPathOrBagOfCurves(outputCurves, wrap, true);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"PolygonOffsetContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,6CAA0C;AAC1C,4DAAyD;AACzD,sEAAqE;AACrE,kDAA+C;AAC/C,oCAAiC;AAEjC,8CAA2C;AAC3C,gEAAyF;AACzF,sDAAmD;AACnD,oDAAiD;AACjD,kDAA+C;AAC/C,kCAA+B;AAC/B,oDAA+D;AAC/D,kCAA+B;AAC/B,4CAAyC;AAEzC,oBAAoB;AAEpB;;;GAGG;AACH,IAAK,SAOJ;AAPD,WAAK,SAAS;IACZ,+CAAW,CAAA;IACX,uCAAO,CAAA;IACP,6CAAU,CAAA;IACV,0CAAS,CAAA;IACT,yDAAgB,CAAA;IAChB,uCAAO,CAAA;AACT,CAAC,EAPI,SAAS,KAAT,SAAS,QAOb;AAED;;;GAGG;AACH,MAAM,KAAK;IAmBT,uCAAuC;IACvC,YACE,MAAkC,EAAE,MAAkC,EAAE,UAA+B;QAEvG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IACnC,CAAC;IACD;;OAEG;IACI,MAAM,CAAC,YAAY,CAAC,IAAW,EAAE,MAA2B,EAAE,IAAW;QAC9E,IAAI,MAAM,KAAK,SAAS,IAAI,mBAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;YACjH,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,0BAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACzC,OAAO,aAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,uBAAU,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;SACtG;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,0FAA0F;IACnF,cAAc;QACnB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5G,CAAC;IACD,6EAA6E;IACtE,MAAM,CAAC,IAAI,CAAC,MAAa,EAAE,MAAyB;QACzD,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;QAC1B,IAAI,MAAM;YACR,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM;YAC3C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;aAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM;YAChD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,CAAC;IACD;;;OAGG;IACI,kBAAkB,CAAC,YAAoB;QAC5C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS;YAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAClC,OAAO,YAAY,CAAC;IACtB,CAAC;IACO,MAAM,CAAC,UAAU,CAAC,WAAyB,EAAE,KAAsB;QACzE,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;SAChC;IACH,CAAC;IACO,MAAM,CAAC,QAAQ,CAAC,WAAyB,EAAE,KAAc;QAC/D,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;gBAC9B,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACxC;IACH,CAAC;IACD,6GAA6G;IACtG,MAAM,CAAC,uBAAuB,CAAC,KAAY,EAAE,WAAyB,EAAE,UAAkB,GAAG;QAClG,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,+BAA+B;QAC1D,KAAK,CAAC,kBAAkB,CACtB,KAAK,EACL,CAAC,KAAY,EAAE,EAAE;YACf,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;gBACjD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,MAAM,CAAC;gBACX,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;oBAC1B,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;qBAC3B,IAAI,EAAE,GAAG,EAAE;oBACd,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,wCAAwC;gBAC3F,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;wBACrB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;qBACjD;iBACF;gBACD,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;aACtC;YACD,OAAO,MAAM,EAAE,GAAG,OAAO,CAAC;QAC5B,CAAC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IACO,MAAM,CAAC,gBAAgB,CAAC,WAA6B,EAAE,SAA0B;QACvF,IAAI,SAAS,EAAE;YACb,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;oBACjC,WAAW,CAAC,IAAI,CAAC,6BAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;iBACxD;aACF;YACD,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC7B;IACH,CAAC;IACO,MAAM,CAAC,uBAAuB,CAAC,KAAY;QACjD,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;QAC5B,IAAI,EAAE,YAAY,2BAAY,EAAE;YAC9B,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC3C,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC;oBACxC,EAAE,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;aACzD;YACD,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC;oBACxC,EAAE,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;aAClF;SACF;IACH,CAAC;IACD,yGAAyG;IAClG,MAAM,CAAC,sBAAsB,CAAC,KAAwB,EAAE,WAA6B,EAAE,UAAkB,GAAG;QACjH,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO;QACT,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,+BAA+B;QAC1D,KAAK,CAAC,kBAAkB,CACtB,KAAK,EACL,CAAC,KAAY,EAAE,EAAE;YACf,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAErD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;gBACjD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,MAAM,CAAC;gBACX,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;oBAC1B,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;qBAC3B,IAAI,EAAE,GAAG,EAAE;oBACd,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,wCAAwC;gBAC3F,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;aAC5C;YACD,OAAO,MAAM,EAAE,GAAG,OAAO,CAAC;QAC5B,CAAC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,aAAa,CAAC,KAAwB,EAAE,OAAqB,EAAE,UAAkB,GAAG;QAChG,IAAI,KAAK;YACP,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,KAAY,EAAE,EAAE,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnH,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,kBAAkB,CAAC,KAAY,EAAE,QAAmC,EAAE,UAAkB,GAAG;QACvG,IAAI,KAAK,GAAsB,KAAK,CAAC;QACrC,IAAI,KAAK,EAAE;YACT,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,OAAO,KAAK,KAAK,SAAS,EAAE;gBAC1B,IAAI,OAAO,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,+BAA+B;oBAC3D,OAAO,IAAI,CAAC;gBACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAClB,OAAO,KAAK,CAAC;gBACf,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;gBACxB,IAAI,KAAK,KAAK,KAAK;oBACjB,MAAM;aACT;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,oDAAoD;IAC5C,iBAAiB,CAAC,OAAqB;QAC7C,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,YAAY;YACxD,MAAM,YAAY,GAAG,aAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,kCAAkC;YACpG,IAAI,YAAY,CAAC,YAAY,KAAK,4CAAsB,CAAC,YAAY,EAAE;gBACrE,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,EAAE;oBAChF,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;oBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;oBACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;oBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,gCAAgC;oBACxG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAG,IAAI,CAAC,MAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;wBAC9E,IAAI,GAAG,EAAE;4BACP,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;4BACtB,OAAO;yBACR;qBACF;oBACD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,6CAA6C;oBACvG,IAAI,gBAAgB,IAAI,CAAC,EAAE,EAAE,sBAAsB;wBACjD,IAAI,CAAC,UAAU,GAAG,2BAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC5F,OAAO;qBACR;oBACD,IAAI,gBAAgB,GAAG,CAAC,EAAE,EAAE,wCAAwC;wBAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;wBAC/B,MAAM,WAAW,GAAG,GAAG,GAAG,gBAAgB,CAAC;wBAC3C,MAAM,eAAe,GAAG,QAAQ,GAAG,WAAW,CAAC;wBAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAG,IAAI,CAAC,MAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;wBAC9E,IAAI,GAAG,KAAK,SAAS,EAAE;4BACrB,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;4BACrD,MAAM,UAAU,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;4BACzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;4BAC7B,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,yCAAyC;4BAE3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE;gCACzC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC;gCAC9C,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;6BACxF;4BACD,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,0CAA0C;4BAC5E,OAAO;yBACR;qBACF;iBACF;aACF;YACD,sFAAsF;YACtF,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,6BAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3G,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;SACtB;IACH,CAAC;IACD,uEAAuE;IAC/D,iCAAiC,CACvC,SAAiB,EAAE,SAAiB,EAAE,aAAwC;QAE9E,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,IAAI,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;kBAC7D,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,GAAG,IAAI,EAAE;gBACZ,IAAI,GAAG,CAAC,CAAC;gBACT,KAAK,GAAG,CAAC,CAAC;aACX;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;OAOG;IACI,iBAAiB,CAAC,OAAqB;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,kCAAkC;YACnE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;SACtB;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gCAAgC;YACxE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;SACtB;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,oCAAoC;YAC3E,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,qCAAqC;gBAC3G,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;aAC/B;iBAAM,IAAI,IAAI,CAAC,MAAM,YAAY,6BAAa,IAAI,IAAI,CAAC,MAAM,YAAY,6BAAa,EAAE,EAAE,gBAAgB;gBACzG,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,YAAY;gBACxD,MAAM,YAAY,GAAG,aAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,kCAAkC;gBACpG,IAAI,YAAY,CAAC,YAAY,KAAK,4CAAsB,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY,KAAK,4CAAsB,CAAC,kBAAkB,EAAE;oBAChJ,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;oBAC/C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;oBAC/C,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,iBAAiB;wBACrE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;qBACjC;yBAAM,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,eAAe;wBACxE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;qBAC/B;yBAAM,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,8CAA8C;wBACvG,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;wBAC7B,IAAI,CAAC,UAAU,GAAG,6BAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC3G,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;wBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;qBACtB;iBACF;aACF;iBAAM,EAAE,yBAAyB;gBAChC,MAAM,aAAa,GAAG,uBAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC7F,MAAM,iBAAiB,GAAG,IAAI,CAAC,iCAAiC,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1F,IAAI,iBAAiB,IAAI,CAAC,EAAE,EAAE,eAAe;oBAC3C,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;oBAC9B,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACnE,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;iBACpE;qBAAM,EAAE,iBAAiB;oBACxB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;iBACjC;aACF;SACF;IACH,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,0BAA0B,CACtC,KAAY,EAAE,OAAqB,EAAE,OAAe;QAEpD;;;UAGE;QACF,IAAI,MAAM,GAAsB,KAAK,CAAC;QACtC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,MAAM,EAAE;YACV,OAAO,MAAM,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG,OAAO,EAAE;gBAClD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;gBAChC,IAAI,MAAM;uBACL,MAAM;uBACN,MAAM,CAAC,aAAa;uBACpB,MAAM,CAAC,SAAS;uBAChB,MAAM,CAAC,SAAS,KAAK,SAAS;uBAC9B,MAAM,CAAC,SAAS,KAAK,SAAS,EACjC;oBACA,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;oBACtC,wEAAwE;oBACxE;;;;;;;sBAOE;oBACF,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;oBACxC,MAAM,UAAU,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxG,IAAI,UAAU,IAAI,UAAU,EAAE;wBAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;wBAChC,MAAM,QAAQ,GAAU,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;wBAC3E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;wBACvC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACpC,QAAQ,CAAC,aAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACnD,IAAI,QAAQ,CAAC,SAAS;4BACpB,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAChD;;;;;0BAKE;qBACH;yBAAM,IAAI,UAAU,EAAE;wBACrB,MAAM,QAAQ,GAAU,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;wBAC3E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;wBACvC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACpC,QAAQ,CAAC,aAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACnD,QAAQ,CAAC,SAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAC/C;;;;;wBAKA;wBACA,UAAU,EAAE,CAAC;wBACb,IAAI,MAAM,KAAK,KAAK;4BAClB,KAAK,GAAG,QAAQ,CAAC;wBACnB,MAAM,GAAG,QAAQ,CAAC;wBAClB,IAAI,UAAU,IAAI,SAAS,EAAE;4BAC3B;;;8BAGE;4BACF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;yBACzD;qBACF;iBACF;gBACD,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC1B,IAAI,MAAM,KAAK,KAAK;oBAClB,MAAM;aACT;SACF;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;IAC1D,CAAC;CACF;AAED;;;GAGG;AACH,MAAa,wBAAwB;IACnC,2BAA2B;IAC3B,gBAAuB,CAAC;IAKxB,6CAA6C;IACrC,MAAM,CAAC,mBAAmB,CAChC,UAAmB,EAAE,UAAmB,EAAE,QAAgB;QAE1D,0BAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,YAAY;QACtC,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE;YACtC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,6BAAa,CAAC,MAAM,CAClC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAC9D,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAC/D,CAAC;YACF,2BAA2B,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7F,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;;;OAUG;IACI,4BAA4B,CACjC,MAAiB,EAAE,IAAa,EAAE,2BAAkD;QAEpF,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,GAAG,KAAK,CAAC,CAAC,iCAAiC;QACjD,8EAA8E;QAC9E,MAAM,OAAO,GAAG,4BAAY,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,IAAI,SAAqC,CAAC;QAC1C,IAAI,MAAM,EAAE,aAAgC,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE;YACtC,IAAI,CAAC,aAAa,EAAE,EAAE,2DAA2D;gBAC/E,IAAI,SAAS,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;oBAChH,aAAa,GAAG,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACvE;iBAAM;gBACL,MAAM,SAAS,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;gBACrH,IAAI,SAAS,EAAE,EAAG,wCAAwC;oBACxD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC5D,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;oBACpC,aAAa,GAAG,QAAQ,CAAC;oBACzB,SAAS,GAAG,SAAS,CAAC;iBACvB;aACF;SACF;QACD,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM;YACzC,OAAO,SAAS,CAAC,CAAC,kCAAkC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACrC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAChD,sFAAsF;QACtF,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC3E,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;YACxB,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC;gBAC7B,MAAM;YACR;;;;;cAKE;SACH;QACD,MAAM,KAAK,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAE,6CAA6C;QACvG,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,EAAG,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAG,CAAC;gBACvE,OAAO,WAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;gBAE1B,OAAO,WAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC7B;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;;AApFc,mCAAU,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;AAC/B,kCAAS,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;AAC9B,iCAAQ,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;AAC5B,iCAAQ,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;AANhC,4DAAwB;AA0FrC;;;GAGG;AACH,MAAa,2BAA2B;IACtC,2BAA2B;IAC3B,gBAAuB,CAAC;IACxB;;;;;;OAMG;IACI,MAAM,CAAC,eAAe,CAC3B,EAA8B,EAAE,UAA+B,EAAE,QAA6B;QAE9F,IAAI,EAAE,KAAK,SAAS,EAAE;YACpB,IAAI,UAAU,KAAK,SAAS;gBACzB,EAAU,CAAC,cAAc,GAAG,UAAU,CAAC;YAC1C,IAAI,QAAQ,KAAK,SAAS;gBACvB,EAAU,CAAC,YAAY,GAAG,QAAQ,CAAC;SACvC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,6BAA6B,CACzC,KAAqB,EAAE,uBAA+C;QAEtE,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QAChE,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,SAAS,CAAC;QACnB,uDAAuD;QACvD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,MAAM,SAAS,GAAG,KAAK,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACtE,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBACpC,OAAO,SAAS,CAAC,CAAC,mCAAmC;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtF,OAAO,MAAM,CAAC;SACf;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,sBAAsB,CAClC,MAAmB,EAAE,uBAA8D;QAEnF,MAAM,IAAI,GAAY,MAAM,YAAY,WAAI,CAAC;QAC7C,MAAM,aAAa,GAAG,6BAAa,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACpE,MAAM,aAAa,GAAqB,EAAE,CAAC;QAC3C,uGAAuG;QACvG,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE;YAC/B,MAAM,EAAE,GAAG,2BAA2B,CAAC,6BAA6B,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACvF,IAAI,EAAE,KAAK,SAAS,EAAE;gBACpB,8BAA8B;aAC/B;iBAAM,IAAI,EAAE,YAAY,+BAAc,EAAE;gBACvC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACxB;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE;oBACnB,IAAI,EAAE,YAAY,+BAAc;wBAC9B,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC1B;aACF;SACF;QACD,qFAAqF;QACrF,IAAI,SAAS,CAAC;QACd,IAAI,QAAQ,CAAC;QACb,IAAI,aAAa,CAAC;QAClB,IAAI,MAAM,CAAC;QACX,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;YACrC,IAAI,SAAS,EAAE;gBACb,QAAQ,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3E,IAAI,QAAQ,KAAK,SAAS;oBACxB,IAAI,MAAM,KAAK,SAAS;wBACtB,MAAM,GAAG,QAAQ,CAAC;gBACtB,IAAI,aAAa;oBACf,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBACtC,aAAa,GAAG,QAAQ,CAAC;gBACzB,SAAS,GAAG,SAAS,CAAC;aACvB;SACF;QACD,IAAI,MAAM,IAAI,aAAa,IAAI,MAAM,YAAY,WAAI;YACnD,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACpC,uHAAuH;QACvH,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;QACvC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACnE,oGAAoG;QACpG,MAAM,YAAY,GAAqB,EAAE,CAAC;QAC1C,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAC9D,OAAO,qBAAS,CAAC,2BAA2B,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;CACF;AArGD,kEAqGC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurveCurveApproachType, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { JointOptions, OffsetOptions } from \"../OffsetOptions\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n// cspell:word CCWXY\r\n\r\n/**\r\n * Classification of how the joint is constructed.\r\n * @internal\r\n */\r\nenum JointMode {\r\n Unknown = 0, /** used when joint mode is unknown. */\r\n Cap = 1, /** used to annotate a \"Joint\" at the start/end of a curve without wrap (so there's no \"other\" curve). */\r\n Extend = 2, /** used when offset curves do not intersect and needs expanding to connect. */\r\n Trim = -1, /** used when offset curves intersect and still goes beyond the intersection so need trimming. */\r\n JustGeometry = 3, /** unused */\r\n Gap = 4, /** used when joint construction fails, resulting in a gap in the offset filled by a line segment. */\r\n}\r\n\r\n/**\r\n * Description of geometry around a joint.\r\n * @internal\r\n */\r\nclass Joint {\r\n /** Enumeration of how the joint is constructed */\r\n public flexure: JointMode;\r\n /** Curve before the joint */\r\n public curve0?: CurvePrimitive;\r\n /** Fractional position on curve0 (may be a trim or extension) */\r\n public fraction0?: number;\r\n /** Curve after the joint (may be a trim or extension) */\r\n public curve1?: CurvePrimitive;\r\n /** Fractional position on curve1 */\r\n public fraction1?: number;\r\n /** Curve to be added within the joint */\r\n public jointCurve?: CurvePrimitive;\r\n /** Common point on the original curves */\r\n public swingPoint?: Point3d;\r\n /** Pointer to next joint */\r\n public nextJoint?: Joint;\r\n /** Pointer to previous joint */\r\n public previousJoint?: Joint;\r\n // capture references to all data . . .\r\n public constructor(\r\n curve0: CurvePrimitive | undefined, curve1: CurvePrimitive | undefined, swingPoint: Point3d | undefined,\r\n ) {\r\n this.curve0 = curve0;\r\n this.curve1 = curve1;\r\n this.swingPoint = swingPoint;\r\n this.flexure = JointMode.Unknown;\r\n }\r\n /**\r\n * Try to construct an arc transition from ray0 to ray1 with given center.\r\n */\r\n public static constructArc(ray0: Ray3d, center: Point3d | undefined, ray1: Ray3d): Arc3d | undefined {\r\n if (center !== undefined && Geometry.isSameCoordinate(ray0.origin.distance(center), ray1.origin.distance(center))) {\r\n const angle = ray0.direction.angleToXY(ray1.direction);\r\n const vector0 = Vector3d.createStartEnd(center, ray0.origin);\r\n const vector90 = vector0.rotate90CCWXY();\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, angle.radians));\r\n }\r\n return undefined;\r\n }\r\n /** Extract a json object of {curve0:data, fraction0:data, curve1:data, fraction1:data} */\r\n public shallowExtract(): any {\r\n return { curve0: this.curve0, curve1: this.curve1, fraction0: this.fraction0, fraction1: this.fraction1 };\r\n }\r\n /** Establish the nextJoint and previousJoint links from joint0 to joint1. */\r\n public static link(joint0: Joint, joint1: Joint | undefined) {\r\n joint0.nextJoint = joint1;\r\n if (joint1)\r\n joint1.previousJoint = joint0;\r\n if (joint0.curve1 && joint1 && !joint1.curve0)\r\n joint1.curve0 = joint0.curve1;\r\n else if (!joint0.curve1 && joint1 && joint1.curve0)\r\n joint0.curve1 = joint1.curve0;\r\n }\r\n /**\r\n * * If nextJoint and nextJoint.fraction0 are defined, return them.\r\n * * Otherwise return defaultValue\r\n */\r\n public nextJointFraction0(defaultValue: number): number {\r\n if (this.nextJoint && this.nextJoint.fraction0 !== undefined)\r\n return this.nextJoint.fraction0;\r\n return defaultValue;\r\n }\r\n private static addStrokes(destination: LineString3d, curve?: CurvePrimitive) {\r\n if (curve) {\r\n curve.emitStrokes(destination);\r\n }\r\n }\r\n private static addPoint(destination: LineString3d, point: Point3d) {\r\n if (destination.packedPoints.length > 0) {\r\n const pointA = destination.endPoint();\r\n if (!pointA.isAlmostEqual(point))\r\n destination.packedPoints.push(point);\r\n }\r\n }\r\n /** Append stroke points along the offset curve defined by the Joint chain to the destination line string. */\r\n public static collectStrokesFromChain(start: Joint, destination: LineString3d, maxTest: number = 100) {\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.addStrokes(destination, joint.jointCurve);\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n if (curve1) {\r\n if (!joint.jointCurve) {\r\n this.addPoint(destination, curve1.startPoint());\r\n }\r\n }\r\n this.addStrokes(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n private static collectPrimitive(destination: CurvePrimitive[], primitive?: CurvePrimitive) {\r\n if (primitive) {\r\n if (destination.length > 0) {\r\n const pointA = destination[destination.length - 1].endPoint();\r\n const pointB = primitive.startPoint();\r\n if (!pointA.isAlmostEqual(pointB)) {\r\n destination.push(LineSegment3d.create(pointA, pointB));\r\n }\r\n }\r\n destination.push(primitive);\r\n }\r\n }\r\n private static adjustJointToPrimitives(joint: Joint) {\r\n const ls = joint.jointCurve;\r\n if (ls instanceof LineString3d) {\r\n if (joint.curve0) {\r\n const curvePoint = joint.curve0.endPoint();\r\n const jointPoint0 = ls.startPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint0))\r\n ls.packedPoints.setAtCheckedPointIndex(0, curvePoint);\r\n }\r\n if (joint.curve1) {\r\n const curvePoint = joint.curve1.startPoint();\r\n const jointPoint1 = ls.endPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint1))\r\n ls.packedPoints.setAtCheckedPointIndex(ls.packedPoints.length - 1, curvePoint);\r\n }\r\n }\r\n }\r\n /** Append CurvePrimitives along the offset curve defined by the Joint chain to the destination array. */\r\n public static collectCurvesFromChain(start: Joint | undefined, destination: CurvePrimitive[], maxTest: number = 100) {\r\n if (start === undefined)\r\n return;\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.adjustJointToPrimitives(joint);\r\n this.collectPrimitive(destination, joint.jointCurve);\r\n\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n this.collectPrimitive(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n /**\r\n * Execute `joint.annotateJointMode()` at all joints on the chain to set some of the joints' attributes,\r\n * such as whether to extend both curves to intersection or to fill the gap between curves.\r\n */\r\n public static annotateChain(start: Joint | undefined, options: JointOptions, maxTest: number = 100) {\r\n if (start)\r\n Joint.visitJointsOnChain(start, (joint: Joint) => { joint.annotateJointMode(options); return true; }, maxTest);\r\n }\r\n /**\r\n * Visit joints on a chain.\r\n * * terminate on `false` return from `callback`\r\n * @param start first (and, for cyclic chain, final) joint\r\n * @param callback function to call with each Joint as a single parameter.\r\n */\r\n public static visitJointsOnChain(start: Joint, callback: (joint: Joint) => boolean, maxTest: number = 100): boolean {\r\n let joint: Joint | undefined = start;\r\n if (joint) {\r\n let numTest = 0;\r\n while (joint !== undefined) {\r\n if (numTest++ >= maxTest + 5) // allow extra things to happen\r\n return true;\r\n if (!callback(joint))\r\n return false;\r\n joint = joint.nextJoint;\r\n if (joint === start)\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n /** NOTE: no assumption on type of curve0, curve1 */\r\n private annotateExtension(options: JointOptions) {\r\n if (this.curve0 && this.curve1) {\r\n const ray0 = this.curve0.fractionToPointAndDerivative(1.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n ray0.direction.z = ray1.direction.z = 0.0; // xy-offset\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n if (intersection.detailA.fraction >= 0.0 && intersection.detailB.fraction <= 0.0) {\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Extend;\r\n const theta = ray0.getDirectionRef().angleToXY(ray1.getDirectionRef()); // angle between the 2 ray lines\r\n if (options.needArc(theta)) {\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc) {\r\n this.jointCurve = arc;\r\n return;\r\n }\r\n }\r\n const numChamferPoints = options.numChamferPoints(theta); // how many interior points in the linestring\r\n if (numChamferPoints <= 1) { // create sharp corner\r\n this.jointCurve = LineString3d.create(ray0.origin, intersection.detailA.point, ray1.origin);\r\n return;\r\n }\r\n if (numChamferPoints > 1) { // create chamfer corner (a line string)\r\n const radians0 = theta.radians;\r\n const numHalfStep = 2.0 * numChamferPoints;\r\n const halfStepRadians = radians0 / numHalfStep;\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc !== undefined) {\r\n const radialFraction = 1 / Math.cos(halfStepRadians);\r\n const jointCurve = LineString3d.create();\r\n this.jointCurve = jointCurve;\r\n jointCurve.addPoint(ray0.origin); // possibly extend segment or line string\r\n\r\n for (let i = 0; i < numChamferPoints; i++) {\r\n const arcFraction = (1 + 2 * i) / numHalfStep;\r\n jointCurve.addPoint(arc.fractionAndRadialFractionToPoint(arcFraction, radialFraction));\r\n }\r\n jointCurve.addPoint(ray1.origin); // possibly extend segment or line string.\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n // if there is no intersection between the 2 ray lines, fill the gap by a line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n /** Select the index at which summed fraction difference is smallest */\r\n private selectIntersectionIndexByFraction(\r\n fractionA: number, fractionB: number, intersections: CurveLocationDetailPair[],\r\n ): number {\r\n let index = -1;\r\n let aMin = Number.MAX_VALUE;\r\n for (let i = 0; i < intersections.length; i++) {\r\n const a = Math.abs(intersections[i].detailA.fraction - fractionA)\r\n + Math.abs(intersections[i].detailB.fraction - fractionB);\r\n if (a < aMin) {\r\n aMin = a;\r\n index = i;\r\n }\r\n }\r\n return index;\r\n }\r\n /**\r\n * Examine the adjacent geometry to set some of joint attributes:\r\n * * set JointMode: one of Cap, Extend, or Trim\r\n * * set fraction0 and fraction1 of intersection of curve0 and curve1\r\n * * set joint curve\r\n * * this REFERENCES curve0, curve1, fraction0, fraction1\r\n * * this does not reference nextJoint and previousJoint\r\n */\r\n public annotateJointMode(options: JointOptions): void {\r\n if (!this.curve0 && this.curve1) { // joint at the start of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction1 = 0.0;\r\n } else if (this.curve0 && !this.curve1) { // joint at the end of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction0 = 1.0;\r\n } else if (this.curve0 && this.curve1) { // joints at the middle of the chain\r\n if (this.curve0.endPoint().isAlmostEqualXY(this.curve1.startPoint())) { // joint between colinear xy-segments\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Trim;\r\n } else if (this.curve0 instanceof LineSegment3d && this.curve1 instanceof LineSegment3d) { // pair of lines\r\n const ray0 = this.curve0.fractionToPointAndDerivative(0.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n ray0.direction.z = ray1.direction.z = 0.0; // xy-offset\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection || intersection.approachType === CurveCurveApproachType.PerpendicularChord) {\r\n this.fraction0 = intersection.detailA.fraction;\r\n this.fraction1 = intersection.detailB.fraction;\r\n if (this.fraction0 >= 1.0 && this.fraction1 <= 0.0) { // need to extend\r\n this.annotateExtension(options);\r\n } else if (this.fraction0 < 1.0 && this.fraction1 > 0.0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n } else if (this.fraction0 > 1.0 && this.fraction1 > 1.0) { // need to fill gap with a single line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n } else { // generic pair of curves\r\n const intersections = CurveCurve.intersectionXYPairs(this.curve0, false, this.curve1, false);\r\n const intersectionIndex = this.selectIntersectionIndexByFraction(1.0, 0.0, intersections);\r\n if (intersectionIndex >= 0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n this.fraction0 = intersections[intersectionIndex].detailA.fraction;\r\n this.fraction1 = intersections[intersectionIndex].detailB.fraction;\r\n } else { // need to extend\r\n this.annotateExtension(options);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * * Examine the primitive trim fractions between each pair of joints.\r\n * * If trim fractions indicate the primitive must disappear, replace the joint pair by a new joint pointing at\r\n * surrounding primitives\r\n * @param start\r\n */\r\n public static removeDegeneratePrimitives(\r\n start: Joint, options: JointOptions, maxTest: number,\r\n ): { newStart: Joint, numJointRemoved: number } {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\"\\nENTER removeDegenerates\");\r\n */\r\n let jointA: Joint | undefined = start;\r\n let numRemoved = 0;\r\n const maxRemove = 1;\r\n let numTest = 0;\r\n if (jointA) {\r\n while (jointA !== undefined && numTest++ < maxTest) {\r\n const jointB = jointA.nextJoint;\r\n if (jointA\r\n && jointB\r\n && jointA.previousJoint\r\n && jointB.nextJoint\r\n && jointA.fraction1 !== undefined\r\n && jointB.fraction0 !== undefined\r\n ) {\r\n const f0 = jointA.fraction1;\r\n const f1 = jointB.fraction0;\r\n const g0 = jointB.fraction1;\r\n const g1 = jointB.nextJoint.fraction0;\r\n // f0 and f1 are fractions on the single primitive between these joints.\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\"joint candidate\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointA.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointB.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(\"FRACTIONS \", { fA1: f0, fB0: f1 });\r\n }\r\n */\r\n const eliminateF = f0 >= f1 || f0 > 1.0;\r\n const eliminateG = (g0 !== undefined && g0 > 1.0) || (g0 !== undefined && g1 !== undefined && g0 >= g1);\r\n if (eliminateF && eliminateG) {\r\n const jointC = jointB.nextJoint;\r\n const newJoint: Joint = new Joint(jointA.curve0, jointC.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointC.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n if (newJoint.nextJoint)\r\n newJoint.nextJoint.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW DOUBLE CUT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n } else if (eliminateF) {\r\n const newJoint: Joint = new Joint(jointA.curve0, jointB.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointB.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n newJoint.nextJoint!.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW JOINT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n numRemoved++;\r\n if (jointA === start)\r\n start = newJoint;\r\n jointA = newJoint;\r\n if (numRemoved >= maxRemove) {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\" EXIT removeDegenerates at maxRemove\\n\");\r\n */\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n }\r\n }\r\n jointA = jointA.nextJoint;\r\n if (jointA === start)\r\n break;\r\n }\r\n }\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire xy-offset.\r\n * @internal\r\n */\r\nexport class PolygonWireOffsetContext {\r\n /** Construct a context. */\r\n public constructor() { }\r\n private static _unitAlong = Vector3d.create();\r\n private static _unitPerp = Vector3d.create();\r\n private static _offsetA = Point3d.create();\r\n private static _offsetB = Point3d.create();\r\n // Construct a single offset from base points\r\n private static createOffsetSegment(\r\n basePointA: Point3d, basePointB: Point3d, distance: number,\r\n ): CurvePrimitive | undefined {\r\n Vector3d.createStartEnd(basePointA, basePointB, this._unitAlong);\r\n this._unitAlong.z = 0.0; // xy-offset\r\n if (this._unitAlong.normalizeInPlace()) {\r\n this._unitAlong.rotate90CCWXY(this._unitPerp);\r\n const segment = LineSegment3d.create(\r\n basePointA.plusScaled(this._unitPerp, distance, this._offsetA),\r\n basePointB.plusScaled(this._unitPerp, distance, this._offsetB),\r\n );\r\n CurveChainWireOffsetContext.applyBasePoints(segment, basePointA.clone(), basePointB.clone());\r\n return segment;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct a wire (not area) that is offset from given polyline or polygon.\r\n * * For best results, points should be in a horizontal plane because z-coordinates are ignored.\r\n * * This is a simple wire offset (in the form of a line string), not an area.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * See [[JointOptions]] class doc for offset construction rules.\r\n * @param points a single loop or path\r\n * @param wrap true to offset the wraparound joint. Assumes first = last point.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or JointOptions\r\n * object.\r\n */\r\n public constructPolygonWireXYOffset(\r\n points: Point3d[], wrap: boolean, leftOffsetDistanceOrOptions: number | JointOptions,\r\n ): CurveChain | undefined {\r\n if (wrap && !points[0].isAlmostEqual(points[points.length - 1]))\r\n wrap = false; // no wrap possible for polylines\r\n // create raw offset segments as a linked list of Joints, starting with joint0\r\n const options = JointOptions.create(leftOffsetDistanceOrOptions);\r\n const numPoints = points.length;\r\n let fragment0: CurvePrimitive | undefined;\r\n let joint0, previousJoint: Joint | undefined;\r\n for (let i = 0; i + 1 < numPoints; ++i) {\r\n if (!previousJoint) { // start the linked list at the first nontrivial xy-segment\r\n if (fragment0 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance))\r\n previousJoint = joint0 = new Joint(undefined, fragment0, points[i]);\r\n } else {\r\n const fragment1 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance);\r\n if (fragment1) { // append the next nontrivial xy-segment\r\n const newJoint = new Joint(fragment0, fragment1, points[i]);\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n }\r\n if (!fragment0 || !previousJoint || !joint0)\r\n return undefined; // no edge with positive xy-length\r\n const lastJoint = wrap ? joint0 : new Joint(fragment0, undefined, points[numPoints - 1]);\r\n Joint.link(previousJoint, lastJoint);\r\n Joint.annotateChain(joint0, options, numPoints);\r\n // make limited passes through the Joint chain until no self-intersections are removed\r\n for (let pass = 0; pass++ < 5;) {\r\n const state = Joint.removeDegeneratePrimitives(joint0, options, numPoints);\r\n joint0 = state.newStart;\r\n if (state.numJointRemoved === 0)\r\n break;\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" POST REMOVE DEGENERATES \" + state.numJointRemoved);\r\n Joint.visitJointsOnChain(joint0, (joint: Joint) => { GeometryCoreTestIO.consoleLog(prettyPrint(joint.shallowExtract())); return true; });\r\n }\r\n */\r\n }\r\n const chain = LineString3d.create();\r\n Joint.collectStrokesFromChain(joint0, chain, numPoints); // compute offset corners (by extension/trim)\r\n const n = chain.packedPoints.length;\r\n if (n > 1) {\r\n if (chain.packedPoints.front()!.isAlmostEqual(chain.packedPoints.back()!))\r\n return Loop.create(chain);\r\n else\r\n return Path.create(chain);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire xy-offset from a Path or Loop of CurvePrimitives\r\n * @internal\r\n */\r\nexport class CurveChainWireOffsetContext {\r\n /** construct a context. */\r\n public constructor() { }\r\n /**\r\n * Annotate a CurvePrimitive with properties `baseCurveStart` and `baseCurveEnd`.\r\n * @param cp curve primitive to annotate\r\n * @param startPoint optional start point\r\n * @param endPoint optional end point\r\n * @return the input CurvePrimitive with annotations\r\n */\r\n public static applyBasePoints(\r\n cp: CurvePrimitive | undefined, startPoint: Point3d | undefined, endPoint: Point3d | undefined,\r\n ): CurvePrimitive | undefined {\r\n if (cp !== undefined) {\r\n if (startPoint !== undefined)\r\n (cp as any).baseCurveStart = startPoint;\r\n if (endPoint !== undefined)\r\n (cp as any).baseCurveEnd = endPoint;\r\n }\r\n return cp;\r\n }\r\n /**\r\n * Create the offset of a single curve primitive as viewed in the xy-plane (ignoring z).\r\n * * Each primitive may be labeled (as an `any` object) with start or end point of base curve:\r\n * * `(primitive as any).baseCurveStart: Point3d`\r\n * * `(primitive as any).baseCurveEnd: Point3d`\r\n * @param curve primitive to offset\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object\r\n */\r\n public static createSingleOffsetPrimitiveXY(\r\n curve: CurvePrimitive, offsetDistanceOrOptions: number | OffsetOptions,\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const offset = curve.constructOffsetXY(offsetDistanceOrOptions);\r\n if (offset === undefined)\r\n return undefined;\r\n // decorate each offset with its base curve's endpoints\r\n if (Array.isArray(offset)) {\r\n const basePrims = curve.collectCurvePrimitives(undefined, true, true);\r\n if (basePrims.length !== offset.length)\r\n return undefined; // unexpected aggregate curve type!\r\n for (let i = 0; i < basePrims.length; ++i)\r\n this.applyBasePoints(offset[i], basePrims[i].startPoint(), basePrims[i].endPoint());\r\n return offset;\r\n }\r\n return this.applyBasePoints(offset, curve.startPoint(), curve.endPoint());\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\r\n * not detect self intersection among widely separated edges.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Offset\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(\r\n curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions,\r\n ): CurveCollection | undefined {\r\n const wrap: boolean = curves instanceof Loop;\r\n const offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n const simpleOffsets: CurvePrimitive[] = [];\r\n /** traverse primitives (children of curves) and create simple offsets of each primitive as an array */\r\n for (const c of curves.children) {\r\n const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);\r\n if (c1 === undefined) {\r\n // bad .. maybe arc to inside?\r\n } else if (c1 instanceof CurvePrimitive) {\r\n simpleOffsets.push(c1);\r\n } else if (Array.isArray(c1)) {\r\n for (const c2 of c1) {\r\n if (c2 instanceof CurvePrimitive)\r\n simpleOffsets.push(c2);\r\n }\r\n }\r\n }\r\n /** create joints between array elements to make offsets as a linked list (joint0) */\r\n let fragment0;\r\n let newJoint;\r\n let previousJoint;\r\n let joint0;\r\n for (const fragment1 of simpleOffsets) {\r\n if (fragment1) {\r\n newJoint = new Joint(fragment0, fragment1, fragment1.fractionToPoint(0.0));\r\n if (newJoint !== undefined)\r\n if (joint0 === undefined)\r\n joint0 = newJoint;\r\n if (previousJoint)\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n if (joint0 && previousJoint && curves instanceof Loop)\r\n Joint.link(previousJoint, joint0);\r\n /** annotateChain sets some of the joints attributes (including how to extend curves or fill the gap between curves) */\r\n const numOffset = simpleOffsets.length;\r\n Joint.annotateChain(joint0, offsetOptions.jointOptions, numOffset);\r\n /** turn the Joint linked list into a CurveCollection. trimming is done in collectCurvesFromChain */\r\n const outputCurves: CurvePrimitive[] = [];\r\n Joint.collectCurvesFromChain(joint0, outputCurves, numOffset);\r\n return RegionOps.createLoopPathOrBagOfCurves(outputCurves, wrap, true);\r\n }\r\n}\r\n"]}
|
|
@@ -710,6 +710,14 @@ export declare class Vector3d extends XYZ {
|
|
|
710
710
|
* @param planeNormal a normal vector to the plane.
|
|
711
711
|
*/
|
|
712
712
|
angleFromPerpendicular(planeNormal: Vector3d): Angle;
|
|
713
|
+
/**
|
|
714
|
+
* Return the angle in radians (not as strongly typed Angle) from this vector to the plane perpendicular to planeNormal.
|
|
715
|
+
* * The returned angle is between -PI/2 and PI/2.
|
|
716
|
+
* * The returned angle is measured in the plane containing the two vectors.
|
|
717
|
+
* * The function returns PI/2 - radiansTo(planeNormal).
|
|
718
|
+
* @param planeNormal a normal vector to the plane.
|
|
719
|
+
*/
|
|
720
|
+
radiansFromPerpendicular(planeNormal: Vector3d): number;
|
|
713
721
|
/**
|
|
714
722
|
* Return the (strongly-typed) angle from this vector to vectorB, using only the xy parts.
|
|
715
723
|
* * The returned angle is between -180 and 180 degrees.
|