@metamesh/modeling 0.18.0 → 0.19.0

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 (843) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +73 -57
  3. package/dist/api/engine.d.ts +7 -47
  4. package/dist/api/export-3mf.d.ts +2 -0
  5. package/dist/api/export-glb.d.ts +2 -0
  6. package/dist/api/export-stl.d.ts +2 -0
  7. package/dist/api/export.d.ts +160 -0
  8. package/dist/api/geometry.d.ts +7 -7
  9. package/dist/api/index.d.ts +85 -35
  10. package/dist/api/mesh.d.ts +35 -6
  11. package/dist/docs/guides/concepts.md +32 -535
  12. package/dist/docs/guides/fonts.md +4 -4
  13. package/dist/docs/guides/generation.md +52 -45
  14. package/dist/docs/guides/geometry-values.md +193 -0
  15. package/dist/docs/guides/hosting.md +53 -30
  16. package/dist/docs/guides/profiles-and-extrusion.md +252 -0
  17. package/dist/docs/guides/recipes.md +33 -780
  18. package/dist/docs/guides/resolution-and-inspection.md +133 -0
  19. package/dist/docs/guides/solid-joins.md +126 -0
  20. package/dist/docs/guides/standalone-model.md +1 -1
  21. package/dist/docs/guides/svg-and-text.md +215 -0
  22. package/dist/docs/guides/sweeps-and-lofts.md +179 -0
  23. package/dist/docs/guides/transforms-and-placement.md +313 -0
  24. package/dist/docs/manifest.json +2818 -5862
  25. package/dist/docs/reference/engine/GenerationOptions.md +10 -4
  26. package/dist/docs/reference/engine/GeometryResource.md +8 -2
  27. package/dist/docs/reference/engine/ModelDependencies.md +9 -3
  28. package/dist/docs/reference/engine/ModelEngine.md +9 -3
  29. package/dist/docs/reference/engine/ModelEngineOptions.md +9 -3
  30. package/dist/docs/reference/engine/ModelPart.md +9 -3
  31. package/dist/docs/reference/engine/ModelResult.md +8 -2
  32. package/dist/docs/reference/engine/ModelRunArguments.md +7 -1
  33. package/dist/docs/reference/engine/ModelRunOptions.md +10 -4
  34. package/dist/docs/reference/engine/ModelSession.md +7 -1
  35. package/dist/docs/reference/engine/SessionOptions.md +10 -4
  36. package/dist/docs/reference/engine/categories/host-lifecycle.md +3 -8
  37. package/dist/docs/reference/engine/checkModel.md +7 -1
  38. package/dist/docs/reference/engine/createModelEngine.md +10 -3
  39. package/dist/docs/reference/engine/defaultModelingLimits.md +9 -3
  40. package/dist/docs/reference/engine/modelingWasmUrl.md +7 -1
  41. package/dist/docs/reference/engine.md +7 -7
  42. package/dist/docs/reference/export/Export3mfOptions.md +24 -0
  43. package/dist/docs/reference/export/ExportDiagnostic.md +59 -0
  44. package/dist/docs/reference/export/ExportFormat.md +25 -0
  45. package/dist/docs/reference/export/ExportGeometry.md +39 -0
  46. package/dist/docs/reference/export/ExportGlbOptions.md +118 -0
  47. package/dist/docs/reference/export/ExportLimits.md +83 -0
  48. package/dist/docs/reference/export/ExportMaterial.md +47 -0
  49. package/dist/docs/reference/export/ExportOptions.md +94 -0
  50. package/dist/docs/reference/export/ExportPart.md +88 -0
  51. package/dist/docs/reference/export/ExportReport.md +82 -0
  52. package/dist/docs/reference/export/ExportSink.md +39 -0
  53. package/dist/docs/reference/export/ExportStlOptions.md +24 -0
  54. package/dist/docs/reference/export/ExportedFile.md +110 -0
  55. package/dist/docs/reference/export/categories/mesh-serialization.md +47 -0
  56. package/dist/docs/reference/export/defaultExportLimits.md +20 -0
  57. package/dist/docs/reference/export/export3mf.md +64 -0
  58. package/dist/docs/reference/export/exportGlb.md +68 -0
  59. package/dist/docs/reference/export/exportStl.md +64 -0
  60. package/dist/docs/reference/export/write3mf.md +71 -0
  61. package/dist/docs/reference/export/writeGlb.md +75 -0
  62. package/dist/docs/reference/export/writeStl.md +71 -0
  63. package/dist/docs/reference/export.md +21 -0
  64. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +16 -2
  65. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +7 -1
  66. package/dist/docs/reference/geometry/Anchor3-type.md +13 -3
  67. package/dist/docs/reference/geometry/ArcCurve2.md +8 -2
  68. package/dist/docs/reference/geometry/ArcCurve3.md +8 -2
  69. package/dist/docs/reference/geometry/AttachOptions.md +13 -3
  70. package/dist/docs/reference/geometry/AxisAngleRotation3.md +9 -3
  71. package/dist/docs/reference/geometry/Bevel.md +16 -2
  72. package/dist/docs/reference/geometry/BevelSize.md +16 -2
  73. package/dist/docs/reference/geometry/Bounds2-type.md +18 -4
  74. package/dist/docs/reference/geometry/Bounds2Data.md +22 -4
  75. package/dist/docs/reference/geometry/Bounds2Input.md +18 -4
  76. package/dist/docs/reference/geometry/Bounds2Options.md +14 -4
  77. package/dist/docs/reference/geometry/Bounds3-type.md +18 -4
  78. package/dist/docs/reference/geometry/Bounds3Data.md +18 -4
  79. package/dist/docs/reference/geometry/Bounds3Input.md +18 -4
  80. package/dist/docs/reference/geometry/Bounds3Options.md +14 -4
  81. package/dist/docs/reference/geometry/BoundsFit2.md +10 -4
  82. package/dist/docs/reference/geometry/BoundsFit3.md +10 -4
  83. package/dist/docs/reference/geometry/BoundsFitOptions.md +10 -4
  84. package/dist/docs/reference/geometry/BoxAnchorFace.md +9 -3
  85. package/dist/docs/reference/geometry/BoxAnchorOptions.md +9 -3
  86. package/dist/docs/reference/geometry/BoxEdge.md +11 -1
  87. package/dist/docs/reference/geometry/BoxEdgeSelection.md +11 -1
  88. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +11 -1
  89. package/dist/docs/reference/geometry/BoxOptions.md +11 -1
  90. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +16 -2
  91. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +16 -2
  92. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +11 -1
  93. package/dist/docs/reference/geometry/CircleContourOptions.md +12 -2
  94. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +15 -1
  95. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -1
  96. package/dist/docs/reference/geometry/CircularSampling.md +7 -1
  97. package/dist/docs/reference/geometry/CircularSamplingOptions.md +7 -1
  98. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +8 -2
  99. package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -2
  100. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +8 -2
  101. package/dist/docs/reference/geometry/Contour.md +12 -2
  102. package/dist/docs/reference/geometry/ContourCurve.md +8 -2
  103. package/dist/docs/reference/geometry/ContourPoint.md +8 -2
  104. package/dist/docs/reference/geometry/ContourSegment.md +8 -2
  105. package/dist/docs/reference/geometry/CorrespondingComponent.md +12 -2
  106. package/dist/docs/reference/geometry/CorrespondingContour.md +12 -2
  107. package/dist/docs/reference/geometry/CorrespondingProfile.md +12 -2
  108. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +12 -2
  109. package/dist/docs/reference/geometry/CubicBezierCurve2.md +8 -2
  110. package/dist/docs/reference/geometry/CubicBezierCurve3.md +8 -2
  111. package/dist/docs/reference/geometry/Curve2.md +8 -2
  112. package/dist/docs/reference/geometry/Curve3.md +8 -2
  113. package/dist/docs/reference/geometry/CurveSamplingOptions.md +16 -2
  114. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +16 -2
  115. package/dist/docs/reference/geometry/CylinderAnchorFace.md +9 -3
  116. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -3
  117. package/dist/docs/reference/geometry/CylinderOptions.md +11 -1
  118. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -2
  119. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -2
  120. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +8 -2
  121. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +8 -2
  122. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +8 -2
  123. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +8 -2
  124. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +8 -2
  125. package/dist/docs/reference/geometry/CylindricalGearSpec.md +8 -2
  126. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -1
  127. package/dist/docs/reference/geometry/EdgeTreatment.md +11 -1
  128. package/dist/docs/reference/geometry/EllipseContourOptions.md +12 -2
  129. package/dist/docs/reference/geometry/EndTreatments.md +12 -2
  130. package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +16 -2
  131. package/dist/docs/reference/geometry/ExtrudeOptions.md +13 -3
  132. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +16 -2
  133. package/dist/docs/reference/geometry/FittedTextLayout.md +8 -2
  134. package/dist/docs/reference/geometry/Frame3.md +16 -2
  135. package/dist/docs/reference/geometry/GeometryError.md +11 -1
  136. package/dist/docs/reference/geometry/GeometryErrorCode.md +11 -1
  137. package/dist/docs/reference/geometry/GeometryErrorContext.md +11 -1
  138. package/dist/docs/reference/geometry/GeometryResolution.md +15 -1
  139. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +16 -2
  140. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +15 -1
  141. package/dist/docs/reference/geometry/GridPatternOptions.md +12 -2
  142. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +12 -2
  143. package/dist/docs/reference/geometry/HeightfieldOptions.md +16 -2
  144. package/dist/docs/reference/geometry/HeightfieldPreflight.md +12 -2
  145. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +9 -3
  146. package/dist/docs/reference/geometry/ImmutableBuffer-type.md +16 -14
  147. package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +17 -3
  148. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +12 -2
  149. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +12 -2
  150. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +8 -2
  151. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +8 -2
  152. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +12 -2
  153. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +12 -2
  154. package/dist/docs/reference/geometry/LineCurve2.md +8 -2
  155. package/dist/docs/reference/geometry/LineCurve3.md +8 -2
  156. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -2
  157. package/dist/docs/reference/geometry/LoftCorrespondence.md +16 -2
  158. package/dist/docs/reference/geometry/LoftMeshStation.md +12 -2
  159. package/dist/docs/reference/geometry/LoftOptions.md +16 -2
  160. package/dist/docs/reference/geometry/LoftPlacement.md +16 -2
  161. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +8 -2
  162. package/dist/docs/reference/geometry/MatchProfilesOptions.md +12 -2
  163. package/dist/docs/reference/geometry/MetricFastenerSize.md +8 -2
  164. package/dist/docs/reference/geometry/MetricFastenerStandard.md +8 -2
  165. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +8 -2
  166. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +8 -2
  167. package/dist/docs/reference/geometry/ModelingLimits.md +19 -1
  168. package/dist/docs/reference/geometry/NumericArray.md +16 -2
  169. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +8 -2
  170. package/dist/docs/reference/geometry/Path2-type.md +16 -2
  171. package/dist/docs/reference/geometry/Path2Data.md +16 -2
  172. package/dist/docs/reference/geometry/Path2Input.md +16 -2
  173. package/dist/docs/reference/geometry/Path3-type.md +16 -2
  174. package/dist/docs/reference/geometry/Path3Data.md +16 -2
  175. package/dist/docs/reference/geometry/Path3Input.md +16 -2
  176. package/dist/docs/reference/geometry/PathFrame.md +8 -2
  177. package/dist/docs/reference/geometry/PathLocation.md +16 -2
  178. package/dist/docs/reference/geometry/PathNormalGuide.md +16 -2
  179. package/dist/docs/reference/geometry/PathOptions.md +12 -2
  180. package/dist/docs/reference/geometry/PathPatternOptions.md +12 -2
  181. package/dist/docs/reference/geometry/PathPlacement.md +8 -2
  182. package/dist/docs/reference/geometry/PathResamplingOptions.md +16 -2
  183. package/dist/docs/reference/geometry/Pivot2Options.md +17 -3
  184. package/dist/docs/reference/geometry/Pivot3Options.md +17 -3
  185. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +12 -2
  186. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +12 -2
  187. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +12 -2
  188. package/dist/docs/reference/geometry/PlanarPatchQuality.md +12 -2
  189. package/dist/docs/reference/geometry/PolygonData.md +12 -2
  190. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -2
  191. package/dist/docs/reference/geometry/PrimitiveAttachment.md +11 -1
  192. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +11 -1
  193. package/dist/docs/reference/geometry/PrintableThreadFit.md +12 -2
  194. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +12 -2
  195. package/dist/docs/reference/geometry/Profile.md +8 -2
  196. package/dist/docs/reference/geometry/ProfileComponent2.md +12 -2
  197. package/dist/docs/reference/geometry/ProfileContour2.md +12 -2
  198. package/dist/docs/reference/geometry/ProfileSpan2.md +12 -2
  199. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +11 -1
  200. package/dist/docs/reference/geometry/RackPitchDimensions.md +8 -2
  201. package/dist/docs/reference/geometry/RackPitchSpec.md +8 -2
  202. package/dist/docs/reference/geometry/RadialPatternOptions.md +12 -2
  203. package/dist/docs/reference/geometry/RadialSizing.md +11 -1
  204. package/dist/docs/reference/geometry/RadialSizingOptions.md +11 -1
  205. package/dist/docs/reference/geometry/RectangleContourOptions.md +12 -2
  206. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +12 -2
  207. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +12 -2
  208. package/dist/docs/reference/geometry/RectangleProfileOptions.md +8 -2
  209. package/dist/docs/reference/geometry/RegionData.md +12 -2
  210. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +8 -2
  211. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +7 -1
  212. package/dist/docs/reference/geometry/RevolveOptions.md +16 -2
  213. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +11 -1
  214. package/dist/docs/reference/geometry/RowLayoutOptions.md +10 -4
  215. package/dist/docs/reference/geometry/SampleContourOptions.md +8 -2
  216. package/dist/docs/reference/geometry/SampleHelixOptions.md +8 -2
  217. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +8 -2
  218. package/dist/docs/reference/geometry/SampledCurve2.md +8 -2
  219. package/dist/docs/reference/geometry/SampledCurve3.md +8 -2
  220. package/dist/docs/reference/geometry/SampledThreadHelices.md +8 -2
  221. package/dist/docs/reference/geometry/SideProfileCurve.md +8 -2
  222. package/dist/docs/reference/geometry/SideProfilePoint.md +8 -2
  223. package/dist/docs/reference/geometry/SideProfileSegment.md +8 -2
  224. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +11 -1
  225. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +12 -2
  226. package/dist/docs/reference/geometry/SphereOptions.md +11 -1
  227. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +16 -2
  228. package/dist/docs/reference/geometry/StarContourOptions.md +12 -2
  229. package/dist/docs/reference/geometry/StrokeCap.md +12 -2
  230. package/dist/docs/reference/geometry/StrokeJoin.md +12 -2
  231. package/dist/docs/reference/geometry/StrokeOptions.md +12 -2
  232. package/dist/docs/reference/geometry/SvgImportOptions.md +8 -2
  233. package/dist/docs/reference/geometry/SvgRegionPreflight.md +8 -2
  234. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +8 -2
  235. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +8 -2
  236. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +8 -2
  237. package/dist/docs/reference/geometry/SweepOptions.md +16 -2
  238. package/dist/docs/reference/geometry/SweepOrientation.md +16 -2
  239. package/dist/docs/reference/geometry/ThreadBevelOptions.md +12 -2
  240. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +8 -2
  241. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +8 -2
  242. package/dist/docs/reference/geometry/ThreadEndStyle.md +16 -2
  243. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +16 -2
  244. package/dist/docs/reference/geometry/ThreadHandedness.md +16 -2
  245. package/dist/docs/reference/geometry/ThreadHelixOptions.md +8 -2
  246. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +16 -2
  247. package/dist/docs/reference/geometry/ThreadLeadInShape.md +16 -2
  248. package/dist/docs/reference/geometry/ThreadProfile-type.md +16 -2
  249. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +16 -2
  250. package/dist/docs/reference/geometry/ThreadProfileSpec.md +16 -2
  251. package/dist/docs/reference/geometry/ThreadRidgeOptions.md +16 -2
  252. package/dist/docs/reference/geometry/ThreadRole.md +8 -2
  253. package/dist/docs/reference/geometry/ThreadSolidOptions.md +12 -2
  254. package/dist/docs/reference/geometry/ThreadSolidPreflight.md +16 -2
  255. package/dist/docs/reference/geometry/ThreadedNutOptions.md +12 -2
  256. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +12 -2
  257. package/dist/docs/reference/geometry/ThreadedNutShape.md +12 -2
  258. package/dist/docs/reference/geometry/ThreadedRodOptions.md +12 -2
  259. package/dist/docs/reference/geometry/TorusOptions.md +11 -1
  260. package/dist/docs/reference/geometry/Transform2-type.md +17 -3
  261. package/dist/docs/reference/geometry/Transform2Data.md +17 -3
  262. package/dist/docs/reference/geometry/Transform2Input.md +17 -3
  263. package/dist/docs/reference/geometry/Transform3-type.md +17 -3
  264. package/dist/docs/reference/geometry/Transform3Data.md +17 -3
  265. package/dist/docs/reference/geometry/Transform3Input.md +17 -3
  266. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +16 -2
  267. package/dist/docs/reference/geometry/TriangleMesh.md +20 -2
  268. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +16 -2
  269. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +12 -2
  270. package/dist/docs/reference/geometry/TriangleMeshInput.md +12 -2
  271. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +16 -2
  272. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +12 -2
  273. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +12 -2
  274. package/dist/docs/reference/geometry/TriangleMeshSignature.md +12 -2
  275. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +12 -2
  276. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +12 -2
  277. package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +16 -2
  278. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +12 -2
  279. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +16 -2
  280. package/dist/docs/reference/geometry/TubeOptions.md +11 -1
  281. package/dist/docs/reference/geometry/Vector2-type.md +17 -3
  282. package/dist/docs/reference/geometry/Vector2Data.md +21 -3
  283. package/dist/docs/reference/geometry/Vector2Input.md +17 -3
  284. package/dist/docs/reference/geometry/Vector3-type.md +17 -3
  285. package/dist/docs/reference/geometry/Vector3Data.md +17 -3
  286. package/dist/docs/reference/geometry/Vector3Input.md +17 -3
  287. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +12 -2
  288. package/dist/docs/reference/geometry/VectorTextLayout.md +16 -2
  289. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +12 -2
  290. package/dist/docs/reference/geometry/VectorTextMetrics.md +16 -2
  291. package/dist/docs/reference/geometry/VectorTextOptions.md +12 -2
  292. package/dist/docs/reference/geometry/add2.md +9 -3
  293. package/dist/docs/reference/geometry/add3.md +9 -3
  294. package/dist/docs/reference/geometry/anchor3.md +9 -3
  295. package/dist/docs/reference/geometry/anchorFrame3.md +8 -2
  296. package/dist/docs/reference/geometry/applyTransformDirection3.md +9 -3
  297. package/dist/docs/reference/geometry/applyTransformPoint3.md +9 -3
  298. package/dist/docs/reference/geometry/attachmentTransform3.md +9 -3
  299. package/dist/docs/reference/geometry/bounds2.md +16 -6
  300. package/dist/docs/reference/geometry/bounds3.md +16 -6
  301. package/dist/docs/reference/geometry/boundsCenter.md +10 -4
  302. package/dist/docs/reference/geometry/boundsSize.md +10 -4
  303. package/dist/docs/reference/geometry/boxAnchor3.md +9 -3
  304. package/dist/docs/reference/geometry/categories/bounds-layout.md +4 -4
  305. package/dist/docs/reference/geometry/categories/curves-paths.md +2 -2
  306. package/dist/docs/reference/geometry/categories/mechanical.md +2 -2
  307. package/dist/docs/reference/geometry/categories/meshes.md +3 -3
  308. package/dist/docs/reference/geometry/categories/pattern-placement.md +2 -2
  309. package/dist/docs/reference/geometry/categories/primitive-options.md +2 -2
  310. package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -2
  311. package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
  312. package/dist/docs/reference/geometry/categories/transforms-math.md +3 -3
  313. package/dist/docs/reference/geometry/categories/vector-import.md +2 -2
  314. package/dist/docs/reference/geometry/circleContour.md +8 -2
  315. package/dist/docs/reference/geometry/closeToAxis.md +8 -2
  316. package/dist/docs/reference/geometry/compensateThreadDiameters.md +8 -2
  317. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +8 -2
  318. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +8 -2
  319. package/dist/docs/reference/geometry/composeTransform3.md +9 -3
  320. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +8 -2
  321. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -2
  322. package/dist/docs/reference/geometry/contourContainsPoint.md +8 -2
  323. package/dist/docs/reference/geometry/cross2.md +9 -3
  324. package/dist/docs/reference/geometry/cross3.md +9 -3
  325. package/dist/docs/reference/geometry/cylinderAnchor3.md +9 -3
  326. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +8 -2
  327. package/dist/docs/reference/geometry/distance2.md +9 -3
  328. package/dist/docs/reference/geometry/distance3.md +9 -3
  329. package/dist/docs/reference/geometry/distributeAlongPath.md +8 -2
  330. package/dist/docs/reference/geometry/dot2.md +9 -3
  331. package/dist/docs/reference/geometry/dot3.md +9 -3
  332. package/dist/docs/reference/geometry/ellipseContour.md +8 -2
  333. package/dist/docs/reference/geometry/eulerTransform3.md +9 -3
  334. package/dist/docs/reference/geometry/fitBounds.md +10 -4
  335. package/dist/docs/reference/geometry/fitTextLayout.md +8 -2
  336. package/dist/docs/reference/geometry/frameTransform3.md +9 -3
  337. package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +8 -2
  338. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +8 -2
  339. package/dist/docs/reference/geometry/gridPatternTransforms.md +8 -2
  340. package/dist/docs/reference/geometry/immutableBuffer.md +12 -2
  341. package/dist/docs/reference/geometry/inverseTransform3.md +9 -3
  342. package/dist/docs/reference/geometry/isGeometryError.md +11 -1
  343. package/dist/docs/reference/geometry/layoutRow.md +10 -4
  344. package/dist/docs/reference/geometry/length2.md +9 -3
  345. package/dist/docs/reference/geometry/length3.md +9 -3
  346. package/dist/docs/reference/geometry/lerp2.md +9 -3
  347. package/dist/docs/reference/geometry/lerp3.md +9 -3
  348. package/dist/docs/reference/geometry/linearPatternTransforms.md +8 -2
  349. package/dist/docs/reference/geometry/matchProfiles.md +8 -2
  350. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +8 -2
  351. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +8 -2
  352. package/dist/docs/reference/geometry/normalize2.md +9 -3
  353. package/dist/docs/reference/geometry/normalize3.md +9 -3
  354. package/dist/docs/reference/geometry/normalizeContour.md +8 -2
  355. package/dist/docs/reference/geometry/normalizePolygon.md +8 -2
  356. package/dist/docs/reference/geometry/normalizeRegion.md +8 -2
  357. package/dist/docs/reference/geometry/path2.md +12 -2
  358. package/dist/docs/reference/geometry/path3.md +12 -2
  359. package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -2
  360. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +8 -2
  361. package/dist/docs/reference/geometry/preflightSvgRegion.md +8 -2
  362. package/dist/docs/reference/geometry/preflightThreadedNut.md +8 -2
  363. package/dist/docs/reference/geometry/preflightThreadedRod.md +8 -2
  364. package/dist/docs/reference/geometry/projectOntoPlane3.md +9 -3
  365. package/dist/docs/reference/geometry/radialPatternTransforms.md +8 -2
  366. package/dist/docs/reference/geometry/rectangleContour.md +8 -2
  367. package/dist/docs/reference/geometry/rectangleProfile.md +8 -2
  368. package/dist/docs/reference/geometry/regionArea.md +8 -2
  369. package/dist/docs/reference/geometry/regionBounds.md +8 -2
  370. package/dist/docs/reference/geometry/regularPolygonContour.md +8 -2
  371. package/dist/docs/reference/geometry/resamplePolyline2.md +8 -2
  372. package/dist/docs/reference/geometry/resamplePolyline3.md +8 -2
  373. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +7 -1
  374. package/dist/docs/reference/geometry/resolveArcSegments.md +7 -1
  375. package/dist/docs/reference/geometry/resolveCircularSampling.md +7 -1
  376. package/dist/docs/reference/geometry/resolveCircularSegments.md +7 -1
  377. package/dist/docs/reference/geometry/resolveCylindricalGear.md +8 -2
  378. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +8 -2
  379. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +8 -2
  380. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +8 -2
  381. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +7 -1
  382. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +8 -2
  383. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +8 -2
  384. package/dist/docs/reference/geometry/resolveRackPitch.md +8 -2
  385. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -2
  386. package/dist/docs/reference/geometry/rotate2.md +9 -3
  387. package/dist/docs/reference/geometry/rotationTransform3.md +9 -3
  388. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -2
  389. package/dist/docs/reference/geometry/sampleContour.md +8 -2
  390. package/dist/docs/reference/geometry/sampleCurve2.md +8 -2
  391. package/dist/docs/reference/geometry/sampleCurve3.md +8 -2
  392. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +8 -2
  393. package/dist/docs/reference/geometry/sampleHelix.md +8 -2
  394. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +8 -2
  395. package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -2
  396. package/dist/docs/reference/geometry/sampleSideProfile.md +8 -2
  397. package/dist/docs/reference/geometry/sampleTextContours.md +8 -2
  398. package/dist/docs/reference/geometry/sampleThreadHelices.md +8 -2
  399. package/dist/docs/reference/geometry/scale2.md +9 -3
  400. package/dist/docs/reference/geometry/scale3.md +9 -3
  401. package/dist/docs/reference/geometry/scaleTransform3.md +9 -3
  402. package/dist/docs/reference/geometry/signedContourArea.md +8 -2
  403. package/dist/docs/reference/geometry/starContour.md +8 -2
  404. package/dist/docs/reference/geometry/strokeRegionData.md +8 -2
  405. package/dist/docs/reference/geometry/subtract2.md +9 -3
  406. package/dist/docs/reference/geometry/subtract3.md +9 -3
  407. package/dist/docs/reference/geometry/threadProfile.md +8 -2
  408. package/dist/docs/reference/geometry/transform2.md +13 -3
  409. package/dist/docs/reference/geometry/transform3.md +13 -3
  410. package/dist/docs/reference/geometry/transformDeterminant3.md +9 -3
  411. package/dist/docs/reference/geometry/transformRegionData.md +8 -2
  412. package/dist/docs/reference/geometry/translationTransform3.md +9 -3
  413. package/dist/docs/reference/geometry/triangulateContour.md +8 -2
  414. package/dist/docs/reference/geometry/validateRigidTransform3.md +9 -3
  415. package/dist/docs/reference/geometry/validateTransform3.md +9 -3
  416. package/dist/docs/reference/geometry/vector2.md +13 -3
  417. package/dist/docs/reference/geometry/vector3.md +13 -3
  418. package/dist/docs/reference/geometry.md +2 -2
  419. package/dist/docs/reference/mesh/MeshRenderOptions.md +28 -0
  420. package/dist/docs/reference/mesh/RenderMesh.md +68 -0
  421. package/dist/docs/reference/mesh/analyze.md +12 -6
  422. package/dist/docs/reference/mesh/analyzeQuality.md +11 -5
  423. package/dist/docs/reference/mesh/bounds.md +10 -4
  424. package/dist/docs/reference/mesh/categories/operations.md +5 -95
  425. package/dist/docs/reference/mesh/centroid.md +10 -4
  426. package/dist/docs/reference/mesh/extrude.md +11 -5
  427. package/dist/docs/reference/mesh/heightfield.md +11 -5
  428. package/dist/docs/reference/mesh/immutable.md +13 -9
  429. package/dist/docs/reference/mesh/join.md +10 -4
  430. package/dist/docs/reference/mesh/loft.md +11 -5
  431. package/dist/docs/reference/mesh/optimizePlanarPatches.md +11 -5
  432. package/dist/docs/reference/mesh/preflightHeightfield.md +11 -5
  433. package/dist/docs/reference/mesh/preflightThreadSolid.md +10 -4
  434. package/dist/docs/reference/mesh/render.md +57 -0
  435. package/dist/docs/reference/mesh/reverse.md +10 -4
  436. package/dist/docs/reference/mesh/revolve.md +11 -5
  437. package/dist/docs/reference/mesh/signature.md +11 -5
  438. package/dist/docs/reference/mesh/sweep.md +12 -6
  439. package/dist/docs/reference/mesh/threadRidge.md +10 -4
  440. package/dist/docs/reference/mesh/threadSolid.md +10 -4
  441. package/dist/docs/reference/mesh/transform.md +11 -5
  442. package/dist/docs/reference/mesh/validate.md +10 -4
  443. package/dist/docs/reference/mesh/validateSolid.md +10 -4
  444. package/dist/docs/reference/mesh.md +1 -1
  445. package/dist/docs/reference/model/CircleOptions.md +13 -7
  446. package/dist/docs/reference/model/DiagnosticOptions.md +7 -1
  447. package/dist/docs/reference/model/EllipseOptions.md +13 -7
  448. package/dist/docs/reference/model/GenerateCallback.md +7 -1
  449. package/dist/docs/reference/model/GenerateContext.md +14 -39
  450. package/dist/docs/reference/model/GenerationDiagnostic.md +7 -1
  451. package/dist/docs/reference/model/GenerationError.md +8 -2
  452. package/dist/docs/reference/model/HoleCutterOptions.md +17 -10
  453. package/dist/docs/reference/model/HoleCutterOverrun.md +10 -3
  454. package/dist/docs/reference/model/HoleCutterRecess.md +10 -3
  455. package/dist/docs/reference/model/HullOptions.md +13 -6
  456. package/dist/docs/reference/model/ImmutableValue.md +7 -1
  457. package/dist/docs/reference/model/ImplicitOptions.md +12 -6
  458. package/dist/docs/reference/model/JoinOptions.md +76 -0
  459. package/dist/docs/reference/model/JoinTransition.md +54 -0
  460. package/dist/docs/reference/model/KnuckleHinge-type.md +9 -3
  461. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +7 -1
  462. package/dist/docs/reference/model/KnuckleHingeOptions.md +10 -4
  463. package/dist/docs/reference/model/KnuckleHingeWeb.md +7 -1
  464. package/dist/docs/reference/model/LoftStation.md +16 -9
  465. package/dist/docs/reference/model/Memo.md +54 -0
  466. package/dist/docs/reference/model/ModelProgram.md +7 -1
  467. package/dist/docs/reference/model/PartDeclaration.md +11 -6
  468. package/dist/docs/reference/model/PartGeometry.md +10 -4
  469. package/dist/docs/reference/model/PartOptions.md +11 -6
  470. package/dist/docs/reference/model/PatternSource.md +10 -4
  471. package/dist/docs/reference/model/PlaneOptions.md +11 -4
  472. package/dist/docs/reference/model/PolygonOptions.md +20 -14
  473. package/dist/docs/reference/model/Profile.md +10 -4
  474. package/dist/docs/reference/model/RectangleOptions.md +28 -22
  475. package/dist/docs/reference/model/RegularPolygonOptions.md +13 -7
  476. package/dist/docs/reference/model/Section.md +68 -74
  477. package/dist/docs/reference/model/SectionHullOptions.md +13 -6
  478. package/dist/docs/reference/model/SectionInspection.md +10 -4
  479. package/dist/docs/reference/model/SectionOffsetJoin.md +10 -4
  480. package/dist/docs/reference/model/SectionOffsetOptions.md +12 -6
  481. package/dist/docs/reference/model/Solid.md +101 -53
  482. package/dist/docs/reference/model/SolidInspection.md +10 -4
  483. package/dist/docs/reference/model/SolidSegmentHit.md +11 -5
  484. package/dist/docs/reference/model/StarOptions.md +24 -18
  485. package/dist/docs/reference/model/SvgOrigin.md +10 -4
  486. package/dist/docs/reference/model/SvgPathSectionOptions.md +14 -8
  487. package/dist/docs/reference/model/SvgSectionOptions.md +16 -10
  488. package/dist/docs/reference/model/TextSectionOptions.md +14 -8
  489. package/dist/docs/reference/model/box.md +18 -11
  490. package/dist/docs/reference/model/categories/boolean-operations.md +8 -2
  491. package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -7
  492. package/dist/docs/reference/model/categories/explicit-profiles.md +1 -14
  493. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +6 -20
  494. package/dist/docs/reference/model/categories/generation.md +5 -10
  495. package/dist/docs/reference/model/categories/hinges.md +1 -4
  496. package/dist/docs/reference/model/categories/mesh-inspection.md +2 -6
  497. package/dist/docs/reference/model/categories/primitives.md +5 -21
  498. package/dist/docs/reference/model/categories/sections.md +4 -15
  499. package/dist/docs/reference/model/categories/threads.md +2 -39
  500. package/dist/docs/reference/model/categories/transforms-placement.md +4 -33
  501. package/dist/docs/reference/model/circle.md +10 -4
  502. package/dist/docs/reference/model/cylinder.md +13 -6
  503. package/dist/docs/reference/model/ellipse.md +10 -4
  504. package/dist/docs/reference/model/extrude.md +26 -19
  505. package/dist/docs/reference/model/generate.md +8 -2
  506. package/dist/docs/reference/model/gridPattern.md +15 -9
  507. package/dist/docs/reference/model/heightfield.md +10 -4
  508. package/dist/docs/reference/model/holeCutter.md +10 -3
  509. package/dist/docs/reference/model/hull.md +9 -2
  510. package/dist/docs/reference/model/implicit.md +9 -3
  511. package/dist/docs/reference/model/internalThreadCutter.md +23 -17
  512. package/dist/docs/reference/model/intersect.md +9 -2
  513. package/dist/docs/reference/model/join.md +89 -0
  514. package/dist/docs/reference/model/knuckleHinge.md +7 -1
  515. package/dist/docs/reference/model/linearPattern.md +15 -9
  516. package/dist/docs/reference/model/loft.md +31 -24
  517. package/dist/docs/reference/model/matchProfiles.md +14 -8
  518. package/dist/docs/reference/model/minkowskiSum.md +9 -2
  519. package/dist/docs/reference/model/pathPattern.md +25 -19
  520. package/dist/docs/reference/model/polygon.md +13 -7
  521. package/dist/docs/reference/model/preflightInternalThreadCutter.md +25 -19
  522. package/dist/docs/reference/model/preflightThreadedNut.md +29 -23
  523. package/dist/docs/reference/model/preflightThreadedRod.md +25 -19
  524. package/dist/docs/reference/model/radialPattern.md +15 -9
  525. package/dist/docs/reference/model/rectangle.md +14 -8
  526. package/dist/docs/reference/model/regularPolygon.md +10 -4
  527. package/dist/docs/reference/model/revolve.md +22 -15
  528. package/dist/docs/reference/model/solidFromMesh.md +12 -6
  529. package/dist/docs/reference/model/sphere.md +13 -6
  530. package/dist/docs/reference/model/star.md +12 -6
  531. package/dist/docs/reference/model/stroke.md +21 -15
  532. package/dist/docs/reference/model/svgPathSection.md +12 -6
  533. package/dist/docs/reference/model/svgSection.md +13 -7
  534. package/dist/docs/reference/model/sweep.md +27 -20
  535. package/dist/docs/reference/model/textSection.md +15 -9
  536. package/dist/docs/reference/model/threadRidge.md +21 -15
  537. package/dist/docs/reference/model/threadedNut.md +27 -21
  538. package/dist/docs/reference/model/threadedRod.md +23 -17
  539. package/dist/docs/reference/model/torus.md +20 -13
  540. package/dist/docs/reference/model/tube.md +13 -6
  541. package/dist/docs/reference/model/union.md +9 -2
  542. package/dist/docs/reference/model.md +3 -8
  543. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -1
  544. package/dist/docs/reference/text/VectorFont.md +39 -33
  545. package/dist/docs/reference/text/VectorFontOptions.md +7 -1
  546. package/dist/docs/reference/text/categories/font-preparation.md +1 -13
  547. package/dist/docs/reference/text/prepareVectorFont.md +7 -1
  548. package/dist/docs/reference/text.md +1 -1
  549. package/dist/engine/finalization.js +2 -74
  550. package/dist/engine/index.js +2 -2
  551. package/dist/engine/native/construction-mesh.js +41 -0
  552. package/dist/engine/native/material-components.js +2 -51
  553. package/dist/engine/native/mesh-observation.js +55 -0
  554. package/dist/engine/native/regions.js +2 -1
  555. package/dist/engine/operations/context.js +2 -0
  556. package/dist/engine/operations/extrusion-finishing.js +17 -16
  557. package/dist/engine/operations/join-collar-profile.js +120 -0
  558. package/dist/engine/operations/join.js +508 -0
  559. package/dist/engine/recipe-realization.js +1 -1
  560. package/dist/engine/session/dependencies.js +89 -42
  561. package/dist/engine/session/graph.js +319 -342
  562. package/dist/engine/session/native-cache.js +1 -1
  563. package/dist/engine/session/session.js +5 -5
  564. package/dist/engine/session/snapshot-cache.js +2 -2
  565. package/dist/export/3mf.js +190 -0
  566. package/dist/export/capture.js +178 -0
  567. package/dist/export/glb.js +209 -0
  568. package/dist/export/index.js +5 -0
  569. package/dist/export/limits.js +18 -0
  570. package/dist/export/stl.js +105 -0
  571. package/dist/export/types.js +1 -0
  572. package/dist/export/writer.js +54 -0
  573. package/dist/geometry/bounds-value.js +4 -4
  574. package/dist/geometry/immutable-buffer.js +4 -6
  575. package/dist/geometry/join-geometry.js +839 -0
  576. package/dist/geometry/mesh/mesh-render.js +205 -0
  577. package/dist/geometry/mesh/mesh-solid-intersections.js +43 -17
  578. package/dist/geometry/mesh/mesh-solid.js +6 -2
  579. package/dist/geometry/mesh-api.js +1 -0
  580. package/dist/geometry/region-offset.js +278 -0
  581. package/dist/geometry/regions.js +11 -1
  582. package/dist/model/execution-binding.js +3 -3
  583. package/dist/model/generation.js +2 -2
  584. package/dist/model/immutable-generation-data.js +13 -13
  585. package/dist/model/join.js +1 -0
  586. package/dist/model/operations.js +20 -0
  587. package/dist/model/recipe-declaration.js +1 -0
  588. package/dist/model/shape-handles.js +1 -0
  589. package/package.json +18 -1
  590. package/dist/docs/reference/engine/Export3mfOptions.md +0 -46
  591. package/dist/docs/reference/engine/ExportMeshPart.md +0 -31
  592. package/dist/docs/reference/engine/ModelingLimits.md +0 -121
  593. package/dist/docs/reference/engine/export3mf.md +0 -55
  594. package/dist/docs/reference/mesh/AcmeThreadProfileSpec.md +0 -79
  595. package/dist/docs/reference/mesh/Bevel.md +0 -18
  596. package/dist/docs/reference/mesh/BevelSize.md +0 -14
  597. package/dist/docs/reference/mesh/Bounds2.md +0 -125
  598. package/dist/docs/reference/mesh/Bounds2Data.md +0 -43
  599. package/dist/docs/reference/mesh/Bounds2Input.md +0 -19
  600. package/dist/docs/reference/mesh/Bounds3.md +0 -125
  601. package/dist/docs/reference/mesh/Bounds3Data.md +0 -43
  602. package/dist/docs/reference/mesh/Bounds3Input.md +0 -19
  603. package/dist/docs/reference/mesh/ButtressPressureFlankSide.md +0 -14
  604. package/dist/docs/reference/mesh/ButtressThreadProfileSpec.md +0 -97
  605. package/dist/docs/reference/mesh/CircularPrimitiveOptions.md +0 -60
  606. package/dist/docs/reference/mesh/CurveSamplingOptions.md +0 -69
  607. package/dist/docs/reference/mesh/CustomThreadProfileSpec.md +0 -77
  608. package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +0 -129
  609. package/dist/docs/reference/mesh/ExtrusionSamplingOptions.md +0 -81
  610. package/dist/docs/reference/mesh/Frame3.md +0 -62
  611. package/dist/docs/reference/mesh/GeometryResolution.md +0 -74
  612. package/dist/docs/reference/mesh/GeometrySamplingLimits.md +0 -66
  613. package/dist/docs/reference/mesh/GeometryToleranceOptions.md +0 -46
  614. package/dist/docs/reference/mesh/HeightfieldMeshLimits.md +0 -18
  615. package/dist/docs/reference/mesh/HeightfieldOptions.md +0 -72
  616. package/dist/docs/reference/mesh/HeightfieldPreflight.md +0 -58
  617. package/dist/docs/reference/mesh/ImmutableBuffer.md +0 -108
  618. package/dist/docs/reference/mesh/ImmutableTriangleMesh.md +0 -43
  619. package/dist/docs/reference/mesh/LoftCorrespondence.md +0 -24
  620. package/dist/docs/reference/mesh/LoftMeshStation.md +0 -31
  621. package/dist/docs/reference/mesh/LoftOptions.md +0 -88
  622. package/dist/docs/reference/mesh/LoftPlacement.md +0 -70
  623. package/dist/docs/reference/mesh/ModelingLimits.md +0 -130
  624. package/dist/docs/reference/mesh/NumericArray.md +0 -14
  625. package/dist/docs/reference/mesh/Path2.md +0 -197
  626. package/dist/docs/reference/mesh/Path2Data.md +0 -50
  627. package/dist/docs/reference/mesh/Path2Input.md +0 -20
  628. package/dist/docs/reference/mesh/Path3.md +0 -197
  629. package/dist/docs/reference/mesh/Path3Data.md +0 -50
  630. package/dist/docs/reference/mesh/Path3Input.md +0 -20
  631. package/dist/docs/reference/mesh/PathLocation.md +0 -69
  632. package/dist/docs/reference/mesh/PathNormalGuide.md +0 -43
  633. package/dist/docs/reference/mesh/PathResamplingOptions.md +0 -84
  634. package/dist/docs/reference/mesh/Pivot2Options.md +0 -26
  635. package/dist/docs/reference/mesh/Pivot3Options.md +0 -26
  636. package/dist/docs/reference/mesh/PlanarMeshOptimizationFallbackReason.md +0 -14
  637. package/dist/docs/reference/mesh/PlanarMeshOptimizationOptions.md +0 -160
  638. package/dist/docs/reference/mesh/PlanarMeshOptimizationResult.md +0 -124
  639. package/dist/docs/reference/mesh/PlanarPatchQuality.md +0 -194
  640. package/dist/docs/reference/mesh/RevolveOptions.md +0 -91
  641. package/dist/docs/reference/mesh/SolidMeshValidationOptions.md +0 -38
  642. package/dist/docs/reference/mesh/SquareThreadProfileSpec.md +0 -79
  643. package/dist/docs/reference/mesh/SweepOptions.md +0 -113
  644. package/dist/docs/reference/mesh/SweepOrientation.md +0 -113
  645. package/dist/docs/reference/mesh/ThreadEndStyle.md +0 -14
  646. package/dist/docs/reference/mesh/ThreadEndTreatmentOptions.md +0 -117
  647. package/dist/docs/reference/mesh/ThreadHandedness.md +0 -14
  648. package/dist/docs/reference/mesh/ThreadLeadInEnvelope.md +0 -14
  649. package/dist/docs/reference/mesh/ThreadLeadInShape.md +0 -14
  650. package/dist/docs/reference/mesh/ThreadProfile.md +0 -86
  651. package/dist/docs/reference/mesh/ThreadProfileBaseSpec.md +0 -53
  652. package/dist/docs/reference/mesh/ThreadProfileSpec.md +0 -23
  653. package/dist/docs/reference/mesh/ThreadRidgeOptions.md +0 -145
  654. package/dist/docs/reference/mesh/ThreadSolidOptions.md +0 -222
  655. package/dist/docs/reference/mesh/ThreadSolidPreflight.md +0 -58
  656. package/dist/docs/reference/mesh/Transform2.md +0 -256
  657. package/dist/docs/reference/mesh/Transform2Data.md +0 -14
  658. package/dist/docs/reference/mesh/Transform2Input.md +0 -19
  659. package/dist/docs/reference/mesh/Transform3.md +0 -296
  660. package/dist/docs/reference/mesh/Transform3Data.md +0 -17
  661. package/dist/docs/reference/mesh/Transform3Input.md +0 -19
  662. package/dist/docs/reference/mesh/TrapezoidalThreadProfileSpec.md +0 -96
  663. package/dist/docs/reference/mesh/TriangleMesh.md +0 -34
  664. package/dist/docs/reference/mesh/TriangleMeshAnalysis.md +0 -129
  665. package/dist/docs/reference/mesh/TriangleMeshAnalysisOptions.md +0 -79
  666. package/dist/docs/reference/mesh/TriangleMeshInput.md +0 -19
  667. package/dist/docs/reference/mesh/TriangleMeshMeasurements.md +0 -79
  668. package/dist/docs/reference/mesh/TriangleMeshQualityOptions.md +0 -43
  669. package/dist/docs/reference/mesh/TriangleMeshQualityReport.md +0 -194
  670. package/dist/docs/reference/mesh/TriangleMeshSignature.md +0 -111
  671. package/dist/docs/reference/mesh/TriangleMeshSignatureOptions.md +0 -46
  672. package/dist/docs/reference/mesh/TriangleMeshSignatureTolerances.md +0 -34
  673. package/dist/docs/reference/mesh/TriangleMeshTopologyAnalysis.md +0 -131
  674. package/dist/docs/reference/mesh/TriangleMeshValidationOptions.md +0 -55
  675. package/dist/docs/reference/mesh/TriangularThreadProfileSpec.md +0 -95
  676. package/dist/docs/reference/mesh/Vector2.md +0 -270
  677. package/dist/docs/reference/mesh/Vector2Data.md +0 -14
  678. package/dist/docs/reference/mesh/Vector2Input.md +0 -19
  679. package/dist/docs/reference/mesh/Vector3.md +0 -282
  680. package/dist/docs/reference/mesh/Vector3Data.md +0 -14
  681. package/dist/docs/reference/mesh/Vector3Input.md +0 -19
  682. package/dist/docs/reference/model/AcmeThreadProfileSpec.md +0 -80
  683. package/dist/docs/reference/model/Anchor3.md +0 -55
  684. package/dist/docs/reference/model/AttachOptions.md +0 -69
  685. package/dist/docs/reference/model/Bevel.md +0 -19
  686. package/dist/docs/reference/model/BevelSize.md +0 -15
  687. package/dist/docs/reference/model/Bounds2-type.md +0 -125
  688. package/dist/docs/reference/model/Bounds2Data.md +0 -44
  689. package/dist/docs/reference/model/Bounds2Input.md +0 -19
  690. package/dist/docs/reference/model/Bounds2Options.md +0 -110
  691. package/dist/docs/reference/model/Bounds3-type.md +0 -125
  692. package/dist/docs/reference/model/Bounds3Data.md +0 -44
  693. package/dist/docs/reference/model/Bounds3Input.md +0 -19
  694. package/dist/docs/reference/model/Bounds3Options.md +0 -110
  695. package/dist/docs/reference/model/BoxEdge.md +0 -15
  696. package/dist/docs/reference/model/BoxEdgeSelection.md +0 -19
  697. package/dist/docs/reference/model/BoxEdgeTreatments.md +0 -20
  698. package/dist/docs/reference/model/BoxOptions.md +0 -92
  699. package/dist/docs/reference/model/ButtressPressureFlankSide.md +0 -15
  700. package/dist/docs/reference/model/ButtressThreadProfileSpec.md +0 -98
  701. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +0 -35
  702. package/dist/docs/reference/model/CircleContourOptions.md +0 -21
  703. package/dist/docs/reference/model/CircularPrimitiveOptions.md +0 -62
  704. package/dist/docs/reference/model/Computed.md +0 -44
  705. package/dist/docs/reference/model/ComputedValue.md +0 -24
  706. package/dist/docs/reference/model/Contour.md +0 -24
  707. package/dist/docs/reference/model/CorrespondingComponent.md +0 -46
  708. package/dist/docs/reference/model/CorrespondingContour.md +0 -46
  709. package/dist/docs/reference/model/CorrespondingProfile.md +0 -22
  710. package/dist/docs/reference/model/CorrespondingProfileStation.md +0 -27
  711. package/dist/docs/reference/model/CurveSamplingOptions.md +0 -68
  712. package/dist/docs/reference/model/CustomThreadProfileSpec.md +0 -78
  713. package/dist/docs/reference/model/CylinderOptions.md +0 -58
  714. package/dist/docs/reference/model/EdgeTreatment.md +0 -22
  715. package/dist/docs/reference/model/EllipseContourOptions.md +0 -21
  716. package/dist/docs/reference/model/EndTreatments.md +0 -39
  717. package/dist/docs/reference/model/ExtrudeMeshOptions.md +0 -133
  718. package/dist/docs/reference/model/ExtrudeOptions.md +0 -149
  719. package/dist/docs/reference/model/ExtrusionSamplingOptions.md +0 -84
  720. package/dist/docs/reference/model/Frame3.md +0 -63
  721. package/dist/docs/reference/model/GeometryError.md +0 -102
  722. package/dist/docs/reference/model/GeometryErrorCode.md +0 -15
  723. package/dist/docs/reference/model/GeometryErrorContext.md +0 -35
  724. package/dist/docs/reference/model/GeometryResolution.md +0 -70
  725. package/dist/docs/reference/model/GeometrySamplingLimits.md +0 -62
  726. package/dist/docs/reference/model/GeometryToleranceOptions.md +0 -46
  727. package/dist/docs/reference/model/GridPatternOptions.md +0 -50
  728. package/dist/docs/reference/model/HeightfieldOptions.md +0 -68
  729. package/dist/docs/reference/model/ImmutableBuffer-type.md +0 -108
  730. package/dist/docs/reference/model/ImmutableTriangleMesh.md +0 -43
  731. package/dist/docs/reference/model/InternalThreadCutterOptions.md +0 -216
  732. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +0 -77
  733. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +0 -47
  734. package/dist/docs/reference/model/KnuckleHingeSpec.md +0 -18
  735. package/dist/docs/reference/model/LinearPatternOptions.md +0 -39
  736. package/dist/docs/reference/model/LoftCorrespondence.md +0 -27
  737. package/dist/docs/reference/model/LoftOptions.md +0 -91
  738. package/dist/docs/reference/model/LoftPlacement.md +0 -73
  739. package/dist/docs/reference/model/MatchProfilesOptions.md +0 -35
  740. package/dist/docs/reference/model/ModelingLimits.md +0 -126
  741. package/dist/docs/reference/model/NumericArray.md +0 -14
  742. package/dist/docs/reference/model/Path2-type.md +0 -196
  743. package/dist/docs/reference/model/Path2Data.md +0 -50
  744. package/dist/docs/reference/model/Path2Input.md +0 -20
  745. package/dist/docs/reference/model/Path3-type.md +0 -196
  746. package/dist/docs/reference/model/Path3Data.md +0 -50
  747. package/dist/docs/reference/model/Path3Input.md +0 -20
  748. package/dist/docs/reference/model/PathLocation.md +0 -69
  749. package/dist/docs/reference/model/PathNormalGuide.md +0 -46
  750. package/dist/docs/reference/model/PathOptions.md +0 -38
  751. package/dist/docs/reference/model/PathPatternOptions.md +0 -48
  752. package/dist/docs/reference/model/PathResamplingOptions.md +0 -84
  753. package/dist/docs/reference/model/Pivot2Options.md +0 -28
  754. package/dist/docs/reference/model/Pivot3Options.md +0 -28
  755. package/dist/docs/reference/model/PolygonData.md +0 -44
  756. package/dist/docs/reference/model/PrimitiveAttachment.md +0 -39
  757. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +0 -110
  758. package/dist/docs/reference/model/PrintableThreadFit.md +0 -15
  759. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +0 -51
  760. package/dist/docs/reference/model/ProfileComponent2.md +0 -46
  761. package/dist/docs/reference/model/ProfileContour2.md +0 -36
  762. package/dist/docs/reference/model/ProfileSpan2.md +0 -47
  763. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +0 -41
  764. package/dist/docs/reference/model/RadialPatternOptions.md +0 -59
  765. package/dist/docs/reference/model/RadialSizing.md +0 -15
  766. package/dist/docs/reference/model/RadialSizingOptions.md +0 -40
  767. package/dist/docs/reference/model/RectangleContourOptions.md +0 -72
  768. package/dist/docs/reference/model/RectangleCornerTreatment.md +0 -40
  769. package/dist/docs/reference/model/RectangleCornerTreatments.md +0 -20
  770. package/dist/docs/reference/model/RegionData.md +0 -19
  771. package/dist/docs/reference/model/RevolveOptions.md +0 -94
  772. package/dist/docs/reference/model/RoundedEdgeTreatment.md +0 -96
  773. package/dist/docs/reference/model/SmoothEdgeTreatment.md +0 -76
  774. package/dist/docs/reference/model/SphereOptions.md +0 -20
  775. package/dist/docs/reference/model/SquareThreadProfileSpec.md +0 -80
  776. package/dist/docs/reference/model/StarContourOptions.md +0 -81
  777. package/dist/docs/reference/model/StrokeCap.md +0 -16
  778. package/dist/docs/reference/model/StrokeJoin.md +0 -16
  779. package/dist/docs/reference/model/StrokeOptions.md +0 -91
  780. package/dist/docs/reference/model/SweepOptions.md +0 -116
  781. package/dist/docs/reference/model/SweepOrientation.md +0 -116
  782. package/dist/docs/reference/model/ThreadBevelOptions.md +0 -35
  783. package/dist/docs/reference/model/ThreadEndStyle.md +0 -15
  784. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +0 -118
  785. package/dist/docs/reference/model/ThreadHandedness.md +0 -15
  786. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +0 -15
  787. package/dist/docs/reference/model/ThreadLeadInShape.md +0 -15
  788. package/dist/docs/reference/model/ThreadProfile.md +0 -87
  789. package/dist/docs/reference/model/ThreadProfileBaseSpec.md +0 -54
  790. package/dist/docs/reference/model/ThreadProfileSpec.md +0 -24
  791. package/dist/docs/reference/model/ThreadRidgeOptions.md +0 -141
  792. package/dist/docs/reference/model/ThreadSolidPreflight.md +0 -59
  793. package/dist/docs/reference/model/ThreadedNutOptions.md +0 -263
  794. package/dist/docs/reference/model/ThreadedNutPreflight.md +0 -111
  795. package/dist/docs/reference/model/ThreadedNutShape.md +0 -15
  796. package/dist/docs/reference/model/ThreadedRodOptions.md +0 -216
  797. package/dist/docs/reference/model/TorusOptions.md +0 -110
  798. package/dist/docs/reference/model/Transform2-type.md +0 -257
  799. package/dist/docs/reference/model/Transform2Data.md +0 -16
  800. package/dist/docs/reference/model/Transform2Input.md +0 -21
  801. package/dist/docs/reference/model/Transform3-type.md +0 -297
  802. package/dist/docs/reference/model/Transform3Data.md +0 -19
  803. package/dist/docs/reference/model/Transform3Input.md +0 -21
  804. package/dist/docs/reference/model/TrapezoidalThreadProfileSpec.md +0 -97
  805. package/dist/docs/reference/model/TriangleMesh.md +0 -34
  806. package/dist/docs/reference/model/TriangleMeshAnalysis.md +0 -129
  807. package/dist/docs/reference/model/TriangleMeshMeasurements.md +0 -79
  808. package/dist/docs/reference/model/TriangleMeshTopologyAnalysis.md +0 -131
  809. package/dist/docs/reference/model/TriangularThreadProfileSpec.md +0 -96
  810. package/dist/docs/reference/model/TubeOptions.md +0 -67
  811. package/dist/docs/reference/model/Vector2-type.md +0 -271
  812. package/dist/docs/reference/model/Vector2Data.md +0 -15
  813. package/dist/docs/reference/model/Vector2Input.md +0 -21
  814. package/dist/docs/reference/model/Vector3-type.md +0 -283
  815. package/dist/docs/reference/model/Vector3Data.md +0 -15
  816. package/dist/docs/reference/model/Vector3Input.md +0 -21
  817. package/dist/docs/reference/model/VectorTextLayout.md +0 -40
  818. package/dist/docs/reference/model/VectorTextMetrics.md +0 -100
  819. package/dist/docs/reference/model/bounds2.md +0 -37
  820. package/dist/docs/reference/model/bounds3.md +0 -37
  821. package/dist/docs/reference/model/categories/bounds.md +0 -38
  822. package/dist/docs/reference/model/categories/contracts.md +0 -16
  823. package/dist/docs/reference/model/categories/core-values-errors.md +0 -44
  824. package/dist/docs/reference/model/categories/paths.md +0 -42
  825. package/dist/docs/reference/model/categories/resolution.md +0 -20
  826. package/dist/docs/reference/model/immutableBuffer.md +0 -49
  827. package/dist/docs/reference/model/isGeometryError.md +0 -34
  828. package/dist/docs/reference/model/path2.md +0 -54
  829. package/dist/docs/reference/model/path3.md +0 -49
  830. package/dist/docs/reference/model/transform2.md +0 -46
  831. package/dist/docs/reference/model/transform3.md +0 -48
  832. package/dist/docs/reference/model/vector2.md +0 -40
  833. package/dist/docs/reference/model/vector3.md +0 -47
  834. package/dist/docs/reference/text/Bounds2Data.md +0 -34
  835. package/dist/docs/reference/text/Vector2Data.md +0 -7
  836. package/dist/docs/reference/text/VectorTextArcBaseline.md +0 -53
  837. package/dist/docs/reference/text/VectorTextLayout.md +0 -34
  838. package/dist/docs/reference/text/VectorTextLayoutOptions.md +0 -111
  839. package/dist/docs/reference/text/VectorTextMetrics.md +0 -94
  840. package/dist/docs/reference/text/VectorTextOptions.md +0 -50
  841. package/dist/engine/export-3mf.js +0 -23
  842. package/dist/engine/serialize-3mf.js +0 -116
  843. /package/dist/{engine → geometry/mesh}/mesh-view-cache.js +0 -0
@@ -0,0 +1,120 @@
1
+ import { GeometryError } from "../../geometry/errors.js";
2
+ import { assertMeshAllocationWithinLimits, } from "../../geometry/model-limits.js";
3
+ import { assertSamplingCount } from "../../geometry/sampling-limits.js";
4
+ import { observeNativeMesh } from "../native/mesh-observation.js";
5
+ import { regionFromLoops } from "../native/regions.js";
6
+ /** Slices original native facets; CrossSection quantization must not move the feature wall datum. */
7
+ export function nativeCollarProfile(scope, feature, height, limits, work) {
8
+ const raw = observeNativeMesh(scope, feature, limits, "join");
9
+ const fail = () => {
10
+ throw new GeometryError("INVALID_TOPOLOGY", "The feature datum needs regular closed collar boundaries.", { operation: "join" });
11
+ };
12
+ const points = new Map();
13
+ const next = new Map();
14
+ const incoming = new Set();
15
+ const pointAt = (id) => [
16
+ raw.coordinates[id * 3],
17
+ raw.coordinates[id * 3 + 1],
18
+ raw.coordinates[id * 3 + 2],
19
+ ];
20
+ for (let triangle = 0; triangle < raw.triangles.length; triangle += 3) {
21
+ work.use();
22
+ const ids = [0, 1, 2].map((offset) => raw.vertexIndices[raw.triangles[triangle + offset]]);
23
+ const vertices = ids.map(pointAt);
24
+ const cut = [];
25
+ for (let edge = 0; edge < 3; edge++) {
26
+ const a = vertices[edge], b = vertices[(edge + 1) % 3];
27
+ const aBelow = a[2] <= height, bBelow = b[2] <= height;
28
+ if (aBelow === bBelow)
29
+ continue;
30
+ const ai = ids[edge], bi = ids[(edge + 1) % 3];
31
+ const fraction = (height - a[2]) / (b[2] - a[2]);
32
+ const identity = fraction === 0
33
+ ? `v${ai}`
34
+ : fraction === 1
35
+ ? `v${bi}`
36
+ : `e${Math.min(ai, bi)}:${Math.max(ai, bi)}`;
37
+ if (!points.has(identity)) {
38
+ assertSamplingCount(points.size + 1, "join", limits.maxProfilePoints);
39
+ assertMeshAllocationWithinLimits(0, 0, (points.size + 1) * 192, "join", limits);
40
+ points.set(identity, [a[0] + (b[0] - a[0]) * fraction, a[1] + (b[1] - a[1]) * fraction]);
41
+ }
42
+ if (!cut.includes(identity))
43
+ cut.push(identity);
44
+ }
45
+ if (cut.length === 0 || cut.length === 1)
46
+ continue;
47
+ if (cut.length !== 2)
48
+ fail();
49
+ const a = vertices[0], b = vertices[1], c = vertices[2];
50
+ const nx = (b[1] - a[1]) * (c[2] - a[2]) - (b[2] - a[2]) * (c[1] - a[1]);
51
+ const ny = (b[2] - a[2]) * (c[0] - a[0]) - (b[0] - a[0]) * (c[2] - a[2]);
52
+ const p = points.get(cut[0]), q = points.get(cut[1]);
53
+ if ((q[0] - p[0]) * -ny + (q[1] - p[1]) * nx < 0)
54
+ cut.reverse();
55
+ const from = cut[0], to = cut[1];
56
+ if (next.has(from) || incoming.has(to))
57
+ fail();
58
+ next.set(from, to);
59
+ incoming.add(to);
60
+ assertSamplingCount(next.size, "join", limits.maxProfilePoints);
61
+ assertMeshAllocationWithinLimits(0, 0, next.size * 192, "join", limits);
62
+ }
63
+ const loops = [];
64
+ const visited = new Set();
65
+ for (const start of next.keys()) {
66
+ if (visited.has(start))
67
+ continue;
68
+ const loop = [];
69
+ let id = start;
70
+ do {
71
+ work.use();
72
+ if (visited.has(id))
73
+ fail();
74
+ visited.add(id);
75
+ loop.push(points.get(id));
76
+ id = next.get(id) ?? fail();
77
+ } while (id !== start);
78
+ // Remove tessellation diagonals along the same physical wall, at Double comparison precision.
79
+ let scale = 1;
80
+ for (const [x, y] of loop) {
81
+ work.use();
82
+ scale = Math.max(scale, Math.abs(x), Math.abs(y));
83
+ }
84
+ const tolerance = scale * Number.EPSILON * 64;
85
+ let changed = true;
86
+ while (changed && loop.length > 3) {
87
+ changed = false;
88
+ for (let index = 0; index < loop.length; index++) {
89
+ work.use();
90
+ const a = loop[(index + loop.length - 1) % loop.length], b = loop[index], c = loop[(index + 1) % loop.length];
91
+ const dx = c[0] - a[0], dy = c[1] - a[1], length = Math.hypot(dx, dy);
92
+ const fraction = ((b[0] - a[0]) * dx + (b[1] - a[1]) * dy) / (length * length);
93
+ if (fraction >= 0 &&
94
+ fraction <= 1 &&
95
+ Math.abs(dx * (b[1] - a[1]) - dy * (b[0] - a[0])) <= tolerance * length) {
96
+ work.use(loop.length - index - 1);
97
+ loop.splice(index, 1);
98
+ changed = true;
99
+ break;
100
+ }
101
+ }
102
+ }
103
+ loops.push(loop);
104
+ }
105
+ if (loops.length === 0)
106
+ fail();
107
+ const region = regionFromLoops(loops);
108
+ const contour = (id, points) => ({
109
+ id,
110
+ points,
111
+ spans: points.map((_, index) => `point-${index}`),
112
+ });
113
+ return {
114
+ components: region.map((component, index) => ({
115
+ id: `component-${index}`,
116
+ outer: contour("outer", component.outer),
117
+ holes: component.holes.map((hole, index) => contour(`hole-${index}`, hole)),
118
+ })),
119
+ };
120
+ }
@@ -0,0 +1,508 @@
1
+ import { anchor3, anchorFrame3 } from "../../geometry/anchors.js";
2
+ import { GeometryError } from "../../geometry/errors.js";
3
+ import { clipJoinPolygon, createJoinPolygonIndex, expandJoinPolygon, inJoinPolygon, intersectJoinPolygons, joinArea, joinHeight, JoinWork, prepareJoinLayer, subtractJoinPolygon, } from "../../geometry/join-geometry.js";
4
+ import { validateSolidMesh } from "../../geometry/mesh/mesh-solid.js";
5
+ import { assertMeshAllocationWithinLimits } from "../../geometry/model-limits.js";
6
+ import { planRegionOffsets } from "../../geometry/region-offset.js";
7
+ import { contourContainsPoint } from "../../geometry/regions.js";
8
+ import { resolveGeometryResolution } from "../../geometry/resolution.js";
9
+ import { assertSamplingCount } from "../../geometry/sampling-limits.js";
10
+ import { resolveGeometryTolerance } from "../../geometry/tolerance.js";
11
+ import { nativeConstructionMesh } from "../native/construction-mesh.js";
12
+ import { ownScopedManifoldValue } from "../native/context.js";
13
+ import { observeNativeMesh } from "../native/mesh-observation.js";
14
+ import { assertNativeSolidStatus } from "../native/status.js";
15
+ import { nativeCollarProfile } from "./join-collar-profile.js";
16
+ const fail = (message, phase) => {
17
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation: "join", details: { phase } });
18
+ };
19
+ const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
20
+ const contours = (profile) => profile.components.flatMap((component) => [
21
+ component.outer.points,
22
+ ...component.holes.map((hole) => hole.points),
23
+ ]);
24
+ /** One deferred connection, with native operands authoritative throughout support proofs. */
25
+ export function createJoinOperation(environment) {
26
+ return (base, feature, options) => {
27
+ const { module, scope } = environment;
28
+ const own = (value) => {
29
+ // Register first: failed native proofs and limit checks must dispose their intermediates too.
30
+ ownScopedManifoldValue(scope, value);
31
+ const vertices = value.numVert();
32
+ if (value instanceof module.Manifold) {
33
+ const triangles = value.numTri();
34
+ assertMeshAllocationWithinLimits(vertices, triangles, 12 * (vertices + triangles), "join", limits);
35
+ }
36
+ else
37
+ assertSamplingCount(vertices, "join", limits.maxProfilePoints);
38
+ return value;
39
+ };
40
+ if (typeof options !== "object" || options === null || Array.isArray(options))
41
+ fail("Join options are required.", "options");
42
+ if (Object.keys(options).some((key) => !["source", "transition", "resolution", "limits"].includes(key)))
43
+ fail("Unknown join option.", "options");
44
+ const transition = options.transition;
45
+ if (typeof transition !== "object" ||
46
+ transition === null ||
47
+ Array.isArray(transition) ||
48
+ Object.keys(transition).some((key) => !["kind", "width", "height"].includes(key)))
49
+ fail("Transition requires width and height and accepts an optional kind.", "options");
50
+ const kind = transition.kind === undefined ? "smooth" : transition.kind;
51
+ if (kind !== "smooth" && kind !== "straight")
52
+ fail('Join transition kind must be "smooth" or "straight".', "options");
53
+ const { width, height } = transition;
54
+ if (!Number.isFinite(width) || !Number.isFinite(height))
55
+ throw new GeometryError("NON_FINITE_VALUE", "Join width and height must be finite.", {
56
+ operation: "join",
57
+ });
58
+ if (width < 0 || height < 0 || (width === 0) !== (height === 0))
59
+ fail("Join width and height must both be positive or both zero.", "options");
60
+ const selected = environment.withResolutionDefaults(options);
61
+ const { limits } = selected;
62
+ const policy = resolveGeometryResolution(selected.resolution, limits);
63
+ const originalBase = environment.nativeSolid(base), originalFeature = environment.nativeSolid(feature);
64
+ assertNativeSolidStatus(originalBase, "join");
65
+ assertNativeSolidStatus(originalFeature, "join");
66
+ if (originalBase.isEmpty() || originalFeature.isEmpty())
67
+ throw new GeometryError("DEGENERATE_GEOMETRY", "Joining requires nonempty base and feature solids.", { operation: "join" });
68
+ const supplied = typeof options.source === "string"
69
+ ? environment.anchor(feature, options.source)
70
+ : options.source;
71
+ if (typeof supplied !== "object" || supplied === null)
72
+ fail("Join source must name a feature anchor or supply an Anchor3.", "source");
73
+ const sourceAnchor = anchor3(supplied.position, supplied.direction, supplied.up);
74
+ // The root points out of the feature; chart Z points into its unchanged straight collar.
75
+ const frame = anchorFrame3(anchor3(sourceAnchor.position, [-sourceAnchor.direction[0], -sourceAnchor.direction[1], -sourceAnchor.direction[2]], sourceAnchor.up));
76
+ const { xAxis: x, yAxis: y, zAxis: z, origin: o } = frame;
77
+ const forward = [
78
+ x[0],
79
+ x[1],
80
+ x[2],
81
+ 0,
82
+ y[0],
83
+ y[1],
84
+ y[2],
85
+ 0,
86
+ z[0],
87
+ z[1],
88
+ z[2],
89
+ 0,
90
+ o[0],
91
+ o[1],
92
+ o[2],
93
+ 1,
94
+ ];
95
+ const inverse = [
96
+ x[0],
97
+ y[0],
98
+ z[0],
99
+ 0,
100
+ x[1],
101
+ y[1],
102
+ z[1],
103
+ 0,
104
+ x[2],
105
+ y[2],
106
+ z[2],
107
+ 0,
108
+ -dot(x, o),
109
+ -dot(y, o),
110
+ -dot(z, o),
111
+ 1,
112
+ ];
113
+ // Local copies serve the proofs. Fuse the original operands later to avoid a frame round trip.
114
+ const support = own(originalBase.transform(inverse)), neck = own(originalFeature.transform(inverse));
115
+ const bounds = neck.boundingBox();
116
+ const raw = observeNativeMesh(scope, support, limits, "join");
117
+ const scale = Math.max(1, ...bounds.min.map(Math.abs), ...bounds.max.map(Math.abs), width, height);
118
+ // Final mesh capture is Float32. Reserve conversion/closure error before the sampling budget.
119
+ const epsilon = Math.max(resolveGeometryTolerance(scale).linear, support.tolerance(), neck.tolerance(), scale * 2 ** -22);
120
+ // Contact selection uses native precision; the larger Float32 meshing allowance must not bridge a gap.
121
+ const datumTolerance = Math.max(support.tolerance(), neck.tolerance(), scale * Number.EPSILON * 64);
122
+ let allowance = epsilon * 16;
123
+ if (allowance >= policy.maxChordError / 2)
124
+ fail("Join coordinate precision cannot resolve the requested physical error budget.", "precision");
125
+ const meshEpsilon = epsilon / 8;
126
+ // Slice just inside the root cap, removing cut seams only within the reserved numeric allowance.
127
+ const sourceSection = own(own(neck.slice(epsilon * 2)).simplify(epsilon / 8));
128
+ if (sourceSection.isEmpty())
129
+ fail("Source datum must cut a nonempty straight feature collar.", "collar");
130
+ const work = new JoinWork();
131
+ // Native Sections supply robust regional proofs; exact facet slicing retains wall coordinates
132
+ // for the corresponding construction instead of moving them through integer clipping.
133
+ const source = nativeCollarProfile(scope, neck, epsilon * 2, limits, work);
134
+ const closingInset = epsilon * 8;
135
+ const offset = planRegionOffsets(source, [-width, closingInset], "join", limits);
136
+ work.use(offset.workCount);
137
+ const region = (loops) => own(loops.length === 0
138
+ ? sourceSection.subtract(sourceSection)
139
+ : new module.CrossSection(loops.map((loop) => loop.map((p) => [p[0], p[1]])), "NonZero"));
140
+ const expandedProfile = offset.profileAt(-width);
141
+ const footprint = region(contours(expandedProfile));
142
+ const triangles = [];
143
+ const canonicalPlanes = [];
144
+ const chartTolerance = resolveGeometryTolerance(scale);
145
+ let chartArithmeticScale = scale;
146
+ const maxZ = bounds.max[2];
147
+ for (let i = 0; i < raw.triangles.length; i += 3) {
148
+ work.use();
149
+ const points = [0, 1, 2].map((j) => {
150
+ const index = raw.vertexIndices[raw.triangles[i + j]] * 3;
151
+ return [
152
+ raw.coordinates[index],
153
+ raw.coordinates[index + 1],
154
+ raw.coordinates[index + 2],
155
+ ];
156
+ });
157
+ const a = points[0], b = points[1], c = points[2];
158
+ const ab = [b[0] - a[0], b[1] - a[1], b[2] - a[2]], ac = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];
159
+ const normal = [
160
+ ab[1] * ac[2] - ab[2] * ac[1],
161
+ ab[2] * ac[0] - ab[0] * ac[2],
162
+ ab[0] * ac[1] - ab[1] * ac[0],
163
+ ];
164
+ const normalLength = Math.hypot(...normal);
165
+ if (normal[2] <= normalLength * 1e-10)
166
+ continue;
167
+ let plane = [
168
+ -normal[0] / normal[2],
169
+ -normal[1] / normal[2],
170
+ a[2] + (normal[0] / normal[2]) * a[0] + (normal[1] / normal[2]) * a[1],
171
+ ];
172
+ let polygon = points.map((p) => [p[0], p[1]]);
173
+ polygon = clipJoinPolygon(polygon, [plane[0], plane[1], plane[2] + datumTolerance]);
174
+ polygon = clipJoinPolygon(polygon, [-plane[0], -plane[1], maxZ - plane[2]]);
175
+ if (polygon.length < 3 || Math.abs(joinArea(polygon)) <= meshEpsilon ** 2)
176
+ continue;
177
+ const clipped = own(region([polygon]).intersect(footprint));
178
+ if (clipped.isEmpty())
179
+ continue;
180
+ for (const point of points)
181
+ chartArithmeticScale = Math.max(chartArithmeticScale, ...point.map(Math.abs));
182
+ // Double arithmetic can give coplanar tessellation triangles slightly different equations.
183
+ // Match dimensionless unit normals and actual height predictions, never encoded face IDs.
184
+ const priorPlane = canonicalPlanes.find((candidate) => {
185
+ work.use();
186
+ const length = Math.hypot(candidate[0], candidate[1], 1);
187
+ return (Math.hypot(-candidate[0] / length - normal[0] / normalLength, -candidate[1] / length - normal[1] / normalLength, 1 / length - normal[2] / normalLength) <= chartTolerance.angular &&
188
+ points.every((point) => Math.abs(joinHeight(candidate, [point[0], point[1]]) - point[2]) <=
189
+ chartTolerance.linear));
190
+ });
191
+ if (priorPlane === undefined)
192
+ canonicalPlanes.push(plane);
193
+ else
194
+ plane = priorPlane;
195
+ triangles.push({ polygon, plane });
196
+ }
197
+ // Convex components need one exact clip, not arbitrary triangulation seams.
198
+ // Inspect the actual clipping coordinates; holes and concavity retain their full partition.
199
+ const convexPartition = (loops) => {
200
+ const outer = loops[0];
201
+ const convex = loops.length === 1 &&
202
+ outer.length >= 3 &&
203
+ joinArea(outer) > 0 &&
204
+ outer.every((point, i) => {
205
+ work.use();
206
+ const previous = outer[(i + outer.length - 1) % outer.length], next = outer[(i + 1) % outer.length];
207
+ return ((point[0] - previous[0]) * (next[1] - point[1]) -
208
+ (point[1] - previous[1]) * (next[0] - point[0]) >=
209
+ 0);
210
+ });
211
+ if (convex)
212
+ return [outer];
213
+ const vertices = loops.flat();
214
+ return module
215
+ .triangulate(loops.map((loop) => loop.map((p) => [p[0], p[1]])), 0, false)
216
+ .map((ids) => ids.map((id) => vertices[id]));
217
+ };
218
+ const footprintCells = expandedProfile.components.flatMap((component) => convexPartition(region([component.outer.points, ...component.holes.map((hole) => hole.points)]).toPolygons()));
219
+ const usable = (polygon) => polygon.length >= 3 && Math.abs(joinArea(polygon)) > meshEpsilon ** 2;
220
+ const cells = [];
221
+ // Remove every nearer exit over its complete projected overlap, rather than probing a few rays.
222
+ for (let i = 0; i < triangles.length; i++) {
223
+ const current = triangles[i];
224
+ let visible = footprintCells
225
+ .map((polygon) => intersectJoinPolygons(current.polygon, polygon))
226
+ .filter(usable);
227
+ for (let j = 0; j < triangles.length && visible.length > 0; j++) {
228
+ if (i === j)
229
+ continue;
230
+ work.use();
231
+ const other = triangles[j];
232
+ const overlap = intersectJoinPolygons(current.polygon, other.polygon);
233
+ if (!usable(overlap))
234
+ continue;
235
+ const difference = [
236
+ current.plane[0] - other.plane[0],
237
+ current.plane[1] - other.plane[1],
238
+ current.plane[2] - other.plane[2],
239
+ ];
240
+ const equal = overlap.every((point) => Math.abs(joinHeight(difference, point)) <= chartTolerance.linear);
241
+ if (equal && j > i)
242
+ continue;
243
+ const nearer = equal ? other.polygon : clipJoinPolygon(other.polygon, difference);
244
+ if (usable(nearer))
245
+ visible = visible
246
+ .flatMap((polygon) => subtractJoinPolygon(polygon, nearer, work))
247
+ .filter(usable);
248
+ }
249
+ for (const polygon of visible)
250
+ cells.push({ polygon, plane: current.plane });
251
+ }
252
+ if (cells.length === 0)
253
+ fail("The entire transition footprint needs a regular outward support patch after the source datum.", "support");
254
+ // Bound each affine proof cell's extension by epsilon/2 in Euclidean distance.
255
+ // The native union must cover the complete footprint; every extended part is
256
+ // included in the material witness below, so a real slit cannot be waived.
257
+ const proofRegions = cells.map((cell) => {
258
+ work.use(cell.polygon.length);
259
+ const expanded = expandJoinPolygon(cell.polygon, epsilon / (2 * Math.SQRT2), work);
260
+ return region([expanded]);
261
+ });
262
+ const proofPoints = proofRegions.reduce((count, region) => count + region.numVert(), 0);
263
+ assertMeshAllocationWithinLimits(proofPoints * 2, proofPoints * 4, proofPoints * 96, "join", limits);
264
+ const proofCoverage = own(module.CrossSection.union(proofRegions));
265
+ if (!own(footprint.subtract(proofCoverage)).isEmpty())
266
+ fail("The entire transition footprint needs a regular outward support patch after the source datum.", "support");
267
+ let maximumSlope = 0, greatest = -Infinity;
268
+ for (const cell of cells) {
269
+ maximumSlope = Math.max(maximumSlope, Math.hypot(cell.plane[0], cell.plane[1]));
270
+ for (const point of cell.polygon) {
271
+ greatest = Math.max(greatest, joinHeight(cell.plane, point));
272
+ }
273
+ }
274
+ allowance *= 1 + maximumSlope;
275
+ if (allowance >= policy.maxChordError / 2)
276
+ fail("Support slope exhausts the physical extraction error budget.", "precision");
277
+ // Local bounds keep distant roots from broadening each other's support searches.
278
+ const cellIndex = createJoinPolygonIndex(cells.map((cell) => cell.polygon), work, limits);
279
+ for (const cell of cells)
280
+ for (const point of cell.polygon)
281
+ for (const index of cellIndex(point, meshEpsilon)) {
282
+ const other = cells[index];
283
+ work.use();
284
+ if (cell !== other &&
285
+ inJoinPolygon(point, other.polygon, meshEpsilon) &&
286
+ Math.abs(joinHeight(cell.plane, point) - joinHeight(other.plane, point)) > allowance)
287
+ fail("Support patch must be continuous; height jumps and branch changes are unsupported.", "support");
288
+ }
289
+ const H = greatest + height + allowance;
290
+ if (H > maxZ + epsilon)
291
+ fail("Feature needs a longer constant-section collar above the support patch.", "collar");
292
+ const proofDomain = own(module.Manifold.extrude(footprint, H + allowance * 3).translate([0, 0, -allowance * 2]));
293
+ const toNative = (mesh) => nativeConstructionMesh(scope, mesh, limits, "join");
294
+ const terrain = (top, bottom) => {
295
+ const pieces = cells.flatMap((cell, index) => {
296
+ const area = proofRegions[index];
297
+ if (area.isEmpty())
298
+ return [];
299
+ const guard = epsilon * (2 + Math.hypot(cell.plane[0], cell.plane[1]) / 2);
300
+ const slab = own(module.Manifold.extrude(area, 1));
301
+ const piece = own(slab.warpBatch((vertices, count) => {
302
+ work.use(count);
303
+ for (let i = 0; i < count; i++) {
304
+ const k = i * 3, value = joinHeight(cell.plane, [vertices[k], vertices[k + 1]]);
305
+ vertices[k + 2] = vertices[k + 2] > 0.5 ? top(value, guard) : bottom(value, guard);
306
+ }
307
+ }));
308
+ assertNativeSolidStatus(piece, "join");
309
+ return [piece];
310
+ });
311
+ return own(own(module.Manifold.union(pieces)).intersect(proofDomain));
312
+ };
313
+ // Follow the curved chart. A flat witness would incorrectly exclude thin curved shells.
314
+ const witness = terrain((value, guard) => value - guard, (value, guard) => value - guard - epsilon * 6);
315
+ if (!own(witness.subtract(support)).isEmpty())
316
+ fail("Support material is missing or too thin beneath the complete curved footprint.", "support");
317
+ const overhead = terrain(() => H + allowance, (value, guard) => value + guard);
318
+ if (!own(overhead.intersect(support)).isEmpty())
319
+ fail("Support reenters the connection band above the selected patch.", "support");
320
+ // Guard both directions over the full collar volume: matching two cross-sections is insufficient.
321
+ const domain = own(module.Manifold.extrude(footprint, H - epsilon * 2).translate([0, 0, epsilon * 2]));
322
+ const innerSection = own(sourceSection.offset(-epsilon * 2, "Miter"));
323
+ const outerSection = own(sourceSection.offset(epsilon * 2, "Miter"));
324
+ const expected = own(module.Manifold.extrude(innerSection, H - epsilon * 2).translate([0, 0, epsilon * 2]));
325
+ const outer = own(module.Manifold.extrude(outerSection, H - epsilon * 2).translate([0, 0, epsilon * 2]));
326
+ const actual = own(neck.intersect(domain));
327
+ if (!own(expected.subtract(actual)).isEmpty() || !own(actual.subtract(outer)).isEmpty())
328
+ fail("Feature must have a straight constant-section collar throughout the complete connection band.", "collar");
329
+ if (width === 0)
330
+ return environment.wrapSolid(own(originalBase.add(originalFeature)));
331
+ const originalLoops = contours(source), outsideLoops = contours(expandedProfile);
332
+ // Close inside the real feature wall, proving this private numerical overlap adds no exposed shape.
333
+ const insideProfile = offset.profileAt(closingInset);
334
+ const insideLoops = contours(insideProfile);
335
+ const closingSection = region(insideLoops);
336
+ if (closingSection.isEmpty() || closingSection.numContour() !== sourceSection.numContour())
337
+ fail("Source boundaries cannot resolve the private closing allowance.", "precision");
338
+ const closingCore = own(module.Manifold.extrude(closingSection, H));
339
+ if (!own(own(closingCore.subtract(neck)).subtract(support)).isEmpty())
340
+ fail("The private closing boundary cannot be contained in the supplied solids.", "precision");
341
+ const strips = [];
342
+ for (let loop = 0; loop < originalLoops.length; loop++) {
343
+ const original = originalLoops[loop], expanded = outsideLoops[loop];
344
+ for (let i = 0; i < original.length; i++) {
345
+ const next = (i + 1) % original.length, a = original[i], b = original[next];
346
+ const length = Math.hypot(b[0] - a[0], b[1] - a[1]);
347
+ if (length <= epsilon)
348
+ fail("Source edge cannot resolve the connection precision.", "precision");
349
+ strips.push({
350
+ polygon: [a, expanded[i], expanded[next], b],
351
+ start: a,
352
+ normal: [(b[1] - a[1]) / length, -(b[0] - a[0]) / length],
353
+ });
354
+ }
355
+ }
356
+ // A straight profile is planar on each support facet; only the cubic needs transverse rows.
357
+ const effectiveRise = height + epsilon * 2;
358
+ const curvature = 6 * Math.hypot(width * offset.magnification * (1 + maximumSlope), effectiveRise);
359
+ const tolerance = (policy.maxChordError - allowance) / 4;
360
+ const divisions = kind === "straight"
361
+ ? 1
362
+ : Math.max(2, Math.ceil(Math.sqrt(curvature / (8 * tolerance))), policy.maxSegmentLength === undefined
363
+ ? 0
364
+ : Math.ceil((3 *
365
+ Math.hypot(width * offset.magnification * (1 + maximumSlope), effectiveRise)) /
366
+ policy.maxSegmentLength));
367
+ if (divisions > limits.maxPathPoints)
368
+ throw new GeometryError("COMPLEXITY_LIMIT", "Join profile exceeds its station ceiling.", {
369
+ operation: "join",
370
+ });
371
+ const polygons = [];
372
+ const bottomGroups = [];
373
+ const planeGroups = new Map();
374
+ const supportPlanes = [];
375
+ const cellGroups = cells.map((cell) => {
376
+ const key = cell.plane.join(",");
377
+ let group = planeGroups.get(key);
378
+ if (group === undefined) {
379
+ group = planeGroups.size;
380
+ planeGroups.set(key, group);
381
+ supportPlanes.push(cell.plane);
382
+ }
383
+ return group;
384
+ });
385
+ // Split at every chart crossing so the generated surface retains actual support facets and creases.
386
+ for (const strip of strips)
387
+ for (let row = 0; row < divisions; row++) {
388
+ const exponent = kind === "straight" ? 1 : 3;
389
+ const ra = width * (1 - row / divisions) ** exponent, rb = width * (1 - (row + 1) / divisions) ** exponent;
390
+ const projection = [
391
+ strip.normal[0],
392
+ strip.normal[1],
393
+ -strip.normal[0] * strip.start[0] - strip.normal[1] * strip.start[1],
394
+ ];
395
+ const band = clipJoinPolygon(clipJoinPolygon(strip.polygon, [projection[0], projection[1], projection[2] - rb]), [-projection[0], -projection[1], ra - projection[2]]);
396
+ if (band.length < 3)
397
+ continue;
398
+ for (const [cellIndex, cell] of cells.entries()) {
399
+ work.use();
400
+ const piece = intersectJoinPolygons(band, cell.polygon);
401
+ if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
402
+ polygons.push(piece);
403
+ bottomGroups.push(cellGroups[cellIndex]);
404
+ }
405
+ }
406
+ }
407
+ // Use the same corresponding boundaries and clipping arithmetic as the outside strips.
408
+ // Independent native offsets/intersections would round these shared mesh seams differently.
409
+ for (let loop = 0; loop < originalLoops.length; loop++) {
410
+ const original = originalLoops[loop], inside = insideLoops[loop];
411
+ for (let i = 0; i < original.length; i++) {
412
+ const next = (i + 1) % original.length;
413
+ const ring = [original[i], original[next], inside[next], inside[i]];
414
+ for (const [cellIndex, cell] of cells.entries()) {
415
+ work.use();
416
+ const piece = intersectJoinPolygons(ring, cell.polygon);
417
+ if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
418
+ polygons.push(piece);
419
+ bottomGroups.push(cellGroups[cellIndex]);
420
+ }
421
+ }
422
+ }
423
+ }
424
+ // Fill the already-proven feature interior down to the same support witness. An annular-only
425
+ // collar can enclose a numerical contact sheet when two independently transformed caps meet.
426
+ const coreCells = insideProfile.components.flatMap((component) => convexPartition([component.outer.points, ...component.holes.map((hole) => hole.points)]));
427
+ for (const coreCell of coreCells) {
428
+ for (const [cellIndex, cell] of cells.entries()) {
429
+ work.use();
430
+ const piece = intersectJoinPolygons(coreCell, cell.polygon);
431
+ if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
432
+ polygons.push(piece);
433
+ bottomGroups.push(cellGroups[cellIndex]);
434
+ }
435
+ }
436
+ }
437
+ const stripIndex = createJoinPolygonIndex(strips.map((strip) => strip.polygon), work, limits);
438
+ const rise = (p) => {
439
+ for (const index of stripIndex(p, epsilon)) {
440
+ const strip = strips[index];
441
+ work.use();
442
+ if (inJoinPolygon(p, strip.polygon, epsilon)) {
443
+ const r = Math.max(0, Math.min(width, (p[0] - strip.start[0]) * strip.normal[0] + (p[1] - strip.start[1]) * strip.normal[1]));
444
+ return height * (kind === "straight" ? 1 - r / width : (1 - Math.cbrt(r / width)) ** 3);
445
+ }
446
+ }
447
+ if (source.components.some((component) => contourContainsPoint(component.outer.points, p) &&
448
+ !component.holes.some((hole) => contourContainsPoint(hole.points, p))))
449
+ return height;
450
+ return fail("Transition cell escaped its source offset strip.", "transition");
451
+ };
452
+ const layerOptions = {
453
+ bottomGroups,
454
+ supportPlanes,
455
+ triangulate: (loops) => module.triangulate(loops.map((loop) => loop.map((p) => [p[0], p[1]])), 0, false),
456
+ };
457
+ const layer = prepareJoinLayer(polygons, meshEpsilon, limits, work, layerOptions);
458
+ // Prepared nodes retain their incident support planes, avoiding a second spatial guess at creases.
459
+ const chartHeight = (value) => value ?? fail("Join layer has no supporting chart plane.", "support");
460
+ // A guarded witness can miss a void immediately under the selected face. Prove the complete
461
+ // numerical foot before adding material, retaining its exact boundary and affine support faces.
462
+ const footMesh = layer.supportBand(epsilon * 8);
463
+ validateSolidMesh(footMesh);
464
+ const footNative = toNative(footMesh);
465
+ const missingFoot = own(own(footNative.subtract(support)).subtract(neck));
466
+ if (!missingFoot.isEmpty()) {
467
+ // Native subtraction can retain zero-thickness contact sheets. Bound each component at
468
+ // Double roundoff, never by the larger construction allowance or another component's area.
469
+ const missingComponents = missingFoot.decompose().map(own);
470
+ if (missingComponents.length === 0)
471
+ fail("Numerical connection containment could not be established.", "support");
472
+ for (const missing of missingComponents) {
473
+ work.use();
474
+ const bounds = missing.boundingBox();
475
+ if (![...bounds.min, ...bounds.max].every(Number.isFinite))
476
+ fail("Numerical connection containment could not be established.", "support");
477
+ const arithmetic = Number.EPSILON *
478
+ 64 *
479
+ Math.max(chartArithmeticScale, ...bounds.min.map(Math.abs), ...bounds.max.map(Math.abs));
480
+ const roundoff = Math.min(arithmetic, support.tolerance(), neck.tolerance());
481
+ // Measure around the component, avoiding cancellation against global chart coordinates.
482
+ const center = bounds.min.map((value, axis) => value / 2 + bounds.max[axis] / 2);
483
+ const centered = own(missing.warpBatch((positions, count) => {
484
+ work.use(count);
485
+ for (let i = 0; i < positions.length; i++)
486
+ positions[i] = positions[i] - center[i % 3];
487
+ }));
488
+ const volume = Math.abs(centered.volume());
489
+ const area = missing.surfaceArea();
490
+ if (![roundoff, volume, area].every(Number.isFinite) || roundoff < 0 || area < 0)
491
+ fail("Numerical connection containment could not be established.", "support");
492
+ if (volume > area * roundoff)
493
+ fail("Support material must fill the complete numerical connection foot.", "support");
494
+ }
495
+ }
496
+ const collarMesh = layer.build(
497
+ // Begin inside the proven support witness, fading the extraction allowance to zero at the wall.
498
+ // This avoids nearly coincident foot slivers when the native Boolean meets its Float32 chart.
499
+ (p, value) => chartHeight(value) + rise(p) * (effectiveRise / height) - epsilon * 2, (_p, value) => chartHeight(value) - epsilon * 8, policy.maxSegmentLength);
500
+ validateSolidMesh(collarMesh);
501
+ const collar = toNative(collarMesh);
502
+ const worldCollar = own(collar.transform(forward));
503
+ // Construction adds a collar; neither supplied operand is trimmed, moved, or reconstructed.
504
+ const combined = own(module.Manifold.union([originalBase, originalFeature, worldCollar]));
505
+ assertNativeSolidStatus(combined, "join");
506
+ return environment.wrapSolid(combined);
507
+ };
508
+ }
@@ -48,7 +48,7 @@ export class RecipeRealization {
48
48
  realizedShape(shape) {
49
49
  return this.realized.get(shape);
50
50
  }
51
- /** Prefers intermediate operands when not every computed output fits the retention budget. */
51
+ /** Prefers intermediate operands when not every memo output fits the retention budget. */
52
52
  retentionCandidates(values) {
53
53
  const shapes = new Set(recipeShapes(values));
54
54
  return [...shapes].sort((left, right) => Number(this.operands.has(right)) - Number(this.operands.has(left)));