@metamesh/modeling 0.14.0 → 0.16.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 (775) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +55 -13
  3. package/dist/api/engine.d.ts +15 -7
  4. package/dist/api/geometry.d.ts +853 -562
  5. package/dist/api/index.d.ts +604 -227
  6. package/dist/api/text.d.ts +9 -7
  7. package/dist/docs/guides/concepts.md +295 -91
  8. package/dist/docs/guides/fonts.md +9 -8
  9. package/dist/docs/guides/fundamentals.md +22 -23
  10. package/dist/docs/guides/generation.md +24 -23
  11. package/dist/docs/guides/hosting.md +26 -11
  12. package/dist/docs/guides/recipes.md +74 -48
  13. package/dist/docs/guides/standalone-model.md +42 -0
  14. package/dist/docs/manifest.json +1555 -749
  15. package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
  16. package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
  17. package/dist/docs/reference/engine/GenerationOptions.md +1 -1
  18. package/dist/docs/reference/engine/GeometryResource.md +1 -1
  19. package/dist/docs/reference/engine/ModelDependencies.md +1 -1
  20. package/dist/docs/reference/engine/ModelEngine.md +1 -1
  21. package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
  22. package/dist/docs/reference/engine/ModelSession.md +1 -1
  23. package/dist/docs/reference/engine/ModelSnapshot.md +21 -10
  24. package/dist/docs/reference/engine/SessionOptions.md +1 -1
  25. package/dist/docs/reference/engine/SnapshotPart.md +6 -3
  26. package/dist/docs/reference/engine/categories/host-lifecycle.md +7 -2
  27. package/dist/docs/reference/engine/createModelEngine.md +3 -3
  28. package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
  29. package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
  30. package/dist/docs/reference/engine/validateModel.md +1 -1
  31. package/dist/docs/reference/engine.md +6 -2
  32. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +5 -1
  33. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
  34. package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +6 -5
  35. package/dist/docs/reference/geometry/ArcCurve2.md +11 -7
  36. package/dist/docs/reference/geometry/ArcCurve3.md +13 -9
  37. package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +11 -5
  38. package/dist/docs/reference/geometry/AxisAngleRotation3.md +2 -1
  39. package/dist/docs/reference/geometry/Bounds2-type.md +127 -0
  40. package/dist/docs/reference/geometry/Bounds2Data.md +45 -0
  41. package/dist/docs/reference/geometry/Bounds2Input.md +21 -0
  42. package/dist/docs/reference/geometry/Bounds3-type.md +127 -0
  43. package/dist/docs/reference/geometry/Bounds3Data.md +45 -0
  44. package/dist/docs/reference/geometry/Bounds3Input.md +21 -0
  45. package/dist/docs/reference/geometry/BoundsFit2.md +6 -5
  46. package/dist/docs/reference/geometry/BoundsFit3.md +6 -5
  47. package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -1
  48. package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +2 -1
  49. package/dist/docs/reference/geometry/BoxAnchorFace.md +2 -1
  50. package/dist/docs/reference/geometry/BoxAnchorOptions.md +5 -4
  51. package/dist/docs/reference/geometry/BoxEdge.md +1 -1
  52. package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
  53. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
  54. package/dist/docs/reference/geometry/BoxOptions.md +10 -10
  55. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +8 -1
  56. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +5 -1
  57. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
  58. package/dist/docs/reference/geometry/CircleContourOptions.md +5 -1
  59. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
  60. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -7
  61. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +6 -1
  62. package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -1
  63. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +6 -1
  64. package/dist/docs/reference/geometry/Contour.md +10 -4
  65. package/dist/docs/reference/geometry/ContourCurve.md +5 -1
  66. package/dist/docs/reference/geometry/ContourPoint.md +6 -1
  67. package/dist/docs/reference/geometry/ContourSegment.md +5 -1
  68. package/dist/docs/reference/geometry/CorrespondingComponent.md +5 -1
  69. package/dist/docs/reference/geometry/CorrespondingContour.md +5 -1
  70. package/dist/docs/reference/geometry/CorrespondingProfile.md +5 -1
  71. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +5 -1
  72. package/dist/docs/reference/geometry/CubicBezierCurve2.md +10 -6
  73. package/dist/docs/reference/geometry/CubicBezierCurve3.md +10 -6
  74. package/dist/docs/reference/geometry/Curve2.md +5 -1
  75. package/dist/docs/reference/geometry/Curve3.md +5 -1
  76. package/dist/docs/reference/geometry/CurveSamplingOptions.md +9 -3
  77. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +7 -3
  78. package/dist/docs/reference/geometry/CylinderAnchorFace.md +2 -1
  79. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +6 -5
  80. package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
  81. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -3
  82. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -1
  83. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +5 -1
  84. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +7 -3
  85. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +5 -1
  86. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +6 -1
  87. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +5 -1
  88. package/dist/docs/reference/geometry/CylindricalGearSpec.md +11 -6
  89. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
  90. package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
  91. package/dist/docs/reference/geometry/EllipseContourOptions.md +7 -3
  92. package/dist/docs/reference/geometry/EndTreatments.md +1 -1
  93. package/dist/docs/reference/geometry/ExtrudeOptions.md +10 -6
  94. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -5
  95. package/dist/docs/reference/geometry/FittedTextLayout.md +7 -3
  96. package/dist/docs/reference/geometry/Frame3.md +10 -6
  97. package/dist/docs/reference/geometry/GeometryError.md +1 -1
  98. package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
  99. package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
  100. package/dist/docs/reference/geometry/GeometryResolution.md +5 -5
  101. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +5 -1
  102. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
  103. package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
  104. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +5 -1
  105. package/dist/docs/reference/geometry/HeightfieldOptions.md +9 -5
  106. package/dist/docs/reference/geometry/HeightfieldPreflight.md +9 -4
  107. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +9 -5
  108. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +10 -6
  109. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +7 -2
  110. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +4 -3
  111. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +10 -6
  112. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +82 -0
  113. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +148 -0
  114. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +46 -0
  115. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +51 -0
  116. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +22 -0
  117. package/dist/docs/reference/geometry/LineCurve2.md +8 -4
  118. package/dist/docs/reference/geometry/LineCurve3.md +8 -4
  119. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
  120. package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
  121. package/dist/docs/reference/geometry/LoftMeshStation.md +8 -4
  122. package/dist/docs/reference/geometry/LoftOptions.md +5 -1
  123. package/dist/docs/reference/geometry/LoftPlacement.md +5 -1
  124. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +5 -1
  125. package/dist/docs/reference/geometry/MatchProfilesOptions.md +5 -1
  126. package/dist/docs/reference/geometry/MetricFastenerSize.md +9 -2
  127. package/dist/docs/reference/geometry/MetricFastenerStandard.md +5 -1
  128. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +6 -1
  129. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +6 -1
  130. package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
  131. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +5 -1
  132. package/dist/docs/reference/geometry/Path2-type.md +196 -0
  133. package/dist/docs/reference/geometry/Path2Data.md +50 -0
  134. package/dist/docs/reference/geometry/Path2Input.md +20 -0
  135. package/dist/docs/reference/geometry/Path3-type.md +196 -0
  136. package/dist/docs/reference/geometry/Path3Data.md +50 -0
  137. package/dist/docs/reference/geometry/Path3Input.md +20 -0
  138. package/dist/docs/reference/geometry/PathFrame.md +9 -5
  139. package/dist/docs/reference/geometry/PathLocation.md +69 -0
  140. package/dist/docs/reference/geometry/PathNormalGuide.md +10 -5
  141. package/dist/docs/reference/geometry/PathOptions.md +38 -0
  142. package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
  143. package/dist/docs/reference/geometry/PathPlacement.md +8 -4
  144. package/dist/docs/reference/geometry/PathResamplingOptions.md +84 -0
  145. package/dist/docs/reference/geometry/Pivot2Options.md +2 -1
  146. package/dist/docs/reference/geometry/Pivot3Options.md +2 -1
  147. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +8 -1
  148. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +26 -22
  149. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +5 -1
  150. package/dist/docs/reference/geometry/PlanarPatchQuality.md +7 -3
  151. package/dist/docs/reference/geometry/PolygonData.md +7 -2
  152. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -4
  153. package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
  154. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
  155. package/dist/docs/reference/geometry/PrintableThreadFit.md +8 -1
  156. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +6 -1
  157. package/dist/docs/reference/geometry/Profile.md +8 -2
  158. package/dist/docs/reference/geometry/ProfileComponent2.md +5 -1
  159. package/dist/docs/reference/geometry/ProfileContour2.md +8 -2
  160. package/dist/docs/reference/geometry/ProfileSpan2.md +7 -3
  161. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
  162. package/dist/docs/reference/geometry/RackPitchDimensions.md +6 -1
  163. package/dist/docs/reference/geometry/RackPitchSpec.md +10 -5
  164. package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
  165. package/dist/docs/reference/geometry/RadialSizing.md +1 -1
  166. package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
  167. package/dist/docs/reference/geometry/RectangleContourOptions.md +7 -3
  168. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +5 -1
  169. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +5 -1
  170. package/dist/docs/reference/geometry/RectangleProfileOptions.md +7 -3
  171. package/dist/docs/reference/geometry/RegionData.md +6 -2
  172. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +7 -3
  173. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
  174. package/dist/docs/reference/geometry/RevolveOptions.md +13 -4
  175. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
  176. package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -1
  177. package/dist/docs/reference/geometry/SampleContourOptions.md +7 -3
  178. package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
  179. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +7 -3
  180. package/dist/docs/reference/geometry/SampledCurve2.md +8 -4
  181. package/dist/docs/reference/geometry/SampledCurve3.md +8 -4
  182. package/dist/docs/reference/geometry/SampledThreadHelices.md +7 -3
  183. package/dist/docs/reference/geometry/SideProfileCurve.md +5 -1
  184. package/dist/docs/reference/geometry/SideProfilePoint.md +6 -1
  185. package/dist/docs/reference/geometry/SideProfileSegment.md +5 -1
  186. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
  187. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +7 -3
  188. package/dist/docs/reference/geometry/SphereOptions.md +3 -3
  189. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
  190. package/dist/docs/reference/geometry/StrokeCap.md +14 -0
  191. package/dist/docs/reference/geometry/StrokeJoin.md +14 -0
  192. package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +11 -7
  193. package/dist/docs/reference/geometry/SvgImportOptions.md +5 -1
  194. package/dist/docs/reference/geometry/SvgRegionPreflight.md +6 -2
  195. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +19 -15
  196. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +16 -11
  197. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +14 -9
  198. package/dist/docs/reference/geometry/SweepOptions.md +10 -6
  199. package/dist/docs/reference/geometry/SweepOrientation.md +11 -7
  200. package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
  201. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +9 -5
  202. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +5 -1
  203. package/dist/docs/reference/geometry/ThreadEndStyle.md +8 -1
  204. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +5 -1
  205. package/dist/docs/reference/geometry/ThreadHandedness.md +8 -1
  206. package/dist/docs/reference/geometry/ThreadHelixOptions.md +7 -3
  207. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
  208. package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
  209. package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +7 -3
  210. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +5 -1
  211. package/dist/docs/reference/geometry/ThreadProfileSpec.md +5 -1
  212. package/dist/docs/reference/geometry/ThreadRole.md +8 -1
  213. package/dist/docs/reference/geometry/ThreadedNutBevel.md +8 -1
  214. package/dist/docs/reference/geometry/ThreadedNutOptions.md +10 -6
  215. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +7 -3
  216. package/dist/docs/reference/geometry/ThreadedNutShape.md +8 -1
  217. package/dist/docs/reference/geometry/ThreadedRodOptions.md +10 -6
  218. package/dist/docs/reference/geometry/TorusOptions.md +8 -8
  219. package/dist/docs/reference/geometry/Transform2-type.md +6 -5
  220. package/dist/docs/reference/geometry/Transform2Data.md +15 -0
  221. package/dist/docs/reference/geometry/Transform2Input.md +4 -3
  222. package/dist/docs/reference/geometry/Transform3-type.md +6 -5
  223. package/dist/docs/reference/geometry/Transform3Data.md +18 -0
  224. package/dist/docs/reference/geometry/Transform3Input.md +4 -3
  225. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +9 -4
  226. package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
  227. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +8 -4
  228. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +5 -1
  229. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +7 -3
  230. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +7 -3
  231. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
  232. package/dist/docs/reference/geometry/TriangleMeshSignature.md +8 -4
  233. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +8 -3
  234. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +6 -1
  235. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +5 -1
  236. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +5 -1
  237. package/dist/docs/reference/geometry/TubeOptions.md +8 -8
  238. package/dist/docs/reference/geometry/Vector2-type.md +6 -5
  239. package/dist/docs/reference/geometry/Vector2Data.md +15 -0
  240. package/dist/docs/reference/geometry/Vector2Input.md +4 -3
  241. package/dist/docs/reference/geometry/Vector3-type.md +6 -5
  242. package/dist/docs/reference/geometry/Vector3Data.md +15 -0
  243. package/dist/docs/reference/geometry/Vector3Input.md +4 -3
  244. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +8 -3
  245. package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
  246. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +5 -1
  247. package/dist/docs/reference/geometry/VectorTextMetrics.md +7 -3
  248. package/dist/docs/reference/geometry/VectorTextOptions.md +5 -1
  249. package/dist/docs/reference/geometry/add2.md +7 -6
  250. package/dist/docs/reference/geometry/add3.md +7 -6
  251. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +5 -1
  252. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +6 -2
  253. package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +10 -9
  254. package/dist/docs/reference/geometry/anchorFrame3.md +9 -5
  255. package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
  256. package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
  257. package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +16 -15
  258. package/dist/docs/reference/geometry/bounds2.md +38 -0
  259. package/dist/docs/reference/geometry/bounds3.md +38 -0
  260. package/dist/docs/reference/geometry/boundsCenter.md +12 -11
  261. package/dist/docs/reference/geometry/boundsFromSize.md +12 -11
  262. package/dist/docs/reference/geometry/boundsSize.md +12 -11
  263. package/dist/docs/reference/geometry/boxAnchor3.md +7 -6
  264. package/dist/docs/reference/geometry/categories/bounds-layout.md +23 -6
  265. package/dist/docs/reference/geometry/categories/curves-paths.md +27 -13
  266. package/dist/docs/reference/geometry/categories/mechanical.md +27 -15
  267. package/dist/docs/reference/geometry/categories/meshes.md +18 -10
  268. package/dist/docs/reference/geometry/categories/pattern-placement.md +11 -9
  269. package/dist/docs/reference/geometry/categories/primitive-options.md +10 -4
  270. package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -13
  271. package/dist/docs/reference/geometry/categories/resolution-errors.md +5 -3
  272. package/dist/docs/reference/geometry/categories/transforms-math.md +25 -16
  273. package/dist/docs/reference/geometry/categories/vector-import.md +15 -9
  274. package/dist/docs/reference/geometry/circleContour.md +5 -1
  275. package/dist/docs/reference/geometry/closeToAxis.md +14 -5
  276. package/dist/docs/reference/geometry/compensateThreadDiameters.md +5 -1
  277. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +9 -5
  278. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +9 -5
  279. package/dist/docs/reference/geometry/composeTransform3.md +7 -6
  280. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +14 -6
  281. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +17 -7
  282. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
  283. package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +8 -4
  284. package/dist/docs/reference/geometry/containsBounds.md +10 -9
  285. package/dist/docs/reference/geometry/contourContainsPoint.md +8 -4
  286. package/dist/docs/reference/geometry/cross2.md +6 -5
  287. package/dist/docs/reference/geometry/cross3.md +7 -6
  288. package/dist/docs/reference/geometry/cylinderAnchor3.md +7 -6
  289. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +5 -1
  290. package/dist/docs/reference/geometry/distance2.md +6 -5
  291. package/dist/docs/reference/geometry/distance3.md +6 -5
  292. package/dist/docs/reference/geometry/distributeAlongPath.md +12 -6
  293. package/dist/docs/reference/geometry/dot2.md +6 -5
  294. package/dist/docs/reference/geometry/dot3.md +6 -5
  295. package/dist/docs/reference/geometry/ellipseContour.md +5 -1
  296. package/dist/docs/reference/geometry/eulerTransform3.md +7 -6
  297. package/dist/docs/reference/geometry/extrudeMesh.md +12 -8
  298. package/dist/docs/reference/geometry/fitBounds.md +10 -9
  299. package/dist/docs/reference/geometry/fitTextLayout.md +13 -5
  300. package/dist/docs/reference/geometry/frameTransform3.md +5 -4
  301. package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +7 -3
  302. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
  303. package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
  304. package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
  305. package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +9 -5
  306. package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +9 -5
  307. package/dist/docs/reference/geometry/inverseTransform3.md +6 -5
  308. package/dist/docs/reference/geometry/isGeometryError.md +5 -2
  309. package/dist/docs/reference/geometry/joinTriangleMeshes.md +5 -1
  310. package/dist/docs/reference/geometry/layoutRow.md +11 -7
  311. package/dist/docs/reference/geometry/length2.md +5 -4
  312. package/dist/docs/reference/geometry/length3.md +5 -4
  313. package/dist/docs/reference/geometry/lerp2.md +7 -6
  314. package/dist/docs/reference/geometry/lerp3.md +7 -6
  315. package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
  316. package/dist/docs/reference/geometry/loftMesh.md +6 -1
  317. package/dist/docs/reference/geometry/matchProfiles.md +11 -2
  318. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +5 -1
  319. package/dist/docs/reference/geometry/meshBounds.md +8 -4
  320. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +7 -3
  321. package/dist/docs/reference/geometry/normalize2.md +10 -6
  322. package/dist/docs/reference/geometry/normalize3.md +10 -6
  323. package/dist/docs/reference/geometry/normalizeContour.md +8 -4
  324. package/dist/docs/reference/geometry/normalizePolygon.md +5 -1
  325. package/dist/docs/reference/geometry/normalizeRegion.md +5 -1
  326. package/dist/docs/reference/geometry/optimizePlanarPatches.md +15 -11
  327. package/dist/docs/reference/geometry/path2.md +54 -0
  328. package/dist/docs/reference/geometry/path3.md +49 -0
  329. package/dist/docs/reference/geometry/pathPatternTransforms.md +13 -9
  330. package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
  331. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +13 -4
  332. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +15 -4
  333. package/dist/docs/reference/geometry/preflightSvgRegion.md +15 -2
  334. package/dist/docs/reference/geometry/preflightThreadedNut.md +14 -4
  335. package/dist/docs/reference/geometry/preflightThreadedRod.md +14 -4
  336. package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
  337. package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
  338. package/dist/docs/reference/geometry/rectangleContour.md +10 -3
  339. package/dist/docs/reference/geometry/rectangleProfile.md +10 -2
  340. package/dist/docs/reference/geometry/regionArea.md +5 -1
  341. package/dist/docs/reference/geometry/regionBounds.md +8 -4
  342. package/dist/docs/reference/geometry/regularPolygonContour.md +9 -5
  343. package/dist/docs/reference/geometry/resamplePolyline2.md +9 -5
  344. package/dist/docs/reference/geometry/resamplePolyline3.md +9 -5
  345. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +4 -4
  346. package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
  347. package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
  348. package/dist/docs/reference/geometry/resolveCylindricalGear.md +5 -1
  349. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +5 -1
  350. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +7 -3
  351. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -1
  352. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
  353. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +59 -0
  354. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +5 -1
  355. package/dist/docs/reference/geometry/resolveRackPitch.md +5 -1
  356. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -4
  357. package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
  358. package/dist/docs/reference/geometry/revolveMesh.md +14 -10
  359. package/dist/docs/reference/geometry/rotate2.md +6 -5
  360. package/dist/docs/reference/geometry/rotationTransform3.md +7 -6
  361. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -6
  362. package/dist/docs/reference/geometry/sampleContour.md +14 -4
  363. package/dist/docs/reference/geometry/sampleCurve2.md +8 -5
  364. package/dist/docs/reference/geometry/sampleCurve3.md +6 -2
  365. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +5 -1
  366. package/dist/docs/reference/geometry/sampleHelix.md +13 -5
  367. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +5 -1
  368. package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -4
  369. package/dist/docs/reference/geometry/sampleSideProfile.md +17 -7
  370. package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
  371. package/dist/docs/reference/geometry/sampleThreadHelices.md +6 -2
  372. package/dist/docs/reference/geometry/scale2.md +6 -5
  373. package/dist/docs/reference/geometry/scale3.md +6 -5
  374. package/dist/docs/reference/geometry/scaleTransform3.md +7 -6
  375. package/dist/docs/reference/geometry/signedContourArea.md +5 -1
  376. package/dist/docs/reference/geometry/starContour.md +8 -4
  377. package/dist/docs/reference/geometry/strokeRegionData.md +67 -0
  378. package/dist/docs/reference/geometry/subtract2.md +7 -6
  379. package/dist/docs/reference/geometry/subtract3.md +7 -6
  380. package/dist/docs/reference/geometry/sweepMesh.md +13 -9
  381. package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +10 -6
  382. package/dist/docs/reference/geometry/transform2.md +14 -7
  383. package/dist/docs/reference/geometry/transform3.md +16 -7
  384. package/dist/docs/reference/geometry/transformDeterminant3.md +5 -4
  385. package/dist/docs/reference/geometry/transformRegionData.md +5 -1
  386. package/dist/docs/reference/geometry/transformTriangleMesh.md +10 -6
  387. package/dist/docs/reference/geometry/translationTransform3.md +7 -6
  388. package/dist/docs/reference/geometry/triangulateContour.md +5 -1
  389. package/dist/docs/reference/geometry/validateSolidMesh.md +10 -3
  390. package/dist/docs/reference/geometry/validateTransform3.md +6 -5
  391. package/dist/docs/reference/geometry/validateTriangleMesh.md +5 -1
  392. package/dist/docs/reference/geometry/vector2.md +10 -2
  393. package/dist/docs/reference/geometry/vector3.md +10 -2
  394. package/dist/docs/reference/geometry.md +8 -6
  395. package/dist/docs/reference/model/Anchor3.md +6 -5
  396. package/dist/docs/reference/model/AttachOptions.md +11 -5
  397. package/dist/docs/reference/model/Bounds2-type.md +125 -0
  398. package/dist/docs/reference/model/Bounds2Data.md +44 -0
  399. package/dist/docs/reference/model/Bounds2Input.md +19 -0
  400. package/dist/docs/reference/model/Bounds3-type.md +125 -0
  401. package/dist/docs/reference/model/Bounds3Data.md +44 -0
  402. package/dist/docs/reference/model/Bounds3Input.md +19 -0
  403. package/dist/docs/reference/model/BoxEdge.md +1 -1
  404. package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
  405. package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
  406. package/dist/docs/reference/model/BoxOptions.md +10 -10
  407. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
  408. package/dist/docs/reference/model/CircleContourOptions.md +1 -1
  409. package/dist/docs/reference/model/CircleOptions.md +3 -3
  410. package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
  411. package/dist/docs/reference/model/Computed.md +6 -1
  412. package/dist/docs/reference/model/ComputedValue.md +5 -1
  413. package/dist/docs/reference/model/Contour.md +6 -4
  414. package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
  415. package/dist/docs/reference/model/CorrespondingContour.md +1 -1
  416. package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
  417. package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
  418. package/dist/docs/reference/model/CylinderOptions.md +3 -3
  419. package/dist/docs/reference/model/DiagnosticOptions.md +6 -1
  420. package/dist/docs/reference/model/EdgeTreatment.md +1 -1
  421. package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
  422. package/dist/docs/reference/model/EllipseOptions.md +3 -3
  423. package/dist/docs/reference/model/EndTreatments.md +1 -1
  424. package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
  425. package/dist/docs/reference/model/FinalizedModel.md +20 -10
  426. package/dist/docs/reference/model/FinalizedPart.md +1 -1
  427. package/dist/docs/reference/model/Frame3.md +6 -6
  428. package/dist/docs/reference/model/GenerateCallback.md +5 -1
  429. package/dist/docs/reference/model/GenerateContext.md +5 -1
  430. package/dist/docs/reference/model/GeneratedPart.md +5 -1
  431. package/dist/docs/reference/model/GenerationDiagnostic.md +6 -1
  432. package/dist/docs/reference/model/GenerationError.md +5 -1
  433. package/dist/docs/reference/model/GeometryResolution.md +5 -5
  434. package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
  435. package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
  436. package/dist/docs/reference/model/GridPatternOptions.md +12 -5
  437. package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
  438. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +4 -3
  439. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
  440. package/dist/docs/reference/model/HullOptions.md +5 -5
  441. package/dist/docs/reference/model/ImmutableBuffer-type.md +5 -1
  442. package/dist/docs/reference/model/ImmutableTriangleMesh.md +5 -1
  443. package/dist/docs/reference/model/ImplicitOptions.md +6 -6
  444. package/dist/docs/reference/model/InternalThreadCutterOptions.md +5 -4
  445. package/dist/docs/reference/model/KnuckleHinge-type.md +47 -0
  446. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +77 -0
  447. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +34 -0
  448. package/dist/docs/reference/model/KnuckleHingeOptions.md +38 -0
  449. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +47 -0
  450. package/dist/docs/reference/model/KnuckleHingeSpec.md +18 -0
  451. package/dist/docs/reference/model/KnuckleHingeWeb.md +53 -0
  452. package/dist/docs/reference/model/LinearPatternOptions.md +13 -5
  453. package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
  454. package/dist/docs/reference/model/LoftOptions.md +1 -1
  455. package/dist/docs/reference/model/LoftPlacement.md +1 -1
  456. package/dist/docs/reference/model/LoftStation.md +3 -3
  457. package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
  458. package/dist/docs/reference/model/ModelProgram.md +5 -1
  459. package/dist/docs/reference/model/ModelingLimits.md +1 -1
  460. package/dist/docs/reference/model/NumericArray.md +8 -1
  461. package/dist/docs/reference/model/PartGeometry.md +5 -1
  462. package/dist/docs/reference/model/PartOptions.md +5 -1
  463. package/dist/docs/reference/model/Path2-type.md +196 -0
  464. package/dist/docs/reference/model/Path2Data.md +50 -0
  465. package/dist/docs/reference/model/Path2Input.md +20 -0
  466. package/dist/docs/reference/model/Path3-type.md +196 -0
  467. package/dist/docs/reference/model/Path3Data.md +50 -0
  468. package/dist/docs/reference/model/Path3Input.md +20 -0
  469. package/dist/docs/reference/model/PathLocation.md +69 -0
  470. package/dist/docs/reference/model/PathNormalGuide.md +6 -5
  471. package/dist/docs/reference/model/PathOptions.md +38 -0
  472. package/dist/docs/reference/model/PathPatternOptions.md +4 -3
  473. package/dist/docs/reference/model/PathResamplingOptions.md +83 -0
  474. package/dist/docs/reference/model/PatternSource.md +2 -1
  475. package/dist/docs/reference/model/Pivot2Options.md +2 -1
  476. package/dist/docs/reference/model/Pivot3Options.md +2 -1
  477. package/dist/docs/reference/model/PlaneOptions.md +3 -3
  478. package/dist/docs/reference/model/PolygonData.md +3 -2
  479. package/dist/docs/reference/model/PolygonOptions.md +8 -8
  480. package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +8 -7
  481. package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +42 -20
  482. package/dist/docs/reference/model/PrintableThreadFit.md +2 -1
  483. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +2 -1
  484. package/dist/docs/reference/model/Profile.md +4 -2
  485. package/dist/docs/reference/model/ProfileComponent2.md +1 -1
  486. package/dist/docs/reference/model/ProfileContour2.md +4 -2
  487. package/dist/docs/reference/model/ProfileSpan2.md +3 -3
  488. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
  489. package/dist/docs/reference/model/RadialPatternOptions.md +18 -22
  490. package/dist/docs/reference/model/RadialSizing.md +1 -1
  491. package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
  492. package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
  493. package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
  494. package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
  495. package/dist/docs/reference/model/RectangleOptions.md +10 -10
  496. package/dist/docs/reference/model/RegionData.md +2 -2
  497. package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
  498. package/dist/docs/reference/model/RevolveOptions.md +9 -4
  499. package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
  500. package/dist/docs/reference/model/Section.md +20 -12
  501. package/dist/docs/reference/model/SectionHullOptions.md +5 -5
  502. package/dist/docs/reference/model/SectionInspection.md +10 -10
  503. package/dist/docs/reference/model/SectionOffsetJoin.md +1 -1
  504. package/dist/docs/reference/model/SectionOffsetOptions.md +1 -1
  505. package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
  506. package/dist/docs/reference/model/Solid.md +31 -7
  507. package/dist/docs/reference/model/SolidInspection.md +7 -7
  508. package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
  509. package/dist/docs/reference/model/SphereOptions.md +3 -3
  510. package/dist/docs/reference/model/StarOptions.md +10 -10
  511. package/dist/docs/reference/model/{StrokePathCap.md → StrokeCap.md} +3 -3
  512. package/dist/docs/reference/model/{StrokePathJoin.md → StrokeJoin.md} +3 -3
  513. package/dist/docs/reference/model/StrokeOptions.md +6 -6
  514. package/dist/docs/reference/model/SvgOrigin.md +1 -1
  515. package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
  516. package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
  517. package/dist/docs/reference/model/SweepOptions.md +6 -6
  518. package/dist/docs/reference/model/SweepOrientation.md +7 -7
  519. package/dist/docs/reference/model/TextSectionOptions.md +1 -1
  520. package/dist/docs/reference/model/ThreadEndStyle.md +2 -1
  521. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +2 -1
  522. package/dist/docs/reference/model/ThreadHandedness.md +2 -1
  523. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +2 -1
  524. package/dist/docs/reference/model/ThreadLeadInShape.md +2 -1
  525. package/dist/docs/reference/model/ThreadProfile.md +4 -3
  526. package/dist/docs/reference/model/ThreadRidgeOptions.md +2 -1
  527. package/dist/docs/reference/model/ThreadedNutBevel.md +2 -1
  528. package/dist/docs/reference/model/ThreadedNutOptions.md +5 -4
  529. package/dist/docs/reference/model/ThreadedNutPreflight.md +4 -3
  530. package/dist/docs/reference/model/ThreadedNutShape.md +2 -1
  531. package/dist/docs/reference/model/ThreadedRodOptions.md +5 -4
  532. package/dist/docs/reference/model/TorusOptions.md +8 -8
  533. package/dist/docs/reference/model/Transform2-type.md +6 -5
  534. package/dist/docs/reference/model/Transform2Data.md +16 -0
  535. package/dist/docs/reference/model/Transform2Input.md +4 -3
  536. package/dist/docs/reference/model/Transform3-type.md +6 -5
  537. package/dist/docs/reference/model/Transform3Data.md +19 -0
  538. package/dist/docs/reference/model/Transform3Input.md +4 -3
  539. package/dist/docs/reference/model/TriangleMesh.md +1 -1
  540. package/dist/docs/reference/model/TriangleMeshAnalysis.md +4 -4
  541. package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
  542. package/dist/docs/reference/model/TubeOptions.md +8 -8
  543. package/dist/docs/reference/model/Vector2-type.md +6 -5
  544. package/dist/docs/reference/model/{Vector2Tuple.md → Vector2Data.md} +3 -3
  545. package/dist/docs/reference/model/Vector2Input.md +4 -3
  546. package/dist/docs/reference/model/Vector3-type.md +6 -5
  547. package/dist/docs/reference/model/{Vector3Tuple.md → Vector3Data.md} +3 -3
  548. package/dist/docs/reference/model/Vector3Input.md +4 -3
  549. package/dist/docs/reference/model/VectorTextLayout.md +1 -1
  550. package/dist/docs/reference/model/VectorTextMetrics.md +3 -3
  551. package/dist/docs/reference/model/anchor.md +2 -1
  552. package/dist/docs/reference/model/bounds2.md +36 -0
  553. package/dist/docs/reference/model/bounds3.md +36 -0
  554. package/dist/docs/reference/model/box.md +4 -4
  555. package/dist/docs/reference/model/castSegment.md +40 -0
  556. package/dist/docs/reference/model/categories/boolean-operations.md +10 -3
  557. package/dist/docs/reference/model/categories/bounded-surfaces.md +5 -3
  558. package/dist/docs/reference/model/categories/bounds.md +36 -0
  559. package/dist/docs/reference/model/categories/contracts.md +4 -2
  560. package/dist/docs/reference/model/categories/core-values-errors.md +11 -11
  561. package/dist/docs/reference/model/categories/explicit-profiles.md +7 -5
  562. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +12 -3
  563. package/dist/docs/reference/model/categories/generation.md +11 -2
  564. package/dist/docs/reference/model/categories/hinges.md +38 -0
  565. package/dist/docs/reference/model/categories/inspection.md +12 -6
  566. package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
  567. package/dist/docs/reference/model/categories/paths.md +41 -0
  568. package/dist/docs/reference/model/categories/primitives.md +10 -4
  569. package/dist/docs/reference/model/categories/resolution.md +4 -2
  570. package/dist/docs/reference/model/categories/sections.md +12 -8
  571. package/dist/docs/reference/model/categories/threads.md +11 -8
  572. package/dist/docs/reference/model/categories/transforms-placement.md +23 -15
  573. package/dist/docs/reference/model/circle.md +1 -1
  574. package/dist/docs/reference/model/components.md +6 -6
  575. package/dist/docs/reference/model/compose.md +1 -1
  576. package/dist/docs/reference/model/cylinder.md +1 -1
  577. package/dist/docs/reference/model/distance.md +1 -1
  578. package/dist/docs/reference/model/ellipse.md +1 -1
  579. package/dist/docs/reference/model/extrude.md +3 -3
  580. package/dist/docs/reference/model/generate.md +5 -1
  581. package/dist/docs/reference/model/gridPattern.md +5 -4
  582. package/dist/docs/reference/model/heightfield.md +5 -2
  583. package/dist/docs/reference/model/hull.md +1 -1
  584. package/dist/docs/reference/model/immutableBuffer.md +5 -1
  585. package/dist/docs/reference/model/immutableMesh.md +5 -1
  586. package/dist/docs/reference/model/implicit.md +3 -3
  587. package/dist/docs/reference/model/inspectSection.md +1 -1
  588. package/dist/docs/reference/model/inspectSolid.md +1 -1
  589. package/dist/docs/reference/model/internalThreadCutter.md +5 -4
  590. package/dist/docs/reference/model/intersect.md +1 -1
  591. package/dist/docs/reference/model/isEmpty.md +1 -1
  592. package/dist/docs/reference/model/knuckleHinge.md +47 -0
  593. package/dist/docs/reference/model/linearPattern.md +5 -4
  594. package/dist/docs/reference/model/loft.md +1 -1
  595. package/dist/docs/reference/model/matchProfiles.md +2 -2
  596. package/dist/docs/reference/model/minkowskiSum.md +1 -1
  597. package/dist/docs/reference/model/path2.md +54 -0
  598. package/dist/docs/reference/model/path3.md +49 -0
  599. package/dist/docs/reference/model/pathPattern.md +14 -12
  600. package/dist/docs/reference/model/polygon.md +8 -5
  601. package/dist/docs/reference/model/preflightInternalThreadCutter.md +9 -3
  602. package/dist/docs/reference/model/preflightThreadedNut.md +9 -3
  603. package/dist/docs/reference/model/preflightThreadedRod.md +9 -3
  604. package/dist/docs/reference/model/radialPattern.md +6 -37
  605. package/dist/docs/reference/model/rectangle.md +7 -4
  606. package/dist/docs/reference/model/regularPolygon.md +1 -1
  607. package/dist/docs/reference/model/revolve.md +5 -4
  608. package/dist/docs/reference/model/solidFromMesh.md +1 -1
  609. package/dist/docs/reference/model/sphere.md +1 -1
  610. package/dist/docs/reference/model/split.md +1 -1
  611. package/dist/docs/reference/model/splitByPlane.md +1 -1
  612. package/dist/docs/reference/model/star.md +4 -4
  613. package/dist/docs/reference/model/stroke.md +8 -8
  614. package/dist/docs/reference/model/svgPathSection.md +1 -1
  615. package/dist/docs/reference/model/svgSection.md +1 -1
  616. package/dist/docs/reference/model/sweep.md +7 -7
  617. package/dist/docs/reference/model/textSection.md +1 -1
  618. package/dist/docs/reference/model/threadRidge.md +3 -2
  619. package/dist/docs/reference/model/threadedNut.md +5 -4
  620. package/dist/docs/reference/model/threadedRod.md +5 -4
  621. package/dist/docs/reference/model/torus.md +3 -3
  622. package/dist/docs/reference/model/transform2.md +14 -7
  623. package/dist/docs/reference/model/transform3.md +16 -7
  624. package/dist/docs/reference/model/tube.md +3 -3
  625. package/dist/docs/reference/model/union.md +1 -1
  626. package/dist/docs/reference/model/vector2.md +10 -2
  627. package/dist/docs/reference/model/vector3.md +10 -2
  628. package/dist/docs/reference/model.md +17 -9
  629. package/dist/docs/reference/text/Bounds2Data.md +34 -0
  630. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
  631. package/dist/docs/reference/text/Vector2Data.md +7 -0
  632. package/dist/docs/reference/text/VectorFont.md +2 -2
  633. package/dist/docs/reference/text/VectorFontOptions.md +1 -1
  634. package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
  635. package/dist/docs/reference/text/VectorTextLayout.md +1 -1
  636. package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
  637. package/dist/docs/reference/text/VectorTextMetrics.md +3 -3
  638. package/dist/docs/reference/text/VectorTextOptions.md +1 -1
  639. package/dist/docs/reference/text/categories/font-preparation.md +8 -6
  640. package/dist/docs/reference/text/prepareVectorFont.md +2 -2
  641. package/dist/docs/reference/text.md +4 -2
  642. package/dist/engine/construction-operations.js +31 -14
  643. package/dist/engine/execution.js +39 -8
  644. package/dist/engine/extrusion-finishing.js +1 -1
  645. package/dist/engine/index.js +6 -1
  646. package/dist/engine/inspection-operations.js +13 -11
  647. package/dist/engine/knuckle-hinge-operation.js +85 -0
  648. package/dist/engine/loft-operations.js +35 -14
  649. package/dist/engine/mechanical-operations.js +3 -1
  650. package/dist/engine/model-summary.js +8 -5
  651. package/dist/engine/modeling-context.js +8 -1
  652. package/dist/engine/native/material-components.js +305 -0
  653. package/dist/engine/native/regions.js +2 -1
  654. package/dist/engine/native/threads.js +3 -3
  655. package/dist/engine/native/transforms.js +5 -7
  656. package/dist/engine/operation-environment.js +2 -2
  657. package/dist/engine/pattern-operations.js +1 -1
  658. package/dist/engine/placement.js +2 -2
  659. package/dist/engine/primitive-anchors.js +17 -17
  660. package/dist/engine/primitive-operations.js +1 -1
  661. package/dist/engine/primitive-profiles.js +7 -7
  662. package/dist/engine/profile-mesh.js +7 -7
  663. package/dist/engine/recipe-realization.js +10 -2
  664. package/dist/engine/section-operations.js +33 -8
  665. package/dist/engine/session-snapshot.js +14 -4
  666. package/dist/engine/session.js +10 -5
  667. package/dist/engine/shape-anchors.js +3 -3
  668. package/dist/engine/transform-operations.js +27 -27
  669. package/dist/geometry/anchors.js +40 -33
  670. package/dist/geometry/bounds-value.js +93 -0
  671. package/dist/geometry/bounds.js +10 -8
  672. package/dist/geometry/curves/sampling.js +15 -16
  673. package/dist/geometry/edge-finishing.js +1 -1
  674. package/dist/geometry/errors.js +1 -0
  675. package/dist/geometry/extrusion.js +13 -16
  676. package/dist/geometry/heightfield.js +12 -1
  677. package/dist/geometry/index.js +12 -11
  678. package/dist/geometry/loft/loft-simple-mesh.js +6 -6
  679. package/dist/geometry/loft/loft.js +22 -13
  680. package/dist/geometry/math/immutable-value.js +1 -1
  681. package/dist/geometry/math/vector-value.js +11 -3
  682. package/dist/geometry/math/vector2.js +1 -0
  683. package/dist/geometry/math/vector3.js +1 -0
  684. package/dist/geometry/mechanical/gear-motion.js +3 -3
  685. package/dist/geometry/mechanical/gears.js +38 -38
  686. package/dist/geometry/mechanical/index.js +4 -3
  687. package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
  688. package/dist/geometry/mechanical/standards.js +1 -1
  689. package/dist/geometry/mechanical/thread-helices.js +2 -3
  690. package/dist/geometry/mechanical/thread-mesh-plan.js +11 -7
  691. package/dist/geometry/mechanical/thread-mesh.js +7 -7
  692. package/dist/geometry/mechanical/thread-profiles.js +5 -5
  693. package/dist/geometry/mechanical/thread-solids.js +31 -6
  694. package/dist/geometry/mechanical/thread-surface.js +1 -1
  695. package/dist/geometry/mechanical/threads.js +8 -8
  696. package/dist/geometry/mesh/mesh-centroid.js +1 -0
  697. package/dist/geometry/mesh/mesh-planar.js +25 -27
  698. package/dist/geometry/mesh/mesh-quality.js +5 -5
  699. package/dist/geometry/mesh/mesh-signature.js +13 -13
  700. package/dist/geometry/mesh/mesh-solid.js +8 -7
  701. package/dist/geometry/mesh/mesh.js +4 -15
  702. package/dist/geometry/paths/closest-point.js +8 -19
  703. package/dist/geometry/paths/frames.js +42 -11
  704. package/dist/geometry/paths/helix.js +17 -6
  705. package/dist/geometry/paths/path-value.js +268 -0
  706. package/dist/geometry/paths/planar.js +36 -23
  707. package/dist/geometry/paths/resampling.js +27 -5
  708. package/dist/geometry/patterns/placements.js +100 -27
  709. package/dist/geometry/patterns.js +5 -3
  710. package/dist/geometry/polygon-clipping.js +17 -0
  711. package/dist/geometry/profiles/contour.js +7 -6
  712. package/dist/geometry/profiles/matched.js +5 -4
  713. package/dist/geometry/profiles/profiles.js +4 -4
  714. package/dist/geometry/profiles/rectangle.js +14 -5
  715. package/dist/geometry/profiles/side-profile.js +9 -7
  716. package/dist/geometry/profiles/span-sampling.js +1 -1
  717. package/dist/geometry/resolution.js +34 -34
  718. package/dist/geometry/revolve/revolve-mesh.js +12 -7
  719. package/dist/geometry/stroke-path.js +12 -27
  720. package/dist/geometry/svg/fill.js +7 -21
  721. package/dist/geometry/svg-import.js +31 -25
  722. package/dist/geometry/sweeps/options.js +5 -4
  723. package/dist/geometry/sweeps/orientation.js +5 -5
  724. package/dist/geometry/sweeps/stations.js +10 -10
  725. package/dist/geometry/sweeps/sweep-closed.js +2 -2
  726. package/dist/geometry/sweeps/sweep-mesh.js +9 -3
  727. package/dist/geometry/sweeps/sweep-open.js +1 -1
  728. package/dist/geometry/sweeps/validation.js +4 -7
  729. package/dist/geometry/text-fitting.js +1 -0
  730. package/dist/geometry/transform-geometry.js +7 -14
  731. package/dist/geometry/transform-matrix.js +1 -1
  732. package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
  733. package/dist/index.js +3 -1
  734. package/dist/model/execution-binding.js +3 -3
  735. package/dist/model/geometry-recipes.js +1 -1
  736. package/dist/model/immutable-generation-data.js +62 -10
  737. package/dist/model/knuckle-hinge.js +1 -0
  738. package/dist/model/operations.js +79 -26
  739. package/dist/model/recipe-declaration.js +21 -7
  740. package/dist/model/shape-handles.js +2 -1
  741. package/dist/text/index.js +15 -9
  742. package/dist/text/vector-text-layout.js +31 -26
  743. package/package.json +1 -1
  744. package/dist/docs/reference/geometry/Bounds2.md +0 -39
  745. package/dist/docs/reference/geometry/Bounds3.md +0 -39
  746. package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +0 -34
  747. package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +0 -65
  748. package/dist/docs/reference/geometry/Path2.md +0 -14
  749. package/dist/docs/reference/geometry/Path3.md +0 -14
  750. package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
  751. package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
  752. package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
  753. package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
  754. package/dist/docs/reference/geometry/Transform2Matrix.md +0 -14
  755. package/dist/docs/reference/geometry/Transform3Matrix.md +0 -17
  756. package/dist/docs/reference/geometry/Vector2Tuple.md +0 -14
  757. package/dist/docs/reference/geometry/Vector3Tuple.md +0 -14
  758. package/dist/docs/reference/geometry/closestPointOnPath.md +0 -110
  759. package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
  760. package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
  761. package/dist/docs/reference/geometry/pathLength.md +0 -33
  762. package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
  763. package/dist/docs/reference/geometry/transformContour.md +0 -42
  764. package/dist/docs/reference/geometry/transformPath2.md +0 -40
  765. package/dist/docs/reference/geometry/transformPath3.md +0 -33
  766. package/dist/docs/reference/model/Bounds2.md +0 -39
  767. package/dist/docs/reference/model/Bounds3.md +0 -39
  768. package/dist/docs/reference/model/Path2.md +0 -20
  769. package/dist/docs/reference/model/Transform2Matrix.md +0 -15
  770. package/dist/docs/reference/model/Transform3Matrix.md +0 -18
  771. package/dist/docs/reference/model/rayCast.md +0 -40
  772. package/dist/docs/reference/model/toTriangleMesh.md +0 -27
  773. package/dist/docs/reference/text/Bounds2.md +0 -34
  774. package/dist/docs/reference/text/Vector2Tuple.md +0 -7
  775. package/dist/geometry/paths/path.js +0 -32
@@ -0,0 +1,268 @@
1
+ import { bounds2, bounds3 } from "../bounds-value.js";
2
+ import { GeometryError } from "../errors.js";
3
+ import { immutableMathClass } from "../math/immutable-value.js";
4
+ import { vector2, vector2Data, vector3, vector3Data, } from "../math/vector-value.js";
5
+ import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
6
+ import { transformPath2, transformPath3 } from "../transform-geometry.js";
7
+ import { closestPointOnValidatedPath } from "./closest-point.js";
8
+ import { resamplePath2Points, resamplePath3Points } from "./resampling.js";
9
+ const fail = (message, code = "INVALID_ARGUMENT") => {
10
+ throw new GeometryError(code, message, { operation: "path" });
11
+ };
12
+ // Ordinary tuples keep numerical loops fast. Never expose this owned storage to callers or guides;
13
+ // the deeply frozen interchange snapshot is created only when a consumer actually needs it.
14
+ const pathStates = new WeakMap();
15
+ const stateOf = (owner) => pathStates.get(owner);
16
+ const points2 = (owner) => stateOf(owner).points;
17
+ const points3 = (owner) => stateOf(owner).points;
18
+ function freezePoints(points) {
19
+ for (const point of points)
20
+ Object.freeze(point);
21
+ return Object.freeze(points);
22
+ }
23
+ function frozenData(owner) {
24
+ const state = stateOf(owner);
25
+ return (state.data ??= Object.freeze({
26
+ dimension: owner.dimension,
27
+ closed: owner.closed,
28
+ points: freezePoints(state.points.map((point) => [...point])),
29
+ }));
30
+ }
31
+ function closedOption(closed) {
32
+ if (closed !== undefined && typeof closed !== "boolean")
33
+ fail("Path closed must be a boolean.");
34
+ return closed ?? false;
35
+ }
36
+ function snapshot(input, dimension, limits) {
37
+ if (!Array.isArray(input))
38
+ fail("Path points must be an array of coordinate tuples or vectors.");
39
+ const count = input.length;
40
+ assertSamplingCount(count, "path", limits.maxPathPoints);
41
+ const points = [];
42
+ for (let index = 0; index < count; index++) {
43
+ const values = dimension === 2
44
+ ? vector2Data(input[index])
45
+ : vector3Data(input[index]);
46
+ // Read exactly the required coordinates once; user accessors and array iterators cannot
47
+ // change an already validated snapshot or grow its allocation beyond the initial ceiling.
48
+ const copied = dimension === 2 ? [values[0], values[1]] : [values[0], values[1], values[2]];
49
+ for (const coordinate of copied)
50
+ if (!Number.isFinite(coordinate))
51
+ fail("Path coordinates must be finite.", "NON_FINITE_VALUE");
52
+ points.push(copied);
53
+ }
54
+ return points;
55
+ }
56
+ function validateClosure(points, closed) {
57
+ if (!closed)
58
+ return;
59
+ if (points.length < 3)
60
+ fail("Closed paths need at least three vertices.");
61
+ const first = points[0], last = points.at(-1);
62
+ if (first.every((coordinate, index) => coordinate === last[index]))
63
+ fail("Closed paths omit the repeated closing vertex.");
64
+ }
65
+ function pathSource(input, closed, dimension) {
66
+ if (Array.isArray(input))
67
+ return { points: input, closed: closedOption(closed) };
68
+ if (typeof input !== "object" || input === null)
69
+ return fail("Expected a path value, path data, or an array of vectors.");
70
+ const own = pathStates.get(input);
71
+ const method = Reflect.get(input, "toData");
72
+ const data = own !== undefined
73
+ ? input
74
+ : typeof method === "function"
75
+ ? Reflect.apply(method, input, [])
76
+ : input;
77
+ if (typeof data !== "object" || data === null)
78
+ return fail("Expected complete path data.");
79
+ const sourceDimension = Reflect.get(data, "dimension");
80
+ const sourceClosed = Reflect.get(data, "closed");
81
+ const points = own?.points ?? Reflect.get(data, "points");
82
+ if (sourceDimension !== dimension || typeof sourceClosed !== "boolean" || !Array.isArray(points))
83
+ return fail("Path data requires matching dimension, boolean closure, and an array of vectors.");
84
+ if (closed !== undefined && closedOption(closed) !== sourceClosed)
85
+ fail("The closed option conflicts with the path's closure.");
86
+ return { points: points, closed: sourceClosed };
87
+ }
88
+ function measuredLength(owner) {
89
+ const state = stateOf(owner);
90
+ const cached = state.length;
91
+ if (cached !== undefined)
92
+ return cached;
93
+ const points = state.points;
94
+ let total = 0;
95
+ const count = owner.closed ? points.length : Math.max(0, points.length - 1);
96
+ for (let index = 0; index < count; index++) {
97
+ const a = points[index], b = points[(index + 1) % points.length];
98
+ total += Math.hypot(b[0] - a[0], b[1] - a[1], (b[2] ?? 0) - (a[2] ?? 0));
99
+ if (!Number.isFinite(total))
100
+ fail("Path length exceeds finite arithmetic.", "NON_FINITE_VALUE");
101
+ }
102
+ state.length = total;
103
+ return total;
104
+ }
105
+ function measuredBounds(points) {
106
+ if (points.length === 0)
107
+ return undefined;
108
+ const min = [...points[0]], max = [...points[0]];
109
+ for (let index = 1; index < points.length; index++) {
110
+ const point = points[index];
111
+ for (let axis = 0; axis < point.length; axis++) {
112
+ min[axis] = Math.min(min[axis], point[axis]);
113
+ max[axis] = Math.max(max[axis], point[axis]);
114
+ }
115
+ }
116
+ return min.length === 2
117
+ ? bounds2({ min: [min[0], min[1]], max: [max[0], max[1]] })
118
+ : bounds3({ min: [min[0], min[1], min[2]], max: [max[0], max[1], max[2]] });
119
+ }
120
+ function samplingOptions(options, closed) {
121
+ if (typeof options !== "object" || options === null || Array.isArray(options))
122
+ fail("Path resampling options must be an object.");
123
+ if ("closed" in options)
124
+ fail("Path resampling preserves its existing closure.");
125
+ return { ...options, closed };
126
+ }
127
+ const PlanarPath = /* @__PURE__ */ immutableMathClass(class PlanarPath {
128
+ closed;
129
+ dimension = 2;
130
+ constructor(points, closed) {
131
+ this.closed = closed;
132
+ pathStates.set(this, { points });
133
+ Object.freeze(this);
134
+ }
135
+ toData() {
136
+ return frozenData(this);
137
+ }
138
+ length() {
139
+ return measuredLength(this);
140
+ }
141
+ bounds() {
142
+ return measuredBounds(points2(this));
143
+ }
144
+ closestPoint(point) {
145
+ const location = closestPointOnValidatedPath(points2(this), vector2Data(point), this.closed);
146
+ return Object.freeze({ ...location, point: vector2(location.point) });
147
+ }
148
+ transform(placement) {
149
+ return new PlanarPath(transformPath2(points2(this), placement), this.closed);
150
+ }
151
+ reverse() {
152
+ return new PlanarPath([...points2(this)].reverse(), this.closed);
153
+ }
154
+ resample(options = {}) {
155
+ const policy = samplingOptions(options, this.closed);
156
+ return new PlanarPath(resamplePath2Points(points2(this), policy), this.closed);
157
+ }
158
+ });
159
+ const SpatialPath = /* @__PURE__ */ immutableMathClass(class SpatialPath {
160
+ closed;
161
+ dimension = 3;
162
+ constructor(points, closed) {
163
+ this.closed = closed;
164
+ pathStates.set(this, { points });
165
+ Object.freeze(this);
166
+ }
167
+ toData() {
168
+ return frozenData(this);
169
+ }
170
+ length() {
171
+ return measuredLength(this);
172
+ }
173
+ bounds() {
174
+ return measuredBounds(points3(this));
175
+ }
176
+ closestPoint(point) {
177
+ const location = closestPointOnValidatedPath(points3(this), vector3Data(point), this.closed);
178
+ return Object.freeze({ ...location, point: vector3(location.point) });
179
+ }
180
+ transform(placement) {
181
+ return new SpatialPath(transformPath3(points3(this), placement), this.closed);
182
+ }
183
+ reverse() {
184
+ return new SpatialPath([...points3(this)].reverse(), this.closed);
185
+ }
186
+ resample(options = {}) {
187
+ const policy = samplingOptions(options, this.closed);
188
+ return new SpatialPath(resamplePath3Points(points3(this), policy), this.closed);
189
+ }
190
+ });
191
+ /**
192
+ * Snapshots finite XY coordinates as an immutable sampled path, independent of engine initialization.
193
+ *
194
+ * Open paths may be empty or have one point; closed paths need three vertices and omit a duplicated
195
+ * seam. Repeated adjacent vertices are retained. No winding normalization or filling is performed.
196
+ * Malformed dimensions or topology throw INVALID_ARGUMENT; nonfinite coordinates or measurement
197
+ * overflow throw NON_FINITE_VALUE; exhausted allocation ceilings throw COMPLEXITY_LIMIT GeometryError.
198
+ * A path input retains its closure. Limits bound construction only; resampling takes its own limits.
199
+ *
200
+ * Use `toData()` for a frozen record that restores coordinates, closure, and dimension together.
201
+ */
202
+ export function path2(input, options = {}) {
203
+ validateOptions(options);
204
+ const limits = resolveGeometrySamplingLimits(options.limits);
205
+ const source = pathSource(input, options.closed, 2);
206
+ const points = snapshot(source.points, 2, limits);
207
+ validateClosure(points, source.closed);
208
+ return new PlanarPath(points, source.closed);
209
+ }
210
+ /**
211
+ * Snapshots finite XYZ coordinates as an immutable sampled path with the same closure, seam,
212
+ * allocation and error rules as path2. Analytic curves must be sampled explicitly first.
213
+ *
214
+ * Use `toData()` for a frozen record that restores coordinates, closure, and dimension together.
215
+ *
216
+ * @see {@link path2} for shared construction rules.
217
+ */
218
+ export function path3(input, options = {}) {
219
+ validateOptions(options);
220
+ const limits = resolveGeometrySamplingLimits(options.limits);
221
+ const source = pathSource(input, options.closed, 3);
222
+ const points = snapshot(source.points, 3, limits);
223
+ validateClosure(points, source.closed);
224
+ return new SpatialPath(points, source.closed);
225
+ }
226
+ function validateOptions(options) {
227
+ if (typeof options !== "object" || options === null || Array.isArray(options))
228
+ fail("Path options must be an object.");
229
+ }
230
+ /** Internal aggregate preflight without coordinate reads or copies. */
231
+ export function path2InputPointCount(input, closed) {
232
+ const source = pathSource(input, closed, 2);
233
+ if (!Array.isArray(source.points))
234
+ fail("Path points must be an array of coordinate tuples or vectors.");
235
+ return source.points.length;
236
+ }
237
+ /** Internal source capture for aggregate preflight followed by normalization, reading foreign data once. */
238
+ export function capturePath2Input(input, closed) {
239
+ const source = pathSource(input, closed, 2);
240
+ return {
241
+ input: input instanceof PlanarPath ? input : source.points,
242
+ count: source.points.length,
243
+ };
244
+ }
245
+ /** Internal boundary normalization; raw interchange retains the consuming operation's topology rules. */
246
+ export function path2InputData(input, closed, limits) {
247
+ const source = pathSource(input, closed, 2);
248
+ const policy = resolveGeometrySamplingLimits(limits);
249
+ assertSamplingCount(source.points.length, "path", policy.maxPathPoints);
250
+ return {
251
+ points: input instanceof PlanarPath
252
+ ? input.toData().points
253
+ : freezePoints(snapshot(source.points, 2, policy)),
254
+ closed: source.closed,
255
+ };
256
+ }
257
+ /** Internal boundary normalization; immutable path coordinates can be shared without copying. */
258
+ export function path3InputData(input, closed, limits) {
259
+ const source = pathSource(input, closed, 3);
260
+ const policy = resolveGeometrySamplingLimits(limits);
261
+ assertSamplingCount(source.points.length, "path", policy.maxPathPoints);
262
+ return {
263
+ points: input instanceof SpatialPath
264
+ ? input.toData().points
265
+ : freezePoints(snapshot(source.points, 3, policy)),
266
+ closed: source.closed,
267
+ };
268
+ }
@@ -1,6 +1,10 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { length3, normalize3, subtract3 } from "../math/vector3.js";
3
3
  import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
4
+ import { path3InputData } from "./path-value.js";
5
+ const invalidPath = (message, operation) => {
6
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation });
7
+ };
4
8
  const requireFinitePathValues = (values, operation) => {
5
9
  if (!values.every(Number.isFinite)) {
6
10
  throw new GeometryError("NON_FINITE_VALUE", "Path dimensions and coordinates must be finite.", {
@@ -22,25 +26,29 @@ const segmentLengths = (path, closed) => path.map((point, index) => {
22
26
  * open paths include both endpoints when `count` is greater than one.
23
27
  * Coordinates and total length must be finite. Input points and output placements are each
24
28
  * limited by maxPathPoints (default 100000); exact counts exceeding that ceiling reject before length calculation.
29
+ * Closure defaults to the path value's metadata, or false for tuples. An explicit conflicting closure rejects.
30
+ * Invalid arguments and degenerate paths throw GeometryError.
25
31
  */
26
- export const distributeAlongPath = (path, count, closed, limits = {}) => {
27
- if (path.length < (closed ? 3 : 2)) {
28
- throw new Error(`${closed ? "Closed" : "Open"} distribution paths need more points.`);
29
- }
32
+ export const distributeAlongPath = (input, count, closed, limits = {}) => {
30
33
  if (!Number.isInteger(count) || count < 1) {
31
- throw new Error("Path distribution count must be a positive integer.");
34
+ invalidPath("Path distribution count must be a positive integer.", "distributeAlongPath");
32
35
  }
33
36
  const maximum = resolveGeometrySamplingLimits(limits).maxPathPoints;
34
37
  assertSamplingCount(count, "distributeAlongPath", maximum);
35
- assertSamplingCount(path.length, "distributeAlongPath", maximum);
36
- for (const point of path)
37
- requireFinitePathValues(point, "distributeAlongPath");
38
- const lengths = segmentLengths(path, closed);
38
+ const { points: path, closed: closePath } = path3InputData(input, closed, limits);
39
+ if (path.length < (closePath ? 3 : 2)) {
40
+ invalidPath(`${closePath ? "Closed" : "Open"} distribution paths need more points.`, "distributeAlongPath");
41
+ }
42
+ if (closePath && path[0].every((coordinate, axis) => coordinate === path.at(-1)[axis]))
43
+ invalidPath("Closed distribution paths omit their repeated seam point.", "distributeAlongPath");
44
+ const lengths = segmentLengths(path, closePath);
39
45
  const total = lengths.reduce((sum, length) => sum + length, 0);
40
46
  requireFinitePathValues([total], "distributeAlongPath");
41
47
  if (!(total > 0))
42
- throw new Error("Cannot distribute along a zero-length path.");
43
- const denominator = closed ? count : Math.max(1, count - 1);
48
+ throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot distribute along a zero-length path.", {
49
+ operation: "distributeAlongPath",
50
+ });
51
+ const denominator = closePath ? count : Math.max(1, count - 1);
44
52
  let traversed = 0;
45
53
  let segment = 0;
46
54
  return Array.from({ length: count }, (_, itemIndex) => {
@@ -64,7 +72,7 @@ export const distributeAlongPath = (path, count, closed, limits = {}) => {
64
72
  }
65
73
  traversed += length;
66
74
  }
67
- throw new Error("Path distribution invariant failed.");
75
+ return invalidPath("Path distribution invariant failed.", "distributeAlongPath");
68
76
  });
69
77
  };
70
78
  /**
@@ -75,21 +83,26 @@ export const distributeAlongPath = (path, count, closed, limits = {}) => {
75
83
  * 45% of adjacent segment lengths to prevent neighboring corners from crossing.
76
84
  * The returned path does not duplicate its closing point.
77
85
  * Coordinates and radius must be finite; input and output are each limited by maxPathPoints (default 100000).
86
+ * Requires a closed path value; raw tuples are interpreted as closed. Invalid inputs throw GeometryError.
78
87
  */
79
- export const roundClosedPolylinePath = (points, radius, segmentsPerCorner, limits = {}) => {
80
- if (points.length < 3)
81
- throw new Error("Closed polylines need at least three points.");
88
+ export const roundClosedPolylinePath = (input, radius, segmentsPerCorner, limits = {}) => {
82
89
  const maximum = resolveGeometrySamplingLimits(limits).maxPathPoints;
83
- assertSamplingCount(points.length, "roundClosedPolylinePath", maximum);
84
90
  requireFinitePathValues([radius], "roundClosedPolylinePath");
85
91
  if (!(radius > 0))
86
- throw new Error("Corner radius must be positive.");
92
+ invalidPath("Corner radius must be positive.", "roundClosedPolylinePath");
87
93
  if (!Number.isInteger(segmentsPerCorner) || segmentsPerCorner < 1) {
88
- throw new Error("Rounded corners need at least one segment.");
94
+ invalidPath("Rounded corners need at least one segment.", "roundClosedPolylinePath");
89
95
  }
90
- assertSamplingCount(points.length * (segmentsPerCorner + 1), "roundClosedPolylinePath", maximum);
91
- for (const point of points)
92
- requireFinitePathValues(point, "roundClosedPolylinePath");
96
+ // Reject exact output budgets before snapshotting tuple input or calculating any corner.
97
+ if (Array.isArray(input))
98
+ assertSamplingCount(input.length * (segmentsPerCorner + 1), "roundClosedPolylinePath", maximum);
99
+ const { points } = path3InputData(input, true, limits);
100
+ if (!Array.isArray(input))
101
+ assertSamplingCount(points.length * (segmentsPerCorner + 1), "roundClosedPolylinePath", maximum);
102
+ if (points.length < 3)
103
+ invalidPath("Closed polylines need at least three points.", "roundClosedPolylinePath");
104
+ if (points[0].every((coordinate, axis) => coordinate === points.at(-1)[axis]))
105
+ invalidPath("Closed polylines omit their repeated seam point.", "roundClosedPolylinePath");
93
106
  return points.flatMap((point, index) => {
94
107
  const previous = points[(index - 1 + points.length) % points.length];
95
108
  const next = points[(index + 1) % points.length];
@@ -99,14 +112,14 @@ export const roundClosedPolylinePath = (points, radius, segmentsPerCorner, limit
99
112
  const outgoingLength = length3(outgoingDelta);
100
113
  requireFinitePathValues([incomingLength, outgoingLength], "roundClosedPolylinePath");
101
114
  if (!(incomingLength > 0) || !(outgoingLength > 0)) {
102
- throw new Error("Closed polylines cannot contain duplicate adjacent points.");
115
+ invalidPath("Closed polylines cannot contain duplicate adjacent points.", "roundClosedPolylinePath");
103
116
  }
104
117
  const incoming = normalize3(incomingDelta);
105
118
  const outgoing = normalize3(outgoingDelta);
106
119
  const cornerCosine = Math.max(-1, Math.min(1, -(incoming[0] * outgoing[0] + incoming[1] * outgoing[1] + incoming[2] * outgoing[2])));
107
120
  const cornerAngle = Math.acos(cornerCosine);
108
121
  if (cornerAngle < 1e-6 || Math.abs(Math.PI - cornerAngle) < 1e-6) {
109
- throw new Error("Rounded polyline corners must change direction.");
122
+ invalidPath("Rounded polyline corners must change direction.", "roundClosedPolylinePath");
110
123
  }
111
124
  const tangentDistance = Math.min(radius / Math.tan(cornerAngle / 2), incomingLength * 0.45, outgoingLength * 0.45);
112
125
  const entry = [
@@ -9,7 +9,7 @@ const distance = (a, b) => {
9
9
  curveFailure("NON_FINITE_VALUE", "Curve extent exceeds finite arithmetic.");
10
10
  return value;
11
11
  };
12
- function resamplePolyline(path, dimensions, options, createWriter) {
12
+ function resamplePolyline(path, dimensions, options, createWriter, includeTangents = true) {
13
13
  const maximum = resolveSamplingBudget(options);
14
14
  if (options.closed !== undefined && typeof options.closed !== "boolean")
15
15
  curveFailure("INVALID_ARGUMENT", "closed must be a boolean.");
@@ -91,10 +91,12 @@ function resamplePolyline(path, dimensions, options, createWriter) {
91
91
  point[2] = z(a) + (z(b) - z(a)) * t;
92
92
  }
93
93
  validateCurvePoint3(point);
94
- tangent[0] = b[0] - a[0];
95
- tangent[1] = b[1] - a[1];
96
- tangent[2] = z(b) - z(a);
97
- normalizeCurveDirection(tangent, tangent);
94
+ if (includeTangents) {
95
+ tangent[0] = b[0] - a[0];
96
+ tangent[1] = b[1] - a[1];
97
+ tangent[2] = z(b) - z(a);
98
+ normalizeCurveDirection(tangent, tangent);
99
+ }
98
100
  writer.append(point, tangent);
99
101
  }
100
102
  return writer.finish();
@@ -123,3 +125,23 @@ export function resamplePolyline3(path, options = {}) {
123
125
  export function resamplePolyline2(path, options = {}) {
124
126
  return resamplePolyline(path, 2, options, createPlanarSampleWriter);
125
127
  }
128
+ /** Internal points-only writer; Path2 owns these mutable coordinates and freezes public interchange. */
129
+ export function resamplePath2Points(path, options) {
130
+ const points = [];
131
+ return resamplePolyline(path, 2, options, () => ({
132
+ append: (point) => {
133
+ points.push([point[0], point[1]]);
134
+ },
135
+ finish: () => points,
136
+ }), false);
137
+ }
138
+ /** Internal points-only writer; avoids calculating and allocating tangents discarded by Path3. */
139
+ export function resamplePath3Points(path, options) {
140
+ const points = [];
141
+ return resamplePolyline(path, 3, options, () => ({
142
+ append: (point) => {
143
+ points.push([point[0], point[1], point[2]]);
144
+ },
145
+ finish: () => points,
146
+ }), false);
147
+ }
@@ -1,7 +1,9 @@
1
1
  import { GeometryError } from "../errors.js";
2
+ import { vector3Data } from "../math/vector-value.js";
2
3
  import { cross3, dot3, scale3 } from "../math/vector3.js";
4
+ import { path2InputData, path3InputData, } from "../paths/path-value.js";
3
5
  import { distributeAlongPath } from "../paths/planar.js";
4
- import { normalizeSweepPath } from "../sweeps/validation.js";
6
+ import { restrictTransform3 } from "../transform2.js";
5
7
  import { composeTransform3, frameTransform3, IDENTITY_TRANSFORM3, rotationTransform3, translationTransform3, } from "../transform3.js";
6
8
  const fail = (operation, message) => {
7
9
  throw new GeometryError("INVALID_ARGUMENT", message, { operation });
@@ -23,13 +25,35 @@ const finite = (value, operation) => {
23
25
  });
24
26
  return value;
25
27
  };
26
- const vector = (value, operation) => {
27
- if (!Array.isArray(value) || value.length !== 3 || !Array.from(value).every(Number.isFinite))
28
- fail(operation, "Pattern vectors require three finite coordinates.");
29
- return value;
28
+ const coordinates = (input, operation) => {
29
+ const value = typeof input === "object" &&
30
+ input !== null &&
31
+ "toData" in input &&
32
+ typeof input.toData === "function"
33
+ ? input.toData()
34
+ : input;
35
+ if (!Array.isArray(value) || (value.length !== 2 && value.length !== 3))
36
+ fail(operation, "Pattern vectors require exact XY or XYZ coordinates.");
37
+ const source = value;
38
+ const copied = source.length === 2 ? [source[0], source[1]] : [source[0], source[1], source[2]];
39
+ if (copied.some((coordinate) => typeof coordinate !== "number"))
40
+ fail(operation, "Pattern vectors require numeric coordinates.");
41
+ copied.forEach((coordinate) => finite(coordinate, operation));
42
+ return copied;
43
+ };
44
+ const vector = (input, operation) => {
45
+ const value = coordinates(input, operation);
46
+ if (value.length !== 3)
47
+ fail(operation, "Spatial pattern vectors require XYZ coordinates.");
48
+ return vector3Data(value);
30
49
  };
31
- const direction = (value, operation) => {
32
- vector(value, operation);
50
+ const lift = (value) => [value[0], value[1], value[2] ?? 0];
51
+ const requireDimension = (actual, expected, operation) => {
52
+ if (actual !== expected)
53
+ fail(operation, "Pattern coordinates must match the shape dimension.");
54
+ };
55
+ const direction = (input, operation) => {
56
+ const value = vector(input, operation);
33
57
  const maximum = Math.max(...value.map(Math.abs));
34
58
  if (maximum === 0)
35
59
  fail(operation, "Pattern direction must be nonzero.");
@@ -77,27 +101,46 @@ export function linearPatternPlan(options) {
77
101
  fail(operation, "Length must be a nonnegative whole multiple of the signed spacing.");
78
102
  count = patternCount(Math.round(intervals) + 1, operation);
79
103
  }
80
- const axis = direction(options.direction ?? [1, 0, 0], operation);
104
+ const input = options.direction === undefined ? undefined : coordinates(options.direction, operation);
105
+ const axis = direction(input === undefined ? [1, 0, 0] : lift(input), operation);
81
106
  finite(spacing * (count - 1), operation);
82
- return { count, transformAt: (index) => translationTransform3(scale3(axis, spacing * index)) };
107
+ return {
108
+ count,
109
+ transformAt: (index, dimension = 3) => {
110
+ if (input !== undefined)
111
+ requireDimension(input.length, dimension, operation);
112
+ return translationTransform3(scale3(axis, spacing * index));
113
+ },
114
+ };
83
115
  }
84
116
  export function radialPatternPlan(options) {
85
117
  const operation = "radialPattern";
86
118
  optionsObject(options, operation);
87
119
  const count = patternCount(options.count, operation);
88
- const axis = direction(options.axis, operation);
89
- const angle = finite((options.angleDegrees / 180) * Math.PI, operation);
90
- if (angle === 0)
91
- fail(operation, "Pattern angleDegrees must be nonzero.");
92
- finite(angle * (count - 1), operation);
93
- const center = vector(options.center ?? [0, 0, 0], operation);
94
- const before = translationTransform3(scale3(center, -1));
95
- const after = translationTransform3(center);
120
+ if ("center" in options)
121
+ fail(operation, "Use pivot for a radial pattern's rotation reference.");
122
+ const hasAxis = options.axis !== undefined;
123
+ const axis = direction(options.axis ?? [0, 0, 1], operation);
124
+ const angleRadians = finite((options.angle / 180) * Math.PI, operation);
125
+ if (angleRadians === 0)
126
+ fail(operation, "Pattern angle must be nonzero.");
127
+ finite(angleRadians * (count - 1), operation);
128
+ const pivot = options.pivot === undefined ? undefined : coordinates(options.pivot, operation);
129
+ const before = translationTransform3(scale3(pivot === undefined ? [0, 0, 0] : lift(pivot), -1));
130
+ const after = translationTransform3(pivot === undefined ? [0, 0, 0] : lift(pivot));
96
131
  return {
97
132
  count,
98
- transformAt: (index) => index === 0
99
- ? IDENTITY_TRANSFORM3
100
- : composeTransform3(after, composeTransform3(rotationTransform3(axis, { radians: angle * index }), before)),
133
+ transformAt: (index, dimension = 3) => {
134
+ if (dimension === 2 && hasAxis)
135
+ fail(operation, "XY radial patterns use the implicit +Z axis.");
136
+ if (dimension === 3 && !hasAxis)
137
+ fail(operation, "Spatial radial patterns require an explicit axis.");
138
+ if (pivot !== undefined)
139
+ requireDimension(pivot.length, dimension, operation);
140
+ return index === 0
141
+ ? IDENTITY_TRANSFORM3
142
+ : composeTransform3(after, composeTransform3(rotationTransform3(axis, { radians: angleRadians * index }), before));
143
+ },
101
144
  };
102
145
  }
103
146
  export function gridPatternPlan(options) {
@@ -111,6 +154,7 @@ export function gridPatternPlan(options) {
111
154
  fail(operation, "Grid count and spacing require matching XY or XYZ tuples.");
112
155
  if (options.center !== undefined && typeof options.center !== "boolean")
113
156
  fail(operation, "Grid center must be a boolean.");
157
+ const centered = options.center === true;
114
158
  const counts = [options.count[0], options.count[1], dimensions === 3 ? options.count[2] : 1];
115
159
  counts.forEach((count) => patternCount(count, operation));
116
160
  const count = patternCount(counts[0] * counts[1] * counts[2], operation);
@@ -138,13 +182,17 @@ export function gridPatternPlan(options) {
138
182
  const frame = options.frame === undefined ? IDENTITY_TRANSFORM3 : frameTransform3(options.frame);
139
183
  return {
140
184
  count,
141
- transformAt: (index) => {
185
+ transformAt: (index, dimension = 3) => {
186
+ if (dimension === 2) {
187
+ requireDimension(dimensions, dimension, operation);
188
+ restrictTransform3(frame);
189
+ }
142
190
  const coordinates = [
143
191
  index % counts[0],
144
192
  Math.floor(index / counts[0]) % counts[1],
145
193
  Math.floor(index / (counts[0] * counts[1])),
146
194
  ];
147
- const offset = coordinates.map((value, axis) => value * spacing[axis] - (options.center === true ? extent[axis] / 2 : 0));
195
+ const offset = coordinates.map((value, axis) => value * spacing[axis] - (centered ? extent[axis] / 2 : 0));
148
196
  return composeTransform3(frame, translationTransform3(offset));
149
197
  },
150
198
  };
@@ -164,18 +212,43 @@ export function pathPatternPlan(input, options, limits) {
164
212
  options.orientation !== "fixed" &&
165
213
  options.orientation !== "tangent")
166
214
  fail(operation, "Path orientation must be fixed or tangent.");
167
- const path = normalizeSweepPath(input, options.closed ?? false, operation, limits);
215
+ const tangentOrientation = options.orientation === "tangent";
216
+ if (typeof input !== "object" || input === null)
217
+ fail(operation, "Path patterns require sampled XY or XYZ coordinates.");
218
+ const first = Array.isArray(input) ? input[0] : undefined;
219
+ const suppliedDimension = Array.isArray(input)
220
+ ? Array.isArray(first)
221
+ ? first.length
222
+ : typeof first === "object" && first !== null && "z" in first
223
+ ? 3
224
+ : 2
225
+ : Reflect.get(input, "dimension");
226
+ if (suppliedDimension !== 2 && suppliedDimension !== 3)
227
+ fail(operation, "Path patterns require sampled XY or XYZ coordinates.");
228
+ const dimension = suppliedDimension === 2 ? 2 : 3;
229
+ const data = dimension === 2
230
+ ? path2InputData(input, options.closed, limits)
231
+ : path3InputData(input, options.closed, limits);
232
+ const path = dimension === 2 ? data.points.map(lift) : data.points;
233
+ // Distribution permits reversals, zero-length edges, and open paths returning to their start.
234
+ // Validate the traversal before factories without allocating the complete placement collection.
235
+ const firstPlacement = distributeAlongPath(path, 1, data.closed, limits);
168
236
  // Defer the output placement array until the operation has checked the source copy budget.
169
- let placements;
237
+ let placements = count === 1 ? firstPlacement : undefined;
170
238
  return {
171
239
  count,
172
- transformAt: (index) => {
173
- placements ??= distributeAlongPath(path, count, options.closed ?? false, limits);
240
+ transformAt: (index, shapeDimension = 3) => {
241
+ requireDimension(dimension, shapeDimension, operation);
242
+ placements ??= distributeAlongPath(path, count, data.closed, limits);
174
243
  const placement = placements[index];
175
244
  const translation = translationTransform3(placement.position);
176
- if (options.orientation !== "tangent")
245
+ if (!tangentOrientation)
177
246
  return translation;
178
247
  const tangent = placement.tangent;
248
+ if (dimension === 2)
249
+ return composeTransform3(translation, rotationTransform3([0, 0, 1], {
250
+ radians: Math.atan2(tangent[1], tangent[0]),
251
+ }));
179
252
  const cosine = Math.max(-1, Math.min(1, dot3([0, 0, 1], tangent)));
180
253
  const axis = cross3([0, 0, 1], tangent);
181
254
  const sine = Math.hypot(...axis);
@@ -3,7 +3,7 @@ import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
3
3
  function transforms(plan) {
4
4
  return Object.freeze(Array.from({ length: plan.count }, (_, index) => Object.freeze(plan.transformAt(index))));
5
5
  }
6
- /** Equal linear placements in millimetres, including the original at the origin. */
6
+ /** Spatial XYZ matrix placements in millimetres, including the original at the origin. */
7
7
  export function linearPatternTransforms(options) {
8
8
  return transforms(linearPatternPlan(options));
9
9
  }
@@ -11,12 +11,14 @@ export function linearPatternTransforms(options) {
11
11
  export function radialPatternTransforms(options) {
12
12
  return transforms(radialPatternPlan(options));
13
13
  }
14
- /** XY or XYZ grid placements in millimetres, in X-fastest order. */
14
+ /** Spatial XYZ matrices for an XY or XYZ grid, in X-fastest order. */
15
15
  export function gridPatternTransforms(options) {
16
16
  return transforms(gridPatternPlan(options));
17
17
  }
18
18
  /**
19
- * Equal physical arc-length placements along a sampled XYZ path. Tangent orientation maps +Z
19
+ * Equal physical arc-length placements along a sampled XYZ path.
20
+ *
21
+ * Tangent orientation maps +Z
20
22
  * onto the local path tangent; fixed orientation only translates. Closed paths omit a repeated seam.
21
23
  * Explicit sampling ceilings bound both input points and output placements.
22
24
  */