@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
@@ -3,6 +3,13 @@ import { isImmutableMathValue } from "../geometry/math/immutable-value.js";
3
3
  import { geometryRecipe, isGeometryRecipe } from "./geometry-recipes.js";
4
4
  import { adoptImmutableBuffer, immutableBuffer, immutableBufferView, isImmutableBuffer, } from "./immutable-buffer.js";
5
5
  const mutableBufferMessage = "Generation data cannot contain mutable typed arrays or raw ArrayBuffers. Use immutableBuffer(array) or immutableMesh(mesh) before caching them or declaring dependencies.";
6
+ const capturedMetadata = new WeakMap();
7
+ const noChildren = Object.freeze([]);
8
+ /** Reuses field accounting only for containers captured or deeply validated by this owner. */
9
+ export function generationDataMetadata(value) {
10
+ return capturedMetadata.get(value);
11
+ }
12
+ const scalarBytes = (value) => (typeof value === "string" ? value.length * 2 : 8);
6
13
  /** Iterates plain fields; recipe capture may read each enumerable accessor once. */
7
14
  export function* generationDataEntries(value, captureAccessors = false) {
8
15
  const prototype = Object.getPrototypeOf(value);
@@ -45,9 +52,31 @@ export function generationValueBytes(values, ceiling) {
45
52
  if (seen.has(value))
46
53
  return;
47
54
  seen.add(value);
55
+ const metadata = capturedMetadata.get(value);
56
+ if (metadata !== undefined) {
57
+ if (depth === 128 && metadata.bytes > 0) {
58
+ bytes = Infinity;
59
+ return;
60
+ }
61
+ bytes += 32 + metadata.bytes;
62
+ for (const child of metadata.children)
63
+ visit(child, depth + 1);
64
+ return;
65
+ }
48
66
  if (isImmutableMathValue(value)) {
49
67
  bytes += 32;
50
- visit(mathValueData(value), depth + 1);
68
+ const data = mathValueData(value);
69
+ visit(data, depth + 1);
70
+ if (typeof data === "object" &&
71
+ data !== null &&
72
+ "dimension" in data &&
73
+ (data.dimension === 2 || data.dimension === 3) &&
74
+ "points" in data &&
75
+ Array.isArray(data.points)) {
76
+ // A path retains private numerical tuples as well as its frozen interchange view.
77
+ // Charge both stores conservatively; the outer seen set still counts value aliases once.
78
+ bytes += 64 + data.points.length * (40 + 8 * data.dimension);
79
+ }
51
80
  return;
52
81
  }
53
82
  const array = isImmutableBuffer(value)
@@ -156,16 +185,15 @@ export function compareGenerationValues(left, right) {
156
185
  return compare(left, right);
157
186
  }
158
187
  function mathValueData(value) {
159
- for (const name of ["toArray", "toMatrix"]) {
160
- const method = Reflect.get(value, name);
161
- if (typeof method === "function")
162
- return Reflect.apply(method, value, []);
163
- }
164
- throw new TypeError("Immutable math values must expose their canonical numeric data.");
188
+ const method = Reflect.get(value, "toData");
189
+ if (typeof method !== "function")
190
+ throw new TypeError("Immutable math values must expose canonical data through toData().");
191
+ return Reflect.apply(method, value, []);
165
192
  }
166
193
  function captureValue(value, mode, readerAllowed = () => false, validated) {
167
194
  const recipeInputs = mode === "recipe";
168
195
  const seen = new Map();
196
+ const metadata = new Map();
169
197
  const copy = (input) => {
170
198
  if (typeof input === "function" && !recipeInputs && !readerAllowed(input))
171
199
  throw new GeometryError("INVALID_ARGUMENT", "Computed values and dependencies cannot contain arbitrary function closures.", { operation: "computed" });
@@ -191,20 +219,42 @@ function captureValue(value, mode, readerAllowed = () => false, validated) {
191
219
  if (input instanceof ArrayBuffer)
192
220
  throw new TypeError(mutableBufferMessage);
193
221
  const entries = generationDataEntries(input, recipeInputs);
222
+ let bytes = 0;
223
+ const children = [];
224
+ const recordField = (key, field) => {
225
+ bytes += 16 + key.length * 2;
226
+ if (typeof field === "object" && field !== null)
227
+ children.push(field);
228
+ else
229
+ bytes += scalarBytes(field);
230
+ };
194
231
  if (mode === "dependency") {
195
232
  if (!Object.isFrozen(input))
196
233
  throw new GeometryError("INVALID_ARGUMENT", "Computed dependencies require deeply immutable objects and arrays. Read params inside the callback, use a computed value, or depend on individual scalar values.", { operation: "computed" });
197
234
  seen.set(input, input);
198
- for (const [, field] of entries)
235
+ for (const [key, field] of entries) {
199
236
  copy(field);
237
+ recordField(key, field);
238
+ }
239
+ metadata.set(input, {
240
+ bytes,
241
+ children: children.length ? Object.freeze(children) : noChildren,
242
+ });
200
243
  return input;
201
244
  }
202
245
  const result = Array.isArray(input)
203
246
  ? new Array(input.length)
204
247
  : Object.create(Object.getPrototypeOf(input) === null ? null : Object.prototype);
205
248
  seen.set(input, result);
206
- for (const [key, field] of entries)
207
- Object.defineProperty(result, key, { value: copy(field), enumerable: true });
249
+ for (const [key, field] of entries) {
250
+ const value = copy(field);
251
+ Object.defineProperty(result, key, { value, enumerable: true });
252
+ recordField(key, value);
253
+ }
254
+ metadata.set(result, {
255
+ bytes,
256
+ children: children.length ? Object.freeze(children) : noChildren,
257
+ });
208
258
  return Object.freeze(result);
209
259
  };
210
260
  const result = copy(value);
@@ -212,6 +262,8 @@ function captureValue(value, mode, readerAllowed = () => false, validated) {
212
262
  if (mode === "dependency")
213
263
  for (const input of seen.keys())
214
264
  validated?.add(input);
265
+ for (const [value, entry] of metadata)
266
+ capturedMetadata.set(value, entry);
215
267
  return result;
216
268
  }
217
269
  /** Validates while capturing immutable data; only explicitly allowed session readers may be functions. */
@@ -0,0 +1 @@
1
+ export {};
@@ -139,10 +139,6 @@ export function minkowskiSum(a, b) {
139
139
  export function solidFromMesh(mesh) {
140
140
  return invoke("solidFromMesh", [mesh]);
141
141
  }
142
- /** Copies a handle to manufacturing mesh buffers. */
143
- export function toTriangleMesh(solid) {
144
- return invoke("toTriangleMesh", [solid]);
145
- }
146
142
  /**
147
143
  * Reads a copied, immutable named anchor from this exact active generation.
148
144
  *
@@ -157,6 +153,7 @@ export function anchor(shape, name) {
157
153
  }
158
154
  /**
159
155
  * Fills one closed millimetre XY outline, explicit outer/hole topology, or compound contours.
156
+ *
160
157
  * Closing edges are implicit. Compound contours use nonzero fill unless selected otherwise.
161
158
  * Explicit topology must be simple and disjoint; compound winding may resolve overlaps.
162
159
  *
@@ -171,7 +168,7 @@ export function polygon(input) {
171
168
  /**
172
169
  * Creates a centered-width native Section along a sampled XY path.
173
170
  *
174
- * Shares caps, joins and physical sampling with Geometry's strokePathRegion. Native union
171
+ * Shares caps, joins and physical sampling with Geometry's strokeRegionData. Native union
175
172
  * resolves overlapping stroke primitives. Session resolution and resource ceilings apply;
176
173
  * closed paths omit the duplicated seam. Returns an immutable deferred recipe.
177
174
  *
@@ -186,6 +183,9 @@ export function stroke(path, options) {
186
183
  /**
187
184
  * Filled rectangular section with uniform or independently treated corners.
188
185
  *
186
+ * Use [rectangleContour](/docs/reference/geometry/rectangleContour) for sampled boundary coordinates,
187
+ * or [rectangleProfile](/docs/reference/geometry/rectangleProfile) to retain identified loft landmarks.
188
+ *
189
189
  * @example Round the corners
190
190
  * ```ts
191
191
  * rectangle({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
@@ -266,7 +266,7 @@ export function extrude(shape, options) {
266
266
  *
267
267
  * // Contour coordinates are [radius, Z].
268
268
  * const [profile] = matchProfiles([rectangleProfile({ size: [4, 16], center: false })]);
269
- * revolve(profile!, { revolveDegrees: 270 });
269
+ * revolve(profile!, { degrees: 270 });
270
270
  * ```
271
271
  */
272
272
  export function revolve(shape, options) {
@@ -276,7 +276,10 @@ export function revolve(shape, options) {
276
276
  export function loft(stations, options) {
277
277
  return invoke("loft", [stations, options]);
278
278
  }
279
- /** Explicit family matching on a shared physical span grid using session or operation resolution. */
279
+ /**
280
+ * Matches a profile family using operation settings over host resolution and limits.
281
+ * Requires active synchronous model execution. Use Geometry's matchProfiles for standalone preparation.
282
+ */
280
283
  export function matchProfiles(profiles, options) {
281
284
  return invoke("matchProfiles", [profiles, options]);
282
285
  }
@@ -359,8 +362,8 @@ export function distance(solid, other) {
359
362
  return invoke("distance", [solid, other]);
360
363
  }
361
364
  /** Copies intersections along the finite directed origin-to-endpoint segment. */
362
- export function rayCast(solid, origin, endpoint) {
363
- return invoke("rayCast", [solid, origin, endpoint]);
365
+ export function castSegment(solid, origin, endpoint) {
366
+ return invoke("castSegment", [solid, origin, endpoint]);
364
367
  }
365
368
  export function components(shape) {
366
369
  return invoke("components", [shape]);
@@ -374,6 +377,7 @@ export function implicit(options) {
374
377
  }
375
378
  /**
376
379
  * Closed rectilinear top above a flat base, with uniform or explicit XY coordinates.
380
+ *
377
381
  * Samples each grid height once; center-error triangulation also samples each cell centre.
378
382
  * The retained callback must capture independent immutable inputs, not live session readers or parameters.
379
383
  *
@@ -388,31 +392,56 @@ export function implicit(options) {
388
392
  export function heightfield(options) {
389
393
  return invoke("heightfield", [options]);
390
394
  }
391
- export function linearPattern(source, options) {
392
- return invoke("linearPattern", [source, options]);
395
+ export function linearPattern(...args) {
396
+ return invoke("linearPattern", args);
393
397
  }
394
- export function radialPattern(source, options) {
395
- return invoke("radialPattern", [source, options]);
398
+ export function radialPattern(...args) {
399
+ return invoke("radialPattern", args);
396
400
  }
397
- export function gridPattern(source, options) {
398
- return invoke("gridPattern", [source, options]);
401
+ export function gridPattern(...args) {
402
+ return invoke("gridPattern", args);
399
403
  }
400
- export function pathPattern(source, path, options) {
401
- return invoke("pathPattern", [source, path, options]);
404
+ export function pathPattern(...args) {
405
+ return invoke("pathPattern", args);
402
406
  }
403
407
  /** Helical ridge mesh construction. */
404
408
  export function threadRidge(options) {
405
409
  return invoke("threadRidge", [options]);
406
410
  }
411
+ /**
412
+ * Declares separate knuckle-joint halves along the centered +X pin axis, in millimetres.
413
+ *
414
+ * A starts at negative X. Attach independent webs or use barrels only; caller geometry connects
415
+ * otherwise disconnected intervals. Returns portable recipes without initializing the engine.
416
+ * Unspecified resolution inherits the evaluating session. Axis direction is +X with +Z up.
417
+ *
418
+ * Barrel end chamfers affect outer rims only; webs have square edges. Consumers own plates, screw holes,
419
+ * pin retention, fit policy, and part placement. Added mounting material must preserve the bores.
420
+ * No opening range or collision freedom is implied for arbitrary caller attachments.
421
+ * Compiled Generator packages using this operation require runtime 8.0.0 or newer in major 8.
422
+ *
423
+ * @example Integral-pin hinge with two mounting webs
424
+ * ```ts
425
+ * const joint = knuckleHinge({
426
+ * mode: "print-in-place", length: 30, knuckleCount: 3,
427
+ * barrelDiameter: 10, pinDiameter: 3, radialClearance: 0.3, axialGap: 0.4,
428
+ * halfA: { web: { direction: "positive-y", reach: 8, zMin: -5, thickness: 2 } },
429
+ * halfB: { web: { direction: "negative-y", reach: 8, zMin: -5, thickness: 2 } },
430
+ * });
431
+ * ```
432
+ */
433
+ export function knuckleHinge(options) {
434
+ return invoke("knuckleHinge", [options]);
435
+ }
407
436
  /**
408
437
  * Compensated external threaded rod.
409
438
  *
410
439
  * @example Threaded rod
411
440
  * ```ts
412
441
  * import { threadedRod } from "@metamesh/modeling";
413
- * import { createThreadProfile } from "@metamesh/modeling/geometry";
442
+ * import { threadProfile } from "@metamesh/modeling/geometry";
414
443
  *
415
- * const profile = createThreadProfile({ kind: "triangular", pitch: 1.75 });
444
+ * const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
416
445
  * threadedRod({ nominalMajorDiameter: 12, length: 24, profile, fit: "normal" });
417
446
  * ```
418
447
  */
@@ -425,8 +454,8 @@ export function threadedRod(options) {
425
454
  * @example Internal thread
426
455
  * ```ts
427
456
  * import { cylinder, internalThreadCutter } from "@metamesh/modeling";
428
- * import { createThreadProfile } from "@metamesh/modeling/geometry";
429
- * const profile = createThreadProfile({ kind: "triangular", pitch: 1.75 });
457
+ * import { threadProfile } from "@metamesh/modeling/geometry";
458
+ * const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
430
459
  * const body = cylinder({ diameter: 20, height: 12, center: false });
431
460
  * const cutter = internalThreadCutter({ nominalMajorDiameter: 12, length: 12, profile });
432
461
  * body.subtract([cutter]);
@@ -441,24 +470,48 @@ export function internalThreadCutter(options) {
441
470
  * @example Threaded nut
442
471
  * ```ts
443
472
  * import { threadedNut } from "@metamesh/modeling";
444
- * import { createThreadProfile } from "@metamesh/modeling/geometry";
473
+ * import { threadProfile } from "@metamesh/modeling/geometry";
445
474
  *
446
- * const profile = createThreadProfile({ kind: "triangular", pitch: 1.75 });
475
+ * const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
447
476
  * threadedNut({ nominalMajorDiameter: 12, thickness: 8, width: 20, shape: "hex", profile, fit: "normal" });
448
477
  * ```
449
478
  */
450
479
  export function threadedNut(options) {
451
480
  return invoke("threadedNut", [options]);
452
481
  }
453
- /** Allocation-free external-thread facts. */
482
+ /**
483
+ * Checks compensated rod dimensions and conservative mesh estimates against host output limits.
484
+ *
485
+ * Requires active synchronous model execution and uses its resolution and limits. Returns selected
486
+ * sampling and conservative row/triangle estimates without mesh buffers or native objects.
487
+ * Mesh validity, native construction, and aggregate output limits are checked later.
488
+ *
489
+ * @see {@link threadedRod}
490
+ */
454
491
  export function preflightThreadedRod(options) {
455
492
  return invoke("preflightThreadedRod", [options]);
456
493
  }
457
- /** Allocation-free internal-thread facts. */
494
+ /**
495
+ * Checks compensated cutter dimensions and conservative mesh estimates against host output limits.
496
+ *
497
+ * Requires active synchronous model execution and uses its resolution and limits. Estimates include
498
+ * the one-pitch extension beyond each requested face, without mesh buffers or native objects.
499
+ * Mesh validity, native construction, and aggregate output limits are checked later.
500
+ *
501
+ * @see {@link internalThreadCutter}
502
+ */
458
503
  export function preflightInternalThreadCutter(options) {
459
504
  return invoke("preflightInternalThreadCutter", [options]);
460
505
  }
461
- /** Allocation-free nut/cutter facts. */
506
+ /**
507
+ * Checks nut dimensions, chamfers, end-face wall, and the extended compensated cutter's allocation plan.
508
+ *
509
+ * Requires active synchronous model execution and uses its resolution and limits, without mesh
510
+ * buffers or native objects. Returned thread estimates cover the cutter, excluding the body and
511
+ * Boolean result. Mesh validity, native construction, and aggregate output limits are checked later.
512
+ *
513
+ * @see {@link threadedNut}
514
+ */
462
515
  export function preflightThreadedNut(options) {
463
516
  return invoke("preflightThreadedNut", [options]);
464
517
  }
@@ -1,4 +1,5 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
+ import { knuckleHingeAxis } from "../geometry/mechanical/knuckle-hinge.js";
2
3
  import { defaultModelingLimits } from "../geometry/model-limits.js";
3
4
  import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../geometry/patterns/placements.js";
4
5
  import { restrictTransform3 } from "../geometry/transform2.js";
@@ -21,11 +22,12 @@ const operationBehaviors = {
21
22
  compose: "solid",
22
23
  minkowskiSum: "solid",
23
24
  solidFromMesh: "solid",
24
- setTolerance: "solid",
25
+ withTolerance: "solid",
25
26
  threadRidge: "solid",
26
27
  threadedRod: "solid",
27
28
  threadedNut: "solid",
28
29
  internalThreadCutter: "solid",
30
+ knuckleHinge: "joint",
29
31
  polygon: "section",
30
32
  stroke: "section",
31
33
  rectangle: "section",
@@ -57,7 +59,7 @@ const operationBehaviors = {
57
59
  inspectSolid: "observation",
58
60
  isEmpty: "observation",
59
61
  distance: "observation",
60
- rayCast: "observation",
62
+ castSegment: "observation",
61
63
  anchor: "observation",
62
64
  matchProfiles: "observation",
63
65
  preflightThreadedRod: "observation",
@@ -101,6 +103,12 @@ export function declareRecipeOperation(operation, resolution, supplied, declarat
101
103
  kind: resultKind(behavior, args[0]),
102
104
  call,
103
105
  };
106
+ if (behavior === "joint")
107
+ return Object.freeze({
108
+ halfA: recordGeometryRecipe({ ...recipe, index: "halfA" }, declaration.dispatch),
109
+ halfB: recordGeometryRecipe({ ...recipe, index: "halfB" }, declaration.dispatch),
110
+ axis: knuckleHingeAxis,
111
+ });
104
112
  if (behavior === "split")
105
113
  return Object.freeze([
106
114
  recordGeometryRecipe({ ...recipe, index: 0 }, declaration.dispatch),
@@ -144,13 +152,19 @@ function inputKind(value) {
144
152
  return recipe.kind;
145
153
  if ("sections" in value)
146
154
  return "section";
147
- if ("points" in value &&
148
- Array.isArray(value.points) &&
149
- Array.isArray(value.points[0]) &&
150
- value.points[0].length === 2)
155
+ if ("points" in value && Array.isArray(value.points) && pointDimension(value.points[0]) === 2)
151
156
  return "section";
152
157
  return "solid";
153
158
  }
159
+ function pointDimension(value) {
160
+ if (Array.isArray(value))
161
+ return value.length;
162
+ if (typeof value !== "object" || value === null || !("toData" in value))
163
+ return undefined;
164
+ const method = value.toData;
165
+ const points = typeof method === "function" ? Reflect.apply(method, value, []) : undefined;
166
+ return Array.isArray(points) ? points.length : undefined;
167
+ }
154
168
  /** Runs every factory during declaration; each placed copy stays deferred until it is used. */
155
169
  function declarePattern(operation, resolution, supplied, declaration) {
156
170
  const plan = patternPlan(operation, supplied, declaration.limits);
@@ -171,7 +185,7 @@ function declarePattern(operation, resolution, supplied, declaration) {
171
185
  operation,
172
186
  });
173
187
  kind = currentKind;
174
- const matrix = plan.transformAt(index);
188
+ const matrix = plan.transformAt(index, kind === "section" ? 2 : 3);
175
189
  copies.push(declareRecipeOperation("transform", resolution, [shape, kind === "section" ? restrictTransform3(matrix) : matrix], declaration));
176
190
  }
177
191
  return Object.freeze(copies);
@@ -26,8 +26,9 @@ const common = {
26
26
  };
27
27
  const solidPrototype = prototype({
28
28
  ...common,
29
+ toTriangleMesh: forward("toTriangleMesh"),
29
30
  attach: forward("attach"),
30
- setTolerance: forward("setTolerance"),
31
+ withTolerance: forward("withTolerance"),
31
32
  projectSection: forward("projectSection"),
32
33
  sliceSection: forward("sliceSection"),
33
34
  });
@@ -1,14 +1,15 @@
1
1
  import { SVGPathData, SVGPathDataTransformer } from "svg-pathdata";
2
+ import { GeometryError } from "../geometry/errors.js";
2
3
  import { createVectorTextLayout } from "./vector-text-layout.js";
3
4
  /** Limits apply before parsing or shaping untrusted font data. */
4
5
  export const MAX_VECTOR_FONT_BYTES = 16 * 1024 * 1024;
5
- function fail(message) {
6
- throw new Error(message);
6
+ function fail(message, code = "INVALID_ARGUMENT") {
7
+ throw new GeometryError(code, message, { operation: "prepareVectorFont" });
7
8
  }
8
9
  function serializeVectorText({ paths, metrics }) {
9
10
  const bounds = metrics.bounds;
10
11
  if (bounds === null || paths.length === 0)
11
- fail("The selected font produced no visible glyph outlines.");
12
+ throw new GeometryError("DEGENERATE_GEOMETRY", "The selected font produced no visible glyph outlines.", { operation: "VectorFont.toSvg" });
12
13
  const d = paths
13
14
  .map((path) => new SVGPathData(path).transform(SVGPathDataTransformer.MATRIX(1, 0, 0, -1, 0, 0)).encode())
14
15
  .join(" ");
@@ -16,11 +17,12 @@ function serializeVectorText({ paths, metrics }) {
16
17
  const height = Math.max(0.001, bounds.max[1] - bounds.min[1]);
17
18
  const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}mm" height="${height}mm" viewBox="${bounds.min[0]} ${-bounds.max[1]} ${width} ${height}"><path fill="black" fill-rule="nonzero" d="${d}"/></svg>`;
18
19
  if (svg.length > 256 * 1024)
19
- fail("Text outlines exceed 256 KiB. Use fewer characters or a simpler font.");
20
+ throw new GeometryError("COMPLEXITY_LIMIT", "Text outlines exceed 256 KiB. Use fewer characters or a simpler font.", { operation: "VectorFont.toSvg" });
20
21
  return svg;
21
22
  }
22
23
  /**
23
24
  * Parses bounded font bytes using optional fontkit and WOFF2 peers; no font fetching occurs here.
25
+ * Argument and resource failures use GeometryError; parser and decoder exceptions propagate unchanged.
24
26
  *
25
27
  * @example Prepare a label before building geometry
26
28
  * ```ts
@@ -31,20 +33,24 @@ function serializeVectorText({ paths, metrics }) {
31
33
  * ```
32
34
  */
33
35
  export async function prepareVectorFont(bytes, options = {}) {
34
- if (bytes.byteLength === 0 || bytes.byteLength > MAX_VECTOR_FONT_BYTES)
36
+ if (bytes.byteLength === 0)
35
37
  fail("Font files must be non-empty and at most 16 MiB.");
38
+ if (bytes.byteLength > MAX_VECTOR_FONT_BYTES)
39
+ fail("Font files must be non-empty and at most 16 MiB.", "COMPLEXITY_LIMIT");
36
40
  const staticWeight = options.staticWeight ?? 400;
37
41
  if (!Number.isInteger(staticWeight) || staticWeight < 1 || staticWeight > 1000)
38
- fail("staticWeight must be an integer from 1 through 1000.");
42
+ fail("staticWeight must be an integer from 1 through 1000.", Number.isFinite(staticWeight) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
39
43
  // Own the original bytes: a caller mutating its buffer must not change later lazy font reads.
40
44
  let decoded = Uint8Array.from(bytes);
41
45
  if (bytes[0] === 0x77 && bytes[1] === 0x4f && bytes[2] === 0x46 && bytes[3] === 0x32) {
42
- const { default: decompress } = await import("woff2-encoder/decompress").catch(() => fail("Install woff2-encoder to prepare WOFF2 fonts with @metamesh/modeling/text."));
46
+ const { default: decompress } = await import("woff2-encoder/decompress");
43
47
  decoded = await decompress(decoded);
44
- if (decoded.byteLength === 0 || decoded.byteLength > 32 * 1024 * 1024)
48
+ if (decoded.byteLength === 0)
45
49
  fail("The decoded font must be non-empty and at most 32 MiB.");
50
+ if (decoded.byteLength > 32 * 1024 * 1024)
51
+ fail("The decoded font must be non-empty and at most 32 MiB.", "COMPLEXITY_LIMIT");
46
52
  }
47
- const fontkit = await import("fontkit").catch(() => fail("Install fontkit to prepare fonts with @metamesh/modeling/text."));
53
+ const fontkit = await import("fontkit");
48
54
  const font = fontkit.create(decoded);
49
55
  if (!("layout" in font))
50
56
  fail("Font collections are not supported.");
@@ -1,19 +1,20 @@
1
1
  import { SVGPathData, SVGPathDataTransformer } from "svg-pathdata";
2
+ import { GeometryError } from "../geometry/errors.js";
2
3
  const MAX_TEXT_LENGTH = 512;
3
4
  const MAX_TEXT_LINES = 16;
4
5
  const MAX_TEXT_GLYPHS = 2048;
5
6
  const MAX_TEXT_COMMANDS = 32000;
6
7
  const MAX_TEXT_PATH_BYTES = 1024 * 1024;
7
8
  const supportedText = /^[\p{Script=Latin}\p{Script=Greek}\p{Script=Cyrillic}\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Common}\p{Script=Inherited}]*$/u;
8
- function fail(message) {
9
- throw new Error(message);
9
+ function fail(message, code = "INVALID_ARGUMENT") {
10
+ throw new GeometryError(code, message, { operation: "VectorFont.layout" });
10
11
  }
11
12
  function checkText(text) {
12
13
  if (text.length > MAX_TEXT_LENGTH)
13
- fail("Text must contain at most 512 characters and 16 lines.");
14
+ fail("Text must contain at most 512 characters and 16 lines.", "COMPLEXITY_LIMIT");
14
15
  const lines = text.replaceAll("\r\n", "\n").replaceAll("\r", "\n").split("\n");
15
16
  if (lines.length > MAX_TEXT_LINES)
16
- fail("Text must contain at most 512 characters and 16 lines.");
17
+ fail("Text must contain at most 512 characters and 16 lines.", "COMPLEXITY_LIMIT");
17
18
  if (!supportedText.test(text) ||
18
19
  /\p{Emoji_Presentation}|\p{Variation_Selector}|[\u200c-\u200f\u202a-\u202e\u2066-\u2069]/u.test(text))
19
20
  fail("This writing system or text direction is not supported yet. Use Latin, Greek, Cyrillic, or horizontal CJK text.");
@@ -27,9 +28,9 @@ function normalizeControls(options, staticWeight) {
27
28
  if (typeof baseline !== "object" || baseline === null || baseline.kind !== "arc")
28
29
  fail("Invalid text baseline; use an arc or omit baseline for horizontal text.");
29
30
  if (!Number.isFinite(baseline.radius) || baseline.radius <= 0 || baseline.radius > 10000)
30
- fail("Arc baseline radius must be positive and at most 10000 mm.");
31
- if (baseline.centerAngleDegrees !== undefined && !Number.isFinite(baseline.centerAngleDegrees))
32
- fail("Arc baseline centerAngleDegrees must be finite.");
31
+ fail("Arc baseline radius must be positive and at most 10000 mm.", Number.isFinite(baseline.radius) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
32
+ if (baseline.centerAngle !== undefined && !Number.isFinite(baseline.centerAngle))
33
+ fail("Arc baseline centerAngle must be finite.", "NON_FINITE_VALUE");
33
34
  if (baseline.direction !== undefined &&
34
35
  baseline.direction !== "clockwise" &&
35
36
  baseline.direction !== "counterclockwise")
@@ -46,18 +47,18 @@ function normalizeControls(options, staticWeight) {
46
47
  ? undefined
47
48
  : {
48
49
  radius: baseline.radius,
49
- centerAngleDegrees: (((baseline.centerAngleDegrees ?? 90) % 360) + 360) % 360,
50
+ centerAngle: (((baseline.centerAngle ?? 90) % 360) + 360) % 360,
50
51
  direction: baseline.direction ?? "clockwise",
51
52
  },
52
53
  };
53
54
  if (!Number.isFinite(controls.fontSize) || controls.fontSize <= 0 || controls.fontSize > 10000)
54
- fail("fontSize must be positive and at most 10000 mm.");
55
+ fail("fontSize must be positive and at most 10000 mm.", Number.isFinite(controls.fontSize) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
55
56
  if (!Number.isInteger(controls.fontWeight) ||
56
57
  controls.fontWeight < 1 ||
57
58
  controls.fontWeight > 1000)
58
- fail("fontWeight must be an integer from 1 through 1000.");
59
+ fail("fontWeight must be an integer from 1 through 1000.", Number.isFinite(controls.fontWeight) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
59
60
  if (!Number.isFinite(controls.letterSpacing) || Math.abs(controls.letterSpacing) > 100)
60
- fail("letterSpacing must be finite and between -100 and 100 mm.");
61
+ fail("letterSpacing must be finite and between -100 and 100 mm.", Number.isFinite(controls.letterSpacing) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
61
62
  if (controls.align !== "left" && controls.align !== "center" && controls.align !== "right")
62
63
  fail("Invalid text alignment.");
63
64
  if (controls.verticalAlign !== "baseline" &&
@@ -69,7 +70,7 @@ function normalizeControls(options, staticWeight) {
69
70
  fail("Arc text requires baseline vertical alignment.");
70
71
  if (controls.lineHeight !== undefined &&
71
72
  (!Number.isFinite(controls.lineHeight) || controls.lineHeight < 0.5 || controls.lineHeight > 5))
72
- fail("lineHeight must be between 0.5 and 5.");
73
+ fail("lineHeight must be between 0.5 and 5.", Number.isFinite(controls.lineHeight) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
73
74
  return controls;
74
75
  }
75
76
  function selectFont(font, weight, staticWeight) {
@@ -130,8 +131,10 @@ function shapeLines(font, lines, controls) {
130
131
  // CSS tracking disables optional ligatures, retaining required shaping and combining marks.
131
132
  const run = font.layout(line, controls.letterSpacing === 0 ? undefined : { liga: false, clig: false });
132
133
  glyphs += run.glyphs.length;
133
- if (run.glyphs.length !== run.positions.length || glyphs > MAX_TEXT_GLYPHS)
134
- fail("The font returned an invalid or excessive glyph run.");
134
+ if (run.glyphs.length !== run.positions.length)
135
+ fail("The font returned an invalid glyph run.");
136
+ if (glyphs > MAX_TEXT_GLYPHS)
137
+ fail("The font returned an excessive glyph run.", "COMPLEXITY_LIMIT");
135
138
  let advance = 0;
136
139
  let spacingSteps = -1;
137
140
  for (let index = 0; index < run.glyphs.length; index++) {
@@ -139,14 +142,14 @@ function shapeLines(font, lines, controls) {
139
142
  fail("The selected font shaped a missing glyph.");
140
143
  const position = run.positions[index];
141
144
  if (![position.xAdvance, position.yAdvance, position.xOffset, position.yOffset].every(Number.isFinite))
142
- fail("The font returned a non-finite glyph position.");
145
+ fail("The font returned a non-finite glyph position.", "NON_FINITE_VALUE");
143
146
  if (index === 0 || position.xAdvance !== 0)
144
147
  spacingSteps++;
145
148
  advance += position.xAdvance;
146
149
  }
147
150
  const advanceWidth = advance * scale + Math.max(0, spacingSteps) * controls.letterSpacing;
148
151
  if (!Number.isFinite(advanceWidth) || advanceWidth < 0)
149
- fail("The shaped text advance must be finite and non-negative after letter spacing.");
152
+ fail("The shaped text advance must be finite and non-negative after letter spacing.", Number.isFinite(advanceWidth) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
150
153
  return { run, advanceWidth };
151
154
  });
152
155
  }
@@ -158,8 +161,10 @@ function convertCommand({ command, args }) {
158
161
  : command === "bezierCurveTo"
159
162
  ? 6
160
163
  : 2;
161
- if (args.length !== argumentCount || !args.every(Number.isFinite))
164
+ if (args.length !== argumentCount)
162
165
  fail("The font returned invalid glyph path coordinates.");
166
+ if (!args.every(Number.isFinite))
167
+ fail("The font returned invalid glyph path coordinates.", "NON_FINITE_VALUE");
163
168
  switch (command) {
164
169
  case "moveTo":
165
170
  return { type: SVGPathData.MOVE_TO, relative: false, x: args[0], y: args[1] };
@@ -234,23 +239,23 @@ function buildLayout(font, fontMetrics, lines, controls) {
234
239
  const source = run.glyphs[index].path.commands;
235
240
  commands += source.length;
236
241
  if (commands > MAX_TEXT_COMMANDS)
237
- fail("Text outlines exceed the supported complexity. Use fewer characters or a simpler font.");
242
+ fail("Text outlines exceed the supported complexity. Use fewer characters or a simpler font.", "COMPLEXITY_LIMIT");
238
243
  if (source.length > 0) {
239
244
  // Preserve full precision: fontkit's toSVG() rounds before scaling and reparsing it wastes work.
240
245
  const path = new SVGPathData(source.map(convertCommand)).transform(SVGPathDataTransformer.MATRIX(scale, 0, 0, scale, (x + position.xOffset) * scale + spacingSteps * controls.letterSpacing + lineX, (y + position.yOffset) * scale - lineIndex * lineHeight));
241
246
  let bounds = path.getBounds();
242
247
  if (![bounds.minX, bounds.minY, bounds.maxX, bounds.maxY].every(Number.isFinite))
243
- fail("The font returned invalid glyph outline bounds.");
248
+ fail("The font returned invalid glyph outline bounds.", "NON_FINITE_VALUE");
244
249
  if (controls.baseline !== undefined) {
245
- const { radius, centerAngleDegrees, direction } = controls.baseline;
250
+ const { radius, centerAngle, direction } = controls.baseline;
246
251
  const clockwise = direction === "clockwise";
247
252
  if (clockwise ? radius + bounds.minY <= 0 : radius - bounds.maxY <= 0)
248
253
  fail("Arc glyph outlines cross the circle's center axis. Increase the radius or reduce text size.");
249
- const angle = (centerAngleDegrees * Math.PI) / 180 + ((clockwise ? -1 : 1) * groupCenter) / radius;
250
- const rotation = angle + (clockwise ? -Math.PI / 2 : Math.PI / 2);
251
- const cosine = Math.cos(rotation);
252
- const sine = Math.sin(rotation);
253
- path.transform(SVGPathDataTransformer.MATRIX(cosine, sine, -sine, cosine, radius * Math.cos(angle) - cosine * groupCenter, radius * Math.sin(angle) - sine * groupCenter));
254
+ const angleRadians = (centerAngle * Math.PI) / 180 + ((clockwise ? -1 : 1) * groupCenter) / radius;
255
+ const rotationRadians = angleRadians + (clockwise ? -Math.PI / 2 : Math.PI / 2);
256
+ const cosine = Math.cos(rotationRadians);
257
+ const sine = Math.sin(rotationRadians);
258
+ path.transform(SVGPathDataTransformer.MATRIX(cosine, sine, -sine, cosine, radius * Math.cos(angleRadians) - cosine * groupCenter, radius * Math.sin(angleRadians) - sine * groupCenter));
254
259
  bounds = path.getBounds();
255
260
  }
256
261
  minX = Math.min(minX, bounds.minX);
@@ -278,7 +283,7 @@ function buildLayout(font, fontMetrics, lines, controls) {
278
283
  // Path commands and finite numeric coordinates are ASCII, so length is the encoded byte count.
279
284
  bytes += result.length;
280
285
  if (bytes > MAX_TEXT_PATH_BYTES)
281
- fail("Text outlines exceed 1 MiB. Use fewer characters or a simpler font.");
286
+ fail("Text outlines exceed 1 MiB. Use fewer characters or a simpler font.", "COMPLEXITY_LIMIT");
282
287
  return result;
283
288
  });
284
289
  const metrics = Object.freeze({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamesh/modeling",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "description": "Scoped solid modeling and pure geometry foundations for Node and browsers.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {