@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,13 +1,13 @@
1
- import { anchor3, anchorFrame3 } from "../../geometry/anchors.js";
2
1
  import { GeometryError } from "../../geometry/errors.js";
3
- import { clipJoinPolygon, createJoinPolygonIndex, expandJoinPolygon, inJoinPolygon, intersectJoinPolygons, joinArea, joinHeight, JoinWork, prepareJoinLayer, subtractJoinPolygon, } from "../../geometry/join-geometry.js";
4
- import { validateSolidMesh } from "../../geometry/mesh/mesh-solid.js";
5
- import { assertMeshAllocationWithinLimits } from "../../geometry/model-limits.js";
6
- import { planRegionOffsets } from "../../geometry/region-offset.js";
7
- import { contourContainsPoint } from "../../geometry/regions.js";
8
- import { resolveGeometryResolution } from "../../geometry/resolution.js";
9
- import { assertSamplingCount } from "../../geometry/sampling-limits.js";
2
+ import { assertMeshAllocationWithinLimits } from "../../geometry/limits.js";
3
+ import { clipJoinPolygon, createJoinPolygonIndex, expandJoinPolygon, inJoinPolygon, intersectJoinPolygons, joinArea, joinHeight, JoinWork, prepareJoinLayer, subtractJoinPolygon, } from "../../geometry/mesh/join-layers.js";
4
+ import { validateSolidMesh } from "../../geometry/mesh/solid.js";
5
+ import { planRegionOffsets } from "../../geometry/regions/offset.js";
6
+ import { contourContainsPoint } from "../../geometry/regions/operations.js";
7
+ import { assertSamplingCount } from "../../geometry/sampling/limits.js";
8
+ import { resolveGeometryResolution } from "../../geometry/sampling/resolution.js";
10
9
  import { resolveGeometryTolerance } from "../../geometry/tolerance.js";
10
+ import { anchor3, anchorFrame3 } from "../../geometry/transforms/anchors.js";
11
11
  import { nativeConstructionMesh } from "../native/construction-mesh.js";
12
12
  import { ownScopedManifoldValue } from "../native/context.js";
13
13
  import { observeNativeMesh } from "../native/mesh-observation.js";
@@ -16,12 +16,18 @@ import { nativeCollarProfile } from "./join-collar-profile.js";
16
16
  const fail = (message, phase) => {
17
17
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: "join", details: { phase } });
18
18
  };
19
+ // Keep these kernels local to isolate V8's array-type feedback from other modeling operations.
20
+ // Shared helpers see more array representations, which can slow hot loops even when inlined.
19
21
  const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
20
- const contours = (profile) => profile.components.flatMap((component) => [
22
+ const profileContours = (profile) => profile.components.flatMap((component) => [
21
23
  component.outer.points,
22
24
  ...component.holes.map((hole) => hole.points),
23
25
  ]);
24
- /** One deferred connection, with native operands authoritative throughout support proofs. */
26
+ /**
27
+ * Builds one connection from authoritative native operands. Proves support coverage, material,
28
+ * and the constant-section collar before constructing the transition. Only the finished collar
29
+ * is transformed back and fused with the unchanged original operands.
30
+ */
25
31
  export function createJoinOperation(environment) {
26
32
  return (base, feature, options) => {
27
33
  const { module, scope } = environment;
@@ -70,9 +76,21 @@ export function createJoinOperation(environment) {
70
76
  : options.source;
71
77
  if (typeof supplied !== "object" || supplied === null)
72
78
  fail("Join source must name a feature anchor or supply an Anchor3.", "source");
73
- const sourceAnchor = anchor3(supplied.position, supplied.direction, supplied.up);
79
+ const sourceAnchor = anchor3({
80
+ position: supplied.position,
81
+ direction: supplied.direction,
82
+ up: supplied.up,
83
+ });
74
84
  // The root points out of the feature; chart Z points into its unchanged straight collar.
75
- const frame = anchorFrame3(anchor3(sourceAnchor.position, [-sourceAnchor.direction[0], -sourceAnchor.direction[1], -sourceAnchor.direction[2]], sourceAnchor.up));
85
+ const frame = anchorFrame3(anchor3({
86
+ position: sourceAnchor.position,
87
+ direction: [
88
+ -sourceAnchor.direction[0],
89
+ -sourceAnchor.direction[1],
90
+ -sourceAnchor.direction[2],
91
+ ],
92
+ up: sourceAnchor.up,
93
+ }));
76
94
  const { xAxis: x, yAxis: y, zAxis: z, origin: o } = frame;
77
95
  const forward = [
78
96
  x[0],
@@ -134,11 +152,11 @@ export function createJoinOperation(environment) {
134
152
  const closingInset = epsilon * 8;
135
153
  const offset = planRegionOffsets(source, [-width, closingInset], "join", limits);
136
154
  work.use(offset.workCount);
137
- const region = (loops) => own(loops.length === 0
155
+ const crossSectionFromContours = (contours) => own(contours.length === 0
138
156
  ? sourceSection.subtract(sourceSection)
139
- : new module.CrossSection(loops.map((loop) => loop.map((p) => [p[0], p[1]])), "NonZero"));
157
+ : new module.CrossSection(contours.map((contour) => contour.map((p) => [p[0], p[1]])), "NonZero"));
140
158
  const expandedProfile = offset.profileAt(-width);
141
- const footprint = region(contours(expandedProfile));
159
+ const footprint = crossSectionFromContours(profileContours(expandedProfile));
142
160
  const triangles = [];
143
161
  const canonicalPlanes = [];
144
162
  const chartTolerance = resolveGeometryTolerance(scale);
@@ -174,12 +192,12 @@ export function createJoinOperation(environment) {
174
192
  polygon = clipJoinPolygon(polygon, [-plane[0], -plane[1], maxZ - plane[2]]);
175
193
  if (polygon.length < 3 || Math.abs(joinArea(polygon)) <= meshEpsilon ** 2)
176
194
  continue;
177
- const clipped = own(region([polygon]).intersect(footprint));
195
+ const clipped = own(crossSectionFromContours([polygon]).intersect(footprint));
178
196
  if (clipped.isEmpty())
179
197
  continue;
180
198
  for (const point of points)
181
199
  chartArithmeticScale = Math.max(chartArithmeticScale, ...point.map(Math.abs));
182
- // Double arithmetic can give coplanar tessellation triangles slightly different equations.
200
+ // Float64 arithmetic can give coplanar tessellation triangles slightly different equations.
183
201
  // Match dimensionless unit normals and actual height predictions, never encoded face IDs.
184
202
  const priorPlane = canonicalPlanes.find((candidate) => {
185
203
  work.use();
@@ -196,9 +214,9 @@ export function createJoinOperation(environment) {
196
214
  }
197
215
  // Convex components need one exact clip, not arbitrary triangulation seams.
198
216
  // Inspect the actual clipping coordinates; holes and concavity retain their full partition.
199
- const convexPartition = (loops) => {
200
- const outer = loops[0];
201
- const convex = loops.length === 1 &&
217
+ const convexPartition = (contours) => {
218
+ const outer = contours[0];
219
+ const convex = contours.length === 1 &&
202
220
  outer.length >= 3 &&
203
221
  joinArea(outer) > 0 &&
204
222
  outer.every((point, i) => {
@@ -210,12 +228,15 @@ export function createJoinOperation(environment) {
210
228
  });
211
229
  if (convex)
212
230
  return [outer];
213
- const vertices = loops.flat();
231
+ const vertices = contours.flat();
214
232
  return module
215
- .triangulate(loops.map((loop) => loop.map((p) => [p[0], p[1]])), 0, false)
233
+ .triangulate(contours.map((contour) => contour.map((p) => [p[0], p[1]])), 0, false)
216
234
  .map((ids) => ids.map((id) => vertices[id]));
217
235
  };
218
- const footprintCells = expandedProfile.components.flatMap((component) => convexPartition(region([component.outer.points, ...component.holes.map((hole) => hole.points)]).toPolygons()));
236
+ const footprintCells = expandedProfile.components.flatMap((component) => convexPartition(crossSectionFromContours([
237
+ component.outer.points,
238
+ ...component.holes.map((hole) => hole.points),
239
+ ]).toPolygons()));
219
240
  const usable = (polygon) => polygon.length >= 3 && Math.abs(joinArea(polygon)) > meshEpsilon ** 2;
220
241
  const cells = [];
221
242
  // Remove every nearer exit over its complete projected overlap, rather than probing a few rays.
@@ -254,21 +275,21 @@ export function createJoinOperation(environment) {
254
275
  // Bound each affine proof cell's extension by epsilon/2 in Euclidean distance.
255
276
  // The native union must cover the complete footprint; every extended part is
256
277
  // included in the material witness below, so a real slit cannot be waived.
257
- const proofRegions = cells.map((cell) => {
278
+ const proofSections = cells.map((cell) => {
258
279
  work.use(cell.polygon.length);
259
280
  const expanded = expandJoinPolygon(cell.polygon, epsilon / (2 * Math.SQRT2), work);
260
- return region([expanded]);
281
+ return crossSectionFromContours([expanded]);
261
282
  });
262
- const proofPoints = proofRegions.reduce((count, region) => count + region.numVert(), 0);
283
+ const proofPoints = proofSections.reduce((count, section) => count + section.numVert(), 0);
263
284
  assertMeshAllocationWithinLimits(proofPoints * 2, proofPoints * 4, proofPoints * 96, "join", limits);
264
- const proofCoverage = own(module.CrossSection.union(proofRegions));
285
+ const proofCoverage = own(module.CrossSection.union(proofSections));
265
286
  if (!own(footprint.subtract(proofCoverage)).isEmpty())
266
287
  fail("The entire transition footprint needs a regular outward support patch after the source datum.", "support");
267
- let maximumSlope = 0, greatest = -Infinity;
288
+ let maximumSlope = 0, highestSupport = -Infinity;
268
289
  for (const cell of cells) {
269
290
  maximumSlope = Math.max(maximumSlope, Math.hypot(cell.plane[0], cell.plane[1]));
270
291
  for (const point of cell.polygon) {
271
- greatest = Math.max(greatest, joinHeight(cell.plane, point));
292
+ highestSupport = Math.max(highestSupport, joinHeight(cell.plane, point));
272
293
  }
273
294
  }
274
295
  allowance *= 1 + maximumSlope;
@@ -286,14 +307,18 @@ export function createJoinOperation(environment) {
286
307
  Math.abs(joinHeight(cell.plane, point) - joinHeight(other.plane, point)) > allowance)
287
308
  fail("Support patch must be continuous; height jumps and branch changes are unsupported.", "support");
288
309
  }
289
- const H = greatest + height + allowance;
290
- if (H > maxZ + epsilon)
310
+ const collarTop = highestSupport + height + allowance;
311
+ if (collarTop > maxZ + epsilon)
291
312
  fail("Feature needs a longer constant-section collar above the support patch.", "collar");
292
- const proofDomain = own(module.Manifold.extrude(footprint, H + allowance * 3).translate([0, 0, -allowance * 2]));
313
+ const proofDomain = own(module.Manifold.extrude(footprint, collarTop + allowance * 3).translate([
314
+ 0,
315
+ 0,
316
+ -allowance * 2,
317
+ ]));
293
318
  const toNative = (mesh) => nativeConstructionMesh(scope, mesh, limits, "join");
294
319
  const terrain = (top, bottom) => {
295
320
  const pieces = cells.flatMap((cell, index) => {
296
- const area = proofRegions[index];
321
+ const area = proofSections[index];
297
322
  if (area.isEmpty())
298
323
  return [];
299
324
  const guard = epsilon * (2 + Math.hypot(cell.plane[0], cell.plane[1]) / 2);
@@ -314,33 +339,33 @@ export function createJoinOperation(environment) {
314
339
  const witness = terrain((value, guard) => value - guard, (value, guard) => value - guard - epsilon * 6);
315
340
  if (!own(witness.subtract(support)).isEmpty())
316
341
  fail("Support material is missing or too thin beneath the complete curved footprint.", "support");
317
- const overhead = terrain(() => H + allowance, (value, guard) => value + guard);
342
+ const overhead = terrain(() => collarTop + allowance, (value, guard) => value + guard);
318
343
  if (!own(overhead.intersect(support)).isEmpty())
319
344
  fail("Support reenters the connection band above the selected patch.", "support");
320
345
  // Guard both directions over the full collar volume: matching two cross-sections is insufficient.
321
- const domain = own(module.Manifold.extrude(footprint, H - epsilon * 2).translate([0, 0, epsilon * 2]));
346
+ const domain = own(module.Manifold.extrude(footprint, collarTop - epsilon * 2).translate([0, 0, epsilon * 2]));
322
347
  const innerSection = own(sourceSection.offset(-epsilon * 2, "Miter"));
323
348
  const outerSection = own(sourceSection.offset(epsilon * 2, "Miter"));
324
- const expected = own(module.Manifold.extrude(innerSection, H - epsilon * 2).translate([0, 0, epsilon * 2]));
325
- const outer = own(module.Manifold.extrude(outerSection, H - epsilon * 2).translate([0, 0, epsilon * 2]));
349
+ const expected = own(module.Manifold.extrude(innerSection, collarTop - epsilon * 2).translate([0, 0, epsilon * 2]));
350
+ const outer = own(module.Manifold.extrude(outerSection, collarTop - epsilon * 2).translate([0, 0, epsilon * 2]));
326
351
  const actual = own(neck.intersect(domain));
327
352
  if (!own(expected.subtract(actual)).isEmpty() || !own(actual.subtract(outer)).isEmpty())
328
353
  fail("Feature must have a straight constant-section collar throughout the complete connection band.", "collar");
329
354
  if (width === 0)
330
355
  return environment.wrapSolid(own(originalBase.add(originalFeature)));
331
- const originalLoops = contours(source), outsideLoops = contours(expandedProfile);
356
+ const originalContours = profileContours(source), outsideContours = profileContours(expandedProfile);
332
357
  // Close inside the real feature wall, proving this private numerical overlap adds no exposed shape.
333
358
  const insideProfile = offset.profileAt(closingInset);
334
- const insideLoops = contours(insideProfile);
335
- const closingSection = region(insideLoops);
359
+ const insideContours = profileContours(insideProfile);
360
+ const closingSection = crossSectionFromContours(insideContours);
336
361
  if (closingSection.isEmpty() || closingSection.numContour() !== sourceSection.numContour())
337
362
  fail("Source boundaries cannot resolve the private closing allowance.", "precision");
338
- const closingCore = own(module.Manifold.extrude(closingSection, H));
363
+ const closingCore = own(module.Manifold.extrude(closingSection, collarTop));
339
364
  if (!own(own(closingCore.subtract(neck)).subtract(support)).isEmpty())
340
365
  fail("The private closing boundary cannot be contained in the supplied solids.", "precision");
341
366
  const strips = [];
342
- for (let loop = 0; loop < originalLoops.length; loop++) {
343
- const original = originalLoops[loop], expanded = outsideLoops[loop];
367
+ for (let contourIndex = 0; contourIndex < originalContours.length; contourIndex++) {
368
+ const original = originalContours[contourIndex], expanded = outsideContours[contourIndex];
344
369
  for (let i = 0; i < original.length; i++) {
345
370
  const next = (i + 1) % original.length, a = original[i], b = original[next];
346
371
  const length = Math.hypot(b[0] - a[0], b[1] - a[1]);
@@ -382,6 +407,16 @@ export function createJoinOperation(environment) {
382
407
  }
383
408
  return group;
384
409
  });
410
+ const appendClippedCells = (polygon) => {
411
+ for (const [cellIndex, cell] of cells.entries()) {
412
+ work.use();
413
+ const piece = intersectJoinPolygons(polygon, cell.polygon);
414
+ if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
415
+ polygons.push(piece);
416
+ bottomGroups.push(cellGroups[cellIndex]);
417
+ }
418
+ }
419
+ };
385
420
  // Split at every chart crossing so the generated surface retains actual support facets and creases.
386
421
  for (const strip of strips)
387
422
  for (let row = 0; row < divisions; row++) {
@@ -395,45 +430,23 @@ export function createJoinOperation(environment) {
395
430
  const band = clipJoinPolygon(clipJoinPolygon(strip.polygon, [projection[0], projection[1], projection[2] - rb]), [-projection[0], -projection[1], ra - projection[2]]);
396
431
  if (band.length < 3)
397
432
  continue;
398
- for (const [cellIndex, cell] of cells.entries()) {
399
- work.use();
400
- const piece = intersectJoinPolygons(band, cell.polygon);
401
- if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
402
- polygons.push(piece);
403
- bottomGroups.push(cellGroups[cellIndex]);
404
- }
405
- }
433
+ appendClippedCells(band);
406
434
  }
407
435
  // Use the same corresponding boundaries and clipping arithmetic as the outside strips.
408
436
  // Independent native offsets/intersections would round these shared mesh seams differently.
409
- for (let loop = 0; loop < originalLoops.length; loop++) {
410
- const original = originalLoops[loop], inside = insideLoops[loop];
437
+ for (let contourIndex = 0; contourIndex < originalContours.length; contourIndex++) {
438
+ const original = originalContours[contourIndex], inside = insideContours[contourIndex];
411
439
  for (let i = 0; i < original.length; i++) {
412
440
  const next = (i + 1) % original.length;
413
441
  const ring = [original[i], original[next], inside[next], inside[i]];
414
- for (const [cellIndex, cell] of cells.entries()) {
415
- work.use();
416
- const piece = intersectJoinPolygons(ring, cell.polygon);
417
- if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
418
- polygons.push(piece);
419
- bottomGroups.push(cellGroups[cellIndex]);
420
- }
421
- }
442
+ appendClippedCells(ring);
422
443
  }
423
444
  }
424
445
  // Fill the already-proven feature interior down to the same support witness. An annular-only
425
446
  // collar can enclose a numerical contact sheet when two independently transformed caps meet.
426
447
  const coreCells = insideProfile.components.flatMap((component) => convexPartition([component.outer.points, ...component.holes.map((hole) => hole.points)]));
427
- for (const coreCell of coreCells) {
428
- for (const [cellIndex, cell] of cells.entries()) {
429
- work.use();
430
- const piece = intersectJoinPolygons(coreCell, cell.polygon);
431
- if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
432
- polygons.push(piece);
433
- bottomGroups.push(cellGroups[cellIndex]);
434
- }
435
- }
436
- }
448
+ for (const coreCell of coreCells)
449
+ appendClippedCells(coreCell);
437
450
  const stripIndex = createJoinPolygonIndex(strips.map((strip) => strip.polygon), work, limits);
438
451
  const rise = (p) => {
439
452
  for (const index of stripIndex(p, epsilon)) {
@@ -452,7 +465,7 @@ export function createJoinOperation(environment) {
452
465
  const layerOptions = {
453
466
  bottomGroups,
454
467
  supportPlanes,
455
- triangulate: (loops) => module.triangulate(loops.map((loop) => loop.map((p) => [p[0], p[1]])), 0, false),
468
+ triangulate: (contours) => module.triangulate(contours.map((contour) => contour.map((p) => [p[0], p[1]])), 0, false),
456
469
  };
457
470
  const layer = prepareJoinLayer(polygons, meshEpsilon, limits, work, layerOptions);
458
471
  // Prepared nodes retain their incident support planes, avoiding a second spatial guess at creases.
@@ -465,7 +478,7 @@ export function createJoinOperation(environment) {
465
478
  const missingFoot = own(own(footNative.subtract(support)).subtract(neck));
466
479
  if (!missingFoot.isEmpty()) {
467
480
  // Native subtraction can retain zero-thickness contact sheets. Bound each component at
468
- // Double roundoff, never by the larger construction allowance or another component's area.
481
+ // Float64 roundoff, never by the larger construction allowance or another component's area.
469
482
  const missingComponents = missingFoot.decompose().map(own);
470
483
  if (missingComponents.length === 0)
471
484
  fail("Numerical connection containment could not be established.", "support");
@@ -1,15 +1,16 @@
1
1
  import { GeometryError } from "../../geometry/errors.js";
2
2
  import { resolveKnuckleHinge } from "../../geometry/mechanical/knuckle-hinge.js";
3
- import { assertPrimitiveOptions } from "../../geometry/primitive-resolvers.js";
4
- import { assertSamplingCount } from "../../geometry/sampling-limits.js";
3
+ import { assertPrimitiveOptions } from "../../geometry/primitives/resolvers.js";
4
+ import { assertSamplingCount } from "../../geometry/sampling/limits.js";
5
+ import { frameTransform3 } from "../../geometry/transforms/affine3.js";
5
6
  /** Composes existing scoped operations after resolving both halves against one host policy. */
6
7
  export function createKnuckleHingeOperation(environment, operations) {
7
8
  return (options) => {
8
9
  environment.assertActive();
9
10
  assertPrimitiveOptions(options, "knuckleHinge");
10
11
  const resolved = environment.withResolutionDefaults(options);
11
- const d = resolveKnuckleHinge(options, resolved);
12
- assertSamplingCount(d.segments * d.spec.knuckleCount * 2, "knuckleHinge", resolved.limits.maxVertices);
12
+ const dimensions = resolveKnuckleHinge(options, resolved);
13
+ assertSamplingCount(dimensions.segments * dimensions.spec.knuckleCount * 2, "knuckleHinge", resolved.limits.maxVertices);
13
14
  const invalid = (message) => {
14
15
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: "knuckleHinge" });
15
16
  };
@@ -18,8 +19,8 @@ export function createKnuckleHingeOperation(environment, operations) {
18
19
  const chamfer = half.chamfer ?? 0;
19
20
  if (!Number.isFinite(chamfer) ||
20
21
  chamfer < 0 ||
21
- 2 * chamfer >= d.knuckleLength ||
22
- chamfer >= d.minimumBarrelWall)
22
+ 2 * chamfer >= dimensions.knuckleLength ||
23
+ chamfer >= dimensions.minimumBarrelWall)
23
24
  invalid("chamfer must be nonnegative and leave a positive axial band and faceted barrel wall.");
24
25
  const web = half.web;
25
26
  if (web !== undefined) {
@@ -34,9 +35,9 @@ export function createKnuckleHingeOperation(environment, operations) {
34
35
  !Number.isFinite(web.zMin + web.thickness))
35
36
  invalid("Web dimensions must be finite, with positive reach and thickness.");
36
37
  if (2 * chamfer >= web.thickness ||
37
- 2 * Math.SQRT2 * chamfer >= Math.min(d.knuckleLength, web.reach))
38
+ 2 * Math.SQRT2 * chamfer >= Math.min(dimensions.knuckleLength, web.reach))
38
39
  invalid("chamfer must leave a positive web band and noncollapsed end contours.");
39
- const innerRadius = d.barrelRadius * Math.cos(Math.PI / d.segments);
40
+ const innerRadius = dimensions.barrelRadius * Math.cos(Math.PI / dimensions.segments);
40
41
  if (web.zMin >= innerRadius || web.zMin + web.thickness <= -innerRadius)
41
42
  invalid("A web must overlap the interior of its barrel.");
42
43
  }
@@ -49,7 +50,7 @@ export function createKnuckleHingeOperation(environment, operations) {
49
50
  radius,
50
51
  height: length,
51
52
  center: false,
52
- segments: d.segments,
53
+ segments: dimensions.segments,
53
54
  sizing: bore ? "face" : "vertex",
54
55
  ...(chamfer === 0
55
56
  ? {}
@@ -69,7 +70,7 @@ export function createKnuckleHingeOperation(environment, operations) {
69
70
  // Parallel offsets finish the exposed tip; the two root corners stay square.
70
71
  const corner = { kind: "chamfer", distance: chamfer + (Math.SQRT2 - 2) * inset };
71
72
  const profile = operations.rectangle({
72
- size: [d.knuckleLength - 2 * inset, web.reach - inset],
73
+ size: [dimensions.knuckleLength - 2 * inset, web.reach - inset],
73
74
  center: false,
74
75
  treatment: [corner, corner, { kind: "square" }, { kind: "square" }],
75
76
  });
@@ -78,10 +79,10 @@ export function createKnuckleHingeOperation(environment, operations) {
78
79
  web.direction === "positive-y" ? 1 : -1,
79
80
  ]);
80
81
  };
81
- for (const interval of d.knuckles) {
82
+ for (const interval of dimensions.knuckles) {
82
83
  if (interval.side !== side)
83
84
  continue;
84
- features.push(atBase(axial(d.barrelRadius, interval.start, interval.length, false, chamfer)));
85
+ features.push(atBase(axial(dimensions.barrelRadius, interval.start, interval.length, false, chamfer)));
85
86
  if (web !== undefined) {
86
87
  features.push(chamfer === 0
87
88
  ? operations.translate(operations.box({
@@ -99,30 +100,34 @@ export function createKnuckleHingeOperation(environment, operations) {
99
100
  [chamfer, web.thickness],
100
101
  ].map(([inset, z]) => ({
101
102
  profile: webProfile(web, inset),
102
- frame: {
103
+ transform: frameTransform3({
103
104
  origin: [interval.start, 0, z],
104
105
  xAxis: [1, 0, 0],
105
106
  yAxis: [0, 1, 0],
106
107
  zAxis: [0, 0, 1],
107
- },
108
+ }),
108
109
  }))));
109
110
  }
110
111
  }
111
- if (side === "a" && d.pin !== null)
112
- features.push(atBase(axial(d.pinRadius, d.pin.start, d.pin.length)));
112
+ if (side === "a" && dimensions.pin !== null)
113
+ features.push(atBase(axial(dimensions.pinRadius, dimensions.pin.start, dimensions.pin.length)));
113
114
  // Match the kernel cylinders to the same mesh precision as the explicit web stations.
114
115
  const solid = operations.union(features.map((feature) => chamfer === 0 || web === undefined
115
116
  ? feature
116
117
  : operations.solidFromMesh(environment.analyzedMeshFor(feature).mesh)));
117
118
  // Overtravel is numerical cutter extent, independent of the physical radial/axial allowances.
118
- const overtravel = Math.min(d.knuckleLength, d.barrelRadius) * 0.01;
119
- const result = side === "a" && d.pin !== null
119
+ const overtravel = Math.min(dimensions.knuckleLength, dimensions.barrelRadius) * 0.01;
120
+ const result = side === "a" && dimensions.pin !== null
120
121
  ? solid
121
122
  : operations.subtract(solid, [
122
- atBase(axial(d.boreRadius, -d.spec.length / 2 - overtravel, d.spec.length + 2 * overtravel, true)),
123
+ atBase(axial(dimensions.boreRadius, -dimensions.spec.length / 2 - overtravel, dimensions.spec.length + 2 * overtravel, true)),
123
124
  ]);
124
125
  return operations.translate(result, [0, 0, baseZ]);
125
126
  };
126
- return Object.freeze({ halfA: buildHalf("a", a), halfB: buildHalf("b", b), axis: d.axis });
127
+ return Object.freeze({
128
+ halfA: buildHalf("a", a),
129
+ halfB: buildHalf("b", b),
130
+ axis: dimensions.axis,
131
+ });
127
132
  };
128
133
  }
@@ -1,10 +1,9 @@
1
1
  import { GeometryError } from "../../geometry/errors.js";
2
- import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../../geometry/loft/loft-geometry.js";
3
- import { loftFrame, resolveLoftControls } from "../../geometry/loft/loft-options.js";
4
- import { simpleLoftMesh } from "../../geometry/loft/loft-simple-mesh.js";
5
- import { analyzeTriangleMesh } from "../../geometry/mesh/mesh.js";
6
- import { capturePath2Input, path2InputData, } from "../../geometry/paths/path-value.js";
7
- import { assertSamplingCount, } from "../../geometry/sampling-limits.js";
2
+ import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../../geometry/loft/geometry.js";
3
+ import { loftTransform, resolveLoftControls } from "../../geometry/loft/options.js";
4
+ import { simpleLoftMesh } from "../../geometry/loft/simple-mesh.js";
5
+ import { capturePath2Input, path2InputData } from "../../geometry/paths/value.js";
6
+ import { assertSamplingCount, } from "../../geometry/sampling/limits.js";
8
7
  import { buildProfileLoftMesh } from "./primitives/profile-mesh.js";
9
8
  import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitives/profiles.js";
10
9
  const explicitProfile = (value) => typeof value === "object" &&
@@ -73,7 +72,7 @@ export function createLoftOperation(environment, solidFromMesh) {
73
72
  if (!Array.isArray(inputStations) || inputStations.length < 2)
74
73
  fail("Loft requires at least two stations.");
75
74
  assertSamplingCount(inputStations.length, "loft", environment.limits.maxPathPoints);
76
- inputStations.forEach((station) => loftFrame(station));
75
+ inputStations.forEach((station) => loftTransform(station));
77
76
  let selected = environment.withResolutionDefaults(value);
78
77
  resolveLoftControls(value, inputStations.length);
79
78
  const captured = inputStations.map(({ profile, ...placement }) => {
@@ -108,7 +107,7 @@ export function createLoftOperation(environment, solidFromMesh) {
108
107
  let recipeSampled;
109
108
  if (explicit) {
110
109
  if (!stations.every((station) => explicitProfile(station.profile)))
111
- fail("Identified profile stations cannot be mixed with Sections or point loops.");
110
+ fail("Identified profile stations cannot be mixed with Sections or point contours.");
112
111
  profiles = stations.map((station) => station.profile);
113
112
  authoritative = true;
114
113
  }
@@ -159,20 +158,14 @@ export function createLoftOperation(environment, solidFromMesh) {
159
158
  if (authoritative && controls.methods.some((method) => method !== "direct"))
160
159
  fail("Identified landmarks cannot be remapped by geometric loft correspondence.");
161
160
  const input = stations.map((station, index) => ({
162
- frame: loftFrame(station),
161
+ transform: loftTransform(station),
163
162
  profile: profiles[index],
164
163
  }));
165
164
  const geometry = prepareLoftGeometry(input, selected, selected.limits, authoritative, recipeSampled);
166
165
  if (geometry.stations.every((station) => station.profile.components.length === 1 &&
167
166
  station.profile.components[0].holes.length === 0))
168
167
  return solidFromMesh(simpleLoftMesh(geometry, selected.limits));
169
- const mesh = buildProfileLoftMesh(environment.module, geometry.stations, selected.limits, false, 0, (station, contour, slot) => geometry.world[station][contour][slot]);
170
- if (analyzeTriangleMesh(mesh).signedVolume < 0)
171
- for (let index = 0; index < mesh.indices.length; index += 3) {
172
- const b = mesh.indices[index + 1];
173
- mesh.indices[index + 1] = mesh.indices[index + 2];
174
- mesh.indices[index + 2] = b;
175
- }
168
+ const mesh = buildProfileLoftMesh(environment.module, geometry.stations, selected.limits, false, [], (station, contour, slot) => geometry.world[station][contour][slot]);
176
169
  return solidFromMesh(mesh);
177
170
  };
178
171
  }
@@ -1,3 +1,4 @@
1
+ import { preflightInternalThreadCutterSolid, preflightThreadedNutSolid, preflightThreadedRodSolid, } from "../../geometry/mechanical/threads/solids.js";
1
2
  import * as kernel from "../native/index.js";
2
3
  import { createKnuckleHingeOperation } from "./knuckle-hinge.js";
3
4
  /** Internal host-bound mechanical operations. */
@@ -18,33 +19,21 @@ export function createMechanicalOperations(environment, construction) {
18
19
  threadedRod: (value) => {
19
20
  assertActive();
20
21
  const resolved = withResolutionDefaults(value);
21
- kernel.preflightThreadedRod(resolved);
22
+ preflightThreadedRodSolid(resolved);
22
23
  return wrapSolid(kernel.threadedRod(scope, resolved));
23
24
  },
24
25
  internalThreadCutter: (value) => {
25
26
  assertActive();
26
27
  const resolved = withResolutionDefaults(value);
27
- kernel.preflightInternalThreadCutter(resolved);
28
+ preflightInternalThreadCutterSolid(resolved);
28
29
  return wrapSolid(kernel.internalThreadCutter(scope, resolved));
29
30
  },
30
31
  threadedNut: (value) => {
31
32
  assertActive();
32
33
  const resolved = nutOptions(value);
33
- kernel.preflightThreadedNut(resolved);
34
+ preflightThreadedNutSolid(resolved);
34
35
  return wrapSolid(kernel.threadedNut(scope, resolved));
35
36
  },
36
- preflightThreadedRod: (value) => {
37
- assertActive();
38
- return kernel.preflightThreadedRod(withResolutionDefaults(value));
39
- },
40
- preflightThreadedNut: (value) => {
41
- assertActive();
42
- return kernel.preflightThreadedNut(nutOptions(value));
43
- },
44
- preflightInternalThreadCutter: (value) => {
45
- assertActive();
46
- return kernel.preflightInternalThreadCutter(withResolutionDefaults(value));
47
- },
48
37
  };
49
38
  return operations;
50
39
  }
@@ -1,7 +1,7 @@
1
- import { anchor3, boxAnchor3 } from "../../../geometry/anchors.js";
2
- import { resolveCylinderRadii } from "../../../geometry/cylinder.js";
3
1
  import { vector3Data } from "../../../geometry/math/vector-value.js";
4
- import { resolveTubeRadii } from "../../../geometry/primitive-resolvers.js";
2
+ import { resolveCylinderRadii } from "../../../geometry/primitives/cylinder.js";
3
+ import { resolveTubeRadii } from "../../../geometry/primitives/resolvers.js";
4
+ import { anchor3, boxAnchor3 } from "../../../geometry/transforms/anchors.js";
5
5
  const faces = ["left", "right", "back", "front", "bottom", "top"];
6
6
  /** Nominal primitive datums; construction validates dimensions before these factories run. */
7
7
  export function boxAnchors(options) {
@@ -10,7 +10,7 @@ export function boxAnchors(options) {
10
10
  : vector3Data(options.size);
11
11
  const center = options.center === false ? [size[0] / 2, size[1] / 2, size[2] / 2] : [0, 0, 0];
12
12
  return {
13
- center: anchor3(center, [0, 0, 1]),
13
+ center: anchor3({ position: center, direction: [0, 0, 1] }),
14
14
  ...Object.fromEntries(faces.map((face) => [
15
15
  face,
16
16
  boxAnchor3({
@@ -28,13 +28,17 @@ function axialAnchors(radii, height, centered) {
28
28
  const radius = (radii[0] + radii[1]) / 2;
29
29
  const slope = (radii[1] - radii[0]) / height;
30
30
  return {
31
- center: anchor3([0, 0, middle], [0, 0, 1]),
32
- ...(radii[0] === 0 ? {} : { bottom: anchor3([0, 0, bottom], [0, 0, -1]) }),
33
- ...(radii[1] === 0 ? {} : { top: anchor3([0, 0, bottom + height], [0, 0, 1]) }),
34
- right: anchor3([radius, 0, middle], [1, 0, -slope], [0, 0, 1]),
35
- left: anchor3([-radius, 0, middle], [-1, 0, -slope], [0, 0, 1]),
36
- front: anchor3([0, radius, middle], [0, 1, -slope], [0, 0, 1]),
37
- back: anchor3([0, -radius, middle], [0, -1, -slope], [0, 0, 1]),
31
+ center: anchor3({ position: [0, 0, middle], direction: [0, 0, 1] }),
32
+ ...(radii[0] === 0
33
+ ? {}
34
+ : { bottom: anchor3({ position: [0, 0, bottom], direction: [0, 0, -1] }) }),
35
+ ...(radii[1] === 0
36
+ ? {}
37
+ : { top: anchor3({ position: [0, 0, bottom + height], direction: [0, 0, 1] }) }),
38
+ right: anchor3({ position: [radius, 0, middle], direction: [1, 0, -slope], up: [0, 0, 1] }),
39
+ left: anchor3({ position: [-radius, 0, middle], direction: [-1, 0, -slope], up: [0, 0, 1] }),
40
+ front: anchor3({ position: [0, radius, middle], direction: [0, 1, -slope], up: [0, 0, 1] }),
41
+ back: anchor3({ position: [0, -radius, middle], direction: [0, -1, -slope], up: [0, 0, 1] }),
38
42
  };
39
43
  }
40
44
  /** Cylinder and frustum cap anchors omit an end whose nominal radius is zero. */
@@ -60,16 +64,16 @@ export function torusAnchors(options) {
60
64
  export function planarAnchors(size, centered = true) {
61
65
  const x = centered ? 0 : size[0] / 2, y = centered ? 0 : size[1] / 2;
62
66
  return {
63
- center: anchor3([x, y, 0], [0, 0, 1]),
64
- top: anchor3([x, y, 0], [0, 0, 1]),
65
- bottom: anchor3([x, y, 0], [0, 0, -1]),
66
- right: anchor3([x + size[0] / 2, y, 0], [1, 0, 0], [0, 0, 1]),
67
- left: anchor3([x - size[0] / 2, y, 0], [-1, 0, 0], [0, 0, 1]),
68
- front: anchor3([x, y + size[1] / 2, 0], [0, 1, 0], [0, 0, 1]),
69
- back: anchor3([x, y - size[1] / 2, 0], [0, -1, 0], [0, 0, 1]),
67
+ center: anchor3({ position: [x, y, 0], direction: [0, 0, 1] }),
68
+ top: anchor3({ position: [x, y, 0], direction: [0, 0, 1] }),
69
+ bottom: anchor3({ position: [x, y, 0], direction: [0, 0, -1] }),
70
+ right: anchor3({ position: [x + size[0] / 2, y, 0], direction: [1, 0, 0], up: [0, 0, 1] }),
71
+ left: anchor3({ position: [x - size[0] / 2, y, 0], direction: [-1, 0, 0], up: [0, 0, 1] }),
72
+ front: anchor3({ position: [x, y + size[1] / 2, 0], direction: [0, 1, 0], up: [0, 0, 1] }),
73
+ back: anchor3({ position: [x, y - size[1] / 2, 0], direction: [0, -1, 0], up: [0, 0, 1] }),
70
74
  };
71
75
  }
72
76
  /** A construction-origin reference for primitives without meaningful principal side datums. */
73
77
  export const originAnchor = () => ({
74
- center: anchor3([0, 0, 0], [0, 0, 1]),
78
+ center: anchor3({ position: [0, 0, 0], direction: [0, 0, 1] }),
75
79
  });