@metamesh/modeling 0.17.0 → 0.19.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 (832) hide show
  1. package/CHANGELOG.md +186 -0
  2. package/README.md +147 -157
  3. package/dist/api/engine.d.ts +106 -83
  4. package/dist/api/export-3mf.d.ts +2 -0
  5. package/dist/api/export-glb.d.ts +2 -0
  6. package/dist/api/export-stl.d.ts +2 -0
  7. package/dist/api/export.d.ts +160 -0
  8. package/dist/api/geometry.d.ts +250 -461
  9. package/dist/api/index.d.ts +470 -445
  10. package/dist/api/mesh.d.ts +489 -0
  11. package/dist/api/text.d.ts +1 -1
  12. package/dist/docs/guides/concepts.md +32 -495
  13. package/dist/docs/guides/fonts.md +14 -13
  14. package/dist/docs/guides/fundamentals.md +30 -29
  15. package/dist/docs/guides/generation.md +84 -64
  16. package/dist/docs/guides/geometry-values.md +193 -0
  17. package/dist/docs/guides/hosting.md +147 -48
  18. package/dist/docs/guides/profiles-and-extrusion.md +252 -0
  19. package/dist/docs/guides/recipes.md +33 -769
  20. package/dist/docs/guides/resolution-and-inspection.md +133 -0
  21. package/dist/docs/guides/solid-joins.md +126 -0
  22. package/dist/docs/guides/standalone-model.md +8 -7
  23. package/dist/docs/guides/svg-and-text.md +215 -0
  24. package/dist/docs/guides/sweeps-and-lofts.md +179 -0
  25. package/dist/docs/guides/transforms-and-placement.md +313 -0
  26. package/dist/docs/manifest.json +3224 -4430
  27. package/dist/docs/reference/engine/GenerationOptions.md +12 -5
  28. package/dist/docs/reference/engine/GeometryResource.md +19 -13
  29. package/dist/docs/reference/engine/ModelDependencies.md +9 -3
  30. package/dist/docs/reference/engine/ModelEngine.md +33 -24
  31. package/dist/docs/reference/engine/ModelEngineOptions.md +13 -2
  32. package/dist/docs/reference/engine/ModelPart.md +114 -0
  33. package/dist/docs/reference/engine/ModelResult.md +181 -0
  34. package/dist/docs/reference/engine/ModelRunArguments.md +34 -0
  35. package/dist/docs/reference/engine/ModelRunOptions.md +110 -0
  36. package/dist/docs/reference/engine/ModelSession.md +22 -16
  37. package/dist/docs/reference/engine/SessionOptions.md +21 -10
  38. package/dist/docs/reference/engine/categories/host-lifecycle.md +20 -15
  39. package/dist/docs/reference/engine/checkModel.md +49 -0
  40. package/dist/docs/reference/engine/createModelEngine.md +11 -13
  41. package/dist/docs/reference/engine/defaultModelingLimits.md +15 -2
  42. package/dist/docs/reference/engine/modelingWasmUrl.md +7 -1
  43. package/dist/docs/reference/engine.md +8 -15
  44. package/dist/docs/reference/export/Export3mfOptions.md +24 -0
  45. package/dist/docs/reference/export/ExportDiagnostic.md +59 -0
  46. package/dist/docs/reference/export/ExportFormat.md +25 -0
  47. package/dist/docs/reference/export/ExportGeometry.md +39 -0
  48. package/dist/docs/reference/export/ExportGlbOptions.md +118 -0
  49. package/dist/docs/reference/export/ExportLimits.md +83 -0
  50. package/dist/docs/reference/export/ExportMaterial.md +47 -0
  51. package/dist/docs/reference/export/ExportOptions.md +94 -0
  52. package/dist/docs/reference/export/ExportPart.md +88 -0
  53. package/dist/docs/reference/export/ExportReport.md +82 -0
  54. package/dist/docs/reference/export/ExportSink.md +39 -0
  55. package/dist/docs/reference/export/ExportStlOptions.md +24 -0
  56. package/dist/docs/reference/export/ExportedFile.md +110 -0
  57. package/dist/docs/reference/export/categories/mesh-serialization.md +47 -0
  58. package/dist/docs/reference/export/defaultExportLimits.md +20 -0
  59. package/dist/docs/reference/export/export3mf.md +64 -0
  60. package/dist/docs/reference/export/exportGlb.md +68 -0
  61. package/dist/docs/reference/export/exportStl.md +64 -0
  62. package/dist/docs/reference/export/write3mf.md +71 -0
  63. package/dist/docs/reference/export/writeGlb.md +75 -0
  64. package/dist/docs/reference/export/writeStl.md +71 -0
  65. package/dist/docs/reference/export.md +21 -0
  66. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +16 -2
  67. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +7 -1
  68. package/dist/docs/reference/geometry/Anchor3-type.md +13 -3
  69. package/dist/docs/reference/geometry/ArcCurve2.md +8 -2
  70. package/dist/docs/reference/geometry/ArcCurve3.md +8 -2
  71. package/dist/docs/reference/geometry/AttachOptions.md +13 -3
  72. package/dist/docs/reference/geometry/AxisAngleRotation3.md +9 -3
  73. package/dist/docs/reference/geometry/Bevel.md +32 -0
  74. package/dist/docs/reference/geometry/BevelSize.md +28 -0
  75. package/dist/docs/reference/geometry/Bounds2-type.md +18 -4
  76. package/dist/docs/reference/geometry/Bounds2Data.md +22 -4
  77. package/dist/docs/reference/geometry/Bounds2Input.md +18 -4
  78. package/dist/docs/reference/geometry/Bounds2Options.md +61 -11
  79. package/dist/docs/reference/geometry/Bounds3-type.md +18 -4
  80. package/dist/docs/reference/geometry/Bounds3Data.md +18 -4
  81. package/dist/docs/reference/geometry/Bounds3Input.md +18 -4
  82. package/dist/docs/reference/geometry/Bounds3Options.md +61 -11
  83. package/dist/docs/reference/geometry/BoundsFit2.md +10 -4
  84. package/dist/docs/reference/geometry/BoundsFit3.md +10 -4
  85. package/dist/docs/reference/geometry/BoundsFitOptions.md +10 -4
  86. package/dist/docs/reference/geometry/BoxAnchorFace.md +9 -3
  87. package/dist/docs/reference/geometry/BoxAnchorOptions.md +12 -6
  88. package/dist/docs/reference/geometry/BoxEdge.md +11 -1
  89. package/dist/docs/reference/geometry/BoxEdgeSelection.md +11 -1
  90. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +11 -1
  91. package/dist/docs/reference/geometry/BoxOptions.md +13 -3
  92. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +16 -2
  93. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +16 -2
  94. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +11 -1
  95. package/dist/docs/reference/geometry/CircleContourOptions.md +12 -2
  96. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +15 -3
  97. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -1
  98. package/dist/docs/reference/geometry/CircularSampling.md +7 -1
  99. package/dist/docs/reference/geometry/CircularSamplingOptions.md +7 -1
  100. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +8 -2
  101. package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -2
  102. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +8 -2
  103. package/dist/docs/reference/geometry/Contour.md +12 -2
  104. package/dist/docs/reference/geometry/ContourCurve.md +8 -2
  105. package/dist/docs/reference/geometry/ContourPoint.md +8 -2
  106. package/dist/docs/reference/geometry/ContourSegment.md +8 -2
  107. package/dist/docs/reference/geometry/CorrespondingComponent.md +12 -2
  108. package/dist/docs/reference/geometry/CorrespondingContour.md +12 -2
  109. package/dist/docs/reference/geometry/CorrespondingProfile.md +12 -2
  110. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +12 -2
  111. package/dist/docs/reference/geometry/CubicBezierCurve2.md +8 -2
  112. package/dist/docs/reference/geometry/CubicBezierCurve3.md +8 -2
  113. package/dist/docs/reference/geometry/Curve2.md +8 -2
  114. package/dist/docs/reference/geometry/Curve3.md +8 -2
  115. package/dist/docs/reference/geometry/CurveSamplingOptions.md +16 -2
  116. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +16 -2
  117. package/dist/docs/reference/geometry/CylinderAnchorFace.md +9 -3
  118. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +11 -5
  119. package/dist/docs/reference/geometry/CylinderOptions.md +11 -1
  120. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -2
  121. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -2
  122. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +8 -2
  123. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +8 -2
  124. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +8 -2
  125. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +8 -2
  126. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +8 -2
  127. package/dist/docs/reference/geometry/CylindricalGearSpec.md +8 -2
  128. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -1
  129. package/dist/docs/reference/geometry/EdgeTreatment.md +11 -1
  130. package/dist/docs/reference/geometry/EllipseContourOptions.md +14 -4
  131. package/dist/docs/reference/geometry/EndTreatments.md +12 -2
  132. package/dist/docs/reference/{model/ExtrudeOptions.md → geometry/ExtrudeMeshOptions.md} +30 -26
  133. package/dist/docs/reference/geometry/ExtrudeOptions.md +29 -11
  134. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +18 -4
  135. package/dist/docs/reference/geometry/FittedTextLayout.md +8 -2
  136. package/dist/docs/reference/geometry/Frame3.md +16 -2
  137. package/dist/docs/reference/geometry/GeometryError.md +11 -1
  138. package/dist/docs/reference/geometry/GeometryErrorCode.md +11 -1
  139. package/dist/docs/reference/geometry/GeometryErrorContext.md +11 -1
  140. package/dist/docs/reference/geometry/GeometryResolution.md +15 -1
  141. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +16 -2
  142. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +15 -1
  143. package/dist/docs/reference/geometry/GridPatternOptions.md +12 -2
  144. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +12 -2
  145. package/dist/docs/reference/geometry/HeightfieldOptions.md +18 -3
  146. package/dist/docs/reference/geometry/HeightfieldPreflight.md +12 -2
  147. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +9 -3
  148. package/dist/docs/reference/geometry/ImmutableBuffer-type.md +110 -0
  149. package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +57 -0
  150. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +63 -84
  151. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +12 -2
  152. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +8 -2
  153. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +8 -2
  154. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +12 -2
  155. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +12 -2
  156. package/dist/docs/reference/geometry/LineCurve2.md +8 -2
  157. package/dist/docs/reference/geometry/LineCurve3.md +8 -2
  158. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -2
  159. package/dist/docs/reference/geometry/LoftCorrespondence.md +16 -2
  160. package/dist/docs/reference/geometry/LoftMeshStation.md +12 -2
  161. package/dist/docs/reference/geometry/LoftOptions.md +18 -4
  162. package/dist/docs/reference/geometry/LoftPlacement.md +16 -2
  163. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +8 -2
  164. package/dist/docs/reference/geometry/MatchProfilesOptions.md +12 -2
  165. package/dist/docs/reference/geometry/MetricFastenerSize.md +8 -2
  166. package/dist/docs/reference/geometry/MetricFastenerStandard.md +8 -2
  167. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +8 -2
  168. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +8 -2
  169. package/dist/docs/reference/geometry/ModelingLimits.md +19 -1
  170. package/dist/docs/reference/geometry/NumericArray.md +28 -0
  171. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +8 -2
  172. package/dist/docs/reference/geometry/Path2-type.md +16 -2
  173. package/dist/docs/reference/geometry/Path2Data.md +16 -2
  174. package/dist/docs/reference/geometry/Path2Input.md +16 -2
  175. package/dist/docs/reference/geometry/Path3-type.md +16 -2
  176. package/dist/docs/reference/geometry/Path3Data.md +16 -2
  177. package/dist/docs/reference/geometry/Path3Input.md +16 -2
  178. package/dist/docs/reference/geometry/PathFrame.md +8 -2
  179. package/dist/docs/reference/geometry/PathLocation.md +16 -2
  180. package/dist/docs/reference/geometry/PathNormalGuide.md +16 -2
  181. package/dist/docs/reference/geometry/PathOptions.md +12 -2
  182. package/dist/docs/reference/geometry/PathPatternOptions.md +12 -2
  183. package/dist/docs/reference/geometry/PathPlacement.md +8 -2
  184. package/dist/docs/reference/geometry/PathResamplingOptions.md +16 -2
  185. package/dist/docs/reference/geometry/Pivot2Options.md +17 -3
  186. package/dist/docs/reference/geometry/Pivot3Options.md +17 -3
  187. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +12 -2
  188. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +12 -2
  189. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +12 -2
  190. package/dist/docs/reference/geometry/PlanarPatchQuality.md +12 -2
  191. package/dist/docs/reference/geometry/PolygonData.md +12 -2
  192. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -2
  193. package/dist/docs/reference/geometry/PrimitiveAttachment.md +11 -3
  194. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +11 -1
  195. package/dist/docs/reference/geometry/PrintableThreadFit.md +12 -2
  196. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +12 -2
  197. package/dist/docs/reference/geometry/Profile.md +8 -2
  198. package/dist/docs/reference/geometry/ProfileComponent2.md +12 -2
  199. package/dist/docs/reference/geometry/ProfileContour2.md +12 -2
  200. package/dist/docs/reference/geometry/ProfileSpan2.md +12 -2
  201. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +11 -1
  202. package/dist/docs/reference/geometry/RackPitchDimensions.md +8 -2
  203. package/dist/docs/reference/geometry/RackPitchSpec.md +8 -2
  204. package/dist/docs/reference/geometry/RadialPatternOptions.md +12 -2
  205. package/dist/docs/reference/geometry/RadialSizing.md +11 -1
  206. package/dist/docs/reference/geometry/RadialSizingOptions.md +11 -1
  207. package/dist/docs/reference/geometry/RectangleContourOptions.md +14 -4
  208. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +12 -2
  209. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +12 -2
  210. package/dist/docs/reference/geometry/RectangleProfileOptions.md +10 -4
  211. package/dist/docs/reference/geometry/RegionData.md +12 -2
  212. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +8 -2
  213. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +7 -1
  214. package/dist/docs/reference/geometry/RevolveOptions.md +17 -3
  215. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +11 -1
  216. package/dist/docs/reference/geometry/RowLayoutOptions.md +10 -4
  217. package/dist/docs/reference/geometry/SampleContourOptions.md +8 -2
  218. package/dist/docs/reference/geometry/SampleHelixOptions.md +8 -2
  219. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +8 -2
  220. package/dist/docs/reference/geometry/SampledCurve2.md +8 -2
  221. package/dist/docs/reference/geometry/SampledCurve3.md +8 -2
  222. package/dist/docs/reference/geometry/SampledThreadHelices.md +8 -2
  223. package/dist/docs/reference/geometry/SideProfileCurve.md +8 -2
  224. package/dist/docs/reference/geometry/SideProfilePoint.md +8 -2
  225. package/dist/docs/reference/geometry/SideProfileSegment.md +8 -2
  226. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +11 -1
  227. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +12 -2
  228. package/dist/docs/reference/geometry/SphereOptions.md +11 -1
  229. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +16 -2
  230. package/dist/docs/reference/geometry/StarContourOptions.md +84 -0
  231. package/dist/docs/reference/geometry/StrokeCap.md +12 -2
  232. package/dist/docs/reference/geometry/StrokeJoin.md +12 -2
  233. package/dist/docs/reference/geometry/StrokeOptions.md +12 -2
  234. package/dist/docs/reference/geometry/SvgImportOptions.md +8 -2
  235. package/dist/docs/reference/geometry/SvgRegionPreflight.md +8 -2
  236. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +8 -2
  237. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +8 -2
  238. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +8 -2
  239. package/dist/docs/reference/geometry/SweepOptions.md +16 -2
  240. package/dist/docs/reference/geometry/SweepOrientation.md +16 -2
  241. package/dist/docs/reference/geometry/ThreadBevelOptions.md +18 -31
  242. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +8 -2
  243. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +8 -2
  244. package/dist/docs/reference/geometry/ThreadEndStyle.md +16 -2
  245. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +16 -2
  246. package/dist/docs/reference/geometry/ThreadHandedness.md +16 -2
  247. package/dist/docs/reference/geometry/ThreadHelixOptions.md +8 -2
  248. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +16 -2
  249. package/dist/docs/reference/geometry/ThreadLeadInShape.md +16 -2
  250. package/dist/docs/reference/geometry/ThreadProfile-type.md +17 -3
  251. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +16 -2
  252. package/dist/docs/reference/geometry/ThreadProfileSpec.md +16 -2
  253. package/dist/docs/reference/geometry/{HelicalThreadRidgeMeshOptions.md → ThreadRidgeOptions.md} +19 -5
  254. package/dist/docs/reference/geometry/ThreadRole.md +8 -2
  255. package/dist/docs/reference/geometry/{HelicalThreadSolidMeshOptions.md → ThreadSolidOptions.md} +29 -66
  256. package/dist/docs/reference/geometry/{HelicalThreadSolidMeshPreflight.md → ThreadSolidPreflight.md} +17 -3
  257. package/dist/docs/reference/geometry/ThreadedNutOptions.md +86 -87
  258. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +29 -7
  259. package/dist/docs/reference/geometry/ThreadedNutShape.md +12 -2
  260. package/dist/docs/reference/geometry/ThreadedRodOptions.md +63 -84
  261. package/dist/docs/reference/geometry/TorusOptions.md +11 -1
  262. package/dist/docs/reference/geometry/Transform2-type.md +17 -3
  263. package/dist/docs/reference/geometry/Transform2Data.md +17 -3
  264. package/dist/docs/reference/geometry/Transform2Input.md +17 -3
  265. package/dist/docs/reference/geometry/Transform3-type.md +17 -3
  266. package/dist/docs/reference/geometry/Transform3Data.md +17 -3
  267. package/dist/docs/reference/geometry/Transform3Input.md +17 -3
  268. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +16 -2
  269. package/dist/docs/reference/geometry/TriangleMesh.md +19 -6
  270. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +25 -5
  271. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +13 -3
  272. package/dist/docs/reference/geometry/TriangleMeshInput.md +29 -0
  273. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +16 -2
  274. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +12 -2
  275. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +12 -2
  276. package/dist/docs/reference/geometry/TriangleMeshSignature.md +14 -4
  277. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +12 -2
  278. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +12 -2
  279. package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +145 -0
  280. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +12 -2
  281. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +16 -2
  282. package/dist/docs/reference/geometry/TubeOptions.md +20 -86
  283. package/dist/docs/reference/geometry/Vector2-type.md +17 -3
  284. package/dist/docs/reference/geometry/Vector2Data.md +21 -3
  285. package/dist/docs/reference/geometry/Vector2Input.md +17 -3
  286. package/dist/docs/reference/geometry/Vector3-type.md +17 -3
  287. package/dist/docs/reference/geometry/Vector3Data.md +17 -3
  288. package/dist/docs/reference/geometry/Vector3Input.md +17 -3
  289. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +12 -2
  290. package/dist/docs/reference/geometry/VectorTextLayout.md +16 -2
  291. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +14 -4
  292. package/dist/docs/reference/geometry/VectorTextMetrics.md +16 -2
  293. package/dist/docs/reference/geometry/VectorTextOptions.md +12 -2
  294. package/dist/docs/reference/geometry/add2.md +9 -3
  295. package/dist/docs/reference/geometry/add3.md +9 -3
  296. package/dist/docs/reference/geometry/anchor3.md +9 -3
  297. package/dist/docs/reference/geometry/anchorFrame3.md +8 -2
  298. package/dist/docs/reference/geometry/applyTransformDirection3.md +9 -3
  299. package/dist/docs/reference/geometry/applyTransformPoint3.md +9 -3
  300. package/dist/docs/reference/geometry/attachmentTransform3.md +9 -3
  301. package/dist/docs/reference/geometry/bounds2.md +18 -8
  302. package/dist/docs/reference/geometry/bounds3.md +18 -8
  303. package/dist/docs/reference/geometry/boundsCenter.md +10 -4
  304. package/dist/docs/reference/geometry/boundsSize.md +10 -4
  305. package/dist/docs/reference/geometry/boxAnchor3.md +11 -5
  306. package/dist/docs/reference/geometry/categories/bounds-layout.md +6 -6
  307. package/dist/docs/reference/geometry/categories/curves-paths.md +3 -3
  308. package/dist/docs/reference/geometry/categories/mechanical.md +9 -11
  309. package/dist/docs/reference/geometry/categories/meshes.md +20 -33
  310. package/dist/docs/reference/geometry/categories/pattern-placement.md +3 -3
  311. package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
  312. package/dist/docs/reference/geometry/categories/profiles-regions.md +6 -5
  313. package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -3
  314. package/dist/docs/reference/geometry/categories/transforms-math.md +5 -4
  315. package/dist/docs/reference/geometry/categories/vector-import.md +4 -4
  316. package/dist/docs/reference/geometry/circleContour.md +8 -2
  317. package/dist/docs/reference/geometry/closeToAxis.md +8 -2
  318. package/dist/docs/reference/geometry/compensateThreadDiameters.md +8 -2
  319. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +8 -2
  320. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +8 -2
  321. package/dist/docs/reference/geometry/composeTransform3.md +9 -3
  322. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +8 -2
  323. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -2
  324. package/dist/docs/reference/geometry/contourContainsPoint.md +8 -2
  325. package/dist/docs/reference/geometry/cross2.md +9 -3
  326. package/dist/docs/reference/geometry/cross3.md +9 -3
  327. package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -4
  328. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +8 -2
  329. package/dist/docs/reference/geometry/distance2.md +9 -3
  330. package/dist/docs/reference/geometry/distance3.md +9 -3
  331. package/dist/docs/reference/geometry/distributeAlongPath.md +8 -2
  332. package/dist/docs/reference/geometry/dot2.md +9 -3
  333. package/dist/docs/reference/geometry/dot3.md +9 -3
  334. package/dist/docs/reference/geometry/ellipseContour.md +8 -2
  335. package/dist/docs/reference/geometry/eulerTransform3.md +9 -3
  336. package/dist/docs/reference/geometry/fitBounds.md +10 -4
  337. package/dist/docs/reference/geometry/fitTextLayout.md +8 -2
  338. package/dist/docs/reference/geometry/frameTransform3.md +9 -3
  339. package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +8 -2
  340. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +8 -2
  341. package/dist/docs/reference/geometry/gridPatternTransforms.md +8 -2
  342. package/dist/docs/reference/{model → geometry}/immutableBuffer.md +13 -2
  343. package/dist/docs/reference/geometry/inverseTransform3.md +9 -3
  344. package/dist/docs/reference/geometry/isGeometryError.md +11 -1
  345. package/dist/docs/reference/geometry/layoutRow.md +10 -4
  346. package/dist/docs/reference/geometry/length2.md +9 -3
  347. package/dist/docs/reference/geometry/length3.md +9 -3
  348. package/dist/docs/reference/geometry/lerp2.md +9 -3
  349. package/dist/docs/reference/geometry/lerp3.md +9 -3
  350. package/dist/docs/reference/geometry/linearPatternTransforms.md +8 -2
  351. package/dist/docs/reference/geometry/matchProfiles.md +8 -2
  352. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +8 -2
  353. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +8 -2
  354. package/dist/docs/reference/geometry/normalize2.md +9 -3
  355. package/dist/docs/reference/geometry/normalize3.md +9 -3
  356. package/dist/docs/reference/geometry/normalizeContour.md +8 -2
  357. package/dist/docs/reference/geometry/normalizePolygon.md +8 -2
  358. package/dist/docs/reference/geometry/normalizeRegion.md +8 -2
  359. package/dist/docs/reference/geometry/path2.md +12 -2
  360. package/dist/docs/reference/geometry/path3.md +12 -2
  361. package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -2
  362. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +25 -26
  363. package/dist/docs/reference/geometry/preflightSvgRegion.md +8 -2
  364. package/dist/docs/reference/geometry/preflightThreadedNut.md +31 -27
  365. package/dist/docs/reference/geometry/preflightThreadedRod.md +25 -26
  366. package/dist/docs/reference/geometry/projectOntoPlane3.md +9 -3
  367. package/dist/docs/reference/geometry/radialPatternTransforms.md +8 -2
  368. package/dist/docs/reference/geometry/rectangleContour.md +17 -6
  369. package/dist/docs/reference/geometry/rectangleProfile.md +9 -3
  370. package/dist/docs/reference/geometry/regionArea.md +8 -2
  371. package/dist/docs/reference/geometry/regionBounds.md +8 -2
  372. package/dist/docs/reference/geometry/regularPolygonContour.md +9 -3
  373. package/dist/docs/reference/geometry/resamplePolyline2.md +8 -2
  374. package/dist/docs/reference/geometry/resamplePolyline3.md +8 -2
  375. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +7 -1
  376. package/dist/docs/reference/geometry/resolveArcSegments.md +7 -1
  377. package/dist/docs/reference/geometry/resolveCircularSampling.md +7 -1
  378. package/dist/docs/reference/geometry/resolveCircularSegments.md +7 -1
  379. package/dist/docs/reference/geometry/resolveCylindricalGear.md +8 -2
  380. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +8 -2
  381. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +8 -2
  382. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +8 -2
  383. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +7 -1
  384. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +8 -2
  385. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +8 -2
  386. package/dist/docs/reference/geometry/resolveRackPitch.md +8 -2
  387. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -2
  388. package/dist/docs/reference/geometry/rotate2.md +9 -3
  389. package/dist/docs/reference/geometry/rotationTransform3.md +9 -3
  390. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -2
  391. package/dist/docs/reference/geometry/sampleContour.md +8 -2
  392. package/dist/docs/reference/geometry/sampleCurve2.md +8 -2
  393. package/dist/docs/reference/geometry/sampleCurve3.md +8 -2
  394. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +8 -2
  395. package/dist/docs/reference/geometry/sampleHelix.md +8 -2
  396. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +8 -2
  397. package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -2
  398. package/dist/docs/reference/geometry/sampleSideProfile.md +8 -2
  399. package/dist/docs/reference/geometry/sampleTextContours.md +8 -2
  400. package/dist/docs/reference/geometry/sampleThreadHelices.md +8 -2
  401. package/dist/docs/reference/geometry/scale2.md +9 -3
  402. package/dist/docs/reference/geometry/scale3.md +9 -3
  403. package/dist/docs/reference/geometry/scaleTransform3.md +9 -3
  404. package/dist/docs/reference/geometry/signedContourArea.md +8 -2
  405. package/dist/docs/reference/geometry/starContour.md +24 -16
  406. package/dist/docs/reference/geometry/strokeRegionData.md +8 -2
  407. package/dist/docs/reference/geometry/subtract2.md +9 -3
  408. package/dist/docs/reference/geometry/subtract3.md +9 -3
  409. package/dist/docs/reference/geometry/threadProfile.md +8 -2
  410. package/dist/docs/reference/geometry/transform2.md +13 -3
  411. package/dist/docs/reference/geometry/transform3.md +13 -3
  412. package/dist/docs/reference/geometry/transformDeterminant3.md +9 -3
  413. package/dist/docs/reference/geometry/transformRegionData.md +8 -2
  414. package/dist/docs/reference/geometry/translationTransform3.md +9 -3
  415. package/dist/docs/reference/geometry/triangulateContour.md +8 -2
  416. package/dist/docs/reference/geometry/validateRigidTransform3.md +41 -0
  417. package/dist/docs/reference/geometry/validateTransform3.md +9 -3
  418. package/dist/docs/reference/geometry/vector2.md +13 -3
  419. package/dist/docs/reference/geometry/vector3.md +13 -3
  420. package/dist/docs/reference/geometry.md +10 -10
  421. package/dist/docs/reference/mesh/MeshRenderOptions.md +28 -0
  422. package/dist/docs/reference/mesh/RenderMesh.md +68 -0
  423. package/dist/docs/reference/mesh/analyze.md +102 -0
  424. package/dist/docs/reference/mesh/analyzeQuality.md +62 -0
  425. package/dist/docs/reference/mesh/bounds.md +45 -0
  426. package/dist/docs/reference/mesh/categories/operations.md +57 -0
  427. package/dist/docs/reference/mesh/centroid.md +45 -0
  428. package/dist/docs/reference/mesh/extrude.md +79 -0
  429. package/dist/docs/reference/mesh/heightfield.md +57 -0
  430. package/dist/docs/reference/mesh/immutable.md +51 -0
  431. package/dist/docs/reference/mesh/join.md +47 -0
  432. package/dist/docs/reference/mesh/loft.md +83 -0
  433. package/dist/docs/reference/mesh/optimizePlanarPatches.md +102 -0
  434. package/dist/docs/reference/mesh/preflightHeightfield.md +48 -0
  435. package/dist/docs/reference/mesh/preflightThreadSolid.md +96 -0
  436. package/dist/docs/reference/mesh/render.md +57 -0
  437. package/dist/docs/reference/mesh/reverse.md +41 -0
  438. package/dist/docs/reference/{geometry/revolveMesh.md → mesh/revolve.md} +23 -17
  439. package/dist/docs/reference/mesh/signature.md +70 -0
  440. package/dist/docs/reference/mesh/sweep.md +92 -0
  441. package/dist/docs/reference/mesh/threadRidge.md +78 -0
  442. package/dist/docs/reference/mesh/threadSolid.md +96 -0
  443. package/dist/docs/reference/mesh/transform.md +53 -0
  444. package/dist/docs/reference/mesh/validate.md +75 -0
  445. package/dist/docs/reference/{geometry/validateSolidMesh.md → mesh/validateSolid.md} +23 -11
  446. package/dist/docs/reference/mesh.md +21 -0
  447. package/dist/docs/reference/model/CircleOptions.md +13 -7
  448. package/dist/docs/reference/model/DiagnosticOptions.md +21 -1
  449. package/dist/docs/reference/model/EllipseOptions.md +13 -7
  450. package/dist/docs/reference/model/GenerateCallback.md +11 -5
  451. package/dist/docs/reference/model/GenerateContext.md +26 -99
  452. package/dist/docs/reference/model/GenerationDiagnostic.md +19 -1
  453. package/dist/docs/reference/model/GenerationError.md +8 -2
  454. package/dist/docs/reference/model/HoleCutterOptions.md +17 -10
  455. package/dist/docs/reference/model/HoleCutterOverrun.md +10 -3
  456. package/dist/docs/reference/model/HoleCutterRecess.md +10 -3
  457. package/dist/docs/reference/model/HullOptions.md +13 -6
  458. package/dist/docs/reference/model/ImmutableValue.md +26 -0
  459. package/dist/docs/reference/model/ImplicitOptions.md +12 -6
  460. package/dist/docs/reference/model/JoinOptions.md +76 -0
  461. package/dist/docs/reference/model/JoinTransition.md +54 -0
  462. package/dist/docs/reference/model/KnuckleHinge-type.md +9 -3
  463. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +7 -1
  464. package/dist/docs/reference/model/KnuckleHingeOptions.md +10 -4
  465. package/dist/docs/reference/model/KnuckleHingeWeb.md +7 -1
  466. package/dist/docs/reference/model/LoftStation.md +16 -9
  467. package/dist/docs/reference/model/Memo.md +54 -0
  468. package/dist/docs/reference/model/ModelProgram.md +8 -2
  469. package/dist/docs/reference/model/PartDeclaration.md +87 -0
  470. package/dist/docs/reference/model/PartGeometry.md +10 -4
  471. package/dist/docs/reference/model/PartOptions.md +16 -22
  472. package/dist/docs/reference/model/PatternSource.md +10 -4
  473. package/dist/docs/reference/model/PlaneOptions.md +11 -4
  474. package/dist/docs/reference/model/PolygonOptions.md +20 -14
  475. package/dist/docs/reference/model/Profile.md +10 -4
  476. package/dist/docs/reference/model/RectangleOptions.md +28 -22
  477. package/dist/docs/reference/model/RegularPolygonOptions.md +13 -7
  478. package/dist/docs/reference/model/Section.md +196 -77
  479. package/dist/docs/reference/model/SectionHullOptions.md +13 -6
  480. package/dist/docs/reference/model/SectionInspection.md +12 -18
  481. package/dist/docs/reference/model/SectionOffsetJoin.md +10 -4
  482. package/dist/docs/reference/model/SectionOffsetOptions.md +12 -6
  483. package/dist/docs/reference/model/Solid.md +339 -54
  484. package/dist/docs/reference/model/SolidInspection.md +12 -18
  485. package/dist/docs/reference/model/SolidSegmentHit.md +14 -4
  486. package/dist/docs/reference/model/StarOptions.md +53 -25
  487. package/dist/docs/reference/model/SvgOrigin.md +10 -4
  488. package/dist/docs/reference/model/SvgPathSectionOptions.md +14 -8
  489. package/dist/docs/reference/model/SvgSectionOptions.md +16 -10
  490. package/dist/docs/reference/model/TextSectionOptions.md +14 -8
  491. package/dist/docs/reference/model/box.md +18 -11
  492. package/dist/docs/reference/model/categories/boolean-operations.md +13 -11
  493. package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -7
  494. package/dist/docs/reference/model/categories/explicit-profiles.md +1 -14
  495. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +11 -23
  496. package/dist/docs/reference/model/categories/generation.md +10 -15
  497. package/dist/docs/reference/model/categories/hinges.md +1 -4
  498. package/dist/docs/reference/model/categories/mesh-inspection.md +14 -9
  499. package/dist/docs/reference/model/categories/primitives.md +8 -24
  500. package/dist/docs/reference/model/categories/sections.md +6 -16
  501. package/dist/docs/reference/model/categories/threads.md +3 -30
  502. package/dist/docs/reference/model/categories/transforms-placement.md +5 -35
  503. package/dist/docs/reference/model/circle.md +10 -4
  504. package/dist/docs/reference/model/cylinder.md +13 -6
  505. package/dist/docs/reference/model/ellipse.md +10 -4
  506. package/dist/docs/reference/model/extrude.md +28 -20
  507. package/dist/docs/reference/model/generate.md +10 -4
  508. package/dist/docs/reference/model/gridPattern.md +15 -9
  509. package/dist/docs/reference/model/heightfield.md +10 -4
  510. package/dist/docs/reference/model/holeCutter.md +21 -4
  511. package/dist/docs/reference/model/hull.md +9 -2
  512. package/dist/docs/reference/model/implicit.md +9 -3
  513. package/dist/docs/reference/model/internalThreadCutter.md +31 -33
  514. package/dist/docs/reference/model/intersect.md +11 -4
  515. package/dist/docs/reference/model/join.md +89 -0
  516. package/dist/docs/reference/model/knuckleHinge.md +8 -2
  517. package/dist/docs/reference/model/linearPattern.md +15 -9
  518. package/dist/docs/reference/model/loft.md +36 -28
  519. package/dist/docs/reference/model/matchProfiles.md +14 -8
  520. package/dist/docs/reference/model/minkowskiSum.md +9 -2
  521. package/dist/docs/reference/model/pathPattern.md +25 -19
  522. package/dist/docs/reference/model/polygon.md +13 -7
  523. package/dist/docs/reference/model/preflightInternalThreadCutter.md +33 -35
  524. package/dist/docs/reference/model/preflightThreadedNut.md +43 -40
  525. package/dist/docs/reference/model/preflightThreadedRod.md +33 -35
  526. package/dist/docs/reference/model/radialPattern.md +15 -9
  527. package/dist/docs/reference/model/rectangle.md +14 -8
  528. package/dist/docs/reference/model/regularPolygon.md +10 -4
  529. package/dist/docs/reference/model/revolve.md +25 -17
  530. package/dist/docs/reference/model/solidFromMesh.md +16 -9
  531. package/dist/docs/reference/model/sphere.md +13 -6
  532. package/dist/docs/reference/model/star.md +17 -11
  533. package/dist/docs/reference/model/stroke.md +21 -15
  534. package/dist/docs/reference/model/svgPathSection.md +12 -6
  535. package/dist/docs/reference/model/svgSection.md +13 -7
  536. package/dist/docs/reference/model/sweep.md +29 -21
  537. package/dist/docs/reference/model/textSection.md +15 -9
  538. package/dist/docs/reference/model/threadRidge.md +21 -15
  539. package/dist/docs/reference/model/threadedNut.md +41 -38
  540. package/dist/docs/reference/model/threadedRod.md +31 -33
  541. package/dist/docs/reference/model/torus.md +20 -13
  542. package/dist/docs/reference/model/tube.md +13 -41
  543. package/dist/docs/reference/model/union.md +11 -4
  544. package/dist/docs/reference/model.md +11 -20
  545. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +8 -2
  546. package/dist/docs/reference/text/VectorFont.md +39 -33
  547. package/dist/docs/reference/text/VectorFontOptions.md +7 -1
  548. package/dist/docs/reference/text/categories/font-preparation.md +3 -15
  549. package/dist/docs/reference/text/prepareVectorFont.md +7 -1
  550. package/dist/docs/reference/text.md +4 -4
  551. package/dist/engine/execution.js +10 -6
  552. package/dist/engine/finalization.js +2 -74
  553. package/dist/engine/index.js +24 -30
  554. package/dist/engine/model-parts.js +8 -0
  555. package/dist/engine/model-summary.js +5 -5
  556. package/dist/engine/native/construction-mesh.js +41 -0
  557. package/dist/engine/native/index.js +1 -1
  558. package/dist/engine/native/material-components.js +5 -54
  559. package/dist/engine/native/mesh-observation.js +55 -0
  560. package/dist/engine/native/operations.js +0 -7
  561. package/dist/engine/native/regions.js +2 -1
  562. package/dist/engine/native/scoped-primitives.js +5 -4
  563. package/dist/engine/native/threads.js +14 -14
  564. package/dist/engine/{construction-operations.js → operations/construction.js} +25 -23
  565. package/dist/engine/{modeling-context.js → operations/context.js} +12 -10
  566. package/dist/engine/{operation-environment.js → operations/environment.js} +2 -2
  567. package/dist/engine/{extrusion-finishing.js → operations/extrusion-finishing.js} +23 -22
  568. package/dist/engine/{hole-cutter-operation.js → operations/hole-cutter.js} +3 -3
  569. package/dist/engine/{inspection-operations.js → operations/inspection.js} +6 -6
  570. package/dist/engine/operations/join-collar-profile.js +120 -0
  571. package/dist/engine/operations/join.js +508 -0
  572. package/dist/engine/{knuckle-hinge-operation.js → operations/knuckle-hinge.js} +4 -4
  573. package/dist/engine/{loft-operations.js → operations/loft.js} +13 -12
  574. package/dist/engine/{mechanical-operations.js → operations/mechanical.js} +2 -2
  575. package/dist/engine/{pattern-operations.js → operations/patterns.js} +4 -4
  576. package/dist/engine/{primitive-anchors.js → operations/primitives/anchors.js} +9 -4
  577. package/dist/engine/{primitive-operations.js → operations/primitives/construction.js} +18 -19
  578. package/dist/engine/{primitive-correspondence.js → operations/primitives/correspondence.js} +4 -4
  579. package/dist/engine/{profile-mesh.js → operations/primitives/profile-mesh.js} +12 -12
  580. package/dist/engine/{primitive-profiles.js → operations/primitives/profiles.js} +7 -7
  581. package/dist/engine/{section-operations.js → operations/sections.js} +8 -8
  582. package/dist/engine/{transform-operations.js → operations/transforms.js} +8 -8
  583. package/dist/engine/placement.js +3 -4
  584. package/dist/engine/recipe-realization.js +2 -2
  585. package/dist/engine/{deferred-context.js → session/deferred-context.js} +4 -4
  586. package/dist/engine/session/dependencies.js +93 -0
  587. package/dist/engine/session/graph.js +428 -0
  588. package/dist/engine/{session-native.js → session/native-cache.js} +2 -2
  589. package/dist/engine/{session.js → session/session.js} +20 -14
  590. package/dist/engine/{session-snapshot.js → session/snapshot-cache.js} +30 -60
  591. package/dist/export/3mf.js +190 -0
  592. package/dist/export/capture.js +178 -0
  593. package/dist/export/glb.js +209 -0
  594. package/dist/export/index.js +5 -0
  595. package/dist/export/limits.js +18 -0
  596. package/dist/export/stl.js +105 -0
  597. package/dist/export/types.js +1 -0
  598. package/dist/export/writer.js +54 -0
  599. package/dist/geometry/anchors.js +4 -11
  600. package/dist/geometry/bounds-value.js +22 -12
  601. package/dist/geometry/heightfield.js +10 -12
  602. package/dist/{model → geometry}/immutable-buffer.js +31 -12
  603. package/dist/geometry/index.js +16 -22
  604. package/dist/geometry/join-geometry.js +839 -0
  605. package/dist/geometry/loft/loft.js +11 -6
  606. package/dist/geometry/mechanical/index.js +5 -5
  607. package/dist/geometry/mechanical/threads/bevel.js +24 -0
  608. package/dist/geometry/mechanical/{threads.js → threads/fit.js} +4 -4
  609. package/dist/geometry/mechanical/{thread-helices.js → threads/helices.js} +3 -3
  610. package/dist/geometry/mechanical/{thread-mesh-plan.js → threads/mesh-plan.js} +38 -53
  611. package/dist/geometry/mechanical/{thread-mesh.js → threads/mesh.js} +9 -9
  612. package/dist/geometry/mechanical/{thread-profiles.js → threads/profiles.js} +3 -3
  613. package/dist/geometry/mechanical/{thread-solids.js → threads/solids.js} +58 -89
  614. package/dist/geometry/mechanical/{thread-surface.js → threads/surface.js} +7 -8
  615. package/dist/geometry/mesh/mesh-centroid.js +3 -2
  616. package/dist/geometry/mesh/mesh-planar.js +27 -8
  617. package/dist/geometry/mesh/mesh-quality.js +2 -1
  618. package/dist/geometry/mesh/mesh-render.js +205 -0
  619. package/dist/geometry/mesh/mesh-signature.js +7 -6
  620. package/dist/geometry/mesh/mesh-solid-intersections.js +43 -17
  621. package/dist/geometry/mesh/mesh-solid.js +8 -5
  622. package/dist/geometry/mesh/mesh-types.js +1 -0
  623. package/dist/geometry/mesh/mesh.js +13 -22
  624. package/dist/geometry/mesh-api.js +15 -0
  625. package/dist/geometry/primitive-resolvers.js +42 -14
  626. package/dist/geometry/profiles/primitives/circle.js +19 -0
  627. package/dist/geometry/profiles/{shapes.js → primitives/ellipse.js} +6 -10
  628. package/dist/geometry/profiles/{rectangle.js → primitives/rectangle.js} +14 -12
  629. package/dist/geometry/profiles/primitives/regular-polygon.js +33 -0
  630. package/dist/geometry/profiles/primitives/star.js +28 -0
  631. package/dist/geometry/region-offset.js +278 -0
  632. package/dist/geometry/regions.js +11 -1
  633. package/dist/geometry/revolve/revolve-mesh.js +1 -1
  634. package/dist/geometry/{svg-import.js → svg/import.js} +10 -10
  635. package/dist/geometry/sweeps/sweep-mesh.js +1 -1
  636. package/dist/geometry/transform3.js +29 -0
  637. package/dist/index.js +2 -1
  638. package/dist/model/diagnostic-path.js +26 -0
  639. package/dist/model/execution-binding.js +3 -3
  640. package/dist/model/generation.js +9 -3
  641. package/dist/model/geometry-recipes.js +1 -1
  642. package/dist/model/immutable-generation-data.js +45 -14
  643. package/dist/model/join.js +1 -0
  644. package/dist/model/operations.js +34 -144
  645. package/dist/model/recipe-declaration.js +7 -2
  646. package/dist/model/shape-handles.js +31 -7
  647. package/dist/text/index.js +1 -1
  648. package/package.json +38 -11
  649. package/dist/docs/reference/engine/Export3mfOptions.md +0 -29
  650. package/dist/docs/reference/engine/ExportMeshPart.md +0 -65
  651. package/dist/docs/reference/engine/ModelSnapshot.md +0 -184
  652. package/dist/docs/reference/engine/SnapshotPart.md +0 -133
  653. package/dist/docs/reference/engine/validateModel.md +0 -48
  654. package/dist/docs/reference/geometry/ThreadedNutBevel.md +0 -14
  655. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +0 -61
  656. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +0 -56
  657. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +0 -39
  658. package/dist/docs/reference/geometry/computeTriangleMeshSignature.md +0 -64
  659. package/dist/docs/reference/geometry/extrudeMesh.md +0 -77
  660. package/dist/docs/reference/geometry/heightfieldMesh.md +0 -52
  661. package/dist/docs/reference/geometry/helicalThreadRidgeMesh.md +0 -72
  662. package/dist/docs/reference/geometry/helicalThreadSolidMesh.md +0 -106
  663. package/dist/docs/reference/geometry/joinTriangleMeshes.md +0 -40
  664. package/dist/docs/reference/geometry/loftMesh.md +0 -77
  665. package/dist/docs/reference/geometry/meshBounds.md +0 -39
  666. package/dist/docs/reference/geometry/optimizePlanarPatches.md +0 -95
  667. package/dist/docs/reference/geometry/preflightHeightfield.md +0 -43
  668. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +0 -105
  669. package/dist/docs/reference/geometry/reverseTriangleMesh.md +0 -34
  670. package/dist/docs/reference/geometry/sweepMesh.md +0 -86
  671. package/dist/docs/reference/geometry/transformTriangleMesh.md +0 -46
  672. package/dist/docs/reference/geometry/validateTriangleMesh.md +0 -63
  673. package/dist/docs/reference/model/Anchor3.md +0 -55
  674. package/dist/docs/reference/model/AttachOptions.md +0 -69
  675. package/dist/docs/reference/model/Bounds2-type.md +0 -125
  676. package/dist/docs/reference/model/Bounds2Data.md +0 -44
  677. package/dist/docs/reference/model/Bounds2Input.md +0 -19
  678. package/dist/docs/reference/model/Bounds2Options.md +0 -70
  679. package/dist/docs/reference/model/Bounds3-type.md +0 -125
  680. package/dist/docs/reference/model/Bounds3Data.md +0 -44
  681. package/dist/docs/reference/model/Bounds3Input.md +0 -19
  682. package/dist/docs/reference/model/Bounds3Options.md +0 -70
  683. package/dist/docs/reference/model/BoxEdge.md +0 -15
  684. package/dist/docs/reference/model/BoxEdgeSelection.md +0 -19
  685. package/dist/docs/reference/model/BoxEdgeTreatments.md +0 -20
  686. package/dist/docs/reference/model/BoxOptions.md +0 -92
  687. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +0 -35
  688. package/dist/docs/reference/model/CircleContourOptions.md +0 -21
  689. package/dist/docs/reference/model/CircularPrimitiveOptions.md +0 -64
  690. package/dist/docs/reference/model/Computed.md +0 -40
  691. package/dist/docs/reference/model/ComputedValue.md +0 -24
  692. package/dist/docs/reference/model/Contour.md +0 -24
  693. package/dist/docs/reference/model/CorrespondingComponent.md +0 -46
  694. package/dist/docs/reference/model/CorrespondingContour.md +0 -46
  695. package/dist/docs/reference/model/CorrespondingProfile.md +0 -22
  696. package/dist/docs/reference/model/CorrespondingProfileStation.md +0 -27
  697. package/dist/docs/reference/model/CylinderOptions.md +0 -58
  698. package/dist/docs/reference/model/EdgeTreatment.md +0 -22
  699. package/dist/docs/reference/model/EllipseContourOptions.md +0 -21
  700. package/dist/docs/reference/model/EndTreatments.md +0 -39
  701. package/dist/docs/reference/model/FinalizedModel.md +0 -131
  702. package/dist/docs/reference/model/FinalizedPart.md +0 -87
  703. package/dist/docs/reference/model/Frame3.md +0 -63
  704. package/dist/docs/reference/model/GeneratedPart.md +0 -97
  705. package/dist/docs/reference/model/GeometryResolution.md +0 -70
  706. package/dist/docs/reference/model/GeometrySamplingLimits.md +0 -62
  707. package/dist/docs/reference/model/GeometryToleranceOptions.md +0 -46
  708. package/dist/docs/reference/model/GridPatternOptions.md +0 -50
  709. package/dist/docs/reference/model/HeightfieldOptions.md +0 -67
  710. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +0 -141
  711. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +0 -59
  712. package/dist/docs/reference/model/ImmutableBuffer-type.md +0 -84
  713. package/dist/docs/reference/model/ImmutableTriangleMesh.md +0 -38
  714. package/dist/docs/reference/model/InternalThreadCutterOptions.md +0 -246
  715. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +0 -77
  716. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +0 -47
  717. package/dist/docs/reference/model/KnuckleHingeSpec.md +0 -18
  718. package/dist/docs/reference/model/LinearPatternOptions.md +0 -39
  719. package/dist/docs/reference/model/LoftCorrespondence.md +0 -27
  720. package/dist/docs/reference/model/LoftOptions.md +0 -91
  721. package/dist/docs/reference/model/LoftPlacement.md +0 -73
  722. package/dist/docs/reference/model/MatchProfilesOptions.md +0 -35
  723. package/dist/docs/reference/model/ModelingLimits.md +0 -126
  724. package/dist/docs/reference/model/NumericArray.md +0 -14
  725. package/dist/docs/reference/model/Path2-type.md +0 -196
  726. package/dist/docs/reference/model/Path2Data.md +0 -50
  727. package/dist/docs/reference/model/Path2Input.md +0 -20
  728. package/dist/docs/reference/model/Path3-type.md +0 -196
  729. package/dist/docs/reference/model/Path3Data.md +0 -50
  730. package/dist/docs/reference/model/Path3Input.md +0 -20
  731. package/dist/docs/reference/model/PathLocation.md +0 -69
  732. package/dist/docs/reference/model/PathNormalGuide.md +0 -46
  733. package/dist/docs/reference/model/PathOptions.md +0 -38
  734. package/dist/docs/reference/model/PathPatternOptions.md +0 -48
  735. package/dist/docs/reference/model/PathResamplingOptions.md +0 -83
  736. package/dist/docs/reference/model/Pivot2Options.md +0 -28
  737. package/dist/docs/reference/model/Pivot3Options.md +0 -28
  738. package/dist/docs/reference/model/PolygonData.md +0 -44
  739. package/dist/docs/reference/model/PrimitiveAttachment.md +0 -41
  740. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +0 -110
  741. package/dist/docs/reference/model/PrintableThreadFit.md +0 -15
  742. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +0 -51
  743. package/dist/docs/reference/model/ProfileComponent2.md +0 -46
  744. package/dist/docs/reference/model/ProfileContour2.md +0 -36
  745. package/dist/docs/reference/model/ProfileSpan2.md +0 -47
  746. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +0 -41
  747. package/dist/docs/reference/model/RadialPatternOptions.md +0 -59
  748. package/dist/docs/reference/model/RadialSizing.md +0 -15
  749. package/dist/docs/reference/model/RadialSizingOptions.md +0 -40
  750. package/dist/docs/reference/model/RectangleContourOptions.md +0 -72
  751. package/dist/docs/reference/model/RectangleCornerTreatment.md +0 -40
  752. package/dist/docs/reference/model/RectangleCornerTreatments.md +0 -20
  753. package/dist/docs/reference/model/RegionData.md +0 -19
  754. package/dist/docs/reference/model/RevolveOptions.md +0 -94
  755. package/dist/docs/reference/model/RoundedEdgeTreatment.md +0 -96
  756. package/dist/docs/reference/model/SmoothEdgeTreatment.md +0 -76
  757. package/dist/docs/reference/model/SphereOptions.md +0 -20
  758. package/dist/docs/reference/model/StrokeCap.md +0 -16
  759. package/dist/docs/reference/model/StrokeJoin.md +0 -16
  760. package/dist/docs/reference/model/StrokeOptions.md +0 -91
  761. package/dist/docs/reference/model/SweepOptions.md +0 -116
  762. package/dist/docs/reference/model/SweepOrientation.md +0 -116
  763. package/dist/docs/reference/model/ThreadEndStyle.md +0 -15
  764. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +0 -118
  765. package/dist/docs/reference/model/ThreadHandedness.md +0 -15
  766. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +0 -15
  767. package/dist/docs/reference/model/ThreadLeadInShape.md +0 -15
  768. package/dist/docs/reference/model/ThreadProfile.md +0 -87
  769. package/dist/docs/reference/model/ThreadRidgeOptions.md +0 -19
  770. package/dist/docs/reference/model/ThreadedNutBevel.md +0 -15
  771. package/dist/docs/reference/model/ThreadedNutOptions.md +0 -274
  772. package/dist/docs/reference/model/ThreadedNutPreflight.md +0 -99
  773. package/dist/docs/reference/model/ThreadedNutShape.md +0 -15
  774. package/dist/docs/reference/model/ThreadedRodOptions.md +0 -246
  775. package/dist/docs/reference/model/TorusOptions.md +0 -110
  776. package/dist/docs/reference/model/Transform2-type.md +0 -257
  777. package/dist/docs/reference/model/Transform2Data.md +0 -16
  778. package/dist/docs/reference/model/Transform2Input.md +0 -21
  779. package/dist/docs/reference/model/Transform3-type.md +0 -297
  780. package/dist/docs/reference/model/Transform3Data.md +0 -19
  781. package/dist/docs/reference/model/Transform3Input.md +0 -21
  782. package/dist/docs/reference/model/TriangleMesh.md +0 -42
  783. package/dist/docs/reference/model/TriangleMeshAnalysis.md +0 -123
  784. package/dist/docs/reference/model/TriangleMeshMeasurements.md +0 -79
  785. package/dist/docs/reference/model/TubeOptions.md +0 -143
  786. package/dist/docs/reference/model/Vector2-type.md +0 -271
  787. package/dist/docs/reference/model/Vector2Data.md +0 -15
  788. package/dist/docs/reference/model/Vector2Input.md +0 -21
  789. package/dist/docs/reference/model/Vector3-type.md +0 -283
  790. package/dist/docs/reference/model/Vector3Data.md +0 -15
  791. package/dist/docs/reference/model/Vector3Input.md +0 -21
  792. package/dist/docs/reference/model/VectorTextLayout.md +0 -40
  793. package/dist/docs/reference/model/VectorTextMetrics.md +0 -100
  794. package/dist/docs/reference/model/anchor.md +0 -47
  795. package/dist/docs/reference/model/bounds2.md +0 -37
  796. package/dist/docs/reference/model/bounds3.md +0 -37
  797. package/dist/docs/reference/model/castSegment.md +0 -40
  798. package/dist/docs/reference/model/categories/bounds.md +0 -38
  799. package/dist/docs/reference/model/categories/contracts.md +0 -18
  800. package/dist/docs/reference/model/categories/core-values-errors.md +0 -30
  801. package/dist/docs/reference/model/categories/inspection.md +0 -29
  802. package/dist/docs/reference/model/categories/paths.md +0 -41
  803. package/dist/docs/reference/model/categories/resolution.md +0 -20
  804. package/dist/docs/reference/model/components.md +0 -71
  805. package/dist/docs/reference/model/compose.md +0 -31
  806. package/dist/docs/reference/model/distance.md +0 -45
  807. package/dist/docs/reference/model/immutableMesh.md +0 -44
  808. package/dist/docs/reference/model/inspectSection.md +0 -38
  809. package/dist/docs/reference/model/inspectSolid.md +0 -38
  810. package/dist/docs/reference/model/isEmpty.md +0 -39
  811. package/dist/docs/reference/model/path2.md +0 -54
  812. package/dist/docs/reference/model/path3.md +0 -49
  813. package/dist/docs/reference/model/split.md +0 -54
  814. package/dist/docs/reference/model/splitByPlane.md +0 -66
  815. package/dist/docs/reference/model/transform2.md +0 -46
  816. package/dist/docs/reference/model/transform3.md +0 -48
  817. package/dist/docs/reference/model/vector2.md +0 -40
  818. package/dist/docs/reference/model/vector3.md +0 -47
  819. package/dist/docs/reference/text/Bounds2Data.md +0 -34
  820. package/dist/docs/reference/text/Vector2Data.md +0 -7
  821. package/dist/docs/reference/text/VectorTextArcBaseline.md +0 -53
  822. package/dist/docs/reference/text/VectorTextLayout.md +0 -34
  823. package/dist/docs/reference/text/VectorTextLayoutOptions.md +0 -111
  824. package/dist/docs/reference/text/VectorTextMetrics.md +0 -94
  825. package/dist/docs/reference/text/VectorTextOptions.md +0 -50
  826. package/dist/engine/export-3mf.js +0 -116
  827. package/dist/engine/model-dependencies.js +0 -46
  828. package/dist/engine/session-graph.js +0 -449
  829. package/dist/geometry/profiles/profiles.js +0 -71
  830. /package/dist/engine/{primitive-profile-types.js → operations/primitives/profile-types.js} +0 -0
  831. /package/dist/{engine → geometry/mesh}/mesh-view-cache.js +0 -0
  832. /package/dist/geometry/profiles/{matched.js → match-profiles.js} +0 -0
@@ -0,0 +1,508 @@
1
+ import { anchor3, anchorFrame3 } from "../../geometry/anchors.js";
2
+ import { GeometryError } from "../../geometry/errors.js";
3
+ import { clipJoinPolygon, createJoinPolygonIndex, expandJoinPolygon, inJoinPolygon, intersectJoinPolygons, joinArea, joinHeight, JoinWork, prepareJoinLayer, subtractJoinPolygon, } from "../../geometry/join-geometry.js";
4
+ import { validateSolidMesh } from "../../geometry/mesh/mesh-solid.js";
5
+ import { assertMeshAllocationWithinLimits } from "../../geometry/model-limits.js";
6
+ import { planRegionOffsets } from "../../geometry/region-offset.js";
7
+ import { contourContainsPoint } from "../../geometry/regions.js";
8
+ import { resolveGeometryResolution } from "../../geometry/resolution.js";
9
+ import { assertSamplingCount } from "../../geometry/sampling-limits.js";
10
+ import { resolveGeometryTolerance } from "../../geometry/tolerance.js";
11
+ import { nativeConstructionMesh } from "../native/construction-mesh.js";
12
+ import { ownScopedManifoldValue } from "../native/context.js";
13
+ import { observeNativeMesh } from "../native/mesh-observation.js";
14
+ import { assertNativeSolidStatus } from "../native/status.js";
15
+ import { nativeCollarProfile } from "./join-collar-profile.js";
16
+ const fail = (message, phase) => {
17
+ throw new GeometryError("INVALID_ARGUMENT", message, { operation: "join", details: { phase } });
18
+ };
19
+ const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
20
+ const contours = (profile) => profile.components.flatMap((component) => [
21
+ component.outer.points,
22
+ ...component.holes.map((hole) => hole.points),
23
+ ]);
24
+ /** One deferred connection, with native operands authoritative throughout support proofs. */
25
+ export function createJoinOperation(environment) {
26
+ return (base, feature, options) => {
27
+ const { module, scope } = environment;
28
+ const own = (value) => {
29
+ // Register first: failed native proofs and limit checks must dispose their intermediates too.
30
+ ownScopedManifoldValue(scope, value);
31
+ const vertices = value.numVert();
32
+ if (value instanceof module.Manifold) {
33
+ const triangles = value.numTri();
34
+ assertMeshAllocationWithinLimits(vertices, triangles, 12 * (vertices + triangles), "join", limits);
35
+ }
36
+ else
37
+ assertSamplingCount(vertices, "join", limits.maxProfilePoints);
38
+ return value;
39
+ };
40
+ if (typeof options !== "object" || options === null || Array.isArray(options))
41
+ fail("Join options are required.", "options");
42
+ if (Object.keys(options).some((key) => !["source", "transition", "resolution", "limits"].includes(key)))
43
+ fail("Unknown join option.", "options");
44
+ const transition = options.transition;
45
+ if (typeof transition !== "object" ||
46
+ transition === null ||
47
+ Array.isArray(transition) ||
48
+ Object.keys(transition).some((key) => !["kind", "width", "height"].includes(key)))
49
+ fail("Transition requires width and height and accepts an optional kind.", "options");
50
+ const kind = transition.kind === undefined ? "smooth" : transition.kind;
51
+ if (kind !== "smooth" && kind !== "straight")
52
+ fail('Join transition kind must be "smooth" or "straight".', "options");
53
+ const { width, height } = transition;
54
+ if (!Number.isFinite(width) || !Number.isFinite(height))
55
+ throw new GeometryError("NON_FINITE_VALUE", "Join width and height must be finite.", {
56
+ operation: "join",
57
+ });
58
+ if (width < 0 || height < 0 || (width === 0) !== (height === 0))
59
+ fail("Join width and height must both be positive or both zero.", "options");
60
+ const selected = environment.withResolutionDefaults(options);
61
+ const { limits } = selected;
62
+ const policy = resolveGeometryResolution(selected.resolution, limits);
63
+ const originalBase = environment.nativeSolid(base), originalFeature = environment.nativeSolid(feature);
64
+ assertNativeSolidStatus(originalBase, "join");
65
+ assertNativeSolidStatus(originalFeature, "join");
66
+ if (originalBase.isEmpty() || originalFeature.isEmpty())
67
+ throw new GeometryError("DEGENERATE_GEOMETRY", "Joining requires nonempty base and feature solids.", { operation: "join" });
68
+ const supplied = typeof options.source === "string"
69
+ ? environment.anchor(feature, options.source)
70
+ : options.source;
71
+ if (typeof supplied !== "object" || supplied === null)
72
+ fail("Join source must name a feature anchor or supply an Anchor3.", "source");
73
+ const sourceAnchor = anchor3(supplied.position, supplied.direction, supplied.up);
74
+ // The root points out of the feature; chart Z points into its unchanged straight collar.
75
+ const frame = anchorFrame3(anchor3(sourceAnchor.position, [-sourceAnchor.direction[0], -sourceAnchor.direction[1], -sourceAnchor.direction[2]], sourceAnchor.up));
76
+ const { xAxis: x, yAxis: y, zAxis: z, origin: o } = frame;
77
+ const forward = [
78
+ x[0],
79
+ x[1],
80
+ x[2],
81
+ 0,
82
+ y[0],
83
+ y[1],
84
+ y[2],
85
+ 0,
86
+ z[0],
87
+ z[1],
88
+ z[2],
89
+ 0,
90
+ o[0],
91
+ o[1],
92
+ o[2],
93
+ 1,
94
+ ];
95
+ const inverse = [
96
+ x[0],
97
+ y[0],
98
+ z[0],
99
+ 0,
100
+ x[1],
101
+ y[1],
102
+ z[1],
103
+ 0,
104
+ x[2],
105
+ y[2],
106
+ z[2],
107
+ 0,
108
+ -dot(x, o),
109
+ -dot(y, o),
110
+ -dot(z, o),
111
+ 1,
112
+ ];
113
+ // Local copies serve the proofs. Fuse the original operands later to avoid a frame round trip.
114
+ const support = own(originalBase.transform(inverse)), neck = own(originalFeature.transform(inverse));
115
+ const bounds = neck.boundingBox();
116
+ const raw = observeNativeMesh(scope, support, limits, "join");
117
+ const scale = Math.max(1, ...bounds.min.map(Math.abs), ...bounds.max.map(Math.abs), width, height);
118
+ // Final mesh capture is Float32. Reserve conversion/closure error before the sampling budget.
119
+ const epsilon = Math.max(resolveGeometryTolerance(scale).linear, support.tolerance(), neck.tolerance(), scale * 2 ** -22);
120
+ // Contact selection uses native precision; the larger Float32 meshing allowance must not bridge a gap.
121
+ const datumTolerance = Math.max(support.tolerance(), neck.tolerance(), scale * Number.EPSILON * 64);
122
+ let allowance = epsilon * 16;
123
+ if (allowance >= policy.maxChordError / 2)
124
+ fail("Join coordinate precision cannot resolve the requested physical error budget.", "precision");
125
+ const meshEpsilon = epsilon / 8;
126
+ // Slice just inside the root cap, removing cut seams only within the reserved numeric allowance.
127
+ const sourceSection = own(own(neck.slice(epsilon * 2)).simplify(epsilon / 8));
128
+ if (sourceSection.isEmpty())
129
+ fail("Source datum must cut a nonempty straight feature collar.", "collar");
130
+ const work = new JoinWork();
131
+ // Native Sections supply robust regional proofs; exact facet slicing retains wall coordinates
132
+ // for the corresponding construction instead of moving them through integer clipping.
133
+ const source = nativeCollarProfile(scope, neck, epsilon * 2, limits, work);
134
+ const closingInset = epsilon * 8;
135
+ const offset = planRegionOffsets(source, [-width, closingInset], "join", limits);
136
+ work.use(offset.workCount);
137
+ const region = (loops) => own(loops.length === 0
138
+ ? sourceSection.subtract(sourceSection)
139
+ : new module.CrossSection(loops.map((loop) => loop.map((p) => [p[0], p[1]])), "NonZero"));
140
+ const expandedProfile = offset.profileAt(-width);
141
+ const footprint = region(contours(expandedProfile));
142
+ const triangles = [];
143
+ const canonicalPlanes = [];
144
+ const chartTolerance = resolveGeometryTolerance(scale);
145
+ let chartArithmeticScale = scale;
146
+ const maxZ = bounds.max[2];
147
+ for (let i = 0; i < raw.triangles.length; i += 3) {
148
+ work.use();
149
+ const points = [0, 1, 2].map((j) => {
150
+ const index = raw.vertexIndices[raw.triangles[i + j]] * 3;
151
+ return [
152
+ raw.coordinates[index],
153
+ raw.coordinates[index + 1],
154
+ raw.coordinates[index + 2],
155
+ ];
156
+ });
157
+ const a = points[0], b = points[1], c = points[2];
158
+ const ab = [b[0] - a[0], b[1] - a[1], b[2] - a[2]], ac = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];
159
+ const normal = [
160
+ ab[1] * ac[2] - ab[2] * ac[1],
161
+ ab[2] * ac[0] - ab[0] * ac[2],
162
+ ab[0] * ac[1] - ab[1] * ac[0],
163
+ ];
164
+ const normalLength = Math.hypot(...normal);
165
+ if (normal[2] <= normalLength * 1e-10)
166
+ continue;
167
+ let plane = [
168
+ -normal[0] / normal[2],
169
+ -normal[1] / normal[2],
170
+ a[2] + (normal[0] / normal[2]) * a[0] + (normal[1] / normal[2]) * a[1],
171
+ ];
172
+ let polygon = points.map((p) => [p[0], p[1]]);
173
+ polygon = clipJoinPolygon(polygon, [plane[0], plane[1], plane[2] + datumTolerance]);
174
+ polygon = clipJoinPolygon(polygon, [-plane[0], -plane[1], maxZ - plane[2]]);
175
+ if (polygon.length < 3 || Math.abs(joinArea(polygon)) <= meshEpsilon ** 2)
176
+ continue;
177
+ const clipped = own(region([polygon]).intersect(footprint));
178
+ if (clipped.isEmpty())
179
+ continue;
180
+ for (const point of points)
181
+ chartArithmeticScale = Math.max(chartArithmeticScale, ...point.map(Math.abs));
182
+ // Double arithmetic can give coplanar tessellation triangles slightly different equations.
183
+ // Match dimensionless unit normals and actual height predictions, never encoded face IDs.
184
+ const priorPlane = canonicalPlanes.find((candidate) => {
185
+ work.use();
186
+ const length = Math.hypot(candidate[0], candidate[1], 1);
187
+ return (Math.hypot(-candidate[0] / length - normal[0] / normalLength, -candidate[1] / length - normal[1] / normalLength, 1 / length - normal[2] / normalLength) <= chartTolerance.angular &&
188
+ points.every((point) => Math.abs(joinHeight(candidate, [point[0], point[1]]) - point[2]) <=
189
+ chartTolerance.linear));
190
+ });
191
+ if (priorPlane === undefined)
192
+ canonicalPlanes.push(plane);
193
+ else
194
+ plane = priorPlane;
195
+ triangles.push({ polygon, plane });
196
+ }
197
+ // Convex components need one exact clip, not arbitrary triangulation seams.
198
+ // Inspect the actual clipping coordinates; holes and concavity retain their full partition.
199
+ const convexPartition = (loops) => {
200
+ const outer = loops[0];
201
+ const convex = loops.length === 1 &&
202
+ outer.length >= 3 &&
203
+ joinArea(outer) > 0 &&
204
+ outer.every((point, i) => {
205
+ work.use();
206
+ const previous = outer[(i + outer.length - 1) % outer.length], next = outer[(i + 1) % outer.length];
207
+ return ((point[0] - previous[0]) * (next[1] - point[1]) -
208
+ (point[1] - previous[1]) * (next[0] - point[0]) >=
209
+ 0);
210
+ });
211
+ if (convex)
212
+ return [outer];
213
+ const vertices = loops.flat();
214
+ return module
215
+ .triangulate(loops.map((loop) => loop.map((p) => [p[0], p[1]])), 0, false)
216
+ .map((ids) => ids.map((id) => vertices[id]));
217
+ };
218
+ const footprintCells = expandedProfile.components.flatMap((component) => convexPartition(region([component.outer.points, ...component.holes.map((hole) => hole.points)]).toPolygons()));
219
+ const usable = (polygon) => polygon.length >= 3 && Math.abs(joinArea(polygon)) > meshEpsilon ** 2;
220
+ const cells = [];
221
+ // Remove every nearer exit over its complete projected overlap, rather than probing a few rays.
222
+ for (let i = 0; i < triangles.length; i++) {
223
+ const current = triangles[i];
224
+ let visible = footprintCells
225
+ .map((polygon) => intersectJoinPolygons(current.polygon, polygon))
226
+ .filter(usable);
227
+ for (let j = 0; j < triangles.length && visible.length > 0; j++) {
228
+ if (i === j)
229
+ continue;
230
+ work.use();
231
+ const other = triangles[j];
232
+ const overlap = intersectJoinPolygons(current.polygon, other.polygon);
233
+ if (!usable(overlap))
234
+ continue;
235
+ const difference = [
236
+ current.plane[0] - other.plane[0],
237
+ current.plane[1] - other.plane[1],
238
+ current.plane[2] - other.plane[2],
239
+ ];
240
+ const equal = overlap.every((point) => Math.abs(joinHeight(difference, point)) <= chartTolerance.linear);
241
+ if (equal && j > i)
242
+ continue;
243
+ const nearer = equal ? other.polygon : clipJoinPolygon(other.polygon, difference);
244
+ if (usable(nearer))
245
+ visible = visible
246
+ .flatMap((polygon) => subtractJoinPolygon(polygon, nearer, work))
247
+ .filter(usable);
248
+ }
249
+ for (const polygon of visible)
250
+ cells.push({ polygon, plane: current.plane });
251
+ }
252
+ if (cells.length === 0)
253
+ fail("The entire transition footprint needs a regular outward support patch after the source datum.", "support");
254
+ // Bound each affine proof cell's extension by epsilon/2 in Euclidean distance.
255
+ // The native union must cover the complete footprint; every extended part is
256
+ // included in the material witness below, so a real slit cannot be waived.
257
+ const proofRegions = cells.map((cell) => {
258
+ work.use(cell.polygon.length);
259
+ const expanded = expandJoinPolygon(cell.polygon, epsilon / (2 * Math.SQRT2), work);
260
+ return region([expanded]);
261
+ });
262
+ const proofPoints = proofRegions.reduce((count, region) => count + region.numVert(), 0);
263
+ assertMeshAllocationWithinLimits(proofPoints * 2, proofPoints * 4, proofPoints * 96, "join", limits);
264
+ const proofCoverage = own(module.CrossSection.union(proofRegions));
265
+ if (!own(footprint.subtract(proofCoverage)).isEmpty())
266
+ fail("The entire transition footprint needs a regular outward support patch after the source datum.", "support");
267
+ let maximumSlope = 0, greatest = -Infinity;
268
+ for (const cell of cells) {
269
+ maximumSlope = Math.max(maximumSlope, Math.hypot(cell.plane[0], cell.plane[1]));
270
+ for (const point of cell.polygon) {
271
+ greatest = Math.max(greatest, joinHeight(cell.plane, point));
272
+ }
273
+ }
274
+ allowance *= 1 + maximumSlope;
275
+ if (allowance >= policy.maxChordError / 2)
276
+ fail("Support slope exhausts the physical extraction error budget.", "precision");
277
+ // Local bounds keep distant roots from broadening each other's support searches.
278
+ const cellIndex = createJoinPolygonIndex(cells.map((cell) => cell.polygon), work, limits);
279
+ for (const cell of cells)
280
+ for (const point of cell.polygon)
281
+ for (const index of cellIndex(point, meshEpsilon)) {
282
+ const other = cells[index];
283
+ work.use();
284
+ if (cell !== other &&
285
+ inJoinPolygon(point, other.polygon, meshEpsilon) &&
286
+ Math.abs(joinHeight(cell.plane, point) - joinHeight(other.plane, point)) > allowance)
287
+ fail("Support patch must be continuous; height jumps and branch changes are unsupported.", "support");
288
+ }
289
+ const H = greatest + height + allowance;
290
+ if (H > maxZ + epsilon)
291
+ fail("Feature needs a longer constant-section collar above the support patch.", "collar");
292
+ const proofDomain = own(module.Manifold.extrude(footprint, H + allowance * 3).translate([0, 0, -allowance * 2]));
293
+ const toNative = (mesh) => nativeConstructionMesh(scope, mesh, limits, "join");
294
+ const terrain = (top, bottom) => {
295
+ const pieces = cells.flatMap((cell, index) => {
296
+ const area = proofRegions[index];
297
+ if (area.isEmpty())
298
+ return [];
299
+ const guard = epsilon * (2 + Math.hypot(cell.plane[0], cell.plane[1]) / 2);
300
+ const slab = own(module.Manifold.extrude(area, 1));
301
+ const piece = own(slab.warpBatch((vertices, count) => {
302
+ work.use(count);
303
+ for (let i = 0; i < count; i++) {
304
+ const k = i * 3, value = joinHeight(cell.plane, [vertices[k], vertices[k + 1]]);
305
+ vertices[k + 2] = vertices[k + 2] > 0.5 ? top(value, guard) : bottom(value, guard);
306
+ }
307
+ }));
308
+ assertNativeSolidStatus(piece, "join");
309
+ return [piece];
310
+ });
311
+ return own(own(module.Manifold.union(pieces)).intersect(proofDomain));
312
+ };
313
+ // Follow the curved chart. A flat witness would incorrectly exclude thin curved shells.
314
+ const witness = terrain((value, guard) => value - guard, (value, guard) => value - guard - epsilon * 6);
315
+ if (!own(witness.subtract(support)).isEmpty())
316
+ fail("Support material is missing or too thin beneath the complete curved footprint.", "support");
317
+ const overhead = terrain(() => H + allowance, (value, guard) => value + guard);
318
+ if (!own(overhead.intersect(support)).isEmpty())
319
+ fail("Support reenters the connection band above the selected patch.", "support");
320
+ // Guard both directions over the full collar volume: matching two cross-sections is insufficient.
321
+ const domain = own(module.Manifold.extrude(footprint, H - epsilon * 2).translate([0, 0, epsilon * 2]));
322
+ const innerSection = own(sourceSection.offset(-epsilon * 2, "Miter"));
323
+ const outerSection = own(sourceSection.offset(epsilon * 2, "Miter"));
324
+ const expected = own(module.Manifold.extrude(innerSection, H - epsilon * 2).translate([0, 0, epsilon * 2]));
325
+ const outer = own(module.Manifold.extrude(outerSection, H - epsilon * 2).translate([0, 0, epsilon * 2]));
326
+ const actual = own(neck.intersect(domain));
327
+ if (!own(expected.subtract(actual)).isEmpty() || !own(actual.subtract(outer)).isEmpty())
328
+ fail("Feature must have a straight constant-section collar throughout the complete connection band.", "collar");
329
+ if (width === 0)
330
+ return environment.wrapSolid(own(originalBase.add(originalFeature)));
331
+ const originalLoops = contours(source), outsideLoops = contours(expandedProfile);
332
+ // Close inside the real feature wall, proving this private numerical overlap adds no exposed shape.
333
+ const insideProfile = offset.profileAt(closingInset);
334
+ const insideLoops = contours(insideProfile);
335
+ const closingSection = region(insideLoops);
336
+ if (closingSection.isEmpty() || closingSection.numContour() !== sourceSection.numContour())
337
+ fail("Source boundaries cannot resolve the private closing allowance.", "precision");
338
+ const closingCore = own(module.Manifold.extrude(closingSection, H));
339
+ if (!own(own(closingCore.subtract(neck)).subtract(support)).isEmpty())
340
+ fail("The private closing boundary cannot be contained in the supplied solids.", "precision");
341
+ const strips = [];
342
+ for (let loop = 0; loop < originalLoops.length; loop++) {
343
+ const original = originalLoops[loop], expanded = outsideLoops[loop];
344
+ for (let i = 0; i < original.length; i++) {
345
+ const next = (i + 1) % original.length, a = original[i], b = original[next];
346
+ const length = Math.hypot(b[0] - a[0], b[1] - a[1]);
347
+ if (length <= epsilon)
348
+ fail("Source edge cannot resolve the connection precision.", "precision");
349
+ strips.push({
350
+ polygon: [a, expanded[i], expanded[next], b],
351
+ start: a,
352
+ normal: [(b[1] - a[1]) / length, -(b[0] - a[0]) / length],
353
+ });
354
+ }
355
+ }
356
+ // A straight profile is planar on each support facet; only the cubic needs transverse rows.
357
+ const effectiveRise = height + epsilon * 2;
358
+ const curvature = 6 * Math.hypot(width * offset.magnification * (1 + maximumSlope), effectiveRise);
359
+ const tolerance = (policy.maxChordError - allowance) / 4;
360
+ const divisions = kind === "straight"
361
+ ? 1
362
+ : Math.max(2, Math.ceil(Math.sqrt(curvature / (8 * tolerance))), policy.maxSegmentLength === undefined
363
+ ? 0
364
+ : Math.ceil((3 *
365
+ Math.hypot(width * offset.magnification * (1 + maximumSlope), effectiveRise)) /
366
+ policy.maxSegmentLength));
367
+ if (divisions > limits.maxPathPoints)
368
+ throw new GeometryError("COMPLEXITY_LIMIT", "Join profile exceeds its station ceiling.", {
369
+ operation: "join",
370
+ });
371
+ const polygons = [];
372
+ const bottomGroups = [];
373
+ const planeGroups = new Map();
374
+ const supportPlanes = [];
375
+ const cellGroups = cells.map((cell) => {
376
+ const key = cell.plane.join(",");
377
+ let group = planeGroups.get(key);
378
+ if (group === undefined) {
379
+ group = planeGroups.size;
380
+ planeGroups.set(key, group);
381
+ supportPlanes.push(cell.plane);
382
+ }
383
+ return group;
384
+ });
385
+ // Split at every chart crossing so the generated surface retains actual support facets and creases.
386
+ for (const strip of strips)
387
+ for (let row = 0; row < divisions; row++) {
388
+ const exponent = kind === "straight" ? 1 : 3;
389
+ const ra = width * (1 - row / divisions) ** exponent, rb = width * (1 - (row + 1) / divisions) ** exponent;
390
+ const projection = [
391
+ strip.normal[0],
392
+ strip.normal[1],
393
+ -strip.normal[0] * strip.start[0] - strip.normal[1] * strip.start[1],
394
+ ];
395
+ const band = clipJoinPolygon(clipJoinPolygon(strip.polygon, [projection[0], projection[1], projection[2] - rb]), [-projection[0], -projection[1], ra - projection[2]]);
396
+ if (band.length < 3)
397
+ continue;
398
+ for (const [cellIndex, cell] of cells.entries()) {
399
+ work.use();
400
+ const piece = intersectJoinPolygons(band, cell.polygon);
401
+ if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
402
+ polygons.push(piece);
403
+ bottomGroups.push(cellGroups[cellIndex]);
404
+ }
405
+ }
406
+ }
407
+ // Use the same corresponding boundaries and clipping arithmetic as the outside strips.
408
+ // Independent native offsets/intersections would round these shared mesh seams differently.
409
+ for (let loop = 0; loop < originalLoops.length; loop++) {
410
+ const original = originalLoops[loop], inside = insideLoops[loop];
411
+ for (let i = 0; i < original.length; i++) {
412
+ const next = (i + 1) % original.length;
413
+ const ring = [original[i], original[next], inside[next], inside[i]];
414
+ for (const [cellIndex, cell] of cells.entries()) {
415
+ work.use();
416
+ const piece = intersectJoinPolygons(ring, cell.polygon);
417
+ if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
418
+ polygons.push(piece);
419
+ bottomGroups.push(cellGroups[cellIndex]);
420
+ }
421
+ }
422
+ }
423
+ }
424
+ // Fill the already-proven feature interior down to the same support witness. An annular-only
425
+ // collar can enclose a numerical contact sheet when two independently transformed caps meet.
426
+ const coreCells = insideProfile.components.flatMap((component) => convexPartition([component.outer.points, ...component.holes.map((hole) => hole.points)]));
427
+ for (const coreCell of coreCells) {
428
+ for (const [cellIndex, cell] of cells.entries()) {
429
+ work.use();
430
+ const piece = intersectJoinPolygons(coreCell, cell.polygon);
431
+ if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
432
+ polygons.push(piece);
433
+ bottomGroups.push(cellGroups[cellIndex]);
434
+ }
435
+ }
436
+ }
437
+ const stripIndex = createJoinPolygonIndex(strips.map((strip) => strip.polygon), work, limits);
438
+ const rise = (p) => {
439
+ for (const index of stripIndex(p, epsilon)) {
440
+ const strip = strips[index];
441
+ work.use();
442
+ if (inJoinPolygon(p, strip.polygon, epsilon)) {
443
+ const r = Math.max(0, Math.min(width, (p[0] - strip.start[0]) * strip.normal[0] + (p[1] - strip.start[1]) * strip.normal[1]));
444
+ return height * (kind === "straight" ? 1 - r / width : (1 - Math.cbrt(r / width)) ** 3);
445
+ }
446
+ }
447
+ if (source.components.some((component) => contourContainsPoint(component.outer.points, p) &&
448
+ !component.holes.some((hole) => contourContainsPoint(hole.points, p))))
449
+ return height;
450
+ return fail("Transition cell escaped its source offset strip.", "transition");
451
+ };
452
+ const layerOptions = {
453
+ bottomGroups,
454
+ supportPlanes,
455
+ triangulate: (loops) => module.triangulate(loops.map((loop) => loop.map((p) => [p[0], p[1]])), 0, false),
456
+ };
457
+ const layer = prepareJoinLayer(polygons, meshEpsilon, limits, work, layerOptions);
458
+ // Prepared nodes retain their incident support planes, avoiding a second spatial guess at creases.
459
+ const chartHeight = (value) => value ?? fail("Join layer has no supporting chart plane.", "support");
460
+ // A guarded witness can miss a void immediately under the selected face. Prove the complete
461
+ // numerical foot before adding material, retaining its exact boundary and affine support faces.
462
+ const footMesh = layer.supportBand(epsilon * 8);
463
+ validateSolidMesh(footMesh);
464
+ const footNative = toNative(footMesh);
465
+ const missingFoot = own(own(footNative.subtract(support)).subtract(neck));
466
+ if (!missingFoot.isEmpty()) {
467
+ // Native subtraction can retain zero-thickness contact sheets. Bound each component at
468
+ // Double roundoff, never by the larger construction allowance or another component's area.
469
+ const missingComponents = missingFoot.decompose().map(own);
470
+ if (missingComponents.length === 0)
471
+ fail("Numerical connection containment could not be established.", "support");
472
+ for (const missing of missingComponents) {
473
+ work.use();
474
+ const bounds = missing.boundingBox();
475
+ if (![...bounds.min, ...bounds.max].every(Number.isFinite))
476
+ fail("Numerical connection containment could not be established.", "support");
477
+ const arithmetic = Number.EPSILON *
478
+ 64 *
479
+ Math.max(chartArithmeticScale, ...bounds.min.map(Math.abs), ...bounds.max.map(Math.abs));
480
+ const roundoff = Math.min(arithmetic, support.tolerance(), neck.tolerance());
481
+ // Measure around the component, avoiding cancellation against global chart coordinates.
482
+ const center = bounds.min.map((value, axis) => value / 2 + bounds.max[axis] / 2);
483
+ const centered = own(missing.warpBatch((positions, count) => {
484
+ work.use(count);
485
+ for (let i = 0; i < positions.length; i++)
486
+ positions[i] = positions[i] - center[i % 3];
487
+ }));
488
+ const volume = Math.abs(centered.volume());
489
+ const area = missing.surfaceArea();
490
+ if (![roundoff, volume, area].every(Number.isFinite) || roundoff < 0 || area < 0)
491
+ fail("Numerical connection containment could not be established.", "support");
492
+ if (volume > area * roundoff)
493
+ fail("Support material must fill the complete numerical connection foot.", "support");
494
+ }
495
+ }
496
+ const collarMesh = layer.build(
497
+ // Begin inside the proven support witness, fading the extraction allowance to zero at the wall.
498
+ // This avoids nearly coincident foot slivers when the native Boolean meets its Float32 chart.
499
+ (p, value) => chartHeight(value) + rise(p) * (effectiveRise / height) - epsilon * 2, (_p, value) => chartHeight(value) - epsilon * 8, policy.maxSegmentLength);
500
+ validateSolidMesh(collarMesh);
501
+ const collar = toNative(collarMesh);
502
+ const worldCollar = own(collar.transform(forward));
503
+ // Construction adds a collar; neither supplied operand is trimmed, moved, or reconstructed.
504
+ const combined = own(module.Manifold.union([originalBase, originalFeature, worldCollar]));
505
+ assertNativeSolidStatus(combined, "join");
506
+ return environment.wrapSolid(combined);
507
+ };
508
+ }
@@ -1,7 +1,7 @@
1
- import { GeometryError } from "../geometry/errors.js";
2
- import { resolveKnuckleHinge } from "../geometry/mechanical/knuckle-hinge.js";
3
- import { assertPrimitiveOptions } from "../geometry/primitive-resolvers.js";
4
- import { assertSamplingCount } from "../geometry/sampling-limits.js";
1
+ import { GeometryError } from "../../geometry/errors.js";
2
+ import { resolveKnuckleHinge } from "../../geometry/mechanical/knuckle-hinge.js";
3
+ import { assertPrimitiveOptions } from "../../geometry/primitive-resolvers.js";
4
+ import { assertSamplingCount } from "../../geometry/sampling-limits.js";
5
5
  /** Composes existing scoped operations after resolving both halves against one host policy. */
6
6
  export function createKnuckleHingeOperation(environment, operations) {
7
7
  return (options) => {
@@ -1,13 +1,16 @@
1
- import { GeometryError } from "../geometry/errors.js";
2
- import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../geometry/loft/loft-geometry.js";
3
- import { loftFrame, resolveLoftControls } from "../geometry/loft/loft-options.js";
4
- import { simpleLoftMesh } from "../geometry/loft/loft-simple-mesh.js";
5
- import { analyzeTriangleMesh } from "../geometry/mesh/mesh.js";
6
- import { capturePath2Input, path2InputData, } from "../geometry/paths/path-value.js";
7
- import { assertSamplingCount } from "../geometry/sampling-limits.js";
8
- import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitive-profiles.js";
9
- import { buildProfileLoftMesh } from "./profile-mesh.js";
10
- const explicitProfile = (value) => typeof value === "object" && value !== null && "components" in value;
1
+ import { GeometryError } from "../../geometry/errors.js";
2
+ import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../../geometry/loft/loft-geometry.js";
3
+ import { loftFrame, resolveLoftControls } from "../../geometry/loft/loft-options.js";
4
+ import { simpleLoftMesh } from "../../geometry/loft/loft-simple-mesh.js";
5
+ import { analyzeTriangleMesh } from "../../geometry/mesh/mesh.js";
6
+ import { capturePath2Input, path2InputData, } from "../../geometry/paths/path-value.js";
7
+ import { assertSamplingCount, } from "../../geometry/sampling-limits.js";
8
+ import { buildProfileLoftMesh } from "./primitives/profile-mesh.js";
9
+ import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitives/profiles.js";
10
+ const explicitProfile = (value) => typeof value === "object" &&
11
+ value !== null &&
12
+ "components" in value &&
13
+ Array.isArray(value.components);
11
14
  const pointProfile = (value) => Array.isArray(value) || (typeof value === "object" && value !== null && "toData" in value);
12
15
  const fail = (message) => {
13
16
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: "loft" });
@@ -124,8 +127,6 @@ export function createLoftOperation(environment, solidFromMesh) {
124
127
  selected = environment.withResolutionDefaults({ ...value, limits: sampling });
125
128
  recipeSampled = sources.map((source) => source !== undefined);
126
129
  const known = sources.every((source) => source !== undefined);
127
- if (value.correspondence === undefined && !known)
128
- fail("Arbitrary Sections and point loops require an explicit correspondence method for loft.");
129
130
  const family = value.correspondence === undefined && known
130
131
  ? sources.every((source) => source.family === sources[0].family)
131
132
  ? sources
@@ -1,5 +1,5 @@
1
- import { createKnuckleHingeOperation } from "./knuckle-hinge-operation.js";
2
- import * as kernel from "./native/index.js";
1
+ import * as kernel from "../native/index.js";
2
+ import { createKnuckleHingeOperation } from "./knuckle-hinge.js";
3
3
  /** Internal host-bound mechanical operations. */
4
4
  export function createMechanicalOperations(environment, construction) {
5
5
  const { resolution } = environment;
@@ -1,7 +1,7 @@
1
- import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../geometry/patterns/placements.js";
2
- import { assertSamplingCount } from "../geometry/sampling-limits.js";
3
- import { restrictTransform3 } from "../geometry/transform2.js";
4
- import { IDENTITY_TRANSFORM3 } from "../geometry/transform3.js";
1
+ import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../../geometry/patterns/placements.js";
2
+ import { assertSamplingCount } from "../../geometry/sampling-limits.js";
3
+ import { restrictTransform3 } from "../../geometry/transform2.js";
4
+ import { IDENTITY_TRANSFORM3 } from "../../geometry/transform3.js";
5
5
  /** Private pattern owner; all copies use the shared transform/metadata/lifetime path. */
6
6
  export function createPatternOperations(environment, transforms) {
7
7
  const apply = (source, makePlan, operation) => {
@@ -1,9 +1,13 @@
1
- import { anchor3, boxAnchor3 } from "../geometry/anchors.js";
2
- import { resolveCylinderRadii } from "../geometry/cylinder.js";
1
+ import { anchor3, boxAnchor3 } from "../../../geometry/anchors.js";
2
+ import { resolveCylinderRadii } from "../../../geometry/cylinder.js";
3
+ import { vector3Data } from "../../../geometry/math/vector-value.js";
4
+ import { resolveTubeRadii } from "../../../geometry/primitive-resolvers.js";
3
5
  const faces = ["left", "right", "back", "front", "bottom", "top"];
4
6
  /** Nominal primitive datums; construction validates dimensions before these factories run. */
5
7
  export function boxAnchors(options) {
6
- const size = typeof options.size === "number" ? [options.size, options.size, options.size] : options.size;
8
+ const size = typeof options.size === "number"
9
+ ? [options.size, options.size, options.size]
10
+ : vector3Data(options.size);
7
11
  const center = options.center === false ? [size[0] / 2, size[1] / 2, size[2] / 2] : [0, 0, 0];
8
12
  return {
9
13
  center: anchor3(center, [0, 0, 1]),
@@ -39,7 +43,8 @@ export function cylinderAnchors(options) {
39
43
  }
40
44
  /** Tube cap centers lie on the nominal cap planes, including the central opening. */
41
45
  export function tubeAnchors(options) {
42
- return axialAnchors([options.outerRadius, options.outerRadius], options.height, options.center ?? true);
46
+ const { outerRadius } = resolveTubeRadii(options);
47
+ return axialAnchors([outerRadius, outerRadius], options.height, options.center ?? true);
43
48
  }
44
49
  /** Sphere principal surface points and its origin reference. */
45
50
  export function sphereAnchors(options) {