@itwin/core-geometry 4.1.0-dev.7 → 4.1.0-dev.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (542) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/lib/cjs/Geometry.js.map +1 -1
  3. package/lib/cjs/bspline/BSplineCurve.d.ts +1 -1
  4. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  5. package/lib/cjs/bspline/BSplineCurve.js +2 -2
  6. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  7. package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
  8. package/lib/cjs/bspline/BSplineSurface.js +1 -1
  9. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  10. package/lib/cjs/bspline/BezierCurveBase.d.ts +1 -1
  11. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  12. package/lib/cjs/bspline/BezierCurveBase.js +2 -2
  13. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  14. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  15. package/lib/cjs/clipping/ClipPrimitive.d.ts.map +1 -1
  16. package/lib/cjs/clipping/ClipPrimitive.js +2 -0
  17. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  18. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  19. package/lib/cjs/core-geometry.d.ts +3 -1
  20. package/lib/cjs/core-geometry.d.ts.map +1 -1
  21. package/lib/cjs/core-geometry.js +3 -1
  22. package/lib/cjs/core-geometry.js.map +1 -1
  23. package/lib/cjs/curve/Arc3d.d.ts +2 -1
  24. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  25. package/lib/cjs/curve/Arc3d.js +3 -2
  26. package/lib/cjs/curve/Arc3d.js.map +1 -1
  27. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +62 -42
  28. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  29. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +71 -48
  30. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  31. package/lib/cjs/curve/CurveCollection.d.ts +36 -26
  32. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  33. package/lib/cjs/curve/CurveCollection.js +46 -39
  34. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  35. package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
  36. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  37. package/lib/cjs/curve/CurveFactory.d.ts +67 -3
  38. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  39. package/lib/cjs/curve/CurveFactory.js +75 -7
  40. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  41. package/lib/cjs/curve/CurveLocationDetail.d.ts +6 -6
  42. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  43. package/lib/cjs/curve/CurveLocationDetail.js +9 -7
  44. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  45. package/lib/cjs/curve/CurveOps.d.ts +77 -0
  46. package/lib/cjs/curve/CurveOps.d.ts.map +1 -0
  47. package/lib/cjs/curve/CurveOps.js +160 -0
  48. package/lib/cjs/curve/CurveOps.js.map +1 -0
  49. package/lib/cjs/curve/CurvePrimitive.d.ts +17 -16
  50. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  51. package/lib/cjs/curve/CurvePrimitive.js +4 -3
  52. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  53. package/lib/cjs/curve/GeometryQuery.d.ts +2 -2
  54. package/lib/cjs/curve/GeometryQuery.d.ts.map +1 -1
  55. package/lib/cjs/curve/GeometryQuery.js +2 -2
  56. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  57. package/lib/cjs/curve/LineSegment3d.d.ts +7 -5
  58. package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
  59. package/lib/cjs/curve/LineSegment3d.js +6 -6
  60. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  61. package/lib/cjs/curve/LineString3d.d.ts +2 -2
  62. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  63. package/lib/cjs/curve/LineString3d.js +3 -3
  64. package/lib/cjs/curve/LineString3d.js.map +1 -1
  65. package/lib/cjs/curve/Loop.d.ts +7 -5
  66. package/lib/cjs/curve/Loop.d.ts.map +1 -1
  67. package/lib/cjs/curve/Loop.js +18 -6
  68. package/lib/cjs/curve/Loop.js.map +1 -1
  69. package/lib/cjs/curve/OffsetOptions.d.ts +97 -0
  70. package/lib/cjs/curve/OffsetOptions.d.ts.map +1 -0
  71. package/lib/cjs/curve/OffsetOptions.js +166 -0
  72. package/lib/cjs/curve/OffsetOptions.js.map +1 -0
  73. package/lib/cjs/curve/ParityRegion.d.ts +7 -7
  74. package/lib/cjs/curve/ParityRegion.d.ts.map +1 -1
  75. package/lib/cjs/curve/ParityRegion.js +19 -11
  76. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  77. package/lib/cjs/curve/Path.d.ts +6 -6
  78. package/lib/cjs/curve/Path.d.ts.map +1 -1
  79. package/lib/cjs/curve/Path.js +15 -9
  80. package/lib/cjs/curve/Path.js.map +1 -1
  81. package/lib/cjs/curve/ProxyCurve.d.ts +5 -7
  82. package/lib/cjs/curve/ProxyCurve.d.ts.map +1 -1
  83. package/lib/cjs/curve/ProxyCurve.js +7 -7
  84. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  85. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  86. package/lib/cjs/curve/RegionOps.d.ts +76 -56
  87. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  88. package/lib/cjs/curve/RegionOps.js +83 -60
  89. package/lib/cjs/curve/RegionOps.js.map +1 -1
  90. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +2 -2
  91. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  92. package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
  93. package/lib/cjs/curve/StrokeOptions.js +6 -2
  94. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  95. package/lib/cjs/curve/UnionRegion.d.ts +6 -5
  96. package/lib/cjs/curve/UnionRegion.d.ts.map +1 -1
  97. package/lib/cjs/curve/UnionRegion.js +17 -8
  98. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  99. package/lib/cjs/curve/{ChainCollectorContext.d.ts → internalContexts/ChainCollectorContext.d.ts} +4 -4
  100. package/lib/cjs/curve/internalContexts/ChainCollectorContext.d.ts.map +1 -0
  101. package/lib/cjs/curve/{ChainCollectorContext.js → internalContexts/ChainCollectorContext.js} +4 -4
  102. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -0
  103. package/lib/cjs/curve/internalContexts/GapSearchContext.d.ts +2 -1
  104. package/lib/cjs/curve/internalContexts/GapSearchContext.d.ts.map +1 -1
  105. package/lib/cjs/curve/internalContexts/GapSearchContext.js +6 -2
  106. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  107. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +59 -70
  108. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  109. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +130 -220
  110. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  111. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.d.ts +14 -8
  112. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.d.ts.map +1 -1
  113. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js +14 -8
  114. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  115. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts +23 -95
  116. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  117. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +89 -178
  118. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  119. package/lib/cjs/curve/internalContexts/SumLengthsContext.d.ts.map +1 -1
  120. package/lib/cjs/curve/internalContexts/SumLengthsContext.js +4 -1
  121. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  122. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +1 -1
  123. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  124. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +1 -1
  125. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  126. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +2 -2
  127. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  128. package/lib/cjs/curve/spiral/XYCurveEvaluator.js +1 -1
  129. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  130. package/lib/cjs/geometry3d/Angle.d.ts +9 -0
  131. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  132. package/lib/cjs/geometry3d/Angle.js +13 -0
  133. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  134. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  135. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  136. package/lib/cjs/geometry3d/BilinearPatch.d.ts +43 -48
  137. package/lib/cjs/geometry3d/BilinearPatch.d.ts.map +1 -1
  138. package/lib/cjs/geometry3d/BilinearPatch.js +51 -55
  139. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  140. package/lib/cjs/geometry3d/Ellipsoid.d.ts +1 -1
  141. package/lib/cjs/geometry3d/Ellipsoid.js +1 -1
  142. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  143. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  144. package/lib/cjs/geometry3d/FrameBuilder.js +13 -11
  145. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  146. package/lib/cjs/geometry3d/GeometryHandler.d.ts +5 -5
  147. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  148. package/lib/cjs/geometry3d/GrowableBlockedArray.d.ts.map +1 -1
  149. package/lib/cjs/geometry3d/GrowableBlockedArray.js +1 -1
  150. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  151. package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
  152. package/lib/cjs/geometry3d/GrowableFloat64Array.js +1 -1
  153. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  154. package/lib/cjs/geometry3d/Matrix3d.d.ts +18 -0
  155. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  156. package/lib/cjs/geometry3d/Matrix3d.js +32 -5
  157. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  158. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  159. package/lib/cjs/geometry3d/Plane3d.d.ts +41 -32
  160. package/lib/cjs/geometry3d/Plane3d.d.ts.map +1 -1
  161. package/lib/cjs/geometry3d/Plane3d.js +11 -8
  162. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  163. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +37 -34
  164. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  165. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +65 -43
  166. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  167. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts +36 -32
  168. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  169. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +37 -32
  170. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  171. package/lib/cjs/geometry3d/Point2dVector2d.d.ts +8 -9
  172. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  173. package/lib/cjs/geometry3d/Point2dVector2d.js +9 -10
  174. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  175. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  176. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +12 -4
  177. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  178. package/lib/cjs/geometry3d/Point3dVector3d.js +18 -5
  179. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  180. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  181. package/lib/cjs/geometry3d/PointHelpers.js +5 -5
  182. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  183. package/lib/cjs/geometry3d/PolygonOps.d.ts +1 -2
  184. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  185. package/lib/cjs/geometry3d/PolygonOps.js +2 -3
  186. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  187. package/lib/cjs/geometry3d/PolylineOps.d.ts +16 -1
  188. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  189. package/lib/cjs/geometry3d/PolylineOps.js +55 -0
  190. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  191. package/lib/cjs/geometry3d/Range.d.ts +134 -94
  192. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  193. package/lib/cjs/geometry3d/Range.js +297 -145
  194. package/lib/cjs/geometry3d/Range.js.map +1 -1
  195. package/lib/cjs/geometry3d/Ray2d.d.ts +69 -0
  196. package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -0
  197. package/lib/cjs/geometry3d/Ray2d.js +146 -0
  198. package/lib/cjs/geometry3d/Ray2d.js.map +1 -0
  199. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  200. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  201. package/lib/cjs/geometry3d/Transform.d.ts +10 -3
  202. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  203. package/lib/cjs/geometry3d/Transform.js +18 -6
  204. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  205. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  206. package/lib/cjs/numerics/ConvexPolygon2d.d.ts +7 -49
  207. package/lib/cjs/numerics/ConvexPolygon2d.d.ts.map +1 -1
  208. package/lib/cjs/numerics/ConvexPolygon2d.js +16 -107
  209. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  210. package/lib/cjs/numerics/Newton.js.map +1 -1
  211. package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
  212. package/lib/cjs/numerics/Polynomials.js +0 -2
  213. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  214. package/lib/cjs/numerics/Quadrature.js +5 -5
  215. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  216. package/lib/cjs/polyface/IndexedEdgeMatcher.js +1 -1
  217. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  218. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  219. package/lib/cjs/polyface/PolyfaceBuilder.js +2 -2
  220. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  221. package/lib/cjs/polyface/PolyfaceQuery.d.ts +73 -12
  222. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  223. package/lib/cjs/polyface/PolyfaceQuery.js +117 -31
  224. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  225. package/lib/cjs/polyface/TaggedNumericData.js +1 -1
  226. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  227. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js +2 -2
  228. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  229. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  230. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +11 -0
  231. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  232. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +79 -1
  233. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  234. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  235. package/lib/cjs/serialization/GeometrySamples.d.ts +11 -0
  236. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  237. package/lib/cjs/serialization/GeometrySamples.js +30 -0
  238. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  239. package/lib/cjs/serialization/IModelJsonSchema.d.ts +2 -7
  240. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  241. package/lib/cjs/serialization/IModelJsonSchema.js +2 -7
  242. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  243. package/lib/cjs/solid/LinearSweep.d.ts +2 -1
  244. package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
  245. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  246. package/lib/cjs/solid/RotationalSweep.d.ts +2 -1
  247. package/lib/cjs/solid/RotationalSweep.d.ts.map +1 -1
  248. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  249. package/lib/cjs/solid/RuledSweep.d.ts +2 -1
  250. package/lib/cjs/solid/RuledSweep.d.ts.map +1 -1
  251. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  252. package/lib/cjs/solid/SweepContour.d.ts +2 -2
  253. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  254. package/lib/cjs/solid/SweepContour.js +9 -0
  255. package/lib/cjs/solid/SweepContour.js.map +1 -1
  256. package/lib/cjs/topology/ChainMerge.js +1 -1
  257. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  258. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  259. package/lib/cjs/topology/HalfEdgeGraphSearch.js +1 -1
  260. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  261. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js +1 -1
  262. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  263. package/lib/cjs/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
  264. package/lib/cjs/topology/HalfEdgePriorityQueue.js +1 -1
  265. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  266. package/lib/cjs/topology/RegularizeFace.js +3 -3
  267. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  268. package/lib/cjs/topology/Triangulation.js +1 -1
  269. package/lib/cjs/topology/Triangulation.js.map +1 -1
  270. package/lib/esm/Geometry.js.map +1 -1
  271. package/lib/esm/bspline/BSplineCurve.d.ts +1 -1
  272. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  273. package/lib/esm/bspline/BSplineCurve.js +1 -1
  274. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  275. package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
  276. package/lib/esm/bspline/BSplineSurface.js +1 -1
  277. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  278. package/lib/esm/bspline/BezierCurveBase.d.ts +1 -1
  279. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  280. package/lib/esm/bspline/BezierCurveBase.js +1 -1
  281. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  282. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  283. package/lib/esm/clipping/ClipPrimitive.d.ts.map +1 -1
  284. package/lib/esm/clipping/ClipPrimitive.js +2 -0
  285. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  286. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  287. package/lib/esm/core-geometry.d.ts +3 -1
  288. package/lib/esm/core-geometry.d.ts.map +1 -1
  289. package/lib/esm/core-geometry.js +3 -1
  290. package/lib/esm/core-geometry.js.map +1 -1
  291. package/lib/esm/curve/Arc3d.d.ts +2 -1
  292. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  293. package/lib/esm/curve/Arc3d.js +2 -1
  294. package/lib/esm/curve/Arc3d.js.map +1 -1
  295. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +62 -42
  296. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  297. package/lib/esm/curve/CurveChainWithDistanceIndex.js +70 -47
  298. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  299. package/lib/esm/curve/CurveCollection.d.ts +36 -26
  300. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  301. package/lib/esm/curve/CurveCollection.js +46 -39
  302. package/lib/esm/curve/CurveCollection.js.map +1 -1
  303. package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
  304. package/lib/esm/curve/CurveCurve.js.map +1 -1
  305. package/lib/esm/curve/CurveFactory.d.ts +67 -3
  306. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  307. package/lib/esm/curve/CurveFactory.js +74 -6
  308. package/lib/esm/curve/CurveFactory.js.map +1 -1
  309. package/lib/esm/curve/CurveLocationDetail.d.ts +6 -6
  310. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  311. package/lib/esm/curve/CurveLocationDetail.js +9 -7
  312. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  313. package/lib/esm/curve/CurveOps.d.ts +77 -0
  314. package/lib/esm/curve/CurveOps.d.ts.map +1 -0
  315. package/lib/esm/curve/CurveOps.js +156 -0
  316. package/lib/esm/curve/CurveOps.js.map +1 -0
  317. package/lib/esm/curve/CurvePrimitive.d.ts +17 -16
  318. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  319. package/lib/esm/curve/CurvePrimitive.js +4 -3
  320. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  321. package/lib/esm/curve/GeometryQuery.d.ts +2 -2
  322. package/lib/esm/curve/GeometryQuery.d.ts.map +1 -1
  323. package/lib/esm/curve/GeometryQuery.js +2 -2
  324. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  325. package/lib/esm/curve/LineSegment3d.d.ts +7 -5
  326. package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
  327. package/lib/esm/curve/LineSegment3d.js +5 -5
  328. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  329. package/lib/esm/curve/LineString3d.d.ts +2 -2
  330. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  331. package/lib/esm/curve/LineString3d.js +2 -2
  332. package/lib/esm/curve/LineString3d.js.map +1 -1
  333. package/lib/esm/curve/Loop.d.ts +7 -5
  334. package/lib/esm/curve/Loop.d.ts.map +1 -1
  335. package/lib/esm/curve/Loop.js +18 -6
  336. package/lib/esm/curve/Loop.js.map +1 -1
  337. package/lib/esm/curve/OffsetOptions.d.ts +97 -0
  338. package/lib/esm/curve/OffsetOptions.d.ts.map +1 -0
  339. package/lib/esm/curve/OffsetOptions.js +161 -0
  340. package/lib/esm/curve/OffsetOptions.js.map +1 -0
  341. package/lib/esm/curve/ParityRegion.d.ts +7 -7
  342. package/lib/esm/curve/ParityRegion.d.ts.map +1 -1
  343. package/lib/esm/curve/ParityRegion.js +19 -11
  344. package/lib/esm/curve/ParityRegion.js.map +1 -1
  345. package/lib/esm/curve/Path.d.ts +6 -6
  346. package/lib/esm/curve/Path.d.ts.map +1 -1
  347. package/lib/esm/curve/Path.js +15 -9
  348. package/lib/esm/curve/Path.js.map +1 -1
  349. package/lib/esm/curve/ProxyCurve.d.ts +5 -7
  350. package/lib/esm/curve/ProxyCurve.d.ts.map +1 -1
  351. package/lib/esm/curve/ProxyCurve.js +7 -7
  352. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  353. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  354. package/lib/esm/curve/RegionOps.d.ts +76 -56
  355. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  356. package/lib/esm/curve/RegionOps.js +84 -61
  357. package/lib/esm/curve/RegionOps.js.map +1 -1
  358. package/lib/esm/curve/RegionOpsClassificationSweeps.js +2 -2
  359. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  360. package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
  361. package/lib/esm/curve/StrokeOptions.js +6 -2
  362. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  363. package/lib/esm/curve/UnionRegion.d.ts +6 -5
  364. package/lib/esm/curve/UnionRegion.d.ts.map +1 -1
  365. package/lib/esm/curve/UnionRegion.js +17 -8
  366. package/lib/esm/curve/UnionRegion.js.map +1 -1
  367. package/lib/esm/curve/{ChainCollectorContext.d.ts → internalContexts/ChainCollectorContext.d.ts} +4 -4
  368. package/lib/esm/curve/internalContexts/ChainCollectorContext.d.ts.map +1 -0
  369. package/lib/esm/curve/{ChainCollectorContext.js → internalContexts/ChainCollectorContext.js} +4 -4
  370. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -0
  371. package/lib/esm/curve/internalContexts/GapSearchContext.d.ts +2 -1
  372. package/lib/esm/curve/internalContexts/GapSearchContext.d.ts.map +1 -1
  373. package/lib/esm/curve/internalContexts/GapSearchContext.js +6 -2
  374. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  375. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +59 -70
  376. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  377. package/lib/esm/curve/internalContexts/MultiChainCollector.js +129 -218
  378. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  379. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.d.ts +14 -8
  380. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.d.ts.map +1 -1
  381. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js +14 -8
  382. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  383. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts +23 -95
  384. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  385. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +86 -173
  386. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  387. package/lib/esm/curve/internalContexts/SumLengthsContext.d.ts.map +1 -1
  388. package/lib/esm/curve/internalContexts/SumLengthsContext.js +4 -1
  389. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  390. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +1 -1
  391. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  392. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +1 -1
  393. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  394. package/lib/esm/curve/spiral/TransitionSpiral3d.js +1 -1
  395. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  396. package/lib/esm/curve/spiral/XYCurveEvaluator.js +1 -1
  397. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  398. package/lib/esm/geometry3d/Angle.d.ts +9 -0
  399. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  400. package/lib/esm/geometry3d/Angle.js +13 -0
  401. package/lib/esm/geometry3d/Angle.js.map +1 -1
  402. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  403. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  404. package/lib/esm/geometry3d/BilinearPatch.d.ts +43 -48
  405. package/lib/esm/geometry3d/BilinearPatch.d.ts.map +1 -1
  406. package/lib/esm/geometry3d/BilinearPatch.js +51 -55
  407. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  408. package/lib/esm/geometry3d/Ellipsoid.d.ts +1 -1
  409. package/lib/esm/geometry3d/Ellipsoid.js +1 -1
  410. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  411. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  412. package/lib/esm/geometry3d/FrameBuilder.js +13 -11
  413. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  414. package/lib/esm/geometry3d/GeometryHandler.d.ts +5 -5
  415. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  416. package/lib/esm/geometry3d/GrowableBlockedArray.d.ts.map +1 -1
  417. package/lib/esm/geometry3d/GrowableBlockedArray.js +1 -1
  418. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  419. package/lib/esm/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
  420. package/lib/esm/geometry3d/GrowableFloat64Array.js +1 -1
  421. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  422. package/lib/esm/geometry3d/Matrix3d.d.ts +18 -0
  423. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  424. package/lib/esm/geometry3d/Matrix3d.js +32 -5
  425. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  426. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  427. package/lib/esm/geometry3d/Plane3d.d.ts +41 -32
  428. package/lib/esm/geometry3d/Plane3d.d.ts.map +1 -1
  429. package/lib/esm/geometry3d/Plane3d.js +11 -8
  430. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  431. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +37 -34
  432. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  433. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +65 -43
  434. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  435. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts +36 -32
  436. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  437. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +37 -32
  438. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  439. package/lib/esm/geometry3d/Point2dVector2d.d.ts +8 -9
  440. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  441. package/lib/esm/geometry3d/Point2dVector2d.js +9 -10
  442. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  443. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  444. package/lib/esm/geometry3d/Point3dVector3d.d.ts +12 -4
  445. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  446. package/lib/esm/geometry3d/Point3dVector3d.js +18 -5
  447. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  448. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  449. package/lib/esm/geometry3d/PointHelpers.js +5 -5
  450. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  451. package/lib/esm/geometry3d/PolygonOps.d.ts +1 -2
  452. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  453. package/lib/esm/geometry3d/PolygonOps.js +2 -3
  454. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  455. package/lib/esm/geometry3d/PolylineOps.d.ts +16 -1
  456. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  457. package/lib/esm/geometry3d/PolylineOps.js +56 -1
  458. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  459. package/lib/esm/geometry3d/Range.d.ts +134 -94
  460. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  461. package/lib/esm/geometry3d/Range.js +297 -145
  462. package/lib/esm/geometry3d/Range.js.map +1 -1
  463. package/lib/esm/geometry3d/Ray2d.d.ts +69 -0
  464. package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -0
  465. package/lib/esm/geometry3d/Ray2d.js +142 -0
  466. package/lib/esm/geometry3d/Ray2d.js.map +1 -0
  467. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  468. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  469. package/lib/esm/geometry3d/Transform.d.ts +10 -3
  470. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  471. package/lib/esm/geometry3d/Transform.js +18 -6
  472. package/lib/esm/geometry3d/Transform.js.map +1 -1
  473. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  474. package/lib/esm/numerics/ConvexPolygon2d.d.ts +7 -49
  475. package/lib/esm/numerics/ConvexPolygon2d.d.ts.map +1 -1
  476. package/lib/esm/numerics/ConvexPolygon2d.js +14 -104
  477. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  478. package/lib/esm/numerics/Newton.js.map +1 -1
  479. package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
  480. package/lib/esm/numerics/Polynomials.js +0 -2
  481. package/lib/esm/numerics/Polynomials.js.map +1 -1
  482. package/lib/esm/numerics/Quadrature.js +5 -5
  483. package/lib/esm/numerics/Quadrature.js.map +1 -1
  484. package/lib/esm/polyface/IndexedEdgeMatcher.js +1 -1
  485. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  486. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  487. package/lib/esm/polyface/PolyfaceBuilder.js +2 -2
  488. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  489. package/lib/esm/polyface/PolyfaceQuery.d.ts +73 -12
  490. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  491. package/lib/esm/polyface/PolyfaceQuery.js +117 -32
  492. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  493. package/lib/esm/polyface/TaggedNumericData.js +1 -1
  494. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  495. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js +2 -2
  496. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  497. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  498. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +11 -0
  499. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  500. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +78 -1
  501. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  502. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  503. package/lib/esm/serialization/GeometrySamples.d.ts +11 -0
  504. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  505. package/lib/esm/serialization/GeometrySamples.js +30 -0
  506. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  507. package/lib/esm/serialization/IModelJsonSchema.d.ts +2 -7
  508. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  509. package/lib/esm/serialization/IModelJsonSchema.js +2 -7
  510. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  511. package/lib/esm/solid/LinearSweep.d.ts +2 -1
  512. package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
  513. package/lib/esm/solid/LinearSweep.js.map +1 -1
  514. package/lib/esm/solid/RotationalSweep.d.ts +2 -1
  515. package/lib/esm/solid/RotationalSweep.d.ts.map +1 -1
  516. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  517. package/lib/esm/solid/RuledSweep.d.ts +2 -1
  518. package/lib/esm/solid/RuledSweep.d.ts.map +1 -1
  519. package/lib/esm/solid/RuledSweep.js.map +1 -1
  520. package/lib/esm/solid/SweepContour.d.ts +2 -2
  521. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  522. package/lib/esm/solid/SweepContour.js +9 -0
  523. package/lib/esm/solid/SweepContour.js.map +1 -1
  524. package/lib/esm/topology/ChainMerge.js +1 -1
  525. package/lib/esm/topology/ChainMerge.js.map +1 -1
  526. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  527. package/lib/esm/topology/HalfEdgeGraphSearch.js +1 -1
  528. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  529. package/lib/esm/topology/HalfEdgeGraphSpineContext.js +1 -1
  530. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  531. package/lib/esm/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
  532. package/lib/esm/topology/HalfEdgePriorityQueue.js +1 -1
  533. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  534. package/lib/esm/topology/RegularizeFace.js +3 -3
  535. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  536. package/lib/esm/topology/Triangulation.js +1 -1
  537. package/lib/esm/topology/Triangulation.js.map +1 -1
  538. package/package.json +6 -17
  539. package/lib/cjs/curve/ChainCollectorContext.d.ts.map +0 -1
  540. package/lib/cjs/curve/ChainCollectorContext.js.map +0 -1
  541. package/lib/esm/curve/ChainCollectorContext.d.ts.map +0 -1
  542. package/lib/esm/curve/ChainCollectorContext.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  /** @packageDocumentation
2
2
  * @module Solid
3
3
  */
4
+ import { AnyCurve } from "../curve/CurveChain";
4
5
  import { CurveCollection } from "../curve/CurveCollection";
5
6
  import { GeometryQuery } from "../curve/GeometryQuery";
6
7
  import { GeometryHandler } from "../geometry3d/GeometryHandler";
@@ -29,7 +30,7 @@ export declare class LinearSweep extends SolidPrimitive {
29
30
  * @param direction sweep vector. The contour is swept the full length of the vector.
30
31
  * @param capped true to include end caps
31
32
  */
32
- static create(contour: CurveCollection, direction: Vector3d, capped: boolean): LinearSweep | undefined;
33
+ static create(contour: AnyCurve, direction: Vector3d, capped: boolean): LinearSweep | undefined;
33
34
  /** Create a z-direction sweep of the polyline or polygon given as xy linestring values.
34
35
  * * If not capped, the xyPoints array is always used unchanged.
35
36
  * * If capped but the xyPoints array does not close, exact closure will be enforced by one of these:
@@ -1 +1 @@
1
- {"version":3,"file":"LinearSweep.d.ts","sourceRoot":"","sources":["../../../src/solid/LinearSweep.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;GAMG;AACH,qBAAa,WAAY,SAAQ,cAAc;IAC7C,wCAAwC;IACxC,SAAgB,kBAAkB,iBAAiB;IAEnD,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,UAAU,CAAW;IAE7B,OAAO;IAKP;;;;;OAKG;WACW,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS;IAM7G;;;;;;;;;;OAUG;WACW,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS;IAWlH,0CAA0C;IACnC,YAAY,IAAI,eAAe;IACtC,6EAA6E;IACtE,kBAAkB,IAAI,YAAY;IACzC,yCAAyC;IAClC,gBAAgB,IAAI,QAAQ;IACnC,2DAA2D;IACpD,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAC/C,0BAA0B;IACnB,KAAK,IAAI,WAAW;IAG3B,uDAAuD;IAChD,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAUzD;;;;OAIG;IACI,oBAAoB,IAAI,SAAS,GAAG,SAAS;IAGpD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW;IAK1D,uDAAuD;IACvC,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAQ5D,8DAA8D;IACvD,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;IAG/D;;;OAGG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAMvE,uDAAuD;IAChD,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS;IAahE;;OAEG;IACH,IAAW,cAAc,IAAI,OAAO,CAEnC;CACF"}
1
+ {"version":3,"file":"LinearSweep.d.ts","sourceRoot":"","sources":["../../../src/solid/LinearSweep.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;GAMG;AACH,qBAAa,WAAY,SAAQ,cAAc;IAC7C,wCAAwC;IACxC,SAAgB,kBAAkB,iBAAiB;IAEnD,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,UAAU,CAAW;IAE7B,OAAO;IAKP;;;;;OAKG;WACW,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS;IAMtG;;;;;;;;;;OAUG;WACW,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS;IAWlH,0CAA0C;IACnC,YAAY,IAAI,eAAe;IACtC,6EAA6E;IACtE,kBAAkB,IAAI,YAAY;IACzC,yCAAyC;IAClC,gBAAgB,IAAI,QAAQ;IACnC,2DAA2D;IACpD,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAC/C,0BAA0B;IACnB,KAAK,IAAI,WAAW;IAG3B,uDAAuD;IAChD,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAUzD;;;;OAIG;IACI,oBAAoB,IAAI,SAAS,GAAG,SAAS;IAGpD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW;IAK1D,uDAAuD;IACvC,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAQ5D,8DAA8D;IACvD,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;IAG/D;;;OAGG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAMvE,uDAAuD;IAChD,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS;IAahE;;OAEG;IACH,IAAW,cAAc,IAAI,OAAO,CAEnC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"LinearSweep.js","sourceRoot":"","sources":["../../../src/solid/LinearSweep.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 Solid\r\n */\r\n\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XAndY } from \"../geometry3d/XYZProps\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\nimport { SweepContour } from \"./SweepContour\";\r\n\r\n/**\r\n * A LinearSweep is a `SolidPrimitive` defined by\r\n * * A set of curves (any Loop, Path, or parityRegion)\r\n * * A sweep vector\r\n * If the object is \"capped\", the curves must be planar.\r\n * @public\r\n */\r\nexport class LinearSweep extends SolidPrimitive {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"linearSweep\";\r\n\r\n private _contour: SweepContour;\r\n private _direction: Vector3d;\r\n\r\n private constructor(contour: SweepContour, direction: Vector3d, capped: boolean) {\r\n super(capped);\r\n this._contour = contour;\r\n this._direction = direction;\r\n }\r\n /**\r\n * Create a sweep of a starting contour.\r\n * @param contour contour to be swept\r\n * @param direction sweep vector. The contour is swept the full length of the vector.\r\n * @param capped true to include end caps\r\n */\r\n public static create(contour: CurveCollection, direction: Vector3d, capped: boolean): LinearSweep | undefined {\r\n const sweepable = SweepContour.createForLinearSweep(contour, direction);\r\n if (!sweepable)\r\n return undefined;\r\n return new LinearSweep(sweepable, direction, capped);\r\n }\r\n /** Create a z-direction sweep of the polyline or polygon given as xy linestring values.\r\n * * If not capped, the xyPoints array is always used unchanged.\r\n * * If capped but the xyPoints array does not close, exact closure will be enforced by one of these:\r\n * * * If the final point is almost equal to the first, it is replaced by the exact first point.\r\n * * * if the final point is not close to the first an extra point is added.\r\n * * If capped, the point order will be reversed if necessary to produce positive volume.\r\n * @param xyPoints array of xy coordinates\r\n * @param z z value to be used for all coordinates\r\n * @param zSweep the sweep distance in the z direction.\r\n * @param capped true if caps are to be added.\r\n */\r\n public static createZSweep(xyPoints: XAndY[], z: number, zSweep: number, capped: boolean): LinearSweep | undefined {\r\n const xyz = LineString3d.createXY(xyPoints, z, capped);\r\n if (capped) {\r\n xyz.addClosurePoint();\r\n const area = PolygonOps.areaXY(xyz.points);\r\n if (area * zSweep < 0.0)\r\n xyz.points.reverse();\r\n }\r\n const contour: CurveCollection = capped ? Loop.create(xyz) : Path.create(xyz);\r\n return LinearSweep.create(contour, Vector3d.create(0, 0, zSweep), capped);\r\n }\r\n /** get a reference to the swept curves */\r\n public getCurvesRef(): CurveCollection { return this._contour.curves; }\r\n /** Get a reference to the `SweepContour` carrying the plane of the curves */\r\n public getSweepContourRef(): SweepContour { return this._contour; }\r\n /** return a clone of the sweep vector */\r\n public cloneSweepVector(): Vector3d { return this._direction.clone(); }\r\n /** Test if `other` is also an instance of `LinearSweep` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof LinearSweep; }\r\n /** Return a deep clone */\r\n public clone(): LinearSweep {\r\n return new LinearSweep(this._contour.clone(), this._direction.clone(), this.capped);\r\n }\r\n /** apply a transform to the curves and sweep vector */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n if (this._contour.tryTransformInPlace(transform)) {\r\n transform.multiplyVector(this._direction, this._direction);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin on base contour\r\n * * x, y directions from base contour.\r\n * * z direction perpendicular\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n return this._contour.localToWorld.cloneRigid();\r\n }\r\n /** Return a transformed clone */\r\n public cloneTransformed(transform: Transform): LinearSweep {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Test for near-equality of coordinates in `other` */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof LinearSweep) {\r\n return this._contour.isAlmostEqual(other._contour)\r\n && this._direction.isAlmostEqual(other._direction)\r\n && this.capped === other.capped;\r\n }\r\n return false;\r\n }\r\n /** Invoke strongly typed `handler.handleLinearSweep(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleLinearSweep(this);\r\n }\r\n /**\r\n * Return the curves at a fraction along the sweep direction.\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(vFraction: number): CurveCollection | undefined {\r\n const section = this._contour.curves.clone();\r\n if (section && vFraction !== 0.0)\r\n section.tryTransformInPlace(Transform.createTranslation(this._direction.scale(vFraction)));\r\n return section;\r\n }\r\n /** Extend `rangeToExtend` to include this geometry. */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform) {\r\n const contourRange = this._contour.curves.range(transform);\r\n rangeToExtend.extendRange(contourRange);\r\n if (transform) {\r\n const transformedDirection = transform.multiplyVector(this._direction);\r\n contourRange.low.addInPlace(transformedDirection);\r\n contourRange.high.addInPlace(transformedDirection);\r\n } else {\r\n contourRange.low.addInPlace(this._direction);\r\n contourRange.high.addInPlace(this._direction);\r\n }\r\n rangeToExtend.extendRange(contourRange);\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped && this._contour.curves.isAnyRegionType;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"LinearSweep.js","sourceRoot":"","sources":["../../../src/solid/LinearSweep.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 Solid\r\n */\r\n\r\nimport { AnyCurve } from \"../curve/CurveChain\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XAndY } from \"../geometry3d/XYZProps\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\nimport { SweepContour } from \"./SweepContour\";\r\n\r\n/**\r\n * A LinearSweep is a `SolidPrimitive` defined by\r\n * * A set of curves (any Loop, Path, or parityRegion)\r\n * * A sweep vector\r\n * If the object is \"capped\", the curves must be planar.\r\n * @public\r\n */\r\nexport class LinearSweep extends SolidPrimitive {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"linearSweep\";\r\n\r\n private _contour: SweepContour;\r\n private _direction: Vector3d;\r\n\r\n private constructor(contour: SweepContour, direction: Vector3d, capped: boolean) {\r\n super(capped);\r\n this._contour = contour;\r\n this._direction = direction;\r\n }\r\n /**\r\n * Create a sweep of a starting contour.\r\n * @param contour contour to be swept\r\n * @param direction sweep vector. The contour is swept the full length of the vector.\r\n * @param capped true to include end caps\r\n */\r\n public static create(contour: AnyCurve, direction: Vector3d, capped: boolean): LinearSweep | undefined {\r\n const sweepable = SweepContour.createForLinearSweep(contour, direction);\r\n if (!sweepable)\r\n return undefined;\r\n return new LinearSweep(sweepable, direction, capped);\r\n }\r\n /** Create a z-direction sweep of the polyline or polygon given as xy linestring values.\r\n * * If not capped, the xyPoints array is always used unchanged.\r\n * * If capped but the xyPoints array does not close, exact closure will be enforced by one of these:\r\n * * * If the final point is almost equal to the first, it is replaced by the exact first point.\r\n * * * if the final point is not close to the first an extra point is added.\r\n * * If capped, the point order will be reversed if necessary to produce positive volume.\r\n * @param xyPoints array of xy coordinates\r\n * @param z z value to be used for all coordinates\r\n * @param zSweep the sweep distance in the z direction.\r\n * @param capped true if caps are to be added.\r\n */\r\n public static createZSweep(xyPoints: XAndY[], z: number, zSweep: number, capped: boolean): LinearSweep | undefined {\r\n const xyz = LineString3d.createXY(xyPoints, z, capped);\r\n if (capped) {\r\n xyz.addClosurePoint();\r\n const area = PolygonOps.areaXY(xyz.points);\r\n if (area * zSweep < 0.0)\r\n xyz.points.reverse();\r\n }\r\n const contour: CurveCollection = capped ? Loop.create(xyz) : Path.create(xyz);\r\n return LinearSweep.create(contour, Vector3d.create(0, 0, zSweep), capped);\r\n }\r\n /** get a reference to the swept curves */\r\n public getCurvesRef(): CurveCollection { return this._contour.curves; }\r\n /** Get a reference to the `SweepContour` carrying the plane of the curves */\r\n public getSweepContourRef(): SweepContour { return this._contour; }\r\n /** return a clone of the sweep vector */\r\n public cloneSweepVector(): Vector3d { return this._direction.clone(); }\r\n /** Test if `other` is also an instance of `LinearSweep` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof LinearSweep; }\r\n /** Return a deep clone */\r\n public clone(): LinearSweep {\r\n return new LinearSweep(this._contour.clone(), this._direction.clone(), this.capped);\r\n }\r\n /** apply a transform to the curves and sweep vector */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n if (this._contour.tryTransformInPlace(transform)) {\r\n transform.multiplyVector(this._direction, this._direction);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin on base contour\r\n * * x, y directions from base contour.\r\n * * z direction perpendicular\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n return this._contour.localToWorld.cloneRigid();\r\n }\r\n /** Return a transformed clone */\r\n public cloneTransformed(transform: Transform): LinearSweep {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Test for near-equality of coordinates in `other` */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof LinearSweep) {\r\n return this._contour.isAlmostEqual(other._contour)\r\n && this._direction.isAlmostEqual(other._direction)\r\n && this.capped === other.capped;\r\n }\r\n return false;\r\n }\r\n /** Invoke strongly typed `handler.handleLinearSweep(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleLinearSweep(this);\r\n }\r\n /**\r\n * Return the curves at a fraction along the sweep direction.\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(vFraction: number): CurveCollection | undefined {\r\n const section = this._contour.curves.clone();\r\n if (section && vFraction !== 0.0)\r\n section.tryTransformInPlace(Transform.createTranslation(this._direction.scale(vFraction)));\r\n return section;\r\n }\r\n /** Extend `rangeToExtend` to include this geometry. */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform) {\r\n const contourRange = this._contour.curves.range(transform);\r\n rangeToExtend.extendRange(contourRange);\r\n if (transform) {\r\n const transformedDirection = transform.multiplyVector(this._direction);\r\n contourRange.low.addInPlace(transformedDirection);\r\n contourRange.high.addInPlace(transformedDirection);\r\n } else {\r\n contourRange.low.addInPlace(this._direction);\r\n contourRange.high.addInPlace(this._direction);\r\n }\r\n rangeToExtend.extendRange(contourRange);\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped && this._contour.curves.isAnyRegionType;\r\n }\r\n}\r\n"]}
@@ -1,6 +1,7 @@
1
1
  /** @packageDocumentation
2
2
  * @module Solid
3
3
  */
4
+ import { AnyCurve } from "../curve/CurveChain";
4
5
  import { CurveCollection } from "../curve/CurveCollection";
5
6
  import { GeometryQuery } from "../curve/GeometryQuery";
6
7
  import { Angle } from "../geometry3d/Angle";
@@ -27,7 +28,7 @@ export declare class RotationalSweep extends SolidPrimitive {
27
28
  private _sweepAngle;
28
29
  private constructor();
29
30
  /** Create a rotational sweep. */
30
- static create(contour: CurveCollection, axis: Ray3d, sweepAngle: Angle, capped: boolean): RotationalSweep | undefined;
31
+ static create(contour: AnyCurve, axis: Ray3d, sweepAngle: Angle, capped: boolean): RotationalSweep | undefined;
31
32
  /** Return a coordinate frame (right handed unit vectors)
32
33
  * * origin at origin of rotation ray
33
34
  * * z direction along the rotation ray.
@@ -1 +1 @@
1
- {"version":3,"file":"RotationalSweep.d.ts","sourceRoot":"","sources":["../../../src/solid/RotationalSweep.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;;;GAQG;AACH,qBAAa,eAAgB,SAAQ,cAAc;IACjD,wCAAwC;IACxC,SAAgB,kBAAkB,qBAAqB;IAEvD,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO;IAOP,iCAAiC;WACnB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS;IAQ5H;;;;OAIG;IACI,oBAAoB,IAAI,SAAS,GAAG,SAAS;IAQpD,0DAA0D;IACnD,YAAY,IAAI,KAAK;IAC5B,8CAA8C;IACvC,SAAS,IAAI,eAAe;IACnC,2EAA2E;IACpE,kBAAkB,IAAI,YAAY;IACzC,8BAA8B;IACvB,QAAQ,IAAI,KAAK;IACxB,6CAA6C;IACtC,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAC/C,uDAAuD;IACvC,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAQ5D,0BAA0B;IACnB,KAAK,IAAI,eAAe;IAG/B,qCAAqC;IAC9B,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAQzD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe;IAK9D,gFAAgF;IACzE,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;IAG/D,mGAAmG;IAC5F,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS;IAOvF;;;OAGG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAOvE,wDAAwD;IACjD,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS;IAmBxD;;OAEG;IACH,IAAW,cAAc,IAAI,OAAO,CAEnC;CACF"}
1
+ {"version":3,"file":"RotationalSweep.d.ts","sourceRoot":"","sources":["../../../src/solid/RotationalSweep.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;;;GAQG;AACH,qBAAa,eAAgB,SAAQ,cAAc;IACjD,wCAAwC;IACxC,SAAgB,kBAAkB,qBAAqB;IAEvD,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO;IAOP,iCAAiC;WACnB,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS;IASrH;;;;OAIG;IACI,oBAAoB,IAAI,SAAS,GAAG,SAAS;IAQpD,0DAA0D;IACnD,YAAY,IAAI,KAAK;IAC5B,8CAA8C;IACvC,SAAS,IAAI,eAAe;IACnC,2EAA2E;IACpE,kBAAkB,IAAI,YAAY;IACzC,8BAA8B;IACvB,QAAQ,IAAI,KAAK;IACxB,6CAA6C;IACtC,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAC/C,uDAAuD;IACvC,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAQ5D,0BAA0B;IACnB,KAAK,IAAI,eAAe;IAG/B,qCAAqC;IAC9B,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAQzD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe;IAK9D,gFAAgF;IACzE,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;IAG/D,mGAAmG;IAC5F,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS;IAOvF;;;OAGG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAOvE,wDAAwD;IACjD,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS;IAmBxD;;OAEG;IACH,IAAW,cAAc,IAAI,OAAO,CAEnC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"RotationalSweep.js","sourceRoot":"","sources":["../../../src/solid/RotationalSweep.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 Solid\r\n */\r\n\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { AxisOrder, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\nimport { SweepContour } from \"./SweepContour\";\r\n\r\n/**\r\n * A LinearSweep is\r\n * * A planar contour (any Loop, Path, or parityRegion)\r\n * * An axis vector.\r\n * * The planar contour is expected to be in the plane of the axis vector\r\n * * The contour may have points and/or lines that are on the axis, but otherwise is entirely on one side of the axis.\r\n * * A sweep angle.\r\n * @public\r\n */\r\nexport class RotationalSweep extends SolidPrimitive {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"rotationalSweep\";\r\n\r\n private _contour: SweepContour;\r\n private _normalizedAxis: Ray3d;\r\n private _sweepAngle: Angle;\r\n private constructor(contour: SweepContour, normalizedAxis: Ray3d, sweepAngle: Angle, capped: boolean) {\r\n super(capped);\r\n this._contour = contour;\r\n this._normalizedAxis = normalizedAxis;\r\n this.capped = capped;\r\n this._sweepAngle = sweepAngle;\r\n }\r\n /** Create a rotational sweep. */\r\n public static create(contour: CurveCollection, axis: Ray3d, sweepAngle: Angle, capped: boolean): RotationalSweep | undefined {\r\n if (!axis.direction.normalizeInPlace()) return undefined;\r\n const sweepable = SweepContour.createForRotation(contour, axis);\r\n if (!sweepable)\r\n return undefined;\r\n return new RotationalSweep(sweepable, axis, sweepAngle.clone(), capped);\r\n }\r\n\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin at origin of rotation ray\r\n * * z direction along the rotation ray.\r\n * * y direction perpendicular to the base contour plane\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n const contourPerpendicular = this._contour.localToWorld.matrix.columnZ();\r\n const axes = Matrix3d.createRigidFromColumns(contourPerpendicular, this._normalizedAxis.direction, AxisOrder.YZX);\r\n if (axes) {\r\n return Transform.createOriginAndMatrix(this._normalizedAxis.origin, axes);\r\n }\r\n return undefined;\r\n }\r\n /** return clone of (not reference to) the axis vector. */\r\n public cloneAxisRay(): Ray3d { return this._normalizedAxis.clone(); }\r\n /** Return (REFERENCE TO) the swept curves. */\r\n public getCurves(): CurveCollection { return this._contour.curves; }\r\n /** Return (REFERENCE TO) the swept curves with containing plane markup. */\r\n public getSweepContourRef(): SweepContour { return this._contour; }\r\n /** Return the sweep angle. */\r\n public getSweep(): Angle { return this._sweepAngle.clone(); }\r\n /** Test if `other` is a `RotationalSweep` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof RotationalSweep; }\r\n /** Test for same axis, capping, and swept geometry. */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof RotationalSweep) {\r\n return this._contour.isAlmostEqual(other._contour)\r\n && this._normalizedAxis.isAlmostEqual(other._normalizedAxis)\r\n && this.capped === other.capped;\r\n }\r\n return false;\r\n }\r\n /** return a deep clone */\r\n public clone(): RotationalSweep {\r\n return new RotationalSweep(this._contour.clone(), this._normalizedAxis.clone(), this._sweepAngle.clone(), this.capped);\r\n }\r\n /** Transform the contour and axis */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (!transform.matrix.isSingular()\r\n && this._contour.tryTransformInPlace(transform)) {\r\n this._normalizedAxis.transformInPlace(transform);\r\n return this._normalizedAxis.direction.normalizeInPlace();\r\n }\r\n return false;\r\n }\r\n /** return a cloned transform. */\r\n public cloneTransformed(transform: Transform): RotationalSweep {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Dispatch to strongly typed handler `handler.handleRotationalSweep(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleRotationalSweep(this);\r\n }\r\n /** Return a transform that rotates around the rotational axis by a fraction of the total sweep. */\r\n public getFractionalRotationTransform(vFraction: number, result?: Transform): Transform {\r\n const radians = this._sweepAngle.radians * vFraction;\r\n const rotation = Transform.createFixedPointAndMatrix(this._normalizedAxis.origin,\r\n Matrix3d.createRotationAroundVector(this._normalizedAxis.direction, Angle.createRadians(radians),\r\n result ? result.matrix : undefined) as Matrix3d);\r\n return rotation;\r\n }\r\n /**\r\n * Return the curves of a constant-v section of the solid.\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(vFraction: number): CurveCollection | undefined {\r\n const section = this._contour.curves.clone();\r\n if (section) {\r\n section.tryTransformInPlace(this.getFractionalRotationTransform(vFraction));\r\n }\r\n return section;\r\n }\r\n /** Extend range using sampled points on the surface. */\r\n public extendRange(range: Range3d, transform?: Transform) {\r\n const degreeStep = 360 / 32;\r\n const options = StrokeOptions.createForCurves();\r\n options.angleTol = Angle.createDegrees(degreeStep);\r\n const strokes = this._contour.curves.cloneStroked(options);\r\n const numStep = Geometry.stepCount(degreeStep, this._sweepAngle.degrees, 4, 32);\r\n const stepTransform = Transform.createIdentity();\r\n if (transform) {\r\n const compositeTransform = Transform.createIdentity();\r\n for (let i = 0; i <= numStep; i++) {\r\n transform.multiplyTransformTransform(this.getFractionalRotationTransform(i / numStep, stepTransform), compositeTransform);\r\n strokes.extendRange(range, compositeTransform);\r\n }\r\n\r\n } else {\r\n for (let i = 0; i <= numStep; i++)\r\n strokes.extendRange(range, this.getFractionalRotationTransform(i / numStep, stepTransform));\r\n }\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped || this._sweepAngle.isFullCircle;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"RotationalSweep.js","sourceRoot":"","sources":["../../../src/solid/RotationalSweep.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 Solid\r\n */\r\n\r\nimport { AnyCurve } from \"../curve/CurveChain\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { AxisOrder, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\nimport { SweepContour } from \"./SweepContour\";\r\n\r\n/**\r\n * A LinearSweep is\r\n * * A planar contour (any Loop, Path, or parityRegion)\r\n * * An axis vector.\r\n * * The planar contour is expected to be in the plane of the axis vector\r\n * * The contour may have points and/or lines that are on the axis, but otherwise is entirely on one side of the axis.\r\n * * A sweep angle.\r\n * @public\r\n */\r\nexport class RotationalSweep extends SolidPrimitive {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"rotationalSweep\";\r\n\r\n private _contour: SweepContour;\r\n private _normalizedAxis: Ray3d;\r\n private _sweepAngle: Angle;\r\n private constructor(contour: SweepContour, normalizedAxis: Ray3d, sweepAngle: Angle, capped: boolean) {\r\n super(capped);\r\n this._contour = contour;\r\n this._normalizedAxis = normalizedAxis;\r\n this.capped = capped;\r\n this._sweepAngle = sweepAngle;\r\n }\r\n /** Create a rotational sweep. */\r\n public static create(contour: AnyCurve, axis: Ray3d, sweepAngle: Angle, capped: boolean): RotationalSweep | undefined {\r\n if (!axis.direction.normalizeInPlace())\r\n return undefined;\r\n const sweepable = SweepContour.createForRotation(contour, axis);\r\n if (!sweepable)\r\n return undefined;\r\n return new RotationalSweep(sweepable, axis, sweepAngle.clone(), capped);\r\n }\r\n\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin at origin of rotation ray\r\n * * z direction along the rotation ray.\r\n * * y direction perpendicular to the base contour plane\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n const contourPerpendicular = this._contour.localToWorld.matrix.columnZ();\r\n const axes = Matrix3d.createRigidFromColumns(contourPerpendicular, this._normalizedAxis.direction, AxisOrder.YZX);\r\n if (axes) {\r\n return Transform.createOriginAndMatrix(this._normalizedAxis.origin, axes);\r\n }\r\n return undefined;\r\n }\r\n /** return clone of (not reference to) the axis vector. */\r\n public cloneAxisRay(): Ray3d { return this._normalizedAxis.clone(); }\r\n /** Return (REFERENCE TO) the swept curves. */\r\n public getCurves(): CurveCollection { return this._contour.curves; }\r\n /** Return (REFERENCE TO) the swept curves with containing plane markup. */\r\n public getSweepContourRef(): SweepContour { return this._contour; }\r\n /** Return the sweep angle. */\r\n public getSweep(): Angle { return this._sweepAngle.clone(); }\r\n /** Test if `other` is a `RotationalSweep` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof RotationalSweep; }\r\n /** Test for same axis, capping, and swept geometry. */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof RotationalSweep) {\r\n return this._contour.isAlmostEqual(other._contour)\r\n && this._normalizedAxis.isAlmostEqual(other._normalizedAxis)\r\n && this.capped === other.capped;\r\n }\r\n return false;\r\n }\r\n /** return a deep clone */\r\n public clone(): RotationalSweep {\r\n return new RotationalSweep(this._contour.clone(), this._normalizedAxis.clone(), this._sweepAngle.clone(), this.capped);\r\n }\r\n /** Transform the contour and axis */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (!transform.matrix.isSingular()\r\n && this._contour.tryTransformInPlace(transform)) {\r\n this._normalizedAxis.transformInPlace(transform);\r\n return this._normalizedAxis.direction.normalizeInPlace();\r\n }\r\n return false;\r\n }\r\n /** return a cloned transform. */\r\n public cloneTransformed(transform: Transform): RotationalSweep {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Dispatch to strongly typed handler `handler.handleRotationalSweep(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleRotationalSweep(this);\r\n }\r\n /** Return a transform that rotates around the rotational axis by a fraction of the total sweep. */\r\n public getFractionalRotationTransform(vFraction: number, result?: Transform): Transform {\r\n const radians = this._sweepAngle.radians * vFraction;\r\n const rotation = Transform.createFixedPointAndMatrix(this._normalizedAxis.origin,\r\n Matrix3d.createRotationAroundVector(this._normalizedAxis.direction, Angle.createRadians(radians),\r\n result ? result.matrix : undefined) as Matrix3d);\r\n return rotation;\r\n }\r\n /**\r\n * Return the curves of a constant-v section of the solid.\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(vFraction: number): CurveCollection | undefined {\r\n const section = this._contour.curves.clone();\r\n if (section) {\r\n section.tryTransformInPlace(this.getFractionalRotationTransform(vFraction));\r\n }\r\n return section;\r\n }\r\n /** Extend range using sampled points on the surface. */\r\n public extendRange(range: Range3d, transform?: Transform) {\r\n const degreeStep = 360 / 32;\r\n const options = StrokeOptions.createForCurves();\r\n options.angleTol = Angle.createDegrees(degreeStep);\r\n const strokes = this._contour.curves.cloneStroked(options);\r\n const numStep = Geometry.stepCount(degreeStep, this._sweepAngle.degrees, 4, 32);\r\n const stepTransform = Transform.createIdentity();\r\n if (transform) {\r\n const compositeTransform = Transform.createIdentity();\r\n for (let i = 0; i <= numStep; i++) {\r\n transform.multiplyTransformTransform(this.getFractionalRotationTransform(i / numStep, stepTransform), compositeTransform);\r\n strokes.extendRange(range, compositeTransform);\r\n }\r\n\r\n } else {\r\n for (let i = 0; i <= numStep; i++)\r\n strokes.extendRange(range, this.getFractionalRotationTransform(i / numStep, stepTransform));\r\n }\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped || this._sweepAngle.isFullCircle;\r\n }\r\n}\r\n"]}
@@ -1,3 +1,4 @@
1
+ import { AnyCurve } from "../curve/CurveChain";
1
2
  import { CurveCollection } from "../curve/CurveCollection";
2
3
  import { CurvePrimitive } from "../curve/CurvePrimitive";
3
4
  import { GeometryQuery } from "../curve/GeometryQuery";
@@ -26,7 +27,7 @@ export declare class RuledSweep extends SolidPrimitive {
26
27
  * Create a ruled sweep from an array of contours.
27
28
  * * the contours are CAPTURED (not cloned)
28
29
  */
29
- static create(contours: CurveCollection[], capped: boolean): RuledSweep | undefined;
30
+ static create(contours: AnyCurve[], capped: boolean): RuledSweep | undefined;
30
31
  /** Return a reference to the array of SweepContour. */
31
32
  sweepContoursRef(): SweepContour[];
32
33
  /** Return clones of all the sweep contours
@@ -1 +1 @@
1
- {"version":3,"file":"RuledSweep.d.ts","sourceRoot":"","sources":["../../../src/solid/RuledSweep.ts"],"names":[],"mappings":"AAUA,OAAO,EAAc,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,KAAK,cAAc,GAAG,SAAS,CAAC;AAC3H;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,cAAc;IAC5C,wCAAwC;IACxC,SAAgB,kBAAkB,gBAAgB;IAElD,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO;IAIP;;;OAGG;WACW,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS;IAS1F,uDAAuD;IAChD,gBAAgB,IAAI,YAAY,EAAE;IACzC;;OAEG;IACI,kBAAkB,IAAI,YAAY,EAAE;IAO3C;;OAEG;IACI,aAAa,IAAI,eAAe,EAAE;IAOzC,0BAA0B;IACnB,KAAK,IAAI,UAAU;IAG1B,uCAAuC;IAChC,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAQzD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU;IAKzD;;;;OAIG;IACI,oBAAoB,IAAI,SAAS,GAAG,SAAS;IAIpD,uDAAuD;IAChD,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAC/C,8CAA8C;IAC9B,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAY5D,kEAAkE;IAC3D,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;IAG/D;;;OAGG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAqBvE,yCAAyC;IAClC,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAKvE;;OAEG;WACW,cAAc,CAAC,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,GAAG,eAAe,GAAG,SAAS;IA6C9J;;;;OAIG;IACH,IAAW,cAAc,IAAI,OAAO,CAGnC;CAEF"}
1
+ {"version":3,"file":"RuledSweep.d.ts","sourceRoot":"","sources":["../../../src/solid/RuledSweep.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAc,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,KAAK,cAAc,GAAG,SAAS,CAAC;AAC3H;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,cAAc;IAC5C,wCAAwC;IACxC,SAAgB,kBAAkB,gBAAgB;IAElD,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO;IAIP;;;OAGG;WACW,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS;IASnF,uDAAuD;IAChD,gBAAgB,IAAI,YAAY,EAAE;IACzC;;OAEG;IACI,kBAAkB,IAAI,YAAY,EAAE;IAO3C;;OAEG;IACI,aAAa,IAAI,eAAe,EAAE;IAOzC,0BAA0B;IACnB,KAAK,IAAI,UAAU;IAG1B,uCAAuC;IAChC,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAQzD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU;IAKzD;;;;OAIG;IACI,oBAAoB,IAAI,SAAS,GAAG,SAAS;IAIpD,uDAAuD;IAChD,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAC/C,8CAA8C;IAC9B,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAY5D,kEAAkE;IAC3D,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;IAG/D;;;OAGG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAqBvE,yCAAyC;IAClC,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAKvE;;OAEG;WACW,cAAc,CAAC,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,GAAG,eAAe,GAAG,SAAS;IA6C9J;;;;OAIG;IACH,IAAW,cAAc,IAAI,OAAO,CAGnC;CAEF"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuledSweep.js","sourceRoot":"","sources":["../../../src/solid/RuledSweep.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,sFAAmF;AACnF,8DAAuE;AACvE,4DAAyD;AAEzD,0CAAuC;AAIvC,qDAAkD;AAClD,iDAA8C;AAQ9C;;;;GAIG;AACH,MAAa,UAAW,SAAQ,+BAAc;IAK5C,YAAoB,QAAwB,EAAE,MAAe;QAC3D,KAAK,CAAC,MAAM,CAAC,CAAC;QALhB,wCAAwC;QACxB,uBAAkB,GAAG,YAAY,CAAC;QAKhD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,QAA2B,EAAE,MAAe;QAC/D,MAAM,aAAa,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,SAAS,GAAG,2BAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC9C,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC/B;QACD,OAAO,IAAI,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,uDAAuD;IAChD,gBAAgB,KAAqB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE;;OAEG;IACI,kBAAkB;QACvB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;SAChC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;OAEG;IACI,aAAa;QAClB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;SACvC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,0BAA0B;IACnB,KAAK;QACV,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IACD,uCAAuC;IAChC,mBAAmB,CAAC,SAAoB;QAC7C,IAAI,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE;YAC/B,OAAO,KAAK,CAAC;QACf,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE;YACpC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;SACxC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAoB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,oBAAoB;QACzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;IACrD,CAAC;IACD,uDAAuD;IAChD,mBAAmB,CAAC,KAAU,IAAa,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC;IACvF,8CAA8C;IAC9B,aAAa,CAAC,KAAoB;QAChD,IAAI,KAAK,YAAY,UAAU,EAAE;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAC/C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACtD,OAAO,KAAK,CAAC;aAChB;YACD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,kEAAkE;IAC3D,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD;;;OAGG;IACI,gBAAgB,CAAC,SAAiB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACzC,IAAI,UAAU,GAAG,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC;QACjC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,IAAI,GAAG;YAClB,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;;YAE1B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,QAAQ,GAAG,CAAC,IAAI,UAAU;YAC5B,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC9B,MAAM,aAAa,GAAG,mBAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,EAC/F,CAAC,UAA0B,EAAE,UAA0B,EAA8B,EAAE;YACrF,MAAM,YAAY,GAAG,yDAA2B,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;YAC3G,IAAI,YAAY,YAAY,+BAAc;gBAAE,OAAO,YAAY,CAAC;YAChE,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC;IACD,yCAAyC;IAClC,WAAW,CAAC,aAAsB,EAAE,SAAqB;QAC9D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS;YAClC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,WAA4B,EAAE,WAA4B,EAAE,gBAAuC;QAC9H,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,IAAI,WAAW,YAAY,4BAAU,IAAI,WAAW,YAAY,4BAAU,EAAE;YAC1E,MAAM,MAAM,GAAG,WAAW,CAAC;YAC3B,MAAM,MAAM,GAAG,WAAW,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAgB,CAAC;YACrD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;YAClC,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;gBACvC,OAAO,SAAS,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,QAAQ;oBACX,OAAO,SAAS,CAAC;gBACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAChC;YACD,OAAO,MAAM,CAAC;SACf;aAAM,IAAI,WAAW,YAAY,iCAAe,IAAI,WAAW,YAAY,iCAAe,EAAE;YAC3F,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC;YACvC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;gBACxH,OAAO,SAAS,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,MAAM,YAAY,+BAAc,IAAI,MAAM,YAAY,+BAAc,EAAE;oBACxE,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBACtD,IAAI,CAAC,YAAY;wBACf,OAAO,SAAS,CAAC;oBACnB,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBAC9B;qBAAM,IAAI,MAAM,YAAY,iCAAe,IAAI,MAAM,YAAY,iCAAe,EAAE;oBACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;oBACvE,IAAI,CAAC,QAAQ;wBACX,OAAO,SAAS,CAAC;oBACnB,IAAI,QAAQ,YAAY,iCAAe;wBACrC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAC5B;aACF;YACD,OAAO,WAAW,CAAC;SACpB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;OAIG;IACH,IAAW,cAAc;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;CAEF;AApLD,gCAoLC","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 Solid\r\n */\r\n\r\nimport { ConstructCurveBetweenCurves } from \"../curve/ConstructCurveBetweenCurves\";\r\nimport { CurveChain, CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\nimport { SweepContour } from \"./SweepContour\";\r\n\r\n/**\r\n * * type for a function argument taking 2 curves and returning another curve or failing with undefined.\r\n * * This is used (for instance) by `RuleSweep.mutatePartners`\r\n * @public\r\n */\r\nexport type CurvePrimitiveMutator = (primitiveA: CurvePrimitive, primitiveB: CurvePrimitive) => CurvePrimitive | undefined;\r\n/**\r\n * A ruled sweep (surface) is a collection of 2 or more contours.\r\n * * All contours must have identical number and type of geometry. (paths, loops, parity regions, lines, arcs, other curves)\r\n * @public\r\n */\r\nexport class RuledSweep extends SolidPrimitive {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"ruledSweep\";\r\n\r\n private _contours: SweepContour[];\r\n private constructor(contours: SweepContour[], capped: boolean) {\r\n super(capped);\r\n this._contours = contours;\r\n }\r\n /**\r\n * Create a ruled sweep from an array of contours.\r\n * * the contours are CAPTURED (not cloned)\r\n */\r\n public static create(contours: CurveCollection[], capped: boolean): RuledSweep | undefined {\r\n const sweepContours = [];\r\n for (const contour of contours) {\r\n const sweepable = SweepContour.createForLinearSweep(contour);\r\n if (sweepable === undefined) return undefined;\r\n sweepContours.push(sweepable);\r\n }\r\n return new RuledSweep(sweepContours, capped);\r\n }\r\n /** Return a reference to the array of SweepContour. */\r\n public sweepContoursRef(): SweepContour[] { return this._contours; }\r\n /** Return clones of all the sweep contours\r\n * * See also cloneContours, which returns the spatial contours without their local coordinate system definitions)\r\n */\r\n public cloneSweepContours(): SweepContour[] {\r\n const result = [];\r\n for (const sweepable of this._contours) {\r\n result.push(sweepable.clone());\r\n }\r\n return result;\r\n }\r\n /** Return clones of all the contours\r\n * * See also cloneContours, which returns the contours in their local coordinate systems\r\n */\r\n public cloneContours(): CurveCollection[] {\r\n const result = [];\r\n for (const sweepable of this._contours) {\r\n result.push(sweepable.curves.clone());\r\n }\r\n return result;\r\n }\r\n /** Return a deep clone */\r\n public clone(): RuledSweep {\r\n return new RuledSweep(this.cloneSweepContours(), this.capped);\r\n }\r\n /** Transform all contours in place. */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n for (const contour of this._contours) {\r\n contour.tryTransformInPlace(transform);\r\n }\r\n return true;\r\n }\r\n /** Return a cloned transform. */\r\n public cloneTransformed(transform: Transform): RuledSweep {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin on base contour\r\n * * x, y directions from base contour.\r\n * * z direction perpendicular\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n if (this._contours.length === 0) return undefined;\r\n return this._contours[0].localToWorld.cloneRigid();\r\n }\r\n /** Test if `other` is an instance of a `RuledSweep` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof RuledSweep; }\r\n /** test same contour geometry and capping. */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof RuledSweep) {\r\n if (this.capped !== other.capped) return false;\r\n if (this._contours.length !== other._contours.length) return false;\r\n for (let i = 0; i < this._contours.length; i++) {\r\n if (!this._contours[i].isAlmostEqual(other._contours[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** dispatch to strongly typed `handler.handleRuledSweep(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleRuledSweep(this);\r\n }\r\n /**\r\n * Return the section curves at a fraction of the sweep\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(vFraction: number): CurveCollection | undefined {\r\n const numSection = this._contours.length;\r\n if (numSection < 2)\r\n return undefined;\r\n const q = vFraction * numSection;\r\n let section0 = 0;\r\n if (vFraction >= 1.0)\r\n section0 = numSection - 1;\r\n else\r\n section0 = Math.floor(q);\r\n if (section0 + 1 >= numSection)\r\n section0 = numSection - 2;\r\n const section1 = section0 + 1;\r\n const localFraction = Geometry.clampToStartEnd(q - section0, 0, 1);\r\n return RuledSweep.mutatePartners(this._contours[section0].curves, this._contours[section1].curves,\r\n (primitive0: CurvePrimitive, primitive1: CurvePrimitive): CurvePrimitive | undefined => {\r\n const newPrimitive = ConstructCurveBetweenCurves.interpolateBetween(primitive0, localFraction, primitive1);\r\n if (newPrimitive instanceof CurvePrimitive) return newPrimitive;\r\n return undefined;\r\n });\r\n }\r\n /** Pass each contour to `extendRange` */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n for (const contour of this._contours)\r\n contour.curves.extendRange(rangeToExtend, transform);\r\n }\r\n\r\n /** Construct a CurveCollection with the same structure as collectionA and collectionB, with primitives constructed by the caller-supplied primitiveMutator function.\r\n * @returns Returns undefined if there is any type mismatch between the two collections.\r\n */\r\n public static mutatePartners(collectionA: CurveCollection, collectionB: CurveCollection, primitiveMutator: CurvePrimitiveMutator): CurveCollection | undefined {\r\n if (!collectionA.isSameGeometryClass(collectionB))\r\n return undefined;\r\n if (collectionA instanceof CurveChain && collectionB instanceof CurveChain) {\r\n const chainA = collectionA;\r\n const chainB = collectionB;\r\n const chainC = chainA.cloneEmptyPeer() as CurveChain;\r\n const childrenA = chainA.children;\r\n const childrenB = chainB.children;\r\n if (childrenA.length !== childrenB.length)\r\n return undefined;\r\n for (let i = 0; i < childrenA.length; i++) {\r\n const newChild = primitiveMutator(childrenA[i], childrenB[i]);\r\n if (!newChild)\r\n return undefined;\r\n chainC.children.push(newChild);\r\n }\r\n return chainC;\r\n } else if (collectionA instanceof CurveCollection && collectionB instanceof CurveCollection) {\r\n const collectionC = collectionA.cloneEmptyPeer();\r\n const childrenA = collectionA.children;\r\n const childrenB = collectionB.children;\r\n const childrenC = collectionC.children;\r\n if (childrenA === undefined || childrenB === undefined || childrenC === undefined || childrenA.length !== childrenB.length)\r\n return undefined;\r\n for (let i = 0; i < childrenA.length; i++) {\r\n const childA = childrenA[i];\r\n const childB = childrenB[i];\r\n if (childA instanceof CurvePrimitive && childB instanceof CurvePrimitive) {\r\n const newPrimitive = primitiveMutator(childA, childB);\r\n if (!newPrimitive)\r\n return undefined;\r\n childrenC.push(newPrimitive);\r\n } else if (childA instanceof CurveCollection && childB instanceof CurveCollection) {\r\n const newChild = this.mutatePartners(childA, childB, primitiveMutator);\r\n if (!newChild)\r\n return undefined;\r\n if (newChild instanceof CurveCollection)\r\n childrenC.push(newChild);\r\n }\r\n }\r\n return collectionC;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return true if this is a closed volume, as observed by\r\n * * cap flag\r\n * identical first and last contours.\r\n */\r\n public get isClosedVolume(): boolean {\r\n const n = this._contours.length;\r\n return n > 1 && (this.capped || this._contours[0].isAlmostEqual(this._contours[n - 1]));\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"RuledSweep.js","sourceRoot":"","sources":["../../../src/solid/RuledSweep.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,sFAAmF;AAEnF,8DAAuE;AACvE,4DAAyD;AAEzD,0CAAuC;AAIvC,qDAAkD;AAClD,iDAA8C;AAQ9C;;;;GAIG;AACH,MAAa,UAAW,SAAQ,+BAAc;IAK5C,YAAoB,QAAwB,EAAE,MAAe;QAC3D,KAAK,CAAC,MAAM,CAAC,CAAC;QALhB,wCAAwC;QACxB,uBAAkB,GAAG,YAAY,CAAC;QAKhD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,QAAoB,EAAE,MAAe;QACxD,MAAM,aAAa,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,SAAS,GAAG,2BAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC9C,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC/B;QACD,OAAO,IAAI,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,uDAAuD;IAChD,gBAAgB,KAAqB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE;;OAEG;IACI,kBAAkB;QACvB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;SAChC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;OAEG;IACI,aAAa;QAClB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;SACvC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,0BAA0B;IACnB,KAAK;QACV,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IACD,uCAAuC;IAChC,mBAAmB,CAAC,SAAoB;QAC7C,IAAI,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE;YAC/B,OAAO,KAAK,CAAC;QACf,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE;YACpC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;SACxC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,iCAAiC;IAC1B,gBAAgB,CAAC,SAAoB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,oBAAoB;QACzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;IACrD,CAAC;IACD,uDAAuD;IAChD,mBAAmB,CAAC,KAAU,IAAa,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC;IACvF,8CAA8C;IAC9B,aAAa,CAAC,KAAoB;QAChD,IAAI,KAAK,YAAY,UAAU,EAAE;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAC/C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACtD,OAAO,KAAK,CAAC;aAChB;YACD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,kEAAkE;IAC3D,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD;;;OAGG;IACI,gBAAgB,CAAC,SAAiB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACzC,IAAI,UAAU,GAAG,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC;QACjC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,IAAI,GAAG;YAClB,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;;YAE1B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,QAAQ,GAAG,CAAC,IAAI,UAAU;YAC5B,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC9B,MAAM,aAAa,GAAG,mBAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,EAC/F,CAAC,UAA0B,EAAE,UAA0B,EAA8B,EAAE;YACrF,MAAM,YAAY,GAAG,yDAA2B,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;YAC3G,IAAI,YAAY,YAAY,+BAAc;gBAAE,OAAO,YAAY,CAAC;YAChE,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC;IACD,yCAAyC;IAClC,WAAW,CAAC,aAAsB,EAAE,SAAqB;QAC9D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS;YAClC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,WAA4B,EAAE,WAA4B,EAAE,gBAAuC;QAC9H,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,IAAI,WAAW,YAAY,4BAAU,IAAI,WAAW,YAAY,4BAAU,EAAE;YAC1E,MAAM,MAAM,GAAG,WAAW,CAAC;YAC3B,MAAM,MAAM,GAAG,WAAW,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAgB,CAAC;YACrD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;YAClC,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;gBACvC,OAAO,SAAS,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,QAAQ;oBACX,OAAO,SAAS,CAAC;gBACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAChC;YACD,OAAO,MAAM,CAAC;SACf;aAAM,IAAI,WAAW,YAAY,iCAAe,IAAI,WAAW,YAAY,iCAAe,EAAE;YAC3F,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC;YACvC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;gBACxH,OAAO,SAAS,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,MAAM,YAAY,+BAAc,IAAI,MAAM,YAAY,+BAAc,EAAE;oBACxE,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBACtD,IAAI,CAAC,YAAY;wBACf,OAAO,SAAS,CAAC;oBACnB,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBAC9B;qBAAM,IAAI,MAAM,YAAY,iCAAe,IAAI,MAAM,YAAY,iCAAe,EAAE;oBACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;oBACvE,IAAI,CAAC,QAAQ;wBACX,OAAO,SAAS,CAAC;oBACnB,IAAI,QAAQ,YAAY,iCAAe;wBACrC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAC5B;aACF;YACD,OAAO,WAAW,CAAC;SACpB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;OAIG;IACH,IAAW,cAAc;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;CAEF;AApLD,gCAoLC","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 Solid\r\n */\r\n\r\nimport { ConstructCurveBetweenCurves } from \"../curve/ConstructCurveBetweenCurves\";\r\nimport { AnyCurve } from \"../curve/CurveChain\";\r\nimport { CurveChain, CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\nimport { SweepContour } from \"./SweepContour\";\r\n\r\n/**\r\n * * type for a function argument taking 2 curves and returning another curve or failing with undefined.\r\n * * This is used (for instance) by `RuleSweep.mutatePartners`\r\n * @public\r\n */\r\nexport type CurvePrimitiveMutator = (primitiveA: CurvePrimitive, primitiveB: CurvePrimitive) => CurvePrimitive | undefined;\r\n/**\r\n * A ruled sweep (surface) is a collection of 2 or more contours.\r\n * * All contours must have identical number and type of geometry. (paths, loops, parity regions, lines, arcs, other curves)\r\n * @public\r\n */\r\nexport class RuledSweep extends SolidPrimitive {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"ruledSweep\";\r\n\r\n private _contours: SweepContour[];\r\n private constructor(contours: SweepContour[], capped: boolean) {\r\n super(capped);\r\n this._contours = contours;\r\n }\r\n /**\r\n * Create a ruled sweep from an array of contours.\r\n * * the contours are CAPTURED (not cloned)\r\n */\r\n public static create(contours: AnyCurve[], capped: boolean): RuledSweep | undefined {\r\n const sweepContours = [];\r\n for (const contour of contours) {\r\n const sweepable = SweepContour.createForLinearSweep(contour);\r\n if (sweepable === undefined) return undefined;\r\n sweepContours.push(sweepable);\r\n }\r\n return new RuledSweep(sweepContours, capped);\r\n }\r\n /** Return a reference to the array of SweepContour. */\r\n public sweepContoursRef(): SweepContour[] { return this._contours; }\r\n /** Return clones of all the sweep contours\r\n * * See also cloneContours, which returns the spatial contours without their local coordinate system definitions)\r\n */\r\n public cloneSweepContours(): SweepContour[] {\r\n const result = [];\r\n for (const sweepable of this._contours) {\r\n result.push(sweepable.clone());\r\n }\r\n return result;\r\n }\r\n /** Return clones of all the contours\r\n * * See also cloneContours, which returns the contours in their local coordinate systems\r\n */\r\n public cloneContours(): CurveCollection[] {\r\n const result = [];\r\n for (const sweepable of this._contours) {\r\n result.push(sweepable.curves.clone());\r\n }\r\n return result;\r\n }\r\n /** Return a deep clone */\r\n public clone(): RuledSweep {\r\n return new RuledSweep(this.cloneSweepContours(), this.capped);\r\n }\r\n /** Transform all contours in place. */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n for (const contour of this._contours) {\r\n contour.tryTransformInPlace(transform);\r\n }\r\n return true;\r\n }\r\n /** Return a cloned transform. */\r\n public cloneTransformed(transform: Transform): RuledSweep {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin on base contour\r\n * * x, y directions from base contour.\r\n * * z direction perpendicular\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n if (this._contours.length === 0) return undefined;\r\n return this._contours[0].localToWorld.cloneRigid();\r\n }\r\n /** Test if `other` is an instance of a `RuledSweep` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof RuledSweep; }\r\n /** test same contour geometry and capping. */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof RuledSweep) {\r\n if (this.capped !== other.capped) return false;\r\n if (this._contours.length !== other._contours.length) return false;\r\n for (let i = 0; i < this._contours.length; i++) {\r\n if (!this._contours[i].isAlmostEqual(other._contours[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** dispatch to strongly typed `handler.handleRuledSweep(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleRuledSweep(this);\r\n }\r\n /**\r\n * Return the section curves at a fraction of the sweep\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(vFraction: number): CurveCollection | undefined {\r\n const numSection = this._contours.length;\r\n if (numSection < 2)\r\n return undefined;\r\n const q = vFraction * numSection;\r\n let section0 = 0;\r\n if (vFraction >= 1.0)\r\n section0 = numSection - 1;\r\n else\r\n section0 = Math.floor(q);\r\n if (section0 + 1 >= numSection)\r\n section0 = numSection - 2;\r\n const section1 = section0 + 1;\r\n const localFraction = Geometry.clampToStartEnd(q - section0, 0, 1);\r\n return RuledSweep.mutatePartners(this._contours[section0].curves, this._contours[section1].curves,\r\n (primitive0: CurvePrimitive, primitive1: CurvePrimitive): CurvePrimitive | undefined => {\r\n const newPrimitive = ConstructCurveBetweenCurves.interpolateBetween(primitive0, localFraction, primitive1);\r\n if (newPrimitive instanceof CurvePrimitive) return newPrimitive;\r\n return undefined;\r\n });\r\n }\r\n /** Pass each contour to `extendRange` */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n for (const contour of this._contours)\r\n contour.curves.extendRange(rangeToExtend, transform);\r\n }\r\n\r\n /** Construct a CurveCollection with the same structure as collectionA and collectionB, with primitives constructed by the caller-supplied primitiveMutator function.\r\n * @returns Returns undefined if there is any type mismatch between the two collections.\r\n */\r\n public static mutatePartners(collectionA: CurveCollection, collectionB: CurveCollection, primitiveMutator: CurvePrimitiveMutator): CurveCollection | undefined {\r\n if (!collectionA.isSameGeometryClass(collectionB))\r\n return undefined;\r\n if (collectionA instanceof CurveChain && collectionB instanceof CurveChain) {\r\n const chainA = collectionA;\r\n const chainB = collectionB;\r\n const chainC = chainA.cloneEmptyPeer() as CurveChain;\r\n const childrenA = chainA.children;\r\n const childrenB = chainB.children;\r\n if (childrenA.length !== childrenB.length)\r\n return undefined;\r\n for (let i = 0; i < childrenA.length; i++) {\r\n const newChild = primitiveMutator(childrenA[i], childrenB[i]);\r\n if (!newChild)\r\n return undefined;\r\n chainC.children.push(newChild);\r\n }\r\n return chainC;\r\n } else if (collectionA instanceof CurveCollection && collectionB instanceof CurveCollection) {\r\n const collectionC = collectionA.cloneEmptyPeer();\r\n const childrenA = collectionA.children;\r\n const childrenB = collectionB.children;\r\n const childrenC = collectionC.children;\r\n if (childrenA === undefined || childrenB === undefined || childrenC === undefined || childrenA.length !== childrenB.length)\r\n return undefined;\r\n for (let i = 0; i < childrenA.length; i++) {\r\n const childA = childrenA[i];\r\n const childB = childrenB[i];\r\n if (childA instanceof CurvePrimitive && childB instanceof CurvePrimitive) {\r\n const newPrimitive = primitiveMutator(childA, childB);\r\n if (!newPrimitive)\r\n return undefined;\r\n childrenC.push(newPrimitive);\r\n } else if (childA instanceof CurveCollection && childB instanceof CurveCollection) {\r\n const newChild = this.mutatePartners(childA, childB, primitiveMutator);\r\n if (!newChild)\r\n return undefined;\r\n if (newChild instanceof CurveCollection)\r\n childrenC.push(newChild);\r\n }\r\n }\r\n return collectionC;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return true if this is a closed volume, as observed by\r\n * * cap flag\r\n * identical first and last contours.\r\n */\r\n public get isClosedVolume(): boolean {\r\n const n = this._contours.length;\r\n return n > 1 && (this.capped || this._contours[0].isAlmostEqual(this._contours[n - 1]));\r\n }\r\n\r\n}\r\n"]}
@@ -25,7 +25,7 @@ export declare class SweepContour {
25
25
  * * The optional default normal may be useful for guiding coordinate frame setup.
26
26
  * * the contour is CAPTURED.
27
27
  */
28
- static createForLinearSweep(contour: CurveCollection, defaultNormal?: Vector3d): SweepContour | undefined;
28
+ static createForLinearSweep(contour: AnyCurve, defaultNormal?: Vector3d): SweepContour | undefined;
29
29
  /** Create for linear sweep.
30
30
  * * The optional default normal may be useful for guiding coordinate frame setup.
31
31
  * * the points are captured into linestrings and Loops as needed.
@@ -35,7 +35,7 @@ export declare class SweepContour {
35
35
  * * The axis ray is retained.
36
36
  * * the contour is CAPTURED.
37
37
  */
38
- static createForRotation(contour: CurveCollection, axis: Ray3d): SweepContour | undefined;
38
+ static createForRotation(contour: AnyCurve, axis: Ray3d): SweepContour | undefined;
39
39
  /** Return (Reference to) the curves */
40
40
  getCurves(): CurveCollection;
41
41
  /** Apply `transform` to the curves, axis.
@@ -1 +1 @@
1
- {"version":3,"file":"SweepContour.d.ts","sourceRoot":"","sources":["../../../src/solid/SweepContour.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAK3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAW,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,0BAA0B,EAAgB,MAAM,2BAA2B,CAAC;AAErF;;;;GAIG;AACH,qBAAa,YAAY;IACvB,0EAA0E;IACnE,MAAM,EAAE,eAAe,CAAC;IAC/B,yEAAyE;IAClE,YAAY,EAAE,SAAS,CAAC;IAC/B,yCAAyC;IAClC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IAE/B,OAAO;IAKP;;;OAGG;WACW,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS;IAQhH;;;OAGG;WACW,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,EAAE,aAAa,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS;IAsBtH;;;OAGG;WACW,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,GAAG,YAAY,GAAG,SAAS;IAQhG,uCAAuC;IAChC,SAAS,IAAI,eAAe;IACnC;;OAEG;IACI,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAezD,2BAA2B;IACpB,KAAK,IAAI,YAAY;IAG5B,kCAAkC;IAC3B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS;IAMvE,uDAAuD;IAChD,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAOzC,OAAO,CAAC,UAAU,CAAC,CAAW;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAkB;IAClC,IAAW,SAAS,IAAI,QAAQ,GAAG,SAAS,CAA2B;IACvE;;;OAGG;IACI,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IA2D5D;;OAEG;IACI,WAAW;IAIlB;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS;IAMnF;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS;IAMrG;;;;;;;;OAQG;IACI,iCAAiC,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAe,EAAE,IAAI,GAAE,OAAe,GAAG,0BAA0B,GAAG,SAAS;CAyCvJ"}
1
+ {"version":3,"file":"SweepContour.d.ts","sourceRoot":"","sources":["../../../src/solid/SweepContour.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAO3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAW,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,0BAA0B,EAAgB,MAAM,2BAA2B,CAAC;AAErF;;;;GAIG;AACH,qBAAa,YAAY;IACvB,0EAA0E;IACnE,MAAM,EAAE,eAAe,CAAC;IAC/B,yEAAyE;IAClE,YAAY,EAAE,SAAS,CAAC;IAC/B,yCAAyC;IAClC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IAE/B,OAAO;IAYP;;;OAGG;WACW,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS;IAQzG;;;OAGG;WACW,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,EAAE,aAAa,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS;IAsBtH;;;OAGG;WACW,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,YAAY,GAAG,SAAS;IAQzF,uCAAuC;IAChC,SAAS,IAAI,eAAe;IACnC;;OAEG;IACI,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAezD,2BAA2B;IACpB,KAAK,IAAI,YAAY;IAG5B,kCAAkC;IAC3B,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS;IAMvE,uDAAuD;IAChD,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAOzC,OAAO,CAAC,UAAU,CAAC,CAAW;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAkB;IAClC,IAAW,SAAS,IAAI,QAAQ,GAAG,SAAS,CAA4B;IACxE;;;OAGG;IACI,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IA2D5D;;OAEG;IACI,WAAW;IAIlB;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS;IAMnF;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS;IAMrG;;;;;;;;OAQG;IACI,iCAAiC,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAe,EAAE,IAAI,GAAE,OAAe,GAAG,0BAA0B,GAAG,SAAS;CAyCvJ"}
@@ -11,9 +11,11 @@ exports.SweepContour = void 0;
11
11
  const ClipPlane_1 = require("../clipping/ClipPlane");
12
12
  const ConvexClipPlaneSet_1 = require("../clipping/ConvexClipPlaneSet");
13
13
  const UnionOfConvexClipPlaneSets_1 = require("../clipping/UnionOfConvexClipPlaneSets");
14
+ const CurvePrimitive_1 = require("../curve/CurvePrimitive");
14
15
  const LineString3d_1 = require("../curve/LineString3d");
15
16
  const Loop_1 = require("../curve/Loop");
16
17
  const ParityRegion_1 = require("../curve/ParityRegion");
18
+ const Path_1 = require("../curve/Path");
17
19
  const RegionOps_1 = require("../curve/RegionOps");
18
20
  const FrameBuilder_1 = require("../geometry3d/FrameBuilder");
19
21
  const Point3dVector3d_1 = require("../geometry3d/Point3dVector3d");
@@ -28,6 +30,13 @@ const Triangulation_1 = require("../topology/Triangulation");
28
30
  */
29
31
  class SweepContour {
30
32
  constructor(contour, map, axis) {
33
+ if (contour instanceof CurvePrimitive_1.CurvePrimitive) {
34
+ // this.curves is a CurveCollection (not AnyCurve) so that contour type determines closure.
35
+ // This is the only time we detect CurvePrimitive closure and wrap as a relevant CurveChain.
36
+ const primitive = contour;
37
+ contour = contour.startPoint().isAlmostEqual(contour.endPoint()) ? new Loop_1.Loop() : new Path_1.Path();
38
+ contour.tryAddChild(primitive);
39
+ }
31
40
  this.curves = contour;
32
41
  this.localToWorld = map;
33
42
  this.axis = axis;
@@ -1 +1 @@
1
- {"version":3,"file":"SweepContour.js","sourceRoot":"","sources":["../../../src/solid/SweepContour.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 Solid\r\n */\r\n\r\nimport { ClipPlane } from \"../clipping/ClipPlane\";\r\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\r\nimport { UnionOfConvexClipPlaneSets } from \"../clipping/UnionOfConvexClipPlaneSets\";\r\nimport { AnyCurve } from \"../curve/CurveChain\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { ParityRegion } from \"../curve/ParityRegion\";\r\nimport { RegionOps } from \"../curve/RegionOps\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { FrameBuilder } from \"../geometry3d/FrameBuilder\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { IndexedPolyface } from \"../polyface/Polyface\";\r\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\r\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\r\nimport { MultiLineStringDataVariant, Triangulator } from \"../topology/Triangulation\";\r\n\r\n/**\r\n * Sweepable contour with Transform for local to world interaction.\r\n * * The surface/solid classes `LinearSweep`, `RotationalSweep`, `RuledSweep` use this for their swept contours.\r\n * @public\r\n */\r\nexport class SweepContour {\r\n /** The underlying curve collection, in its world coordinates position. */\r\n public curves: CurveCollection;\r\n /** coordinate frame that in which the curves are all in the xy plane. */\r\n public localToWorld: Transform;\r\n /** Axis used only in rotational case. */\r\n public axis: Ray3d | undefined;\r\n\r\n private constructor(contour: CurveCollection, map: Transform, axis: Ray3d | undefined) {\r\n this.curves = contour;\r\n this.localToWorld = map;\r\n this.axis = axis;\r\n }\r\n /** Create for linear sweep.\r\n * * The optional default normal may be useful for guiding coordinate frame setup.\r\n * * the contour is CAPTURED.\r\n */\r\n public static createForLinearSweep(contour: CurveCollection, defaultNormal?: Vector3d): SweepContour | undefined {\r\n const localToWorld = FrameBuilder.createRightHandedFrame(defaultNormal, contour);\r\n if (localToWorld) {\r\n return new SweepContour(contour, localToWorld, undefined);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Create for linear sweep.\r\n * * The optional default normal may be useful for guiding coordinate frame setup.\r\n * * the points are captured into linestrings and Loops as needed.\r\n */\r\n public static createForPolygon(points: MultiLineStringDataVariant, defaultNormal?: Vector3d): SweepContour | undefined {\r\n const localToWorld = FrameBuilder.createRightHandedFrame(defaultNormal, points);\r\n if (localToWorld) {\r\n if (defaultNormal !== undefined) {\r\n if (localToWorld.matrix.dotColumnZ(defaultNormal))\r\n localToWorld.matrix.scaleColumnsInPlace(1.0, -1.0, -1.0);\r\n }\r\n const linestrings = LineString3d.createArrayOfLineString3d(points);\r\n const loops = [];\r\n for (const ls of linestrings) {\r\n ls.addClosurePoint();\r\n loops.push(Loop.create(ls));\r\n }\r\n if (loops.length === 1) {\r\n return new SweepContour(loops[0], localToWorld, undefined);\r\n } else if (loops.length > 1) {\r\n return new SweepContour(ParityRegion.createLoops(loops), localToWorld, undefined);\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Create for rotational sweep.\r\n * * The axis ray is retained.\r\n * * the contour is CAPTURED.\r\n */\r\n public static createForRotation(contour: CurveCollection, axis: Ray3d): SweepContour | undefined {\r\n // createRightHandedFrame -- the axis is a last-gasp resolver for in-plane vectors.\r\n const localToWorld = FrameBuilder.createRightHandedFrame(undefined, contour, axis);\r\n if (localToWorld) {\r\n return new SweepContour(contour, localToWorld, axis.clone());\r\n }\r\n return undefined;\r\n }\r\n /** Return (Reference to) the curves */\r\n public getCurves(): CurveCollection { return this.curves; }\r\n /** Apply `transform` to the curves, axis.\r\n * * The local to world frame is reconstructed for the transformed curves.\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (this.curves.tryTransformInPlace(transform)) {\r\n if (this.axis)\r\n this.axis.transformInPlace(transform);\r\n\r\n const localToWorld = this.axis !== undefined\r\n ? FrameBuilder.createRightHandedFrame(undefined, this.curves, this.axis)\r\n : FrameBuilder.createRightHandedFrame(undefined, this.curves);\r\n if (localToWorld) {\r\n this.localToWorld.setFrom(localToWorld);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** Return a deep clone. */\r\n public clone(): SweepContour {\r\n return new SweepContour(this.curves.clone(), this.localToWorld.clone(), this.axis);\r\n }\r\n /** Return a transformed clone. */\r\n public cloneTransformed(transform: Transform): SweepContour | undefined {\r\n const newContour = this.clone();\r\n if (newContour.tryTransformInPlace(transform))\r\n return newContour;\r\n return undefined;\r\n }\r\n /** Test for near equality of cures and local frame. */\r\n public isAlmostEqual(other: any): boolean {\r\n if (other instanceof SweepContour) {\r\n return this.curves.isAlmostEqual(other.curves) && this.localToWorld.isAlmostEqual(other.localToWorld);\r\n }\r\n return false;\r\n }\r\n\r\n private _xyStrokes?: AnyCurve;\r\n private _facets?: IndexedPolyface;\r\n public get xyStrokes(): AnyCurve | undefined { return this._xyStrokes;}\r\n /**\r\n * build the (cached) internal facets.\r\n * @param options options for stroking the curves.\r\n */\r\n public buildFacets(options: StrokeOptions | undefined): void {\r\n if (!this._facets) {\r\n if (this.curves instanceof Loop) {\r\n this._xyStrokes = this.curves.cloneStroked(options);\r\n if (this._xyStrokes instanceof Loop && this._xyStrokes.children.length === 1) {\r\n const children = this._xyStrokes.children;\r\n const linestring = children[0] as LineString3d;\r\n const points = linestring.points;\r\n this.localToWorld.multiplyInversePoint3dArrayInPlace(points);\r\n if (PolygonOps.sumTriangleAreasXY(points) < 0)\r\n points.reverse();\r\n const graph = Triangulator.createTriangulatedGraphFromSingleLoop(points);\r\n if (graph) {\r\n Triangulator.flipTriangles(graph);\r\n const unflippedPoly = PolyfaceBuilder.graphToPolyface(graph, options);\r\n this._facets = unflippedPoly;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n } else { // earcut failed (e.g., on a split washer polygon, where the bridge edge is traversed twice)\r\n const polyface = RegionOps.polygonXYAreaUnionLoopsToPolyface(points, [], true);\r\n if (polyface) {\r\n this._facets = polyface as IndexedPolyface;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n }\r\n }\r\n }\r\n } else if (this.curves instanceof ParityRegion) {\r\n this._xyStrokes = this.curves.cloneStroked(options);\r\n if (this._xyStrokes instanceof (ParityRegion)) {\r\n const worldToLocal = this.localToWorld.inverse()!;\r\n this._xyStrokes.tryTransformInPlace(worldToLocal);\r\n const strokes = [];\r\n for (const childLoop of this._xyStrokes.children) {\r\n const loopCurves = childLoop.children;\r\n if (loopCurves.length === 1) {\r\n const c = loopCurves[0];\r\n if (c instanceof LineString3d)\r\n strokes.push(c.packedPoints);\r\n }\r\n }\r\n const numLoops = strokes.length;\r\n /** Try the earcut algorithm first -- lots less machinery, but can't handle any form of overlap */\r\n const graph = Triangulator.createTriangulatedGraphFromLoops(strokes);\r\n if (graph && HalfEdgeGraphSearch.isTriangulatedCCW(graph, true, numLoops - 1)) {\r\n Triangulator.flipTriangles(graph);\r\n const unflippedPoly = PolyfaceBuilder.graphToPolyface(graph, options);\r\n this._facets = unflippedPoly;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n } else {\r\n // earcut failed. Restart with full merge and parity analysis.\r\n const polyface = RegionOps.polygonXYAreaUnionLoopsToPolyface(strokes, [], true);\r\n if (polyface) {\r\n this._facets = polyface as IndexedPolyface;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** delete existing facets.\r\n * * This protects against PolyfaceBuilder reusing facets constructed with different options settings.\r\n */\r\n public purgeFacets() {\r\n this._facets = undefined;\r\n }\r\n\r\n /** Emit facets to a builder.\r\n * This method may cache and reuse facets over multiple calls.\r\n */\r\n public emitFacets(builder: PolyfaceBuilder, reverse: boolean, transform?: Transform) {\r\n this.buildFacets(builder.options);\r\n if (this._facets)\r\n builder.addIndexedPolyface(this._facets, reverse, transform);\r\n }\r\n\r\n /** Emit facets to a function\r\n * This method may cache and reuse facets over multiple calls.\r\n */\r\n public announceFacets(announce: (facets: IndexedPolyface) => void, options: StrokeOptions | undefined) {\r\n this.buildFacets(options);\r\n if (this._facets)\r\n announce(this._facets);\r\n }\r\n\r\n /**\r\n * Triangulate the region.\r\n * Create a UnionOfConvexClipPlaneSets that clips to the swept region.\r\n * * If sweepVector is not given, the sweep direction is perpendicular to the plane of the contour.\r\n * * If sweepVector is given, it is the sweep direction and does not have to be perpendicular to the contour.\r\n * * cap0 and cap1 indicate construction of clip planes parallel to the contour plane.\r\n * * If cap1 is true, the cap plane is at `anyPointOnPlane + sweepVector`. That is, the sweep vector indicates both direction and distance.\r\n * * caps are NOT created of sweepVector is not given.\r\n */\r\n public sweepToUnionOfConvexClipPlaneSets(sweepVector?: Vector3d, cap0: boolean = false, cap1: boolean = false): UnionOfConvexClipPlaneSets | undefined {\r\n const builder = PolyfaceBuilder.create();\r\n // It's a trip around the barn, but it's easy to make a polyface and scan it . . .\r\n if (!sweepVector)\r\n cap0 = cap1 = false;\r\n this.buildFacets(builder.options);\r\n if (sweepVector === undefined)\r\n sweepVector = this.localToWorld.matrix.columnZ();\r\n const zVector = this.localToWorld.matrix.columnZ();\r\n const facets = this._facets;\r\n const point0 = Point3d.create();\r\n const point1 = Point3d.create();\r\n if (facets) {\r\n const plane0Origin = this.localToWorld.getOrigin();\r\n const plane1Origin = plane0Origin.plus(sweepVector);\r\n const inwardNormal0 = zVector.clone();\r\n const inwardNormal1 = zVector.negate();\r\n\r\n const result = UnionOfConvexClipPlaneSets.createEmpty();\r\n const visitor = facets.createVisitor(1);\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n const numEdges = visitor.point.length - 1;\r\n const clipper = ConvexClipPlaneSet.createEmpty();\r\n for (let i = 0; i < numEdges; i++) {\r\n visitor.point.getPoint3dAtUncheckedPointIndex(i, point0);\r\n visitor.point.getPoint3dAtUncheckedPointIndex(i + 1, point1);\r\n const plane = ClipPlane.createEdgeAndUpVector(point1, point0, sweepVector);\r\n const visible = visitor.edgeVisible[i];\r\n plane?.setFlags(!visible, !visible);\r\n clipper.addPlaneToConvexSet(plane);\r\n }\r\n if (cap0)\r\n clipper.addPlaneToConvexSet(ClipPlane.createNormalAndPoint(inwardNormal0, plane0Origin));\r\n if (cap1)\r\n clipper.addPlaneToConvexSet(ClipPlane.createNormalAndPoint(inwardNormal1, plane1Origin));\r\n result.addConvexSet(clipper);\r\n }\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SweepContour.js","sourceRoot":"","sources":["../../../src/solid/SweepContour.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 Solid\r\n */\r\n\r\nimport { ClipPlane } from \"../clipping/ClipPlane\";\r\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\r\nimport { UnionOfConvexClipPlaneSets } from \"../clipping/UnionOfConvexClipPlaneSets\";\r\nimport { AnyCurve } from \"../curve/CurveChain\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { ParityRegion } from \"../curve/ParityRegion\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { RegionOps } from \"../curve/RegionOps\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { FrameBuilder } from \"../geometry3d/FrameBuilder\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { IndexedPolyface } from \"../polyface/Polyface\";\r\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\r\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\r\nimport { MultiLineStringDataVariant, Triangulator } from \"../topology/Triangulation\";\r\n\r\n/**\r\n * Sweepable contour with Transform for local to world interaction.\r\n * * The surface/solid classes `LinearSweep`, `RotationalSweep`, `RuledSweep` use this for their swept contours.\r\n * @public\r\n */\r\nexport class SweepContour {\r\n /** The underlying curve collection, in its world coordinates position. */\r\n public curves: CurveCollection;\r\n /** coordinate frame that in which the curves are all in the xy plane. */\r\n public localToWorld: Transform;\r\n /** Axis used only in rotational case. */\r\n public axis: Ray3d | undefined;\r\n\r\n private constructor(contour: AnyCurve, map: Transform, axis: Ray3d | undefined) {\r\n if (contour instanceof CurvePrimitive) {\r\n // this.curves is a CurveCollection (not AnyCurve) so that contour type determines closure.\r\n // This is the only time we detect CurvePrimitive closure and wrap as a relevant CurveChain.\r\n const primitive = contour;\r\n contour = contour.startPoint().isAlmostEqual(contour.endPoint()) ? new Loop() : new Path();\r\n contour.tryAddChild(primitive);\r\n }\r\n this.curves = contour;\r\n this.localToWorld = map;\r\n this.axis = axis;\r\n }\r\n /** Create for linear sweep.\r\n * * The optional default normal may be useful for guiding coordinate frame setup.\r\n * * the contour is CAPTURED.\r\n */\r\n public static createForLinearSweep(contour: AnyCurve, defaultNormal?: Vector3d): SweepContour | undefined {\r\n const localToWorld = FrameBuilder.createRightHandedFrame(defaultNormal, contour);\r\n if (localToWorld) {\r\n return new SweepContour(contour, localToWorld, undefined);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Create for linear sweep.\r\n * * The optional default normal may be useful for guiding coordinate frame setup.\r\n * * the points are captured into linestrings and Loops as needed.\r\n */\r\n public static createForPolygon(points: MultiLineStringDataVariant, defaultNormal?: Vector3d): SweepContour | undefined {\r\n const localToWorld = FrameBuilder.createRightHandedFrame(defaultNormal, points);\r\n if (localToWorld) {\r\n if (defaultNormal !== undefined) {\r\n if (localToWorld.matrix.dotColumnZ(defaultNormal))\r\n localToWorld.matrix.scaleColumnsInPlace(1.0, -1.0, -1.0);\r\n }\r\n const linestrings = LineString3d.createArrayOfLineString3d(points);\r\n const loops = [];\r\n for (const ls of linestrings) {\r\n ls.addClosurePoint();\r\n loops.push(Loop.create(ls));\r\n }\r\n if (loops.length === 1) {\r\n return new SweepContour(loops[0], localToWorld, undefined);\r\n } else if (loops.length > 1) {\r\n return new SweepContour(ParityRegion.createLoops(loops), localToWorld, undefined);\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Create for rotational sweep.\r\n * * The axis ray is retained.\r\n * * the contour is CAPTURED.\r\n */\r\n public static createForRotation(contour: AnyCurve, axis: Ray3d): SweepContour | undefined {\r\n // createRightHandedFrame -- the axis is a last-gasp resolver for in-plane vectors.\r\n const localToWorld = FrameBuilder.createRightHandedFrame(undefined, contour, axis);\r\n if (localToWorld) {\r\n return new SweepContour(contour, localToWorld, axis.clone());\r\n }\r\n return undefined;\r\n }\r\n /** Return (Reference to) the curves */\r\n public getCurves(): CurveCollection { return this.curves; }\r\n /** Apply `transform` to the curves, axis.\r\n * * The local to world frame is reconstructed for the transformed curves.\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (this.curves.tryTransformInPlace(transform)) {\r\n if (this.axis)\r\n this.axis.transformInPlace(transform);\r\n\r\n const localToWorld = this.axis !== undefined\r\n ? FrameBuilder.createRightHandedFrame(undefined, this.curves, this.axis)\r\n : FrameBuilder.createRightHandedFrame(undefined, this.curves);\r\n if (localToWorld) {\r\n this.localToWorld.setFrom(localToWorld);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** Return a deep clone. */\r\n public clone(): SweepContour {\r\n return new SweepContour(this.curves.clone(), this.localToWorld.clone(), this.axis);\r\n }\r\n /** Return a transformed clone. */\r\n public cloneTransformed(transform: Transform): SweepContour | undefined {\r\n const newContour = this.clone();\r\n if (newContour.tryTransformInPlace(transform))\r\n return newContour;\r\n return undefined;\r\n }\r\n /** Test for near equality of cures and local frame. */\r\n public isAlmostEqual(other: any): boolean {\r\n if (other instanceof SweepContour) {\r\n return this.curves.isAlmostEqual(other.curves) && this.localToWorld.isAlmostEqual(other.localToWorld);\r\n }\r\n return false;\r\n }\r\n\r\n private _xyStrokes?: AnyCurve;\r\n private _facets?: IndexedPolyface;\r\n public get xyStrokes(): AnyCurve | undefined { return this._xyStrokes; }\r\n /**\r\n * build the (cached) internal facets.\r\n * @param options options for stroking the curves.\r\n */\r\n public buildFacets(options: StrokeOptions | undefined): void {\r\n if (!this._facets) {\r\n if (this.curves instanceof Loop) {\r\n this._xyStrokes = this.curves.cloneStroked(options);\r\n if (this._xyStrokes instanceof Loop && this._xyStrokes.children.length === 1) {\r\n const children = this._xyStrokes.children;\r\n const linestring = children[0] as LineString3d;\r\n const points = linestring.points;\r\n this.localToWorld.multiplyInversePoint3dArrayInPlace(points);\r\n if (PolygonOps.sumTriangleAreasXY(points) < 0)\r\n points.reverse();\r\n const graph = Triangulator.createTriangulatedGraphFromSingleLoop(points);\r\n if (graph) {\r\n Triangulator.flipTriangles(graph);\r\n const unflippedPoly = PolyfaceBuilder.graphToPolyface(graph, options);\r\n this._facets = unflippedPoly;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n } else { // earcut failed (e.g., on a split washer polygon, where the bridge edge is traversed twice)\r\n const polyface = RegionOps.polygonXYAreaUnionLoopsToPolyface(points, [], true);\r\n if (polyface) {\r\n this._facets = polyface as IndexedPolyface;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n }\r\n }\r\n }\r\n } else if (this.curves instanceof ParityRegion) {\r\n this._xyStrokes = this.curves.cloneStroked(options);\r\n if (this._xyStrokes instanceof (ParityRegion)) {\r\n const worldToLocal = this.localToWorld.inverse()!;\r\n this._xyStrokes.tryTransformInPlace(worldToLocal);\r\n const strokes = [];\r\n for (const childLoop of this._xyStrokes.children) {\r\n const loopCurves = childLoop.children;\r\n if (loopCurves.length === 1) {\r\n const c = loopCurves[0];\r\n if (c instanceof LineString3d)\r\n strokes.push(c.packedPoints);\r\n }\r\n }\r\n const numLoops = strokes.length;\r\n /** Try the earcut algorithm first -- lots less machinery, but can't handle any form of overlap */\r\n const graph = Triangulator.createTriangulatedGraphFromLoops(strokes);\r\n if (graph && HalfEdgeGraphSearch.isTriangulatedCCW(graph, true, numLoops - 1)) {\r\n Triangulator.flipTriangles(graph);\r\n const unflippedPoly = PolyfaceBuilder.graphToPolyface(graph, options);\r\n this._facets = unflippedPoly;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n } else {\r\n // earcut failed. Restart with full merge and parity analysis.\r\n const polyface = RegionOps.polygonXYAreaUnionLoopsToPolyface(strokes, [], true);\r\n if (polyface) {\r\n this._facets = polyface as IndexedPolyface;\r\n this._facets.tryTransformInPlace(this.localToWorld);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** delete existing facets.\r\n * * This protects against PolyfaceBuilder reusing facets constructed with different options settings.\r\n */\r\n public purgeFacets() {\r\n this._facets = undefined;\r\n }\r\n\r\n /** Emit facets to a builder.\r\n * This method may cache and reuse facets over multiple calls.\r\n */\r\n public emitFacets(builder: PolyfaceBuilder, reverse: boolean, transform?: Transform) {\r\n this.buildFacets(builder.options);\r\n if (this._facets)\r\n builder.addIndexedPolyface(this._facets, reverse, transform);\r\n }\r\n\r\n /** Emit facets to a function\r\n * This method may cache and reuse facets over multiple calls.\r\n */\r\n public announceFacets(announce: (facets: IndexedPolyface) => void, options: StrokeOptions | undefined) {\r\n this.buildFacets(options);\r\n if (this._facets)\r\n announce(this._facets);\r\n }\r\n\r\n /**\r\n * Triangulate the region.\r\n * Create a UnionOfConvexClipPlaneSets that clips to the swept region.\r\n * * If sweepVector is not given, the sweep direction is perpendicular to the plane of the contour.\r\n * * If sweepVector is given, it is the sweep direction and does not have to be perpendicular to the contour.\r\n * * cap0 and cap1 indicate construction of clip planes parallel to the contour plane.\r\n * * If cap1 is true, the cap plane is at `anyPointOnPlane + sweepVector`. That is, the sweep vector indicates both direction and distance.\r\n * * caps are NOT created of sweepVector is not given.\r\n */\r\n public sweepToUnionOfConvexClipPlaneSets(sweepVector?: Vector3d, cap0: boolean = false, cap1: boolean = false): UnionOfConvexClipPlaneSets | undefined {\r\n const builder = PolyfaceBuilder.create();\r\n // It's a trip around the barn, but it's easy to make a polyface and scan it . . .\r\n if (!sweepVector)\r\n cap0 = cap1 = false;\r\n this.buildFacets(builder.options);\r\n if (sweepVector === undefined)\r\n sweepVector = this.localToWorld.matrix.columnZ();\r\n const zVector = this.localToWorld.matrix.columnZ();\r\n const facets = this._facets;\r\n const point0 = Point3d.create();\r\n const point1 = Point3d.create();\r\n if (facets) {\r\n const plane0Origin = this.localToWorld.getOrigin();\r\n const plane1Origin = plane0Origin.plus(sweepVector);\r\n const inwardNormal0 = zVector.clone();\r\n const inwardNormal1 = zVector.negate();\r\n\r\n const result = UnionOfConvexClipPlaneSets.createEmpty();\r\n const visitor = facets.createVisitor(1);\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n const numEdges = visitor.point.length - 1;\r\n const clipper = ConvexClipPlaneSet.createEmpty();\r\n for (let i = 0; i < numEdges; i++) {\r\n visitor.point.getPoint3dAtUncheckedPointIndex(i, point0);\r\n visitor.point.getPoint3dAtUncheckedPointIndex(i + 1, point1);\r\n const plane = ClipPlane.createEdgeAndUpVector(point1, point0, sweepVector);\r\n const visible = visitor.edgeVisible[i];\r\n plane?.setFlags(!visible, !visible);\r\n clipper.addPlaneToConvexSet(plane);\r\n }\r\n if (cap0)\r\n clipper.addPlaneToConvexSet(ClipPlane.createNormalAndPoint(inwardNormal0, plane0Origin));\r\n if (cap1)\r\n clipper.addPlaneToConvexSet(ClipPlane.createNormalAndPoint(inwardNormal1, plane1Origin));\r\n result.addConvexSet(clipper);\r\n }\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
@@ -152,7 +152,7 @@ class ChainMergeContext {
152
152
  p.sortData = this.primarySortKey(p);
153
153
  }
154
154
  const sortArray = this._graph.allHalfEdges.slice();
155
- sortArray.sort(ChainMergeContext.nodeCompareSortData);
155
+ sortArray.sort((nodeA, nodeB) => ChainMergeContext.nodeCompareSortData(nodeA, nodeB));
156
156
  const xyzTolerance = this._options.tolerance;
157
157
  // A node is unvisited if it is its own vertex successor !!!
158
158
  // otherwise the node has already been twisted into a base vertex.
@@ -1 +1 @@
1
- {"version":3,"file":"ChainMerge.js","sourceRoot":"","sources":["../../../src/topology/ChainMerge.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 Topology\r\n */\r\n\r\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { HalfEdgeGraphOps } from \"./Merging\";\r\n\r\n/**\r\n * interface containing various options appropriate to merging lines segments into chains.\r\n * @internal\r\n */\r\nexport interface ChainMergeContextOptions {\r\n /**\r\n * Tolerance for declaring points equal\r\n * * Default is `Geometry.smallMetricDistance`\r\n */\r\n tolerance?: number;\r\n /**\r\n * Direction for primary sort.\r\n * * Default is `Vector3d.create(0.294234298, 0.72391399, 0.45234328798)`\r\n * * this vector should NOT be along a principal x,y,z direction.\r\n * * The internal form will be normalized.\r\n */\r\n primarySortDirection?: Vector3d;\r\n}\r\n/** Internal form of ChainMergeContextOptions -- same field names, but required to have contents. */\r\nclass ChainMergeContextValidatedOptions {\r\n /**\r\n * Tolerance for declaring points equal.\r\n */\r\n public tolerance: number;\r\n /** UNNORMALIZED base vector for sorting.\r\n * * Actual vector hoisted into an instance is normalized.\r\n */\r\n private static readonly _defaultPrimarySortDirection = Vector3d.create(0.294234298, 0.72391399, 0.45234328798);\r\n /**\r\n * Direction for primary sort. This is normalized !!!\r\n */\r\n public primarySortDirection: Vector3d;\r\n /** return a unit vector aligned with optional direction.\r\n * * Default return is into the first quadrant at a quirky angle so any perpendicular plane is unlikely to hit many points\r\n */\r\n public static createPrimarySortVector(vector?: Vector3d): Vector3d {\r\n if (vector === undefined) {\r\n vector = this._defaultPrimarySortDirection.clone();\r\n }\r\n return vector.normalizeWithDefault(\r\n ChainMergeContextValidatedOptions._defaultPrimarySortDirection.x,\r\n ChainMergeContextValidatedOptions._defaultPrimarySortDirection.y,\r\n ChainMergeContextValidatedOptions._defaultPrimarySortDirection.z);\r\n }\r\n /**\r\n * PRIVATE constructor -- assumes all inputs are validated in public create method !!!!\r\n * @param tolerance\r\n * @param unitVectorForPrimarySort\r\n */\r\n private constructor(tolerance: number, unitVectorForPrimarySort: Vector3d) {\r\n this.tolerance = tolerance;\r\n this.primarySortDirection = unitVectorForPrimarySort;\r\n }\r\n /** return the default option set. */\r\n public static createFromUnValidated(options?: ChainMergeContextOptions): ChainMergeContextValidatedOptions {\r\n const result = new ChainMergeContextValidatedOptions(Geometry.smallMetricDistance, ChainMergeContextValidatedOptions.createPrimarySortVector());\r\n if (options !== undefined) {\r\n if (options.tolerance !== undefined)\r\n result.tolerance = options.tolerance;\r\n if (options.primarySortDirection !== undefined)\r\n result.primarySortDirection = ChainMergeContextValidatedOptions.createPrimarySortVector();\r\n }\r\n return result;\r\n }\r\n /** Clone this context. */\r\n public clone(): ChainMergeContextValidatedOptions {\r\n return new ChainMergeContextValidatedOptions(this.tolerance, this.primarySortDirection);\r\n }\r\n}\r\n/**\r\n * * Context for assembling line segments into chains.\r\n * * Use the context in phases:\r\n * * Create the context: `context = ChainMergeContext.create ()`\r\n * * Add line with any combination of:\r\n * * `context.addSegment(pointA, pointB)`\r\n * * `context.addLineSegment3dArray (segments)`\r\n * * Scan all coordinate data for common coordinates. Twist nodes together to form chains:\r\n * * `context.clusterAndMergeVerticesXYZ ()`\r\n * * Collect the chains:\r\n * * myLinestringArray = context.collectMaximalChains();\r\n * * The context carries an optional plane which is used by addSegmentsOnPlane\r\n *\r\n * @internal\r\n */\r\nexport class ChainMergeContext {\r\n\r\n private _graph: HalfEdgeGraph;\r\n private _options: ChainMergeContextValidatedOptions;\r\n private _plane?: PlaneAltitudeEvaluator;\r\n private _convexClipper?: ConvexClipPlaneSet;\r\n private constructor(options: ChainMergeContextValidatedOptions) {\r\n this._graph = new HalfEdgeGraph();\r\n this._options = options;\r\n }\r\n /** Save a reference plane for later use, e.g. in addSegmentsOnPlane */\r\n public set plane(value: PlaneAltitudeEvaluator | undefined) { this._plane = value; }\r\n /** Property access for the reference plane. */\r\n public get plane(): PlaneAltitudeEvaluator | undefined { return this._plane; }\r\n\r\n /** Save a reference plane for later use, e.g. in addSegmentsOnPlane */\r\n public set convexClipper(value: ConvexClipPlaneSet | undefined) { this._convexClipper = value; }\r\n /** Property access for the reference plane. */\r\n public get convexClipper(): ConvexClipPlaneSet | undefined { return this._convexClipper; }\r\n\r\n /**\r\n * * Construct an empty chain merge graph.\r\n * * The options parameter may contain any combination of the options values.\r\n * * tolerance = absolute tolerance for declaring points equal.\r\n * * Default is `Geometry.smallMetricDistance`\r\n * * primarySortDirection = direction for first sort.\r\n * * To minimize clash among points on primary sort, this should NOT be perpendicular to any principal plane.\r\n * * The default points into the first octant with non-obvious components.\r\n */\r\n public static create(options?: ChainMergeContextOptions): ChainMergeContext {\r\n const validatedOptions = ChainMergeContextValidatedOptions.createFromUnValidated(options);\r\n return new ChainMergeContext(validatedOptions);\r\n }\r\n /** Add a segment to the evolving graph. */\r\n public addSegment(pointA: Point3d, pointB: Point3d) {\r\n this._graph.createEdgeXYZXYZ(pointA.x, pointA.y, pointA.z, 0, pointB.x, pointB.y, pointB.z, 0);\r\n }\r\n /** Add all segments from an array to the graph. */\r\n public addLineSegment3dArray(data: LineSegment3d[]) {\r\n for (const segment of data) {\r\n this.addSegment(segment.point0Ref, segment.point1Ref);\r\n }\r\n }\r\n /** Add edges for all segments that are \"on\" the plane.\r\n * * No action if `this.plane` is undefined.\r\n */\r\n public addSegmentsOnPlane(points: GrowableXYZArray, addClosure: boolean = false) {\r\n if (!this._plane)\r\n return;\r\n const plane = this._plane;\r\n let i0 = addClosure ? points.length - 1 : 0;\r\n let a0 = points.evaluateUncheckedIndexPlaneAltitude(i0, plane);\r\n let i1 = addClosure ? 0 : 1;\r\n let a1;\r\n for (; i1 < points.length; i0 = i1++ , a0 = a1) {\r\n a1 = points.evaluateUncheckedIndexPlaneAltitude(i1, plane);\r\n if (Geometry.isSmallMetricDistance(a0) && Geometry.isSmallMetricDistance(a1))\r\n this._graph.createEdgeXYZXYZ(\r\n points.getXAtUncheckedPointIndex(i0), points.getYAtUncheckedPointIndex(i0), points.getZAtUncheckedPointIndex(i0), 0,\r\n points.getXAtUncheckedPointIndex(i1), points.getYAtUncheckedPointIndex(i1), points.getZAtUncheckedPointIndex(i1), 0);\r\n }\r\n }\r\n /**\r\n * Return a numeric value to be used for sorting, with little chance widely separated nodes will have identical key.\r\n * * Any single x,y,z component is a poor choice because horizontal and vertical alignment is common.\r\n * * Hence take dot product of x,y,z with non-trivial fraction values.\r\n * @param node node with x,y,z coordinates\r\n */\r\n private primarySortKey(node: HalfEdge): number {\r\n return this._options.primarySortDirection.dotProductXYZ(node.x, node.y, node.z);\r\n }\r\n /** Return difference of sortData members as sort comparison */\r\n private static nodeCompareSortData(nodeA: HalfEdge, nodeB: HalfEdge): number {\r\n return nodeA.sortData! - nodeB.sortData!;\r\n }\r\n /** test if nodeA is a dangling edge end (i.e. edges around vertex equal 1, but detect it without walking all the way around. */\r\n private static isIsolatedEnd(nodeA: HalfEdge): boolean {\r\n return nodeA.vertexSuccessor === nodeA;\r\n }\r\n\r\n /** test if nodeA is at a vertex with exactly 2 edges (i.e. edges around vertex equal w, but detect it without walking all the way around. */\r\n private static isChainInteriorVertex(nodeA: HalfEdge): boolean {\r\n const nodeB = nodeA.vertexSuccessor;\r\n return nodeB !== nodeA && nodeB.vertexSuccessor === nodeA;\r\n }\r\n\r\n /**\r\n * * isolate all edge ends.\r\n * * perform cluster analysis to determine nearly coincident points.\r\n * * pinch all edges together at each vertex.\r\n */\r\n public clusterAndMergeVerticesXYZ() {\r\n HalfEdgeGraphOps.isolateAllEdges(this._graph);\r\n for (const p of this._graph.allHalfEdges) {\r\n p.sortData = this.primarySortKey(p);\r\n }\r\n const sortArray = this._graph.allHalfEdges.slice();\r\n sortArray.sort(ChainMergeContext.nodeCompareSortData);\r\n const xyzTolerance = this._options.tolerance;\r\n // A node is unvisited if it is its own vertex successor !!!\r\n // otherwise the node has already been twisted into a base vertex.\r\n const n = sortArray.length;\r\n for (let i0 = 0; i0 < n; i0++) {\r\n const node0 = sortArray[i0];\r\n const qMin = node0.sortData!;\r\n const qMax = qMin + xyzTolerance;\r\n if (ChainMergeContext.isIsolatedEnd(node0)) {\r\n for (let i1 = i0 + 1; i1 < n; i1++) {\r\n const node1 = sortArray[i1];\r\n if (ChainMergeContext.isIsolatedEnd(node1)) {\r\n if (node1.sortData! > qMax)\r\n break;\r\n if (node0.distanceXYZ(node1) <= xyzTolerance) {\r\n HalfEdge.pinch(node0, node1);\r\n node1.setXYZFrom(node0); // force true equal coordinates.\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * If node0 is not visited, creating a linestring with that starting edge and all successive edges along a chain.\r\n * @param chains growing array of chains.\r\n * @param node0 start node for search.\r\n */\r\n private collectMaximalLineString3dFromStartNode(chains: LineString3d[], node0: HalfEdge, visitMask: HalfEdgeMask) {\r\n if (!node0.isMaskSet(visitMask)) {\r\n const ls = LineString3d.create();\r\n ls.addPointXYZ(node0.x, node0.y, node0.z);\r\n for (; ;) {\r\n node0.setMask(visitMask);\r\n node0.edgeMate.setMask(visitMask);\r\n node0 = node0.faceSuccessor;\r\n ls.addPointXYZ(node0.x, node0.y, node0.z);\r\n if (node0.isMaskSet(visitMask) || !ChainMergeContext.isChainInteriorVertex(node0))\r\n break;\r\n }\r\n chains.push(ls);\r\n }\r\n }\r\n /**\r\n * If node0 is not visited, creating a linestring with that starting edge and all successive edges along a chain.\r\n * @param chains growing array of chains.\r\n * @param node0 start node for search.\r\n */\r\n private collectMaximalGrowableXYXArrayFromStartNode(result: GrowableXYZArray[], node0: HalfEdge, visitMask: HalfEdgeMask) {\r\n if (!node0.isMaskSet(visitMask)) {\r\n const points = new GrowableXYZArray();\r\n points.pushXYZ(node0.x, node0.y, node0.z);\r\n for (; ;) {\r\n node0.setMask(visitMask);\r\n node0.edgeMate.setMask(visitMask);\r\n node0 = node0.faceSuccessor;\r\n points.pushXYZ(node0.x, node0.y, node0.z);\r\n if (node0.isMaskSet(visitMask) || !ChainMergeContext.isChainInteriorVertex(node0))\r\n break;\r\n }\r\n if (points.length > 0)\r\n result.push(points);\r\n }\r\n }\r\n\r\n /**\r\n * * find edges with start, end in same vertex loop.\r\n * * pinch them away from the loop\r\n * * set mask on both sides.\r\n * * Return the number of excisions.\r\n */\r\n private exciseAndMarkSlingEdges(mask: HalfEdgeMask): number {\r\n let n = 0;\r\n for (const p of this._graph.allHalfEdges) {\r\n if (p.distanceXYZ(p.edgeMate) < this._options.tolerance\r\n && !p.isMaskSet(mask)) {\r\n const q = p.edgeMate;\r\n HalfEdge.pinch(p, p.vertexPredecessor);\r\n HalfEdge.pinch(q, q.vertexPredecessor);\r\n p.setMask(mask);\r\n q.setMask(mask);\r\n n++;\r\n }\r\n }\r\n return n;\r\n }\r\n /** Collect chains which have maximum edge count, broken at an vertex with other than 2 edges.\r\n * * This is assumed to be preceded by a call to a vertex-cluster step such as `clusterAndMergeVerticesYXZ`\r\n */\r\n public collectMaximalChains(): LineString3d[] {\r\n const result: LineString3d[] = [];\r\n const visitMask = HalfEdgeMask.VISITED;\r\n // Pass 0: excise and mark zero-length edges.\r\n this.exciseAndMarkSlingEdges(visitMask);\r\n this._graph.clearMask(visitMask);\r\n // Pass 1: only start at non-interior edges -- vertices with one edge or more than 2 edges.\r\n // (Note that collectMaximalChain checks the visit mask.)\r\n for (const node0 of this._graph.allHalfEdges) {\r\n if (!ChainMergeContext.isChainInteriorVertex(node0)) {\r\n this.collectMaximalLineString3dFromStartNode(result, node0, visitMask);\r\n }\r\n }\r\n // Pass 2: start anywhere in an unvisited loop.\r\n for (const node0 of this._graph.allHalfEdges) {\r\n this.collectMaximalLineString3dFromStartNode(result, node0, visitMask);\r\n }\r\n return result;\r\n }\r\n public collectMaximalGrowableXYZArrays(): GrowableXYZArray[] {\r\n const result: GrowableXYZArray[] = [];\r\n const visitMask = HalfEdgeMask.VISITED;\r\n // Pass 0: excise and mark zero-length edges.\r\n this.exciseAndMarkSlingEdges(visitMask);\r\n this._graph.clearMask(visitMask);\r\n // Pass 1: only start at non-interior edges -- vertices with one edge or more than 2 edges.\r\n // (Note that collectMaximalChain checks the visit mask.)\r\n for (const node0 of this._graph.allHalfEdges) {\r\n if (!ChainMergeContext.isChainInteriorVertex(node0)) {\r\n this.collectMaximalGrowableXYXArrayFromStartNode(result, node0, visitMask);\r\n }\r\n }\r\n // Pass 2: start anywhere in an unvisited loop.\r\n for (const node0 of this._graph.allHalfEdges) {\r\n this.collectMaximalGrowableXYXArrayFromStartNode(result, node0, visitMask);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ChainMerge.js","sourceRoot":"","sources":["../../../src/topology/ChainMerge.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 Topology\r\n */\r\n\r\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { HalfEdgeGraphOps } from \"./Merging\";\r\n\r\n/**\r\n * interface containing various options appropriate to merging lines segments into chains.\r\n * @internal\r\n */\r\nexport interface ChainMergeContextOptions {\r\n /**\r\n * Tolerance for declaring points equal\r\n * * Default is `Geometry.smallMetricDistance`\r\n */\r\n tolerance?: number;\r\n /**\r\n * Direction for primary sort.\r\n * * Default is `Vector3d.create(0.294234298, 0.72391399, 0.45234328798)`\r\n * * this vector should NOT be along a principal x,y,z direction.\r\n * * The internal form will be normalized.\r\n */\r\n primarySortDirection?: Vector3d;\r\n}\r\n/** Internal form of ChainMergeContextOptions -- same field names, but required to have contents. */\r\nclass ChainMergeContextValidatedOptions {\r\n /**\r\n * Tolerance for declaring points equal.\r\n */\r\n public tolerance: number;\r\n /** UNNORMALIZED base vector for sorting.\r\n * * Actual vector hoisted into an instance is normalized.\r\n */\r\n private static readonly _defaultPrimarySortDirection = Vector3d.create(0.294234298, 0.72391399, 0.45234328798);\r\n /**\r\n * Direction for primary sort. This is normalized !!!\r\n */\r\n public primarySortDirection: Vector3d;\r\n /** return a unit vector aligned with optional direction.\r\n * * Default return is into the first quadrant at a quirky angle so any perpendicular plane is unlikely to hit many points\r\n */\r\n public static createPrimarySortVector(vector?: Vector3d): Vector3d {\r\n if (vector === undefined) {\r\n vector = this._defaultPrimarySortDirection.clone();\r\n }\r\n return vector.normalizeWithDefault(\r\n ChainMergeContextValidatedOptions._defaultPrimarySortDirection.x,\r\n ChainMergeContextValidatedOptions._defaultPrimarySortDirection.y,\r\n ChainMergeContextValidatedOptions._defaultPrimarySortDirection.z);\r\n }\r\n /**\r\n * PRIVATE constructor -- assumes all inputs are validated in public create method !!!!\r\n * @param tolerance\r\n * @param unitVectorForPrimarySort\r\n */\r\n private constructor(tolerance: number, unitVectorForPrimarySort: Vector3d) {\r\n this.tolerance = tolerance;\r\n this.primarySortDirection = unitVectorForPrimarySort;\r\n }\r\n /** return the default option set. */\r\n public static createFromUnValidated(options?: ChainMergeContextOptions): ChainMergeContextValidatedOptions {\r\n const result = new ChainMergeContextValidatedOptions(Geometry.smallMetricDistance, ChainMergeContextValidatedOptions.createPrimarySortVector());\r\n if (options !== undefined) {\r\n if (options.tolerance !== undefined)\r\n result.tolerance = options.tolerance;\r\n if (options.primarySortDirection !== undefined)\r\n result.primarySortDirection = ChainMergeContextValidatedOptions.createPrimarySortVector();\r\n }\r\n return result;\r\n }\r\n /** Clone this context. */\r\n public clone(): ChainMergeContextValidatedOptions {\r\n return new ChainMergeContextValidatedOptions(this.tolerance, this.primarySortDirection);\r\n }\r\n}\r\n/**\r\n * * Context for assembling line segments into chains.\r\n * * Use the context in phases:\r\n * * Create the context: `context = ChainMergeContext.create ()`\r\n * * Add line with any combination of:\r\n * * `context.addSegment(pointA, pointB)`\r\n * * `context.addLineSegment3dArray (segments)`\r\n * * Scan all coordinate data for common coordinates. Twist nodes together to form chains:\r\n * * `context.clusterAndMergeVerticesXYZ ()`\r\n * * Collect the chains:\r\n * * myLinestringArray = context.collectMaximalChains();\r\n * * The context carries an optional plane which is used by addSegmentsOnPlane\r\n *\r\n * @internal\r\n */\r\nexport class ChainMergeContext {\r\n\r\n private _graph: HalfEdgeGraph;\r\n private _options: ChainMergeContextValidatedOptions;\r\n private _plane?: PlaneAltitudeEvaluator;\r\n private _convexClipper?: ConvexClipPlaneSet;\r\n private constructor(options: ChainMergeContextValidatedOptions) {\r\n this._graph = new HalfEdgeGraph();\r\n this._options = options;\r\n }\r\n /** Save a reference plane for later use, e.g. in addSegmentsOnPlane */\r\n public set plane(value: PlaneAltitudeEvaluator | undefined) { this._plane = value; }\r\n /** Property access for the reference plane. */\r\n public get plane(): PlaneAltitudeEvaluator | undefined { return this._plane; }\r\n\r\n /** Save a reference plane for later use, e.g. in addSegmentsOnPlane */\r\n public set convexClipper(value: ConvexClipPlaneSet | undefined) { this._convexClipper = value; }\r\n /** Property access for the reference plane. */\r\n public get convexClipper(): ConvexClipPlaneSet | undefined { return this._convexClipper; }\r\n\r\n /**\r\n * * Construct an empty chain merge graph.\r\n * * The options parameter may contain any combination of the options values.\r\n * * tolerance = absolute tolerance for declaring points equal.\r\n * * Default is `Geometry.smallMetricDistance`\r\n * * primarySortDirection = direction for first sort.\r\n * * To minimize clash among points on primary sort, this should NOT be perpendicular to any principal plane.\r\n * * The default points into the first octant with non-obvious components.\r\n */\r\n public static create(options?: ChainMergeContextOptions): ChainMergeContext {\r\n const validatedOptions = ChainMergeContextValidatedOptions.createFromUnValidated(options);\r\n return new ChainMergeContext(validatedOptions);\r\n }\r\n /** Add a segment to the evolving graph. */\r\n public addSegment(pointA: Point3d, pointB: Point3d) {\r\n this._graph.createEdgeXYZXYZ(pointA.x, pointA.y, pointA.z, 0, pointB.x, pointB.y, pointB.z, 0);\r\n }\r\n /** Add all segments from an array to the graph. */\r\n public addLineSegment3dArray(data: LineSegment3d[]) {\r\n for (const segment of data) {\r\n this.addSegment(segment.point0Ref, segment.point1Ref);\r\n }\r\n }\r\n /** Add edges for all segments that are \"on\" the plane.\r\n * * No action if `this.plane` is undefined.\r\n */\r\n public addSegmentsOnPlane(points: GrowableXYZArray, addClosure: boolean = false) {\r\n if (!this._plane)\r\n return;\r\n const plane = this._plane;\r\n let i0 = addClosure ? points.length - 1 : 0;\r\n let a0 = points.evaluateUncheckedIndexPlaneAltitude(i0, plane);\r\n let i1 = addClosure ? 0 : 1;\r\n let a1;\r\n for (; i1 < points.length; i0 = i1++ , a0 = a1) {\r\n a1 = points.evaluateUncheckedIndexPlaneAltitude(i1, plane);\r\n if (Geometry.isSmallMetricDistance(a0) && Geometry.isSmallMetricDistance(a1))\r\n this._graph.createEdgeXYZXYZ(\r\n points.getXAtUncheckedPointIndex(i0), points.getYAtUncheckedPointIndex(i0), points.getZAtUncheckedPointIndex(i0), 0,\r\n points.getXAtUncheckedPointIndex(i1), points.getYAtUncheckedPointIndex(i1), points.getZAtUncheckedPointIndex(i1), 0);\r\n }\r\n }\r\n /**\r\n * Return a numeric value to be used for sorting, with little chance widely separated nodes will have identical key.\r\n * * Any single x,y,z component is a poor choice because horizontal and vertical alignment is common.\r\n * * Hence take dot product of x,y,z with non-trivial fraction values.\r\n * @param node node with x,y,z coordinates\r\n */\r\n private primarySortKey(node: HalfEdge): number {\r\n return this._options.primarySortDirection.dotProductXYZ(node.x, node.y, node.z);\r\n }\r\n /** Return difference of sortData members as sort comparison */\r\n private static nodeCompareSortData(nodeA: HalfEdge, nodeB: HalfEdge): number {\r\n return nodeA.sortData! - nodeB.sortData!;\r\n }\r\n /** test if nodeA is a dangling edge end (i.e. edges around vertex equal 1, but detect it without walking all the way around. */\r\n private static isIsolatedEnd(nodeA: HalfEdge): boolean {\r\n return nodeA.vertexSuccessor === nodeA;\r\n }\r\n\r\n /** test if nodeA is at a vertex with exactly 2 edges (i.e. edges around vertex equal w, but detect it without walking all the way around. */\r\n private static isChainInteriorVertex(nodeA: HalfEdge): boolean {\r\n const nodeB = nodeA.vertexSuccessor;\r\n return nodeB !== nodeA && nodeB.vertexSuccessor === nodeA;\r\n }\r\n\r\n /**\r\n * * isolate all edge ends.\r\n * * perform cluster analysis to determine nearly coincident points.\r\n * * pinch all edges together at each vertex.\r\n */\r\n public clusterAndMergeVerticesXYZ() {\r\n HalfEdgeGraphOps.isolateAllEdges(this._graph);\r\n for (const p of this._graph.allHalfEdges) {\r\n p.sortData = this.primarySortKey(p);\r\n }\r\n const sortArray = this._graph.allHalfEdges.slice();\r\n sortArray.sort((nodeA, nodeB) => ChainMergeContext.nodeCompareSortData(nodeA, nodeB));\r\n const xyzTolerance = this._options.tolerance;\r\n // A node is unvisited if it is its own vertex successor !!!\r\n // otherwise the node has already been twisted into a base vertex.\r\n const n = sortArray.length;\r\n for (let i0 = 0; i0 < n; i0++) {\r\n const node0 = sortArray[i0];\r\n const qMin = node0.sortData!;\r\n const qMax = qMin + xyzTolerance;\r\n if (ChainMergeContext.isIsolatedEnd(node0)) {\r\n for (let i1 = i0 + 1; i1 < n; i1++) {\r\n const node1 = sortArray[i1];\r\n if (ChainMergeContext.isIsolatedEnd(node1)) {\r\n if (node1.sortData! > qMax)\r\n break;\r\n if (node0.distanceXYZ(node1) <= xyzTolerance) {\r\n HalfEdge.pinch(node0, node1);\r\n node1.setXYZFrom(node0); // force true equal coordinates.\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * If node0 is not visited, creating a linestring with that starting edge and all successive edges along a chain.\r\n * @param chains growing array of chains.\r\n * @param node0 start node for search.\r\n */\r\n private collectMaximalLineString3dFromStartNode(chains: LineString3d[], node0: HalfEdge, visitMask: HalfEdgeMask) {\r\n if (!node0.isMaskSet(visitMask)) {\r\n const ls = LineString3d.create();\r\n ls.addPointXYZ(node0.x, node0.y, node0.z);\r\n for (; ;) {\r\n node0.setMask(visitMask);\r\n node0.edgeMate.setMask(visitMask);\r\n node0 = node0.faceSuccessor;\r\n ls.addPointXYZ(node0.x, node0.y, node0.z);\r\n if (node0.isMaskSet(visitMask) || !ChainMergeContext.isChainInteriorVertex(node0))\r\n break;\r\n }\r\n chains.push(ls);\r\n }\r\n }\r\n /**\r\n * If node0 is not visited, creating a linestring with that starting edge and all successive edges along a chain.\r\n * @param chains growing array of chains.\r\n * @param node0 start node for search.\r\n */\r\n private collectMaximalGrowableXYXArrayFromStartNode(result: GrowableXYZArray[], node0: HalfEdge, visitMask: HalfEdgeMask) {\r\n if (!node0.isMaskSet(visitMask)) {\r\n const points = new GrowableXYZArray();\r\n points.pushXYZ(node0.x, node0.y, node0.z);\r\n for (; ;) {\r\n node0.setMask(visitMask);\r\n node0.edgeMate.setMask(visitMask);\r\n node0 = node0.faceSuccessor;\r\n points.pushXYZ(node0.x, node0.y, node0.z);\r\n if (node0.isMaskSet(visitMask) || !ChainMergeContext.isChainInteriorVertex(node0))\r\n break;\r\n }\r\n if (points.length > 0)\r\n result.push(points);\r\n }\r\n }\r\n\r\n /**\r\n * * find edges with start, end in same vertex loop.\r\n * * pinch them away from the loop\r\n * * set mask on both sides.\r\n * * Return the number of excisions.\r\n */\r\n private exciseAndMarkSlingEdges(mask: HalfEdgeMask): number {\r\n let n = 0;\r\n for (const p of this._graph.allHalfEdges) {\r\n if (p.distanceXYZ(p.edgeMate) < this._options.tolerance\r\n && !p.isMaskSet(mask)) {\r\n const q = p.edgeMate;\r\n HalfEdge.pinch(p, p.vertexPredecessor);\r\n HalfEdge.pinch(q, q.vertexPredecessor);\r\n p.setMask(mask);\r\n q.setMask(mask);\r\n n++;\r\n }\r\n }\r\n return n;\r\n }\r\n /** Collect chains which have maximum edge count, broken at an vertex with other than 2 edges.\r\n * * This is assumed to be preceded by a call to a vertex-cluster step such as `clusterAndMergeVerticesYXZ`\r\n */\r\n public collectMaximalChains(): LineString3d[] {\r\n const result: LineString3d[] = [];\r\n const visitMask = HalfEdgeMask.VISITED;\r\n // Pass 0: excise and mark zero-length edges.\r\n this.exciseAndMarkSlingEdges(visitMask);\r\n this._graph.clearMask(visitMask);\r\n // Pass 1: only start at non-interior edges -- vertices with one edge or more than 2 edges.\r\n // (Note that collectMaximalChain checks the visit mask.)\r\n for (const node0 of this._graph.allHalfEdges) {\r\n if (!ChainMergeContext.isChainInteriorVertex(node0)) {\r\n this.collectMaximalLineString3dFromStartNode(result, node0, visitMask);\r\n }\r\n }\r\n // Pass 2: start anywhere in an unvisited loop.\r\n for (const node0 of this._graph.allHalfEdges) {\r\n this.collectMaximalLineString3dFromStartNode(result, node0, visitMask);\r\n }\r\n return result;\r\n }\r\n public collectMaximalGrowableXYZArrays(): GrowableXYZArray[] {\r\n const result: GrowableXYZArray[] = [];\r\n const visitMask = HalfEdgeMask.VISITED;\r\n // Pass 0: excise and mark zero-length edges.\r\n this.exciseAndMarkSlingEdges(visitMask);\r\n this._graph.clearMask(visitMask);\r\n // Pass 1: only start at non-interior edges -- vertices with one edge or more than 2 edges.\r\n // (Note that collectMaximalChain checks the visit mask.)\r\n for (const node0 of this._graph.allHalfEdges) {\r\n if (!ChainMergeContext.isChainInteriorVertex(node0)) {\r\n this.collectMaximalGrowableXYXArrayFromStartNode(result, node0, visitMask);\r\n }\r\n }\r\n // Pass 2: start anywhere in an unvisited loop.\r\n for (const node0 of this._graph.allHalfEdges) {\r\n this.collectMaximalGrowableXYXArrayFromStartNode(result, node0, visitMask);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"HalfEdgeGraphSearch.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgeGraphSearch.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAChC;AACD;GACG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,YAAY,CAAU;IAC9B;;;;OAIG;gBACgB,IAAI,EAAE,YAAY,EAAE,WAAW,GAAE,OAAc;IAIlE,yEAAyE;IAClE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;CAIzC;AAED,qBAAa,mBAAmB;IAE9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAQxC;;;;OAIG;WACW,mBAAmB,CAAC,uBAAuB,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,gBAAgB,CAAC,EAAE,oBAAoB,GAAG,QAAQ,GAAG,SAAS;IAKrJ;;;;OAIG;WACW,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;IACpD;;;;;;;;OAQG;WACW,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,eAAe,GAAE,OAAe,EACvG,YAAY,GAAE,oBAAyD,GAAG,iBAAiB,CAAC,QAAQ,CAAC;IAgBvG;;;;;;OAMG;WACW,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,8BAA8B,GAAE,OAAc,EAAE,4BAA4B,SAAI,GAAG,OAAO;IA+B9J;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAsBlC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAgB7C,0GAA0G;IAC1G,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAM7C;;;;;OAKG;WACW,iDAAiD,CAAC,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,GAAG,SAAS,EAAE,UAAU,GAAE,YAAqC,GAAG,QAAQ,EAAE,EAAE;IAcxM;;;;;OAKG;WACW,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA4B7F;;;;;;;;;;;OAWG;WACW,mCAAmC,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAClI,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI;IAoBzD;;;;;;;;;;;OAWG;WACW,mCAAmC,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,GAAG,QAAQ,EAAE,EAAE;CAiBlH"}
1
+ {"version":3,"file":"HalfEdgeGraphSearch.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgeGraphSearch.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAChC;AACD;GACG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,YAAY,CAAU;IAC9B;;;;OAIG;gBACgB,IAAI,EAAE,YAAY,EAAE,WAAW,GAAE,OAAc;IAIlE,yEAAyE;IAClE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;CAIzC;AAED,qBAAa,mBAAmB;IAE9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAQxC;;;;OAIG;WACW,mBAAmB,CAAC,uBAAuB,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,gBAAgB,CAAC,EAAE,oBAAoB,GAAG,QAAQ,GAAG,SAAS;IAKrJ;;;;OAIG;WACW,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;IACpD;;;;;;;;OAQG;WACW,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,eAAe,GAAE,OAAe,EACvG,YAAY,GAAE,oBAAyE,GAAG,iBAAiB,CAAC,QAAQ,CAAC;IAgBvH;;;;;;OAMG;WACW,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,8BAA8B,GAAE,OAAc,EAAE,4BAA4B,SAAI,GAAG,OAAO;IA+B9J;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAsBlC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAgB7C,0GAA0G;IAC1G,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAM7C;;;;;OAKG;WACW,iDAAiD,CAAC,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,GAAG,SAAS,EAAE,UAAU,GAAE,YAAqC,GAAG,QAAQ,EAAE,EAAE;IAcxM;;;;;OAKG;WACW,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA4B7F;;;;;;;;;;;OAWG;WACW,mCAAmC,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAClI,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI;IAoBzD;;;;;;;;;;;OAWG;WACW,mCAAmC,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,GAAG,QAAQ,EAAE,EAAE;CAiBlH"}
@@ -66,7 +66,7 @@ class HalfEdgeGraphSearch {
66
66
  * @param collectAllNodes flag to pass to the SignedDataSummary constructor to control collection of nodes.
67
67
  * @param areaFunction function to all to obtain area (or other numeric value)
68
68
  */
69
- static collectFaceAreaSummary(source, collectAllNodes = false, areaFunction = HalfEdgeGraphSearch.signedFaceArea) {
69
+ static collectFaceAreaSummary(source, collectAllNodes = false, areaFunction = (node) => HalfEdgeGraphSearch.signedFaceArea(node)) {
70
70
  const result = new SignedDataSummary_1.SignedDataSummary(collectAllNodes);
71
71
  let allFaces;
72
72
  if (source instanceof Graph_1.HalfEdgeGraph)