@metamesh/modeling 0.13.0 → 0.14.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 (654) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +52 -9
  3. package/dist/api/engine.d.ts +3 -3
  4. package/dist/api/geometry.d.ts +521 -185
  5. package/dist/api/index.d.ts +414 -145
  6. package/dist/api/text.d.ts +3 -3
  7. package/dist/docs/guides/concepts.md +114 -11
  8. package/dist/docs/guides/fonts.md +8 -0
  9. package/dist/docs/guides/fundamentals.md +4 -2
  10. package/dist/docs/guides/generation.md +6 -4
  11. package/dist/docs/guides/hosting.md +7 -4
  12. package/dist/docs/guides/recipes.md +52 -2
  13. package/dist/docs/manifest.json +1246 -394
  14. package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
  15. package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
  16. package/dist/docs/reference/engine/GenerationOptions.md +1 -1
  17. package/dist/docs/reference/engine/GeometryResource.md +1 -1
  18. package/dist/docs/reference/engine/ModelDependencies.md +1 -1
  19. package/dist/docs/reference/engine/ModelEngine.md +1 -1
  20. package/dist/docs/reference/engine/ModelEngineOptions.md +1 -1
  21. package/dist/docs/reference/engine/ModelSession.md +1 -1
  22. package/dist/docs/reference/engine/ModelSnapshot.md +1 -1
  23. package/dist/docs/reference/engine/SessionOptions.md +1 -1
  24. package/dist/docs/reference/engine/SnapshotPart.md +3 -3
  25. package/dist/docs/reference/engine/categories/host-lifecycle.md +1 -1
  26. package/dist/docs/reference/engine/createModelEngine.md +1 -1
  27. package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
  28. package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
  29. package/dist/docs/reference/engine/validateModel.md +1 -1
  30. package/dist/docs/reference/engine.md +1 -1
  31. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
  32. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +14 -1
  33. package/dist/docs/reference/geometry/Anchor3.md +9 -5
  34. package/dist/docs/reference/geometry/ArcCurve2.md +3 -3
  35. package/dist/docs/reference/geometry/ArcCurve3.md +5 -5
  36. package/dist/docs/reference/geometry/AttachTransformOptions.md +5 -1
  37. package/dist/docs/reference/geometry/AxisAngleRotation3.md +6 -1
  38. package/dist/docs/reference/geometry/Bounds2.md +4 -4
  39. package/dist/docs/reference/geometry/Bounds3.md +4 -4
  40. package/dist/docs/reference/geometry/BoundsFit2.md +3 -3
  41. package/dist/docs/reference/geometry/BoundsFit3.md +3 -3
  42. package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
  43. package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
  44. package/dist/docs/reference/geometry/BoxAnchorFace.md +8 -1
  45. package/dist/docs/reference/geometry/BoxAnchorOptions.md +8 -4
  46. package/dist/docs/reference/geometry/BoxEdge.md +1 -1
  47. package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
  48. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
  49. package/dist/docs/reference/geometry/BoxOptions.md +3 -3
  50. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
  51. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
  52. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
  53. package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
  54. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
  55. package/dist/docs/reference/geometry/CircularResolutionOptions.md +107 -0
  56. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
  57. package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
  58. package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +34 -0
  59. package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +65 -0
  60. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
  61. package/dist/docs/reference/geometry/Contour.md +3 -3
  62. package/dist/docs/reference/geometry/ContourCurve.md +1 -1
  63. package/dist/docs/reference/geometry/ContourPoint.md +1 -1
  64. package/dist/docs/reference/geometry/ContourSegment.md +1 -1
  65. package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
  66. package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
  67. package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
  68. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
  69. package/dist/docs/reference/geometry/CubicBezierCurve2.md +6 -6
  70. package/dist/docs/reference/geometry/CubicBezierCurve3.md +6 -6
  71. package/dist/docs/reference/geometry/Curve2.md +1 -1
  72. package/dist/docs/reference/geometry/Curve3.md +1 -1
  73. package/dist/docs/reference/geometry/CurveSamplingOptions.md +1 -1
  74. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +3 -3
  75. package/dist/docs/reference/geometry/CylinderAnchorFace.md +8 -1
  76. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +7 -3
  77. package/dist/docs/reference/geometry/CylinderOptions.md +1 -1
  78. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +1 -1
  79. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
  80. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
  81. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +1 -1
  82. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
  83. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
  84. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
  85. package/dist/docs/reference/geometry/CylindricalGearSpec.md +1 -1
  86. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
  87. package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
  88. package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -3
  89. package/dist/docs/reference/geometry/EndTreatments.md +1 -1
  90. package/dist/docs/reference/geometry/ExtrudeOptions.md +3 -3
  91. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +3 -3
  92. package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
  93. package/dist/docs/reference/geometry/Frame3.md +6 -6
  94. package/dist/docs/reference/geometry/GeometryError.md +1 -1
  95. package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
  96. package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
  97. package/dist/docs/reference/geometry/GeometryResolution.md +10 -1
  98. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
  99. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
  100. package/dist/docs/reference/geometry/GridPatternOptions.md +4 -4
  101. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
  102. package/dist/docs/reference/geometry/HeightfieldOptions.md +5 -5
  103. package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
  104. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +1 -1
  105. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +1 -1
  106. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
  107. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +7 -3
  108. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +1 -1
  109. package/dist/docs/reference/geometry/LineCurve2.md +4 -4
  110. package/dist/docs/reference/geometry/LineCurve3.md +4 -4
  111. package/dist/docs/reference/geometry/LinearPatternOptions.md +3 -3
  112. package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
  113. package/dist/docs/reference/geometry/LoftMeshStation.md +1 -1
  114. package/dist/docs/reference/geometry/LoftOptions.md +1 -1
  115. package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
  116. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
  117. package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
  118. package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
  119. package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
  120. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
  121. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
  122. package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
  123. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
  124. package/dist/docs/reference/geometry/Path2.md +3 -3
  125. package/dist/docs/reference/geometry/Path3.md +3 -3
  126. package/dist/docs/reference/geometry/PathFrame.md +5 -5
  127. package/dist/docs/reference/geometry/PathNormalGuide.md +5 -5
  128. package/dist/docs/reference/geometry/PathPatternOptions.md +1 -1
  129. package/dist/docs/reference/geometry/PathPlacement.md +4 -4
  130. package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
  131. package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
  132. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
  133. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +1 -1
  134. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
  135. package/dist/docs/reference/geometry/PlanarPatchQuality.md +3 -3
  136. package/dist/docs/reference/geometry/{Polygon.md → PolygonData.md} +2 -2
  137. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +1 -1
  138. package/dist/docs/reference/geometry/PrimitivePlacement.md +1 -1
  139. package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +1 -1
  140. package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
  141. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
  142. package/dist/docs/reference/geometry/Profile.md +1 -1
  143. package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
  144. package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
  145. package/dist/docs/reference/geometry/ProfileSpan2.md +3 -3
  146. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
  147. package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
  148. package/dist/docs/reference/geometry/RackPitchSpec.md +1 -1
  149. package/dist/docs/reference/geometry/RadialPatternOptions.md +4 -4
  150. package/dist/docs/reference/geometry/RadialSizing.md +1 -1
  151. package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
  152. package/dist/docs/reference/geometry/RectangleContourOptions.md +3 -3
  153. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
  154. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
  155. package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
  156. package/dist/docs/reference/geometry/RegionData.md +14 -0
  157. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +1 -1
  158. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
  159. package/dist/docs/reference/geometry/RevolveOptions.md +1 -1
  160. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
  161. package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
  162. package/dist/docs/reference/geometry/SampleContourOptions.md +1 -1
  163. package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
  164. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +1 -1
  165. package/dist/docs/reference/geometry/SampledCurve2.md +4 -4
  166. package/dist/docs/reference/geometry/SampledCurve3.md +4 -4
  167. package/dist/docs/reference/geometry/SampledThreadHelices.md +1 -1
  168. package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
  169. package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
  170. package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
  171. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
  172. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +1 -1
  173. package/dist/docs/reference/geometry/SphereOptions.md +1 -1
  174. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
  175. package/dist/docs/reference/geometry/StrokePathCap.md +1 -1
  176. package/dist/docs/reference/geometry/StrokePathJoin.md +1 -1
  177. package/dist/docs/reference/geometry/StrokePathRegionOptions.md +2 -2
  178. package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
  179. package/dist/docs/reference/geometry/SvgRegionPreflight.md +3 -3
  180. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +1 -1
  181. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +1 -1
  182. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +1 -1
  183. package/dist/docs/reference/geometry/SweepOptions.md +3 -3
  184. package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
  185. package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
  186. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +1 -1
  187. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
  188. package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
  189. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
  190. package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
  191. package/dist/docs/reference/geometry/ThreadHelixOptions.md +1 -1
  192. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
  193. package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
  194. package/dist/docs/reference/geometry/ThreadProfile.md +3 -3
  195. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
  196. package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
  197. package/dist/docs/reference/geometry/ThreadRole.md +1 -1
  198. package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
  199. package/dist/docs/reference/geometry/ThreadedNutOptions.md +1 -1
  200. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
  201. package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
  202. package/dist/docs/reference/geometry/ThreadedRodOptions.md +1 -1
  203. package/dist/docs/reference/geometry/TorusOptions.md +1 -1
  204. package/dist/docs/reference/geometry/Transform2-type.md +255 -0
  205. package/dist/docs/reference/geometry/Transform2Input.md +19 -0
  206. package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
  207. package/dist/docs/reference/geometry/Transform3-type.md +295 -0
  208. package/dist/docs/reference/geometry/Transform3Input.md +19 -0
  209. package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
  210. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +1 -1
  211. package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
  212. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +1 -1
  213. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
  214. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
  215. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +1 -1
  216. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
  217. package/dist/docs/reference/geometry/TriangleMeshSignature.md +1 -1
  218. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +1 -1
  219. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
  220. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
  221. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
  222. package/dist/docs/reference/geometry/TubeOptions.md +1 -1
  223. package/dist/docs/reference/geometry/Vector2-type.md +269 -0
  224. package/dist/docs/reference/geometry/Vector2Input.md +19 -0
  225. package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
  226. package/dist/docs/reference/geometry/Vector3-type.md +281 -0
  227. package/dist/docs/reference/geometry/Vector3Input.md +19 -0
  228. package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
  229. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +1 -1
  230. package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
  231. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
  232. package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
  233. package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
  234. package/dist/docs/reference/geometry/add2.md +36 -0
  235. package/dist/docs/reference/geometry/add3.md +10 -6
  236. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
  237. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +1 -1
  238. package/dist/docs/reference/geometry/anchorFrame3.md +1 -1
  239. package/dist/docs/reference/geometry/applyTransformDirection3.md +11 -7
  240. package/dist/docs/reference/geometry/applyTransformPoint3.md +11 -7
  241. package/dist/docs/reference/geometry/attachTransform.md +8 -4
  242. package/dist/docs/reference/geometry/boundsCenter.md +7 -7
  243. package/dist/docs/reference/geometry/boundsFromSize.md +7 -7
  244. package/dist/docs/reference/geometry/boundsSize.md +7 -7
  245. package/dist/docs/reference/geometry/boxAnchor3.md +7 -3
  246. package/dist/docs/reference/geometry/buildHelicalThreadRidgeMesh.md +1 -1
  247. package/dist/docs/reference/geometry/buildHelicalThreadSolidMesh.md +1 -1
  248. package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
  249. package/dist/docs/reference/geometry/categories/curves-paths.md +6 -3
  250. package/dist/docs/reference/geometry/categories/mechanical.md +1 -1
  251. package/dist/docs/reference/geometry/categories/meshes.md +1 -1
  252. package/dist/docs/reference/geometry/categories/pattern-placement.md +2 -2
  253. package/dist/docs/reference/geometry/categories/primitive-options.md +1 -1
  254. package/dist/docs/reference/geometry/categories/profiles-regions.md +6 -6
  255. package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -2
  256. package/dist/docs/reference/geometry/categories/transforms-math.md +37 -8
  257. package/dist/docs/reference/geometry/categories/vector-import.md +2 -2
  258. package/dist/docs/reference/geometry/circleContour.md +1 -1
  259. package/dist/docs/reference/geometry/closeToAxis.md +4 -4
  260. package/dist/docs/reference/geometry/closestPointOnPath.md +110 -0
  261. package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
  262. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +1 -1
  263. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +1 -1
  264. package/dist/docs/reference/geometry/composeTransform3.md +10 -6
  265. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +5 -5
  266. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +5 -5
  267. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +4 -4
  268. package/dist/docs/reference/geometry/containsBounds.md +1 -1
  269. package/dist/docs/reference/geometry/contourContainsPoint.md +4 -4
  270. package/dist/docs/reference/geometry/createAnchor3.md +10 -6
  271. package/dist/docs/reference/geometry/createThreadProfile.md +1 -1
  272. package/dist/docs/reference/geometry/createTriangleMeshSignature.md +1 -1
  273. package/dist/docs/reference/geometry/cross2.md +36 -0
  274. package/dist/docs/reference/geometry/cross3.md +10 -6
  275. package/dist/docs/reference/geometry/cumulativePathLengths.md +4 -4
  276. package/dist/docs/reference/geometry/cylinderAnchor3.md +6 -2
  277. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
  278. package/dist/docs/reference/geometry/distance2.md +36 -0
  279. package/dist/docs/reference/geometry/distance3.md +36 -0
  280. package/dist/docs/reference/geometry/distributeAlongPath.md +4 -4
  281. package/dist/docs/reference/geometry/dot2.md +36 -0
  282. package/dist/docs/reference/geometry/dot3.md +9 -5
  283. package/dist/docs/reference/geometry/ellipseContour.md +1 -1
  284. package/dist/docs/reference/geometry/eulerTransform3.md +10 -6
  285. package/dist/docs/reference/geometry/extrudeMesh.md +2 -2
  286. package/dist/docs/reference/geometry/fitBounds.md +1 -1
  287. package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
  288. package/dist/docs/reference/geometry/frameTransform3.md +8 -4
  289. package/dist/docs/reference/geometry/getMetricClearanceHole.md +1 -1
  290. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
  291. package/dist/docs/reference/geometry/gridPatternTransforms.md +4 -4
  292. package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
  293. package/dist/docs/reference/geometry/inverseTransform3.md +9 -5
  294. package/dist/docs/reference/geometry/isGeometryError.md +1 -1
  295. package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
  296. package/dist/docs/reference/geometry/layoutRow.md +4 -4
  297. package/dist/docs/reference/geometry/length2.md +30 -0
  298. package/dist/docs/reference/geometry/length3.md +8 -4
  299. package/dist/docs/reference/geometry/lerp2.md +42 -0
  300. package/dist/docs/reference/geometry/lerp3.md +10 -6
  301. package/dist/docs/reference/geometry/linearPatternTransforms.md +4 -4
  302. package/dist/docs/reference/geometry/loftMesh.md +1 -1
  303. package/dist/docs/reference/geometry/matchProfiles.md +1 -1
  304. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +3 -2
  305. package/dist/docs/reference/geometry/measureTriangleMesh.md +1 -1
  306. package/dist/docs/reference/geometry/meshBounds.md +1 -1
  307. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +1 -1
  308. package/dist/docs/reference/geometry/normalize2.md +36 -0
  309. package/dist/docs/reference/geometry/normalize3.md +10 -6
  310. package/dist/docs/reference/geometry/normalizeContour.md +4 -4
  311. package/dist/docs/reference/geometry/normalizePolygon.md +5 -5
  312. package/dist/docs/reference/geometry/normalizeRegion.md +5 -5
  313. package/dist/docs/reference/geometry/optimizePlanarPatches.md +1 -1
  314. package/dist/docs/reference/geometry/pathLength.md +4 -4
  315. package/dist/docs/reference/geometry/pathPatternTransforms.md +6 -6
  316. package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
  317. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +1 -1
  318. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +1 -1
  319. package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
  320. package/dist/docs/reference/geometry/preflightThreadedNut.md +1 -1
  321. package/dist/docs/reference/geometry/preflightThreadedRod.md +1 -1
  322. package/dist/docs/reference/geometry/projectOntoPlane3.md +10 -6
  323. package/dist/docs/reference/geometry/radialPatternTransforms.md +6 -6
  324. package/dist/docs/reference/geometry/rectangleContour.md +2 -2
  325. package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
  326. package/dist/docs/reference/geometry/regionArea.md +4 -4
  327. package/dist/docs/reference/geometry/regionBounds.md +4 -4
  328. package/dist/docs/reference/geometry/regularPolygonContour.md +4 -4
  329. package/dist/docs/reference/geometry/resamplePolyline2.md +4 -4
  330. package/dist/docs/reference/geometry/resamplePolyline3.md +4 -4
  331. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +5 -1
  332. package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
  333. package/dist/docs/reference/geometry/resolveCircularSegments.md +6 -5
  334. package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
  335. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
  336. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +5 -5
  337. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
  338. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
  339. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
  340. package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
  341. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +1 -1
  342. package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
  343. package/dist/docs/reference/geometry/revolveMesh.md +4 -4
  344. package/dist/docs/reference/geometry/rotate2.md +36 -0
  345. package/dist/docs/reference/geometry/rotationTransform3.md +10 -6
  346. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +5 -5
  347. package/dist/docs/reference/geometry/sampleContour.md +1 -1
  348. package/dist/docs/reference/geometry/sampleCurve2.md +1 -1
  349. package/dist/docs/reference/geometry/sampleCurve3.md +1 -1
  350. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
  351. package/dist/docs/reference/geometry/sampleHelix.md +4 -4
  352. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
  353. package/dist/docs/reference/geometry/sampleRackToothPath.md +1 -1
  354. package/dist/docs/reference/geometry/sampleSideProfile.md +4 -4
  355. package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
  356. package/dist/docs/reference/geometry/sampleThreadHelices.md +1 -1
  357. package/dist/docs/reference/geometry/scale2.md +36 -0
  358. package/dist/docs/reference/geometry/scale3.md +9 -5
  359. package/dist/docs/reference/geometry/scaleTransform3.md +10 -6
  360. package/dist/docs/reference/geometry/signedContourArea.md +1 -1
  361. package/dist/docs/reference/geometry/starContour.md +4 -4
  362. package/dist/docs/reference/geometry/strokePathRegion.md +4 -4
  363. package/dist/docs/reference/geometry/subtract2.md +36 -0
  364. package/dist/docs/reference/geometry/subtract3.md +10 -6
  365. package/dist/docs/reference/geometry/sweepMesh.md +5 -5
  366. package/dist/docs/reference/geometry/transform2.md +38 -0
  367. package/dist/docs/reference/geometry/transform3.md +38 -0
  368. package/dist/docs/reference/geometry/transformContour.md +5 -5
  369. package/dist/docs/reference/geometry/transformDeterminant3.md +8 -4
  370. package/dist/docs/reference/geometry/transformPath2.md +5 -5
  371. package/dist/docs/reference/geometry/transformPath3.md +5 -5
  372. package/dist/docs/reference/geometry/transformRegionData.md +40 -0
  373. package/dist/docs/reference/geometry/transformTriangleMesh.md +4 -4
  374. package/dist/docs/reference/geometry/translationTransform3.md +10 -6
  375. package/dist/docs/reference/geometry/triangulateContour.md +1 -1
  376. package/dist/docs/reference/geometry/validateSolidMesh.md +1 -1
  377. package/dist/docs/reference/geometry/validateTransform3.md +9 -5
  378. package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
  379. package/dist/docs/reference/geometry/vector2.md +31 -0
  380. package/dist/docs/reference/geometry/vector3.md +38 -0
  381. package/dist/docs/reference/geometry.md +2 -2
  382. package/dist/docs/reference/model/Anchor3.md +5 -5
  383. package/dist/docs/reference/model/AttachOptions.md +1 -1
  384. package/dist/docs/reference/model/Bounds2.md +4 -4
  385. package/dist/docs/reference/model/Bounds3.md +4 -4
  386. package/dist/docs/reference/model/BoxEdge.md +1 -1
  387. package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
  388. package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
  389. package/dist/docs/reference/model/BoxOptions.md +3 -3
  390. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
  391. package/dist/docs/reference/model/CircleContourOptions.md +1 -1
  392. package/dist/docs/reference/model/CircleOptions.md +1 -1
  393. package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
  394. package/dist/docs/reference/model/Computed.md +1 -1
  395. package/dist/docs/reference/model/ComputedValue.md +1 -1
  396. package/dist/docs/reference/model/Contour.md +3 -3
  397. package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
  398. package/dist/docs/reference/model/CorrespondingContour.md +1 -1
  399. package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
  400. package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
  401. package/dist/docs/reference/model/CylinderOptions.md +1 -1
  402. package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
  403. package/dist/docs/reference/model/EdgeTreatment.md +1 -1
  404. package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
  405. package/dist/docs/reference/model/EllipseOptions.md +1 -1
  406. package/dist/docs/reference/model/EndTreatments.md +1 -1
  407. package/dist/docs/reference/model/ExtrudeOptions.md +3 -3
  408. package/dist/docs/reference/model/FinalizedModel.md +1 -1
  409. package/dist/docs/reference/model/FinalizedPart.md +1 -1
  410. package/dist/docs/reference/model/Frame3.md +6 -6
  411. package/dist/docs/reference/model/GenerateCallback.md +1 -1
  412. package/dist/docs/reference/model/GenerateContext.md +5 -5
  413. package/dist/docs/reference/model/GeneratedPart.md +6 -6
  414. package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
  415. package/dist/docs/reference/model/GenerationError.md +1 -1
  416. package/dist/docs/reference/model/GeometryResolution.md +1 -1
  417. package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
  418. package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
  419. package/dist/docs/reference/model/GridPatternOptions.md +4 -4
  420. package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
  421. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +1 -1
  422. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
  423. package/dist/docs/reference/model/HullOptions.md +7 -7
  424. package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
  425. package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
  426. package/dist/docs/reference/model/ImplicitOptions.md +4 -4
  427. package/dist/docs/reference/model/InternalThreadCutterOptions.md +1 -1
  428. package/dist/docs/reference/model/LinearPatternOptions.md +3 -3
  429. package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
  430. package/dist/docs/reference/model/LoftOptions.md +1 -1
  431. package/dist/docs/reference/model/LoftPlacement.md +1 -1
  432. package/dist/docs/reference/model/LoftStation.md +2 -2
  433. package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
  434. package/dist/docs/reference/model/ModelProgram.md +1 -1
  435. package/dist/docs/reference/model/ModelingLimits.md +1 -1
  436. package/dist/docs/reference/model/NumericArray.md +1 -1
  437. package/dist/docs/reference/model/PartGeometry.md +1 -1
  438. package/dist/docs/reference/model/PartOptions.md +6 -6
  439. package/dist/docs/reference/model/{fromRegion.md → Path2.md} +5 -18
  440. package/dist/docs/reference/model/PathNormalGuide.md +5 -5
  441. package/dist/docs/reference/model/PathPatternOptions.md +1 -1
  442. package/dist/docs/reference/model/PatternSource.md +2 -2
  443. package/dist/docs/reference/model/Pivot2Options.md +27 -0
  444. package/dist/docs/reference/model/Pivot3Options.md +27 -0
  445. package/dist/docs/reference/model/PlaneOptions.md +3 -3
  446. package/dist/docs/reference/model/{Polygon-type.md → PolygonData.md} +2 -2
  447. package/dist/docs/reference/model/PolygonOptions.md +81 -4
  448. package/dist/docs/reference/model/PrimitivePlacement.md +1 -1
  449. package/dist/docs/reference/model/PrimitivePlacementOptions.md +1 -1
  450. package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
  451. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
  452. package/dist/docs/reference/model/Profile.md +1 -1
  453. package/dist/docs/reference/model/ProfileComponent2.md +1 -1
  454. package/dist/docs/reference/model/ProfileContour2.md +1 -1
  455. package/dist/docs/reference/model/ProfileSpan2.md +3 -3
  456. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
  457. package/dist/docs/reference/model/RadialPatternOptions.md +4 -4
  458. package/dist/docs/reference/model/RadialSizing.md +1 -1
  459. package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
  460. package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
  461. package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
  462. package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
  463. package/dist/docs/reference/model/RectangleOptions.md +3 -3
  464. package/dist/docs/reference/model/{Region.md → RegionData.md} +4 -4
  465. package/dist/docs/reference/model/RegularPolygonOptions.md +1 -1
  466. package/dist/docs/reference/model/RevolveOptions.md +1 -1
  467. package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
  468. package/dist/docs/reference/model/Section.md +75 -35
  469. package/dist/docs/reference/model/SectionHullOptions.md +7 -7
  470. package/dist/docs/reference/model/SectionInspection.md +4 -4
  471. package/dist/docs/reference/model/{RegionOffsetJoin.md → SectionOffsetJoin.md} +3 -3
  472. package/dist/docs/reference/model/{RegionOffsetOptions.md → SectionOffsetOptions.md} +4 -4
  473. package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
  474. package/dist/docs/reference/model/Solid.md +44 -21
  475. package/dist/docs/reference/model/SolidInspection.md +4 -4
  476. package/dist/docs/reference/model/SolidRayHit.md +4 -4
  477. package/dist/docs/reference/model/SphereOptions.md +1 -1
  478. package/dist/docs/reference/model/StarOptions.md +1 -1
  479. package/dist/docs/reference/model/StrokeOptions.md +91 -0
  480. package/dist/docs/reference/model/StrokePathCap.md +16 -0
  481. package/dist/docs/reference/model/StrokePathJoin.md +16 -0
  482. package/dist/docs/reference/model/SvgOrigin.md +1 -1
  483. package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
  484. package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
  485. package/dist/docs/reference/model/SweepOptions.md +3 -3
  486. package/dist/docs/reference/model/SweepOrientation.md +7 -7
  487. package/dist/docs/reference/model/TextSectionOptions.md +1 -1
  488. package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
  489. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
  490. package/dist/docs/reference/model/ThreadHandedness.md +1 -1
  491. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
  492. package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
  493. package/dist/docs/reference/model/ThreadProfile.md +3 -3
  494. package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
  495. package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
  496. package/dist/docs/reference/model/ThreadedNutOptions.md +1 -1
  497. package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
  498. package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
  499. package/dist/docs/reference/model/ThreadedRodOptions.md +1 -1
  500. package/dist/docs/reference/model/TorusOptions.md +1 -1
  501. package/dist/docs/reference/model/Transform2-type.md +256 -0
  502. package/dist/docs/reference/model/Transform2Input.md +20 -0
  503. package/dist/docs/reference/model/Transform2Matrix.md +15 -0
  504. package/dist/docs/reference/model/Transform3-type.md +296 -0
  505. package/dist/docs/reference/model/Transform3Input.md +20 -0
  506. package/dist/docs/reference/model/{Transform3.md → Transform3Matrix.md} +3 -3
  507. package/dist/docs/reference/model/TriangleMesh.md +1 -1
  508. package/dist/docs/reference/model/TriangleMeshAnalysis.md +1 -1
  509. package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
  510. package/dist/docs/reference/model/TubeOptions.md +1 -1
  511. package/dist/docs/reference/model/Vector2-type.md +270 -0
  512. package/dist/docs/reference/model/Vector2Input.md +20 -0
  513. package/dist/docs/reference/model/{Vector2.md → Vector2Tuple.md} +3 -3
  514. package/dist/docs/reference/model/Vector3-type.md +282 -0
  515. package/dist/docs/reference/model/Vector3Input.md +20 -0
  516. package/dist/docs/reference/model/{Vector3.md → Vector3Tuple.md} +3 -3
  517. package/dist/docs/reference/model/VectorTextLayout.md +1 -1
  518. package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
  519. package/dist/docs/reference/model/anchor.md +1 -1
  520. package/dist/docs/reference/model/box.md +2 -2
  521. package/dist/docs/reference/model/categories/boolean-operations.md +4 -4
  522. package/dist/docs/reference/model/categories/bounded-surfaces.md +3 -3
  523. package/dist/docs/reference/model/categories/contracts.md +1 -1
  524. package/dist/docs/reference/model/categories/core-values-errors.md +5 -5
  525. package/dist/docs/reference/model/categories/explicit-profiles.md +2 -2
  526. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +1 -1
  527. package/dist/docs/reference/model/categories/generation.md +1 -1
  528. package/dist/docs/reference/model/categories/inspection.md +5 -5
  529. package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
  530. package/dist/docs/reference/model/categories/primitives.md +2 -2
  531. package/dist/docs/reference/model/categories/resolution.md +1 -1
  532. package/dist/docs/reference/model/categories/sections.md +11 -8
  533. package/dist/docs/reference/model/categories/threads.md +1 -1
  534. package/dist/docs/reference/model/categories/transforms-placement.md +21 -7
  535. package/dist/docs/reference/model/circle.md +1 -1
  536. package/dist/docs/reference/model/components.md +7 -4
  537. package/dist/docs/reference/model/compose.md +1 -1
  538. package/dist/docs/reference/model/cylinder.md +1 -1
  539. package/dist/docs/reference/model/distance.md +2 -2
  540. package/dist/docs/reference/model/ellipse.md +1 -1
  541. package/dist/docs/reference/model/extrude.md +2 -2
  542. package/dist/docs/reference/model/generate.md +1 -1
  543. package/dist/docs/reference/model/gridPattern.md +1 -1
  544. package/dist/docs/reference/model/heightfield.md +2 -2
  545. package/dist/docs/reference/model/hull.md +2 -2
  546. package/dist/docs/reference/model/immutableBuffer.md +1 -1
  547. package/dist/docs/reference/model/immutableMesh.md +1 -1
  548. package/dist/docs/reference/model/implicit.md +3 -3
  549. package/dist/docs/reference/model/inspectSection.md +1 -1
  550. package/dist/docs/reference/model/inspectSolid.md +1 -1
  551. package/dist/docs/reference/model/internalThreadCutter.md +1 -1
  552. package/dist/docs/reference/model/intersect.md +1 -1
  553. package/dist/docs/reference/model/isEmpty.md +2 -2
  554. package/dist/docs/reference/model/linearPattern.md +1 -1
  555. package/dist/docs/reference/model/loft.md +1 -1
  556. package/dist/docs/reference/model/matchProfiles.md +1 -1
  557. package/dist/docs/reference/model/minkowskiSum.md +1 -1
  558. package/dist/docs/reference/model/pathPattern.md +6 -6
  559. package/dist/docs/reference/model/polygon.md +1 -1
  560. package/dist/docs/reference/model/preflightInternalThreadCutter.md +1 -1
  561. package/dist/docs/reference/model/preflightThreadedNut.md +1 -1
  562. package/dist/docs/reference/model/preflightThreadedRod.md +1 -1
  563. package/dist/docs/reference/model/radialPattern.md +5 -5
  564. package/dist/docs/reference/model/rayCast.md +5 -5
  565. package/dist/docs/reference/model/rectangle.md +2 -2
  566. package/dist/docs/reference/model/regularPolygon.md +1 -1
  567. package/dist/docs/reference/model/revolve.md +1 -1
  568. package/dist/docs/reference/model/solidFromMesh.md +1 -1
  569. package/dist/docs/reference/model/sphere.md +1 -1
  570. package/dist/docs/reference/model/split.md +1 -1
  571. package/dist/docs/reference/model/splitByPlane.md +1 -1
  572. package/dist/docs/reference/model/star.md +1 -1
  573. package/dist/docs/reference/model/stroke.md +74 -0
  574. package/dist/docs/reference/model/svgPathSection.md +1 -1
  575. package/dist/docs/reference/model/svgSection.md +1 -1
  576. package/dist/docs/reference/model/sweep.md +5 -5
  577. package/dist/docs/reference/model/textSection.md +1 -1
  578. package/dist/docs/reference/model/threadRidge.md +1 -1
  579. package/dist/docs/reference/model/threadedNut.md +1 -1
  580. package/dist/docs/reference/model/threadedRod.md +1 -1
  581. package/dist/docs/reference/model/toTriangleMesh.md +1 -1
  582. package/dist/docs/reference/model/torus.md +1 -1
  583. package/dist/docs/reference/model/transform2.md +39 -0
  584. package/dist/docs/reference/model/transform3.md +39 -0
  585. package/dist/docs/reference/model/tube.md +1 -1
  586. package/dist/docs/reference/model/union.md +1 -1
  587. package/dist/docs/reference/model/vector2.md +32 -0
  588. package/dist/docs/reference/model/vector3.md +39 -0
  589. package/dist/docs/reference/model.md +7 -7
  590. package/dist/docs/reference/text/Bounds2.md +4 -4
  591. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
  592. package/dist/docs/reference/text/Vector2Tuple.md +7 -0
  593. package/dist/docs/reference/text/VectorFont.md +1 -1
  594. package/dist/docs/reference/text/VectorFontOptions.md +1 -1
  595. package/dist/docs/reference/text/VectorTextArcBaseline.md +1 -1
  596. package/dist/docs/reference/text/VectorTextLayout.md +1 -1
  597. package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
  598. package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
  599. package/dist/docs/reference/text/VectorTextOptions.md +1 -1
  600. package/dist/docs/reference/text/categories/font-preparation.md +2 -2
  601. package/dist/docs/reference/text/prepareVectorFont.md +1 -1
  602. package/dist/docs/reference/text.md +1 -1
  603. package/dist/engine/deferred-context.js +11 -181
  604. package/dist/engine/native/transforms.js +6 -1
  605. package/dist/engine/pattern-operations.js +2 -2
  606. package/dist/engine/primitive-profiles.js +1 -0
  607. package/dist/engine/recipe-realization.js +29 -21
  608. package/dist/engine/section-operations.js +19 -3
  609. package/dist/engine/session-graph.js +1 -1
  610. package/dist/engine/session-native.js +1 -1
  611. package/dist/engine/session-snapshot.js +3 -2
  612. package/dist/engine/session.js +3 -3
  613. package/dist/engine/shape-anchors.js +3 -9
  614. package/dist/engine/transform-operations.js +42 -25
  615. package/dist/geometry/index.js +6 -2
  616. package/dist/geometry/math/immutable-value.js +20 -0
  617. package/dist/geometry/math/vector-value.js +168 -0
  618. package/dist/geometry/math/vector2.js +80 -0
  619. package/dist/geometry/math/vector3.js +37 -7
  620. package/dist/geometry/mechanical/gear-motion.js +7 -4
  621. package/dist/geometry/mesh/mesh-solid-intersections.js +5 -1
  622. package/dist/geometry/paths/closest-point.js +74 -0
  623. package/dist/geometry/paths/frames.js +3 -3
  624. package/dist/geometry/primitive-resolution.js +4 -1
  625. package/dist/geometry/resolution.js +17 -5
  626. package/dist/geometry/stroke-path.js +48 -44
  627. package/dist/geometry/sweeps/stations.js +4 -4
  628. package/dist/geometry/sweeps/sweep-closed.js +3 -3
  629. package/dist/geometry/sweeps/sweep-open.js +3 -3
  630. package/dist/geometry/transform-chain.js +172 -0
  631. package/dist/geometry/transform-geometry.js +28 -24
  632. package/dist/geometry/transform-matrix.js +14 -0
  633. package/dist/geometry/transform2.js +60 -0
  634. package/dist/geometry/transform3.js +70 -26
  635. package/dist/index.js +3 -0
  636. package/dist/model/execution-binding.js +10 -5
  637. package/dist/model/geometry-recipes.js +15 -0
  638. package/dist/{engine → model}/immutable-generation-data.js +25 -3
  639. package/dist/model/operation-dispatch.js +10 -3
  640. package/dist/model/operations.js +21 -10
  641. package/dist/model/recipe-declaration.js +193 -0
  642. package/dist/model/shape-handles.js +15 -4
  643. package/package.json +1 -1
  644. package/dist/docs/reference/geometry/Region.md +0 -14
  645. package/dist/docs/reference/geometry/Transform3.md +0 -12
  646. package/dist/docs/reference/geometry/Vector2.md +0 -7
  647. package/dist/docs/reference/geometry/Vector3.md +0 -7
  648. package/dist/docs/reference/geometry/rotateAroundAxis3.md +0 -38
  649. package/dist/docs/reference/geometry/transformRegion.md +0 -40
  650. package/dist/docs/reference/model/Transform2.md +0 -15
  651. package/dist/docs/reference/model/toRegion.md +0 -33
  652. package/dist/docs/reference/text/Vector2.md +0 -7
  653. package/dist/engine/geometry-recipes.js +0 -12
  654. package/dist/engine/pattern-transform.js +0 -9
@@ -0,0 +1,80 @@
1
+ import { GeometryError } from "../errors.js";
2
+ /** Adds two finite XY vectors component-wise. */
3
+ export const add2 = (a, b) => [a[0] + b[0], a[1] + b[1]];
4
+ /** Subtracts `b` from `a` component-wise. */
5
+ export const subtract2 = (a, b) => [
6
+ a[0] - b[0],
7
+ a[1] - b[1],
8
+ ];
9
+ /** Multiplies a vector by a dimensionless scalar. */
10
+ export const scale2 = (vector, scale) => [
11
+ vector[0] * scale,
12
+ vector[1] * scale,
13
+ ];
14
+ /** Returns the scalar dot product. */
15
+ export const dot2 = (a, b) => a[0] * b[0] + a[1] * b[1];
16
+ /** Returns the signed scalar cross product; positive means `b` is counter-clockwise from `a`. */
17
+ export const cross2 = (a, b) => a[0] * b[1] - a[1] * b[0];
18
+ /** Returns Euclidean vector length in the vector's coordinate units. */
19
+ export const length2 = (vector) => Math.hypot(vector[0], vector[1]);
20
+ /** Returns Euclidean point distance without allocating an intermediate difference vector. */
21
+ export const distance2 = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1]);
22
+ /**
23
+ * Returns a unit vector; `epsilon` is a finite, non-negative length threshold (default `1e-12`).
24
+ * Rejects invalid thresholds, nonfinite lengths, and lengths at or below the threshold with
25
+ * `INVALID_TOLERANCE`, `NON_FINITE_VALUE`, and `DEGENERATE_GEOMETRY` respectively.
26
+ */
27
+ export const normalize2 = (vector, epsilon = 1e-12) => {
28
+ const operation = "normalize2";
29
+ if (!Number.isFinite(epsilon) || epsilon < 0) {
30
+ throw new GeometryError("INVALID_TOLERANCE", "epsilon must be finite and non-negative.", {
31
+ operation,
32
+ });
33
+ }
34
+ const length = length2(vector);
35
+ if (!Number.isFinite(length)) {
36
+ throw new GeometryError("NON_FINITE_VALUE", "Cannot normalize a vector without finite length.", {
37
+ operation,
38
+ });
39
+ }
40
+ if (length <= epsilon) {
41
+ throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot normalize a zero-length vector.", {
42
+ operation,
43
+ });
44
+ }
45
+ // Subnormal lengths lose relative precision; rescale only this rare case before division.
46
+ if (length < 2 ** -1022) {
47
+ const maximum = Math.max(Math.abs(vector[0]), Math.abs(vector[1]));
48
+ const x = vector[0] / maximum;
49
+ const y = vector[1] / maximum;
50
+ const scaledLength = Math.hypot(x, y);
51
+ return [x / scaledLength, y / scaledLength];
52
+ }
53
+ return [vector[0] / length, vector[1] / length];
54
+ };
55
+ /** Linearly interpolates two vectors; `t` is dimensionless and may extrapolate. */
56
+ export const lerp2 = (a, b, t) => add2(a, scale2(subtract2(b, a), t));
57
+ /**
58
+ * Rotates a finite vector counter-clockwise in XY by `degrees` about the origin.
59
+ * Throws `NON_FINITE_VALUE` for nonfinite coordinates, angles, or derived coordinates.
60
+ */
61
+ export const rotate2 = (vector, degrees) => {
62
+ if (!Number.isFinite(vector[0]) || !Number.isFinite(vector[1]) || !Number.isFinite(degrees)) {
63
+ throw new GeometryError("NON_FINITE_VALUE", "Rotation coordinates and angle must be finite.", {
64
+ operation: "rotate2",
65
+ });
66
+ }
67
+ const radians = degrees * (Math.PI / 180);
68
+ const cosine = Math.cos(radians);
69
+ const sine = Math.sin(radians);
70
+ const rotated = [
71
+ vector[0] * cosine - vector[1] * sine,
72
+ vector[0] * sine + vector[1] * cosine,
73
+ ];
74
+ if (!Number.isFinite(rotated[0]) || !Number.isFinite(rotated[1])) {
75
+ throw new GeometryError("NON_FINITE_VALUE", "Rotated coordinates must remain finite.", {
76
+ operation: "rotate2",
77
+ });
78
+ }
79
+ return rotated;
80
+ };
@@ -1,3 +1,4 @@
1
+ import { GeometryError } from "../errors.js";
1
2
  /**
2
3
  * Adds two finite XYZ vectors component-wise.
3
4
  * @example
@@ -5,7 +6,11 @@
5
6
  * add3([1, 2, 3], [4, 5, 6]); // [5, 7, 9]
6
7
  * ```
7
8
  */
8
- export const add3 = (a, b) => [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
9
+ export const add3 = (a, b) => [
10
+ a[0] + b[0],
11
+ a[1] + b[1],
12
+ a[2] + b[2],
13
+ ];
9
14
  /**
10
15
  * Subtracts `b` from `a`.
11
16
  * @example
@@ -52,23 +57,48 @@ export const cross3 = (a, b) => [
52
57
  ];
53
58
  /** Returns Euclidean vector length in the vector's coordinate units. */
54
59
  export const length3 = (vector) => Math.hypot(vector[0], vector[1], vector[2]);
55
- /** Normalizes a finite vector and rejects nonfinite lengths or lengths at or below `epsilon`. */
60
+ /** Returns Euclidean point distance without allocating an intermediate difference vector. */
61
+ export const distance3 = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
62
+ /**
63
+ * Returns a unit vector; `epsilon` is a finite, non-negative length threshold (default `1e-12`).
64
+ * Rejects invalid thresholds, nonfinite lengths, and lengths at or below the threshold with
65
+ * `INVALID_TOLERANCE`, `NON_FINITE_VALUE`, and `DEGENERATE_GEOMETRY` respectively.
66
+ */
56
67
  export const normalize3 = (vector, epsilon = 1e-12) => {
68
+ const operation = "normalize3";
69
+ if (!Number.isFinite(epsilon) || epsilon < 0) {
70
+ throw new GeometryError("INVALID_TOLERANCE", "epsilon must be finite and non-negative.", {
71
+ operation,
72
+ });
73
+ }
57
74
  const length = length3(vector);
58
75
  if (!Number.isFinite(length)) {
59
- throw new Error("Cannot normalize a vector without finite length.");
76
+ throw new GeometryError("NON_FINITE_VALUE", "Cannot normalize a vector without finite length.", {
77
+ operation,
78
+ });
60
79
  }
61
80
  if (length <= epsilon) {
62
- throw new Error("Cannot normalize a zero-length vector.");
81
+ throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot normalize a zero-length vector.", {
82
+ operation,
83
+ });
84
+ }
85
+ // Subnormal lengths lose relative precision; rescale only this rare case before division.
86
+ if (length < 2 ** -1022) {
87
+ const maximum = Math.max(Math.abs(vector[0]), Math.abs(vector[1]), Math.abs(vector[2]));
88
+ const x = vector[0] / maximum;
89
+ const y = vector[1] / maximum;
90
+ const z = vector[2] / maximum;
91
+ const scaledLength = Math.hypot(x, y, z);
92
+ return [x / scaledLength, y / scaledLength, z / scaledLength];
63
93
  }
64
- return scale3(vector, 1 / length);
94
+ return [vector[0] / length, vector[1] / length, vector[2] / length];
65
95
  };
66
96
  /** Linearly interpolates two vectors; `t` is dimensionless and may extrapolate. */
67
97
  export const lerp3 = (a, b, t) => add3(a, scale3(subtract3(b, a), t));
68
98
  /** Removes the component parallel to a normalized plane normal. */
69
99
  export const projectOntoPlane3 = (vector, normal) => subtract3(vector, scale3(normal, dot3(vector, normal)));
70
- /** Rotates a vector right-handed around an axis by `angle` radians. */
71
- export const rotateAroundAxis3 = (vector, axis, angle) => {
100
+ /** Rotates a vector right-handed around a unit axis by `angle` radians. */
101
+ export const rotateAroundAxis3Radians = (vector, axis, angle) => {
72
102
  const cosine = Math.cos(angle);
73
103
  const sine = Math.sin(angle);
74
104
  return add3(add3(scale3(vector, cosine), scale3(cross3(axis, vector), sine)), scale3(axis, dot3(axis, vector) * (1 - cosine)));
@@ -50,7 +50,8 @@ const multiPolygonArea = (multiPolygon) => multiPolygon.reduce((total, polygon)
50
50
  /**
51
51
  * Measures sampled kinematic interference over one tooth cycle of an internal gear pair.
52
52
  *
53
- * The driver and ring rotate in the same direction at their resolved tooth-count ratio. Each
53
+ * The driver and ring start with half-tooth offsets for odd tooth counts, then rotate in the
54
+ * same direction at their resolved tooth-count ratio. Each
54
55
  * sampled pinion outline is subtracted from the ring's center-and-space opening; remaining area is
55
56
  * solid overlap. This catches involute, tip, and trimming interference that a single assembled pose
56
57
  * misses. It is a deterministic model check, not a certified gear-rating calculation.
@@ -71,11 +72,13 @@ export function measureInternalCylindricalGearPairMotion(spec, options = {}) {
71
72
  const ringTipRadius = pair.driven.pitchRadius - pair.driven.addendum;
72
73
  const contactWindow = contactWindowPolygon(pair.centerDistance, pair.driver.outsideRadius, ringTipRadius);
73
74
  const initialRingPhase = pair.driven.toothCount % 2 === 0 ? 0 : pair.driven.angularPitch / 2;
75
+ const initialDriverPhase = pair.driver.toothCount % 2 === 0 ? 0 : pair.driver.angularPitch / 2;
74
76
  let maximumOverlapArea = 0;
75
- let maximumPhase = 0;
77
+ let maximumPhase = initialDriverPhase;
76
78
  for (let sample = 0; sample < samples; sample += 1) {
77
- const driverPhase = (pair.driver.angularPitch * sample) / samples;
78
- const drivenPhase = initialRingPhase + driverPhase / pair.ratio;
79
+ const phase = (pair.driver.angularPitch * sample) / samples;
80
+ const driverPhase = initialDriverPhase + phase;
81
+ const drivenPhase = initialRingPhase + phase / pair.ratio;
79
82
  const posedDriver = clippingPolygon(transformedLoop(driver, driverPhase));
80
83
  const posedSpace = clippingPolygon(transformedLoop(ringSpace, drivenPhase, pair.centerDistance));
81
84
  const contactDriver = polygonClipping.intersection(posedDriver, contactWindow);
@@ -1,4 +1,8 @@
1
- const subtract = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
1
+ const subtract = (a, b) => [
2
+ a[0] - b[0],
3
+ a[1] - b[1],
4
+ a[2] - b[2],
5
+ ];
2
6
  const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
3
7
  const cross = (a, b) => [
4
8
  a[1] * b[2] - a[2] * b[1],
@@ -0,0 +1,74 @@
1
+ import { GeometryError } from "../errors.js";
2
+ import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
3
+ export function closestPointOnPath(path, point, options = {}) {
4
+ const fail = (message, code = "INVALID_ARGUMENT") => {
5
+ throw new GeometryError(code, message, { operation: "closestPointOnPath" });
6
+ };
7
+ const dimensions = point.length;
8
+ const closed = options.closed ?? false;
9
+ if (typeof closed !== "boolean" || (dimensions !== 2 && dimensions !== 3))
10
+ fail("Use a 2D or 3D point and a boolean closed option.");
11
+ assertSamplingCount(path.length, "closestPointOnPath", resolveGeometrySamplingLimits(options.limits).maxPathPoints);
12
+ if (path.length < (closed ? 3 : 2))
13
+ fail("Open paths need two points; closed paths need three.");
14
+ const validate = (value) => {
15
+ if (value.length !== dimensions)
16
+ fail("Path and query points must have the same dimension.");
17
+ if (!Number.isFinite(value[0]) ||
18
+ !Number.isFinite(value[1]) ||
19
+ (dimensions === 3 && !Number.isFinite(value[2])))
20
+ fail("Path and query coordinates must be finite.", "NON_FINITE_VALUE");
21
+ };
22
+ validate(point);
23
+ validate(path[0]);
24
+ let bestDistance = Infinity, bestSquared = Infinity, edgeIndex = 0, fraction = 0;
25
+ let bestX = 0, bestY = 0, bestZ = 0;
26
+ const count = closed ? path.length : path.length - 1;
27
+ for (let i = 0; i < count; i++) {
28
+ const a = path[i], b = path[(i + 1) % path.length];
29
+ validate(b);
30
+ const dx = b[0] - a[0], dy = b[1] - a[1], dz = (b[2] ?? 0) - (a[2] ?? 0);
31
+ const px = point[0] - a[0], py = point[1] - a[1], pz = (point[2] ?? 0) - (a[2] ?? 0);
32
+ const lengthSquared = dx * dx + dy * dy + dz * dz;
33
+ let projection = (px * dx + py * dy + pz * dz) / lengthSquared;
34
+ if (!Number.isFinite(projection)) {
35
+ // Normalize only extreme extents; ordinary boundary scans use scalar squared arithmetic.
36
+ const scale = Math.max(Math.abs(dx), Math.abs(dy), Math.abs(dz));
37
+ if (!Number.isFinite(scale))
38
+ fail("Path extent exceeds finite arithmetic.", "NON_FINITE_VALUE");
39
+ if (scale === 0)
40
+ projection = 0;
41
+ else {
42
+ const ux = dx / scale, uy = dy / scale, uz = dz / scale;
43
+ const denominator = ux * ux + uy * uy + uz * uz;
44
+ projection =
45
+ (px * (ux / denominator) + py * (uy / denominator) + pz * (uz / denominator)) / scale;
46
+ }
47
+ }
48
+ const t = Math.max(0, Math.min(1, projection));
49
+ const x = a[0] + t * dx, y = a[1] + t * dy, z = (a[2] ?? 0) + t * dz;
50
+ const rx = point[0] - x, ry = point[1] - y, rz = (point[2] ?? 0) - z;
51
+ const squared = rx * rx + ry * ry + rz * rz;
52
+ if (squared > 0 && Number.isFinite(squared) && squared >= bestSquared)
53
+ continue;
54
+ const distance = squared > 0 && Number.isFinite(squared) ? Math.sqrt(squared) : Math.hypot(rx, ry, rz);
55
+ if (!Number.isFinite(distance))
56
+ fail("Path distance exceeds finite arithmetic.", "NON_FINITE_VALUE");
57
+ if (distance < bestDistance) {
58
+ bestDistance = distance;
59
+ bestSquared = squared;
60
+ edgeIndex = i;
61
+ fraction = t;
62
+ bestX = x;
63
+ bestY = y;
64
+ bestZ = z;
65
+ }
66
+ }
67
+ const position = dimensions === 2 ? [bestX, bestY] : [bestX, bestY, bestZ];
68
+ return Object.freeze({
69
+ point: Object.freeze(position),
70
+ distance: bestDistance,
71
+ edgeIndex,
72
+ fraction,
73
+ });
74
+ }
@@ -1,4 +1,4 @@
1
- import { cross3, dot3, length3, normalize3, projectOntoPlane3, rotateAroundAxis3, scale3, subtract3, } from "../math/vector3.js";
1
+ import { cross3, dot3, length3, normalize3, projectOntoPlane3, rotateAroundAxis3Radians, scale3, subtract3, } from "../math/vector3.js";
2
2
  import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
3
3
  const tangentAt = (path, index) => {
4
4
  if (index === 0) {
@@ -32,7 +32,7 @@ const transportNormal = (normal, previousTangent, tangent) => {
32
32
  if (sine > 1e-10) {
33
33
  const axis = scale3(rotationAxis, 1 / sine);
34
34
  const cosine = Math.max(-1, Math.min(1, dot3(previousTangent, tangent)));
35
- transported = rotateAroundAxis3(normal, axis, Math.atan2(sine, cosine));
35
+ transported = rotateAroundAxis3Radians(normal, axis, Math.atan2(sine, cosine));
36
36
  }
37
37
  return normalize3(projectOntoPlane3(transported, tangent));
38
38
  };
@@ -107,7 +107,7 @@ export const computeClosedParallelTransportFrames = (path, initialNormal, limits
107
107
  const seamCorrection = signedAngleAround(seamNormal, transportedNormals[0], tangents[0]);
108
108
  return tangents.map((tangent, index) => {
109
109
  const correction = (seamCorrection * index) / path.length;
110
- const normal = normalize3(projectOntoPlane3(rotateAroundAxis3(transportedNormals[index], tangent, correction), tangent));
110
+ const normal = normalize3(projectOntoPlane3(rotateAroundAxis3Radians(transportedNormals[index], tangent, correction), tangent));
111
111
  return {
112
112
  tangent,
113
113
  normal,
@@ -8,7 +8,10 @@ import { assertSamplingCount, resolveGeometrySamplingLimits } from "./sampling-l
8
8
  */
9
9
  export function resolveCircularPrimitiveSegments(radius, options, operation) {
10
10
  if (options.segments === undefined) {
11
- return resolveCircularSegments(radius, options.resolution, options.limits);
11
+ return resolveCircularSegments(radius, {
12
+ ...options.resolution,
13
+ sizing: options.sizing ?? "vertex",
14
+ }, options.limits);
12
15
  }
13
16
  if (!Number.isSafeInteger(options.segments) || options.segments < 3)
14
17
  throw new GeometryError("INVALID_ARGUMENT", "segments must be a safe integer of at least three.", { operation, details: { value: options.segments } });
@@ -55,12 +55,17 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
55
55
  minimumSegments,
56
56
  });
57
57
  }
58
- const requiredFullCircleSegments = (radius, resolution) => {
59
- const chordAngle = 2 * Math.acos(Math.max(-1, Math.min(1, 1 - resolution.maxChordError / radius)));
58
+ const requiredFullCircleSegments = (radius, resolution, sizing) => {
59
+ const chordAngle = 2 *
60
+ Math.acos(sizing === "face"
61
+ ? 1 / (1 + resolution.maxChordError / radius)
62
+ : Math.max(-1, Math.min(1, 1 - resolution.maxChordError / radius)));
60
63
  const chordSegments = chordAngle === 0 ? Number.POSITIVE_INFINITY : Math.ceil((Math.PI * 2) / chordAngle);
61
64
  const lengthSegments = resolution.maxSegmentLength === undefined
62
65
  ? 0
63
- : Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
66
+ : sizing === "face"
67
+ ? Math.ceil(Math.PI / Math.atan(resolution.maxSegmentLength / radius / 2))
68
+ : Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
64
69
  return Math.max(resolution.minimumSegments, chordSegments, lengthSegments);
65
70
  };
66
71
  const assertRadius = (radius, operation) => {
@@ -75,7 +80,8 @@ const assertRadius = (radius, operation) => {
75
80
  * Resolves a deterministic full-circle segment count for one radius.
76
81
  *
77
82
  * An exact `circularSegments` value wins. Otherwise the smallest regular polygon satisfying both
78
- * physical error criteria is used. A safety cap that would violate either criterion raises
83
+ * physical error criteria is used. Face sizing bounds the circumscribed polygon's outward
84
+ * excess and actual edge length. A safety cap that would violate either criterion raises
79
85
  * `COMPLEXITY_LIMIT` rather than silently reducing quality.
80
86
  *
81
87
  * @param radius - Circle radius in millimetres.
@@ -94,10 +100,13 @@ const assertRadius = (radius, operation) => {
94
100
  export function resolveCircularSegments(radius, policy = {}, limits = {}) {
95
101
  const operation = "resolveCircularSegments";
96
102
  assertRadius(radius, operation);
103
+ const sizing = policy.sizing ?? "vertex";
104
+ if (sizing !== "vertex" && sizing !== "face")
105
+ invalid("sizing must be vertex or face.");
97
106
  const resolution = resolveGeometryResolution(policy, limits);
98
107
  if (resolution.circularSegments !== undefined)
99
108
  return resolution.circularSegments;
100
- const required = requiredFullCircleSegments(radius, resolution);
109
+ const required = requiredFullCircleSegments(radius, resolution, sizing);
101
110
  if (required > resolution.maximumSegments) {
102
111
  throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maximumSegments}-segment safety limit.`, {
103
112
  operation,
@@ -151,6 +160,8 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
151
160
  export function resolveAlignedCircularSegments(radius, options) {
152
161
  const operation = "resolveAlignedCircularSegments";
153
162
  assertRadius(radius, operation);
163
+ if (options.sizing !== undefined && options.sizing !== "vertex" && options.sizing !== "face")
164
+ invalid("sizing must be vertex or face.");
154
165
  const alignTo = options.alignTo;
155
166
  const hasArrayShape = Array.isArray(alignTo);
156
167
  if (!hasArrayShape || alignTo.length === 0) {
@@ -186,6 +197,7 @@ export function resolveAlignedCircularSegments(radius, options) {
186
197
  }
187
198
  const baseSegments = resolveCircularSegments(radius, {
188
199
  ...resolution,
200
+ sizing: options.sizing ?? "vertex",
189
201
  }, options.limits);
190
202
  const requiredSegments = Math.max(baseSegments, minimumSegments);
191
203
  const multiplier = Math.ceil(requiredSegments / alignment);
@@ -23,10 +23,7 @@ function ellipsePoints(center, radius, segments) {
23
23
  return [center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius];
24
24
  });
25
25
  }
26
- function circlePolygon(center, radius, segments) {
27
- return [ring(ellipsePoints(center, radius, segments))];
28
- }
29
- function cornerPolygon(previous, point, next, halfWidth, join) {
26
+ function cornerContour(previous, point, next, halfWidth, join) {
30
27
  const incomingLength = Math.hypot(point[0] - previous[0], point[1] - previous[1]);
31
28
  const outgoingLength = Math.hypot(next[0] - point[0], next[1] - point[1]);
32
29
  const incoming = [
@@ -54,11 +51,13 @@ function cornerPolygon(previous, point, next, halfWidth, join) {
54
51
  ]);
55
52
  }
56
53
  points.push([point[0] + after[0], point[1] + after[1]]);
57
- return [ring(points)];
54
+ return turn > 0 ? points : points.reverse();
58
55
  }
59
56
  /** Removes consecutive points that cannot define a visible stroke segment at model scale. */
60
57
  function deduplicatePath(path, closed, width) {
61
- const scale = Math.max(width, ...path.flatMap(([x, y]) => [Math.abs(x), Math.abs(y)]));
58
+ let scale = width;
59
+ for (const [x, y] of path)
60
+ scale = Math.max(scale, Math.abs(x), Math.abs(y));
62
61
  const tolerance = resolveGeometryTolerance(scale).linear;
63
62
  const points = [];
64
63
  for (const point of path) {
@@ -76,11 +75,27 @@ function deduplicatePath(path, closed, width) {
76
75
  }
77
76
  return Object.freeze(points);
78
77
  }
79
- /** @internal Polygon-clipping representation shared with the bounded SVG importer. */
80
- export function strokePathMultiPolygon(path, options, circularSegments) {
78
+ /** @internal Bounded CCW stroke primitives shared by native sections and pure clipping. */
79
+ export function strokePathContours(path, options, exactCircularSegments) {
81
80
  const closed = options.closed ?? false;
82
81
  const cap = options.cap ?? "butt";
83
82
  const join = options.join ?? "miter";
83
+ if (typeof closed !== "boolean")
84
+ return fail("closed must be a boolean.");
85
+ if (!Number.isFinite(options.width) || options.width <= 0)
86
+ return fail("Stroke width must be finite and greater than zero.");
87
+ if (path.length < (closed ? 3 : 2))
88
+ return fail(`${closed ? "Closed" : "Open"} strokes need more sampled path points.`);
89
+ if (!path.every((point) => point.length === 2 && point.every(Number.isFinite)))
90
+ return fail("Stroke path coordinates must be finite XY points.");
91
+ if (!["butt", "round", "square"].includes(cap))
92
+ return fail("Stroke cap must be butt, round, or square.");
93
+ if (!["bevel", "miter", "round"].includes(join))
94
+ return fail("Stroke join must be bevel, miter, or round.");
95
+ const circularSegments = exactCircularSegments ??
96
+ (cap === "round" || join === "round"
97
+ ? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
98
+ : 3);
84
99
  const half = options.width / 2;
85
100
  const limits = resolveGeometrySamplingLimits(options.limits);
86
101
  assertSamplingCount(path.length, "strokePathRegion", limits.maxPathPoints);
@@ -88,7 +103,7 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
88
103
  const normalizedPath = deduplicatePath(path, closed, options.width);
89
104
  if (normalizedPath.length < (closed ? 3 : 2))
90
105
  return [];
91
- const polygons = [];
106
+ const contours = [];
92
107
  const segmentCount = closed ? normalizedPath.length : normalizedPath.length - 1;
93
108
  const joinCount = closed ? normalizedPath.length : Math.max(0, normalizedPath.length - 2);
94
109
  const constructionVertices = segmentCount * 4 +
@@ -108,34 +123,44 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
108
123
  }
109
124
  }
110
125
  const normal = [-tangent[1] * half, tangent[0] * half];
111
- polygons.push([
112
- ring([
113
- [start[0] + normal[0], start[1] + normal[1]],
114
- [end[0] + normal[0], end[1] + normal[1]],
115
- [end[0] - normal[0], end[1] - normal[1]],
116
- [start[0] - normal[0], start[1] - normal[1]],
117
- ]),
126
+ contours.push([
127
+ [start[0] - normal[0], start[1] - normal[1]],
128
+ [end[0] - normal[0], end[1] - normal[1]],
129
+ [end[0] + normal[0], end[1] + normal[1]],
130
+ [start[0] + normal[0], start[1] + normal[1]],
118
131
  ]);
119
132
  }
133
+ const disk = join === "round" || (!closed && cap === "round")
134
+ ? ellipsePoints([0, 0], half, circularSegments)
135
+ : [];
136
+ const circleAt = ([x, y]) => disk.map(([u, v]) => [x + u, y + v]);
120
137
  if (join === "round") {
121
138
  const joinPoints = closed ? normalizedPath : normalizedPath.slice(1, -1);
122
- polygons.push(...joinPoints.map((point) => circlePolygon(point, half, circularSegments)));
139
+ for (const point of joinPoints)
140
+ contours.push(circleAt(point));
123
141
  }
124
142
  else {
125
143
  const first = closed ? 0 : 1;
126
144
  const end = closed ? normalizedPath.length : normalizedPath.length - 1;
127
145
  for (let index = first; index < end; index += 1) {
128
- const corner = cornerPolygon(normalizedPath[(index - 1 + normalizedPath.length) % normalizedPath.length], normalizedPath[index], normalizedPath[(index + 1) % normalizedPath.length], half, join);
146
+ const corner = cornerContour(normalizedPath[(index - 1 + normalizedPath.length) % normalizedPath.length], normalizedPath[index], normalizedPath[(index + 1) % normalizedPath.length], half, join);
129
147
  if (corner !== undefined)
130
- polygons.push(corner);
148
+ contours.push(corner);
131
149
  }
132
150
  }
133
151
  if (!closed && cap === "round") {
134
- polygons.push(circlePolygon(normalizedPath[0], half, circularSegments), circlePolygon(normalizedPath.at(-1), half, circularSegments));
152
+ contours.push(circleAt(normalizedPath[0]), circleAt(normalizedPath.at(-1)));
135
153
  }
136
- const result = unionPolygonGeometry(polygons);
154
+ return contours;
155
+ }
156
+ /** @internal Polygon-clipping representation shared with the bounded SVG importer. */
157
+ export function strokePathMultiPolygon(path, options, circularSegments) {
158
+ const contours = strokePathContours(path, options, circularSegments);
159
+ if (contours.length === 0)
160
+ return [];
161
+ const result = unionPolygonGeometry(contours.map((contour) => [ring(contour)]));
137
162
  const outputVertices = result.reduce((count, polygon) => count + polygon.reduce((total, contour) => total + Math.max(0, contour.length - 1), 0), 0);
138
- assertSamplingCount(outputVertices, "strokePathRegion", limits.maxProfilePoints);
163
+ assertSamplingCount(outputVertices, "strokePathRegion", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
139
164
  return result;
140
165
  }
141
166
  function regionFromMultiPolygon(value) {
@@ -153,28 +178,7 @@ function regionFromMultiPolygon(value) {
153
178
  * intersection, falling back to bevels above SVG's default miter limit of 4.
154
179
  */
155
180
  export function strokePathRegion(path, options) {
156
- const closed = options.closed ?? false;
157
- if (!Number.isFinite(options.width) || options.width <= 0) {
158
- return fail("Stroke width must be finite and greater than zero.");
159
- }
160
- if (path.length < (closed ? 3 : 2)) {
161
- return fail(`${closed ? "Closed" : "Open"} strokes need more sampled path points.`);
162
- }
163
- if (!path.every((point) => Number.isFinite(point[0]) && Number.isFinite(point[1]))) {
164
- return fail("Stroke path coordinates must be finite.");
165
- }
166
- const cap = options.cap ?? "butt";
167
- const join = options.join ?? "miter";
168
- if (!["butt", "round", "square"].includes(cap)) {
169
- return fail("Stroke cap must be butt, round, or square.");
170
- }
171
- if (!["bevel", "miter", "round"].includes(join)) {
172
- return fail("Stroke join must be bevel, miter, or round.");
173
- }
174
- const circularSegments = cap === "round" || join === "round"
175
- ? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
176
- : 3;
177
- const result = strokePathMultiPolygon(path, { ...options, cap, closed, join }, circularSegments);
181
+ const result = strokePathMultiPolygon(path, options);
178
182
  if (result.length === 0)
179
183
  return fail("The sampled stroke path has no visible length.");
180
184
  return regionFromMultiPolygon(result);
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../errors.js";
2
- import { cross3, dot3, lerp3, normalize3, rotateAroundAxis3 } from "../math/vector3.js";
2
+ import { cross3, dot3, lerp3, normalize3, rotateAroundAxis3Radians } from "../math/vector3.js";
3
3
  import { resolveGeometryResolution } from "../resolution.js";
4
4
  import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling-limits.js";
5
5
  /** @internal Original station progression, with a virtual final seam endpoint for closed paths. */
@@ -144,9 +144,9 @@ export function refineSweepStations(path, scales, frames, options, plan) {
144
144
  sampledFrames.push(amount === 0
145
145
  ? frames[i]
146
146
  : {
147
- normal: rotateAroundAxis3(frames[i].normal, rotation.axis, rotation.angle * amount),
148
- binormal: rotateAroundAxis3(frames[i].binormal, rotation.axis, rotation.angle * amount),
149
- tangent: rotateAroundAxis3(frames[i].tangent, rotation.axis, rotation.angle * amount),
147
+ normal: rotateAroundAxis3Radians(frames[i].normal, rotation.axis, rotation.angle * amount),
148
+ binormal: rotateAroundAxis3Radians(frames[i].binormal, rotation.axis, rotation.angle * amount),
149
+ tangent: rotateAroundAxis3Radians(frames[i].tangent, rotation.axis, rotation.angle * amount),
150
150
  });
151
151
  twists.push(twist * (plan.progress[i] + (plan.progress[i + 1] - plan.progress[i]) * amount));
152
152
  }
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../errors.js";
2
- import { add3, rotateAroundAxis3, scale3 } from "../math/vector3.js";
2
+ import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
3
3
  import { validateTriangleMesh } from "../mesh/mesh.js";
4
4
  import { resolveGeometryTolerance } from "../tolerance.js";
5
5
  import { resolveSweepScales } from "./options.js";
@@ -63,8 +63,8 @@ export const buildClosedSweepMesh = (profile, path, options = {}) => {
63
63
  const tangent = transportedFrames[ring].tangent;
64
64
  const twist = twists?.[ring] ?? twistRadians * (ring / path.length);
65
65
  const baseNormal = transportedFrames[ring].normal;
66
- const normal = rotateAroundAxis3(baseNormal, tangent, twist);
67
- const binormal = rotateAroundAxis3(transportedFrames[ring].binormal, tangent, twist);
66
+ const normal = rotateAroundAxis3Radians(baseNormal, tangent, twist);
67
+ const binormal = rotateAroundAxis3Radians(transportedFrames[ring].binormal, tangent, twist);
68
68
  const [scaleX, scaleY] = scales[ring];
69
69
  for (let profileIndex = 0; profileIndex < profile.length; profileIndex += 1) {
70
70
  const [x, y] = profile[profileIndex];
@@ -1,5 +1,5 @@
1
1
  import { triangulateContour } from "../loft/loft.js";
2
- import { add3, rotateAroundAxis3, scale3 } from "../math/vector3.js";
2
+ import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
3
3
  import { validateTriangleMesh } from "../mesh/mesh.js";
4
4
  import { resolveSweepScales } from "./options.js";
5
5
  import { computeSweepFrames, validateSweepOptions } from "./orientation.js";
@@ -37,8 +37,8 @@ export const buildOpenSweepMesh = (profile, path, options = {}) => {
37
37
  const point = path[ring];
38
38
  const frame = frames[ring];
39
39
  const twist = twists?.[ring] ?? (twistRadians * ring) / (path.length - 1);
40
- const normal = rotateAroundAxis3(frame.normal, frame.tangent, twist);
41
- const binormal = rotateAroundAxis3(frame.binormal, frame.tangent, twist);
40
+ const normal = rotateAroundAxis3Radians(frame.normal, frame.tangent, twist);
41
+ const binormal = rotateAroundAxis3Radians(frame.binormal, frame.tangent, twist);
42
42
  const [scaleX, scaleY] = scales[ring];
43
43
  for (let profileIndex = 0; profileIndex < profile.length; profileIndex += 1) {
44
44
  const [x, y] = profile[profileIndex];