@metamesh/modeling 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (775) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +55 -13
  3. package/dist/api/engine.d.ts +15 -7
  4. package/dist/api/geometry.d.ts +853 -562
  5. package/dist/api/index.d.ts +604 -227
  6. package/dist/api/text.d.ts +9 -7
  7. package/dist/docs/guides/concepts.md +295 -91
  8. package/dist/docs/guides/fonts.md +9 -8
  9. package/dist/docs/guides/fundamentals.md +22 -23
  10. package/dist/docs/guides/generation.md +24 -23
  11. package/dist/docs/guides/hosting.md +26 -11
  12. package/dist/docs/guides/recipes.md +74 -48
  13. package/dist/docs/guides/standalone-model.md +42 -0
  14. package/dist/docs/manifest.json +1555 -749
  15. package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
  16. package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
  17. package/dist/docs/reference/engine/GenerationOptions.md +1 -1
  18. package/dist/docs/reference/engine/GeometryResource.md +1 -1
  19. package/dist/docs/reference/engine/ModelDependencies.md +1 -1
  20. package/dist/docs/reference/engine/ModelEngine.md +1 -1
  21. package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
  22. package/dist/docs/reference/engine/ModelSession.md +1 -1
  23. package/dist/docs/reference/engine/ModelSnapshot.md +21 -10
  24. package/dist/docs/reference/engine/SessionOptions.md +1 -1
  25. package/dist/docs/reference/engine/SnapshotPart.md +6 -3
  26. package/dist/docs/reference/engine/categories/host-lifecycle.md +7 -2
  27. package/dist/docs/reference/engine/createModelEngine.md +3 -3
  28. package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
  29. package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
  30. package/dist/docs/reference/engine/validateModel.md +1 -1
  31. package/dist/docs/reference/engine.md +6 -2
  32. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +5 -1
  33. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
  34. package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +6 -5
  35. package/dist/docs/reference/geometry/ArcCurve2.md +11 -7
  36. package/dist/docs/reference/geometry/ArcCurve3.md +13 -9
  37. package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +11 -5
  38. package/dist/docs/reference/geometry/AxisAngleRotation3.md +2 -1
  39. package/dist/docs/reference/geometry/Bounds2-type.md +127 -0
  40. package/dist/docs/reference/geometry/Bounds2Data.md +45 -0
  41. package/dist/docs/reference/geometry/Bounds2Input.md +21 -0
  42. package/dist/docs/reference/geometry/Bounds3-type.md +127 -0
  43. package/dist/docs/reference/geometry/Bounds3Data.md +45 -0
  44. package/dist/docs/reference/geometry/Bounds3Input.md +21 -0
  45. package/dist/docs/reference/geometry/BoundsFit2.md +6 -5
  46. package/dist/docs/reference/geometry/BoundsFit3.md +6 -5
  47. package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -1
  48. package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +2 -1
  49. package/dist/docs/reference/geometry/BoxAnchorFace.md +2 -1
  50. package/dist/docs/reference/geometry/BoxAnchorOptions.md +5 -4
  51. package/dist/docs/reference/geometry/BoxEdge.md +1 -1
  52. package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
  53. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
  54. package/dist/docs/reference/geometry/BoxOptions.md +10 -10
  55. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +8 -1
  56. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +5 -1
  57. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
  58. package/dist/docs/reference/geometry/CircleContourOptions.md +5 -1
  59. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
  60. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -7
  61. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +6 -1
  62. package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -1
  63. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +6 -1
  64. package/dist/docs/reference/geometry/Contour.md +10 -4
  65. package/dist/docs/reference/geometry/ContourCurve.md +5 -1
  66. package/dist/docs/reference/geometry/ContourPoint.md +6 -1
  67. package/dist/docs/reference/geometry/ContourSegment.md +5 -1
  68. package/dist/docs/reference/geometry/CorrespondingComponent.md +5 -1
  69. package/dist/docs/reference/geometry/CorrespondingContour.md +5 -1
  70. package/dist/docs/reference/geometry/CorrespondingProfile.md +5 -1
  71. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +5 -1
  72. package/dist/docs/reference/geometry/CubicBezierCurve2.md +10 -6
  73. package/dist/docs/reference/geometry/CubicBezierCurve3.md +10 -6
  74. package/dist/docs/reference/geometry/Curve2.md +5 -1
  75. package/dist/docs/reference/geometry/Curve3.md +5 -1
  76. package/dist/docs/reference/geometry/CurveSamplingOptions.md +9 -3
  77. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +7 -3
  78. package/dist/docs/reference/geometry/CylinderAnchorFace.md +2 -1
  79. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +6 -5
  80. package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
  81. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -3
  82. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -1
  83. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +5 -1
  84. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +7 -3
  85. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +5 -1
  86. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +6 -1
  87. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +5 -1
  88. package/dist/docs/reference/geometry/CylindricalGearSpec.md +11 -6
  89. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
  90. package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
  91. package/dist/docs/reference/geometry/EllipseContourOptions.md +7 -3
  92. package/dist/docs/reference/geometry/EndTreatments.md +1 -1
  93. package/dist/docs/reference/geometry/ExtrudeOptions.md +10 -6
  94. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -5
  95. package/dist/docs/reference/geometry/FittedTextLayout.md +7 -3
  96. package/dist/docs/reference/geometry/Frame3.md +10 -6
  97. package/dist/docs/reference/geometry/GeometryError.md +1 -1
  98. package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
  99. package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
  100. package/dist/docs/reference/geometry/GeometryResolution.md +5 -5
  101. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +5 -1
  102. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
  103. package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
  104. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +5 -1
  105. package/dist/docs/reference/geometry/HeightfieldOptions.md +9 -5
  106. package/dist/docs/reference/geometry/HeightfieldPreflight.md +9 -4
  107. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +9 -5
  108. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +10 -6
  109. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +7 -2
  110. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +4 -3
  111. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +10 -6
  112. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +82 -0
  113. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +148 -0
  114. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +46 -0
  115. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +51 -0
  116. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +22 -0
  117. package/dist/docs/reference/geometry/LineCurve2.md +8 -4
  118. package/dist/docs/reference/geometry/LineCurve3.md +8 -4
  119. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
  120. package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
  121. package/dist/docs/reference/geometry/LoftMeshStation.md +8 -4
  122. package/dist/docs/reference/geometry/LoftOptions.md +5 -1
  123. package/dist/docs/reference/geometry/LoftPlacement.md +5 -1
  124. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +5 -1
  125. package/dist/docs/reference/geometry/MatchProfilesOptions.md +5 -1
  126. package/dist/docs/reference/geometry/MetricFastenerSize.md +9 -2
  127. package/dist/docs/reference/geometry/MetricFastenerStandard.md +5 -1
  128. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +6 -1
  129. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +6 -1
  130. package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
  131. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +5 -1
  132. package/dist/docs/reference/geometry/Path2-type.md +196 -0
  133. package/dist/docs/reference/geometry/Path2Data.md +50 -0
  134. package/dist/docs/reference/geometry/Path2Input.md +20 -0
  135. package/dist/docs/reference/geometry/Path3-type.md +196 -0
  136. package/dist/docs/reference/geometry/Path3Data.md +50 -0
  137. package/dist/docs/reference/geometry/Path3Input.md +20 -0
  138. package/dist/docs/reference/geometry/PathFrame.md +9 -5
  139. package/dist/docs/reference/geometry/PathLocation.md +69 -0
  140. package/dist/docs/reference/geometry/PathNormalGuide.md +10 -5
  141. package/dist/docs/reference/geometry/PathOptions.md +38 -0
  142. package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
  143. package/dist/docs/reference/geometry/PathPlacement.md +8 -4
  144. package/dist/docs/reference/geometry/PathResamplingOptions.md +84 -0
  145. package/dist/docs/reference/geometry/Pivot2Options.md +2 -1
  146. package/dist/docs/reference/geometry/Pivot3Options.md +2 -1
  147. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +8 -1
  148. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +26 -22
  149. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +5 -1
  150. package/dist/docs/reference/geometry/PlanarPatchQuality.md +7 -3
  151. package/dist/docs/reference/geometry/PolygonData.md +7 -2
  152. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -4
  153. package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
  154. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
  155. package/dist/docs/reference/geometry/PrintableThreadFit.md +8 -1
  156. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +6 -1
  157. package/dist/docs/reference/geometry/Profile.md +8 -2
  158. package/dist/docs/reference/geometry/ProfileComponent2.md +5 -1
  159. package/dist/docs/reference/geometry/ProfileContour2.md +8 -2
  160. package/dist/docs/reference/geometry/ProfileSpan2.md +7 -3
  161. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
  162. package/dist/docs/reference/geometry/RackPitchDimensions.md +6 -1
  163. package/dist/docs/reference/geometry/RackPitchSpec.md +10 -5
  164. package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
  165. package/dist/docs/reference/geometry/RadialSizing.md +1 -1
  166. package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
  167. package/dist/docs/reference/geometry/RectangleContourOptions.md +7 -3
  168. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +5 -1
  169. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +5 -1
  170. package/dist/docs/reference/geometry/RectangleProfileOptions.md +7 -3
  171. package/dist/docs/reference/geometry/RegionData.md +6 -2
  172. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +7 -3
  173. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
  174. package/dist/docs/reference/geometry/RevolveOptions.md +13 -4
  175. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
  176. package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -1
  177. package/dist/docs/reference/geometry/SampleContourOptions.md +7 -3
  178. package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
  179. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +7 -3
  180. package/dist/docs/reference/geometry/SampledCurve2.md +8 -4
  181. package/dist/docs/reference/geometry/SampledCurve3.md +8 -4
  182. package/dist/docs/reference/geometry/SampledThreadHelices.md +7 -3
  183. package/dist/docs/reference/geometry/SideProfileCurve.md +5 -1
  184. package/dist/docs/reference/geometry/SideProfilePoint.md +6 -1
  185. package/dist/docs/reference/geometry/SideProfileSegment.md +5 -1
  186. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
  187. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +7 -3
  188. package/dist/docs/reference/geometry/SphereOptions.md +3 -3
  189. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
  190. package/dist/docs/reference/geometry/StrokeCap.md +14 -0
  191. package/dist/docs/reference/geometry/StrokeJoin.md +14 -0
  192. package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +11 -7
  193. package/dist/docs/reference/geometry/SvgImportOptions.md +5 -1
  194. package/dist/docs/reference/geometry/SvgRegionPreflight.md +6 -2
  195. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +19 -15
  196. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +16 -11
  197. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +14 -9
  198. package/dist/docs/reference/geometry/SweepOptions.md +10 -6
  199. package/dist/docs/reference/geometry/SweepOrientation.md +11 -7
  200. package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
  201. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +9 -5
  202. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +5 -1
  203. package/dist/docs/reference/geometry/ThreadEndStyle.md +8 -1
  204. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +5 -1
  205. package/dist/docs/reference/geometry/ThreadHandedness.md +8 -1
  206. package/dist/docs/reference/geometry/ThreadHelixOptions.md +7 -3
  207. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
  208. package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
  209. package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +7 -3
  210. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +5 -1
  211. package/dist/docs/reference/geometry/ThreadProfileSpec.md +5 -1
  212. package/dist/docs/reference/geometry/ThreadRole.md +8 -1
  213. package/dist/docs/reference/geometry/ThreadedNutBevel.md +8 -1
  214. package/dist/docs/reference/geometry/ThreadedNutOptions.md +10 -6
  215. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +7 -3
  216. package/dist/docs/reference/geometry/ThreadedNutShape.md +8 -1
  217. package/dist/docs/reference/geometry/ThreadedRodOptions.md +10 -6
  218. package/dist/docs/reference/geometry/TorusOptions.md +8 -8
  219. package/dist/docs/reference/geometry/Transform2-type.md +6 -5
  220. package/dist/docs/reference/geometry/Transform2Data.md +15 -0
  221. package/dist/docs/reference/geometry/Transform2Input.md +4 -3
  222. package/dist/docs/reference/geometry/Transform3-type.md +6 -5
  223. package/dist/docs/reference/geometry/Transform3Data.md +18 -0
  224. package/dist/docs/reference/geometry/Transform3Input.md +4 -3
  225. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +9 -4
  226. package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
  227. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +8 -4
  228. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +5 -1
  229. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +7 -3
  230. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +7 -3
  231. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
  232. package/dist/docs/reference/geometry/TriangleMeshSignature.md +8 -4
  233. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +8 -3
  234. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +6 -1
  235. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +5 -1
  236. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +5 -1
  237. package/dist/docs/reference/geometry/TubeOptions.md +8 -8
  238. package/dist/docs/reference/geometry/Vector2-type.md +6 -5
  239. package/dist/docs/reference/geometry/Vector2Data.md +15 -0
  240. package/dist/docs/reference/geometry/Vector2Input.md +4 -3
  241. package/dist/docs/reference/geometry/Vector3-type.md +6 -5
  242. package/dist/docs/reference/geometry/Vector3Data.md +15 -0
  243. package/dist/docs/reference/geometry/Vector3Input.md +4 -3
  244. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +8 -3
  245. package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
  246. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +5 -1
  247. package/dist/docs/reference/geometry/VectorTextMetrics.md +7 -3
  248. package/dist/docs/reference/geometry/VectorTextOptions.md +5 -1
  249. package/dist/docs/reference/geometry/add2.md +7 -6
  250. package/dist/docs/reference/geometry/add3.md +7 -6
  251. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +5 -1
  252. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +6 -2
  253. package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +10 -9
  254. package/dist/docs/reference/geometry/anchorFrame3.md +9 -5
  255. package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
  256. package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
  257. package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +16 -15
  258. package/dist/docs/reference/geometry/bounds2.md +38 -0
  259. package/dist/docs/reference/geometry/bounds3.md +38 -0
  260. package/dist/docs/reference/geometry/boundsCenter.md +12 -11
  261. package/dist/docs/reference/geometry/boundsFromSize.md +12 -11
  262. package/dist/docs/reference/geometry/boundsSize.md +12 -11
  263. package/dist/docs/reference/geometry/boxAnchor3.md +7 -6
  264. package/dist/docs/reference/geometry/categories/bounds-layout.md +23 -6
  265. package/dist/docs/reference/geometry/categories/curves-paths.md +27 -13
  266. package/dist/docs/reference/geometry/categories/mechanical.md +27 -15
  267. package/dist/docs/reference/geometry/categories/meshes.md +18 -10
  268. package/dist/docs/reference/geometry/categories/pattern-placement.md +11 -9
  269. package/dist/docs/reference/geometry/categories/primitive-options.md +10 -4
  270. package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -13
  271. package/dist/docs/reference/geometry/categories/resolution-errors.md +5 -3
  272. package/dist/docs/reference/geometry/categories/transforms-math.md +25 -16
  273. package/dist/docs/reference/geometry/categories/vector-import.md +15 -9
  274. package/dist/docs/reference/geometry/circleContour.md +5 -1
  275. package/dist/docs/reference/geometry/closeToAxis.md +14 -5
  276. package/dist/docs/reference/geometry/compensateThreadDiameters.md +5 -1
  277. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +9 -5
  278. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +9 -5
  279. package/dist/docs/reference/geometry/composeTransform3.md +7 -6
  280. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +14 -6
  281. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +17 -7
  282. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
  283. package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +8 -4
  284. package/dist/docs/reference/geometry/containsBounds.md +10 -9
  285. package/dist/docs/reference/geometry/contourContainsPoint.md +8 -4
  286. package/dist/docs/reference/geometry/cross2.md +6 -5
  287. package/dist/docs/reference/geometry/cross3.md +7 -6
  288. package/dist/docs/reference/geometry/cylinderAnchor3.md +7 -6
  289. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +5 -1
  290. package/dist/docs/reference/geometry/distance2.md +6 -5
  291. package/dist/docs/reference/geometry/distance3.md +6 -5
  292. package/dist/docs/reference/geometry/distributeAlongPath.md +12 -6
  293. package/dist/docs/reference/geometry/dot2.md +6 -5
  294. package/dist/docs/reference/geometry/dot3.md +6 -5
  295. package/dist/docs/reference/geometry/ellipseContour.md +5 -1
  296. package/dist/docs/reference/geometry/eulerTransform3.md +7 -6
  297. package/dist/docs/reference/geometry/extrudeMesh.md +12 -8
  298. package/dist/docs/reference/geometry/fitBounds.md +10 -9
  299. package/dist/docs/reference/geometry/fitTextLayout.md +13 -5
  300. package/dist/docs/reference/geometry/frameTransform3.md +5 -4
  301. package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +7 -3
  302. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
  303. package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
  304. package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
  305. package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +9 -5
  306. package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +9 -5
  307. package/dist/docs/reference/geometry/inverseTransform3.md +6 -5
  308. package/dist/docs/reference/geometry/isGeometryError.md +5 -2
  309. package/dist/docs/reference/geometry/joinTriangleMeshes.md +5 -1
  310. package/dist/docs/reference/geometry/layoutRow.md +11 -7
  311. package/dist/docs/reference/geometry/length2.md +5 -4
  312. package/dist/docs/reference/geometry/length3.md +5 -4
  313. package/dist/docs/reference/geometry/lerp2.md +7 -6
  314. package/dist/docs/reference/geometry/lerp3.md +7 -6
  315. package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
  316. package/dist/docs/reference/geometry/loftMesh.md +6 -1
  317. package/dist/docs/reference/geometry/matchProfiles.md +11 -2
  318. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +5 -1
  319. package/dist/docs/reference/geometry/meshBounds.md +8 -4
  320. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +7 -3
  321. package/dist/docs/reference/geometry/normalize2.md +10 -6
  322. package/dist/docs/reference/geometry/normalize3.md +10 -6
  323. package/dist/docs/reference/geometry/normalizeContour.md +8 -4
  324. package/dist/docs/reference/geometry/normalizePolygon.md +5 -1
  325. package/dist/docs/reference/geometry/normalizeRegion.md +5 -1
  326. package/dist/docs/reference/geometry/optimizePlanarPatches.md +15 -11
  327. package/dist/docs/reference/geometry/path2.md +54 -0
  328. package/dist/docs/reference/geometry/path3.md +49 -0
  329. package/dist/docs/reference/geometry/pathPatternTransforms.md +13 -9
  330. package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
  331. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +13 -4
  332. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +15 -4
  333. package/dist/docs/reference/geometry/preflightSvgRegion.md +15 -2
  334. package/dist/docs/reference/geometry/preflightThreadedNut.md +14 -4
  335. package/dist/docs/reference/geometry/preflightThreadedRod.md +14 -4
  336. package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
  337. package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
  338. package/dist/docs/reference/geometry/rectangleContour.md +10 -3
  339. package/dist/docs/reference/geometry/rectangleProfile.md +10 -2
  340. package/dist/docs/reference/geometry/regionArea.md +5 -1
  341. package/dist/docs/reference/geometry/regionBounds.md +8 -4
  342. package/dist/docs/reference/geometry/regularPolygonContour.md +9 -5
  343. package/dist/docs/reference/geometry/resamplePolyline2.md +9 -5
  344. package/dist/docs/reference/geometry/resamplePolyline3.md +9 -5
  345. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +4 -4
  346. package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
  347. package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
  348. package/dist/docs/reference/geometry/resolveCylindricalGear.md +5 -1
  349. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +5 -1
  350. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +7 -3
  351. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -1
  352. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
  353. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +59 -0
  354. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +5 -1
  355. package/dist/docs/reference/geometry/resolveRackPitch.md +5 -1
  356. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -4
  357. package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
  358. package/dist/docs/reference/geometry/revolveMesh.md +14 -10
  359. package/dist/docs/reference/geometry/rotate2.md +6 -5
  360. package/dist/docs/reference/geometry/rotationTransform3.md +7 -6
  361. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -6
  362. package/dist/docs/reference/geometry/sampleContour.md +14 -4
  363. package/dist/docs/reference/geometry/sampleCurve2.md +8 -5
  364. package/dist/docs/reference/geometry/sampleCurve3.md +6 -2
  365. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +5 -1
  366. package/dist/docs/reference/geometry/sampleHelix.md +13 -5
  367. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +5 -1
  368. package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -4
  369. package/dist/docs/reference/geometry/sampleSideProfile.md +17 -7
  370. package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
  371. package/dist/docs/reference/geometry/sampleThreadHelices.md +6 -2
  372. package/dist/docs/reference/geometry/scale2.md +6 -5
  373. package/dist/docs/reference/geometry/scale3.md +6 -5
  374. package/dist/docs/reference/geometry/scaleTransform3.md +7 -6
  375. package/dist/docs/reference/geometry/signedContourArea.md +5 -1
  376. package/dist/docs/reference/geometry/starContour.md +8 -4
  377. package/dist/docs/reference/geometry/strokeRegionData.md +67 -0
  378. package/dist/docs/reference/geometry/subtract2.md +7 -6
  379. package/dist/docs/reference/geometry/subtract3.md +7 -6
  380. package/dist/docs/reference/geometry/sweepMesh.md +13 -9
  381. package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +10 -6
  382. package/dist/docs/reference/geometry/transform2.md +14 -7
  383. package/dist/docs/reference/geometry/transform3.md +16 -7
  384. package/dist/docs/reference/geometry/transformDeterminant3.md +5 -4
  385. package/dist/docs/reference/geometry/transformRegionData.md +5 -1
  386. package/dist/docs/reference/geometry/transformTriangleMesh.md +10 -6
  387. package/dist/docs/reference/geometry/translationTransform3.md +7 -6
  388. package/dist/docs/reference/geometry/triangulateContour.md +5 -1
  389. package/dist/docs/reference/geometry/validateSolidMesh.md +10 -3
  390. package/dist/docs/reference/geometry/validateTransform3.md +6 -5
  391. package/dist/docs/reference/geometry/validateTriangleMesh.md +5 -1
  392. package/dist/docs/reference/geometry/vector2.md +10 -2
  393. package/dist/docs/reference/geometry/vector3.md +10 -2
  394. package/dist/docs/reference/geometry.md +8 -6
  395. package/dist/docs/reference/model/Anchor3.md +6 -5
  396. package/dist/docs/reference/model/AttachOptions.md +11 -5
  397. package/dist/docs/reference/model/Bounds2-type.md +125 -0
  398. package/dist/docs/reference/model/Bounds2Data.md +44 -0
  399. package/dist/docs/reference/model/Bounds2Input.md +19 -0
  400. package/dist/docs/reference/model/Bounds3-type.md +125 -0
  401. package/dist/docs/reference/model/Bounds3Data.md +44 -0
  402. package/dist/docs/reference/model/Bounds3Input.md +19 -0
  403. package/dist/docs/reference/model/BoxEdge.md +1 -1
  404. package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
  405. package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
  406. package/dist/docs/reference/model/BoxOptions.md +10 -10
  407. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
  408. package/dist/docs/reference/model/CircleContourOptions.md +1 -1
  409. package/dist/docs/reference/model/CircleOptions.md +3 -3
  410. package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
  411. package/dist/docs/reference/model/Computed.md +6 -1
  412. package/dist/docs/reference/model/ComputedValue.md +5 -1
  413. package/dist/docs/reference/model/Contour.md +6 -4
  414. package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
  415. package/dist/docs/reference/model/CorrespondingContour.md +1 -1
  416. package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
  417. package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
  418. package/dist/docs/reference/model/CylinderOptions.md +3 -3
  419. package/dist/docs/reference/model/DiagnosticOptions.md +6 -1
  420. package/dist/docs/reference/model/EdgeTreatment.md +1 -1
  421. package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
  422. package/dist/docs/reference/model/EllipseOptions.md +3 -3
  423. package/dist/docs/reference/model/EndTreatments.md +1 -1
  424. package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
  425. package/dist/docs/reference/model/FinalizedModel.md +20 -10
  426. package/dist/docs/reference/model/FinalizedPart.md +1 -1
  427. package/dist/docs/reference/model/Frame3.md +6 -6
  428. package/dist/docs/reference/model/GenerateCallback.md +5 -1
  429. package/dist/docs/reference/model/GenerateContext.md +5 -1
  430. package/dist/docs/reference/model/GeneratedPart.md +5 -1
  431. package/dist/docs/reference/model/GenerationDiagnostic.md +6 -1
  432. package/dist/docs/reference/model/GenerationError.md +5 -1
  433. package/dist/docs/reference/model/GeometryResolution.md +5 -5
  434. package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
  435. package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
  436. package/dist/docs/reference/model/GridPatternOptions.md +12 -5
  437. package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
  438. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +4 -3
  439. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
  440. package/dist/docs/reference/model/HullOptions.md +5 -5
  441. package/dist/docs/reference/model/ImmutableBuffer-type.md +5 -1
  442. package/dist/docs/reference/model/ImmutableTriangleMesh.md +5 -1
  443. package/dist/docs/reference/model/ImplicitOptions.md +6 -6
  444. package/dist/docs/reference/model/InternalThreadCutterOptions.md +5 -4
  445. package/dist/docs/reference/model/KnuckleHinge-type.md +47 -0
  446. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +77 -0
  447. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +34 -0
  448. package/dist/docs/reference/model/KnuckleHingeOptions.md +38 -0
  449. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +47 -0
  450. package/dist/docs/reference/model/KnuckleHingeSpec.md +18 -0
  451. package/dist/docs/reference/model/KnuckleHingeWeb.md +53 -0
  452. package/dist/docs/reference/model/LinearPatternOptions.md +13 -5
  453. package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
  454. package/dist/docs/reference/model/LoftOptions.md +1 -1
  455. package/dist/docs/reference/model/LoftPlacement.md +1 -1
  456. package/dist/docs/reference/model/LoftStation.md +3 -3
  457. package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
  458. package/dist/docs/reference/model/ModelProgram.md +5 -1
  459. package/dist/docs/reference/model/ModelingLimits.md +1 -1
  460. package/dist/docs/reference/model/NumericArray.md +8 -1
  461. package/dist/docs/reference/model/PartGeometry.md +5 -1
  462. package/dist/docs/reference/model/PartOptions.md +5 -1
  463. package/dist/docs/reference/model/Path2-type.md +196 -0
  464. package/dist/docs/reference/model/Path2Data.md +50 -0
  465. package/dist/docs/reference/model/Path2Input.md +20 -0
  466. package/dist/docs/reference/model/Path3-type.md +196 -0
  467. package/dist/docs/reference/model/Path3Data.md +50 -0
  468. package/dist/docs/reference/model/Path3Input.md +20 -0
  469. package/dist/docs/reference/model/PathLocation.md +69 -0
  470. package/dist/docs/reference/model/PathNormalGuide.md +6 -5
  471. package/dist/docs/reference/model/PathOptions.md +38 -0
  472. package/dist/docs/reference/model/PathPatternOptions.md +4 -3
  473. package/dist/docs/reference/model/PathResamplingOptions.md +83 -0
  474. package/dist/docs/reference/model/PatternSource.md +2 -1
  475. package/dist/docs/reference/model/Pivot2Options.md +2 -1
  476. package/dist/docs/reference/model/Pivot3Options.md +2 -1
  477. package/dist/docs/reference/model/PlaneOptions.md +3 -3
  478. package/dist/docs/reference/model/PolygonData.md +3 -2
  479. package/dist/docs/reference/model/PolygonOptions.md +8 -8
  480. package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +8 -7
  481. package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +42 -20
  482. package/dist/docs/reference/model/PrintableThreadFit.md +2 -1
  483. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +2 -1
  484. package/dist/docs/reference/model/Profile.md +4 -2
  485. package/dist/docs/reference/model/ProfileComponent2.md +1 -1
  486. package/dist/docs/reference/model/ProfileContour2.md +4 -2
  487. package/dist/docs/reference/model/ProfileSpan2.md +3 -3
  488. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
  489. package/dist/docs/reference/model/RadialPatternOptions.md +18 -22
  490. package/dist/docs/reference/model/RadialSizing.md +1 -1
  491. package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
  492. package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
  493. package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
  494. package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
  495. package/dist/docs/reference/model/RectangleOptions.md +10 -10
  496. package/dist/docs/reference/model/RegionData.md +2 -2
  497. package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
  498. package/dist/docs/reference/model/RevolveOptions.md +9 -4
  499. package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
  500. package/dist/docs/reference/model/Section.md +20 -12
  501. package/dist/docs/reference/model/SectionHullOptions.md +5 -5
  502. package/dist/docs/reference/model/SectionInspection.md +10 -10
  503. package/dist/docs/reference/model/SectionOffsetJoin.md +1 -1
  504. package/dist/docs/reference/model/SectionOffsetOptions.md +1 -1
  505. package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
  506. package/dist/docs/reference/model/Solid.md +31 -7
  507. package/dist/docs/reference/model/SolidInspection.md +7 -7
  508. package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
  509. package/dist/docs/reference/model/SphereOptions.md +3 -3
  510. package/dist/docs/reference/model/StarOptions.md +10 -10
  511. package/dist/docs/reference/model/{StrokePathCap.md → StrokeCap.md} +3 -3
  512. package/dist/docs/reference/model/{StrokePathJoin.md → StrokeJoin.md} +3 -3
  513. package/dist/docs/reference/model/StrokeOptions.md +6 -6
  514. package/dist/docs/reference/model/SvgOrigin.md +1 -1
  515. package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
  516. package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
  517. package/dist/docs/reference/model/SweepOptions.md +6 -6
  518. package/dist/docs/reference/model/SweepOrientation.md +7 -7
  519. package/dist/docs/reference/model/TextSectionOptions.md +1 -1
  520. package/dist/docs/reference/model/ThreadEndStyle.md +2 -1
  521. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +2 -1
  522. package/dist/docs/reference/model/ThreadHandedness.md +2 -1
  523. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +2 -1
  524. package/dist/docs/reference/model/ThreadLeadInShape.md +2 -1
  525. package/dist/docs/reference/model/ThreadProfile.md +4 -3
  526. package/dist/docs/reference/model/ThreadRidgeOptions.md +2 -1
  527. package/dist/docs/reference/model/ThreadedNutBevel.md +2 -1
  528. package/dist/docs/reference/model/ThreadedNutOptions.md +5 -4
  529. package/dist/docs/reference/model/ThreadedNutPreflight.md +4 -3
  530. package/dist/docs/reference/model/ThreadedNutShape.md +2 -1
  531. package/dist/docs/reference/model/ThreadedRodOptions.md +5 -4
  532. package/dist/docs/reference/model/TorusOptions.md +8 -8
  533. package/dist/docs/reference/model/Transform2-type.md +6 -5
  534. package/dist/docs/reference/model/Transform2Data.md +16 -0
  535. package/dist/docs/reference/model/Transform2Input.md +4 -3
  536. package/dist/docs/reference/model/Transform3-type.md +6 -5
  537. package/dist/docs/reference/model/Transform3Data.md +19 -0
  538. package/dist/docs/reference/model/Transform3Input.md +4 -3
  539. package/dist/docs/reference/model/TriangleMesh.md +1 -1
  540. package/dist/docs/reference/model/TriangleMeshAnalysis.md +4 -4
  541. package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
  542. package/dist/docs/reference/model/TubeOptions.md +8 -8
  543. package/dist/docs/reference/model/Vector2-type.md +6 -5
  544. package/dist/docs/reference/model/{Vector2Tuple.md → Vector2Data.md} +3 -3
  545. package/dist/docs/reference/model/Vector2Input.md +4 -3
  546. package/dist/docs/reference/model/Vector3-type.md +6 -5
  547. package/dist/docs/reference/model/{Vector3Tuple.md → Vector3Data.md} +3 -3
  548. package/dist/docs/reference/model/Vector3Input.md +4 -3
  549. package/dist/docs/reference/model/VectorTextLayout.md +1 -1
  550. package/dist/docs/reference/model/VectorTextMetrics.md +3 -3
  551. package/dist/docs/reference/model/anchor.md +2 -1
  552. package/dist/docs/reference/model/bounds2.md +36 -0
  553. package/dist/docs/reference/model/bounds3.md +36 -0
  554. package/dist/docs/reference/model/box.md +4 -4
  555. package/dist/docs/reference/model/castSegment.md +40 -0
  556. package/dist/docs/reference/model/categories/boolean-operations.md +10 -3
  557. package/dist/docs/reference/model/categories/bounded-surfaces.md +5 -3
  558. package/dist/docs/reference/model/categories/bounds.md +36 -0
  559. package/dist/docs/reference/model/categories/contracts.md +4 -2
  560. package/dist/docs/reference/model/categories/core-values-errors.md +11 -11
  561. package/dist/docs/reference/model/categories/explicit-profiles.md +7 -5
  562. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +12 -3
  563. package/dist/docs/reference/model/categories/generation.md +11 -2
  564. package/dist/docs/reference/model/categories/hinges.md +38 -0
  565. package/dist/docs/reference/model/categories/inspection.md +12 -6
  566. package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
  567. package/dist/docs/reference/model/categories/paths.md +41 -0
  568. package/dist/docs/reference/model/categories/primitives.md +10 -4
  569. package/dist/docs/reference/model/categories/resolution.md +4 -2
  570. package/dist/docs/reference/model/categories/sections.md +12 -8
  571. package/dist/docs/reference/model/categories/threads.md +11 -8
  572. package/dist/docs/reference/model/categories/transforms-placement.md +23 -15
  573. package/dist/docs/reference/model/circle.md +1 -1
  574. package/dist/docs/reference/model/components.md +6 -6
  575. package/dist/docs/reference/model/compose.md +1 -1
  576. package/dist/docs/reference/model/cylinder.md +1 -1
  577. package/dist/docs/reference/model/distance.md +1 -1
  578. package/dist/docs/reference/model/ellipse.md +1 -1
  579. package/dist/docs/reference/model/extrude.md +3 -3
  580. package/dist/docs/reference/model/generate.md +5 -1
  581. package/dist/docs/reference/model/gridPattern.md +5 -4
  582. package/dist/docs/reference/model/heightfield.md +5 -2
  583. package/dist/docs/reference/model/hull.md +1 -1
  584. package/dist/docs/reference/model/immutableBuffer.md +5 -1
  585. package/dist/docs/reference/model/immutableMesh.md +5 -1
  586. package/dist/docs/reference/model/implicit.md +3 -3
  587. package/dist/docs/reference/model/inspectSection.md +1 -1
  588. package/dist/docs/reference/model/inspectSolid.md +1 -1
  589. package/dist/docs/reference/model/internalThreadCutter.md +5 -4
  590. package/dist/docs/reference/model/intersect.md +1 -1
  591. package/dist/docs/reference/model/isEmpty.md +1 -1
  592. package/dist/docs/reference/model/knuckleHinge.md +47 -0
  593. package/dist/docs/reference/model/linearPattern.md +5 -4
  594. package/dist/docs/reference/model/loft.md +1 -1
  595. package/dist/docs/reference/model/matchProfiles.md +2 -2
  596. package/dist/docs/reference/model/minkowskiSum.md +1 -1
  597. package/dist/docs/reference/model/path2.md +54 -0
  598. package/dist/docs/reference/model/path3.md +49 -0
  599. package/dist/docs/reference/model/pathPattern.md +14 -12
  600. package/dist/docs/reference/model/polygon.md +8 -5
  601. package/dist/docs/reference/model/preflightInternalThreadCutter.md +9 -3
  602. package/dist/docs/reference/model/preflightThreadedNut.md +9 -3
  603. package/dist/docs/reference/model/preflightThreadedRod.md +9 -3
  604. package/dist/docs/reference/model/radialPattern.md +6 -37
  605. package/dist/docs/reference/model/rectangle.md +7 -4
  606. package/dist/docs/reference/model/regularPolygon.md +1 -1
  607. package/dist/docs/reference/model/revolve.md +5 -4
  608. package/dist/docs/reference/model/solidFromMesh.md +1 -1
  609. package/dist/docs/reference/model/sphere.md +1 -1
  610. package/dist/docs/reference/model/split.md +1 -1
  611. package/dist/docs/reference/model/splitByPlane.md +1 -1
  612. package/dist/docs/reference/model/star.md +4 -4
  613. package/dist/docs/reference/model/stroke.md +8 -8
  614. package/dist/docs/reference/model/svgPathSection.md +1 -1
  615. package/dist/docs/reference/model/svgSection.md +1 -1
  616. package/dist/docs/reference/model/sweep.md +7 -7
  617. package/dist/docs/reference/model/textSection.md +1 -1
  618. package/dist/docs/reference/model/threadRidge.md +3 -2
  619. package/dist/docs/reference/model/threadedNut.md +5 -4
  620. package/dist/docs/reference/model/threadedRod.md +5 -4
  621. package/dist/docs/reference/model/torus.md +3 -3
  622. package/dist/docs/reference/model/transform2.md +14 -7
  623. package/dist/docs/reference/model/transform3.md +16 -7
  624. package/dist/docs/reference/model/tube.md +3 -3
  625. package/dist/docs/reference/model/union.md +1 -1
  626. package/dist/docs/reference/model/vector2.md +10 -2
  627. package/dist/docs/reference/model/vector3.md +10 -2
  628. package/dist/docs/reference/model.md +17 -9
  629. package/dist/docs/reference/text/Bounds2Data.md +34 -0
  630. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
  631. package/dist/docs/reference/text/Vector2Data.md +7 -0
  632. package/dist/docs/reference/text/VectorFont.md +2 -2
  633. package/dist/docs/reference/text/VectorFontOptions.md +1 -1
  634. package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
  635. package/dist/docs/reference/text/VectorTextLayout.md +1 -1
  636. package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
  637. package/dist/docs/reference/text/VectorTextMetrics.md +3 -3
  638. package/dist/docs/reference/text/VectorTextOptions.md +1 -1
  639. package/dist/docs/reference/text/categories/font-preparation.md +8 -6
  640. package/dist/docs/reference/text/prepareVectorFont.md +2 -2
  641. package/dist/docs/reference/text.md +4 -2
  642. package/dist/engine/construction-operations.js +31 -14
  643. package/dist/engine/execution.js +39 -8
  644. package/dist/engine/extrusion-finishing.js +1 -1
  645. package/dist/engine/index.js +6 -1
  646. package/dist/engine/inspection-operations.js +13 -11
  647. package/dist/engine/knuckle-hinge-operation.js +85 -0
  648. package/dist/engine/loft-operations.js +35 -14
  649. package/dist/engine/mechanical-operations.js +3 -1
  650. package/dist/engine/model-summary.js +8 -5
  651. package/dist/engine/modeling-context.js +8 -1
  652. package/dist/engine/native/material-components.js +305 -0
  653. package/dist/engine/native/regions.js +2 -1
  654. package/dist/engine/native/threads.js +3 -3
  655. package/dist/engine/native/transforms.js +5 -7
  656. package/dist/engine/operation-environment.js +2 -2
  657. package/dist/engine/pattern-operations.js +1 -1
  658. package/dist/engine/placement.js +2 -2
  659. package/dist/engine/primitive-anchors.js +17 -17
  660. package/dist/engine/primitive-operations.js +1 -1
  661. package/dist/engine/primitive-profiles.js +7 -7
  662. package/dist/engine/profile-mesh.js +7 -7
  663. package/dist/engine/recipe-realization.js +10 -2
  664. package/dist/engine/section-operations.js +33 -8
  665. package/dist/engine/session-snapshot.js +14 -4
  666. package/dist/engine/session.js +10 -5
  667. package/dist/engine/shape-anchors.js +3 -3
  668. package/dist/engine/transform-operations.js +27 -27
  669. package/dist/geometry/anchors.js +40 -33
  670. package/dist/geometry/bounds-value.js +93 -0
  671. package/dist/geometry/bounds.js +10 -8
  672. package/dist/geometry/curves/sampling.js +15 -16
  673. package/dist/geometry/edge-finishing.js +1 -1
  674. package/dist/geometry/errors.js +1 -0
  675. package/dist/geometry/extrusion.js +13 -16
  676. package/dist/geometry/heightfield.js +12 -1
  677. package/dist/geometry/index.js +12 -11
  678. package/dist/geometry/loft/loft-simple-mesh.js +6 -6
  679. package/dist/geometry/loft/loft.js +22 -13
  680. package/dist/geometry/math/immutable-value.js +1 -1
  681. package/dist/geometry/math/vector-value.js +11 -3
  682. package/dist/geometry/math/vector2.js +1 -0
  683. package/dist/geometry/math/vector3.js +1 -0
  684. package/dist/geometry/mechanical/gear-motion.js +3 -3
  685. package/dist/geometry/mechanical/gears.js +38 -38
  686. package/dist/geometry/mechanical/index.js +4 -3
  687. package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
  688. package/dist/geometry/mechanical/standards.js +1 -1
  689. package/dist/geometry/mechanical/thread-helices.js +2 -3
  690. package/dist/geometry/mechanical/thread-mesh-plan.js +11 -7
  691. package/dist/geometry/mechanical/thread-mesh.js +7 -7
  692. package/dist/geometry/mechanical/thread-profiles.js +5 -5
  693. package/dist/geometry/mechanical/thread-solids.js +31 -6
  694. package/dist/geometry/mechanical/thread-surface.js +1 -1
  695. package/dist/geometry/mechanical/threads.js +8 -8
  696. package/dist/geometry/mesh/mesh-centroid.js +1 -0
  697. package/dist/geometry/mesh/mesh-planar.js +25 -27
  698. package/dist/geometry/mesh/mesh-quality.js +5 -5
  699. package/dist/geometry/mesh/mesh-signature.js +13 -13
  700. package/dist/geometry/mesh/mesh-solid.js +8 -7
  701. package/dist/geometry/mesh/mesh.js +4 -15
  702. package/dist/geometry/paths/closest-point.js +8 -19
  703. package/dist/geometry/paths/frames.js +42 -11
  704. package/dist/geometry/paths/helix.js +17 -6
  705. package/dist/geometry/paths/path-value.js +268 -0
  706. package/dist/geometry/paths/planar.js +36 -23
  707. package/dist/geometry/paths/resampling.js +27 -5
  708. package/dist/geometry/patterns/placements.js +100 -27
  709. package/dist/geometry/patterns.js +5 -3
  710. package/dist/geometry/polygon-clipping.js +17 -0
  711. package/dist/geometry/profiles/contour.js +7 -6
  712. package/dist/geometry/profiles/matched.js +5 -4
  713. package/dist/geometry/profiles/profiles.js +4 -4
  714. package/dist/geometry/profiles/rectangle.js +14 -5
  715. package/dist/geometry/profiles/side-profile.js +9 -7
  716. package/dist/geometry/profiles/span-sampling.js +1 -1
  717. package/dist/geometry/resolution.js +34 -34
  718. package/dist/geometry/revolve/revolve-mesh.js +12 -7
  719. package/dist/geometry/stroke-path.js +12 -27
  720. package/dist/geometry/svg/fill.js +7 -21
  721. package/dist/geometry/svg-import.js +31 -25
  722. package/dist/geometry/sweeps/options.js +5 -4
  723. package/dist/geometry/sweeps/orientation.js +5 -5
  724. package/dist/geometry/sweeps/stations.js +10 -10
  725. package/dist/geometry/sweeps/sweep-closed.js +2 -2
  726. package/dist/geometry/sweeps/sweep-mesh.js +9 -3
  727. package/dist/geometry/sweeps/sweep-open.js +1 -1
  728. package/dist/geometry/sweeps/validation.js +4 -7
  729. package/dist/geometry/text-fitting.js +1 -0
  730. package/dist/geometry/transform-geometry.js +7 -14
  731. package/dist/geometry/transform-matrix.js +1 -1
  732. package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
  733. package/dist/index.js +3 -1
  734. package/dist/model/execution-binding.js +3 -3
  735. package/dist/model/geometry-recipes.js +1 -1
  736. package/dist/model/immutable-generation-data.js +62 -10
  737. package/dist/model/knuckle-hinge.js +1 -0
  738. package/dist/model/operations.js +79 -26
  739. package/dist/model/recipe-declaration.js +21 -7
  740. package/dist/model/shape-handles.js +2 -1
  741. package/dist/text/index.js +15 -9
  742. package/dist/text/vector-text-layout.js +31 -26
  743. package/package.json +1 -1
  744. package/dist/docs/reference/geometry/Bounds2.md +0 -39
  745. package/dist/docs/reference/geometry/Bounds3.md +0 -39
  746. package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +0 -34
  747. package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +0 -65
  748. package/dist/docs/reference/geometry/Path2.md +0 -14
  749. package/dist/docs/reference/geometry/Path3.md +0 -14
  750. package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
  751. package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
  752. package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
  753. package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
  754. package/dist/docs/reference/geometry/Transform2Matrix.md +0 -14
  755. package/dist/docs/reference/geometry/Transform3Matrix.md +0 -17
  756. package/dist/docs/reference/geometry/Vector2Tuple.md +0 -14
  757. package/dist/docs/reference/geometry/Vector3Tuple.md +0 -14
  758. package/dist/docs/reference/geometry/closestPointOnPath.md +0 -110
  759. package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
  760. package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
  761. package/dist/docs/reference/geometry/pathLength.md +0 -33
  762. package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
  763. package/dist/docs/reference/geometry/transformContour.md +0 -42
  764. package/dist/docs/reference/geometry/transformPath2.md +0 -40
  765. package/dist/docs/reference/geometry/transformPath3.md +0 -33
  766. package/dist/docs/reference/model/Bounds2.md +0 -39
  767. package/dist/docs/reference/model/Bounds3.md +0 -39
  768. package/dist/docs/reference/model/Path2.md +0 -20
  769. package/dist/docs/reference/model/Transform2Matrix.md +0 -15
  770. package/dist/docs/reference/model/Transform3Matrix.md +0 -18
  771. package/dist/docs/reference/model/rayCast.md +0 -40
  772. package/dist/docs/reference/model/toTriangleMesh.md +0 -27
  773. package/dist/docs/reference/text/Bounds2.md +0 -34
  774. package/dist/docs/reference/text/Vector2Tuple.md +0 -7
  775. package/dist/geometry/paths/path.js +0 -32
@@ -1,7 +1,24 @@
1
1
  import * as clippingModule from "polygon-clipping";
2
+ import { normalizeRegion } from "./regions.js";
2
3
  const moduleWithDefault = clippingModule;
3
4
  /** @internal Normalizes polygon-clipping's CommonJS and bundled ESM module shapes. */
4
5
  export const polygonClipping = moduleWithDefault.default ?? clippingModule;
6
+ /** @internal Copies an open contour into polygon-clipping's explicitly closed ring format. */
7
+ export function clippingRing(points) {
8
+ const result = points.map(([x, y]) => [x, y]);
9
+ const first = result[0];
10
+ const last = result.at(-1);
11
+ if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1]))
12
+ result.push([...first]);
13
+ return result;
14
+ }
15
+ /** @internal Converts closed clipping rings into canonical regions with implicit seams. */
16
+ export function regionFromMultiPolygon(value) {
17
+ return normalizeRegion(value.map((polygon) => ({
18
+ outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
19
+ holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
20
+ })));
21
+ }
5
22
  const CLIPPING_COORDINATE_GRID = 1e9;
6
23
  const snapCoordinate = (value) => Math.round(value * CLIPPING_COORDINATE_GRID) / CLIPPING_COORDINATE_GRID;
7
24
  /** Canonicalizes shared endpoints below model tolerance before they enter the sweep-line kernel. */
@@ -9,6 +9,7 @@ function invalid(message) {
9
9
  }
10
10
  /**
11
11
  * Samples 2–32 connected line/cubic segments into a simple, nonzero-area, immutable CCW XY loop.
12
+ *
12
13
  * Physical scaling precedes adaptive curve sampling; the final end must repeat start exactly.
13
14
  * Shared anchors and the closing seam are emitted once. Winding normalization may change the
14
15
  * starting vertex. The sampled loop is checked for self-intersection and degeneracy by
@@ -16,7 +17,7 @@ function invalid(message) {
16
17
  * coordinate range are required. No native engine, SDK, or ambient resolution is used.
17
18
  *
18
19
  * @param curve - Closed contour in millimetres unless positive scales convert its coordinates.
19
- * @param options - Physical resolution and unique vertex budget; defaults to 4096 vertices.
20
+ * @param options - Physical resolution and unique vertex budget; defaults to min(4096, maxProfilePoints).
20
21
  * @returns Frozen counterclockwise loop in millimetres, without a repeated seam endpoint.
21
22
  * @throws {@link GeometryError} for invalid data, topology, scale, or exceeded sampling budgets.
22
23
  *
@@ -38,8 +39,8 @@ export function sampleContour(curve, options = {}) {
38
39
  if (![widthScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0))
39
40
  invalid("Cross-section scales must be finite and positive.");
40
41
  const limits = resolveGeometrySamplingLimits(options.limits);
41
- const maximumVertices = options.maximumVertices ?? Math.min(4096, limits.maxProfilePoints);
42
- requireProfileVertexCount(maximumVertices, 3, OPERATION, limits);
42
+ const maxVertices = options.maxVertices ?? Math.min(4096, limits.maxProfilePoints);
43
+ requireProfileVertexCount(maxVertices, 3, OPERATION, limits);
43
44
  const segmentInput = curve?.segments;
44
45
  if (!curve ||
45
46
  !Array.isArray(segmentInput) ||
@@ -66,11 +67,11 @@ export function sampleContour(curve, options = {}) {
66
67
  invalid("Cross-section segments must be lines or cubics.");
67
68
  const end = physical(segment.end);
68
69
  const closed = index === curve.segments.length - 1;
69
- const remainingVertices = Math.min(limits.maxPathPoints, maximumVertices - output.length + 1 + (closed ? 1 : 0));
70
+ const remainingVertices = Math.min(limits.maxPathPoints, maxVertices - output.length + 1 + (closed ? 1 : 0));
70
71
  if (remainingVertices < 2)
71
72
  throw new GeometryError("COMPLEXITY_LIMIT", "Cross-section sampling exceeds its vertex budget.", {
72
73
  operation: OPERATION,
73
- details: { maximumVertices },
74
+ details: { maxVertices },
74
75
  });
75
76
  let span;
76
77
  if (segment.type === "line") {
@@ -90,7 +91,7 @@ export function sampleContour(curve, options = {}) {
90
91
  }
91
92
  const sampled = sampleCurve2(span, {
92
93
  ...(options.resolution === undefined ? {} : { resolution: options.resolution }),
93
- maximumVertices: remainingVertices,
94
+ maxVertices: remainingVertices,
94
95
  limits,
95
96
  }).points;
96
97
  const endIndex = sampled.length - (closed ? 1 : 0);
@@ -39,10 +39,10 @@ const validateContour = (contour) => {
39
39
  }
40
40
  else if (span.kind === "arc") {
41
41
  point(span.center);
42
- if (![span.radius, span.startDegrees, span.sweepDegrees].every(Number.isFinite) ||
42
+ if (![span.radius, span.startAngle, span.sweepAngle].every(Number.isFinite) ||
43
43
  span.radius < 0 ||
44
- Math.abs(span.sweepDegrees) > 360 ||
45
- span.sweepDegrees === 0)
44
+ Math.abs(span.sweepAngle) > 360 ||
45
+ span.sweepAngle === 0)
46
46
  fail("Arc spans need nonnegative radius and a nonzero finite sweep no larger than 360 degrees.");
47
47
  }
48
48
  else
@@ -64,6 +64,7 @@ const contours = (component) => [
64
64
  ];
65
65
  /**
66
66
  * Explicitly matches identified component/contour/span topology across a family.
67
+ *
67
68
  * Every paired span uses the maximum physical subdivision count requested by any member.
68
69
  * Cubics share a checked uniform parameter grid, including grids selected by exact paired requests.
69
70
  * Input order and winding are preserved. Collapsed spans retain repeated logical slots, which
@@ -132,7 +133,7 @@ export function matchProfiles(profiles, options = {}) {
132
133
  if (span.kind === "arc")
133
134
  return span.radius === 0
134
135
  ? 1
135
- : resolveArcSegments(span.radius, Math.abs(span.sweepDegrees), selectedResolution, limits);
136
+ : resolveArcSegments(span.radius, Math.abs(span.sweepAngle), selectedResolution, limits);
136
137
  if (span.kind === "cubic")
137
138
  return resolveUniformCubicSegments(planarCubicControl(span), selectedResolution, cubicBudget);
138
139
  return resolveLineSegmentCount(Math.hypot(span.end[0] - span.start[0], span.end[1] - span.start[1]), selectedResolution.maxSegmentLength);
@@ -49,8 +49,8 @@ export const circleContour = (options) => {
49
49
  */
50
50
  export const regularPolygonContour = (options) => {
51
51
  const operation = "regularPolygonContour";
52
- const { radius, sides, rotationDegrees = 0, sizing = "vertex" } = options;
53
- requireFiniteProfileValues([radius, rotationDegrees], operation);
52
+ const { radius, sides, rotation = 0, sizing = "vertex" } = options;
53
+ requireFiniteProfileValues([radius, rotation], operation);
54
54
  if (!(radius > 0)) {
55
55
  throw new GeometryError("INVALID_ARGUMENT", "Polygon radius must be positive.", { operation });
56
56
  }
@@ -61,9 +61,9 @@ export const regularPolygonContour = (options) => {
61
61
  });
62
62
  const sampledRadius = sizing === "face" ? radius / Math.cos(Math.PI / sides) : radius;
63
63
  requireFiniteProfileValues([sampledRadius], operation);
64
- const rotation = ((rotationDegrees % 360) * Math.PI) / 180;
64
+ const rotationRadians = ((rotation % 360) * Math.PI) / 180;
65
65
  return Array.from({ length: sides }, (_, index) => {
66
- const angle = rotation + (Math.PI * 2 * index) / sides;
66
+ const angle = rotationRadians + (Math.PI * 2 * index) / sides;
67
67
  return [sampledRadius * Math.cos(angle), sampledRadius * Math.sin(angle)];
68
68
  });
69
69
  };
@@ -72,14 +72,18 @@ export function rectangleCornerSegments(corner, limits) {
72
72
  return 1;
73
73
  return (resolveAlignedCircularSegments(Math.max(corner.radius, Number.MIN_VALUE), {
74
74
  alignTo: [4],
75
- minimumSegments: 4,
75
+ minSegments: 4,
76
76
  ...(corner.segments === undefined ? {} : { segments: corner.segments }),
77
77
  ...(corner.resolution === undefined ? {} : { resolution: corner.resolution }),
78
78
  limits: selected,
79
79
  }) / 4);
80
80
  }
81
81
  /**
82
- * Creates an immutable CCW rectangle loop. Round radius zero is square; tangent saturated endpoints occur once.
82
+ * Creates an immutable sampled CCW rectangle boundary. Round radius zero is square; tangent saturated endpoints occur once.
83
+ *
84
+ * Use [rectangle](/docs/reference/model/rectangle) for a filled Section.
85
+ *
86
+ * @see {@link rectangleProfile} for identified edge/corner spans used by matchProfiles.
83
87
  *
84
88
  * @example Rounded rectangle outline
85
89
  * ```ts
@@ -148,6 +152,11 @@ export function rectangleContour(options) {
148
152
  /**
149
153
  * Creates an identified rectangle whose edge/corner spans survive zero and saturated round radii. Outer winding is CCW.
150
154
  *
155
+ * Use [rectangle](/docs/reference/model/rectangle) for a filled Section.
156
+ *
157
+ * @see {@link matchProfiles} to sample a family with shared landmark correspondence.
158
+ * @see {@link rectangleContour} for sampled boundary coordinates.
159
+ *
151
160
  * @example Retain rectangle landmarks
152
161
  * ```ts
153
162
  * rectangleProfile({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
@@ -194,7 +203,7 @@ export function rectangleProfile(options) {
194
203
  center: map(index, a, b),
195
204
  }));
196
205
  corners.forEach((corner, index) => {
197
- const shape = endpoints[index], startDegrees = vertices[index][2];
206
+ const shape = endpoints[index], startAngle = vertices[index][2];
198
207
  if (corner.kind === "chamfer")
199
208
  spans.push({ id: names[index], kind: "line", start: shape.start, end: shape.end });
200
209
  else if (corner.kind === "smooth") {
@@ -230,8 +239,8 @@ export function rectangleProfile(options) {
230
239
  kind: "arc",
231
240
  center: shape.center,
232
241
  radius: setbacks[index][0],
233
- startDegrees,
234
- sweepDegrees: 90,
242
+ startAngle,
243
+ sweepAngle: 90,
235
244
  ...(exact ? { segments: rectangleCornerSegments(corner, limits) } : {}),
236
245
  ...(corner.kind === "round" && corner.resolution !== undefined
237
246
  ? { resolution: { ...corner.resolution } }
@@ -23,6 +23,7 @@ function distanceToChord(point, start, end) {
23
23
  }
24
24
  /**
25
25
  * Samples 1–31 line/cubic segments into a deeply immutable open [radius,height] polyline.
26
+ *
26
27
  * Anchors must progress strictly upward; nonnegative-radius cubic controls must have ordered
27
28
  * heights between their endpoints. Cubics use de Casteljau subdivision with a conservative
28
29
  * control-hull chord-error bound. Lines also obey the optional physical edge-length ceiling.
@@ -30,7 +31,7 @@ function distanceToChord(point, start, end) {
30
31
  * no axis closure, winding normalization, or manufacturing repair is performed.
31
32
  *
32
33
  * @param curve - Open outline in millimetres unless the positive scales convert its coordinates.
33
- * @param options - Physical resolution and output budget; defaults to 4096 vertices.
34
+ * @param options - Physical resolution and output budget; defaults to min(4096, maxProfilePoints).
34
35
  * @returns Frozen open polyline in millimetres, ordered from lowest to highest anchor.
35
36
  * @throws {@link GeometryError} for invalid coordinates, order, scale, or exceeded subdivision budget.
36
37
  *
@@ -48,9 +49,9 @@ export function sampleSideProfile(curve, options = {}) {
48
49
  if (![radiusScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0)) {
49
50
  invalid("Profile scales must be finite and positive.");
50
51
  }
51
- const maximumVertices = options.maximumVertices ??
52
+ const maxVertices = options.maxVertices ??
52
53
  Math.min(4096, resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
53
- requireProfileVertexCount(maximumVertices, 2, OPERATION, options.limits);
54
+ requireProfileVertexCount(maxVertices, 2, OPERATION, options.limits);
54
55
  const maximumProfilePoints = resolveGeometrySamplingLimits(options.limits).maxProfilePoints;
55
56
  const segmentInput = curve.segments;
56
57
  if (!Array.isArray(segmentInput) ||
@@ -72,10 +73,10 @@ export function sampleSideProfile(curve, options = {}) {
72
73
  };
73
74
  const output = [];
74
75
  const append = (point) => {
75
- if (output.length >= maximumVertices || output.length >= maximumProfilePoints) {
76
+ if (output.length >= maxVertices || output.length >= maximumProfilePoints) {
76
77
  throw new GeometryError("COMPLEXITY_LIMIT", "Profile sampling exceeds its vertex budget.", {
77
78
  operation: OPERATION,
78
- details: { maximumVertices },
79
+ details: { maxVertices },
79
80
  });
80
81
  }
81
82
  output.push(Object.freeze(point));
@@ -109,10 +110,10 @@ export function sampleSideProfile(curve, options = {}) {
109
110
  const count = resolution.maxSegmentLength === undefined
110
111
  ? 1
111
112
  : Math.max(1, Math.ceil(length / resolution.maxSegmentLength));
112
- if (count > maximumVertices - output.length) {
113
+ if (count > maxVertices - output.length) {
113
114
  throw new GeometryError("COMPLEXITY_LIMIT", "Profile line exceeds its vertex budget.", {
114
115
  operation: OPERATION,
115
- details: { maximumVertices },
116
+ details: { maxVertices },
116
117
  });
117
118
  }
118
119
  for (let index = 1; index <= count; index++) {
@@ -138,6 +139,7 @@ export function sampleSideProfile(curve, options = {}) {
138
139
  }
139
140
  /**
140
141
  * Closes an open, strictly upward [radius, height] side outline to the radius-zero axis.
142
+ *
141
143
  * Adds horizontal bottom/top edges at the endpoint heights, retaining axis endpoints once.
142
144
  * Returns a counterclockwise filled-boundary contour without a repeated seam vertex.
143
145
  * Radii must be nonnegative; the result must enclose nonzero area without touching itself.
@@ -8,7 +8,7 @@ export function createProfileSpanSampler(span) {
8
8
  ];
9
9
  if (span.kind === "arc")
10
10
  return (t) => {
11
- const angle = ((span.startDegrees + span.sweepDegrees * t) * Math.PI) / 180;
11
+ const angle = ((span.startAngle + span.sweepAngle * t) * Math.PI) / 180;
12
12
  const snap = (value) => Math.abs(value) < 1e-14
13
13
  ? 0
14
14
  : Math.abs(Math.abs(value) - 1) < 1e-14
@@ -13,20 +13,20 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
13
13
  const merged = policy;
14
14
  const circularSegments = merged.circularSegments;
15
15
  const allowedMaximum = resolveGeometrySamplingLimits(limits).maxCircularSegments;
16
- const minimumSegments = merged.minimumSegments ?? Math.min(DEFAULT_MINIMUM_SEGMENTS, allowedMaximum);
17
- const maximumSegments = merged.maximumSegments ?? allowedMaximum;
16
+ const minSegments = merged.minSegments ?? Math.min(DEFAULT_MINIMUM_SEGMENTS, allowedMaximum);
17
+ const maxSegments = merged.maxSegments ?? allowedMaximum;
18
18
  const maxChordError = merged.maxChordError ?? DEFAULT_MAX_CHORD_ERROR;
19
19
  const maxSegmentLength = merged.maxSegmentLength;
20
- if (!Number.isSafeInteger(minimumSegments) || minimumSegments < 3) {
21
- invalid("minimumSegments must be an integer of at least three.", { minimumSegments });
20
+ if (!Number.isSafeInteger(minSegments) || minSegments < 3) {
21
+ invalid("minSegments must be an integer of at least three.", { minSegments });
22
22
  }
23
- if (!Number.isSafeInteger(maximumSegments) ||
24
- maximumSegments < minimumSegments ||
25
- maximumSegments > allowedMaximum) {
26
- invalid("maximumSegments must be a safe integer between minimumSegments and maxCircularSegments.", {
23
+ if (!Number.isSafeInteger(maxSegments) ||
24
+ maxSegments < minSegments ||
25
+ maxSegments > allowedMaximum) {
26
+ invalid("maxSegments must be a safe integer between minSegments and maxCircularSegments.", {
27
27
  allowedMaximum,
28
- maximumSegments,
29
- minimumSegments,
28
+ maxSegments,
29
+ minSegments,
30
30
  });
31
31
  }
32
32
  if (!Number.isFinite(maxChordError) || maxChordError <= 0) {
@@ -41,18 +41,18 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
41
41
  if (circularSegments !== undefined &&
42
42
  (!Number.isSafeInteger(circularSegments) ||
43
43
  circularSegments < 3 ||
44
- circularSegments > maximumSegments)) {
45
- invalid("circularSegments must be an integer from three through maximumSegments.", {
44
+ circularSegments > maxSegments)) {
45
+ invalid("circularSegments must be an integer from three through maxSegments.", {
46
46
  circularSegments,
47
- maximumSegments,
47
+ maxSegments,
48
48
  });
49
49
  }
50
50
  return Object.freeze({
51
51
  ...(circularSegments === undefined ? {} : { circularSegments }),
52
52
  maxChordError,
53
53
  ...(maxSegmentLength === undefined ? {} : { maxSegmentLength }),
54
- maximumSegments,
55
- minimumSegments,
54
+ maxSegments,
55
+ minSegments,
56
56
  });
57
57
  }
58
58
  const requiredFullCircleSegments = (radius, resolution, sizing) => {
@@ -66,7 +66,7 @@ const requiredFullCircleSegments = (radius, resolution, sizing) => {
66
66
  : sizing === "face"
67
67
  ? Math.ceil(Math.PI / Math.atan(resolution.maxSegmentLength / radius / 2))
68
68
  : Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
69
- return Math.max(resolution.minimumSegments, chordSegments, lengthSegments);
69
+ return Math.max(resolution.minSegments, chordSegments, lengthSegments);
70
70
  };
71
71
  const assertRadius = (radius, operation) => {
72
72
  if (!Number.isFinite(radius) || radius <= 0) {
@@ -107,11 +107,11 @@ export function resolveCircularSegments(radius, policy = {}, limits = {}) {
107
107
  if (resolution.circularSegments !== undefined)
108
108
  return resolution.circularSegments;
109
109
  const required = requiredFullCircleSegments(radius, resolution, sizing);
110
- if (required > resolution.maximumSegments) {
111
- throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maximumSegments}-segment safety limit.`, {
110
+ if (required > resolution.maxSegments) {
111
+ throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maxSegments}-segment safety limit.`, {
112
112
  operation,
113
113
  details: {
114
- maximumSegments: resolution.maximumSegments,
114
+ maxSegments: resolution.maxSegments,
115
115
  radius,
116
116
  requiredSegments: required,
117
117
  },
@@ -142,7 +142,7 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
142
142
  * `alignTo` must be non-empty and contain only positive safe integers. Its checked least common
143
143
  * multiple defines the alignment grid. An exact `segments` value wins over
144
144
  * `resolution.circularSegments` and adaptive sampling, but is never rounded: it must already be
145
- * aligned and meet `minimumSegments`. Adaptive counts are rounded upward and fail with
145
+ * aligned and meet `minSegments`. Adaptive counts are rounded upward and fail with
146
146
  * `COMPLEXITY_LIMIT` when the aligned result exceeds the configured safety cap.
147
147
  *
148
148
  * @param radius - Positive circle radius in millimetres used for adaptive physical sampling.
@@ -176,9 +176,9 @@ export function resolveAlignedCircularSegments(radius, options) {
176
176
  }
177
177
  alignment = checkedLeastCommonMultiple(alignment, factor, operation);
178
178
  }
179
- const minimumSegments = options.minimumSegments ?? 3;
180
- if (!Number.isSafeInteger(minimumSegments) || minimumSegments < 3) {
181
- throw new GeometryError("INVALID_ARGUMENT", "minimumSegments must be a safe integer of at least three.", { operation, details: { minimumSegments } });
179
+ const minSegments = options.minSegments ?? 3;
180
+ if (!Number.isSafeInteger(minSegments) || minSegments < 3) {
181
+ throw new GeometryError("INVALID_ARGUMENT", "minSegments must be a safe integer of at least three.", { operation, details: { minSegments } });
182
182
  }
183
183
  const resolution = options.segments === undefined
184
184
  ? resolveGeometryResolution(options.resolution, options.limits)
@@ -187,10 +187,10 @@ export function resolveAlignedCircularSegments(radius, options) {
187
187
  }, options.limits);
188
188
  if (resolution.circularSegments !== undefined) {
189
189
  const exactSegments = resolution.circularSegments;
190
- if (exactSegments < minimumSegments || exactSegments % alignment !== 0) {
191
- throw new GeometryError("INVALID_ARGUMENT", "The exact segment count must meet minimumSegments and every alignTo factor.", {
190
+ if (exactSegments < minSegments || exactSegments % alignment !== 0) {
191
+ throw new GeometryError("INVALID_ARGUMENT", "The exact segment count must meet minSegments and every alignTo factor.", {
192
192
  operation,
193
- details: { alignment, exactSegments, minimumSegments },
193
+ details: { alignment, exactSegments, minSegments },
194
194
  });
195
195
  }
196
196
  return exactSegments;
@@ -199,18 +199,18 @@ export function resolveAlignedCircularSegments(radius, options) {
199
199
  ...resolution,
200
200
  sizing: options.sizing ?? "vertex",
201
201
  }, options.limits);
202
- const requiredSegments = Math.max(baseSegments, minimumSegments);
202
+ const requiredSegments = Math.max(baseSegments, minSegments);
203
203
  const multiplier = Math.ceil(requiredSegments / alignment);
204
204
  if (!Number.isSafeInteger(multiplier) || multiplier > Number.MAX_SAFE_INTEGER / alignment) {
205
205
  throw new GeometryError("COMPLEXITY_LIMIT", "The aligned segment count exceeds safe integer complexity.", { operation, details: { alignment, requiredSegments } });
206
206
  }
207
207
  const alignedSegments = multiplier * alignment;
208
- if (alignedSegments > resolution.maximumSegments) {
208
+ if (alignedSegments > resolution.maxSegments) {
209
209
  throw new GeometryError("COMPLEXITY_LIMIT", "Aligned circular tessellation exceeds the configured segment safety limit.", {
210
210
  operation,
211
211
  details: {
212
212
  alignment,
213
- maximumSegments: resolution.maximumSegments,
213
+ maxSegments: resolution.maxSegments,
214
214
  requiredSegments,
215
215
  segments: alignedSegments,
216
216
  },
@@ -225,7 +225,7 @@ export function resolveAlignedCircularSegments(radius, options) {
225
225
  * the reusable BOSL2-style convention while retaining at least one segment.
226
226
  *
227
227
  * @param radius - Arc radius in millimetres.
228
- * @param angleDegrees - Non-zero signed sweep angle no greater than 360 degrees in magnitude.
228
+ * @param angle - Non-zero signed sweep angle no greater than 360 degrees in magnitude.
229
229
  * @param policy - Optional operation-level policy over the active model scope.
230
230
  * @returns Segment count for the requested arc span.
231
231
  * @throws {@link GeometryError} when radius, angle, or resolution policy is invalid, or the
@@ -237,12 +237,12 @@ export function resolveAlignedCircularSegments(radius, options) {
237
237
  * const quarterTurnSegments = resolveArcSegments(10, 90);
238
238
  * ```
239
239
  */
240
- export function resolveArcSegments(radius, angleDegrees, policy = {}, limits = {}) {
240
+ export function resolveArcSegments(radius, angle, policy = {}, limits = {}) {
241
241
  const operation = "resolveArcSegments";
242
242
  assertRadius(radius, operation);
243
- if (!Number.isFinite(angleDegrees) || angleDegrees === 0 || Math.abs(angleDegrees) > 360) {
244
- throw new GeometryError("INVALID_ARGUMENT", "angleDegrees must be finite, non-zero, and no greater than 360 degrees in magnitude.", { operation, details: { angleDegrees } });
243
+ if (!Number.isFinite(angle) || angle === 0 || Math.abs(angle) > 360) {
244
+ throw new GeometryError("INVALID_ARGUMENT", "angle must be finite, non-zero, and no greater than 360 degrees in magnitude.", { operation, details: { angle } });
245
245
  }
246
- const ratio = Math.abs(angleDegrees) / 360;
246
+ const ratio = Math.abs(angle) / 360;
247
247
  return Math.max(1, Math.ceil(resolveCircularSegments(radius, policy, limits) * ratio));
248
248
  }
@@ -3,6 +3,7 @@ import { triangulateContour } from "../loft/loft.js";
3
3
  import { validateTriangleMesh } from "../mesh/mesh.js";
4
4
  import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
5
5
  import { writeMeshVertex } from "../numeric.js";
6
+ import { path2InputData } from "../paths/path-value.js";
6
7
  import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
7
8
  import { normalizeContour } from "../regions.js";
8
9
  import { assertSamplingCount } from "../sampling-limits.js";
@@ -16,6 +17,7 @@ const AXIS_EPSILON = 1e-10;
16
17
  * vertices and zero-area quads. Profile edges that lie entirely on the axis
17
18
  * collapse to the solid's interior and are intentionally omitted.
18
19
  * Profile coordinates must fit finite Float32 mesh storage.
20
+ * Path2 profiles must be closed; raw point collections have an implicit closing edge.
19
21
  *
20
22
  * @param profile - Closed CCW `[radius, z]` profile without a duplicated seam point.
21
23
  * @param options - Optional physical or exact circumferential sampling controls. Defaults to `{}`.
@@ -24,28 +26,31 @@ const AXIS_EPSILON = 1e-10;
24
26
  * @example Partial revolution with end caps
25
27
  * ```ts
26
28
  * // Each point is [radius, Z]; the profile seam is implicit.
27
- * revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], { revolveDegrees: 270 });
29
+ * revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], { degrees: 270 });
28
30
  * ```
29
31
  */
30
- export const revolveMesh = (profile, options = {}) => {
32
+ export const revolveMesh = (input, options = {}) => {
31
33
  if (typeof options !== "object" || options === null || Array.isArray(options))
32
34
  throw new GeometryError("INVALID_ARGUMENT", "Revolution options require an object.", {
33
35
  operation: "revolveMesh",
34
36
  });
35
- const degrees = options.revolveDegrees ?? 360;
37
+ const degrees = options.degrees ?? 360;
36
38
  if (!Number.isFinite(degrees) || degrees <= 0 || degrees > 360)
37
- throw new GeometryError("INVALID_ARGUMENT", "revolveDegrees must be in (0, 360].", {
39
+ throw new GeometryError("INVALID_ARGUMENT", "degrees must be in (0, 360].", {
38
40
  operation: "revolveMesh",
39
41
  });
42
+ const limits = resolveModelingLimits(options.limits);
43
+ let profile = path2InputData(input, true, { maxPathPoints: limits.maxProfilePoints }).points;
40
44
  if (profile.length < 3) {
41
- throw new Error("A revolved profile needs at least three points.");
45
+ throw new GeometryError("DEGENERATE_GEOMETRY", "A revolved profile needs at least three points.", {
46
+ operation: "revolveMesh",
47
+ });
42
48
  }
43
- const limits = resolveModelingLimits(options.limits);
44
49
  assertSamplingCount(profile.length, "revolveMesh", limits.maxProfilePoints);
45
50
  let maximumRadius = 0;
46
51
  for (const [radius, z] of profile) {
47
52
  if (!Number.isFinite(radius) || !Number.isFinite(z) || radius < 0) {
48
- throw new Error("Revolved profile coordinates must be finite and radii non-negative.");
53
+ throw new GeometryError(Number.isFinite(radius) && Number.isFinite(z) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", "Revolved profile coordinates must be finite and radii non-negative.", { operation: "revolveMesh" });
49
54
  }
50
55
  if (!Number.isFinite(Math.fround(radius)) || !Number.isFinite(Math.fround(z))) {
51
56
  throw new GeometryError("NON_FINITE_VALUE", "Revolved profile coordinates exceed finite Float32 mesh storage.", { operation: "revolveMesh" });
@@ -1,21 +1,12 @@
1
1
  import { GeometryError } from "./errors.js";
2
- import { unionPolygonGeometry } from "./polygon-clipping.js";
3
- import { normalizeRegion } from "./regions.js";
2
+ import { path2InputData } from "./paths/path-value.js";
3
+ import { clippingRing, regionFromMultiPolygon, unionPolygonGeometry } from "./polygon-clipping.js";
4
4
  import { resolveCircularSegments } from "./resolution.js";
5
5
  import { assertSamplingCount, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
6
6
  import { resolveGeometryTolerance } from "./tolerance.js";
7
7
  const DEFAULT_MITER_LIMIT = 4;
8
8
  function fail(message) {
9
- throw new GeometryError("INVALID_ARGUMENT", message, { operation: "strokePathRegion" });
10
- }
11
- function ring(points) {
12
- const result = points.map(([x, y]) => [x, y]);
13
- const first = result[0];
14
- const last = result.at(-1);
15
- if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1])) {
16
- result.push([...first]);
17
- }
18
- return result;
9
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation: "strokeRegionData" });
19
10
  }
20
11
  function ellipsePoints(center, radius, segments) {
21
12
  return Array.from({ length: segments }, (_, index) => {
@@ -76,8 +67,9 @@ function deduplicatePath(path, closed, width) {
76
67
  return Object.freeze(points);
77
68
  }
78
69
  /** @internal Bounded CCW stroke primitives shared by native sections and pure clipping. */
79
- export function strokePathContours(path, options, exactCircularSegments) {
80
- const closed = options.closed ?? false;
70
+ export function strokePathContours(input, options, exactCircularSegments) {
71
+ const limits = resolveGeometrySamplingLimits(options.limits);
72
+ const { points: path, closed } = path2InputData(input, options.closed, limits);
81
73
  const cap = options.cap ?? "butt";
82
74
  const join = options.join ?? "miter";
83
75
  if (typeof closed !== "boolean")
@@ -97,9 +89,8 @@ export function strokePathContours(path, options, exactCircularSegments) {
97
89
  ? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
98
90
  : 3);
99
91
  const half = options.width / 2;
100
- const limits = resolveGeometrySamplingLimits(options.limits);
101
- assertSamplingCount(path.length, "strokePathRegion", limits.maxPathPoints);
102
- assertSamplingCount(circularSegments, "strokePathRegion", limits.maxCircularSegments);
92
+ assertSamplingCount(path.length, "strokeRegionData", limits.maxPathPoints);
93
+ assertSamplingCount(circularSegments, "strokeRegionData", limits.maxCircularSegments);
103
94
  const normalizedPath = deduplicatePath(path, closed, options.width);
104
95
  if (normalizedPath.length < (closed ? 3 : 2))
105
96
  return [];
@@ -109,7 +100,7 @@ export function strokePathContours(path, options, exactCircularSegments) {
109
100
  const constructionVertices = segmentCount * 4 +
110
101
  joinCount * (join === "round" ? circularSegments : join === "miter" ? 4 : 3) +
111
102
  (!closed && cap === "round" ? 2 * circularSegments : 0);
112
- assertSamplingCount(constructionVertices, "strokePathRegion", limits.maxProfilePoints);
103
+ assertSamplingCount(constructionVertices, "strokeRegionData", limits.maxProfilePoints);
113
104
  for (let index = 0; index < segmentCount; index += 1) {
114
105
  let start = normalizedPath[index];
115
106
  let end = normalizedPath[(index + 1) % normalizedPath.length];
@@ -158,17 +149,11 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
158
149
  const contours = strokePathContours(path, options, circularSegments);
159
150
  if (contours.length === 0)
160
151
  return [];
161
- const result = unionPolygonGeometry(contours.map((contour) => [ring(contour)]));
152
+ const result = unionPolygonGeometry(contours.map((contour) => [clippingRing(contour)]));
162
153
  const outputVertices = result.reduce((count, polygon) => count + polygon.reduce((total, contour) => total + Math.max(0, contour.length - 1), 0), 0);
163
- assertSamplingCount(outputVertices, "strokePathRegion", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
154
+ assertSamplingCount(outputVertices, "strokeRegionData", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
164
155
  return result;
165
156
  }
166
- function regionFromMultiPolygon(value) {
167
- return normalizeRegion(value.map((polygon) => ({
168
- outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
169
- holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
170
- })));
171
- }
172
157
  /**
173
158
  * Converts a sampled millimetre path into the filled region covered by a centered stroke.
174
159
  *
@@ -177,7 +162,7 @@ function regionFromMultiPolygon(value) {
177
162
  * resolution. Bevels fill the outer corner triangle; miters extend the outer edges to their
178
163
  * intersection, falling back to bevels above SVG's default miter limit of 4.
179
164
  */
180
- export function strokePathRegion(path, options) {
165
+ export function strokeRegionData(path, options) {
181
166
  const result = strokePathMultiPolygon(path, options);
182
167
  if (result.length === 0)
183
168
  return fail("The sampled stroke path has no visible length.");
@@ -1,16 +1,8 @@
1
- import { polygonClipping, unionPolygonGeometry, xorPolygonGeometry } from "../polygon-clipping.js";
2
- import { normalizeRegion, signedContourArea } from "../regions.js";
1
+ import { clippingRing, polygonClipping, regionFromMultiPolygon, unionPolygonGeometry, xorPolygonGeometry, } from "../polygon-clipping.js";
2
+ import { signedContourArea } from "../regions.js";
3
3
  import { assertSamplingCount } from "../sampling-limits.js";
4
4
  /** Private clipping stage with the selected execution's immutable allocation ceiling. */
5
- export function createBoundedSvgClipping(maximumVertices) {
6
- function ring(points) {
7
- const result = points.map(([x, y]) => [x, y]);
8
- const first = result[0];
9
- const last = result.at(-1);
10
- if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1]))
11
- result.push([...first]);
12
- return result;
13
- }
5
+ export function createBoundedSvgClipping(maxVertices) {
14
6
  function ringVertexCount(value) {
15
7
  const first = value[0];
16
8
  const last = value.at(-1);
@@ -21,7 +13,7 @@ export function createBoundedSvgClipping(maximumVertices) {
21
13
  return value.reduce((total, polygon) => total + polygon.reduce((polygonTotal, path) => polygonTotal + ringVertexCount(path), 0), 0);
22
14
  }
23
15
  function assertExpandedVertexCount(vertices, stage) {
24
- assertSamplingCount(vertices, "preflightSvgRegion", maximumVertices, `SVG ${stage} exceeds ${maximumVertices} expanded vertices (requires ${vertices}).`);
16
+ assertSamplingCount(vertices, "preflightSvgRegion", maxVertices, `SVG ${stage} exceeds ${maxVertices} expanded vertices (requires ${vertices}).`);
25
17
  }
26
18
  function boundedMultiPolygon(value, stage) {
27
19
  assertExpandedVertexCount(multiPolygonVertexCount(value), stage);
@@ -136,16 +128,16 @@ export function createBoundedSvgClipping(maximumVertices) {
136
128
  .map((subpath) => subpath.points);
137
129
  if (rings.length === 0)
138
130
  return [];
139
- const polygons = rings.map((points) => [ring(points)]);
131
+ const polygons = rings.map((points) => [clippingRing(points)]);
140
132
  if (fillRule === "evenodd") {
141
133
  return boundedXor(polygons.map((polygon) => [polygon]), "even-odd fill output");
142
134
  }
143
135
  const positive = rings
144
136
  .filter((points) => signedContourArea(points) >= 0)
145
- .map((points) => [ring(points)]);
137
+ .map((points) => [clippingRing(points)]);
146
138
  const negative = rings
147
139
  .filter((points) => signedContourArea(points) < 0)
148
- .map((points) => [ring(points)]);
140
+ .map((points) => [clippingRing(points)]);
149
141
  if (positive.length === 0)
150
142
  return boundedUnion([negative], "negative fill output");
151
143
  if (negative.length === 0)
@@ -155,12 +147,6 @@ export function createBoundedSvgClipping(maximumVertices) {
155
147
  // precisely where positive and negative nonzero winding counts match.
156
148
  return differingCoverage(positive, negative);
157
149
  }
158
- function regionFromMultiPolygon(value) {
159
- return normalizeRegion(value.map((polygon) => ({
160
- outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
161
- holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
162
- })));
163
- }
164
150
  return {
165
151
  assertExpandedVertexCount,
166
152
  boundedMultiPolygon,