@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,11 +1,13 @@
1
- import { bounds2, bounds3 } from "../bounds-value.js";
1
+ import { bounds2, bounds3 } from "../bounds/value.js";
2
2
  import { GeometryError } from "../errors.js";
3
3
  import { immutableMathClass } from "../math/immutable-value.js";
4
4
  import { vector2, vector2Data, vector3, vector3Data, } from "../math/vector-value.js";
5
- import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
6
- import { transformPath2, transformPath3 } from "../transform-geometry.js";
5
+ import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
6
+ import { transformPath2, transformPath3 } from "../transforms/apply.js";
7
7
  import { closestPointOnValidatedPath } from "./closest-point.js";
8
+ import { splitPathPoints, subdividePathPoints, trimPathPoints } from "./editing.js";
8
9
  import { resamplePath2Points, resamplePath3Points } from "./resampling.js";
10
+ import { createPathTraversal, locatePathDistance, measurePathLength, writePathPoint, writePathTangent, } from "./traversal.js";
9
11
  const fail = (message, code = "INVALID_ARGUMENT") => {
10
12
  throw new GeometryError(code, message, { operation: "path" });
11
13
  };
@@ -90,17 +92,45 @@ function measuredLength(owner) {
90
92
  const cached = state.length;
91
93
  if (cached !== undefined)
92
94
  return cached;
93
- const points = state.points;
94
- let total = 0;
95
- const count = owner.closed ? points.length : Math.max(0, points.length - 1);
96
- for (let index = 0; index < count; index++) {
97
- const a = points[index], b = points[(index + 1) % points.length];
98
- total += Math.hypot(b[0] - a[0], b[1] - a[1], (b[2] ?? 0) - (a[2] ?? 0));
99
- if (!Number.isFinite(total))
100
- fail("Path length exceeds finite arithmetic.", "NON_FINITE_VALUE");
101
- }
102
- state.length = total;
103
- return total;
95
+ return (state.length = measurePathLength(state.points, owner.closed));
96
+ }
97
+ function traversalOf(owner) {
98
+ const state = stateOf(owner);
99
+ const traversal = (state.traversal ??= createPathTraversal(state.points, owner.closed));
100
+ state.length = traversal.length;
101
+ return traversal;
102
+ }
103
+ function editingTraversal(owner, limits = {}) {
104
+ const maximum = resolveGeometrySamplingLimits(limits).maxPathPoints;
105
+ assertSamplingCount(stateOf(owner).points.length, "path", maximum);
106
+ return { traversal: traversalOf(owner), maximum };
107
+ }
108
+ function fractionDistance(owner, fraction) {
109
+ if (!Number.isFinite(fraction))
110
+ fail("Path fraction must be finite.", "NON_FINITE_VALUE");
111
+ if (fraction < 0 || fraction > 1)
112
+ fail("Path fraction must lie between zero and one.");
113
+ return measuredLength(owner) * fraction;
114
+ }
115
+ function station(owner, distance) {
116
+ const traversal = traversalOf(owner);
117
+ const location = locatePathDistance(traversal, distance);
118
+ const point = [], tangent = [];
119
+ writePathPoint(traversal, location, point);
120
+ writePathTangent(traversal, location, tangent);
121
+ return owner.dimension === 2
122
+ ? Object.freeze({
123
+ ...location,
124
+ offset: distance,
125
+ point: vector2([point[0], point[1]]),
126
+ tangent: vector2([tangent[0], tangent[1]]),
127
+ })
128
+ : Object.freeze({
129
+ ...location,
130
+ offset: distance,
131
+ point: vector3([point[0], point[1], point[2]]),
132
+ tangent: vector3([tangent[0], tangent[1], tangent[2]]),
133
+ });
104
134
  }
105
135
  function measuredBounds(points) {
106
136
  if (points.length === 0)
@@ -129,6 +159,7 @@ const PlanarPath = /* @__PURE__ */ immutableMathClass(class PlanarPath {
129
159
  dimension = 2;
130
160
  constructor(points, closed) {
131
161
  this.closed = closed;
162
+ validateClosure(points, closed);
132
163
  pathStates.set(this, { points });
133
164
  Object.freeze(this);
134
165
  }
@@ -139,12 +170,32 @@ const PlanarPath = /* @__PURE__ */ immutableMathClass(class PlanarPath {
139
170
  return measuredLength(this);
140
171
  }
141
172
  bounds() {
142
- return measuredBounds(points2(this));
173
+ return (stateOf(this).bounds ??= measuredBounds(points2(this)));
143
174
  }
144
175
  closestPoint(point) {
145
176
  const location = closestPointOnValidatedPath(points2(this), vector2Data(point), this.closed);
146
177
  return Object.freeze({ ...location, point: vector2(location.point) });
147
178
  }
179
+ atDistance(distance) {
180
+ return station(this, distance);
181
+ }
182
+ atFraction(fraction) {
183
+ return station(this, fractionDistance(this, fraction));
184
+ }
185
+ splitAt(distance, limits) {
186
+ const { traversal, maximum } = editingTraversal(this, limits);
187
+ const [first, second] = splitPathPoints(traversal, distance, maximum);
188
+ return Object.freeze([new PlanarPath(first, false), new PlanarPath(second, false)]);
189
+ }
190
+ trim(start, end, limits) {
191
+ const { traversal, maximum } = editingTraversal(this, limits);
192
+ return new PlanarPath(trimPathPoints(traversal, start, end, maximum), false);
193
+ }
194
+ subdivide(options) {
195
+ validateOptions(options);
196
+ const { traversal, maximum } = editingTraversal(this, options.limits);
197
+ return new PlanarPath(subdividePathPoints(traversal, options.maxSegmentLength, maximum), this.closed);
198
+ }
148
199
  transform(placement) {
149
200
  return new PlanarPath(transformPath2(points2(this), placement), this.closed);
150
201
  }
@@ -161,6 +212,7 @@ const SpatialPath = /* @__PURE__ */ immutableMathClass(class SpatialPath {
161
212
  dimension = 3;
162
213
  constructor(points, closed) {
163
214
  this.closed = closed;
215
+ validateClosure(points, closed);
164
216
  pathStates.set(this, { points });
165
217
  Object.freeze(this);
166
218
  }
@@ -171,12 +223,35 @@ const SpatialPath = /* @__PURE__ */ immutableMathClass(class SpatialPath {
171
223
  return measuredLength(this);
172
224
  }
173
225
  bounds() {
174
- return measuredBounds(points3(this));
226
+ return (stateOf(this).bounds ??= measuredBounds(points3(this)));
175
227
  }
176
228
  closestPoint(point) {
177
229
  const location = closestPointOnValidatedPath(points3(this), vector3Data(point), this.closed);
178
230
  return Object.freeze({ ...location, point: vector3(location.point) });
179
231
  }
232
+ atDistance(distance) {
233
+ return station(this, distance);
234
+ }
235
+ atFraction(fraction) {
236
+ return station(this, fractionDistance(this, fraction));
237
+ }
238
+ splitAt(distance, limits) {
239
+ const { traversal, maximum } = editingTraversal(this, limits);
240
+ const [first, second] = splitPathPoints(traversal, distance, maximum);
241
+ return Object.freeze([
242
+ new SpatialPath(first, false),
243
+ new SpatialPath(second, false),
244
+ ]);
245
+ }
246
+ trim(start, end, limits) {
247
+ const { traversal, maximum } = editingTraversal(this, limits);
248
+ return new SpatialPath(trimPathPoints(traversal, start, end, maximum), false);
249
+ }
250
+ subdivide(options) {
251
+ validateOptions(options);
252
+ const { traversal, maximum } = editingTraversal(this, options.limits);
253
+ return new SpatialPath(subdividePathPoints(traversal, options.maxSegmentLength, maximum), this.closed);
254
+ }
180
255
  transform(placement) {
181
256
  return new SpatialPath(transformPath3(points3(this), placement), this.closed);
182
257
  }
@@ -198,13 +273,15 @@ const SpatialPath = /* @__PURE__ */ immutableMathClass(class SpatialPath {
198
273
  * A path input retains its closure. Limits bound construction only; resampling takes its own limits.
199
274
  *
200
275
  * Use `toData()` for a frozen record that restores coordinates, closure, and dimension together.
276
+ *
277
+ * @param input - XY path or finite millimetre coordinates to copy.
278
+ * @param options - Closure for raw points and construction limits.
201
279
  */
202
280
  export function path2(input, options = {}) {
203
281
  validateOptions(options);
204
282
  const limits = resolveGeometrySamplingLimits(options.limits);
205
283
  const source = pathSource(input, options.closed, 2);
206
284
  const points = snapshot(source.points, 2, limits);
207
- validateClosure(points, source.closed);
208
285
  return new PlanarPath(points, source.closed);
209
286
  }
210
287
  /**
@@ -213,6 +290,9 @@ export function path2(input, options = {}) {
213
290
  *
214
291
  * Use `toData()` for a frozen record that restores coordinates, closure, and dimension together.
215
292
  *
293
+ * @param input - XYZ path or finite millimetre coordinates to copy.
294
+ * @param options - Closure for raw points and construction limits.
295
+ *
216
296
  * @see {@link path2} for shared construction rules.
217
297
  */
218
298
  export function path3(input, options = {}) {
@@ -220,7 +300,6 @@ export function path3(input, options = {}) {
220
300
  const limits = resolveGeometrySamplingLimits(options.limits);
221
301
  const source = pathSource(input, options.closed, 3);
222
302
  const points = snapshot(source.points, 3, limits);
223
- validateClosure(points, source.closed);
224
303
  return new SpatialPath(points, source.closed);
225
304
  }
226
305
  function validateOptions(options) {
@@ -1,14 +1,14 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { vector3Data } from "../math/vector-value.js";
3
3
  import { cross3, dot3, scale3 } from "../math/vector3.js";
4
- import { path2InputData, path3InputData, } from "../paths/path-value.js";
5
- import { distributeAlongPath } from "../paths/planar.js";
6
- import { restrictTransform3 } from "../transform2.js";
7
- import { composeTransform3, frameTransform3, IDENTITY_TRANSFORM3, rotationTransform3, translationTransform3, } from "../transform3.js";
4
+ import { distributeAlongPath } from "../paths/distribution.js";
5
+ import { path2InputData, path3InputData, } from "../paths/value.js";
6
+ import { frameTransform3, IDENTITY_TRANSFORM3, multiplyTransform3, rotationTransform3, translationTransform3, } from "../transforms/affine3.js";
7
+ import { restrictTransform3 } from "../transforms/dimensions.js";
8
8
  const fail = (operation, message) => {
9
9
  throw new GeometryError("INVALID_ARGUMENT", message, { operation });
10
10
  };
11
- export function patternCount(count, operation) {
11
+ function patternCount(count, operation) {
12
12
  if (!Number.isSafeInteger(count) || count < 1)
13
13
  fail(operation, "Pattern count must be a positive safe integer.");
14
14
  if (count > 100_000)
@@ -139,29 +139,30 @@ export function radialPatternPlan(options) {
139
139
  requireDimension(pivot.length, dimension, operation);
140
140
  return index === 0
141
141
  ? IDENTITY_TRANSFORM3
142
- : composeTransform3(after, composeTransform3(rotationTransform3(axis, { radians: angleRadians * index }), before));
142
+ : multiplyTransform3(after, multiplyTransform3(rotationTransform3(axis, { radians: angleRadians * index }), before));
143
143
  },
144
144
  };
145
145
  }
146
146
  export function gridPatternPlan(options) {
147
147
  const operation = "gridPattern";
148
148
  optionsObject(options, operation);
149
- const dimensions = options.count?.length;
150
- if (!Array.isArray(options.count) ||
151
- !Array.isArray(options.spacing) ||
152
- (dimensions !== 2 && dimensions !== 3) ||
153
- options.spacing?.length !== dimensions)
154
- fail(operation, "Grid count and spacing require matching XY or XYZ tuples.");
149
+ const suppliedCounts = options.count;
150
+ const dimensions = suppliedCounts?.length;
151
+ if (!Array.isArray(suppliedCounts) || (dimensions !== 2 && dimensions !== 3))
152
+ fail(operation, "Grid count requires an XY or XYZ integer tuple.");
153
+ const suppliedSpacing = coordinates(options.spacing, operation);
154
+ if (suppliedSpacing.length !== dimensions)
155
+ fail(operation, "Grid spacing must match the count dimension.");
155
156
  if (options.center !== undefined && typeof options.center !== "boolean")
156
157
  fail(operation, "Grid center must be a boolean.");
157
158
  const centered = options.center === true;
158
- const counts = [options.count[0], options.count[1], dimensions === 3 ? options.count[2] : 1];
159
+ const counts = [suppliedCounts[0], suppliedCounts[1], dimensions === 3 ? suppliedCounts[2] : 1];
159
160
  counts.forEach((count) => patternCount(count, operation));
160
161
  const count = patternCount(counts[0] * counts[1] * counts[2], operation);
161
162
  const spacing = [
162
- options.spacing[0],
163
- options.spacing[1],
164
- dimensions === 3 ? options.spacing[2] : 0,
163
+ suppliedSpacing[0],
164
+ suppliedSpacing[1],
165
+ dimensions === 3 ? suppliedSpacing[2] : 0,
165
166
  ];
166
167
  const extent = spacing.map((distance, axis) => {
167
168
  finite(distance, operation);
@@ -169,16 +170,6 @@ export function gridPatternPlan(options) {
169
170
  fail(operation, "Repeated grid axes require nonzero spacing.");
170
171
  return finite(distance * (counts[axis] - 1), operation);
171
172
  });
172
- if (options.frame !== undefined) {
173
- optionsObject(options.frame, operation);
174
- for (const coordinates of [
175
- options.frame.origin,
176
- options.frame.xAxis,
177
- options.frame.yAxis,
178
- options.frame.zAxis,
179
- ])
180
- vector(coordinates, operation);
181
- }
182
173
  const frame = options.frame === undefined ? IDENTITY_TRANSFORM3 : frameTransform3(options.frame);
183
174
  return {
184
175
  count,
@@ -193,7 +184,7 @@ export function gridPatternPlan(options) {
193
184
  Math.floor(index / (counts[0] * counts[1])),
194
185
  ];
195
186
  const offset = coordinates.map((value, axis) => value * spacing[axis] - (centered ? extent[axis] / 2 : 0));
196
- return composeTransform3(frame, translationTransform3(offset));
187
+ return multiplyTransform3(frame, translationTransform3(offset));
197
188
  },
198
189
  };
199
190
  }
@@ -246,7 +237,7 @@ export function pathPatternPlan(input, options, limits) {
246
237
  return translation;
247
238
  const tangent = placement.tangent;
248
239
  if (dimension === 2)
249
- return composeTransform3(translation, rotationTransform3([0, 0, 1], {
240
+ return multiplyTransform3(translation, rotationTransform3([0, 0, 1], {
250
241
  radians: Math.atan2(tangent[1], tangent[0]),
251
242
  }));
252
243
  const cosine = Math.max(-1, Math.min(1, dot3([0, 0, 1], tangent)));
@@ -257,7 +248,7 @@ export function pathPatternPlan(input, options, limits) {
257
248
  : cosine < 0
258
249
  ? rotationTransform3([1, 0, 0], { radians: Math.PI })
259
250
  : IDENTITY_TRANSFORM3;
260
- return composeTransform3(translation, rotation);
251
+ return multiplyTransform3(translation, rotation);
261
252
  },
262
253
  };
263
254
  }
@@ -1,9 +1,10 @@
1
- import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "./patterns/placements.js";
2
- import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
1
+ import { resolveGeometrySamplingLimits } from "../sampling/limits.js";
2
+ import { transform3 } from "../transforms/value.js";
3
+ import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "./placements.js";
3
4
  function transforms(plan) {
4
- return Object.freeze(Array.from({ length: plan.count }, (_, index) => Object.freeze(plan.transformAt(index))));
5
+ return Object.freeze(Array.from({ length: plan.count }, (_, index) => transform3(plan.transformAt(index))));
5
6
  }
6
- /** Spatial XYZ matrix placements in millimetres, including the original at the origin. */
7
+ /** Immutable XYZ placements in millimetres, including the original at the origin. */
7
8
  export function linearPatternTransforms(options) {
8
9
  return transforms(linearPatternPlan(options));
9
10
  }
@@ -11,16 +12,19 @@ export function linearPatternTransforms(options) {
11
12
  export function radialPatternTransforms(options) {
12
13
  return transforms(radialPatternPlan(options));
13
14
  }
14
- /** Spatial XYZ matrices for an XY or XYZ grid, in X-fastest order. */
15
+ /** Immutable XYZ placements for an XY or XYZ grid, in X-fastest order. */
15
16
  export function gridPatternTransforms(options) {
16
17
  return transforms(gridPatternPlan(options));
17
18
  }
18
19
  /**
19
20
  * Equal physical arc-length placements along a sampled XYZ path.
20
21
  *
21
- * Tangent orientation maps +Z
22
- * onto the local path tangent; fixed orientation only translates. Closed paths omit a repeated seam.
22
+ * Tangent orientation maps +Z onto the local path tangent; fixed orientation only translates.
23
+ * Closed paths omit a repeated seam.
23
24
  * Explicit sampling ceilings bound both input points and output placements.
25
+ *
26
+ * @param path - XYZ path or points in millimetres; path values supply closure.
27
+ * @param limits - Limits on input points and output placements.
24
28
  */
25
29
  export function pathPatternTransforms(path, options, limits) {
26
30
  return transforms(pathPatternPlan(path, options, resolveGeometrySamplingLimits(limits)));
@@ -0,0 +1,70 @@
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertSamplingCount } from "../sampling/limits.js";
3
+ import { edgeTreatmentPointCount, sampleEdgeTreatment } from "./edges.js";
4
+ /** @internal Validates numerical face extension without treating it as a fit allowance. */
5
+ export function cutterExcess(value, operation) {
6
+ if (!Number.isFinite(value) || value < 0)
7
+ throw new GeometryError("INVALID_ARGUMENT", "excess must be finite and nonnegative.", {
8
+ operation,
9
+ });
10
+ return value;
11
+ }
12
+ /** @internal Samples only the material-removal side of a convex edge; exterior overlap preserves the treatment. */
13
+ export function edgeCutterContour(treatment, angle, excess, resolution, limits) {
14
+ const operation = "edgeCutter";
15
+ if (!Number.isFinite(angle) || angle <= 0 || angle >= 180)
16
+ throw new GeometryError("INVALID_ARGUMENT", "angle must be strictly between 0 and 180 degrees.", {
17
+ operation,
18
+ });
19
+ cutterExcess(excess, operation);
20
+ const radians = (angle * Math.PI) / 180;
21
+ const sampling = { angle: radians, resolution, limits };
22
+ const count = edgeTreatmentPointCount(treatment, operation, sampling);
23
+ if (count === 1)
24
+ return [];
25
+ assertSamplingCount(count + (excess === 0 ? 1 : 3), operation, limits.maxProfilePoints);
26
+ const points = sampleEdgeTreatment(treatment, operation, sampling);
27
+ // A monotone profile passing through the sharp corner leaves both faces unchanged.
28
+ if (points.some(([first, second]) => first === 0 && second === 0))
29
+ return [];
30
+ const cosine = Math.cos(radians), sine = Math.sin(radians);
31
+ const contour = points.map(([first, second]) => [
32
+ first + second * cosine,
33
+ second * sine,
34
+ ]);
35
+ if (excess === 0)
36
+ contour.unshift([0, 0]);
37
+ else {
38
+ const first = contour[0], last = contour.at(-1);
39
+ contour.unshift([-excess * ((1 + cosine) / sine), -excess], [first[0], -excess]);
40
+ contour.push([last[0] - excess * sine, last[1] + excess * cosine]);
41
+ }
42
+ if (contour.some((point) => point.some((coordinate) => !Number.isFinite(coordinate))))
43
+ throw new GeometryError("INVALID_ARGUMENT", "Cutter coordinates must remain finite.", {
44
+ operation,
45
+ });
46
+ return contour;
47
+ }
48
+ /** @internal Convex corner-removal polytope, capped at each matching edge's setback. */
49
+ export function chamferCornerCutterPoints(distance, excess) {
50
+ const operation = "cornerCutter";
51
+ if (!Number.isFinite(distance) || distance < 0)
52
+ throw new GeometryError("INVALID_ARGUMENT", "Chamfer distance must be finite and nonnegative.", {
53
+ operation,
54
+ });
55
+ cutterExcess(excess, operation);
56
+ if (distance === 0)
57
+ return [];
58
+ return [
59
+ [-excess, -excess, -excess],
60
+ [distance, -excess, -excess],
61
+ [distance, distance, -excess],
62
+ [-excess, distance, -excess],
63
+ [-excess, -excess, distance],
64
+ [distance, -excess, distance],
65
+ [-excess, distance, distance],
66
+ [distance, distance, 0],
67
+ [distance, 0, distance],
68
+ [0, distance, distance],
69
+ ];
70
+ }
@@ -1,7 +1,7 @@
1
- import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment, } from "./edge-finishing.js";
2
- import { GeometryError } from "./errors.js";
3
- import { resolveCircularPrimitiveSegments } from "./primitive-resolution.js";
4
- import { assertSamplingCount, resolveGeometrySamplingLimits } from "./sampling-limits.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling/limits.js";
3
+ import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment } from "./edges.js";
4
+ import { resolveCircularPrimitiveSegments } from "./sampling.js";
5
5
  const invalid = (message) => {
6
6
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: "cylinder" });
7
7
  };
@@ -1,8 +1,8 @@
1
- import { GeometryError } from "./errors.js";
2
- import { resolveModelingLimits } from "./model-limits.js";
3
- import { resolveCircularPrimitiveSegments } from "./primitive-resolution.js";
4
- import { resolveGeometryResolution } from "./resolution.js";
5
- import { assertSamplingCount, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { resolveModelingLimits } from "../limits.js";
3
+ import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
4
+ import { resolveGeometryResolution } from "../sampling/resolution.js";
5
+ import { resolveCircularPrimitiveSegments } from "./sampling.js";
6
6
  const fail = (operation, message) => {
7
7
  throw new GeometryError("INVALID_ARGUMENT", message, { operation });
8
8
  };
@@ -1,10 +1,10 @@
1
- import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment, } from "./edge-finishing.js";
2
- import { GeometryError } from "./errors.js";
3
- import { vector3Data } from "./math/vector-value.js";
4
- import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "./model-limits.js";
5
- import { resolveCircularPrimitiveSegments } from "./primitive-resolution.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "../limits.js";
3
+ import { vector3Data } from "../math/vector-value.js";
4
+ import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment } from "./edges.js";
5
+ import { resolveCircularPrimitiveSegments, resolveSphericalPrimitiveSegments } from "./sampling.js";
6
6
  /** @internal Face pairs define the twelve nominal box edges in deterministic order. */
7
- export const boxEdges = [
7
+ const boxEdges = [
8
8
  "top-front",
9
9
  "top-back",
10
10
  "top-left",
@@ -68,7 +68,7 @@ export function assertPositivePrimitive(value, name, operation) {
68
68
  }
69
69
  }
70
70
  /** @internal Resolves one positive scalar radial dimension before sampling or allocation. */
71
- export function resolvePrimitiveRadius(options, operation) {
71
+ function resolvePrimitiveRadius(options, operation) {
72
72
  assertPrimitiveOptions(options, operation);
73
73
  if ((options.radius === undefined) === (options.diameter === undefined)) {
74
74
  throw new GeometryError("INVALID_ARGUMENT", "Specify exactly one radius or diameter.", {
@@ -186,7 +186,7 @@ export function resolveBoxPrimitive(options) {
186
186
  kind: "round",
187
187
  inner,
188
188
  radius: distance,
189
- segments: resolveCircularPrimitiveSegments(distance, treatment, operation),
189
+ segments: resolveSphericalPrimitiveSegments(distance, treatment, operation),
190
190
  },
191
191
  };
192
192
  }
@@ -236,7 +236,7 @@ export function resolveTubePrimitive(options) {
236
236
  /** @internal Resolves sphere sampling shared by compiled and authored adapters. */
237
237
  export function resolveSpherePrimitive(options) {
238
238
  const radius = resolvePrimitiveRadius(options, "sphere");
239
- return { radius, segments: resolveCircularPrimitiveSegments(radius, options, "sphere") };
239
+ return { radius, segments: resolveSphericalPrimitiveSegments(radius, options, "sphere") };
240
240
  }
241
241
  /** @internal Resolves torus profile and sweep sampling before allocating kernel geometry. */
242
242
  export function resolveTorusPrimitive(options) {
@@ -0,0 +1,41 @@
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling/limits.js";
3
+ import { resolveCircularSegments, resolveGeometryResolution } from "../sampling/resolution.js";
4
+ /**
5
+ * Resolves a circular primitive's exact or adaptive segment count.
6
+ *
7
+ * @internal Exact counts override physical sampling, while explicit allocation ceilings still apply.
8
+ */
9
+ export function resolveCircularPrimitiveSegments(radius, options, operation) {
10
+ if (options.segments === undefined) {
11
+ return resolveCircularSegments(radius, {
12
+ ...options.resolution,
13
+ sizing: options.sizing ?? "vertex",
14
+ }, options.limits);
15
+ }
16
+ if (!Number.isSafeInteger(options.segments) || options.segments < 3)
17
+ throw new GeometryError("INVALID_ARGUMENT", "segments must be a safe integer of at least three.", { operation, details: { value: options.segments } });
18
+ assertSamplingCount(options.segments, operation, resolveGeometrySamplingLimits(options.limits).maxCircularSegments);
19
+ return options.segments;
20
+ }
21
+ /** @internal Budgets native octahedral sphere triangles, preserving deliberate faceting overrides. */
22
+ export function resolveSphericalPrimitiveSegments(radius, options, operation) {
23
+ const segments = resolveCircularPrimitiveSegments(radius, options, operation);
24
+ const limits = resolveGeometrySamplingLimits(options.limits);
25
+ if (options.segments !== undefined || options.resolution?.circularSegments !== undefined) {
26
+ const refined = 4 * Math.ceil(segments / 4);
27
+ assertSamplingCount(refined, operation, limits.maxCircularSegments);
28
+ return refined;
29
+ }
30
+ const policy = resolveGeometryResolution(options.resolution, limits);
31
+ const error = policy.maxChordError / radius;
32
+ const diameter = Math.min(error >= 1 ? Infinity : Math.sqrt(3 * error * (2 - error)), policy.maxSegmentLength === undefined ? Infinity : policy.maxSegmentLength / radius);
33
+ // Manifold 3.5.4 maps each octahedral grid face through sin(pi*x/2), then normalizes.
34
+ // Its norm is at least sqrt(3)/2, so an edge arc is <= pi*sqrt(2/3)*r/frequency.
35
+ // A spherical triangle of diameter D stays within r-sqrt(r*r-D*D/3) of the sphere.
36
+ // https://github.com/elalish/manifold/blob/v3.5.4/src/constructors.cpp#L162-L175
37
+ const frequency = Math.max(Math.ceil(segments / 4), Math.ceil((Math.PI * Math.sqrt(2 / 3)) / diameter));
38
+ const refined = 4 * frequency;
39
+ assertSamplingCount(refined, operation, Math.min(policy.maxSegments, limits.maxCircularSegments));
40
+ return refined;
41
+ }
@@ -1,12 +1,24 @@
1
- import { sampleCurve2 } from "../curves/sampling.js";
1
+ import { planarCubicControl } from "../curves/evaluation.js";
2
+ import { sampleCubicControlPoints, sampleCurve2 } from "../curves/sampling.js";
2
3
  import { GeometryError } from "../errors.js";
3
- import { normalizeContour } from "../regions.js";
4
- import { resolveGeometrySamplingLimits } from "../sampling-limits.js";
4
+ import { normalizeContour } from "../regions/operations.js";
5
+ import { resolveGeometrySamplingLimits } from "../sampling/limits.js";
5
6
  import { requireProfileVertexCount } from "./validation.js";
6
7
  const OPERATION = "sampleContour";
7
8
  function invalid(message) {
8
9
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: OPERATION });
9
10
  }
11
+ function sampleSpanPoints(span, options) {
12
+ if (span.kind !== "cubic")
13
+ return sampleCurve2(span, options).points;
14
+ const control = planarCubicControl(span);
15
+ // Constant curves still need the shared sampler's degenerate-tangent rejection.
16
+ if (control.every((point) => point.every((value, axis) => value === control[0][axis])))
17
+ return sampleCurve2(span, options).points;
18
+ const points = [span.start];
19
+ sampleCubicControlPoints(control, options, (point) => points.push([point[0], point[1]]));
20
+ return points;
21
+ }
10
22
  /**
11
23
  * Samples 2–32 connected line/cubic segments into a simple, nonzero-area, immutable CCW XY loop.
12
24
  *
@@ -16,8 +28,8 @@ function invalid(message) {
16
28
  * `normalizeContour`; this is a single contour without holes. No editor modes or normalized
17
29
  * coordinate range are required. No native engine, SDK, or ambient resolution is used.
18
30
  *
19
- * @param curve - Closed contour in millimetres unless positive scales convert its coordinates.
20
- * @param options - Physical resolution and unique vertex budget; defaults to min(4096, maxProfilePoints).
31
+ * @param curve - Closed contour in millimetres, or coordinates converted by the selected scales.
32
+ * @param options - Coordinate scales, physical sampling, and vertex limits.
21
33
  * @returns Frozen counterclockwise loop in millimetres, without a repeated seam endpoint.
22
34
  * @throws {@link GeometryError} for invalid data, topology, scale, or exceeded sampling budgets.
23
35
  *
@@ -89,11 +101,11 @@ export function sampleContour(curve, options = {}) {
89
101
  else {
90
102
  invalid("Cross-section segments must be lines or cubics.");
91
103
  }
92
- const sampled = sampleCurve2(span, {
104
+ const sampled = sampleSpanPoints(span, {
93
105
  ...(options.resolution === undefined ? {} : { resolution: options.resolution }),
94
106
  maxVertices: remainingVertices,
95
107
  limits,
96
- }).points;
108
+ });
97
109
  const endIndex = sampled.length - (closed ? 1 : 0);
98
110
  for (let pointIndex = 1; pointIndex < endIndex; pointIndex++)
99
111
  output.push(sampled[pointIndex]);
@@ -1,9 +1,9 @@
1
1
  import { planarCubicControl } from "../curves/evaluation.js";
2
2
  import { resolveLineSegmentCount, resolveUniformCubicSegments } from "../curves/sampling.js";
3
3
  import { GeometryError } from "../errors.js";
4
- import { normalizeRegion, signedContourArea } from "../regions.js";
5
- import { resolveArcSegments, resolveGeometryResolution } from "../resolution.js";
6
- import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling-limits.js";
4
+ import { normalizeRegion, signedContourArea } from "../regions/operations.js";
5
+ import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling/limits.js";
6
+ import { resolveArcSegments, resolveGeometryResolution } from "../sampling/resolution.js";
7
7
  import { createProfileSpanSampler } from "./span-sampling.js";
8
8
  const isArray = (value) => Array.isArray(value);
9
9
  const fail = (message) => {
@@ -62,6 +62,7 @@ const contours = (component) => [
62
62
  component.outer,
63
63
  ...component.holes,
64
64
  ];
65
+ const contourAt = (component, index) => index === 0 ? component.outer : component.holes[index - 1];
65
66
  /**
66
67
  * Explicitly matches identified component/contour/span topology across a family.
67
68
  *
@@ -70,6 +71,8 @@ const contours = (component) => [
70
71
  * Input order and winding are preserved. Collapsed spans retain repeated logical slots, which
71
72
  * the engine maps to shared physical vertices while omitting degenerate faces.
72
73
  *
74
+ * @param profiles - 1–1000 profiles with matching component, contour, and span IDs, in order.
75
+ *
73
76
  * @example Match named rectangle landmarks
74
77
  * ```ts
75
78
  * matchProfiles([
@@ -115,7 +118,7 @@ export function matchProfiles(profiles, options = {}) {
115
118
  if (component.id !== expected.id || component.holes.length !== expected.holes.length)
116
119
  fail("Profile component identities and hole counts must retain the same order.");
117
120
  contours(component).forEach((contour, contourIndex) => {
118
- const paired = contours(expected)[contourIndex];
121
+ const paired = contourAt(expected, contourIndex);
119
122
  if (contour.id !== paired.id ||
120
123
  contour.spans.length !== paired.spans.length ||
121
124
  contour.spans.some((span, index) => span.id !== paired.spans[index].id))
@@ -126,7 +129,7 @@ export function matchProfiles(profiles, options = {}) {
126
129
  let pointsPerProfile = 0;
127
130
  const sampling = first.components.map((component, componentIndex) => contours(component).map((contour, contourIndex) => contour.spans.map((_, spanIndex) => {
128
131
  let count = Math.max(...profiles.map((profile) => {
129
- const span = contours(profile.components[componentIndex])[contourIndex].spans[spanIndex];
132
+ const span = contourAt(profile.components[componentIndex], contourIndex).spans[spanIndex];
130
133
  if (span.segments !== undefined)
131
134
  return span.segments;
132
135
  const selectedResolution = resolveGeometryResolution({ ...resolution, ...span.resolution }, limits);
@@ -143,7 +146,7 @@ export function matchProfiles(profiles, options = {}) {
143
146
  while (true) {
144
147
  let checkedCount = count;
145
148
  for (const profile of profiles) {
146
- const span = contours(profile.components[componentIndex])[contourIndex].spans[spanIndex];
149
+ const span = contourAt(profile.components[componentIndex], contourIndex).spans[spanIndex];
147
150
  if (span.kind === "cubic" && span.segments === undefined)
148
151
  checkedCount = Math.max(checkedCount, resolveUniformCubicSegments(planarCubicControl(span), resolveGeometryResolution({ ...resolution, ...span.resolution }, limits), cubicBudget, count));
149
152
  }
@@ -1,4 +1,4 @@
1
- import { resolveCircularSampling } from "../../circular-sampling.js";
1
+ import { resolveCircularSampling } from "../../sampling/circular.js";
2
2
  import { requireProfileVertexCount } from "../validation.js";
3
3
  /**
4
4
  * Creates an immutable centered CCW circle with +X seam and vertex or face radial sizing.