@metamesh/modeling 0.16.0 → 0.17.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 (666) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +26 -5
  3. package/dist/api/geometry.d.ts +99 -44
  4. package/dist/api/index.d.ts +167 -20
  5. package/dist/docs/guides/concepts.md +4 -1
  6. package/dist/docs/guides/recipes.md +33 -6
  7. package/dist/docs/manifest.json +191 -56
  8. package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
  9. package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
  10. package/dist/docs/reference/engine/GenerationOptions.md +1 -1
  11. package/dist/docs/reference/engine/GeometryResource.md +1 -1
  12. package/dist/docs/reference/engine/ModelDependencies.md +1 -1
  13. package/dist/docs/reference/engine/ModelEngine.md +1 -1
  14. package/dist/docs/reference/engine/ModelEngineOptions.md +1 -1
  15. package/dist/docs/reference/engine/ModelSession.md +1 -1
  16. package/dist/docs/reference/engine/ModelSnapshot.md +1 -1
  17. package/dist/docs/reference/engine/SessionOptions.md +1 -1
  18. package/dist/docs/reference/engine/SnapshotPart.md +1 -1
  19. package/dist/docs/reference/engine/categories/host-lifecycle.md +1 -1
  20. package/dist/docs/reference/engine/createModelEngine.md +1 -1
  21. package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
  22. package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
  23. package/dist/docs/reference/engine/validateModel.md +1 -1
  24. package/dist/docs/reference/engine.md +1 -1
  25. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
  26. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +1 -1
  27. package/dist/docs/reference/geometry/Anchor3-type.md +1 -1
  28. package/dist/docs/reference/geometry/ArcCurve2.md +1 -1
  29. package/dist/docs/reference/geometry/ArcCurve3.md +1 -1
  30. package/dist/docs/reference/geometry/AttachOptions.md +1 -1
  31. package/dist/docs/reference/geometry/AxisAngleRotation3.md +1 -1
  32. package/dist/docs/reference/geometry/Bounds2-type.md +1 -1
  33. package/dist/docs/reference/geometry/Bounds2Data.md +1 -1
  34. package/dist/docs/reference/geometry/Bounds2Input.md +1 -1
  35. package/dist/docs/reference/geometry/Bounds2Options.md +72 -0
  36. package/dist/docs/reference/geometry/Bounds3-type.md +1 -1
  37. package/dist/docs/reference/geometry/Bounds3Data.md +1 -1
  38. package/dist/docs/reference/geometry/Bounds3Input.md +1 -1
  39. package/dist/docs/reference/geometry/Bounds3Options.md +72 -0
  40. package/dist/docs/reference/geometry/BoundsFit2.md +1 -1
  41. package/dist/docs/reference/geometry/BoundsFit3.md +1 -1
  42. package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
  43. package/dist/docs/reference/geometry/BoxAnchorFace.md +1 -1
  44. package/dist/docs/reference/geometry/BoxAnchorOptions.md +1 -1
  45. package/dist/docs/reference/geometry/BoxEdge.md +1 -1
  46. package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
  47. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
  48. package/dist/docs/reference/geometry/BoxOptions.md +1 -1
  49. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
  50. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
  51. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
  52. package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
  53. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
  54. package/dist/docs/reference/geometry/CircularResolutionOptions.md +1 -1
  55. package/dist/docs/reference/geometry/CircularSampling.md +41 -0
  56. package/dist/docs/reference/geometry/CircularSamplingOptions.md +14 -0
  57. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
  58. package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
  59. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
  60. package/dist/docs/reference/geometry/Contour.md +1 -1
  61. package/dist/docs/reference/geometry/ContourCurve.md +1 -1
  62. package/dist/docs/reference/geometry/ContourPoint.md +1 -1
  63. package/dist/docs/reference/geometry/ContourSegment.md +1 -1
  64. package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
  65. package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
  66. package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
  67. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
  68. package/dist/docs/reference/geometry/CubicBezierCurve2.md +1 -1
  69. package/dist/docs/reference/geometry/CubicBezierCurve3.md +1 -1
  70. package/dist/docs/reference/geometry/Curve2.md +1 -1
  71. package/dist/docs/reference/geometry/Curve3.md +1 -1
  72. package/dist/docs/reference/geometry/CurveSamplingOptions.md +1 -1
  73. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +1 -1
  74. package/dist/docs/reference/geometry/CylinderAnchorFace.md +1 -1
  75. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +1 -1
  76. package/dist/docs/reference/geometry/CylinderOptions.md +1 -1
  77. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +1 -1
  78. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
  79. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
  80. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +1 -1
  81. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
  82. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
  83. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
  84. package/dist/docs/reference/geometry/CylindricalGearSpec.md +1 -1
  85. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
  86. package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
  87. package/dist/docs/reference/geometry/EllipseContourOptions.md +1 -1
  88. package/dist/docs/reference/geometry/EndTreatments.md +1 -1
  89. package/dist/docs/reference/geometry/ExtrudeOptions.md +1 -1
  90. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +1 -1
  91. package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
  92. package/dist/docs/reference/geometry/Frame3.md +1 -1
  93. package/dist/docs/reference/geometry/GeometryError.md +1 -1
  94. package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
  95. package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
  96. package/dist/docs/reference/geometry/GeometryResolution.md +1 -1
  97. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
  98. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
  99. package/dist/docs/reference/geometry/GridPatternOptions.md +1 -1
  100. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
  101. package/dist/docs/reference/geometry/HeightfieldOptions.md +1 -1
  102. package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
  103. package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +1 -1
  104. package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +1 -1
  105. package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
  106. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +1 -1
  107. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +1 -1
  108. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +1 -1
  109. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +1 -1
  110. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +1 -1
  111. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +1 -1
  112. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +1 -1
  113. package/dist/docs/reference/geometry/LineCurve2.md +1 -1
  114. package/dist/docs/reference/geometry/LineCurve3.md +1 -1
  115. package/dist/docs/reference/geometry/LinearPatternOptions.md +1 -1
  116. package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
  117. package/dist/docs/reference/geometry/LoftMeshStation.md +1 -1
  118. package/dist/docs/reference/geometry/LoftOptions.md +1 -1
  119. package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
  120. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
  121. package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
  122. package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
  123. package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
  124. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
  125. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
  126. package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
  127. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
  128. package/dist/docs/reference/geometry/Path2-type.md +1 -1
  129. package/dist/docs/reference/geometry/Path2Data.md +1 -1
  130. package/dist/docs/reference/geometry/Path2Input.md +1 -1
  131. package/dist/docs/reference/geometry/Path3-type.md +1 -1
  132. package/dist/docs/reference/geometry/Path3Data.md +1 -1
  133. package/dist/docs/reference/geometry/Path3Input.md +1 -1
  134. package/dist/docs/reference/geometry/PathFrame.md +1 -1
  135. package/dist/docs/reference/geometry/PathLocation.md +1 -1
  136. package/dist/docs/reference/geometry/PathNormalGuide.md +1 -1
  137. package/dist/docs/reference/geometry/PathOptions.md +1 -1
  138. package/dist/docs/reference/geometry/PathPatternOptions.md +1 -1
  139. package/dist/docs/reference/geometry/PathPlacement.md +1 -1
  140. package/dist/docs/reference/geometry/PathResamplingOptions.md +1 -1
  141. package/dist/docs/reference/geometry/Pivot2Options.md +1 -1
  142. package/dist/docs/reference/geometry/Pivot3Options.md +1 -1
  143. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
  144. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +1 -1
  145. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
  146. package/dist/docs/reference/geometry/PlanarPatchQuality.md +1 -1
  147. package/dist/docs/reference/geometry/PolygonData.md +1 -1
  148. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +1 -1
  149. package/dist/docs/reference/geometry/PrimitiveAttachment.md +1 -1
  150. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +1 -1
  151. package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
  152. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
  153. package/dist/docs/reference/geometry/Profile.md +1 -1
  154. package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
  155. package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
  156. package/dist/docs/reference/geometry/ProfileSpan2.md +1 -1
  157. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +1 -1
  158. package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
  159. package/dist/docs/reference/geometry/RackPitchSpec.md +1 -1
  160. package/dist/docs/reference/geometry/RadialPatternOptions.md +1 -1
  161. package/dist/docs/reference/geometry/RadialSizing.md +1 -1
  162. package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
  163. package/dist/docs/reference/geometry/RectangleContourOptions.md +1 -1
  164. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
  165. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
  166. package/dist/docs/reference/geometry/RectangleProfileOptions.md +1 -1
  167. package/dist/docs/reference/geometry/RegionData.md +1 -1
  168. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +1 -1
  169. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
  170. package/dist/docs/reference/geometry/RevolveOptions.md +1 -1
  171. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
  172. package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
  173. package/dist/docs/reference/geometry/SampleContourOptions.md +1 -1
  174. package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
  175. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +1 -1
  176. package/dist/docs/reference/geometry/SampledCurve2.md +1 -1
  177. package/dist/docs/reference/geometry/SampledCurve3.md +1 -1
  178. package/dist/docs/reference/geometry/SampledThreadHelices.md +1 -1
  179. package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
  180. package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
  181. package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
  182. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
  183. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +1 -1
  184. package/dist/docs/reference/geometry/SphereOptions.md +1 -1
  185. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
  186. package/dist/docs/reference/geometry/StrokeCap.md +1 -1
  187. package/dist/docs/reference/geometry/StrokeJoin.md +1 -1
  188. package/dist/docs/reference/geometry/StrokeOptions.md +1 -1
  189. package/dist/docs/reference/geometry/SvgImportOptions.md +16 -1
  190. package/dist/docs/reference/geometry/SvgRegionPreflight.md +16 -1
  191. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +1 -1
  192. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +1 -1
  193. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +1 -1
  194. package/dist/docs/reference/geometry/SweepOptions.md +1 -1
  195. package/dist/docs/reference/geometry/SweepOrientation.md +1 -1
  196. package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
  197. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +1 -1
  198. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
  199. package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
  200. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
  201. package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
  202. package/dist/docs/reference/geometry/ThreadHelixOptions.md +1 -1
  203. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
  204. package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
  205. package/dist/docs/reference/geometry/ThreadProfile-type.md +1 -1
  206. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
  207. package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
  208. package/dist/docs/reference/geometry/ThreadRole.md +1 -1
  209. package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
  210. package/dist/docs/reference/geometry/ThreadedNutOptions.md +1 -1
  211. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
  212. package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
  213. package/dist/docs/reference/geometry/ThreadedRodOptions.md +1 -1
  214. package/dist/docs/reference/geometry/TorusOptions.md +1 -1
  215. package/dist/docs/reference/geometry/Transform2-type.md +1 -1
  216. package/dist/docs/reference/geometry/Transform2Data.md +1 -1
  217. package/dist/docs/reference/geometry/Transform2Input.md +1 -1
  218. package/dist/docs/reference/geometry/Transform3-type.md +1 -1
  219. package/dist/docs/reference/geometry/Transform3Data.md +1 -1
  220. package/dist/docs/reference/geometry/Transform3Input.md +1 -1
  221. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +1 -1
  222. package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
  223. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +1 -1
  224. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
  225. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
  226. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +1 -1
  227. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
  228. package/dist/docs/reference/geometry/TriangleMeshSignature.md +1 -1
  229. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +1 -1
  230. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
  231. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
  232. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
  233. package/dist/docs/reference/geometry/TubeOptions.md +1 -1
  234. package/dist/docs/reference/geometry/Vector2-type.md +1 -1
  235. package/dist/docs/reference/geometry/Vector2Data.md +1 -1
  236. package/dist/docs/reference/geometry/Vector2Input.md +1 -1
  237. package/dist/docs/reference/geometry/Vector3-type.md +1 -1
  238. package/dist/docs/reference/geometry/Vector3Data.md +1 -1
  239. package/dist/docs/reference/geometry/Vector3Input.md +1 -1
  240. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +1 -1
  241. package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
  242. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +3 -3
  243. package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
  244. package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
  245. package/dist/docs/reference/geometry/add2.md +1 -1
  246. package/dist/docs/reference/geometry/add3.md +1 -1
  247. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
  248. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +1 -1
  249. package/dist/docs/reference/geometry/anchor3.md +1 -1
  250. package/dist/docs/reference/geometry/anchorFrame3.md +1 -1
  251. package/dist/docs/reference/geometry/applyTransformDirection3.md +1 -1
  252. package/dist/docs/reference/geometry/applyTransformPoint3.md +1 -1
  253. package/dist/docs/reference/geometry/attachmentTransform3.md +1 -1
  254. package/dist/docs/reference/geometry/bounds2.md +7 -6
  255. package/dist/docs/reference/geometry/bounds3.md +7 -6
  256. package/dist/docs/reference/geometry/boundsCenter.md +1 -1
  257. package/dist/docs/reference/geometry/boundsSize.md +1 -1
  258. package/dist/docs/reference/geometry/boxAnchor3.md +1 -1
  259. package/dist/docs/reference/geometry/categories/bounds-layout.md +7 -8
  260. package/dist/docs/reference/geometry/categories/curves-paths.md +1 -1
  261. package/dist/docs/reference/geometry/categories/mechanical.md +1 -1
  262. package/dist/docs/reference/geometry/categories/meshes.md +1 -1
  263. package/dist/docs/reference/geometry/categories/pattern-placement.md +1 -1
  264. package/dist/docs/reference/geometry/categories/primitive-options.md +1 -1
  265. package/dist/docs/reference/geometry/categories/profiles-regions.md +1 -1
  266. package/dist/docs/reference/geometry/categories/resolution-errors.md +5 -2
  267. package/dist/docs/reference/geometry/categories/transforms-math.md +1 -1
  268. package/dist/docs/reference/geometry/categories/vector-import.md +1 -1
  269. package/dist/docs/reference/geometry/circleContour.md +1 -1
  270. package/dist/docs/reference/geometry/closeToAxis.md +1 -1
  271. package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
  272. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +1 -1
  273. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +1 -1
  274. package/dist/docs/reference/geometry/composeTransform3.md +1 -1
  275. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +1 -1
  276. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +1 -1
  277. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +1 -1
  278. package/dist/docs/reference/geometry/computeTriangleMeshSignature.md +1 -1
  279. package/dist/docs/reference/geometry/contourContainsPoint.md +1 -1
  280. package/dist/docs/reference/geometry/cross2.md +1 -1
  281. package/dist/docs/reference/geometry/cross3.md +1 -1
  282. package/dist/docs/reference/geometry/cylinderAnchor3.md +1 -1
  283. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
  284. package/dist/docs/reference/geometry/distance2.md +1 -1
  285. package/dist/docs/reference/geometry/distance3.md +1 -1
  286. package/dist/docs/reference/geometry/distributeAlongPath.md +1 -1
  287. package/dist/docs/reference/geometry/dot2.md +1 -1
  288. package/dist/docs/reference/geometry/dot3.md +1 -1
  289. package/dist/docs/reference/geometry/ellipseContour.md +1 -1
  290. package/dist/docs/reference/geometry/eulerTransform3.md +1 -1
  291. package/dist/docs/reference/geometry/extrudeMesh.md +1 -1
  292. package/dist/docs/reference/geometry/fitBounds.md +1 -1
  293. package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
  294. package/dist/docs/reference/geometry/frameTransform3.md +1 -1
  295. package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +1 -1
  296. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
  297. package/dist/docs/reference/geometry/gridPatternTransforms.md +1 -1
  298. package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
  299. package/dist/docs/reference/geometry/helicalThreadRidgeMesh.md +1 -1
  300. package/dist/docs/reference/geometry/helicalThreadSolidMesh.md +1 -1
  301. package/dist/docs/reference/geometry/inverseTransform3.md +1 -1
  302. package/dist/docs/reference/geometry/isGeometryError.md +1 -1
  303. package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
  304. package/dist/docs/reference/geometry/layoutRow.md +1 -1
  305. package/dist/docs/reference/geometry/length2.md +1 -1
  306. package/dist/docs/reference/geometry/length3.md +1 -1
  307. package/dist/docs/reference/geometry/lerp2.md +1 -1
  308. package/dist/docs/reference/geometry/lerp3.md +1 -1
  309. package/dist/docs/reference/geometry/linearPatternTransforms.md +1 -1
  310. package/dist/docs/reference/geometry/loftMesh.md +1 -1
  311. package/dist/docs/reference/geometry/matchProfiles.md +1 -1
  312. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +1 -1
  313. package/dist/docs/reference/geometry/meshBounds.md +1 -1
  314. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +1 -1
  315. package/dist/docs/reference/geometry/normalize2.md +1 -1
  316. package/dist/docs/reference/geometry/normalize3.md +1 -1
  317. package/dist/docs/reference/geometry/normalizeContour.md +1 -1
  318. package/dist/docs/reference/geometry/normalizePolygon.md +1 -1
  319. package/dist/docs/reference/geometry/normalizeRegion.md +1 -1
  320. package/dist/docs/reference/geometry/optimizePlanarPatches.md +1 -1
  321. package/dist/docs/reference/geometry/path2.md +1 -1
  322. package/dist/docs/reference/geometry/path3.md +1 -1
  323. package/dist/docs/reference/geometry/pathPatternTransforms.md +1 -1
  324. package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
  325. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +1 -1
  326. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +1 -1
  327. package/dist/docs/reference/geometry/preflightSvgRegion.md +12 -3
  328. package/dist/docs/reference/geometry/preflightThreadedNut.md +1 -1
  329. package/dist/docs/reference/geometry/preflightThreadedRod.md +1 -1
  330. package/dist/docs/reference/geometry/projectOntoPlane3.md +1 -1
  331. package/dist/docs/reference/geometry/radialPatternTransforms.md +1 -1
  332. package/dist/docs/reference/geometry/rectangleContour.md +1 -1
  333. package/dist/docs/reference/geometry/rectangleProfile.md +1 -1
  334. package/dist/docs/reference/geometry/regionArea.md +1 -1
  335. package/dist/docs/reference/geometry/regionBounds.md +1 -1
  336. package/dist/docs/reference/geometry/regularPolygonContour.md +1 -1
  337. package/dist/docs/reference/geometry/resamplePolyline2.md +1 -1
  338. package/dist/docs/reference/geometry/resamplePolyline3.md +1 -1
  339. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +1 -1
  340. package/dist/docs/reference/geometry/resolveArcSegments.md +1 -1
  341. package/dist/docs/reference/geometry/resolveCircularSampling.md +40 -0
  342. package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
  343. package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
  344. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
  345. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +1 -1
  346. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
  347. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
  348. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +1 -1
  349. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
  350. package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
  351. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +1 -1
  352. package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
  353. package/dist/docs/reference/geometry/revolveMesh.md +1 -1
  354. package/dist/docs/reference/geometry/rotate2.md +1 -1
  355. package/dist/docs/reference/geometry/rotationTransform3.md +1 -1
  356. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +1 -1
  357. package/dist/docs/reference/geometry/sampleContour.md +1 -1
  358. package/dist/docs/reference/geometry/sampleCurve2.md +1 -1
  359. package/dist/docs/reference/geometry/sampleCurve3.md +1 -1
  360. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
  361. package/dist/docs/reference/geometry/sampleHelix.md +1 -1
  362. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
  363. package/dist/docs/reference/geometry/sampleRackToothPath.md +1 -1
  364. package/dist/docs/reference/geometry/sampleSideProfile.md +1 -1
  365. package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
  366. package/dist/docs/reference/geometry/sampleThreadHelices.md +1 -1
  367. package/dist/docs/reference/geometry/scale2.md +1 -1
  368. package/dist/docs/reference/geometry/scale3.md +1 -1
  369. package/dist/docs/reference/geometry/scaleTransform3.md +1 -1
  370. package/dist/docs/reference/geometry/signedContourArea.md +1 -1
  371. package/dist/docs/reference/geometry/starContour.md +1 -1
  372. package/dist/docs/reference/geometry/strokeRegionData.md +1 -1
  373. package/dist/docs/reference/geometry/subtract2.md +1 -1
  374. package/dist/docs/reference/geometry/subtract3.md +1 -1
  375. package/dist/docs/reference/geometry/sweepMesh.md +1 -1
  376. package/dist/docs/reference/geometry/threadProfile.md +1 -1
  377. package/dist/docs/reference/geometry/transform2.md +1 -1
  378. package/dist/docs/reference/geometry/transform3.md +1 -1
  379. package/dist/docs/reference/geometry/transformDeterminant3.md +1 -1
  380. package/dist/docs/reference/geometry/transformRegionData.md +1 -1
  381. package/dist/docs/reference/geometry/transformTriangleMesh.md +1 -1
  382. package/dist/docs/reference/geometry/translationTransform3.md +1 -1
  383. package/dist/docs/reference/geometry/triangulateContour.md +1 -1
  384. package/dist/docs/reference/geometry/validateSolidMesh.md +1 -1
  385. package/dist/docs/reference/geometry/validateTransform3.md +1 -1
  386. package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
  387. package/dist/docs/reference/geometry/vector2.md +1 -1
  388. package/dist/docs/reference/geometry/vector3.md +1 -1
  389. package/dist/docs/reference/geometry.md +1 -1
  390. package/dist/docs/reference/model/Anchor3.md +1 -1
  391. package/dist/docs/reference/model/AttachOptions.md +1 -1
  392. package/dist/docs/reference/model/Bounds2-type.md +1 -1
  393. package/dist/docs/reference/model/Bounds2Data.md +1 -1
  394. package/dist/docs/reference/model/Bounds2Input.md +1 -1
  395. package/dist/docs/reference/model/Bounds2Options.md +70 -0
  396. package/dist/docs/reference/model/Bounds3-type.md +1 -1
  397. package/dist/docs/reference/model/Bounds3Data.md +1 -1
  398. package/dist/docs/reference/model/Bounds3Input.md +1 -1
  399. package/dist/docs/reference/model/Bounds3Options.md +70 -0
  400. package/dist/docs/reference/model/BoxEdge.md +1 -1
  401. package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
  402. package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
  403. package/dist/docs/reference/model/BoxOptions.md +1 -1
  404. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
  405. package/dist/docs/reference/model/CircleContourOptions.md +1 -1
  406. package/dist/docs/reference/model/CircleOptions.md +1 -1
  407. package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
  408. package/dist/docs/reference/model/Computed.md +1 -1
  409. package/dist/docs/reference/model/ComputedValue.md +1 -1
  410. package/dist/docs/reference/model/Contour.md +1 -1
  411. package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
  412. package/dist/docs/reference/model/CorrespondingContour.md +1 -1
  413. package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
  414. package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
  415. package/dist/docs/reference/model/CylinderOptions.md +1 -1
  416. package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
  417. package/dist/docs/reference/model/EdgeTreatment.md +1 -1
  418. package/dist/docs/reference/model/EllipseContourOptions.md +1 -1
  419. package/dist/docs/reference/model/EllipseOptions.md +1 -1
  420. package/dist/docs/reference/model/EndTreatments.md +1 -1
  421. package/dist/docs/reference/model/ExtrudeOptions.md +1 -1
  422. package/dist/docs/reference/model/FinalizedModel.md +1 -1
  423. package/dist/docs/reference/model/FinalizedPart.md +1 -1
  424. package/dist/docs/reference/model/Frame3.md +1 -1
  425. package/dist/docs/reference/model/GenerateCallback.md +1 -1
  426. package/dist/docs/reference/model/GenerateContext.md +1 -1
  427. package/dist/docs/reference/model/GeneratedPart.md +1 -1
  428. package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
  429. package/dist/docs/reference/model/GenerationError.md +1 -1
  430. package/dist/docs/reference/model/GeometryResolution.md +1 -1
  431. package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
  432. package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
  433. package/dist/docs/reference/model/GridPatternOptions.md +1 -1
  434. package/dist/docs/reference/model/HeightfieldOptions.md +1 -1
  435. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +1 -1
  436. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
  437. package/dist/docs/reference/model/HoleCutterOptions.md +77 -0
  438. package/dist/docs/reference/model/HoleCutterOverrun.md +35 -0
  439. package/dist/docs/reference/model/HoleCutterRecess.md +87 -0
  440. package/dist/docs/reference/model/HullOptions.md +1 -1
  441. package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
  442. package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
  443. package/dist/docs/reference/model/ImplicitOptions.md +1 -1
  444. package/dist/docs/reference/model/InternalThreadCutterOptions.md +1 -1
  445. package/dist/docs/reference/model/KnuckleHinge-type.md +1 -1
  446. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +1 -1
  447. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +9 -5
  448. package/dist/docs/reference/model/KnuckleHingeOptions.md +3 -3
  449. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +1 -1
  450. package/dist/docs/reference/model/KnuckleHingeSpec.md +1 -1
  451. package/dist/docs/reference/model/KnuckleHingeWeb.md +2 -2
  452. package/dist/docs/reference/model/LinearPatternOptions.md +1 -1
  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 +1 -1
  457. package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
  458. package/dist/docs/reference/model/ModelProgram.md +1 -1
  459. package/dist/docs/reference/model/ModelingLimits.md +1 -1
  460. package/dist/docs/reference/model/NumericArray.md +1 -1
  461. package/dist/docs/reference/model/PartGeometry.md +1 -1
  462. package/dist/docs/reference/model/PartOptions.md +1 -1
  463. package/dist/docs/reference/model/Path2-type.md +1 -1
  464. package/dist/docs/reference/model/Path2Data.md +1 -1
  465. package/dist/docs/reference/model/Path2Input.md +1 -1
  466. package/dist/docs/reference/model/Path3-type.md +1 -1
  467. package/dist/docs/reference/model/Path3Data.md +1 -1
  468. package/dist/docs/reference/model/Path3Input.md +1 -1
  469. package/dist/docs/reference/model/PathLocation.md +1 -1
  470. package/dist/docs/reference/model/PathNormalGuide.md +1 -1
  471. package/dist/docs/reference/model/PathOptions.md +1 -1
  472. package/dist/docs/reference/model/PathPatternOptions.md +1 -1
  473. package/dist/docs/reference/model/PathResamplingOptions.md +1 -1
  474. package/dist/docs/reference/model/PatternSource.md +1 -1
  475. package/dist/docs/reference/model/Pivot2Options.md +1 -1
  476. package/dist/docs/reference/model/Pivot3Options.md +1 -1
  477. package/dist/docs/reference/model/PlaneOptions.md +1 -1
  478. package/dist/docs/reference/model/PolygonData.md +1 -1
  479. package/dist/docs/reference/model/PolygonOptions.md +1 -1
  480. package/dist/docs/reference/model/PrimitiveAttachment.md +1 -1
  481. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +1 -1
  482. package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
  483. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
  484. package/dist/docs/reference/model/Profile.md +1 -1
  485. package/dist/docs/reference/model/ProfileComponent2.md +1 -1
  486. package/dist/docs/reference/model/ProfileContour2.md +1 -1
  487. package/dist/docs/reference/model/ProfileSpan2.md +1 -1
  488. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +1 -1
  489. package/dist/docs/reference/model/RadialPatternOptions.md +1 -1
  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 +1 -1
  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 +1 -1
  496. package/dist/docs/reference/model/RegionData.md +1 -1
  497. package/dist/docs/reference/model/RegularPolygonOptions.md +1 -1
  498. package/dist/docs/reference/model/RevolveOptions.md +1 -1
  499. package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
  500. package/dist/docs/reference/model/Section.md +1 -1
  501. package/dist/docs/reference/model/SectionHullOptions.md +1 -1
  502. package/dist/docs/reference/model/SectionInspection.md +1 -1
  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 +1 -1
  507. package/dist/docs/reference/model/SolidInspection.md +1 -1
  508. package/dist/docs/reference/model/SolidSegmentHit.md +1 -1
  509. package/dist/docs/reference/model/SphereOptions.md +1 -1
  510. package/dist/docs/reference/model/StarOptions.md +1 -1
  511. package/dist/docs/reference/model/StrokeCap.md +1 -1
  512. package/dist/docs/reference/model/StrokeJoin.md +1 -1
  513. package/dist/docs/reference/model/StrokeOptions.md +1 -1
  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 +14 -1
  517. package/dist/docs/reference/model/SweepOptions.md +1 -1
  518. package/dist/docs/reference/model/SweepOrientation.md +1 -1
  519. package/dist/docs/reference/model/TextSectionOptions.md +1 -1
  520. package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
  521. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
  522. package/dist/docs/reference/model/ThreadHandedness.md +1 -1
  523. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
  524. package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
  525. package/dist/docs/reference/model/ThreadProfile.md +1 -1
  526. package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
  527. package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
  528. package/dist/docs/reference/model/ThreadedNutOptions.md +1 -1
  529. package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
  530. package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
  531. package/dist/docs/reference/model/ThreadedRodOptions.md +1 -1
  532. package/dist/docs/reference/model/TorusOptions.md +1 -1
  533. package/dist/docs/reference/model/Transform2-type.md +1 -1
  534. package/dist/docs/reference/model/Transform2Data.md +1 -1
  535. package/dist/docs/reference/model/Transform2Input.md +1 -1
  536. package/dist/docs/reference/model/Transform3-type.md +1 -1
  537. package/dist/docs/reference/model/Transform3Data.md +1 -1
  538. package/dist/docs/reference/model/Transform3Input.md +1 -1
  539. package/dist/docs/reference/model/TriangleMesh.md +1 -1
  540. package/dist/docs/reference/model/TriangleMeshAnalysis.md +1 -1
  541. package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
  542. package/dist/docs/reference/model/TubeOptions.md +1 -1
  543. package/dist/docs/reference/model/Vector2-type.md +1 -1
  544. package/dist/docs/reference/model/Vector2Data.md +1 -1
  545. package/dist/docs/reference/model/Vector2Input.md +1 -1
  546. package/dist/docs/reference/model/Vector3-type.md +1 -1
  547. package/dist/docs/reference/model/Vector3Data.md +1 -1
  548. package/dist/docs/reference/model/Vector3Input.md +1 -1
  549. package/dist/docs/reference/model/VectorTextLayout.md +1 -1
  550. package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
  551. package/dist/docs/reference/model/anchor.md +1 -1
  552. package/dist/docs/reference/model/bounds2.md +7 -6
  553. package/dist/docs/reference/model/bounds3.md +7 -6
  554. package/dist/docs/reference/model/box.md +1 -1
  555. package/dist/docs/reference/model/castSegment.md +1 -1
  556. package/dist/docs/reference/model/categories/boolean-operations.md +1 -1
  557. package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -1
  558. package/dist/docs/reference/model/categories/bounds.md +5 -3
  559. package/dist/docs/reference/model/categories/contracts.md +1 -1
  560. package/dist/docs/reference/model/categories/core-values-errors.md +1 -1
  561. package/dist/docs/reference/model/categories/explicit-profiles.md +1 -1
  562. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +1 -1
  563. package/dist/docs/reference/model/categories/generation.md +1 -1
  564. package/dist/docs/reference/model/categories/hinges.md +2 -2
  565. package/dist/docs/reference/model/categories/inspection.md +1 -1
  566. package/dist/docs/reference/model/categories/mesh-inspection.md +1 -1
  567. package/dist/docs/reference/model/categories/paths.md +1 -1
  568. package/dist/docs/reference/model/categories/primitives.md +5 -1
  569. package/dist/docs/reference/model/categories/resolution.md +1 -1
  570. package/dist/docs/reference/model/categories/sections.md +1 -1
  571. package/dist/docs/reference/model/categories/threads.md +1 -1
  572. package/dist/docs/reference/model/categories/transforms-placement.md +1 -1
  573. package/dist/docs/reference/model/circle.md +1 -1
  574. package/dist/docs/reference/model/components.md +1 -1
  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 +1 -1
  580. package/dist/docs/reference/model/generate.md +1 -1
  581. package/dist/docs/reference/model/gridPattern.md +1 -1
  582. package/dist/docs/reference/model/heightfield.md +1 -1
  583. package/dist/docs/reference/model/holeCutter.md +45 -0
  584. package/dist/docs/reference/model/hull.md +1 -1
  585. package/dist/docs/reference/model/immutableBuffer.md +1 -1
  586. package/dist/docs/reference/model/immutableMesh.md +1 -1
  587. package/dist/docs/reference/model/implicit.md +1 -1
  588. package/dist/docs/reference/model/inspectSection.md +1 -1
  589. package/dist/docs/reference/model/inspectSolid.md +1 -1
  590. package/dist/docs/reference/model/internalThreadCutter.md +1 -1
  591. package/dist/docs/reference/model/intersect.md +1 -1
  592. package/dist/docs/reference/model/isEmpty.md +1 -1
  593. package/dist/docs/reference/model/knuckleHinge.md +3 -3
  594. package/dist/docs/reference/model/linearPattern.md +1 -1
  595. package/dist/docs/reference/model/loft.md +1 -1
  596. package/dist/docs/reference/model/matchProfiles.md +1 -1
  597. package/dist/docs/reference/model/minkowskiSum.md +1 -1
  598. package/dist/docs/reference/model/path2.md +1 -1
  599. package/dist/docs/reference/model/path3.md +1 -1
  600. package/dist/docs/reference/model/pathPattern.md +1 -1
  601. package/dist/docs/reference/model/polygon.md +1 -1
  602. package/dist/docs/reference/model/preflightInternalThreadCutter.md +1 -1
  603. package/dist/docs/reference/model/preflightThreadedNut.md +1 -1
  604. package/dist/docs/reference/model/preflightThreadedRod.md +1 -1
  605. package/dist/docs/reference/model/radialPattern.md +1 -1
  606. package/dist/docs/reference/model/rectangle.md +1 -1
  607. package/dist/docs/reference/model/regularPolygon.md +1 -1
  608. package/dist/docs/reference/model/revolve.md +1 -1
  609. package/dist/docs/reference/model/solidFromMesh.md +1 -1
  610. package/dist/docs/reference/model/sphere.md +1 -1
  611. package/dist/docs/reference/model/split.md +1 -1
  612. package/dist/docs/reference/model/splitByPlane.md +1 -1
  613. package/dist/docs/reference/model/star.md +1 -1
  614. package/dist/docs/reference/model/stroke.md +1 -1
  615. package/dist/docs/reference/model/svgPathSection.md +1 -1
  616. package/dist/docs/reference/model/svgSection.md +5 -1
  617. package/dist/docs/reference/model/sweep.md +1 -1
  618. package/dist/docs/reference/model/textSection.md +1 -1
  619. package/dist/docs/reference/model/threadRidge.md +1 -1
  620. package/dist/docs/reference/model/threadedNut.md +1 -1
  621. package/dist/docs/reference/model/threadedRod.md +1 -1
  622. package/dist/docs/reference/model/torus.md +1 -1
  623. package/dist/docs/reference/model/transform2.md +1 -1
  624. package/dist/docs/reference/model/transform3.md +1 -1
  625. package/dist/docs/reference/model/tube.md +1 -1
  626. package/dist/docs/reference/model/union.md +1 -1
  627. package/dist/docs/reference/model/vector2.md +1 -1
  628. package/dist/docs/reference/model/vector3.md +1 -1
  629. package/dist/docs/reference/model.md +1 -1
  630. package/dist/docs/reference/text/Bounds2Data.md +1 -1
  631. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
  632. package/dist/docs/reference/text/Vector2Data.md +1 -1
  633. package/dist/docs/reference/text/VectorFont.md +7 -7
  634. package/dist/docs/reference/text/VectorFontOptions.md +1 -1
  635. package/dist/docs/reference/text/VectorTextArcBaseline.md +1 -1
  636. package/dist/docs/reference/text/VectorTextLayout.md +1 -1
  637. package/dist/docs/reference/text/VectorTextLayoutOptions.md +3 -3
  638. package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
  639. package/dist/docs/reference/text/VectorTextOptions.md +1 -1
  640. package/dist/docs/reference/text/categories/font-preparation.md +1 -1
  641. package/dist/docs/reference/text/prepareVectorFont.md +1 -1
  642. package/dist/docs/reference/text.md +1 -1
  643. package/dist/engine/extrusion-finishing.js +2 -29
  644. package/dist/engine/hole-cutter-operation.js +148 -0
  645. package/dist/engine/knuckle-hinge-operation.js +55 -12
  646. package/dist/engine/modeling-context.js +12 -0
  647. package/dist/engine/primitive-operations.js +19 -6
  648. package/dist/engine/section-operations.js +1 -1
  649. package/dist/geometry/bounds-value.js +37 -9
  650. package/dist/geometry/bounds.js +0 -17
  651. package/dist/geometry/circular-sampling.js +45 -0
  652. package/dist/geometry/convex-offset.js +41 -0
  653. package/dist/geometry/index.js +2 -1
  654. package/dist/geometry/math/immutable-value.js +1 -1
  655. package/dist/geometry/profiles/profiles.js +3 -23
  656. package/dist/geometry/svg/matrix.js +21 -0
  657. package/dist/geometry/svg-import.js +134 -52
  658. package/dist/model/execution-binding.js +1 -1
  659. package/dist/model/geometry-recipes.js +1 -1
  660. package/dist/model/hole-cutter.js +1 -0
  661. package/dist/model/operations.js +23 -2
  662. package/dist/model/recipe-declaration.js +1 -0
  663. package/package.json +1 -1
  664. package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +0 -24
  665. package/dist/docs/reference/geometry/boundsFromSize.md +0 -84
  666. package/dist/docs/reference/geometry/containsBounds.md +0 -73
@@ -0,0 +1,45 @@
1
+ import { GeometryError } from "./errors.js";
2
+ import { resolveCircularPrimitiveSegments } from "./primitive-resolution.js";
3
+ import { assertPrimitiveOptions } from "./primitive-resolvers.js";
4
+ function fail(message, nonfinite = false) {
5
+ throw new GeometryError(nonfinite ? "NON_FINITE_VALUE" : "INVALID_ARGUMENT", message, {
6
+ operation: "resolveCircularSampling",
7
+ });
8
+ }
9
+ /**
10
+ * Resolves circular sampling and its actual radial envelopes without allocating boundary points.
11
+ *
12
+ * Vertex sizing retains the nominal vertex radius; face sizing retains the nominal face radius.
13
+ * Exact `segments` override resolution, while allocation ceilings still apply. Adaptive sampling
14
+ * uses the same count calculation as `resolveCircularSegments` and `circleContour` and rejects
15
+ * exhausted limits rather than coarsening. The returned record is immutable and needs no engine.
16
+ *
17
+ * @example Check a nominal 8 mm face-sized bore
18
+ * ```ts
19
+ * const bore = resolveCircularSampling({ diameter: 8, segments: 64, sizing: "face" });
20
+ * bore.faceRadius; // 4 mm
21
+ * bore.vertexRadius; // slightly larger than 4 mm
22
+ * ```
23
+ */
24
+ export function resolveCircularSampling(options) {
25
+ const operation = "resolveCircularSampling";
26
+ assertPrimitiveOptions(options, operation);
27
+ if ((options.radius === undefined) === (options.diameter === undefined)) {
28
+ fail("Specify exactly one radius or diameter.");
29
+ }
30
+ const radius = options.radius ?? options.diameter / 2;
31
+ const finite = Number.isFinite(radius);
32
+ if (!finite || radius <= 0)
33
+ fail("Circle radius must be finite and positive.", !finite);
34
+ const sizing = options.sizing ?? "vertex";
35
+ if (sizing !== "vertex" && sizing !== "face") {
36
+ fail("sizing must be vertex or face.");
37
+ }
38
+ const segments = resolveCircularPrimitiveSegments(radius, options, operation);
39
+ const cosine = Math.cos(Math.PI / segments);
40
+ const vertexRadius = sizing === "face" ? radius / cosine : radius;
41
+ const faceRadius = sizing === "face" ? radius : radius * cosine;
42
+ if (!Number.isFinite(vertexRadius))
43
+ fail("Sampled radii must remain finite.", true);
44
+ return Object.freeze({ segments, vertexRadius, faceRadius });
45
+ }
@@ -0,0 +1,41 @@
1
+ import { GeometryError } from "./errors.js";
2
+ /** @internal Parallel-edge offsets shared by convex extrusion rims and pocket entries. */
3
+ export function convexContourOffsets(points, operation) {
4
+ const fail = (message) => {
5
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation });
6
+ };
7
+ if (points.length < 3)
8
+ fail("A convex contour needs at least three vertices.");
9
+ const edges = points.map((point, index) => {
10
+ const next = points[(index + 1) % points.length];
11
+ const dx = next[0] - point[0], dy = next[1] - point[1];
12
+ const length = Math.hypot(dx, dy);
13
+ if (!(length > 0) || !Number.isFinite(length))
14
+ fail("Contours must have distinct finite vertices.");
15
+ return [dx / length, dy / length];
16
+ });
17
+ const miters = edges.map((edge, index) => {
18
+ const previous = edges[(index + edges.length - 1) % edges.length];
19
+ const turn = previous[0] * edge[1] - previous[1] * edge[0];
20
+ if (!(turn > 1e-12))
21
+ fail("Entry and end treatments require a strictly convex counterclockwise contour without collinear vertices.");
22
+ const denominator = 1 + previous[0] * edge[0] + previous[1] * edge[1];
23
+ return [(-previous[1] - edge[1]) / denominator, (previous[0] + edge[0]) / denominator];
24
+ });
25
+ return {
26
+ magnification: miters.reduce((maximum, [x, y]) => Math.max(maximum, Math.hypot(x, y)), 1),
27
+ offset(inset) {
28
+ const result = points.map(([x, y], index) => [
29
+ x + miters[index][0] * inset,
30
+ y + miters[index][1] * inset,
31
+ ]);
32
+ for (let index = 0; index < result.length; index++) {
33
+ const point = result[index], next = result[(index + 1) % result.length], edge = edges[index];
34
+ if (!point.every(Number.isFinite) ||
35
+ !((next[0] - point[0]) * edge[0] + (next[1] - point[1]) * edge[1] > 0))
36
+ fail("Treatment offset collapses or reverses a contour edge.");
37
+ }
38
+ return result;
39
+ },
40
+ };
41
+ }
@@ -1,6 +1,7 @@
1
1
  /** Pure geometry foundations without host initialization. @packageDocumentation */
2
2
  export { bounds2, bounds3, } from "./bounds-value.js";
3
- export { boundsFromSize, boundsSize, boundsCenter, containsBounds, fitBounds, layoutRow, } from "./bounds.js";
3
+ export { boundsSize, boundsCenter, fitBounds, layoutRow, } from "./bounds.js";
4
+ export { resolveCircularSampling, } from "./circular-sampling.js";
4
5
  export { fitTextLayout } from "./text-fitting.js";
5
6
  export { gridPatternTransforms, linearPatternTransforms, radialPatternTransforms, pathPatternTransforms, } from "./patterns.js";
6
7
  export { validateSolidMesh } from "./mesh/mesh-solid.js";
@@ -1,5 +1,5 @@
1
1
  // A versioned realm protocol lets separately bundled authoring values cross the host boundary.
2
- const immutableMath = Symbol.for("@metamesh/modeling/immutable-math/8");
2
+ const immutableMath = Symbol.for("@metamesh/modeling/immutable-math/9");
3
3
  /**
4
4
  * Brands and freezes only this constructor's prototype. Pure-annotated callers let bundlers
5
5
  * discard unused classes without dropping initialization for classes that remain reachable.
@@ -1,6 +1,5 @@
1
+ import { resolveCircularSampling } from "../circular-sampling.js";
1
2
  import { GeometryError } from "../errors.js";
2
- import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
3
- import { assertPrimitiveOptions } from "../primitive-resolvers.js";
4
3
  import { requireFiniteProfileValues, requireProfileVertexCount } from "./validation.js";
5
4
  export { rectangleContour } from "./rectangle.js";
6
5
  /**
@@ -13,30 +12,11 @@ export { rectangleContour } from "./rectangle.js";
13
12
  */
14
13
  export const circleContour = (options) => {
15
14
  const operation = "circleContour";
16
- assertPrimitiveOptions(options, operation);
17
- if ((options.radius === undefined) === (options.diameter === undefined)) {
18
- throw new GeometryError("INVALID_ARGUMENT", "Specify exactly one radius or diameter.", {
19
- operation,
20
- });
21
- }
22
- const radius = options.radius ?? options.diameter / 2;
23
- requireFiniteProfileValues([radius], operation);
24
- if (!(radius > 0)) {
25
- throw new GeometryError("INVALID_ARGUMENT", "Circle radius must be positive.", { operation });
26
- }
27
- const segments = resolveCircularPrimitiveSegments(radius, options, operation);
15
+ const { segments, vertexRadius } = resolveCircularSampling(options);
28
16
  requireProfileVertexCount(segments, 3, operation, options.limits);
29
- const sizing = options.sizing ?? "vertex";
30
- if (sizing !== "vertex" && sizing !== "face") {
31
- throw new GeometryError("INVALID_ARGUMENT", "Circle sizing must be vertex or face.", {
32
- operation,
33
- });
34
- }
35
- const sampledRadius = sizing === "face" ? radius / Math.cos(Math.PI / segments) : radius;
36
- requireFiniteProfileValues([sampledRadius], operation);
37
17
  return Object.freeze(Array.from({ length: segments }, (_, index) => {
38
18
  const angle = (Math.PI * 2 * index) / segments;
39
- return Object.freeze([sampledRadius * Math.cos(angle), sampledRadius * Math.sin(angle)]);
19
+ return Object.freeze([vertexRadius * Math.cos(angle), vertexRadius * Math.sin(angle)]);
40
20
  }));
41
21
  };
42
22
  /**
@@ -1,3 +1,4 @@
1
+ import { invalid } from "./errors.js";
1
2
  export function multiplyMatrices(left, right) {
2
3
  return [
3
4
  left[0] * right[0] + left[2] * right[1],
@@ -14,3 +15,23 @@ export function transformPoint(matrix, point) {
14
15
  matrix[1] * point[0] + matrix[3] * point[1] + matrix[5],
15
16
  ];
16
17
  }
18
+ /** Inverts an affine map after checking relative linear conditioning, independent of unit scale. */
19
+ export function inverseMatrix(matrix, operation) {
20
+ const scale = Math.max(...matrix.slice(0, 4).map(Math.abs));
21
+ const [a, b, c, d] = matrix.slice(0, 4).map((value) => value / scale);
22
+ const determinant = a * d - b * c;
23
+ if (!Number.isFinite(determinant) || Math.abs(determinant) <= 1e-15)
24
+ invalid(operation, "SVG geometry transforms must be non-singular.");
25
+ const divisor = determinant * scale;
26
+ const result = [
27
+ d / divisor,
28
+ -b / divisor,
29
+ -c / divisor,
30
+ a / divisor,
31
+ (c * matrix[5] - d * matrix[4]) / divisor,
32
+ (b * matrix[4] - a * matrix[5]) / divisor,
33
+ ];
34
+ if (!result.every(Number.isFinite))
35
+ invalid(operation, "SVG inverse transform must be finite.");
36
+ return result;
37
+ }
@@ -1,16 +1,20 @@
1
1
  import { SaxesParser } from "saxes";
2
+ import { SVGPathData } from "svg-pathdata";
3
+ import { bounds2 } from "./bounds-value.js";
4
+ import { fitBounds } from "./bounds.js";
2
5
  import { GeometryError } from "./errors.js";
3
6
  import { regionArea, signedContourArea } from "./regions.js";
4
7
  import { resolveCircularSegments, resolveGeometryResolution, } from "./resolution.js";
5
8
  import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
6
9
  import { strokePathMultiPolygon } from "./stroke-path.js";
7
10
  import { createBoundedSvgClipping } from "./svg/fill.js";
8
- import { multiplyMatrices as multiply, transformPoint } from "./svg/matrix.js";
11
+ import { inverseMatrix, multiplyMatrices as multiply, transformPoint } from "./svg/matrix.js";
9
12
  import { flattenSvgSubpaths, SvgVertexBudget } from "./svg/path.js";
10
13
  const MAX_SVG_BYTES = 256 * 1024;
11
14
  const MAX_SVG_ELEMENTS = 500;
12
15
  const MAX_SVG_NESTING_DEPTH = 64;
13
16
  const MAX_SVG_NODES = 2_000;
17
+ const MAX_SVG_FIT_PASSES = 8;
14
18
  const SHORT_EDGE_LENGTH_MM = 0.01;
15
19
  const TINY_ISLAND_AREA_MM2 = 0.01;
16
20
  const SUPPORTED_TAGS = new Set([
@@ -79,6 +83,14 @@ function complexityFail(message, details) {
79
83
  details,
80
84
  });
81
85
  }
86
+ function svgResolution(options) {
87
+ return resolveGeometryResolution({
88
+ ...options.resolution,
89
+ ...(options.circularSegments === undefined
90
+ ? {}
91
+ : { circularSegments: options.circularSegments }),
92
+ }, options.limits);
93
+ }
82
94
  function finite(value, fallback) {
83
95
  if (value === undefined || value.trim() === "") {
84
96
  if (fallback !== undefined)
@@ -301,31 +313,28 @@ function parsePoints(value) {
301
313
  points.push([numbers[index] ?? 0, numbers[index + 1] ?? 0]);
302
314
  return points;
303
315
  }
304
- function inverseMatrix(matrix) {
305
- const determinant = matrix[0] * matrix[3] - matrix[1] * matrix[2];
306
- if (!Number.isFinite(determinant) || Math.abs(determinant) <= 1e-15) {
307
- return fail("SVG geometry transforms must be non-singular.");
308
- }
309
- return [
310
- matrix[3] / determinant,
311
- -matrix[1] / determinant,
312
- -matrix[2] / determinant,
313
- matrix[0] / determinant,
314
- (matrix[2] * matrix[5] - matrix[3] * matrix[4]) / determinant,
315
- (matrix[1] * matrix[4] - matrix[0] * matrix[5]) / determinant,
316
- ];
317
- }
318
316
  function maximumLinearScale(matrix) {
319
317
  const trace = matrix[0] * matrix[0] + matrix[1] * matrix[1] + matrix[2] * matrix[2] + matrix[3] * matrix[3];
320
318
  const determinant = matrix[0] * matrix[3] - matrix[1] * matrix[2];
321
319
  return Math.sqrt(Math.max(0, (trace + Math.sqrt(Math.max(0, trace * trace - 4 * determinant * determinant))) / 2));
322
320
  }
323
- function adaptivePathSubpaths(d, transform, resolution, budget) {
321
+ function adaptivePathSubpaths(d, transform, resolution, budget, estimate = false) {
324
322
  if (d.trim() === "")
325
323
  return fail("SVG path data is required.");
326
- const inverse = inverseMatrix(transform);
324
+ const inverse = inverseMatrix(transform, "preflightSvgRegion");
327
325
  try {
328
- return flattenSvgSubpaths(d, transform, resolution, budget, "preflightSvgRegion").map(({ closed, points }) => ({
326
+ let selected = resolution;
327
+ if (estimate) {
328
+ const bounds = new SVGPathData(d).getBounds();
329
+ const estimateError = (Math.hypot(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY) *
330
+ maximumLinearScale(transform)) /
331
+ 16;
332
+ selected = {
333
+ ...resolution,
334
+ maxChordError: estimateError || resolution.maxChordError,
335
+ };
336
+ }
337
+ return flattenSvgSubpaths(d, transform, selected, budget, "preflightSvgRegion").map(({ closed, points }) => ({
329
338
  closed,
330
339
  points: points.map((point) => transformPoint(inverse, point)),
331
340
  }));
@@ -336,7 +345,7 @@ function adaptivePathSubpaths(d, transform, resolution, budget) {
336
345
  return fail(error instanceof Error ? `Invalid SVG path: ${error.message}` : "Invalid SVG path data.");
337
346
  }
338
347
  }
339
- function elementSubpaths(tag, values, transform, resolution, budget) {
348
+ function elementSubpaths(tag, values, transform, resolution, budget, estimate = false) {
340
349
  switch (tag) {
341
350
  case "rect": {
342
351
  const x = finite(values.x, 0);
@@ -348,11 +357,11 @@ function elementSubpaths(tag, values, transform, resolution, budget) {
348
357
  const rx = values.rx === undefined ? finite(values.ry, 0) : finite(values.rx, 0);
349
358
  const ry = values.ry === undefined ? rx : finite(values.ry, 0);
350
359
  if (rx === 0 || ry === 0) {
351
- return adaptivePathSubpaths(`M${x} ${y}H${x + width}V${y + height}H${x}Z`, transform, resolution, budget);
360
+ return adaptivePathSubpaths(`M${x} ${y}H${x + width}V${y + height}H${x}Z`, transform, resolution, budget, estimate);
352
361
  }
353
362
  const radiusX = Math.min(Math.max(0, rx), width / 2);
354
363
  const radiusY = Math.min(Math.max(0, ry), height / 2);
355
- return adaptivePathSubpaths(`M${x + radiusX} ${y}H${x + width - radiusX}A${radiusX} ${radiusY} 0 0 1 ${x + width} ${y + radiusY}V${y + height - radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + width - radiusX} ${y + height}H${x + radiusX}A${radiusX} ${radiusY} 0 0 1 ${x} ${y + height - radiusY}V${y + radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + radiusX} ${y}Z`, transform, resolution, budget);
364
+ return adaptivePathSubpaths(`M${x + radiusX} ${y}H${x + width - radiusX}A${radiusX} ${radiusY} 0 0 1 ${x + width} ${y + radiusY}V${y + height - radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + width - radiusX} ${y + height}H${x + radiusX}A${radiusX} ${radiusY} 0 0 1 ${x} ${y + height - radiusY}V${y + radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + radiusX} ${y}Z`, transform, resolution, budget, estimate);
356
365
  }
357
366
  case "circle": {
358
367
  const radius = finite(values.r);
@@ -376,17 +385,17 @@ function elementSubpaths(tag, values, transform, resolution, budget) {
376
385
  ];
377
386
  }
378
387
  case "line":
379
- return adaptivePathSubpaths(`M${finite(values.x1, 0)} ${finite(values.y1, 0)}L${finite(values.x2, 0)} ${finite(values.y2, 0)}`, transform, resolution, budget);
388
+ return adaptivePathSubpaths(`M${finite(values.x1, 0)} ${finite(values.y1, 0)}L${finite(values.x2, 0)} ${finite(values.y2, 0)}`, transform, resolution, budget, estimate);
380
389
  case "polyline": {
381
390
  const points = parsePoints(values.points);
382
- return adaptivePathSubpaths(points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join(""), transform, resolution, budget);
391
+ return adaptivePathSubpaths(points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join(""), transform, resolution, budget, estimate);
383
392
  }
384
393
  case "polygon": {
385
394
  const points = parsePoints(values.points);
386
- return adaptivePathSubpaths(`${points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join("")}Z`, transform, resolution, budget);
395
+ return adaptivePathSubpaths(`${points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join("")}Z`, transform, resolution, budget, estimate);
387
396
  }
388
397
  case "path":
389
- return adaptivePathSubpaths(values.d ?? "", transform, resolution, budget);
398
+ return adaptivePathSubpaths(values.d ?? "", transform, resolution, budget, estimate);
390
399
  default:
391
400
  return [];
392
401
  }
@@ -479,7 +488,7 @@ function measureSvgRegion(region) {
479
488
  * @returns The normalized sampled region plus bounded review metrics and repairs.
480
489
  * @throws {@link GeometryError} When XML, supported-feature, geometry, or complexity checks fail.
481
490
  */
482
- function createSvgRegionPreflight(svg, options = {}) {
491
+ function createSvgRegionPreflight(svg, options = {}, estimate = false) {
483
492
  const bytes = new TextEncoder().encode(svg).byteLength;
484
493
  if (bytes > MAX_SVG_BYTES)
485
494
  return fail("SVG geometry must be 256 KiB or smaller.");
@@ -488,15 +497,17 @@ function createSvgRegionPreflight(svg, options = {}) {
488
497
  return fail('SVG origin must be either "center" or "document".');
489
498
  }
490
499
  const limits = resolveGeometrySamplingLimits(options.limits);
491
- const resolution = resolveGeometryResolution({
492
- ...options.resolution,
493
- ...(options.circularSegments === undefined
494
- ? {}
495
- : { circularSegments: options.circularSegments }),
496
- }, limits);
500
+ const resolution = { ...svgResolution(options) };
501
+ // The first fitted pass estimates size using bounded, scale-relative samples. Resolving
502
+ // source curves at the final tolerance first would reject large documents before shrinking.
503
+ if (estimate) {
504
+ resolution.circularSegments ??= resolution.minSegments;
505
+ delete resolution.maxSegmentLength;
506
+ }
497
507
  const { assertExpandedVertexCount, boundedMultiPolygon, fillGeometry, multiPolygonVertexCount, regionFromMultiPolygon, unionAll, } = createBoundedSvgClipping(limits.maxProfilePoints);
498
508
  const stack = [];
499
509
  const geometry = [];
510
+ const estimateGeometry = [];
500
511
  let elementCount = 0;
501
512
  let emptyElementCount = 0;
502
513
  let expandedGeometryVertices = 0;
@@ -504,6 +515,7 @@ function createSvgRegionPreflight(svg, options = {}) {
504
515
  let invisibleElementCount = 0;
505
516
  let nodeCount = 0;
506
517
  let rootSeen = false;
518
+ let coordinateScale = 1;
507
519
  let strokeConstructionVertices = 0;
508
520
  const budget = new SvgVertexBudget(limits);
509
521
  const appendGeometry = (target, value, stage) => {
@@ -565,6 +577,13 @@ function createSvgRegionPreflight(svg, options = {}) {
565
577
  const width = lengthMm(values.width, viewWidth);
566
578
  const height = lengthMm(values.height, viewHeight);
567
579
  transform = multiply(canvasTransform(values, width, height, box, origin), parseTransform(values.transform));
580
+ if (options.fit !== undefined) {
581
+ // Fitted artwork has no meaningful source-unit topology tolerance. Keep sampling,
582
+ // stroking and clipping near a unit viewport, then compose this physical-unit scale
583
+ // into the final fit. Unfitted documents retain their millimetre coordinates.
584
+ coordinateScale = 1 / Math.max(width, height);
585
+ transform = multiply([coordinateScale, 0, 0, coordinateScale, 0, 0], transform);
586
+ }
568
587
  }
569
588
  else if (parent === undefined) {
570
589
  return fail("The SVG root element is missing.");
@@ -573,13 +592,17 @@ function createSvgRegionPreflight(svg, options = {}) {
573
592
  elementCount += 1;
574
593
  if (elementCount > MAX_SVG_ELEMENTS)
575
594
  return fail(`SVG geometry may contain at most ${MAX_SVG_ELEMENTS} elements.`);
576
- const localSubpaths = elementSubpaths(tag, values, transform, resolution, budget);
595
+ const localSubpaths = elementSubpaths(tag, values, transform, resolution, budget, estimate);
577
596
  const subpaths = localSubpaths.map((subpath) => ({
578
597
  ...subpath,
579
598
  points: subpath.points.map((point) => transformPoint(transform, point)),
580
599
  }));
581
600
  const paintedFill = isPainted(paint.fill, paint.fillOpacity);
582
601
  const paintedStroke = isPainted(paint.stroke, paint.strokeOpacity) && paint.strokeWidth > 0;
602
+ if (estimate && (paintedFill || paintedStroke)) {
603
+ for (const { points } of subpaths)
604
+ estimateGeometry.push({ outer: points, holes: [] });
605
+ }
583
606
  const elementGeometry = [];
584
607
  if (!paintedFill && !paintedStroke)
585
608
  invisibleElementCount += 1;
@@ -624,31 +647,38 @@ function createSvgRegionPreflight(svg, options = {}) {
624
647
  assertExpandedVertexCount(region.reduce((total, polygon) => total +
625
648
  polygon.outer.length +
626
649
  polygon.holes.reduce((holeTotal, hole) => holeTotal + hole.length, 0), 0), "normalized region");
627
- return Object.freeze({
628
- geometry: measureSvgRegion(region),
629
- region,
630
- repairs: Object.freeze({
631
- emptyElementCount,
632
- implicitFilledClosureCount,
633
- invisibleElementCount,
634
- removedDuplicateVertexCount: budget.removedDuplicateCount,
635
- removedSeamVertexCount: budget.removedSeamCount,
636
- }),
637
- source: Object.freeze({
638
- byteCount: bytes,
639
- elementCount,
640
- emittedVertexCount: budget.emittedCount,
641
- parsedVertexCount: budget.parsedCount,
650
+ return [
651
+ Object.freeze({
652
+ geometry: measureSvgRegion(region),
653
+ region,
654
+ repairs: Object.freeze({
655
+ emptyElementCount,
656
+ implicitFilledClosureCount,
657
+ invisibleElementCount,
658
+ removedDuplicateVertexCount: budget.removedDuplicateCount,
659
+ removedSeamVertexCount: budget.removedSeamCount,
660
+ }),
661
+ source: Object.freeze({
662
+ byteCount: bytes,
663
+ elementCount,
664
+ emittedVertexCount: budget.emittedCount,
665
+ parsedVertexCount: budget.parsedCount,
666
+ }),
642
667
  }),
643
- });
668
+ coordinateScale,
669
+ estimate && region.length === 0 ? measureSvgRegion(estimateGeometry).bounds : null,
670
+ ];
644
671
  }
645
672
  /**
646
673
  * Parses and validates bounded SVG input, constructing its normalized sampled region and diagnostics.
647
674
  *
648
675
  * This pure operation performs curve flattening, fill and stroke construction, and polygon union;
649
676
  * it needs no browser or engine. Geometry counts measure the returned region at the selected
650
- * resolution, rather than predicting later mesh allocation. The region may be empty; tiny-island
651
- * and short-edge indicators do not establish manufacturability or later solid validity.
677
+ * resolution, rather than predicting later mesh allocation. With `fit`, painted bounds are
678
+ * uniformly centered inside the target and adaptive sampling remains in final millimetres.
679
+ * Refinement runs at most eight bounded import passes; exact circular counts retain precedence.
680
+ * Without `fit` the region may be empty. Tiny-island and short-edge indicators do not establish
681
+ * manufacturability or later solid validity.
652
682
  *
653
683
  * @param svg - Complete SVG XML source, limited to 256 KiB of UTF-8.
654
684
  * @param options - Physical flattening and viewport-origin controls.
@@ -656,5 +686,57 @@ function createSvgRegionPreflight(svg, options = {}) {
656
686
  * @throws {@link GeometryError} When XML, supported-feature, geometry, or complexity checks fail.
657
687
  */
658
688
  export function preflightSvgRegion(svg, options = {}) {
659
- return createSvgRegionPreflight(svg, options);
689
+ if (options.fit === undefined)
690
+ return createSvgRegionPreflight(svg, options)[0];
691
+ // Capture mutable caller data once; all refinement passes fit to the same finite target.
692
+ const target = bounds2(options.fit);
693
+ const resolution = svgResolution(options);
694
+ let samplingScale = 1;
695
+ for (let pass = 0; pass < MAX_SVG_FIT_PASSES; pass++) {
696
+ // Each pass retains the importer's source, recursion, sampling and clipping ceilings.
697
+ // The fixed pass cap also bounds aggregate work without consuming the final profile's
698
+ // allocation allowance on a discarded scale estimate.
699
+ const [imported, coordinateScale, estimateBounds] = createSvgRegionPreflight(svg, {
700
+ ...options,
701
+ resolution: {
702
+ ...resolution,
703
+ maxChordError: resolution.maxChordError / samplingScale,
704
+ ...(resolution.maxSegmentLength === undefined
705
+ ? {}
706
+ : { maxSegmentLength: resolution.maxSegmentLength / samplingScale }),
707
+ },
708
+ }, pass === 0);
709
+ // Coarse estimation can collapse a thin closed curve to a segment. Its sampled span
710
+ // still determines a first scale; only the verified pass may declare painted artwork empty.
711
+ const sourceBounds = imported.geometry.bounds ?? estimateBounds;
712
+ if (sourceBounds === null)
713
+ return fail("Cannot fit empty SVG artwork.");
714
+ const fit = fitBounds(sourceBounds, target);
715
+ if (pass > 0 && fit.scale <= samplingScale) {
716
+ const placement = [fit.scale, 0, 0, fit.scale, ...fit.position];
717
+ const transform = (loop) => Object.freeze(loop.map((point) => Object.freeze(transformPoint(placement, point))));
718
+ // Positive uniform fitting preserves winding and topology. Re-normalizing here would
719
+ // erase small fitted details. fitBounds validates transformed extrema, bounding every
720
+ // transformed point without repeating finite checks for each coordinate.
721
+ const region = Object.freeze(imported.region.map(({ outer, holes }) => Object.freeze({ outer: transform(outer), holes: Object.freeze(holes.map(transform)) })));
722
+ const geometry = measureSvgRegion(region);
723
+ if (!Number.isFinite(geometry.area))
724
+ return fail("Fitted SVG area is not finite.");
725
+ const scale = fit.scale * coordinateScale;
726
+ if (!(scale > 0) || !Number.isFinite(scale))
727
+ return fail("SVG fit scale must be finite and positive.");
728
+ return Object.freeze({
729
+ ...imported,
730
+ fit: Object.freeze({ ...fit, scale }),
731
+ geometry,
732
+ region,
733
+ });
734
+ }
735
+ // One representable relative step avoids retrying solely because a division rounded down.
736
+ // The next pass still verifies the actual fitted scale instead of trusting a safety factor.
737
+ samplingScale = fit.scale * (1 + Number.EPSILON);
738
+ }
739
+ return complexityFail("SVG fit did not converge.", {
740
+ maxFitPasses: MAX_SVG_FIT_PASSES,
741
+ });
660
742
  }
@@ -1,7 +1,7 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
2
  // One protocol key lets locally bundled operation wrappers resolve the host's execution
3
3
  // without depending on package instances, class identity, or initializing a native runtime.
4
- const executionKey = Symbol.for("@metamesh/modeling/execution/8");
4
+ const executionKey = Symbol.for("@metamesh/modeling/execution/9");
5
5
  const bindings = globalThis;
6
6
  /** Internal host binding. Executable callbacks are synchronous and may not nest executions. */
7
7
  export function bindModelContext(context, build) {
@@ -1,7 +1,7 @@
1
1
  import { createSectionHandle, createSolidHandle } from "./shape-handles.js";
2
2
  // One realm protocol lets bundled authoring code declare recipes before a host is initialized.
3
3
  // The payload contains no native handles and the engine remains responsible for realization.
4
- const recipeKey = Symbol.for("@metamesh/modeling/recipe/8");
4
+ const recipeKey = Symbol.for("@metamesh/modeling/recipe/9");
5
5
  /** Reads private recipe metadata without requiring an execution context. */
6
6
  export const geometryRecipe = (value) => Object.getOwnPropertyDescriptor(value, recipeKey)?.value;
7
7
  /** Recognizes only opaque recipe handles issued by this engine. */
@@ -0,0 +1 @@
1
+ export {};
@@ -32,6 +32,27 @@ export function box(options) {
32
32
  export function cylinder(options) {
33
33
  return invoke("cylinder", [options]);
34
34
  }
35
+ /**
36
+ * Declares a +Z hole or blind-pocket cutter with explicit end overrun in millimetres.
37
+ * Choose exactly one circular diameter or existing Section. A 45-degree entry chamfer
38
+ * supports one strictly convex contour without holes; plain profiles may have any topology.
39
+ * Circular entries retain nominal frustum radii; profile entries offset the supplied polygon edges.
40
+ * Circular head recesses are mutually exclusive with entryChamfer. Both overrun ends default
41
+ * to zero, so the nominal bottom remains at Z=0 and blind pocket floors are preserved.
42
+ * Existing Section samples are authoritative; limits and unspecified circular sampling belong
43
+ * to the evaluating host. Compiled packages require runtime major 9.
44
+ *
45
+ * @example A blind hex pocket with an open top
46
+ * ```ts
47
+ * holeCutter({
48
+ * profile: regularPolygon({ sides: 6, radius: 3.5, sizing: "face", rotation: 30 }),
49
+ * height: 12, entryChamfer: 0.5, overrun: { top: 0.05 },
50
+ * });
51
+ * ```
52
+ */
53
+ export function holeCutter(options) {
54
+ return invoke("holeCutter", [options]);
55
+ }
35
56
  /**
36
57
  * Hollow +Z tube.
37
58
  *
@@ -415,10 +436,10 @@ export function threadRidge(options) {
415
436
  * otherwise disconnected intervals. Returns portable recipes without initializing the engine.
416
437
  * Unspecified resolution inherits the evaluating session. Axis direction is +X with +Z up.
417
438
  *
418
- * Barrel end chamfers affect outer rims only; webs have square edges. Consumers own plates, screw holes,
439
+ * Each half's `chamfer` bevels its barrel outer rims and all web edges. Consumers own plates, screw holes,
419
440
  * pin retention, fit policy, and part placement. Added mounting material must preserve the bores.
420
441
  * No opening range or collision freedom is implied for arbitrary caller attachments.
421
- * Compiled Generator packages using this operation require runtime 8.0.0 or newer in major 8.
442
+ * Compiled Generator packages using this operation require runtime 9.0.0 or newer in major 9.
422
443
  *
423
444
  * @example Integral-pin hinge with two mounting webs
424
445
  * ```ts
@@ -10,6 +10,7 @@ const operationBehaviors = {
10
10
  withResolution: "resolution",
11
11
  box: "solid",
12
12
  cylinder: "solid",
13
+ holeCutter: "solid",
13
14
  tube: "solid",
14
15
  sphere: "solid",
15
16
  torus: "solid",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamesh/modeling",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Scoped solid modeling and pure geometry foundations for Node and browsers.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -1,24 +0,0 @@
1
- # BoundsFromSizeOptions
2
-
3
- Placement of bounds constructed from nonnegative millimetre dimensions.
4
-
5
- ## Properties
6
-
7
- ### center?
8
-
9
-
10
-
11
- `readonly` `optional` **center?**: `boolean`
12
-
13
-
14
-
15
- Center on the origin; false starts at the origin. Defaults to true.
16
-
17
-
18
- ## Guides
19
-
20
- - [Measure and compare bounds](../../guides/concepts.md#measure-and-compare-bounds)
21
- - [Text from a Font parameter](../../guides/recipes.md#text-from-a-font-parameter)
22
- - [Solid inspection](../../guides/recipes.md#solid-inspection)
23
-
24
- Package: `@metamesh/modeling@0.16.0`.