@metamesh/modeling 0.19.0 → 0.20.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 (789) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +34 -18
  3. package/dist/api/engine.d.ts +217 -121
  4. package/dist/api/export.d.ts +123 -79
  5. package/dist/api/geometry.d.ts +406 -2102
  6. package/dist/api/index.d.ts +472 -1798
  7. package/dist/api/math.d.ts +315 -0
  8. package/dist/api/mechanical.d.ts +1041 -0
  9. package/dist/api/mesh.d.ts +360 -88
  10. package/dist/api/text.d.ts +24 -44
  11. package/dist/docs/guides/concepts.md +67 -33
  12. package/dist/docs/guides/exporting.md +88 -0
  13. package/dist/docs/guides/fonts.md +5 -3
  14. package/dist/docs/guides/fundamentals.md +12 -24
  15. package/dist/docs/guides/generation.md +24 -16
  16. package/dist/docs/guides/geometry-values.md +192 -134
  17. package/dist/docs/guides/hosting.md +51 -96
  18. package/dist/docs/guides/profiles-and-extrusion.md +159 -11
  19. package/dist/docs/guides/recipes.md +121 -28
  20. package/dist/docs/guides/resolution-and-inspection.md +43 -23
  21. package/dist/docs/guides/solid-joins.md +12 -2
  22. package/dist/docs/guides/standalone-model.md +4 -2
  23. package/dist/docs/guides/svg-and-text.md +76 -39
  24. package/dist/docs/guides/sweeps-and-lofts.md +88 -44
  25. package/dist/docs/guides/transforms-and-placement.md +113 -103
  26. package/dist/docs/guides/workers.md +166 -0
  27. package/dist/docs/manifest.json +4133 -4153
  28. package/dist/docs/reference/engine/GenerationOptions.md +2 -3
  29. package/dist/docs/reference/engine/GeometryResource.md +6 -6
  30. package/dist/docs/reference/engine/ModelDependencies.md +2 -2
  31. package/dist/docs/reference/engine/ModelEngine.md +2 -3
  32. package/dist/docs/reference/engine/ModelEngineOptions.md +2 -7
  33. package/dist/docs/reference/engine/ModelPart.md +6 -6
  34. package/dist/docs/reference/engine/ModelResult.md +2 -2
  35. package/dist/docs/reference/engine/ModelRunArguments.md +2 -2
  36. package/dist/docs/reference/engine/ModelRunOptions.md +2 -3
  37. package/dist/docs/reference/engine/ModelSession.md +2 -2
  38. package/dist/docs/reference/engine/SessionOptions.md +2 -3
  39. package/dist/docs/reference/engine/categories/host-lifecycle.md +9 -3
  40. package/dist/docs/reference/engine/checkModel.md +6 -2
  41. package/dist/docs/reference/engine/createModelEngine.md +5 -3
  42. package/dist/docs/reference/engine/defaultModelingLimits.md +4 -11
  43. package/dist/docs/reference/engine/modelingWasmUrl.md +2 -2
  44. package/dist/docs/reference/engine.md +7 -1
  45. package/dist/docs/reference/export/Export3mfOptions.md +2 -6
  46. package/dist/docs/reference/export/ExportDiagnostic.md +2 -14
  47. package/dist/docs/reference/export/ExportFormat.md +2 -14
  48. package/dist/docs/reference/export/ExportGeometry.md +3 -15
  49. package/dist/docs/reference/export/ExportGlbOptions.md +14 -18
  50. package/dist/docs/reference/export/ExportLimits.md +2 -14
  51. package/dist/docs/reference/export/ExportMaterial.md +2 -14
  52. package/dist/docs/reference/export/ExportOptions.md +2 -14
  53. package/dist/docs/reference/export/ExportPart.md +2 -14
  54. package/dist/docs/reference/export/ExportReport.md +2 -14
  55. package/dist/docs/reference/export/ExportSink.md +5 -15
  56. package/dist/docs/reference/export/ExportStlOptions.md +2 -6
  57. package/dist/docs/reference/export/ExportedFile.md +14 -26
  58. package/dist/docs/reference/export/categories/mesh-serialization.md +9 -3
  59. package/dist/docs/reference/export/defaultExportLimits.md +2 -2
  60. package/dist/docs/reference/export/export3mf.md +4 -6
  61. package/dist/docs/reference/export/exportGlb.md +8 -10
  62. package/dist/docs/reference/export/exportStl.md +4 -6
  63. package/dist/docs/reference/export/write3mf.md +6 -6
  64. package/dist/docs/reference/export/writeGlb.md +10 -10
  65. package/dist/docs/reference/export/writeStl.md +6 -6
  66. package/dist/docs/reference/export.md +9 -3
  67. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
  68. package/dist/docs/reference/geometry/Anchor3-type.md +3 -7
  69. package/dist/docs/reference/geometry/Anchor3Options.md +70 -0
  70. package/dist/docs/reference/geometry/ArcCurve2.md +3 -3
  71. package/dist/docs/reference/geometry/ArcCurve3.md +3 -3
  72. package/dist/docs/reference/geometry/AttachOptions.md +4 -9
  73. package/dist/docs/reference/geometry/Bounds2-type.md +9 -30
  74. package/dist/docs/reference/geometry/Bounds2Data.md +2 -19
  75. package/dist/docs/reference/geometry/Bounds2Input.md +2 -10
  76. package/dist/docs/reference/geometry/Bounds2Options.md +2 -6
  77. package/dist/docs/reference/geometry/Bounds3-type.md +9 -30
  78. package/dist/docs/reference/geometry/Bounds3Data.md +2 -15
  79. package/dist/docs/reference/geometry/Bounds3Input.md +2 -10
  80. package/dist/docs/reference/geometry/Bounds3Options.md +2 -6
  81. package/dist/docs/reference/geometry/BoundsFit2.md +2 -2
  82. package/dist/docs/reference/geometry/BoundsFit3.md +2 -2
  83. package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -2
  84. package/dist/docs/reference/geometry/BoxAnchorFace.md +3 -3
  85. package/dist/docs/reference/geometry/BoxAnchorOptions.md +3 -3
  86. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +3 -7
  87. package/dist/docs/reference/geometry/CircleContourOptions.md +3 -7
  88. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +3 -12
  89. package/dist/docs/reference/geometry/CircularResolutionOptions.md +2 -2
  90. package/dist/docs/reference/geometry/CircularSampling.md +2 -2
  91. package/dist/docs/reference/geometry/CircularSamplingOptions.md +2 -2
  92. package/dist/docs/reference/geometry/Contour.md +4 -9
  93. package/dist/docs/reference/geometry/ContourCurve.md +3 -3
  94. package/dist/docs/reference/geometry/ContourPoint.md +3 -3
  95. package/dist/docs/reference/geometry/ContourSegment.md +3 -3
  96. package/dist/docs/reference/geometry/CorrespondingComponent.md +3 -7
  97. package/dist/docs/reference/geometry/CorrespondingContour.md +3 -7
  98. package/dist/docs/reference/geometry/CorrespondingProfile.md +3 -7
  99. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +4 -8
  100. package/dist/docs/reference/geometry/CubicBezierCurve2.md +3 -3
  101. package/dist/docs/reference/geometry/CubicBezierCurve3.md +3 -3
  102. package/dist/docs/reference/geometry/Curve2.md +3 -3
  103. package/dist/docs/reference/geometry/Curve3.md +3 -3
  104. package/dist/docs/reference/geometry/CurveSamplingOptions.md +3 -11
  105. package/dist/docs/reference/geometry/CylinderAnchorFace.md +3 -3
  106. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +4 -4
  107. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +2 -2
  108. package/dist/docs/reference/geometry/EdgeTreatment.md +2 -6
  109. package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -7
  110. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -18
  111. package/dist/docs/reference/geometry/FittedTextLayout.md +2 -2
  112. package/dist/docs/reference/geometry/{Frame3.md → Frame3-type.md} +4 -11
  113. package/dist/docs/reference/geometry/Frame3Options.md +69 -0
  114. package/dist/docs/reference/geometry/GeometryError.md +2 -6
  115. package/dist/docs/reference/geometry/GeometryErrorCode.md +2 -6
  116. package/dist/docs/reference/geometry/GeometryErrorContext.md +2 -6
  117. package/dist/docs/reference/geometry/GeometryResolution.md +2 -10
  118. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +3 -11
  119. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +3 -11
  120. package/dist/docs/reference/geometry/GridPatternOptions.md +7 -9
  121. package/dist/docs/reference/geometry/ImmutableBuffer-type.md +2 -10
  122. package/dist/docs/reference/geometry/LineCurve2.md +3 -3
  123. package/dist/docs/reference/geometry/LineCurve3.md +3 -3
  124. package/dist/docs/reference/geometry/LinearPatternOptions.md +2 -6
  125. package/dist/docs/reference/geometry/LoftPlacement.md +13 -21
  126. package/dist/docs/reference/geometry/MatchProfilesOptions.md +3 -7
  127. package/dist/docs/reference/geometry/ModelingLimits.md +2 -14
  128. package/dist/docs/reference/geometry/NumericArray.md +2 -10
  129. package/dist/docs/reference/geometry/Path2-type.md +153 -12
  130. package/dist/docs/reference/geometry/Path2Data.md +3 -11
  131. package/dist/docs/reference/geometry/Path2Input.md +3 -11
  132. package/dist/docs/reference/geometry/Path3-type.md +153 -12
  133. package/dist/docs/reference/geometry/Path3Data.md +3 -11
  134. package/dist/docs/reference/geometry/Path3Input.md +3 -11
  135. package/dist/docs/reference/geometry/PathFrame.md +3 -3
  136. package/dist/docs/reference/geometry/PathLocation.md +3 -11
  137. package/dist/docs/reference/geometry/PathNormalGuide.md +4 -12
  138. package/dist/docs/reference/geometry/PathOptions.md +3 -7
  139. package/dist/docs/reference/geometry/PathPatternOptions.md +3 -7
  140. package/dist/docs/reference/geometry/PathPlacement.md +5 -5
  141. package/dist/docs/reference/geometry/PathResamplingOptions.md +3 -11
  142. package/dist/docs/reference/geometry/PathStation.md +87 -0
  143. package/dist/docs/reference/geometry/PathSubdivisionOptions.md +44 -0
  144. package/dist/docs/reference/geometry/Pivot2Options.md +3 -11
  145. package/dist/docs/reference/geometry/Pivot3Options.md +3 -11
  146. package/dist/docs/reference/geometry/PolygonData.md +4 -8
  147. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +3 -3
  148. package/dist/docs/reference/geometry/Profile.md +3 -4
  149. package/dist/docs/reference/geometry/ProfileComponent2.md +3 -7
  150. package/dist/docs/reference/geometry/ProfileContour2.md +3 -7
  151. package/dist/docs/reference/geometry/ProfileSpan2.md +3 -7
  152. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +5 -8
  153. package/dist/docs/reference/geometry/RadialPatternOptions.md +2 -6
  154. package/dist/docs/reference/geometry/RadialSizing.md +2 -6
  155. package/dist/docs/reference/geometry/RadialSizingOptions.md +2 -6
  156. package/dist/docs/reference/geometry/RectangleContourOptions.md +4 -7
  157. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +3 -7
  158. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +3 -7
  159. package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
  160. package/dist/docs/reference/geometry/RegionData.md +3 -7
  161. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
  162. package/dist/docs/reference/geometry/ResolvedGeometryResolution.md +71 -0
  163. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +2 -2
  164. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +2 -6
  165. package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -2
  166. package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
  167. package/dist/docs/reference/geometry/SampleHelixOptions.md +3 -3
  168. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
  169. package/dist/docs/reference/geometry/SampledCurve2.md +3 -3
  170. package/dist/docs/reference/geometry/SampledCurve3.md +3 -3
  171. package/dist/docs/reference/geometry/SideProfileCurve.md +3 -3
  172. package/dist/docs/reference/geometry/SideProfilePoint.md +3 -3
  173. package/dist/docs/reference/geometry/SideProfileSegment.md +3 -3
  174. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +2 -6
  175. package/dist/docs/reference/geometry/SplineOptions.md +69 -0
  176. package/dist/docs/reference/geometry/StarContourOptions.md +7 -7
  177. package/dist/docs/reference/geometry/StrokeCap.md +2 -6
  178. package/dist/docs/reference/geometry/StrokeJoin.md +2 -6
  179. package/dist/docs/reference/geometry/StrokeOptions.md +3 -7
  180. package/dist/docs/reference/geometry/SvgImportOptions.md +4 -4
  181. package/dist/docs/reference/geometry/SvgRegionPreflight.md +2 -2
  182. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +2 -2
  183. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +2 -2
  184. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +2 -2
  185. package/dist/docs/reference/geometry/Transform2-type.md +3 -11
  186. package/dist/docs/reference/geometry/Transform2Data.md +3 -11
  187. package/dist/docs/reference/geometry/Transform2Input.md +3 -11
  188. package/dist/docs/reference/geometry/Transform3-type.md +4 -12
  189. package/dist/docs/reference/geometry/Transform3Data.md +3 -11
  190. package/dist/docs/reference/geometry/Transform3Input.md +6 -13
  191. package/dist/docs/reference/geometry/Vector2-type.md +3 -11
  192. package/dist/docs/reference/geometry/Vector2Data.md +3 -15
  193. package/dist/docs/reference/geometry/Vector2Input.md +3 -11
  194. package/dist/docs/reference/geometry/Vector3-type.md +27 -11
  195. package/dist/docs/reference/geometry/Vector3Data.md +3 -11
  196. package/dist/docs/reference/geometry/Vector3Input.md +3 -11
  197. package/dist/docs/reference/geometry/VectorTextLayout.md +2 -10
  198. package/dist/docs/reference/geometry/VectorTextMetrics.md +3 -11
  199. package/dist/docs/reference/geometry/anchor3.md +17 -26
  200. package/dist/docs/reference/geometry/anchorFrame3.md +6 -6
  201. package/dist/docs/reference/geometry/attachmentTransform3.md +8 -8
  202. package/dist/docs/reference/geometry/bounds2.md +6 -8
  203. package/dist/docs/reference/geometry/bounds3.md +4 -6
  204. package/dist/docs/reference/geometry/boundsCenter.md +2 -2
  205. package/dist/docs/reference/geometry/boundsSize.md +2 -2
  206. package/dist/docs/reference/geometry/boxAnchor3.md +3 -3
  207. package/dist/docs/reference/geometry/categories/bounds-layout.md +9 -3
  208. package/dist/docs/reference/geometry/categories/curves-paths.md +24 -13
  209. package/dist/docs/reference/geometry/categories/immutable-data.md +40 -0
  210. package/dist/docs/reference/geometry/categories/pattern-placement.md +10 -4
  211. package/dist/docs/reference/geometry/categories/primitive-options.md +8 -13
  212. package/dist/docs/reference/geometry/categories/profiles-regions.md +11 -5
  213. package/dist/docs/reference/geometry/categories/resolution-errors.md +8 -1
  214. package/dist/docs/reference/geometry/categories/transforms-math.md +20 -51
  215. package/dist/docs/reference/geometry/categories/vector-import.md +7 -4
  216. package/dist/docs/reference/geometry/circleContour.md +3 -3
  217. package/dist/docs/reference/geometry/closeToAxis.md +7 -3
  218. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +9 -6
  219. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +13 -6
  220. package/dist/docs/reference/geometry/contourContainsPoint.md +7 -3
  221. package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
  222. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +3 -3
  223. package/dist/docs/reference/geometry/distributeAlongPath.md +16 -11
  224. package/dist/docs/reference/geometry/ellipseContour.md +3 -3
  225. package/dist/docs/reference/geometry/fitBounds.md +10 -2
  226. package/dist/docs/reference/geometry/fitTextLayout.md +5 -5
  227. package/dist/docs/reference/geometry/frame3.md +66 -0
  228. package/dist/docs/reference/geometry/gridPatternTransforms.md +6 -6
  229. package/dist/docs/reference/geometry/immutableBuffer.md +5 -7
  230. package/dist/docs/reference/geometry/isGeometryError.md +2 -6
  231. package/dist/docs/reference/geometry/layoutRow.md +4 -2
  232. package/dist/docs/reference/geometry/linearPatternTransforms.md +6 -6
  233. package/dist/docs/reference/geometry/matchProfiles.md +5 -3
  234. package/dist/docs/reference/geometry/normalizeContour.md +8 -4
  235. package/dist/docs/reference/geometry/normalizePolygon.md +5 -3
  236. package/dist/docs/reference/geometry/normalizeRegion.md +5 -3
  237. package/dist/docs/reference/geometry/path2.md +7 -7
  238. package/dist/docs/reference/geometry/path3.md +7 -7
  239. package/dist/docs/reference/geometry/pathPatternTransforms.md +12 -8
  240. package/dist/docs/reference/geometry/preflightSvgRegion.md +5 -5
  241. package/dist/docs/reference/geometry/radialPatternTransforms.md +5 -5
  242. package/dist/docs/reference/geometry/rectangleContour.md +3 -3
  243. package/dist/docs/reference/geometry/rectangleProfile.md +3 -4
  244. package/dist/docs/reference/geometry/regionArea.md +3 -3
  245. package/dist/docs/reference/geometry/regionBounds.md +6 -4
  246. package/dist/docs/reference/geometry/regularPolygonContour.md +3 -3
  247. package/dist/docs/reference/geometry/resamplePolyline2.md +7 -3
  248. package/dist/docs/reference/geometry/resamplePolyline3.md +7 -3
  249. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +5 -5
  250. package/dist/docs/reference/geometry/resolveArcSegments.md +8 -6
  251. package/dist/docs/reference/geometry/resolveCircularSampling.md +2 -2
  252. package/dist/docs/reference/geometry/resolveCircularSegments.md +5 -3
  253. package/dist/docs/reference/geometry/{resolveExtrusionDivisions.md → resolveExtrusionSlices.md} +16 -15
  254. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -3
  255. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +3 -3
  256. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -5
  257. package/dist/docs/reference/geometry/sampleContour.md +5 -5
  258. package/dist/docs/reference/geometry/sampleCurve2.md +7 -3
  259. package/dist/docs/reference/geometry/sampleCurve3.md +7 -3
  260. package/dist/docs/reference/geometry/sampleHelix.md +3 -3
  261. package/dist/docs/reference/geometry/sampleSideProfile.md +5 -5
  262. package/dist/docs/reference/geometry/sampleTextContours.md +3 -3
  263. package/dist/docs/reference/geometry/signedContourArea.md +5 -3
  264. package/dist/docs/reference/geometry/spline2.md +68 -0
  265. package/dist/docs/reference/geometry/spline3.md +62 -0
  266. package/dist/docs/reference/geometry/starContour.md +3 -3
  267. package/dist/docs/reference/geometry/strokeRegionData.md +8 -5
  268. package/dist/docs/reference/geometry/transform2.md +5 -7
  269. package/dist/docs/reference/geometry/transform3.md +23 -10
  270. package/dist/docs/reference/geometry/transformRegionData.md +7 -3
  271. package/dist/docs/reference/geometry/triangulateContour.md +6 -4
  272. package/dist/docs/reference/geometry/vector2.md +6 -8
  273. package/dist/docs/reference/geometry/vector3.md +8 -8
  274. package/dist/docs/reference/geometry.md +13 -18
  275. package/dist/docs/reference/{geometry → math}/AxisAngleRotation3.md +4 -5
  276. package/dist/docs/reference/math/IDENTITY_TRANSFORM3.md +20 -0
  277. package/dist/docs/reference/math/add2.md +38 -0
  278. package/dist/docs/reference/math/add3.md +46 -0
  279. package/dist/docs/reference/math/applyTransformDirection3.md +46 -0
  280. package/dist/docs/reference/math/applyTransformPoint3.md +44 -0
  281. package/dist/docs/reference/math/categories/tuple-matrix.md +67 -0
  282. package/dist/docs/reference/math/cross2.md +38 -0
  283. package/dist/docs/reference/math/cross3.md +44 -0
  284. package/dist/docs/reference/math/distance2.md +38 -0
  285. package/dist/docs/reference/math/distance3.md +38 -0
  286. package/dist/docs/reference/math/dot2.md +38 -0
  287. package/dist/docs/reference/math/dot3.md +44 -0
  288. package/dist/docs/reference/math/eulerTransform3.md +43 -0
  289. package/dist/docs/reference/math/inverseTransform3.md +36 -0
  290. package/dist/docs/reference/math/length2.md +32 -0
  291. package/dist/docs/reference/math/length3.md +32 -0
  292. package/dist/docs/reference/math/lerp2.md +46 -0
  293. package/dist/docs/reference/math/lerp3.md +46 -0
  294. package/dist/docs/reference/math/multiplyTransform3.md +46 -0
  295. package/dist/docs/reference/math/normalize2.md +45 -0
  296. package/dist/docs/reference/math/normalize3.md +45 -0
  297. package/dist/docs/reference/math/projectOntoPlane3.md +40 -0
  298. package/dist/docs/reference/math/rotate2.md +40 -0
  299. package/dist/docs/reference/math/rotationTransform3.md +56 -0
  300. package/dist/docs/reference/math/scale2.md +38 -0
  301. package/dist/docs/reference/math/scale3.md +44 -0
  302. package/dist/docs/reference/math/scaleTransform3.md +39 -0
  303. package/dist/docs/reference/math/subtract2.md +38 -0
  304. package/dist/docs/reference/math/subtract3.md +44 -0
  305. package/dist/docs/reference/math/transformDeterminant3.md +38 -0
  306. package/dist/docs/reference/math/translationTransform3.md +36 -0
  307. package/dist/docs/reference/math/validateRigidTransform3.md +38 -0
  308. package/dist/docs/reference/math/validateTransform3.md +48 -0
  309. package/dist/docs/reference/math.md +22 -0
  310. package/dist/docs/reference/{geometry → mechanical}/AcmeThreadProfileSpec.md +4 -13
  311. package/dist/docs/reference/{geometry → mechanical}/Bevel.md +3 -11
  312. package/dist/docs/reference/{geometry → mechanical}/BevelSize.md +3 -11
  313. package/dist/docs/reference/{geometry → mechanical}/ButtressPressureFlankSide.md +3 -11
  314. package/dist/docs/reference/{geometry → mechanical}/ButtressThreadProfileSpec.md +4 -13
  315. package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleDimensions.md +3 -3
  316. package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleFit.md +3 -3
  317. package/dist/docs/reference/{geometry → mechanical}/CompensatedThreadDiameters.md +3 -3
  318. package/dist/docs/reference/{geometry → mechanical}/CustomThreadProfileSpec.md +5 -15
  319. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearDimensions.md +3 -3
  320. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearMeshKind.md +3 -3
  321. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearOutlineOptions.md +5 -10
  322. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairDimensions.md +3 -3
  323. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionOptions.md +3 -3
  324. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionReport.md +3 -3
  325. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairSpec.md +3 -3
  326. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearSpec.md +3 -3
  327. package/dist/docs/reference/{geometry → mechanical}/InternalThreadCutterOptions.md +6 -13
  328. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeBaseSpec.md +3 -7
  329. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeDimensions.md +4 -5
  330. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeInterval.md +3 -3
  331. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSamplingOptions.md +5 -14
  332. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSpec.md +3 -7
  333. package/dist/docs/reference/{geometry → mechanical}/METRIC_FASTENER_STANDARDS.md +3 -3
  334. package/dist/docs/reference/{geometry → mechanical}/MetricFastenerSize.md +3 -3
  335. package/dist/docs/reference/{geometry → mechanical}/MetricFastenerStandard.md +3 -3
  336. package/dist/docs/reference/{geometry → mechanical}/MetricHexNutDimensions.md +3 -3
  337. package/dist/docs/reference/{geometry → mechanical}/MetricSocketCapHeadDimensions.md +3 -3
  338. package/dist/docs/reference/{geometry → mechanical}/PRINTABLE_THREAD_FIT_POLICIES.md +3 -3
  339. package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFit.md +3 -7
  340. package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFitPolicy.md +3 -7
  341. package/dist/docs/reference/{geometry → mechanical}/RackPitchDimensions.md +3 -3
  342. package/dist/docs/reference/{geometry → mechanical}/RackPitchSpec.md +3 -3
  343. package/dist/docs/reference/{geometry → mechanical}/SampledThreadHelices.md +4 -8
  344. package/dist/docs/reference/{geometry → mechanical}/SquareThreadProfileSpec.md +4 -13
  345. package/dist/docs/reference/{geometry → mechanical}/ThreadBevelOptions.md +3 -7
  346. package/dist/docs/reference/{geometry → mechanical}/ThreadCircularSegmentsOptions.md +5 -7
  347. package/dist/docs/reference/{geometry → mechanical}/ThreadCompensationOptions.md +4 -5
  348. package/dist/docs/reference/{geometry → mechanical}/ThreadEndStyle.md +3 -11
  349. package/dist/docs/reference/{geometry → mechanical}/ThreadEndTreatmentOptions.md +3 -11
  350. package/dist/docs/reference/{geometry → mechanical}/ThreadHandedness.md +3 -11
  351. package/dist/docs/reference/{geometry → mechanical}/ThreadHelixOptions.md +5 -7
  352. package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInEnvelope.md +3 -11
  353. package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInShape.md +3 -11
  354. package/dist/docs/reference/{geometry → mechanical}/ThreadProfile-type.md +5 -17
  355. package/dist/docs/reference/{geometry → mechanical}/ThreadProfileBaseSpec.md +4 -13
  356. package/dist/docs/reference/{geometry → mechanical}/ThreadProfileSpec.md +3 -11
  357. package/dist/docs/reference/{geometry → mechanical}/ThreadRidgeOptions.md +7 -18
  358. package/dist/docs/reference/{geometry → mechanical}/ThreadRole.md +3 -3
  359. package/dist/docs/reference/{geometry → mechanical}/ThreadSolidOptions.md +8 -15
  360. package/dist/docs/reference/{geometry → mechanical}/ThreadSolidPreflight.md +3 -11
  361. package/dist/docs/reference/{geometry → mechanical}/ThreadedNutOptions.md +7 -14
  362. package/dist/docs/reference/{geometry → mechanical}/ThreadedNutPreflight.md +3 -7
  363. package/dist/docs/reference/{geometry → mechanical}/ThreadedNutShape.md +3 -7
  364. package/dist/docs/reference/{geometry → mechanical}/ThreadedRodOptions.md +6 -13
  365. package/dist/docs/reference/{geometry → mechanical}/TrapezoidalThreadProfileSpec.md +4 -13
  366. package/dist/docs/reference/{geometry → mechanical}/TriangularThreadProfileSpec.md +4 -13
  367. package/dist/docs/reference/{geometry → mechanical}/categories/mechanical.md +8 -2
  368. package/dist/docs/reference/{geometry → mechanical}/compensateThreadDiameters.md +4 -4
  369. package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileAxially.md +12 -6
  370. package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileForFaceting.md +13 -3
  371. package/dist/docs/reference/{geometry → mechanical}/getMetricClearanceHoleDiameter.md +3 -3
  372. package/dist/docs/reference/{geometry → mechanical}/getMetricFastenerStandard.md +3 -3
  373. package/dist/docs/reference/{geometry → mechanical}/measureInternalCylindricalGearPairMotion.md +9 -7
  374. package/dist/docs/reference/{geometry → mechanical}/minimumCylindricalGearToothCountWithoutUndercut.md +5 -3
  375. package/dist/docs/reference/{geometry → mechanical}/preflightInternalThreadCutter.md +8 -6
  376. package/dist/docs/reference/{geometry → mechanical}/preflightThreadedNut.md +9 -7
  377. package/dist/docs/reference/{geometry → mechanical}/preflightThreadedRod.md +8 -6
  378. package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGear.md +5 -3
  379. package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGearPair.md +5 -3
  380. package/dist/docs/reference/{geometry → mechanical}/resolveKnuckleHinge.md +9 -7
  381. package/dist/docs/reference/{geometry → mechanical}/resolvePrintableThreadFitPolicy.md +5 -3
  382. package/dist/docs/reference/{geometry → mechanical}/resolveRackPitch.md +5 -3
  383. package/dist/docs/reference/{geometry → mechanical}/resolveThreadCircularSegments.md +7 -5
  384. package/dist/docs/reference/{geometry → mechanical}/sampleCylindricalGearOutline.md +9 -8
  385. package/dist/docs/reference/{geometry → mechanical}/sampleInternalCylindricalGearSpaceOutline.md +9 -8
  386. package/dist/docs/reference/{geometry → mechanical}/sampleRackToothPath.md +10 -8
  387. package/dist/docs/reference/{geometry → mechanical}/sampleThreadHelices.md +8 -6
  388. package/dist/docs/reference/{geometry → mechanical}/threadProfile.md +7 -3
  389. package/dist/docs/reference/mechanical.md +19 -0
  390. package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +128 -0
  391. package/dist/docs/reference/{geometry → mesh}/HeightfieldMeshLimits.md +5 -13
  392. package/dist/docs/reference/{geometry → mesh}/HeightfieldPreflight.md +3 -7
  393. package/dist/docs/reference/{geometry → mesh}/ImmutableTriangleMesh.md +5 -17
  394. package/dist/docs/reference/mesh/LoftMeshStation.md +32 -0
  395. package/dist/docs/reference/mesh/MeshRenderOptions.md +3 -3
  396. package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationFallbackReason.md +4 -8
  397. package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationOptions.md +4 -9
  398. package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationResult.md +4 -8
  399. package/dist/docs/reference/{geometry → mesh}/PlanarPatchQuality.md +4 -12
  400. package/dist/docs/reference/mesh/RenderMesh.md +19 -19
  401. package/dist/docs/reference/{geometry → mesh}/SolidMeshValidationOptions.md +4 -12
  402. package/dist/docs/reference/{geometry → mesh}/TriangleMesh.md +8 -12
  403. package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysis.md +5 -14
  404. package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysisOptions.md +4 -9
  405. package/dist/docs/reference/{geometry → mesh}/TriangleMeshInput.md +3 -7
  406. package/dist/docs/reference/{geometry → mesh}/TriangleMeshMeasurements.md +5 -14
  407. package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityOptions.md +4 -9
  408. package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityReport.md +3 -7
  409. package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignature.md +4 -9
  410. package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureOptions.md +3 -7
  411. package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureTolerances.md +3 -7
  412. package/dist/docs/reference/{geometry → mesh}/TriangleMeshTopologyAnalysis.md +5 -14
  413. package/dist/docs/reference/{geometry → mesh}/TriangleMeshValidationOptions.md +4 -9
  414. package/dist/docs/reference/mesh/analyze.md +26 -18
  415. package/dist/docs/reference/mesh/analyzeQuality.md +12 -12
  416. package/dist/docs/reference/mesh/bounds.md +5 -6
  417. package/dist/docs/reference/mesh/categories/operations.md +37 -4
  418. package/dist/docs/reference/mesh/centroid.md +5 -6
  419. package/dist/docs/reference/mesh/extrude.md +21 -20
  420. package/dist/docs/reference/mesh/heightfield.md +8 -8
  421. package/dist/docs/reference/mesh/immutable.md +7 -5
  422. package/dist/docs/reference/mesh/join.md +7 -7
  423. package/dist/docs/reference/mesh/loft.md +19 -18
  424. package/dist/docs/reference/mesh/optimizePlanarPatches.md +21 -21
  425. package/dist/docs/reference/mesh/preflightHeightfield.md +8 -8
  426. package/dist/docs/reference/mesh/preflightThreadSolid.md +22 -25
  427. package/dist/docs/reference/mesh/render.md +7 -5
  428. package/dist/docs/reference/mesh/reverse.md +7 -7
  429. package/dist/docs/reference/mesh/revolve.md +12 -14
  430. package/dist/docs/reference/mesh/signature.md +12 -12
  431. package/dist/docs/reference/mesh/sweep.md +96 -25
  432. package/dist/docs/reference/mesh/threadRidge.md +19 -18
  433. package/dist/docs/reference/mesh/threadSolid.md +23 -22
  434. package/dist/docs/reference/mesh/transform.md +8 -9
  435. package/dist/docs/reference/mesh/validate.md +11 -11
  436. package/dist/docs/reference/mesh/validateSolid.md +10 -10
  437. package/dist/docs/reference/mesh.md +8 -2
  438. package/dist/docs/reference/model/BoxEdge.md +23 -0
  439. package/dist/docs/reference/model/BoxEdgeSelection.md +27 -0
  440. package/dist/docs/reference/model/BoxEdgeTreatments.md +27 -0
  441. package/dist/docs/reference/{geometry → model}/BoxOptions.md +12 -12
  442. package/dist/docs/reference/model/CircleOptions.md +4 -5
  443. package/dist/docs/reference/model/CornerCutterOptions.md +93 -0
  444. package/dist/docs/reference/model/CornerCutterTreatment.md +53 -0
  445. package/dist/docs/reference/model/{HoleCutterOverrun.md → CutterOverrun.md} +8 -7
  446. package/dist/docs/reference/model/CylinderOptions.md +64 -0
  447. package/dist/docs/reference/model/DiagnosticOptions.md +2 -2
  448. package/dist/docs/reference/model/EdgeCutterOptions.md +129 -0
  449. package/dist/docs/reference/model/EllipseOptions.md +4 -5
  450. package/dist/docs/reference/model/EndTreatments.md +43 -0
  451. package/dist/docs/reference/model/ExtrudeOptions.md +153 -0
  452. package/dist/docs/reference/model/GenerateCallback.md +2 -2
  453. package/dist/docs/reference/model/GenerateContext.md +27 -3
  454. package/dist/docs/reference/model/GenerationDiagnostic.md +2 -2
  455. package/dist/docs/reference/model/GenerationError.md +2 -2
  456. package/dist/docs/reference/{geometry → model}/HeightfieldOptions.md +5 -23
  457. package/dist/docs/reference/model/HoleCutterOpening.md +27 -0
  458. package/dist/docs/reference/model/HoleCutterOptions.md +9 -22
  459. package/dist/docs/reference/model/HoleCutterRecess.md +5 -4
  460. package/dist/docs/reference/model/HullOptions.md +2 -3
  461. package/dist/docs/reference/model/ImmutableValue.md +2 -2
  462. package/dist/docs/reference/model/ImplicitOptions.md +3 -9
  463. package/dist/docs/reference/model/JoinOptions.md +2 -5
  464. package/dist/docs/reference/model/JoinTransition.md +2 -2
  465. package/dist/docs/reference/model/KnuckleHinge-type.md +2 -3
  466. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +2 -2
  467. package/dist/docs/reference/model/KnuckleHingeOptions.md +3 -5
  468. package/dist/docs/reference/model/KnuckleHingeWeb.md +2 -2
  469. package/dist/docs/reference/{geometry → model}/LoftCorrespondence.md +8 -11
  470. package/dist/docs/reference/{geometry → model}/LoftOptions.md +11 -16
  471. package/dist/docs/reference/model/LoftStation.md +4 -5
  472. package/dist/docs/reference/model/Memo.md +2 -2
  473. package/dist/docs/reference/model/ModelProgram.md +2 -2
  474. package/dist/docs/reference/model/PartDeclaration.md +4 -5
  475. package/dist/docs/reference/model/PartGeometry.md +3 -5
  476. package/dist/docs/reference/model/PartOptions.md +4 -5
  477. package/dist/docs/reference/model/PatternSource.md +4 -4
  478. package/dist/docs/reference/model/PlaneOptions.md +3 -7
  479. package/dist/docs/reference/model/PolygonOptions.md +2 -7
  480. package/dist/docs/reference/model/PrimitiveAttachment.md +50 -0
  481. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +111 -0
  482. package/dist/docs/reference/model/RectangleOptions.md +21 -26
  483. package/dist/docs/reference/model/RegularPolygonOptions.md +4 -37
  484. package/dist/docs/reference/{geometry → model}/RevolveOptions.md +15 -24
  485. package/dist/docs/reference/model/Section.md +115 -53
  486. package/dist/docs/reference/model/SectionHullOptions.md +2 -3
  487. package/dist/docs/reference/model/SectionInspection.md +2 -6
  488. package/dist/docs/reference/model/SectionOffsetJoin.md +2 -2
  489. package/dist/docs/reference/model/SectionOffsetOptions.md +2 -3
  490. package/dist/docs/reference/model/Solid.md +24 -12
  491. package/dist/docs/reference/model/SolidInspection.md +2 -6
  492. package/dist/docs/reference/model/SolidSegmentHit.md +2 -6
  493. package/dist/docs/reference/model/SphereOptions.md +27 -0
  494. package/dist/docs/reference/model/StarOptions.md +21 -23
  495. package/dist/docs/reference/model/SvgOrigin.md +2 -2
  496. package/dist/docs/reference/model/SvgPathSectionOptions.md +3 -5
  497. package/dist/docs/reference/model/SvgSectionOptions.md +3 -6
  498. package/dist/docs/reference/model/SweepOptions.md +109 -0
  499. package/dist/docs/reference/model/SweepOrientation.md +119 -0
  500. package/dist/docs/reference/model/SweepTransformOptions.md +105 -0
  501. package/dist/docs/reference/model/TextSectionOptions.md +2 -7
  502. package/dist/docs/reference/{geometry → model}/TorusOptions.md +11 -10
  503. package/dist/docs/reference/model/TubeOptions.md +84 -0
  504. package/dist/docs/reference/model/box.md +11 -10
  505. package/dist/docs/reference/model/categories/boolean-operations.md +9 -3
  506. package/dist/docs/reference/model/categories/bounded-surfaces.md +13 -1
  507. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +26 -7
  508. package/dist/docs/reference/model/categories/generation.md +11 -3
  509. package/dist/docs/reference/model/categories/hinges.md +7 -1
  510. package/dist/docs/reference/model/categories/mesh-inspection.md +7 -1
  511. package/dist/docs/reference/model/categories/primitives.md +34 -6
  512. package/dist/docs/reference/model/categories/sections.md +8 -2
  513. package/dist/docs/reference/model/categories/threads.md +8 -5
  514. package/dist/docs/reference/model/categories/transforms-placement.md +15 -10
  515. package/dist/docs/reference/model/circle.md +7 -3
  516. package/dist/docs/reference/model/cornerCutter.md +88 -0
  517. package/dist/docs/reference/model/cylinder.md +6 -5
  518. package/dist/docs/reference/model/edgeCutter.md +91 -0
  519. package/dist/docs/reference/model/ellipse.md +7 -3
  520. package/dist/docs/reference/model/extrude.md +29 -23
  521. package/dist/docs/reference/model/generate.md +4 -2
  522. package/dist/docs/reference/model/gridPattern.md +11 -4
  523. package/dist/docs/reference/model/heightfield.md +5 -5
  524. package/dist/docs/reference/model/holeCutter.md +26 -12
  525. package/dist/docs/reference/model/hull.md +2 -2
  526. package/dist/docs/reference/model/implicit.md +3 -3
  527. package/dist/docs/reference/model/internalThreadCutter.md +32 -21
  528. package/dist/docs/reference/model/intersect.md +7 -3
  529. package/dist/docs/reference/model/join.md +6 -2
  530. package/dist/docs/reference/model/knuckleHinge.md +2 -3
  531. package/dist/docs/reference/model/linearPattern.md +11 -4
  532. package/dist/docs/reference/model/loft.md +28 -24
  533. package/dist/docs/reference/model/minkowskiSum.md +3 -3
  534. package/dist/docs/reference/model/pathPattern.md +17 -8
  535. package/dist/docs/reference/model/polygon.md +8 -3
  536. package/dist/docs/reference/model/radialPattern.md +11 -4
  537. package/dist/docs/reference/model/rectangle.md +11 -7
  538. package/dist/docs/reference/model/regularPolygon.md +7 -3
  539. package/dist/docs/reference/model/revolve.md +18 -12
  540. package/dist/docs/reference/model/solidFromMesh.md +10 -6
  541. package/dist/docs/reference/model/sphere.md +7 -6
  542. package/dist/docs/reference/model/star.md +11 -7
  543. package/dist/docs/reference/model/stroke.md +12 -8
  544. package/dist/docs/reference/model/svgPathSection.md +10 -4
  545. package/dist/docs/reference/model/svgSection.md +10 -4
  546. package/dist/docs/reference/model/sweep.md +102 -25
  547. package/dist/docs/reference/model/textSection.md +7 -3
  548. package/dist/docs/reference/model/threadRidge.md +16 -17
  549. package/dist/docs/reference/model/threadedNut.md +25 -22
  550. package/dist/docs/reference/model/threadedRod.md +21 -18
  551. package/dist/docs/reference/model/torus.md +13 -12
  552. package/dist/docs/reference/model/tube.md +6 -5
  553. package/dist/docs/reference/model/union.md +7 -3
  554. package/dist/docs/reference/model.md +10 -5
  555. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +2 -2
  556. package/dist/docs/reference/text/VectorFont.md +38 -34
  557. package/dist/docs/reference/text/VectorFontOptions.md +2 -2
  558. package/dist/docs/reference/{geometry → text}/VectorTextArcBaseline.md +2 -11
  559. package/dist/docs/reference/{geometry → text}/VectorTextLayoutOptions.md +3 -11
  560. package/dist/docs/reference/{geometry → text}/VectorTextOptions.md +2 -10
  561. package/dist/docs/reference/text/categories/font-preparation.md +10 -1
  562. package/dist/docs/reference/text/prepareVectorFont.md +4 -2
  563. package/dist/docs/reference/text.md +7 -1
  564. package/dist/engine/execution.js +5 -3
  565. package/dist/engine/finalization.js +5 -5
  566. package/dist/engine/index.js +9 -4
  567. package/dist/engine/native/adapter.js +1 -1
  568. package/dist/engine/native/construction-mesh.js +15 -5
  569. package/dist/engine/native/context.js +10 -7
  570. package/dist/engine/native/index.js +1 -1
  571. package/dist/engine/native/material-components.js +2 -2
  572. package/dist/engine/native/mesh-observation.js +1 -1
  573. package/dist/engine/native/regions.js +44 -24
  574. package/dist/engine/native/scoped-primitives.js +3 -3
  575. package/dist/engine/native/scoped-threads.js +1 -13
  576. package/dist/engine/native/threads.js +2 -2
  577. package/dist/engine/native/transforms.js +2 -2
  578. package/dist/engine/operations/construction.js +77 -27
  579. package/dist/engine/operations/context.js +13 -6
  580. package/dist/engine/operations/cutters.js +112 -0
  581. package/dist/engine/operations/environment.js +2 -2
  582. package/dist/engine/operations/extrusion-finishing.js +42 -16
  583. package/dist/engine/operations/hole-cutter.js +125 -114
  584. package/dist/engine/operations/join-collar-profile.js +19 -19
  585. package/dist/engine/operations/join.js +86 -73
  586. package/dist/engine/operations/knuckle-hinge.js +25 -20
  587. package/dist/engine/operations/loft.js +9 -16
  588. package/dist/engine/operations/mechanical.js +4 -15
  589. package/dist/engine/operations/primitives/anchors.js +23 -19
  590. package/dist/engine/operations/primitives/construction.js +38 -12
  591. package/dist/engine/operations/primitives/correspondence.js +2 -2
  592. package/dist/engine/operations/primitives/profile-mesh.js +41 -80
  593. package/dist/engine/operations/primitives/profiles.js +5 -5
  594. package/dist/engine/operations/sections.js +8 -8
  595. package/dist/engine/operations/transforms.js +19 -39
  596. package/dist/engine/placement.js +3 -3
  597. package/dist/engine/recipe-realization.js +86 -30
  598. package/dist/engine/session/declarations.js +98 -0
  599. package/dist/engine/session/dependencies.js +81 -28
  600. package/dist/engine/session/graph.js +39 -137
  601. package/dist/engine/session/parameters.js +78 -0
  602. package/dist/engine/session/session.js +2 -2
  603. package/dist/engine/session/snapshot-cache.js +2 -2
  604. package/dist/engine/shape-anchors.js +13 -6
  605. package/dist/export/3mf.js +9 -2
  606. package/dist/export/capture.js +10 -6
  607. package/dist/export/glb.js +7 -2
  608. package/dist/export/stl.js +21 -6
  609. package/dist/geometry/{bounds.js → bounds/operations.js} +3 -1
  610. package/dist/geometry/{bounds-value.js → bounds/value.js} +20 -16
  611. package/dist/geometry/curves/evaluation.js +5 -6
  612. package/dist/geometry/curves/sampling.js +30 -6
  613. package/dist/geometry/{extrusion.js → extrusion/controls.js} +58 -35
  614. package/dist/geometry/extrusion/mesh.js +92 -0
  615. package/dist/geometry/extrusion/stations.js +35 -0
  616. package/dist/geometry/extrusion/twisted-chamfer.js +265 -0
  617. package/dist/geometry/immutable-buffer.js +7 -1
  618. package/dist/geometry/index.js +24 -32
  619. package/dist/geometry/{model-limits.js → limits.js} +1 -1
  620. package/dist/geometry/loft/{loft-correspondence.js → correspondence.js} +31 -20
  621. package/dist/geometry/loft/{loft-geometry.js → geometry.js} +15 -17
  622. package/dist/geometry/loft/mesh.js +53 -0
  623. package/dist/geometry/loft/{loft-options.js → options.js} +13 -11
  624. package/dist/geometry/loft/{loft-simple-mesh.js → simple-mesh.js} +26 -17
  625. package/dist/geometry/math/interpolation.js +9 -0
  626. package/dist/geometry/math/vector-value.js +12 -3
  627. package/dist/geometry/math/vector2.js +18 -5
  628. package/dist/geometry/math/vector3.js +28 -5
  629. package/dist/geometry/math-api.js +4 -0
  630. package/dist/geometry/mechanical/gear-motion.js +7 -5
  631. package/dist/geometry/mechanical/gears.js +21 -4
  632. package/dist/geometry/mechanical/knuckle-hinge.js +7 -5
  633. package/dist/geometry/mechanical/threads/fit.js +8 -2
  634. package/dist/geometry/mechanical/threads/helices.js +4 -2
  635. package/dist/geometry/mechanical/threads/mesh-plan.js +4 -2
  636. package/dist/geometry/mechanical/threads/mesh.js +12 -9
  637. package/dist/geometry/mechanical/threads/profiles.js +18 -4
  638. package/dist/geometry/mechanical/threads/solids.js +11 -2
  639. package/dist/geometry/mechanical-api.js +10 -0
  640. package/dist/geometry/mesh/{mesh-centroid.js → centroid.js} +2 -1
  641. package/dist/geometry/{heightfield.js → mesh/heightfield.js} +9 -5
  642. package/dist/geometry/{join-geometry.js → mesh/join-layers.js} +53 -59
  643. package/dist/geometry/mesh/{mesh.js → operations.js} +11 -18
  644. package/dist/geometry/mesh/{mesh-planar.js → planar.js} +8 -18
  645. package/dist/geometry/mesh/{mesh-quality.js → quality.js} +10 -42
  646. package/dist/geometry/mesh/{mesh-render.js → render-buffers.js} +22 -7
  647. package/dist/geometry/mesh/{mesh-signature.js → signature.js} +1 -1
  648. package/dist/geometry/mesh/{mesh-solid-intersections.js → solid-intersections.js} +2 -0
  649. package/dist/geometry/mesh/{mesh-solid.js → solid.js} +4 -4
  650. package/dist/geometry/mesh/triangle-quality.js +42 -0
  651. package/dist/geometry/mesh/winding.js +11 -0
  652. package/dist/geometry/{numeric.js → mesh/write-vertex.js} +1 -1
  653. package/dist/geometry/mesh-api.js +12 -11
  654. package/dist/geometry/paths/distribution.js +43 -0
  655. package/dist/geometry/paths/editing.js +76 -0
  656. package/dist/geometry/paths/frames.js +16 -11
  657. package/dist/geometry/paths/helix.js +1 -1
  658. package/dist/geometry/paths/resampling.js +46 -61
  659. package/dist/geometry/paths/{planar.js → rounding.js} +8 -67
  660. package/dist/geometry/paths/spline.js +116 -0
  661. package/dist/geometry/paths/traversal.js +107 -0
  662. package/dist/geometry/paths/{path-value.js → value.js} +97 -18
  663. package/dist/geometry/patterns/placements.js +20 -29
  664. package/dist/geometry/{patterns.js → patterns/transforms.js} +11 -7
  665. package/dist/geometry/primitives/cutters.js +70 -0
  666. package/dist/geometry/{cylinder.js → primitives/cylinder.js} +4 -4
  667. package/dist/geometry/{edge-finishing.js → primitives/edges.js} +5 -5
  668. package/dist/geometry/{primitive-resolvers.js → primitives/resolvers.js} +9 -9
  669. package/dist/geometry/primitives/sampling.js +41 -0
  670. package/dist/geometry/profiles/contour.js +19 -7
  671. package/dist/geometry/profiles/{match-profiles.js → matching.js} +9 -6
  672. package/dist/geometry/profiles/primitives/circle.js +1 -1
  673. package/dist/geometry/profiles/primitives/ellipse.js +2 -2
  674. package/dist/geometry/profiles/primitives/rectangle.js +8 -8
  675. package/dist/geometry/profiles/primitives/star.js +1 -1
  676. package/dist/geometry/profiles/side-profile.js +8 -5
  677. package/dist/geometry/profiles/validation.js +1 -1
  678. package/dist/geometry/{polygon-clipping.js → regions/clipping.js} +1 -1
  679. package/dist/geometry/{convex-offset.js → regions/convex-offset.js} +1 -1
  680. package/dist/geometry/{region-offset.js → regions/offset.js} +7 -5
  681. package/dist/geometry/{regions.js → regions/operations.js} +59 -22
  682. package/dist/geometry/{stroke-path.js → regions/stroke.js} +46 -20
  683. package/dist/geometry/{loft/loft-triangulation.js → regions/triangulation.js} +35 -2
  684. package/dist/geometry/revolve/{revolve-mesh.js → mesh.js} +9 -10
  685. package/dist/geometry/{circular-sampling.js → sampling/circular.js} +3 -3
  686. package/dist/geometry/{sampling-limits.js → sampling/limits.js} +6 -2
  687. package/dist/geometry/{resolution.js → sampling/resolution.js} +15 -14
  688. package/dist/geometry/svg/fill.js +4 -3
  689. package/dist/geometry/svg/import.js +47 -64
  690. package/dist/geometry/svg/path.js +3 -3
  691. package/dist/geometry/sweep/closed.js +55 -0
  692. package/dist/geometry/sweep/mesh.js +30 -0
  693. package/dist/geometry/{sweeps/sweep-open.js → sweep/open.js} +9 -24
  694. package/dist/geometry/{sweeps → sweep}/orientation.js +14 -11
  695. package/dist/geometry/sweep/seam.js +30 -0
  696. package/dist/geometry/{sweeps → sweep}/stations.js +75 -10
  697. package/dist/geometry/sweep/transforms.js +30 -0
  698. package/dist/geometry/{sweeps → sweep}/validation.js +4 -4
  699. package/dist/geometry/{text-contours.js → text/contours.js} +3 -3
  700. package/dist/geometry/{text-fitting.js → text/fitting.js} +4 -3
  701. package/dist/geometry/text/layout.js +1 -0
  702. package/dist/geometry/{transform3.js → transforms/affine3.js} +31 -46
  703. package/dist/geometry/{anchors.js → transforms/anchors.js} +43 -24
  704. package/dist/geometry/{transform-geometry.js → transforms/apply.js} +8 -5
  705. package/dist/geometry/{transform2.js → transforms/dimensions.js} +23 -19
  706. package/dist/geometry/transforms/frame.js +64 -0
  707. package/dist/geometry/{transform-matrix.js → transforms/matrix-input.js} +8 -1
  708. package/dist/geometry/{transform-value.js → transforms/value.js} +29 -11
  709. package/dist/index.js +3 -9
  710. package/dist/model/cutters.js +1 -0
  711. package/dist/model/execution-binding.js +3 -3
  712. package/dist/model/generation.js +2 -0
  713. package/dist/model/immutable-generation-data.js +2 -0
  714. package/dist/model/operations.js +130 -94
  715. package/dist/model/recipe-declaration.js +5 -7
  716. package/dist/text/index.js +3 -0
  717. package/dist/text/vector-text-layout.js +1 -0
  718. package/package.json +15 -17
  719. package/dist/api/export-3mf.d.ts +0 -2
  720. package/dist/api/export-glb.d.ts +0 -2
  721. package/dist/api/export-stl.d.ts +0 -2
  722. package/dist/docs/reference/geometry/BoxEdge.md +0 -17
  723. package/dist/docs/reference/geometry/BoxEdgeSelection.md +0 -24
  724. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +0 -25
  725. package/dist/docs/reference/geometry/CylinderOptions.md +0 -63
  726. package/dist/docs/reference/geometry/EndTreatments.md +0 -44
  727. package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +0 -144
  728. package/dist/docs/reference/geometry/ExtrudeOptions.md +0 -156
  729. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +0 -25
  730. package/dist/docs/reference/geometry/LoftMeshStation.md +0 -41
  731. package/dist/docs/reference/geometry/PrimitiveAttachment.md +0 -39
  732. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +0 -114
  733. package/dist/docs/reference/geometry/SphereOptions.md +0 -25
  734. package/dist/docs/reference/geometry/SweepOptions.md +0 -127
  735. package/dist/docs/reference/geometry/SweepOrientation.md +0 -127
  736. package/dist/docs/reference/geometry/TubeOptions.md +0 -72
  737. package/dist/docs/reference/geometry/add2.md +0 -43
  738. package/dist/docs/reference/geometry/add3.md +0 -49
  739. package/dist/docs/reference/geometry/applyTransformDirection3.md +0 -52
  740. package/dist/docs/reference/geometry/applyTransformPoint3.md +0 -50
  741. package/dist/docs/reference/geometry/categories/meshes.md +0 -68
  742. package/dist/docs/reference/geometry/composeTransform3.md +0 -51
  743. package/dist/docs/reference/geometry/cross2.md +0 -43
  744. package/dist/docs/reference/geometry/cross3.md +0 -49
  745. package/dist/docs/reference/geometry/distance2.md +0 -43
  746. package/dist/docs/reference/geometry/distance3.md +0 -43
  747. package/dist/docs/reference/geometry/dot2.md +0 -43
  748. package/dist/docs/reference/geometry/dot3.md +0 -49
  749. package/dist/docs/reference/geometry/eulerTransform3.md +0 -49
  750. package/dist/docs/reference/geometry/frameTransform3.md +0 -55
  751. package/dist/docs/reference/geometry/inverseTransform3.md +0 -41
  752. package/dist/docs/reference/geometry/length2.md +0 -37
  753. package/dist/docs/reference/geometry/length3.md +0 -37
  754. package/dist/docs/reference/geometry/lerp2.md +0 -49
  755. package/dist/docs/reference/geometry/lerp3.md +0 -49
  756. package/dist/docs/reference/geometry/normalize2.md +0 -46
  757. package/dist/docs/reference/geometry/normalize3.md +0 -46
  758. package/dist/docs/reference/geometry/projectOntoPlane3.md +0 -43
  759. package/dist/docs/reference/geometry/rotate2.md +0 -43
  760. package/dist/docs/reference/geometry/rotationTransform3.md +0 -60
  761. package/dist/docs/reference/geometry/scale2.md +0 -43
  762. package/dist/docs/reference/geometry/scale3.md +0 -49
  763. package/dist/docs/reference/geometry/scaleTransform3.md +0 -45
  764. package/dist/docs/reference/geometry/subtract2.md +0 -43
  765. package/dist/docs/reference/geometry/subtract3.md +0 -49
  766. package/dist/docs/reference/geometry/transformDeterminant3.md +0 -43
  767. package/dist/docs/reference/geometry/translationTransform3.md +0 -42
  768. package/dist/docs/reference/geometry/validateRigidTransform3.md +0 -41
  769. package/dist/docs/reference/geometry/validateTransform3.md +0 -54
  770. package/dist/docs/reference/model/Profile.md +0 -30
  771. package/dist/docs/reference/model/categories/explicit-profiles.md +0 -21
  772. package/dist/docs/reference/model/matchProfiles.md +0 -48
  773. package/dist/docs/reference/model/preflightInternalThreadCutter.md +0 -93
  774. package/dist/docs/reference/model/preflightThreadedNut.md +0 -109
  775. package/dist/docs/reference/model/preflightThreadedRod.md +0 -93
  776. package/dist/engine/operations/patterns.js +0 -47
  777. package/dist/geometry/loft/loft.js +0 -105
  778. package/dist/geometry/mechanical/index.js +0 -14
  779. package/dist/geometry/primitive-resolution.js +0 -20
  780. package/dist/geometry/svg/index.js +0 -1
  781. package/dist/geometry/sweeps/options.js +0 -29
  782. package/dist/geometry/sweeps/sweep-closed.js +0 -96
  783. package/dist/geometry/sweeps/sweep-mesh.js +0 -32
  784. /package/dist/geometry/mechanical/{standards.js → fastener-standards.js} +0 -0
  785. /package/dist/geometry/mesh/{mesh-edge-table.js → edge-table.js} +0 -0
  786. /package/dist/geometry/mesh/{mesh-types.js → types.js} +0 -0
  787. /package/dist/geometry/mesh/{mesh-view-cache.js → view-cache.js} +0 -0
  788. /package/dist/geometry/{primitive-options.js → primitives/options.js} +0 -0
  789. /package/dist/geometry/{text-layout.js → sweep/options.js} +0 -0
@@ -1,6 +1,6 @@
1
- import { anchor3 } from "../geometry/anchors.js";
2
1
  import { GeometryError } from "../geometry/errors.js";
3
- import { applyInverseTranspose3, applyTransformDirection3, applyTransformPoint3, inverseLinearTransform3, } from "../geometry/transform3.js";
2
+ import { applyInverseTranspose3, applyValidatedTransformDirection3, applyValidatedTransformPoint3, inverseLinearTransform3, validateTransform3, } from "../geometry/transforms/affine3.js";
3
+ import { anchor3 } from "../geometry/transforms/anchors.js";
4
4
  const maximumAnchors = 128;
5
5
  function fail(operation, message) {
6
6
  throw new GeometryError("INVALID_ARGUMENT", message, { operation });
@@ -15,7 +15,7 @@ function copyAnchor(anchor, operation) {
15
15
  for (const vector of [anchor.position, anchor.direction, anchor.up])
16
16
  if (!Array.isArray(vector) || vector.length !== 3 || !vector.every(Number.isFinite))
17
17
  fail(operation, "Anchor vectors must contain exactly three finite coordinates.");
18
- return anchor3(anchor.position, anchor.direction, anchor.up);
18
+ return anchor3({ position: anchor.position, direction: anchor.direction, up: anchor.up });
19
19
  }
20
20
  function unit(vector) {
21
21
  const maximum = Math.max(...vector.map(Math.abs));
@@ -27,7 +27,11 @@ function unit(vector) {
27
27
  }
28
28
  /** Maps positions affinely, outward normals by inverse transpose, and roll tangents linearly. */
29
29
  function transformedAnchor(anchor, matrix, inverse) {
30
- return anchor3(applyTransformPoint3(matrix, anchor.position), applyInverseTranspose3(inverse, anchor.direction), unit(applyTransformDirection3(matrix, anchor.up)));
30
+ return anchor3({
31
+ position: applyValidatedTransformPoint3(matrix, anchor.position),
32
+ direction: applyInverseTranspose3(inverse, anchor.direction),
33
+ up: unit(applyValidatedTransformDirection3(matrix, anchor.up)),
34
+ });
31
35
  }
32
36
  /** Run-owned immutable anchor metadata. Geometry operations acquire metadata only deliberately. */
33
37
  export function createShapeAnchorOwner(assertShape, aliasShape) {
@@ -75,10 +79,13 @@ export function createShapeAnchorOwner(assertShape, aliasShape) {
75
79
  if (definitions === undefined)
76
80
  return result;
77
81
  const inverse = inverseLinearTransform3(matrix);
78
- return remember(result, Object.fromEntries(Object.entries(definitions).map(([name, value]) => [
82
+ validateTransform3(matrix);
83
+ // Names and inputs already belong to this owner; transformedAnchor returns frozen values.
84
+ anchors.set(result, Object.freeze(Object.fromEntries(Object.entries(definitions).map(([name, value]) => [
79
85
  name,
80
86
  transformedAnchor(value, matrix, inverse),
81
- ])));
87
+ ]))));
88
+ return result;
82
89
  },
83
90
  dispose() {
84
91
  anchors.clear();
@@ -1,6 +1,6 @@
1
1
  import { Zip, ZipDeflate } from "fflate";
2
2
  import { GeometryError } from "../geometry/errors.js";
3
- import { MeshViewCache } from "../geometry/mesh/mesh-view-cache.js";
3
+ import { MeshViewCache } from "../geometry/mesh/view-cache.js";
4
4
  import { captureExport } from "./capture.js";
5
5
  import { collectExport, createExportWriter } from "./writer.js";
6
6
  const coreNamespace = "http://schemas.microsoft.com/3dmanufacturing/core/2015/02";
@@ -130,6 +130,9 @@ function* modelXml(captured) {
130
130
  * names, combined with appearance through multiproperties; display colors never select filament.
131
131
  * Captures mutable inputs before awaiting and awaits each owned output chunk for backpressure.
132
132
  * The host owns destination closing and cleanup of partial output after rejection.
133
+ *
134
+ * @param parts - Closed, outward-wound parts in output order.
135
+ * @param sink - Receives each chunk; return a promise to pause writing.
133
136
  */
134
137
  export async function write3mf(parts, sink, options = {}) {
135
138
  const captured = captureExport(parts, options, "3mf");
@@ -184,7 +187,11 @@ export async function write3mf(parts, sink, options = {}) {
184
187
  zip.terminate();
185
188
  }
186
189
  }
187
- /** Serializes selected completed meshes as an owned 3MF file without initializing an engine. */
190
+ /**
191
+ * Serializes selected completed meshes as an owned 3MF file without initializing an engine.
192
+ *
193
+ * @param parts - Closed, outward-wound parts in output order, with local geometry in millimetres.
194
+ */
188
195
  export async function export3mf(parts, options = {}) {
189
196
  return collectExport((sink) => write3mf(parts, sink, options));
190
197
  }
@@ -1,9 +1,9 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
2
  import { immutableBufferView, isImmutableBuffer } from "../geometry/immutable-buffer.js";
3
- import { analyzeSolidMesh } from "../geometry/mesh/mesh-solid.js";
4
- import { MeshViewCache } from "../geometry/mesh/mesh-view-cache.js";
5
- import { analyzeTriangleMesh, transformTriangleMesh, } from "../geometry/mesh/mesh.js";
6
- import { IDENTITY_TRANSFORM3, validateRigidTransform3 } from "../geometry/transform3.js";
3
+ import { analyzeTriangleMesh, transformTriangleMesh, } from "../geometry/mesh/operations.js";
4
+ import { analyzeSolidMesh } from "../geometry/mesh/solid.js";
5
+ import { MeshViewCache } from "../geometry/mesh/view-cache.js";
6
+ import { IDENTITY_TRANSFORM3, validateRigidTransform3 } from "../geometry/transforms/affine3.js";
7
7
  import { resolveExportLimits } from "./limits.js";
8
8
  // Array.isArray's any[] predicate must not erase the already typed public contracts below.
9
9
  const isArray = Array.isArray;
@@ -65,7 +65,12 @@ export function captureExport(parts, options, format) {
65
65
  bytes += source.byteLength;
66
66
  if (bytes > limits.maxBytes)
67
67
  throw new GeometryError("COMPLEXITY_LIMIT", "Export snapshot exceeds maxBytes.");
68
- const captured = immutable ? source : source.slice();
68
+ // Typed-array methods and species are caller-overridable; constructors guarantee an owned copy.
69
+ const captured = immutable
70
+ ? source
71
+ : (source instanceof Float32Array
72
+ ? new Float32Array(source)
73
+ : new Uint32Array(source));
69
74
  if (ranges === undefined) {
70
75
  ranges = new Map();
71
76
  viewKeys.set(source.buffer, ranges);
@@ -172,7 +177,6 @@ export function captureExport(parts, options, format) {
172
177
  materials: Object.freeze(materials),
173
178
  name,
174
179
  limits,
175
- meshValidation,
176
180
  ...(signal === undefined ? {} : { signal }),
177
181
  });
178
182
  }
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
- import { renderMesh } from "../geometry/mesh/mesh-render.js";
2
+ import { renderValidatedMesh } from "../geometry/mesh/render-buffers.js";
3
3
  import { captureExport } from "./capture.js";
4
4
  import { collectExport, createExportWriter } from "./writer.js";
5
5
  const alignedLength = (length) => Math.ceil(length / 4) * 4;
@@ -16,6 +16,8 @@ function baseColor(color) {
16
16
  * Serializes captured local meshes as uncompressed glTF 2.0 binary, in metres and Y-up.
17
17
  * Preserves named parts, placement, shared geometry and display appearance. Authored normals take
18
18
  * precedence over crease-aware shading; no engine, renderer or optional compression codec is loaded.
19
+ *
20
+ * @param parts - Parts in output order, with local geometry in millimetres and Z-up.
19
21
  */
20
22
  export function exportGlb(parts, options = {}) {
21
23
  return collectExport((sink) => writeGlb(parts, sink, options));
@@ -24,6 +26,9 @@ export function exportGlb(parts, options = {}) {
24
26
  * Writes owned GLB chunks with backpressure, cancellation and explicit output limits.
25
27
  * Plans accessor and container lengths before writing, then emits bounded binary chunks.
26
28
  * Hosts own sink completion, scheduling and recovery after a partially written failure.
29
+ *
30
+ * @param parts - Parts in output order; mutable geometry is copied before writing.
31
+ * @param sink - Receives each chunk; return a promise to pause writing.
27
32
  */
28
33
  export async function writeGlb(parts, sink, options = {}) {
29
34
  const captured = captureExport(parts, options, "glb");
@@ -74,7 +79,7 @@ export async function writeGlb(parts, sink, options = {}) {
74
79
  let geometry = geometryAccessors.get(part.geometry);
75
80
  if (geometry === undefined) {
76
81
  const rendered = part.geometry.normals === undefined
77
- ? renderMesh(part.geometry, { creaseAngle })
82
+ ? renderValidatedMesh(part.geometry, creaseAngle)
78
83
  : { ...part.geometry, normals: part.geometry.normals };
79
84
  const min = [Infinity, Infinity, Infinity];
80
85
  const max = [-Infinity, -Infinity, -Infinity];
@@ -1,4 +1,5 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
+ import { IDENTITY_TRANSFORM3 } from "../geometry/transforms/affine3.js";
2
3
  import { captureExport } from "./capture.js";
3
4
  import { collectExport, createExportWriter } from "./writer.js";
4
5
  const TRIANGLES_PER_CHUNK = 1_024;
@@ -6,6 +7,8 @@ const TRIANGLES_PER_CHUNK = 1_024;
6
7
  * Serializes a captured model as binary STL in millimetres and Z-up coordinates.
7
8
  * Placement is baked into triangles. Diagnostics describe dropped names, appearance and materials.
8
9
  * Mutable input is captured before the first await; no engine or renderer is needed.
10
+ *
11
+ * @param parts - Parts in output order, with local geometry in millimetres.
9
12
  */
10
13
  export function exportStl(parts, options = {}) {
11
14
  return collectExport((sink) => writeStl(parts, sink, options));
@@ -13,6 +16,9 @@ export function exportStl(parts, options = {}) {
13
16
  /**
14
17
  * Writes owned binary STL chunks to a sink, awaiting backpressure after each bounded chunk.
15
18
  * The host owns sink completion and recovery after failure. Honors cancellation and output limits.
19
+ *
20
+ * @param parts - Parts in output order; mutable geometry is copied before writing.
21
+ * @param sink - Receives each chunk; return a promise to pause writing.
16
22
  */
17
23
  export async function writeStl(parts, sink, options = {}) {
18
24
  const captured = captureExport(parts, options, "stl");
@@ -35,19 +41,28 @@ export async function writeStl(parts, sink, options = {}) {
35
41
  for (const part of captured.parts) {
36
42
  const { positions, indices } = part.geometry;
37
43
  const matrix = part.transform;
44
+ const identity = matrix.every((value, index) => Object.is(value, IDENTITY_TRANSFORM3[index]));
38
45
  for (let offset = 0; offset < indices.length; offset += 3) {
39
46
  for (let corner = 0; corner < 3; corner += 1) {
40
47
  const index = indices[offset + corner] * 3;
41
48
  const x = positions[index];
42
49
  const y = positions[index + 1];
43
50
  const z = positions[index + 2];
44
- for (let axis = 0; axis < 3; axis += 1) {
45
- const row = axis * 4;
46
- const value = Math.fround(matrix[row] * x + matrix[row + 1] * y + matrix[row + 2] * z + matrix[row + 3]);
47
- if (!Number.isFinite(value))
48
- throw new GeometryError("NON_FINITE_VALUE", "Placed STL positions must fit finite Float32 coordinates.", { operation: "exportStl" });
49
- triangle[corner * 3 + axis] = value;
51
+ if (identity) {
52
+ // Capture already validated these Float32 values. Match the identity dot product's
53
+ // positive zero without repeating its arithmetic for every indexed triangle corner.
54
+ triangle[corner * 3] = x === 0 ? 0 : x;
55
+ triangle[corner * 3 + 1] = y === 0 ? 0 : y;
56
+ triangle[corner * 3 + 2] = z === 0 ? 0 : z;
50
57
  }
58
+ else
59
+ for (let axis = 0; axis < 3; axis += 1) {
60
+ const row = axis * 4;
61
+ const value = Math.fround(matrix[row] * x + matrix[row + 1] * y + matrix[row + 2] * z + matrix[row + 3]);
62
+ if (!Number.isFinite(value))
63
+ throw new GeometryError("NON_FINITE_VALUE", "Placed STL positions must fit finite Float32 coordinates.", { operation: "exportStl" });
64
+ triangle[corner * 3 + axis] = value;
65
+ }
51
66
  }
52
67
  const ux = triangle[3] - triangle[0];
53
68
  const uy = triangle[4] - triangle[1];
@@ -1,4 +1,4 @@
1
- import { GeometryError } from "./errors.js";
1
+ import { GeometryError } from "../errors.js";
2
2
  function fail(operation, message) {
3
3
  throw new GeometryError("INVALID_ARGUMENT", message, { operation });
4
4
  }
@@ -81,6 +81,8 @@ export function fitBounds(source, target, options = {}) {
81
81
  *
82
82
  * Each minimum Y/Z becomes zero, and the first minimum X becomes zero. Supply bounds after
83
83
  * any intended part rotation; translations apply to those bounds. An empty input returns [].
84
+ *
85
+ * @param bounds - XYZ bounds in row order, after any part rotation.
84
86
  */
85
87
  export function layoutRow(bounds, options = {}) {
86
88
  const operation = "layoutRow";
@@ -1,7 +1,7 @@
1
- import { boundsCenter, boundsSize, containsBounds, validateBounds } from "./bounds.js";
2
- import { GeometryError, isGeometryError } from "./errors.js";
3
- import { immutableMathClass } from "./math/immutable-value.js";
4
- import { vector2, vector2Data, vector3, vector3Data, } from "./math/vector-value.js";
1
+ import { GeometryError, isGeometryError } from "../errors.js";
2
+ import { immutableMathClass } from "../math/immutable-value.js";
3
+ import { vector2, vector2Data, vector3, vector3Data, } from "../math/vector-value.js";
4
+ import { boundsCenter, boundsSize, containsBounds, validateBounds } from "./operations.js";
5
5
  function fail(dimension, message) {
6
6
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: `bounds${dimension}` });
7
7
  }
@@ -64,19 +64,19 @@ const PlanarBounds = /* @__PURE__ */ immutableMathClass(class PlanarBounds {
64
64
  min;
65
65
  max;
66
66
  constructor(data) {
67
- this.#data = data;
68
- this.min = data.min;
69
- this.max = data.max;
67
+ this.min = vector2(data.min);
68
+ this.max = vector2(data.max);
69
+ this.#data = Object.freeze({ min: this.min.toData(), max: this.max.toData() });
70
70
  Object.freeze(this);
71
71
  }
72
72
  size() {
73
- return vector2(boundsSize(this));
73
+ return vector2(boundsSize(this.#data));
74
74
  }
75
75
  center() {
76
- return vector2(boundsCenter(this));
76
+ return vector2(boundsCenter(this.#data));
77
77
  }
78
78
  containsBounds(other) {
79
- return containsBounds(this, other);
79
+ return containsBounds(this.#data, snapshot(other, 2));
80
80
  }
81
81
  toData() {
82
82
  return this.#data;
@@ -87,19 +87,19 @@ const SpatialBounds = /* @__PURE__ */ immutableMathClass(class SpatialBounds {
87
87
  min;
88
88
  max;
89
89
  constructor(data) {
90
- this.#data = data;
91
- this.min = data.min;
92
- this.max = data.max;
90
+ this.min = vector3(data.min);
91
+ this.max = vector3(data.max);
92
+ this.#data = Object.freeze({ min: this.min.toData(), max: this.max.toData() });
93
93
  Object.freeze(this);
94
94
  }
95
95
  size() {
96
- return vector3(boundsSize(this));
96
+ return vector3(boundsSize(this.#data));
97
97
  }
98
98
  center() {
99
- return vector3(boundsCenter(this));
99
+ return vector3(boundsCenter(this.#data));
100
100
  }
101
101
  containsBounds(other) {
102
- return containsBounds(this, other);
102
+ return containsBounds(this.#data, snapshot(other, 3));
103
103
  }
104
104
  toData() {
105
105
  return this.#data;
@@ -113,6 +113,8 @@ const SpatialBounds = /* @__PURE__ */ immutableMathClass(class SpatialBounds {
113
113
  * Size construction centers on the origin unless `center` is false. Size and extrema are exclusive.
114
114
  * Compiled Generator packages passing these values to host recipes or memo data require
115
115
  * the current Modeling runtime.
116
+ *
117
+ * @param input - Ordered extrema, nonnegative size, or an existing XY bounds value to snapshot.
116
118
  */
117
119
  export function bounds2(input) {
118
120
  return new PlanarBounds(snapshot(input, 2));
@@ -125,6 +127,8 @@ export function bounds2(input) {
125
127
  * Size construction centers on the origin unless `center` is false. Size and extrema are exclusive.
126
128
  * Compiled Generator packages passing these values to host recipes or memo data require
127
129
  * the current Modeling runtime.
130
+ *
131
+ * @param input - Ordered extrema, nonnegative size, or an existing XYZ bounds value to snapshot.
128
132
  */
129
133
  export function bounds3(input) {
130
134
  return new SpatialBounds(snapshot(input, 3));
@@ -1,6 +1,6 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  // This parameter-space probe only resolves stationary tangent direction; it does not control
3
- // geometric sampling tolerance or move output points. Retain its established one-sided behavior.
3
+ // geometric sampling tolerance or move output points.
4
4
  const STATIONARY_TANGENT_PROBE = 0.000001;
5
5
  /** @internal Shared structured failures for evaluation and sampling. */
6
6
  export function curveFailure(code, message) {
@@ -34,7 +34,7 @@ export function curveDistance(a, b) {
34
34
  curveFailure("NON_FINITE_VALUE", "Curve extent exceeds finite arithmetic.");
35
35
  return result;
36
36
  }
37
- /** @internal Weighted interpolation preserves finite large coordinates and the existing operation order. */
37
+ /** @internal Weighted interpolation avoids overflow between finite large coordinates. */
38
38
  export function interpolateCurvePoint(a, b, t, result) {
39
39
  result[0] = a[0] * (1 - t) + b[0] * t;
40
40
  result[1] = a[1] * (1 - t) + b[1] * t;
@@ -59,7 +59,7 @@ export function curveDirection(a, b, result) {
59
59
  result[2] = b[2] - a[2];
60
60
  normalizeCurveDirection(result, result);
61
61
  }
62
- /** @internal Bounding distance to the finite chord, using the existing arithmetic order. */
62
+ /** @internal Bounds deviation from the finite chord rather than its infinite supporting line. */
63
63
  export function distanceToCurveChord(point, start, end) {
64
64
  const extent = curveDistance(start, end);
65
65
  if (extent === 0)
@@ -120,8 +120,7 @@ export class CubicEvaluator {
120
120
  interpolateCurvePoint(this.#d, this.#e, t, result);
121
121
  }
122
122
  tangent(t, point, result) {
123
- // Profile correspondence needs points only. Tangent-bearing curves calculate these once,
124
- // retaining the established derivative arithmetic without allocating unused controls.
123
+ // Profile correspondence needs points only; calculate derivative controls only for tangents.
125
124
  const control = this.#control;
126
125
  const derivative = (this.#derivative ??= [
127
126
  [control[1][0] - control[0][0], control[1][1] - control[0][1], control[1][2] - control[0][2]],
@@ -136,7 +135,7 @@ export class CubicEvaluator {
136
135
  return;
137
136
  }
138
137
  // At stationary endpoints or cusps, use an outgoing one-sided secant when available.
139
- // A fixed small parameter probe retains the previous fallback without an output-spacing dependency.
138
+ // A fixed parameter probe keeps the fallback independent of output spacing.
140
139
  if (t < 1) {
141
140
  this.point(Math.min(1, t + STATIONARY_TANGENT_PROBE), this.#probe);
142
141
  if (curveDistance(point, this.#probe) > 0) {
@@ -1,5 +1,5 @@
1
- import { resolveArcSegments, resolveGeometryResolution, } from "../resolution.js";
2
- import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling-limits.js";
1
+ import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling/limits.js";
2
+ import { resolveArcSegments, resolveGeometryResolution, } from "../sampling/resolution.js";
3
3
  import { CubicEvaluator, curveDirection, curveDistance, curveFailure, distanceToCurveChord, interpolateCurvePoint, liftPointTo3D, normalizeCurveDirection, planarCubicControl, splitCubicControl, validateCurvePoint3, } from "./evaluation.js";
4
4
  /** @internal Final planar results never create a discarded immutable 3D snapshot. */
5
5
  export function createPlanarSampleWriter() {
@@ -125,8 +125,8 @@ function sampleArc(curve, options, maximum, createWriter) {
125
125
  }
126
126
  return writer.finish();
127
127
  }
128
- /** @internal The control hull bounds curve deviation and each sampled edge's physical length. */
129
- export function cubicControlMeetsPolicy(control, policy) {
128
+ // The control hull bounds curve deviation and each sampled edge's physical length.
129
+ function cubicControlMeetsPolicy(control, policy) {
130
130
  const length = curveDistance(control[0], control[1]) +
131
131
  curveDistance(control[1], control[2]) +
132
132
  curveDistance(control[2], control[3]);
@@ -134,7 +134,8 @@ export function cubicControlMeetsPolicy(control, policy) {
134
134
  return (flat <= policy.maxChordError &&
135
135
  (policy.maxSegmentLength === undefined || length <= policy.maxSegmentLength));
136
136
  }
137
- /** @internal Profiles use a checked uniform parameter grid instead of an adaptive leaf count.
137
+ /**
138
+ * @internal Profiles use a checked uniform parameter grid instead of an adaptive leaf count.
138
139
  * Every control interval must meet the physical policy, including flatter regions subdivided to
139
140
  * match curved ones. The depth-first traversal retains only one bounded stack, without output points.
140
141
  */
@@ -192,6 +193,20 @@ function resolveCubicParameters(control, options, maximum) {
192
193
  }
193
194
  return parameters;
194
195
  }
196
+ /** @internal Point-only cubic sampling reuses physical subdivision without discarded tangent calculations. */
197
+ export function sampleCubicControlPoints(control, options, append) {
198
+ for (const point of control)
199
+ validateCurvePoint3(point);
200
+ const parameters = resolveCubicParameters(control, options, resolveSamplingBudget(options));
201
+ const evaluator = new CubicEvaluator(control);
202
+ const point = [0, 0, 0];
203
+ // The caller already retains this span's first waypoint.
204
+ for (let index = 1; index < parameters.length; index++) {
205
+ const t = parameters[index];
206
+ evaluator.point(t, point);
207
+ append(point, t === 1);
208
+ }
209
+ }
195
210
  function sampleCubicBezier(curve, options, maximum, createWriter) {
196
211
  const control = [
197
212
  validateCurvePoint3(curve.start),
@@ -226,6 +241,10 @@ function sampleCurve(curve, options, createWriter) {
226
241
  }
227
242
  /**
228
243
  * Samples a spatial curve, preserving endpoints and directed unit tangents.
244
+ *
245
+ * @param curve - XYZ curve in millimetres; arc angles use degrees.
246
+ * @param options - Physical sampling or an exact interval count, within vertex limits.
247
+ *
229
248
  * @remarks Exact counts use uniform curve parameters, not equal physical distances. Adaptive cubics
230
249
  * bound the full control hull. Full-circle arcs repeat their endpoint; closed polylines do not.
231
250
  * @example
@@ -236,7 +255,12 @@ function sampleCurve(curve, options, createWriter) {
236
255
  export function sampleCurve3(curve, options = {}) {
237
256
  return sampleCurve(curve, options, createSpatialSampleWriter);
238
257
  }
239
- /** Samples a planar curve with the same guarantees and policy as spatial sampling.
258
+ /**
259
+ * Samples a planar curve with the same guarantees and policy as spatial sampling.
260
+ *
261
+ * @param curve - XY curve in millimetres; arc angles use degrees.
262
+ * @param options - Physical sampling or an exact interval count, within vertex limits.
263
+ *
240
264
  * @remarks Returned planar points and tangents are copied and frozen. At stationary tangents, outgoing secants are preferred and endpoints use a backward fallback.
241
265
  * @example
242
266
  * ```ts
@@ -1,12 +1,27 @@
1
- import { GeometryError } from "./errors.js";
2
- import { vector2Data } from "./math/vector-value.js";
3
- import { assertPositivePrimitive, assertPrimitiveOptions } from "./primitive-resolvers.js";
4
- import { resolveGeometryResolution } from "./resolution.js";
5
- import { assertSamplingCount, resolveGeometrySamplingLimits } from "./sampling-limits.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { vector2Data } from "../math/vector-value.js";
3
+ import { assertPositivePrimitive, assertPrimitiveOptions } from "../primitives/resolvers.js";
4
+ import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling/limits.js";
5
+ import { resolveGeometryResolution } from "../sampling/resolution.js";
6
6
  const isArray = (value) => Array.isArray(value);
7
+ const extrusionKeys = new Set([
8
+ "height",
9
+ "center",
10
+ "ends",
11
+ "slices",
12
+ "limits",
13
+ "resolution",
14
+ "scale",
15
+ "twist",
16
+ ]);
7
17
  /** @internal Validates shared extrusion controls and expands top scale before kernel allocation. */
8
18
  export function resolveExtrusionControls(height, options, operation) {
9
19
  assertPrimitiveOptions(options, operation);
20
+ for (const key of Object.keys(options))
21
+ if (!extrusionKeys.has(key))
22
+ throw new GeometryError("INVALID_ARGUMENT", `Unsupported extrusion option: ${key}.`, {
23
+ operation,
24
+ });
10
25
  assertPositivePrimitive(height, "height", operation);
11
26
  if (options.center !== undefined && typeof options.center !== "boolean") {
12
27
  throw new GeometryError("INVALID_ARGUMENT", "center must be boolean when supplied.", {
@@ -17,40 +32,46 @@ export function resolveExtrusionControls(height, options, operation) {
17
32
  if (!Number.isFinite(twist)) {
18
33
  throw new GeometryError("NON_FINITE_VALUE", "twist must be finite.", { operation });
19
34
  }
20
- const scaleTop = options.scaleTop ?? 1;
21
- const values = typeof scaleTop === "number" ? [scaleTop, scaleTop] : vector2Data(scaleTop);
35
+ const scale = options.scale ?? 1;
36
+ const values = typeof scale === "number" ? [scale, scale] : vector2Data(scale);
22
37
  const scales = [values[0], values[1]];
23
38
  if (!Number.isFinite(scales[0]) || !Number.isFinite(scales[1])) {
24
- throw new GeometryError("NON_FINITE_VALUE", "scaleTop values must be finite.", { operation });
39
+ throw new GeometryError("NON_FINITE_VALUE", "scale values must be finite.", { operation });
25
40
  }
26
- if (options.divisions !== undefined &&
27
- (!Number.isSafeInteger(options.divisions) || options.divisions < 0)) {
28
- throw new GeometryError("INVALID_ARGUMENT", "divisions must be a nonnegative safe integer.", {
41
+ if (scales.some((value) => value < 0) || (scales[0] === 0) !== (scales[1] === 0))
42
+ throw new GeometryError("INVALID_ARGUMENT", "scale must be positive on both axes or zero on both axes for an apex.", { operation });
43
+ if (options.slices !== undefined &&
44
+ (!Number.isSafeInteger(options.slices) || options.slices < 1)) {
45
+ throw new GeometryError("INVALID_ARGUMENT", "slices must be a positive safe integer.", {
29
46
  operation,
30
47
  });
31
48
  }
32
- if (options.divisions !== undefined)
33
- assertSamplingCount(options.divisions + 2, operation, resolveGeometrySamplingLimits(options.limits).maxPathPoints);
49
+ if (options.slices !== undefined)
50
+ assertSamplingCount(options.slices + 1, operation, resolveGeometrySamplingLimits(options.limits).maxPathPoints);
34
51
  return { scales, twist, center: options.center ?? false };
35
52
  }
36
53
  /**
37
- * Resolves intermediate profile copies for linear extrusion from physical curve resolution.
54
+ * Resolves longitudinal intervals for ordinary linear extrusion from physical curve resolution.
38
55
  *
39
56
  * Accepts one XY loop or a filled XY region, including every hole and disconnected component.
40
- * Exact `divisions`, including zero, override physical sampling. Otherwise chord error bounds
57
+ * End treatments are unsupported; native finishing inserts its own treatment stations.
58
+ * Explicit positive `slices` override physical sampling. Otherwise chord error bounds
41
59
  * the triangulated side surface, including rotation across each profile edge. Optional segment
42
- * length bounds station travel including Z. Straight extrusions need no intermediate copies by default.
60
+ * length bounds station travel including Z. Straight extrusions use one interval by default.
43
61
  * Exceeding the selected maxPathPoints ceiling raises `COMPLEXITY_LIMIT` instead of reducing fidelity.
44
62
  *
45
63
  * @param profile - Ordered XY millimetre contours with implicit closing edges.
46
64
  * @param height - Positive extrusion height in millimetres.
47
- * @param options - Twist, scale, exact divisions, and physical resolution controls.
48
- * @returns Number of intermediate copies, excluding the two end profiles.
65
+ * @param options - Twist, scale, exact slices, and physical resolution controls.
66
+ * @returns Positive interval count, creating one more profile layer than intervals.
49
67
  */
50
- export function resolveExtrusionDivisions(profile, height, options = {}) {
68
+ export function resolveExtrusionSlices(profile, height, options = {}) {
69
+ assertPrimitiveOptions(options, "resolveExtrusionSlices");
70
+ if ("ends" in options)
71
+ throw new GeometryError("INVALID_ARGUMENT", "resolveExtrusionSlices does not support end treatments.", { operation: "resolveExtrusionSlices" });
51
72
  if (!isArray(profile) || profile.length === 0)
52
73
  throw new GeometryError("INVALID_ARGUMENT", "Extrusion sampling needs an XY loop or region.", {
53
- operation: "resolveExtrusionDivisions",
74
+ operation: "resolveExtrusionSlices",
54
75
  });
55
76
  const contours = [];
56
77
  if (Array.isArray(profile[0]))
@@ -64,25 +85,25 @@ export function resolveExtrusionDivisions(profile, height, options = {}) {
64
85
  !isArray(component.outer) ||
65
86
  !isArray(component.holes))
66
87
  throw new GeometryError("INVALID_ARGUMENT", "Extrusion regions need outer and hole contours.", {
67
- operation: "resolveExtrusionDivisions",
88
+ operation: "resolveExtrusionSlices",
68
89
  });
69
- assertSamplingCount(count + 3 * (component.holes.length + 1), "resolveExtrusionDivisions", maximum);
90
+ assertSamplingCount(count + 3 * (component.holes.length + 1), "resolveExtrusionSlices", maximum);
70
91
  for (const contour of [component.outer, ...component.holes]) {
71
92
  if (!isArray(contour) || contour.length < 3)
72
93
  throw new GeometryError("INVALID_ARGUMENT", "Extrusion contours need at least three XY points.", {
73
- operation: "resolveExtrusionDivisions",
94
+ operation: "resolveExtrusionSlices",
74
95
  });
75
96
  count += contour.length;
76
- assertSamplingCount(count, "resolveExtrusionDivisions", maximum);
97
+ assertSamplingCount(count, "resolveExtrusionSlices", maximum);
77
98
  contours.push(contour);
78
99
  }
79
100
  }
80
101
  }
81
- return resolveExtrusionContourDivisions(contours, height, options);
102
+ return resolveExtrusionContourSlices(contours, height, options);
82
103
  }
83
104
  /** @internal Shared sampling preflight over explicit contours, without rebuilding filled topology. */
84
- export function resolveExtrusionContourDivisions(contours, height, options) {
85
- const operation = "resolveExtrusionDivisions";
105
+ export function resolveExtrusionContourSlices(contours, height, options) {
106
+ const operation = "resolveExtrusionSlices";
86
107
  const { scales, twist } = resolveExtrusionControls(height, options, operation);
87
108
  const limits = resolveGeometrySamplingLimits(options.limits);
88
109
  let radius = 0, maximumEdgeLength = 0, profileCount = 0;
@@ -109,8 +130,8 @@ export function resolveExtrusionContourDivisions(contours, height, options) {
109
130
  maximumEdgeLength = Math.max(maximumEdgeLength, Math.hypot(next[0] - point[0], next[1] - point[1]));
110
131
  }
111
132
  }
112
- if (options.divisions !== undefined)
113
- return options.divisions;
133
+ if (options.slices !== undefined)
134
+ return options.slices;
114
135
  const policy = resolveGeometryResolution(options.resolution, options.limits);
115
136
  const angle = (Math.abs(twist) * Math.PI) / 180;
116
137
  const maximumScale = Math.max(1, Math.abs(scales[0]), Math.abs(scales[1]));
@@ -122,11 +143,13 @@ export function resolveExtrusionContourDivisions(contours, height, options) {
122
143
  // Uniform untwisted taper is planar. Anisotropic taper can introduce a
123
144
  // mixed edge/station derivative even when the vertex trajectories are straight.
124
145
  b = (maximumEdgeLength * (maximumScale * angle + Math.abs(scales[0] - scales[1]))) / 4;
125
- const chordSegments = policy.circularSegments === undefined
126
- ? Math.max(1, Math.ceil((b + Math.hypot(b, 2 * Math.sqrt(a * policy.maxChordError))) /
127
- (2 * policy.maxChordError)), Math.ceil((policy.minSegments * Math.abs(twist)) / 360))
128
- : Math.max(1, Math.ceil((policy.circularSegments * Math.abs(twist)) / 360));
129
- const angularCap = Math.max(1, scales[0] === scales[1] ? 0 : policy.maxSegments, Math.ceil((policy.maxSegments * Math.abs(twist)) / 360));
146
+ const physicalSlices = Math.max(1, Math.ceil((b + Math.hypot(b, 2 * Math.sqrt(a * policy.maxChordError))) / (2 * policy.maxChordError)));
147
+ const angularSlices = Math.max(1, Math.ceil(((policy.circularSegments ?? policy.minSegments) * Math.abs(twist)) / 360));
148
+ // An exact angular schedule does not waive the surface error caused by changing scale.
149
+ const chordSegments = policy.circularSegments === undefined || scaleChange > 0
150
+ ? Math.max(physicalSlices, angularSlices)
151
+ : angularSlices;
152
+ const angularCap = Math.max(1, scaleChange === 0 ? 0 : policy.maxSegments, Math.ceil((policy.maxSegments * Math.abs(twist)) / 360));
130
153
  if (chordSegments > angularCap) {
131
154
  throw new GeometryError("COMPLEXITY_LIMIT", "Extrusion surface refinement exceeds the full-circle interval safety limit.", {
132
155
  operation,
@@ -143,5 +166,5 @@ export function resolveExtrusionContourDivisions(contours, height, options) {
143
166
  const lengthSegments = policy.maxSegmentLength === undefined ? 1 : Math.ceil(travel / policy.maxSegmentLength);
144
167
  const segments = Math.max(1, chordSegments, lengthSegments);
145
168
  assertSamplingCount(segments + 1, operation, resolveGeometrySamplingLimits(options.limits).maxPathPoints);
146
- return segments - 1;
169
+ return segments;
147
170
  }