@metamesh/modeling 0.12.0 → 0.14.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 (699) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +103 -72
  3. package/dist/api/engine.d.ts +123 -97
  4. package/dist/api/geometry.d.ts +4232 -3307
  5. package/dist/api/index.d.ts +2758 -2268
  6. package/dist/api/text.d.ts +119 -107
  7. package/dist/docs/guides/concepts.md +300 -0
  8. package/dist/docs/guides/fonts.md +59 -0
  9. package/dist/docs/guides/fundamentals.md +137 -0
  10. package/dist/docs/guides/generation.md +223 -0
  11. package/dist/docs/guides/hosting.md +91 -0
  12. package/dist/docs/guides/recipes.md +718 -0
  13. package/dist/docs/manifest.json +10703 -0
  14. package/dist/docs/reference/engine/Export3mfOptions.md +29 -0
  15. package/dist/docs/reference/engine/ExportMeshPart.md +65 -0
  16. package/dist/docs/reference/engine/GenerationOptions.md +62 -0
  17. package/dist/docs/reference/engine/GeometryResource.md +77 -0
  18. package/dist/docs/reference/engine/ModelDependencies.md +41 -0
  19. package/dist/docs/reference/engine/ModelEngine.md +103 -0
  20. package/dist/docs/reference/engine/ModelEngineOptions.md +33 -0
  21. package/dist/docs/reference/engine/ModelSession.md +96 -0
  22. package/dist/docs/reference/engine/ModelSnapshot.md +173 -0
  23. package/dist/docs/reference/engine/SessionOptions.md +123 -0
  24. package/dist/docs/reference/engine/SnapshotPart.md +130 -0
  25. package/dist/docs/reference/engine/categories/host-lifecycle.md +37 -0
  26. package/dist/docs/reference/engine/createModelEngine.md +56 -0
  27. package/dist/docs/reference/engine/defaultModelingLimits.md +7 -0
  28. package/dist/docs/reference/engine/modelingWasmUrl.md +7 -0
  29. package/dist/docs/reference/engine/validateModel.md +48 -0
  30. package/dist/docs/reference/engine.md +25 -0
  31. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +75 -0
  32. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +92 -0
  33. package/dist/docs/reference/geometry/Anchor3.md +53 -0
  34. package/dist/docs/reference/geometry/ArcCurve2.md +70 -0
  35. package/dist/docs/reference/geometry/ArcCurve3.md +94 -0
  36. package/dist/docs/reference/geometry/AttachTransformOptions.md +62 -0
  37. package/dist/docs/reference/geometry/AxisAngleRotation3.md +66 -0
  38. package/dist/docs/reference/geometry/Bounds2.md +39 -0
  39. package/dist/docs/reference/geometry/Bounds3.md +39 -0
  40. package/dist/docs/reference/geometry/BoundsFit2.md +52 -0
  41. package/dist/docs/reference/geometry/BoundsFit3.md +52 -0
  42. package/dist/docs/reference/geometry/BoundsFitOptions.md +23 -0
  43. package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +23 -0
  44. package/dist/docs/reference/geometry/BoxAnchorFace.md +14 -0
  45. package/dist/docs/reference/geometry/BoxAnchorOptions.md +63 -0
  46. package/dist/docs/reference/geometry/BoxEdge.md +7 -0
  47. package/dist/docs/reference/geometry/BoxEdgeSelection.md +14 -0
  48. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +15 -0
  49. package/dist/docs/reference/geometry/BoxOptions.md +87 -0
  50. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +7 -0
  51. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +93 -0
  52. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +29 -0
  53. package/dist/docs/reference/geometry/CircleContourOptions.md +15 -0
  54. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +59 -0
  55. package/dist/docs/reference/geometry/CircularResolutionOptions.md +107 -0
  56. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +41 -0
  57. package/dist/docs/reference/geometry/ClearanceHoleFit.md +7 -0
  58. package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +34 -0
  59. package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +65 -0
  60. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +53 -0
  61. package/dist/docs/reference/geometry/Contour.md +17 -0
  62. package/dist/docs/reference/geometry/ContourCurve.md +35 -0
  63. package/dist/docs/reference/geometry/ContourPoint.md +29 -0
  64. package/dist/docs/reference/geometry/ContourSegment.md +86 -0
  65. package/dist/docs/reference/geometry/CorrespondingComponent.md +46 -0
  66. package/dist/docs/reference/geometry/CorrespondingContour.md +46 -0
  67. package/dist/docs/reference/geometry/CorrespondingProfile.md +22 -0
  68. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +27 -0
  69. package/dist/docs/reference/geometry/CubicBezierCurve2.md +70 -0
  70. package/dist/docs/reference/geometry/CubicBezierCurve3.md +70 -0
  71. package/dist/docs/reference/geometry/Curve2.md +16 -0
  72. package/dist/docs/reference/geometry/Curve3.md +16 -0
  73. package/dist/docs/reference/geometry/CurveSamplingOptions.md +64 -0
  74. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +73 -0
  75. package/dist/docs/reference/geometry/CylinderAnchorFace.md +14 -0
  76. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +87 -0
  77. package/dist/docs/reference/geometry/CylinderOptions.md +53 -0
  78. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +209 -0
  79. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +7 -0
  80. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +71 -0
  81. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +82 -0
  82. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +34 -0
  83. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +41 -0
  84. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +47 -0
  85. package/dist/docs/reference/geometry/CylindricalGearSpec.md +82 -0
  86. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -0
  87. package/dist/docs/reference/geometry/EdgeTreatment.md +17 -0
  88. package/dist/docs/reference/geometry/EllipseContourOptions.md +15 -0
  89. package/dist/docs/reference/geometry/EndTreatments.md +34 -0
  90. package/dist/docs/reference/geometry/ExtrudeOptions.md +134 -0
  91. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +77 -0
  92. package/dist/docs/reference/geometry/FittedTextLayout.md +60 -0
  93. package/dist/docs/reference/geometry/Frame3.md +58 -0
  94. package/dist/docs/reference/geometry/GeometryError.md +97 -0
  95. package/dist/docs/reference/geometry/GeometryErrorCode.md +7 -0
  96. package/dist/docs/reference/geometry/GeometryErrorContext.md +29 -0
  97. package/dist/docs/reference/geometry/GeometryResolution.md +74 -0
  98. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +62 -0
  99. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +41 -0
  100. package/dist/docs/reference/geometry/GridPatternOptions.md +42 -0
  101. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +14 -0
  102. package/dist/docs/reference/geometry/HeightfieldOptions.md +67 -0
  103. package/dist/docs/reference/geometry/HeightfieldPreflight.md +53 -0
  104. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +141 -0
  105. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +265 -0
  106. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +53 -0
  107. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +18 -0
  108. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +242 -0
  109. package/dist/docs/reference/geometry/LineCurve2.md +46 -0
  110. package/dist/docs/reference/geometry/LineCurve3.md +46 -0
  111. package/dist/docs/reference/geometry/LinearPatternOptions.md +30 -0
  112. package/dist/docs/reference/geometry/LoftCorrespondence.md +19 -0
  113. package/dist/docs/reference/geometry/LoftMeshStation.md +27 -0
  114. package/dist/docs/reference/geometry/LoftOptions.md +84 -0
  115. package/dist/docs/reference/geometry/LoftPlacement.md +66 -0
  116. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +18 -0
  117. package/dist/docs/reference/geometry/MatchProfilesOptions.md +35 -0
  118. package/dist/docs/reference/geometry/MetricFastenerSize.md +7 -0
  119. package/dist/docs/reference/geometry/MetricFastenerStandard.md +72 -0
  120. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +29 -0
  121. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +41 -0
  122. package/dist/docs/reference/geometry/ModelingLimits.md +126 -0
  123. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +17 -0
  124. package/dist/docs/reference/geometry/Path2.md +14 -0
  125. package/dist/docs/reference/geometry/Path3.md +14 -0
  126. package/dist/docs/reference/geometry/PathFrame.md +46 -0
  127. package/dist/docs/reference/geometry/PathNormalGuide.md +38 -0
  128. package/dist/docs/reference/geometry/PathPatternOptions.md +46 -0
  129. package/dist/docs/reference/geometry/PathPlacement.md +34 -0
  130. package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
  131. package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
  132. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +7 -0
  133. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +156 -0
  134. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +120 -0
  135. package/dist/docs/reference/geometry/PlanarPatchQuality.md +190 -0
  136. package/dist/docs/reference/geometry/PolygonData.md +38 -0
  137. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +92 -0
  138. package/dist/docs/reference/geometry/PrimitivePlacement.md +31 -0
  139. package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +83 -0
  140. package/dist/docs/reference/geometry/PrintableThreadFit.md +7 -0
  141. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +45 -0
  142. package/dist/docs/reference/geometry/Profile.md +22 -0
  143. package/dist/docs/reference/geometry/ProfileComponent2.md +46 -0
  144. package/dist/docs/reference/geometry/ProfileContour2.md +34 -0
  145. package/dist/docs/reference/geometry/ProfileSpan2.md +47 -0
  146. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +36 -0
  147. package/dist/docs/reference/geometry/RackPitchDimensions.md +113 -0
  148. package/dist/docs/reference/geometry/RackPitchSpec.md +77 -0
  149. package/dist/docs/reference/geometry/RadialPatternOptions.md +62 -0
  150. package/dist/docs/reference/geometry/RadialSizing.md +7 -0
  151. package/dist/docs/reference/geometry/RadialSizingOptions.md +40 -0
  152. package/dist/docs/reference/geometry/RectangleContourOptions.md +66 -0
  153. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +34 -0
  154. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +14 -0
  155. package/dist/docs/reference/geometry/RectangleProfileOptions.md +94 -0
  156. package/dist/docs/reference/geometry/RegionData.md +14 -0
  157. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +84 -0
  158. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +65 -0
  159. package/dist/docs/reference/geometry/RevolveOptions.md +82 -0
  160. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +91 -0
  161. package/dist/docs/reference/geometry/RowLayoutOptions.md +23 -0
  162. package/dist/docs/reference/geometry/SampleContourOptions.md +71 -0
  163. package/dist/docs/reference/geometry/SampleHelixOptions.md +95 -0
  164. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +71 -0
  165. package/dist/docs/reference/geometry/SampledCurve2.md +34 -0
  166. package/dist/docs/reference/geometry/SampledCurve3.md +34 -0
  167. package/dist/docs/reference/geometry/SampledThreadHelices.md +58 -0
  168. package/dist/docs/reference/geometry/SideProfileCurve.md +35 -0
  169. package/dist/docs/reference/geometry/SideProfilePoint.md +29 -0
  170. package/dist/docs/reference/geometry/SideProfileSegment.md +86 -0
  171. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +71 -0
  172. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +34 -0
  173. package/dist/docs/reference/geometry/SphereOptions.md +15 -0
  174. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +75 -0
  175. package/dist/docs/reference/geometry/StrokePathCap.md +7 -0
  176. package/dist/docs/reference/geometry/StrokePathJoin.md +7 -0
  177. package/dist/docs/reference/geometry/StrokePathRegionOptions.md +85 -0
  178. package/dist/docs/reference/geometry/SvgImportOptions.md +60 -0
  179. package/dist/docs/reference/geometry/SvgRegionPreflight.md +61 -0
  180. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +118 -0
  181. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +65 -0
  182. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +53 -0
  183. package/dist/docs/reference/geometry/SweepOptions.md +109 -0
  184. package/dist/docs/reference/geometry/SweepOrientation.md +109 -0
  185. package/dist/docs/reference/geometry/ThreadBevelOptions.md +53 -0
  186. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +100 -0
  187. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +73 -0
  188. package/dist/docs/reference/geometry/ThreadEndStyle.md +7 -0
  189. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +113 -0
  190. package/dist/docs/reference/geometry/ThreadHandedness.md +7 -0
  191. package/dist/docs/reference/geometry/ThreadHelixOptions.md +120 -0
  192. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +7 -0
  193. package/dist/docs/reference/geometry/ThreadLeadInShape.md +7 -0
  194. package/dist/docs/reference/geometry/ThreadProfile.md +82 -0
  195. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +49 -0
  196. package/dist/docs/reference/geometry/ThreadProfileSpec.md +19 -0
  197. package/dist/docs/reference/geometry/ThreadRole.md +7 -0
  198. package/dist/docs/reference/geometry/ThreadedNutBevel.md +7 -0
  199. package/dist/docs/reference/geometry/ThreadedNutOptions.md +269 -0
  200. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +94 -0
  201. package/dist/docs/reference/geometry/ThreadedNutShape.md +7 -0
  202. package/dist/docs/reference/geometry/ThreadedRodOptions.md +242 -0
  203. package/dist/docs/reference/geometry/TorusOptions.md +105 -0
  204. package/dist/docs/reference/geometry/Transform2-type.md +255 -0
  205. package/dist/docs/reference/geometry/Transform2Input.md +19 -0
  206. package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
  207. package/dist/docs/reference/geometry/Transform3-type.md +295 -0
  208. package/dist/docs/reference/geometry/Transform3Input.md +19 -0
  209. package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
  210. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +91 -0
  211. package/dist/docs/reference/geometry/TriangleMesh.md +34 -0
  212. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +119 -0
  213. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +75 -0
  214. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +75 -0
  215. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +39 -0
  216. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +190 -0
  217. package/dist/docs/reference/geometry/TriangleMeshSignature.md +107 -0
  218. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +41 -0
  219. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +29 -0
  220. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +51 -0
  221. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +91 -0
  222. package/dist/docs/reference/geometry/TubeOptions.md +138 -0
  223. package/dist/docs/reference/geometry/Vector2-type.md +269 -0
  224. package/dist/docs/reference/geometry/Vector2Input.md +19 -0
  225. package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
  226. package/dist/docs/reference/geometry/Vector3-type.md +281 -0
  227. package/dist/docs/reference/geometry/Vector3Input.md +19 -0
  228. package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
  229. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +53 -0
  230. package/dist/docs/reference/geometry/VectorTextLayout.md +39 -0
  231. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +111 -0
  232. package/dist/docs/reference/geometry/VectorTextMetrics.md +94 -0
  233. package/dist/docs/reference/geometry/VectorTextOptions.md +50 -0
  234. package/dist/docs/reference/geometry/add2.md +36 -0
  235. package/dist/docs/reference/geometry/add3.md +42 -0
  236. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +57 -0
  237. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +52 -0
  238. package/dist/docs/reference/geometry/anchorFrame3.md +40 -0
  239. package/dist/docs/reference/geometry/applyTransformDirection3.md +45 -0
  240. package/dist/docs/reference/geometry/applyTransformPoint3.md +43 -0
  241. package/dist/docs/reference/geometry/attachTransform.md +77 -0
  242. package/dist/docs/reference/geometry/boundsCenter.md +62 -0
  243. package/dist/docs/reference/geometry/boundsFromSize.md +83 -0
  244. package/dist/docs/reference/geometry/boundsSize.md +62 -0
  245. package/dist/docs/reference/geometry/boxAnchor3.md +52 -0
  246. package/dist/docs/reference/geometry/buildHelicalThreadRidgeMesh.md +68 -0
  247. package/dist/docs/reference/geometry/buildHelicalThreadSolidMesh.md +102 -0
  248. package/dist/docs/reference/geometry/categories/bounds-layout.md +35 -0
  249. package/dist/docs/reference/geometry/categories/curves-paths.md +66 -0
  250. package/dist/docs/reference/geometry/categories/mechanical.md +101 -0
  251. package/dist/docs/reference/geometry/categories/meshes.md +73 -0
  252. package/dist/docs/reference/geometry/categories/pattern-placement.md +34 -0
  253. package/dist/docs/reference/geometry/categories/primitive-options.md +36 -0
  254. package/dist/docs/reference/geometry/categories/profiles-regions.md +74 -0
  255. package/dist/docs/reference/geometry/categories/resolution-errors.md +47 -0
  256. package/dist/docs/reference/geometry/categories/transforms-math.md +92 -0
  257. package/dist/docs/reference/geometry/categories/vector-import.md +40 -0
  258. package/dist/docs/reference/geometry/circleContour.md +33 -0
  259. package/dist/docs/reference/geometry/closeToAxis.md +34 -0
  260. package/dist/docs/reference/geometry/closestPointOnPath.md +110 -0
  261. package/dist/docs/reference/geometry/compensateThreadDiameters.md +51 -0
  262. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +42 -0
  263. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +56 -0
  264. package/dist/docs/reference/geometry/composeTransform3.md +44 -0
  265. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +45 -0
  266. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +47 -0
  267. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +31 -0
  268. package/dist/docs/reference/geometry/containsBounds.md +72 -0
  269. package/dist/docs/reference/geometry/contourContainsPoint.md +33 -0
  270. package/dist/docs/reference/geometry/createAnchor3.md +67 -0
  271. package/dist/docs/reference/geometry/createThreadProfile.md +37 -0
  272. package/dist/docs/reference/geometry/createTriangleMeshSignature.md +60 -0
  273. package/dist/docs/reference/geometry/cross2.md +36 -0
  274. package/dist/docs/reference/geometry/cross3.md +42 -0
  275. package/dist/docs/reference/geometry/cumulativePathLengths.md +33 -0
  276. package/dist/docs/reference/geometry/cylinderAnchor3.md +60 -0
  277. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +14 -0
  278. package/dist/docs/reference/geometry/distance2.md +36 -0
  279. package/dist/docs/reference/geometry/distance3.md +36 -0
  280. package/dist/docs/reference/geometry/distributeAlongPath.md +51 -0
  281. package/dist/docs/reference/geometry/dot2.md +36 -0
  282. package/dist/docs/reference/geometry/dot3.md +42 -0
  283. package/dist/docs/reference/geometry/ellipseContour.md +33 -0
  284. package/dist/docs/reference/geometry/eulerTransform3.md +42 -0
  285. package/dist/docs/reference/geometry/extrudeMesh.md +73 -0
  286. package/dist/docs/reference/geometry/fitBounds.md +95 -0
  287. package/dist/docs/reference/geometry/fitTextLayout.md +57 -0
  288. package/dist/docs/reference/geometry/frameTransform3.md +48 -0
  289. package/dist/docs/reference/geometry/getMetricClearanceHole.md +33 -0
  290. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +27 -0
  291. package/dist/docs/reference/geometry/gridPatternTransforms.md +31 -0
  292. package/dist/docs/reference/geometry/heightfieldMesh.md +43 -0
  293. package/dist/docs/reference/geometry/inverseTransform3.md +34 -0
  294. package/dist/docs/reference/geometry/isGeometryError.md +26 -0
  295. package/dist/docs/reference/geometry/joinTriangleMeshes.md +36 -0
  296. package/dist/docs/reference/geometry/layoutRow.md +43 -0
  297. package/dist/docs/reference/geometry/length2.md +30 -0
  298. package/dist/docs/reference/geometry/length3.md +30 -0
  299. package/dist/docs/reference/geometry/lerp2.md +42 -0
  300. package/dist/docs/reference/geometry/lerp3.md +42 -0
  301. package/dist/docs/reference/geometry/linearPatternTransforms.md +31 -0
  302. package/dist/docs/reference/geometry/loftMesh.md +72 -0
  303. package/dist/docs/reference/geometry/matchProfiles.md +51 -0
  304. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +48 -0
  305. package/dist/docs/reference/geometry/measureTriangleMesh.md +55 -0
  306. package/dist/docs/reference/geometry/meshBounds.md +35 -0
  307. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +29 -0
  308. package/dist/docs/reference/geometry/normalize2.md +36 -0
  309. package/dist/docs/reference/geometry/normalize3.md +36 -0
  310. package/dist/docs/reference/geometry/normalizeContour.md +45 -0
  311. package/dist/docs/reference/geometry/normalizePolygon.md +37 -0
  312. package/dist/docs/reference/geometry/normalizeRegion.md +33 -0
  313. package/dist/docs/reference/geometry/optimizePlanarPatches.md +91 -0
  314. package/dist/docs/reference/geometry/pathLength.md +33 -0
  315. package/dist/docs/reference/geometry/pathPatternTransforms.md +57 -0
  316. package/dist/docs/reference/geometry/preflightHeightfield.md +34 -0
  317. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +96 -0
  318. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +85 -0
  319. package/dist/docs/reference/geometry/preflightSvgRegion.md +56 -0
  320. package/dist/docs/reference/geometry/preflightThreadedNut.md +96 -0
  321. package/dist/docs/reference/geometry/preflightThreadedRod.md +85 -0
  322. package/dist/docs/reference/geometry/projectOntoPlane3.md +36 -0
  323. package/dist/docs/reference/geometry/radialPatternTransforms.md +47 -0
  324. package/dist/docs/reference/geometry/rectangleContour.md +49 -0
  325. package/dist/docs/reference/geometry/rectangleProfile.md +53 -0
  326. package/dist/docs/reference/geometry/regionArea.md +34 -0
  327. package/dist/docs/reference/geometry/regionBounds.md +27 -0
  328. package/dist/docs/reference/geometry/regularPolygonContour.md +53 -0
  329. package/dist/docs/reference/geometry/resamplePolyline2.md +64 -0
  330. package/dist/docs/reference/geometry/resamplePolyline3.md +67 -0
  331. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +83 -0
  332. package/dist/docs/reference/geometry/resolveArcSegments.md +67 -0
  333. package/dist/docs/reference/geometry/resolveCircularSegments.md +62 -0
  334. package/dist/docs/reference/geometry/resolveCylindricalGear.md +31 -0
  335. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +31 -0
  336. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +74 -0
  337. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +26 -0
  338. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +59 -0
  339. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +27 -0
  340. package/dist/docs/reference/geometry/resolveRackPitch.md +27 -0
  341. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +59 -0
  342. package/dist/docs/reference/geometry/reverseTriangleMesh.md +30 -0
  343. package/dist/docs/reference/geometry/revolveMesh.md +76 -0
  344. package/dist/docs/reference/geometry/rotate2.md +36 -0
  345. package/dist/docs/reference/geometry/rotationTransform3.md +53 -0
  346. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +50 -0
  347. package/dist/docs/reference/geometry/sampleContour.md +77 -0
  348. package/dist/docs/reference/geometry/sampleCurve2.md +61 -0
  349. package/dist/docs/reference/geometry/sampleCurve3.md +61 -0
  350. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +58 -0
  351. package/dist/docs/reference/geometry/sampleHelix.md +41 -0
  352. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +59 -0
  353. package/dist/docs/reference/geometry/sampleRackToothPath.md +39 -0
  354. package/dist/docs/reference/geometry/sampleSideProfile.md +73 -0
  355. package/dist/docs/reference/geometry/sampleTextContours.md +53 -0
  356. package/dist/docs/reference/geometry/sampleThreadHelices.md +63 -0
  357. package/dist/docs/reference/geometry/scale2.md +36 -0
  358. package/dist/docs/reference/geometry/scale3.md +42 -0
  359. package/dist/docs/reference/geometry/scaleTransform3.md +38 -0
  360. package/dist/docs/reference/geometry/signedContourArea.md +26 -0
  361. package/dist/docs/reference/geometry/starContour.md +51 -0
  362. package/dist/docs/reference/geometry/strokePathRegion.md +63 -0
  363. package/dist/docs/reference/geometry/subtract2.md +36 -0
  364. package/dist/docs/reference/geometry/subtract3.md +42 -0
  365. package/dist/docs/reference/geometry/sweepMesh.md +82 -0
  366. package/dist/docs/reference/geometry/transform2.md +38 -0
  367. package/dist/docs/reference/geometry/transform3.md +38 -0
  368. package/dist/docs/reference/geometry/transformContour.md +42 -0
  369. package/dist/docs/reference/geometry/transformDeterminant3.md +36 -0
  370. package/dist/docs/reference/geometry/transformPath2.md +40 -0
  371. package/dist/docs/reference/geometry/transformPath3.md +33 -0
  372. package/dist/docs/reference/geometry/transformRegionData.md +40 -0
  373. package/dist/docs/reference/geometry/transformTriangleMesh.md +42 -0
  374. package/dist/docs/reference/geometry/translationTransform3.md +35 -0
  375. package/dist/docs/reference/geometry/triangulateContour.md +26 -0
  376. package/dist/docs/reference/geometry/validateSolidMesh.md +52 -0
  377. package/dist/docs/reference/geometry/validateTransform3.md +47 -0
  378. package/dist/docs/reference/geometry/validateTriangleMesh.md +59 -0
  379. package/dist/docs/reference/geometry/vector2.md +31 -0
  380. package/dist/docs/reference/geometry/vector3.md +38 -0
  381. package/dist/docs/reference/geometry.md +30 -0
  382. package/dist/docs/reference/model/Anchor3.md +54 -0
  383. package/dist/docs/reference/model/AttachOptions.md +63 -0
  384. package/dist/docs/reference/model/Bounds2.md +39 -0
  385. package/dist/docs/reference/model/Bounds3.md +39 -0
  386. package/dist/docs/reference/model/BoxEdge.md +15 -0
  387. package/dist/docs/reference/model/BoxEdgeSelection.md +19 -0
  388. package/dist/docs/reference/model/BoxEdgeTreatments.md +20 -0
  389. package/dist/docs/reference/model/BoxOptions.md +92 -0
  390. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +35 -0
  391. package/dist/docs/reference/model/CircleContourOptions.md +21 -0
  392. package/dist/docs/reference/model/CircleOptions.md +21 -0
  393. package/dist/docs/reference/model/CircularPrimitiveOptions.md +64 -0
  394. package/dist/docs/reference/model/Computed.md +35 -0
  395. package/dist/docs/reference/model/ComputedValue.md +20 -0
  396. package/dist/docs/reference/model/Contour.md +22 -0
  397. package/dist/docs/reference/model/CorrespondingComponent.md +46 -0
  398. package/dist/docs/reference/model/CorrespondingContour.md +46 -0
  399. package/dist/docs/reference/model/CorrespondingProfile.md +22 -0
  400. package/dist/docs/reference/model/CorrespondingProfileStation.md +27 -0
  401. package/dist/docs/reference/model/CylinderOptions.md +58 -0
  402. package/dist/docs/reference/model/DiagnosticOptions.md +23 -0
  403. package/dist/docs/reference/model/EdgeTreatment.md +22 -0
  404. package/dist/docs/reference/model/EllipseContourOptions.md +21 -0
  405. package/dist/docs/reference/model/EllipseOptions.md +21 -0
  406. package/dist/docs/reference/model/EndTreatments.md +39 -0
  407. package/dist/docs/reference/model/ExtrudeOptions.md +140 -0
  408. package/dist/docs/reference/model/FinalizedModel.md +121 -0
  409. package/dist/docs/reference/model/FinalizedPart.md +87 -0
  410. package/dist/docs/reference/model/Frame3.md +63 -0
  411. package/dist/docs/reference/model/GenerateCallback.md +37 -0
  412. package/dist/docs/reference/model/GenerateContext.md +277 -0
  413. package/dist/docs/reference/model/GeneratedPart.md +93 -0
  414. package/dist/docs/reference/model/GenerationDiagnostic.md +41 -0
  415. package/dist/docs/reference/model/GenerationError.md +54 -0
  416. package/dist/docs/reference/model/GeometryResolution.md +70 -0
  417. package/dist/docs/reference/model/GeometrySamplingLimits.md +62 -0
  418. package/dist/docs/reference/model/GeometryToleranceOptions.md +46 -0
  419. package/dist/docs/reference/model/GridPatternOptions.md +43 -0
  420. package/dist/docs/reference/model/HeightfieldOptions.md +67 -0
  421. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +140 -0
  422. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +58 -0
  423. package/dist/docs/reference/model/HullOptions.md +72 -0
  424. package/dist/docs/reference/model/ImmutableBuffer-type.md +80 -0
  425. package/dist/docs/reference/model/ImmutableTriangleMesh.md +34 -0
  426. package/dist/docs/reference/model/ImplicitOptions.md +83 -0
  427. package/dist/docs/reference/model/InternalThreadCutterOptions.md +245 -0
  428. package/dist/docs/reference/model/LinearPatternOptions.md +31 -0
  429. package/dist/docs/reference/model/LoftCorrespondence.md +27 -0
  430. package/dist/docs/reference/model/LoftOptions.md +91 -0
  431. package/dist/docs/reference/model/LoftPlacement.md +73 -0
  432. package/dist/docs/reference/model/LoftStation.md +35 -0
  433. package/dist/docs/reference/model/MatchProfilesOptions.md +35 -0
  434. package/dist/docs/reference/model/ModelProgram.md +44 -0
  435. package/dist/docs/reference/model/ModelingLimits.md +126 -0
  436. package/dist/docs/reference/model/NumericArray.md +7 -0
  437. package/dist/docs/reference/model/PartGeometry.md +16 -0
  438. package/dist/docs/reference/model/PartOptions.md +65 -0
  439. package/dist/docs/reference/model/Path2.md +20 -0
  440. package/dist/docs/reference/model/PathNormalGuide.md +45 -0
  441. package/dist/docs/reference/model/PathPatternOptions.md +47 -0
  442. package/dist/docs/reference/model/PatternSource.md +26 -0
  443. package/dist/docs/reference/model/Pivot2Options.md +27 -0
  444. package/dist/docs/reference/model/Pivot3Options.md +27 -0
  445. package/dist/docs/reference/model/PlaneOptions.md +39 -0
  446. package/dist/docs/reference/model/PolygonData.md +43 -0
  447. package/dist/docs/reference/model/PolygonOptions.md +189 -0
  448. package/dist/docs/reference/model/PrimitivePlacement.md +40 -0
  449. package/dist/docs/reference/model/PrimitivePlacementOptions.md +88 -0
  450. package/dist/docs/reference/model/PrintableThreadFit.md +14 -0
  451. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +50 -0
  452. package/dist/docs/reference/model/Profile.md +22 -0
  453. package/dist/docs/reference/model/ProfileComponent2.md +46 -0
  454. package/dist/docs/reference/model/ProfileContour2.md +34 -0
  455. package/dist/docs/reference/model/ProfileSpan2.md +47 -0
  456. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +41 -0
  457. package/dist/docs/reference/model/RadialPatternOptions.md +63 -0
  458. package/dist/docs/reference/model/RadialSizing.md +15 -0
  459. package/dist/docs/reference/model/RadialSizingOptions.md +40 -0
  460. package/dist/docs/reference/model/RectangleContourOptions.md +72 -0
  461. package/dist/docs/reference/model/RectangleCornerTreatment.md +40 -0
  462. package/dist/docs/reference/model/RectangleCornerTreatments.md +20 -0
  463. package/dist/docs/reference/model/RectangleOptions.md +107 -0
  464. package/dist/docs/reference/model/RegionData.md +19 -0
  465. package/dist/docs/reference/model/RegularPolygonOptions.md +53 -0
  466. package/dist/docs/reference/model/RevolveOptions.md +89 -0
  467. package/dist/docs/reference/model/RoundedEdgeTreatment.md +96 -0
  468. package/dist/docs/reference/model/Section.md +490 -0
  469. package/dist/docs/reference/model/SectionHullOptions.md +72 -0
  470. package/dist/docs/reference/model/SectionInspection.md +98 -0
  471. package/dist/docs/reference/model/SectionOffsetJoin.md +16 -0
  472. package/dist/docs/reference/model/SectionOffsetOptions.md +65 -0
  473. package/dist/docs/reference/model/SmoothEdgeTreatment.md +76 -0
  474. package/dist/docs/reference/model/Solid.md +373 -0
  475. package/dist/docs/reference/model/SolidInspection.md +98 -0
  476. package/dist/docs/reference/model/SolidRayHit.md +58 -0
  477. package/dist/docs/reference/model/SphereOptions.md +20 -0
  478. package/dist/docs/reference/model/StarOptions.md +98 -0
  479. package/dist/docs/reference/model/StrokeOptions.md +91 -0
  480. package/dist/docs/reference/model/StrokePathCap.md +16 -0
  481. package/dist/docs/reference/model/StrokePathJoin.md +16 -0
  482. package/dist/docs/reference/model/SvgOrigin.md +16 -0
  483. package/dist/docs/reference/model/SvgPathSectionOptions.md +78 -0
  484. package/dist/docs/reference/model/SvgSectionOptions.md +66 -0
  485. package/dist/docs/reference/model/SweepOptions.md +116 -0
  486. package/dist/docs/reference/model/SweepOrientation.md +116 -0
  487. package/dist/docs/reference/model/TextSectionOptions.md +41 -0
  488. package/dist/docs/reference/model/ThreadEndStyle.md +14 -0
  489. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +117 -0
  490. package/dist/docs/reference/model/ThreadHandedness.md +14 -0
  491. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +14 -0
  492. package/dist/docs/reference/model/ThreadLeadInShape.md +14 -0
  493. package/dist/docs/reference/model/ThreadProfile.md +86 -0
  494. package/dist/docs/reference/model/ThreadRidgeOptions.md +18 -0
  495. package/dist/docs/reference/model/ThreadedNutBevel.md +14 -0
  496. package/dist/docs/reference/model/ThreadedNutOptions.md +273 -0
  497. package/dist/docs/reference/model/ThreadedNutPreflight.md +98 -0
  498. package/dist/docs/reference/model/ThreadedNutShape.md +14 -0
  499. package/dist/docs/reference/model/ThreadedRodOptions.md +245 -0
  500. package/dist/docs/reference/model/TorusOptions.md +110 -0
  501. package/dist/docs/reference/model/Transform2-type.md +256 -0
  502. package/dist/docs/reference/model/Transform2Input.md +20 -0
  503. package/dist/docs/reference/model/Transform2Matrix.md +15 -0
  504. package/dist/docs/reference/model/Transform3-type.md +296 -0
  505. package/dist/docs/reference/model/Transform3Input.md +20 -0
  506. package/dist/docs/reference/model/Transform3Matrix.md +18 -0
  507. package/dist/docs/reference/model/TriangleMesh.md +42 -0
  508. package/dist/docs/reference/model/TriangleMeshAnalysis.md +123 -0
  509. package/dist/docs/reference/model/TriangleMeshMeasurements.md +79 -0
  510. package/dist/docs/reference/model/TubeOptions.md +143 -0
  511. package/dist/docs/reference/model/Vector2-type.md +270 -0
  512. package/dist/docs/reference/model/Vector2Input.md +20 -0
  513. package/dist/docs/reference/model/Vector2Tuple.md +15 -0
  514. package/dist/docs/reference/model/Vector3-type.md +282 -0
  515. package/dist/docs/reference/model/Vector3Input.md +20 -0
  516. package/dist/docs/reference/model/Vector3Tuple.md +15 -0
  517. package/dist/docs/reference/model/VectorTextLayout.md +40 -0
  518. package/dist/docs/reference/model/VectorTextMetrics.md +100 -0
  519. package/dist/docs/reference/model/anchor.md +46 -0
  520. package/dist/docs/reference/model/box.md +62 -0
  521. package/dist/docs/reference/model/categories/boolean-operations.md +37 -0
  522. package/dist/docs/reference/model/categories/bounded-surfaces.md +26 -0
  523. package/dist/docs/reference/model/categories/contracts.md +16 -0
  524. package/dist/docs/reference/model/categories/core-values-errors.md +30 -0
  525. package/dist/docs/reference/model/categories/explicit-profiles.md +32 -0
  526. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +42 -0
  527. package/dist/docs/reference/model/categories/generation.md +44 -0
  528. package/dist/docs/reference/model/categories/inspection.md +23 -0
  529. package/dist/docs/reference/model/categories/mesh-inspection.md +29 -0
  530. package/dist/docs/reference/model/categories/primitives.md +61 -0
  531. package/dist/docs/reference/model/categories/resolution.md +18 -0
  532. package/dist/docs/reference/model/categories/sections.md +62 -0
  533. package/dist/docs/reference/model/categories/threads.md +50 -0
  534. package/dist/docs/reference/model/categories/transforms-placement.md +57 -0
  535. package/dist/docs/reference/model/circle.md +39 -0
  536. package/dist/docs/reference/model/components.md +71 -0
  537. package/dist/docs/reference/model/compose.md +31 -0
  538. package/dist/docs/reference/model/cylinder.md +52 -0
  539. package/dist/docs/reference/model/distance.md +45 -0
  540. package/dist/docs/reference/model/ellipse.md +39 -0
  541. package/dist/docs/reference/model/extrude.md +83 -0
  542. package/dist/docs/reference/model/generate.md +46 -0
  543. package/dist/docs/reference/model/gridPattern.md +80 -0
  544. package/dist/docs/reference/model/heightfield.md +40 -0
  545. package/dist/docs/reference/model/hull.md +74 -0
  546. package/dist/docs/reference/model/immutableBuffer.md +44 -0
  547. package/dist/docs/reference/model/immutableMesh.md +40 -0
  548. package/dist/docs/reference/model/implicit.md +47 -0
  549. package/dist/docs/reference/model/inspectSection.md +38 -0
  550. package/dist/docs/reference/model/inspectSolid.md +38 -0
  551. package/dist/docs/reference/model/internalThreadCutter.md +100 -0
  552. package/dist/docs/reference/model/intersect.md +70 -0
  553. package/dist/docs/reference/model/isEmpty.md +39 -0
  554. package/dist/docs/reference/model/linearPattern.md +80 -0
  555. package/dist/docs/reference/model/loft.md +137 -0
  556. package/dist/docs/reference/model/matchProfiles.md +42 -0
  557. package/dist/docs/reference/model/minkowskiSum.md +37 -0
  558. package/dist/docs/reference/model/pathPattern.md +118 -0
  559. package/dist/docs/reference/model/polygon.md +40 -0
  560. package/dist/docs/reference/model/preflightInternalThreadCutter.md +89 -0
  561. package/dist/docs/reference/model/preflightThreadedNut.md +100 -0
  562. package/dist/docs/reference/model/preflightThreadedRod.md +89 -0
  563. package/dist/docs/reference/model/radialPattern.md +113 -0
  564. package/dist/docs/reference/model/rayCast.md +40 -0
  565. package/dist/docs/reference/model/rectangle.md +59 -0
  566. package/dist/docs/reference/model/regularPolygon.md +39 -0
  567. package/dist/docs/reference/model/revolve.md +74 -0
  568. package/dist/docs/reference/model/solidFromMesh.md +42 -0
  569. package/dist/docs/reference/model/sphere.md +42 -0
  570. package/dist/docs/reference/model/split.md +54 -0
  571. package/dist/docs/reference/model/splitByPlane.md +66 -0
  572. package/dist/docs/reference/model/star.md +63 -0
  573. package/dist/docs/reference/model/stroke.md +74 -0
  574. package/dist/docs/reference/model/svgPathSection.md +65 -0
  575. package/dist/docs/reference/model/svgSection.md +64 -0
  576. package/dist/docs/reference/model/sweep.md +92 -0
  577. package/dist/docs/reference/model/textSection.md +57 -0
  578. package/dist/docs/reference/model/threadRidge.md +72 -0
  579. package/dist/docs/reference/model/threadedNut.md +110 -0
  580. package/dist/docs/reference/model/threadedRod.md +99 -0
  581. package/dist/docs/reference/model/toTriangleMesh.md +27 -0
  582. package/dist/docs/reference/model/torus.md +70 -0
  583. package/dist/docs/reference/model/transform2.md +39 -0
  584. package/dist/docs/reference/model/transform3.md +39 -0
  585. package/dist/docs/reference/model/tube.md +77 -0
  586. package/dist/docs/reference/model/union.md +72 -0
  587. package/dist/docs/reference/model/vector2.md +32 -0
  588. package/dist/docs/reference/model/vector3.md +39 -0
  589. package/dist/docs/reference/model.md +39 -0
  590. package/dist/docs/reference/text/Bounds2.md +34 -0
  591. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -0
  592. package/dist/docs/reference/text/Vector2Tuple.md +7 -0
  593. package/dist/docs/reference/text/VectorFont.md +186 -0
  594. package/dist/docs/reference/text/VectorFontOptions.md +17 -0
  595. package/dist/docs/reference/text/VectorTextArcBaseline.md +53 -0
  596. package/dist/docs/reference/text/VectorTextLayout.md +34 -0
  597. package/dist/docs/reference/text/VectorTextLayoutOptions.md +111 -0
  598. package/dist/docs/reference/text/VectorTextMetrics.md +94 -0
  599. package/dist/docs/reference/text/VectorTextOptions.md +50 -0
  600. package/dist/docs/reference/text/categories/font-preparation.md +38 -0
  601. package/dist/docs/reference/text/prepareVectorFont.md +46 -0
  602. package/dist/docs/reference/text.md +21 -0
  603. package/dist/engine/construction-operations.js +10 -3
  604. package/dist/engine/deferred-context.js +11 -172
  605. package/dist/engine/execution.js +1 -1
  606. package/dist/engine/export-3mf.js +2 -2
  607. package/dist/engine/finalization.js +3 -3
  608. package/dist/engine/loft-operations.js +4 -4
  609. package/dist/engine/native/adapter.js +1 -1
  610. package/dist/engine/native/regions.js +9 -9
  611. package/dist/engine/native/transforms.js +6 -1
  612. package/dist/engine/pattern-operations.js +24 -13
  613. package/dist/engine/placement.js +2 -2
  614. package/dist/engine/primitive-operations.js +10 -10
  615. package/dist/engine/primitive-profiles.js +1 -0
  616. package/dist/engine/profile-mesh.js +7 -7
  617. package/dist/engine/recipe-realization.js +29 -21
  618. package/dist/engine/section-operations.js +44 -17
  619. package/dist/engine/session-graph.js +6 -4
  620. package/dist/engine/session-native.js +1 -1
  621. package/dist/engine/session-snapshot.js +3 -2
  622. package/dist/engine/session.js +4 -5
  623. package/dist/engine/shape-anchors.js +3 -9
  624. package/dist/engine/transform-operations.js +42 -25
  625. package/dist/geometry/bounds.js +117 -0
  626. package/dist/geometry/cylinder.js +5 -1
  627. package/dist/geometry/edge-finishing.js +2 -2
  628. package/dist/geometry/heightfield.js +1 -1
  629. package/dist/geometry/index.js +20 -13
  630. package/dist/geometry/{loft-correspondence.js → loft/loft-correspondence.js} +3 -3
  631. package/dist/geometry/{loft-geometry.js → loft/loft-geometry.js} +8 -8
  632. package/dist/geometry/{loft-options.js → loft/loft-options.js} +2 -2
  633. package/dist/geometry/{loft-simple-mesh.js → loft/loft-simple-mesh.js} +6 -6
  634. package/dist/geometry/{loft-triangulation.js → loft/loft-triangulation.js} +6 -6
  635. package/dist/geometry/{loft.js → loft/loft.js} +8 -8
  636. package/dist/geometry/math/immutable-value.js +20 -0
  637. package/dist/geometry/math/vector-value.js +168 -0
  638. package/dist/geometry/math/vector2.js +80 -0
  639. package/dist/geometry/math/vector3.js +42 -8
  640. package/dist/geometry/mechanical/gear-motion.js +7 -4
  641. package/dist/geometry/mechanical/gears.js +2 -2
  642. package/dist/geometry/mechanical/thread-mesh.js +3 -3
  643. package/dist/geometry/mechanical/thread-profiles.js +2 -2
  644. package/dist/geometry/mechanical/thread-surface.js +14 -5
  645. package/dist/geometry/{mesh-centroid.js → mesh/mesh-centroid.js} +1 -1
  646. package/dist/geometry/{mesh-planar.js → mesh/mesh-planar.js} +1 -1
  647. package/dist/geometry/{mesh-quality.js → mesh/mesh-quality.js} +2 -2
  648. package/dist/geometry/{mesh-signature.js → mesh/mesh-signature.js} +2 -2
  649. package/dist/geometry/{mesh-solid-intersections.js → mesh/mesh-solid-intersections.js} +5 -1
  650. package/dist/geometry/{mesh-solid.js → mesh/mesh-solid.js} +2 -2
  651. package/dist/geometry/{mesh.js → mesh/mesh.js} +7 -8
  652. package/dist/geometry/paths/closest-point.js +74 -0
  653. package/dist/geometry/paths/frames.js +7 -8
  654. package/dist/geometry/patterns/options.js +1 -0
  655. package/dist/{engine/pattern-placements.js → geometry/patterns/placements.js} +22 -8
  656. package/dist/geometry/patterns.js +25 -0
  657. package/dist/geometry/primitive-resolution.js +4 -1
  658. package/dist/geometry/primitive-resolvers.js +9 -9
  659. package/dist/geometry/profiles/contour.js +3 -3
  660. package/dist/geometry/profiles/matched.js +3 -3
  661. package/dist/geometry/profiles/profiles.js +10 -10
  662. package/dist/geometry/profiles/rectangle.js +7 -7
  663. package/dist/geometry/profiles/shapes.js +9 -9
  664. package/dist/geometry/profiles/side-profile.js +37 -0
  665. package/dist/geometry/regions.js +15 -15
  666. package/dist/geometry/resolution.js +17 -5
  667. package/dist/geometry/revolve/revolve-mesh.js +5 -5
  668. package/dist/geometry/stroke-path.js +50 -46
  669. package/dist/geometry/svg/errors.js +0 -3
  670. package/dist/geometry/svg/fill.js +7 -7
  671. package/dist/geometry/svg/index.js +1 -1
  672. package/dist/geometry/svg/matrix.js +0 -114
  673. package/dist/geometry/svg/parser.js +1 -439
  674. package/dist/geometry/svg-import.js +3 -3
  675. package/dist/geometry/sweeps/stations.js +4 -4
  676. package/dist/geometry/sweeps/sweep-closed.js +4 -4
  677. package/dist/geometry/sweeps/sweep-mesh.js +1 -1
  678. package/dist/geometry/sweeps/sweep-open.js +6 -6
  679. package/dist/geometry/sweeps/validation.js +2 -2
  680. package/dist/geometry/text-fitting.js +85 -0
  681. package/dist/geometry/tolerance.js +2 -2
  682. package/dist/geometry/transform-chain.js +172 -0
  683. package/dist/geometry/transform-geometry.js +31 -27
  684. package/dist/geometry/transform-matrix.js +14 -0
  685. package/dist/geometry/transform2.js +60 -0
  686. package/dist/geometry/transform3.js +70 -26
  687. package/dist/index.js +3 -0
  688. package/dist/model/execution-binding.js +10 -5
  689. package/dist/model/generation.js +1 -1
  690. package/dist/model/geometry-recipes.js +15 -0
  691. package/dist/{engine → model}/immutable-generation-data.js +25 -3
  692. package/dist/model/operation-contracts.js +1 -0
  693. package/dist/model/operation-dispatch.js +13 -0
  694. package/dist/model/operations.js +40 -59
  695. package/dist/model/recipe-declaration.js +193 -0
  696. package/dist/model/shape-handles.js +15 -4
  697. package/package.json +10 -8
  698. package/dist/engine/geometry-recipes.js +0 -12
  699. /package/dist/geometry/{mesh-edge-table.js → mesh/mesh-edge-table.js} +0 -0
@@ -1,4 +1,4 @@
1
- import { cross3, dot3, length3, normalize3, projectOntoPlane3, rotateAroundAxis3, scale3, subtract3, } from "../math/vector3.js";
1
+ import { cross3, dot3, length3, normalize3, projectOntoPlane3, rotateAroundAxis3Radians, scale3, subtract3, } from "../math/vector3.js";
2
2
  import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
3
3
  const tangentAt = (path, index) => {
4
4
  if (index === 0) {
@@ -32,7 +32,7 @@ const transportNormal = (normal, previousTangent, tangent) => {
32
32
  if (sine > 1e-10) {
33
33
  const axis = scale3(rotationAxis, 1 / sine);
34
34
  const cosine = Math.max(-1, Math.min(1, dot3(previousTangent, tangent)));
35
- transported = rotateAroundAxis3(normal, axis, Math.atan2(sine, cosine));
35
+ transported = rotateAroundAxis3Radians(normal, axis, Math.atan2(sine, cosine));
36
36
  }
37
37
  return normalize3(projectOntoPlane3(transported, tangent));
38
38
  };
@@ -88,11 +88,10 @@ const signedAngleAround = (from, to, axis) => Math.atan2(dot3(axis, cross3(from,
88
88
  /**
89
89
  * Builds rotation-minimizing frames for a non-duplicated closed path.
90
90
  *
91
- * Centered cyclic tangents are parallel-transported around the loop. The seam
92
- * holonomy is measured by transporting the last normal back to the first
93
- * tangent, then its residual rotation is distributed uniformly over all path
94
- * intervals. This avoids a single visible seam or an accumulated frame flip.
95
- * The maxPathPoints ceiling (default100000) bounds path points and frames.
91
+ * Centered cyclic tangents are parallel-transported around the loop. Transporting the last
92
+ * normal back to the first tangent measures seam holonomy; distributing that residual rotation
93
+ * uniformly over all path intervals avoids a visible seam or accumulated frame flip.
94
+ * The maxPathPoints ceiling (default 100000) bounds path points and frames.
96
95
  */
97
96
  export const computeClosedParallelTransportFrames = (path, initialNormal, limits = {}) => {
98
97
  if (path.length < 3) {
@@ -108,7 +107,7 @@ export const computeClosedParallelTransportFrames = (path, initialNormal, limits
108
107
  const seamCorrection = signedAngleAround(seamNormal, transportedNormals[0], tangents[0]);
109
108
  return tangents.map((tangent, index) => {
110
109
  const correction = (seamCorrection * index) / path.length;
111
- const normal = normalize3(projectOntoPlane3(rotateAroundAxis3(transportedNormals[index], tangent, correction), tangent));
110
+ const normal = normalize3(projectOntoPlane3(rotateAroundAxis3Radians(transportedNormals[index], tangent, correction), tangent));
112
111
  return {
113
112
  tangent,
114
113
  normal,
@@ -0,0 +1 @@
1
+ export {};
@@ -1,8 +1,8 @@
1
- import { GeometryError } from "../geometry/errors.js";
2
- import { cross3, dot3, scale3 } from "../geometry/math/vector3.js";
3
- import { distributeAlongPath } from "../geometry/paths/planar.js";
4
- import { normalizeSweepPath } from "../geometry/sweeps/validation.js";
5
- import { composeTransform3, frameTransform3, IDENTITY_TRANSFORM3, rotationTransform3, translationTransform3, } from "../geometry/transform3.js";
1
+ import { GeometryError } from "../errors.js";
2
+ import { cross3, dot3, scale3 } from "../math/vector3.js";
3
+ import { distributeAlongPath } from "../paths/planar.js";
4
+ import { normalizeSweepPath } from "../sweeps/validation.js";
5
+ import { composeTransform3, frameTransform3, IDENTITY_TRANSFORM3, rotationTransform3, translationTransform3, } from "../transform3.js";
6
6
  const fail = (operation, message) => {
7
7
  throw new GeometryError("INVALID_ARGUMENT", message, { operation });
8
8
  };
@@ -24,7 +24,7 @@ const finite = (value, operation) => {
24
24
  return value;
25
25
  };
26
26
  const vector = (value, operation) => {
27
- if (!Array.isArray(value) || value.length !== 3 || !value.every(Number.isFinite))
27
+ if (!Array.isArray(value) || value.length !== 3 || !Array.from(value).every(Number.isFinite))
28
28
  fail(operation, "Pattern vectors require three finite coordinates.");
29
29
  return value;
30
30
  };
@@ -111,16 +111,30 @@ export function gridPatternPlan(options) {
111
111
  fail(operation, "Grid count and spacing require matching XY or XYZ tuples.");
112
112
  if (options.center !== undefined && typeof options.center !== "boolean")
113
113
  fail(operation, "Grid center must be a boolean.");
114
- const counts = [options.count[0], options.count[1], options.count[2] ?? 1];
114
+ const counts = [options.count[0], options.count[1], dimensions === 3 ? options.count[2] : 1];
115
115
  counts.forEach((count) => patternCount(count, operation));
116
116
  const count = patternCount(counts[0] * counts[1] * counts[2], operation);
117
- const spacing = [options.spacing[0], options.spacing[1], options.spacing[2] ?? 0];
117
+ const spacing = [
118
+ options.spacing[0],
119
+ options.spacing[1],
120
+ dimensions === 3 ? options.spacing[2] : 0,
121
+ ];
118
122
  const extent = spacing.map((distance, axis) => {
119
123
  finite(distance, operation);
120
124
  if (counts[axis] > 1 && distance === 0)
121
125
  fail(operation, "Repeated grid axes require nonzero spacing.");
122
126
  return finite(distance * (counts[axis] - 1), operation);
123
127
  });
128
+ if (options.frame !== undefined) {
129
+ optionsObject(options.frame, operation);
130
+ for (const coordinates of [
131
+ options.frame.origin,
132
+ options.frame.xAxis,
133
+ options.frame.yAxis,
134
+ options.frame.zAxis,
135
+ ])
136
+ vector(coordinates, operation);
137
+ }
124
138
  const frame = options.frame === undefined ? IDENTITY_TRANSFORM3 : frameTransform3(options.frame);
125
139
  return {
126
140
  count,
@@ -0,0 +1,25 @@
1
+ import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "./patterns/placements.js";
2
+ import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
3
+ function transforms(plan) {
4
+ return Object.freeze(Array.from({ length: plan.count }, (_, index) => Object.freeze(plan.transformAt(index))));
5
+ }
6
+ /** Equal linear placements in millimetres, including the original at the origin. */
7
+ export function linearPatternTransforms(options) {
8
+ return transforms(linearPatternPlan(options));
9
+ }
10
+ /** Rotations about an explicit axis; angles use degrees and the first placement is identity. */
11
+ export function radialPatternTransforms(options) {
12
+ return transforms(radialPatternPlan(options));
13
+ }
14
+ /** XY or XYZ grid placements in millimetres, in X-fastest order. */
15
+ export function gridPatternTransforms(options) {
16
+ return transforms(gridPatternPlan(options));
17
+ }
18
+ /**
19
+ * Equal physical arc-length placements along a sampled XYZ path. Tangent orientation maps +Z
20
+ * onto the local path tangent; fixed orientation only translates. Closed paths omit a repeated seam.
21
+ * Explicit sampling ceilings bound both input points and output placements.
22
+ */
23
+ export function pathPatternTransforms(path, options, limits) {
24
+ return transforms(pathPatternPlan(path, options, resolveGeometrySamplingLimits(limits)));
25
+ }
@@ -8,7 +8,10 @@ import { assertSamplingCount, resolveGeometrySamplingLimits } from "./sampling-l
8
8
  */
9
9
  export function resolveCircularPrimitiveSegments(radius, options, operation) {
10
10
  if (options.segments === undefined) {
11
- return resolveCircularSegments(radius, options.resolution, options.limits);
11
+ return resolveCircularSegments(radius, {
12
+ ...options.resolution,
13
+ sizing: options.sizing ?? "vertex",
14
+ }, options.limits);
12
15
  }
13
16
  if (!Number.isSafeInteger(options.segments) || options.segments < 3)
14
17
  throw new GeometryError("INVALID_ARGUMENT", "segments must be a safe integer of at least three.", { operation, details: { value: options.segments } });
@@ -112,17 +112,17 @@ export function resolveBoxPrimitive(options) {
112
112
  if (selections.length === 0 || selections.length > 12)
113
113
  throw new GeometryError("INVALID_ARGUMENT", "Box treatments require a nonempty map of nominal edges or groups.", { operation });
114
114
  const cuts = [];
115
+ const selectedEdges = new Set();
115
116
  for (const [selection, selected] of selections) {
116
117
  const setbacks = edgeTreatmentSetbacks(selected, operation, Math.PI / 2, options.limits);
117
- if (setbacks.some((value) => value <= 0))
118
- throw new GeometryError("INVALID_ARGUMENT", "Box treatments require positive setbacks.", {
119
- operation,
120
- });
121
118
  for (const edge of expandBoxEdges(selection)) {
122
- if (cuts.some((cut) => cut.edge === edge))
119
+ if (selectedEdges.has(edge))
123
120
  throw new GeometryError("INVALID_ARGUMENT", "Box edge selections must not overlap.", {
124
121
  operation,
125
122
  });
123
+ selectedEdges.add(edge);
124
+ if (setbacks[0] === 0 && setbacks[1] === 0)
125
+ continue;
126
126
  const [first, second] = edge.split("-"), a = boxFaceAxes[first][0], b = boxFaceAxes[second][0];
127
127
  if (setbacks[0] >= dimensions[b] || setbacks[1] >= dimensions[a])
128
128
  throw new GeometryError("INVALID_ARGUMENT", "Box edge setbacks must fit their adjoining dimensions.", { operation });
@@ -134,6 +134,8 @@ export function resolveBoxPrimitive(options) {
134
134
  });
135
135
  }
136
136
  }
137
+ if (cuts.length === 0)
138
+ return base;
137
139
  for (const cut of cuts) {
138
140
  const [first, second] = cut.edge.split("-"), [a, sa] = boxFaceAxes[first], [b, sb] = boxFaceAxes[second];
139
141
  for (const other of cuts) {
@@ -167,10 +169,8 @@ export function resolveBoxPrimitive(options) {
167
169
  };
168
170
  }
169
171
  const setbacks = edgeTreatmentSetbacks(treatment, operation, Math.PI / 2, options.limits);
170
- if (setbacks.some((value) => value <= 0))
171
- throw new GeometryError("INVALID_ARGUMENT", "Box treatments require positive setbacks.", {
172
- operation,
173
- });
172
+ if (setbacks[0] === 0 && setbacks[1] === 0)
173
+ return base;
174
174
  const distance = setbacks[0];
175
175
  assertPositivePrimitive(distance, "edge treatment size", operation);
176
176
  const inner = [
@@ -1,6 +1,6 @@
1
1
  import { sampleCurve2 } from "../curves/sampling.js";
2
2
  import { GeometryError } from "../errors.js";
3
- import { normalizeLoop2 } from "../regions.js";
3
+ import { normalizeContour } from "../regions.js";
4
4
  import { resolveGeometrySamplingLimits } from "../sampling-limits.js";
5
5
  import { requireProfileVertexCount } from "./validation.js";
6
6
  const OPERATION = "sampleContour";
@@ -12,7 +12,7 @@ function invalid(message) {
12
12
  * Physical scaling precedes adaptive curve sampling; the final end must repeat start exactly.
13
13
  * Shared anchors and the closing seam are emitted once. Winding normalization may change the
14
14
  * starting vertex. The sampled loop is checked for self-intersection and degeneracy by
15
- * `normalizeLoop2`; this is a single contour without holes. No editor modes or normalized
15
+ * `normalizeContour`; this is a single contour without holes. No editor modes or normalized
16
16
  * coordinate range are required. No native engine, SDK, or ambient resolution is used.
17
17
  *
18
18
  * @param curve - Closed contour in millimetres unless positive scales convert its coordinates.
@@ -98,5 +98,5 @@ export function sampleContour(curve, options = {}) {
98
98
  output.push(sampled[pointIndex]);
99
99
  start = end;
100
100
  }
101
- return normalizeLoop2(output, true);
101
+ return normalizeContour(output, true);
102
102
  }
@@ -1,7 +1,7 @@
1
1
  import { planarCubicControl } from "../curves/evaluation.js";
2
2
  import { resolveLineSegmentCount, resolveUniformCubicSegments } from "../curves/sampling.js";
3
3
  import { GeometryError } from "../errors.js";
4
- import { normalizeRegion2, signedAreaLoop2 } from "../regions.js";
4
+ import { normalizeRegion, signedContourArea } from "../regions.js";
5
5
  import { resolveArcSegments, resolveGeometryResolution } from "../resolution.js";
6
6
  import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling-limits.js";
7
7
  import { createProfileSpanSampler } from "./span-sampling.js";
@@ -167,7 +167,7 @@ export function matchProfiles(profiles, options = {}) {
167
167
  spans.push(span.id);
168
168
  }
169
169
  });
170
- const area = signedAreaLoop2(points);
170
+ const area = signedContourArea(points);
171
171
  if (!(contourIndex === 0 ? area > 0 : area < 0))
172
172
  fail("Outer contours must be CCW and holes CW; matching never reorders winding.");
173
173
  return Object.freeze({
@@ -183,7 +183,7 @@ export function matchProfiles(profiles, options = {}) {
183
183
  });
184
184
  });
185
185
  // This validates intersections and containment, without changing logical slots or topology.
186
- normalizeRegion2(components.map((component) => ({
186
+ normalizeRegion(components.map((component) => ({
187
187
  outer: component.outer.points,
188
188
  holes: component.holes.map((hole) => hole.points),
189
189
  })));
@@ -2,17 +2,17 @@ import { GeometryError } from "../errors.js";
2
2
  import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
3
3
  import { assertPrimitiveOptions } from "../primitive-resolvers.js";
4
4
  import { requireFiniteProfileValues, requireProfileVertexCount } from "./validation.js";
5
- export { rectangleLoop } from "./rectangle.js";
5
+ export { rectangleContour } from "./rectangle.js";
6
6
  /**
7
7
  * Creates an immutable centered CCW circle with +X seam and vertex or face radial sizing.
8
8
  *
9
9
  * @example Explicit circular point data
10
10
  * ```ts
11
- * circleLoop({ diameter: 20, segments: 32 });
11
+ * circleContour({ diameter: 20, segments: 32 });
12
12
  * ```
13
13
  */
14
- export const circleLoop = (options) => {
15
- const operation = "circleLoop";
14
+ export const circleContour = (options) => {
15
+ const operation = "circleContour";
16
16
  assertPrimitiveOptions(options, operation);
17
17
  if ((options.radius === undefined) === (options.diameter === undefined)) {
18
18
  throw new GeometryError("INVALID_ARGUMENT", "Specify exactly one radius or diameter.", {
@@ -44,11 +44,11 @@ export const circleLoop = (options) => {
44
44
  *
45
45
  * @example Hexagon sized to its faces
46
46
  * ```ts
47
- * regularPolygonLoop({ radius: 10, sides: 6, sizing: "face" });
47
+ * regularPolygonContour({ radius: 10, sides: 6, sizing: "face" });
48
48
  * ```
49
49
  */
50
- export const regularPolygonLoop = (options) => {
51
- const operation = "regularPolygonLoop";
50
+ export const regularPolygonContour = (options) => {
51
+ const operation = "regularPolygonContour";
52
52
  const { radius, sides, rotationDegrees = 0, sizing = "vertex" } = options;
53
53
  requireFiniteProfileValues([radius, rotationDegrees], operation);
54
54
  if (!(radius > 0)) {
@@ -72,11 +72,11 @@ export const regularPolygonLoop = (options) => {
72
72
  *
73
73
  * @example Five-point outline
74
74
  * ```ts
75
- * starLoop(12, 5, 6);
75
+ * starContour(12, 5, 6);
76
76
  * ```
77
77
  */
78
- export const starLoop = (outerRadius, points, innerRadius = outerRadius / 2, limits = {}) => {
79
- const operation = "starLoop";
78
+ export const starContour = (outerRadius, points, innerRadius = outerRadius / 2, limits = {}) => {
79
+ const operation = "starContour";
80
80
  requireFiniteProfileValues([outerRadius, innerRadius], operation);
81
81
  if (!(outerRadius > 0) || !(innerRadius > 0) || innerRadius >= outerRadius) {
82
82
  throw new GeometryError("INVALID_ARGUMENT", "Star radii must be positive, with the inner radius smaller than the outer.", { operation });
@@ -65,7 +65,7 @@ export function rectangleCornerSegments(corner, limits) {
65
65
  const selected = resolveModelingLimits(limits);
66
66
  const exact = corner.segments ?? corner.resolution?.circularSegments;
67
67
  if (exact !== undefined && Number.isSafeInteger(exact) && exact >= 3)
68
- assertSamplingCount(exact, "rectangleLoop", selected.maxCircularSegments);
68
+ assertSamplingCount(exact, "rectangleContour", selected.maxCircularSegments);
69
69
  if (corner.radius === 0 &&
70
70
  corner.segments === undefined &&
71
71
  corner.resolution?.circularSegments === undefined)
@@ -83,11 +83,11 @@ export function rectangleCornerSegments(corner, limits) {
83
83
  *
84
84
  * @example Rounded rectangle outline
85
85
  * ```ts
86
- * rectangleLoop({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
86
+ * rectangleContour({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
87
87
  * ```
88
88
  */
89
- export function rectangleLoop(options) {
90
- const { width, height, corners, limits } = resolveRectangle(options, "rectangleLoop");
89
+ export function rectangleContour(options) {
90
+ const { width, height, corners, limits } = resolveRectangle(options, "rectangleContour");
91
91
  const counts = corners.map((corner) => {
92
92
  if (corner.kind === "square")
93
93
  return 1;
@@ -95,9 +95,9 @@ export function rectangleLoop(options) {
95
95
  const intervals = rectangleCornerSegments(corner, limits);
96
96
  return corner.radius > 0 ? intervals + 1 : 1;
97
97
  }
98
- return edgeTreatmentPointCount(corner, "rectangleLoop", { limits });
98
+ return edgeTreatmentPointCount(corner, "rectangleContour", { limits });
99
99
  });
100
- requireProfileVertexCount(counts.reduce((sum, count) => sum + count, 0), 3, "rectangleLoop", limits);
100
+ requireProfileVertexCount(counts.reduce((sum, count) => sum + count, 0), 3, "rectangleContour", limits);
101
101
  const x = width / 2, y = height / 2;
102
102
  const vertices = [
103
103
  [x, y],
@@ -131,7 +131,7 @@ export function rectangleLoop(options) {
131
131
  }
132
132
  const samples = corner.kind === "square"
133
133
  ? [[0, 0]]
134
- : sampleEdgeTreatment(corner, "rectangleLoop", { limits });
134
+ : sampleEdgeTreatment(corner, "rectangleContour", { limits });
135
135
  for (const [a, b] of samples)
136
136
  points.push([
137
137
  vertices[index][0] + incoming[index][0] * a + outgoing[index][0] * b,
@@ -7,33 +7,33 @@ import { requireFiniteProfileValues, requireProfileVertexCount } from "./validat
7
7
  *
8
8
  * @example Ellipse by full dimensions
9
9
  * ```ts
10
- * ellipseLoop({ size: [30, 20] });
10
+ * ellipseContour({ size: [30, 20] });
11
11
  * ```
12
12
  */
13
- export function ellipseLoop(options) {
14
- assertPrimitiveOptions(options, "ellipseLoop");
13
+ export function ellipseContour(options) {
14
+ assertPrimitiveOptions(options, "ellipseContour");
15
15
  if ((options.radius === undefined) === (options.size === undefined)) {
16
16
  throw new GeometryError("INVALID_ARGUMENT", "Specify exactly one radius or size tuple.", {
17
- operation: "ellipseLoop",
17
+ operation: "ellipseContour",
18
18
  });
19
19
  }
20
20
  const dimensions = options.radius ?? options.size;
21
21
  if (!Array.isArray(dimensions) || dimensions.length !== 2) {
22
22
  throw new GeometryError("INVALID_ARGUMENT", "Ellipse dimensions must be an exact XY tuple.", {
23
- operation: "ellipseLoop",
23
+ operation: "ellipseContour",
24
24
  });
25
25
  }
26
26
  const factor = options.radius === undefined ? 0.5 : 1;
27
27
  const radiusX = dimensions[0] * factor;
28
28
  const radiusY = dimensions[1] * factor;
29
- requireFiniteProfileValues([radiusX, radiusY], "ellipseLoop");
29
+ requireFiniteProfileValues([radiusX, radiusY], "ellipseContour");
30
30
  if (![radiusX, radiusY].every((value) => Number.isFinite(value) && value > 0)) {
31
31
  throw new GeometryError("INVALID_ARGUMENT", "Ellipse radii must be finite and positive.", {
32
- operation: "ellipseLoop",
32
+ operation: "ellipseContour",
33
33
  });
34
34
  }
35
- const segments = resolveCircularPrimitiveSegments(Math.max(radiusX, radiusY), options, "ellipseLoop");
36
- requireProfileVertexCount(segments, 3, "ellipseLoop", options.limits);
35
+ const segments = resolveCircularPrimitiveSegments(Math.max(radiusX, radiusY), options, "ellipseContour");
36
+ requireProfileVertexCount(segments, 3, "ellipseContour", options.limits);
37
37
  return Object.freeze(Array.from({ length: segments }, (_, index) => {
38
38
  const angle = (index * Math.PI * 2) / segments;
39
39
  return Object.freeze([radiusX * Math.cos(angle), radiusY * Math.sin(angle)]);
@@ -1,4 +1,5 @@
1
1
  import { GeometryError } from "../errors.js";
2
+ import { normalizeContour } from "../regions.js";
2
3
  import { resolveGeometryResolution } from "../resolution.js";
3
4
  import { resolveGeometrySamplingLimits } from "../sampling-limits.js";
4
5
  import { requireProfileVertexCount } from "./validation.js";
@@ -135,3 +136,39 @@ export function sampleSideProfile(curve, options = {}) {
135
136
  }
136
137
  return Object.freeze(output);
137
138
  }
139
+ /**
140
+ * Closes an open, strictly upward [radius, height] side outline to the radius-zero axis.
141
+ * Adds horizontal bottom/top edges at the endpoint heights, retaining axis endpoints once.
142
+ * Returns a counterclockwise filled-boundary contour without a repeated seam vertex.
143
+ * Radii must be nonnegative; the result must enclose nonzero area without touching itself.
144
+ * This is a solid-body closure, not a hollow-wall or mounting-bore construction.
145
+ */
146
+ export function closeToAxis(side, limits) {
147
+ const operation = "closeToAxis";
148
+ const arrayShape = Array.isArray(side);
149
+ if (!arrayShape || side.length < 2)
150
+ throw new GeometryError("INVALID_ARGUMENT", "A side outline needs at least two points.", {
151
+ operation,
152
+ });
153
+ requireProfileVertexCount(side.length, 2, operation, limits);
154
+ for (let index = 0; index < side.length; index++) {
155
+ const point = side[index];
156
+ const pointShape = Array.isArray(point) && point.length === 2;
157
+ if (!pointShape ||
158
+ !point.every(Number.isFinite) ||
159
+ point[0] < 0 ||
160
+ (index > 0 && point[1] <= side[index - 1][1]))
161
+ throw new GeometryError("INVALID_ARGUMENT", "Side points require finite nonnegative radii and strictly increasing heights.", { operation });
162
+ }
163
+ const first = side[0];
164
+ const last = side.at(-1);
165
+ requireProfileVertexCount(side.length + Number(first[0] !== 0) + Number(last[0] !== 0), 3, operation, limits);
166
+ const contour = [];
167
+ if (first[0] !== 0)
168
+ contour.push([0, first[1]]);
169
+ for (const point of side)
170
+ contour.push(point);
171
+ if (last[0] !== 0)
172
+ contour.push([0, last[1]]);
173
+ return normalizeContour(contour, true);
174
+ }
@@ -28,7 +28,7 @@ const coordinateScale = (loop) => {
28
28
  return Math.max(maxX - minX, maxY - minY);
29
29
  };
30
30
  /** Returns the signed area of a non-duplicated loop; positive means CCW. */
31
- export function signedAreaLoop2(loop) {
31
+ export function signedContourArea(loop) {
32
32
  if (loop.length === 0)
33
33
  return 0;
34
34
  const origin = loop[0];
@@ -48,7 +48,7 @@ export function signedAreaLoop2(loop) {
48
48
  return (twiceArea + correction) / 2;
49
49
  }
50
50
  /** Returns true when a point lies inside or on the boundary of a loop. */
51
- export function loopContainsPoint(loop, point) {
51
+ export function contourContainsPoint(loop, point) {
52
52
  let inside = false;
53
53
  for (let index = 0, previous = loop.length - 1; index < loop.length; previous = index++) {
54
54
  const a = loop[index];
@@ -128,7 +128,7 @@ const boundedSegments = (loop, epsilon) => loop.map((a, index) => {
128
128
  const consumeIntersectionCandidate = (budget) => {
129
129
  budget.candidates += 1;
130
130
  if (budget.candidates > MAX_INTERSECTION_CANDIDATES) {
131
- throw new GeometryError("COMPLEXITY_LIMIT", "Region validation exceeds the 2000000 intersection-candidate work limit.", { operation: "normalizeRegion2", details: { maximumCandidates: MAX_INTERSECTION_CANDIDATES } });
131
+ throw new GeometryError("COMPLEXITY_LIMIT", "Region validation exceeds the 2000000 intersection-candidate work limit.", { operation: "normalizeRegion", details: { maximumCandidates: MAX_INTERSECTION_CANDIDATES } });
132
132
  }
133
133
  };
134
134
  const boundedIntersections = (segments, epsilon, budget, sameLoop) => {
@@ -170,7 +170,7 @@ const loopsIntersect = (a, b, epsilon, budget) => a === b ||
170
170
  * result must be simple and have non-zero area. Previously validated immutable results may be
171
171
  * returned unchanged when their winding and tolerance policy match.
172
172
  */
173
- export function normalizeLoop2(input, counterClockwise, tolerance = {}) {
173
+ export function normalizeContour(input, counterClockwise, tolerance = {}) {
174
174
  return normalizeLoopWithBudget(input, counterClockwise, tolerance, { candidates: 0 });
175
175
  }
176
176
  const normalizeLoopWithBudget = (input, counterClockwise, tolerance, budget) => {
@@ -199,7 +199,7 @@ const normalizeLoopWithBudget = (input, counterClockwise, tolerance, budget) =>
199
199
  if (boundedIntersections(boundedSegments(cleaned, resolved.linear), resolved.linear, budget, true)) {
200
200
  throw new GeometryError("SELF_INTERSECTION", "A loop must not self-intersect.");
201
201
  }
202
- const area = signedAreaLoop2(cleaned);
202
+ const area = signedContourArea(cleaned);
203
203
  if (!Number.isFinite(area)) {
204
204
  throw new GeometryError("NON_FINITE_VALUE", "Loop area must be finite.");
205
205
  }
@@ -223,7 +223,7 @@ const normalizeLoopWithBudget = (input, counterClockwise, tolerance, budget) =>
223
223
  * within its exterior and boundaries may not intersect. Previously validated immutable results
224
224
  * may be returned unchanged under the same tolerance policy.
225
225
  */
226
- export function normalizePolygon2(polygon, tolerance = {}) {
226
+ export function normalizePolygon(polygon, tolerance = {}) {
227
227
  return normalizePolygonWithBudget(polygon, tolerance, { candidates: 0 });
228
228
  }
229
229
  const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
@@ -236,7 +236,7 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
236
236
  const epsilon = resolveGeometryTolerance(scale, policy).linear;
237
237
  for (let index = 0; index < holes.length; index += 1) {
238
238
  const hole = holes[index];
239
- if (!loopContainsPoint(outer, hole[0]) || loopsIntersect(outer, hole, epsilon, budget)) {
239
+ if (!contourContainsPoint(outer, hole[0]) || loopsIntersect(outer, hole, epsilon, budget)) {
240
240
  throw new GeometryError("INVALID_TOPOLOGY", "Every hole must lie inside its exterior.");
241
241
  }
242
242
  }
@@ -254,8 +254,8 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
254
254
  if (!boundsOverlap(previous, current, 2 * epsilon))
255
255
  continue;
256
256
  if (loopsIntersect(previous.loop, current.loop, epsilon, budget) ||
257
- loopContainsPoint(previous.loop, current.loop[0]) ||
258
- loopContainsPoint(current.loop, previous.loop[0])) {
257
+ contourContainsPoint(previous.loop, current.loop[0]) ||
258
+ contourContainsPoint(current.loop, previous.loop[0])) {
259
259
  throw new GeometryError("INVALID_TOPOLOGY", "Polygon holes must be disjoint.");
260
260
  }
261
261
  }
@@ -273,7 +273,7 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
273
273
  * Validates a disjoint explicit region and returns immutable normalized data.
274
274
  * Previously validated immutable results may be returned unchanged under the same tolerance policy.
275
275
  */
276
- export function normalizeRegion2(region, tolerance = {}) {
276
+ export function normalizeRegion(region, tolerance = {}) {
277
277
  const policy = resolveGeometryTolerance(1, tolerance);
278
278
  if (samePolicy(normalizedRegions.get(region), policy))
279
279
  return region;
@@ -284,8 +284,8 @@ export function normalizeRegion2(region, tolerance = {}) {
284
284
  }
285
285
  const budget = { candidates: 0 };
286
286
  const polygons = region.map((polygon) => normalizePolygonWithBudget(polygon, policy, budget));
287
- const containsFilledPoint = (polygon, point) => loopContainsPoint(polygon.outer, point) &&
288
- !polygon.holes.some((hole) => loopContainsPoint(hole, point));
287
+ const containsFilledPoint = (polygon, point) => contourContainsPoint(polygon.outer, point) &&
288
+ !polygon.holes.some((hole) => contourContainsPoint(hole, point));
289
289
  // Broad phase preserves exact contact semantics while avoiding pairwise loop
290
290
  // walks for separated polygons (for example many disconnected QR modules).
291
291
  const bounded = polygons
@@ -336,7 +336,7 @@ export function normalizeRegion2(region, tolerance = {}) {
336
336
  * Returns the total filled area of a normalized region in square millimetres.
337
337
  *
338
338
  * Each polygon contributes its outer-loop area minus the areas of its holes. An empty region has
339
- * zero area. Call {@link normalizeRegion2} first when input winding or topology is not already
339
+ * zero area. Call {@link normalizeRegion} first when input winding or topology is not already
340
340
  * canonical.
341
341
  *
342
342
  * @param region - Normalized disjoint polygons with CCW outers and clockwise holes.
@@ -344,8 +344,8 @@ export function normalizeRegion2(region, tolerance = {}) {
344
344
  */
345
345
  export function regionArea(region) {
346
346
  return region.reduce((total, polygon) => total +
347
- Math.abs(signedAreaLoop2(polygon.outer)) -
348
- polygon.holes.reduce((holeTotal, hole) => holeTotal + Math.abs(signedAreaLoop2(hole)), 0), 0);
347
+ Math.abs(signedContourArea(polygon.outer)) -
348
+ polygon.holes.reduce((holeTotal, hole) => holeTotal + Math.abs(signedContourArea(hole)), 0), 0);
349
349
  }
350
350
  /** Returns finite axis-aligned bounds for a non-empty region. */
351
351
  export function regionBounds(region) {
@@ -55,12 +55,17 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
55
55
  minimumSegments,
56
56
  });
57
57
  }
58
- const requiredFullCircleSegments = (radius, resolution) => {
59
- const chordAngle = 2 * Math.acos(Math.max(-1, Math.min(1, 1 - resolution.maxChordError / radius)));
58
+ const requiredFullCircleSegments = (radius, resolution, sizing) => {
59
+ const chordAngle = 2 *
60
+ Math.acos(sizing === "face"
61
+ ? 1 / (1 + resolution.maxChordError / radius)
62
+ : Math.max(-1, Math.min(1, 1 - resolution.maxChordError / radius)));
60
63
  const chordSegments = chordAngle === 0 ? Number.POSITIVE_INFINITY : Math.ceil((Math.PI * 2) / chordAngle);
61
64
  const lengthSegments = resolution.maxSegmentLength === undefined
62
65
  ? 0
63
- : Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
66
+ : sizing === "face"
67
+ ? Math.ceil(Math.PI / Math.atan(resolution.maxSegmentLength / radius / 2))
68
+ : Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
64
69
  return Math.max(resolution.minimumSegments, chordSegments, lengthSegments);
65
70
  };
66
71
  const assertRadius = (radius, operation) => {
@@ -75,7 +80,8 @@ const assertRadius = (radius, operation) => {
75
80
  * Resolves a deterministic full-circle segment count for one radius.
76
81
  *
77
82
  * An exact `circularSegments` value wins. Otherwise the smallest regular polygon satisfying both
78
- * physical error criteria is used. A safety cap that would violate either criterion raises
83
+ * physical error criteria is used. Face sizing bounds the circumscribed polygon's outward
84
+ * excess and actual edge length. A safety cap that would violate either criterion raises
79
85
  * `COMPLEXITY_LIMIT` rather than silently reducing quality.
80
86
  *
81
87
  * @param radius - Circle radius in millimetres.
@@ -94,10 +100,13 @@ const assertRadius = (radius, operation) => {
94
100
  export function resolveCircularSegments(radius, policy = {}, limits = {}) {
95
101
  const operation = "resolveCircularSegments";
96
102
  assertRadius(radius, operation);
103
+ const sizing = policy.sizing ?? "vertex";
104
+ if (sizing !== "vertex" && sizing !== "face")
105
+ invalid("sizing must be vertex or face.");
97
106
  const resolution = resolveGeometryResolution(policy, limits);
98
107
  if (resolution.circularSegments !== undefined)
99
108
  return resolution.circularSegments;
100
- const required = requiredFullCircleSegments(radius, resolution);
109
+ const required = requiredFullCircleSegments(radius, resolution, sizing);
101
110
  if (required > resolution.maximumSegments) {
102
111
  throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maximumSegments}-segment safety limit.`, {
103
112
  operation,
@@ -151,6 +160,8 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
151
160
  export function resolveAlignedCircularSegments(radius, options) {
152
161
  const operation = "resolveAlignedCircularSegments";
153
162
  assertRadius(radius, operation);
163
+ if (options.sizing !== undefined && options.sizing !== "vertex" && options.sizing !== "face")
164
+ invalid("sizing must be vertex or face.");
154
165
  const alignTo = options.alignTo;
155
166
  const hasArrayShape = Array.isArray(alignTo);
156
167
  if (!hasArrayShape || alignTo.length === 0) {
@@ -186,6 +197,7 @@ export function resolveAlignedCircularSegments(radius, options) {
186
197
  }
187
198
  const baseSegments = resolveCircularSegments(radius, {
188
199
  ...resolution,
200
+ sizing: options.sizing ?? "vertex",
189
201
  }, options.limits);
190
202
  const requiredSegments = Math.max(baseSegments, minimumSegments);
191
203
  const multiplier = Math.ceil(requiredSegments / alignment);
@@ -1,10 +1,10 @@
1
1
  import { GeometryError } from "../errors.js";
2
- import { triangulateLoop2 } from "../loft.js";
3
- import { validateTriangleMesh } from "../mesh.js";
2
+ import { triangulateContour } from "../loft/loft.js";
3
+ import { validateTriangleMesh } from "../mesh/mesh.js";
4
4
  import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
5
5
  import { writeMeshVertex } from "../numeric.js";
6
6
  import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
7
- import { normalizeLoop2 } from "../regions.js";
7
+ import { normalizeContour } from "../regions.js";
8
8
  import { assertSamplingCount } from "../sampling-limits.js";
9
9
  const AXIS_EPSILON = 1e-10;
10
10
  /**
@@ -52,7 +52,7 @@ export const revolveMesh = (profile, options = {}) => {
52
52
  }
53
53
  maximumRadius = Math.max(maximumRadius, radius);
54
54
  }
55
- profile = normalizeLoop2(profile, true);
55
+ profile = normalizeContour(profile, true);
56
56
  const circularSegments = resolveCircularPrimitiveSegments(maximumRadius, options, "revolveMesh");
57
57
  const closed = degrees === 360;
58
58
  const segments = closed
@@ -117,7 +117,7 @@ export const revolveMesh = (profile, options = {}) => {
117
117
  }
118
118
  }
119
119
  if (!closed) {
120
- const cap = triangulateLoop2(profile);
120
+ const cap = triangulateContour(profile);
121
121
  const at = (profileIndex, station) => vertexIndices[profileIndex][profile[profileIndex][0] <= AXIS_EPSILON ? 0 : station];
122
122
  for (let offset = 0; offset < cap.length; offset += 3) {
123
123
  const a = cap[offset], b = cap[offset + 1], c = cap[offset + 2];