@metamesh/modeling 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (716) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +25 -10
  3. package/dist/api/engine.d.ts +11 -4
  4. package/dist/api/geometry.d.ts +345 -341
  5. package/dist/api/index.d.ts +262 -144
  6. package/dist/api/text.d.ts +3 -1
  7. package/dist/docs/guides/concepts.md +22 -7
  8. package/dist/docs/guides/fundamentals.md +8 -5
  9. package/dist/docs/guides/hosting.md +21 -11
  10. package/dist/docs/guides/recipes.md +42 -21
  11. package/dist/docs/manifest.json +710 -507
  12. package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
  13. package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
  14. package/dist/docs/reference/engine/GenerationOptions.md +1 -1
  15. package/dist/docs/reference/engine/GeometryResource.md +1 -1
  16. package/dist/docs/reference/engine/ModelDependencies.md +1 -1
  17. package/dist/docs/reference/engine/ModelEngine.md +1 -1
  18. package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
  19. package/dist/docs/reference/engine/ModelSession.md +1 -1
  20. package/dist/docs/reference/engine/ModelSnapshot.md +20 -9
  21. package/dist/docs/reference/engine/SessionOptions.md +1 -1
  22. package/dist/docs/reference/engine/SnapshotPart.md +2 -2
  23. package/dist/docs/reference/engine/categories/host-lifecycle.md +2 -2
  24. package/dist/docs/reference/engine/createModelEngine.md +3 -3
  25. package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
  26. package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
  27. package/dist/docs/reference/engine/validateModel.md +1 -1
  28. package/dist/docs/reference/engine.md +2 -2
  29. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
  30. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
  31. package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +1 -1
  32. package/dist/docs/reference/geometry/ArcCurve2.md +5 -5
  33. package/dist/docs/reference/geometry/ArcCurve3.md +5 -5
  34. package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +10 -5
  35. package/dist/docs/reference/geometry/AxisAngleRotation3.md +1 -1
  36. package/dist/docs/reference/geometry/Bounds2.md +1 -1
  37. package/dist/docs/reference/geometry/Bounds3.md +1 -1
  38. package/dist/docs/reference/geometry/BoundsFit2.md +1 -1
  39. package/dist/docs/reference/geometry/BoundsFit3.md +1 -1
  40. package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
  41. package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
  42. package/dist/docs/reference/geometry/BoxAnchorFace.md +1 -1
  43. package/dist/docs/reference/geometry/BoxAnchorOptions.md +1 -1
  44. package/dist/docs/reference/geometry/BoxEdge.md +1 -1
  45. package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
  46. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
  47. package/dist/docs/reference/geometry/BoxOptions.md +8 -8
  48. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
  49. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
  50. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
  51. package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
  52. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
  53. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -7
  54. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
  55. package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
  56. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
  57. package/dist/docs/reference/geometry/Contour.md +1 -1
  58. package/dist/docs/reference/geometry/ContourCurve.md +1 -1
  59. package/dist/docs/reference/geometry/ContourPoint.md +1 -1
  60. package/dist/docs/reference/geometry/ContourSegment.md +1 -1
  61. package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
  62. package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
  63. package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
  64. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
  65. package/dist/docs/reference/geometry/CubicBezierCurve2.md +1 -1
  66. package/dist/docs/reference/geometry/CubicBezierCurve3.md +1 -1
  67. package/dist/docs/reference/geometry/Curve2.md +1 -1
  68. package/dist/docs/reference/geometry/Curve3.md +1 -1
  69. package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
  70. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +1 -1
  71. package/dist/docs/reference/geometry/CylinderAnchorFace.md +1 -1
  72. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +3 -3
  73. package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
  74. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +3 -3
  75. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
  76. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
  77. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +3 -3
  78. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
  79. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
  80. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
  81. package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -6
  82. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
  83. package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
  84. package/dist/docs/reference/geometry/EllipseContourOptions.md +1 -1
  85. package/dist/docs/reference/geometry/EndTreatments.md +1 -1
  86. package/dist/docs/reference/geometry/ExtrudeOptions.md +6 -6
  87. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -5
  88. package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
  89. package/dist/docs/reference/geometry/Frame3.md +1 -1
  90. package/dist/docs/reference/geometry/GeometryError.md +1 -1
  91. package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
  92. package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
  93. package/dist/docs/reference/geometry/GeometryResolution.md +5 -5
  94. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
  95. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
  96. package/dist/docs/reference/geometry/GridPatternOptions.md +9 -3
  97. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
  98. package/dist/docs/reference/geometry/HeightfieldOptions.md +1 -1
  99. package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
  100. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -5
  101. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +6 -6
  102. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
  103. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +1 -1
  104. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
  105. package/dist/docs/reference/geometry/LineCurve2.md +1 -1
  106. package/dist/docs/reference/geometry/LineCurve3.md +1 -1
  107. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
  108. package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
  109. package/dist/docs/reference/geometry/LoftMeshStation.md +4 -4
  110. package/dist/docs/reference/geometry/LoftOptions.md +1 -1
  111. package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
  112. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
  113. package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
  114. package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
  115. package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
  116. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
  117. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
  118. package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
  119. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
  120. package/dist/docs/reference/geometry/Path2-type.md +192 -0
  121. package/dist/docs/reference/geometry/Path2Data.md +14 -0
  122. package/dist/docs/reference/geometry/Path2Input.md +15 -0
  123. package/dist/docs/reference/geometry/Path3-type.md +192 -0
  124. package/dist/docs/reference/geometry/Path3Data.md +14 -0
  125. package/dist/docs/reference/geometry/Path3Input.md +15 -0
  126. package/dist/docs/reference/geometry/PathFrame.md +1 -1
  127. package/dist/docs/reference/geometry/PathLocation.md +65 -0
  128. package/dist/docs/reference/geometry/PathNormalGuide.md +4 -3
  129. package/dist/docs/reference/geometry/PathOptions.md +34 -0
  130. package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
  131. package/dist/docs/reference/geometry/PathPlacement.md +1 -1
  132. package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
  133. package/dist/docs/reference/geometry/Pivot2Options.md +1 -1
  134. package/dist/docs/reference/geometry/Pivot3Options.md +1 -1
  135. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
  136. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
  137. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
  138. package/dist/docs/reference/geometry/PlanarPatchQuality.md +1 -1
  139. package/dist/docs/reference/geometry/PolygonData.md +1 -1
  140. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +4 -4
  141. package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
  142. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
  143. package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
  144. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
  145. package/dist/docs/reference/geometry/Profile.md +1 -1
  146. package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
  147. package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
  148. package/dist/docs/reference/geometry/ProfileSpan2.md +2 -2
  149. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +1 -1
  150. package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
  151. package/dist/docs/reference/geometry/RackPitchSpec.md +5 -5
  152. package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
  153. package/dist/docs/reference/geometry/RadialSizing.md +1 -1
  154. package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
  155. package/dist/docs/reference/geometry/RectangleContourOptions.md +1 -1
  156. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
  157. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
  158. package/dist/docs/reference/geometry/RectangleProfileOptions.md +1 -1
  159. package/dist/docs/reference/geometry/RegionData.md +1 -1
  160. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
  161. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
  162. package/dist/docs/reference/geometry/RevolveOptions.md +9 -4
  163. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
  164. package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
  165. package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
  166. package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
  167. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
  168. package/dist/docs/reference/geometry/SampledCurve2.md +1 -1
  169. package/dist/docs/reference/geometry/SampledCurve3.md +1 -1
  170. package/dist/docs/reference/geometry/SampledThreadHelices.md +3 -3
  171. package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
  172. package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
  173. package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
  174. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
  175. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +3 -3
  176. package/dist/docs/reference/geometry/SphereOptions.md +3 -3
  177. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
  178. package/dist/docs/reference/geometry/StrokeCap.md +7 -0
  179. package/dist/docs/reference/geometry/StrokeJoin.md +7 -0
  180. package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +7 -7
  181. package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
  182. package/dist/docs/reference/geometry/SvgRegionPreflight.md +1 -1
  183. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +13 -13
  184. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +11 -11
  185. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +9 -9
  186. package/dist/docs/reference/geometry/SweepOptions.md +6 -6
  187. package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
  188. package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
  189. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -5
  190. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
  191. package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
  192. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
  193. package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
  194. package/dist/docs/reference/geometry/ThreadHelixOptions.md +3 -3
  195. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
  196. package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
  197. package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +1 -1
  198. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
  199. package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
  200. package/dist/docs/reference/geometry/ThreadRole.md +1 -1
  201. package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
  202. package/dist/docs/reference/geometry/ThreadedNutOptions.md +6 -6
  203. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
  204. package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
  205. package/dist/docs/reference/geometry/ThreadedRodOptions.md +6 -6
  206. package/dist/docs/reference/geometry/TorusOptions.md +8 -8
  207. package/dist/docs/reference/geometry/Transform2-type.md +1 -1
  208. package/dist/docs/reference/geometry/Transform2Input.md +1 -1
  209. package/dist/docs/reference/geometry/Transform2Matrix.md +1 -1
  210. package/dist/docs/reference/geometry/Transform3-type.md +1 -1
  211. package/dist/docs/reference/geometry/Transform3Input.md +1 -1
  212. package/dist/docs/reference/geometry/Transform3Matrix.md +1 -1
  213. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -4
  214. package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
  215. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +2 -2
  216. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
  217. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
  218. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +3 -3
  219. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
  220. package/dist/docs/reference/geometry/TriangleMeshSignature.md +2 -2
  221. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +3 -3
  222. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
  223. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
  224. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
  225. package/dist/docs/reference/geometry/TubeOptions.md +8 -8
  226. package/dist/docs/reference/geometry/Vector2-type.md +1 -1
  227. package/dist/docs/reference/geometry/Vector2Input.md +1 -1
  228. package/dist/docs/reference/geometry/Vector2Tuple.md +1 -1
  229. package/dist/docs/reference/geometry/Vector3-type.md +1 -1
  230. package/dist/docs/reference/geometry/Vector3Input.md +1 -1
  231. package/dist/docs/reference/geometry/Vector3Tuple.md +1 -1
  232. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +3 -3
  233. package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
  234. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
  235. package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
  236. package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
  237. package/dist/docs/reference/geometry/add2.md +1 -1
  238. package/dist/docs/reference/geometry/add3.md +1 -1
  239. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
  240. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +2 -2
  241. package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +9 -9
  242. package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
  243. package/dist/docs/reference/geometry/applyTransformDirection3.md +1 -1
  244. package/dist/docs/reference/geometry/applyTransformPoint3.md +1 -1
  245. package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +13 -13
  246. package/dist/docs/reference/geometry/boundsCenter.md +1 -1
  247. package/dist/docs/reference/geometry/boundsFromSize.md +1 -1
  248. package/dist/docs/reference/geometry/boundsSize.md +1 -1
  249. package/dist/docs/reference/geometry/boxAnchor3.md +4 -4
  250. package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
  251. package/dist/docs/reference/geometry/categories/curves-paths.md +15 -13
  252. package/dist/docs/reference/geometry/categories/mechanical.md +6 -6
  253. package/dist/docs/reference/geometry/categories/meshes.md +3 -4
  254. package/dist/docs/reference/geometry/categories/pattern-placement.md +6 -6
  255. package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
  256. package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -3
  257. package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
  258. package/dist/docs/reference/geometry/categories/transforms-math.md +5 -5
  259. package/dist/docs/reference/geometry/categories/vector-import.md +5 -5
  260. package/dist/docs/reference/geometry/circleContour.md +1 -1
  261. package/dist/docs/reference/geometry/closeToAxis.md +1 -1
  262. package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
  263. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -5
  264. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -5
  265. package/dist/docs/reference/geometry/composeTransform3.md +1 -1
  266. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +10 -6
  267. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -7
  268. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +1 -1
  269. package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +4 -4
  270. package/dist/docs/reference/geometry/containsBounds.md +1 -1
  271. package/dist/docs/reference/geometry/contourContainsPoint.md +1 -1
  272. package/dist/docs/reference/geometry/cross2.md +1 -1
  273. package/dist/docs/reference/geometry/cross3.md +1 -1
  274. package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
  275. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
  276. package/dist/docs/reference/geometry/distance2.md +1 -1
  277. package/dist/docs/reference/geometry/distance3.md +1 -1
  278. package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
  279. package/dist/docs/reference/geometry/dot2.md +1 -1
  280. package/dist/docs/reference/geometry/dot3.md +1 -1
  281. package/dist/docs/reference/geometry/ellipseContour.md +1 -1
  282. package/dist/docs/reference/geometry/eulerTransform3.md +1 -1
  283. package/dist/docs/reference/geometry/extrudeMesh.md +8 -8
  284. package/dist/docs/reference/geometry/fitBounds.md +1 -1
  285. package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
  286. package/dist/docs/reference/geometry/frameTransform3.md +1 -1
  287. package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +3 -3
  288. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
  289. package/dist/docs/reference/geometry/gridPatternTransforms.md +2 -2
  290. package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
  291. package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +5 -5
  292. package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +5 -5
  293. package/dist/docs/reference/geometry/inverseTransform3.md +1 -1
  294. package/dist/docs/reference/geometry/isGeometryError.md +1 -1
  295. package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
  296. package/dist/docs/reference/geometry/layoutRow.md +1 -1
  297. package/dist/docs/reference/geometry/length2.md +1 -1
  298. package/dist/docs/reference/geometry/length3.md +1 -1
  299. package/dist/docs/reference/geometry/lerp2.md +1 -1
  300. package/dist/docs/reference/geometry/lerp3.md +1 -1
  301. package/dist/docs/reference/geometry/linearPatternTransforms.md +2 -2
  302. package/dist/docs/reference/geometry/loftMesh.md +2 -1
  303. package/dist/docs/reference/geometry/matchProfiles.md +1 -1
  304. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +1 -1
  305. package/dist/docs/reference/geometry/meshBounds.md +1 -1
  306. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +3 -3
  307. package/dist/docs/reference/geometry/normalize2.md +1 -1
  308. package/dist/docs/reference/geometry/normalize3.md +1 -1
  309. package/dist/docs/reference/geometry/normalizeContour.md +1 -1
  310. package/dist/docs/reference/geometry/normalizePolygon.md +1 -1
  311. package/dist/docs/reference/geometry/normalizeRegion.md +1 -1
  312. package/dist/docs/reference/geometry/optimizePlanarPatches.md +11 -11
  313. package/dist/docs/reference/geometry/path2.md +42 -0
  314. package/dist/docs/reference/geometry/path3.md +42 -0
  315. package/dist/docs/reference/geometry/pathPatternTransforms.md +6 -6
  316. package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
  317. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +3 -3
  318. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +3 -3
  319. package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
  320. package/dist/docs/reference/geometry/preflightThreadedNut.md +3 -3
  321. package/dist/docs/reference/geometry/preflightThreadedRod.md +3 -3
  322. package/dist/docs/reference/geometry/projectOntoPlane3.md +1 -1
  323. package/dist/docs/reference/geometry/radialPatternTransforms.md +1 -17
  324. package/dist/docs/reference/geometry/rectangleContour.md +1 -1
  325. package/dist/docs/reference/geometry/rectangleProfile.md +1 -1
  326. package/dist/docs/reference/geometry/regionArea.md +1 -1
  327. package/dist/docs/reference/geometry/regionBounds.md +1 -1
  328. package/dist/docs/reference/geometry/regularPolygonContour.md +2 -2
  329. package/dist/docs/reference/geometry/resamplePolyline2.md +2 -2
  330. package/dist/docs/reference/geometry/resamplePolyline3.md +2 -2
  331. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +4 -4
  332. package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
  333. package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
  334. package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
  335. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
  336. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +3 -3
  337. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
  338. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
  339. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
  340. package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
  341. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +4 -4
  342. package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
  343. package/dist/docs/reference/geometry/revolveMesh.md +10 -10
  344. package/dist/docs/reference/geometry/rotate2.md +1 -1
  345. package/dist/docs/reference/geometry/rotationTransform3.md +1 -1
  346. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +6 -4
  347. package/dist/docs/reference/geometry/sampleContour.md +3 -3
  348. package/dist/docs/reference/geometry/sampleCurve2.md +3 -3
  349. package/dist/docs/reference/geometry/sampleCurve3.md +2 -2
  350. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
  351. package/dist/docs/reference/geometry/sampleHelix.md +2 -2
  352. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
  353. package/dist/docs/reference/geometry/sampleRackToothPath.md +4 -4
  354. package/dist/docs/reference/geometry/sampleSideProfile.md +3 -3
  355. package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
  356. package/dist/docs/reference/geometry/sampleThreadHelices.md +2 -2
  357. package/dist/docs/reference/geometry/scale2.md +1 -1
  358. package/dist/docs/reference/geometry/scale3.md +1 -1
  359. package/dist/docs/reference/geometry/scaleTransform3.md +1 -1
  360. package/dist/docs/reference/geometry/signedContourArea.md +1 -1
  361. package/dist/docs/reference/geometry/starContour.md +1 -1
  362. package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
  363. package/dist/docs/reference/geometry/subtract2.md +1 -1
  364. package/dist/docs/reference/geometry/subtract3.md +1 -1
  365. package/dist/docs/reference/geometry/sweepMesh.md +9 -9
  366. package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +6 -6
  367. package/dist/docs/reference/geometry/transform2.md +1 -1
  368. package/dist/docs/reference/geometry/transform3.md +1 -1
  369. package/dist/docs/reference/geometry/transformDeterminant3.md +1 -1
  370. package/dist/docs/reference/geometry/transformRegionData.md +1 -1
  371. package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
  372. package/dist/docs/reference/geometry/translationTransform3.md +1 -1
  373. package/dist/docs/reference/geometry/triangulateContour.md +1 -1
  374. package/dist/docs/reference/geometry/validateSolidMesh.md +2 -2
  375. package/dist/docs/reference/geometry/validateTransform3.md +1 -1
  376. package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
  377. package/dist/docs/reference/geometry/vector2.md +1 -1
  378. package/dist/docs/reference/geometry/vector3.md +1 -1
  379. package/dist/docs/reference/geometry.md +2 -2
  380. package/dist/docs/reference/model/Anchor3.md +1 -1
  381. package/dist/docs/reference/model/AttachOptions.md +10 -5
  382. package/dist/docs/reference/model/Bounds2.md +1 -1
  383. package/dist/docs/reference/model/Bounds3.md +1 -1
  384. package/dist/docs/reference/model/BoxEdge.md +1 -1
  385. package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
  386. package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
  387. package/dist/docs/reference/model/BoxOptions.md +8 -8
  388. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
  389. package/dist/docs/reference/model/CircleContourOptions.md +1 -1
  390. package/dist/docs/reference/model/CircleOptions.md +3 -3
  391. package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
  392. package/dist/docs/reference/model/Computed.md +1 -1
  393. package/dist/docs/reference/model/ComputedValue.md +1 -1
  394. package/dist/docs/reference/model/Contour.md +1 -1
  395. package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
  396. package/dist/docs/reference/model/CorrespondingContour.md +1 -1
  397. package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
  398. package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
  399. package/dist/docs/reference/model/CylinderOptions.md +3 -3
  400. package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
  401. package/dist/docs/reference/model/EdgeTreatment.md +1 -1
  402. package/dist/docs/reference/model/EllipseContourOptions.md +1 -1
  403. package/dist/docs/reference/model/EllipseOptions.md +3 -3
  404. package/dist/docs/reference/model/EndTreatments.md +1 -1
  405. package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
  406. package/dist/docs/reference/model/FinalizedModel.md +18 -8
  407. package/dist/docs/reference/model/FinalizedPart.md +1 -1
  408. package/dist/docs/reference/model/Frame3.md +1 -1
  409. package/dist/docs/reference/model/GenerateCallback.md +1 -1
  410. package/dist/docs/reference/model/GenerateContext.md +1 -1
  411. package/dist/docs/reference/model/GeneratedPart.md +1 -1
  412. package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
  413. package/dist/docs/reference/model/GenerationError.md +1 -1
  414. package/dist/docs/reference/model/GeometryResolution.md +5 -5
  415. package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
  416. package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
  417. package/dist/docs/reference/model/GridPatternOptions.md +9 -3
  418. package/dist/docs/reference/model/HeightfieldOptions.md +1 -1
  419. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +3 -3
  420. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
  421. package/dist/docs/reference/model/HullOptions.md +5 -5
  422. package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
  423. package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
  424. package/dist/docs/reference/model/ImplicitOptions.md +1 -1
  425. package/dist/docs/reference/model/InternalThreadCutterOptions.md +4 -4
  426. package/dist/docs/reference/model/LinearPatternOptions.md +12 -5
  427. package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
  428. package/dist/docs/reference/model/LoftOptions.md +1 -1
  429. package/dist/docs/reference/model/LoftPlacement.md +1 -1
  430. package/dist/docs/reference/model/LoftStation.md +3 -3
  431. package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
  432. package/dist/docs/reference/model/ModelProgram.md +1 -1
  433. package/dist/docs/reference/model/ModelingLimits.md +1 -1
  434. package/dist/docs/reference/model/NumericArray.md +1 -1
  435. package/dist/docs/reference/model/PartGeometry.md +1 -1
  436. package/dist/docs/reference/model/PartOptions.md +1 -1
  437. package/dist/docs/reference/model/Path2-type.md +192 -0
  438. package/dist/docs/reference/model/Path2Data.md +14 -0
  439. package/dist/docs/reference/model/Path2Input.md +15 -0
  440. package/dist/docs/reference/model/Path3-type.md +192 -0
  441. package/dist/docs/reference/model/Path3Data.md +14 -0
  442. package/dist/docs/reference/model/Path3Input.md +15 -0
  443. package/dist/docs/reference/model/PathLocation.md +65 -0
  444. package/dist/docs/reference/model/PathNormalGuide.md +4 -3
  445. package/dist/docs/reference/model/PathOptions.md +34 -0
  446. package/dist/docs/reference/model/PathPatternOptions.md +3 -3
  447. package/dist/docs/reference/model/PathResamplingOptions.md +79 -0
  448. package/dist/docs/reference/model/PatternSource.md +1 -1
  449. package/dist/docs/reference/model/Pivot2Options.md +1 -1
  450. package/dist/docs/reference/model/Pivot3Options.md +1 -1
  451. package/dist/docs/reference/model/PlaneOptions.md +3 -3
  452. package/dist/docs/reference/model/PolygonData.md +1 -1
  453. package/dist/docs/reference/model/PolygonOptions.md +8 -8
  454. package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +7 -7
  455. package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +41 -20
  456. package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
  457. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
  458. package/dist/docs/reference/model/Profile.md +1 -1
  459. package/dist/docs/reference/model/ProfileComponent2.md +1 -1
  460. package/dist/docs/reference/model/ProfileContour2.md +1 -1
  461. package/dist/docs/reference/model/ProfileSpan2.md +2 -2
  462. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +1 -1
  463. package/dist/docs/reference/model/RadialPatternOptions.md +17 -22
  464. package/dist/docs/reference/model/RadialSizing.md +1 -1
  465. package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
  466. package/dist/docs/reference/model/RectangleContourOptions.md +1 -1
  467. package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
  468. package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
  469. package/dist/docs/reference/model/RectangleOptions.md +8 -8
  470. package/dist/docs/reference/model/RegionData.md +1 -1
  471. package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
  472. package/dist/docs/reference/model/RevolveOptions.md +9 -4
  473. package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
  474. package/dist/docs/reference/model/Section.md +12 -11
  475. package/dist/docs/reference/model/SectionHullOptions.md +5 -5
  476. package/dist/docs/reference/model/SectionInspection.md +7 -7
  477. package/dist/docs/reference/model/SectionOffsetJoin.md +1 -1
  478. package/dist/docs/reference/model/SectionOffsetOptions.md +1 -1
  479. package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
  480. package/dist/docs/reference/model/Solid.md +23 -6
  481. package/dist/docs/reference/model/SolidInspection.md +4 -4
  482. package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +3 -3
  483. package/dist/docs/reference/model/SphereOptions.md +3 -3
  484. package/dist/docs/reference/model/StarOptions.md +10 -10
  485. package/dist/docs/reference/model/{StrokePathCap.md → StrokeCap.md} +3 -3
  486. package/dist/docs/reference/model/{StrokePathJoin.md → StrokeJoin.md} +3 -3
  487. package/dist/docs/reference/model/StrokeOptions.md +6 -6
  488. package/dist/docs/reference/model/SvgOrigin.md +1 -1
  489. package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
  490. package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
  491. package/dist/docs/reference/model/SweepOptions.md +6 -6
  492. package/dist/docs/reference/model/SweepOrientation.md +7 -7
  493. package/dist/docs/reference/model/TextSectionOptions.md +1 -1
  494. package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
  495. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
  496. package/dist/docs/reference/model/ThreadHandedness.md +1 -1
  497. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
  498. package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
  499. package/dist/docs/reference/model/ThreadProfile.md +1 -1
  500. package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
  501. package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
  502. package/dist/docs/reference/model/ThreadedNutOptions.md +4 -4
  503. package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
  504. package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
  505. package/dist/docs/reference/model/ThreadedRodOptions.md +4 -4
  506. package/dist/docs/reference/model/TorusOptions.md +8 -8
  507. package/dist/docs/reference/model/Transform2-type.md +1 -1
  508. package/dist/docs/reference/model/Transform2Input.md +1 -1
  509. package/dist/docs/reference/model/Transform2Matrix.md +1 -1
  510. package/dist/docs/reference/model/Transform3-type.md +1 -1
  511. package/dist/docs/reference/model/Transform3Input.md +1 -1
  512. package/dist/docs/reference/model/Transform3Matrix.md +1 -1
  513. package/dist/docs/reference/model/TriangleMesh.md +1 -1
  514. package/dist/docs/reference/model/TriangleMeshAnalysis.md +2 -2
  515. package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
  516. package/dist/docs/reference/model/TubeOptions.md +8 -8
  517. package/dist/docs/reference/model/Vector2-type.md +1 -1
  518. package/dist/docs/reference/model/Vector2Input.md +1 -1
  519. package/dist/docs/reference/model/Vector2Tuple.md +1 -1
  520. package/dist/docs/reference/model/Vector3-type.md +1 -1
  521. package/dist/docs/reference/model/Vector3Input.md +1 -1
  522. package/dist/docs/reference/model/Vector3Tuple.md +1 -1
  523. package/dist/docs/reference/model/VectorTextLayout.md +1 -1
  524. package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
  525. package/dist/docs/reference/model/anchor.md +1 -1
  526. package/dist/docs/reference/model/box.md +3 -3
  527. package/dist/docs/reference/model/castSegment.md +40 -0
  528. package/dist/docs/reference/model/categories/boolean-operations.md +1 -1
  529. package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -1
  530. package/dist/docs/reference/model/categories/contracts.md +2 -2
  531. package/dist/docs/reference/model/categories/core-values-errors.md +1 -1
  532. package/dist/docs/reference/model/categories/explicit-profiles.md +2 -2
  533. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +2 -2
  534. package/dist/docs/reference/model/categories/generation.md +1 -1
  535. package/dist/docs/reference/model/categories/inspection.md +4 -5
  536. package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
  537. package/dist/docs/reference/model/categories/paths.md +33 -0
  538. package/dist/docs/reference/model/categories/primitives.md +2 -2
  539. package/dist/docs/reference/model/categories/resolution.md +2 -2
  540. package/dist/docs/reference/model/categories/sections.md +3 -4
  541. package/dist/docs/reference/model/categories/threads.md +5 -5
  542. package/dist/docs/reference/model/categories/transforms-placement.md +8 -8
  543. package/dist/docs/reference/model/circle.md +1 -1
  544. package/dist/docs/reference/model/components.md +6 -6
  545. package/dist/docs/reference/model/compose.md +1 -1
  546. package/dist/docs/reference/model/cylinder.md +1 -1
  547. package/dist/docs/reference/model/distance.md +1 -1
  548. package/dist/docs/reference/model/ellipse.md +1 -1
  549. package/dist/docs/reference/model/extrude.md +3 -3
  550. package/dist/docs/reference/model/generate.md +1 -1
  551. package/dist/docs/reference/model/gridPattern.md +4 -4
  552. package/dist/docs/reference/model/heightfield.md +1 -1
  553. package/dist/docs/reference/model/hull.md +1 -1
  554. package/dist/docs/reference/model/immutableBuffer.md +1 -1
  555. package/dist/docs/reference/model/immutableMesh.md +1 -1
  556. package/dist/docs/reference/model/implicit.md +1 -1
  557. package/dist/docs/reference/model/inspectSection.md +1 -1
  558. package/dist/docs/reference/model/inspectSolid.md +1 -1
  559. package/dist/docs/reference/model/internalThreadCutter.md +4 -4
  560. package/dist/docs/reference/model/intersect.md +1 -1
  561. package/dist/docs/reference/model/isEmpty.md +1 -1
  562. package/dist/docs/reference/model/linearPattern.md +4 -4
  563. package/dist/docs/reference/model/loft.md +1 -1
  564. package/dist/docs/reference/model/matchProfiles.md +2 -2
  565. package/dist/docs/reference/model/minkowskiSum.md +1 -1
  566. package/dist/docs/reference/model/path2.md +42 -0
  567. package/dist/docs/reference/model/path3.md +42 -0
  568. package/dist/docs/reference/model/pathPattern.md +13 -12
  569. package/dist/docs/reference/model/polygon.md +4 -4
  570. package/dist/docs/reference/model/preflightInternalThreadCutter.md +3 -3
  571. package/dist/docs/reference/model/preflightThreadedNut.md +3 -3
  572. package/dist/docs/reference/model/preflightThreadedRod.md +3 -3
  573. package/dist/docs/reference/model/radialPattern.md +5 -37
  574. package/dist/docs/reference/model/rectangle.md +3 -3
  575. package/dist/docs/reference/model/regularPolygon.md +1 -1
  576. package/dist/docs/reference/model/revolve.md +5 -4
  577. package/dist/docs/reference/model/solidFromMesh.md +1 -1
  578. package/dist/docs/reference/model/sphere.md +1 -1
  579. package/dist/docs/reference/model/split.md +1 -1
  580. package/dist/docs/reference/model/splitByPlane.md +1 -1
  581. package/dist/docs/reference/model/star.md +4 -4
  582. package/dist/docs/reference/model/stroke.md +8 -8
  583. package/dist/docs/reference/model/svgPathSection.md +1 -1
  584. package/dist/docs/reference/model/svgSection.md +1 -1
  585. package/dist/docs/reference/model/sweep.md +7 -7
  586. package/dist/docs/reference/model/textSection.md +1 -1
  587. package/dist/docs/reference/model/threadRidge.md +2 -2
  588. package/dist/docs/reference/model/threadedNut.md +4 -4
  589. package/dist/docs/reference/model/threadedRod.md +4 -4
  590. package/dist/docs/reference/model/torus.md +3 -3
  591. package/dist/docs/reference/model/transform2.md +1 -1
  592. package/dist/docs/reference/model/transform3.md +1 -1
  593. package/dist/docs/reference/model/tube.md +3 -3
  594. package/dist/docs/reference/model/union.md +1 -1
  595. package/dist/docs/reference/model/vector2.md +1 -1
  596. package/dist/docs/reference/model/vector3.md +1 -1
  597. package/dist/docs/reference/model.md +3 -2
  598. package/dist/docs/reference/text/Bounds2.md +1 -1
  599. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
  600. package/dist/docs/reference/text/Vector2Tuple.md +1 -1
  601. package/dist/docs/reference/text/VectorFont.md +2 -2
  602. package/dist/docs/reference/text/VectorFontOptions.md +1 -1
  603. package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
  604. package/dist/docs/reference/text/VectorTextLayout.md +1 -1
  605. package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
  606. package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
  607. package/dist/docs/reference/text/VectorTextOptions.md +1 -1
  608. package/dist/docs/reference/text/categories/font-preparation.md +3 -3
  609. package/dist/docs/reference/text/prepareVectorFont.md +2 -2
  610. package/dist/docs/reference/text.md +1 -1
  611. package/dist/engine/construction-operations.js +31 -14
  612. package/dist/engine/execution.js +39 -8
  613. package/dist/engine/extrusion-finishing.js +1 -1
  614. package/dist/engine/index.js +6 -1
  615. package/dist/engine/inspection-operations.js +13 -11
  616. package/dist/engine/loft-operations.js +35 -14
  617. package/dist/engine/model-summary.js +8 -5
  618. package/dist/engine/native/material-components.js +305 -0
  619. package/dist/engine/native/regions.js +2 -1
  620. package/dist/engine/native/threads.js +3 -3
  621. package/dist/engine/native/transforms.js +5 -7
  622. package/dist/engine/operation-environment.js +2 -2
  623. package/dist/engine/pattern-operations.js +1 -1
  624. package/dist/engine/placement.js +2 -2
  625. package/dist/engine/primitive-anchors.js +17 -17
  626. package/dist/engine/primitive-operations.js +1 -1
  627. package/dist/engine/primitive-profiles.js +7 -7
  628. package/dist/engine/profile-mesh.js +7 -7
  629. package/dist/engine/recipe-realization.js +6 -0
  630. package/dist/engine/section-operations.js +33 -8
  631. package/dist/engine/session-snapshot.js +14 -4
  632. package/dist/engine/session.js +10 -5
  633. package/dist/engine/shape-anchors.js +3 -3
  634. package/dist/engine/transform-operations.js +24 -24
  635. package/dist/geometry/anchors.js +40 -33
  636. package/dist/geometry/curves/sampling.js +14 -14
  637. package/dist/geometry/edge-finishing.js +1 -1
  638. package/dist/geometry/extrusion.js +13 -16
  639. package/dist/geometry/index.js +9 -10
  640. package/dist/geometry/loft/loft-simple-mesh.js +6 -6
  641. package/dist/geometry/loft/loft.js +22 -13
  642. package/dist/geometry/math/immutable-value.js +1 -1
  643. package/dist/geometry/mechanical/gear-motion.js +3 -3
  644. package/dist/geometry/mechanical/gears.js +38 -38
  645. package/dist/geometry/mechanical/index.js +3 -3
  646. package/dist/geometry/mechanical/standards.js +1 -1
  647. package/dist/geometry/mechanical/thread-helices.js +2 -3
  648. package/dist/geometry/mechanical/thread-mesh-plan.js +4 -5
  649. package/dist/geometry/mechanical/thread-mesh.js +7 -7
  650. package/dist/geometry/mechanical/thread-profiles.js +5 -5
  651. package/dist/geometry/mechanical/thread-solids.js +2 -2
  652. package/dist/geometry/mechanical/thread-surface.js +1 -1
  653. package/dist/geometry/mechanical/threads.js +8 -8
  654. package/dist/geometry/mesh/mesh-planar.js +25 -27
  655. package/dist/geometry/mesh/mesh-quality.js +5 -5
  656. package/dist/geometry/mesh/mesh-signature.js +13 -13
  657. package/dist/geometry/mesh/mesh-solid.js +7 -7
  658. package/dist/geometry/mesh/mesh.js +4 -15
  659. package/dist/geometry/paths/closest-point.js +8 -19
  660. package/dist/geometry/paths/frames.js +41 -11
  661. package/dist/geometry/paths/helix.js +16 -6
  662. package/dist/geometry/paths/path-value.js +252 -0
  663. package/dist/geometry/paths/planar.js +36 -23
  664. package/dist/geometry/paths/resampling.js +27 -5
  665. package/dist/geometry/patterns/placements.js +100 -27
  666. package/dist/geometry/patterns.js +2 -2
  667. package/dist/geometry/polygon-clipping.js +17 -0
  668. package/dist/geometry/profiles/contour.js +6 -6
  669. package/dist/geometry/profiles/matched.js +4 -4
  670. package/dist/geometry/profiles/profiles.js +4 -4
  671. package/dist/geometry/profiles/rectangle.js +4 -4
  672. package/dist/geometry/profiles/side-profile.js +7 -7
  673. package/dist/geometry/profiles/span-sampling.js +1 -1
  674. package/dist/geometry/resolution.js +34 -34
  675. package/dist/geometry/revolve/revolve-mesh.js +12 -7
  676. package/dist/geometry/stroke-path.js +12 -27
  677. package/dist/geometry/svg/fill.js +7 -21
  678. package/dist/geometry/svg-import.js +23 -23
  679. package/dist/geometry/sweeps/options.js +5 -4
  680. package/dist/geometry/sweeps/orientation.js +5 -5
  681. package/dist/geometry/sweeps/stations.js +10 -10
  682. package/dist/geometry/sweeps/sweep-closed.js +2 -2
  683. package/dist/geometry/sweeps/sweep-mesh.js +9 -3
  684. package/dist/geometry/sweeps/sweep-open.js +1 -1
  685. package/dist/geometry/sweeps/validation.js +4 -7
  686. package/dist/geometry/transform-geometry.js +7 -14
  687. package/dist/index.js +1 -0
  688. package/dist/model/execution-binding.js +3 -3
  689. package/dist/model/geometry-recipes.js +1 -1
  690. package/dist/model/immutable-generation-data.js +66 -6
  691. package/dist/model/operations.js +25 -26
  692. package/dist/model/recipe-declaration.js +13 -7
  693. package/dist/model/shape-handles.js +2 -1
  694. package/dist/text/index.js +15 -9
  695. package/dist/text/vector-text-layout.js +31 -26
  696. package/package.json +1 -1
  697. package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +0 -34
  698. package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +0 -65
  699. package/dist/docs/reference/geometry/Path2.md +0 -14
  700. package/dist/docs/reference/geometry/Path3.md +0 -14
  701. package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
  702. package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
  703. package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
  704. package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
  705. package/dist/docs/reference/geometry/closestPointOnPath.md +0 -110
  706. package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
  707. package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
  708. package/dist/docs/reference/geometry/pathLength.md +0 -33
  709. package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
  710. package/dist/docs/reference/geometry/transformContour.md +0 -42
  711. package/dist/docs/reference/geometry/transformPath2.md +0 -40
  712. package/dist/docs/reference/geometry/transformPath3.md +0 -33
  713. package/dist/docs/reference/model/Path2.md +0 -20
  714. package/dist/docs/reference/model/rayCast.md +0 -40
  715. package/dist/docs/reference/model/toTriangleMesh.md +0 -27
  716. package/dist/geometry/paths/path.js +0 -32
@@ -7,6 +7,7 @@ import { createModelingContext } from "./modeling-context.js";
7
7
  import { ownScopedManifoldValue, scopedManifoldScope, trackScopedManifoldValue, } from "./native/context.js";
8
8
  import { copiedFloat32Array, copiedUint32Array } from "./native/copied-views.js";
9
9
  import * as kernel from "./native/index.js";
10
+ import { solidMaterialComponents } from "./native/material-components.js";
10
11
  import { assertNativeSolidStatus } from "./native/status.js";
11
12
  import { createShapeAnchorOwner } from "./shape-anchors.js";
12
13
  /** Internal execution owner; no native value or constructor crosses the public facade. */
@@ -18,6 +19,8 @@ export function createExecutionContext(module, scope, limits, initialResolution
18
19
  const canonicalSectionProfiles = new Map();
19
20
  let solidInspections;
20
21
  let sectionInspections;
22
+ let solidComponents;
23
+ let sectionComponents;
21
24
  const primitiveSectionProfiles = new Map();
22
25
  let active = true;
23
26
  const throwGeometryError = (code, operation, message) => {
@@ -63,6 +66,30 @@ export function createExecutionContext(module, scope, limits, initialResolution
63
66
  const owned = ownScopedManifoldValue(scope, value);
64
67
  return wrapSection(owned);
65
68
  };
69
+ const solidComponentsFor = (handle) => {
70
+ const native = nativeSolid(handle);
71
+ const cached = solidComponents?.get(native);
72
+ if (cached !== undefined)
73
+ return cached;
74
+ const components = solidMaterialComponents(scope, native, limits);
75
+ const cache = (solidComponents ??= new Map());
76
+ cache.set(native, components);
77
+ for (const component of components)
78
+ cache.set(component, Object.freeze([component]));
79
+ return components;
80
+ };
81
+ const sectionComponentsFor = (handle) => {
82
+ const native = nativeSection(handle);
83
+ const cached = sectionComponents?.get(native);
84
+ if (cached !== undefined)
85
+ return cached;
86
+ const components = Object.freeze(native.isEmpty() ? [] : native.decompose().map((part) => ownScopedManifoldValue(scope, part)));
87
+ const cache = (sectionComponents ??= new Map());
88
+ cache.set(native, components);
89
+ for (const component of components)
90
+ cache.set(component, Object.freeze([component]));
91
+ return components;
92
+ };
66
93
  // Geometry is immutable for a native value. Validate build ownership before every cache hit,
67
94
  // and retain only frozen plain facts so callers cannot corrupt later inspections.
68
95
  const solidInspectionFor = (handle) => {
@@ -72,12 +99,12 @@ export function createExecutionContext(module, scope, limits, initialResolution
72
99
  return cached;
73
100
  assertNativeSolidStatus(native, "inspectSolid");
74
101
  const bounds = native.boundingBox();
75
- const parts = native.decompose().map((part) => ownScopedManifoldValue(scope, part));
102
+ const components = solidComponentsFor(handle);
76
103
  const facts = Object.freeze({
77
104
  min: Object.freeze([...bounds.min]),
78
105
  max: Object.freeze([...bounds.max]),
79
106
  isEmpty: native.isEmpty(),
80
- parts: parts.length,
107
+ componentCount: components.length,
81
108
  volume: native.volume(),
82
109
  surfaceArea: native.surfaceArea(),
83
110
  tolerance: native.tolerance(),
@@ -92,17 +119,15 @@ export function createExecutionContext(module, scope, limits, initialResolution
92
119
  return cached;
93
120
  const bounds = native.bounds();
94
121
  const empty = native.isEmpty();
95
- const parts = empty
96
- ? []
97
- : native.decompose().map((part) => ownScopedManifoldValue(scope, part));
122
+ const components = sectionComponentsFor(handle);
98
123
  const facts = Object.freeze({
99
124
  min: Object.freeze([...bounds.min]),
100
125
  max: Object.freeze([...bounds.max]),
101
126
  isEmpty: empty,
102
127
  area: native.area(),
103
- contours: native.numContour(),
104
- parts: parts.length,
105
- vertices: native.numVert(),
128
+ contourCount: native.numContour(),
129
+ componentCount: components.length,
130
+ vertexCount: native.numVert(),
106
131
  });
107
132
  (sectionInspections ??= new Map()).set(native, facts);
108
133
  return facts;
@@ -244,6 +269,8 @@ export function createExecutionContext(module, scope, limits, initialResolution
244
269
  analyzedMeshFor,
245
270
  solidInspectionFor,
246
271
  sectionInspectionFor,
272
+ solidComponentsFor,
273
+ sectionComponentsFor,
247
274
  sectionProfileFor,
248
275
  primitiveProfileFor,
249
276
  rememberPrimitiveProfile,
@@ -305,8 +332,12 @@ export function createExecutionContext(module, scope, limits, initialResolution
305
332
  canonicalSectionProfiles.clear();
306
333
  solidInspections?.clear();
307
334
  sectionInspections?.clear();
335
+ solidComponents?.clear();
336
+ sectionComponents?.clear();
308
337
  solidInspections = undefined;
309
338
  sectionInspections = undefined;
339
+ solidComponents = undefined;
340
+ sectionComponents = undefined;
310
341
  primitiveSectionProfiles.clear();
311
342
  shapeAnchors.dispose();
312
343
  },
@@ -10,7 +10,7 @@ const fail = (message) => {
10
10
  /** Finishes inward convex extrusion rims with exact parallel-edge offsets and retained correspondence. */
11
11
  export function buildFinishedExtrusion(module, profile, options) {
12
12
  const controls = resolveExtrusionControls(options.height, options, "extrude");
13
- if (controls.twistDegrees !== 0 ||
13
+ if (controls.twist !== 0 ||
14
14
  controls.scales.some((scale) => scale !== 1) ||
15
15
  options.divisions !== undefined)
16
16
  fail("End treatments require a straight extrusion without twist, top scaling or divisions.");
@@ -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
  };
@@ -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 && "toArray" 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,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,
@@ -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. */