@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,7 +1,7 @@
1
1
  import { GeometryError } from "../../errors.js";
2
2
  import { vector2Data } from "../../math/vector-value.js";
3
- import { resolveCircularPrimitiveSegments } from "../../primitive-resolution.js";
4
- import { assertPrimitiveOptions } from "../../primitive-resolvers.js";
3
+ import { assertPrimitiveOptions } from "../../primitives/resolvers.js";
4
+ import { resolveCircularPrimitiveSegments } from "../../primitives/sampling.js";
5
5
  import { requireFiniteProfileValues, requireProfileVertexCount } from "../validation.js";
6
6
  /**
7
7
  * Creates an immutable centered CCW ellipse with +X seam within the selected sampling ceiling.
@@ -1,10 +1,10 @@
1
- import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment, } from "../../edge-finishing.js";
2
1
  import { GeometryError } from "../../errors.js";
2
+ import { resolveModelingLimits } from "../../limits.js";
3
3
  import { vector2Data } from "../../math/vector-value.js";
4
- import { resolveModelingLimits } from "../../model-limits.js";
5
- import { assertPrimitiveOptions } from "../../primitive-resolvers.js";
6
- import { resolveAlignedCircularSegments } from "../../resolution.js";
7
- import { assertSamplingCount } from "../../sampling-limits.js";
4
+ import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment, } from "../../primitives/edges.js";
5
+ import { assertPrimitiveOptions } from "../../primitives/resolvers.js";
6
+ import { assertSamplingCount } from "../../sampling/limits.js";
7
+ import { resolveAlignedCircularSegments } from "../../sampling/resolution.js";
8
8
  import { requireFiniteProfileValues, requireProfileVertexCount } from "../validation.js";
9
9
  const fail = (operation, message) => {
10
10
  throw new GeometryError("INVALID_ARGUMENT", message, { operation });
@@ -56,8 +56,8 @@ export function resolveRectangle(options, operation) {
56
56
  }
57
57
  return { width, height, corners, setbacks, limits };
58
58
  }
59
- /** @internal Resolves one quarter arc under the same exact and physical convention as native rectangles. */
60
- export function rectangleCornerSegments(corner, limits) {
59
+ // Pure contours and identified profiles use the same quarter-arc sampling as native rectangles.
60
+ function rectangleCornerSegments(corner, limits) {
61
61
  if (corner.kind !== "round")
62
62
  return 1;
63
63
  const selected = resolveModelingLimits(limits);
@@ -156,7 +156,7 @@ export function rectangleContour(options) {
156
156
  *
157
157
  * Use [rectangle](/docs/reference/model/rectangle) for a filled Section.
158
158
  *
159
- * @see {@link matchProfiles} to sample a family with shared landmark correspondence.
159
+ * @see [matchProfiles](/docs/reference/geometry/matchProfiles) to sample a family with shared landmark correspondence.
160
160
  * @see {@link rectangleContour} for sampled boundary coordinates.
161
161
  *
162
162
  * @example Retain rectangle landmarks
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../../errors.js";
2
- import { assertPrimitiveOptions } from "../../primitive-resolvers.js";
2
+ import { assertPrimitiveOptions } from "../../primitives/resolvers.js";
3
3
  import { requireFiniteProfileValues, requireProfileVertexCount } from "../validation.js";
4
4
  /**
5
5
  * Creates an immutable centered CCW alternating-radius star within the selected profile sampling ceiling.
@@ -1,7 +1,7 @@
1
1
  import { GeometryError } from "../errors.js";
2
- import { normalizeContour } from "../regions.js";
3
- import { resolveGeometryResolution } from "../resolution.js";
4
- import { resolveGeometrySamplingLimits } from "../sampling-limits.js";
2
+ import { normalizeContour } from "../regions/operations.js";
3
+ import { resolveGeometrySamplingLimits } from "../sampling/limits.js";
4
+ import { resolveGeometryResolution } from "../sampling/resolution.js";
5
5
  import { requireProfileVertexCount } from "./validation.js";
6
6
  const OPERATION = "sampleSideProfile";
7
7
  const MAX_SEGMENTS = 31;
@@ -30,8 +30,8 @@ function distanceToChord(point, start, end) {
30
30
  * Neither normalized coordinates nor editor metadata are required. Endpoints are retained once;
31
31
  * no axis closure, winding normalization, or manufacturing repair is performed.
32
32
  *
33
- * @param curve - Open outline in millimetres unless the positive scales convert its coordinates.
34
- * @param options - Physical resolution and output budget; defaults to min(4096, maxProfilePoints).
33
+ * @param curve - Open outline in millimetres, or coordinates converted by the selected scales.
34
+ * @param options - Coordinate scales, physical sampling, and vertex limits.
35
35
  * @returns Frozen open polyline in millimetres, ordered from lowest to highest anchor.
36
36
  * @throws {@link GeometryError} for invalid coordinates, order, scale, or exceeded subdivision budget.
37
37
  *
@@ -144,6 +144,9 @@ export function sampleSideProfile(curve, options = {}) {
144
144
  * Returns a counterclockwise filled-boundary contour without a repeated seam vertex.
145
145
  * Radii must be nonnegative; the result must enclose nonzero area without touching itself.
146
146
  * This is a solid-body closure, not a hollow-wall or mounting-bore construction.
147
+ *
148
+ * @param side - [radius, height] points in millimetres, with increasing heights.
149
+ * @param limits - Point limits, including any added axis endpoints.
147
150
  */
148
151
  export function closeToAxis(side, limits) {
149
152
  const operation = "closeToAxis";
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../errors.js";
2
- import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
2
+ import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
3
3
  /** @internal Validates finite dimensions shared by the pure profile factories. */
4
4
  export function requireFiniteProfileValues(values, operation) {
5
5
  if (!values.every(Number.isFinite)) {
@@ -1,5 +1,5 @@
1
1
  import * as clippingModule from "polygon-clipping";
2
- import { normalizeRegion } from "./regions.js";
2
+ import { normalizeRegion } from "./operations.js";
3
3
  const moduleWithDefault = clippingModule;
4
4
  /** @internal Normalizes polygon-clipping's CommonJS and bundled ESM module shapes. */
5
5
  export const polygonClipping = moduleWithDefault.default ?? clippingModule;
@@ -1,4 +1,4 @@
1
- import { GeometryError } from "./errors.js";
1
+ import { GeometryError } from "../errors.js";
2
2
  /** @internal Parallel-edge offsets shared by convex extrusion rims and pocket entries. */
3
3
  export function convexContourOffsets(points, operation) {
4
4
  const fail = (message) => {
@@ -1,9 +1,11 @@
1
- import { GeometryError } from "./errors.js";
2
- import { resolveModelingLimits } from "./model-limits.js";
3
- import { normalizeRegionWithWork, signedContourArea } from "./regions.js";
4
- import { assertSamplingCount } from "./sampling-limits.js";
5
- import { resolveGeometryTolerance } from "./tolerance.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { resolveModelingLimits } from "../limits.js";
3
+ import { assertSamplingCount } from "../sampling/limits.js";
4
+ import { resolveGeometryTolerance } from "../tolerance.js";
5
+ import { normalizeRegionWithWork, signedContourArea } from "./operations.js";
6
6
  const maximumWork = 2_000_000;
7
+ // Keep these kernels local to isolate V8's array-type feedback from other modeling operations.
8
+ // Shared helpers see more array representations, which can slow hot loops even when inlined.
7
9
  const cross = (a, b) => a[0] * b[1] - a[1] * b[0];
8
10
  const dot = (a, b) => a[0] * b[0] + a[1] * b[1];
9
11
  const difference = (a, b) => [a[0] - b[0], a[1] - b[1]];
@@ -1,5 +1,5 @@
1
- import { GeometryError } from "./errors.js";
2
- import { resolveGeometryTolerance } from "./tolerance.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { resolveGeometryTolerance } from "../tolerance.js";
3
3
  // Only our deeply frozen, canonical outputs enter these registries. Object.isFrozen alone
4
4
  // cannot establish validation provenance, and caller-owned inputs must never be cached.
5
5
  const normalizedLoops = new WeakMap();
@@ -27,10 +27,15 @@ const coordinateScale = (loop) => {
27
27
  }
28
28
  return Math.max(maxX - minX, maxY - minY);
29
29
  };
30
- /** Returns the signed area of a non-duplicated loop; positive means CCW. */
30
+ /**
31
+ * Returns the signed area of a non-duplicated loop; positive means CCW.
32
+ *
33
+ * @param loop - XY loop in millimetres, with implicit closure; not validated.
34
+ */
31
35
  export function signedContourArea(loop) {
32
36
  if (loop.length === 0)
33
37
  return 0;
38
+ // Shift to a local origin and compensate the sum to retain small areas at large coordinates.
34
39
  const origin = loop[0];
35
40
  let twiceArea = 0, correction = 0;
36
41
  for (let index = 0; index < loop.length; index += 1) {
@@ -47,7 +52,12 @@ export function signedContourArea(loop) {
47
52
  }
48
53
  return (twiceArea + correction) / 2;
49
54
  }
50
- /** Returns true when a point lies inside or on the boundary of a loop. */
55
+ /**
56
+ * Returns true when a point lies inside or on the boundary of a loop.
57
+ *
58
+ * @param loop - Simple XY loop with either winding.
59
+ * @param point - Query in the loop's coordinate system.
60
+ */
51
61
  export function contourContainsPoint(loop, point) {
52
62
  let inside = false;
53
63
  for (let index = 0, previous = loop.length - 1; index < loop.length; previous = index++) {
@@ -167,8 +177,11 @@ const loopsIntersect = (a, b, epsilon, budget) => a === b ||
167
177
  *
168
178
  * Adjacent duplicates and a repeated seam point are removed. Coordinates must
169
179
  * be finite, the effective loop must contain at least three points, and the
170
- * result must be simple and have non-zero area. Previously validated immutable results may be
180
+ * result must be simple and have nonzero area. Previously validated immutable results may be
171
181
  * returned unchanged when their winding and tolerance policy match.
182
+ *
183
+ * @param input - XY loop in millimetres; caller data is preserved.
184
+ * @param counterClockwise - true for an exterior, false for a hole.
172
185
  */
173
186
  export function normalizeContour(input, counterClockwise, tolerance = {}) {
174
187
  return normalizeLoopWithBudget(input, counterClockwise, tolerance, { candidates: 0 });
@@ -222,6 +235,8 @@ const normalizeLoopWithBudget = (input, counterClockwise, tolerance, budget) =>
222
235
  * Exteriors become CCW and holes clockwise. Every hole must lie strictly
223
236
  * within its exterior and boundaries may not intersect. Previously validated immutable results
224
237
  * may be returned unchanged under the same tolerance policy.
238
+ *
239
+ * @param polygon - Millimetre exterior and holes; boundaries must be disjoint.
225
240
  */
226
241
  export function normalizePolygon(polygon, tolerance = {}) {
227
242
  return normalizePolygonWithBudget(polygon, tolerance, { candidates: 0 });
@@ -272,6 +287,8 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
272
287
  /**
273
288
  * Validates a disjoint explicit region and returns immutable normalized data.
274
289
  * Previously validated immutable results may be returned unchanged under the same tolerance policy.
290
+ *
291
+ * @param region - Disjoint millimetre polygons; empty input is valid.
275
292
  */
276
293
  export function normalizeRegion(region, tolerance = {}) {
277
294
  return normalizeRegionWithWork(region, tolerance).region;
@@ -298,30 +315,46 @@ function normalizeRegionWithBudget(region, tolerance, budget) {
298
315
  !polygon.holes.some((hole) => contourContainsPoint(hole, point));
299
316
  // Broad phase preserves exact contact semantics while avoiding pairwise loop
300
317
  // walks for separated polygons (for example many disconnected QR modules).
301
- const bounded = polygons
302
- .map((polygon) => {
303
- let minX = Infinity;
304
- let minY = Infinity;
305
- let maxX = -Infinity;
306
- let maxY = -Infinity;
307
- for (const [x, y] of polygon.outer) {
308
- minX = Math.min(minX, x);
309
- minY = Math.min(minY, y);
310
- maxX = Math.max(maxX, x);
311
- maxY = Math.max(maxY, y);
312
- }
313
- return { polygon, minX, minY, maxX, maxY };
314
- })
318
+ let bounded = polygons
319
+ .map((polygon) => ({ polygon, ...loopBounds(polygon.outer) }))
315
320
  .sort((a, b) => a.minX - b.minX);
321
+ const projectedCandidates = (ordered, minimum, maximum) => {
322
+ if (ordered.every((bounds, index) => index === 0 || ordered[index - 1][maximum] < bounds[minimum]))
323
+ return 0;
324
+ const ends = ordered.map((bounds) => bounds[maximum]).sort((a, b) => a - b);
325
+ let expired = 0;
326
+ let candidates = 0;
327
+ for (let index = 0; index < ordered.length; index++) {
328
+ while (ends[expired] < ordered[index][minimum])
329
+ expired++;
330
+ candidates += index - expired;
331
+ }
332
+ return candidates;
333
+ };
334
+ const horizontalCandidates = projectedCandidates(bounded, "minX", "maxX");
335
+ let minimum = "minX";
336
+ // Compare actual interval overlap: tall disjoint columns still belong on the X sweep.
337
+ // Ties retain X, and an already disjoint X projection needs no second sort.
338
+ if (horizontalCandidates > 0) {
339
+ const vertical = [...bounded].sort((a, b) => a.minY - b.minY);
340
+ if (projectedCandidates(vertical, "minY", "maxY") < horizontalCandidates) {
341
+ bounded = vertical;
342
+ minimum = "minY";
343
+ }
344
+ }
345
+ const maximum = minimum === "minY" ? "maxY" : "maxX";
346
+ const otherMinimum = minimum === "minY" ? "minX" : "minY";
347
+ const otherMaximum = minimum === "minY" ? "maxX" : "maxY";
316
348
  const active = [];
317
349
  for (const current of bounded) {
318
350
  let retained = 0;
319
351
  for (const candidate of active) {
320
- if (candidate.maxX < current.minX)
352
+ if (candidate[maximum] < current[minimum])
321
353
  continue;
322
354
  active[retained++] = candidate;
323
355
  consumeIntersectionCandidate(budget);
324
- if (candidate.maxY < current.minY || current.maxY < candidate.minY)
356
+ if (candidate[otherMaximum] < current[otherMinimum] ||
357
+ current[otherMaximum] < candidate[otherMinimum])
325
358
  continue;
326
359
  const a = current.polygon.outer;
327
360
  const b = candidate.polygon.outer;
@@ -357,7 +390,11 @@ export function regionArea(region) {
357
390
  Math.abs(signedContourArea(polygon.outer)) -
358
391
  polygon.holes.reduce((holeTotal, hole) => holeTotal + Math.abs(signedContourArea(hole)), 0), 0);
359
392
  }
360
- /** Returns finite axis-aligned bounds for a non-empty region. */
393
+ /**
394
+ * Returns finite axis-aligned bounds for a nonempty region.
395
+ *
396
+ * @param region - Nonempty region with finite millimetre exterior coordinates.
397
+ */
361
398
  export function regionBounds(region) {
362
399
  if (region.length === 0) {
363
400
  throw new GeometryError("DEGENERATE_GEOMETRY", "An empty region has no bounds.");
@@ -1,9 +1,9 @@
1
- import { GeometryError } from "./errors.js";
2
- import { path2InputData } from "./paths/path-value.js";
3
- import { clippingRing, regionFromMultiPolygon, unionPolygonGeometry } from "./polygon-clipping.js";
4
- import { resolveCircularSegments } from "./resolution.js";
5
- import { assertSamplingCount, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
6
- import { resolveGeometryTolerance } from "./tolerance.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { path2InputData } from "../paths/value.js";
3
+ import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
4
+ import { resolveArcSegments, resolveCircularSegments, } from "../sampling/resolution.js";
5
+ import { resolveGeometryTolerance } from "../tolerance.js";
6
+ import { clippingRing, regionFromMultiPolygon, unionPolygonGeometry } from "./clipping.js";
7
7
  const DEFAULT_MITER_LIMIT = 4;
8
8
  function fail(message) {
9
9
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: "strokeRegionData" });
@@ -14,6 +14,7 @@ function ellipsePoints(center, radius, segments) {
14
14
  return [center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius];
15
15
  });
16
16
  }
17
+ /** Builds an outer corner with an interior overlap; offset edges and miter tips stay fixed. */
17
18
  function cornerContour(previous, point, next, halfWidth, join) {
18
19
  const incomingLength = Math.hypot(point[0] - previous[0], point[1] - previous[1]);
19
20
  const outgoingLength = Math.hypot(next[0] - point[0], next[1] - point[1]);
@@ -31,7 +32,15 @@ function cornerContour(previous, point, next, halfWidth, join) {
31
32
  const side = turn > 0 ? -1 : 1;
32
33
  const before = [-incoming[1] * halfWidth * side, incoming[0] * halfWidth * side];
33
34
  const after = [-outgoing[1] * halfWidth * side, outgoing[0] * halfWidth * side];
34
- const points = [point, [point[0] + before[0], point[1] + before[1]]];
35
+ // A vertex on both segment end edges can leave seams when clipping rounds intersections.
36
+ // Keep the anchor inside both rectangles instead; the half-width and segment-length bounds
37
+ // ensure the extra corner coverage stays within existing strips, even on short segments.
38
+ const overlap = Math.min(1, incomingLength / halfWidth, outgoingLength / halfWidth) / 2;
39
+ const anchor = [
40
+ point[0] - (before[0] + after[0]) * overlap,
41
+ point[1] - (before[1] + after[1]) * overlap,
42
+ ];
43
+ const points = [anchor, [point[0] + before[0], point[1] + before[1]]];
35
44
  const denominator = 1 + incoming[0] * outgoing[0] + incoming[1] * outgoing[1];
36
45
  // The outer offset-line intersection has radius halfWidth / cos(turnAngle / 2).
37
46
  // Apply SVG's miter ratio before division so sharp reversals cannot create an unbounded tip.
@@ -97,10 +106,15 @@ export function strokePathContours(input, options, exactCircularSegments) {
97
106
  const contours = [];
98
107
  const segmentCount = closed ? normalizedPath.length : normalizedPath.length - 1;
99
108
  const joinCount = closed ? normalizedPath.length : Math.max(0, normalizedPath.length - 2);
109
+ const capIntervals = !closed && cap === "round" ? resolveArcSegments(half, 180, { circularSegments }, limits) : 0;
100
110
  const constructionVertices = segmentCount * 4 +
101
111
  joinCount * (join === "round" ? circularSegments : join === "miter" ? 4 : 3) +
102
- (!closed && cap === "round" ? 2 * circularSegments : 0);
112
+ (capIntervals > 0 ? 2 * (capIntervals - 1) : 0);
103
113
  assertSamplingCount(constructionVertices, "strokeRegionData", limits.maxProfilePoints);
114
+ const capArc = Array.from({ length: Math.max(0, capIntervals - 1) }, (_, index) => {
115
+ const angle = ((index + 1) * Math.PI) / capIntervals;
116
+ return [Math.cos(angle), Math.sin(angle)];
117
+ });
104
118
  for (let index = 0; index < segmentCount; index += 1) {
105
119
  let start = normalizedPath[index];
106
120
  let end = normalizedPath[(index + 1) % normalizedPath.length];
@@ -114,16 +128,28 @@ export function strokePathContours(input, options, exactCircularSegments) {
114
128
  }
115
129
  }
116
130
  const normal = [-tangent[1] * half, tangent[0] * half];
117
- contours.push([
131
+ const contour = [
118
132
  [start[0] - normal[0], start[1] - normal[1]],
119
133
  [end[0] - normal[0], end[1] - normal[1]],
120
- [end[0] + normal[0], end[1] + normal[1]],
121
- [start[0] + normal[0], start[1] + normal[1]],
122
- ]);
134
+ ];
135
+ // Insert only arc interiors into the end segments. Their existing +/-normal vertices
136
+ // are exact cap endpoints, so clipping never has to join a nearly tangent disk edge.
137
+ if (index === segmentCount - 1)
138
+ for (const [c, s] of capArc)
139
+ contour.push([
140
+ end[0] - normal[0] * c + normal[1] * s,
141
+ end[1] - normal[1] * c - normal[0] * s,
142
+ ]);
143
+ contour.push([end[0] + normal[0], end[1] + normal[1]], [start[0] + normal[0], start[1] + normal[1]]);
144
+ if (index === 0)
145
+ for (const [c, s] of capArc)
146
+ contour.push([
147
+ start[0] + normal[0] * c - normal[1] * s,
148
+ start[1] + normal[1] * c + normal[0] * s,
149
+ ]);
150
+ contours.push(contour);
123
151
  }
124
- const disk = join === "round" || (!closed && cap === "round")
125
- ? ellipsePoints([0, 0], half, circularSegments)
126
- : [];
152
+ const disk = join === "round" ? ellipsePoints([0, 0], half, circularSegments) : [];
127
153
  const circleAt = ([x, y]) => disk.map(([u, v]) => [x + u, y + v]);
128
154
  if (join === "round") {
129
155
  const joinPoints = closed ? normalizedPath : normalizedPath.slice(1, -1);
@@ -139,9 +165,6 @@ export function strokePathContours(input, options, exactCircularSegments) {
139
165
  contours.push(corner);
140
166
  }
141
167
  }
142
- if (!closed && cap === "round") {
143
- contours.push(circleAt(normalizedPath[0]), circleAt(normalizedPath.at(-1)));
144
- }
145
168
  return contours;
146
169
  }
147
170
  /** @internal Polygon-clipping representation shared with the bounded SVG importer. */
@@ -159,8 +182,11 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
159
182
  *
160
183
  * Closed paths omit a duplicated seam point. Zero-length sampled segments are ignored, while the
161
184
  * effective path must still contain visible length. Round caps and joins use deterministic physical
162
- * resolution. Bevels fill the outer corner triangle; miters extend the outer edges to their
163
- * intersection, falling back to bevels above SVG's default miter limit of 4.
185
+ * resolution. Caps are tangent-aligned semicircles with `ceil(circularSegments / 2)` intervals,
186
+ * following {@link resolveArcSegments}. Bevels fill the outer corner triangle; miters extend the
187
+ * outer edges to their intersection, falling back to bevels above SVG's default miter limit of 4.
188
+ *
189
+ * @param path - Sampled XY path in millimetres; path values supply closure.
164
190
  */
165
191
  export function strokeRegionData(path, options) {
166
192
  const result = strokePathMultiPolygon(path, options);
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../errors.js";
2
- import { normalizeContour } from "../regions.js";
2
+ import { normalizeContour } from "./operations.js";
3
3
  const maximumComparisons = 8_000_000;
4
4
  const cross = (a, b, c) => (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
5
5
  const pointInTriangle = (point, a, b, c, epsilon) => {
@@ -8,7 +8,37 @@ const pointInTriangle = (point, a, b, c, epsilon) => {
8
8
  const ca = cross(c, a, point);
9
9
  return ab >= -epsilon && bc >= -epsilon && ca >= -epsilon;
10
10
  };
11
- /** Ear-clips one normalized simple CCW loop into stable local vertex indices. */
11
+ const convexCap = (loop, epsilon) => {
12
+ const count = loop.length;
13
+ if (!loop.every((point, index) => cross(loop[(index - 1 + count) % count], point, loop[(index + 1) % count]) > epsilon))
14
+ return undefined;
15
+ const anchor = loop[count - 1];
16
+ for (let current = 0; current < count - 3; current++) {
17
+ const next = loop[current + 1];
18
+ // A convex chain's closest vertices to this diagonal are its two neighboring endpoints.
19
+ // Keep the ordinary ear path when tolerance could classify either neighbor inside the ear.
20
+ if (cross(anchor, loop[current], next) <= epsilon ||
21
+ cross(next, anchor, loop[current + 2]) >= -epsilon ||
22
+ cross(next, anchor, loop[count - 2]) >= -epsilon)
23
+ return undefined;
24
+ }
25
+ const triangles = new Uint32Array((count - 2) * 3);
26
+ let offset = 0;
27
+ for (let current = 0; current < count - 3; current++) {
28
+ triangles[offset++] = count - 1;
29
+ triangles[offset++] = current;
30
+ triangles[offset++] = current + 1;
31
+ }
32
+ triangles[offset++] = count - 3;
33
+ triangles[offset++] = count - 2;
34
+ triangles[offset] = count - 1;
35
+ return triangles;
36
+ };
37
+ /**
38
+ * Triangulates one simple loop into indices of its normalized CCW vertex order.
39
+ *
40
+ * @param loop - Boundary to normalize; indices address its cleaned CCW order.
41
+ */
12
42
  export function triangulateContour(loop) {
13
43
  const normalized = normalizeContour(loop, true);
14
44
  const assertComparisonLimit = (requiredCount) => {
@@ -32,6 +62,9 @@ export function triangulateContour(loop) {
32
62
  }
33
63
  const extent = Math.max(maxX - minX, maxY - minY);
34
64
  const epsilon = extent * extent * Number.EPSILON * 32;
65
+ const convex = convexCap(normalized, epsilon);
66
+ if (convex !== undefined)
67
+ return convex;
35
68
  const remaining = normalized.map((_, index) => index);
36
69
  const triangles = [];
37
70
  let comparisons = 0;
@@ -1,12 +1,12 @@
1
1
  import { GeometryError } from "../errors.js";
2
- import { triangulateContour } from "../loft/loft.js";
3
- import { validateTriangleMesh } from "../mesh/mesh.js";
4
- import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
5
- import { writeMeshVertex } from "../numeric.js";
6
- import { path2InputData } from "../paths/path-value.js";
7
- import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
8
- import { normalizeContour } from "../regions.js";
9
- import { assertSamplingCount } from "../sampling-limits.js";
2
+ import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../limits.js";
3
+ import { validateTriangleMesh } from "../mesh/operations.js";
4
+ import { writeMeshVertex } from "../mesh/write-vertex.js";
5
+ import { path2InputData } from "../paths/value.js";
6
+ import { resolveCircularPrimitiveSegments } from "../primitives/sampling.js";
7
+ import { normalizeContour } from "../regions/operations.js";
8
+ import { triangulateContour } from "../regions/triangulation.js";
9
+ import { assertSamplingCount } from "../sampling/limits.js";
10
10
  const AXIS_EPSILON = 1e-10;
11
11
  /**
12
12
  * Revolves a non-duplicated closed `[radius, z]` profile around +Z.
@@ -19,8 +19,7 @@ const AXIS_EPSILON = 1e-10;
19
19
  * Profile coordinates must fit finite Float32 mesh storage.
20
20
  * Path2 profiles must be closed; raw point collections have an implicit closing edge.
21
21
  *
22
- * @param profile - Closed CCW `[radius, z]` profile without a duplicated seam point.
23
- * @param options - Optional physical or exact circumferential sampling controls. Defaults to `{}`.
22
+ * @param input - Closed `[radius, Z]` profile in millimetres; radii must be non-negative.
24
23
  * @returns A closed indexed triangle mesh revolved counter-clockwise around +Z.
25
24
  *
26
25
  * @example Partial revolution with end caps
@@ -1,6 +1,6 @@
1
- import { GeometryError } from "./errors.js";
2
- import { resolveCircularPrimitiveSegments } from "./primitive-resolution.js";
3
- import { assertPrimitiveOptions } from "./primitive-resolvers.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertPrimitiveOptions } from "../primitives/resolvers.js";
3
+ import { resolveCircularPrimitiveSegments } from "../primitives/sampling.js";
4
4
  function fail(message, nonfinite = false) {
5
5
  throw new GeometryError(nonfinite ? "NON_FINITE_VALUE" : "INVALID_ARGUMENT", message, {
6
6
  operation: "resolveCircularSampling",
@@ -1,4 +1,4 @@
1
- import { GeometryError } from "./errors.js";
1
+ import { GeometryError } from "../errors.js";
2
2
  /** Conservative defaults; trusted callers can supply larger explicit ceilings. */
3
3
  export const defaultGeometrySamplingLimits = Object.freeze({
4
4
  maxPathPoints: 100_000,
@@ -6,7 +6,11 @@ export const defaultGeometrySamplingLimits = Object.freeze({
6
6
  maxSweepProfilePoints: 4_096,
7
7
  maxCircularSegments: 512,
8
8
  });
9
- /** Resolves finite positive safe-integer allocation ceilings without ambient state. */
9
+ /**
10
+ * Resolves finite positive safe-integer allocation ceilings without ambient state.
11
+ *
12
+ * @param overrides - Trusted overrides that may raise defaults; omitted fields keep them.
13
+ */
10
14
  export function resolveGeometrySamplingLimits(overrides = {}) {
11
15
  if (typeof overrides !== "object" || overrides === null || Array.isArray(overrides))
12
16
  throw new GeometryError("INVALID_ARGUMENT", "Sampling limits must be an object.", {
@@ -1,5 +1,5 @@
1
- import { GeometryError } from "./errors.js";
2
- import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { resolveGeometrySamplingLimits } from "./limits.js";
3
3
  const DEFAULT_MAX_CHORD_ERROR = 0.05;
4
4
  const DEFAULT_MINIMUM_SEGMENTS = 16;
5
5
  const invalid = (message, details) => {
@@ -10,13 +10,12 @@ const invalid = (message, details) => {
10
10
  };
11
11
  /** @internal Resolves operation policy over explicit allocation ceilings and defaults. */
12
12
  export function resolveGeometryResolution(policy = {}, limits = {}) {
13
- const merged = policy;
14
- const circularSegments = merged.circularSegments;
13
+ const circularSegments = policy.circularSegments;
15
14
  const allowedMaximum = resolveGeometrySamplingLimits(limits).maxCircularSegments;
16
- const minSegments = merged.minSegments ?? Math.min(DEFAULT_MINIMUM_SEGMENTS, allowedMaximum);
17
- const maxSegments = merged.maxSegments ?? allowedMaximum;
18
- const maxChordError = merged.maxChordError ?? DEFAULT_MAX_CHORD_ERROR;
19
- const maxSegmentLength = merged.maxSegmentLength;
15
+ const minSegments = policy.minSegments ?? Math.min(DEFAULT_MINIMUM_SEGMENTS, allowedMaximum);
16
+ const maxSegments = policy.maxSegments ?? allowedMaximum;
17
+ const maxChordError = policy.maxChordError ?? DEFAULT_MAX_CHORD_ERROR;
18
+ const maxSegmentLength = policy.maxSegmentLength;
20
19
  if (!Number.isSafeInteger(minSegments) || minSegments < 3) {
21
20
  invalid("minSegments must be an integer of at least three.", { minSegments });
22
21
  }
@@ -85,7 +84,8 @@ const assertRadius = (radius, operation) => {
85
84
  * `COMPLEXITY_LIMIT` rather than silently reducing quality.
86
85
  *
87
86
  * @param radius - Circle radius in millimetres.
88
- * @param policy - Optional operation-level policy under explicit sampling ceilings.
87
+ * @param policy - Optional operation-level policy under explicit sampling limits.
88
+ * @param limits - Full-circle segment limits; omitted fields use defaults.
89
89
  * @returns Full-circle segment count.
90
90
  * @throws {@link GeometryError} when radius or policy is invalid, or the requested tolerance
91
91
  * exceeds the configured segment safety limit.
@@ -139,7 +139,7 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
139
139
  /**
140
140
  * Resolves a deterministic full-circle count aligned to reusable topology factors.
141
141
  *
142
- * `alignTo` must be non-empty and contain only positive safe integers. Its checked least common
142
+ * `alignTo` must be nonempty and contain only positive safe integers. Its checked least common
143
143
  * multiple defines the alignment grid. An exact `segments` value wins over
144
144
  * `resolution.circularSegments` and adaptive sampling, but is never rounded: it must already be
145
145
  * aligned and meet `minSegments`. Adaptive counts are rounded upward and fail with
@@ -221,12 +221,13 @@ export function resolveAlignedCircularSegments(radius, options) {
221
221
  /**
222
222
  * Resolves the number of segments needed for a circular arc.
223
223
  *
224
- * Full-circle limits and exact circular counts are scaled to the requested angular span, matching
225
- * the reusable BOSL2-style convention while retaining at least one segment.
224
+ * Full-circle limits and exact circular counts are scaled to the requested angular span,
225
+ * retaining at least one segment.
226
226
  *
227
227
  * @param radius - Arc radius in millimetres.
228
- * @param angle - Non-zero signed sweep angle no greater than 360 degrees in magnitude.
229
- * @param policy - Optional operation-level policy over the active model scope.
228
+ * @param angle - Nonzero signed sweep angle no greater than 360 degrees in magnitude.
229
+ * @param policy - Explicit physical sampling policy; omitted fields use package defaults.
230
+ * @param limits - Full-circle segment limit, applied before scaling to the arc.
230
231
  * @returns Segment count for the requested arc span.
231
232
  * @throws {@link GeometryError} when radius, angle, or resolution policy is invalid, or the
232
233
  * corresponding full-circle tolerance exceeds the configured safety limit.
@@ -1,6 +1,6 @@
1
- import { clippingRing, polygonClipping, regionFromMultiPolygon, unionPolygonGeometry, xorPolygonGeometry, } from "../polygon-clipping.js";
2
- import { signedContourArea } from "../regions.js";
3
- import { assertSamplingCount } from "../sampling-limits.js";
1
+ import { clippingRing, polygonClipping, regionFromMultiPolygon, unionPolygonGeometry, xorPolygonGeometry, } from "../regions/clipping.js";
2
+ import { signedContourArea } from "../regions/operations.js";
3
+ import { assertSamplingCount } from "../sampling/limits.js";
4
4
  /** Private clipping stage with the selected execution's immutable allocation ceiling. */
5
5
  export function createBoundedSvgClipping(maxVertices) {
6
6
  function ringVertexCount(value) {
@@ -53,6 +53,7 @@ export function createBoundedSvgClipping(maxVertices) {
53
53
  const tolerance = Math.max(1, summedArea) * 1e-9;
54
54
  return Math.abs(summedArea - multiPolygonArea(union)) > tolerance;
55
55
  }
56
+ // Each polygon set stores one bit of coverage count. XOR adds bits; intersections carry.
56
57
  function addCoverageBits(left, right) {
57
58
  const output = [];
58
59
  let carry = [];