@metamesh/modeling 0.11.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 (630) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +60 -58
  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 -2267
  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/immutable-generation-data.js +36 -6
  563. package/dist/engine/loft-operations.js +4 -4
  564. package/dist/engine/native/adapter.js +1 -1
  565. package/dist/engine/native/regions.js +9 -9
  566. package/dist/engine/pattern-operations.js +24 -13
  567. package/dist/engine/pattern-transform.js +9 -0
  568. package/dist/engine/placement.js +2 -2
  569. package/dist/engine/primitive-operations.js +10 -10
  570. package/dist/engine/profile-mesh.js +7 -7
  571. package/dist/engine/section-operations.js +25 -14
  572. package/dist/engine/session-graph.js +40 -33
  573. package/dist/engine/session.js +1 -2
  574. package/dist/geometry/bounds.js +117 -0
  575. package/dist/geometry/cylinder.js +5 -1
  576. package/dist/geometry/edge-finishing.js +2 -2
  577. package/dist/geometry/heightfield.js +1 -1
  578. package/dist/geometry/index.js +15 -12
  579. package/dist/geometry/{loft-correspondence.js → loft/loft-correspondence.js} +3 -3
  580. package/dist/geometry/{loft-geometry.js → loft/loft-geometry.js} +8 -8
  581. package/dist/geometry/{loft-options.js → loft/loft-options.js} +2 -2
  582. package/dist/geometry/{loft-simple-mesh.js → loft/loft-simple-mesh.js} +6 -6
  583. package/dist/geometry/{loft-triangulation.js → loft/loft-triangulation.js} +6 -6
  584. package/dist/geometry/{loft.js → loft/loft.js} +8 -8
  585. package/dist/geometry/math/vector3.js +5 -1
  586. package/dist/geometry/mechanical/gears.js +2 -2
  587. package/dist/geometry/mechanical/thread-mesh.js +3 -3
  588. package/dist/geometry/mechanical/thread-profiles.js +2 -2
  589. package/dist/geometry/mechanical/thread-surface.js +14 -5
  590. package/dist/geometry/{mesh-centroid.js → mesh/mesh-centroid.js} +1 -1
  591. package/dist/geometry/{mesh-planar.js → mesh/mesh-planar.js} +1 -1
  592. package/dist/geometry/{mesh-quality.js → mesh/mesh-quality.js} +2 -2
  593. package/dist/geometry/{mesh-signature.js → mesh/mesh-signature.js} +2 -2
  594. package/dist/geometry/{mesh-solid.js → mesh/mesh-solid.js} +2 -2
  595. package/dist/geometry/{mesh.js → mesh/mesh.js} +7 -8
  596. package/dist/geometry/paths/frames.js +4 -5
  597. package/dist/geometry/patterns/options.js +1 -0
  598. package/dist/{engine/pattern-placements.js → geometry/patterns/placements.js} +22 -8
  599. package/dist/geometry/patterns.js +25 -0
  600. package/dist/geometry/primitive-resolvers.js +9 -9
  601. package/dist/geometry/profiles/contour.js +3 -3
  602. package/dist/geometry/profiles/matched.js +3 -3
  603. package/dist/geometry/profiles/profiles.js +10 -10
  604. package/dist/geometry/profiles/rectangle.js +7 -7
  605. package/dist/geometry/profiles/shapes.js +9 -9
  606. package/dist/geometry/profiles/side-profile.js +37 -0
  607. package/dist/geometry/regions.js +15 -15
  608. package/dist/geometry/revolve/revolve-mesh.js +5 -5
  609. package/dist/geometry/stroke-path.js +2 -2
  610. package/dist/geometry/svg/errors.js +0 -3
  611. package/dist/geometry/svg/fill.js +7 -7
  612. package/dist/geometry/svg/index.js +1 -1
  613. package/dist/geometry/svg/matrix.js +0 -114
  614. package/dist/geometry/svg/parser.js +1 -439
  615. package/dist/geometry/svg-import.js +3 -3
  616. package/dist/geometry/sweeps/sweep-closed.js +1 -1
  617. package/dist/geometry/sweeps/sweep-mesh.js +1 -1
  618. package/dist/geometry/sweeps/sweep-open.js +3 -3
  619. package/dist/geometry/sweeps/validation.js +2 -2
  620. package/dist/geometry/text-fitting.js +85 -0
  621. package/dist/geometry/tolerance.js +2 -2
  622. package/dist/geometry/transform-geometry.js +9 -9
  623. package/dist/model/execution-binding.js +3 -3
  624. package/dist/model/generation.js +1 -1
  625. package/dist/model/operation-contracts.js +1 -0
  626. package/dist/model/operation-dispatch.js +6 -0
  627. package/dist/model/operations.js +19 -49
  628. package/package.json +10 -8
  629. /package/dist/geometry/{mesh-edge-table.js → mesh/mesh-edge-table.js} +0 -0
  630. /package/dist/geometry/{mesh-solid-intersections.js → mesh/mesh-solid-intersections.js} +0 -0
@@ -1,50 +1,6 @@
1
- import { SaxesParser } from "saxes";
2
- import { complexity, emptyGeometry, invalid, rethrowAsInvalid, unsupported } from "./errors.js";
3
- import { multiplyMatrices, parseNumberSequence, parseTransform } from "./matrix.js";
1
+ import { complexity, emptyGeometry, invalid } from "./errors.js";
4
2
  import { flattenSvgPath, SvgVertexBudget } from "./path.js";
5
- const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
6
- const XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/";
7
- const MM_PER_PX = 25.4 / 96;
8
3
  const MAX_SVG_BYTES = 1024 * 1024;
9
- const MAX_XML_DEPTH = 64;
10
- const MAX_RENDERED_SHAPES = 10_000;
11
- const SUPPORTED_ELEMENTS = new Set(["svg", "g", "path", "rect", "circle", "ellipse", "polygon"]);
12
- const COMMON_ATTRIBUTES = new Set([
13
- "class",
14
- "display",
15
- "fill",
16
- "fill-opacity",
17
- "fill-rule",
18
- "id",
19
- "opacity",
20
- "stroke",
21
- "stroke-opacity",
22
- "stroke-width",
23
- "style",
24
- "transform",
25
- "visibility",
26
- "xmlns",
27
- ]);
28
- const ELEMENT_ATTRIBUTES = {
29
- circle: new Set(["cx", "cy", "r"]),
30
- ellipse: new Set(["cx", "cy", "rx", "ry"]),
31
- g: new Set(),
32
- path: new Set(["d"]),
33
- polygon: new Set(["points"]),
34
- rect: new Set(["height", "rx", "ry", "width", "x", "y"]),
35
- svg: new Set(["height", "preserveAspectRatio", "version", "viewBox", "width", "x", "y"]),
36
- };
37
- const STYLE_PROPERTIES = new Set([
38
- "display",
39
- "fill",
40
- "fill-opacity",
41
- "fill-rule",
42
- "opacity",
43
- "stroke",
44
- "stroke-opacity",
45
- "stroke-width",
46
- "visibility",
47
- ]);
48
4
  function utf8ByteLength(value) {
49
5
  let bytes = 0;
50
6
  for (let index = 0; index < value.length; index += 1) {
@@ -83,293 +39,6 @@ function parseOptions(options, operation) {
83
39
  }
84
40
  return { origin, resolution: options.resolution ?? {} };
85
41
  }
86
- function parseLength(value, operation) {
87
- const match = /^\s*([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)\s*([A-Za-z%]*)\s*$/.exec(value);
88
- if (match === null)
89
- invalid(operation, `Invalid SVG length "${value}".`);
90
- const scalar = Number(match[1]);
91
- if (!Number.isFinite(scalar))
92
- invalid(operation, "SVG lengths must be finite.");
93
- switch ((match[2] ?? "").toLowerCase()) {
94
- case "":
95
- case "px":
96
- return scalar;
97
- case "mm":
98
- return scalar / MM_PER_PX;
99
- case "cm":
100
- return (scalar * 10) / MM_PER_PX;
101
- case "q":
102
- return (scalar * 0.25) / MM_PER_PX;
103
- case "in":
104
- return scalar * 96;
105
- case "pt":
106
- return scalar * (96 / 72);
107
- case "pc":
108
- return scalar * 16;
109
- case "%":
110
- return unsupported(operation, "Percentage SVG lengths are not supported.");
111
- default:
112
- return unsupported(operation, `Unsupported SVG length unit "${match[2]}".`);
113
- }
114
- }
115
- function parseRootPhysicalLength(value, fallbackPx, operation) {
116
- return parseLength(value ?? String(fallbackPx), operation) * MM_PER_PX;
117
- }
118
- function parseViewBox(value, operation) {
119
- if (value === undefined)
120
- return null;
121
- const numbers = parseNumberSequence(value, operation);
122
- if (numbers.length !== 4)
123
- invalid(operation, "viewBox must contain four numbers.");
124
- const [minX = 0, minY = 0, width = 0, height = 0] = numbers;
125
- if (width <= 0 || height <= 0)
126
- invalid(operation, "viewBox width and height must be positive.");
127
- return { height, minX, minY, width };
128
- }
129
- function viewBoxMatrix(viewBox, viewportWidth, viewportHeight, preserveAspectRatio, operation) {
130
- const setting = preserveAspectRatio?.trim() || "xMidYMid meet";
131
- if (setting === "none") {
132
- const sx = viewportWidth / viewBox.width;
133
- const sy = viewportHeight / viewBox.height;
134
- return [sx, 0, 0, sy, -viewBox.minX * sx, -viewBox.minY * sy];
135
- }
136
- const match = /^(x(?:Min|Mid|Max)Y(?:Min|Mid|Max))(?:\s+(meet|slice))?$/.exec(setting);
137
- if (match === null)
138
- invalid(operation, `Invalid preserveAspectRatio value "${setting}".`);
139
- const scaleX = viewportWidth / viewBox.width;
140
- const scaleY = viewportHeight / viewBox.height;
141
- if (match[2] === "slice") {
142
- unsupported(operation, 'preserveAspectRatio="slice" requires viewport clipping, which is outside the fill-only SVG subset.');
143
- }
144
- const scale = Math.min(scaleX, scaleY);
145
- const spareX = viewportWidth - viewBox.width * scale;
146
- const spareY = viewportHeight - viewBox.height * scale;
147
- const align = match[1] ?? "xMidYMid";
148
- const offsetX = align.startsWith("xMin") ? 0 : align.startsWith("xMid") ? spareX / 2 : spareX;
149
- const offsetY = align.endsWith("YMin") ? 0 : align.endsWith("YMid") ? spareY / 2 : spareY;
150
- return [scale, 0, 0, scale, offsetX - viewBox.minX * scale, offsetY - viewBox.minY * scale];
151
- }
152
- function rootViewport(attributes, operation) {
153
- const width = parseRootPhysicalLength(attributes.width, 300, operation);
154
- const height = parseRootPhysicalLength(attributes.height, 150, operation);
155
- if (width <= 0 || height <= 0)
156
- invalid(operation, "SVG viewport dimensions must be positive.");
157
- const viewBox = parseViewBox(attributes.viewBox, operation);
158
- const downMatrix = viewBox === null
159
- ? [MM_PER_PX, 0, 0, MM_PER_PX, 0, 0]
160
- : viewBoxMatrix(viewBox, width, height, attributes.preserveAspectRatio, operation);
161
- const yUp = [1, 0, 0, -1, 0, height];
162
- return {
163
- matrix: multiplyMatrices(yUp, downMatrix),
164
- viewport: { height, width },
165
- };
166
- }
167
- function nestedSvgMatrix(attributes, operation) {
168
- const x = parseLength(attributes.x ?? "0", operation);
169
- const y = parseLength(attributes.y ?? "0", operation);
170
- const viewBox = parseViewBox(attributes.viewBox, operation);
171
- if (viewBox === null)
172
- return [1, 0, 0, 1, x, y];
173
- const width = parseLength(attributes.width ?? String(viewBox.width), operation);
174
- const height = parseLength(attributes.height ?? String(viewBox.height), operation);
175
- if (width <= 0 || height <= 0)
176
- invalid(operation, "Nested SVG dimensions must be positive.");
177
- return multiplyMatrices([1, 0, 0, 1, x, y], viewBoxMatrix(viewBox, width, height, attributes.preserveAspectRatio, operation));
178
- }
179
- function attributeMap(tag, operation) {
180
- const attributes = {};
181
- const allowed = ELEMENT_ATTRIBUTES[tag.local] ?? new Set();
182
- for (const attribute of Object.values(tag.attributes)) {
183
- if (attribute.uri !== "" && attribute.uri !== XMLNS_NAMESPACE) {
184
- unsupported(operation, `Namespaced attribute "${attribute.name}" is not supported.`);
185
- }
186
- const name = attribute.local === "" ? attribute.name : attribute.local;
187
- if (/^on/i.test(name))
188
- unsupported(operation, "SVG event handler attributes are not supported.");
189
- if (name === "class")
190
- unsupported(operation, "Class-based SVG styling is not supported.");
191
- if (!COMMON_ATTRIBUTES.has(name) &&
192
- !allowed.has(name) &&
193
- !name.startsWith("data-") &&
194
- !name.startsWith("aria-") &&
195
- name !== "role") {
196
- unsupported(operation, `Attribute "${name}" is not supported on <${tag.local}>.`);
197
- }
198
- attributes[name] = attribute.value;
199
- }
200
- return attributes;
201
- }
202
- function parseInlineStyle(value, operation) {
203
- if (value === undefined || value.trim() === "")
204
- return {};
205
- const properties = {};
206
- for (const declaration of value.split(";")) {
207
- if (declaration.trim() === "")
208
- continue;
209
- const separator = declaration.indexOf(":");
210
- if (separator <= 0)
211
- invalid(operation, "Malformed inline SVG style declaration.");
212
- const property = declaration.slice(0, separator).trim().toLowerCase();
213
- const propertyValue = declaration.slice(separator + 1).trim();
214
- if (!STYLE_PROPERTIES.has(property) ||
215
- propertyValue === "" ||
216
- /!\s*important/i.test(propertyValue)) {
217
- unsupported(operation, `Inline SVG style property "${property}" is not supported.`);
218
- }
219
- properties[property] = propertyValue;
220
- }
221
- return properties;
222
- }
223
- function parseOpacity(value, operation) {
224
- const percentage = value.trim().endsWith("%");
225
- const scalar = Number(percentage ? value.trim().slice(0, -1) : value);
226
- if (!Number.isFinite(scalar))
227
- invalid(operation, `Invalid SVG opacity "${value}".`);
228
- const normalized = percentage ? scalar / 100 : scalar;
229
- return Math.min(1, Math.max(0, normalized));
230
- }
231
- function property(attributes, styles, name) {
232
- return styles[name] ?? attributes[name];
233
- }
234
- function resolvePaint(parent, attributes, operation) {
235
- const styles = parseInlineStyle(attributes.style, operation);
236
- const inherited = (name, fallback) => {
237
- const value = property(attributes, styles, name);
238
- return value === undefined || value.trim() === "inherit" ? fallback : value.trim();
239
- };
240
- const displayValue = property(attributes, styles, "display")?.trim() ?? "inline";
241
- if (displayValue !== "none" && displayValue !== "inline" && displayValue !== "block") {
242
- unsupported(operation, `display="${displayValue}" is not supported.`);
243
- }
244
- const visibilityValue = inherited("visibility", parent.visibility);
245
- if (visibilityValue !== "visible" &&
246
- visibilityValue !== "hidden" &&
247
- visibilityValue !== "collapse") {
248
- unsupported(operation, `visibility="${visibilityValue}" is not supported.`);
249
- }
250
- const fillRuleValue = inherited("fill-rule", parent.fillRule);
251
- if (fillRuleValue !== "nonzero" && fillRuleValue !== "evenodd") {
252
- invalid(operation, `Invalid fill-rule "${fillRuleValue}".`);
253
- }
254
- const fill = inherited("fill", parent.fill);
255
- const stroke = inherited("stroke", parent.stroke);
256
- if (/url\s*\(|^(?:context-fill|context-stroke|var\s*\()/i.test(fill)) {
257
- unsupported(operation, "Referenced or context-dependent SVG fill paint is not supported.");
258
- }
259
- if (/url\s*\(|^(?:context-fill|context-stroke|var\s*\()/i.test(stroke)) {
260
- unsupported(operation, "Referenced or context-dependent SVG stroke paint is not supported.");
261
- }
262
- const ownOpacity = property(attributes, styles, "opacity");
263
- const fillOpacity = inherited("fill-opacity", String(parent.fillOpacity));
264
- const strokeOpacity = inherited("stroke-opacity", String(parent.strokeOpacity));
265
- const strokeWidth = inherited("stroke-width", String(parent.strokeWidth));
266
- return {
267
- display: parent.display && displayValue !== "none",
268
- fill,
269
- fillOpacity: parseOpacity(fillOpacity, operation),
270
- fillRule: fillRuleValue,
271
- opacity: parent.opacity * (ownOpacity === undefined ? 1 : parseOpacity(ownOpacity, operation)),
272
- stroke,
273
- strokeOpacity: parseOpacity(strokeOpacity, operation),
274
- strokeWidth: parseLength(strokeWidth, operation),
275
- visibility: visibilityValue === "visible" ? "visible" : "hidden",
276
- };
277
- }
278
- function rendered(paint) {
279
- return paint.display && paint.visibility === "visible" && paint.opacity > 0;
280
- }
281
- function fillVisible(paint) {
282
- const fill = paint.fill.trim().toLowerCase();
283
- return rendered(paint) && paint.fillOpacity > 0 && fill !== "none" && fill !== "transparent";
284
- }
285
- function assertNoVisibleStroke(paint, operation) {
286
- if (rendered(paint) &&
287
- paint.strokeOpacity > 0 &&
288
- paint.strokeWidth > 0 &&
289
- !["none", "transparent"].includes(paint.stroke.trim().toLowerCase())) {
290
- unsupported(operation, "Visible SVG strokes are not supported; expand the stroke to a fill first.");
291
- }
292
- }
293
- function requireAttribute(attributes, name, operation) {
294
- const value = attributes[name];
295
- if (value === undefined || value.trim() === "") {
296
- invalid(operation, `<${operation}> requires a non-empty ${name} attribute.`);
297
- }
298
- return value;
299
- }
300
- function pathForShape(name, attributes, operation) {
301
- switch (name) {
302
- case "path":
303
- return requireAttribute(attributes, "d", operation);
304
- case "polygon": {
305
- const points = parseNumberSequence(requireAttribute(attributes, "points", operation), operation);
306
- if (points.length % 2 !== 0)
307
- invalid(operation, "Polygon points must contain x/y pairs.");
308
- if (points.length < 6)
309
- return null;
310
- const commands = [`M ${points[0]} ${points[1]}`];
311
- for (let index = 2; index < points.length; index += 2) {
312
- commands.push(`L ${points[index]} ${points[index + 1]}`);
313
- }
314
- commands.push("Z");
315
- return commands.join(" ");
316
- }
317
- case "circle": {
318
- const cx = parseLength(attributes.cx ?? "0", operation);
319
- const cy = parseLength(attributes.cy ?? "0", operation);
320
- const radius = parseLength(requireAttribute(attributes, "r", operation), operation);
321
- if (radius < 0)
322
- invalid(operation, "Circle radius cannot be negative.");
323
- if (radius === 0)
324
- return null;
325
- return `M ${cx - radius} ${cy} A ${radius} ${radius} 0 1 0 ${cx + radius} ${cy} A ${radius} ${radius} 0 1 0 ${cx - radius} ${cy} Z`;
326
- }
327
- case "ellipse": {
328
- const cx = parseLength(attributes.cx ?? "0", operation);
329
- const cy = parseLength(attributes.cy ?? "0", operation);
330
- const rx = parseLength(requireAttribute(attributes, "rx", operation), operation);
331
- const ry = parseLength(requireAttribute(attributes, "ry", operation), operation);
332
- if (rx < 0 || ry < 0)
333
- invalid(operation, "Ellipse radii cannot be negative.");
334
- if (rx === 0 || ry === 0)
335
- return null;
336
- return `M ${cx - rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx + rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx - rx} ${cy} Z`;
337
- }
338
- case "rect": {
339
- const x = parseLength(attributes.x ?? "0", operation);
340
- const y = parseLength(attributes.y ?? "0", operation);
341
- const width = parseLength(requireAttribute(attributes, "width", operation), operation);
342
- const height = parseLength(requireAttribute(attributes, "height", operation), operation);
343
- if (width < 0 || height < 0)
344
- invalid(operation, "Rectangle dimensions cannot be negative.");
345
- if (width === 0 || height === 0)
346
- return null;
347
- const rawRx = attributes.rx === undefined ? undefined : parseLength(attributes.rx, operation);
348
- const rawRy = attributes.ry === undefined ? undefined : parseLength(attributes.ry, operation);
349
- if ((rawRx ?? 0) < 0 || (rawRy ?? 0) < 0)
350
- invalid(operation, "Rectangle radii cannot be negative.");
351
- const rx = Math.min(rawRx ?? rawRy ?? 0, width / 2);
352
- const ry = Math.min(rawRy ?? rawRx ?? 0, height / 2);
353
- if (rx === 0 || ry === 0) {
354
- return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;
355
- }
356
- return [
357
- `M ${x + rx} ${y}`,
358
- `H ${x + width - rx}`,
359
- `A ${rx} ${ry} 0 0 1 ${x + width} ${y + ry}`,
360
- `V ${y + height - ry}`,
361
- `A ${rx} ${ry} 0 0 1 ${x + width - rx} ${y + height}`,
362
- `H ${x + rx}`,
363
- `A ${rx} ${ry} 0 0 1 ${x} ${y + height - ry}`,
364
- `V ${y + ry}`,
365
- `A ${rx} ${ry} 0 0 1 ${x + rx} ${y}`,
366
- "Z",
367
- ].join(" ");
368
- }
369
- default:
370
- return null;
371
- }
372
- }
373
42
  function geometryBounds(groups, operation) {
374
43
  let minX = Number.POSITIVE_INFINITY;
375
44
  let minY = Number.POSITIVE_INFINITY;
@@ -427,110 +96,3 @@ export function parseSvgPath(pathData, options = {}) {
427
96
  emptyGeometry(operation, "SVG path contains no filled geometry.");
428
97
  return freezeGeometry([{ contours, fillRule }], null, origin, operation);
429
98
  }
430
- /**
431
- * Parses the supported, fill-only SVG document subset without DOM or browser dependencies.
432
- * Centering is deferred until the adapter has resolved and unioned all fills.
433
- */
434
- export function parseSvgDocument(svg, options = {}) {
435
- const operation = "svgSection";
436
- validateInputSize(svg, operation);
437
- if (/&(?:#\d+|#x[\da-f]+|[A-Za-z_:][\w:.-]*);/i.test(svg)) {
438
- unsupported(operation, "SVG entity references are not supported.");
439
- }
440
- const { origin, resolution } = parseOptions(options, operation);
441
- const groups = [];
442
- const frames = [];
443
- const budget = new SvgVertexBudget(options.limits);
444
- let viewport = null;
445
- let renderedShapes = 0;
446
- let sawRoot = false;
447
- const parser = new SaxesParser({ xmlns: true });
448
- parser.on("doctype", () => unsupported(operation, "SVG doctypes are not supported."));
449
- parser.on("processinginstruction", () => unsupported(operation, "SVG processing instructions are not supported."));
450
- parser.on("cdata", () => unsupported(operation, "SVG CDATA sections are not supported."));
451
- parser.on("text", (text) => {
452
- if (/\S/.test(text))
453
- unsupported(operation, "Text content is not supported in fill-only SVG.");
454
- });
455
- parser.on("opentag", (tag) => {
456
- if (frames.length >= MAX_XML_DEPTH) {
457
- complexity(operation, `SVG nesting exceeds ${MAX_XML_DEPTH} levels.`, {
458
- maxDepth: MAX_XML_DEPTH,
459
- });
460
- }
461
- if (tag.uri !== "" && tag.uri !== SVG_NAMESPACE) {
462
- unsupported(operation, `Element namespace "${tag.uri}" is not supported.`);
463
- }
464
- const name = tag.local;
465
- if (!SUPPORTED_ELEMENTS.has(name)) {
466
- unsupported(operation, `SVG element <${name}> is not supported.`);
467
- }
468
- if (!sawRoot && name !== "svg")
469
- invalid(operation, "The document root must be an <svg> element.");
470
- const attributes = attributeMap(tag, operation);
471
- const parent = frames.at(-1);
472
- const parentPaint = parent?.paint ?? {
473
- display: true,
474
- fill: "black",
475
- fillOpacity: 1,
476
- fillRule: "nonzero",
477
- opacity: 1,
478
- stroke: "none",
479
- strokeOpacity: 1,
480
- strokeWidth: 1,
481
- visibility: "visible",
482
- };
483
- const paint = resolvePaint(parentPaint, attributes, operation);
484
- const explicitTransform = parseTransform(attributes.transform, operation);
485
- let matrix;
486
- if (!sawRoot) {
487
- const root = rootViewport(attributes, operation);
488
- viewport = root.viewport;
489
- matrix = multiplyMatrices(root.matrix, explicitTransform);
490
- sawRoot = true;
491
- }
492
- else if (name === "svg") {
493
- if (parent === undefined)
494
- invalid(operation, "Nested SVG has no parent coordinate system.");
495
- matrix = multiplyMatrices(parent.matrix, multiplyMatrices(explicitTransform, nestedSvgMatrix(attributes, operation)));
496
- }
497
- else {
498
- if (parent === undefined)
499
- invalid(operation, "SVG element has no root coordinate system.");
500
- matrix = multiplyMatrices(parent.matrix, explicitTransform);
501
- }
502
- const frame = { matrix, name, paint };
503
- frames.push(frame);
504
- if (name === "svg" || name === "g")
505
- return;
506
- assertNoVisibleStroke(paint, operation);
507
- if (!fillVisible(paint))
508
- return;
509
- renderedShapes += 1;
510
- if (renderedShapes > MAX_RENDERED_SHAPES) {
511
- complexity(operation, `SVG exceeds ${MAX_RENDERED_SHAPES} rendered shapes.`, {
512
- maxShapes: MAX_RENDERED_SHAPES,
513
- });
514
- }
515
- const pathData = pathForShape(name, attributes, operation);
516
- if (pathData === null)
517
- return;
518
- const contours = flattenSvgPath(pathData, matrix, resolution, budget, operation);
519
- if (contours.length > 0)
520
- groups.push({ contours, fillRule: paint.fillRule });
521
- });
522
- parser.on("closetag", () => {
523
- frames.pop();
524
- });
525
- try {
526
- parser.write(svg).close();
527
- }
528
- catch (error) {
529
- rethrowAsInvalid(operation, error);
530
- }
531
- if (!sawRoot)
532
- invalid(operation, "SVG document is empty.");
533
- if (frames.length !== 0)
534
- invalid(operation, "SVG document has unclosed elements.");
535
- return freezeGeometry(groups, viewport, origin, operation);
536
- }
@@ -1,6 +1,6 @@
1
1
  import { SaxesParser } from "saxes";
2
2
  import { GeometryError } from "./errors.js";
3
- import { regionArea, signedAreaLoop2 } from "./regions.js";
3
+ import { regionArea, signedContourArea } from "./regions.js";
4
4
  import { resolveCircularSegments, resolveGeometryResolution, } from "./resolution.js";
5
5
  import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
6
6
  import { strokePathMultiPolygon } from "./stroke-path.js";
@@ -413,8 +413,8 @@ function transformMultiPolygon(value, matrix) {
413
413
  })));
414
414
  }
415
415
  function polygonArea(polygon) {
416
- return (Math.abs(signedAreaLoop2(polygon.outer)) -
417
- polygon.holes.reduce((total, hole) => total + Math.abs(signedAreaLoop2(hole)), 0));
416
+ return (Math.abs(signedContourArea(polygon.outer)) -
417
+ polygon.holes.reduce((total, hole) => total + Math.abs(signedContourArea(hole)), 0));
418
418
  }
419
419
  function loopEdgeLengths(loop) {
420
420
  return loop.map((point, index) => {
@@ -1,6 +1,6 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { add3, rotateAroundAxis3, scale3 } from "../math/vector3.js";
3
- import { validateTriangleMesh } from "../mesh.js";
3
+ import { validateTriangleMesh } from "../mesh/mesh.js";
4
4
  import { resolveGeometryTolerance } from "../tolerance.js";
5
5
  import { resolveSweepScales } from "./options.js";
6
6
  import { computeSweepFrames, validateSweepOptions } from "./orientation.js";
@@ -7,7 +7,7 @@ import { buildOpenSweepMesh } from "./sweep-open.js";
7
7
  *
8
8
  * @example Sweep point data along a bent path
9
9
  * ```ts
10
- * const profile = rectangleLoop({ size: [6, 3] });
10
+ * const profile = rectangleContour({ size: [6, 3] });
11
11
  * sweepMesh(profile, [[0, 0, 0], [0, 0, 15], [10, 0, 25]], {
12
12
  * orientation: { kind: "transport", initialNormal: [0, 1, 0] },
13
13
  * });
@@ -1,6 +1,6 @@
1
- import { triangulateLoop2 } from "../loft.js";
1
+ import { triangulateContour } from "../loft/loft.js";
2
2
  import { add3, rotateAroundAxis3, scale3 } from "../math/vector3.js";
3
- import { validateTriangleMesh } from "../mesh.js";
3
+ import { validateTriangleMesh } from "../mesh/mesh.js";
4
4
  import { resolveSweepScales } from "./options.js";
5
5
  import { computeSweepFrames, validateSweepOptions } from "./orientation.js";
6
6
  import { planSweepStations, refineSweepStations } from "./stations.js";
@@ -29,7 +29,7 @@ export const buildOpenSweepMesh = (profile, path, options = {}) => {
29
29
  frames = refined.frames;
30
30
  twists = refined.twists;
31
31
  }
32
- const caps = triangulateLoop2(profile);
32
+ const caps = triangulateContour(profile);
33
33
  const ringVertexCount = profile.length;
34
34
  const sideVertexCount = path.length * ringVertexCount;
35
35
  const positions = new Float32Array(sideVertexCount * 3);
@@ -1,7 +1,7 @@
1
1
  import { GeometryError } from "../errors.js";
2
2
  import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
3
3
  import { writeMeshVertex } from "../numeric.js";
4
- import { normalizeLoop2 } from "../regions.js";
4
+ import { normalizeContour } from "../regions.js";
5
5
  import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
6
6
  import { resolveGeometryTolerance } from "../tolerance.js";
7
7
  /** @internal Normalizes simple profiles before cap triangulation or side construction. */
@@ -26,7 +26,7 @@ export function normalizeSweepProfile(profile, operation, limits = {}) {
26
26
  });
27
27
  }
28
28
  }
29
- return normalizeLoop2(profile, true);
29
+ return normalizeContour(profile, true);
30
30
  }
31
31
  /** @internal Cleans redundant path samples and validates finite, non-degenerate centered tangents. */
32
32
  export function normalizeSweepPath(path, closed, operation, limits = {}) {
@@ -0,0 +1,85 @@
1
+ import { SVGPathData, SVGPathDataTransformer } from "svg-pathdata";
2
+ import { boundsSize, fitBounds } from "./bounds.js";
3
+ import { GeometryError } from "./errors.js";
4
+ function fail(message) {
5
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation: "fitTextLayout" });
6
+ }
7
+ /**
8
+ * Uniformly fits visible text ink inside finite XY bounds, centering it on the target.
9
+ * Transforms retained vector paths before sampling, so later textSection/sampleTextContours
10
+ * resolution remains in final millimetres. Logical advances scale without translation;
11
+ * line count is unchanged. The input layout is preserved.
12
+ *
13
+ * @param layout - Prepared nonempty vector text with positive visible width and height.
14
+ * @param target - Positioned available bounds in millimetres; both extents must be positive.
15
+ * @param options - Optional positive maximum scale; use 1 to shrink only.
16
+ * @returns A deeply immutable layout with transformed paths, ink bounds, and physical metrics.
17
+ * @throws GeometryError for invisible, degenerate, malformed, nonfinite, or oversized text.
18
+ */
19
+ export function fitTextLayout(layout, target, options = {}) {
20
+ if (typeof layout !== "object" ||
21
+ layout === null ||
22
+ !Array.isArray(layout.paths) ||
23
+ layout.paths.length === 0 ||
24
+ layout.paths.length > 1000 ||
25
+ typeof layout.metrics !== "object" ||
26
+ layout.metrics === null ||
27
+ layout.metrics.bounds === null)
28
+ fail("Prepared text needs visible outlines and ink bounds, with at most 1000 paths.");
29
+ if (boundsSize(layout.metrics.bounds).some((extent) => extent <= 0))
30
+ fail("Prepared text needs positive visible width and height.");
31
+ const fit = fitBounds(layout.metrics.bounds, target, options);
32
+ const { scale, position: [x, y], } = fit;
33
+ let bytes = 0, outputBytes = 0, commands = 0;
34
+ const paths = layout.paths.map((path) => {
35
+ if (typeof path !== "string")
36
+ fail("Prepared text paths must be strings.");
37
+ bytes += path.length;
38
+ if (bytes > 1024 * 1024)
39
+ fail("Prepared text paths exceed 1 MiB.");
40
+ let parsed;
41
+ try {
42
+ parsed = new SVGPathData(path);
43
+ }
44
+ catch {
45
+ return fail("Prepared text contains invalid path data.");
46
+ }
47
+ commands += parsed.commands.length;
48
+ if (commands > 32000)
49
+ fail("Prepared text exceeds 32000 path commands.");
50
+ parsed.transform(SVGPathDataTransformer.MATRIX(scale, 0, 0, scale, x, y));
51
+ if (parsed.commands.some((command) => Object.values(command).some((value) => typeof value === "number" && !Number.isFinite(value))))
52
+ fail("Fitted text coordinates must be finite.");
53
+ const encoded = parsed.encode();
54
+ outputBytes += encoded.length;
55
+ if (outputBytes > 1024 * 1024)
56
+ fail("Fitted text paths exceed 1 MiB.");
57
+ return encoded;
58
+ });
59
+ if (paths.every((path) => path === ""))
60
+ fail("Prepared text needs visible outlines.");
61
+ const scaled = (value) => {
62
+ const result = value * scale;
63
+ if (!Number.isFinite(result))
64
+ fail("Fitted text metrics must be finite.");
65
+ return result;
66
+ };
67
+ const metrics = layout.metrics;
68
+ if (!Array.isArray(metrics.advance) ||
69
+ metrics.advance.length !== 2 ||
70
+ !Number.isSafeInteger(metrics.lineCount) ||
71
+ metrics.lineCount < 1)
72
+ fail("Prepared text needs a logical XY advance and a positive line count.");
73
+ return Object.freeze({
74
+ paths: Object.freeze(paths),
75
+ metrics: Object.freeze({
76
+ bounds: fit.bounds,
77
+ advance: Object.freeze([scaled(metrics.advance[0]), scaled(metrics.advance[1])]),
78
+ logicalWidth: scaled(metrics.logicalWidth),
79
+ ascent: scaled(metrics.ascent),
80
+ descent: scaled(metrics.descent),
81
+ lineHeight: scaled(metrics.lineHeight),
82
+ lineCount: metrics.lineCount,
83
+ }),
84
+ });
85
+ }
@@ -18,8 +18,8 @@ const positiveFinite = (value, label) => {
18
18
  * Resolves comparison tolerances for a characteristic model scale.
19
19
  *
20
20
  * The effective linear tolerance is `max(absolute, relative * abs(scale))`.
21
- * Supplying a scale of zero therefore retains the absolute floor. The function
22
- * returns a new frozen value with finite distance and area thresholds and never mutates `options`.
21
+ * A zero scale retains the absolute floor. Returns a new frozen value with finite distance and
22
+ * area thresholds without mutating `options`.
23
23
  *
24
24
  * @param scale - Finite characteristic size in model units.
25
25
  * @param options - Optional policy overrides.
@@ -1,5 +1,5 @@
1
1
  import { GeometryError } from "./errors.js";
2
- import { normalizeLoop2, normalizeRegion2, signedAreaLoop2 } from "./regions.js";
2
+ import { normalizeContour, normalizeRegion, signedContourArea } from "./regions.js";
3
3
  import { resolveGeometryTolerance } from "./tolerance.js";
4
4
  import { applyTransformPoint3, validateTransform3 } from "./transform3.js";
5
5
  /** Applies an affine transform to a 3D path without mutating its points. */
@@ -27,15 +27,15 @@ export function transformPath2(path, transform, tolerance = {}) {
27
27
  *
28
28
  * Reflections reverse the point order automatically through normalization.
29
29
  */
30
- export function transformLoop2(loop, transform, tolerance = {}) {
31
- const counterClockwise = signedAreaLoop2(loop) > 0;
32
- const normalized = normalizeLoop2(loop, counterClockwise, tolerance);
33
- return normalizeLoop2(transformPath2(normalized, transform, tolerance), counterClockwise, tolerance);
30
+ export function transformContour(loop, transform, tolerance = {}) {
31
+ const counterClockwise = signedContourArea(loop) > 0;
32
+ const normalized = normalizeContour(loop, counterClockwise, tolerance);
33
+ return normalizeContour(transformPath2(normalized, transform, tolerance), counterClockwise, tolerance);
34
34
  }
35
35
  /** Transforms an explicit outer/hole region with reflection-safe winding correction. */
36
- export function transformRegion2(region, transform, tolerance = {}) {
37
- return normalizeRegion2(region.map((polygon) => ({
38
- holes: polygon.holes.map((hole) => transformLoop2(hole, transform, tolerance)),
39
- outer: transformLoop2(polygon.outer, transform, tolerance),
36
+ export function transformRegion(region, transform, tolerance = {}) {
37
+ return normalizeRegion(region.map((polygon) => ({
38
+ holes: polygon.holes.map((hole) => transformContour(hole, transform, tolerance)),
39
+ outer: transformContour(polygon.outer, transform, tolerance),
40
40
  })), tolerance);
41
41
  }