@metamesh/modeling 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +34 -18
  3. package/dist/api/engine.d.ts +217 -121
  4. package/dist/api/export.d.ts +123 -79
  5. package/dist/api/geometry.d.ts +406 -2102
  6. package/dist/api/index.d.ts +472 -1798
  7. package/dist/api/math.d.ts +315 -0
  8. package/dist/api/mechanical.d.ts +1041 -0
  9. package/dist/api/mesh.d.ts +360 -88
  10. package/dist/api/text.d.ts +24 -44
  11. package/dist/docs/guides/concepts.md +67 -33
  12. package/dist/docs/guides/exporting.md +88 -0
  13. package/dist/docs/guides/fonts.md +5 -3
  14. package/dist/docs/guides/fundamentals.md +12 -24
  15. package/dist/docs/guides/generation.md +24 -16
  16. package/dist/docs/guides/geometry-values.md +192 -134
  17. package/dist/docs/guides/hosting.md +51 -96
  18. package/dist/docs/guides/profiles-and-extrusion.md +159 -11
  19. package/dist/docs/guides/recipes.md +121 -28
  20. package/dist/docs/guides/resolution-and-inspection.md +43 -23
  21. package/dist/docs/guides/solid-joins.md +12 -2
  22. package/dist/docs/guides/standalone-model.md +4 -2
  23. package/dist/docs/guides/svg-and-text.md +76 -39
  24. package/dist/docs/guides/sweeps-and-lofts.md +88 -44
  25. package/dist/docs/guides/transforms-and-placement.md +113 -103
  26. package/dist/docs/guides/workers.md +166 -0
  27. package/dist/docs/manifest.json +4133 -4153
  28. package/dist/docs/reference/engine/GenerationOptions.md +2 -3
  29. package/dist/docs/reference/engine/GeometryResource.md +6 -6
  30. package/dist/docs/reference/engine/ModelDependencies.md +2 -2
  31. package/dist/docs/reference/engine/ModelEngine.md +2 -3
  32. package/dist/docs/reference/engine/ModelEngineOptions.md +2 -7
  33. package/dist/docs/reference/engine/ModelPart.md +6 -6
  34. package/dist/docs/reference/engine/ModelResult.md +2 -2
  35. package/dist/docs/reference/engine/ModelRunArguments.md +2 -2
  36. package/dist/docs/reference/engine/ModelRunOptions.md +2 -3
  37. package/dist/docs/reference/engine/ModelSession.md +2 -2
  38. package/dist/docs/reference/engine/SessionOptions.md +2 -3
  39. package/dist/docs/reference/engine/categories/host-lifecycle.md +9 -3
  40. package/dist/docs/reference/engine/checkModel.md +6 -2
  41. package/dist/docs/reference/engine/createModelEngine.md +5 -3
  42. package/dist/docs/reference/engine/defaultModelingLimits.md +4 -11
  43. package/dist/docs/reference/engine/modelingWasmUrl.md +2 -2
  44. package/dist/docs/reference/engine.md +7 -1
  45. package/dist/docs/reference/export/Export3mfOptions.md +2 -6
  46. package/dist/docs/reference/export/ExportDiagnostic.md +2 -14
  47. package/dist/docs/reference/export/ExportFormat.md +2 -14
  48. package/dist/docs/reference/export/ExportGeometry.md +3 -15
  49. package/dist/docs/reference/export/ExportGlbOptions.md +14 -18
  50. package/dist/docs/reference/export/ExportLimits.md +2 -14
  51. package/dist/docs/reference/export/ExportMaterial.md +2 -14
  52. package/dist/docs/reference/export/ExportOptions.md +2 -14
  53. package/dist/docs/reference/export/ExportPart.md +2 -14
  54. package/dist/docs/reference/export/ExportReport.md +2 -14
  55. package/dist/docs/reference/export/ExportSink.md +5 -15
  56. package/dist/docs/reference/export/ExportStlOptions.md +2 -6
  57. package/dist/docs/reference/export/ExportedFile.md +14 -26
  58. package/dist/docs/reference/export/categories/mesh-serialization.md +9 -3
  59. package/dist/docs/reference/export/defaultExportLimits.md +2 -2
  60. package/dist/docs/reference/export/export3mf.md +4 -6
  61. package/dist/docs/reference/export/exportGlb.md +8 -10
  62. package/dist/docs/reference/export/exportStl.md +4 -6
  63. package/dist/docs/reference/export/write3mf.md +6 -6
  64. package/dist/docs/reference/export/writeGlb.md +10 -10
  65. package/dist/docs/reference/export/writeStl.md +6 -6
  66. package/dist/docs/reference/export.md +9 -3
  67. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
  68. package/dist/docs/reference/geometry/Anchor3-type.md +3 -7
  69. package/dist/docs/reference/geometry/Anchor3Options.md +70 -0
  70. package/dist/docs/reference/geometry/ArcCurve2.md +3 -3
  71. package/dist/docs/reference/geometry/ArcCurve3.md +3 -3
  72. package/dist/docs/reference/geometry/AttachOptions.md +4 -9
  73. package/dist/docs/reference/geometry/Bounds2-type.md +9 -30
  74. package/dist/docs/reference/geometry/Bounds2Data.md +2 -19
  75. package/dist/docs/reference/geometry/Bounds2Input.md +2 -10
  76. package/dist/docs/reference/geometry/Bounds2Options.md +2 -6
  77. package/dist/docs/reference/geometry/Bounds3-type.md +9 -30
  78. package/dist/docs/reference/geometry/Bounds3Data.md +2 -15
  79. package/dist/docs/reference/geometry/Bounds3Input.md +2 -10
  80. package/dist/docs/reference/geometry/Bounds3Options.md +2 -6
  81. package/dist/docs/reference/geometry/BoundsFit2.md +2 -2
  82. package/dist/docs/reference/geometry/BoundsFit3.md +2 -2
  83. package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -2
  84. package/dist/docs/reference/geometry/BoxAnchorFace.md +3 -3
  85. package/dist/docs/reference/geometry/BoxAnchorOptions.md +3 -3
  86. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +3 -7
  87. package/dist/docs/reference/geometry/CircleContourOptions.md +3 -7
  88. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +3 -12
  89. package/dist/docs/reference/geometry/CircularResolutionOptions.md +2 -2
  90. package/dist/docs/reference/geometry/CircularSampling.md +2 -2
  91. package/dist/docs/reference/geometry/CircularSamplingOptions.md +2 -2
  92. package/dist/docs/reference/geometry/Contour.md +4 -9
  93. package/dist/docs/reference/geometry/ContourCurve.md +3 -3
  94. package/dist/docs/reference/geometry/ContourPoint.md +3 -3
  95. package/dist/docs/reference/geometry/ContourSegment.md +3 -3
  96. package/dist/docs/reference/geometry/CorrespondingComponent.md +3 -7
  97. package/dist/docs/reference/geometry/CorrespondingContour.md +3 -7
  98. package/dist/docs/reference/geometry/CorrespondingProfile.md +3 -7
  99. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +4 -8
  100. package/dist/docs/reference/geometry/CubicBezierCurve2.md +3 -3
  101. package/dist/docs/reference/geometry/CubicBezierCurve3.md +3 -3
  102. package/dist/docs/reference/geometry/Curve2.md +3 -3
  103. package/dist/docs/reference/geometry/Curve3.md +3 -3
  104. package/dist/docs/reference/geometry/CurveSamplingOptions.md +3 -11
  105. package/dist/docs/reference/geometry/CylinderAnchorFace.md +3 -3
  106. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +4 -4
  107. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +2 -2
  108. package/dist/docs/reference/geometry/EdgeTreatment.md +2 -6
  109. package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -7
  110. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -18
  111. package/dist/docs/reference/geometry/FittedTextLayout.md +2 -2
  112. package/dist/docs/reference/geometry/{Frame3.md → Frame3-type.md} +4 -11
  113. package/dist/docs/reference/geometry/Frame3Options.md +69 -0
  114. package/dist/docs/reference/geometry/GeometryError.md +2 -6
  115. package/dist/docs/reference/geometry/GeometryErrorCode.md +2 -6
  116. package/dist/docs/reference/geometry/GeometryErrorContext.md +2 -6
  117. package/dist/docs/reference/geometry/GeometryResolution.md +2 -10
  118. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +3 -11
  119. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +3 -11
  120. package/dist/docs/reference/geometry/GridPatternOptions.md +7 -9
  121. package/dist/docs/reference/geometry/ImmutableBuffer-type.md +2 -10
  122. package/dist/docs/reference/geometry/LineCurve2.md +3 -3
  123. package/dist/docs/reference/geometry/LineCurve3.md +3 -3
  124. package/dist/docs/reference/geometry/LinearPatternOptions.md +2 -6
  125. package/dist/docs/reference/geometry/LoftPlacement.md +13 -21
  126. package/dist/docs/reference/geometry/MatchProfilesOptions.md +3 -7
  127. package/dist/docs/reference/geometry/ModelingLimits.md +2 -14
  128. package/dist/docs/reference/geometry/NumericArray.md +2 -10
  129. package/dist/docs/reference/geometry/Path2-type.md +153 -12
  130. package/dist/docs/reference/geometry/Path2Data.md +3 -11
  131. package/dist/docs/reference/geometry/Path2Input.md +3 -11
  132. package/dist/docs/reference/geometry/Path3-type.md +153 -12
  133. package/dist/docs/reference/geometry/Path3Data.md +3 -11
  134. package/dist/docs/reference/geometry/Path3Input.md +3 -11
  135. package/dist/docs/reference/geometry/PathFrame.md +3 -3
  136. package/dist/docs/reference/geometry/PathLocation.md +3 -11
  137. package/dist/docs/reference/geometry/PathNormalGuide.md +4 -12
  138. package/dist/docs/reference/geometry/PathOptions.md +3 -7
  139. package/dist/docs/reference/geometry/PathPatternOptions.md +3 -7
  140. package/dist/docs/reference/geometry/PathPlacement.md +5 -5
  141. package/dist/docs/reference/geometry/PathResamplingOptions.md +3 -11
  142. package/dist/docs/reference/geometry/PathStation.md +87 -0
  143. package/dist/docs/reference/geometry/PathSubdivisionOptions.md +44 -0
  144. package/dist/docs/reference/geometry/Pivot2Options.md +3 -11
  145. package/dist/docs/reference/geometry/Pivot3Options.md +3 -11
  146. package/dist/docs/reference/geometry/PolygonData.md +4 -8
  147. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +3 -3
  148. package/dist/docs/reference/geometry/Profile.md +3 -4
  149. package/dist/docs/reference/geometry/ProfileComponent2.md +3 -7
  150. package/dist/docs/reference/geometry/ProfileContour2.md +3 -7
  151. package/dist/docs/reference/geometry/ProfileSpan2.md +3 -7
  152. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +5 -8
  153. package/dist/docs/reference/geometry/RadialPatternOptions.md +2 -6
  154. package/dist/docs/reference/geometry/RadialSizing.md +2 -6
  155. package/dist/docs/reference/geometry/RadialSizingOptions.md +2 -6
  156. package/dist/docs/reference/geometry/RectangleContourOptions.md +4 -7
  157. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +3 -7
  158. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +3 -7
  159. package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
  160. package/dist/docs/reference/geometry/RegionData.md +3 -7
  161. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
  162. package/dist/docs/reference/geometry/ResolvedGeometryResolution.md +71 -0
  163. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +2 -2
  164. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +2 -6
  165. package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -2
  166. package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
  167. package/dist/docs/reference/geometry/SampleHelixOptions.md +3 -3
  168. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
  169. package/dist/docs/reference/geometry/SampledCurve2.md +3 -3
  170. package/dist/docs/reference/geometry/SampledCurve3.md +3 -3
  171. package/dist/docs/reference/geometry/SideProfileCurve.md +3 -3
  172. package/dist/docs/reference/geometry/SideProfilePoint.md +3 -3
  173. package/dist/docs/reference/geometry/SideProfileSegment.md +3 -3
  174. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +2 -6
  175. package/dist/docs/reference/geometry/SplineOptions.md +69 -0
  176. package/dist/docs/reference/geometry/StarContourOptions.md +7 -7
  177. package/dist/docs/reference/geometry/StrokeCap.md +2 -6
  178. package/dist/docs/reference/geometry/StrokeJoin.md +2 -6
  179. package/dist/docs/reference/geometry/StrokeOptions.md +3 -7
  180. package/dist/docs/reference/geometry/SvgImportOptions.md +4 -4
  181. package/dist/docs/reference/geometry/SvgRegionPreflight.md +2 -2
  182. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +2 -2
  183. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +2 -2
  184. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +2 -2
  185. package/dist/docs/reference/geometry/Transform2-type.md +3 -11
  186. package/dist/docs/reference/geometry/Transform2Data.md +3 -11
  187. package/dist/docs/reference/geometry/Transform2Input.md +3 -11
  188. package/dist/docs/reference/geometry/Transform3-type.md +4 -12
  189. package/dist/docs/reference/geometry/Transform3Data.md +3 -11
  190. package/dist/docs/reference/geometry/Transform3Input.md +6 -13
  191. package/dist/docs/reference/geometry/Vector2-type.md +3 -11
  192. package/dist/docs/reference/geometry/Vector2Data.md +3 -15
  193. package/dist/docs/reference/geometry/Vector2Input.md +3 -11
  194. package/dist/docs/reference/geometry/Vector3-type.md +27 -11
  195. package/dist/docs/reference/geometry/Vector3Data.md +3 -11
  196. package/dist/docs/reference/geometry/Vector3Input.md +3 -11
  197. package/dist/docs/reference/geometry/VectorTextLayout.md +2 -10
  198. package/dist/docs/reference/geometry/VectorTextMetrics.md +3 -11
  199. package/dist/docs/reference/geometry/anchor3.md +17 -26
  200. package/dist/docs/reference/geometry/anchorFrame3.md +6 -6
  201. package/dist/docs/reference/geometry/attachmentTransform3.md +8 -8
  202. package/dist/docs/reference/geometry/bounds2.md +6 -8
  203. package/dist/docs/reference/geometry/bounds3.md +4 -6
  204. package/dist/docs/reference/geometry/boundsCenter.md +2 -2
  205. package/dist/docs/reference/geometry/boundsSize.md +2 -2
  206. package/dist/docs/reference/geometry/boxAnchor3.md +3 -3
  207. package/dist/docs/reference/geometry/categories/bounds-layout.md +9 -3
  208. package/dist/docs/reference/geometry/categories/curves-paths.md +24 -13
  209. package/dist/docs/reference/geometry/categories/immutable-data.md +40 -0
  210. package/dist/docs/reference/geometry/categories/pattern-placement.md +10 -4
  211. package/dist/docs/reference/geometry/categories/primitive-options.md +8 -13
  212. package/dist/docs/reference/geometry/categories/profiles-regions.md +11 -5
  213. package/dist/docs/reference/geometry/categories/resolution-errors.md +8 -1
  214. package/dist/docs/reference/geometry/categories/transforms-math.md +20 -51
  215. package/dist/docs/reference/geometry/categories/vector-import.md +7 -4
  216. package/dist/docs/reference/geometry/circleContour.md +3 -3
  217. package/dist/docs/reference/geometry/closeToAxis.md +7 -3
  218. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +9 -6
  219. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +13 -6
  220. package/dist/docs/reference/geometry/contourContainsPoint.md +7 -3
  221. package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
  222. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +3 -3
  223. package/dist/docs/reference/geometry/distributeAlongPath.md +16 -11
  224. package/dist/docs/reference/geometry/ellipseContour.md +3 -3
  225. package/dist/docs/reference/geometry/fitBounds.md +10 -2
  226. package/dist/docs/reference/geometry/fitTextLayout.md +5 -5
  227. package/dist/docs/reference/geometry/frame3.md +66 -0
  228. package/dist/docs/reference/geometry/gridPatternTransforms.md +6 -6
  229. package/dist/docs/reference/geometry/immutableBuffer.md +5 -7
  230. package/dist/docs/reference/geometry/isGeometryError.md +2 -6
  231. package/dist/docs/reference/geometry/layoutRow.md +4 -2
  232. package/dist/docs/reference/geometry/linearPatternTransforms.md +6 -6
  233. package/dist/docs/reference/geometry/matchProfiles.md +5 -3
  234. package/dist/docs/reference/geometry/normalizeContour.md +8 -4
  235. package/dist/docs/reference/geometry/normalizePolygon.md +5 -3
  236. package/dist/docs/reference/geometry/normalizeRegion.md +5 -3
  237. package/dist/docs/reference/geometry/path2.md +7 -7
  238. package/dist/docs/reference/geometry/path3.md +7 -7
  239. package/dist/docs/reference/geometry/pathPatternTransforms.md +12 -8
  240. package/dist/docs/reference/geometry/preflightSvgRegion.md +5 -5
  241. package/dist/docs/reference/geometry/radialPatternTransforms.md +5 -5
  242. package/dist/docs/reference/geometry/rectangleContour.md +3 -3
  243. package/dist/docs/reference/geometry/rectangleProfile.md +3 -4
  244. package/dist/docs/reference/geometry/regionArea.md +3 -3
  245. package/dist/docs/reference/geometry/regionBounds.md +6 -4
  246. package/dist/docs/reference/geometry/regularPolygonContour.md +3 -3
  247. package/dist/docs/reference/geometry/resamplePolyline2.md +7 -3
  248. package/dist/docs/reference/geometry/resamplePolyline3.md +7 -3
  249. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +5 -5
  250. package/dist/docs/reference/geometry/resolveArcSegments.md +8 -6
  251. package/dist/docs/reference/geometry/resolveCircularSampling.md +2 -2
  252. package/dist/docs/reference/geometry/resolveCircularSegments.md +5 -3
  253. package/dist/docs/reference/geometry/{resolveExtrusionDivisions.md → resolveExtrusionSlices.md} +16 -15
  254. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -3
  255. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +3 -3
  256. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -5
  257. package/dist/docs/reference/geometry/sampleContour.md +5 -5
  258. package/dist/docs/reference/geometry/sampleCurve2.md +7 -3
  259. package/dist/docs/reference/geometry/sampleCurve3.md +7 -3
  260. package/dist/docs/reference/geometry/sampleHelix.md +3 -3
  261. package/dist/docs/reference/geometry/sampleSideProfile.md +5 -5
  262. package/dist/docs/reference/geometry/sampleTextContours.md +3 -3
  263. package/dist/docs/reference/geometry/signedContourArea.md +5 -3
  264. package/dist/docs/reference/geometry/spline2.md +68 -0
  265. package/dist/docs/reference/geometry/spline3.md +62 -0
  266. package/dist/docs/reference/geometry/starContour.md +3 -3
  267. package/dist/docs/reference/geometry/strokeRegionData.md +8 -5
  268. package/dist/docs/reference/geometry/transform2.md +5 -7
  269. package/dist/docs/reference/geometry/transform3.md +23 -10
  270. package/dist/docs/reference/geometry/transformRegionData.md +7 -3
  271. package/dist/docs/reference/geometry/triangulateContour.md +6 -4
  272. package/dist/docs/reference/geometry/vector2.md +6 -8
  273. package/dist/docs/reference/geometry/vector3.md +8 -8
  274. package/dist/docs/reference/geometry.md +13 -18
  275. package/dist/docs/reference/{geometry → math}/AxisAngleRotation3.md +4 -5
  276. package/dist/docs/reference/math/IDENTITY_TRANSFORM3.md +20 -0
  277. package/dist/docs/reference/math/add2.md +38 -0
  278. package/dist/docs/reference/math/add3.md +46 -0
  279. package/dist/docs/reference/math/applyTransformDirection3.md +46 -0
  280. package/dist/docs/reference/math/applyTransformPoint3.md +44 -0
  281. package/dist/docs/reference/math/categories/tuple-matrix.md +67 -0
  282. package/dist/docs/reference/math/cross2.md +38 -0
  283. package/dist/docs/reference/math/cross3.md +44 -0
  284. package/dist/docs/reference/math/distance2.md +38 -0
  285. package/dist/docs/reference/math/distance3.md +38 -0
  286. package/dist/docs/reference/math/dot2.md +38 -0
  287. package/dist/docs/reference/math/dot3.md +44 -0
  288. package/dist/docs/reference/math/eulerTransform3.md +43 -0
  289. package/dist/docs/reference/math/inverseTransform3.md +36 -0
  290. package/dist/docs/reference/math/length2.md +32 -0
  291. package/dist/docs/reference/math/length3.md +32 -0
  292. package/dist/docs/reference/math/lerp2.md +46 -0
  293. package/dist/docs/reference/math/lerp3.md +46 -0
  294. package/dist/docs/reference/math/multiplyTransform3.md +46 -0
  295. package/dist/docs/reference/math/normalize2.md +45 -0
  296. package/dist/docs/reference/math/normalize3.md +45 -0
  297. package/dist/docs/reference/math/projectOntoPlane3.md +40 -0
  298. package/dist/docs/reference/math/rotate2.md +40 -0
  299. package/dist/docs/reference/math/rotationTransform3.md +56 -0
  300. package/dist/docs/reference/math/scale2.md +38 -0
  301. package/dist/docs/reference/math/scale3.md +44 -0
  302. package/dist/docs/reference/math/scaleTransform3.md +39 -0
  303. package/dist/docs/reference/math/subtract2.md +38 -0
  304. package/dist/docs/reference/math/subtract3.md +44 -0
  305. package/dist/docs/reference/math/transformDeterminant3.md +38 -0
  306. package/dist/docs/reference/math/translationTransform3.md +36 -0
  307. package/dist/docs/reference/math/validateRigidTransform3.md +38 -0
  308. package/dist/docs/reference/math/validateTransform3.md +48 -0
  309. package/dist/docs/reference/math.md +22 -0
  310. package/dist/docs/reference/{geometry → mechanical}/AcmeThreadProfileSpec.md +4 -13
  311. package/dist/docs/reference/{geometry → mechanical}/Bevel.md +3 -11
  312. package/dist/docs/reference/{geometry → mechanical}/BevelSize.md +3 -11
  313. package/dist/docs/reference/{geometry → mechanical}/ButtressPressureFlankSide.md +3 -11
  314. package/dist/docs/reference/{geometry → mechanical}/ButtressThreadProfileSpec.md +4 -13
  315. package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleDimensions.md +3 -3
  316. package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleFit.md +3 -3
  317. package/dist/docs/reference/{geometry → mechanical}/CompensatedThreadDiameters.md +3 -3
  318. package/dist/docs/reference/{geometry → mechanical}/CustomThreadProfileSpec.md +5 -15
  319. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearDimensions.md +3 -3
  320. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearMeshKind.md +3 -3
  321. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearOutlineOptions.md +5 -10
  322. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairDimensions.md +3 -3
  323. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionOptions.md +3 -3
  324. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionReport.md +3 -3
  325. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairSpec.md +3 -3
  326. package/dist/docs/reference/{geometry → mechanical}/CylindricalGearSpec.md +3 -3
  327. package/dist/docs/reference/{geometry → mechanical}/InternalThreadCutterOptions.md +6 -13
  328. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeBaseSpec.md +3 -7
  329. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeDimensions.md +4 -5
  330. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeInterval.md +3 -3
  331. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSamplingOptions.md +5 -14
  332. package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSpec.md +3 -7
  333. package/dist/docs/reference/{geometry → mechanical}/METRIC_FASTENER_STANDARDS.md +3 -3
  334. package/dist/docs/reference/{geometry → mechanical}/MetricFastenerSize.md +3 -3
  335. package/dist/docs/reference/{geometry → mechanical}/MetricFastenerStandard.md +3 -3
  336. package/dist/docs/reference/{geometry → mechanical}/MetricHexNutDimensions.md +3 -3
  337. package/dist/docs/reference/{geometry → mechanical}/MetricSocketCapHeadDimensions.md +3 -3
  338. package/dist/docs/reference/{geometry → mechanical}/PRINTABLE_THREAD_FIT_POLICIES.md +3 -3
  339. package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFit.md +3 -7
  340. package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFitPolicy.md +3 -7
  341. package/dist/docs/reference/{geometry → mechanical}/RackPitchDimensions.md +3 -3
  342. package/dist/docs/reference/{geometry → mechanical}/RackPitchSpec.md +3 -3
  343. package/dist/docs/reference/{geometry → mechanical}/SampledThreadHelices.md +4 -8
  344. package/dist/docs/reference/{geometry → mechanical}/SquareThreadProfileSpec.md +4 -13
  345. package/dist/docs/reference/{geometry → mechanical}/ThreadBevelOptions.md +3 -7
  346. package/dist/docs/reference/{geometry → mechanical}/ThreadCircularSegmentsOptions.md +5 -7
  347. package/dist/docs/reference/{geometry → mechanical}/ThreadCompensationOptions.md +4 -5
  348. package/dist/docs/reference/{geometry → mechanical}/ThreadEndStyle.md +3 -11
  349. package/dist/docs/reference/{geometry → mechanical}/ThreadEndTreatmentOptions.md +3 -11
  350. package/dist/docs/reference/{geometry → mechanical}/ThreadHandedness.md +3 -11
  351. package/dist/docs/reference/{geometry → mechanical}/ThreadHelixOptions.md +5 -7
  352. package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInEnvelope.md +3 -11
  353. package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInShape.md +3 -11
  354. package/dist/docs/reference/{geometry → mechanical}/ThreadProfile-type.md +5 -17
  355. package/dist/docs/reference/{geometry → mechanical}/ThreadProfileBaseSpec.md +4 -13
  356. package/dist/docs/reference/{geometry → mechanical}/ThreadProfileSpec.md +3 -11
  357. package/dist/docs/reference/{geometry → mechanical}/ThreadRidgeOptions.md +7 -18
  358. package/dist/docs/reference/{geometry → mechanical}/ThreadRole.md +3 -3
  359. package/dist/docs/reference/{geometry → mechanical}/ThreadSolidOptions.md +8 -15
  360. package/dist/docs/reference/{geometry → mechanical}/ThreadSolidPreflight.md +3 -11
  361. package/dist/docs/reference/{geometry → mechanical}/ThreadedNutOptions.md +7 -14
  362. package/dist/docs/reference/{geometry → mechanical}/ThreadedNutPreflight.md +3 -7
  363. package/dist/docs/reference/{geometry → mechanical}/ThreadedNutShape.md +3 -7
  364. package/dist/docs/reference/{geometry → mechanical}/ThreadedRodOptions.md +6 -13
  365. package/dist/docs/reference/{geometry → mechanical}/TrapezoidalThreadProfileSpec.md +4 -13
  366. package/dist/docs/reference/{geometry → mechanical}/TriangularThreadProfileSpec.md +4 -13
  367. package/dist/docs/reference/{geometry → mechanical}/categories/mechanical.md +8 -2
  368. package/dist/docs/reference/{geometry → mechanical}/compensateThreadDiameters.md +4 -4
  369. package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileAxially.md +12 -6
  370. package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileForFaceting.md +13 -3
  371. package/dist/docs/reference/{geometry → mechanical}/getMetricClearanceHoleDiameter.md +3 -3
  372. package/dist/docs/reference/{geometry → mechanical}/getMetricFastenerStandard.md +3 -3
  373. package/dist/docs/reference/{geometry → mechanical}/measureInternalCylindricalGearPairMotion.md +9 -7
  374. package/dist/docs/reference/{geometry → mechanical}/minimumCylindricalGearToothCountWithoutUndercut.md +5 -3
  375. package/dist/docs/reference/{geometry → mechanical}/preflightInternalThreadCutter.md +8 -6
  376. package/dist/docs/reference/{geometry → mechanical}/preflightThreadedNut.md +9 -7
  377. package/dist/docs/reference/{geometry → mechanical}/preflightThreadedRod.md +8 -6
  378. package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGear.md +5 -3
  379. package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGearPair.md +5 -3
  380. package/dist/docs/reference/{geometry → mechanical}/resolveKnuckleHinge.md +9 -7
  381. package/dist/docs/reference/{geometry → mechanical}/resolvePrintableThreadFitPolicy.md +5 -3
  382. package/dist/docs/reference/{geometry → mechanical}/resolveRackPitch.md +5 -3
  383. package/dist/docs/reference/{geometry → mechanical}/resolveThreadCircularSegments.md +7 -5
  384. package/dist/docs/reference/{geometry → mechanical}/sampleCylindricalGearOutline.md +9 -8
  385. package/dist/docs/reference/{geometry → mechanical}/sampleInternalCylindricalGearSpaceOutline.md +9 -8
  386. package/dist/docs/reference/{geometry → mechanical}/sampleRackToothPath.md +10 -8
  387. package/dist/docs/reference/{geometry → mechanical}/sampleThreadHelices.md +8 -6
  388. package/dist/docs/reference/{geometry → mechanical}/threadProfile.md +7 -3
  389. package/dist/docs/reference/mechanical.md +19 -0
  390. package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +128 -0
  391. package/dist/docs/reference/{geometry → mesh}/HeightfieldMeshLimits.md +5 -13
  392. package/dist/docs/reference/{geometry → mesh}/HeightfieldPreflight.md +3 -7
  393. package/dist/docs/reference/{geometry → mesh}/ImmutableTriangleMesh.md +5 -17
  394. package/dist/docs/reference/mesh/LoftMeshStation.md +32 -0
  395. package/dist/docs/reference/mesh/MeshRenderOptions.md +3 -3
  396. package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationFallbackReason.md +4 -8
  397. package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationOptions.md +4 -9
  398. package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationResult.md +4 -8
  399. package/dist/docs/reference/{geometry → mesh}/PlanarPatchQuality.md +4 -12
  400. package/dist/docs/reference/mesh/RenderMesh.md +19 -19
  401. package/dist/docs/reference/{geometry → mesh}/SolidMeshValidationOptions.md +4 -12
  402. package/dist/docs/reference/{geometry → mesh}/TriangleMesh.md +8 -12
  403. package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysis.md +5 -14
  404. package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysisOptions.md +4 -9
  405. package/dist/docs/reference/{geometry → mesh}/TriangleMeshInput.md +3 -7
  406. package/dist/docs/reference/{geometry → mesh}/TriangleMeshMeasurements.md +5 -14
  407. package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityOptions.md +4 -9
  408. package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityReport.md +3 -7
  409. package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignature.md +4 -9
  410. package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureOptions.md +3 -7
  411. package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureTolerances.md +3 -7
  412. package/dist/docs/reference/{geometry → mesh}/TriangleMeshTopologyAnalysis.md +5 -14
  413. package/dist/docs/reference/{geometry → mesh}/TriangleMeshValidationOptions.md +4 -9
  414. package/dist/docs/reference/mesh/analyze.md +26 -18
  415. package/dist/docs/reference/mesh/analyzeQuality.md +12 -12
  416. package/dist/docs/reference/mesh/bounds.md +5 -6
  417. package/dist/docs/reference/mesh/categories/operations.md +37 -4
  418. package/dist/docs/reference/mesh/centroid.md +5 -6
  419. package/dist/docs/reference/mesh/extrude.md +21 -20
  420. package/dist/docs/reference/mesh/heightfield.md +8 -8
  421. package/dist/docs/reference/mesh/immutable.md +7 -5
  422. package/dist/docs/reference/mesh/join.md +7 -7
  423. package/dist/docs/reference/mesh/loft.md +19 -18
  424. package/dist/docs/reference/mesh/optimizePlanarPatches.md +21 -21
  425. package/dist/docs/reference/mesh/preflightHeightfield.md +8 -8
  426. package/dist/docs/reference/mesh/preflightThreadSolid.md +22 -25
  427. package/dist/docs/reference/mesh/render.md +7 -5
  428. package/dist/docs/reference/mesh/reverse.md +7 -7
  429. package/dist/docs/reference/mesh/revolve.md +12 -14
  430. package/dist/docs/reference/mesh/signature.md +12 -12
  431. package/dist/docs/reference/mesh/sweep.md +96 -25
  432. package/dist/docs/reference/mesh/threadRidge.md +19 -18
  433. package/dist/docs/reference/mesh/threadSolid.md +23 -22
  434. package/dist/docs/reference/mesh/transform.md +8 -9
  435. package/dist/docs/reference/mesh/validate.md +11 -11
  436. package/dist/docs/reference/mesh/validateSolid.md +10 -10
  437. package/dist/docs/reference/mesh.md +8 -2
  438. package/dist/docs/reference/model/BoxEdge.md +23 -0
  439. package/dist/docs/reference/model/BoxEdgeSelection.md +27 -0
  440. package/dist/docs/reference/model/BoxEdgeTreatments.md +27 -0
  441. package/dist/docs/reference/{geometry → model}/BoxOptions.md +12 -12
  442. package/dist/docs/reference/model/CircleOptions.md +4 -5
  443. package/dist/docs/reference/model/CornerCutterOptions.md +93 -0
  444. package/dist/docs/reference/model/CornerCutterTreatment.md +53 -0
  445. package/dist/docs/reference/model/{HoleCutterOverrun.md → CutterOverrun.md} +8 -7
  446. package/dist/docs/reference/model/CylinderOptions.md +64 -0
  447. package/dist/docs/reference/model/DiagnosticOptions.md +2 -2
  448. package/dist/docs/reference/model/EdgeCutterOptions.md +129 -0
  449. package/dist/docs/reference/model/EllipseOptions.md +4 -5
  450. package/dist/docs/reference/model/EndTreatments.md +43 -0
  451. package/dist/docs/reference/model/ExtrudeOptions.md +153 -0
  452. package/dist/docs/reference/model/GenerateCallback.md +2 -2
  453. package/dist/docs/reference/model/GenerateContext.md +27 -3
  454. package/dist/docs/reference/model/GenerationDiagnostic.md +2 -2
  455. package/dist/docs/reference/model/GenerationError.md +2 -2
  456. package/dist/docs/reference/{geometry → model}/HeightfieldOptions.md +5 -23
  457. package/dist/docs/reference/model/HoleCutterOpening.md +27 -0
  458. package/dist/docs/reference/model/HoleCutterOptions.md +9 -22
  459. package/dist/docs/reference/model/HoleCutterRecess.md +5 -4
  460. package/dist/docs/reference/model/HullOptions.md +2 -3
  461. package/dist/docs/reference/model/ImmutableValue.md +2 -2
  462. package/dist/docs/reference/model/ImplicitOptions.md +3 -9
  463. package/dist/docs/reference/model/JoinOptions.md +2 -5
  464. package/dist/docs/reference/model/JoinTransition.md +2 -2
  465. package/dist/docs/reference/model/KnuckleHinge-type.md +2 -3
  466. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +2 -2
  467. package/dist/docs/reference/model/KnuckleHingeOptions.md +3 -5
  468. package/dist/docs/reference/model/KnuckleHingeWeb.md +2 -2
  469. package/dist/docs/reference/{geometry → model}/LoftCorrespondence.md +8 -11
  470. package/dist/docs/reference/{geometry → model}/LoftOptions.md +11 -16
  471. package/dist/docs/reference/model/LoftStation.md +4 -5
  472. package/dist/docs/reference/model/Memo.md +2 -2
  473. package/dist/docs/reference/model/ModelProgram.md +2 -2
  474. package/dist/docs/reference/model/PartDeclaration.md +4 -5
  475. package/dist/docs/reference/model/PartGeometry.md +3 -5
  476. package/dist/docs/reference/model/PartOptions.md +4 -5
  477. package/dist/docs/reference/model/PatternSource.md +4 -4
  478. package/dist/docs/reference/model/PlaneOptions.md +3 -7
  479. package/dist/docs/reference/model/PolygonOptions.md +2 -7
  480. package/dist/docs/reference/model/PrimitiveAttachment.md +50 -0
  481. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +111 -0
  482. package/dist/docs/reference/model/RectangleOptions.md +21 -26
  483. package/dist/docs/reference/model/RegularPolygonOptions.md +4 -37
  484. package/dist/docs/reference/{geometry → model}/RevolveOptions.md +15 -24
  485. package/dist/docs/reference/model/Section.md +115 -53
  486. package/dist/docs/reference/model/SectionHullOptions.md +2 -3
  487. package/dist/docs/reference/model/SectionInspection.md +2 -6
  488. package/dist/docs/reference/model/SectionOffsetJoin.md +2 -2
  489. package/dist/docs/reference/model/SectionOffsetOptions.md +2 -3
  490. package/dist/docs/reference/model/Solid.md +24 -12
  491. package/dist/docs/reference/model/SolidInspection.md +2 -6
  492. package/dist/docs/reference/model/SolidSegmentHit.md +2 -6
  493. package/dist/docs/reference/model/SphereOptions.md +27 -0
  494. package/dist/docs/reference/model/StarOptions.md +21 -23
  495. package/dist/docs/reference/model/SvgOrigin.md +2 -2
  496. package/dist/docs/reference/model/SvgPathSectionOptions.md +3 -5
  497. package/dist/docs/reference/model/SvgSectionOptions.md +3 -6
  498. package/dist/docs/reference/model/SweepOptions.md +109 -0
  499. package/dist/docs/reference/model/SweepOrientation.md +119 -0
  500. package/dist/docs/reference/model/SweepTransformOptions.md +105 -0
  501. package/dist/docs/reference/model/TextSectionOptions.md +2 -7
  502. package/dist/docs/reference/{geometry → model}/TorusOptions.md +11 -10
  503. package/dist/docs/reference/model/TubeOptions.md +84 -0
  504. package/dist/docs/reference/model/box.md +11 -10
  505. package/dist/docs/reference/model/categories/boolean-operations.md +9 -3
  506. package/dist/docs/reference/model/categories/bounded-surfaces.md +13 -1
  507. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +26 -7
  508. package/dist/docs/reference/model/categories/generation.md +11 -3
  509. package/dist/docs/reference/model/categories/hinges.md +7 -1
  510. package/dist/docs/reference/model/categories/mesh-inspection.md +7 -1
  511. package/dist/docs/reference/model/categories/primitives.md +34 -6
  512. package/dist/docs/reference/model/categories/sections.md +8 -2
  513. package/dist/docs/reference/model/categories/threads.md +8 -5
  514. package/dist/docs/reference/model/categories/transforms-placement.md +15 -10
  515. package/dist/docs/reference/model/circle.md +7 -3
  516. package/dist/docs/reference/model/cornerCutter.md +88 -0
  517. package/dist/docs/reference/model/cylinder.md +6 -5
  518. package/dist/docs/reference/model/edgeCutter.md +91 -0
  519. package/dist/docs/reference/model/ellipse.md +7 -3
  520. package/dist/docs/reference/model/extrude.md +29 -23
  521. package/dist/docs/reference/model/generate.md +4 -2
  522. package/dist/docs/reference/model/gridPattern.md +11 -4
  523. package/dist/docs/reference/model/heightfield.md +5 -5
  524. package/dist/docs/reference/model/holeCutter.md +26 -12
  525. package/dist/docs/reference/model/hull.md +2 -2
  526. package/dist/docs/reference/model/implicit.md +3 -3
  527. package/dist/docs/reference/model/internalThreadCutter.md +32 -21
  528. package/dist/docs/reference/model/intersect.md +7 -3
  529. package/dist/docs/reference/model/join.md +6 -2
  530. package/dist/docs/reference/model/knuckleHinge.md +2 -3
  531. package/dist/docs/reference/model/linearPattern.md +11 -4
  532. package/dist/docs/reference/model/loft.md +28 -24
  533. package/dist/docs/reference/model/minkowskiSum.md +3 -3
  534. package/dist/docs/reference/model/pathPattern.md +17 -8
  535. package/dist/docs/reference/model/polygon.md +8 -3
  536. package/dist/docs/reference/model/radialPattern.md +11 -4
  537. package/dist/docs/reference/model/rectangle.md +11 -7
  538. package/dist/docs/reference/model/regularPolygon.md +7 -3
  539. package/dist/docs/reference/model/revolve.md +18 -12
  540. package/dist/docs/reference/model/solidFromMesh.md +10 -6
  541. package/dist/docs/reference/model/sphere.md +7 -6
  542. package/dist/docs/reference/model/star.md +11 -7
  543. package/dist/docs/reference/model/stroke.md +12 -8
  544. package/dist/docs/reference/model/svgPathSection.md +10 -4
  545. package/dist/docs/reference/model/svgSection.md +10 -4
  546. package/dist/docs/reference/model/sweep.md +102 -25
  547. package/dist/docs/reference/model/textSection.md +7 -3
  548. package/dist/docs/reference/model/threadRidge.md +16 -17
  549. package/dist/docs/reference/model/threadedNut.md +25 -22
  550. package/dist/docs/reference/model/threadedRod.md +21 -18
  551. package/dist/docs/reference/model/torus.md +13 -12
  552. package/dist/docs/reference/model/tube.md +6 -5
  553. package/dist/docs/reference/model/union.md +7 -3
  554. package/dist/docs/reference/model.md +10 -5
  555. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +2 -2
  556. package/dist/docs/reference/text/VectorFont.md +38 -34
  557. package/dist/docs/reference/text/VectorFontOptions.md +2 -2
  558. package/dist/docs/reference/{geometry → text}/VectorTextArcBaseline.md +2 -11
  559. package/dist/docs/reference/{geometry → text}/VectorTextLayoutOptions.md +3 -11
  560. package/dist/docs/reference/{geometry → text}/VectorTextOptions.md +2 -10
  561. package/dist/docs/reference/text/categories/font-preparation.md +10 -1
  562. package/dist/docs/reference/text/prepareVectorFont.md +4 -2
  563. package/dist/docs/reference/text.md +7 -1
  564. package/dist/engine/execution.js +5 -3
  565. package/dist/engine/finalization.js +5 -5
  566. package/dist/engine/index.js +9 -4
  567. package/dist/engine/native/adapter.js +1 -1
  568. package/dist/engine/native/construction-mesh.js +15 -5
  569. package/dist/engine/native/context.js +10 -7
  570. package/dist/engine/native/index.js +1 -1
  571. package/dist/engine/native/material-components.js +2 -2
  572. package/dist/engine/native/mesh-observation.js +1 -1
  573. package/dist/engine/native/regions.js +44 -24
  574. package/dist/engine/native/scoped-primitives.js +3 -3
  575. package/dist/engine/native/scoped-threads.js +1 -13
  576. package/dist/engine/native/threads.js +2 -2
  577. package/dist/engine/native/transforms.js +2 -2
  578. package/dist/engine/operations/construction.js +77 -27
  579. package/dist/engine/operations/context.js +13 -6
  580. package/dist/engine/operations/cutters.js +112 -0
  581. package/dist/engine/operations/environment.js +2 -2
  582. package/dist/engine/operations/extrusion-finishing.js +42 -16
  583. package/dist/engine/operations/hole-cutter.js +125 -114
  584. package/dist/engine/operations/join-collar-profile.js +19 -19
  585. package/dist/engine/operations/join.js +86 -73
  586. package/dist/engine/operations/knuckle-hinge.js +25 -20
  587. package/dist/engine/operations/loft.js +9 -16
  588. package/dist/engine/operations/mechanical.js +4 -15
  589. package/dist/engine/operations/primitives/anchors.js +23 -19
  590. package/dist/engine/operations/primitives/construction.js +38 -12
  591. package/dist/engine/operations/primitives/correspondence.js +2 -2
  592. package/dist/engine/operations/primitives/profile-mesh.js +41 -80
  593. package/dist/engine/operations/primitives/profiles.js +5 -5
  594. package/dist/engine/operations/sections.js +8 -8
  595. package/dist/engine/operations/transforms.js +19 -39
  596. package/dist/engine/placement.js +3 -3
  597. package/dist/engine/recipe-realization.js +86 -30
  598. package/dist/engine/session/declarations.js +98 -0
  599. package/dist/engine/session/dependencies.js +81 -28
  600. package/dist/engine/session/graph.js +39 -137
  601. package/dist/engine/session/parameters.js +78 -0
  602. package/dist/engine/session/session.js +2 -2
  603. package/dist/engine/session/snapshot-cache.js +2 -2
  604. package/dist/engine/shape-anchors.js +13 -6
  605. package/dist/export/3mf.js +9 -2
  606. package/dist/export/capture.js +10 -6
  607. package/dist/export/glb.js +7 -2
  608. package/dist/export/stl.js +21 -6
  609. package/dist/geometry/{bounds.js → bounds/operations.js} +3 -1
  610. package/dist/geometry/{bounds-value.js → bounds/value.js} +20 -16
  611. package/dist/geometry/curves/evaluation.js +5 -6
  612. package/dist/geometry/curves/sampling.js +30 -6
  613. package/dist/geometry/{extrusion.js → extrusion/controls.js} +58 -35
  614. package/dist/geometry/extrusion/mesh.js +92 -0
  615. package/dist/geometry/extrusion/stations.js +35 -0
  616. package/dist/geometry/extrusion/twisted-chamfer.js +265 -0
  617. package/dist/geometry/immutable-buffer.js +7 -1
  618. package/dist/geometry/index.js +24 -32
  619. package/dist/geometry/{model-limits.js → limits.js} +1 -1
  620. package/dist/geometry/loft/{loft-correspondence.js → correspondence.js} +31 -20
  621. package/dist/geometry/loft/{loft-geometry.js → geometry.js} +15 -17
  622. package/dist/geometry/loft/mesh.js +53 -0
  623. package/dist/geometry/loft/{loft-options.js → options.js} +13 -11
  624. package/dist/geometry/loft/{loft-simple-mesh.js → simple-mesh.js} +26 -17
  625. package/dist/geometry/math/interpolation.js +9 -0
  626. package/dist/geometry/math/vector-value.js +12 -3
  627. package/dist/geometry/math/vector2.js +18 -5
  628. package/dist/geometry/math/vector3.js +28 -5
  629. package/dist/geometry/math-api.js +4 -0
  630. package/dist/geometry/mechanical/gear-motion.js +7 -5
  631. package/dist/geometry/mechanical/gears.js +21 -4
  632. package/dist/geometry/mechanical/knuckle-hinge.js +7 -5
  633. package/dist/geometry/mechanical/threads/fit.js +8 -2
  634. package/dist/geometry/mechanical/threads/helices.js +4 -2
  635. package/dist/geometry/mechanical/threads/mesh-plan.js +4 -2
  636. package/dist/geometry/mechanical/threads/mesh.js +12 -9
  637. package/dist/geometry/mechanical/threads/profiles.js +18 -4
  638. package/dist/geometry/mechanical/threads/solids.js +11 -2
  639. package/dist/geometry/mechanical-api.js +10 -0
  640. package/dist/geometry/mesh/{mesh-centroid.js → centroid.js} +2 -1
  641. package/dist/geometry/{heightfield.js → mesh/heightfield.js} +9 -5
  642. package/dist/geometry/{join-geometry.js → mesh/join-layers.js} +53 -59
  643. package/dist/geometry/mesh/{mesh.js → operations.js} +11 -18
  644. package/dist/geometry/mesh/{mesh-planar.js → planar.js} +8 -18
  645. package/dist/geometry/mesh/{mesh-quality.js → quality.js} +10 -42
  646. package/dist/geometry/mesh/{mesh-render.js → render-buffers.js} +22 -7
  647. package/dist/geometry/mesh/{mesh-signature.js → signature.js} +1 -1
  648. package/dist/geometry/mesh/{mesh-solid-intersections.js → solid-intersections.js} +2 -0
  649. package/dist/geometry/mesh/{mesh-solid.js → solid.js} +4 -4
  650. package/dist/geometry/mesh/triangle-quality.js +42 -0
  651. package/dist/geometry/mesh/winding.js +11 -0
  652. package/dist/geometry/{numeric.js → mesh/write-vertex.js} +1 -1
  653. package/dist/geometry/mesh-api.js +12 -11
  654. package/dist/geometry/paths/distribution.js +43 -0
  655. package/dist/geometry/paths/editing.js +76 -0
  656. package/dist/geometry/paths/frames.js +16 -11
  657. package/dist/geometry/paths/helix.js +1 -1
  658. package/dist/geometry/paths/resampling.js +46 -61
  659. package/dist/geometry/paths/{planar.js → rounding.js} +8 -67
  660. package/dist/geometry/paths/spline.js +116 -0
  661. package/dist/geometry/paths/traversal.js +107 -0
  662. package/dist/geometry/paths/{path-value.js → value.js} +97 -18
  663. package/dist/geometry/patterns/placements.js +20 -29
  664. package/dist/geometry/{patterns.js → patterns/transforms.js} +11 -7
  665. package/dist/geometry/primitives/cutters.js +70 -0
  666. package/dist/geometry/{cylinder.js → primitives/cylinder.js} +4 -4
  667. package/dist/geometry/{edge-finishing.js → primitives/edges.js} +5 -5
  668. package/dist/geometry/{primitive-resolvers.js → primitives/resolvers.js} +9 -9
  669. package/dist/geometry/primitives/sampling.js +41 -0
  670. package/dist/geometry/profiles/contour.js +19 -7
  671. package/dist/geometry/profiles/{match-profiles.js → matching.js} +9 -6
  672. package/dist/geometry/profiles/primitives/circle.js +1 -1
  673. package/dist/geometry/profiles/primitives/ellipse.js +2 -2
  674. package/dist/geometry/profiles/primitives/rectangle.js +8 -8
  675. package/dist/geometry/profiles/primitives/star.js +1 -1
  676. package/dist/geometry/profiles/side-profile.js +8 -5
  677. package/dist/geometry/profiles/validation.js +1 -1
  678. package/dist/geometry/{polygon-clipping.js → regions/clipping.js} +1 -1
  679. package/dist/geometry/{convex-offset.js → regions/convex-offset.js} +1 -1
  680. package/dist/geometry/{region-offset.js → regions/offset.js} +7 -5
  681. package/dist/geometry/{regions.js → regions/operations.js} +59 -22
  682. package/dist/geometry/{stroke-path.js → regions/stroke.js} +46 -20
  683. package/dist/geometry/{loft/loft-triangulation.js → regions/triangulation.js} +35 -2
  684. package/dist/geometry/revolve/{revolve-mesh.js → mesh.js} +9 -10
  685. package/dist/geometry/{circular-sampling.js → sampling/circular.js} +3 -3
  686. package/dist/geometry/{sampling-limits.js → sampling/limits.js} +6 -2
  687. package/dist/geometry/{resolution.js → sampling/resolution.js} +15 -14
  688. package/dist/geometry/svg/fill.js +4 -3
  689. package/dist/geometry/svg/import.js +47 -64
  690. package/dist/geometry/svg/path.js +3 -3
  691. package/dist/geometry/sweep/closed.js +55 -0
  692. package/dist/geometry/sweep/mesh.js +30 -0
  693. package/dist/geometry/{sweeps/sweep-open.js → sweep/open.js} +9 -24
  694. package/dist/geometry/{sweeps → sweep}/orientation.js +14 -11
  695. package/dist/geometry/sweep/seam.js +30 -0
  696. package/dist/geometry/{sweeps → sweep}/stations.js +75 -10
  697. package/dist/geometry/sweep/transforms.js +30 -0
  698. package/dist/geometry/{sweeps → sweep}/validation.js +4 -4
  699. package/dist/geometry/{text-contours.js → text/contours.js} +3 -3
  700. package/dist/geometry/{text-fitting.js → text/fitting.js} +4 -3
  701. package/dist/geometry/text/layout.js +1 -0
  702. package/dist/geometry/{transform3.js → transforms/affine3.js} +31 -46
  703. package/dist/geometry/{anchors.js → transforms/anchors.js} +43 -24
  704. package/dist/geometry/{transform-geometry.js → transforms/apply.js} +8 -5
  705. package/dist/geometry/{transform2.js → transforms/dimensions.js} +23 -19
  706. package/dist/geometry/transforms/frame.js +64 -0
  707. package/dist/geometry/{transform-matrix.js → transforms/matrix-input.js} +8 -1
  708. package/dist/geometry/{transform-value.js → transforms/value.js} +29 -11
  709. package/dist/index.js +3 -9
  710. package/dist/model/cutters.js +1 -0
  711. package/dist/model/execution-binding.js +3 -3
  712. package/dist/model/generation.js +2 -0
  713. package/dist/model/immutable-generation-data.js +2 -0
  714. package/dist/model/operations.js +130 -94
  715. package/dist/model/recipe-declaration.js +5 -7
  716. package/dist/text/index.js +3 -0
  717. package/dist/text/vector-text-layout.js +1 -0
  718. package/package.json +15 -17
  719. package/dist/api/export-3mf.d.ts +0 -2
  720. package/dist/api/export-glb.d.ts +0 -2
  721. package/dist/api/export-stl.d.ts +0 -2
  722. package/dist/docs/reference/geometry/BoxEdge.md +0 -17
  723. package/dist/docs/reference/geometry/BoxEdgeSelection.md +0 -24
  724. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +0 -25
  725. package/dist/docs/reference/geometry/CylinderOptions.md +0 -63
  726. package/dist/docs/reference/geometry/EndTreatments.md +0 -44
  727. package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +0 -144
  728. package/dist/docs/reference/geometry/ExtrudeOptions.md +0 -156
  729. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +0 -25
  730. package/dist/docs/reference/geometry/LoftMeshStation.md +0 -41
  731. package/dist/docs/reference/geometry/PrimitiveAttachment.md +0 -39
  732. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +0 -114
  733. package/dist/docs/reference/geometry/SphereOptions.md +0 -25
  734. package/dist/docs/reference/geometry/SweepOptions.md +0 -127
  735. package/dist/docs/reference/geometry/SweepOrientation.md +0 -127
  736. package/dist/docs/reference/geometry/TubeOptions.md +0 -72
  737. package/dist/docs/reference/geometry/add2.md +0 -43
  738. package/dist/docs/reference/geometry/add3.md +0 -49
  739. package/dist/docs/reference/geometry/applyTransformDirection3.md +0 -52
  740. package/dist/docs/reference/geometry/applyTransformPoint3.md +0 -50
  741. package/dist/docs/reference/geometry/categories/meshes.md +0 -68
  742. package/dist/docs/reference/geometry/composeTransform3.md +0 -51
  743. package/dist/docs/reference/geometry/cross2.md +0 -43
  744. package/dist/docs/reference/geometry/cross3.md +0 -49
  745. package/dist/docs/reference/geometry/distance2.md +0 -43
  746. package/dist/docs/reference/geometry/distance3.md +0 -43
  747. package/dist/docs/reference/geometry/dot2.md +0 -43
  748. package/dist/docs/reference/geometry/dot3.md +0 -49
  749. package/dist/docs/reference/geometry/eulerTransform3.md +0 -49
  750. package/dist/docs/reference/geometry/frameTransform3.md +0 -55
  751. package/dist/docs/reference/geometry/inverseTransform3.md +0 -41
  752. package/dist/docs/reference/geometry/length2.md +0 -37
  753. package/dist/docs/reference/geometry/length3.md +0 -37
  754. package/dist/docs/reference/geometry/lerp2.md +0 -49
  755. package/dist/docs/reference/geometry/lerp3.md +0 -49
  756. package/dist/docs/reference/geometry/normalize2.md +0 -46
  757. package/dist/docs/reference/geometry/normalize3.md +0 -46
  758. package/dist/docs/reference/geometry/projectOntoPlane3.md +0 -43
  759. package/dist/docs/reference/geometry/rotate2.md +0 -43
  760. package/dist/docs/reference/geometry/rotationTransform3.md +0 -60
  761. package/dist/docs/reference/geometry/scale2.md +0 -43
  762. package/dist/docs/reference/geometry/scale3.md +0 -49
  763. package/dist/docs/reference/geometry/scaleTransform3.md +0 -45
  764. package/dist/docs/reference/geometry/subtract2.md +0 -43
  765. package/dist/docs/reference/geometry/subtract3.md +0 -49
  766. package/dist/docs/reference/geometry/transformDeterminant3.md +0 -43
  767. package/dist/docs/reference/geometry/translationTransform3.md +0 -42
  768. package/dist/docs/reference/geometry/validateRigidTransform3.md +0 -41
  769. package/dist/docs/reference/geometry/validateTransform3.md +0 -54
  770. package/dist/docs/reference/model/Profile.md +0 -30
  771. package/dist/docs/reference/model/categories/explicit-profiles.md +0 -21
  772. package/dist/docs/reference/model/matchProfiles.md +0 -48
  773. package/dist/docs/reference/model/preflightInternalThreadCutter.md +0 -93
  774. package/dist/docs/reference/model/preflightThreadedNut.md +0 -109
  775. package/dist/docs/reference/model/preflightThreadedRod.md +0 -93
  776. package/dist/engine/operations/patterns.js +0 -47
  777. package/dist/geometry/loft/loft.js +0 -105
  778. package/dist/geometry/mechanical/index.js +0 -14
  779. package/dist/geometry/primitive-resolution.js +0 -20
  780. package/dist/geometry/svg/index.js +0 -1
  781. package/dist/geometry/sweeps/options.js +0 -29
  782. package/dist/geometry/sweeps/sweep-closed.js +0 -96
  783. package/dist/geometry/sweeps/sweep-mesh.js +0 -32
  784. /package/dist/geometry/mechanical/{standards.js → fastener-standards.js} +0 -0
  785. /package/dist/geometry/mesh/{mesh-edge-table.js → edge-table.js} +0 -0
  786. /package/dist/geometry/mesh/{mesh-types.js → types.js} +0 -0
  787. /package/dist/geometry/mesh/{mesh-view-cache.js → view-cache.js} +0 -0
  788. /package/dist/geometry/{primitive-options.js → primitives/options.js} +0 -0
  789. /package/dist/geometry/{text-layout.js → sweep/options.js} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { immutableMeshView } from "../immutable-buffer.js";
3
3
  import { resolveGeometryTolerance, } from "../tolerance.js";
4
+ import { triangleQuality } from "./triangle-quality.js";
4
5
  const DEFAULT_MAXIMUM_TRIANGLE_COUNT = 200_000;
5
6
  const FLOAT32_EPSILON = 2 ** -23;
6
7
  const MINIMUM_PLANAR_ANGULAR_TOLERANCE = 1e-5;
@@ -10,18 +11,9 @@ const pointAt = (positions, vertex) => [
10
11
  positions[vertex * 3 + 1],
11
12
  positions[vertex * 3 + 2],
12
13
  ];
13
- const subtract = (left, right) => [
14
- left[0] - right[0],
15
- left[1] - right[1],
16
- left[2] - right[2],
17
- ];
14
+ // Keep these kernels local to isolate V8's array-type feedback from other modeling operations.
15
+ // Shared helpers see more array representations, which can slow hot loops even when inlined.
18
16
  const dot = (left, right) => left[0] * right[0] + left[1] * right[1] + left[2] * right[2];
19
- const cross = (left, right) => [
20
- left[1] * right[2] - left[2] * right[1],
21
- left[2] * right[0] - left[0] * right[2],
22
- left[0] * right[1] - left[1] * right[0],
23
- ];
24
- const length = (vector) => Math.hypot(vector[0], vector[1], vector[2]);
25
17
  const maximumUint32 = (values) => {
26
18
  let maximum = 0;
27
19
  for (const value of values)
@@ -80,46 +72,22 @@ const meshBoundsAndExtent = (positions) => {
80
72
  extent: Math.max(maximum[0] - minimum[0], maximum[1] - minimum[1], maximum[2] - minimum[2]),
81
73
  };
82
74
  };
83
- const triangleAngles = (first, second, third) => {
84
- const firstSecond = subtract(second, first);
85
- const firstThird = subtract(third, first);
86
- const secondThird = subtract(third, second);
87
- const lengthFirstSecond = length(firstSecond);
88
- const lengthFirstThird = length(firstThird);
89
- const lengthSecondThird = length(secondThird);
90
- if (lengthFirstSecond === 0 || lengthFirstThird === 0 || lengthSecondThird === 0) {
91
- return [0, 0, 0];
92
- }
93
- const thirdFirst = subtract(first, third);
94
- const secondFirst = [-firstSecond[0], -firstSecond[1], -firstSecond[2]];
95
- const thirdSecond = [-secondThird[0], -secondThird[1], -secondThird[2]];
96
- return [
97
- Math.atan2(length(cross(firstSecond, firstThird)), dot(firstSecond, firstThird)),
98
- Math.atan2(length(cross(secondThird, secondFirst)), dot(secondThird, secondFirst)),
99
- Math.atan2(length(cross(thirdFirst, thirdSecond)), dot(thirdFirst, thirdSecond)),
100
- ];
101
- };
102
75
  const faceAnalysis = (positions, vertices, index) => {
103
76
  const first = pointAt(positions, vertices[0]);
104
77
  const second = pointAt(positions, vertices[1]);
105
78
  const third = pointAt(positions, vertices[2]);
106
- const firstSecond = subtract(second, first);
107
- const firstThird = subtract(third, first);
108
- const secondThird = subtract(third, second);
109
- const product = cross(firstSecond, firstThird);
110
- const doubleArea = length(product);
79
+ const quality = triangleQuality(first, second, third, "hypot");
80
+ const { doubleArea } = quality;
111
81
  const area = doubleArea / 2;
112
- const longestEdge = Math.max(length(firstSecond), length(firstThird), length(secondThird));
113
82
  const normal = doubleArea === 0
114
83
  ? undefined
115
- : [product[0] / doubleArea, product[1] / doubleArea, product[2] / doubleArea];
116
- const angles = triangleAngles(first, second, third);
84
+ : [quality.crossX / doubleArea, quality.crossY / doubleArea, quality.crossZ / doubleArea];
117
85
  return {
118
86
  area,
119
- aspectRatio: area === 0 ? Number.POSITIVE_INFINITY : (Math.sqrt(3) * longestEdge ** 2) / (4 * area),
87
+ aspectRatio: quality.aspectRatio,
120
88
  doubleArea,
121
89
  index,
122
- minimumAngleRadians: Math.min(...angles),
90
+ minimumAngleRadians: Math.min(...quality.angles),
123
91
  normal,
124
92
  planeOffset: normal === undefined ? undefined : dot(normal, first),
125
93
  vertices,
@@ -234,7 +202,7 @@ const buildPatchAnalysis = (faces, edges, faceIndices, id) => {
234
202
  },
235
203
  };
236
204
  };
237
- /** @internal */
205
+ /** @internal Builds fresh bounded geometry and topology facts without mutating source buffers. */
238
206
  export function buildTriangleMeshQualityAnalysis(mesh, options = {}) {
239
207
  const source = immutableMeshView(mesh);
240
208
  const maxTriangles = positiveInteger(options.maxTriangles ?? DEFAULT_MAXIMUM_TRIANGLE_COUNT, "Maximum analyzed triangle count");
@@ -389,7 +357,7 @@ export function buildTriangleMeshQualityAnalysis(mesh, options = {}) {
389
357
  * Degenerate triangles are reported rather than rejected, while malformed buffers, non-finite
390
358
  * positions, missing vertex references, and the configured complexity limit throw.
391
359
  *
392
- * @param mesh - Indexed triangle mesh in arbitrary consistent model units.
360
+ * @param mesh - Indexed triangle mesh in consistent units.
393
361
  * @param options - Scale-aware tolerance and analysis budget.
394
362
  * @returns A deterministic report without mutating or copying the mesh.
395
363
  */
@@ -1,7 +1,13 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { immutableMeshView } from "../immutable-buffer.js";
3
- import { validateTriangleMesh } from "./mesh.js";
3
+ import { validateTriangleMesh } from "./operations.js";
4
4
  const MAX_NORMAL_COMPARISONS = 50_000_000;
5
+ // Float32 integer coordinates share low zero bits. Mix high bits before masking a table slot.
6
+ function mixHash(value) {
7
+ value = Math.imul(value ^ (value >>> 16), 0x7feb352d);
8
+ value = Math.imul(value ^ (value >>> 15), 0x846ca68b);
9
+ return value ^ (value >>> 16);
10
+ }
5
11
  function tableCapacity(count) {
6
12
  let capacity = 16;
7
13
  while (capacity < count * 2)
@@ -16,6 +22,8 @@ function tableCapacity(count) {
16
22
  * Returns owned buffers; every triangle retains its coordinates, order and winding.
17
23
  * Pathological vertex fans exceeding 50 million normal comparisons reject with a complexity error.
18
24
  *
25
+ * @param input - Indexed mesh to copy; source buffers remain unchanged.
26
+ *
19
27
  * @example
20
28
  * ```ts
21
29
  * import * as mesh from "@metamesh/modeling/geometry/mesh";
@@ -30,8 +38,15 @@ export function renderMesh(input, options = {}) {
30
38
  throw new GeometryError("INVALID_ARGUMENT", "Crease angle must be from 0 through 180 degrees.", {
31
39
  operation: "renderMesh",
32
40
  });
33
- validateTriangleMesh(input);
34
- const { positions, indices } = immutableMeshView(input);
41
+ const mesh = immutableMeshView(input);
42
+ validateTriangleMesh(mesh);
43
+ return renderValidatedMesh(mesh, angle);
44
+ }
45
+ /**
46
+ * @internal Renders exact privately captured buffer ranges already validated with the default
47
+ * mesh tolerance. The buffers must remain unchanged, and angle must be validated in [0, 180].
48
+ */
49
+ export function renderValidatedMesh({ positions, indices }, angle) {
35
50
  const vertexCount = positions.length / 3;
36
51
  const cornerCount = indices.length;
37
52
  const faceCount = cornerCount / 3;
@@ -67,7 +82,7 @@ export function renderMesh(input, options = {}) {
67
82
  Math.imul(positions[offset + 2] === 0 ? 0 : positionBits[offset + 2], 83_492_791);
68
83
  for (let vertex = 0; vertex < vertexCount; vertex += 1) {
69
84
  const offset = vertex * 3;
70
- let slot = positionHash(offset) & positionMask;
85
+ let slot = mixHash(positionHash(offset)) & positionMask;
71
86
  while (positionTable[slot] !== 0) {
72
87
  const id = positionTable[slot] - 1;
73
88
  const other = representatives[id] * 3;
@@ -153,7 +168,7 @@ export function renderMesh(input, options = {}) {
153
168
  Math.imul(candidateNormal[0] === 0 ? 0 : normalBits[0], 49_979_687) ^
154
169
  Math.imul(candidateNormal[1] === 0 ? 0 : normalBits[1], 67_867_967) ^
155
170
  Math.imul(candidateNormal[2] === 0 ? 0 : normalBits[2], 86_028_121);
156
- let slot = hash & renderMask;
171
+ let slot = mixHash(hash) & renderMask;
157
172
  while (renderTable[slot] !== 0) {
158
173
  const offset = (renderTable[slot] - 1) * 3;
159
174
  if (renderPositions[offset] === positions[positionOffset] &&
@@ -179,12 +194,12 @@ export function renderMesh(input, options = {}) {
179
194
  renderTable = new Uint32Array(tableCapacity(capacity));
180
195
  renderMask = renderTable.length - 1;
181
196
  for (let index = 0; index < renderedCount; index += 1) {
182
- let target = renderHash(index * 3) & renderMask;
197
+ let target = mixHash(renderHash(index * 3)) & renderMask;
183
198
  while (renderTable[target] !== 0)
184
199
  target = (target + 1) & renderMask;
185
200
  renderTable[target] = index + 1;
186
201
  }
187
- slot = hash & renderMask;
202
+ slot = mixHash(hash) & renderMask;
188
203
  while (renderTable[slot] !== 0)
189
204
  slot = (slot + 1) & renderMask;
190
205
  }
@@ -1,6 +1,6 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { immutableMeshView } from "../immutable-buffer.js";
3
- import { analyzeTriangleMesh, validateTriangleMesh } from "./mesh.js";
3
+ import { analyzeTriangleMesh, validateTriangleMesh } from "./operations.js";
4
4
  const DEFAULT_POSITION_TOLERANCE = 1e-5;
5
5
  const DEFAULT_VOLUME_TOLERANCE = 1e-4;
6
6
  const DEFAULT_MAXIMUM_TRIANGLE_COUNT = 200_000;
@@ -1,3 +1,5 @@
1
+ // Keep these kernels local to isolate V8's array-type feedback from other modeling operations.
2
+ // Shared helpers see more array representations, which can slow hot loops even when inlined.
1
3
  const subtract = (a, b) => [
2
4
  a[0] - b[0],
3
5
  a[1] - b[1],
@@ -1,9 +1,9 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { immutableMeshView } from "../immutable-buffer.js";
3
3
  import { resolveGeometryTolerance } from "../tolerance.js";
4
- import { IndexedMeshEdgeTable } from "./mesh-edge-table.js";
5
- import { prepareSolidTriangle, trianglesIntersectBeyondSharedBoundary, triangleSolidAngle, } from "./mesh-solid-intersections.js";
6
- import { analyzeTriangleMesh } from "./mesh.js";
4
+ import { IndexedMeshEdgeTable } from "./edge-table.js";
5
+ import { analyzeTriangleMesh, } from "./operations.js";
6
+ import { prepareSolidTriangle, trianglesIntersectBeyondSharedBoundary, triangleSolidAngle, } from "./solid-intersections.js";
7
7
  const MAXIMUM_TRIANGLES = 200_000;
8
8
  const MAXIMUM_TESTS = 2_000_000;
9
9
  /**
@@ -18,7 +18,7 @@ const MAXIMUM_TESTS = 2_000_000;
18
18
  * Input buffers are freshly inspected and never modified; units are millimetres.
19
19
  *
20
20
  * @param mesh - Closed triangle mesh to inspect.
21
- * @param options - Optional lower work ceiling and numeric comparison policy.
21
+ * @param options - Lower work limit and tolerance for numeric comparisons.
22
22
  * @returns The original mesh after every requested check succeeds.
23
23
  */
24
24
  export function validateSolidMesh(mesh, options = {}) {
@@ -0,0 +1,42 @@
1
+ const magnitude = (x, y, z, calculation) => calculation === "hypot" ? Math.hypot(x, y, z) : Math.sqrt(x * x + y * y + z * z);
2
+ const cornerAngle = (ux, uy, uz, vx, vy, vz, calculation) => Math.atan2(magnitude(uy * vz - uz * vy, uz * vx - ux * vz, ux * vy - uy * vx, calculation), ux * vx + uy * vy + uz * vz);
3
+ /** @internal Shape measurements using the caller's selected length arithmetic and tolerances. */
4
+ export function triangleQuality(first, second, third, calculation) {
5
+ const abx = second[0] - first[0], aby = second[1] - first[1], abz = second[2] - first[2];
6
+ const acx = third[0] - first[0], acy = third[1] - first[1], acz = third[2] - first[2];
7
+ const bcx = third[0] - second[0], bcy = third[1] - second[1], bcz = third[2] - second[2];
8
+ const cax = first[0] - third[0], cay = first[1] - third[1], caz = first[2] - third[2];
9
+ const crossX = aby * acz - abz * acy, crossY = abz * acx - abx * acz, crossZ = abx * acy - aby * acx;
10
+ const doubleArea = magnitude(crossX, crossY, crossZ, calculation);
11
+ let longestEdgeSquared;
12
+ let collapsed = false;
13
+ if (calculation === "hypot") {
14
+ const ab = Math.hypot(abx, aby, abz), ac = Math.hypot(acx, acy, acz), bc = Math.hypot(bcx, bcy, bcz);
15
+ longestEdgeSquared = Math.max(ab, ac, bc) ** 2;
16
+ collapsed = ab === 0 || ac === 0 || bc === 0;
17
+ }
18
+ else {
19
+ longestEdgeSquared = Math.max(abx * abx + aby * aby + abz * abz, bcx * bcx + bcy * bcy + bcz * bcz, cax * cax + cay * cay + caz * caz);
20
+ }
21
+ // Quality reporting negates these edges; flip comparison subtracts them directly.
22
+ // Preserve both evaluation paths, including signed zero, for deterministic quality ordering.
23
+ const bax = calculation === "hypot" ? -abx : first[0] - second[0], bay = calculation === "hypot" ? -aby : first[1] - second[1], baz = calculation === "hypot" ? -abz : first[2] - second[2];
24
+ const cbx = calculation === "hypot" ? -bcx : second[0] - third[0], cby = calculation === "hypot" ? -bcy : second[1] - third[1], cbz = calculation === "hypot" ? -bcz : second[2] - third[2];
25
+ const angles = collapsed
26
+ ? [0, 0, 0]
27
+ : [
28
+ Math.atan2(doubleArea, abx * acx + aby * acy + abz * acz),
29
+ cornerAngle(bcx, bcy, bcz, bax, bay, baz, calculation),
30
+ cornerAngle(cax, cay, caz, cbx, cby, cbz, calculation),
31
+ ];
32
+ return {
33
+ angles,
34
+ aspectRatio: doubleArea === 0
35
+ ? Number.POSITIVE_INFINITY
36
+ : (Math.sqrt(3) * longestEdgeSquared) / (2 * doubleArea),
37
+ crossX,
38
+ crossY,
39
+ crossZ,
40
+ doubleArea,
41
+ };
42
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @internal Reverses validated, exclusively owned triangle indices in place.
3
+ * Global reversal preserves areas and closed topology; caller-owned public meshes need copies.
4
+ */
5
+ export function reverseOwnedTriangleWinding(indices) {
6
+ for (let offset = 0; offset < indices.length; offset += 3) {
7
+ const second = indices[offset + 1];
8
+ indices[offset + 1] = indices[offset + 2];
9
+ indices[offset + 2] = second;
10
+ }
11
+ }
@@ -1,4 +1,4 @@
1
- import { GeometryError } from "./errors.js";
1
+ import { GeometryError } from "../errors.js";
2
2
  /** @internal Writes one finite, representable manufacturing vertex before checking mesh topology. */
3
3
  export function writeMeshVertex(positions, offset, point, operation) {
4
4
  for (let axis = 0; axis < 3; axis += 1) {
@@ -1,15 +1,16 @@
1
1
  /** Pure triangle mesh construction, processing, and inspection without a host engine. */
2
- export { extrudeMesh as extrude, loftMesh as loft } from "./loft/loft.js";
3
- export { revolveMesh as revolve } from "./revolve/revolve-mesh.js";
4
- export { sweepMesh as sweep } from "./sweeps/sweep-mesh.js";
5
- export { heightfieldMesh as heightfield, preflightHeightfield } from "./heightfield.js";
2
+ export { extrudeMesh as extrude } from "./extrusion/mesh.js";
3
+ export { loftMesh as loft } from "./loft/mesh.js";
4
+ export { revolveMesh as revolve } from "./revolve/mesh.js";
5
+ export { sweepMesh as sweep } from "./sweep/mesh.js";
6
+ export { heightfieldMesh as heightfield, preflightHeightfield } from "./mesh/heightfield.js";
6
7
  export { threadRidgeMesh as threadRidge, threadSolidMesh as threadSolid, } from "./mechanical/threads/mesh.js";
7
8
  export { preflightThreadSolidMesh as preflightThreadSolid } from "./mechanical/threads/mesh-plan.js";
8
- export { transformTriangleMesh as transform, joinTriangleMeshes as join, reverseTriangleMesh as reverse, meshBounds as bounds, analyzeTriangleMesh as analyze, validateTriangleMesh as validate, } from "./mesh/mesh.js";
9
- export { computeTriangleMeshCentroid as centroid } from "./mesh/mesh-centroid.js";
10
- export { analyzeTriangleMeshQuality as analyzeQuality } from "./mesh/mesh-quality.js";
11
- export { computeTriangleMeshSignature as signature } from "./mesh/mesh-signature.js";
12
- export { validateSolidMesh as validateSolid } from "./mesh/mesh-solid.js";
13
- export { renderMesh as render } from "./mesh/mesh-render.js";
14
- export { optimizePlanarPatches } from "./mesh/mesh-planar.js";
9
+ export { transformTriangleMesh as transform, joinTriangleMeshes as join, reverseTriangleMesh as reverse, meshBounds as bounds, analyzeTriangleMesh as analyze, validateTriangleMesh as validate, } from "./mesh/operations.js";
10
+ export { computeTriangleMeshCentroid as centroid } from "./mesh/centroid.js";
11
+ export { analyzeTriangleMeshQuality as analyzeQuality } from "./mesh/quality.js";
12
+ export { computeTriangleMeshSignature as signature } from "./mesh/signature.js";
13
+ export { validateSolidMesh as validateSolid } from "./mesh/solid.js";
14
+ export { renderMesh as render } from "./mesh/render-buffers.js";
15
+ export { optimizePlanarPatches } from "./mesh/planar.js";
15
16
  export { immutableMesh as immutable } from "./immutable-buffer.js";
@@ -0,0 +1,43 @@
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
3
+ import { createPathTraversal, locatePathDistance, writePathPoint, writePathTangent, } from "./traversal.js";
4
+ import { path3InputData } from "./value.js";
5
+ /**
6
+ * Places an exact item count at equal arc-length intervals along a sampled XYZ path.
7
+ *
8
+ * Open paths retain both endpoints when count exceeds one; closed paths omit the seam endpoint.
9
+ * Zero-length edges are skipped. Invalid counts, repeated closed seams, nonfinite lengths,
10
+ * zero-length paths, and exhausted budgets throw GeometryError.
11
+ *
12
+ * @param input - XYZ path or points in millimetres.
13
+ * @param count - Positive placement count; one selects the path start.
14
+ * @param closed - Raw-point closure, false by default; must match a path value.
15
+ * @param limits - Limits on input points and output placements.
16
+ */
17
+ export function distributeAlongPath(input, count, closed, limits = {}) {
18
+ if (!Number.isSafeInteger(count) || count < 1)
19
+ throw new GeometryError("INVALID_ARGUMENT", "Path distribution count must be a positive integer.", { operation: "distributeAlongPath" });
20
+ assertSamplingCount(count, "distributeAlongPath", resolveGeometrySamplingLimits(limits).maxPathPoints);
21
+ const data = path3InputData(input, closed, limits);
22
+ const path = data.points;
23
+ if (path.length < (data.closed ? 3 : 2))
24
+ throw new GeometryError("INVALID_ARGUMENT", `${data.closed ? "Closed" : "Open"} distribution paths need more points.`, { operation: "distributeAlongPath" });
25
+ if (data.closed && path[0].every((coordinate, axis) => coordinate === path.at(-1)[axis]))
26
+ throw new GeometryError("INVALID_ARGUMENT", "Closed distribution paths omit their repeated seam point.", { operation: "distributeAlongPath" });
27
+ const traversal = createPathTraversal(path, data.closed);
28
+ if (traversal.length === 0)
29
+ throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot distribute along a zero-length path.", {
30
+ operation: "distributeAlongPath",
31
+ });
32
+ const denominator = data.closed ? count : Math.max(1, count - 1);
33
+ let cursor = 0;
34
+ return Array.from({ length: count }, (_, index) => {
35
+ const location = locatePathDistance(traversal, traversal.length * (index / denominator), cursor);
36
+ cursor = location.edgeIndex;
37
+ const position = [0, 0, 0];
38
+ const tangent = [0, 0, 0];
39
+ writePathPoint(traversal, location, position);
40
+ writePathTangent(traversal, location, tangent);
41
+ return { position, tangent };
42
+ });
43
+ }
@@ -0,0 +1,76 @@
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertSamplingCount } from "../sampling/limits.js";
3
+ import { locatePathDistance, pathEdgeLength, validatePathDistance, writePathPoint, } from "./traversal.js";
4
+ const invalid = (message) => {
5
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation: "path" });
6
+ };
7
+ function pointAt(traversal, distance) {
8
+ const point = [];
9
+ writePathPoint(traversal, locatePathDistance(traversal, distance), point);
10
+ point.length = traversal.points[0].length;
11
+ return point;
12
+ }
13
+ /** Internal directed extraction; only cut endpoints are interpolated, and original interior vertices survive. */
14
+ export function trimPathPoints(traversal, start, end, maximum) {
15
+ validatePathDistance(start, traversal.length);
16
+ validatePathDistance(end, traversal.length);
17
+ if (start >= end)
18
+ invalid("Trim distances must be strictly increasing.");
19
+ const first = start === 0 ? 1 : locatePathDistance(traversal, start).edgeIndex + 1;
20
+ let after = first;
21
+ if (end === traversal.length) {
22
+ // Preserve authored terminal corners even when a small edge was rounded out of the total.
23
+ after = traversal.points.length - (traversal.closed ? 0 : 1);
24
+ }
25
+ else {
26
+ while (after < traversal.points.length && traversal.cumulative[after] < end)
27
+ after++;
28
+ }
29
+ assertSamplingCount(2 + after - first, "path.trim", maximum);
30
+ const points = [pointAt(traversal, start)];
31
+ for (let vertex = first; vertex < after; vertex++)
32
+ points.push(traversal.points[vertex]);
33
+ points.push(pointAt(traversal, end));
34
+ return points;
35
+ }
36
+ /** Internal split of one directed traversal into two open paths, with one shared cut position. */
37
+ export function splitPathPoints(traversal, distance, maximum) {
38
+ validatePathDistance(distance, traversal.length);
39
+ if (distance === 0 || distance === traversal.length)
40
+ invalid("Split distance must lie strictly inside the path.");
41
+ return [
42
+ trimPathPoints(traversal, 0, distance, maximum),
43
+ trimPathPoints(traversal, distance, traversal.length, maximum),
44
+ ];
45
+ }
46
+ /** Internal edge subdivision; exact original vertices and closure survive, including repeated adjacent vertices. */
47
+ export function subdividePathPoints(traversal, maxSegmentLength, maximum) {
48
+ if (!Number.isFinite(maxSegmentLength) || maxSegmentLength <= 0)
49
+ invalid("maxSegmentLength must be finite and positive.");
50
+ const { points, closed } = traversal;
51
+ const count = closed ? points.length : Math.max(0, points.length - 1);
52
+ const divisions = [];
53
+ let required = closed ? 0 : Math.min(1, points.length);
54
+ for (let edge = 0; edge < count; edge++) {
55
+ const intervals = Math.max(1, Math.ceil(pathEdgeLength(points[edge], points[(edge + 1) % points.length]) / maxSegmentLength));
56
+ required += intervals;
57
+ assertSamplingCount(required, "path.subdivide", maximum);
58
+ divisions.push(intervals);
59
+ }
60
+ const result = points.length === 0 ? [] : [points[0]];
61
+ const scratch = [];
62
+ for (let edge = 0; edge < count; edge++) {
63
+ const intervals = divisions[edge];
64
+ for (let step = 1; step <= intervals; step++) {
65
+ if (closed && edge === count - 1 && step === intervals)
66
+ break;
67
+ if (step === intervals)
68
+ result.push(points[edge + 1]);
69
+ else {
70
+ writePathPoint(traversal, { edgeIndex: edge, fraction: step / intervals }, scratch);
71
+ result.push(scratch.slice(0, points[0].length));
72
+ }
73
+ }
74
+ }
75
+ return result;
76
+ }
@@ -1,7 +1,7 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { vector3Data } from "../math/vector-value.js";
3
3
  import { cross3, dot3, length3, normalize3, projectOntoPlane3, rotateAroundAxis3Radians, scale3, subtract3, } from "../math/vector3.js";
4
- import { path3InputData } from "./path-value.js";
4
+ import { path3InputData } from "./value.js";
5
5
  const guideData = (input, operation) => {
6
6
  const coordinates = vector3Data(input);
7
7
  if (!coordinates.every(Number.isFinite))
@@ -52,9 +52,13 @@ const transportNormal = (normal, previousTangent, tangent) => {
52
52
  * Builds rotation-minimizing frames by parallel-transporting the previous normal.
53
53
  *
54
54
  * This avoids the sudden profile flips produced by picking a fresh up-vector per ring.
55
- * Paths exceeding maxPathPoints (default 100000) reject before frame allocation or guide evaluation.
56
- * Requires open path values; raw tuples are interpreted as an open path. Invalid paths throw GeometryError.
57
- * Nonfinite normals and guide results reject. A finite initial guide parallel to the tangent selects a canonical fallback.
55
+ * Nonfinite guides and unusable path tangents throw GeometryError. A finite initial guide
56
+ * parallel to the tangent selects a canonical fallback.
57
+ *
58
+ * @param input - Open XYZ path or points in millimetres; at least two points.
59
+ * @param initialNormal - Preferred starting X direction; the first normalGuide result wins.
60
+ * @param normalGuide - Profile X guide at each point; its sign follows the transported normal.
61
+ * @param limits - Point limits, checked before creating frames or calling guides.
58
62
  */
59
63
  export const computeParallelTransportFrames = (input, initialNormal, normalGuide, limits = {}) => {
60
64
  const { points: path } = path3InputData(input, false, limits);
@@ -77,15 +81,15 @@ export const computeParallelTransportFrames = (input, initialNormal, normalGuide
77
81
  for (let index = 1; index < tangents.length; index += 1) {
78
82
  const previousTangent = tangents[index - 1];
79
83
  const tangent = tangents[index];
84
+ const transported = transportNormal(normal, previousTangent, tangent);
80
85
  const guide = normalGuide?.(path[index], index);
81
86
  if (guide === undefined) {
82
- normal = transportNormal(normal, previousTangent, tangent);
87
+ normal = transported;
83
88
  }
84
89
  else {
85
90
  const guided = normalize3(projectOntoPlane3(guideData(guide, "computeParallelTransportFrames"), tangent));
86
- // A guide describes an unoriented plane direction. Preserve the prior
87
- // sign so noisy guide inputs cannot create a 180-degree seam flip.
88
- normal = dot3(guided, normal) < 0 ? scale3(guided, -1) : guided;
91
+ // Compare in the new tangent plane so a bend cannot reverse the profile's orientation.
92
+ normal = dot3(guided, transported) < 0 ? scale3(guided, -1) : guided;
89
93
  }
90
94
  // Reprojection removes accumulated floating-point drift.
91
95
  normal = normalize3(projectOntoPlane3(normal, tangent));
@@ -109,10 +113,11 @@ const signedAngleAround = (from, to, axis) => Math.atan2(dot3(axis, cross3(from,
109
113
  * Centered cyclic tangents are parallel-transported around the loop. Transporting the last
110
114
  * normal back to the first tangent measures seam holonomy; distributing that residual rotation
111
115
  * uniformly over all path intervals avoids a visible seam or accumulated frame flip.
112
- * The maxPathPoints ceiling (default 100000) bounds path points and frames.
113
- * Requires closed path values; raw tuples are interpreted as closed and must omit their seam point.
114
- * Invalid paths throw GeometryError.
115
116
  * Nonfinite initial normals reject; finite parallel preferences select a canonical fallback.
117
+ *
118
+ * @param input - Closed XYZ path or points in millimetres, with no repeated seam.
119
+ * @param initialNormal - Preferred profile X direction at the seam.
120
+ * @param limits - Limits on input points and output frames.
116
121
  */
117
122
  export const computeClosedParallelTransportFrames = (input, initialNormal, limits = {}) => {
118
123
  const { points: path } = path3InputData(input, true, limits);
@@ -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
  /**
4
4
  * Creates `segments + 1` points including exact helix endpoints from finite positive dimensions.
5
5
  *