@itwin/core-geometry 4.0.0-dev.4 → 4.0.0-dev.41

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 (344) hide show
  1. package/CHANGELOG.md +17 -3
  2. package/lib/cjs/Geometry.d.ts +56 -16
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +87 -30
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurveOps.js +4 -5
  7. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  8. package/lib/cjs/bspline/InterpolationCurve3d.js +7 -10
  9. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  10. package/lib/cjs/clipping/ClipPrimitive.js +2 -2
  11. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  12. package/lib/cjs/clipping/ClipUtils.js +4 -4
  13. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  14. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js +2 -2
  15. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  16. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  17. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +20 -13
  18. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  19. package/lib/cjs/curve/CurveCollection.js +1 -1
  20. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  21. package/lib/cjs/curve/CurveCurve.d.ts +11 -8
  22. package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
  23. package/lib/cjs/curve/CurveCurve.js +16 -12
  24. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  25. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts +5 -1
  26. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  27. package/lib/cjs/curve/CurveCurveIntersectXY.js +11 -10
  28. package/lib/cjs/curve/CurveCurveIntersectXY.js.map +1 -1
  29. package/lib/cjs/curve/Loop.d.ts +2 -2
  30. package/lib/cjs/curve/Loop.d.ts.map +1 -1
  31. package/lib/cjs/curve/Loop.js +6 -0
  32. package/lib/cjs/curve/Loop.js.map +1 -1
  33. package/lib/cjs/curve/RegionOps.d.ts +10 -10
  34. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  35. package/lib/cjs/curve/RegionOps.js +11 -11
  36. package/lib/cjs/curve/RegionOps.js.map +1 -1
  37. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +2 -1
  38. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  39. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +5 -2
  40. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  41. package/lib/cjs/curve/StrokeOptions.js +1 -2
  42. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  43. package/lib/cjs/curve/spiral/DirectSpiral3d.js +1 -2
  44. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  45. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +1 -2
  46. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  47. package/lib/cjs/geometry3d/Angle.d.ts +19 -0
  48. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  49. package/lib/cjs/geometry3d/Angle.js +39 -0
  50. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  51. package/lib/cjs/geometry3d/AngleSweep.d.ts +1 -0
  52. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  53. package/lib/cjs/geometry3d/AngleSweep.js +1 -0
  54. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  55. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +195 -8
  56. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  57. package/lib/cjs/geometry3d/BarycentricTriangle.js +459 -11
  58. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  59. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts +1 -0
  60. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  61. package/lib/cjs/geometry3d/CoincidentGeometryOps.js +3 -0
  62. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  63. package/lib/cjs/geometry3d/GrowableFloat64Array.js +2 -2
  64. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  65. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
  66. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  67. package/lib/cjs/geometry3d/GrowableXYArray.js +2 -2
  68. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  69. package/lib/cjs/geometry3d/GrowableXYZArray.js +1 -1
  70. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  71. package/lib/cjs/geometry3d/IndexedXYCollection.d.ts +22 -7
  72. package/lib/cjs/geometry3d/IndexedXYCollection.d.ts.map +1 -1
  73. package/lib/cjs/geometry3d/IndexedXYCollection.js +41 -5
  74. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  75. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +58 -4
  76. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  77. package/lib/cjs/geometry3d/IndexedXYZCollection.js +102 -4
  78. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  79. package/lib/cjs/geometry3d/Matrix3d.d.ts +479 -265
  80. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  81. package/lib/cjs/geometry3d/Matrix3d.js +996 -784
  82. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  83. package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts +1 -0
  84. package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
  85. package/lib/cjs/geometry3d/OrderedRotationAngles.js +1 -0
  86. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  87. package/lib/cjs/geometry3d/Point2dArrayCarrier.d.ts +10 -0
  88. package/lib/cjs/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
  89. package/lib/cjs/geometry3d/Point2dArrayCarrier.js +14 -0
  90. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  91. package/lib/cjs/geometry3d/Point2dVector2d.js +4 -6
  92. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  93. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts +0 -6
  94. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  95. package/lib/cjs/geometry3d/Point3dArrayCarrier.js +0 -6
  96. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  97. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +57 -57
  98. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  99. package/lib/cjs/geometry3d/Point3dVector3d.js +63 -65
  100. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  101. package/lib/cjs/geometry3d/PointHelpers.d.ts +14 -1
  102. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  103. package/lib/cjs/geometry3d/PointHelpers.js +33 -1
  104. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  105. package/lib/cjs/geometry3d/PolygonOps.d.ts +127 -19
  106. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  107. package/lib/cjs/geometry3d/PolygonOps.js +420 -22
  108. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  109. package/lib/cjs/geometry3d/Ray3d.js +1 -1
  110. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  111. package/lib/cjs/geometry3d/Segment1d.d.ts +1 -1
  112. package/lib/cjs/geometry3d/Segment1d.js +1 -1
  113. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  114. package/lib/cjs/numerics/Polynomials.d.ts +12 -0
  115. package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
  116. package/lib/cjs/numerics/Polynomials.js +14 -0
  117. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  118. package/lib/cjs/polyface/AuxData.js +1 -1
  119. package/lib/cjs/polyface/AuxData.js.map +1 -1
  120. package/lib/cjs/polyface/FacetLocationDetail.d.ts +264 -0
  121. package/lib/cjs/polyface/FacetLocationDetail.d.ts.map +1 -0
  122. package/lib/cjs/polyface/FacetLocationDetail.js +376 -0
  123. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -0
  124. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +2 -5
  125. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  126. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +5 -2
  127. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  128. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +24 -14
  129. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  130. package/lib/cjs/polyface/PolyfaceBuilder.js +74 -23
  131. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  132. package/lib/cjs/polyface/PolyfaceClip.js +6 -7
  133. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  134. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  135. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  136. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  137. package/lib/cjs/polyface/PolyfaceQuery.d.ts +76 -1
  138. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  139. package/lib/cjs/polyface/PolyfaceQuery.js +123 -3
  140. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  141. package/lib/cjs/polyface/multiclip/OffsetMeshContext.d.ts +202 -0
  142. package/lib/cjs/polyface/multiclip/OffsetMeshContext.d.ts.map +1 -0
  143. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js +1038 -0
  144. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -0
  145. package/lib/cjs/serialization/BGFBReader.js +4 -4
  146. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  147. package/lib/cjs/serialization/GeometrySamples.d.ts +8 -6
  148. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  149. package/lib/cjs/serialization/GeometrySamples.js +26 -19
  150. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  151. package/lib/cjs/serialization/IModelJsonSchema.js +1 -2
  152. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  153. package/lib/cjs/solid/Sphere.d.ts +5 -5
  154. package/lib/cjs/solid/Sphere.js +5 -5
  155. package/lib/cjs/solid/Sphere.js.map +1 -1
  156. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  157. package/lib/cjs/solid/SweepContour.js +8 -1
  158. package/lib/cjs/solid/SweepContour.js.map +1 -1
  159. package/lib/cjs/topology/Graph.d.ts +113 -7
  160. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  161. package/lib/cjs/topology/Graph.js +185 -7
  162. package/lib/cjs/topology/Graph.js.map +1 -1
  163. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +38 -0
  164. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -0
  165. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +82 -0
  166. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -0
  167. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +2 -1
  168. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  169. package/lib/cjs/topology/HalfEdgeGraphSearch.js +1 -0
  170. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  171. package/lib/cjs/topology/Triangulation.js +1 -1
  172. package/lib/cjs/topology/Triangulation.js.map +1 -1
  173. package/lib/esm/Geometry.d.ts +56 -16
  174. package/lib/esm/Geometry.d.ts.map +1 -1
  175. package/lib/esm/Geometry.js +86 -29
  176. package/lib/esm/Geometry.js.map +1 -1
  177. package/lib/esm/bspline/BSplineCurveOps.js +4 -5
  178. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  179. package/lib/esm/bspline/InterpolationCurve3d.js +7 -10
  180. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  181. package/lib/esm/clipping/ClipPrimitive.js +2 -2
  182. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  183. package/lib/esm/clipping/ClipUtils.js +4 -4
  184. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  185. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js +2 -2
  186. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  187. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  188. package/lib/esm/curve/CurveChainWithDistanceIndex.js +21 -14
  189. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  190. package/lib/esm/curve/CurveCollection.js +1 -1
  191. package/lib/esm/curve/CurveCollection.js.map +1 -1
  192. package/lib/esm/curve/CurveCurve.d.ts +11 -8
  193. package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
  194. package/lib/esm/curve/CurveCurve.js +16 -12
  195. package/lib/esm/curve/CurveCurve.js.map +1 -1
  196. package/lib/esm/curve/CurveCurveIntersectXY.d.ts +5 -1
  197. package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  198. package/lib/esm/curve/CurveCurveIntersectXY.js +11 -10
  199. package/lib/esm/curve/CurveCurveIntersectXY.js.map +1 -1
  200. package/lib/esm/curve/Loop.d.ts +2 -2
  201. package/lib/esm/curve/Loop.d.ts.map +1 -1
  202. package/lib/esm/curve/Loop.js +6 -0
  203. package/lib/esm/curve/Loop.js.map +1 -1
  204. package/lib/esm/curve/RegionOps.d.ts +10 -10
  205. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  206. package/lib/esm/curve/RegionOps.js +11 -11
  207. package/lib/esm/curve/RegionOps.js.map +1 -1
  208. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +2 -1
  209. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  210. package/lib/esm/curve/RegionOpsClassificationSweeps.js +5 -2
  211. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  212. package/lib/esm/curve/StrokeOptions.js +1 -2
  213. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  214. package/lib/esm/curve/spiral/DirectSpiral3d.js +1 -2
  215. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  216. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +1 -2
  217. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  218. package/lib/esm/geometry3d/Angle.d.ts +19 -0
  219. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  220. package/lib/esm/geometry3d/Angle.js +39 -0
  221. package/lib/esm/geometry3d/Angle.js.map +1 -1
  222. package/lib/esm/geometry3d/AngleSweep.d.ts +1 -0
  223. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  224. package/lib/esm/geometry3d/AngleSweep.js +1 -0
  225. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  226. package/lib/esm/geometry3d/BarycentricTriangle.d.ts +195 -8
  227. package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  228. package/lib/esm/geometry3d/BarycentricTriangle.js +459 -12
  229. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  230. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts +1 -0
  231. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  232. package/lib/esm/geometry3d/CoincidentGeometryOps.js +3 -0
  233. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  234. package/lib/esm/geometry3d/GrowableFloat64Array.js +2 -2
  235. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  236. package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
  237. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  238. package/lib/esm/geometry3d/GrowableXYArray.js +2 -2
  239. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  240. package/lib/esm/geometry3d/GrowableXYZArray.js +1 -1
  241. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  242. package/lib/esm/geometry3d/IndexedXYCollection.d.ts +22 -7
  243. package/lib/esm/geometry3d/IndexedXYCollection.d.ts.map +1 -1
  244. package/lib/esm/geometry3d/IndexedXYCollection.js +41 -5
  245. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  246. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +58 -4
  247. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  248. package/lib/esm/geometry3d/IndexedXYZCollection.js +103 -5
  249. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  250. package/lib/esm/geometry3d/Matrix3d.d.ts +479 -265
  251. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  252. package/lib/esm/geometry3d/Matrix3d.js +996 -784
  253. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  254. package/lib/esm/geometry3d/OrderedRotationAngles.d.ts +1 -0
  255. package/lib/esm/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
  256. package/lib/esm/geometry3d/OrderedRotationAngles.js +1 -0
  257. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  258. package/lib/esm/geometry3d/Point2dArrayCarrier.d.ts +10 -0
  259. package/lib/esm/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
  260. package/lib/esm/geometry3d/Point2dArrayCarrier.js +14 -0
  261. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  262. package/lib/esm/geometry3d/Point2dVector2d.js +4 -6
  263. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  264. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts +0 -6
  265. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  266. package/lib/esm/geometry3d/Point3dArrayCarrier.js +0 -6
  267. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  268. package/lib/esm/geometry3d/Point3dVector3d.d.ts +57 -57
  269. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  270. package/lib/esm/geometry3d/Point3dVector3d.js +63 -65
  271. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  272. package/lib/esm/geometry3d/PointHelpers.d.ts +14 -1
  273. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  274. package/lib/esm/geometry3d/PointHelpers.js +33 -1
  275. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  276. package/lib/esm/geometry3d/PolygonOps.d.ts +127 -19
  277. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  278. package/lib/esm/geometry3d/PolygonOps.js +419 -22
  279. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  280. package/lib/esm/geometry3d/Ray3d.js +1 -1
  281. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  282. package/lib/esm/geometry3d/Segment1d.d.ts +1 -1
  283. package/lib/esm/geometry3d/Segment1d.js +1 -1
  284. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  285. package/lib/esm/numerics/Polynomials.d.ts +12 -0
  286. package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
  287. package/lib/esm/numerics/Polynomials.js +14 -0
  288. package/lib/esm/numerics/Polynomials.js.map +1 -1
  289. package/lib/esm/polyface/AuxData.js +1 -1
  290. package/lib/esm/polyface/AuxData.js.map +1 -1
  291. package/lib/esm/polyface/FacetLocationDetail.d.ts +264 -0
  292. package/lib/esm/polyface/FacetLocationDetail.d.ts.map +1 -0
  293. package/lib/esm/polyface/FacetLocationDetail.js +369 -0
  294. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -0
  295. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +2 -5
  296. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  297. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +5 -2
  298. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  299. package/lib/esm/polyface/PolyfaceBuilder.d.ts +24 -14
  300. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  301. package/lib/esm/polyface/PolyfaceBuilder.js +74 -23
  302. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  303. package/lib/esm/polyface/PolyfaceClip.js +6 -7
  304. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  305. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  306. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  307. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  308. package/lib/esm/polyface/PolyfaceQuery.d.ts +76 -1
  309. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  310. package/lib/esm/polyface/PolyfaceQuery.js +121 -2
  311. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  312. package/lib/esm/polyface/multiclip/OffsetMeshContext.d.ts +202 -0
  313. package/lib/esm/polyface/multiclip/OffsetMeshContext.d.ts.map +1 -0
  314. package/lib/esm/polyface/multiclip/OffsetMeshContext.js +1032 -0
  315. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -0
  316. package/lib/esm/serialization/BGFBReader.js +4 -4
  317. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  318. package/lib/esm/serialization/GeometrySamples.d.ts +8 -6
  319. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  320. package/lib/esm/serialization/GeometrySamples.js +26 -19
  321. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  322. package/lib/esm/serialization/IModelJsonSchema.js +1 -2
  323. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  324. package/lib/esm/solid/Sphere.d.ts +5 -5
  325. package/lib/esm/solid/Sphere.js +5 -5
  326. package/lib/esm/solid/Sphere.js.map +1 -1
  327. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  328. package/lib/esm/solid/SweepContour.js +8 -1
  329. package/lib/esm/solid/SweepContour.js.map +1 -1
  330. package/lib/esm/topology/Graph.d.ts +113 -7
  331. package/lib/esm/topology/Graph.d.ts.map +1 -1
  332. package/lib/esm/topology/Graph.js +185 -7
  333. package/lib/esm/topology/Graph.js.map +1 -1
  334. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +38 -0
  335. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -0
  336. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +78 -0
  337. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -0
  338. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +2 -1
  339. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  340. package/lib/esm/topology/HalfEdgeGraphSearch.js +1 -0
  341. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  342. package/lib/esm/topology/Triangulation.js +1 -1
  343. package/lib/esm/topology/Triangulation.js.map +1 -1
  344. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OffsetMeshContext.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/OffsetMeshContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Polyface\r\n */\r\n\r\nimport { SmallSystem } from \"../../numerics/Polynomials\";\r\nimport { GrowableXYZArray } from \"../../geometry3d/GrowableXYZArray\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphFromIndexedLoopsContext } from \"../../topology/HalfEdgeGraphFromIndexedLoopsContext\";\r\nimport { IndexedPolyface } from \"../Polyface\";\r\nimport { PolyfaceBuilder } from \"../PolyfaceBuilder\";\r\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { OffsetMeshOptions } from \"../PolyfaceQuery\";\r\nimport { PolylineCompressionContext } from \"../../geometry3d/PolylineCompressionByEdgeOffset\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\n\r\nfunction isDefinedAndTrue(value: boolean | undefined): boolean {\r\n if (value === undefined)\r\n return false;\r\n return value;\r\n}\r\n/**\r\n * Function to be called for debugging observations at key times during offset computation.\r\n */\r\ntype FacetOffsetGraphDebugFunction = (message: string, Graph: HalfEdgeGraph, breakMaskA: HalfEdgeMask, breakMaskB: HalfEdgeMask) => void;\r\n\r\ntype FacetOffsetDebugString = (message: string) => void;\r\n\r\nclass AverageNormalData {\r\n constructor() {\r\n this.numActiveSectors = 0;\r\n this.numInactiveSectors = 0; // exterior and sling.\r\n this.averageNormal = Vector3d.create();\r\n this.radiansSum = 0.0;\r\n this.maxDeviationRadiansFromAverage = 0.0;\r\n }\r\n public clear() {\r\n this.numActiveSectors = 0;\r\n this.numInactiveSectors = 0; // exterior and sling.\r\n this.averageNormal.setZero();\r\n this.radiansSum = 0.0;\r\n this.maxDeviationRadiansFromAverage = 0.0;\r\n }\r\n public numActiveSectors: number;\r\n public numInactiveSectors: number;\r\n public averageNormal: Vector3d;\r\n public maxDeviationRadiansFromAverage: number;\r\n public radiansSum;\r\n /** Add a normal to the evolving sum, scaled by radians in the corner */\r\n public accumulateNormal(node: HalfEdge, normal: Vector3d, inactiveMask: HalfEdgeMask) {\r\n if (node.isMaskSet(inactiveMask)) {\r\n this.numInactiveSectors++;\r\n } else {\r\n const sectorSweepRadians = HalfEdge.sectorSweepRadiansXYZ(node, normal);\r\n this.averageNormal.addScaledInPlace(normal, sectorSweepRadians);\r\n this.radiansSum += sectorSweepRadians;\r\n this.numActiveSectors++;\r\n }\r\n }\r\n /** normalize the accumulated normals. */\r\n public finishNormalAveraging(): boolean {\r\n if (this.numActiveSectors > 0 && this.averageNormal.normalizeInPlace()) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Compute the deviation from average. update max deviation member */\r\n public recordDeviation(normal: Vector3d, isActive: boolean) {\r\n if (isActive) {\r\n const radians = this.averageNormal.radiansTo(normal);\r\n this.maxDeviationRadiansFromAverage = Math.max(Math.abs(this.maxDeviationRadiansFromAverage), radians);\r\n } else {\r\n }\r\n }\r\n /** Return the max deviation as computed on prior calls to recordDeviation */\r\n public get maxDeviationRadians(): number { return this.maxDeviationRadiansFromAverage; }\r\n}\r\nfunction emitSector(sector: SectorOffsetProperties) {\r\n if (OffsetMeshContext.stringDebugFunction !== undefined) {\r\n OffsetMeshContext.stringDebugFunction(` Sector xyz ${sector.xyz.x},${sector.xyz.y},${sector.xyz.z} `);\r\n OffsetMeshContext.stringDebugFunction(` normal ${sector.normal.x},${sector.normal.y},${sector.normal.z} `);\r\n }\r\n\r\n}\r\n\r\n// facet properties used during offset.\r\n//\r\nexport class FacetOffsetProperties {\r\n public constructor(facetIndex: number, normal: Ray3d) {\r\n this.facetIndex = facetIndex;\r\n this.facetNormal = normal;\r\n }\r\n public facetIndex: number;\r\n public facetNormal: Ray3d;\r\n}\r\n/**\r\n * Sector properties during offset.\r\n * * this.normal may be initially assigned as the facet normal but can mutate by\r\n * averaging with neighbors.\r\n * * this.xyz is initially the base mesh xyz but is expected to move along the normal.\r\n * * this.count is used locally in computations.\r\n */\r\nexport class SectorOffsetProperties {\r\n public constructor(normal: Vector3d, xyz: Point3d) {\r\n this.xyz = xyz;\r\n this.normal = normal;\r\n this.count = 0;\r\n }\r\n public normal: Vector3d;\r\n public xyz: Point3d;\r\n public count: number;\r\n /**\r\n * Compute the angle between plane normals on opposite sides of the edge.\r\n * * parallel normals have zero angle.\r\n * * if the edge cuts inward to the volume behind the faces, the angle is negative.\r\n * * if the edge is outward (a convex edge) the the volume, the angle is positive.\r\n * @param edgeNodeA node on one side of the edge\r\n * @param edgeVector pre-allocated vector to receive vector along edge.\r\n * @param averageNormal pre-allocated vector to receive the average normal for a chamfer of the offset edge.\r\n * @param offsetDistance distance of offset being constructed. The sign of this resolves angle ambiguity.\r\n * @param radiansTolerance tolerance for large angle between normals.\r\n * @returns true if this edge has SectorOffsetProperties on both sides and the angle between normals angle exceeds radiansTolerance.\r\n */\r\n public static edgeHasLargeExteriorAngleBetweenNormals(edgeNodeA: HalfEdge,\r\n edgeVector: Vector3d,\r\n averageNormal: Vector3d,\r\n offsetDistance: number,\r\n radiansTolerance: number = Math.PI * 0.5): boolean {\r\n const propsA = edgeNodeA.edgeTag as SectorOffsetProperties;\r\n const edgeNodeB = edgeNodeA.edgeMate;\r\n const propsB = edgeNodeB.edgeTag as SectorOffsetProperties;\r\n if (propsA !== undefined && propsB !== undefined) {\r\n edgeNodeA.vectorToFaceSuccessor(edgeVector);\r\n const radians = propsA.normal.signedRadiansTo(propsB.normal, edgeVector);\r\n if (Geometry.split3WaySign(offsetDistance, -1, 1, 1) * radians >= radiansTolerance) {\r\n Vector3d.createAdd2Scaled(propsA.normal, 1.0, propsB.normal, 1.0, averageNormal);\r\n if (averageNormal.normalizeInPlace())\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public static almostEqualNormals(sectorA: SectorOffsetProperties, sectorB: SectorOffsetProperties, radiansTolerance: number = Geometry.smallAngleRadians): boolean {\r\n return sectorA.normal.radiansTo(sectorB.normal) <= radiansTolerance;\r\n }\r\n public static radiansBetweenNormals(sectorA: SectorOffsetProperties, sectorB: SectorOffsetProperties): number {\r\n return sectorA.normal.radiansTo(sectorB.normal);\r\n }\r\n // Set the offset point this.xyz as sum of the nodeXyz + distance * this.normal\r\n public setOffsetPointAtDistanceAtHalfEdge(halfEdge: HalfEdge, distance: number) {\r\n halfEdge.getPoint3d(this.xyz);\r\n this.xyz.addScaledInPlace(this.normal, distance);\r\n }\r\n // Copy xyz from parameter into (preexisting object) xyz\r\n public static setXYZAtHalfEdge(halfEdge: HalfEdge, xyz: Vector3d | undefined) {\r\n const props = halfEdge.edgeTag as SectorOffsetProperties;\r\n if (props !== undefined && xyz !== undefined)\r\n props.xyz.set(xyz.x, xyz.y, xyz.z);\r\n }\r\n\r\n // Set the offset point this.xyz directly\r\n public setXYAndZ(xyz: XYAndZ) {\r\n this.xyz.set(xyz.x, xyz.y, xyz.z);\r\n }\r\n // Look through the half edge to its properties. Set the normal there. Optionally set xyz from node xyz and offset distance\r\n public static setNormalAtHalfEdge(halfEdge: HalfEdge, uvw: Vector3d, distance?: number) {\r\n const props = halfEdge.edgeTag as SectorOffsetProperties;\r\n if (props !== undefined) {\r\n props.normal.set(uvw.x, uvw.y, uvw.z);\r\n if (distance !== undefined)\r\n props.setOffsetPointAtDistanceAtHalfEdge(halfEdge, distance);\r\n }\r\n }\r\n // Look through the half edge and its vertex successor to properties. Get the two normals. Return the angle sweeping from one to the next\r\n public static sweepRadiansAroundNormal(nodeA: HalfEdge, upVector: Vector3d): number | undefined {\r\n const propsA = nodeA.edgeTag as SectorOffsetProperties;\r\n const propsB = nodeA.vertexSuccessor.edgeTag as SectorOffsetProperties;\r\n if (propsA !== undefined && propsB !== undefined) {\r\n return propsA.normal.planarRadiansTo(propsB.normal, upVector);\r\n }\r\n return undefined;\r\n }\r\n\r\n // Look through the half edge to its properties. return (if possible) the coordinates\r\n public static getSectorPointAtHalfEdge(halfEdge: HalfEdge, xyz: Point3d | undefined, xyzArray: GrowableXYZArray | undefined): boolean {\r\n const props = halfEdge.edgeTag as SectorOffsetProperties;\r\n if (props !== undefined) {\r\n if (xyz !== undefined)\r\n xyz.setFromPoint3d(props.xyz);\r\n if (xyzArray !== undefined)\r\n xyzArray.push(props.xyz);\r\n return true;\r\n }\r\n return false;\r\n }\r\n // access the XYZ and push to the array (which makes copies, not reference)\r\n // return pointer to the SectorOffsetProperties\r\n public static pushXYZ(xyzArray: GrowableXYZArray, halfEdge: HalfEdge): SectorOffsetProperties {\r\n const sector = halfEdge.edgeTag as SectorOffsetProperties;\r\n if (sector !== undefined)\r\n xyzArray.push(sector.xyz);\r\n return sector;\r\n }\r\n // Dereference to execute: accumulatingVector += halfEdge.edgeTag.normal * scale\r\n public static accumulateScaledNormalAtHalfEdge(halfEdge: HalfEdge, scale: number, accumulatingVector: Vector3d) {\r\n const sector = halfEdge.edgeTag as SectorOffsetProperties;\r\n if (sector !== undefined)\r\n accumulatingVector.addScaledInPlace(sector.normal, scale);\r\n }\r\n}\r\n/*\r\nAbout Chamfer Edges ..... as constructed in addChamferTopologyToAllEdges\r\n\r\nWhen edge vertex X to vertex Y has a sharp angle between normals, a \"chamfer face\" must be created to \"fatten\" it.\r\n\r\nThe original half edges (nodes) for the edge are AX and AY. These are \"mates\" in the halfEdge mental model. As always,\r\nAX is (as needed)\r\n (i) the preferred half edge for the left side of the edge moving from X to Y. (i.e. above the edge)\r\n (ii) a part of the face loop for the face to the left when proceeding CCW around the face to the above the drawn edge\r\n (iii) a part of the vertex loop around X\r\nLikewise, AY is (as needed)\r\n (i) the preferred half edge for the left side of the edge moving from Y to X (i.e. below the edge)\r\n (ii) a part of the face loop for the face to the left of the edge when proceeding CCW around the face below the edge.\r\n (iii) a part of the vertex loop around Y\r\n\r\n AX------>\r\nX______________________________________________________________________Y\r\n <---AY\r\n\r\nWhen the chamfer face is created, it needs to have a sliver face \"inside the edge\" -- something in the space here\r\n\r\n AX------>\r\n _____________________________________________________________________\r\n / \\\r\nX Y\r\n \\_____________________________________________________________________/\r\n <---AY\r\n\r\nThe chamfer face will have a plane normal is the average of the two faces' plane normals.\r\n\r\nThe creation sequence for the chamfer face puts a slit \"inside the edge\" as above HalfEdges AX and AY remain as parts\r\nof their respective face loops. In addition, at each end a singleton edge \"sling\" face is inserted at each\r\nend of the sliver face.\r\n\r\nThe sequence is:\r\n\r\n STEP 1: splitEdgeCreateSliver creates the sliver face with 2 half edges DX and DY\r\n STEP 2: splitEdge (with undefined as the \"prior\" edge) creates a sling with HalfEdge CX \"inside\" and BX \"outside\".\r\n (The sling face is not yet attached to X -- briefly floating in space)\r\n STEP 3: pinch of HalfEdges BX and DX inserts the sling face \"inside\" the slit face at the X end.\r\n\r\n Steps 2 and 3 are executed from each end. Due to the symmetric structure, a 2-pass loop can apply the logic at each end without distinct names in code.\r\n\r\n AX------>\r\n _______________________________________________________________\r\n / <---DY \\\r\n / \\\r\n / BX---> \\\r\n / _______________ _______________ \\\r\n| / \\ / <----CY \\ |\r\n|/ \\ / \\|\r\nX | | Y\r\n|\\ CX---> / \\ /|\r\n| \\_______________/ \\_______________/ |\r\n \\ <---BY /\r\n \\ /\r\n \\ DX---> /\r\n \\ ______________________________________________________________/\r\n <---AY\r\n\r\nDuring the construction, the letters ABCD are used as above, but with prefixes emphasizing their role\r\noutsideAX, outsideAY\r\nslingB, slingC, sliverD\r\n\r\nThe \"inside\" sling faces (CX and CY) each have their own FacetOffsetProperties and SectorOffsetProperties.\r\nThe sliver face has its own FacetOffsetProperties which are referenced by DX, BY, DY, BX.\r\nEach of those 4 has its own SectorOffSetProperties.\r\n\r\nImportant properties during offset construction:\r\n1) the original graph always has original topology and coordinates\r\n2) Each face of the original graph has a FacetOffsetProperties with a representative point and a normal. These are unchanged during the computation.\r\n3) Each node has its own SectorOffsetProperties with a coordinate and normal independent of the parent node.\r\n 3.1 The first offset coordinates in each node are directly offset by face normal.\r\n 3.2 This creates mismatch across edges and around vertices.\r\n 3.3 Various sweeps \"around each vertex\" try to do intersections among appropriate offset planes to find\r\n common coordinates in place of the initial mismatches.\r\n4) The independence of all the sectors allows the offset construction to fix things up in any order it chooses.\r\n5) During the construction, the xyz in SectorOffsetProperties around a single vertex do NOT have to match.\r\n6) At output time, there are three sweeps:\r\n 6.1: By face: Go around the face and output a facet with the coordinates in the various sectors.\r\n 6.2: By edge: For each edge, if the sector xyz match across both ends output nothing. If not, output a triangle or quad\r\n 6.3: By vertex: At each vertex, if all vertex coordinates match output nothing. Otherwise output a facet with all the coordinates.\r\n*/\r\nexport class OffsetMeshContext {\r\n private constructor(basePolyface: IndexedPolyface, baseGraph: HalfEdgeGraph,\r\n options: OffsetMeshOptions) {\r\n this._basePolyface = basePolyface;\r\n this._baseGraph = baseGraph;\r\n this._breakMaskA = baseGraph.grabMask();\r\n this._breakMaskB = baseGraph.grabMask();\r\n\r\n this._insideOfChamferFace = baseGraph.grabMask();\r\n this._outsideOfChamferFace = baseGraph.grabMask();\r\n this._insideChamferSling = baseGraph.grabMask();\r\n this._outsideEndOfChamferFace = baseGraph.grabMask();\r\n this._exteriorMask = HalfEdgeMask.EXTERIOR;\r\n this._offsetCoordinatesReassigned = baseGraph.grabMask();\r\n this._smoothRadiansBetweenNormals = options.smoothSingleAngleBetweenNormals.radians;\r\n this._chamferTurnRadians = options.chamferAngleBetweenNormals.radians;\r\n this._smoothAccumulatedRadiansBetweenNormals = options.smoothAccumulatedAngleBetweenNormals.radians;\r\n }\r\n private _basePolyface: IndexedPolyface;\r\n private _baseGraph: HalfEdgeGraph;\r\n /** \"Exterior\" side of a bare edge of the mesh */\r\n public get exteriorMask(): HalfEdgeMask { return this._exteriorMask; }\r\n private _exteriorMask: HalfEdgeMask;\r\n\r\n /** Mask indicating a a sector's coordinates have been reassigned at offset distance. */\r\n private _offsetCoordinatesReassigned: HalfEdgeMask;\r\n\r\n /** \"First\" sector of a smooth sequence. */\r\n public get breakMaskA(): HalfEdgeMask { return this._breakMaskA; }\r\n private _breakMaskA: HalfEdgeMask;\r\n\r\n /** \"Last\" sector of a smooth sequence. */\r\n public get breakMaskB(): HalfEdgeMask { return this._breakMaskB; }\r\n private _breakMaskB: HalfEdgeMask;\r\n\r\n /** This edge is on a chamfered face, and along the original edge */\r\n public get insideOfChamferFace(): HalfEdgeMask { return this._insideOfChamferFace; }\r\n private _insideOfChamferFace: HalfEdgeMask;\r\n\r\n /** This is the original edge of a chamfer face */\r\n public get outsideOfChamferFace(): HalfEdgeMask { return this._outsideOfChamferFace; }\r\n private _outsideOfChamferFace: HalfEdgeMask;\r\n\r\n /** This edge is on a chamfered face, and at the end -- other side may be a sling */\r\n public get insideChamferSling(): HalfEdgeMask { return this._insideChamferSling; }\r\n private _insideChamferSling: HalfEdgeMask;\r\n\r\n /** This is the outside of the end of a chamfer face -- i.e. the inside of a new face-at-vertex */\r\n public get outsideEndOfChamferFace(): HalfEdgeMask { return this._outsideEndOfChamferFace; }\r\n private _outsideEndOfChamferFace: HalfEdgeMask;\r\n\r\n // On a CCW vertex loop, the mask sequence at a chamfered edge (which was expanded to a chamfer face) is\r\n // * the INBOUND edge of the original edge (at its far node !!) _outsideOfChamferFace\r\n // * the OUTBOUND edge inside the chamfer face has _insideOfChamferFace\r\n // * the inside of the sling face has _insideChamferSling\r\n // * the \"outside\" of the sling face - i.e. inside the chamfer face and at this vertex - has _outsideEndOfChamferFace\r\n // * the \"outside\" of the outgoing edge has _outsideOfChamferFace.\r\n private _smoothRadiansBetweenNormals: number;\r\n private _smoothAccumulatedRadiansBetweenNormals: number;\r\n private _chamferTurnRadians: number;\r\n public static graphDebugFunction?: FacetOffsetGraphDebugFunction;\r\n public static stringDebugFunction?: FacetOffsetDebugString;\r\n\r\n // At each node . .\r\n // * Find the sector data\r\n // * recompute the sector point using node XYZ and sectorData normal.\r\n private applyFaceNormalOffsetsToSectorData(distance: number) {\r\n this._baseGraph.announceNodes((_graph: HalfEdgeGraph, node: HalfEdge) => {\r\n const sectorData = node.edgeTag as SectorOffsetProperties;\r\n if (sectorData !== undefined) {\r\n sectorData.setOffsetPointAtDistanceAtHalfEdge(node, distance);\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * * build a mesh offset by given distance.\r\n * * output the mesh to the given builder.\r\n * @param basePolyface original mesh\r\n * @param builder polyface builder to receive the new mesh.\r\n * @param distance signed offset distance.\r\n */\r\n public static buildOffsetMeshWithEdgeChamfers(\r\n basePolyface: IndexedPolyface,\r\n builder: PolyfaceBuilder,\r\n distance: number,\r\n options: OffsetMeshOptions) {\r\n const baseGraph = this.buildBaseGraph(basePolyface);\r\n if (baseGraph !== undefined) {\r\n const offsetBuilder = new OffsetMeshContext(basePolyface, baseGraph, options);\r\n offsetBuilder.applyFaceNormalOffsetsToSectorData(distance);\r\n if (OffsetMeshContext.graphDebugFunction !== undefined)\r\n OffsetMeshContext.graphDebugFunction(\"BaseGraph\", baseGraph, offsetBuilder._breakMaskA, offsetBuilder._breakMaskB);\r\n\r\n const outputSelector = options.outputSelector ? options.outputSelector : {\r\n outputOffsetsFromFaces: true,\r\n outputOffsetsFromEdges: true,\r\n outputOffsetsFromVertices: true,\r\n };\r\n\r\n if (isDefinedAndTrue(outputSelector.outputOffsetsFromFacesBeforeChamfers))\r\n offsetBuilder.announceFacetsWithSectorCoordinatesAroundFaces(builder);\r\n\r\n offsetBuilder.addChamferTopologyToAllEdges(options, distance);\r\n offsetBuilder.computeOffsetFacetIntersections(distance);\r\n\r\n if (OffsetMeshContext.graphDebugFunction !== undefined)\r\n OffsetMeshContext.graphDebugFunction(\"after computeEdgeChamfers\", baseGraph, offsetBuilder._breakMaskA, offsetBuilder._breakMaskB);\r\n\r\n if (isDefinedAndTrue(outputSelector.outputOffsetsFromFaces))\r\n offsetBuilder.announceFacetsWithSectorCoordinatesAroundFaces(builder);\r\n if (isDefinedAndTrue(outputSelector.outputOffsetsFromEdges))\r\n offsetBuilder.announceFacetsWithSectorCoordinatesAroundEdges(builder);\r\n if (isDefinedAndTrue(outputSelector.outputOffsetsFromVertices))\r\n offsetBuilder.announceFacetsWithSectorCoordinatesAroundVertices(builder);\r\n }\r\n }\r\n\r\n /**\r\n * For each face of the graph, shift vertices by offsetDistance and emit to the builder as a facet\r\n * @param polyfaceBuilder\r\n */\r\n public announceSimpleOffsetFromFaces(polyfaceBuilder: PolyfaceBuilder, offsetDistance: number) {\r\n const xyzLoop = new GrowableXYZArray();\r\n const xyz = Point3d.create(); // reused at each point around each facet.\r\n const uvw = Vector3d.create(); // reused once per facet\r\n const announceNodeAroundFace = (node: HalfEdge): number => {\r\n node.getPoint3d(xyz);\r\n xyz.addInPlace(uvw);\r\n xyzLoop.push(xyz);\r\n return 0;\r\n };\r\n this._baseGraph.announceFaceLoops(\r\n (_graph: HalfEdgeGraph, seed: HalfEdge): boolean => {\r\n if (!seed.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const facetProperties = seed.faceTag as FacetOffsetProperties;\r\n uvw.setFromVector3d(facetProperties.facetNormal.direction);\r\n uvw.scaleInPlace(offsetDistance);\r\n xyzLoop.length = 0;\r\n seed.sumAroundFace(announceNodeAroundFace);\r\n polyfaceBuilder.addPolygonGrowableXYZArray(xyzLoop);\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * For each face of the graph, output the xyz of the sector data\r\n * @param polyfaceBuilder\r\n */\r\n public announceFacetsWithSectorCoordinatesAroundFaces(polyfaceBuilder: PolyfaceBuilder) {\r\n const xyzLoop = new GrowableXYZArray();\r\n // For face loop visits .. get the point from the sector data.\r\n const announceNodeAroundFace = (node: HalfEdge): number => {\r\n const sectorData = node.edgeTag as SectorOffsetProperties;\r\n if (sectorData !== undefined) {\r\n xyzLoop.push(sectorData.xyz);\r\n }\r\n return 0;\r\n };\r\n this._baseGraph.announceFaceLoops(\r\n (_graph: HalfEdgeGraph, seed: HalfEdge): boolean => {\r\n if (!seed.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n xyzLoop.length = 0;\r\n seed.sumAroundFace(announceNodeAroundFace);\r\n if (xyzLoop.length > 2)\r\n polyfaceBuilder.addPolygonGrowableXYZArray(xyzLoop);\r\n }\r\n return true;\r\n });\r\n }\r\n private countBits(mask: HalfEdgeMask): number {\r\n let n = 0;\r\n let mask1 = mask;\r\n while (mask1 !== 0) {\r\n if (mask1 & 0x01) n++;\r\n mask1 = mask1 >> 1;\r\n }\r\n return n;\r\n }\r\n /**\r\n * For each edge of the graph . .\r\n * * Collect coordinates in 4 sectors going around the edge\r\n * * Compress with tight tolerance so adjacent sectors with clean point match reduce to a single point.\r\n * * Emit as a facet.\r\n * @param polyfaceBuilder\r\n */\r\n public announceFacetsWithSectorCoordinatesAroundEdges(polyfaceBuilder: PolyfaceBuilder) {\r\n const xyzLoop = new GrowableXYZArray();\r\n const primaryCompressionTolerance = Geometry.smallMetricDistance;\r\n const allMasksForEdgesToIgnore = this._exteriorMask\r\n | this._outsideEndOfChamferFace\r\n | this._outsideOfChamferFace\r\n | this._insideOfChamferFace\r\n | this._insideChamferSling;\r\n this._baseGraph.announceEdges(\r\n (_graph: HalfEdgeGraph, nodeA: HalfEdge): boolean => {\r\n // This starts by looking for EXTERIOR on both sides ...\r\n if (nodeA.findMaskAroundEdge(this._exteriorMask) !== undefined) {\r\n return true;\r\n } else if (!nodeA.isMaskSet(allMasksForEdgesToIgnore)) { // By design, we believe that these two test for allMasksForEdgesToIgnore condition would catch the EXTERIOR case above\r\n const nodeB = nodeA.faceSuccessor;\r\n const nodeC = nodeA.edgeMate;\r\n if (!nodeC.isMaskSet(allMasksForEdgesToIgnore)) {\r\n const nodeD = nodeC.faceSuccessor;\r\n xyzLoop.clear();\r\n SectorOffsetProperties.getSectorPointAtHalfEdge(nodeA, undefined, xyzLoop);\r\n SectorOffsetProperties.getSectorPointAtHalfEdge(nodeB, undefined, xyzLoop);\r\n SectorOffsetProperties.getSectorPointAtHalfEdge(nodeC, undefined, xyzLoop);\r\n SectorOffsetProperties.getSectorPointAtHalfEdge(nodeD, undefined, xyzLoop);\r\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(xyzLoop, primaryCompressionTolerance);\r\n if (xyzLoop.length > 2) {\r\n polyfaceBuilder.addPolygonGrowableXYZArray(xyzLoop);\r\n }\r\n }\r\n } else {\r\n return true;\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n private getCoordinateString(node: HalfEdge, showXYZ: boolean = true, showFaceSuccessorXYZ: boolean = false): string {\r\n if (showXYZ) {\r\n if (showFaceSuccessorXYZ) {\r\n return `${HalfEdge.nodeToIdXYZString(node)} ==> ${HalfEdge.nodeToIdXYZString(node.faceSuccessor)}`;\r\n } else {\r\n return `${HalfEdge.nodeToIdXYZString(node)}`;\r\n }\r\n } else {\r\n if (showFaceSuccessorXYZ) {\r\n return `==> ${HalfEdge.nodeToIdXYZString(node.faceSuccessor)}`;\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n\r\n }\r\n private inspectMasks(node: HalfEdge, showXYZ: boolean = true, showFaceSuccessorXYZ: boolean = false): string {\r\n const s = \"[\";\r\n const v = s.concat(\r\n node.id.toString(),\r\n node.isMaskSet(this._exteriorMask) ? \"X\" : \"\",\r\n node.isMaskSet(this.breakMaskA) ? \"A\" : \"\",\r\n node.isMaskSet(this.breakMaskB) ? \"B\" : \"\",\r\n node.isMaskSet(this.insideChamferSling) ? \"(sling)\" : \"\",\r\n node.isMaskSet(this.insideOfChamferFace) ? \"(in chamfer)\" : \"\",\r\n node.isMaskSet(this.outsideEndOfChamferFace) ? \"(@sling)\" : \"\",\r\n node.isMaskSet(this.outsideOfChamferFace) ? \"(@chamfer)\" : \"\",\r\n this.getCoordinateString(node, showXYZ, showFaceSuccessorXYZ),\r\n \"]\"\r\n );\r\n return v;\r\n }\r\n /**\r\n * For each face of the graph, output the xyz of the sector data\r\n * @param polyfaceBuilder\r\n */\r\n public announceFacetsWithSectorCoordinatesAroundVertices(polyfaceBuilder: PolyfaceBuilder) {\r\n const xyzLoop = new GrowableXYZArray();\r\n const primaryCompressionTolerance = Geometry.smallMetricDistance;\r\n this._baseGraph.announceVertexLoops(\r\n (_graph: HalfEdgeGraph, seed: HalfEdge): boolean => {\r\n if (!seed.findMaskAroundVertex(this._exteriorMask)) {\r\n xyzLoop.length = 0;\r\n seed.sumAroundVertex((node: HalfEdge) => {\r\n if (!node.isMaskSet(this._insideChamferSling))\r\n SectorOffsetProperties.getSectorPointAtHalfEdge(node, undefined, xyzLoop);\r\n return 0.0;\r\n });\r\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(xyzLoop, primaryCompressionTolerance);\r\n if (xyzLoop.length > 2) {\r\n polyfaceBuilder.addPolygonGrowableXYZArray(xyzLoop);\r\n }\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * * Exterior half edges have HalfEdgeMask.EXTERIOR\r\n * * All interior half edge around a facet have facetTag pointing to a facetProperties object for that facet.\r\n * * the facetOffsetProperties object has the simple facet normal.\r\n * * Each half edge has edgeTag pointing to to a sectorOffsetProperties object\r\n * * the sectorOffsetProperties has a copy of the facet normal.\r\n * @param polyface\r\n * @returns graph\r\n */\r\n public static buildBaseGraph(polyface: IndexedPolyface): HalfEdgeGraph | undefined {\r\n const graphBuilder = new HalfEdgeGraphFromIndexedLoopsContext();\r\n const visitor = polyface.createVisitor();\r\n const xyzA = Point3d.create();\r\n const xyzB = Point3d.create();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n const normal = PolygonOps.centroidAreaNormal(visitor.point);\r\n if (normal !== undefined) {\r\n const edgeA = graphBuilder.insertLoop(visitor.pointIndex,\r\n (insideHalfEdge: HalfEdge) => {\r\n const mate = insideHalfEdge.edgeMate;\r\n polyface.data.getPoint(insideHalfEdge.i, xyzA);\r\n insideHalfEdge.setXYZ(xyzA);\r\n polyface.data.getPoint(mate.i, xyzB);\r\n mate.setXYZ(xyzB);\r\n });\r\n const facetProperties = new FacetOffsetProperties(visitor.currentReadIndex(), normal);\r\n if (edgeA !== undefined) {\r\n edgeA.sumAroundFace(\r\n (edgeB: HalfEdge) => {\r\n edgeB.faceTag = facetProperties;\r\n edgeB.edgeTag = new SectorOffsetProperties(normal.direction.clone(), edgeB.getPoint3d());\r\n return 0;\r\n });\r\n }\r\n }\r\n }\r\n return graphBuilder.graph;\r\n }\r\n private setOffsetAtDistanceAroundVertex(vertexSeed: HalfEdge, distance: number, ignoreChamfers: boolean = false) {\r\n vertexSeed.sumAroundVertex((nodeAroundVertex: HalfEdge) => {\r\n const props = nodeAroundVertex.edgeTag as SectorOffsetProperties;\r\n if (props !== undefined) {\r\n if (ignoreChamfers && this.isInsideChamferOrSling(vertexSeed)) {\r\n // SKIP !!\r\n } else {\r\n props.setOffsetPointAtDistanceAtHalfEdge(nodeAroundVertex, distance);\r\n }\r\n }\r\n return 0.0;\r\n }\r\n );\r\n }\r\n\r\n private setOffsetXYAndZAroundVertex(vertexSeed: HalfEdge, xyz: XYAndZ) {\r\n vertexSeed.sumAroundVertex((nodeAroundVertex: HalfEdge) => {\r\n const props = nodeAroundVertex.edgeTag as SectorOffsetProperties;\r\n if (props !== undefined) {\r\n props.setXYAndZ(xyz);\r\n nodeAroundVertex.setMask(this._offsetCoordinatesReassigned);\r\n }\r\n return 0.0;\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * * start at vertexSeed.\r\n * * set the offset point at up to (and including) one with (a) this._breakMaskB or (b) this._exteriorMask\r\n * *\r\n * @param vertexSeed first node to mark.\r\n * @param f function to call to announce each node and its sector properties.\r\n * @returns number of nodes marked.\r\n */\r\n private announceNodeAndSectorPropertiesInSmoothSector(vertexSeed: HalfEdge, f: (node: HalfEdge, properties: SectorOffsetProperties) => void): number {\r\n let n = 0;\r\n for (let currentNode = vertexSeed; ; currentNode = currentNode.vertexSuccessor) {\r\n const props = currentNode.edgeTag as SectorOffsetProperties;\r\n if (props !== undefined) {\r\n f(currentNode, props);\r\n n++;\r\n }\r\n if (currentNode.isMaskSet(this._breakMaskB))\r\n return n;\r\n // REMARK: these additional exit conditions should not happen if (a) the graph is properly marked and (b) the start node is not exterior.\r\n if (currentNode.isMaskSet(this._exteriorMask))\r\n return n;\r\n if (currentNode === vertexSeed && n === 0)\r\n return n;\r\n }\r\n }\r\n\r\n private computeAverageNormalAndMaxDeviationAroundVertex(vertexSeed: HalfEdge, data: AverageNormalData): number | undefined {\r\n data.clear();\r\n const inactiveNodeMask = this._exteriorMask | this._insideChamferSling;\r\n vertexSeed.sumAroundVertex((node: HalfEdge) => {\r\n const sectorData = node.edgeTag as SectorOffsetProperties;\r\n if (sectorData)\r\n data.accumulateNormal(node, sectorData.normal, inactiveNodeMask);\r\n return 0.0;\r\n }\r\n );\r\n if (!data.finishNormalAveraging()) {\r\n return undefined;\r\n }\r\n vertexSeed.sumAroundVertex((node: HalfEdge) => {\r\n const sectorData = node.edgeTag as SectorOffsetProperties;\r\n if (sectorData)\r\n data.recordDeviation(sectorData.normal, !node.isMaskSet(inactiveNodeMask));\r\n return 0.0;\r\n }\r\n );\r\n return data.maxDeviationRadians;\r\n }\r\n\r\n private assignOffsetByAverageNormalAroundVertex(vertexSeed: HalfEdge,\r\n maxAllowedDeviationRadians: number,\r\n data: AverageNormalData,\r\n distance: number): boolean {\r\n const maxDeviationRadians = this.computeAverageNormalAndMaxDeviationAroundVertex(vertexSeed, data);\r\n if (OffsetMeshContext.stringDebugFunction) {\r\n OffsetMeshContext.stringDebugFunction(`XYZ ${HalfEdge.nodeToIdXYZString(vertexSeed)} Average Normal ${data.averageNormal.toJSON()}`);\r\n OffsetMeshContext.stringDebugFunction(` angle ratio ${data.radiansSum / (2 * Math.PI)} maxDeviation ${data.maxDeviationRadiansFromAverage}`);\r\n }\r\n if (maxDeviationRadians !== undefined && maxDeviationRadians <= maxAllowedDeviationRadians) {\r\n vertexSeed.sumAroundVertex((node: HalfEdge) => {\r\n SectorOffsetProperties.setNormalAtHalfEdge(node, data.averageNormal, distance);\r\n return 0;\r\n });\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** Search around a vertex for a sector which has a different normal from its vertexPredecessor.\r\n * * The seed will be the first candidate considered\r\n */\r\n private markBreakEdgesAndSaveAverageNormalsAroundVertex(vertexSeed: HalfEdge) {\r\n vertexSeed.clearMaskAroundVertex(this._breakMaskA);\r\n vertexSeed.clearMaskAroundVertex(this._breakMaskB);\r\n\r\n const smoothSingleSmoothRadiansBetweenNormals = this._smoothRadiansBetweenNormals;\r\n const accumulatedRadiansBetweenNormals = this._smoothAccumulatedRadiansBetweenNormals;\r\n\r\n // Step 1: Examine the edge between nodeA and the sector on its vertex predecessor side. This (alone) determines single angle breaks.\r\n let numBreaks = 0;\r\n let nodeP = vertexSeed;\r\n let _numSmooth = 0;\r\n do {\r\n const nodeQ = nodeP.edgeMate;\r\n const nodeR = nodeQ.faceSuccessor; // same as nodeA.vertexPredecessor\r\n if (nodeP.isMaskSet(this._exteriorMask)) {\r\n if (!nodeQ.isMaskSet(this._exteriorMask)) {\r\n nodeR.setMask(this._breakMaskB);\r\n numBreaks++;\r\n }\r\n } else {\r\n if (nodeP.isMaskSet(this._outsideOfChamferFace)) {\r\n nodeP.setMask(this._breakMaskA);\r\n } else if (nodeP.isMaskSet(this._outsideEndOfChamferFace)) {\r\n nodeP.setMask(this._breakMaskA);\r\n nodeP.setMask(this._breakMaskB);\r\n } else if (nodeP.isMaskSet(this._insideChamferSling)) {\r\n // This is the sling. It's normal is along edge -- not really a break.\r\n } else if (nodeP.isMaskSet(this._insideOfChamferFace)) {\r\n nodeP.setMask(this._breakMaskA);\r\n nodeP.setMask(this._breakMaskB);\r\n nodeR.setMask(this._breakMaskB);\r\n } else if (nodeQ.isMaskSet(this._exteriorMask)) {\r\n numBreaks++;\r\n nodeP.setMask(this._breakMaskA);\r\n } else if (!SectorOffsetProperties.almostEqualNormals(\r\n nodeP.edgeTag as SectorOffsetProperties,\r\n nodeR.edgeTag as SectorOffsetProperties,\r\n smoothSingleSmoothRadiansBetweenNormals)) {\r\n nodeP.setMask(this._breakMaskA);\r\n numBreaks++;\r\n nodeR.setMask(this._breakMaskB);\r\n } else {\r\n _numSmooth++;\r\n }\r\n }\r\n nodeP = nodeP.vertexSuccessor;\r\n } while (nodeP !== vertexSeed);\r\n if (OffsetMeshContext.stringDebugFunction !== undefined)\r\n OffsetMeshContext.stringDebugFunction(` numSkip ${_numSmooth} `);\r\n if (numBreaks === 0) {\r\n // make the first vertex a break so subsequent searches have a place to start\r\n vertexSeed.setMask(this._breakMaskA);\r\n vertexSeed.vertexPredecessor.setMask(this._breakMaskB);\r\n numBreaks = 1;\r\n }\r\n // Step 2: At each single break, sweep forward to its closing breakB. Insert breaks at accumulated angles.\r\n // (minor TODO: for the insertion case, try to split more equally.)\r\n const nodeAStart = nodeP.findMaskAroundVertex(this._breakMaskA);\r\n if (nodeAStart !== undefined) {\r\n nodeP = nodeAStart;\r\n do {\r\n if (nodeP.isMaskSet(this._breakMaskA) && !nodeP.isMaskSet(this._breakMaskB)) {\r\n let accumulatedRadians = 0.0;\r\n do {\r\n const nodeB = nodeP.vertexSuccessor;\r\n accumulatedRadians += SectorOffsetProperties.radiansBetweenNormals(\r\n nodeP.edgeTag as SectorOffsetProperties,\r\n nodeB.edgeTag as SectorOffsetProperties,\r\n );\r\n if (accumulatedRadians > accumulatedRadiansBetweenNormals) {\r\n nodeP.setMask(this._breakMaskB);\r\n nodeB.setMask(this._breakMaskA);\r\n numBreaks++;\r\n accumulatedRadians = 0.0;\r\n }\r\n nodeP = nodeB;\r\n } while (!nodeP.isMaskSet(this._breakMaskB));\r\n } else {\r\n nodeP = nodeP.vertexSuccessor;\r\n }\r\n } while (nodeP !== nodeAStart);\r\n }\r\n\r\n if (numBreaks > 0 && nodeAStart !== undefined) {\r\n // In each compound sector, accumulate and install average normal.\r\n nodeP = nodeAStart;\r\n const averageNormal = Vector3d.create();\r\n const edgeVectorU = Vector3d.create();\r\n const edgeVectorV = Vector3d.create();\r\n averageNormal.setZero();\r\n do {\r\n if (nodeP.isMaskSet(this._breakMaskA) && !nodeP.isMaskSet(this._breakMaskB)) {\r\n let nodeQ = nodeP;\r\n averageNormal.setZero();\r\n for (; ;) {\r\n nodeQ.vectorToFaceSuccessor(edgeVectorU);\r\n nodeQ.vectorToFacePredecessor(edgeVectorV);\r\n let singleSectorRadians = edgeVectorU.signedRadiansTo(edgeVectorV, (nodeQ.faceTag as FacetOffsetProperties).facetNormal.direction);\r\n if (singleSectorRadians < 0.0)\r\n singleSectorRadians += Math.PI * 2;\r\n SectorOffsetProperties.accumulateScaledNormalAtHalfEdge(nodeQ, singleSectorRadians, averageNormal);\r\n if (nodeQ.isMaskSet(this._breakMaskB))\r\n break;\r\n nodeQ = nodeQ.vertexSuccessor;\r\n }\r\n if (averageNormal.normalizeInPlace()) {\r\n nodeQ = nodeP;\r\n for (; ;) {\r\n SectorOffsetProperties.setNormalAtHalfEdge(nodeQ, averageNormal);\r\n if (nodeQ.isMaskSet(this._breakMaskB))\r\n break;\r\n nodeQ = nodeQ.vertexSuccessor;\r\n }\r\n }\r\n }\r\n nodeP = nodeP.vertexSuccessor;\r\n } while (nodeP !== nodeAStart);\r\n\r\n }\r\n }\r\n\r\n /** Compute the point of intersection of the planes in the sectors of 3 half edges */\r\n private compute3SectorIntersection(nodeA: HalfEdge, nodeB: HalfEdge, nodeC: HalfEdge, result?: Vector3d): Vector3d | undefined {\r\n const sectorA = nodeA.edgeTag as SectorOffsetProperties;\r\n const sectorB = nodeB.edgeTag as SectorOffsetProperties;\r\n const sectorC = nodeC.edgeTag as SectorOffsetProperties;\r\n const vector = SmallSystem.intersect3Planes(\r\n sectorA.xyz, sectorA.normal,\r\n sectorB.xyz, sectorB.normal,\r\n sectorC.xyz, sectorC.normal,\r\n result);\r\n return vector;\r\n }\r\n /** Compute the point of intersection of the planes in the sectors of 3 half edges */\r\n private compute3SectorIntersectionDebug(nodeA: HalfEdge, nodeB: HalfEdge, nodeC: HalfEdge, result?: Vector3d): Vector3d | undefined {\r\n const sectorA = nodeA.edgeTag as SectorOffsetProperties;\r\n const sectorB = nodeB.edgeTag as SectorOffsetProperties;\r\n const sectorC = nodeC.edgeTag as SectorOffsetProperties;\r\n if (OffsetMeshContext.stringDebugFunction !== undefined) {\r\n OffsetMeshContext.stringDebugFunction(`compute3${this.inspectMasks(nodeA)}${this.inspectMasks(nodeB)}${this.inspectMasks(nodeC)} `);\r\n for (const sector of [sectorA, sectorB, sectorC])\r\n emitSector(sector);\r\n }\r\n\r\n const vector = SmallSystem.intersect3Planes(\r\n sectorA.xyz, sectorA.normal,\r\n sectorB.xyz, sectorB.normal,\r\n sectorC.xyz, sectorC.normal,\r\n result);\r\n\r\n if (OffsetMeshContext.stringDebugFunction !== undefined) {\r\n if (vector === undefined)\r\n OffsetMeshContext.stringDebugFunction(\" NO INTERSECTION\");\r\n else\r\n OffsetMeshContext.stringDebugFunction(` ComputedVector ${vector.x},${vector.y},${vector.z} `);\r\n }\r\n return vector;\r\n }\r\n\r\n /** Compute the point of intersection of the planes in the sectors of 2 half edges, using cross product of their normals to resolve */\r\n private compute2SectorIntersection(nodeA: HalfEdge, nodeB: HalfEdge, result?: Vector3d): Vector3d | undefined {\r\n const sectorA = nodeA.edgeTag as SectorOffsetProperties;\r\n const sectorB = nodeB.edgeTag as SectorOffsetProperties;\r\n const normalC = sectorA.normal.crossProduct(sectorB.normal);\r\n return SmallSystem.intersect3Planes(\r\n sectorA.xyz, sectorA.normal,\r\n sectorB.xyz, sectorB.normal,\r\n sectorB.xyz, normalC,\r\n result);\r\n }\r\n /**\r\n * * at input, graph has all original faces and edges\r\n * * each sector points to a faceProperties with original facet normal\r\n * * at exit:\r\n * * new \"chamfer faces\" are added outside of edges with angle between normal sin excess of options.chamferTurnAngleBetweenNormals\r\n * * the original edge is split along its length to create space\r\n * * one edge \"along\" each direction inside the slit.\r\n * * a sling edge at each end of the slit.\r\n * * outside of the sling is part of the slit face loop.\r\n * * inside is a single-node face\r\n * * thus the slit itself has 4 nodes.\r\n * * the two nodes at each end can thus contain the two distinct points at that end of the chamfer.\r\n * * all 4 nodes of the slit face point to a new FacetOffsetProperties with the average normal.\r\n * * the inside of each sling face has\r\n * * original vertex coordinates in the node\r\n * * face properties with a normal pointing outward from that end of the original edge -- hence define a plane that can clip the chamfer\r\n * * the two points at each end of the chamfer are computed as the intersection of\r\n * * chamfer plane\r\n * * sling plane\r\n * * adjacent plane of the face on the other side of the edge being chamfered.\r\n * @param distance distance to offset. The sign of this is important in the chamfer construction.\r\n */\r\n private addChamferTopologyToAllEdges(options: OffsetMeshOptions, distance: number) {\r\n const edgesToChamfer: HalfEdge[] = [];\r\n const chamferRadians = options.chamferAngleBetweenNormals.radians;\r\n const vertexXYZ = Point3d.create(); // reuse\r\n const edgeVector = Vector3d.create(); // reuse\r\n const outwardEdgeVector = Vector3d.create(); // reuse\r\n const averageNormal = Vector3d.create(); // reuse\r\n // collect all the edges with sharp turn angle.\r\n this._baseGraph.announceEdges(\r\n (_graph: HalfEdgeGraph, edgeNode: HalfEdge) => {\r\n if (SectorOffsetProperties.edgeHasLargeExteriorAngleBetweenNormals(edgeNode, edgeVector, averageNormal,\r\n distance,\r\n chamferRadians)) {\r\n edgesToChamfer.push(edgeNode);\r\n return true;\r\n }\r\n return true;\r\n });\r\n // Create sliver faces.\r\n // Sliver face gets an average normal from its neighbors.\r\n // outsideA is the HalfEdge labeled A in the diagram.\r\n // sliverDX and sliverDY are the edges \"inside the sliver\" at the respective X and Y ends.\r\n for (const outsideA of edgesToChamfer) {\r\n // remark: this recomputes as in collection round.\r\n if (SectorOffsetProperties.edgeHasLargeExteriorAngleBetweenNormals(outsideA, edgeVector, averageNormal, chamferRadians)) {\r\n // This copies coordinates and vertex id .... sectorOffsetProperties are delayed until late in the 2-pass loop below.\r\n // The returned HalfEdge is labeled D in the diagram\r\n const sliverDX = this._baseGraph.splitEdgeCreateSliverFace(outsideA);\r\n const sliverDY = sliverDX.facePredecessor;\r\n const offsetPoint = sliverDX.getPoint3d();\r\n offsetPoint.addScaledInPlace(averageNormal, distance);\r\n const ray = Ray3d.createCapture(offsetPoint, averageNormal.clone());\r\n const facetProperties = new FacetOffsetProperties(-1, ray);\r\n // for each side (hence end) of the sliver face, set mask and install a sling loop for the anticipated end of the chamfer face\r\n // new node names in the loop omit X or Y suffix because that is implied by which pass is running.\r\n let s = -1.0;\r\n for (const sliverD of [sliverDX, sliverDY]) {\r\n edgeVector.scale(s, outwardEdgeVector);\r\n sliverD.getPoint3d(vertexXYZ);\r\n sliverD.setMask(this._insideOfChamferFace);\r\n sliverD.edgeMate.setMask(this._outsideOfChamferFace);\r\n // mark and reference the chamfer face.\r\n sliverD.faceTag = facetProperties;\r\n // sling at this end\r\n const slingB = this._baseGraph.splitEdge(undefined, vertexXYZ.x, vertexXYZ.y, vertexXYZ.z, sliverD.i);\r\n const slingC = slingB.edgeMate;\r\n slingB.setMask(this._outsideEndOfChamferFace);\r\n slingB.faceTag = facetProperties;\r\n slingC.setMask(this._insideChamferSling);\r\n HalfEdge.pinch(sliverD, slingB);\r\n const endNormal = Ray3d.create(vertexXYZ, outwardEdgeVector); // clones the inputs\r\n const slingFaceProperties = new FacetOffsetProperties(-1, endNormal);\r\n slingC.faceTag = slingFaceProperties;\r\n // initialize sectors with existing vertex point.\r\n sliverD.edgeTag = new SectorOffsetProperties(averageNormal.clone(), offsetPoint.clone());\r\n slingB.edgeTag = new SectorOffsetProperties(averageNormal.clone(), offsetPoint.clone());\r\n slingC.edgeTag = new SectorOffsetProperties(outwardEdgeVector.clone(), vertexXYZ.clone());\r\n // OffsetMeshContext.stringDebugFunction(\"Chamfer Setup\");\r\n const chamferPointE = this.compute3SectorIntersection(sliverD, sliverD.edgeMate, slingC);\r\n const chamferPointF = this.compute3SectorIntersection(slingB, slingB.vertexSuccessor, slingC);\r\n // sliverD.edgeTag = new SectorOffsetProperties(averageNormal.clone(), vertexXYZ.clone());\r\n SectorOffsetProperties.setXYZAtHalfEdge(sliverD, chamferPointE);\r\n SectorOffsetProperties.setXYZAtHalfEdge(slingB, chamferPointF);\r\n s *= -1.0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * * at input:\r\n * * Each node points to sectorOffsetProperties with previously computed XYZ (presumably mismatched)\r\n * * at exit:\r\n * * Each sectorOffsetProperties has an offset point computed with consideration of offset planes in the neighborhood.\r\n * @param distance distance to offset.\r\n */\r\n private computeOffsetFacetIntersections(distance: number) {\r\n if (OffsetMeshContext.stringDebugFunction !== undefined)\r\n OffsetMeshContext.stringDebugFunction(\"***** recompute intersections\");\r\n const breakEdges: HalfEdge[] = [];\r\n const vertexXYZ = Point3d.create();\r\n const chamferXYZ = Point3d.create();\r\n const maxVertexMove = 2.0 * distance;\r\n const averageNormalData = new AverageNormalData();\r\n const maxAllowedNormalDeviationRadians = Angle.degreesToRadians(25.0);\r\n //\r\n // FOR EACH VERTEX\r\n //\r\n this._baseGraph.announceVertexLoops((_graph: HalfEdgeGraph, vertexSeedA: HalfEdge) => {\r\n // reposition to an important vertex.\r\n // first choice: a chamfer face.\r\n let vertexSeed = vertexSeedA.findMaskAroundVertex(this._outsideEndOfChamferFace);\r\n if (vertexSeed === undefined)\r\n vertexSeed = vertexSeedA.findMaskAroundVertex(this._breakMaskA);\r\n if (vertexSeed === undefined)\r\n vertexSeed = vertexSeedA;\r\n if (OffsetMeshContext.stringDebugFunction !== undefined) {\r\n OffsetMeshContext.stringDebugFunction(\"\");\r\n OffsetMeshContext.stringDebugFunction(` VERTEX LOOP ${vertexSeed.getPoint3d().toJSON()} `);\r\n vertexSeed.sumAroundVertex(\r\n (node: HalfEdge) => { OffsetMeshContext.stringDebugFunction!(this.inspectMasks(node, false, true)); return 0; });\r\n }\r\n // Take care of the easiest vertices directly . . . note that this returns from the lambda, not computeOffsetFacetIntersections\r\n if (this.assignOffsetByAverageNormalAroundVertex(vertexSeed, maxAllowedNormalDeviationRadians, averageNormalData, distance))\r\n return true;\r\n\r\n this.markBreakEdgesAndSaveAverageNormalsAroundVertex(vertexSeed);\r\n this.setOffsetAtDistanceAroundVertex(vertexSeed, distance, true);\r\n vertexSeed.collectMaskedEdgesAroundVertex(this._breakMaskA, true, breakEdges);\r\n if (OffsetMeshContext.stringDebugFunction !== undefined) {\r\n OffsetMeshContext.stringDebugFunction(` BREAK EDGES from ${this.inspectMasks(vertexSeed, true, false)}`);\r\n for (const node of breakEdges) { OffsetMeshContext.stringDebugFunction(this.inspectMasks(node, false, true)); }\r\n }\r\n if (breakEdges.length <= 1) {\r\n // just one smooth sequence.\r\n // everything is set already.\r\n } else if (breakEdges.length === 2) {\r\n // exterior vertex with two incident smooth\r\n const vectorFromOrigin = this.compute2SectorIntersection(breakEdges[0], breakEdges[1]);\r\n if (vectorFromOrigin !== undefined) {\r\n this.setOffsetXYAndZAroundVertex(vertexSeed, vectorFromOrigin);\r\n }\r\n } else if (breakEdges.length === 3) {\r\n if (OffsetMeshContext.stringDebugFunction !== undefined)\r\n OffsetMeshContext.stringDebugFunction(` Vertex Update just ${breakEdges.length} `);\r\n const vectorFromOrigin = this.compute3SectorIntersection(breakEdges[0], breakEdges[1], breakEdges[2]);\r\n if (vectorFromOrigin !== undefined) {\r\n this.setOffsetXYAndZAroundVertex(vertexSeed, vectorFromOrigin);\r\n }\r\n // simple 3-face corner . . .\r\n } else {\r\n // Lots and Lots of edges\r\n // each set of 3 sectors independently generates an offset for its central sector.\r\n if (OffsetMeshContext.stringDebugFunction !== undefined)\r\n OffsetMeshContext.stringDebugFunction(` Vertex Update breakEdges ${breakEdges.length} `);\r\n vertexSeed.getPoint3d(vertexXYZ);\r\n // Pass 1 -- look for intersection among multiple chamfers\r\n for (let i = 0; i < breakEdges.length; i++) {\r\n const i0 = i;\r\n const i1 = (i0 + 1) % breakEdges.length;\r\n const i2 = (i1 + 1) % breakEdges.length;\r\n\r\n if (breakEdges[i0].isMaskSet(this._outsideEndOfChamferFace)\r\n && breakEdges[i1].isMaskSet(this._outsideOfChamferFace)\r\n && breakEdges[i2].isMaskSet(this._insideOfChamferFace)) {\r\n if (OffsetMeshContext.stringDebugFunction !== undefined)\r\n OffsetMeshContext.stringDebugFunction(` ChamferChamfer Fixup ${this.inspectMasks(breakEdges[i0])} ${this.inspectMasks(breakEdges[i1])} ${this.inspectMasks(breakEdges[i2])} `);\r\n const vectorFromOrigin = this.compute3SectorIntersection(breakEdges[i0], breakEdges[i1], breakEdges[i2]);\r\n if (vectorFromOrigin !== undefined) {\r\n // Treat all 3 spots as possibly compound sequences\r\n for (const iOutput of [i0, i1, i2]) {\r\n this.announceNodeAndSectorPropertiesInSmoothSector(breakEdges[iOutput],\r\n (node: HalfEdge, properties: SectorOffsetProperties) => {\r\n properties.setXYAndZ(vectorFromOrigin);\r\n node.setMask(this._offsetCoordinatesReassigned);\r\n });\r\n }\r\n // Since all three were reset, skip past. This is done on the acyclic integer that controls the loop.\r\n i += 2;\r\n }\r\n }\r\n }\r\n\r\n // Pass 2 -- look for unassigned nodes just before or after a chamfer.\r\n // The chamfer wins\r\n for (let i = 0; i < breakEdges.length; i++) {\r\n const i0 = i;\r\n const i1 = (i0 + 1) % breakEdges.length;\r\n if (this.isInsideSling(breakEdges[i0], breakEdges[i1]))\r\n continue;\r\n if (!this.isOffsetAssigned(breakEdges[i0])\r\n && breakEdges[i1].isMaskSet(this.insideOfChamferFace)) {\r\n this.transferXYZFromNodeToSmoothSector(breakEdges[i1], breakEdges[i0], \"push left from chamfer\", chamferXYZ);\r\n } else if (!this.isOffsetAssigned(breakEdges[i1])\r\n && breakEdges[i0].isMaskSet(this.outsideEndOfChamferFace)) {\r\n this.transferXYZFromNodeToSmoothSector(breakEdges[i0], breakEdges[i1], \"push right from chamfer\", chamferXYZ);\r\n }\r\n\r\n }\r\n\r\n // Pass 3 -- look for unassigned nodes as middle of 3-face intersections\r\n for (let i = 0; i < breakEdges.length; i++) {\r\n const i0 = i;\r\n const i1 = (i0 + 1) % breakEdges.length;\r\n const i2 = (i1 + 1) % breakEdges.length;\r\n if (this.isInsideSling(breakEdges[i0], breakEdges[i1], breakEdges[i2]))\r\n continue;\r\n if (this.isOffsetAssigned(breakEdges[i1]))\r\n continue;\r\n if (OffsetMeshContext.stringDebugFunction !== undefined)\r\n OffsetMeshContext.stringDebugFunction(` Intersection Fixup ${this.inspectMasks(breakEdges[i0])} ${this.inspectMasks(breakEdges[i1])} ${this.inspectMasks(breakEdges[i2])} `);\r\n const vectorFromOrigin = this.compute3SectorIntersection(breakEdges[i0], breakEdges[i1], breakEdges[i2]);\r\n if (vectorFromOrigin !== undefined) {\r\n if (vertexXYZ.distance(vectorFromOrigin) < maxVertexMove) {\r\n this.announceNodeAndSectorPropertiesInSmoothSector(breakEdges[i1],\r\n (node: HalfEdge, properties: SectorOffsetProperties) => {\r\n properties.setXYAndZ(vectorFromOrigin);\r\n node.setMask(this._offsetCoordinatesReassigned);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n if (OffsetMeshContext.stringDebugFunction !== undefined) {\r\n const n0 = vertexSeed.countMaskAroundVertex(this._offsetCoordinatesReassigned, false);\r\n const n1 = vertexSeed.countMaskAroundVertex(this._offsetCoordinatesReassigned, true);\r\n const message = ` **** Vertex offset mask counts(TRUE ${n1})(FALSE ${n0})`;\r\n OffsetMeshContext.stringDebugFunction(message);\r\n }\r\n return true;\r\n });\r\n }\r\n // return true if any of these nodes is \"inside\" the sling at the end of a chamfer.\r\n private isInsideSling(node0: HalfEdge,\r\n node1?: HalfEdge,\r\n node2?: HalfEdge): boolean {\r\n return node0.isMaskSet(this._insideChamferSling)\r\n || (node1 !== undefined && node1.isMaskSet(this._insideChamferSling))\r\n || (node2 !== undefined && node2.isMaskSet(this._insideChamferSling));\r\n }\r\n // return true if any of these nodes is \"inside\" the sling at the end of a chamfer.\r\n private isInsideChamferOrSling(node0: HalfEdge): boolean {\r\n return node0.isMaskSet(this._insideChamferSling)\r\n || node0.isMaskSet(this._insideOfChamferFace)\r\n || node0.isMaskSet(this._outsideEndOfChamferFace);\r\n }\r\n private isOffsetAssigned(node0: HalfEdge,\r\n node1?: HalfEdge,\r\n node2?: HalfEdge): boolean {\r\n return node0.isMaskSet(this._offsetCoordinatesReassigned)\r\n || (node1 !== undefined && node1.isMaskSet(this._offsetCoordinatesReassigned))\r\n || (node2 !== undefined && node2.isMaskSet(this._offsetCoordinatesReassigned));\r\n }\r\n\r\n /**\r\n *\r\n * @param sourceNode node with good xyz\r\n * @param destinationStartNode first of a sequence of nodes to set (delimited by masks)\r\n * @param description string for debug\r\n * @param workPoint point to use for coordinate transfer.\r\n */\r\n private transferXYZFromNodeToSmoothSector(\r\n sourceNode: HalfEdge,\r\n destinationStartNode: HalfEdge,\r\n description: string,\r\n workPoint: Point3d\r\n ) {\r\n if (OffsetMeshContext.stringDebugFunction !== undefined)\r\n OffsetMeshContext.stringDebugFunction(` ${description} ${this.inspectMasks(sourceNode)} to ${this.inspectMasks(destinationStartNode)}} `);\r\n SectorOffsetProperties.getSectorPointAtHalfEdge(sourceNode, workPoint, undefined);\r\n this.announceNodeAndSectorPropertiesInSmoothSector(destinationStartNode,\r\n (node: HalfEdge, properties: SectorOffsetProperties) => {\r\n properties.setXYAndZ(workPoint);\r\n node.setMask(this._offsetCoordinatesReassigned);\r\n });\r\n }\r\n}\r\n"]}
@@ -173,7 +173,7 @@ export class BGFBReader {
173
173
  else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagEllipticArc) {
174
174
  const offsetToEllipticArc = variant.geometry(new BGFBAccessors.EllipticArc());
175
175
  const offsetToCoordinates = offsetToEllipticArc.arc();
176
- return Arc3d.createXYZXYZXYZ(offsetToCoordinates.centerX(), offsetToCoordinates.centerY(), offsetToCoordinates.centerZ(), offsetToCoordinates.vector0X(), offsetToCoordinates.vector0Y(), offsetToCoordinates.vector0Z(), offsetToCoordinates.vector90X(), offsetToCoordinates.vector90Y(), offsetToCoordinates.vector90Z(), AngleSweep.createStartSweepRadians(offsetToCoordinates.startRadians(), offsetToCoordinates === null || offsetToCoordinates === void 0 ? void 0 : offsetToCoordinates.sweepRadians()));
176
+ return Arc3d.createXYZXYZXYZ(offsetToCoordinates.centerX(), offsetToCoordinates.centerY(), offsetToCoordinates.centerZ(), offsetToCoordinates.vector0X(), offsetToCoordinates.vector0Y(), offsetToCoordinates.vector0Z(), offsetToCoordinates.vector90X(), offsetToCoordinates.vector90Y(), offsetToCoordinates.vector90Z(), AngleSweep.createStartSweepRadians(offsetToCoordinates.startRadians(), offsetToCoordinates?.sweepRadians()));
177
177
  }
178
178
  else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagLineString) {
179
179
  const offsetToLineString = variant.geometry(new BGFBAccessors.LineString());
@@ -330,14 +330,14 @@ export class BGFBReader {
330
330
  if (meshStyle === 1 && pointF64 && pointIndexI32) {
331
331
  const polyface = IndexedPolyface.create(normalF64 !== undefined, paramF64 !== undefined, intColorU32 !== undefined, twoSided);
332
332
  polyface.expectedClosure = expectedClosure;
333
- for (let i = 0; i + 2 < (pointF64 === null || pointF64 === void 0 ? void 0 : pointF64.length); i += 3)
333
+ for (let i = 0; i + 2 < pointF64?.length; i += 3)
334
334
  polyface.data.point.pushXYZ(pointF64[i], pointF64[i + 1], pointF64[i + 2]);
335
335
  if (paramF64) {
336
- for (let i = 0; i + 1 < (paramF64 === null || paramF64 === void 0 ? void 0 : paramF64.length); i += 2)
336
+ for (let i = 0; i + 1 < paramF64?.length; i += 2)
337
337
  polyface.data.param.pushXY(paramF64[i], paramF64[i + 1]);
338
338
  }
339
339
  if (normalF64) {
340
- for (let i = 0; i + 2 < (normalF64 === null || normalF64 === void 0 ? void 0 : normalF64.length); i += 3)
340
+ for (let i = 0; i + 2 < normalF64?.length; i += 3)
341
341
  polyface.data.normal.pushXYZ(normalF64[i], normalF64[i + 1], normalF64[i + 2]);
342
342
  }
343
343
  if (intColorU32) {
@@ -1 +1 @@
1
- {"version":3,"file":"BGFBReader.js","sourceRoot":"","sources":["../../../src/serialization/BGFBReader.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAmB,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE5E;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACrB;IACA,CAAC;IACD;;;OAGG;IACI,6BAA6B,CAAC,aAA4C;QAC/E,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;QAClD,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,iBAAiB,EAAE;YACzE,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/E,IAAI,WAAW,KAAK,IAAI,EAAE;gBACxB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC7C,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;gBAC/C,kCAAkC;gBAClC,IAAI,QAAQ,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI;oBACjE,IAAI,WAAW,KAAK,IAAI,EAAE;wBACxB,OAAO,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;qBACxG;yBAAM;wBACL,OAAO,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;qBACtH;aACJ;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEF;;;MAGE;IACM,wBAAwB,CAAC,MAAwC;QACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,QAAQ,YAAY,YAAY,EAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACzI,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YACvC,OAAO,CAAC,oBAAoB,CAC1B,MAAM,CAAC,KAAK,EAAE,EACd,MAAM,CAAC,MAAM,EAAE,EACf,MAAM,CAAC,eAAe,EAAE,EACxB,MAAM,CAAC,kBAAkB,EAAE,EAC3B,MAAM,CAAC,kBAAkB,EAAE,EAC3B,MAAM,CAAC,iBAAiB,EAAG,EAC3B,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EACzG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACrG,OAAO,oBAAoB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;SACpD;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,MAAgC;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,QAAQ,YAAY,YAAY,EAAC;YACnC,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClF,OAAO,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;SAC5C;QACH,OAAO,SAAS,CAAC;IACjB,CAAC;IACD;;;SAGK;IACI,gBAAgB,CAAC,MAAkC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAC3C,kCAAkC;QAClC,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;YACrC,IAAI,YAAY,KAAK,IAAI,EAAE;gBACzB,OAAO,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;iBAAM;gBACL,OAAO,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACvF;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,oBAAoB,CAAC,MAAsC;QAChE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,YAAY,EAAE;YAChB,MAAM,kBAAkB,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YACjD,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,cAAc,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;YACxF,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,EAAE,CAAC;YACvD,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,EAAE,CAAC;YACvD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAC1D,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAC1E,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAC1E,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC7E,SAAS,CAAC,cAAc,EAAE,CAAC;YAE7B,MAAM,sBAAsB,GAAG,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EACtE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,kBAAkB,EAAE;gBACvB,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,gCAAgC,CAC1E,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,EACpH,UAAU,CAAC,qBAAqB,CAAC,eAAe,EAAE,eAAe,CAAC,EAClE,sBAAsB,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;gBACxD,IAAI,gBAAgB;oBAClB,OAAO,gBAAgB,CAAC;gBAC1B,MAAM,OAAO,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBACjE,MAAM,OAAO,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBACjE,MAAM,SAAS,GAAG,kBAAkB,CAAC,mCAAmC,CAAC,OAAO,EAAE,OAAO,EACvF,eAAe,GAAG,eAAe,CAAC,CAAC;gBACrC,MAAM,YAAY,GAAG,cAAc,CAAC,yBAAyB,CAC3D,cAAe,EACf,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,EACpC,KAAK,CAAC,aAAa,CAAE,eAAe,CAAC,EACrC,SAAS,EACT,sBAAsB,EACtB,YAAY,CAAC,CAAC;gBAChB,IAAI,YAAY;oBACd,OAAO,YAAY,CAAC;aACvB;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,6BAA6B,CAAC,OAAsC;QACzE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC5C,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc,EAAE;YACtE,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9E,MAAM,mBAAmB,GAAG,mBAAoB,CAAC,OAAO,EAAE,CAAC;YAC3D,OAAO,aAAa,CAAC,YAAY,CAC/B,mBAAoB,CAAC,OAAO,EAAE,EAAE,mBAAoB,CAAC,OAAO,EAAE,EAAE,mBAAoB,CAAC,OAAO,EAAE,EAC9F,mBAAoB,CAAC,OAAO,EAAE,EAAE,mBAAoB,CAAC,OAAO,EAAE,EAAE,mBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC;SACnG;aAAM,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc,EAAE;YAC7E,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9E,MAAM,mBAAmB,GAAG,mBAAoB,CAAC,GAAG,EAAG,CAAC;YACxD,OAAO,KAAK,CAAC,eAAe,CAC1B,mBAAmB,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,OAAO,EAAE,EAC3F,mBAAmB,CAAC,QAAQ,EAAE,EAAE,mBAAmB,CAAC,QAAQ,EAAE,EAAE,mBAAmB,CAAC,QAAQ,EAAE,EAC9F,mBAAmB,CAAC,SAAS,EAAE,EAAE,mBAAmB,CAAC,SAAS,EAAE,EAAE,mBAAmB,CAAC,SAAS,EAAE,EACjG,UAAU,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,YAAY,EAAE,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,YAAY,EAAE,CAAC,CAAC,CAAC;SAChH;aAAM,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,aAAa,EAAE;YAC5E,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,CAAE,CAAC;YAC7E,MAAM,cAAc,GAAG,kBAAkB,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE;gBAC9C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;aAClI;YACD,OAAO,MAAM,CAAC;SACf;aAAM,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,eAAe,EAAE;YAC9E,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1E,IAAI,cAAc,KAAK,IAAI;gBACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;SAChD;aAAM,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,mBAAmB,EAAE;YAClF,MAAM,6BAA6B,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC7F,IAAI,6BAA6B,KAAK,IAAI;gBACxC,OAAO,IAAI,CAAC,oBAAoB,CAAC,6BAA6B,CAAC,CAAC;SACnE;aAAM,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,qBAAqB,EAAE;YAClF,MAAM,+BAA+B,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACjG,IAAI,+BAA+B,KAAK,IAAI;gBAC5C,OAAO,IAAI,CAAC,wBAAwB,CAAC,+BAA+B,CAAC,CAAC;SACzE;aAAM,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,aAAa,EAAE;YACxE,MAAM,uBAAuB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;YACjF,IAAI,uBAAuB,KAAK,IAAI;gBAClC,OAAO,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;SAC7D;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,0BAA0B,CAAC,OAAsC;QACtE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC5C,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc,EAAE;YACtE,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,CAAE,CAAC;YAC9E,MAAM,cAAc,GAAG,kBAAkB,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE;gBAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC;aACzI;YACD,OAAO,MAAM,CAAC;SACf;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;KAGC;IACM,0BAA0B,CAAC,iBAA8D;QAC9F,IAAI,iBAAiB,KAAK,IAAI,EAAE;YAC9B,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,MAAM,KAAK,IAAI;gBACjB,OAAO,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SAC5C;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;KAGC;IACM,sBAAsB,CAAC,aAAsD;QAClF,IAAI,aAAa,EAAE;YACjB,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,gBAAgB,GAAqB,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;YAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,IAAI,WAAW;oBACb,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACtC;YACD,OAAO,IAAI,UAAU,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAC/G;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;KAGC;IACM,mBAAmB,CAAC,aAAmD;QAC5E,IAAI,aAAa,EAAE;YACjB,MAAM,cAAc,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACtD,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;YAClD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAiB,EAAE,CAAC;YAClC,IAAI,IAAI,KAAK,YAAY,EAAE;gBACzB,KAAK,MAAM,CAAC,IAAI,YAAY;oBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACnB;YACD,IAAI,CAAC,KAAK,cAAc,EAAE;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;oBACvC,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAChD,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;oBAClE,IAAI,cAAc;wBAChB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;iBACjC;aACF;YACD,OAAO,IAAI,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAC/C;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;KAGC;IACM,qBAAqB,CAAC,QAAqD;QAChF,IAAI,QAAQ,EAAE;YACZ,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAClF,MAAM,YAAY,GAAG,eAAe,CAAa,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1E,MAAM,eAAe,GAAG,eAAe,CAAe,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;YAClF,IAAI,YAAY,EAAE;gBAChB,iBAAiB,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,YAAY;oBAC1B,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAErC;YACD,IAAI,eAAe,EAAE;gBACnB,iBAAiB,CAAC,UAAU,GAAG,EAAE,CAAC;gBAClC,KAAK,MAAM,CAAC,IAAI,eAAe;oBAC7B,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACxC;YACD,OAAO,iBAAiB,CAAC;SAC1B;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;KAGC;IACM,uBAAuB,CAAC,OAAsC;QACnE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC5C,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,WAAW,EAAE;YACnE,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,IAAI,cAAc,EAAE;gBAClB,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;gBAC3C,MAAM,eAAe,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;gBACzD,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,CAAC;gBAE/C,MAAM,QAAQ,GAAG,eAAe,CAAe,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC5E,MAAM,QAAQ,GAAG,eAAe,CAAe,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC5E,MAAM,SAAS,GAAG,eAAe,CAAe,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9E,MAAM,WAAW,GAAG,eAAe,CAAc,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;gBAEjF,MAAM,aAAa,GAAG,eAAe,CAAa,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;gBACpF,MAAM,aAAa,GAAG,eAAe,CAAa,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;gBACpF,MAAM,cAAc,GAAG,eAAe,CAAa,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACtF,MAAM,aAAa,GAAG,eAAe,CAAa,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;gBACpF,MAAM,uBAAuB,GAAG,cAAc,CAAC,iBAAiB,EAAE,CAAC;gBACnE,IAAI,SAAS,KAAK,CAAC,IAAI,QAAQ,IAAI,aAAa,EAAE;oBAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,QAAQ,KAAK,SAAS,EAAE,WAAW,KAAK,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC9H,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;oBAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAA,EAAE,CAAC,IAAI,CAAC;wBAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC7E,IAAI,QAAQ,EAAE;wBACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAA,EAAE,CAAC,IAAI,CAAC;4BAC9C,QAAQ,CAAC,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBAC7D;oBACD,IAAI,SAAS,EAAE;wBACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,CAAA,EAAE,CAAC,IAAI,CAAC;4BAC/C,QAAQ,CAAC,IAAI,CAAC,MAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACnF;oBACD,IAAI,WAAW,EAAE;wBACf,KAAK,MAAM,CAAC,IAAI,WAAW;4BACzB,QAAQ,CAAC,IAAI,CAAC,KAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBAChC;oBACD,oCAAoC;oBACpC,6EAA6E;oBAC7E,kDAAkD;oBAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC;oBACtC,MAAM,iBAAiB,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE;wBACnD,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;4BAC5B,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;4BAC3B,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;4BAC/C,IAAI,SAAS,IAAI,cAAc,EAAE;gCAC/B,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;6BAC1D;4BACD,IAAI,QAAQ,IAAI,aAAa,EAAE;gCAC7B,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;6BACxD;4BACD,IAAI,WAAW,IAAI,aAAa,EAAE;gCAChC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;6BACxD;yBACF;oBACH,CAAC,CAAC;oBAEF,IAAI,UAAU,GAAG,CAAC,EAAE;wBAClB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,IAAI,QAAQ,EAAE,EAAE,IAAI,UAAU,EAAC;4BAC7D,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;4BACvC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;yBAC/B;qBACF;yBAAM;wBACL,IAAI,EAAE,GAAG,CAAC,CAAC;wBACX,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE;4BACrC,IAAI,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;gCAC3B,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gCAC1B,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gCAC9B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;6BACX;yBACF;qBACF;oBAEH,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC3E,IAAI,uBAAuB,EAAE;wBACzB,MAAM,yBAAyB,GAAG,eAAe,CAAkC,uBAAuB,CAAC,CAAC;wBAC5G,IAAI,yBAAyB,KAAK,SAAS,EAAE;4BAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;4BAChF,IAAI,iBAAiB,KAAK,SAAS;gCACjC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;yBAC3D;qBACF;oBACD,OAAO,QAAQ,CAAC;iBACjB;aACF;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,uCAAuC,CAAC,OAAkC;QAC/E,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,0BAA0B,CAAC,cAAc,CAAC,CAAC;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,WAAW,KAAK,IAAI,EAAE;gBACxB,MAAM,KAAK,GAAG,IAAI,CAAC,6BAA6B,CAAC,WAAW,CAAC,CAAC;gBAC9D,IAAI,KAAK;oBACP,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;qBAC3B;oBACH,MAAM,eAAe,GAAG,IAAI,CAAC,sCAAsC,CAAC,WAAW,CAAC,CAAC;oBACjF,IAAI,eAAe;wBACjB,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;iBAC3C;aACF;SACF;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD;;;KAGC;IACM,sCAAsC,CAAC,OAAsC;QAClF,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC5C,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc,EAAE;YACtE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,CAAE,CAAC;YACnE,OAAO,IAAI,CAAC,uCAAuC,CAAC,OAAO,CAAC,CAAC;SAC9D;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;KAGC;IACM,6BAA6B,CAAC,OAAsC;QACzE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC5C,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,SAAS,EAAE;YACjE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAO,CAAC,MAAM,EAAG,CAAC;YACjC,OAAO,GAAG,CAAC,YAAY,CACrB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,EAChF,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EACxE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EACxE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,EAC7E,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAC5D,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SACpB;QAAC,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,YAAY,EAAE;YACtE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAO,CAAC,MAAM,EAAG,CAAC;YACjC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,EAAG,CAAC;YAC1C,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAC5C,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EACtE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EACtE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1E,OAAO,MAAM,CAAC,eAAe,CAAC,YAAY,EACxC,UAAU,CAAC,uBAAuB,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,oBAAoB,EAAE,CAAC,EAChG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SACpB;QAAC,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,UAAU,EAAE;YACpE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAO,CAAC,MAAM,EAAG,CAAC;YACjC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SACzG;QAAC,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,eAAe,EAAE;YACzE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,YAAY,EAAE,CAAE,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAG,CAAC;YAChC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzF,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACzC,OAAO,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SAC7I;QAAC,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,eAAe,EAAE;YACzE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,YAAY,EAAE,CAAE,CAAC;YACnE,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,SAAS,KAAK,IAAI,EAAE;gBACtB,MAAM,OAAO,GAAG,IAAI,CAAC,uCAAuC,CAAC,SAAS,CAAC,CAAC;gBACxE,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;aACtE;SACF;QAAC,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,qBAAqB,EAAE;YAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAE,CAAC;YACzE,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACrG,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC9D,wCAAwC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,SAAS,KAAK,IAAI,EAAE;gBACtB,MAAM,OAAO,GAAG,IAAI,CAAC,uCAAuC,CAAC,SAAS,CAAC,CAAC;gBACxE,OAAO,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;aAC3E;SACF;QAAC,IAAI,YAAY,KAAK,aAAa,CAAC,oBAAoB,CAAC,gBAAgB,EAAE;YAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,aAAa,EAAE,CAAE,CAAC;YACpE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAsB,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,YAAY,EAAE;oBAChB,MAAM,OAAO,GAAG,IAAI,CAAC,uCAAuC,CAAC,YAAY,CAAC,CAAC;oBAC3E,IAAI,OAAO;wBACT,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC1B;aACF;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,OAAO,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;aACrD;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,4BAA4B,CAAC,OAAsC;QACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QACxC,QAAQ,QAAQ,EAAE;YAChB,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc,CAAC;YACvD,KAAK,aAAa,CAAC,oBAAoB,CAAC,aAAa,CAAC;YACtD,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc,CAAC;YACvD,KAAK,aAAa,CAAC,oBAAoB,CAAC,eAAe,CAAC;YACxD,KAAK,aAAa,CAAC,oBAAoB,CAAC,mBAAmB,CAAC;YAC5D,KAAK,aAAa,CAAC,oBAAoB,CAAC,qBAAqB,CAAC;YAC5D,KAAK,aAAa,CAAC,oBAAoB,CAAC,aAAa;gBACnD;oBACA,OAAO,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;iBACpD;YACH,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc;gBACpD;oBACE,OAAO,IAAI,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAC;iBAC7D;YACH,KAAK,aAAa,CAAC,oBAAoB,CAAC,WAAW;gBACjD;oBACE,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;iBAC9C;YACH,KAAK,aAAa,CAAC,oBAAoB,CAAC,SAAS,CAAC;YAClD,KAAK,aAAa,CAAC,oBAAoB,CAAC,UAAU,CAAC;YACnD,KAAK,aAAa,CAAC,oBAAoB,CAAC,eAAe,CAAC;YACxD,KAAK,aAAa,CAAC,oBAAoB,CAAC,YAAY,CAAC;YACrD,KAAK,aAAa,CAAC,oBAAoB,CAAC,eAAe,CAAC;YACxD,KAAK,aAAa,CAAC,oBAAoB,CAAC,qBAAqB,CAAC;YAC9D,KAAK,aAAa,CAAC,oBAAoB,CAAC,gBAAgB;gBACtD;oBACE,OAAO,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;iBACpD;YACH,KAAK,aAAa,CAAC,oBAAoB,CAAC,0BAA0B;gBAChE;oBACE,MAAM,QAAQ,GAAoB,EAAE,CAAC;oBACrC,MAAM,+BAA+B,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,uBAAuB,EAAE,CAAC,CAAC;oBACtG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,+BAAgC,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;wBACzE,MAAM,KAAK,GAAG,+BAAgC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;wBAC1D,IAAI,KAAK,KAAK,IAAI,EAAE;4BAClB,MAAM,aAAa,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;4BAC/D,IAAI,aAAa,YAAY,aAAa,EAAE;gCAC1C,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;6BAC9B;iCAAM,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gCACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;6BACjC;yBACF;qBACF;oBACD,OAAO,QAAQ,CAAC;iBACjB;YACH,KAAK,aAAa,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;aACpD;YACD,KAAK,aAAa,CAAC,oBAAoB,CAAC,cAAc;gBACpD;oBACE,OAAO,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;iBACjD;SACJ;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,QAAoB,EAAE,SAAsB;QACxE,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,SAAS,EAAE;YACb,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;gBACpC,OAAO,SAAS,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;gBACvC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;YACrB,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SAC7C;QACD,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;CAEF;AACD;;;GAGG;AACH,SAAS,eAAe,CAAI,IAAS;IACnC,IAAI,IAAI,KAAK,IAAI;QACf,OAAO,SAAS,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,0BAA0B,CAAC,cAAsB;IACxD,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC;IAC5C,IAAI,cAAc,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC;IACpE,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO,IAAI,YAAY,EAAE,CAAC;IACpD,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO,IAAI,WAAW,EAAE,CAAC;IACnD,OAAO,IAAI,WAAW,EAAE,CAAC;AAC3B,CAAC;AACD;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IAwB/B,8EAA8E;IACvE,MAAM,CAAC,gBAAgB,CAAC,QAAgB;QAC7C,KAAK,MAAM,KAAK,IAAI,oBAAoB,CAAC,iBAAiB,EAAE;YAC1D,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBACvB,OAAO,KAAK,CAAC,CAAC,CAAW,CAAC;SAC7B;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uDAAuD;IAChD,MAAM,CAAC,gBAAgB,CAAC,CAAS,EAAE,oBAA6B,IAAI;QACzE,KAAK,MAAM,KAAK,IAAI,oBAAoB,CAAC,iBAAiB,EAAE;YAC1D,IAAI,QAAQ,CAAC,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAW,CAAC;gBACnD,OAAO,KAAK,CAAC,CAAC,CAAW,CAAC;SAC7B;QACD,OAAO,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5C,CAAC;IACD,0DAA0D;IACnD,MAAM,CAAC,kBAAkB,CAAC,QAAgB;QAC/C,OAAO,QAAQ,IAAI,EAAE,CAAC;IACxB,CAAC;;AA3CD,iEAAiE;AACjE,qDAAqD;AACtC,sCAAiB,GAAG;IACjC,CAAC,EAAE,EAAE,UAAU,CAAC;IAChB,CAAC,EAAE,EAAE,OAAO,CAAC;IACb,CAAC,EAAE,EAAE,aAAa,CAAC;IACnB,CAAC,EAAE,EAAE,QAAQ,CAAC;IACd,CAAC,EAAE,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,EAAE,UAAU,CAAC;IAChB,CAAC,EAAE,EAAE,kBAAkB,CAAC;IAExB,CAAC,EAAE,EAAE,mBAAmB,CAAC;IACzB,CAAC,EAAE,EAAE,OAAO,CAAC;IACb,CAAC,EAAE,EAAE,oBAAoB,CAAC;IAC1B,CAAC,EAAE,EAAE,SAAS,CAAC;IACf,CAAC,EAAE,EAAE,aAAa,CAAC;IACnB,CAAC,EAAE,EAAE,OAAO,CAAC;IACb,CAAC,EAAE,EAAE,iBAAiB,CAAC;IACvB,CAAC,EAAE,EAAE,qBAAqB,CAAC;IAC3B,CAAC,EAAE,EAAE,cAAc,CAAC;IACpB,CAAC,EAAE,EAAE,YAAY,CAAC;IAClB,CAAC,EAAE,EAAE,eAAe,CAAC;CACtB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Serialization\r\n */\r\nimport { flatbuffers } from \"flatbuffers\";\r\nimport { BGFBAccessors } from \"./BGFBAccessors\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { IndexedPolyface } from \"../polyface/Polyface\";\r\nimport { BagOfCurves, CurveCollection } from \"../curve/CurveCollection\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { UnionRegion } from \"../curve/UnionRegion\";\r\nimport { ParityRegion } from \"../curve/ParityRegion\";\r\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { SolidPrimitive } from \"../solid/SolidPrimitive\";\r\nimport { Box } from \"../solid/Box\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Sphere } from \"../solid/Sphere\";\r\nimport { Cone } from \"../solid/Cone\";\r\nimport { TorusPipe } from \"../solid/TorusPipe\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { LinearSweep } from \"../solid/LinearSweep\";\r\nimport { RotationalSweep } from \"../solid/RotationalSweep\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { RuledSweep } from \"../solid/RuledSweep\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { BSplineSurface3d, BSplineSurface3dH } from \"../bspline/BSplineSurface\";\r\nimport { PointString3d } from \"../curve/PointString3d\";\r\nimport { AuxChannel, AuxChannelData, PolyfaceAuxData } from \"../polyface/AuxData\";\r\nimport { TransitionSpiral3d } from \"../curve/spiral/TransitionSpiral3d\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Segment1d } from \"../geometry3d/Segment1d\";\r\nimport { IntegratedSpiral3d } from \"../curve/spiral/IntegratedSpiral3d\";\r\nimport { DirectSpiral3d } from \"../curve/spiral/DirectSpiral3d\";\r\nimport { TaggedNumericData } from \"../polyface/TaggedNumericData\";\r\nimport { InterpolationCurve3d, InterpolationCurve3dOptions } from \"../bspline/InterpolationCurve3d\";\r\nimport { NumberArray, Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { AkimaCurve3d, AkimaCurve3dOptions } from \"../bspline/AkimaCurve3d\";\r\n\r\n/** * Context to write to a flatbuffer blob.\r\n * * This class is internal.\r\n * * Public access is through BentleyGeometryFlatBuffer.geometryToBytes()\r\n * @internal\r\n */\r\nexport class BGFBReader {\r\n public constructor() {\r\n }\r\n /**\r\n * Extract a bspline surface\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readBSplineSurfaceFromVariant(variantHeader: BGFBAccessors.VariantGeometry): BSplineSurface3d | BSplineSurface3dH | undefined {\r\n const geometryType = variantHeader.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagBsplineSurface) {\r\n const bsurfHeader = variantHeader.geometry(new BGFBAccessors.BsplineSurface());\r\n if (bsurfHeader !== null) {\r\n const orderU = bsurfHeader.orderU();\r\n const orderV = bsurfHeader.orderV();\r\n const numPolesU = bsurfHeader.numPolesU();\r\n const numPolesV = bsurfHeader.numPolesV();\r\n const xyzArray = bsurfHeader.polesArray();\r\n const knotArrayU = bsurfHeader.knotsUArray();\r\n const knotArrayV = bsurfHeader.knotsVArray();\r\n const weightArray = bsurfHeader.weightsArray();\r\n // const closed = header.closed();\r\n if (xyzArray !== null && knotArrayU !== null && knotArrayV !== null)\r\n if (weightArray === null) {\r\n return BSplineSurface3d.create(xyzArray, numPolesU, orderU, knotArrayU, numPolesV, orderV, knotArrayV);\r\n } else {\r\n return BSplineSurface3dH.create(xyzArray, weightArray, numPolesU, orderU, knotArrayU, numPolesV, orderV, knotArrayV);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Extract an interpolating curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readInterpolationCurve3d(header: BGFBAccessors.InterpolationCurve): InterpolationCurve3d | undefined {\r\n const xyzArray = header.fitPointsArray();\r\n if (xyzArray instanceof Float64Array){\r\n const knots = header.knotsArray();\r\n const options = new InterpolationCurve3dOptions(Point3dArray.clonePoint3dArray(xyzArray), knots ? NumberArray.create(knots) : undefined);\r\n const startTangent = header.startTangent();\r\n const endTangent = header.endTangent();\r\n options.captureOptionalProps(\r\n header.order(),\r\n header.closed(),\r\n header.isChordLenKnots(),\r\n header.isColinearTangents(),\r\n header.isChordLenTangents(),\r\n header.isNaturalTangents (),\r\n startTangent !== null ? Vector3d.create(startTangent.x(), startTangent.y(), startTangent.z()) : undefined,\r\n endTangent !== null ? Vector3d.create(endTangent.x(), endTangent.y(), endTangent.z()) : undefined);\r\n return InterpolationCurve3d.createCapture(options);\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Extract an akima curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readAkimaCurve3d(header: BGFBAccessors.AkimaCurve): AkimaCurve3d | undefined {\r\n const xyzArray = header.pointsArray();\r\n if (xyzArray instanceof Float64Array){\r\n const options = new AkimaCurve3dOptions(Point3dArray.clonePoint3dArray(xyzArray));\r\n return AkimaCurve3d.createCapture(options);\r\n }\r\nreturn undefined;\r\n}\r\n/**\r\n * Extract a bspline curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readBSplineCurve(header: BGFBAccessors.BsplineCurve): BSplineCurve3d | BSplineCurve3dH | undefined {\r\n const order = header.order();\r\n const xyzArray = header.polesArray();\r\n const knots = header.knotsArray();\r\n const weightsArray = header.weightsArray();\r\n // const closed = header.closed();\r\n if (xyzArray !== null && knots !== null)\r\n if (weightsArray === null) {\r\n return BSplineCurve3d.create(xyzArray, knots, order);\r\n } else {\r\n return BSplineCurve3dH.create({ xyz: xyzArray, weights: weightsArray }, knots, order);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a bspline curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readTransitionSpiral(header: BGFBAccessors.TransitionSpiral): TransitionSpiral3d | undefined {\r\n const detailHeader = header.detail();\r\n if (detailHeader) {\r\n const directDetailHeader = header.directDetail();\r\n const _extraDataArray = header.extraDataArray();\r\n const spiralTypeName = DgnSpiralTypeQueries.typeCodeToString(detailHeader.spiralType());\r\n const curvature0 = detailHeader.curvature0();\r\n const curvature1 = detailHeader.curvature1();\r\n const bearing0Radians = detailHeader.bearing0Radians();\r\n const bearing1Radians = detailHeader.bearing1Radians();\r\n const fbTransform = detailHeader.transform();\r\n const localToWorld = fbTransform ? Transform.createRowValues(\r\n fbTransform.axx(), fbTransform.axy(), fbTransform.axz(), fbTransform.axw(),\r\n fbTransform.ayx(), fbTransform.ayy(), fbTransform.ayz(), fbTransform.ayw(),\r\n fbTransform.azx(), fbTransform.azy(), fbTransform.azz(), fbTransform.azw()) :\r\n Transform.createIdentity();\r\n\r\n const activeFractionInterval = Segment1d.create(detailHeader.fractionA(),\r\n detailHeader.fractionB());\r\n if (!directDetailHeader) {\r\n const integratedSpiral = IntegratedSpiral3d.createRadiusRadiusBearingBearing(\r\n Segment1d.create(IntegratedSpiral3d.curvatureToRadius(curvature0), IntegratedSpiral3d.curvatureToRadius(curvature1)),\r\n AngleSweep.createStartEndRadians(bearing0Radians, bearing1Radians),\r\n activeFractionInterval, localToWorld, spiralTypeName);\r\n if (integratedSpiral)\r\n return integratedSpiral;\r\n const radius0 = TransitionSpiral3d.curvatureToRadius(curvature0);\r\n const radius1 = TransitionSpiral3d.curvatureToRadius(curvature1);\r\n const arcLength = TransitionSpiral3d.radiusRadiusSweepRadiansToArcLength(radius0, radius1,\r\n bearing1Radians - bearing0Radians);\r\n const directSpiral = DirectSpiral3d.createFromLengthAndRadius(\r\n spiralTypeName!,\r\n radius0, radius1,\r\n Angle.createRadians(bearing0Radians),\r\n Angle.createRadians (bearing1Radians),\r\n arcLength,\r\n activeFractionInterval,\r\n localToWorld);\r\n if (directSpiral)\r\n return directSpiral;\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a curve primitive\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readCurvePrimitiveFromVariant(variant: BGFBAccessors.VariantGeometry): CurvePrimitive | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagLineSegment) {\r\n const offsetToLineSegment = variant.geometry(new BGFBAccessors.LineSegment());\r\n const offsetToCoordinates = offsetToLineSegment!.segment();\r\n return LineSegment3d.createXYZXYZ(\r\n offsetToCoordinates!.point0X(), offsetToCoordinates!.point0Y(), offsetToCoordinates!.point0Z(),\r\n offsetToCoordinates!.point1X(), offsetToCoordinates!.point1Y(), offsetToCoordinates!.point1Z());\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagEllipticArc) {\r\n const offsetToEllipticArc = variant.geometry(new BGFBAccessors.EllipticArc());\r\n const offsetToCoordinates = offsetToEllipticArc!.arc()!;\r\n return Arc3d.createXYZXYZXYZ(\r\n offsetToCoordinates.centerX(), offsetToCoordinates.centerY(), offsetToCoordinates.centerZ(),\r\n offsetToCoordinates.vector0X(), offsetToCoordinates.vector0Y(), offsetToCoordinates.vector0Z(),\r\n offsetToCoordinates.vector90X(), offsetToCoordinates.vector90Y(), offsetToCoordinates.vector90Z(),\r\n AngleSweep.createStartSweepRadians(offsetToCoordinates.startRadians(), offsetToCoordinates?.sweepRadians()));\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagLineString) {\r\n const offsetToLineString = variant.geometry(new BGFBAccessors.LineString())!;\r\n const numCoordinates = offsetToLineString.pointsLength();\r\n const result = LineString3d.create();\r\n for (let i = 0; i + 2 < numCoordinates; i += 3) {\r\n result.packedPoints.pushXYZ(offsetToLineString.points(i)!, offsetToLineString.points(i + 1)!, offsetToLineString.points(i + 2)!);\r\n }\r\n return result;\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagBsplineCurve) {\r\n const offsetToBCurve = variant.geometry(new BGFBAccessors.BsplineCurve());\r\n if (offsetToBCurve !== null)\r\n return this.readBSplineCurve(offsetToBCurve);\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagTransitionSpiral) {\r\n const offsetToTransitionSpiralTable = variant.geometry(new BGFBAccessors.TransitionSpiral());\r\n if (offsetToTransitionSpiralTable !== null)\r\n return this.readTransitionSpiral(offsetToTransitionSpiralTable);\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagInterpolationCurve) {\r\n const offsetToInterpolationCurveTable = variant.geometry(new BGFBAccessors.InterpolationCurve());\r\n if (offsetToInterpolationCurveTable !== null)\r\n return this.readInterpolationCurve3d(offsetToInterpolationCurveTable);\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagAkimaCurve) {\r\n const offsetToAkimaCurveTable = variant.geometry(new BGFBAccessors.AkimaCurve());\r\n if (offsetToAkimaCurveTable !== null)\r\n return this.readAkimaCurve3d(offsetToAkimaCurveTable);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a curve primitive\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPointStringFromVariant(variant: BGFBAccessors.VariantGeometry): PointString3d | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagPointString) {\r\n const offsetToLineString = variant.geometry(new BGFBAccessors.PointString())!;\r\n const numCoordinates = offsetToLineString.pointsLength();\r\n const result = PointString3d.create();\r\n for (let i = 0; i + 2 < numCoordinates; i += 3) {\r\n result.points.push(Point3d.create(offsetToLineString.points(i)!, offsetToLineString.points(i + 1)!, offsetToLineString.points(i + 2)!));\r\n }\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceAuxChannelData(channelDataHeader: BGFBAccessors.PolyfaceAuxChannelData | null): AuxChannelData | undefined {\r\n if (channelDataHeader !== null) {\r\n const input = channelDataHeader.input();\r\n const values = channelDataHeader.valuesArray();\r\n if (values !== null)\r\n return new AuxChannelData(input, values);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceAuxChannel(channelHeader: BGFBAccessors.PolyfaceAuxChannel | null): AuxChannel | undefined {\r\n if (channelHeader) {\r\n const dataType = channelHeader.dataType();\r\n const dataLength = channelHeader.dataLength();\r\n const channelDataArray: AuxChannelData[] = [];\r\n const name = channelHeader.name();\r\n const inputName = channelHeader.inputName();\r\n for (let i = 0; i < dataLength; i++) {\r\n const channelData = this.readPolyfaceAuxChannelData(channelHeader.data(i));\r\n if (channelData)\r\n channelDataArray.push(channelData);\r\n }\r\n return new AuxChannel(channelDataArray, dataType, name ? name : undefined, inputName ? inputName : undefined);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceAuxData(auxDataHeader: BGFBAccessors.PolyfaceAuxData | null): PolyfaceAuxData | undefined {\r\n if (auxDataHeader) {\r\n const channelsLength = auxDataHeader.channelsLength();\r\n const indicesArray = auxDataHeader.indicesArray();\r\n const indices: number[] = [];\r\n const channels: AuxChannel[] = [];\r\n if (null !== indicesArray) {\r\n for (const i of indicesArray)\r\n indices.push(i);\r\n }\r\n if (0 !== channelsLength) {\r\n for (let i = 0; i < channelsLength; i++) {\r\n const channelHeader = auxDataHeader.channels(i);\r\n const channelContent = this.readPolyfaceAuxChannel(channelHeader);\r\n if (channelContent)\r\n channels.push(channelContent);\r\n }\r\n }\r\n return new PolyfaceAuxData(channels, indices);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readTaggedNumericData(accessor: BGFBAccessors.TaggedNumericData | undefined): TaggedNumericData | undefined {\r\n if (accessor) {\r\n const taggedNumericData = new TaggedNumericData(accessor.tagA(), accessor.tagB());\r\n const intDataArray = nullToUndefined<Int32Array>(accessor.intDataArray());\r\n const doubleDataArray = nullToUndefined<Float64Array>(accessor.doubleDataArray());\r\n if (intDataArray) {\r\n taggedNumericData.intData = [];\r\n for (const c of intDataArray)\r\n taggedNumericData.intData.push(c);\r\n\r\n }\r\n if (doubleDataArray) {\r\n taggedNumericData.doubleData = [];\r\n for (const c of doubleDataArray)\r\n taggedNumericData.doubleData.push(c);\r\n }\r\n return taggedNumericData;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceFromVariant(variant: BGFBAccessors.VariantGeometry): IndexedPolyface | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagPolyface) {\r\n const polyfaceHeader = variant.geometry(new BGFBAccessors.Polyface());\r\n if (polyfaceHeader) {\r\n const twoSided = polyfaceHeader.twoSided();\r\n const expectedClosure = polyfaceHeader.expectedClosure();\r\n const meshStyle = polyfaceHeader.meshStyle();\r\n const numPerFace = polyfaceHeader.numPerFace();\r\n\r\n const pointF64 = nullToUndefined<Float64Array>(polyfaceHeader.pointArray());\r\n const paramF64 = nullToUndefined<Float64Array>(polyfaceHeader.paramArray());\r\n const normalF64 = nullToUndefined<Float64Array>(polyfaceHeader.normalArray());\r\n const intColorU32 = nullToUndefined<Uint32Array>(polyfaceHeader.intColorArray());\r\n\r\n const pointIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.pointIndexArray());\r\n const paramIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.paramIndexArray());\r\n const normalIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.normalIndexArray());\r\n const colorIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.colorIndexArray());\r\n const taggedNumericDataOffset = polyfaceHeader.taggedNumericData();\r\n if (meshStyle === 1 && pointF64 && pointIndexI32) {\r\n const polyface = IndexedPolyface.create(normalF64 !== undefined, paramF64 !== undefined, intColorU32 !== undefined, twoSided);\r\n polyface.expectedClosure = expectedClosure;\r\n for (let i = 0; i + 2 < pointF64?.length; i += 3)\r\n polyface.data.point.pushXYZ(pointF64[i], pointF64[i + 1], pointF64[i + 2]);\r\n if (paramF64) {\r\n for (let i = 0; i + 1 < paramF64?.length; i += 2)\r\n polyface.data.param!.pushXY(paramF64[i], paramF64[i + 1]);\r\n }\r\n if (normalF64) {\r\n for (let i = 0; i + 2 < normalF64?.length; i += 3)\r\n polyface.data.normal!.pushXYZ(normalF64[i], normalF64[i + 1], normalF64[i + 2]);\r\n }\r\n if (intColorU32) {\r\n for (const c of intColorU32)\r\n polyface.data.color!.push(c);\r\n }\r\n // The flatbuffer data is one based.\r\n // If numPerFace is less than 2, facets are variable size and zero terminated\r\n // If numPerFace is 2 or more, indices are blocked\r\n const numIndex = pointIndexI32.length;\r\n const addIndicesInBlock = (k0: number, k1: number) => {\r\n for (let k = k0; k < k1; k++) {\r\n const q = pointIndexI32[k];\r\n polyface.addPointIndex(Math.abs(q) - 1, q > 0);\r\n if (normalF64 && normalIndexI32) {\r\n polyface.addNormalIndex(Math.abs(normalIndexI32[k]) - 1);\r\n }\r\n if (paramF64 && paramIndexI32) {\r\n polyface.addParamIndex(Math.abs(paramIndexI32[k]) - 1);\r\n }\r\n if (intColorU32 && colorIndexI32) {\r\n polyface.addColorIndex(Math.abs(colorIndexI32[k]) - 1);\r\n }\r\n }\r\n };\r\n\r\n if (numPerFace > 1) {\r\n for (let i0 = 0; i0 + numPerFace <= numIndex; i0 += numPerFace){\r\n addIndicesInBlock(i0, i0 + numPerFace);\r\n polyface.terminateFacet(true);\r\n }\r\n } else {\r\n let i0 = 0;\r\n for (let i1 = i0; i1 < numIndex; i1++) {\r\n if (pointIndexI32[i1] === 0) {\r\n addIndicesInBlock(i0, i1);\r\n polyface.terminateFacet(true);\r\n i0 = i1 + 1;\r\n }\r\n }\r\n }\r\n\r\n polyface.data.auxData = this.readPolyfaceAuxData(polyfaceHeader.auxData());\r\n if (taggedNumericDataOffset) {\r\n const taggedNumericDataAccessor = nullToUndefined<BGFBAccessors.TaggedNumericData>(taggedNumericDataOffset);\r\n if (taggedNumericDataAccessor !== undefined) {\r\n const taggedNumericData = this.readTaggedNumericData(taggedNumericDataAccessor);\r\n if (taggedNumericData !== undefined)\r\n polyface.data.setTaggedNumericData(taggedNumericData);\r\n }\r\n }\r\n return polyface;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n public readCurveCollectionFromCurveVectorTable(cvTable: BGFBAccessors.CurveVector): CurveCollection {\r\n const numChildren = cvTable.curvesLength();\r\n const collectionType = cvTable.type();\r\n const collection = createTypedCurveCollection(collectionType);\r\n for (let i = 0; i < numChildren; i++) {\r\n const childOffset = cvTable.curves(i);\r\n if (childOffset !== null) {\r\n const child = this.readCurvePrimitiveFromVariant(childOffset);\r\n if (child)\r\n collection.tryAddChild(child);\r\n else {\r\n const childCollection = this.readCurveCollectionFromVariantGeometry(childOffset);\r\n if (childCollection)\r\n collection.tryAddChild(childCollection);\r\n }\r\n }\r\n }\r\n return collection;\r\n }\r\n /**\r\n * Extract a curve collection\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readCurveCollectionFromVariantGeometry(variant: BGFBAccessors.VariantGeometry): CurveCollection | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagCurveVector) {\r\n const cvTable = variant.geometry(new BGFBAccessors.CurveVector())!;\r\n return this.readCurveCollectionFromCurveVectorTable(cvTable);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a curve collection\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readSolidPrimitiveFromVariant(variant: BGFBAccessors.VariantGeometry): SolidPrimitive | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnBox) {\r\n const header = variant.geometry(new BGFBAccessors.DgnBox());\r\n const detail = header!.detail()!;\r\n return Box.createDgnBox(\r\n Point3d.create(detail.baseOriginX(), detail.baseOriginY(), detail.baseOriginZ()),\r\n Vector3d.create(detail.vectorXX(), detail.vectorXY(), detail.vectorXZ()),\r\n Vector3d.create(detail.vectorYX(), detail.vectorYY(), detail.vectorYZ()),\r\n Point3d.create(detail.topOriginX(), detail.topOriginY(), detail.topOriginZ()),\r\n detail.baseX(), detail.baseY(), detail.topX(), detail.topY(),\r\n detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnSphere) {\r\n const header = variant.geometry(new BGFBAccessors.DgnSphere());\r\n const detail = header!.detail()!;\r\n const lToWDetail = detail.localToWorld()!;\r\n const localToWorld = Transform.createRowValues(\r\n lToWDetail.axx(), lToWDetail.axy(), lToWDetail.axz(), lToWDetail.axw(),\r\n lToWDetail.ayx(), lToWDetail.ayy(), lToWDetail.ayz(), lToWDetail.ayw(),\r\n lToWDetail.azx(), lToWDetail.azy(), lToWDetail.azz(), lToWDetail.azw());\r\n return Sphere.createEllipsoid(localToWorld,\r\n AngleSweep.createStartSweepRadians(detail.startLatitudeRadians(), detail.latitudeSweepRadians()),\r\n detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnCone) {\r\n const header = variant.geometry(new BGFBAccessors.DgnCone());\r\n const detail = header!.detail()!;\r\n const centerA = Point3d.create(detail.centerAX(), detail.centerAY(), detail.centerAZ());\r\n const centerB = Point3d.create(detail.centerBX(), detail.centerBY(), detail.centerBZ());\r\n const vector0 = Vector3d.create(detail.vector0X(), detail.vector0Y(), detail.vector0Z());\r\n const vector90 = Vector3d.create(detail.vector90X(), detail.vector90Y(), detail.vector90Z());\r\n const radiusA = detail.radiusA();\r\n const radiusB = detail.radiusB();\r\n return Cone.createBaseAndTarget(centerA, centerB, vector0, vector90, radiusA, radiusB, detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnTorusPipe) {\r\n const header = variant.geometry(new BGFBAccessors.DgnTorusPipe())!;\r\n const detail = header.detail()!;\r\n const center = Point3d.create(detail.centerX(), detail.centerY(), detail.centerZ());\r\n const vectorX = Vector3d.create(detail.vectorXX(), detail.vectorXY(), detail.vectorXZ());\r\n const vectorY = Vector3d.create(detail.vectorYX(), detail.vectorYY(), detail.vectorYZ());\r\n const sweepRadians = detail.sweepRadians();\r\n const majorRadius = detail.majorRadius();\r\n const minorRadius = detail.minorRadius();\r\n return TorusPipe.createDgnTorusPipe(center, vectorX, vectorY, majorRadius, minorRadius, Angle.createRadians(sweepRadians), detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnExtrusion) {\r\n const header = variant.geometry(new BGFBAccessors.DgnExtrusion())!;\r\n const dVector = new BGFBAccessors.DVector3d();\r\n header.extrusionVector(dVector);\r\n const extrusionVector = Vector3d.create(dVector.x(), dVector.y(), dVector.z());\r\n const baseCurve = header.baseCurve();\r\n if (baseCurve !== null) {\r\n const contour = this.readCurveCollectionFromCurveVectorTable(baseCurve);\r\n return LinearSweep.create(contour, extrusionVector, header.capped());\r\n }\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnRotationalSweep) {\r\n const header = variant.geometry(new BGFBAccessors.DgnRotationalSweep())!;\r\n const dAxis = new BGFBAccessors.DRay3d();\r\n header.axis(dAxis);\r\n const axis = Ray3d.createXYZUVW(dAxis.x(), dAxis.y(), dAxis.z(), dAxis.ux(), dAxis.uy(), dAxis.uz());\r\n const sweepAngle = Angle.createRadians(header.sweepRadians());\r\n // const numVRules = header.numVRules();\r\n const baseCurve = header.baseCurve();\r\n if (baseCurve !== null) {\r\n const contour = this.readCurveCollectionFromCurveVectorTable(baseCurve);\r\n return RotationalSweep.create(contour, axis, sweepAngle, header.capped());\r\n }\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnRuledSweep) {\r\n const header = variant.geometry(new BGFBAccessors.DgnRuledSweep())!;\r\n const numCurves = header.curvesLength();\r\n const contours: CurveCollection[] = [];\r\n for (let i = 0; i < numCurves; i++) {\r\n const contourTable = header.curves(i);\r\n if (contourTable) {\r\n const contour = this.readCurveCollectionFromCurveVectorTable(contourTable);\r\n if (contour)\r\n contours.push(contour);\r\n }\r\n }\r\n if (contours.length > 0) {\r\n return RuledSweep.create(contours, header.capped());\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract any geometry type or array of geometry.\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readGeometryQueryFromVariant(variant: BGFBAccessors.VariantGeometry): GeometryQuery | GeometryQuery[] | undefined {\r\n const rootType = variant.geometryType();\r\n switch (rootType) {\r\n case BGFBAccessors.VariantGeometryUnion.tagLineSegment:\r\n case BGFBAccessors.VariantGeometryUnion.tagLineString:\r\n case BGFBAccessors.VariantGeometryUnion.tagEllipticArc:\r\n case BGFBAccessors.VariantGeometryUnion.tagBsplineCurve:\r\n case BGFBAccessors.VariantGeometryUnion.tagTransitionSpiral:\r\n case BGFBAccessors.VariantGeometryUnion.tagInterpolationCurve:\r\n case BGFBAccessors.VariantGeometryUnion.tagAkimaCurve:\r\n {\r\n return this.readCurvePrimitiveFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagCurveVector:\r\n {\r\n return this.readCurveCollectionFromVariantGeometry(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagPolyface:\r\n {\r\n return this.readPolyfaceFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnBox:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnCone:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnTorusPipe:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnSphere:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnExtrusion:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnRotationalSweep:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnRuledSweep:\r\n {\r\n return this.readSolidPrimitiveFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagVectorOfVariantGeometry:\r\n {\r\n const geometry: GeometryQuery[] = [];\r\n const offsetToVectorOfVariantGeometry = variant.geometry(new BGFBAccessors.VectorOfVariantGeometry());\r\n for (let i = 0; i < offsetToVectorOfVariantGeometry!.membersLength(); i++) {\r\n const child = offsetToVectorOfVariantGeometry!.members(i);\r\n if (child !== null) {\r\n const childGeometry = this.readGeometryQueryFromVariant(child);\r\n if (childGeometry instanceof GeometryQuery) {\r\n geometry.push(childGeometry);\r\n } else if (Array.isArray(childGeometry)) {\r\n geometry.push(...childGeometry);\r\n }\r\n }\r\n }\r\n return geometry;\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagBsplineSurface: {\r\n return this.readBSplineSurfaceFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagPointString:\r\n {\r\n return this.readPointStringFromVariant(variant);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Deserialize bytes from a flatbuffer.\r\n * @param justTheBytes FlatBuffer bytes as created by BGFBWriter.createFlatBuffer (g);\r\n */\r\n public static bytesToGeometry(theBytes: Uint8Array, signature?: Uint8Array): GeometryQuery | GeometryQuery[] | undefined {\r\n const newByteBuffer = new flatbuffers.ByteBuffer(theBytes);\r\n if (signature) {\r\n if (theBytes.length < signature.length)\r\n return undefined;\r\n for (let i = 0; i < signature.length; i++)\r\n if (theBytes[i] !== signature[i])\r\n return undefined;\r\n newByteBuffer.setPosition(signature.length);\r\n }\r\n const root = BGFBAccessors.VariantGeometry.getRootAsVariantGeometry(newByteBuffer);\r\n const reader = new BGFBReader();\r\n return reader.readGeometryQueryFromVariant(root);\r\n }\r\n\r\n}\r\n/**\r\n * if data is \"null\" (the deprecated javascript idiom!) return undefined. Otherwise return the data as its own type.\r\n * @param data\r\n */\r\nfunction nullToUndefined<T>(data: any): T | undefined {\r\n if (data === null)\r\n return undefined;\r\n return data;\r\n}\r\n\r\nfunction createTypedCurveCollection(collectionType: number): CurveCollection {\r\n if (collectionType === 1) return new Path();\r\n if (collectionType === 2 || collectionType === 3) return new Loop();\r\n if (collectionType === 4) return new ParityRegion();\r\n if (collectionType === 5) return new UnionRegion();\r\n return new BagOfCurves();\r\n}\r\n/**\r\n * mappings between typescript spiral type strings and native integers.\r\n * @internal\r\n */\r\nexport class DgnSpiralTypeQueries {\r\n // remark: this is the full list based on native DSpiral2dBase.h.\r\n // This does not guarantee all types are supported.\r\n private static spiralTypeCodeMap = [\r\n [10, \"clothoid\"],\r\n [11, \"bloss\"],\r\n [12, \"biquadratic\"],\r\n [13, \"cosine\"],\r\n [14, \"sine\"],\r\n [15, \"Viennese\"],\r\n [16, \"weightedViennese\"],\r\n\r\n [50, \"WesternAustralian\"],\r\n [51, \"Czech\"],\r\n [52, \"AustralianRailCorp\"],\r\n [53, \"Italian\"],\r\n [54, \"PolishCubic\"],\r\n [55, \"Arema\"],\r\n [56, \"MXCubicAlongArc\"],\r\n [57, \"MXCubicAlongTangent\"],\r\n [58, \"ChineseCubic\"],\r\n [60, \"HalfCosine\"],\r\n [61, \"JapaneseCubic\"],\r\n ];\r\n /** Convert native integer type (e.g. from flatbuffer) to typescript string */\r\n public static typeCodeToString(typeCode: number): string | undefined {\r\n for (const entry of DgnSpiralTypeQueries.spiralTypeCodeMap) {\r\n if (entry[0] === typeCode)\r\n return entry[1] as string;\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Convert typescript string to native integer type */\r\n public static stringToTypeCode(s: string, defaultToClothoid: boolean = true): number | undefined {\r\n for (const entry of DgnSpiralTypeQueries.spiralTypeCodeMap) {\r\n if (Geometry.equalStringNoCase(s, entry[1] as string))\r\n return entry[0] as number;\r\n }\r\n return defaultToClothoid ? 10 : undefined;\r\n }\r\n /** Ask if the indicated type code is a \"direct\" spiral */\r\n public static isDirectSpiralType(typeCode: number): boolean {\r\n return typeCode >= 50;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BGFBReader.js","sourceRoot":"","sources":["../../../src/serialization/BGFBReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Serialization\r\n */\r\nimport { flatbuffers } from \"flatbuffers\";\r\nimport { BGFBAccessors } from \"./BGFBAccessors\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { IndexedPolyface } from \"../polyface/Polyface\";\r\nimport { BagOfCurves, CurveCollection } from \"../curve/CurveCollection\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { UnionRegion } from \"../curve/UnionRegion\";\r\nimport { ParityRegion } from \"../curve/ParityRegion\";\r\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { SolidPrimitive } from \"../solid/SolidPrimitive\";\r\nimport { Box } from \"../solid/Box\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Sphere } from \"../solid/Sphere\";\r\nimport { Cone } from \"../solid/Cone\";\r\nimport { TorusPipe } from \"../solid/TorusPipe\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { LinearSweep } from \"../solid/LinearSweep\";\r\nimport { RotationalSweep } from \"../solid/RotationalSweep\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { RuledSweep } from \"../solid/RuledSweep\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { BSplineSurface3d, BSplineSurface3dH } from \"../bspline/BSplineSurface\";\r\nimport { PointString3d } from \"../curve/PointString3d\";\r\nimport { AuxChannel, AuxChannelData, PolyfaceAuxData } from \"../polyface/AuxData\";\r\nimport { TransitionSpiral3d } from \"../curve/spiral/TransitionSpiral3d\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Segment1d } from \"../geometry3d/Segment1d\";\r\nimport { IntegratedSpiral3d } from \"../curve/spiral/IntegratedSpiral3d\";\r\nimport { DirectSpiral3d } from \"../curve/spiral/DirectSpiral3d\";\r\nimport { TaggedNumericData } from \"../polyface/TaggedNumericData\";\r\nimport { InterpolationCurve3d, InterpolationCurve3dOptions } from \"../bspline/InterpolationCurve3d\";\r\nimport { NumberArray, Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { AkimaCurve3d, AkimaCurve3dOptions } from \"../bspline/AkimaCurve3d\";\r\n\r\n/** * Context to write to a flatbuffer blob.\r\n * * This class is internal.\r\n * * Public access is through BentleyGeometryFlatBuffer.geometryToBytes()\r\n * @internal\r\n */\r\nexport class BGFBReader {\r\n public constructor() {\r\n }\r\n /**\r\n * Extract a bspline surface\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readBSplineSurfaceFromVariant(variantHeader: BGFBAccessors.VariantGeometry): BSplineSurface3d | BSplineSurface3dH | undefined {\r\n const geometryType = variantHeader.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagBsplineSurface) {\r\n const bsurfHeader = variantHeader.geometry(new BGFBAccessors.BsplineSurface());\r\n if (bsurfHeader !== null) {\r\n const orderU = bsurfHeader.orderU();\r\n const orderV = bsurfHeader.orderV();\r\n const numPolesU = bsurfHeader.numPolesU();\r\n const numPolesV = bsurfHeader.numPolesV();\r\n const xyzArray = bsurfHeader.polesArray();\r\n const knotArrayU = bsurfHeader.knotsUArray();\r\n const knotArrayV = bsurfHeader.knotsVArray();\r\n const weightArray = bsurfHeader.weightsArray();\r\n // const closed = header.closed();\r\n if (xyzArray !== null && knotArrayU !== null && knotArrayV !== null)\r\n if (weightArray === null) {\r\n return BSplineSurface3d.create(xyzArray, numPolesU, orderU, knotArrayU, numPolesV, orderV, knotArrayV);\r\n } else {\r\n return BSplineSurface3dH.create(xyzArray, weightArray, numPolesU, orderU, knotArrayU, numPolesV, orderV, knotArrayV);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Extract an interpolating curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readInterpolationCurve3d(header: BGFBAccessors.InterpolationCurve): InterpolationCurve3d | undefined {\r\n const xyzArray = header.fitPointsArray();\r\n if (xyzArray instanceof Float64Array){\r\n const knots = header.knotsArray();\r\n const options = new InterpolationCurve3dOptions(Point3dArray.clonePoint3dArray(xyzArray), knots ? NumberArray.create(knots) : undefined);\r\n const startTangent = header.startTangent();\r\n const endTangent = header.endTangent();\r\n options.captureOptionalProps(\r\n header.order(),\r\n header.closed(),\r\n header.isChordLenKnots(),\r\n header.isColinearTangents(),\r\n header.isChordLenTangents(),\r\n header.isNaturalTangents (),\r\n startTangent !== null ? Vector3d.create(startTangent.x(), startTangent.y(), startTangent.z()) : undefined,\r\n endTangent !== null ? Vector3d.create(endTangent.x(), endTangent.y(), endTangent.z()) : undefined);\r\n return InterpolationCurve3d.createCapture(options);\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Extract an akima curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readAkimaCurve3d(header: BGFBAccessors.AkimaCurve): AkimaCurve3d | undefined {\r\n const xyzArray = header.pointsArray();\r\n if (xyzArray instanceof Float64Array){\r\n const options = new AkimaCurve3dOptions(Point3dArray.clonePoint3dArray(xyzArray));\r\n return AkimaCurve3d.createCapture(options);\r\n }\r\nreturn undefined;\r\n}\r\n/**\r\n * Extract a bspline curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readBSplineCurve(header: BGFBAccessors.BsplineCurve): BSplineCurve3d | BSplineCurve3dH | undefined {\r\n const order = header.order();\r\n const xyzArray = header.polesArray();\r\n const knots = header.knotsArray();\r\n const weightsArray = header.weightsArray();\r\n // const closed = header.closed();\r\n if (xyzArray !== null && knots !== null)\r\n if (weightsArray === null) {\r\n return BSplineCurve3d.create(xyzArray, knots, order);\r\n } else {\r\n return BSplineCurve3dH.create({ xyz: xyzArray, weights: weightsArray }, knots, order);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a bspline curve\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readTransitionSpiral(header: BGFBAccessors.TransitionSpiral): TransitionSpiral3d | undefined {\r\n const detailHeader = header.detail();\r\n if (detailHeader) {\r\n const directDetailHeader = header.directDetail();\r\n const _extraDataArray = header.extraDataArray();\r\n const spiralTypeName = DgnSpiralTypeQueries.typeCodeToString(detailHeader.spiralType());\r\n const curvature0 = detailHeader.curvature0();\r\n const curvature1 = detailHeader.curvature1();\r\n const bearing0Radians = detailHeader.bearing0Radians();\r\n const bearing1Radians = detailHeader.bearing1Radians();\r\n const fbTransform = detailHeader.transform();\r\n const localToWorld = fbTransform ? Transform.createRowValues(\r\n fbTransform.axx(), fbTransform.axy(), fbTransform.axz(), fbTransform.axw(),\r\n fbTransform.ayx(), fbTransform.ayy(), fbTransform.ayz(), fbTransform.ayw(),\r\n fbTransform.azx(), fbTransform.azy(), fbTransform.azz(), fbTransform.azw()) :\r\n Transform.createIdentity();\r\n\r\n const activeFractionInterval = Segment1d.create(detailHeader.fractionA(),\r\n detailHeader.fractionB());\r\n if (!directDetailHeader) {\r\n const integratedSpiral = IntegratedSpiral3d.createRadiusRadiusBearingBearing(\r\n Segment1d.create(IntegratedSpiral3d.curvatureToRadius(curvature0), IntegratedSpiral3d.curvatureToRadius(curvature1)),\r\n AngleSweep.createStartEndRadians(bearing0Radians, bearing1Radians),\r\n activeFractionInterval, localToWorld, spiralTypeName);\r\n if (integratedSpiral)\r\n return integratedSpiral;\r\n const radius0 = TransitionSpiral3d.curvatureToRadius(curvature0);\r\n const radius1 = TransitionSpiral3d.curvatureToRadius(curvature1);\r\n const arcLength = TransitionSpiral3d.radiusRadiusSweepRadiansToArcLength(radius0, radius1,\r\n bearing1Radians - bearing0Radians);\r\n const directSpiral = DirectSpiral3d.createFromLengthAndRadius(\r\n spiralTypeName!,\r\n radius0, radius1,\r\n Angle.createRadians(bearing0Radians),\r\n Angle.createRadians (bearing1Radians),\r\n arcLength,\r\n activeFractionInterval,\r\n localToWorld);\r\n if (directSpiral)\r\n return directSpiral;\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a curve primitive\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readCurvePrimitiveFromVariant(variant: BGFBAccessors.VariantGeometry): CurvePrimitive | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagLineSegment) {\r\n const offsetToLineSegment = variant.geometry(new BGFBAccessors.LineSegment());\r\n const offsetToCoordinates = offsetToLineSegment!.segment();\r\n return LineSegment3d.createXYZXYZ(\r\n offsetToCoordinates!.point0X(), offsetToCoordinates!.point0Y(), offsetToCoordinates!.point0Z(),\r\n offsetToCoordinates!.point1X(), offsetToCoordinates!.point1Y(), offsetToCoordinates!.point1Z());\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagEllipticArc) {\r\n const offsetToEllipticArc = variant.geometry(new BGFBAccessors.EllipticArc());\r\n const offsetToCoordinates = offsetToEllipticArc!.arc()!;\r\n return Arc3d.createXYZXYZXYZ(\r\n offsetToCoordinates.centerX(), offsetToCoordinates.centerY(), offsetToCoordinates.centerZ(),\r\n offsetToCoordinates.vector0X(), offsetToCoordinates.vector0Y(), offsetToCoordinates.vector0Z(),\r\n offsetToCoordinates.vector90X(), offsetToCoordinates.vector90Y(), offsetToCoordinates.vector90Z(),\r\n AngleSweep.createStartSweepRadians(offsetToCoordinates.startRadians(), offsetToCoordinates?.sweepRadians()));\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagLineString) {\r\n const offsetToLineString = variant.geometry(new BGFBAccessors.LineString())!;\r\n const numCoordinates = offsetToLineString.pointsLength();\r\n const result = LineString3d.create();\r\n for (let i = 0; i + 2 < numCoordinates; i += 3) {\r\n result.packedPoints.pushXYZ(offsetToLineString.points(i)!, offsetToLineString.points(i + 1)!, offsetToLineString.points(i + 2)!);\r\n }\r\n return result;\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagBsplineCurve) {\r\n const offsetToBCurve = variant.geometry(new BGFBAccessors.BsplineCurve());\r\n if (offsetToBCurve !== null)\r\n return this.readBSplineCurve(offsetToBCurve);\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagTransitionSpiral) {\r\n const offsetToTransitionSpiralTable = variant.geometry(new BGFBAccessors.TransitionSpiral());\r\n if (offsetToTransitionSpiralTable !== null)\r\n return this.readTransitionSpiral(offsetToTransitionSpiralTable);\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagInterpolationCurve) {\r\n const offsetToInterpolationCurveTable = variant.geometry(new BGFBAccessors.InterpolationCurve());\r\n if (offsetToInterpolationCurveTable !== null)\r\n return this.readInterpolationCurve3d(offsetToInterpolationCurveTable);\r\n } else if (geometryType === BGFBAccessors.VariantGeometryUnion.tagAkimaCurve) {\r\n const offsetToAkimaCurveTable = variant.geometry(new BGFBAccessors.AkimaCurve());\r\n if (offsetToAkimaCurveTable !== null)\r\n return this.readAkimaCurve3d(offsetToAkimaCurveTable);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a curve primitive\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPointStringFromVariant(variant: BGFBAccessors.VariantGeometry): PointString3d | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagPointString) {\r\n const offsetToLineString = variant.geometry(new BGFBAccessors.PointString())!;\r\n const numCoordinates = offsetToLineString.pointsLength();\r\n const result = PointString3d.create();\r\n for (let i = 0; i + 2 < numCoordinates; i += 3) {\r\n result.points.push(Point3d.create(offsetToLineString.points(i)!, offsetToLineString.points(i + 1)!, offsetToLineString.points(i + 2)!));\r\n }\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceAuxChannelData(channelDataHeader: BGFBAccessors.PolyfaceAuxChannelData | null): AuxChannelData | undefined {\r\n if (channelDataHeader !== null) {\r\n const input = channelDataHeader.input();\r\n const values = channelDataHeader.valuesArray();\r\n if (values !== null)\r\n return new AuxChannelData(input, values);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceAuxChannel(channelHeader: BGFBAccessors.PolyfaceAuxChannel | null): AuxChannel | undefined {\r\n if (channelHeader) {\r\n const dataType = channelHeader.dataType();\r\n const dataLength = channelHeader.dataLength();\r\n const channelDataArray: AuxChannelData[] = [];\r\n const name = channelHeader.name();\r\n const inputName = channelHeader.inputName();\r\n for (let i = 0; i < dataLength; i++) {\r\n const channelData = this.readPolyfaceAuxChannelData(channelHeader.data(i));\r\n if (channelData)\r\n channelDataArray.push(channelData);\r\n }\r\n return new AuxChannel(channelDataArray, dataType, name ? name : undefined, inputName ? inputName : undefined);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceAuxData(auxDataHeader: BGFBAccessors.PolyfaceAuxData | null): PolyfaceAuxData | undefined {\r\n if (auxDataHeader) {\r\n const channelsLength = auxDataHeader.channelsLength();\r\n const indicesArray = auxDataHeader.indicesArray();\r\n const indices: number[] = [];\r\n const channels: AuxChannel[] = [];\r\n if (null !== indicesArray) {\r\n for (const i of indicesArray)\r\n indices.push(i);\r\n }\r\n if (0 !== channelsLength) {\r\n for (let i = 0; i < channelsLength; i++) {\r\n const channelHeader = auxDataHeader.channels(i);\r\n const channelContent = this.readPolyfaceAuxChannel(channelHeader);\r\n if (channelContent)\r\n channels.push(channelContent);\r\n }\r\n }\r\n return new PolyfaceAuxData(channels, indices);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Extract auxData for a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readTaggedNumericData(accessor: BGFBAccessors.TaggedNumericData | undefined): TaggedNumericData | undefined {\r\n if (accessor) {\r\n const taggedNumericData = new TaggedNumericData(accessor.tagA(), accessor.tagB());\r\n const intDataArray = nullToUndefined<Int32Array>(accessor.intDataArray());\r\n const doubleDataArray = nullToUndefined<Float64Array>(accessor.doubleDataArray());\r\n if (intDataArray) {\r\n taggedNumericData.intData = [];\r\n for (const c of intDataArray)\r\n taggedNumericData.intData.push(c);\r\n\r\n }\r\n if (doubleDataArray) {\r\n taggedNumericData.doubleData = [];\r\n for (const c of doubleDataArray)\r\n taggedNumericData.doubleData.push(c);\r\n }\r\n return taggedNumericData;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a mesh\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readPolyfaceFromVariant(variant: BGFBAccessors.VariantGeometry): IndexedPolyface | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagPolyface) {\r\n const polyfaceHeader = variant.geometry(new BGFBAccessors.Polyface());\r\n if (polyfaceHeader) {\r\n const twoSided = polyfaceHeader.twoSided();\r\n const expectedClosure = polyfaceHeader.expectedClosure();\r\n const meshStyle = polyfaceHeader.meshStyle();\r\n const numPerFace = polyfaceHeader.numPerFace();\r\n\r\n const pointF64 = nullToUndefined<Float64Array>(polyfaceHeader.pointArray());\r\n const paramF64 = nullToUndefined<Float64Array>(polyfaceHeader.paramArray());\r\n const normalF64 = nullToUndefined<Float64Array>(polyfaceHeader.normalArray());\r\n const intColorU32 = nullToUndefined<Uint32Array>(polyfaceHeader.intColorArray());\r\n\r\n const pointIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.pointIndexArray());\r\n const paramIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.paramIndexArray());\r\n const normalIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.normalIndexArray());\r\n const colorIndexI32 = nullToUndefined<Int32Array>(polyfaceHeader.colorIndexArray());\r\n const taggedNumericDataOffset = polyfaceHeader.taggedNumericData();\r\n if (meshStyle === 1 && pointF64 && pointIndexI32) {\r\n const polyface = IndexedPolyface.create(normalF64 !== undefined, paramF64 !== undefined, intColorU32 !== undefined, twoSided);\r\n polyface.expectedClosure = expectedClosure;\r\n for (let i = 0; i + 2 < pointF64?.length; i += 3)\r\n polyface.data.point.pushXYZ(pointF64[i], pointF64[i + 1], pointF64[i + 2]);\r\n if (paramF64) {\r\n for (let i = 0; i + 1 < paramF64?.length; i += 2)\r\n polyface.data.param!.pushXY(paramF64[i], paramF64[i + 1]);\r\n }\r\n if (normalF64) {\r\n for (let i = 0; i + 2 < normalF64?.length; i += 3)\r\n polyface.data.normal!.pushXYZ(normalF64[i], normalF64[i + 1], normalF64[i + 2]);\r\n }\r\n if (intColorU32) {\r\n for (const c of intColorU32)\r\n polyface.data.color!.push(c);\r\n }\r\n // The flatbuffer data is one based.\r\n // If numPerFace is less than 2, facets are variable size and zero terminated\r\n // If numPerFace is 2 or more, indices are blocked\r\n const numIndex = pointIndexI32.length;\r\n const addIndicesInBlock = (k0: number, k1: number) => {\r\n for (let k = k0; k < k1; k++) {\r\n const q = pointIndexI32[k];\r\n polyface.addPointIndex(Math.abs(q) - 1, q > 0);\r\n if (normalF64 && normalIndexI32) {\r\n polyface.addNormalIndex(Math.abs(normalIndexI32[k]) - 1);\r\n }\r\n if (paramF64 && paramIndexI32) {\r\n polyface.addParamIndex(Math.abs(paramIndexI32[k]) - 1);\r\n }\r\n if (intColorU32 && colorIndexI32) {\r\n polyface.addColorIndex(Math.abs(colorIndexI32[k]) - 1);\r\n }\r\n }\r\n };\r\n\r\n if (numPerFace > 1) {\r\n for (let i0 = 0; i0 + numPerFace <= numIndex; i0 += numPerFace){\r\n addIndicesInBlock(i0, i0 + numPerFace);\r\n polyface.terminateFacet(true);\r\n }\r\n } else {\r\n let i0 = 0;\r\n for (let i1 = i0; i1 < numIndex; i1++) {\r\n if (pointIndexI32[i1] === 0) {\r\n addIndicesInBlock(i0, i1);\r\n polyface.terminateFacet(true);\r\n i0 = i1 + 1;\r\n }\r\n }\r\n }\r\n\r\n polyface.data.auxData = this.readPolyfaceAuxData(polyfaceHeader.auxData());\r\n if (taggedNumericDataOffset) {\r\n const taggedNumericDataAccessor = nullToUndefined<BGFBAccessors.TaggedNumericData>(taggedNumericDataOffset);\r\n if (taggedNumericDataAccessor !== undefined) {\r\n const taggedNumericData = this.readTaggedNumericData(taggedNumericDataAccessor);\r\n if (taggedNumericData !== undefined)\r\n polyface.data.setTaggedNumericData(taggedNumericData);\r\n }\r\n }\r\n return polyface;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n public readCurveCollectionFromCurveVectorTable(cvTable: BGFBAccessors.CurveVector): CurveCollection {\r\n const numChildren = cvTable.curvesLength();\r\n const collectionType = cvTable.type();\r\n const collection = createTypedCurveCollection(collectionType);\r\n for (let i = 0; i < numChildren; i++) {\r\n const childOffset = cvTable.curves(i);\r\n if (childOffset !== null) {\r\n const child = this.readCurvePrimitiveFromVariant(childOffset);\r\n if (child)\r\n collection.tryAddChild(child);\r\n else {\r\n const childCollection = this.readCurveCollectionFromVariantGeometry(childOffset);\r\n if (childCollection)\r\n collection.tryAddChild(childCollection);\r\n }\r\n }\r\n }\r\n return collection;\r\n }\r\n /**\r\n * Extract a curve collection\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readCurveCollectionFromVariantGeometry(variant: BGFBAccessors.VariantGeometry): CurveCollection | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagCurveVector) {\r\n const cvTable = variant.geometry(new BGFBAccessors.CurveVector())!;\r\n return this.readCurveCollectionFromCurveVectorTable(cvTable);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract a curve collection\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readSolidPrimitiveFromVariant(variant: BGFBAccessors.VariantGeometry): SolidPrimitive | undefined {\r\n const geometryType = variant.geometryType();\r\n if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnBox) {\r\n const header = variant.geometry(new BGFBAccessors.DgnBox());\r\n const detail = header!.detail()!;\r\n return Box.createDgnBox(\r\n Point3d.create(detail.baseOriginX(), detail.baseOriginY(), detail.baseOriginZ()),\r\n Vector3d.create(detail.vectorXX(), detail.vectorXY(), detail.vectorXZ()),\r\n Vector3d.create(detail.vectorYX(), detail.vectorYY(), detail.vectorYZ()),\r\n Point3d.create(detail.topOriginX(), detail.topOriginY(), detail.topOriginZ()),\r\n detail.baseX(), detail.baseY(), detail.topX(), detail.topY(),\r\n detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnSphere) {\r\n const header = variant.geometry(new BGFBAccessors.DgnSphere());\r\n const detail = header!.detail()!;\r\n const lToWDetail = detail.localToWorld()!;\r\n const localToWorld = Transform.createRowValues(\r\n lToWDetail.axx(), lToWDetail.axy(), lToWDetail.axz(), lToWDetail.axw(),\r\n lToWDetail.ayx(), lToWDetail.ayy(), lToWDetail.ayz(), lToWDetail.ayw(),\r\n lToWDetail.azx(), lToWDetail.azy(), lToWDetail.azz(), lToWDetail.azw());\r\n return Sphere.createEllipsoid(localToWorld,\r\n AngleSweep.createStartSweepRadians(detail.startLatitudeRadians(), detail.latitudeSweepRadians()),\r\n detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnCone) {\r\n const header = variant.geometry(new BGFBAccessors.DgnCone());\r\n const detail = header!.detail()!;\r\n const centerA = Point3d.create(detail.centerAX(), detail.centerAY(), detail.centerAZ());\r\n const centerB = Point3d.create(detail.centerBX(), detail.centerBY(), detail.centerBZ());\r\n const vector0 = Vector3d.create(detail.vector0X(), detail.vector0Y(), detail.vector0Z());\r\n const vector90 = Vector3d.create(detail.vector90X(), detail.vector90Y(), detail.vector90Z());\r\n const radiusA = detail.radiusA();\r\n const radiusB = detail.radiusB();\r\n return Cone.createBaseAndTarget(centerA, centerB, vector0, vector90, radiusA, radiusB, detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnTorusPipe) {\r\n const header = variant.geometry(new BGFBAccessors.DgnTorusPipe())!;\r\n const detail = header.detail()!;\r\n const center = Point3d.create(detail.centerX(), detail.centerY(), detail.centerZ());\r\n const vectorX = Vector3d.create(detail.vectorXX(), detail.vectorXY(), detail.vectorXZ());\r\n const vectorY = Vector3d.create(detail.vectorYX(), detail.vectorYY(), detail.vectorYZ());\r\n const sweepRadians = detail.sweepRadians();\r\n const majorRadius = detail.majorRadius();\r\n const minorRadius = detail.minorRadius();\r\n return TorusPipe.createDgnTorusPipe(center, vectorX, vectorY, majorRadius, minorRadius, Angle.createRadians(sweepRadians), detail.capped());\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnExtrusion) {\r\n const header = variant.geometry(new BGFBAccessors.DgnExtrusion())!;\r\n const dVector = new BGFBAccessors.DVector3d();\r\n header.extrusionVector(dVector);\r\n const extrusionVector = Vector3d.create(dVector.x(), dVector.y(), dVector.z());\r\n const baseCurve = header.baseCurve();\r\n if (baseCurve !== null) {\r\n const contour = this.readCurveCollectionFromCurveVectorTable(baseCurve);\r\n return LinearSweep.create(contour, extrusionVector, header.capped());\r\n }\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnRotationalSweep) {\r\n const header = variant.geometry(new BGFBAccessors.DgnRotationalSweep())!;\r\n const dAxis = new BGFBAccessors.DRay3d();\r\n header.axis(dAxis);\r\n const axis = Ray3d.createXYZUVW(dAxis.x(), dAxis.y(), dAxis.z(), dAxis.ux(), dAxis.uy(), dAxis.uz());\r\n const sweepAngle = Angle.createRadians(header.sweepRadians());\r\n // const numVRules = header.numVRules();\r\n const baseCurve = header.baseCurve();\r\n if (baseCurve !== null) {\r\n const contour = this.readCurveCollectionFromCurveVectorTable(baseCurve);\r\n return RotationalSweep.create(contour, axis, sweepAngle, header.capped());\r\n }\r\n } if (geometryType === BGFBAccessors.VariantGeometryUnion.tagDgnRuledSweep) {\r\n const header = variant.geometry(new BGFBAccessors.DgnRuledSweep())!;\r\n const numCurves = header.curvesLength();\r\n const contours: CurveCollection[] = [];\r\n for (let i = 0; i < numCurves; i++) {\r\n const contourTable = header.curves(i);\r\n if (contourTable) {\r\n const contour = this.readCurveCollectionFromCurveVectorTable(contourTable);\r\n if (contour)\r\n contours.push(contour);\r\n }\r\n }\r\n if (contours.length > 0) {\r\n return RuledSweep.create(contours, header.capped());\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Extract any geometry type or array of geometry.\r\n * @param variant read position in the flat buffer.\r\n */\r\n public readGeometryQueryFromVariant(variant: BGFBAccessors.VariantGeometry): GeometryQuery | GeometryQuery[] | undefined {\r\n const rootType = variant.geometryType();\r\n switch (rootType) {\r\n case BGFBAccessors.VariantGeometryUnion.tagLineSegment:\r\n case BGFBAccessors.VariantGeometryUnion.tagLineString:\r\n case BGFBAccessors.VariantGeometryUnion.tagEllipticArc:\r\n case BGFBAccessors.VariantGeometryUnion.tagBsplineCurve:\r\n case BGFBAccessors.VariantGeometryUnion.tagTransitionSpiral:\r\n case BGFBAccessors.VariantGeometryUnion.tagInterpolationCurve:\r\n case BGFBAccessors.VariantGeometryUnion.tagAkimaCurve:\r\n {\r\n return this.readCurvePrimitiveFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagCurveVector:\r\n {\r\n return this.readCurveCollectionFromVariantGeometry(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagPolyface:\r\n {\r\n return this.readPolyfaceFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnBox:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnCone:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnTorusPipe:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnSphere:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnExtrusion:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnRotationalSweep:\r\n case BGFBAccessors.VariantGeometryUnion.tagDgnRuledSweep:\r\n {\r\n return this.readSolidPrimitiveFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagVectorOfVariantGeometry:\r\n {\r\n const geometry: GeometryQuery[] = [];\r\n const offsetToVectorOfVariantGeometry = variant.geometry(new BGFBAccessors.VectorOfVariantGeometry());\r\n for (let i = 0; i < offsetToVectorOfVariantGeometry!.membersLength(); i++) {\r\n const child = offsetToVectorOfVariantGeometry!.members(i);\r\n if (child !== null) {\r\n const childGeometry = this.readGeometryQueryFromVariant(child);\r\n if (childGeometry instanceof GeometryQuery) {\r\n geometry.push(childGeometry);\r\n } else if (Array.isArray(childGeometry)) {\r\n geometry.push(...childGeometry);\r\n }\r\n }\r\n }\r\n return geometry;\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagBsplineSurface: {\r\n return this.readBSplineSurfaceFromVariant(variant);\r\n }\r\n case BGFBAccessors.VariantGeometryUnion.tagPointString:\r\n {\r\n return this.readPointStringFromVariant(variant);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Deserialize bytes from a flatbuffer.\r\n * @param justTheBytes FlatBuffer bytes as created by BGFBWriter.createFlatBuffer (g);\r\n */\r\n public static bytesToGeometry(theBytes: Uint8Array, signature?: Uint8Array): GeometryQuery | GeometryQuery[] | undefined {\r\n const newByteBuffer = new flatbuffers.ByteBuffer(theBytes);\r\n if (signature) {\r\n if (theBytes.length < signature.length)\r\n return undefined;\r\n for (let i = 0; i < signature.length; i++)\r\n if (theBytes[i] !== signature[i])\r\n return undefined;\r\n newByteBuffer.setPosition(signature.length);\r\n }\r\n const root = BGFBAccessors.VariantGeometry.getRootAsVariantGeometry(newByteBuffer);\r\n const reader = new BGFBReader();\r\n return reader.readGeometryQueryFromVariant(root);\r\n }\r\n\r\n}\r\n/**\r\n * if data is \"null\" (the deprecated javascript idiom!) return undefined. Otherwise return the data as its own type.\r\n * @param data\r\n */\r\nfunction nullToUndefined<T>(data: any): T | undefined {\r\n if (data === null)\r\n return undefined;\r\n return data;\r\n}\r\n\r\nfunction createTypedCurveCollection(collectionType: number): CurveCollection {\r\n if (collectionType === 1) return new Path();\r\n if (collectionType === 2 || collectionType === 3) return new Loop();\r\n if (collectionType === 4) return new ParityRegion();\r\n if (collectionType === 5) return new UnionRegion();\r\n return new BagOfCurves();\r\n}\r\n/**\r\n * mappings between typescript spiral type strings and native integers.\r\n * @internal\r\n */\r\nexport class DgnSpiralTypeQueries {\r\n // remark: this is the full list based on native DSpiral2dBase.h.\r\n // This does not guarantee all types are supported.\r\n private static spiralTypeCodeMap = [\r\n [10, \"clothoid\"],\r\n [11, \"bloss\"],\r\n [12, \"biquadratic\"],\r\n [13, \"cosine\"],\r\n [14, \"sine\"],\r\n [15, \"Viennese\"],\r\n [16, \"weightedViennese\"],\r\n\r\n [50, \"WesternAustralian\"],\r\n [51, \"Czech\"],\r\n [52, \"AustralianRailCorp\"],\r\n [53, \"Italian\"],\r\n [54, \"PolishCubic\"],\r\n [55, \"Arema\"],\r\n [56, \"MXCubicAlongArc\"],\r\n [57, \"MXCubicAlongTangent\"],\r\n [58, \"ChineseCubic\"],\r\n [60, \"HalfCosine\"],\r\n [61, \"JapaneseCubic\"],\r\n ];\r\n /** Convert native integer type (e.g. from flatbuffer) to typescript string */\r\n public static typeCodeToString(typeCode: number): string | undefined {\r\n for (const entry of DgnSpiralTypeQueries.spiralTypeCodeMap) {\r\n if (entry[0] === typeCode)\r\n return entry[1] as string;\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Convert typescript string to native integer type */\r\n public static stringToTypeCode(s: string, defaultToClothoid: boolean = true): number | undefined {\r\n for (const entry of DgnSpiralTypeQueries.spiralTypeCodeMap) {\r\n if (Geometry.equalStringNoCase(s, entry[1] as string))\r\n return entry[0] as number;\r\n }\r\n return defaultToClothoid ? 10 : undefined;\r\n }\r\n /** Ask if the indicated type code is a \"direct\" spiral */\r\n public static isDirectSpiralType(typeCode: number): boolean {\r\n return typeCode >= 50;\r\n }\r\n}\r\n"]}
@@ -14,6 +14,7 @@ import { Loop } from "../curve/Loop";
14
14
  import { ParityRegion } from "../curve/ParityRegion";
15
15
  import { Path } from "../curve/Path";
16
16
  import { PointString3d } from "../curve/PointString3d";
17
+ import { TransitionSpiral3d } from "../curve/spiral/TransitionSpiral3d";
17
18
  import { UnionRegion } from "../curve/UnionRegion";
18
19
  import { Angle } from "../geometry3d/Angle";
19
20
  import { AngleSweep } from "../geometry3d/AngleSweep";
@@ -31,7 +32,9 @@ import { XYAndZ } from "../geometry3d/XYZProps";
31
32
  import { Map4d } from "../geometry4d/Map4d";
32
33
  import { Matrix4d } from "../geometry4d/Matrix4d";
33
34
  import { Point4d } from "../geometry4d/Point4d";
35
+ import { AuxChannelDataType } from "../polyface/AuxData";
34
36
  import { IndexedPolyface } from "../polyface/Polyface";
37
+ import { PolyfaceData } from "../polyface/PolyfaceData";
35
38
  import { Box } from "../solid/Box";
36
39
  import { Cone } from "../solid/Cone";
37
40
  import { LinearSweep } from "../solid/LinearSweep";
@@ -40,9 +43,6 @@ import { RuledSweep } from "../solid/RuledSweep";
40
43
  import { SolidPrimitive } from "../solid/SolidPrimitive";
41
44
  import { Sphere } from "../solid/Sphere";
42
45
  import { TorusPipe } from "../solid/TorusPipe";
43
- import { TransitionSpiral3d } from "../curve/spiral/TransitionSpiral3d";
44
- import { PolyfaceData } from "../polyface/PolyfaceData";
45
- import { AuxChannelDataType } from "../polyface/AuxData";
46
46
  /**
47
47
  * Function to be called to obtain function value at (i,n), for
48
48
  * * n fixed over many calls
@@ -184,8 +184,7 @@ export declare class Sample {
184
184
  /** Return an array of Matrix3d with various skew and scale. This includes at least:
185
185
  * * identity
186
186
  * * 3 distinct diagonals.
187
- * * The distinct diagonal base with smaller value added to
188
- * other 6 spots in succession.
187
+ * * The distinct diagonal base with smaller value added to other 6 spots in succession.
189
188
  * * the distinct diagonals with all others also smaller non-zeros.
190
189
  */
191
190
  static createScaleSkewMatrix3d(): Matrix3d[];
@@ -506,8 +505,11 @@ export declare class Sample {
506
505
  /** Create swept "solids" that can be capped.
507
506
  * * At least one of each solid type.
508
507
  * * each is within 10 of the origin all directions.
508
+ * @param capped true to include caps
509
+ * @param rotationAngle angle of rotation for the angular sweep. The default is 90 degrees.
510
+ * Beware that the rotation sweep created with the default or any positive angle produces a mesh with inward normals.
509
511
  */
510
- static createClosedSolidSampler(capped: boolean): SolidPrimitive[];
512
+ static createClosedSolidSampler(capped: boolean, rotationAngle?: Angle): SolidPrimitive[];
511
513
  /**
512
514
  * Create points:
513
515
  * * `numRadialEdges` radially from origin to polar point (r,sweep.start)