@metamesh/modeling 0.13.0 → 0.15.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 (740) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +67 -9
  3. package/dist/api/engine.d.ts +14 -7
  4. package/dist/api/geometry.d.ts +787 -447
  5. package/dist/api/index.d.ts +637 -250
  6. package/dist/api/text.d.ts +6 -4
  7. package/dist/docs/guides/concepts.md +135 -17
  8. package/dist/docs/guides/fonts.md +8 -0
  9. package/dist/docs/guides/fundamentals.md +8 -3
  10. package/dist/docs/guides/generation.md +6 -4
  11. package/dist/docs/guides/hosting.md +27 -14
  12. package/dist/docs/guides/recipes.md +82 -11
  13. package/dist/docs/manifest.json +1911 -856
  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 +4 -8
  21. package/dist/docs/reference/engine/ModelSession.md +1 -1
  22. package/dist/docs/reference/engine/ModelSnapshot.md +20 -9
  23. package/dist/docs/reference/engine/SessionOptions.md +1 -1
  24. package/dist/docs/reference/engine/SnapshotPart.md +4 -4
  25. package/dist/docs/reference/engine/categories/host-lifecycle.md +2 -2
  26. package/dist/docs/reference/engine/createModelEngine.md +3 -3
  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 +2 -2
  31. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
  32. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +17 -4
  33. package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +9 -5
  34. package/dist/docs/reference/geometry/ArcCurve2.md +7 -7
  35. package/dist/docs/reference/geometry/ArcCurve3.md +9 -9
  36. package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +14 -5
  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 +10 -10
  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/CompensatedThreadDiameters.md +1 -1
  59. package/dist/docs/reference/geometry/Contour.md +3 -3
  60. package/dist/docs/reference/geometry/ContourCurve.md +1 -1
  61. package/dist/docs/reference/geometry/ContourPoint.md +1 -1
  62. package/dist/docs/reference/geometry/ContourSegment.md +1 -1
  63. package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
  64. package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
  65. package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
  66. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
  67. package/dist/docs/reference/geometry/CubicBezierCurve2.md +6 -6
  68. package/dist/docs/reference/geometry/CubicBezierCurve3.md +6 -6
  69. package/dist/docs/reference/geometry/Curve2.md +1 -1
  70. package/dist/docs/reference/geometry/Curve3.md +1 -1
  71. package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
  72. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +3 -3
  73. package/dist/docs/reference/geometry/CylinderAnchorFace.md +8 -1
  74. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -5
  75. package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
  76. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +3 -3
  77. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
  78. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
  79. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +3 -3
  80. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
  81. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
  82. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
  83. package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -6
  84. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
  85. package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
  86. package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -3
  87. package/dist/docs/reference/geometry/EndTreatments.md +1 -1
  88. package/dist/docs/reference/geometry/ExtrudeOptions.md +6 -6
  89. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -5
  90. package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
  91. package/dist/docs/reference/geometry/Frame3.md +6 -6
  92. package/dist/docs/reference/geometry/GeometryError.md +1 -1
  93. package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
  94. package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
  95. package/dist/docs/reference/geometry/GeometryResolution.md +14 -5
  96. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
  97. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
  98. package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
  99. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
  100. package/dist/docs/reference/geometry/HeightfieldOptions.md +5 -5
  101. package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
  102. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -5
  103. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +6 -6
  104. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
  105. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +7 -3
  106. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
  107. package/dist/docs/reference/geometry/LineCurve2.md +4 -4
  108. package/dist/docs/reference/geometry/LineCurve3.md +4 -4
  109. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
  110. package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
  111. package/dist/docs/reference/geometry/LoftMeshStation.md +4 -4
  112. package/dist/docs/reference/geometry/LoftOptions.md +1 -1
  113. package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
  114. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
  115. package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
  116. package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
  117. package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
  118. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
  119. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
  120. package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
  121. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
  122. package/dist/docs/reference/geometry/Path2-type.md +192 -0
  123. package/dist/docs/reference/geometry/Path2Data.md +14 -0
  124. package/dist/docs/reference/geometry/Path2Input.md +15 -0
  125. package/dist/docs/reference/geometry/Path3-type.md +192 -0
  126. package/dist/docs/reference/geometry/Path3Data.md +14 -0
  127. package/dist/docs/reference/geometry/Path3Input.md +15 -0
  128. package/dist/docs/reference/geometry/PathFrame.md +5 -5
  129. package/dist/docs/reference/geometry/PathLocation.md +65 -0
  130. package/dist/docs/reference/geometry/PathNormalGuide.md +6 -5
  131. package/dist/docs/reference/geometry/PathOptions.md +34 -0
  132. package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
  133. package/dist/docs/reference/geometry/PathPlacement.md +4 -4
  134. package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
  135. package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
  136. package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
  137. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
  138. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
  139. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
  140. package/dist/docs/reference/geometry/PlanarPatchQuality.md +3 -3
  141. package/dist/docs/reference/geometry/{Polygon.md → PolygonData.md} +2 -2
  142. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +4 -4
  143. package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
  144. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
  145. package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
  146. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
  147. package/dist/docs/reference/geometry/Profile.md +1 -1
  148. package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
  149. package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
  150. package/dist/docs/reference/geometry/ProfileSpan2.md +3 -3
  151. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
  152. package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
  153. package/dist/docs/reference/geometry/RackPitchSpec.md +5 -5
  154. package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
  155. package/dist/docs/reference/geometry/RadialSizing.md +1 -1
  156. package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
  157. package/dist/docs/reference/geometry/RectangleContourOptions.md +3 -3
  158. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
  159. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
  160. package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
  161. package/dist/docs/reference/geometry/RegionData.md +14 -0
  162. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
  163. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
  164. package/dist/docs/reference/geometry/RevolveOptions.md +9 -4
  165. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
  166. package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
  167. package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
  168. package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
  169. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
  170. package/dist/docs/reference/geometry/SampledCurve2.md +4 -4
  171. package/dist/docs/reference/geometry/SampledCurve3.md +4 -4
  172. package/dist/docs/reference/geometry/SampledThreadHelices.md +3 -3
  173. package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
  174. package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
  175. package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
  176. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
  177. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +3 -3
  178. package/dist/docs/reference/geometry/SphereOptions.md +3 -3
  179. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
  180. package/dist/docs/reference/geometry/StrokeCap.md +7 -0
  181. package/dist/docs/reference/geometry/StrokeJoin.md +7 -0
  182. package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +8 -8
  183. package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
  184. package/dist/docs/reference/geometry/SvgRegionPreflight.md +3 -3
  185. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +13 -13
  186. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +11 -11
  187. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +9 -9
  188. package/dist/docs/reference/geometry/SweepOptions.md +6 -6
  189. package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
  190. package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
  191. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -5
  192. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
  193. package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
  194. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
  195. package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
  196. package/dist/docs/reference/geometry/ThreadHelixOptions.md +3 -3
  197. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
  198. package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
  199. package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +3 -3
  200. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
  201. package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
  202. package/dist/docs/reference/geometry/ThreadRole.md +1 -1
  203. package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
  204. package/dist/docs/reference/geometry/ThreadedNutOptions.md +6 -6
  205. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
  206. package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
  207. package/dist/docs/reference/geometry/ThreadedRodOptions.md +6 -6
  208. package/dist/docs/reference/geometry/TorusOptions.md +8 -8
  209. package/dist/docs/reference/geometry/Transform2-type.md +255 -0
  210. package/dist/docs/reference/geometry/Transform2Input.md +19 -0
  211. package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
  212. package/dist/docs/reference/geometry/Transform3-type.md +295 -0
  213. package/dist/docs/reference/geometry/Transform3Input.md +19 -0
  214. package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
  215. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -4
  216. package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
  217. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +2 -2
  218. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
  219. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
  220. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +3 -3
  221. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
  222. package/dist/docs/reference/geometry/TriangleMeshSignature.md +2 -2
  223. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +3 -3
  224. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
  225. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
  226. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
  227. package/dist/docs/reference/geometry/TubeOptions.md +8 -8
  228. package/dist/docs/reference/geometry/Vector2-type.md +269 -0
  229. package/dist/docs/reference/geometry/Vector2Input.md +19 -0
  230. package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
  231. package/dist/docs/reference/geometry/Vector3-type.md +281 -0
  232. package/dist/docs/reference/geometry/Vector3Input.md +19 -0
  233. package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
  234. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +3 -3
  235. package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
  236. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
  237. package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
  238. package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
  239. package/dist/docs/reference/geometry/add2.md +36 -0
  240. package/dist/docs/reference/geometry/add3.md +10 -6
  241. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
  242. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +2 -2
  243. package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +13 -9
  244. package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
  245. package/dist/docs/reference/geometry/applyTransformDirection3.md +11 -7
  246. package/dist/docs/reference/geometry/applyTransformPoint3.md +11 -7
  247. package/dist/docs/reference/geometry/attachmentTransform3.md +77 -0
  248. package/dist/docs/reference/geometry/boundsCenter.md +7 -7
  249. package/dist/docs/reference/geometry/boundsFromSize.md +7 -7
  250. package/dist/docs/reference/geometry/boundsSize.md +7 -7
  251. package/dist/docs/reference/geometry/boxAnchor3.md +10 -6
  252. package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
  253. package/dist/docs/reference/geometry/categories/curves-paths.md +15 -10
  254. package/dist/docs/reference/geometry/categories/mechanical.md +6 -6
  255. package/dist/docs/reference/geometry/categories/meshes.md +3 -4
  256. package/dist/docs/reference/geometry/categories/pattern-placement.md +7 -7
  257. package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
  258. package/dist/docs/reference/geometry/categories/profiles-regions.md +5 -6
  259. package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -2
  260. package/dist/docs/reference/geometry/categories/transforms-math.md +41 -12
  261. package/dist/docs/reference/geometry/categories/vector-import.md +5 -5
  262. package/dist/docs/reference/geometry/circleContour.md +1 -1
  263. package/dist/docs/reference/geometry/closeToAxis.md +4 -4
  264. package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
  265. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -5
  266. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -5
  267. package/dist/docs/reference/geometry/composeTransform3.md +10 -6
  268. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +10 -6
  269. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -7
  270. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +4 -4
  271. package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +4 -4
  272. package/dist/docs/reference/geometry/containsBounds.md +1 -1
  273. package/dist/docs/reference/geometry/contourContainsPoint.md +4 -4
  274. package/dist/docs/reference/geometry/cross2.md +36 -0
  275. package/dist/docs/reference/geometry/cross3.md +10 -6
  276. package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -6
  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 +8 -6
  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 +8 -8
  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 → getMetricClearanceHoleDiameter.md} +3 -3
  290. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
  291. package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
  292. package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
  293. package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +5 -5
  294. package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +5 -5
  295. package/dist/docs/reference/geometry/inverseTransform3.md +9 -5
  296. package/dist/docs/reference/geometry/isGeometryError.md +1 -1
  297. package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
  298. package/dist/docs/reference/geometry/layoutRow.md +4 -4
  299. package/dist/docs/reference/geometry/length2.md +30 -0
  300. package/dist/docs/reference/geometry/length3.md +8 -4
  301. package/dist/docs/reference/geometry/lerp2.md +42 -0
  302. package/dist/docs/reference/geometry/lerp3.md +10 -6
  303. package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
  304. package/dist/docs/reference/geometry/loftMesh.md +2 -1
  305. package/dist/docs/reference/geometry/matchProfiles.md +1 -1
  306. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +3 -2
  307. package/dist/docs/reference/geometry/meshBounds.md +1 -1
  308. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +3 -3
  309. package/dist/docs/reference/geometry/normalize2.md +36 -0
  310. package/dist/docs/reference/geometry/normalize3.md +10 -6
  311. package/dist/docs/reference/geometry/normalizeContour.md +4 -4
  312. package/dist/docs/reference/geometry/normalizePolygon.md +5 -5
  313. package/dist/docs/reference/geometry/normalizeRegion.md +5 -5
  314. package/dist/docs/reference/geometry/optimizePlanarPatches.md +11 -11
  315. package/dist/docs/reference/geometry/path2.md +42 -0
  316. package/dist/docs/reference/geometry/path3.md +42 -0
  317. package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -8
  318. package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
  319. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +3 -3
  320. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +3 -3
  321. package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
  322. package/dist/docs/reference/geometry/preflightThreadedNut.md +3 -3
  323. package/dist/docs/reference/geometry/preflightThreadedRod.md +3 -3
  324. package/dist/docs/reference/geometry/projectOntoPlane3.md +10 -6
  325. package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
  326. package/dist/docs/reference/geometry/rectangleContour.md +2 -2
  327. package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
  328. package/dist/docs/reference/geometry/regionArea.md +4 -4
  329. package/dist/docs/reference/geometry/regionBounds.md +4 -4
  330. package/dist/docs/reference/geometry/regularPolygonContour.md +5 -5
  331. package/dist/docs/reference/geometry/resamplePolyline2.md +5 -5
  332. package/dist/docs/reference/geometry/resamplePolyline3.md +5 -5
  333. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +8 -4
  334. package/dist/docs/reference/geometry/resolveArcSegments.md +6 -6
  335. package/dist/docs/reference/geometry/resolveCircularSegments.md +6 -5
  336. package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
  337. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
  338. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +6 -6
  339. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
  340. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
  341. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
  342. package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
  343. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +4 -4
  344. package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
  345. package/dist/docs/reference/geometry/revolveMesh.md +10 -10
  346. package/dist/docs/reference/geometry/rotate2.md +36 -0
  347. package/dist/docs/reference/geometry/rotationTransform3.md +10 -6
  348. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -6
  349. package/dist/docs/reference/geometry/sampleContour.md +3 -3
  350. package/dist/docs/reference/geometry/sampleCurve2.md +3 -3
  351. package/dist/docs/reference/geometry/sampleCurve3.md +2 -2
  352. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
  353. package/dist/docs/reference/geometry/sampleHelix.md +5 -5
  354. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
  355. package/dist/docs/reference/geometry/sampleRackToothPath.md +4 -4
  356. package/dist/docs/reference/geometry/sampleSideProfile.md +6 -6
  357. package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
  358. package/dist/docs/reference/geometry/sampleThreadHelices.md +2 -2
  359. package/dist/docs/reference/geometry/scale2.md +36 -0
  360. package/dist/docs/reference/geometry/scale3.md +9 -5
  361. package/dist/docs/reference/geometry/scaleTransform3.md +10 -6
  362. package/dist/docs/reference/geometry/signedContourArea.md +1 -1
  363. package/dist/docs/reference/geometry/starContour.md +4 -4
  364. package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
  365. package/dist/docs/reference/geometry/subtract2.md +36 -0
  366. package/dist/docs/reference/geometry/subtract3.md +10 -6
  367. package/dist/docs/reference/geometry/sweepMesh.md +9 -9
  368. package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +6 -6
  369. package/dist/docs/reference/geometry/transform2.md +38 -0
  370. package/dist/docs/reference/geometry/transform3.md +38 -0
  371. package/dist/docs/reference/geometry/transformDeterminant3.md +8 -4
  372. package/dist/docs/reference/geometry/transformRegionData.md +40 -0
  373. package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
  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 +2 -2
  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 +3 -3
  382. package/dist/docs/reference/model/Anchor3.md +5 -5
  383. package/dist/docs/reference/model/AttachOptions.md +10 -5
  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 +10 -10
  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 +3 -3
  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 +3 -3
  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 +3 -3
  406. package/dist/docs/reference/model/EndTreatments.md +1 -1
  407. package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
  408. package/dist/docs/reference/model/FinalizedModel.md +18 -8
  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 +5 -5
  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 +11 -5
  420. package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
  421. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +3 -3
  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 +4 -4
  428. package/dist/docs/reference/model/LinearPatternOptions.md +12 -5
  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 +4 -4
  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/Path2-type.md +192 -0
  440. package/dist/docs/reference/model/Path2Data.md +14 -0
  441. package/dist/docs/reference/model/Path2Input.md +15 -0
  442. package/dist/docs/reference/model/Path3-type.md +192 -0
  443. package/dist/docs/reference/model/Path3Data.md +14 -0
  444. package/dist/docs/reference/model/Path3Input.md +15 -0
  445. package/dist/docs/reference/model/PathLocation.md +65 -0
  446. package/dist/docs/reference/model/PathNormalGuide.md +6 -5
  447. package/dist/docs/reference/model/PathOptions.md +34 -0
  448. package/dist/docs/reference/model/PathPatternOptions.md +3 -3
  449. package/dist/docs/reference/model/PathResamplingOptions.md +79 -0
  450. package/dist/docs/reference/model/PatternSource.md +2 -2
  451. package/dist/docs/reference/model/Pivot2Options.md +27 -0
  452. package/dist/docs/reference/model/Pivot3Options.md +27 -0
  453. package/dist/docs/reference/model/PlaneOptions.md +3 -3
  454. package/dist/docs/reference/model/{Polygon-type.md → PolygonData.md} +2 -2
  455. package/dist/docs/reference/model/PolygonOptions.md +85 -8
  456. package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +7 -7
  457. package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +41 -20
  458. package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
  459. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
  460. package/dist/docs/reference/model/Profile.md +1 -1
  461. package/dist/docs/reference/model/ProfileComponent2.md +1 -1
  462. package/dist/docs/reference/model/ProfileContour2.md +1 -1
  463. package/dist/docs/reference/model/ProfileSpan2.md +3 -3
  464. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
  465. package/dist/docs/reference/model/RadialPatternOptions.md +17 -22
  466. package/dist/docs/reference/model/RadialSizing.md +1 -1
  467. package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
  468. package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
  469. package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
  470. package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
  471. package/dist/docs/reference/model/RectangleOptions.md +10 -10
  472. package/dist/docs/reference/model/{Region.md → RegionData.md} +4 -4
  473. package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
  474. package/dist/docs/reference/model/RevolveOptions.md +9 -4
  475. package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
  476. package/dist/docs/reference/model/Section.md +81 -40
  477. package/dist/docs/reference/model/SectionHullOptions.md +7 -7
  478. package/dist/docs/reference/model/SectionInspection.md +10 -10
  479. package/dist/docs/reference/model/{RegionOffsetJoin.md → SectionOffsetJoin.md} +3 -3
  480. package/dist/docs/reference/model/{RegionOffsetOptions.md → SectionOffsetOptions.md} +4 -4
  481. package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
  482. package/dist/docs/reference/model/Solid.md +66 -26
  483. package/dist/docs/reference/model/SolidInspection.md +7 -7
  484. package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
  485. package/dist/docs/reference/model/SphereOptions.md +3 -3
  486. package/dist/docs/reference/model/StarOptions.md +10 -10
  487. package/dist/docs/reference/model/StrokeCap.md +16 -0
  488. package/dist/docs/reference/model/StrokeJoin.md +16 -0
  489. package/dist/docs/reference/model/StrokeOptions.md +91 -0
  490. package/dist/docs/reference/model/SvgOrigin.md +1 -1
  491. package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
  492. package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
  493. package/dist/docs/reference/model/SweepOptions.md +6 -6
  494. package/dist/docs/reference/model/SweepOrientation.md +7 -7
  495. package/dist/docs/reference/model/TextSectionOptions.md +1 -1
  496. package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
  497. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
  498. package/dist/docs/reference/model/ThreadHandedness.md +1 -1
  499. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
  500. package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
  501. package/dist/docs/reference/model/ThreadProfile.md +3 -3
  502. package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
  503. package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
  504. package/dist/docs/reference/model/ThreadedNutOptions.md +4 -4
  505. package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
  506. package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
  507. package/dist/docs/reference/model/ThreadedRodOptions.md +4 -4
  508. package/dist/docs/reference/model/TorusOptions.md +8 -8
  509. package/dist/docs/reference/model/Transform2-type.md +256 -0
  510. package/dist/docs/reference/model/Transform2Input.md +20 -0
  511. package/dist/docs/reference/model/Transform2Matrix.md +15 -0
  512. package/dist/docs/reference/model/Transform3-type.md +296 -0
  513. package/dist/docs/reference/model/Transform3Input.md +20 -0
  514. package/dist/docs/reference/model/{Transform3.md → Transform3Matrix.md} +3 -3
  515. package/dist/docs/reference/model/TriangleMesh.md +1 -1
  516. package/dist/docs/reference/model/TriangleMeshAnalysis.md +2 -2
  517. package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
  518. package/dist/docs/reference/model/TubeOptions.md +8 -8
  519. package/dist/docs/reference/model/Vector2-type.md +270 -0
  520. package/dist/docs/reference/model/Vector2Input.md +20 -0
  521. package/dist/docs/reference/model/{Vector2.md → Vector2Tuple.md} +3 -3
  522. package/dist/docs/reference/model/Vector3-type.md +282 -0
  523. package/dist/docs/reference/model/Vector3Input.md +20 -0
  524. package/dist/docs/reference/model/{Vector3.md → Vector3Tuple.md} +3 -3
  525. package/dist/docs/reference/model/VectorTextLayout.md +1 -1
  526. package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
  527. package/dist/docs/reference/model/anchor.md +1 -1
  528. package/dist/docs/reference/model/box.md +4 -4
  529. package/dist/docs/reference/model/castSegment.md +40 -0
  530. package/dist/docs/reference/model/categories/boolean-operations.md +4 -4
  531. package/dist/docs/reference/model/categories/bounded-surfaces.md +3 -3
  532. package/dist/docs/reference/model/categories/contracts.md +2 -2
  533. package/dist/docs/reference/model/categories/core-values-errors.md +5 -5
  534. package/dist/docs/reference/model/categories/explicit-profiles.md +3 -3
  535. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +2 -2
  536. package/dist/docs/reference/model/categories/generation.md +1 -1
  537. package/dist/docs/reference/model/categories/inspection.md +7 -8
  538. package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
  539. package/dist/docs/reference/model/categories/paths.md +33 -0
  540. package/dist/docs/reference/model/categories/primitives.md +3 -3
  541. package/dist/docs/reference/model/categories/resolution.md +2 -2
  542. package/dist/docs/reference/model/categories/sections.md +10 -8
  543. package/dist/docs/reference/model/categories/threads.md +5 -5
  544. package/dist/docs/reference/model/categories/transforms-placement.md +27 -13
  545. package/dist/docs/reference/model/circle.md +1 -1
  546. package/dist/docs/reference/model/components.md +10 -7
  547. package/dist/docs/reference/model/compose.md +1 -1
  548. package/dist/docs/reference/model/cylinder.md +1 -1
  549. package/dist/docs/reference/model/distance.md +2 -2
  550. package/dist/docs/reference/model/ellipse.md +1 -1
  551. package/dist/docs/reference/model/extrude.md +3 -3
  552. package/dist/docs/reference/model/generate.md +1 -1
  553. package/dist/docs/reference/model/gridPattern.md +4 -4
  554. package/dist/docs/reference/model/heightfield.md +2 -2
  555. package/dist/docs/reference/model/hull.md +2 -2
  556. package/dist/docs/reference/model/immutableBuffer.md +1 -1
  557. package/dist/docs/reference/model/immutableMesh.md +1 -1
  558. package/dist/docs/reference/model/implicit.md +3 -3
  559. package/dist/docs/reference/model/inspectSection.md +1 -1
  560. package/dist/docs/reference/model/inspectSolid.md +1 -1
  561. package/dist/docs/reference/model/internalThreadCutter.md +4 -4
  562. package/dist/docs/reference/model/intersect.md +1 -1
  563. package/dist/docs/reference/model/isEmpty.md +2 -2
  564. package/dist/docs/reference/model/linearPattern.md +4 -4
  565. package/dist/docs/reference/model/loft.md +1 -1
  566. package/dist/docs/reference/model/matchProfiles.md +2 -2
  567. package/dist/docs/reference/model/minkowskiSum.md +1 -1
  568. package/dist/docs/reference/model/path2.md +42 -0
  569. package/dist/docs/reference/model/path3.md +42 -0
  570. package/dist/docs/reference/model/pathPattern.md +13 -12
  571. package/dist/docs/reference/model/polygon.md +4 -4
  572. package/dist/docs/reference/model/preflightInternalThreadCutter.md +3 -3
  573. package/dist/docs/reference/model/preflightThreadedNut.md +3 -3
  574. package/dist/docs/reference/model/preflightThreadedRod.md +3 -3
  575. package/dist/docs/reference/model/radialPattern.md +5 -37
  576. package/dist/docs/reference/model/rectangle.md +4 -4
  577. package/dist/docs/reference/model/regularPolygon.md +1 -1
  578. package/dist/docs/reference/model/revolve.md +5 -4
  579. package/dist/docs/reference/model/solidFromMesh.md +1 -1
  580. package/dist/docs/reference/model/sphere.md +1 -1
  581. package/dist/docs/reference/model/split.md +1 -1
  582. package/dist/docs/reference/model/splitByPlane.md +1 -1
  583. package/dist/docs/reference/model/star.md +4 -4
  584. package/dist/docs/reference/model/stroke.md +74 -0
  585. package/dist/docs/reference/model/svgPathSection.md +1 -1
  586. package/dist/docs/reference/model/svgSection.md +1 -1
  587. package/dist/docs/reference/model/sweep.md +7 -7
  588. package/dist/docs/reference/model/textSection.md +1 -1
  589. package/dist/docs/reference/model/threadRidge.md +2 -2
  590. package/dist/docs/reference/model/threadedNut.md +4 -4
  591. package/dist/docs/reference/model/threadedRod.md +4 -4
  592. package/dist/docs/reference/model/torus.md +3 -3
  593. package/dist/docs/reference/model/transform2.md +39 -0
  594. package/dist/docs/reference/model/transform3.md +39 -0
  595. package/dist/docs/reference/model/tube.md +3 -3
  596. package/dist/docs/reference/model/union.md +1 -1
  597. package/dist/docs/reference/model/vector2.md +32 -0
  598. package/dist/docs/reference/model/vector3.md +39 -0
  599. package/dist/docs/reference/model.md +9 -8
  600. package/dist/docs/reference/text/Bounds2.md +4 -4
  601. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
  602. package/dist/docs/reference/text/Vector2Tuple.md +7 -0
  603. package/dist/docs/reference/text/VectorFont.md +2 -2
  604. package/dist/docs/reference/text/VectorFontOptions.md +1 -1
  605. package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
  606. package/dist/docs/reference/text/VectorTextLayout.md +1 -1
  607. package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
  608. package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
  609. package/dist/docs/reference/text/VectorTextOptions.md +1 -1
  610. package/dist/docs/reference/text/categories/font-preparation.md +4 -4
  611. package/dist/docs/reference/text/prepareVectorFont.md +2 -2
  612. package/dist/docs/reference/text.md +1 -1
  613. package/dist/engine/construction-operations.js +31 -14
  614. package/dist/engine/deferred-context.js +11 -181
  615. package/dist/engine/execution.js +39 -8
  616. package/dist/engine/extrusion-finishing.js +1 -1
  617. package/dist/engine/index.js +6 -1
  618. package/dist/engine/inspection-operations.js +13 -11
  619. package/dist/engine/loft-operations.js +35 -14
  620. package/dist/engine/model-summary.js +8 -5
  621. package/dist/engine/native/material-components.js +305 -0
  622. package/dist/engine/native/regions.js +2 -1
  623. package/dist/engine/native/threads.js +3 -3
  624. package/dist/engine/native/transforms.js +11 -8
  625. package/dist/engine/operation-environment.js +2 -2
  626. package/dist/engine/pattern-operations.js +3 -3
  627. package/dist/engine/placement.js +2 -2
  628. package/dist/engine/primitive-anchors.js +17 -17
  629. package/dist/engine/primitive-operations.js +1 -1
  630. package/dist/engine/primitive-profiles.js +8 -7
  631. package/dist/engine/profile-mesh.js +7 -7
  632. package/dist/engine/recipe-realization.js +35 -21
  633. package/dist/engine/section-operations.js +52 -11
  634. package/dist/engine/session-graph.js +1 -1
  635. package/dist/engine/session-native.js +1 -1
  636. package/dist/engine/session-snapshot.js +17 -6
  637. package/dist/engine/session.js +13 -8
  638. package/dist/engine/shape-anchors.js +5 -11
  639. package/dist/engine/transform-operations.js +66 -49
  640. package/dist/geometry/anchors.js +40 -33
  641. package/dist/geometry/curves/sampling.js +14 -14
  642. package/dist/geometry/edge-finishing.js +1 -1
  643. package/dist/geometry/extrusion.js +13 -16
  644. package/dist/geometry/index.js +13 -10
  645. package/dist/geometry/loft/loft-simple-mesh.js +6 -6
  646. package/dist/geometry/loft/loft.js +22 -13
  647. package/dist/geometry/math/immutable-value.js +20 -0
  648. package/dist/geometry/math/vector-value.js +168 -0
  649. package/dist/geometry/math/vector2.js +80 -0
  650. package/dist/geometry/math/vector3.js +37 -7
  651. package/dist/geometry/mechanical/gear-motion.js +8 -5
  652. package/dist/geometry/mechanical/gears.js +38 -38
  653. package/dist/geometry/mechanical/index.js +3 -3
  654. package/dist/geometry/mechanical/standards.js +1 -1
  655. package/dist/geometry/mechanical/thread-helices.js +2 -3
  656. package/dist/geometry/mechanical/thread-mesh-plan.js +4 -5
  657. package/dist/geometry/mechanical/thread-mesh.js +7 -7
  658. package/dist/geometry/mechanical/thread-profiles.js +5 -5
  659. package/dist/geometry/mechanical/thread-solids.js +2 -2
  660. package/dist/geometry/mechanical/thread-surface.js +1 -1
  661. package/dist/geometry/mechanical/threads.js +8 -8
  662. package/dist/geometry/mesh/mesh-planar.js +25 -27
  663. package/dist/geometry/mesh/mesh-quality.js +5 -5
  664. package/dist/geometry/mesh/mesh-signature.js +13 -13
  665. package/dist/geometry/mesh/mesh-solid-intersections.js +5 -1
  666. package/dist/geometry/mesh/mesh-solid.js +7 -7
  667. package/dist/geometry/mesh/mesh.js +4 -15
  668. package/dist/geometry/paths/closest-point.js +63 -0
  669. package/dist/geometry/paths/frames.js +44 -14
  670. package/dist/geometry/paths/helix.js +16 -6
  671. package/dist/geometry/paths/path-value.js +252 -0
  672. package/dist/geometry/paths/planar.js +36 -23
  673. package/dist/geometry/paths/resampling.js +27 -5
  674. package/dist/geometry/patterns/placements.js +100 -27
  675. package/dist/geometry/patterns.js +2 -2
  676. package/dist/geometry/polygon-clipping.js +17 -0
  677. package/dist/geometry/primitive-resolution.js +4 -1
  678. package/dist/geometry/profiles/contour.js +6 -6
  679. package/dist/geometry/profiles/matched.js +4 -4
  680. package/dist/geometry/profiles/profiles.js +4 -4
  681. package/dist/geometry/profiles/rectangle.js +4 -4
  682. package/dist/geometry/profiles/side-profile.js +7 -7
  683. package/dist/geometry/profiles/span-sampling.js +1 -1
  684. package/dist/geometry/resolution.js +51 -39
  685. package/dist/geometry/revolve/revolve-mesh.js +12 -7
  686. package/dist/geometry/stroke-path.js +57 -68
  687. package/dist/geometry/svg/fill.js +7 -21
  688. package/dist/geometry/svg-import.js +23 -23
  689. package/dist/geometry/sweeps/options.js +5 -4
  690. package/dist/geometry/sweeps/orientation.js +5 -5
  691. package/dist/geometry/sweeps/stations.js +14 -14
  692. package/dist/geometry/sweeps/sweep-closed.js +5 -5
  693. package/dist/geometry/sweeps/sweep-mesh.js +9 -3
  694. package/dist/geometry/sweeps/sweep-open.js +4 -4
  695. package/dist/geometry/sweeps/validation.js +4 -7
  696. package/dist/geometry/transform-chain.js +172 -0
  697. package/dist/geometry/transform-geometry.js +27 -30
  698. package/dist/geometry/transform-matrix.js +14 -0
  699. package/dist/geometry/transform2.js +60 -0
  700. package/dist/geometry/transform3.js +70 -26
  701. package/dist/index.js +4 -0
  702. package/dist/model/execution-binding.js +10 -5
  703. package/dist/model/geometry-recipes.js +15 -0
  704. package/dist/{engine → model}/immutable-generation-data.js +88 -6
  705. package/dist/model/operation-dispatch.js +10 -3
  706. package/dist/model/operations.js +45 -35
  707. package/dist/model/recipe-declaration.js +199 -0
  708. package/dist/model/shape-handles.js +17 -5
  709. package/dist/text/index.js +15 -9
  710. package/dist/text/vector-text-layout.js +31 -26
  711. package/package.json +1 -1
  712. package/dist/docs/reference/geometry/Path2.md +0 -14
  713. package/dist/docs/reference/geometry/Path3.md +0 -14
  714. package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
  715. package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
  716. package/dist/docs/reference/geometry/Region.md +0 -14
  717. package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
  718. package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
  719. package/dist/docs/reference/geometry/Transform3.md +0 -12
  720. package/dist/docs/reference/geometry/Vector2.md +0 -7
  721. package/dist/docs/reference/geometry/Vector3.md +0 -7
  722. package/dist/docs/reference/geometry/attachTransform.md +0 -73
  723. package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
  724. package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
  725. package/dist/docs/reference/geometry/pathLength.md +0 -33
  726. package/dist/docs/reference/geometry/rotateAroundAxis3.md +0 -38
  727. package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
  728. package/dist/docs/reference/geometry/transformContour.md +0 -42
  729. package/dist/docs/reference/geometry/transformPath2.md +0 -40
  730. package/dist/docs/reference/geometry/transformPath3.md +0 -33
  731. package/dist/docs/reference/geometry/transformRegion.md +0 -40
  732. package/dist/docs/reference/model/Transform2.md +0 -15
  733. package/dist/docs/reference/model/fromRegion.md +0 -33
  734. package/dist/docs/reference/model/rayCast.md +0 -40
  735. package/dist/docs/reference/model/toRegion.md +0 -33
  736. package/dist/docs/reference/model/toTriangleMesh.md +0 -27
  737. package/dist/docs/reference/text/Vector2.md +0 -7
  738. package/dist/engine/geometry-recipes.js +0 -12
  739. package/dist/engine/pattern-transform.js +0 -9
  740. package/dist/geometry/paths/path.js +0 -32
@@ -16,7 +16,7 @@ function invalid(message) {
16
16
  * coordinate range are required. No native engine, SDK, or ambient resolution is used.
17
17
  *
18
18
  * @param curve - Closed contour in millimetres unless positive scales convert its coordinates.
19
- * @param options - Physical resolution and unique vertex budget; defaults to 4096 vertices.
19
+ * @param options - Physical resolution and unique vertex budget; defaults to min(4096, maxProfilePoints).
20
20
  * @returns Frozen counterclockwise loop in millimetres, without a repeated seam endpoint.
21
21
  * @throws {@link GeometryError} for invalid data, topology, scale, or exceeded sampling budgets.
22
22
  *
@@ -38,8 +38,8 @@ export function sampleContour(curve, options = {}) {
38
38
  if (![widthScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0))
39
39
  invalid("Cross-section scales must be finite and positive.");
40
40
  const limits = resolveGeometrySamplingLimits(options.limits);
41
- const maximumVertices = options.maximumVertices ?? Math.min(4096, limits.maxProfilePoints);
42
- requireProfileVertexCount(maximumVertices, 3, OPERATION, limits);
41
+ const maxVertices = options.maxVertices ?? Math.min(4096, limits.maxProfilePoints);
42
+ requireProfileVertexCount(maxVertices, 3, OPERATION, limits);
43
43
  const segmentInput = curve?.segments;
44
44
  if (!curve ||
45
45
  !Array.isArray(segmentInput) ||
@@ -66,11 +66,11 @@ export function sampleContour(curve, options = {}) {
66
66
  invalid("Cross-section segments must be lines or cubics.");
67
67
  const end = physical(segment.end);
68
68
  const closed = index === curve.segments.length - 1;
69
- const remainingVertices = Math.min(limits.maxPathPoints, maximumVertices - output.length + 1 + (closed ? 1 : 0));
69
+ const remainingVertices = Math.min(limits.maxPathPoints, maxVertices - output.length + 1 + (closed ? 1 : 0));
70
70
  if (remainingVertices < 2)
71
71
  throw new GeometryError("COMPLEXITY_LIMIT", "Cross-section sampling exceeds its vertex budget.", {
72
72
  operation: OPERATION,
73
- details: { maximumVertices },
73
+ details: { maxVertices },
74
74
  });
75
75
  let span;
76
76
  if (segment.type === "line") {
@@ -90,7 +90,7 @@ export function sampleContour(curve, options = {}) {
90
90
  }
91
91
  const sampled = sampleCurve2(span, {
92
92
  ...(options.resolution === undefined ? {} : { resolution: options.resolution }),
93
- maximumVertices: remainingVertices,
93
+ maxVertices: remainingVertices,
94
94
  limits,
95
95
  }).points;
96
96
  const endIndex = sampled.length - (closed ? 1 : 0);
@@ -39,10 +39,10 @@ const validateContour = (contour) => {
39
39
  }
40
40
  else if (span.kind === "arc") {
41
41
  point(span.center);
42
- if (![span.radius, span.startDegrees, span.sweepDegrees].every(Number.isFinite) ||
42
+ if (![span.radius, span.startAngle, span.sweepAngle].every(Number.isFinite) ||
43
43
  span.radius < 0 ||
44
- Math.abs(span.sweepDegrees) > 360 ||
45
- span.sweepDegrees === 0)
44
+ Math.abs(span.sweepAngle) > 360 ||
45
+ span.sweepAngle === 0)
46
46
  fail("Arc spans need nonnegative radius and a nonzero finite sweep no larger than 360 degrees.");
47
47
  }
48
48
  else
@@ -132,7 +132,7 @@ export function matchProfiles(profiles, options = {}) {
132
132
  if (span.kind === "arc")
133
133
  return span.radius === 0
134
134
  ? 1
135
- : resolveArcSegments(span.radius, Math.abs(span.sweepDegrees), selectedResolution, limits);
135
+ : resolveArcSegments(span.radius, Math.abs(span.sweepAngle), selectedResolution, limits);
136
136
  if (span.kind === "cubic")
137
137
  return resolveUniformCubicSegments(planarCubicControl(span), selectedResolution, cubicBudget);
138
138
  return resolveLineSegmentCount(Math.hypot(span.end[0] - span.start[0], span.end[1] - span.start[1]), selectedResolution.maxSegmentLength);
@@ -49,8 +49,8 @@ export const circleContour = (options) => {
49
49
  */
50
50
  export const regularPolygonContour = (options) => {
51
51
  const operation = "regularPolygonContour";
52
- const { radius, sides, rotationDegrees = 0, sizing = "vertex" } = options;
53
- requireFiniteProfileValues([radius, rotationDegrees], operation);
52
+ const { radius, sides, rotation = 0, sizing = "vertex" } = options;
53
+ requireFiniteProfileValues([radius, rotation], operation);
54
54
  if (!(radius > 0)) {
55
55
  throw new GeometryError("INVALID_ARGUMENT", "Polygon radius must be positive.", { operation });
56
56
  }
@@ -61,9 +61,9 @@ export const regularPolygonContour = (options) => {
61
61
  });
62
62
  const sampledRadius = sizing === "face" ? radius / Math.cos(Math.PI / sides) : radius;
63
63
  requireFiniteProfileValues([sampledRadius], operation);
64
- const rotation = ((rotationDegrees % 360) * Math.PI) / 180;
64
+ const rotationRadians = ((rotation % 360) * Math.PI) / 180;
65
65
  return Array.from({ length: sides }, (_, index) => {
66
- const angle = rotation + (Math.PI * 2 * index) / sides;
66
+ const angle = rotationRadians + (Math.PI * 2 * index) / sides;
67
67
  return [sampledRadius * Math.cos(angle), sampledRadius * Math.sin(angle)];
68
68
  });
69
69
  };
@@ -72,7 +72,7 @@ export function rectangleCornerSegments(corner, limits) {
72
72
  return 1;
73
73
  return (resolveAlignedCircularSegments(Math.max(corner.radius, Number.MIN_VALUE), {
74
74
  alignTo: [4],
75
- minimumSegments: 4,
75
+ minSegments: 4,
76
76
  ...(corner.segments === undefined ? {} : { segments: corner.segments }),
77
77
  ...(corner.resolution === undefined ? {} : { resolution: corner.resolution }),
78
78
  limits: selected,
@@ -194,7 +194,7 @@ export function rectangleProfile(options) {
194
194
  center: map(index, a, b),
195
195
  }));
196
196
  corners.forEach((corner, index) => {
197
- const shape = endpoints[index], startDegrees = vertices[index][2];
197
+ const shape = endpoints[index], startAngle = vertices[index][2];
198
198
  if (corner.kind === "chamfer")
199
199
  spans.push({ id: names[index], kind: "line", start: shape.start, end: shape.end });
200
200
  else if (corner.kind === "smooth") {
@@ -230,8 +230,8 @@ export function rectangleProfile(options) {
230
230
  kind: "arc",
231
231
  center: shape.center,
232
232
  radius: setbacks[index][0],
233
- startDegrees,
234
- sweepDegrees: 90,
233
+ startAngle,
234
+ sweepAngle: 90,
235
235
  ...(exact ? { segments: rectangleCornerSegments(corner, limits) } : {}),
236
236
  ...(corner.kind === "round" && corner.resolution !== undefined
237
237
  ? { resolution: { ...corner.resolution } }
@@ -30,7 +30,7 @@ function distanceToChord(point, start, end) {
30
30
  * no axis closure, winding normalization, or manufacturing repair is performed.
31
31
  *
32
32
  * @param curve - Open outline in millimetres unless the positive scales convert its coordinates.
33
- * @param options - Physical resolution and output budget; defaults to 4096 vertices.
33
+ * @param options - Physical resolution and output budget; defaults to min(4096, maxProfilePoints).
34
34
  * @returns Frozen open polyline in millimetres, ordered from lowest to highest anchor.
35
35
  * @throws {@link GeometryError} for invalid coordinates, order, scale, or exceeded subdivision budget.
36
36
  *
@@ -48,9 +48,9 @@ export function sampleSideProfile(curve, options = {}) {
48
48
  if (![radiusScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0)) {
49
49
  invalid("Profile scales must be finite and positive.");
50
50
  }
51
- const maximumVertices = options.maximumVertices ??
51
+ const maxVertices = options.maxVertices ??
52
52
  Math.min(4096, resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
53
- requireProfileVertexCount(maximumVertices, 2, OPERATION, options.limits);
53
+ requireProfileVertexCount(maxVertices, 2, OPERATION, options.limits);
54
54
  const maximumProfilePoints = resolveGeometrySamplingLimits(options.limits).maxProfilePoints;
55
55
  const segmentInput = curve.segments;
56
56
  if (!Array.isArray(segmentInput) ||
@@ -72,10 +72,10 @@ export function sampleSideProfile(curve, options = {}) {
72
72
  };
73
73
  const output = [];
74
74
  const append = (point) => {
75
- if (output.length >= maximumVertices || output.length >= maximumProfilePoints) {
75
+ if (output.length >= maxVertices || output.length >= maximumProfilePoints) {
76
76
  throw new GeometryError("COMPLEXITY_LIMIT", "Profile sampling exceeds its vertex budget.", {
77
77
  operation: OPERATION,
78
- details: { maximumVertices },
78
+ details: { maxVertices },
79
79
  });
80
80
  }
81
81
  output.push(Object.freeze(point));
@@ -109,10 +109,10 @@ export function sampleSideProfile(curve, options = {}) {
109
109
  const count = resolution.maxSegmentLength === undefined
110
110
  ? 1
111
111
  : Math.max(1, Math.ceil(length / resolution.maxSegmentLength));
112
- if (count > maximumVertices - output.length) {
112
+ if (count > maxVertices - output.length) {
113
113
  throw new GeometryError("COMPLEXITY_LIMIT", "Profile line exceeds its vertex budget.", {
114
114
  operation: OPERATION,
115
- details: { maximumVertices },
115
+ details: { maxVertices },
116
116
  });
117
117
  }
118
118
  for (let index = 1; index <= count; index++) {
@@ -8,7 +8,7 @@ export function createProfileSpanSampler(span) {
8
8
  ];
9
9
  if (span.kind === "arc")
10
10
  return (t) => {
11
- const angle = ((span.startDegrees + span.sweepDegrees * t) * Math.PI) / 180;
11
+ const angle = ((span.startAngle + span.sweepAngle * t) * Math.PI) / 180;
12
12
  const snap = (value) => Math.abs(value) < 1e-14
13
13
  ? 0
14
14
  : Math.abs(Math.abs(value) - 1) < 1e-14
@@ -13,20 +13,20 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
13
13
  const merged = policy;
14
14
  const circularSegments = merged.circularSegments;
15
15
  const allowedMaximum = resolveGeometrySamplingLimits(limits).maxCircularSegments;
16
- const minimumSegments = merged.minimumSegments ?? Math.min(DEFAULT_MINIMUM_SEGMENTS, allowedMaximum);
17
- const maximumSegments = merged.maximumSegments ?? allowedMaximum;
16
+ const minSegments = merged.minSegments ?? Math.min(DEFAULT_MINIMUM_SEGMENTS, allowedMaximum);
17
+ const maxSegments = merged.maxSegments ?? allowedMaximum;
18
18
  const maxChordError = merged.maxChordError ?? DEFAULT_MAX_CHORD_ERROR;
19
19
  const maxSegmentLength = merged.maxSegmentLength;
20
- if (!Number.isSafeInteger(minimumSegments) || minimumSegments < 3) {
21
- invalid("minimumSegments must be an integer of at least three.", { minimumSegments });
20
+ if (!Number.isSafeInteger(minSegments) || minSegments < 3) {
21
+ invalid("minSegments must be an integer of at least three.", { minSegments });
22
22
  }
23
- if (!Number.isSafeInteger(maximumSegments) ||
24
- maximumSegments < minimumSegments ||
25
- maximumSegments > allowedMaximum) {
26
- invalid("maximumSegments must be a safe integer between minimumSegments and maxCircularSegments.", {
23
+ if (!Number.isSafeInteger(maxSegments) ||
24
+ maxSegments < minSegments ||
25
+ maxSegments > allowedMaximum) {
26
+ invalid("maxSegments must be a safe integer between minSegments and maxCircularSegments.", {
27
27
  allowedMaximum,
28
- maximumSegments,
29
- minimumSegments,
28
+ maxSegments,
29
+ minSegments,
30
30
  });
31
31
  }
32
32
  if (!Number.isFinite(maxChordError) || maxChordError <= 0) {
@@ -41,27 +41,32 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
41
41
  if (circularSegments !== undefined &&
42
42
  (!Number.isSafeInteger(circularSegments) ||
43
43
  circularSegments < 3 ||
44
- circularSegments > maximumSegments)) {
45
- invalid("circularSegments must be an integer from three through maximumSegments.", {
44
+ circularSegments > maxSegments)) {
45
+ invalid("circularSegments must be an integer from three through maxSegments.", {
46
46
  circularSegments,
47
- maximumSegments,
47
+ maxSegments,
48
48
  });
49
49
  }
50
50
  return Object.freeze({
51
51
  ...(circularSegments === undefined ? {} : { circularSegments }),
52
52
  maxChordError,
53
53
  ...(maxSegmentLength === undefined ? {} : { maxSegmentLength }),
54
- maximumSegments,
55
- minimumSegments,
54
+ maxSegments,
55
+ minSegments,
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);
64
- return Math.max(resolution.minimumSegments, chordSegments, lengthSegments);
66
+ : sizing === "face"
67
+ ? Math.ceil(Math.PI / Math.atan(resolution.maxSegmentLength / radius / 2))
68
+ : Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
69
+ return Math.max(resolution.minSegments, chordSegments, lengthSegments);
65
70
  };
66
71
  const assertRadius = (radius, operation) => {
67
72
  if (!Number.isFinite(radius) || radius <= 0) {
@@ -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,15 +100,18 @@ 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);
101
- if (required > resolution.maximumSegments) {
102
- throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maximumSegments}-segment safety limit.`, {
109
+ const required = requiredFullCircleSegments(radius, resolution, sizing);
110
+ if (required > resolution.maxSegments) {
111
+ throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maxSegments}-segment safety limit.`, {
103
112
  operation,
104
113
  details: {
105
- maximumSegments: resolution.maximumSegments,
114
+ maxSegments: resolution.maxSegments,
106
115
  radius,
107
116
  requiredSegments: required,
108
117
  },
@@ -133,7 +142,7 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
133
142
  * `alignTo` must be non-empty and contain only positive safe integers. Its checked least common
134
143
  * multiple defines the alignment grid. An exact `segments` value wins over
135
144
  * `resolution.circularSegments` and adaptive sampling, but is never rounded: it must already be
136
- * aligned and meet `minimumSegments`. Adaptive counts are rounded upward and fail with
145
+ * aligned and meet `minSegments`. Adaptive counts are rounded upward and fail with
137
146
  * `COMPLEXITY_LIMIT` when the aligned result exceeds the configured safety cap.
138
147
  *
139
148
  * @param radius - Positive circle radius in millimetres used for adaptive physical sampling.
@@ -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) {
@@ -165,9 +176,9 @@ export function resolveAlignedCircularSegments(radius, options) {
165
176
  }
166
177
  alignment = checkedLeastCommonMultiple(alignment, factor, operation);
167
178
  }
168
- const minimumSegments = options.minimumSegments ?? 3;
169
- if (!Number.isSafeInteger(minimumSegments) || minimumSegments < 3) {
170
- throw new GeometryError("INVALID_ARGUMENT", "minimumSegments must be a safe integer of at least three.", { operation, details: { minimumSegments } });
179
+ const minSegments = options.minSegments ?? 3;
180
+ if (!Number.isSafeInteger(minSegments) || minSegments < 3) {
181
+ throw new GeometryError("INVALID_ARGUMENT", "minSegments must be a safe integer of at least three.", { operation, details: { minSegments } });
171
182
  }
172
183
  const resolution = options.segments === undefined
173
184
  ? resolveGeometryResolution(options.resolution, options.limits)
@@ -176,29 +187,30 @@ export function resolveAlignedCircularSegments(radius, options) {
176
187
  }, options.limits);
177
188
  if (resolution.circularSegments !== undefined) {
178
189
  const exactSegments = resolution.circularSegments;
179
- if (exactSegments < minimumSegments || exactSegments % alignment !== 0) {
180
- throw new GeometryError("INVALID_ARGUMENT", "The exact segment count must meet minimumSegments and every alignTo factor.", {
190
+ if (exactSegments < minSegments || exactSegments % alignment !== 0) {
191
+ throw new GeometryError("INVALID_ARGUMENT", "The exact segment count must meet minSegments and every alignTo factor.", {
181
192
  operation,
182
- details: { alignment, exactSegments, minimumSegments },
193
+ details: { alignment, exactSegments, minSegments },
183
194
  });
184
195
  }
185
196
  return exactSegments;
186
197
  }
187
198
  const baseSegments = resolveCircularSegments(radius, {
188
199
  ...resolution,
200
+ sizing: options.sizing ?? "vertex",
189
201
  }, options.limits);
190
- const requiredSegments = Math.max(baseSegments, minimumSegments);
202
+ const requiredSegments = Math.max(baseSegments, minSegments);
191
203
  const multiplier = Math.ceil(requiredSegments / alignment);
192
204
  if (!Number.isSafeInteger(multiplier) || multiplier > Number.MAX_SAFE_INTEGER / alignment) {
193
205
  throw new GeometryError("COMPLEXITY_LIMIT", "The aligned segment count exceeds safe integer complexity.", { operation, details: { alignment, requiredSegments } });
194
206
  }
195
207
  const alignedSegments = multiplier * alignment;
196
- if (alignedSegments > resolution.maximumSegments) {
208
+ if (alignedSegments > resolution.maxSegments) {
197
209
  throw new GeometryError("COMPLEXITY_LIMIT", "Aligned circular tessellation exceeds the configured segment safety limit.", {
198
210
  operation,
199
211
  details: {
200
212
  alignment,
201
- maximumSegments: resolution.maximumSegments,
213
+ maxSegments: resolution.maxSegments,
202
214
  requiredSegments,
203
215
  segments: alignedSegments,
204
216
  },
@@ -213,7 +225,7 @@ export function resolveAlignedCircularSegments(radius, options) {
213
225
  * the reusable BOSL2-style convention while retaining at least one segment.
214
226
  *
215
227
  * @param radius - Arc radius in millimetres.
216
- * @param angleDegrees - Non-zero signed sweep angle no greater than 360 degrees in magnitude.
228
+ * @param angle - Non-zero signed sweep angle no greater than 360 degrees in magnitude.
217
229
  * @param policy - Optional operation-level policy over the active model scope.
218
230
  * @returns Segment count for the requested arc span.
219
231
  * @throws {@link GeometryError} when radius, angle, or resolution policy is invalid, or the
@@ -225,12 +237,12 @@ export function resolveAlignedCircularSegments(radius, options) {
225
237
  * const quarterTurnSegments = resolveArcSegments(10, 90);
226
238
  * ```
227
239
  */
228
- export function resolveArcSegments(radius, angleDegrees, policy = {}, limits = {}) {
240
+ export function resolveArcSegments(radius, angle, policy = {}, limits = {}) {
229
241
  const operation = "resolveArcSegments";
230
242
  assertRadius(radius, operation);
231
- if (!Number.isFinite(angleDegrees) || angleDegrees === 0 || Math.abs(angleDegrees) > 360) {
232
- throw new GeometryError("INVALID_ARGUMENT", "angleDegrees must be finite, non-zero, and no greater than 360 degrees in magnitude.", { operation, details: { angleDegrees } });
243
+ if (!Number.isFinite(angle) || angle === 0 || Math.abs(angle) > 360) {
244
+ throw new GeometryError("INVALID_ARGUMENT", "angle must be finite, non-zero, and no greater than 360 degrees in magnitude.", { operation, details: { angle } });
233
245
  }
234
- const ratio = Math.abs(angleDegrees) / 360;
246
+ const ratio = Math.abs(angle) / 360;
235
247
  return Math.max(1, Math.ceil(resolveCircularSegments(radius, policy, limits) * ratio));
236
248
  }
@@ -3,6 +3,7 @@ import { triangulateContour } from "../loft/loft.js";
3
3
  import { validateTriangleMesh } from "../mesh/mesh.js";
4
4
  import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
5
5
  import { writeMeshVertex } from "../numeric.js";
6
+ import { path2InputData } from "../paths/path-value.js";
6
7
  import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
7
8
  import { normalizeContour } from "../regions.js";
8
9
  import { assertSamplingCount } from "../sampling-limits.js";
@@ -16,6 +17,7 @@ const AXIS_EPSILON = 1e-10;
16
17
  * vertices and zero-area quads. Profile edges that lie entirely on the axis
17
18
  * collapse to the solid's interior and are intentionally omitted.
18
19
  * Profile coordinates must fit finite Float32 mesh storage.
20
+ * Path2 profiles must be closed; raw point collections have an implicit closing edge.
19
21
  *
20
22
  * @param profile - Closed CCW `[radius, z]` profile without a duplicated seam point.
21
23
  * @param options - Optional physical or exact circumferential sampling controls. Defaults to `{}`.
@@ -24,28 +26,31 @@ const AXIS_EPSILON = 1e-10;
24
26
  * @example Partial revolution with end caps
25
27
  * ```ts
26
28
  * // Each point is [radius, Z]; the profile seam is implicit.
27
- * revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], { revolveDegrees: 270 });
29
+ * revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], { degrees: 270 });
28
30
  * ```
29
31
  */
30
- export const revolveMesh = (profile, options = {}) => {
32
+ export const revolveMesh = (input, options = {}) => {
31
33
  if (typeof options !== "object" || options === null || Array.isArray(options))
32
34
  throw new GeometryError("INVALID_ARGUMENT", "Revolution options require an object.", {
33
35
  operation: "revolveMesh",
34
36
  });
35
- const degrees = options.revolveDegrees ?? 360;
37
+ const degrees = options.degrees ?? 360;
36
38
  if (!Number.isFinite(degrees) || degrees <= 0 || degrees > 360)
37
- throw new GeometryError("INVALID_ARGUMENT", "revolveDegrees must be in (0, 360].", {
39
+ throw new GeometryError("INVALID_ARGUMENT", "degrees must be in (0, 360].", {
38
40
  operation: "revolveMesh",
39
41
  });
42
+ const limits = resolveModelingLimits(options.limits);
43
+ let profile = path2InputData(input, true, { maxPathPoints: limits.maxProfilePoints }).points;
40
44
  if (profile.length < 3) {
41
- throw new Error("A revolved profile needs at least three points.");
45
+ throw new GeometryError("DEGENERATE_GEOMETRY", "A revolved profile needs at least three points.", {
46
+ operation: "revolveMesh",
47
+ });
42
48
  }
43
- const limits = resolveModelingLimits(options.limits);
44
49
  assertSamplingCount(profile.length, "revolveMesh", limits.maxProfilePoints);
45
50
  let maximumRadius = 0;
46
51
  for (const [radius, z] of profile) {
47
52
  if (!Number.isFinite(radius) || !Number.isFinite(z) || radius < 0) {
48
- throw new Error("Revolved profile coordinates must be finite and radii non-negative.");
53
+ throw new GeometryError(Number.isFinite(radius) && Number.isFinite(z) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", "Revolved profile coordinates must be finite and radii non-negative.", { operation: "revolveMesh" });
49
54
  }
50
55
  if (!Number.isFinite(Math.fround(radius)) || !Number.isFinite(Math.fround(z))) {
51
56
  throw new GeometryError("NON_FINITE_VALUE", "Revolved profile coordinates exceed finite Float32 mesh storage.", { operation: "revolveMesh" });
@@ -1,21 +1,12 @@
1
1
  import { GeometryError } from "./errors.js";
2
- import { unionPolygonGeometry } from "./polygon-clipping.js";
3
- import { normalizeRegion } from "./regions.js";
2
+ import { path2InputData } from "./paths/path-value.js";
3
+ import { clippingRing, regionFromMultiPolygon, unionPolygonGeometry } from "./polygon-clipping.js";
4
4
  import { resolveCircularSegments } from "./resolution.js";
5
5
  import { assertSamplingCount, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
6
6
  import { resolveGeometryTolerance } from "./tolerance.js";
7
7
  const DEFAULT_MITER_LIMIT = 4;
8
8
  function fail(message) {
9
- throw new GeometryError("INVALID_ARGUMENT", message, { operation: "strokePathRegion" });
10
- }
11
- function ring(points) {
12
- const result = points.map(([x, y]) => [x, y]);
13
- const first = result[0];
14
- const last = result.at(-1);
15
- if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1])) {
16
- result.push([...first]);
17
- }
18
- return result;
9
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation: "strokeRegionData" });
19
10
  }
20
11
  function ellipsePoints(center, radius, segments) {
21
12
  return Array.from({ length: segments }, (_, index) => {
@@ -23,10 +14,7 @@ function ellipsePoints(center, radius, segments) {
23
14
  return [center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius];
24
15
  });
25
16
  }
26
- function circlePolygon(center, radius, segments) {
27
- return [ring(ellipsePoints(center, radius, segments))];
28
- }
29
- function cornerPolygon(previous, point, next, halfWidth, join) {
17
+ function cornerContour(previous, point, next, halfWidth, join) {
30
18
  const incomingLength = Math.hypot(point[0] - previous[0], point[1] - previous[1]);
31
19
  const outgoingLength = Math.hypot(next[0] - point[0], next[1] - point[1]);
32
20
  const incoming = [
@@ -54,11 +42,13 @@ function cornerPolygon(previous, point, next, halfWidth, join) {
54
42
  ]);
55
43
  }
56
44
  points.push([point[0] + after[0], point[1] + after[1]]);
57
- return [ring(points)];
45
+ return turn > 0 ? points : points.reverse();
58
46
  }
59
47
  /** Removes consecutive points that cannot define a visible stroke segment at model scale. */
60
48
  function deduplicatePath(path, closed, width) {
61
- const scale = Math.max(width, ...path.flatMap(([x, y]) => [Math.abs(x), Math.abs(y)]));
49
+ let scale = width;
50
+ for (const [x, y] of path)
51
+ scale = Math.max(scale, Math.abs(x), Math.abs(y));
62
52
  const tolerance = resolveGeometryTolerance(scale).linear;
63
53
  const points = [];
64
54
  for (const point of path) {
@@ -76,25 +66,41 @@ function deduplicatePath(path, closed, width) {
76
66
  }
77
67
  return Object.freeze(points);
78
68
  }
79
- /** @internal Polygon-clipping representation shared with the bounded SVG importer. */
80
- export function strokePathMultiPolygon(path, options, circularSegments) {
81
- const closed = options.closed ?? false;
69
+ /** @internal Bounded CCW stroke primitives shared by native sections and pure clipping. */
70
+ export function strokePathContours(input, options, exactCircularSegments) {
71
+ const limits = resolveGeometrySamplingLimits(options.limits);
72
+ const { points: path, closed } = path2InputData(input, options.closed, limits);
82
73
  const cap = options.cap ?? "butt";
83
74
  const join = options.join ?? "miter";
75
+ if (typeof closed !== "boolean")
76
+ return fail("closed must be a boolean.");
77
+ if (!Number.isFinite(options.width) || options.width <= 0)
78
+ return fail("Stroke width must be finite and greater than zero.");
79
+ if (path.length < (closed ? 3 : 2))
80
+ return fail(`${closed ? "Closed" : "Open"} strokes need more sampled path points.`);
81
+ if (!path.every((point) => point.length === 2 && point.every(Number.isFinite)))
82
+ return fail("Stroke path coordinates must be finite XY points.");
83
+ if (!["butt", "round", "square"].includes(cap))
84
+ return fail("Stroke cap must be butt, round, or square.");
85
+ if (!["bevel", "miter", "round"].includes(join))
86
+ return fail("Stroke join must be bevel, miter, or round.");
87
+ const circularSegments = exactCircularSegments ??
88
+ (cap === "round" || join === "round"
89
+ ? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
90
+ : 3);
84
91
  const half = options.width / 2;
85
- const limits = resolveGeometrySamplingLimits(options.limits);
86
- assertSamplingCount(path.length, "strokePathRegion", limits.maxPathPoints);
87
- assertSamplingCount(circularSegments, "strokePathRegion", limits.maxCircularSegments);
92
+ assertSamplingCount(path.length, "strokeRegionData", limits.maxPathPoints);
93
+ assertSamplingCount(circularSegments, "strokeRegionData", limits.maxCircularSegments);
88
94
  const normalizedPath = deduplicatePath(path, closed, options.width);
89
95
  if (normalizedPath.length < (closed ? 3 : 2))
90
96
  return [];
91
- const polygons = [];
97
+ const contours = [];
92
98
  const segmentCount = closed ? normalizedPath.length : normalizedPath.length - 1;
93
99
  const joinCount = closed ? normalizedPath.length : Math.max(0, normalizedPath.length - 2);
94
100
  const constructionVertices = segmentCount * 4 +
95
101
  joinCount * (join === "round" ? circularSegments : join === "miter" ? 4 : 3) +
96
102
  (!closed && cap === "round" ? 2 * circularSegments : 0);
97
- assertSamplingCount(constructionVertices, "strokePathRegion", limits.maxProfilePoints);
103
+ assertSamplingCount(constructionVertices, "strokeRegionData", limits.maxProfilePoints);
98
104
  for (let index = 0; index < segmentCount; index += 1) {
99
105
  let start = normalizedPath[index];
100
106
  let end = normalizedPath[(index + 1) % normalizedPath.length];
@@ -108,42 +114,46 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
108
114
  }
109
115
  }
110
116
  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
- ]),
117
+ contours.push([
118
+ [start[0] - normal[0], start[1] - normal[1]],
119
+ [end[0] - normal[0], end[1] - normal[1]],
120
+ [end[0] + normal[0], end[1] + normal[1]],
121
+ [start[0] + normal[0], start[1] + normal[1]],
118
122
  ]);
119
123
  }
124
+ const disk = join === "round" || (!closed && cap === "round")
125
+ ? ellipsePoints([0, 0], half, circularSegments)
126
+ : [];
127
+ const circleAt = ([x, y]) => disk.map(([u, v]) => [x + u, y + v]);
120
128
  if (join === "round") {
121
129
  const joinPoints = closed ? normalizedPath : normalizedPath.slice(1, -1);
122
- polygons.push(...joinPoints.map((point) => circlePolygon(point, half, circularSegments)));
130
+ for (const point of joinPoints)
131
+ contours.push(circleAt(point));
123
132
  }
124
133
  else {
125
134
  const first = closed ? 0 : 1;
126
135
  const end = closed ? normalizedPath.length : normalizedPath.length - 1;
127
136
  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);
137
+ const corner = cornerContour(normalizedPath[(index - 1 + normalizedPath.length) % normalizedPath.length], normalizedPath[index], normalizedPath[(index + 1) % normalizedPath.length], half, join);
129
138
  if (corner !== undefined)
130
- polygons.push(corner);
139
+ contours.push(corner);
131
140
  }
132
141
  }
133
142
  if (!closed && cap === "round") {
134
- polygons.push(circlePolygon(normalizedPath[0], half, circularSegments), circlePolygon(normalizedPath.at(-1), half, circularSegments));
143
+ contours.push(circleAt(normalizedPath[0]), circleAt(normalizedPath.at(-1)));
135
144
  }
136
- const result = unionPolygonGeometry(polygons);
145
+ return contours;
146
+ }
147
+ /** @internal Polygon-clipping representation shared with the bounded SVG importer. */
148
+ export function strokePathMultiPolygon(path, options, circularSegments) {
149
+ const contours = strokePathContours(path, options, circularSegments);
150
+ if (contours.length === 0)
151
+ return [];
152
+ const result = unionPolygonGeometry(contours.map((contour) => [clippingRing(contour)]));
137
153
  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);
154
+ assertSamplingCount(outputVertices, "strokeRegionData", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
139
155
  return result;
140
156
  }
141
- function regionFromMultiPolygon(value) {
142
- return normalizeRegion(value.map((polygon) => ({
143
- outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
144
- holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
145
- })));
146
- }
147
157
  /**
148
158
  * Converts a sampled millimetre path into the filled region covered by a centered stroke.
149
159
  *
@@ -152,29 +162,8 @@ function regionFromMultiPolygon(value) {
152
162
  * resolution. Bevels fill the outer corner triangle; miters extend the outer edges to their
153
163
  * intersection, falling back to bevels above SVG's default miter limit of 4.
154
164
  */
155
- 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);
165
+ export function strokeRegionData(path, options) {
166
+ const result = strokePathMultiPolygon(path, options);
178
167
  if (result.length === 0)
179
168
  return fail("The sampled stroke path has no visible length.");
180
169
  return regionFromMultiPolygon(result);