@metamesh/modeling 0.12.0 → 0.13.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 (629) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +60 -72
  3. package/dist/api/engine.d.ts +123 -97
  4. package/dist/api/geometry.d.ts +3896 -3307
  5. package/dist/api/index.d.ts +2489 -2268
  6. package/dist/api/text.d.ts +119 -107
  7. package/dist/docs/guides/concepts.md +197 -0
  8. package/dist/docs/guides/fonts.md +51 -0
  9. package/dist/docs/guides/fundamentals.md +135 -0
  10. package/dist/docs/guides/generation.md +221 -0
  11. package/dist/docs/guides/hosting.md +88 -0
  12. package/dist/docs/guides/recipes.md +668 -0
  13. package/dist/docs/manifest.json +9851 -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 +79 -0
  33. package/dist/docs/reference/geometry/Anchor3.md +49 -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 +58 -0
  37. package/dist/docs/reference/geometry/AxisAngleRotation3.md +61 -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 +7 -0
  45. package/dist/docs/reference/geometry/BoxAnchorOptions.md +59 -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/ClearanceHoleDimensions.md +41 -0
  56. package/dist/docs/reference/geometry/ClearanceHoleFit.md +7 -0
  57. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +53 -0
  58. package/dist/docs/reference/geometry/Contour.md +17 -0
  59. package/dist/docs/reference/geometry/ContourCurve.md +35 -0
  60. package/dist/docs/reference/geometry/ContourPoint.md +29 -0
  61. package/dist/docs/reference/geometry/ContourSegment.md +86 -0
  62. package/dist/docs/reference/geometry/CorrespondingComponent.md +46 -0
  63. package/dist/docs/reference/geometry/CorrespondingContour.md +46 -0
  64. package/dist/docs/reference/geometry/CorrespondingProfile.md +22 -0
  65. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +27 -0
  66. package/dist/docs/reference/geometry/CubicBezierCurve2.md +70 -0
  67. package/dist/docs/reference/geometry/CubicBezierCurve3.md +70 -0
  68. package/dist/docs/reference/geometry/Curve2.md +16 -0
  69. package/dist/docs/reference/geometry/Curve3.md +16 -0
  70. package/dist/docs/reference/geometry/CurveSamplingOptions.md +64 -0
  71. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +73 -0
  72. package/dist/docs/reference/geometry/CylinderAnchorFace.md +7 -0
  73. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +83 -0
  74. package/dist/docs/reference/geometry/CylinderOptions.md +53 -0
  75. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +209 -0
  76. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +7 -0
  77. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +71 -0
  78. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +82 -0
  79. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +34 -0
  80. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +41 -0
  81. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +47 -0
  82. package/dist/docs/reference/geometry/CylindricalGearSpec.md +82 -0
  83. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -0
  84. package/dist/docs/reference/geometry/EdgeTreatment.md +17 -0
  85. package/dist/docs/reference/geometry/EllipseContourOptions.md +15 -0
  86. package/dist/docs/reference/geometry/EndTreatments.md +34 -0
  87. package/dist/docs/reference/geometry/ExtrudeOptions.md +134 -0
  88. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +77 -0
  89. package/dist/docs/reference/geometry/FittedTextLayout.md +60 -0
  90. package/dist/docs/reference/geometry/Frame3.md +58 -0
  91. package/dist/docs/reference/geometry/GeometryError.md +97 -0
  92. package/dist/docs/reference/geometry/GeometryErrorCode.md +7 -0
  93. package/dist/docs/reference/geometry/GeometryErrorContext.md +29 -0
  94. package/dist/docs/reference/geometry/GeometryResolution.md +65 -0
  95. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +62 -0
  96. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +41 -0
  97. package/dist/docs/reference/geometry/GridPatternOptions.md +42 -0
  98. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +14 -0
  99. package/dist/docs/reference/geometry/HeightfieldOptions.md +67 -0
  100. package/dist/docs/reference/geometry/HeightfieldPreflight.md +53 -0
  101. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +141 -0
  102. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +265 -0
  103. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +53 -0
  104. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +14 -0
  105. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +242 -0
  106. package/dist/docs/reference/geometry/LineCurve2.md +46 -0
  107. package/dist/docs/reference/geometry/LineCurve3.md +46 -0
  108. package/dist/docs/reference/geometry/LinearPatternOptions.md +30 -0
  109. package/dist/docs/reference/geometry/LoftCorrespondence.md +19 -0
  110. package/dist/docs/reference/geometry/LoftMeshStation.md +27 -0
  111. package/dist/docs/reference/geometry/LoftOptions.md +84 -0
  112. package/dist/docs/reference/geometry/LoftPlacement.md +66 -0
  113. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +18 -0
  114. package/dist/docs/reference/geometry/MatchProfilesOptions.md +35 -0
  115. package/dist/docs/reference/geometry/MetricFastenerSize.md +7 -0
  116. package/dist/docs/reference/geometry/MetricFastenerStandard.md +72 -0
  117. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +29 -0
  118. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +41 -0
  119. package/dist/docs/reference/geometry/ModelingLimits.md +126 -0
  120. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +17 -0
  121. package/dist/docs/reference/geometry/Path2.md +14 -0
  122. package/dist/docs/reference/geometry/Path3.md +14 -0
  123. package/dist/docs/reference/geometry/PathFrame.md +46 -0
  124. package/dist/docs/reference/geometry/PathNormalGuide.md +38 -0
  125. package/dist/docs/reference/geometry/PathPatternOptions.md +46 -0
  126. package/dist/docs/reference/geometry/PathPlacement.md +34 -0
  127. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +7 -0
  128. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +156 -0
  129. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +120 -0
  130. package/dist/docs/reference/geometry/PlanarPatchQuality.md +190 -0
  131. package/dist/docs/reference/geometry/Polygon.md +38 -0
  132. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +92 -0
  133. package/dist/docs/reference/geometry/PrimitivePlacement.md +31 -0
  134. package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +83 -0
  135. package/dist/docs/reference/geometry/PrintableThreadFit.md +7 -0
  136. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +45 -0
  137. package/dist/docs/reference/geometry/Profile.md +22 -0
  138. package/dist/docs/reference/geometry/ProfileComponent2.md +46 -0
  139. package/dist/docs/reference/geometry/ProfileContour2.md +34 -0
  140. package/dist/docs/reference/geometry/ProfileSpan2.md +47 -0
  141. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +36 -0
  142. package/dist/docs/reference/geometry/RackPitchDimensions.md +113 -0
  143. package/dist/docs/reference/geometry/RackPitchSpec.md +77 -0
  144. package/dist/docs/reference/geometry/RadialPatternOptions.md +62 -0
  145. package/dist/docs/reference/geometry/RadialSizing.md +7 -0
  146. package/dist/docs/reference/geometry/RadialSizingOptions.md +40 -0
  147. package/dist/docs/reference/geometry/RectangleContourOptions.md +66 -0
  148. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +34 -0
  149. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +14 -0
  150. package/dist/docs/reference/geometry/RectangleProfileOptions.md +94 -0
  151. package/dist/docs/reference/geometry/Region.md +14 -0
  152. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +84 -0
  153. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +65 -0
  154. package/dist/docs/reference/geometry/RevolveOptions.md +82 -0
  155. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +91 -0
  156. package/dist/docs/reference/geometry/RowLayoutOptions.md +23 -0
  157. package/dist/docs/reference/geometry/SampleContourOptions.md +71 -0
  158. package/dist/docs/reference/geometry/SampleHelixOptions.md +95 -0
  159. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +71 -0
  160. package/dist/docs/reference/geometry/SampledCurve2.md +34 -0
  161. package/dist/docs/reference/geometry/SampledCurve3.md +34 -0
  162. package/dist/docs/reference/geometry/SampledThreadHelices.md +58 -0
  163. package/dist/docs/reference/geometry/SideProfileCurve.md +35 -0
  164. package/dist/docs/reference/geometry/SideProfilePoint.md +29 -0
  165. package/dist/docs/reference/geometry/SideProfileSegment.md +86 -0
  166. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +71 -0
  167. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +34 -0
  168. package/dist/docs/reference/geometry/SphereOptions.md +15 -0
  169. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +75 -0
  170. package/dist/docs/reference/geometry/StrokePathCap.md +7 -0
  171. package/dist/docs/reference/geometry/StrokePathJoin.md +7 -0
  172. package/dist/docs/reference/geometry/StrokePathRegionOptions.md +85 -0
  173. package/dist/docs/reference/geometry/SvgImportOptions.md +60 -0
  174. package/dist/docs/reference/geometry/SvgRegionPreflight.md +61 -0
  175. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +118 -0
  176. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +65 -0
  177. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +53 -0
  178. package/dist/docs/reference/geometry/SweepOptions.md +109 -0
  179. package/dist/docs/reference/geometry/SweepOrientation.md +109 -0
  180. package/dist/docs/reference/geometry/ThreadBevelOptions.md +53 -0
  181. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +100 -0
  182. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +73 -0
  183. package/dist/docs/reference/geometry/ThreadEndStyle.md +7 -0
  184. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +113 -0
  185. package/dist/docs/reference/geometry/ThreadHandedness.md +7 -0
  186. package/dist/docs/reference/geometry/ThreadHelixOptions.md +120 -0
  187. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +7 -0
  188. package/dist/docs/reference/geometry/ThreadLeadInShape.md +7 -0
  189. package/dist/docs/reference/geometry/ThreadProfile.md +82 -0
  190. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +49 -0
  191. package/dist/docs/reference/geometry/ThreadProfileSpec.md +19 -0
  192. package/dist/docs/reference/geometry/ThreadRole.md +7 -0
  193. package/dist/docs/reference/geometry/ThreadedNutBevel.md +7 -0
  194. package/dist/docs/reference/geometry/ThreadedNutOptions.md +269 -0
  195. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +94 -0
  196. package/dist/docs/reference/geometry/ThreadedNutShape.md +7 -0
  197. package/dist/docs/reference/geometry/ThreadedRodOptions.md +242 -0
  198. package/dist/docs/reference/geometry/TorusOptions.md +105 -0
  199. package/dist/docs/reference/geometry/Transform3.md +12 -0
  200. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +91 -0
  201. package/dist/docs/reference/geometry/TriangleMesh.md +34 -0
  202. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +119 -0
  203. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +75 -0
  204. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +75 -0
  205. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +39 -0
  206. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +190 -0
  207. package/dist/docs/reference/geometry/TriangleMeshSignature.md +107 -0
  208. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +41 -0
  209. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +29 -0
  210. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +51 -0
  211. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +91 -0
  212. package/dist/docs/reference/geometry/TubeOptions.md +138 -0
  213. package/dist/docs/reference/geometry/Vector2.md +7 -0
  214. package/dist/docs/reference/geometry/Vector3.md +7 -0
  215. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +53 -0
  216. package/dist/docs/reference/geometry/VectorTextLayout.md +39 -0
  217. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +111 -0
  218. package/dist/docs/reference/geometry/VectorTextMetrics.md +94 -0
  219. package/dist/docs/reference/geometry/VectorTextOptions.md +50 -0
  220. package/dist/docs/reference/geometry/add3.md +38 -0
  221. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +57 -0
  222. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +52 -0
  223. package/dist/docs/reference/geometry/anchorFrame3.md +40 -0
  224. package/dist/docs/reference/geometry/applyTransformDirection3.md +41 -0
  225. package/dist/docs/reference/geometry/applyTransformPoint3.md +39 -0
  226. package/dist/docs/reference/geometry/attachTransform.md +73 -0
  227. package/dist/docs/reference/geometry/boundsCenter.md +62 -0
  228. package/dist/docs/reference/geometry/boundsFromSize.md +83 -0
  229. package/dist/docs/reference/geometry/boundsSize.md +62 -0
  230. package/dist/docs/reference/geometry/boxAnchor3.md +48 -0
  231. package/dist/docs/reference/geometry/buildHelicalThreadRidgeMesh.md +68 -0
  232. package/dist/docs/reference/geometry/buildHelicalThreadSolidMesh.md +102 -0
  233. package/dist/docs/reference/geometry/categories/bounds-layout.md +35 -0
  234. package/dist/docs/reference/geometry/categories/curves-paths.md +63 -0
  235. package/dist/docs/reference/geometry/categories/mechanical.md +101 -0
  236. package/dist/docs/reference/geometry/categories/meshes.md +73 -0
  237. package/dist/docs/reference/geometry/categories/pattern-placement.md +34 -0
  238. package/dist/docs/reference/geometry/categories/primitive-options.md +36 -0
  239. package/dist/docs/reference/geometry/categories/profiles-regions.md +74 -0
  240. package/dist/docs/reference/geometry/categories/resolution-errors.md +46 -0
  241. package/dist/docs/reference/geometry/categories/transforms-math.md +63 -0
  242. package/dist/docs/reference/geometry/categories/vector-import.md +40 -0
  243. package/dist/docs/reference/geometry/circleContour.md +33 -0
  244. package/dist/docs/reference/geometry/closeToAxis.md +34 -0
  245. package/dist/docs/reference/geometry/compensateThreadDiameters.md +51 -0
  246. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +42 -0
  247. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +56 -0
  248. package/dist/docs/reference/geometry/composeTransform3.md +40 -0
  249. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +45 -0
  250. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +47 -0
  251. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +31 -0
  252. package/dist/docs/reference/geometry/containsBounds.md +72 -0
  253. package/dist/docs/reference/geometry/contourContainsPoint.md +33 -0
  254. package/dist/docs/reference/geometry/createAnchor3.md +63 -0
  255. package/dist/docs/reference/geometry/createThreadProfile.md +37 -0
  256. package/dist/docs/reference/geometry/createTriangleMeshSignature.md +60 -0
  257. package/dist/docs/reference/geometry/cross3.md +38 -0
  258. package/dist/docs/reference/geometry/cumulativePathLengths.md +33 -0
  259. package/dist/docs/reference/geometry/cylinderAnchor3.md +56 -0
  260. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +14 -0
  261. package/dist/docs/reference/geometry/distributeAlongPath.md +51 -0
  262. package/dist/docs/reference/geometry/dot3.md +38 -0
  263. package/dist/docs/reference/geometry/ellipseContour.md +33 -0
  264. package/dist/docs/reference/geometry/eulerTransform3.md +38 -0
  265. package/dist/docs/reference/geometry/extrudeMesh.md +73 -0
  266. package/dist/docs/reference/geometry/fitBounds.md +95 -0
  267. package/dist/docs/reference/geometry/fitTextLayout.md +57 -0
  268. package/dist/docs/reference/geometry/frameTransform3.md +44 -0
  269. package/dist/docs/reference/geometry/getMetricClearanceHole.md +33 -0
  270. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +27 -0
  271. package/dist/docs/reference/geometry/gridPatternTransforms.md +31 -0
  272. package/dist/docs/reference/geometry/heightfieldMesh.md +43 -0
  273. package/dist/docs/reference/geometry/inverseTransform3.md +30 -0
  274. package/dist/docs/reference/geometry/isGeometryError.md +26 -0
  275. package/dist/docs/reference/geometry/joinTriangleMeshes.md +36 -0
  276. package/dist/docs/reference/geometry/layoutRow.md +43 -0
  277. package/dist/docs/reference/geometry/length3.md +26 -0
  278. package/dist/docs/reference/geometry/lerp3.md +38 -0
  279. package/dist/docs/reference/geometry/linearPatternTransforms.md +31 -0
  280. package/dist/docs/reference/geometry/loftMesh.md +72 -0
  281. package/dist/docs/reference/geometry/matchProfiles.md +51 -0
  282. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +47 -0
  283. package/dist/docs/reference/geometry/measureTriangleMesh.md +55 -0
  284. package/dist/docs/reference/geometry/meshBounds.md +35 -0
  285. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +29 -0
  286. package/dist/docs/reference/geometry/normalize3.md +32 -0
  287. package/dist/docs/reference/geometry/normalizeContour.md +45 -0
  288. package/dist/docs/reference/geometry/normalizePolygon.md +37 -0
  289. package/dist/docs/reference/geometry/normalizeRegion.md +33 -0
  290. package/dist/docs/reference/geometry/optimizePlanarPatches.md +91 -0
  291. package/dist/docs/reference/geometry/pathLength.md +33 -0
  292. package/dist/docs/reference/geometry/pathPatternTransforms.md +57 -0
  293. package/dist/docs/reference/geometry/preflightHeightfield.md +34 -0
  294. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +96 -0
  295. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +85 -0
  296. package/dist/docs/reference/geometry/preflightSvgRegion.md +56 -0
  297. package/dist/docs/reference/geometry/preflightThreadedNut.md +96 -0
  298. package/dist/docs/reference/geometry/preflightThreadedRod.md +85 -0
  299. package/dist/docs/reference/geometry/projectOntoPlane3.md +32 -0
  300. package/dist/docs/reference/geometry/radialPatternTransforms.md +47 -0
  301. package/dist/docs/reference/geometry/rectangleContour.md +49 -0
  302. package/dist/docs/reference/geometry/rectangleProfile.md +53 -0
  303. package/dist/docs/reference/geometry/regionArea.md +34 -0
  304. package/dist/docs/reference/geometry/regionBounds.md +27 -0
  305. package/dist/docs/reference/geometry/regularPolygonContour.md +53 -0
  306. package/dist/docs/reference/geometry/resamplePolyline2.md +64 -0
  307. package/dist/docs/reference/geometry/resamplePolyline3.md +67 -0
  308. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +79 -0
  309. package/dist/docs/reference/geometry/resolveArcSegments.md +67 -0
  310. package/dist/docs/reference/geometry/resolveCircularSegments.md +61 -0
  311. package/dist/docs/reference/geometry/resolveCylindricalGear.md +31 -0
  312. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +31 -0
  313. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +74 -0
  314. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +26 -0
  315. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +59 -0
  316. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +27 -0
  317. package/dist/docs/reference/geometry/resolveRackPitch.md +27 -0
  318. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +59 -0
  319. package/dist/docs/reference/geometry/reverseTriangleMesh.md +30 -0
  320. package/dist/docs/reference/geometry/revolveMesh.md +76 -0
  321. package/dist/docs/reference/geometry/rotateAroundAxis3.md +38 -0
  322. package/dist/docs/reference/geometry/rotationTransform3.md +49 -0
  323. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +50 -0
  324. package/dist/docs/reference/geometry/sampleContour.md +77 -0
  325. package/dist/docs/reference/geometry/sampleCurve2.md +61 -0
  326. package/dist/docs/reference/geometry/sampleCurve3.md +61 -0
  327. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +58 -0
  328. package/dist/docs/reference/geometry/sampleHelix.md +41 -0
  329. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +59 -0
  330. package/dist/docs/reference/geometry/sampleRackToothPath.md +39 -0
  331. package/dist/docs/reference/geometry/sampleSideProfile.md +73 -0
  332. package/dist/docs/reference/geometry/sampleTextContours.md +53 -0
  333. package/dist/docs/reference/geometry/sampleThreadHelices.md +63 -0
  334. package/dist/docs/reference/geometry/scale3.md +38 -0
  335. package/dist/docs/reference/geometry/scaleTransform3.md +34 -0
  336. package/dist/docs/reference/geometry/signedContourArea.md +26 -0
  337. package/dist/docs/reference/geometry/starContour.md +51 -0
  338. package/dist/docs/reference/geometry/strokePathRegion.md +63 -0
  339. package/dist/docs/reference/geometry/subtract3.md +38 -0
  340. package/dist/docs/reference/geometry/sweepMesh.md +82 -0
  341. package/dist/docs/reference/geometry/transformContour.md +42 -0
  342. package/dist/docs/reference/geometry/transformDeterminant3.md +32 -0
  343. package/dist/docs/reference/geometry/transformPath2.md +40 -0
  344. package/dist/docs/reference/geometry/transformPath3.md +33 -0
  345. package/dist/docs/reference/geometry/transformRegion.md +40 -0
  346. package/dist/docs/reference/geometry/transformTriangleMesh.md +42 -0
  347. package/dist/docs/reference/geometry/translationTransform3.md +31 -0
  348. package/dist/docs/reference/geometry/triangulateContour.md +26 -0
  349. package/dist/docs/reference/geometry/validateSolidMesh.md +52 -0
  350. package/dist/docs/reference/geometry/validateTransform3.md +43 -0
  351. package/dist/docs/reference/geometry/validateTriangleMesh.md +59 -0
  352. package/dist/docs/reference/geometry.md +30 -0
  353. package/dist/docs/reference/model/Anchor3.md +54 -0
  354. package/dist/docs/reference/model/AttachOptions.md +63 -0
  355. package/dist/docs/reference/model/Bounds2.md +39 -0
  356. package/dist/docs/reference/model/Bounds3.md +39 -0
  357. package/dist/docs/reference/model/BoxEdge.md +15 -0
  358. package/dist/docs/reference/model/BoxEdgeSelection.md +19 -0
  359. package/dist/docs/reference/model/BoxEdgeTreatments.md +20 -0
  360. package/dist/docs/reference/model/BoxOptions.md +92 -0
  361. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +35 -0
  362. package/dist/docs/reference/model/CircleContourOptions.md +21 -0
  363. package/dist/docs/reference/model/CircleOptions.md +21 -0
  364. package/dist/docs/reference/model/CircularPrimitiveOptions.md +64 -0
  365. package/dist/docs/reference/model/Computed.md +35 -0
  366. package/dist/docs/reference/model/ComputedValue.md +20 -0
  367. package/dist/docs/reference/model/Contour.md +22 -0
  368. package/dist/docs/reference/model/CorrespondingComponent.md +46 -0
  369. package/dist/docs/reference/model/CorrespondingContour.md +46 -0
  370. package/dist/docs/reference/model/CorrespondingProfile.md +22 -0
  371. package/dist/docs/reference/model/CorrespondingProfileStation.md +27 -0
  372. package/dist/docs/reference/model/CylinderOptions.md +58 -0
  373. package/dist/docs/reference/model/DiagnosticOptions.md +23 -0
  374. package/dist/docs/reference/model/EdgeTreatment.md +22 -0
  375. package/dist/docs/reference/model/EllipseContourOptions.md +21 -0
  376. package/dist/docs/reference/model/EllipseOptions.md +21 -0
  377. package/dist/docs/reference/model/EndTreatments.md +39 -0
  378. package/dist/docs/reference/model/ExtrudeOptions.md +140 -0
  379. package/dist/docs/reference/model/FinalizedModel.md +121 -0
  380. package/dist/docs/reference/model/FinalizedPart.md +87 -0
  381. package/dist/docs/reference/model/Frame3.md +63 -0
  382. package/dist/docs/reference/model/GenerateCallback.md +37 -0
  383. package/dist/docs/reference/model/GenerateContext.md +277 -0
  384. package/dist/docs/reference/model/GeneratedPart.md +93 -0
  385. package/dist/docs/reference/model/GenerationDiagnostic.md +41 -0
  386. package/dist/docs/reference/model/GenerationError.md +54 -0
  387. package/dist/docs/reference/model/GeometryResolution.md +70 -0
  388. package/dist/docs/reference/model/GeometrySamplingLimits.md +62 -0
  389. package/dist/docs/reference/model/GeometryToleranceOptions.md +46 -0
  390. package/dist/docs/reference/model/GridPatternOptions.md +43 -0
  391. package/dist/docs/reference/model/HeightfieldOptions.md +67 -0
  392. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +140 -0
  393. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +58 -0
  394. package/dist/docs/reference/model/HullOptions.md +72 -0
  395. package/dist/docs/reference/model/ImmutableBuffer-type.md +80 -0
  396. package/dist/docs/reference/model/ImmutableTriangleMesh.md +34 -0
  397. package/dist/docs/reference/model/ImplicitOptions.md +83 -0
  398. package/dist/docs/reference/model/InternalThreadCutterOptions.md +245 -0
  399. package/dist/docs/reference/model/LinearPatternOptions.md +31 -0
  400. package/dist/docs/reference/model/LoftCorrespondence.md +27 -0
  401. package/dist/docs/reference/model/LoftOptions.md +91 -0
  402. package/dist/docs/reference/model/LoftPlacement.md +73 -0
  403. package/dist/docs/reference/model/LoftStation.md +35 -0
  404. package/dist/docs/reference/model/MatchProfilesOptions.md +35 -0
  405. package/dist/docs/reference/model/ModelProgram.md +44 -0
  406. package/dist/docs/reference/model/ModelingLimits.md +126 -0
  407. package/dist/docs/reference/model/NumericArray.md +7 -0
  408. package/dist/docs/reference/model/PartGeometry.md +16 -0
  409. package/dist/docs/reference/model/PartOptions.md +65 -0
  410. package/dist/docs/reference/model/PathNormalGuide.md +45 -0
  411. package/dist/docs/reference/model/PathPatternOptions.md +47 -0
  412. package/dist/docs/reference/model/PatternSource.md +26 -0
  413. package/dist/docs/reference/model/PlaneOptions.md +39 -0
  414. package/dist/docs/reference/model/Polygon-type.md +43 -0
  415. package/dist/docs/reference/model/PolygonOptions.md +112 -0
  416. package/dist/docs/reference/model/PrimitivePlacement.md +40 -0
  417. package/dist/docs/reference/model/PrimitivePlacementOptions.md +88 -0
  418. package/dist/docs/reference/model/PrintableThreadFit.md +14 -0
  419. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +50 -0
  420. package/dist/docs/reference/model/Profile.md +22 -0
  421. package/dist/docs/reference/model/ProfileComponent2.md +46 -0
  422. package/dist/docs/reference/model/ProfileContour2.md +34 -0
  423. package/dist/docs/reference/model/ProfileSpan2.md +47 -0
  424. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +41 -0
  425. package/dist/docs/reference/model/RadialPatternOptions.md +63 -0
  426. package/dist/docs/reference/model/RadialSizing.md +15 -0
  427. package/dist/docs/reference/model/RadialSizingOptions.md +40 -0
  428. package/dist/docs/reference/model/RectangleContourOptions.md +72 -0
  429. package/dist/docs/reference/model/RectangleCornerTreatment.md +40 -0
  430. package/dist/docs/reference/model/RectangleCornerTreatments.md +20 -0
  431. package/dist/docs/reference/model/RectangleOptions.md +107 -0
  432. package/dist/docs/reference/model/Region.md +19 -0
  433. package/dist/docs/reference/model/RegionOffsetJoin.md +16 -0
  434. package/dist/docs/reference/model/RegionOffsetOptions.md +65 -0
  435. package/dist/docs/reference/model/RegularPolygonOptions.md +53 -0
  436. package/dist/docs/reference/model/RevolveOptions.md +89 -0
  437. package/dist/docs/reference/model/RoundedEdgeTreatment.md +96 -0
  438. package/dist/docs/reference/model/Section.md +450 -0
  439. package/dist/docs/reference/model/SectionHullOptions.md +72 -0
  440. package/dist/docs/reference/model/SectionInspection.md +98 -0
  441. package/dist/docs/reference/model/SmoothEdgeTreatment.md +76 -0
  442. package/dist/docs/reference/model/Solid.md +350 -0
  443. package/dist/docs/reference/model/SolidInspection.md +98 -0
  444. package/dist/docs/reference/model/SolidRayHit.md +58 -0
  445. package/dist/docs/reference/model/SphereOptions.md +20 -0
  446. package/dist/docs/reference/model/StarOptions.md +98 -0
  447. package/dist/docs/reference/model/SvgOrigin.md +16 -0
  448. package/dist/docs/reference/model/SvgPathSectionOptions.md +78 -0
  449. package/dist/docs/reference/model/SvgSectionOptions.md +66 -0
  450. package/dist/docs/reference/model/SweepOptions.md +116 -0
  451. package/dist/docs/reference/model/SweepOrientation.md +116 -0
  452. package/dist/docs/reference/model/TextSectionOptions.md +41 -0
  453. package/dist/docs/reference/model/ThreadEndStyle.md +14 -0
  454. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +117 -0
  455. package/dist/docs/reference/model/ThreadHandedness.md +14 -0
  456. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +14 -0
  457. package/dist/docs/reference/model/ThreadLeadInShape.md +14 -0
  458. package/dist/docs/reference/model/ThreadProfile.md +86 -0
  459. package/dist/docs/reference/model/ThreadRidgeOptions.md +18 -0
  460. package/dist/docs/reference/model/ThreadedNutBevel.md +14 -0
  461. package/dist/docs/reference/model/ThreadedNutOptions.md +273 -0
  462. package/dist/docs/reference/model/ThreadedNutPreflight.md +98 -0
  463. package/dist/docs/reference/model/ThreadedNutShape.md +14 -0
  464. package/dist/docs/reference/model/ThreadedRodOptions.md +245 -0
  465. package/dist/docs/reference/model/TorusOptions.md +110 -0
  466. package/dist/docs/reference/model/Transform2.md +15 -0
  467. package/dist/docs/reference/model/Transform3.md +18 -0
  468. package/dist/docs/reference/model/TriangleMesh.md +42 -0
  469. package/dist/docs/reference/model/TriangleMeshAnalysis.md +123 -0
  470. package/dist/docs/reference/model/TriangleMeshMeasurements.md +79 -0
  471. package/dist/docs/reference/model/TubeOptions.md +143 -0
  472. package/dist/docs/reference/model/Vector2.md +15 -0
  473. package/dist/docs/reference/model/Vector3.md +15 -0
  474. package/dist/docs/reference/model/VectorTextLayout.md +40 -0
  475. package/dist/docs/reference/model/VectorTextMetrics.md +100 -0
  476. package/dist/docs/reference/model/anchor.md +46 -0
  477. package/dist/docs/reference/model/box.md +62 -0
  478. package/dist/docs/reference/model/categories/boolean-operations.md +37 -0
  479. package/dist/docs/reference/model/categories/bounded-surfaces.md +26 -0
  480. package/dist/docs/reference/model/categories/contracts.md +16 -0
  481. package/dist/docs/reference/model/categories/core-values-errors.md +30 -0
  482. package/dist/docs/reference/model/categories/explicit-profiles.md +32 -0
  483. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +42 -0
  484. package/dist/docs/reference/model/categories/generation.md +44 -0
  485. package/dist/docs/reference/model/categories/inspection.md +23 -0
  486. package/dist/docs/reference/model/categories/mesh-inspection.md +29 -0
  487. package/dist/docs/reference/model/categories/primitives.md +61 -0
  488. package/dist/docs/reference/model/categories/resolution.md +18 -0
  489. package/dist/docs/reference/model/categories/sections.md +59 -0
  490. package/dist/docs/reference/model/categories/threads.md +50 -0
  491. package/dist/docs/reference/model/categories/transforms-placement.md +43 -0
  492. package/dist/docs/reference/model/circle.md +39 -0
  493. package/dist/docs/reference/model/components.md +68 -0
  494. package/dist/docs/reference/model/compose.md +31 -0
  495. package/dist/docs/reference/model/cylinder.md +52 -0
  496. package/dist/docs/reference/model/distance.md +45 -0
  497. package/dist/docs/reference/model/ellipse.md +39 -0
  498. package/dist/docs/reference/model/extrude.md +83 -0
  499. package/dist/docs/reference/model/fromRegion.md +33 -0
  500. package/dist/docs/reference/model/generate.md +46 -0
  501. package/dist/docs/reference/model/gridPattern.md +80 -0
  502. package/dist/docs/reference/model/heightfield.md +40 -0
  503. package/dist/docs/reference/model/hull.md +74 -0
  504. package/dist/docs/reference/model/immutableBuffer.md +44 -0
  505. package/dist/docs/reference/model/immutableMesh.md +40 -0
  506. package/dist/docs/reference/model/implicit.md +47 -0
  507. package/dist/docs/reference/model/inspectSection.md +38 -0
  508. package/dist/docs/reference/model/inspectSolid.md +38 -0
  509. package/dist/docs/reference/model/internalThreadCutter.md +100 -0
  510. package/dist/docs/reference/model/intersect.md +70 -0
  511. package/dist/docs/reference/model/isEmpty.md +39 -0
  512. package/dist/docs/reference/model/linearPattern.md +80 -0
  513. package/dist/docs/reference/model/loft.md +137 -0
  514. package/dist/docs/reference/model/matchProfiles.md +42 -0
  515. package/dist/docs/reference/model/minkowskiSum.md +37 -0
  516. package/dist/docs/reference/model/pathPattern.md +118 -0
  517. package/dist/docs/reference/model/polygon.md +40 -0
  518. package/dist/docs/reference/model/preflightInternalThreadCutter.md +89 -0
  519. package/dist/docs/reference/model/preflightThreadedNut.md +100 -0
  520. package/dist/docs/reference/model/preflightThreadedRod.md +89 -0
  521. package/dist/docs/reference/model/radialPattern.md +113 -0
  522. package/dist/docs/reference/model/rayCast.md +40 -0
  523. package/dist/docs/reference/model/rectangle.md +59 -0
  524. package/dist/docs/reference/model/regularPolygon.md +39 -0
  525. package/dist/docs/reference/model/revolve.md +74 -0
  526. package/dist/docs/reference/model/solidFromMesh.md +42 -0
  527. package/dist/docs/reference/model/sphere.md +42 -0
  528. package/dist/docs/reference/model/split.md +54 -0
  529. package/dist/docs/reference/model/splitByPlane.md +66 -0
  530. package/dist/docs/reference/model/star.md +63 -0
  531. package/dist/docs/reference/model/svgPathSection.md +65 -0
  532. package/dist/docs/reference/model/svgSection.md +64 -0
  533. package/dist/docs/reference/model/sweep.md +92 -0
  534. package/dist/docs/reference/model/textSection.md +57 -0
  535. package/dist/docs/reference/model/threadRidge.md +72 -0
  536. package/dist/docs/reference/model/threadedNut.md +110 -0
  537. package/dist/docs/reference/model/threadedRod.md +99 -0
  538. package/dist/docs/reference/model/toRegion.md +33 -0
  539. package/dist/docs/reference/model/toTriangleMesh.md +27 -0
  540. package/dist/docs/reference/model/torus.md +70 -0
  541. package/dist/docs/reference/model/tube.md +77 -0
  542. package/dist/docs/reference/model/union.md +72 -0
  543. package/dist/docs/reference/model.md +39 -0
  544. package/dist/docs/reference/text/Bounds2.md +34 -0
  545. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -0
  546. package/dist/docs/reference/text/Vector2.md +7 -0
  547. package/dist/docs/reference/text/VectorFont.md +186 -0
  548. package/dist/docs/reference/text/VectorFontOptions.md +17 -0
  549. package/dist/docs/reference/text/VectorTextArcBaseline.md +53 -0
  550. package/dist/docs/reference/text/VectorTextLayout.md +34 -0
  551. package/dist/docs/reference/text/VectorTextLayoutOptions.md +111 -0
  552. package/dist/docs/reference/text/VectorTextMetrics.md +94 -0
  553. package/dist/docs/reference/text/VectorTextOptions.md +50 -0
  554. package/dist/docs/reference/text/categories/font-preparation.md +38 -0
  555. package/dist/docs/reference/text/prepareVectorFont.md +46 -0
  556. package/dist/docs/reference/text.md +21 -0
  557. package/dist/engine/construction-operations.js +10 -3
  558. package/dist/engine/deferred-context.js +12 -3
  559. package/dist/engine/execution.js +1 -1
  560. package/dist/engine/export-3mf.js +2 -2
  561. package/dist/engine/finalization.js +3 -3
  562. package/dist/engine/loft-operations.js +4 -4
  563. package/dist/engine/native/adapter.js +1 -1
  564. package/dist/engine/native/regions.js +9 -9
  565. package/dist/engine/pattern-operations.js +24 -13
  566. package/dist/engine/pattern-transform.js +9 -0
  567. package/dist/engine/placement.js +2 -2
  568. package/dist/engine/primitive-operations.js +10 -10
  569. package/dist/engine/profile-mesh.js +7 -7
  570. package/dist/engine/section-operations.js +25 -14
  571. package/dist/engine/session-graph.js +5 -3
  572. package/dist/engine/session.js +1 -2
  573. package/dist/geometry/bounds.js +117 -0
  574. package/dist/geometry/cylinder.js +5 -1
  575. package/dist/geometry/edge-finishing.js +2 -2
  576. package/dist/geometry/heightfield.js +1 -1
  577. package/dist/geometry/index.js +15 -12
  578. package/dist/geometry/{loft-correspondence.js → loft/loft-correspondence.js} +3 -3
  579. package/dist/geometry/{loft-geometry.js → loft/loft-geometry.js} +8 -8
  580. package/dist/geometry/{loft-options.js → loft/loft-options.js} +2 -2
  581. package/dist/geometry/{loft-simple-mesh.js → loft/loft-simple-mesh.js} +6 -6
  582. package/dist/geometry/{loft-triangulation.js → loft/loft-triangulation.js} +6 -6
  583. package/dist/geometry/{loft.js → loft/loft.js} +8 -8
  584. package/dist/geometry/math/vector3.js +5 -1
  585. package/dist/geometry/mechanical/gears.js +2 -2
  586. package/dist/geometry/mechanical/thread-mesh.js +3 -3
  587. package/dist/geometry/mechanical/thread-profiles.js +2 -2
  588. package/dist/geometry/mechanical/thread-surface.js +14 -5
  589. package/dist/geometry/{mesh-centroid.js → mesh/mesh-centroid.js} +1 -1
  590. package/dist/geometry/{mesh-planar.js → mesh/mesh-planar.js} +1 -1
  591. package/dist/geometry/{mesh-quality.js → mesh/mesh-quality.js} +2 -2
  592. package/dist/geometry/{mesh-signature.js → mesh/mesh-signature.js} +2 -2
  593. package/dist/geometry/{mesh-solid.js → mesh/mesh-solid.js} +2 -2
  594. package/dist/geometry/{mesh.js → mesh/mesh.js} +7 -8
  595. package/dist/geometry/paths/frames.js +4 -5
  596. package/dist/geometry/patterns/options.js +1 -0
  597. package/dist/{engine/pattern-placements.js → geometry/patterns/placements.js} +22 -8
  598. package/dist/geometry/patterns.js +25 -0
  599. package/dist/geometry/primitive-resolvers.js +9 -9
  600. package/dist/geometry/profiles/contour.js +3 -3
  601. package/dist/geometry/profiles/matched.js +3 -3
  602. package/dist/geometry/profiles/profiles.js +10 -10
  603. package/dist/geometry/profiles/rectangle.js +7 -7
  604. package/dist/geometry/profiles/shapes.js +9 -9
  605. package/dist/geometry/profiles/side-profile.js +37 -0
  606. package/dist/geometry/regions.js +15 -15
  607. package/dist/geometry/revolve/revolve-mesh.js +5 -5
  608. package/dist/geometry/stroke-path.js +2 -2
  609. package/dist/geometry/svg/errors.js +0 -3
  610. package/dist/geometry/svg/fill.js +7 -7
  611. package/dist/geometry/svg/index.js +1 -1
  612. package/dist/geometry/svg/matrix.js +0 -114
  613. package/dist/geometry/svg/parser.js +1 -439
  614. package/dist/geometry/svg-import.js +3 -3
  615. package/dist/geometry/sweeps/sweep-closed.js +1 -1
  616. package/dist/geometry/sweeps/sweep-mesh.js +1 -1
  617. package/dist/geometry/sweeps/sweep-open.js +3 -3
  618. package/dist/geometry/sweeps/validation.js +2 -2
  619. package/dist/geometry/text-fitting.js +85 -0
  620. package/dist/geometry/tolerance.js +2 -2
  621. package/dist/geometry/transform-geometry.js +9 -9
  622. package/dist/model/execution-binding.js +3 -3
  623. package/dist/model/generation.js +1 -1
  624. package/dist/model/operation-contracts.js +1 -0
  625. package/dist/model/operation-dispatch.js +6 -0
  626. package/dist/model/operations.js +19 -49
  627. package/package.json +10 -8
  628. /package/dist/geometry/{mesh-edge-table.js → mesh/mesh-edge-table.js} +0 -0
  629. /package/dist/geometry/{mesh-solid-intersections.js → mesh/mesh-solid-intersections.js} +0 -0
@@ -1,7 +1,8 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
+ import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../geometry/patterns/placements.js";
2
3
  import { geometryRecipe, isGeometryRecipe, recordGeometryRecipe, } from "./geometry-recipes.js";
3
4
  import { captureRecipeInputs } from "./immutable-generation-data.js";
4
- import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "./pattern-placements.js";
5
+ import { sectionPatternTransform } from "./pattern-transform.js";
5
6
  import { RecipeRealization } from "./recipe-realization.js";
6
7
  // Every public operation must explicitly choose its realization and result behavior.
7
8
  const operationBehaviors = {
@@ -25,7 +26,7 @@ const operationBehaviors = {
25
26
  threadedRod: "solid",
26
27
  threadedNut: "solid",
27
28
  internalThreadCutter: "solid",
28
- sectionFromContours: "section",
29
+ polygon: "section",
29
30
  fromRegion: "section",
30
31
  rectangle: "section",
31
32
  circle: "section",
@@ -157,11 +158,19 @@ function declarePattern(operation, resolution, supplied, declaration) {
157
158
  });
158
159
  const source = supplied[0];
159
160
  const copies = [];
161
+ let kind;
160
162
  for (let index = 0; index < plan.count; index++) {
161
163
  const shape = typeof source === "function"
162
164
  ? source(index)
163
165
  : source;
164
- copies.push(declareOperation("transform", resolution, [shape, plan.transformAt(index)], declaration));
166
+ const currentKind = inputKind(shape);
167
+ if (kind !== undefined && kind !== currentKind)
168
+ throw new GeometryError("INVALID_ARGUMENT", "Pattern factories must return one shape dimension.", {
169
+ operation,
170
+ });
171
+ kind = currentKind;
172
+ const matrix = plan.transformAt(index);
173
+ copies.push(declareOperation("transform", resolution, [shape, kind === "section" ? sectionPatternTransform(matrix, operation) : matrix], declaration));
165
174
  }
166
175
  return Object.freeze(copies);
167
176
  }
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
- import { analyzeTriangleMesh, } from "../geometry/mesh.js";
2
+ import { analyzeTriangleMesh, } from "../geometry/mesh/mesh.js";
3
3
  import { assertMeshAllocationWithinLimits } from "../geometry/model-limits.js";
4
4
  import { assertSamplingCount } from "../geometry/sampling-limits.js";
5
5
  import { createSectionHandle, createSolidHandle } from "../model/shape-handles.js";
@@ -1,7 +1,7 @@
1
1
  import { Zip, ZipDeflate } from "fflate";
2
2
  import { GeometryError } from "../geometry/errors.js";
3
- import { analyzeSolidMesh } from "../geometry/mesh-solid.js";
4
- import { analyzeTriangleMesh } from "../geometry/mesh.js";
3
+ import { analyzeSolidMesh } from "../geometry/mesh/mesh-solid.js";
4
+ import { analyzeTriangleMesh } from "../geometry/mesh/mesh.js";
5
5
  import { MeshViewCache } from "./mesh-view-cache.js";
6
6
  const namespace = "http://schemas.microsoft.com/3dmanufacturing/core/2015/02";
7
7
  const declaration = '<?xml version="1.0" encoding="UTF-8"?>';
@@ -1,7 +1,7 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
- import { optimizePlanarPatches } from "../geometry/mesh-planar.js";
3
- import { validateAnalyzedSolidMesh } from "../geometry/mesh-solid.js";
4
- import { analyzeTriangleMesh, } from "../geometry/mesh.js";
2
+ import { optimizePlanarPatches } from "../geometry/mesh/mesh-planar.js";
3
+ import { validateAnalyzedSolidMesh } from "../geometry/mesh/mesh-solid.js";
4
+ import { analyzeTriangleMesh, } from "../geometry/mesh/mesh.js";
5
5
  import { immutableMeshView } from "../model/immutable-buffer.js";
6
6
  import { MeshViewCache } from "./mesh-view-cache.js";
7
7
  import { copiedMeshViews, copiedUint32Array } from "./native/copied-views.js";
@@ -1,8 +1,8 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
- import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../geometry/loft-geometry.js";
3
- import { loftFrame, resolveLoftControls } from "../geometry/loft-options.js";
4
- import { simpleLoftMesh } from "../geometry/loft-simple-mesh.js";
5
- import { measureTriangleMesh } from "../geometry/mesh.js";
2
+ import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../geometry/loft/loft-geometry.js";
3
+ import { loftFrame, resolveLoftControls } from "../geometry/loft/loft-options.js";
4
+ import { simpleLoftMesh } from "../geometry/loft/loft-simple-mesh.js";
5
+ import { measureTriangleMesh } from "../geometry/mesh/mesh.js";
6
6
  import { assertSamplingCount } from "../geometry/sampling-limits.js";
7
7
  import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitive-profiles.js";
8
8
  import { buildProfileLoftMesh } from "./profile-mesh.js";
@@ -1,4 +1,4 @@
1
- import { validateTriangleMesh } from "../../geometry/mesh.js";
1
+ import { validateTriangleMesh } from "../../geometry/mesh/mesh.js";
2
2
  import { assertNativeSolidStatus } from "./status.js";
3
3
  /**
4
4
  * Constructs a live Manifold solid from a copied indexed triangle mesh.
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "../../geometry/errors.js";
2
- import { loopContainsPoint, normalizeLoop2, normalizeRegion2, signedAreaLoop2, } from "../../geometry/regions.js";
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
5
  const MAX_AGGREGATE_CONTOURS = 25_000;
@@ -75,7 +75,7 @@ const contoursFromRegion = (region) => region
75
75
  */
76
76
  export function regionToCrossSection(context, region, limits = {}) {
77
77
  assertRegionBounds([region], "regionToCrossSection", limits);
78
- const normalized = normalizeRegion2(region);
78
+ const normalized = normalizeRegion(region);
79
79
  const module = scopedManifoldModule(context);
80
80
  if (normalized.length === 0)
81
81
  return ownScopedManifoldValue(context, module.CrossSection.union([]));
@@ -83,11 +83,11 @@ export function regionToCrossSection(context, region, limits = {}) {
83
83
  }
84
84
  const regionFromLoops = (loops) => {
85
85
  const outers = loops
86
- .filter((loop) => signedAreaLoop2(loop) > 0)
87
- .map((outer) => ({ outer: normalizeLoop2(outer, true), holes: [] }));
86
+ .filter((loop) => signedContourArea(loop) > 0)
87
+ .map((outer) => ({ outer: normalizeContour(outer, true), holes: [] }));
88
88
  const holes = loops
89
- .filter((loop) => signedAreaLoop2(loop) < 0)
90
- .map((hole) => normalizeLoop2(hole, false));
89
+ .filter((loop) => signedContourArea(loop) < 0)
90
+ .map((hole) => normalizeContour(hole, false));
91
91
  if (outers.length === 0 && loops.length > 0) {
92
92
  throw new GeometryError("INVALID_TOPOLOGY", "CrossSection did not contain an exterior contour.");
93
93
  }
@@ -113,15 +113,15 @@ const regionFromLoops = (loops) => {
113
113
  x <= bounds.maximumX &&
114
114
  y >= bounds.minimumY &&
115
115
  y <= bounds.maximumY &&
116
- loopContainsPoint(polygon.outer, hole[0]));
116
+ contourContainsPoint(polygon.outer, hole[0]));
117
117
  })
118
- .sort((a, b) => Math.abs(signedAreaLoop2(a.outer)) - Math.abs(signedAreaLoop2(b.outer)))[0];
118
+ .sort((a, b) => Math.abs(signedContourArea(a.outer)) - Math.abs(signedContourArea(b.outer)))[0];
119
119
  if (owner === undefined) {
120
120
  throw new GeometryError("INVALID_TOPOLOGY", "CrossSection hole had no containing exterior.");
121
121
  }
122
122
  owner.holes.push(hole);
123
123
  }
124
- return normalizeRegion2(outers.map(({ outer, holes }) => ({ outer, holes: Object.freeze(holes) })));
124
+ return normalizeRegion(outers.map(({ outer, holes }) => ({ outer, holes: Object.freeze(holes) })));
125
125
  };
126
126
  /** Copies a robust CrossSection into MetaMesh's explicit outer/hole topology. */
127
127
  export function crossSectionToRegion(context, section, limits = {}) {
@@ -1,36 +1,47 @@
1
+ import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../geometry/patterns/placements.js";
2
+ import { assertSamplingCount } from "../geometry/sampling-limits.js";
1
3
  import { IDENTITY_TRANSFORM3 } from "../geometry/transform3.js";
2
- import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "./pattern-placements.js";
4
+ import { sectionPatternTransform } from "./pattern-transform.js";
3
5
  /** Private pattern owner; all copies use the shared transform/metadata/lifetime path. */
4
6
  export function createPatternOperations(environment, transforms) {
5
7
  const apply = (source, makePlan, operation) => {
6
8
  environment.assertActive();
7
9
  const plan = makePlan();
8
10
  let vertices = 0, triangles = 0;
9
- const budget = (solid, multiplier) => {
10
- const native = environment.nativeSolid(solid);
11
- vertices += native.numVert() * multiplier;
12
- triangles += native.numTri() * multiplier;
11
+ let kind;
12
+ const budget = (shape, multiplier) => {
13
+ const native = environment.resolveHandle(shape);
14
+ if (kind !== undefined && native.kind !== kind)
15
+ environment.throwGeometryError("INVALID_ARGUMENT", operation, "Pattern factories must return one shape dimension.");
16
+ kind = native.kind;
17
+ vertices += native.value.numVert() * multiplier;
18
+ if (native.kind === "solid")
19
+ triangles += native.value.numTri() * multiplier;
20
+ else
21
+ assertSamplingCount(vertices, operation, environment.limits.maxProfilePoints);
13
22
  environment.assertMeshAllocation(vertices, triangles, (vertices + triangles) * 12, operation);
14
23
  };
15
24
  if (typeof source !== "function")
16
25
  budget(source, plan.count);
17
26
  const copies = [];
18
27
  for (let index = 0; index < plan.count; index++) {
19
- const solid = typeof source === "function" ? source(index) : source;
28
+ const shape = typeof source === "function" ? source(index) : source;
20
29
  if (typeof source === "function")
21
- budget(solid, 1);
30
+ budget(shape, 1);
22
31
  const matrix = plan.transformAt(index);
23
32
  copies.push(matrix.every((value, i) => value === IDENTITY_TRANSFORM3[i])
24
- ? solid
25
- : transforms.operations.transform(solid, matrix));
33
+ ? shape
34
+ : kind === "section"
35
+ ? transforms.operations.transform(shape, sectionPatternTransform(matrix, operation))
36
+ : transforms.operations.transform(shape, matrix));
26
37
  }
27
38
  return copies;
28
39
  };
29
40
  const operations = {
30
- linearPattern: (source, options) => apply(source, () => linearPatternPlan(options), "linearPattern"),
31
- radialPattern: (source, options) => apply(source, () => radialPatternPlan(options), "radialPattern"),
32
- gridPattern: (source, options) => apply(source, () => gridPatternPlan(options), "gridPattern"),
33
- pathPattern: (source, path, options) => apply(source, () => pathPatternPlan(path, options, environment.limits), "pathPattern"),
41
+ linearPattern: ((source, options) => apply(source, () => linearPatternPlan(options), "linearPattern")),
42
+ radialPattern: ((source, options) => apply(source, () => radialPatternPlan(options), "radialPattern")),
43
+ gridPattern: ((source, options) => apply(source, () => gridPatternPlan(options), "gridPattern")),
44
+ pathPattern: ((source, path, options) => apply(source, () => pathPatternPlan(path, options, environment.limits), "pathPattern")),
34
45
  };
35
46
  return operations;
36
47
  }
@@ -0,0 +1,9 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ /** Converts only plane-preserving pattern placements to a Section's affine XY transform. */
3
+ export function sectionPatternTransform(matrix, operation) {
4
+ if (Math.abs(matrix[8]) > 1e-10 || Math.abs(matrix[9]) > 1e-10 || Math.abs(matrix[11]) > 1e-10)
5
+ throw new GeometryError("INVALID_ARGUMENT", "Section patterns must preserve the XY plane.", {
6
+ operation,
7
+ });
8
+ return [matrix[0], matrix[1], matrix[3], matrix[4], matrix[5], matrix[7], 0, 0, 1];
9
+ }
@@ -1,5 +1,5 @@
1
- import { validateAnalyzedSolidMesh } from "../geometry/mesh-solid.js";
2
- import { measureTriangleMesh } from "../geometry/mesh.js";
1
+ import { validateAnalyzedSolidMesh } from "../geometry/mesh/mesh-solid.js";
2
+ import { measureTriangleMesh } from "../geometry/mesh/mesh.js";
3
3
  import { composeTransform3, eulerTransform3, translationTransform3, } from "../geometry/transform3.js";
4
4
  /** Places already validated immutable geometry once, retaining its indexed topology. */
5
5
  export function placeFinalizedGeometry(source, position, rotation, meshValidation) {
@@ -1,9 +1,9 @@
1
1
  import { resolveCylinderRadii } from "../geometry/cylinder.js";
2
2
  import { resolveModelingLimits } from "../geometry/model-limits.js";
3
3
  import { assertPrimitiveOptions } from "../geometry/primitive-resolvers.js";
4
- import { regularPolygonLoop, starLoop } from "../geometry/profiles/profiles.js";
5
- import { rectangleLoop, resolveRectangle, } from "../geometry/profiles/rectangle.js";
6
- import { ellipseLoop } from "../geometry/profiles/shapes.js";
4
+ import { regularPolygonContour, starContour } from "../geometry/profiles/profiles.js";
5
+ import { rectangleContour, resolveRectangle, } from "../geometry/profiles/rectangle.js";
6
+ import { ellipseContour } from "../geometry/profiles/shapes.js";
7
7
  import { requireProfileVertexCount } from "../geometry/profiles/validation.js";
8
8
  import * as kernel from "./native/index.js";
9
9
  import { boxAnchors, cylinderAnchors, originAnchor, planarAnchors, sphereAnchors, torusAnchors, tubeAnchors, } from "./primitive-anchors.js";
@@ -12,7 +12,7 @@ import { ellipticalSectionProfile, polygonSectionProfile, rectangleSectionProfil
12
12
  export function createPrimitiveOperations(environment, transforms, sections) {
13
13
  const { module, scope, assertActive, throwGeometryError, ownSection, validateFiniteNumber, requirePositiveNumber, validateCoordinates, withResolutionDefaults, resolveCircularSegments, } = environment;
14
14
  const { placedSolid, placedSection } = transforms;
15
- const fromContours = sections.sectionFromContours;
15
+ const fromContours = (contours) => sections.polygon({ contours });
16
16
  const operations = {
17
17
  box: (value) => {
18
18
  assertActive();
@@ -74,7 +74,7 @@ export function createPrimitiveOperations(environment, transforms, sections) {
74
74
  rectangle: (value) => placedSection(value, () => {
75
75
  assertActive();
76
76
  const resolved = withResolutionDefaults(value);
77
- resolveRectangle(resolved, "rectangle");
77
+ const { setbacks } = resolveRectangle(resolved, "rectangle");
78
78
  const treatment = value.treatment;
79
79
  const resolvedCorner = (corner) => corner.kind === "round" || corner.kind === "smooth"
80
80
  ? withResolutionDefaults({
@@ -92,9 +92,9 @@ export function createPrimitiveOperations(environment, transforms, sections) {
92
92
  : resolvedCorner(treatment),
93
93
  }),
94
94
  };
95
- const points = rectangleLoop(options);
95
+ const points = rectangleContour(options);
96
96
  const dimensions = typeof value.size === "number" ? [value.size, value.size] : value.size;
97
- const section = treatment === undefined
97
+ const section = setbacks.every((pair) => pair.every((distance) => distance === 0))
98
98
  ? ownSection(module.CrossSection.square(dimensions, value.center ?? true))
99
99
  : fromContours([points]);
100
100
  environment.rememberAnchors(section, planarAnchors(dimensions, value.center ?? true));
@@ -122,7 +122,7 @@ export function createPrimitiveOperations(environment, transforms, sections) {
122
122
  validateCoordinates(radii, 2, "ellipse");
123
123
  const resolved = withResolutionDefaults(value);
124
124
  const section = fromContours([
125
- ellipseLoop({
125
+ ellipseContour({
126
126
  radius: radii,
127
127
  segments: resolveCircularSegments(Math.max(...radii), value),
128
128
  limits: resolved.limits,
@@ -132,14 +132,14 @@ export function createPrimitiveOperations(environment, transforms, sections) {
132
132
  return environment.rememberPrimitiveProfile(section, ellipticalSectionProfile(radii, value, resolved.resolution, resolved.limits));
133
133
  }),
134
134
  regularPolygon: (value) => placedSection(value, () => {
135
- const resolved = withResolutionDefaults(value), loop = regularPolygonLoop(resolved);
135
+ const resolved = withResolutionDefaults(value), loop = regularPolygonContour(resolved);
136
136
  const section = environment.rememberAnchors(fromContours([loop]), originAnchor());
137
137
  return environment.rememberPrimitiveProfile(section, polygonSectionProfile(`polygon-${value.sides}`, loop, resolved.resolution, resolved.limits));
138
138
  }),
139
139
  star: (value) => placedSection(value, () => {
140
140
  const angle = (validateFiniteNumber(value.rotationDegrees ?? 0, "star") * Math.PI) / 180;
141
141
  const resolved = withResolutionDefaults(value);
142
- const loop = starLoop(value.outerRadius, value.points, value.innerRadius, resolved.limits).map(([x, y]) => [
142
+ const loop = starContour(value.outerRadius, value.points, value.innerRadius, resolved.limits).map(([x, y]) => [
143
143
  x * Math.cos(angle) - y * Math.sin(angle),
144
144
  x * Math.sin(angle) + y * Math.cos(angle),
145
145
  ]);
@@ -1,8 +1,8 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
- import { loftFrame } from "../geometry/loft-options.js";
2
+ import { loftFrame } from "../geometry/loft/loft-options.js";
3
3
  import { assertMeshAllocationWithinLimits } from "../geometry/model-limits.js";
4
4
  import { writeMeshVertex } from "../geometry/numeric.js";
5
- import { normalizeRegion2, signedAreaLoop2 } from "../geometry/regions.js";
5
+ import { normalizeRegion, signedContourArea } from "../geometry/regions.js";
6
6
  import { assertSamplingCount } from "../geometry/sampling-limits.js";
7
7
  import { resolveSweepScales } from "../geometry/sweeps/options.js";
8
8
  import { computeSweepFrames, validateSweepOptions } from "../geometry/sweeps/orientation.js";
@@ -127,17 +127,17 @@ export function buildProfileLoftMesh(module, stations, limits, closed = false, s
127
127
  let contourIndex = 0;
128
128
  const region = profile.components.map((component) => {
129
129
  const outer = physical[contourIndex++];
130
- if (!intermediateWorldGrid && !(signedAreaLoop2(outer.points) > 0))
130
+ if (!intermediateWorldGrid && !(signedContourArea(outer.points) > 0))
131
131
  fail("Matched outer contours must retain CCW winding.");
132
132
  const holes = component.holes.map(() => {
133
133
  const hole = physical[contourIndex++];
134
- if (!intermediateWorldGrid && !(signedAreaLoop2(hole.points) < 0))
134
+ if (!intermediateWorldGrid && !(signedContourArea(hole.points) < 0))
135
135
  fail("Matched hole contours must retain CW winding.");
136
136
  return hole.points;
137
137
  });
138
138
  return { outer: outer.points, holes };
139
139
  });
140
- const normalized = intermediateWorldGrid ? [] : normalizeRegion2(region);
140
+ const normalized = intermediateWorldGrid ? [] : normalizeRegion(region);
141
141
  normalized.forEach((component, index) => {
142
142
  if (component.outer.length !== region[index].outer.length ||
143
143
  component.holes.some((hole, holeIndex) => hole.length !== region[index].holes[holeIndex].length))
@@ -163,7 +163,7 @@ export function buildProfileLoftMesh(module, stations, limits, closed = false, s
163
163
  const paired = upper[contourIndex];
164
164
  for (let index = 0; index < contour.slots.length; index += 1) {
165
165
  const next = (index + 1) % contour.slots.length;
166
- const advance = signedAreaLoop2(paired.points) < 0 ? -seamProfileOffset : seamProfileOffset;
166
+ const advance = signedContourArea(paired.points) < 0 ? -seamProfileOffset : seamProfileOffset;
167
167
  const offset = closed && station === stations.length - 1
168
168
  ? ((advance % paired.slots.length) + paired.slots.length) % paired.slots.length
169
169
  : 0;
@@ -217,7 +217,7 @@ export function buildProfileSweepMesh(module, profile, inputPath, options, limit
217
217
  for (const contour of contourList(profile)) {
218
218
  const extent = contour.points.reduce((maximum, [x, y]) => Math.max(maximum, Math.abs(x * scaleX), Math.abs(y * scaleY)), 1);
219
219
  const tolerance = resolveGeometryTolerance(extent).linear;
220
- const advance = signedAreaLoop2(contour.points) < 0 ? -seamProfileOffset : seamProfileOffset;
220
+ const advance = signedContourArea(contour.points) < 0 ? -seamProfileOffset : seamProfileOffset;
221
221
  const offset = ((advance % contour.points.length) + contour.points.length) % contour.points.length;
222
222
  for (let index = 0; index < contour.points.length; index++) {
223
223
  const [x, y] = contour.points[index], target = contour.points[(index + offset) % contour.points.length];
@@ -7,32 +7,43 @@ import * as kernel from "./native/index.js";
7
7
  export function createSectionOperations(environment, transforms) {
8
8
  const { module, limits, scope, assertActive, throwGeometryError, nativeSolid, nativeSection, wrapSection, ownSection, validateFiniteNumber, validateCoordinates, assertOperandCount, withResolutionDefaults, resolveCircularSegments, } = environment;
9
9
  const { translate } = transforms.operations;
10
- const fromContours = (contours, value = {}) => {
10
+ const fromContours = (contours, fillRule = "nonzero") => {
11
11
  assertActive();
12
- if (typeof value !== "object" || value === null || Array.isArray(value))
13
- throwGeometryError("INVALID_ARGUMENT", "sectionFromContours", "Options must be an object.");
14
- assertOperandCount(contours, "sectionFromContours", 0);
12
+ assertOperandCount(contours, "polygon", 0);
15
13
  let count = 0;
16
14
  const copied = Array.from(contours, (contour) => {
17
15
  if (!Array.isArray(contour) || contour.length < 3)
18
- throwGeometryError("INVALID_ARGUMENT", "sectionFromContours", "Each contour needs at least three points.");
16
+ throwGeometryError("INVALID_ARGUMENT", "polygon", "Each contour needs at least three points.");
19
17
  count += contour.length;
20
- assertSamplingCount(count, "sectionFromContours", limits.maxProfilePoints);
18
+ assertSamplingCount(count, "polygon", limits.maxProfilePoints);
21
19
  return Array.from(contour, (point) => {
22
- validateCoordinates(point, 2, "sectionFromContours");
20
+ validateCoordinates(point, 2, "polygon");
23
21
  return [point[0], point[1]];
24
22
  });
25
23
  });
26
- if (value.fillRule !== undefined &&
27
- value.fillRule !== "nonzero" &&
28
- value.fillRule !== "evenodd")
29
- throwGeometryError("INVALID_ARGUMENT", "sectionFromContours", "Unsupported fill rule.");
24
+ if (fillRule !== "nonzero" && fillRule !== "evenodd")
25
+ throwGeometryError("INVALID_ARGUMENT", "polygon", "Unsupported fill rule.");
30
26
  if (copied.length === 0)
31
27
  return ownSection(module.CrossSection.union([]));
32
- return ownSection(new module.CrossSection(copied, value.fillRule === "evenodd" ? "EvenOdd" : "NonZero"));
28
+ return ownSection(new module.CrossSection(copied, fillRule === "evenodd" ? "EvenOdd" : "NonZero"));
33
29
  };
34
30
  const operations = {
35
- sectionFromContours: fromContours,
31
+ polygon: (input) => {
32
+ assertActive();
33
+ if (Array.isArray(input))
34
+ return fromContours([input]);
35
+ if (typeof input !== "object" || input === null)
36
+ throwGeometryError("INVALID_ARGUMENT", "polygon", "Use an outline or polygon options.");
37
+ const options = input;
38
+ if ("outer" in options) {
39
+ if ("contours" in options || "fillRule" in options)
40
+ throwGeometryError("INVALID_ARGUMENT", "polygon", "Explicit topology excludes compound fill options.");
41
+ return wrapSection(kernel.regionToCrossSection(scope, [{ outer: options.outer, holes: options.holes === undefined ? [] : options.holes }], limits));
42
+ }
43
+ if (!("contours" in options) || "holes" in options)
44
+ throwGeometryError("INVALID_ARGUMENT", "polygon", "Compound fill requires contours without explicit holes.");
45
+ return fromContours(options.contours, options.fillRule);
46
+ },
36
47
  fromRegion: (region) => {
37
48
  assertActive();
38
49
  return wrapSection(kernel.regionToCrossSection(scope, region, limits));
@@ -77,7 +88,7 @@ export function createSectionOperations(environment, transforms) {
77
88
  },
78
89
  svgPathSection: (path, value = {}) => {
79
90
  const parsed = parseSvgPath(path, withResolutionDefaults(value));
80
- const filled = parsed.groups.map((group) => fromContours(group.contours, { fillRule: group.fillRule }));
91
+ const filled = parsed.groups.map((group) => fromContours(group.contours, group.fillRule));
81
92
  let result = ownSection(module.CrossSection.union(filled.map(nativeSection)));
82
93
  if ((value.origin ?? "center") === "center") {
83
94
  const bounds = nativeSection(result).bounds();
@@ -384,18 +384,20 @@ export function createGenerationGraph(options, maxParts) {
384
384
  // Catching an assertion does not turn its revision into a successful snapshot.
385
385
  assertNoFailedAssertion();
386
386
  declaring = false;
387
- if (!isArray(output) || output.length === 0)
387
+ const parts = isArray(output) ? output : [output];
388
+ if (parts.length === 0)
388
389
  invalid("Generation must return at least one declared part.");
389
- if (output.length > maxParts)
390
+ if (parts.length > maxParts)
390
391
  throw new GeometryError("COMPLEXITY_LIMIT", `Output exceeds ${maxParts} parts.`, {
391
392
  operation: "generate",
392
393
  });
393
394
  const returnedIds = new Set();
394
- for (const descriptor of output) {
395
+ for (const descriptor of parts) {
395
396
  if (!declaredParts.has(descriptor) || returnedIds.has(descriptor.id))
396
397
  invalid("Return each declared output part at most once.");
397
398
  returnedIds.add(descriptor.id);
398
399
  }
400
+ return parts;
399
401
  },
400
402
  dependencies(output) {
401
403
  return createModelDependencies(output, modelParameters, new Map([...computations.nodes].map(([id, node]) => [id, reusableEntry(node)])), readerIds);
@@ -110,8 +110,7 @@ class SessionRevision {
110
110
  generate(revision, deferred, native, mode) {
111
111
  const { program, services, caches } = this.session;
112
112
  const startedAt = performance.now();
113
- const output = program.generate({ ...revision.context, services });
114
- revision.finish(output);
113
+ const output = revision.finish(program.generate({ ...revision.context, services }));
115
114
  if (mode === "validate")
116
115
  return { kind: "validation", diagnostics: Object.freeze([...revision.diagnostics]) };
117
116
  const captured = caches.snapshots.capture({
@@ -0,0 +1,117 @@
1
+ import { GeometryError } from "./errors.js";
2
+ function fail(operation, message) {
3
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation });
4
+ }
5
+ function isArray(value) {
6
+ return Array.isArray(value);
7
+ }
8
+ function vector(values, operation) {
9
+ if (values.some((value) => !Number.isFinite(value)))
10
+ fail(operation, "Bounds calculations must produce finite coordinates.");
11
+ const normalized = values.map((value) => (value === 0 ? 0 : value));
12
+ return values.length === 2
13
+ ? Object.freeze([normalized[0], normalized[1]])
14
+ : Object.freeze([normalized[0], normalized[1], normalized[2]]);
15
+ }
16
+ function validate(bounds, operation) {
17
+ if (typeof bounds !== "object" ||
18
+ bounds === null ||
19
+ !isArray(bounds.min) ||
20
+ !isArray(bounds.max) ||
21
+ (bounds.min.length !== 2 && bounds.min.length !== 3) ||
22
+ bounds.max.length !== bounds.min.length)
23
+ fail(operation, "Bounds require matching XY or XYZ minimum and maximum tuples.");
24
+ for (let axis = 0; axis < bounds.min.length; axis++) {
25
+ const minimum = bounds.min[axis], maximum = bounds.max[axis];
26
+ if (!Number.isFinite(minimum) || !Number.isFinite(maximum) || minimum > maximum)
27
+ fail(operation, "Bounds coordinates must be finite and ordered from minimum to maximum.");
28
+ if (!Number.isFinite(maximum - minimum))
29
+ fail(operation, "Bounds dimensions must be finite.");
30
+ }
31
+ return bounds.min.length;
32
+ }
33
+ function size(bounds) {
34
+ return bounds.max.map((value, axis) => value - bounds.min[axis]);
35
+ }
36
+ function center(bounds) {
37
+ return bounds.min.map((value, axis) => value / 2 + bounds.max[axis] / 2);
38
+ }
39
+ export function boundsFromSize(dimensions, options = {}) {
40
+ const operation = "boundsFromSize";
41
+ if (!isArray(dimensions) ||
42
+ (dimensions.length !== 2 && dimensions.length !== 3) ||
43
+ Array.from(dimensions).some((value) => !Number.isFinite(value) || value < 0))
44
+ fail(operation, "Bounds dimensions require two or three finite nonnegative values.");
45
+ if (typeof options !== "object" ||
46
+ options === null ||
47
+ isArray(options) ||
48
+ (options.center !== undefined && typeof options.center !== "boolean"))
49
+ fail(operation, "Bounds placement requires an optional boolean center value.");
50
+ const centered = options.center ?? true;
51
+ return Object.freeze({
52
+ min: vector(dimensions.map((value) => (centered ? -value / 2 : 0)), operation),
53
+ max: vector(dimensions.map((value) => (centered ? value / 2 : value)), operation),
54
+ });
55
+ }
56
+ export function boundsSize(bounds) {
57
+ validate(bounds, "boundsSize");
58
+ return vector(size(bounds), "boundsSize");
59
+ }
60
+ export function boundsCenter(bounds) {
61
+ validate(bounds, "boundsCenter");
62
+ return vector(center(bounds), "boundsCenter");
63
+ }
64
+ export function containsBounds(outer, inner) {
65
+ const dimension = validate(outer, "containsBounds");
66
+ if (validate(inner, "containsBounds") !== dimension)
67
+ fail("containsBounds", "Contained bounds must have the same dimension.");
68
+ return outer.min.every((value, axis) => inner.min[axis] >= value && inner.max[axis] <= outer.max[axis]);
69
+ }
70
+ export function fitBounds(source, target, options = {}) {
71
+ const operation = "fitBounds";
72
+ const dimension = validate(source, operation);
73
+ if (validate(target, operation) !== dimension)
74
+ fail(operation, "Source and target bounds must have the same dimension.");
75
+ if (typeof options !== "object" || options === null || isArray(options))
76
+ fail(operation, "Fitting options must be an object.");
77
+ if (options.maxScale !== undefined &&
78
+ (!Number.isFinite(options.maxScale) || options.maxScale <= 0))
79
+ fail(operation, "Maximum fitting scale must be finite and positive.");
80
+ const sourceSize = size(source), targetSize = size(target);
81
+ const ratios = sourceSize.flatMap((extent, axis) => extent === 0 ? [] : [targetSize[axis] / extent]);
82
+ if (ratios.length === 0)
83
+ fail(operation, "Fitting needs at least one positive source extent.");
84
+ const scale = Math.min(...ratios, options.maxScale ?? Infinity);
85
+ if (!Number.isFinite(scale) || scale <= 0)
86
+ fail(operation, "Target bounds must allow a finite positive fitting scale.");
87
+ const sourceCenter = center(source), targetCenter = center(target);
88
+ const position = vector(targetCenter.map((value, axis) => value - sourceCenter[axis] * scale), operation);
89
+ const bounds = Object.freeze({
90
+ min: vector(source.min.map((value, axis) => value * scale + position[axis]), operation),
91
+ max: vector(source.max.map((value, axis) => value * scale + position[axis]), operation),
92
+ });
93
+ return Object.freeze({ scale, position, bounds });
94
+ }
95
+ /**
96
+ * Returns immutable translations for a +X row of finite XYZ bounds with a nonnegative gap.
97
+ * Each minimum Y/Z becomes zero, and the first minimum X becomes zero. Supply bounds after
98
+ * any intended part rotation; translations apply to those bounds. An empty input returns [].
99
+ */
100
+ export function layoutRow(bounds, options = {}) {
101
+ const operation = "layoutRow";
102
+ if (!isArray(bounds) || typeof options !== "object" || options === null || isArray(options))
103
+ fail(operation, "Row layout requires bounds and an options object.");
104
+ const gap = options.gap ?? 0;
105
+ if (!Number.isFinite(gap) || gap < 0)
106
+ fail(operation, "Row gap must be finite and nonnegative.");
107
+ let nextX = 0;
108
+ return Object.freeze(Array.from(bounds, (item) => {
109
+ if (validate(item, operation) !== 3)
110
+ fail(operation, "Row layout requires XYZ bounds.");
111
+ const position = vector([nextX - item.min[0], -item.min[1], -item.min[2]], operation);
112
+ nextX += item.max[0] - item.min[0] + gap;
113
+ if (!Number.isFinite(nextX))
114
+ fail(operation, "Row layout exceeds finite coordinates.");
115
+ return position;
116
+ }));
117
+ }
@@ -60,11 +60,15 @@ export function resolveCylinderPrimitive(options) {
60
60
  invalid("Cylinder side dimensions must remain finite.");
61
61
  const sideX = radialChange / sideLength, sideZ = options.height / sideLength;
62
62
  const bottomAngle = Math.acos(-sideX), topAngle = Math.acos(sideX);
63
- const bottom = options.ends?.bottom, top = options.ends?.top;
63
+ let bottom = options.ends?.bottom, top = options.ends?.top;
64
64
  const bottomSetbacks = bottom === undefined
65
65
  ? [0, 0]
66
66
  : edgeTreatmentSetbacks(bottom, "cylinder", bottomAngle, options.limits);
67
67
  const topSetbacks = top === undefined ? [0, 0] : edgeTreatmentSetbacks(top, "cylinder", topAngle, options.limits);
68
+ if (bottomSetbacks[0] === 0 && bottomSetbacks[1] === 0)
69
+ bottom = undefined;
70
+ if (topSetbacks[0] === 0 && topSetbacks[1] === 0)
71
+ top = undefined;
68
72
  if ((bottom && bottomRadius === 0) || (top && topRadius === 0))
69
73
  invalid("A zero-radius cone apex cannot receive an end treatment.");
70
74
  if ((bottom && bottomSetbacks[0] >= bottomRadius) || (top && topSetbacks[0] >= topRadius))
@@ -29,8 +29,8 @@ export function edgeTreatmentSetbacks(treatment, operation, angle = Math.PI / 2,
29
29
  throw new GeometryError("NON_FINITE_VALUE", "Treatment setbacks must be finite.", {
30
30
  operation,
31
31
  });
32
- if (result.some((value) => value <= 0))
33
- fail(operation, "Treatment setbacks must be positive.");
32
+ if (result.some((value) => value < 0) || (result[0] === 0) !== (result[1] === 0))
33
+ fail(operation, "Treatment setbacks must be positive or both zero.");
34
34
  }
35
35
  else if (treatment.kind === "profile") {
36
36
  const points = treatment.profile;
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "./errors.js";
2
- import { validateTriangleMesh } from "./mesh.js";
2
+ import { validateTriangleMesh } from "./mesh/mesh.js";
3
3
  import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "./model-limits.js";
4
4
  import { writeMeshVertex } from "./numeric.js";
5
5
  function planHeightfield(options, limits) {