@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
@@ -97,8 +97,13 @@ function engineFromModule(module, engineLimits) {
97
97
  */
98
98
  export async function createModelEngine(options = {}) {
99
99
  const limits = resolveModelingLimits(options.limits);
100
+ const wasmUrl = options.wasmUrl === undefined ? modelingWasmUrl : options.wasmUrl;
101
+ if (typeof wasmUrl !== "string" || wasmUrl.trim().length === 0)
102
+ throw new GeometryError("INVALID_ARGUMENT", "wasmUrl must be a non-empty asset URL string.", {
103
+ operation: "createModelEngine",
104
+ });
100
105
  const module = await createManifoldModule({
101
- locateFile: options.locateFile ?? (() => modelingWasmUrl),
106
+ locateFile: () => wasmUrl,
102
107
  });
103
108
  module.setup();
104
109
  return engineFromModule(module, limits);
@@ -1,10 +1,11 @@
1
+ import { vector3Data } from "../geometry/math/vector-value.js";
1
2
  import { ownScopedManifoldValue } from "./native/context.js";
2
3
  import { copiedMeshViews } from "./native/copied-views.js";
3
4
  import { measureSolidDistance } from "./native/distance.js";
4
5
  import { assertNativeSolidStatus } from "./native/status.js";
5
6
  /** Internal host-bound inspection operations. */
6
7
  export function createInspectionOperations(environment) {
7
- const { scope, throwGeometryError, nativeSolid, resolveHandle, ownSolid, ownSection, validateFiniteNumber, requirePositiveNumber, validateCoordinates, analyzedMeshFor, solidInspectionFor, sectionInspectionFor, } = environment;
8
+ const { scope, throwGeometryError, nativeSolid, resolveHandle, ownSolid, ownSection, wrapSolid, wrapSection, validateFiniteNumber, requirePositiveNumber, validateCoordinates, analyzedMeshFor, solidInspectionFor, sectionInspectionFor, solidComponentsFor, sectionComponentsFor, } = environment;
8
9
  const operations = {
9
10
  toTriangleMesh: (value) => copiedMeshViews(analyzedMeshFor(value).mesh, new Map()),
10
11
  inspectSection: sectionInspectionFor,
@@ -16,12 +17,14 @@ export function createInspectionOperations(environment) {
16
17
  return native.value.isEmpty();
17
18
  },
18
19
  distance: (handle, other) => measureSolidDistance(nativeSolid(handle), nativeSolid(other)),
19
- rayCast: (handle, origin, endpoint) => {
20
- validateCoordinates(origin, 3, "rayCast");
21
- validateCoordinates(endpoint, 3, "rayCast");
20
+ castSegment: (handle, inputOrigin, inputEndpoint) => {
21
+ const origin = vector3Data(inputOrigin);
22
+ const endpoint = vector3Data(inputEndpoint);
23
+ validateCoordinates(origin, 3, "castSegment");
24
+ validateCoordinates(endpoint, 3, "castSegment");
22
25
  const segmentLength = Math.hypot(...origin.map((value, axis) => value - endpoint[axis]));
23
26
  if (!Number.isFinite(segmentLength) || segmentLength === 0)
24
- throwGeometryError("DEGENERATE_GEOMETRY", "rayCast", "Ray segment endpoints must differ.");
27
+ throwGeometryError("DEGENERATE_GEOMETRY", "castSegment", "Segment endpoints must differ.");
25
28
  return Object.freeze(nativeSolid(handle)
26
29
  .rayCast([...origin], [...endpoint])
27
30
  .map((hit) => Object.freeze({
@@ -34,9 +37,8 @@ export function createInspectionOperations(environment) {
34
37
  components: ((handle) => {
35
38
  const native = resolveHandle(handle);
36
39
  if (native.kind === "section")
37
- return Object.freeze(native.value.isEmpty() ? [] : native.value.decompose().map(ownSection));
38
- assertNativeSolidStatus(native.value, "components");
39
- return Object.freeze(native.value.decompose().map(ownSolid));
40
+ return Object.freeze(sectionComponentsFor(handle).map(wrapSection));
41
+ return Object.freeze(solidComponentsFor(handle).map(wrapSolid));
40
42
  }),
41
43
  simplify: ((handle, tolerance) => {
42
44
  const native = resolveHandle(handle);
@@ -46,9 +48,9 @@ export function createInspectionOperations(environment) {
46
48
  const original = ownScopedManifoldValue(scope, native.value.asOriginal());
47
49
  return ownSolid(original.simplify(distance));
48
50
  }),
49
- setTolerance: (handle, tolerance) => {
50
- if (validateFiniteNumber(tolerance, "setTolerance") < 0)
51
- throwGeometryError("INVALID_ARGUMENT", "setTolerance", "Tolerance must be nonnegative millimetres.");
51
+ withTolerance: (handle, tolerance) => {
52
+ if (validateFiniteNumber(tolerance, "withTolerance") < 0)
53
+ throwGeometryError("INVALID_ARGUMENT", "withTolerance", "Tolerance must be nonnegative millimetres.");
52
54
  return ownSolid(nativeSolid(handle).setTolerance(tolerance));
53
55
  },
54
56
  };
@@ -0,0 +1,85 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ import { resolveKnuckleHinge } from "../geometry/mechanical/knuckle-hinge.js";
3
+ import { assertPrimitiveOptions } from "../geometry/primitive-resolvers.js";
4
+ import { assertSamplingCount } from "../geometry/sampling-limits.js";
5
+ /** Composes existing scoped operations after resolving both halves against one host policy. */
6
+ export function createKnuckleHingeOperation(environment, operations) {
7
+ return (options) => {
8
+ environment.assertActive();
9
+ assertPrimitiveOptions(options, "knuckleHinge");
10
+ const resolved = environment.withResolutionDefaults(options);
11
+ const d = resolveKnuckleHinge(options, resolved);
12
+ assertSamplingCount(d.segments * d.spec.knuckleCount * 2, "knuckleHinge", resolved.limits.maxVertices);
13
+ const invalid = (message) => {
14
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation: "knuckleHinge" });
15
+ };
16
+ const validateHalf = (half = {}) => {
17
+ assertPrimitiveOptions(half, "knuckleHinge");
18
+ const chamfer = half.barrelChamfer ?? 0;
19
+ if (!Number.isFinite(chamfer) ||
20
+ chamfer < 0 ||
21
+ 2 * chamfer >= d.knuckleLength ||
22
+ chamfer >= d.minimumBarrelWall)
23
+ invalid("barrelChamfer must be nonnegative and leave a positive axial band and faceted barrel wall.");
24
+ const web = half.web;
25
+ if (web !== undefined) {
26
+ assertPrimitiveOptions(web, "knuckleHinge");
27
+ if (web.direction !== "positive-y" && web.direction !== "negative-y")
28
+ invalid("Unknown web direction.");
29
+ if (!Number.isFinite(web.reach) ||
30
+ web.reach <= 0 ||
31
+ !Number.isFinite(web.thickness) ||
32
+ web.thickness <= 0 ||
33
+ !Number.isFinite(web.zMin) ||
34
+ !Number.isFinite(web.zMin + web.thickness))
35
+ invalid("Web dimensions must be finite, with positive reach and thickness.");
36
+ const innerRadius = d.barrelRadius * Math.cos(Math.PI / d.segments);
37
+ if (web.zMin >= innerRadius || web.zMin + web.thickness <= -innerRadius)
38
+ invalid("A web must overlap the interior of its barrel.");
39
+ }
40
+ return { chamfer, web };
41
+ };
42
+ // Validate both attachments before allocating either half.
43
+ const a = validateHalf(options.halfA);
44
+ const b = validateHalf(options.halfB);
45
+ const axial = (radius, start, length, bore = false, chamfer = 0) => operations.translate(operations.rotate(operations.cylinder({
46
+ radius,
47
+ height: length,
48
+ center: false,
49
+ segments: d.segments,
50
+ sizing: bore ? "face" : "vertex",
51
+ ...(chamfer === 0
52
+ ? {}
53
+ : {
54
+ ends: {
55
+ bottom: { kind: "chamfer", distance: chamfer },
56
+ top: { kind: "chamfer", distance: chamfer },
57
+ },
58
+ }),
59
+ }), [0, 90, 0]), [start, 0, 0]);
60
+ const buildHalf = (side, { chamfer, web }) => {
61
+ const features = [];
62
+ for (const interval of d.knuckles) {
63
+ if (interval.side !== side)
64
+ continue;
65
+ features.push(axial(d.barrelRadius, interval.start, interval.length, false, chamfer));
66
+ if (web !== undefined)
67
+ features.push(operations.translate(operations.box({
68
+ size: [interval.length, web.reach, web.thickness],
69
+ center: false,
70
+ }), [interval.start, web.direction === "positive-y" ? 0 : -web.reach, web.zMin]));
71
+ }
72
+ if (side === "a" && d.pin !== null)
73
+ features.push(axial(d.pinRadius, d.pin.start, d.pin.length));
74
+ const solid = operations.union(features);
75
+ // Overtravel is numerical cutter extent, independent of the physical radial/axial allowances.
76
+ const overtravel = Math.min(d.knuckleLength, d.barrelRadius) * 0.01;
77
+ return side === "a" && d.pin !== null
78
+ ? solid
79
+ : operations.subtract(solid, [
80
+ axial(d.boreRadius, -d.spec.length / 2 - overtravel, d.spec.length + 2 * overtravel, true),
81
+ ]);
82
+ };
83
+ return Object.freeze({ halfA: buildHalf("a", a), halfB: buildHalf("b", b), axis: d.axis });
84
+ };
85
+ }
@@ -2,11 +2,13 @@ import { GeometryError } from "../geometry/errors.js";
2
2
  import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../geometry/loft/loft-geometry.js";
3
3
  import { loftFrame, resolveLoftControls } from "../geometry/loft/loft-options.js";
4
4
  import { simpleLoftMesh } from "../geometry/loft/loft-simple-mesh.js";
5
- import { measureTriangleMesh } from "../geometry/mesh/mesh.js";
5
+ import { analyzeTriangleMesh } from "../geometry/mesh/mesh.js";
6
+ import { capturePath2Input, path2InputData, } from "../geometry/paths/path-value.js";
6
7
  import { assertSamplingCount } from "../geometry/sampling-limits.js";
7
8
  import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitive-profiles.js";
8
9
  import { buildProfileLoftMesh } from "./profile-mesh.js";
9
10
  const explicitProfile = (value) => typeof value === "object" && value !== null && "components" in value;
11
+ const pointProfile = (value) => Array.isArray(value) || (typeof value === "object" && value !== null && "toData" in value);
10
12
  const fail = (message) => {
11
13
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: "loft" });
12
14
  };
@@ -63,21 +65,40 @@ function primitivePolygon(profile) {
63
65
  }
64
66
  /** Private host adapter: known authored identity or explicitly requested geometric correspondence. */
65
67
  export function createLoftOperation(environment, solidFromMesh) {
66
- return (stations, value = {}) => {
68
+ return (inputStations, value = {}) => {
67
69
  environment.assertActive();
68
- if (!Array.isArray(stations) || stations.length < 2)
70
+ if (!Array.isArray(inputStations) || inputStations.length < 2)
69
71
  fail("Loft requires at least two stations.");
70
- assertSamplingCount(stations.length, "loft", environment.limits.maxPathPoints);
71
- stations.forEach((station) => loftFrame(station));
72
- resolveLoftControls(value, stations.length);
73
- const rawPoints = stations.reduce((sum, station) => sum +
74
- (explicitProfile(station.profile)
75
- ? loftProfilePointCount(station.profile)
76
- : Array.isArray(station.profile)
77
- ? station.profile.length
78
- : environment.nativeSection(station.profile).numVert()), 0);
79
- assertSamplingCount(rawPoints, "loft", 1_000_000);
72
+ assertSamplingCount(inputStations.length, "loft", environment.limits.maxPathPoints);
73
+ inputStations.forEach((station) => loftFrame(station));
80
74
  let selected = environment.withResolutionDefaults(value);
75
+ resolveLoftControls(value, inputStations.length);
76
+ const captured = inputStations.map(({ profile, ...placement }) => {
77
+ const source = pointProfile(profile) ? capturePath2Input(profile, true) : undefined;
78
+ return { placement, profile: source?.input ?? profile, count: source?.count };
79
+ });
80
+ let rawPoints = 0, fixedPoints = 0;
81
+ for (const { profile, count } of captured) {
82
+ const fixed = count === undefined
83
+ ? explicitProfile(profile)
84
+ ? loftProfilePointCount(profile)
85
+ : environment.nativeSection(profile).numVert()
86
+ : 0;
87
+ fixedPoints += fixed;
88
+ rawPoints += count ?? fixed;
89
+ assertSamplingCount(rawPoints, "loft", 1_000_000);
90
+ }
91
+ let remaining = 1_000_000 - fixedPoints;
92
+ const stations = captured.map(({ placement, profile, count }) => {
93
+ if (count === undefined)
94
+ return { ...placement, profile };
95
+ const points = path2InputData(profile, true, {
96
+ maxPathPoints: Math.max(1, Math.min(selected.limits.maxProfilePoints, remaining)),
97
+ }).points;
98
+ assertSamplingCount(points.length, "loft", remaining);
99
+ remaining -= points.length;
100
+ return { ...placement, profile: points };
101
+ });
81
102
  const controls = resolveLoftControls(selected, stations.length);
82
103
  const explicit = stations.some((station) => explicitProfile(station.profile));
83
104
  let profiles, authoritative = false;
@@ -145,7 +166,7 @@ export function createLoftOperation(environment, solidFromMesh) {
145
166
  station.profile.components[0].holes.length === 0))
146
167
  return solidFromMesh(simpleLoftMesh(geometry, selected.limits));
147
168
  const mesh = buildProfileLoftMesh(environment.module, geometry.stations, selected.limits, false, 0, (station, contour, slot) => geometry.world[station][contour][slot]);
148
- if (measureTriangleMesh(mesh).signedVolume < 0)
169
+ if (analyzeTriangleMesh(mesh).signedVolume < 0)
149
170
  for (let index = 0; index < mesh.indices.length; index += 3) {
150
171
  const b = mesh.indices[index + 1];
151
172
  mesh.indices[index + 1] = mesh.indices[index + 2];
@@ -1,6 +1,7 @@
1
+ import { createKnuckleHingeOperation } from "./knuckle-hinge-operation.js";
1
2
  import * as kernel from "./native/index.js";
2
3
  /** Internal host-bound mechanical operations. */
3
- export function createMechanicalOperations(environment) {
4
+ export function createMechanicalOperations(environment, construction) {
4
5
  const { resolution } = environment;
5
6
  const { scope, assertActive, wrapSolid, withResolutionDefaults } = environment;
6
7
  const nutOptions = (value) => ({
@@ -9,6 +10,7 @@ export function createMechanicalOperations(environment) {
9
10
  });
10
11
  // Explicit preflight preserves the stable error operation names exposed by these constructors.
11
12
  const operations = {
13
+ knuckleHinge: createKnuckleHingeOperation(environment, construction),
12
14
  threadRidge: (value) => {
13
15
  assertActive();
14
16
  return wrapSolid(kernel.threadRidge(scope, withResolutionDefaults(value)));
@@ -1,11 +1,12 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
2
  /** Counts manufacturing instances while charging shared backing storage only once. */
3
3
  export function createModelSummary(limits) {
4
- let vertices = 0, triangles = 0, bytes = 0, volumeMm3 = 0;
4
+ let vertices = 0, triangles = 0, bytes = 0, partCount = 0, volumeMm3 = 0;
5
5
  const storage = new Set();
6
6
  const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];
7
7
  return {
8
8
  add(geometry) {
9
+ partCount++;
9
10
  const measurements = geometry.measurements;
10
11
  vertices += measurements.vertexCount;
11
12
  triangles += measurements.triangleCount;
@@ -15,7 +16,8 @@ export function createModelSummary(limits) {
15
16
  storage.add(buffer);
16
17
  bytes += buffer.byteLength;
17
18
  }
18
- if (vertices > limits.maxVertices ||
19
+ if (partCount > limits.maxParts ||
20
+ vertices > limits.maxVertices ||
19
21
  triangles > limits.maxTriangles ||
20
22
  bytes > limits.maxBytes)
21
23
  throw new GeometryError("COMPLEXITY_LIMIT", "Aggregate output exceeds the execution limits.", { operation: "generate" });
@@ -29,9 +31,10 @@ export function createModelSummary(limits) {
29
31
  return {
30
32
  bounds: Object.freeze({ min: Object.freeze(min), max: Object.freeze(max) }),
31
33
  stats: Object.freeze({
32
- vertices,
33
- triangles,
34
- bytes,
34
+ partCount,
35
+ vertexCount: vertices,
36
+ triangleCount: triangles,
37
+ byteCount: bytes,
35
38
  volumeMm3,
36
39
  buildMs: builtAt - startedAt,
37
40
  finalizationMs: endedAt - builtAt,
@@ -15,7 +15,14 @@ export function createModelingContext(owner, initialResolution) {
15
15
  const sections = createSectionOperations(environment, transforms);
16
16
  const primitives = createPrimitiveOperations(environment, transforms, sections);
17
17
  const construction = createConstructionOperations(environment, sections);
18
- const mechanical = createMechanicalOperations(environment);
18
+ const mechanical = createMechanicalOperations(environment, {
19
+ cylinder: primitives.cylinder,
20
+ box: primitives.box,
21
+ union: construction.union,
22
+ rotate: transforms.operations.rotate,
23
+ translate: transforms.operations.translate,
24
+ subtract: construction.subtract,
25
+ });
19
26
  const patterns = createPatternOperations(environment, transforms);
20
27
  const inspection = createInspectionOperations(environment);
21
28
  return Object.freeze({
@@ -0,0 +1,305 @@
1
+ import { GeometryError } from "../../geometry/errors.js";
2
+ import { triangleSolidAngle } from "../../geometry/mesh/mesh-solid-intersections.js";
3
+ import { assertMeshAllocationWithinLimits, } from "../../geometry/model-limits.js";
4
+ import { ownScopedManifoldValue, scopedManifoldModule, } from "./context.js";
5
+ import { assertNativeSolidStatus } from "./status.js";
6
+ const MAXIMUM_CONTAINMENT_TESTS = 2_000_000;
7
+ /** Certifies the native sign only when its floating-point error cannot reach zero. */
8
+ function certifiedNativeOrientation(volume, bounds, triangles) {
9
+ const magnitudes = bounds.min.map((value, axis) => Math.max(Math.abs(value), Math.abs(bounds.max[axis])));
10
+ const ranges = bounds.min.map((value, axis) => bounds.max[axis] - value);
11
+ const magnitude = Math.max(...magnitudes);
12
+ // Pinned Manifold 3.5.4 src/properties.cpp:245-270 computes edge-cross/dot/6
13
+ // terms q followed by s'=fl(s+q), c+=fl(fl(s-s')+q). In exact algebra the
14
+ // compensation cancels the running-sum errors. For u=2^-53 and n*u<1/4,
15
+ // remaining summation error is <=(6u+7n^2*u^2)*sum(abs(q)). For
16
+ // P=sum(Mi*Rj*Rk), each triangle's absolute product sum is <=P/3 and its
17
+ // arithmetic error is <=64uP. Their total is <80*u*n*P*(1+n^2*u);
18
+ // 512 also covers rounding of ranges/P. This selects arithmetic, never size.
19
+ // These windows keep the bound finite/normal and absolute subnormal errors
20
+ // below its spare margin; coordinates outside them use exact arithmetic.
21
+ if (!Number.isFinite(volume) ||
22
+ triangles < 4 ||
23
+ triangles >= 2 ** 31 ||
24
+ magnitude < 2 ** -300 ||
25
+ magnitude > 2 ** 300 ||
26
+ ranges.some((range) => range < 2 ** -300 || range > 2 ** 300))
27
+ return undefined;
28
+ const productSum = magnitudes[0] * ranges[1] * ranges[2] +
29
+ magnitudes[1] * ranges[0] * ranges[2] +
30
+ magnitudes[2] * ranges[0] * ranges[1];
31
+ const unitRoundoff = Number.EPSILON / 2;
32
+ const error = 512 * unitRoundoff * triangles * productSum * (1 + triangles * triangles * unitRoundoff);
33
+ if (!Number.isFinite(error))
34
+ return undefined;
35
+ return Math.abs(volume) > error ? (volume < 0 ? -1 : 1) : undefined;
36
+ }
37
+ /** Observes native coordinates and topology without converting geometry to Float32. */
38
+ function nativeShellMesh(scope, shell, limits) {
39
+ const vertices = shell.numVert();
40
+ const properties = shell.numPropVert();
41
+ const triangles = shell.numTri();
42
+ // Both native observation work and copied topology stay within the host's mesh limits.
43
+ // Charge the Float64 coordinates, Float32 property mesh, index map and triangle indices.
44
+ assertMeshAllocationWithinLimits(Math.max(vertices, properties), triangles, vertices * 24 + properties * (shell.numProp() + 4) * 4 + triangles * 12, "components", limits);
45
+ const coordinates = new Float64Array(vertices * 3);
46
+ const encoded = ownScopedManifoldValue(scope, shell.warpBatch((positions, count) => {
47
+ coordinates.set(positions);
48
+ for (let vertex = 0; vertex < count; vertex++) {
49
+ // Exact Float32-safe IDs recover native indices even when property vertices
50
+ // are duplicated or reordered by getMesh(). The original coordinates stay Float64.
51
+ positions[vertex * 3] = vertex % 65536;
52
+ positions[vertex * 3 + 1] = Math.floor(vertex / 65536);
53
+ positions[vertex * 3 + 2] = 0;
54
+ }
55
+ }));
56
+ assertNativeSolidStatus(encoded, "components");
57
+ if (encoded.numVert() !== vertices || encoded.numTri() !== triangles)
58
+ throw new GeometryError("INVALID_TOPOLOGY", "Native observation changed shell topology.", {
59
+ operation: "components",
60
+ });
61
+ const mesh = encoded.getMesh();
62
+ if (mesh.numVert !== properties || mesh.numTri !== triangles)
63
+ throw new GeometryError("INVALID_TOPOLOGY", "Native observation changed property topology.", {
64
+ operation: "components",
65
+ });
66
+ const indices = new Uint32Array(properties);
67
+ for (let vertex = 0; vertex < properties; vertex++) {
68
+ const offset = vertex * mesh.numProp;
69
+ const low = mesh.vertProperties[offset];
70
+ const high = mesh.vertProperties[offset + 1];
71
+ const index = low + high * 65536;
72
+ if (!Number.isInteger(low) ||
73
+ low < 0 ||
74
+ low >= 65536 ||
75
+ !Number.isInteger(high) ||
76
+ high < 0 ||
77
+ !Number.isSafeInteger(index) ||
78
+ index >= vertices ||
79
+ mesh.vertProperties[offset + 2] !== 0)
80
+ throw new GeometryError("INVALID_TOPOLOGY", "Native observation lost a vertex identity.", {
81
+ operation: "components",
82
+ });
83
+ indices[vertex] = index;
84
+ }
85
+ return { coordinates, vertexIndices: indices, triangles: mesh.triVerts };
86
+ }
87
+ /** Computes signed enclosed volume without rounding, including folded contact boundaries. */
88
+ function nativeShellOrientation(mesh) {
89
+ const { coordinates, vertexIndices, triangles } = mesh;
90
+ const bits = new DataView(new ArrayBuffer(8));
91
+ const fractionMask = (1n << 52n) - 1n;
92
+ const representation = (value) => {
93
+ bits.setFloat64(0, value);
94
+ return bits.getBigUint64(0);
95
+ };
96
+ let minimumExponent = 2047;
97
+ for (const value of coordinates) {
98
+ if (!Number.isFinite(value))
99
+ throw new GeometryError("NON_FINITE_VALUE", "Native coordinates must be finite.", {
100
+ operation: "components",
101
+ });
102
+ if (value !== 0)
103
+ minimumExponent = Math.min(minimumExponent, Number((representation(value) >> 52n) & 2047n) || 1);
104
+ }
105
+ // One common binary scale makes each coefficient exact while avoiding thousands
106
+ // of unnecessary zero bits for ordinary millimetre coordinates.
107
+ const integer = (value) => {
108
+ if (value === 0)
109
+ return 0n;
110
+ const encodedValue = representation(value);
111
+ const exponent = Number((encodedValue >> 52n) & 2047n);
112
+ const significand = (encodedValue & fractionMask) | (exponent === 0 ? 0n : 1n << 52n);
113
+ const magnitude = significand << BigInt((exponent || 1) - minimumExponent);
114
+ return encodedValue >> 63n === 0n ? magnitude : -magnitude;
115
+ };
116
+ const origin = [integer(coordinates[0]), integer(coordinates[1]), integer(coordinates[2])];
117
+ const pointAt = (propertyVertex) => {
118
+ const offset = vertexIndices[propertyVertex] * 3;
119
+ return [
120
+ integer(coordinates[offset]) - origin[0],
121
+ integer(coordinates[offset + 1]) - origin[1],
122
+ integer(coordinates[offset + 2]) - origin[2],
123
+ ];
124
+ };
125
+ let volume = 0n;
126
+ for (let triangle = 0; triangle < triangles.length; triangle += 3) {
127
+ const a = pointAt(triangles[triangle]);
128
+ const b = pointAt(triangles[triangle + 1]);
129
+ const c = pointAt(triangles[triangle + 2]);
130
+ volume +=
131
+ a[0] * (b[1] * c[2] - b[2] * c[1]) +
132
+ a[1] * (b[2] * c[0] - b[0] * c[2]) +
133
+ a[2] * (b[0] * c[1] - b[1] * c[0]);
134
+ }
135
+ return volume < 0n ? -1 : volume > 0n ? 1 : 0;
136
+ }
137
+ /** Internal material decomposition; inward boundary shells stay with their enclosing exterior. */
138
+ export function solidMaterialComponents(scope, solid, limits) {
139
+ assertNativeSolidStatus(solid, "components");
140
+ assertMeshAllocationWithinLimits(Math.max(solid.numVert(), solid.numPropVert()), solid.numTri(), solid.numPropVert() * (solid.numProp() + 3) * 4 + solid.numTri() * 12, "components", limits);
141
+ const shells = solid.decompose().map((shell) => ownScopedManifoldValue(scope, shell));
142
+ const boundaries = shells
143
+ .map((shell) => ({ shell, volume: shell.volume(), bounds: shell.boundingBox() }))
144
+ .filter(({ bounds }) => {
145
+ // Coplanar Boolean contact can leave native boundary shells without any material.
146
+ // Exact collapsed native bounds identify axis-aligned contacts cheaply. Do not
147
+ // use volume, an epsilon or Float32 mesh tests: any of them could
148
+ // discard a thin positive piece or an inward shell enclosing a real cavity.
149
+ return bounds.min.every((value, axis) => value !== bounds.max[axis]);
150
+ })
151
+ .map((entry) => ({
152
+ ...entry,
153
+ orientation: certifiedNativeOrientation(entry.volume, entry.bounds, entry.shell.numTri()),
154
+ }));
155
+ const uncertain = boundaries.filter(({ orientation }) => orientation === undefined);
156
+ if (uncertain.length > 0) {
157
+ let vertices = 0;
158
+ let properties = 0;
159
+ let triangles = 0;
160
+ let bytes = 0;
161
+ for (const { shell } of uncertain) {
162
+ vertices += shell.numVert();
163
+ properties += shell.numPropVert();
164
+ triangles += shell.numTri();
165
+ bytes +=
166
+ shell.numVert() * 24 +
167
+ shell.numPropVert() * (shell.numProp() + 4) * 4 +
168
+ shell.numTri() * 12;
169
+ }
170
+ assertMeshAllocationWithinLimits(Math.max(vertices, properties), triangles, bytes, "components", limits);
171
+ }
172
+ const meshes = new Map();
173
+ let observedVertices = 0;
174
+ let observedProperties = 0;
175
+ let observedTriangles = 0;
176
+ let observedBytes = 0;
177
+ const meshFor = (shell) => {
178
+ const cached = meshes.get(shell);
179
+ if (cached !== undefined)
180
+ return cached;
181
+ const vertices = observedVertices + shell.numVert();
182
+ const properties = observedProperties + shell.numPropVert();
183
+ const triangles = observedTriangles + shell.numTri();
184
+ const bytes = observedBytes +
185
+ shell.numVert() * 24 +
186
+ shell.numPropVert() * (shell.numProp() + 4) * 4 +
187
+ shell.numTri() * 12;
188
+ assertMeshAllocationWithinLimits(Math.max(vertices, properties), triangles, bytes, "components", limits);
189
+ const mesh = nativeShellMesh(scope, shell, limits);
190
+ meshes.set(shell, mesh);
191
+ observedVertices = vertices;
192
+ observedProperties = properties;
193
+ observedTriangles = triangles;
194
+ observedBytes = bytes;
195
+ return mesh;
196
+ };
197
+ const entries = boundaries
198
+ .map((entry) => ({
199
+ ...entry,
200
+ orientation: entry.orientation ?? nativeShellOrientation(meshFor(entry.shell)),
201
+ }))
202
+ .filter(({ orientation }) => orientation !== 0);
203
+ let tests = 0;
204
+ const spend = (count = 1) => {
205
+ tests += count;
206
+ if (tests > MAXIMUM_CONTAINMENT_TESTS)
207
+ throw new GeometryError("COMPLEXITY_LIMIT", "Material component containment exceeds its work ceiling.", {
208
+ operation: "components",
209
+ details: { required: tests, allowed: MAXIMUM_CONTAINMENT_TESTS },
210
+ });
211
+ };
212
+ const exteriors = entries.filter(({ orientation }) => orientation > 0);
213
+ const cavities = entries.filter(({ orientation }) => orientation < 0);
214
+ if (exteriors.length === 0)
215
+ return Object.freeze([]);
216
+ if (cavities.length === 0)
217
+ return Object.freeze(exteriors.map(({ shell }) => shell));
218
+ const pointAt = (mesh, index) => {
219
+ const offset = mesh.vertexIndices[index] * 3;
220
+ return [
221
+ mesh.coordinates[offset],
222
+ mesh.coordinates[offset + 1],
223
+ mesh.coordinates[offset + 2],
224
+ ];
225
+ };
226
+ const candidates = [...exteriors].sort((left, right) => Math.abs(left.volume) - Math.abs(right.volume));
227
+ const enclosingExterior = (entry) => {
228
+ return candidates.find((candidate) => {
229
+ spend();
230
+ if (candidate === entry ||
231
+ entry.bounds.min.some((value, axis) => value < candidate.bounds.min[axis]) ||
232
+ entry.bounds.max.some((value, axis) => value > candidate.bounds.max[axis]))
233
+ return false;
234
+ const childMesh = meshFor(entry.shell);
235
+ const point = pointAt(childMesh, childMesh.triangles[0]);
236
+ const mesh = meshFor(candidate.shell);
237
+ let angle = 0;
238
+ for (let triangle = 0; triangle < mesh.triangles.length; triangle += 3) {
239
+ spend();
240
+ angle += triangleSolidAngle(point, [
241
+ pointAt(mesh, mesh.triangles[triangle]),
242
+ pointAt(mesh, mesh.triangles[triangle + 1]),
243
+ pointAt(mesh, mesh.triangles[triangle + 2]),
244
+ ]);
245
+ }
246
+ return Math.abs(angle) > 2 * Math.PI;
247
+ });
248
+ };
249
+ const module = scopedManifoldModule(scope);
250
+ const enclosedCavities = cavities.map((cavity) => ({
251
+ cavity,
252
+ parent: enclosingExterior(cavity),
253
+ }));
254
+ const orphanedCavity = enclosedCavities.some(({ parent }) => parent === undefined);
255
+ if (exteriors.length === 1 && entries.length === shells.length && !orphanedCavity)
256
+ return Object.freeze([solid]);
257
+ if (entries.length !== shells.length || orphanedCavity) {
258
+ // Selecting from the original would retain contact sheets inside a sealed cavity.
259
+ // Rebuild only this exceptional case from its material boundaries. The JS kernel's
260
+ // compose aliases union, so turn inward shells into positive native cutters instead.
261
+ const cutters = new Map(exteriors.map(({ shell }) => [shell, []]));
262
+ for (const { cavity, parent } of enclosedCavities) {
263
+ // An inward shell removes positive occupancy only inside an exterior. A lone
264
+ // inward contact remnant cannot define a bounded piece of material.
265
+ if (parent === undefined)
266
+ continue;
267
+ // Warp preserves winding while native mirror reverses it. The two exact X sign
268
+ // changes restore all Float64 coordinates without a mesh round-trip or tolerance.
269
+ spend(cavity.shell.numVert());
270
+ const reflected = ownScopedManifoldValue(scope, cavity.shell.warpBatch((vertices, count) => {
271
+ for (let vertex = 0; vertex < count; vertex++) {
272
+ vertices[vertex * 3] = -vertices[vertex * 3];
273
+ }
274
+ }));
275
+ const cutter = ownScopedManifoldValue(scope, reflected.mirror([1, 0, 0]));
276
+ assertNativeSolidStatus(cutter, "components");
277
+ cutters.get(parent.shell).push(cutter);
278
+ }
279
+ return Object.freeze(exteriors.map(({ shell }) => {
280
+ const holes = cutters.get(shell);
281
+ const component = holes.length === 0
282
+ ? shell
283
+ : ownScopedManifoldValue(scope, module.Manifold.difference([shell, ...holes]));
284
+ assertNativeSolidStatus(component, "components");
285
+ return component;
286
+ }));
287
+ }
288
+ const children = new Map(exteriors.map(({ shell }) => [shell, []]));
289
+ for (const exterior of exteriors) {
290
+ const parent = enclosingExterior(exterior);
291
+ if (parent !== undefined)
292
+ children.get(parent.shell).push(exterior.shell);
293
+ }
294
+ // The JS kernel aliases compose to union, which fills independently supplied inward shells.
295
+ // Select from the original material instead, retaining its native precision and cavity winding.
296
+ return Object.freeze(exteriors.map(({ shell }) => {
297
+ const selected = ownScopedManifoldValue(scope, solid.intersect(shell));
298
+ const nested = children.get(shell);
299
+ const component = nested.length === 0
300
+ ? selected
301
+ : ownScopedManifoldValue(scope, module.Manifold.difference([selected, ...nested]));
302
+ assertNativeSolidStatus(component, "components");
303
+ return component;
304
+ }));
305
+ }
@@ -2,7 +2,8 @@ import { GeometryError } from "../../geometry/errors.js";
2
2
  import { contourContainsPoint, normalizeContour, normalizeRegion, signedContourArea, } from "../../geometry/regions.js";
3
3
  import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../../geometry/sampling-limits.js";
4
4
  import { assertScopedManifoldValue, ownScopedManifoldValue, scopedManifoldModule, } from "./context.js";
5
- const MAX_AGGREGATE_CONTOURS = 25_000;
5
+ /** @internal One contour ceiling shared with authored input normalization preflights. */
6
+ export const MAX_AGGREGATE_CONTOURS = 25_000;
6
7
  const assertRegionBounds = (regions, operation, limits = {}) => {
7
8
  const hasArrayShape = Array.isArray(regions);
8
9
  if (!hasArrayShape) {
@@ -1,10 +1,10 @@
1
- import { buildHelicalThreadRidgeMesh, buildHelicalThreadSolidMesh, } from "../../geometry/mechanical/index.js";
1
+ import { helicalThreadRidgeMesh, helicalThreadSolidMesh } from "../../geometry/mechanical/index.js";
2
2
  import { resolveCompensatedThreadSolidMesh, resolveThreadedNutSolid, } from "../../geometry/mechanical/thread-solids.js";
3
3
  import { triangleMeshToManifold } from "./adapter.js";
4
4
  export { preflightThreadedRodSolid, preflightInternalThreadCutterSolid, preflightThreadedNutSolid, } from "../../geometry/mechanical/thread-solids.js";
5
5
  /** Converts the runtime-neutral ridge mesh into a scope-owned Manifold solid. */
6
6
  export function threadRidgeSolid(module, options, scope) {
7
- return triangleMeshToManifold(module, buildHelicalThreadRidgeMesh(options), scope);
7
+ return triangleMeshToManifold(module, helicalThreadRidgeMesh(options), scope);
8
8
  }
9
9
  const compensatedThreadSolid = (module, options, role, scope) => {
10
10
  const resolved = resolveCompensatedThreadSolidMesh(options, role);
@@ -12,7 +12,7 @@ const compensatedThreadSolid = (module, options, role, scope) => {
12
12
  };
13
13
  const compensatedThreadSolidFromResolved = (module, resolved, scope) => {
14
14
  const { axialExtension, meshOptions } = resolved;
15
- const combined = triangleMeshToManifold(module, buildHelicalThreadSolidMesh(meshOptions), scope);
15
+ const combined = triangleMeshToManifold(module, helicalThreadSolidMesh(meshOptions), scope);
16
16
  return axialExtension === 0 ? combined : scope.own(combined.translate([0, 0, -axialExtension]));
17
17
  };
18
18
  /** Creates a compensated, scope-owned external threaded rod along +Z. */