@metamesh/modeling 0.18.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 (843) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +73 -57
  3. package/dist/api/engine.d.ts +7 -47
  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 +7 -7
  9. package/dist/api/index.d.ts +85 -35
  10. package/dist/api/mesh.d.ts +35 -6
  11. package/dist/docs/guides/concepts.md +32 -535
  12. package/dist/docs/guides/fonts.md +4 -4
  13. package/dist/docs/guides/generation.md +52 -45
  14. package/dist/docs/guides/geometry-values.md +193 -0
  15. package/dist/docs/guides/hosting.md +53 -30
  16. package/dist/docs/guides/profiles-and-extrusion.md +252 -0
  17. package/dist/docs/guides/recipes.md +33 -780
  18. package/dist/docs/guides/resolution-and-inspection.md +133 -0
  19. package/dist/docs/guides/solid-joins.md +126 -0
  20. package/dist/docs/guides/standalone-model.md +1 -1
  21. package/dist/docs/guides/svg-and-text.md +215 -0
  22. package/dist/docs/guides/sweeps-and-lofts.md +179 -0
  23. package/dist/docs/guides/transforms-and-placement.md +313 -0
  24. package/dist/docs/manifest.json +2818 -5862
  25. package/dist/docs/reference/engine/GenerationOptions.md +10 -4
  26. package/dist/docs/reference/engine/GeometryResource.md +8 -2
  27. package/dist/docs/reference/engine/ModelDependencies.md +9 -3
  28. package/dist/docs/reference/engine/ModelEngine.md +9 -3
  29. package/dist/docs/reference/engine/ModelEngineOptions.md +9 -3
  30. package/dist/docs/reference/engine/ModelPart.md +9 -3
  31. package/dist/docs/reference/engine/ModelResult.md +8 -2
  32. package/dist/docs/reference/engine/ModelRunArguments.md +7 -1
  33. package/dist/docs/reference/engine/ModelRunOptions.md +10 -4
  34. package/dist/docs/reference/engine/ModelSession.md +7 -1
  35. package/dist/docs/reference/engine/SessionOptions.md +10 -4
  36. package/dist/docs/reference/engine/categories/host-lifecycle.md +3 -8
  37. package/dist/docs/reference/engine/checkModel.md +7 -1
  38. package/dist/docs/reference/engine/createModelEngine.md +10 -3
  39. package/dist/docs/reference/engine/defaultModelingLimits.md +9 -3
  40. package/dist/docs/reference/engine/modelingWasmUrl.md +7 -1
  41. package/dist/docs/reference/engine.md +7 -7
  42. package/dist/docs/reference/export/Export3mfOptions.md +24 -0
  43. package/dist/docs/reference/export/ExportDiagnostic.md +59 -0
  44. package/dist/docs/reference/export/ExportFormat.md +25 -0
  45. package/dist/docs/reference/export/ExportGeometry.md +39 -0
  46. package/dist/docs/reference/export/ExportGlbOptions.md +118 -0
  47. package/dist/docs/reference/export/ExportLimits.md +83 -0
  48. package/dist/docs/reference/export/ExportMaterial.md +47 -0
  49. package/dist/docs/reference/export/ExportOptions.md +94 -0
  50. package/dist/docs/reference/export/ExportPart.md +88 -0
  51. package/dist/docs/reference/export/ExportReport.md +82 -0
  52. package/dist/docs/reference/export/ExportSink.md +39 -0
  53. package/dist/docs/reference/export/ExportStlOptions.md +24 -0
  54. package/dist/docs/reference/export/ExportedFile.md +110 -0
  55. package/dist/docs/reference/export/categories/mesh-serialization.md +47 -0
  56. package/dist/docs/reference/export/defaultExportLimits.md +20 -0
  57. package/dist/docs/reference/export/export3mf.md +64 -0
  58. package/dist/docs/reference/export/exportGlb.md +68 -0
  59. package/dist/docs/reference/export/exportStl.md +64 -0
  60. package/dist/docs/reference/export/write3mf.md +71 -0
  61. package/dist/docs/reference/export/writeGlb.md +75 -0
  62. package/dist/docs/reference/export/writeStl.md +71 -0
  63. package/dist/docs/reference/export.md +21 -0
  64. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +16 -2
  65. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +7 -1
  66. package/dist/docs/reference/geometry/Anchor3-type.md +13 -3
  67. package/dist/docs/reference/geometry/ArcCurve2.md +8 -2
  68. package/dist/docs/reference/geometry/ArcCurve3.md +8 -2
  69. package/dist/docs/reference/geometry/AttachOptions.md +13 -3
  70. package/dist/docs/reference/geometry/AxisAngleRotation3.md +9 -3
  71. package/dist/docs/reference/geometry/Bevel.md +16 -2
  72. package/dist/docs/reference/geometry/BevelSize.md +16 -2
  73. package/dist/docs/reference/geometry/Bounds2-type.md +18 -4
  74. package/dist/docs/reference/geometry/Bounds2Data.md +22 -4
  75. package/dist/docs/reference/geometry/Bounds2Input.md +18 -4
  76. package/dist/docs/reference/geometry/Bounds2Options.md +14 -4
  77. package/dist/docs/reference/geometry/Bounds3-type.md +18 -4
  78. package/dist/docs/reference/geometry/Bounds3Data.md +18 -4
  79. package/dist/docs/reference/geometry/Bounds3Input.md +18 -4
  80. package/dist/docs/reference/geometry/Bounds3Options.md +14 -4
  81. package/dist/docs/reference/geometry/BoundsFit2.md +10 -4
  82. package/dist/docs/reference/geometry/BoundsFit3.md +10 -4
  83. package/dist/docs/reference/geometry/BoundsFitOptions.md +10 -4
  84. package/dist/docs/reference/geometry/BoxAnchorFace.md +9 -3
  85. package/dist/docs/reference/geometry/BoxAnchorOptions.md +9 -3
  86. package/dist/docs/reference/geometry/BoxEdge.md +11 -1
  87. package/dist/docs/reference/geometry/BoxEdgeSelection.md +11 -1
  88. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +11 -1
  89. package/dist/docs/reference/geometry/BoxOptions.md +11 -1
  90. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +16 -2
  91. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +16 -2
  92. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +11 -1
  93. package/dist/docs/reference/geometry/CircleContourOptions.md +12 -2
  94. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +15 -1
  95. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -1
  96. package/dist/docs/reference/geometry/CircularSampling.md +7 -1
  97. package/dist/docs/reference/geometry/CircularSamplingOptions.md +7 -1
  98. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +8 -2
  99. package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -2
  100. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +8 -2
  101. package/dist/docs/reference/geometry/Contour.md +12 -2
  102. package/dist/docs/reference/geometry/ContourCurve.md +8 -2
  103. package/dist/docs/reference/geometry/ContourPoint.md +8 -2
  104. package/dist/docs/reference/geometry/ContourSegment.md +8 -2
  105. package/dist/docs/reference/geometry/CorrespondingComponent.md +12 -2
  106. package/dist/docs/reference/geometry/CorrespondingContour.md +12 -2
  107. package/dist/docs/reference/geometry/CorrespondingProfile.md +12 -2
  108. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +12 -2
  109. package/dist/docs/reference/geometry/CubicBezierCurve2.md +8 -2
  110. package/dist/docs/reference/geometry/CubicBezierCurve3.md +8 -2
  111. package/dist/docs/reference/geometry/Curve2.md +8 -2
  112. package/dist/docs/reference/geometry/Curve3.md +8 -2
  113. package/dist/docs/reference/geometry/CurveSamplingOptions.md +16 -2
  114. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +16 -2
  115. package/dist/docs/reference/geometry/CylinderAnchorFace.md +9 -3
  116. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -3
  117. package/dist/docs/reference/geometry/CylinderOptions.md +11 -1
  118. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -2
  119. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -2
  120. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +8 -2
  121. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +8 -2
  122. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +8 -2
  123. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +8 -2
  124. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +8 -2
  125. package/dist/docs/reference/geometry/CylindricalGearSpec.md +8 -2
  126. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -1
  127. package/dist/docs/reference/geometry/EdgeTreatment.md +11 -1
  128. package/dist/docs/reference/geometry/EllipseContourOptions.md +12 -2
  129. package/dist/docs/reference/geometry/EndTreatments.md +12 -2
  130. package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +16 -2
  131. package/dist/docs/reference/geometry/ExtrudeOptions.md +13 -3
  132. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +16 -2
  133. package/dist/docs/reference/geometry/FittedTextLayout.md +8 -2
  134. package/dist/docs/reference/geometry/Frame3.md +16 -2
  135. package/dist/docs/reference/geometry/GeometryError.md +11 -1
  136. package/dist/docs/reference/geometry/GeometryErrorCode.md +11 -1
  137. package/dist/docs/reference/geometry/GeometryErrorContext.md +11 -1
  138. package/dist/docs/reference/geometry/GeometryResolution.md +15 -1
  139. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +16 -2
  140. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +15 -1
  141. package/dist/docs/reference/geometry/GridPatternOptions.md +12 -2
  142. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +12 -2
  143. package/dist/docs/reference/geometry/HeightfieldOptions.md +16 -2
  144. package/dist/docs/reference/geometry/HeightfieldPreflight.md +12 -2
  145. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +9 -3
  146. package/dist/docs/reference/geometry/ImmutableBuffer-type.md +16 -14
  147. package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +17 -3
  148. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +12 -2
  149. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +12 -2
  150. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +8 -2
  151. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +8 -2
  152. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +12 -2
  153. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +12 -2
  154. package/dist/docs/reference/geometry/LineCurve2.md +8 -2
  155. package/dist/docs/reference/geometry/LineCurve3.md +8 -2
  156. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -2
  157. package/dist/docs/reference/geometry/LoftCorrespondence.md +16 -2
  158. package/dist/docs/reference/geometry/LoftMeshStation.md +12 -2
  159. package/dist/docs/reference/geometry/LoftOptions.md +16 -2
  160. package/dist/docs/reference/geometry/LoftPlacement.md +16 -2
  161. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +8 -2
  162. package/dist/docs/reference/geometry/MatchProfilesOptions.md +12 -2
  163. package/dist/docs/reference/geometry/MetricFastenerSize.md +8 -2
  164. package/dist/docs/reference/geometry/MetricFastenerStandard.md +8 -2
  165. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +8 -2
  166. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +8 -2
  167. package/dist/docs/reference/geometry/ModelingLimits.md +19 -1
  168. package/dist/docs/reference/geometry/NumericArray.md +16 -2
  169. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +8 -2
  170. package/dist/docs/reference/geometry/Path2-type.md +16 -2
  171. package/dist/docs/reference/geometry/Path2Data.md +16 -2
  172. package/dist/docs/reference/geometry/Path2Input.md +16 -2
  173. package/dist/docs/reference/geometry/Path3-type.md +16 -2
  174. package/dist/docs/reference/geometry/Path3Data.md +16 -2
  175. package/dist/docs/reference/geometry/Path3Input.md +16 -2
  176. package/dist/docs/reference/geometry/PathFrame.md +8 -2
  177. package/dist/docs/reference/geometry/PathLocation.md +16 -2
  178. package/dist/docs/reference/geometry/PathNormalGuide.md +16 -2
  179. package/dist/docs/reference/geometry/PathOptions.md +12 -2
  180. package/dist/docs/reference/geometry/PathPatternOptions.md +12 -2
  181. package/dist/docs/reference/geometry/PathPlacement.md +8 -2
  182. package/dist/docs/reference/geometry/PathResamplingOptions.md +16 -2
  183. package/dist/docs/reference/geometry/Pivot2Options.md +17 -3
  184. package/dist/docs/reference/geometry/Pivot3Options.md +17 -3
  185. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +12 -2
  186. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +12 -2
  187. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +12 -2
  188. package/dist/docs/reference/geometry/PlanarPatchQuality.md +12 -2
  189. package/dist/docs/reference/geometry/PolygonData.md +12 -2
  190. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -2
  191. package/dist/docs/reference/geometry/PrimitiveAttachment.md +11 -1
  192. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +11 -1
  193. package/dist/docs/reference/geometry/PrintableThreadFit.md +12 -2
  194. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +12 -2
  195. package/dist/docs/reference/geometry/Profile.md +8 -2
  196. package/dist/docs/reference/geometry/ProfileComponent2.md +12 -2
  197. package/dist/docs/reference/geometry/ProfileContour2.md +12 -2
  198. package/dist/docs/reference/geometry/ProfileSpan2.md +12 -2
  199. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +11 -1
  200. package/dist/docs/reference/geometry/RackPitchDimensions.md +8 -2
  201. package/dist/docs/reference/geometry/RackPitchSpec.md +8 -2
  202. package/dist/docs/reference/geometry/RadialPatternOptions.md +12 -2
  203. package/dist/docs/reference/geometry/RadialSizing.md +11 -1
  204. package/dist/docs/reference/geometry/RadialSizingOptions.md +11 -1
  205. package/dist/docs/reference/geometry/RectangleContourOptions.md +12 -2
  206. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +12 -2
  207. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +12 -2
  208. package/dist/docs/reference/geometry/RectangleProfileOptions.md +8 -2
  209. package/dist/docs/reference/geometry/RegionData.md +12 -2
  210. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +8 -2
  211. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +7 -1
  212. package/dist/docs/reference/geometry/RevolveOptions.md +16 -2
  213. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +11 -1
  214. package/dist/docs/reference/geometry/RowLayoutOptions.md +10 -4
  215. package/dist/docs/reference/geometry/SampleContourOptions.md +8 -2
  216. package/dist/docs/reference/geometry/SampleHelixOptions.md +8 -2
  217. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +8 -2
  218. package/dist/docs/reference/geometry/SampledCurve2.md +8 -2
  219. package/dist/docs/reference/geometry/SampledCurve3.md +8 -2
  220. package/dist/docs/reference/geometry/SampledThreadHelices.md +8 -2
  221. package/dist/docs/reference/geometry/SideProfileCurve.md +8 -2
  222. package/dist/docs/reference/geometry/SideProfilePoint.md +8 -2
  223. package/dist/docs/reference/geometry/SideProfileSegment.md +8 -2
  224. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +11 -1
  225. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +12 -2
  226. package/dist/docs/reference/geometry/SphereOptions.md +11 -1
  227. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +16 -2
  228. package/dist/docs/reference/geometry/StarContourOptions.md +12 -2
  229. package/dist/docs/reference/geometry/StrokeCap.md +12 -2
  230. package/dist/docs/reference/geometry/StrokeJoin.md +12 -2
  231. package/dist/docs/reference/geometry/StrokeOptions.md +12 -2
  232. package/dist/docs/reference/geometry/SvgImportOptions.md +8 -2
  233. package/dist/docs/reference/geometry/SvgRegionPreflight.md +8 -2
  234. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +8 -2
  235. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +8 -2
  236. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +8 -2
  237. package/dist/docs/reference/geometry/SweepOptions.md +16 -2
  238. package/dist/docs/reference/geometry/SweepOrientation.md +16 -2
  239. package/dist/docs/reference/geometry/ThreadBevelOptions.md +12 -2
  240. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +8 -2
  241. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +8 -2
  242. package/dist/docs/reference/geometry/ThreadEndStyle.md +16 -2
  243. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +16 -2
  244. package/dist/docs/reference/geometry/ThreadHandedness.md +16 -2
  245. package/dist/docs/reference/geometry/ThreadHelixOptions.md +8 -2
  246. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +16 -2
  247. package/dist/docs/reference/geometry/ThreadLeadInShape.md +16 -2
  248. package/dist/docs/reference/geometry/ThreadProfile-type.md +16 -2
  249. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +16 -2
  250. package/dist/docs/reference/geometry/ThreadProfileSpec.md +16 -2
  251. package/dist/docs/reference/geometry/ThreadRidgeOptions.md +16 -2
  252. package/dist/docs/reference/geometry/ThreadRole.md +8 -2
  253. package/dist/docs/reference/geometry/ThreadSolidOptions.md +12 -2
  254. package/dist/docs/reference/geometry/ThreadSolidPreflight.md +16 -2
  255. package/dist/docs/reference/geometry/ThreadedNutOptions.md +12 -2
  256. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +12 -2
  257. package/dist/docs/reference/geometry/ThreadedNutShape.md +12 -2
  258. package/dist/docs/reference/geometry/ThreadedRodOptions.md +12 -2
  259. package/dist/docs/reference/geometry/TorusOptions.md +11 -1
  260. package/dist/docs/reference/geometry/Transform2-type.md +17 -3
  261. package/dist/docs/reference/geometry/Transform2Data.md +17 -3
  262. package/dist/docs/reference/geometry/Transform2Input.md +17 -3
  263. package/dist/docs/reference/geometry/Transform3-type.md +17 -3
  264. package/dist/docs/reference/geometry/Transform3Data.md +17 -3
  265. package/dist/docs/reference/geometry/Transform3Input.md +17 -3
  266. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +16 -2
  267. package/dist/docs/reference/geometry/TriangleMesh.md +20 -2
  268. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +16 -2
  269. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +12 -2
  270. package/dist/docs/reference/geometry/TriangleMeshInput.md +12 -2
  271. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +16 -2
  272. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +12 -2
  273. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +12 -2
  274. package/dist/docs/reference/geometry/TriangleMeshSignature.md +12 -2
  275. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +12 -2
  276. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +12 -2
  277. package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +16 -2
  278. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +12 -2
  279. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +16 -2
  280. package/dist/docs/reference/geometry/TubeOptions.md +11 -1
  281. package/dist/docs/reference/geometry/Vector2-type.md +17 -3
  282. package/dist/docs/reference/geometry/Vector2Data.md +21 -3
  283. package/dist/docs/reference/geometry/Vector2Input.md +17 -3
  284. package/dist/docs/reference/geometry/Vector3-type.md +17 -3
  285. package/dist/docs/reference/geometry/Vector3Data.md +17 -3
  286. package/dist/docs/reference/geometry/Vector3Input.md +17 -3
  287. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +12 -2
  288. package/dist/docs/reference/geometry/VectorTextLayout.md +16 -2
  289. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +12 -2
  290. package/dist/docs/reference/geometry/VectorTextMetrics.md +16 -2
  291. package/dist/docs/reference/geometry/VectorTextOptions.md +12 -2
  292. package/dist/docs/reference/geometry/add2.md +9 -3
  293. package/dist/docs/reference/geometry/add3.md +9 -3
  294. package/dist/docs/reference/geometry/anchor3.md +9 -3
  295. package/dist/docs/reference/geometry/anchorFrame3.md +8 -2
  296. package/dist/docs/reference/geometry/applyTransformDirection3.md +9 -3
  297. package/dist/docs/reference/geometry/applyTransformPoint3.md +9 -3
  298. package/dist/docs/reference/geometry/attachmentTransform3.md +9 -3
  299. package/dist/docs/reference/geometry/bounds2.md +16 -6
  300. package/dist/docs/reference/geometry/bounds3.md +16 -6
  301. package/dist/docs/reference/geometry/boundsCenter.md +10 -4
  302. package/dist/docs/reference/geometry/boundsSize.md +10 -4
  303. package/dist/docs/reference/geometry/boxAnchor3.md +9 -3
  304. package/dist/docs/reference/geometry/categories/bounds-layout.md +4 -4
  305. package/dist/docs/reference/geometry/categories/curves-paths.md +2 -2
  306. package/dist/docs/reference/geometry/categories/mechanical.md +2 -2
  307. package/dist/docs/reference/geometry/categories/meshes.md +3 -3
  308. package/dist/docs/reference/geometry/categories/pattern-placement.md +2 -2
  309. package/dist/docs/reference/geometry/categories/primitive-options.md +2 -2
  310. package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -2
  311. package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
  312. package/dist/docs/reference/geometry/categories/transforms-math.md +3 -3
  313. package/dist/docs/reference/geometry/categories/vector-import.md +2 -2
  314. package/dist/docs/reference/geometry/circleContour.md +8 -2
  315. package/dist/docs/reference/geometry/closeToAxis.md +8 -2
  316. package/dist/docs/reference/geometry/compensateThreadDiameters.md +8 -2
  317. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +8 -2
  318. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +8 -2
  319. package/dist/docs/reference/geometry/composeTransform3.md +9 -3
  320. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +8 -2
  321. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -2
  322. package/dist/docs/reference/geometry/contourContainsPoint.md +8 -2
  323. package/dist/docs/reference/geometry/cross2.md +9 -3
  324. package/dist/docs/reference/geometry/cross3.md +9 -3
  325. package/dist/docs/reference/geometry/cylinderAnchor3.md +9 -3
  326. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +8 -2
  327. package/dist/docs/reference/geometry/distance2.md +9 -3
  328. package/dist/docs/reference/geometry/distance3.md +9 -3
  329. package/dist/docs/reference/geometry/distributeAlongPath.md +8 -2
  330. package/dist/docs/reference/geometry/dot2.md +9 -3
  331. package/dist/docs/reference/geometry/dot3.md +9 -3
  332. package/dist/docs/reference/geometry/ellipseContour.md +8 -2
  333. package/dist/docs/reference/geometry/eulerTransform3.md +9 -3
  334. package/dist/docs/reference/geometry/fitBounds.md +10 -4
  335. package/dist/docs/reference/geometry/fitTextLayout.md +8 -2
  336. package/dist/docs/reference/geometry/frameTransform3.md +9 -3
  337. package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +8 -2
  338. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +8 -2
  339. package/dist/docs/reference/geometry/gridPatternTransforms.md +8 -2
  340. package/dist/docs/reference/geometry/immutableBuffer.md +12 -2
  341. package/dist/docs/reference/geometry/inverseTransform3.md +9 -3
  342. package/dist/docs/reference/geometry/isGeometryError.md +11 -1
  343. package/dist/docs/reference/geometry/layoutRow.md +10 -4
  344. package/dist/docs/reference/geometry/length2.md +9 -3
  345. package/dist/docs/reference/geometry/length3.md +9 -3
  346. package/dist/docs/reference/geometry/lerp2.md +9 -3
  347. package/dist/docs/reference/geometry/lerp3.md +9 -3
  348. package/dist/docs/reference/geometry/linearPatternTransforms.md +8 -2
  349. package/dist/docs/reference/geometry/matchProfiles.md +8 -2
  350. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +8 -2
  351. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +8 -2
  352. package/dist/docs/reference/geometry/normalize2.md +9 -3
  353. package/dist/docs/reference/geometry/normalize3.md +9 -3
  354. package/dist/docs/reference/geometry/normalizeContour.md +8 -2
  355. package/dist/docs/reference/geometry/normalizePolygon.md +8 -2
  356. package/dist/docs/reference/geometry/normalizeRegion.md +8 -2
  357. package/dist/docs/reference/geometry/path2.md +12 -2
  358. package/dist/docs/reference/geometry/path3.md +12 -2
  359. package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -2
  360. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +8 -2
  361. package/dist/docs/reference/geometry/preflightSvgRegion.md +8 -2
  362. package/dist/docs/reference/geometry/preflightThreadedNut.md +8 -2
  363. package/dist/docs/reference/geometry/preflightThreadedRod.md +8 -2
  364. package/dist/docs/reference/geometry/projectOntoPlane3.md +9 -3
  365. package/dist/docs/reference/geometry/radialPatternTransforms.md +8 -2
  366. package/dist/docs/reference/geometry/rectangleContour.md +8 -2
  367. package/dist/docs/reference/geometry/rectangleProfile.md +8 -2
  368. package/dist/docs/reference/geometry/regionArea.md +8 -2
  369. package/dist/docs/reference/geometry/regionBounds.md +8 -2
  370. package/dist/docs/reference/geometry/regularPolygonContour.md +8 -2
  371. package/dist/docs/reference/geometry/resamplePolyline2.md +8 -2
  372. package/dist/docs/reference/geometry/resamplePolyline3.md +8 -2
  373. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +7 -1
  374. package/dist/docs/reference/geometry/resolveArcSegments.md +7 -1
  375. package/dist/docs/reference/geometry/resolveCircularSampling.md +7 -1
  376. package/dist/docs/reference/geometry/resolveCircularSegments.md +7 -1
  377. package/dist/docs/reference/geometry/resolveCylindricalGear.md +8 -2
  378. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +8 -2
  379. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +8 -2
  380. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +8 -2
  381. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +7 -1
  382. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +8 -2
  383. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +8 -2
  384. package/dist/docs/reference/geometry/resolveRackPitch.md +8 -2
  385. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -2
  386. package/dist/docs/reference/geometry/rotate2.md +9 -3
  387. package/dist/docs/reference/geometry/rotationTransform3.md +9 -3
  388. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -2
  389. package/dist/docs/reference/geometry/sampleContour.md +8 -2
  390. package/dist/docs/reference/geometry/sampleCurve2.md +8 -2
  391. package/dist/docs/reference/geometry/sampleCurve3.md +8 -2
  392. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +8 -2
  393. package/dist/docs/reference/geometry/sampleHelix.md +8 -2
  394. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +8 -2
  395. package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -2
  396. package/dist/docs/reference/geometry/sampleSideProfile.md +8 -2
  397. package/dist/docs/reference/geometry/sampleTextContours.md +8 -2
  398. package/dist/docs/reference/geometry/sampleThreadHelices.md +8 -2
  399. package/dist/docs/reference/geometry/scale2.md +9 -3
  400. package/dist/docs/reference/geometry/scale3.md +9 -3
  401. package/dist/docs/reference/geometry/scaleTransform3.md +9 -3
  402. package/dist/docs/reference/geometry/signedContourArea.md +8 -2
  403. package/dist/docs/reference/geometry/starContour.md +8 -2
  404. package/dist/docs/reference/geometry/strokeRegionData.md +8 -2
  405. package/dist/docs/reference/geometry/subtract2.md +9 -3
  406. package/dist/docs/reference/geometry/subtract3.md +9 -3
  407. package/dist/docs/reference/geometry/threadProfile.md +8 -2
  408. package/dist/docs/reference/geometry/transform2.md +13 -3
  409. package/dist/docs/reference/geometry/transform3.md +13 -3
  410. package/dist/docs/reference/geometry/transformDeterminant3.md +9 -3
  411. package/dist/docs/reference/geometry/transformRegionData.md +8 -2
  412. package/dist/docs/reference/geometry/translationTransform3.md +9 -3
  413. package/dist/docs/reference/geometry/triangulateContour.md +8 -2
  414. package/dist/docs/reference/geometry/validateRigidTransform3.md +9 -3
  415. package/dist/docs/reference/geometry/validateTransform3.md +9 -3
  416. package/dist/docs/reference/geometry/vector2.md +13 -3
  417. package/dist/docs/reference/geometry/vector3.md +13 -3
  418. package/dist/docs/reference/geometry.md +2 -2
  419. package/dist/docs/reference/mesh/MeshRenderOptions.md +28 -0
  420. package/dist/docs/reference/mesh/RenderMesh.md +68 -0
  421. package/dist/docs/reference/mesh/analyze.md +12 -6
  422. package/dist/docs/reference/mesh/analyzeQuality.md +11 -5
  423. package/dist/docs/reference/mesh/bounds.md +10 -4
  424. package/dist/docs/reference/mesh/categories/operations.md +5 -95
  425. package/dist/docs/reference/mesh/centroid.md +10 -4
  426. package/dist/docs/reference/mesh/extrude.md +11 -5
  427. package/dist/docs/reference/mesh/heightfield.md +11 -5
  428. package/dist/docs/reference/mesh/immutable.md +13 -9
  429. package/dist/docs/reference/mesh/join.md +10 -4
  430. package/dist/docs/reference/mesh/loft.md +11 -5
  431. package/dist/docs/reference/mesh/optimizePlanarPatches.md +11 -5
  432. package/dist/docs/reference/mesh/preflightHeightfield.md +11 -5
  433. package/dist/docs/reference/mesh/preflightThreadSolid.md +10 -4
  434. package/dist/docs/reference/mesh/render.md +57 -0
  435. package/dist/docs/reference/mesh/reverse.md +10 -4
  436. package/dist/docs/reference/mesh/revolve.md +11 -5
  437. package/dist/docs/reference/mesh/signature.md +11 -5
  438. package/dist/docs/reference/mesh/sweep.md +12 -6
  439. package/dist/docs/reference/mesh/threadRidge.md +10 -4
  440. package/dist/docs/reference/mesh/threadSolid.md +10 -4
  441. package/dist/docs/reference/mesh/transform.md +11 -5
  442. package/dist/docs/reference/mesh/validate.md +10 -4
  443. package/dist/docs/reference/mesh/validateSolid.md +10 -4
  444. package/dist/docs/reference/mesh.md +1 -1
  445. package/dist/docs/reference/model/CircleOptions.md +13 -7
  446. package/dist/docs/reference/model/DiagnosticOptions.md +7 -1
  447. package/dist/docs/reference/model/EllipseOptions.md +13 -7
  448. package/dist/docs/reference/model/GenerateCallback.md +7 -1
  449. package/dist/docs/reference/model/GenerateContext.md +14 -39
  450. package/dist/docs/reference/model/GenerationDiagnostic.md +7 -1
  451. package/dist/docs/reference/model/GenerationError.md +8 -2
  452. package/dist/docs/reference/model/HoleCutterOptions.md +17 -10
  453. package/dist/docs/reference/model/HoleCutterOverrun.md +10 -3
  454. package/dist/docs/reference/model/HoleCutterRecess.md +10 -3
  455. package/dist/docs/reference/model/HullOptions.md +13 -6
  456. package/dist/docs/reference/model/ImmutableValue.md +7 -1
  457. package/dist/docs/reference/model/ImplicitOptions.md +12 -6
  458. package/dist/docs/reference/model/JoinOptions.md +76 -0
  459. package/dist/docs/reference/model/JoinTransition.md +54 -0
  460. package/dist/docs/reference/model/KnuckleHinge-type.md +9 -3
  461. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +7 -1
  462. package/dist/docs/reference/model/KnuckleHingeOptions.md +10 -4
  463. package/dist/docs/reference/model/KnuckleHingeWeb.md +7 -1
  464. package/dist/docs/reference/model/LoftStation.md +16 -9
  465. package/dist/docs/reference/model/Memo.md +54 -0
  466. package/dist/docs/reference/model/ModelProgram.md +7 -1
  467. package/dist/docs/reference/model/PartDeclaration.md +11 -6
  468. package/dist/docs/reference/model/PartGeometry.md +10 -4
  469. package/dist/docs/reference/model/PartOptions.md +11 -6
  470. package/dist/docs/reference/model/PatternSource.md +10 -4
  471. package/dist/docs/reference/model/PlaneOptions.md +11 -4
  472. package/dist/docs/reference/model/PolygonOptions.md +20 -14
  473. package/dist/docs/reference/model/Profile.md +10 -4
  474. package/dist/docs/reference/model/RectangleOptions.md +28 -22
  475. package/dist/docs/reference/model/RegularPolygonOptions.md +13 -7
  476. package/dist/docs/reference/model/Section.md +68 -74
  477. package/dist/docs/reference/model/SectionHullOptions.md +13 -6
  478. package/dist/docs/reference/model/SectionInspection.md +10 -4
  479. package/dist/docs/reference/model/SectionOffsetJoin.md +10 -4
  480. package/dist/docs/reference/model/SectionOffsetOptions.md +12 -6
  481. package/dist/docs/reference/model/Solid.md +101 -53
  482. package/dist/docs/reference/model/SolidInspection.md +10 -4
  483. package/dist/docs/reference/model/SolidSegmentHit.md +11 -5
  484. package/dist/docs/reference/model/StarOptions.md +24 -18
  485. package/dist/docs/reference/model/SvgOrigin.md +10 -4
  486. package/dist/docs/reference/model/SvgPathSectionOptions.md +14 -8
  487. package/dist/docs/reference/model/SvgSectionOptions.md +16 -10
  488. package/dist/docs/reference/model/TextSectionOptions.md +14 -8
  489. package/dist/docs/reference/model/box.md +18 -11
  490. package/dist/docs/reference/model/categories/boolean-operations.md +8 -2
  491. package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -7
  492. package/dist/docs/reference/model/categories/explicit-profiles.md +1 -14
  493. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +6 -20
  494. package/dist/docs/reference/model/categories/generation.md +5 -10
  495. package/dist/docs/reference/model/categories/hinges.md +1 -4
  496. package/dist/docs/reference/model/categories/mesh-inspection.md +2 -6
  497. package/dist/docs/reference/model/categories/primitives.md +5 -21
  498. package/dist/docs/reference/model/categories/sections.md +4 -15
  499. package/dist/docs/reference/model/categories/threads.md +2 -39
  500. package/dist/docs/reference/model/categories/transforms-placement.md +4 -33
  501. package/dist/docs/reference/model/circle.md +10 -4
  502. package/dist/docs/reference/model/cylinder.md +13 -6
  503. package/dist/docs/reference/model/ellipse.md +10 -4
  504. package/dist/docs/reference/model/extrude.md +26 -19
  505. package/dist/docs/reference/model/generate.md +8 -2
  506. package/dist/docs/reference/model/gridPattern.md +15 -9
  507. package/dist/docs/reference/model/heightfield.md +10 -4
  508. package/dist/docs/reference/model/holeCutter.md +10 -3
  509. package/dist/docs/reference/model/hull.md +9 -2
  510. package/dist/docs/reference/model/implicit.md +9 -3
  511. package/dist/docs/reference/model/internalThreadCutter.md +23 -17
  512. package/dist/docs/reference/model/intersect.md +9 -2
  513. package/dist/docs/reference/model/join.md +89 -0
  514. package/dist/docs/reference/model/knuckleHinge.md +7 -1
  515. package/dist/docs/reference/model/linearPattern.md +15 -9
  516. package/dist/docs/reference/model/loft.md +31 -24
  517. package/dist/docs/reference/model/matchProfiles.md +14 -8
  518. package/dist/docs/reference/model/minkowskiSum.md +9 -2
  519. package/dist/docs/reference/model/pathPattern.md +25 -19
  520. package/dist/docs/reference/model/polygon.md +13 -7
  521. package/dist/docs/reference/model/preflightInternalThreadCutter.md +25 -19
  522. package/dist/docs/reference/model/preflightThreadedNut.md +29 -23
  523. package/dist/docs/reference/model/preflightThreadedRod.md +25 -19
  524. package/dist/docs/reference/model/radialPattern.md +15 -9
  525. package/dist/docs/reference/model/rectangle.md +14 -8
  526. package/dist/docs/reference/model/regularPolygon.md +10 -4
  527. package/dist/docs/reference/model/revolve.md +22 -15
  528. package/dist/docs/reference/model/solidFromMesh.md +12 -6
  529. package/dist/docs/reference/model/sphere.md +13 -6
  530. package/dist/docs/reference/model/star.md +12 -6
  531. package/dist/docs/reference/model/stroke.md +21 -15
  532. package/dist/docs/reference/model/svgPathSection.md +12 -6
  533. package/dist/docs/reference/model/svgSection.md +13 -7
  534. package/dist/docs/reference/model/sweep.md +27 -20
  535. package/dist/docs/reference/model/textSection.md +15 -9
  536. package/dist/docs/reference/model/threadRidge.md +21 -15
  537. package/dist/docs/reference/model/threadedNut.md +27 -21
  538. package/dist/docs/reference/model/threadedRod.md +23 -17
  539. package/dist/docs/reference/model/torus.md +20 -13
  540. package/dist/docs/reference/model/tube.md +13 -6
  541. package/dist/docs/reference/model/union.md +9 -2
  542. package/dist/docs/reference/model.md +3 -8
  543. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -1
  544. package/dist/docs/reference/text/VectorFont.md +39 -33
  545. package/dist/docs/reference/text/VectorFontOptions.md +7 -1
  546. package/dist/docs/reference/text/categories/font-preparation.md +1 -13
  547. package/dist/docs/reference/text/prepareVectorFont.md +7 -1
  548. package/dist/docs/reference/text.md +1 -1
  549. package/dist/engine/finalization.js +2 -74
  550. package/dist/engine/index.js +2 -2
  551. package/dist/engine/native/construction-mesh.js +41 -0
  552. package/dist/engine/native/material-components.js +2 -51
  553. package/dist/engine/native/mesh-observation.js +55 -0
  554. package/dist/engine/native/regions.js +2 -1
  555. package/dist/engine/operations/context.js +2 -0
  556. package/dist/engine/operations/extrusion-finishing.js +17 -16
  557. package/dist/engine/operations/join-collar-profile.js +120 -0
  558. package/dist/engine/operations/join.js +508 -0
  559. package/dist/engine/recipe-realization.js +1 -1
  560. package/dist/engine/session/dependencies.js +89 -42
  561. package/dist/engine/session/graph.js +319 -342
  562. package/dist/engine/session/native-cache.js +1 -1
  563. package/dist/engine/session/session.js +5 -5
  564. package/dist/engine/session/snapshot-cache.js +2 -2
  565. package/dist/export/3mf.js +190 -0
  566. package/dist/export/capture.js +178 -0
  567. package/dist/export/glb.js +209 -0
  568. package/dist/export/index.js +5 -0
  569. package/dist/export/limits.js +18 -0
  570. package/dist/export/stl.js +105 -0
  571. package/dist/export/types.js +1 -0
  572. package/dist/export/writer.js +54 -0
  573. package/dist/geometry/bounds-value.js +4 -4
  574. package/dist/geometry/immutable-buffer.js +4 -6
  575. package/dist/geometry/join-geometry.js +839 -0
  576. package/dist/geometry/mesh/mesh-render.js +205 -0
  577. package/dist/geometry/mesh/mesh-solid-intersections.js +43 -17
  578. package/dist/geometry/mesh/mesh-solid.js +6 -2
  579. package/dist/geometry/mesh-api.js +1 -0
  580. package/dist/geometry/region-offset.js +278 -0
  581. package/dist/geometry/regions.js +11 -1
  582. package/dist/model/execution-binding.js +3 -3
  583. package/dist/model/generation.js +2 -2
  584. package/dist/model/immutable-generation-data.js +13 -13
  585. package/dist/model/join.js +1 -0
  586. package/dist/model/operations.js +20 -0
  587. package/dist/model/recipe-declaration.js +1 -0
  588. package/dist/model/shape-handles.js +1 -0
  589. package/package.json +18 -1
  590. package/dist/docs/reference/engine/Export3mfOptions.md +0 -46
  591. package/dist/docs/reference/engine/ExportMeshPart.md +0 -31
  592. package/dist/docs/reference/engine/ModelingLimits.md +0 -121
  593. package/dist/docs/reference/engine/export3mf.md +0 -55
  594. package/dist/docs/reference/mesh/AcmeThreadProfileSpec.md +0 -79
  595. package/dist/docs/reference/mesh/Bevel.md +0 -18
  596. package/dist/docs/reference/mesh/BevelSize.md +0 -14
  597. package/dist/docs/reference/mesh/Bounds2.md +0 -125
  598. package/dist/docs/reference/mesh/Bounds2Data.md +0 -43
  599. package/dist/docs/reference/mesh/Bounds2Input.md +0 -19
  600. package/dist/docs/reference/mesh/Bounds3.md +0 -125
  601. package/dist/docs/reference/mesh/Bounds3Data.md +0 -43
  602. package/dist/docs/reference/mesh/Bounds3Input.md +0 -19
  603. package/dist/docs/reference/mesh/ButtressPressureFlankSide.md +0 -14
  604. package/dist/docs/reference/mesh/ButtressThreadProfileSpec.md +0 -97
  605. package/dist/docs/reference/mesh/CircularPrimitiveOptions.md +0 -60
  606. package/dist/docs/reference/mesh/CurveSamplingOptions.md +0 -69
  607. package/dist/docs/reference/mesh/CustomThreadProfileSpec.md +0 -77
  608. package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +0 -129
  609. package/dist/docs/reference/mesh/ExtrusionSamplingOptions.md +0 -81
  610. package/dist/docs/reference/mesh/Frame3.md +0 -62
  611. package/dist/docs/reference/mesh/GeometryResolution.md +0 -74
  612. package/dist/docs/reference/mesh/GeometrySamplingLimits.md +0 -66
  613. package/dist/docs/reference/mesh/GeometryToleranceOptions.md +0 -46
  614. package/dist/docs/reference/mesh/HeightfieldMeshLimits.md +0 -18
  615. package/dist/docs/reference/mesh/HeightfieldOptions.md +0 -72
  616. package/dist/docs/reference/mesh/HeightfieldPreflight.md +0 -58
  617. package/dist/docs/reference/mesh/ImmutableBuffer.md +0 -108
  618. package/dist/docs/reference/mesh/ImmutableTriangleMesh.md +0 -43
  619. package/dist/docs/reference/mesh/LoftCorrespondence.md +0 -24
  620. package/dist/docs/reference/mesh/LoftMeshStation.md +0 -31
  621. package/dist/docs/reference/mesh/LoftOptions.md +0 -88
  622. package/dist/docs/reference/mesh/LoftPlacement.md +0 -70
  623. package/dist/docs/reference/mesh/ModelingLimits.md +0 -130
  624. package/dist/docs/reference/mesh/NumericArray.md +0 -14
  625. package/dist/docs/reference/mesh/Path2.md +0 -197
  626. package/dist/docs/reference/mesh/Path2Data.md +0 -50
  627. package/dist/docs/reference/mesh/Path2Input.md +0 -20
  628. package/dist/docs/reference/mesh/Path3.md +0 -197
  629. package/dist/docs/reference/mesh/Path3Data.md +0 -50
  630. package/dist/docs/reference/mesh/Path3Input.md +0 -20
  631. package/dist/docs/reference/mesh/PathLocation.md +0 -69
  632. package/dist/docs/reference/mesh/PathNormalGuide.md +0 -43
  633. package/dist/docs/reference/mesh/PathResamplingOptions.md +0 -84
  634. package/dist/docs/reference/mesh/Pivot2Options.md +0 -26
  635. package/dist/docs/reference/mesh/Pivot3Options.md +0 -26
  636. package/dist/docs/reference/mesh/PlanarMeshOptimizationFallbackReason.md +0 -14
  637. package/dist/docs/reference/mesh/PlanarMeshOptimizationOptions.md +0 -160
  638. package/dist/docs/reference/mesh/PlanarMeshOptimizationResult.md +0 -124
  639. package/dist/docs/reference/mesh/PlanarPatchQuality.md +0 -194
  640. package/dist/docs/reference/mesh/RevolveOptions.md +0 -91
  641. package/dist/docs/reference/mesh/SolidMeshValidationOptions.md +0 -38
  642. package/dist/docs/reference/mesh/SquareThreadProfileSpec.md +0 -79
  643. package/dist/docs/reference/mesh/SweepOptions.md +0 -113
  644. package/dist/docs/reference/mesh/SweepOrientation.md +0 -113
  645. package/dist/docs/reference/mesh/ThreadEndStyle.md +0 -14
  646. package/dist/docs/reference/mesh/ThreadEndTreatmentOptions.md +0 -117
  647. package/dist/docs/reference/mesh/ThreadHandedness.md +0 -14
  648. package/dist/docs/reference/mesh/ThreadLeadInEnvelope.md +0 -14
  649. package/dist/docs/reference/mesh/ThreadLeadInShape.md +0 -14
  650. package/dist/docs/reference/mesh/ThreadProfile.md +0 -86
  651. package/dist/docs/reference/mesh/ThreadProfileBaseSpec.md +0 -53
  652. package/dist/docs/reference/mesh/ThreadProfileSpec.md +0 -23
  653. package/dist/docs/reference/mesh/ThreadRidgeOptions.md +0 -145
  654. package/dist/docs/reference/mesh/ThreadSolidOptions.md +0 -222
  655. package/dist/docs/reference/mesh/ThreadSolidPreflight.md +0 -58
  656. package/dist/docs/reference/mesh/Transform2.md +0 -256
  657. package/dist/docs/reference/mesh/Transform2Data.md +0 -14
  658. package/dist/docs/reference/mesh/Transform2Input.md +0 -19
  659. package/dist/docs/reference/mesh/Transform3.md +0 -296
  660. package/dist/docs/reference/mesh/Transform3Data.md +0 -17
  661. package/dist/docs/reference/mesh/Transform3Input.md +0 -19
  662. package/dist/docs/reference/mesh/TrapezoidalThreadProfileSpec.md +0 -96
  663. package/dist/docs/reference/mesh/TriangleMesh.md +0 -34
  664. package/dist/docs/reference/mesh/TriangleMeshAnalysis.md +0 -129
  665. package/dist/docs/reference/mesh/TriangleMeshAnalysisOptions.md +0 -79
  666. package/dist/docs/reference/mesh/TriangleMeshInput.md +0 -19
  667. package/dist/docs/reference/mesh/TriangleMeshMeasurements.md +0 -79
  668. package/dist/docs/reference/mesh/TriangleMeshQualityOptions.md +0 -43
  669. package/dist/docs/reference/mesh/TriangleMeshQualityReport.md +0 -194
  670. package/dist/docs/reference/mesh/TriangleMeshSignature.md +0 -111
  671. package/dist/docs/reference/mesh/TriangleMeshSignatureOptions.md +0 -46
  672. package/dist/docs/reference/mesh/TriangleMeshSignatureTolerances.md +0 -34
  673. package/dist/docs/reference/mesh/TriangleMeshTopologyAnalysis.md +0 -131
  674. package/dist/docs/reference/mesh/TriangleMeshValidationOptions.md +0 -55
  675. package/dist/docs/reference/mesh/TriangularThreadProfileSpec.md +0 -95
  676. package/dist/docs/reference/mesh/Vector2.md +0 -270
  677. package/dist/docs/reference/mesh/Vector2Data.md +0 -14
  678. package/dist/docs/reference/mesh/Vector2Input.md +0 -19
  679. package/dist/docs/reference/mesh/Vector3.md +0 -282
  680. package/dist/docs/reference/mesh/Vector3Data.md +0 -14
  681. package/dist/docs/reference/mesh/Vector3Input.md +0 -19
  682. package/dist/docs/reference/model/AcmeThreadProfileSpec.md +0 -80
  683. package/dist/docs/reference/model/Anchor3.md +0 -55
  684. package/dist/docs/reference/model/AttachOptions.md +0 -69
  685. package/dist/docs/reference/model/Bevel.md +0 -19
  686. package/dist/docs/reference/model/BevelSize.md +0 -15
  687. package/dist/docs/reference/model/Bounds2-type.md +0 -125
  688. package/dist/docs/reference/model/Bounds2Data.md +0 -44
  689. package/dist/docs/reference/model/Bounds2Input.md +0 -19
  690. package/dist/docs/reference/model/Bounds2Options.md +0 -110
  691. package/dist/docs/reference/model/Bounds3-type.md +0 -125
  692. package/dist/docs/reference/model/Bounds3Data.md +0 -44
  693. package/dist/docs/reference/model/Bounds3Input.md +0 -19
  694. package/dist/docs/reference/model/Bounds3Options.md +0 -110
  695. package/dist/docs/reference/model/BoxEdge.md +0 -15
  696. package/dist/docs/reference/model/BoxEdgeSelection.md +0 -19
  697. package/dist/docs/reference/model/BoxEdgeTreatments.md +0 -20
  698. package/dist/docs/reference/model/BoxOptions.md +0 -92
  699. package/dist/docs/reference/model/ButtressPressureFlankSide.md +0 -15
  700. package/dist/docs/reference/model/ButtressThreadProfileSpec.md +0 -98
  701. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +0 -35
  702. package/dist/docs/reference/model/CircleContourOptions.md +0 -21
  703. package/dist/docs/reference/model/CircularPrimitiveOptions.md +0 -62
  704. package/dist/docs/reference/model/Computed.md +0 -44
  705. package/dist/docs/reference/model/ComputedValue.md +0 -24
  706. package/dist/docs/reference/model/Contour.md +0 -24
  707. package/dist/docs/reference/model/CorrespondingComponent.md +0 -46
  708. package/dist/docs/reference/model/CorrespondingContour.md +0 -46
  709. package/dist/docs/reference/model/CorrespondingProfile.md +0 -22
  710. package/dist/docs/reference/model/CorrespondingProfileStation.md +0 -27
  711. package/dist/docs/reference/model/CurveSamplingOptions.md +0 -68
  712. package/dist/docs/reference/model/CustomThreadProfileSpec.md +0 -78
  713. package/dist/docs/reference/model/CylinderOptions.md +0 -58
  714. package/dist/docs/reference/model/EdgeTreatment.md +0 -22
  715. package/dist/docs/reference/model/EllipseContourOptions.md +0 -21
  716. package/dist/docs/reference/model/EndTreatments.md +0 -39
  717. package/dist/docs/reference/model/ExtrudeMeshOptions.md +0 -133
  718. package/dist/docs/reference/model/ExtrudeOptions.md +0 -149
  719. package/dist/docs/reference/model/ExtrusionSamplingOptions.md +0 -84
  720. package/dist/docs/reference/model/Frame3.md +0 -63
  721. package/dist/docs/reference/model/GeometryError.md +0 -102
  722. package/dist/docs/reference/model/GeometryErrorCode.md +0 -15
  723. package/dist/docs/reference/model/GeometryErrorContext.md +0 -35
  724. package/dist/docs/reference/model/GeometryResolution.md +0 -70
  725. package/dist/docs/reference/model/GeometrySamplingLimits.md +0 -62
  726. package/dist/docs/reference/model/GeometryToleranceOptions.md +0 -46
  727. package/dist/docs/reference/model/GridPatternOptions.md +0 -50
  728. package/dist/docs/reference/model/HeightfieldOptions.md +0 -68
  729. package/dist/docs/reference/model/ImmutableBuffer-type.md +0 -108
  730. package/dist/docs/reference/model/ImmutableTriangleMesh.md +0 -43
  731. package/dist/docs/reference/model/InternalThreadCutterOptions.md +0 -216
  732. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +0 -77
  733. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +0 -47
  734. package/dist/docs/reference/model/KnuckleHingeSpec.md +0 -18
  735. package/dist/docs/reference/model/LinearPatternOptions.md +0 -39
  736. package/dist/docs/reference/model/LoftCorrespondence.md +0 -27
  737. package/dist/docs/reference/model/LoftOptions.md +0 -91
  738. package/dist/docs/reference/model/LoftPlacement.md +0 -73
  739. package/dist/docs/reference/model/MatchProfilesOptions.md +0 -35
  740. package/dist/docs/reference/model/ModelingLimits.md +0 -126
  741. package/dist/docs/reference/model/NumericArray.md +0 -14
  742. package/dist/docs/reference/model/Path2-type.md +0 -196
  743. package/dist/docs/reference/model/Path2Data.md +0 -50
  744. package/dist/docs/reference/model/Path2Input.md +0 -20
  745. package/dist/docs/reference/model/Path3-type.md +0 -196
  746. package/dist/docs/reference/model/Path3Data.md +0 -50
  747. package/dist/docs/reference/model/Path3Input.md +0 -20
  748. package/dist/docs/reference/model/PathLocation.md +0 -69
  749. package/dist/docs/reference/model/PathNormalGuide.md +0 -46
  750. package/dist/docs/reference/model/PathOptions.md +0 -38
  751. package/dist/docs/reference/model/PathPatternOptions.md +0 -48
  752. package/dist/docs/reference/model/PathResamplingOptions.md +0 -84
  753. package/dist/docs/reference/model/Pivot2Options.md +0 -28
  754. package/dist/docs/reference/model/Pivot3Options.md +0 -28
  755. package/dist/docs/reference/model/PolygonData.md +0 -44
  756. package/dist/docs/reference/model/PrimitiveAttachment.md +0 -39
  757. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +0 -110
  758. package/dist/docs/reference/model/PrintableThreadFit.md +0 -15
  759. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +0 -51
  760. package/dist/docs/reference/model/ProfileComponent2.md +0 -46
  761. package/dist/docs/reference/model/ProfileContour2.md +0 -36
  762. package/dist/docs/reference/model/ProfileSpan2.md +0 -47
  763. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +0 -41
  764. package/dist/docs/reference/model/RadialPatternOptions.md +0 -59
  765. package/dist/docs/reference/model/RadialSizing.md +0 -15
  766. package/dist/docs/reference/model/RadialSizingOptions.md +0 -40
  767. package/dist/docs/reference/model/RectangleContourOptions.md +0 -72
  768. package/dist/docs/reference/model/RectangleCornerTreatment.md +0 -40
  769. package/dist/docs/reference/model/RectangleCornerTreatments.md +0 -20
  770. package/dist/docs/reference/model/RegionData.md +0 -19
  771. package/dist/docs/reference/model/RevolveOptions.md +0 -94
  772. package/dist/docs/reference/model/RoundedEdgeTreatment.md +0 -96
  773. package/dist/docs/reference/model/SmoothEdgeTreatment.md +0 -76
  774. package/dist/docs/reference/model/SphereOptions.md +0 -20
  775. package/dist/docs/reference/model/SquareThreadProfileSpec.md +0 -80
  776. package/dist/docs/reference/model/StarContourOptions.md +0 -81
  777. package/dist/docs/reference/model/StrokeCap.md +0 -16
  778. package/dist/docs/reference/model/StrokeJoin.md +0 -16
  779. package/dist/docs/reference/model/StrokeOptions.md +0 -91
  780. package/dist/docs/reference/model/SweepOptions.md +0 -116
  781. package/dist/docs/reference/model/SweepOrientation.md +0 -116
  782. package/dist/docs/reference/model/ThreadBevelOptions.md +0 -35
  783. package/dist/docs/reference/model/ThreadEndStyle.md +0 -15
  784. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +0 -118
  785. package/dist/docs/reference/model/ThreadHandedness.md +0 -15
  786. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +0 -15
  787. package/dist/docs/reference/model/ThreadLeadInShape.md +0 -15
  788. package/dist/docs/reference/model/ThreadProfile.md +0 -87
  789. package/dist/docs/reference/model/ThreadProfileBaseSpec.md +0 -54
  790. package/dist/docs/reference/model/ThreadProfileSpec.md +0 -24
  791. package/dist/docs/reference/model/ThreadRidgeOptions.md +0 -141
  792. package/dist/docs/reference/model/ThreadSolidPreflight.md +0 -59
  793. package/dist/docs/reference/model/ThreadedNutOptions.md +0 -263
  794. package/dist/docs/reference/model/ThreadedNutPreflight.md +0 -111
  795. package/dist/docs/reference/model/ThreadedNutShape.md +0 -15
  796. package/dist/docs/reference/model/ThreadedRodOptions.md +0 -216
  797. package/dist/docs/reference/model/TorusOptions.md +0 -110
  798. package/dist/docs/reference/model/Transform2-type.md +0 -257
  799. package/dist/docs/reference/model/Transform2Data.md +0 -16
  800. package/dist/docs/reference/model/Transform2Input.md +0 -21
  801. package/dist/docs/reference/model/Transform3-type.md +0 -297
  802. package/dist/docs/reference/model/Transform3Data.md +0 -19
  803. package/dist/docs/reference/model/Transform3Input.md +0 -21
  804. package/dist/docs/reference/model/TrapezoidalThreadProfileSpec.md +0 -97
  805. package/dist/docs/reference/model/TriangleMesh.md +0 -34
  806. package/dist/docs/reference/model/TriangleMeshAnalysis.md +0 -129
  807. package/dist/docs/reference/model/TriangleMeshMeasurements.md +0 -79
  808. package/dist/docs/reference/model/TriangleMeshTopologyAnalysis.md +0 -131
  809. package/dist/docs/reference/model/TriangularThreadProfileSpec.md +0 -96
  810. package/dist/docs/reference/model/TubeOptions.md +0 -67
  811. package/dist/docs/reference/model/Vector2-type.md +0 -271
  812. package/dist/docs/reference/model/Vector2Data.md +0 -15
  813. package/dist/docs/reference/model/Vector2Input.md +0 -21
  814. package/dist/docs/reference/model/Vector3-type.md +0 -283
  815. package/dist/docs/reference/model/Vector3Data.md +0 -15
  816. package/dist/docs/reference/model/Vector3Input.md +0 -21
  817. package/dist/docs/reference/model/VectorTextLayout.md +0 -40
  818. package/dist/docs/reference/model/VectorTextMetrics.md +0 -100
  819. package/dist/docs/reference/model/bounds2.md +0 -37
  820. package/dist/docs/reference/model/bounds3.md +0 -37
  821. package/dist/docs/reference/model/categories/bounds.md +0 -38
  822. package/dist/docs/reference/model/categories/contracts.md +0 -16
  823. package/dist/docs/reference/model/categories/core-values-errors.md +0 -44
  824. package/dist/docs/reference/model/categories/paths.md +0 -42
  825. package/dist/docs/reference/model/categories/resolution.md +0 -20
  826. package/dist/docs/reference/model/immutableBuffer.md +0 -49
  827. package/dist/docs/reference/model/isGeometryError.md +0 -34
  828. package/dist/docs/reference/model/path2.md +0 -54
  829. package/dist/docs/reference/model/path3.md +0 -49
  830. package/dist/docs/reference/model/transform2.md +0 -46
  831. package/dist/docs/reference/model/transform3.md +0 -48
  832. package/dist/docs/reference/model/vector2.md +0 -40
  833. package/dist/docs/reference/model/vector3.md +0 -47
  834. package/dist/docs/reference/text/Bounds2Data.md +0 -34
  835. package/dist/docs/reference/text/Vector2Data.md +0 -7
  836. package/dist/docs/reference/text/VectorTextArcBaseline.md +0 -53
  837. package/dist/docs/reference/text/VectorTextLayout.md +0 -34
  838. package/dist/docs/reference/text/VectorTextLayoutOptions.md +0 -111
  839. package/dist/docs/reference/text/VectorTextMetrics.md +0 -94
  840. package/dist/docs/reference/text/VectorTextOptions.md +0 -50
  841. package/dist/engine/export-3mf.js +0 -23
  842. package/dist/engine/serialize-3mf.js +0 -116
  843. /package/dist/{engine → geometry/mesh}/mesh-view-cache.js +0 -0
@@ -22,7 +22,7 @@ function rollback(error, values, message) {
22
22
  }
23
23
  throw error;
24
24
  }
25
- /** Bounded evaluated computed roots. Candidates remain provisional until ordinary run cleanup succeeds. */
25
+ /** Bounded evaluated memo roots. Candidates remain provisional until ordinary run cleanup succeeds. */
26
26
  export function createNativeGeometryCache() {
27
27
  let committed = new Map();
28
28
  const values = (entries) => new Set([...entries.values()].map((entry) => entry.native.value));
@@ -2,7 +2,7 @@ import { GeometryError } from "../../geometry/errors.js";
2
2
  import { resolveModelingLimits } from "../../geometry/model-limits.js";
3
3
  import { bindModelContext } from "../../model/execution-binding.js";
4
4
  import { GenerationError } from "../../model/generation.js";
5
- import { captureGenerationValue, generationValueBytes, } from "../../model/immutable-generation-data.js";
5
+ import { captureGenerationValue } from "../../model/immutable-generation-data.js";
6
6
  import { createDeferredContext } from "./deferred-context.js";
7
7
  import { createGenerationGraph } from "./graph.js";
8
8
  import { createNativeGeometryCache } from "./native-cache.js";
@@ -93,7 +93,7 @@ export function createSession(program, suppliedOptions, engineLimits, transactio
93
93
  /**
94
94
  * Owns one attempted revision, including provisional retained native allocations. Declaration and capture
95
95
  * happen inside the native transaction; commit is allowed only after that transaction cleans up.
96
- * Disposal invalidates readers and releases any native allocations that were not committed.
96
+ * Disposal invalidates contexts and releases any native allocations that were not committed.
97
97
  */
98
98
  class SessionRevision {
99
99
  session;
@@ -120,7 +120,7 @@ class SessionRevision {
120
120
  generate(revision, deferred, native, mode) {
121
121
  const { program, services, caches } = this.session;
122
122
  const startedAt = performance.now();
123
- const output = revision.finish(program.generate({ ...revision.context, services }));
123
+ const output = revision.finish(program.generate(revision.withServices(services)));
124
124
  if (mode === "validate")
125
125
  return { kind: "validation", diagnostics: Object.freeze([...revision.diagnostics]) };
126
126
  const captured = caches.snapshots.capture({
@@ -141,10 +141,10 @@ class SessionRevision {
141
141
  const { options, limits, caches } = this.session;
142
142
  if (options.cache === false)
143
143
  return;
144
- const retainedBytes = generationValueBytes([...revision.retainedValues(), ...captured.retainedValues], limits.maxBytes);
144
+ const retainedBytes = revision.prepareRetention(captured.retainedValues, limits.maxBytes);
145
145
  if (retainedBytes > limits.maxBytes)
146
146
  return;
147
- const nativeCandidate = caches.geometry.prepare(deferred.retentionCandidates(revision.computedValues()), (shape) => {
147
+ const nativeCandidate = caches.geometry.prepare(deferred.retentionCandidates(revision.memoValues()), (shape) => {
148
148
  const realized = deferred.realizedShape(shape);
149
149
  if (realized !== undefined)
150
150
  return native().captureNative(realized);
@@ -32,7 +32,7 @@ function createResource(id, geometry, reusable) {
32
32
  }
33
33
  /** Captures authoritative placement and appearance before consulting world-geometry reuse. */
34
34
  function capturePlacement(descriptor) {
35
- const transform = validateRigidTransform3(transform3(typeof descriptor.transform === "function" ? descriptor.transform() : descriptor.transform).toData());
35
+ const transform = validateRigidTransform3(transform3(descriptor.transform).toData());
36
36
  const color = descriptor.color;
37
37
  if (color !== undefined && (typeof color !== "string" || !/^#[\da-f]{6}$/i.test(color)))
38
38
  invalid("Part colors must be six-digit hex strings.");
@@ -83,7 +83,7 @@ export function createSnapshotCache(options, limits) {
83
83
  const summary = createModelSummary(limits);
84
84
  let finalizeGeometry;
85
85
  for (const descriptor of output) {
86
- const geometry = typeof descriptor.geometry === "function" ? descriptor.geometry() : descriptor.geometry;
86
+ const geometry = descriptor.geometry;
87
87
  if (typeof geometry !== "object" || geometry === null)
88
88
  invalid("Parts require Solid recipes or indexed manufacturing meshes.");
89
89
  let resource = options.cache === false ? undefined : resourceCache.get(geometry);
@@ -0,0 +1,190 @@
1
+ import { Zip, ZipDeflate } from "fflate";
2
+ import { GeometryError } from "../geometry/errors.js";
3
+ import { MeshViewCache } from "../geometry/mesh/mesh-view-cache.js";
4
+ import { captureExport } from "./capture.js";
5
+ import { collectExport, createExportWriter } from "./writer.js";
6
+ const coreNamespace = "http://schemas.microsoft.com/3dmanufacturing/core/2015/02";
7
+ const materialNamespace = "http://schemas.microsoft.com/3dmanufacturing/material/2015/02";
8
+ const encoder = new TextEncoder();
9
+ const xmlDeclaration = '<?xml version="1.0" encoding="UTF-8"?>';
10
+ const escapeXml = (text) => text.replace(/[&<>"']/g, (value) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&apos;" })[value]);
11
+ // Core 3MF prohibits property bindings on component wrappers. Different appearances or material
12
+ // bindings therefore need separate mesh objects; equal bindings retain geometry reuse.
13
+ function plan(captured) {
14
+ const colors = [];
15
+ const colorIndices = new Map();
16
+ const combinations = [];
17
+ const combinationIndices = new Map();
18
+ const materialIndices = new Map(captured.materials.map((material, index) => [material.id, index]));
19
+ const meshes = [];
20
+ const references = [];
21
+ const byGeometry = new MeshViewCache();
22
+ for (const part of captured.parts) {
23
+ const key = `${part.materialId ?? ""}:${part.color ?? ""}`;
24
+ let property;
25
+ if (part.color !== undefined) {
26
+ let color = colorIndices.get(part.color);
27
+ if (color === undefined) {
28
+ color = colors.length;
29
+ colors.push(part.color);
30
+ colorIndices.set(part.color, color);
31
+ }
32
+ property = { group: 2, index: color };
33
+ if (part.materialId !== undefined) {
34
+ let combination = combinationIndices.get(key);
35
+ if (combination === undefined) {
36
+ combination = combinations.length;
37
+ combinations.push({ material: materialIndices.get(part.materialId), color });
38
+ combinationIndices.set(key, combination);
39
+ }
40
+ property = { group: 3, index: combination };
41
+ }
42
+ }
43
+ let variants = byGeometry.get(part.geometry);
44
+ if (variants === undefined) {
45
+ variants = new Map();
46
+ byGeometry.set(part.geometry, variants);
47
+ }
48
+ let reference = variants.get(key);
49
+ if (reference === undefined) {
50
+ reference = meshes.length + 4;
51
+ meshes.push({ id: reference, part, ...(property === undefined ? {} : { property }) });
52
+ variants.set(key, reference);
53
+ }
54
+ references.push(reference);
55
+ }
56
+ return { meshes, references, colors, combinations };
57
+ }
58
+ function placement(transform) {
59
+ // 3MF's twelve values use a row-vector 4x3 layout; our matrices multiply column vectors.
60
+ return [0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11].map((index) => transform[index]).join(" ");
61
+ }
62
+ function* modelXml(captured) {
63
+ const { meshes, references, colors, combinations } = plan(captured);
64
+ const extension = colors.length === 0 ? "" : ` xmlns:m="${materialNamespace}" requiredextensions="m"`;
65
+ let xml = `${xmlDeclaration}<model unit="millimeter" xml:lang="en-US" xmlns="${coreNamespace}"${extension}><metadata name="Application">MetaMesh Modeling</metadata><metadata name="Title">${escapeXml(captured.name)}</metadata><resources>`;
66
+ if (captured.materials.length > 0) {
67
+ xml += '<basematerials id="1">';
68
+ for (const material of captured.materials)
69
+ xml += `<base name="${escapeXml(material.id)}" displaycolor="${material.color.toUpperCase()}FF"/>`;
70
+ xml += "</basematerials>";
71
+ }
72
+ if (colors.length > 0) {
73
+ xml += '<m:colorgroup id="2">';
74
+ for (const color of colors)
75
+ xml += `<m:color color="${color.toUpperCase()}FF"/>`;
76
+ xml += "</m:colorgroup>";
77
+ }
78
+ if (combinations.length > 0) {
79
+ xml += '<m:multiproperties id="3" pids="1 2">';
80
+ for (const combination of combinations)
81
+ xml += `<m:multi pindices="${combination.material} ${combination.color}"/>`;
82
+ xml += "</m:multiproperties>";
83
+ }
84
+ for (const resource of meshes) {
85
+ const { geometry } = resource.part;
86
+ const property = resource.property === undefined
87
+ ? ""
88
+ : ` pid="${resource.property.group}" pindex="${resource.property.index}"`;
89
+ xml += `<object id="${resource.id}" type="model"${property}><mesh><vertices>`;
90
+ for (let index = 0; index < geometry.positions.length; index += 3) {
91
+ xml += `<vertex x="${geometry.positions[index]}" y="${geometry.positions[index + 1]}" z="${geometry.positions[index + 2]}"/>`;
92
+ if (xml.length >= 32_768) {
93
+ yield encoder.encode(xml);
94
+ xml = "";
95
+ }
96
+ }
97
+ xml += "</vertices><triangles>";
98
+ for (let index = 0; index < geometry.indices.length; index += 3) {
99
+ xml += `<triangle v1="${geometry.indices[index]}" v2="${geometry.indices[index + 1]}" v3="${geometry.indices[index + 2]}"/>`;
100
+ if (xml.length >= 32_768) {
101
+ yield encoder.encode(xml);
102
+ xml = "";
103
+ }
104
+ }
105
+ xml += "</triangles></mesh></object>";
106
+ }
107
+ const firstPartId = meshes.length + 4;
108
+ for (let index = 0; index < captured.parts.length; index++) {
109
+ const part = captured.parts[index];
110
+ xml += `<object id="${firstPartId + index}" name="${escapeXml(part.id)}" partnumber="${escapeXml(part.id)}" type="model"><components><component objectid="${references[index]}"/></components></object>`;
111
+ if (xml.length >= 32_768) {
112
+ yield encoder.encode(xml);
113
+ xml = "";
114
+ }
115
+ }
116
+ xml += "</resources><build>";
117
+ for (let index = 0; index < captured.parts.length; index++) {
118
+ xml += `<item objectid="${firstPartId + index}" transform="${placement(captured.parts[index].transform)}"/>`;
119
+ if (xml.length >= 32_768) {
120
+ yield encoder.encode(xml);
121
+ xml = "";
122
+ }
123
+ }
124
+ xml += "</build></model>";
125
+ yield encoder.encode(xml);
126
+ }
127
+ /**
128
+ * Writes 3MF with local mesh reuse, semantic parts, rigid placement, and standard color groups.
129
+ * Colored output requires the Materials extension. Explicit material IDs remain distinct base-material
130
+ * names, combined with appearance through multiproperties; display colors never select filament.
131
+ * Captures mutable inputs before awaiting and awaits each owned output chunk for backpressure.
132
+ * The host owns destination closing and cleanup of partial output after rejection.
133
+ */
134
+ export async function write3mf(parts, sink, options = {}) {
135
+ const captured = captureExport(parts, options, "3mf");
136
+ const writer = createExportWriter(captured, sink, "3mf");
137
+ let pending = [];
138
+ let zippedBytes = 0, complete = false;
139
+ const zip = new Zip((error, data, final) => {
140
+ if (error !== null)
141
+ throw error;
142
+ zippedBytes += data.byteLength;
143
+ if (zippedBytes >= 0xffffffff)
144
+ throw new GeometryError("COMPLEXITY_LIMIT", "3MF ZIP output exceeds its 32-bit container limit.");
145
+ pending.push(data);
146
+ complete = final;
147
+ });
148
+ const drain = async () => {
149
+ const chunks = pending;
150
+ pending = [];
151
+ for (const chunk of chunks)
152
+ await writer.write(chunk);
153
+ };
154
+ const add = (path) => {
155
+ const file = new ZipDeflate(path, { level: 6 });
156
+ file.mtime = new Date(1980, 0, 1);
157
+ zip.add(file);
158
+ return file;
159
+ };
160
+ try {
161
+ add("[Content_Types].xml").push(encoder.encode(`${xmlDeclaration}<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="model" ContentType="application/vnd.ms-package.3dmanufacturing-3dmodel+xml"/></Types>`), true);
162
+ await drain();
163
+ add("_rels/.rels").push(encoder.encode(`${xmlDeclaration}<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Target="/3D/3dmodel.model" Id="model" Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel"/></Relationships>`), true);
164
+ await drain();
165
+ const model = add("3D/3dmodel.model");
166
+ let xmlBytes = 0;
167
+ for (const chunk of modelXml(captured)) {
168
+ captured.signal?.throwIfAborted();
169
+ xmlBytes += chunk.byteLength;
170
+ if (xmlBytes >= 0xffffffff)
171
+ throw new GeometryError("COMPLEXITY_LIMIT", "3MF model XML exceeds its 32-bit ZIP entry limit.");
172
+ model.push(chunk, false);
173
+ await drain();
174
+ }
175
+ model.push(new Uint8Array(), true);
176
+ await drain();
177
+ zip.end();
178
+ await drain();
179
+ if (!complete)
180
+ throw new Error("The 3MF compressor did not complete.");
181
+ return writer.report();
182
+ }
183
+ finally {
184
+ zip.terminate();
185
+ }
186
+ }
187
+ /** Serializes selected completed meshes as an owned 3MF file without initializing an engine. */
188
+ export async function export3mf(parts, options = {}) {
189
+ return collectExport((sink) => write3mf(parts, sink, options));
190
+ }
@@ -0,0 +1,178 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ import { immutableBufferView, isImmutableBuffer } from "../geometry/immutable-buffer.js";
3
+ import { analyzeSolidMesh } from "../geometry/mesh/mesh-solid.js";
4
+ import { MeshViewCache } from "../geometry/mesh/mesh-view-cache.js";
5
+ import { analyzeTriangleMesh, transformTriangleMesh, } from "../geometry/mesh/mesh.js";
6
+ import { IDENTITY_TRANSFORM3, validateRigidTransform3 } from "../geometry/transform3.js";
7
+ import { resolveExportLimits } from "./limits.js";
8
+ // Array.isArray's any[] predicate must not erase the already typed public contracts below.
9
+ const isArray = Array.isArray;
10
+ function identifier(id) {
11
+ if (typeof id !== "string" || id.length > 64 || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id))
12
+ throw new GeometryError("INVALID_ARGUMENT", "Export IDs must be canonical identifiers of at most 64 characters.");
13
+ }
14
+ function colorValue(color) {
15
+ if (typeof color !== "string" || !/^#[\da-f]{6}$/i.test(color))
16
+ throw new GeometryError("INVALID_ARGUMENT", "Export colors must be six-digit hex strings.");
17
+ return color.toLowerCase();
18
+ }
19
+ /** Captures all caller-owned data before the first await. Immutable library buffers remain shared. */
20
+ export function captureExport(parts, options, format) {
21
+ if (typeof options !== "object" || options === null || isArray(options))
22
+ throw new GeometryError("INVALID_ARGUMENT", "Export options must be an object.");
23
+ const limits = resolveExportLimits(options.limits);
24
+ const signal = options.signal;
25
+ signal?.throwIfAborted();
26
+ const name = options.name ?? "MetaMesh model";
27
+ if (typeof name !== "string" ||
28
+ name.length === 0 ||
29
+ name.length > 1024 ||
30
+ // eslint-disable-next-line no-control-regex -- XML 1.0 characters also make consistent cross-format names.
31
+ /[\u0000-\u0008\u000b\u000c\u000e-\u001f\ud800-\udfff\ufffe\uffff]/u.test(name))
32
+ throw new GeometryError("INVALID_ARGUMENT", "Export names require one through 1024 valid XML characters.");
33
+ const meshValidation = options.meshValidation ?? "topology";
34
+ if (meshValidation !== "topology" && meshValidation !== "solid")
35
+ throw new GeometryError("INVALID_ARGUMENT", "Unsupported mesh validation mode.");
36
+ if (!isArray(parts) || parts.length === 0 || parts.length > limits.maxParts)
37
+ throw new GeometryError("COMPLEXITY_LIMIT", `Export requires one through ${limits.maxParts} parts.`);
38
+ const definitions = options.materials ?? [];
39
+ if (!isArray(definitions) || definitions.length > limits.maxParts)
40
+ throw new GeometryError("COMPLEXITY_LIMIT", "Export materials exceed the part ceiling.");
41
+ const materials = [];
42
+ const byMaterial = new Map();
43
+ for (const definition of definitions) {
44
+ if (typeof definition !== "object" || definition === null)
45
+ throw new GeometryError("INVALID_ARGUMENT", "Export materials must declare an ID and display color.");
46
+ const id = definition.id;
47
+ identifier(id);
48
+ if (byMaterial.has(id))
49
+ throw new GeometryError("INVALID_ARGUMENT", "Export material IDs must be unique.");
50
+ const material = Object.freeze({ id, color: colorValue(definition.color) });
51
+ materials.push(material);
52
+ byMaterial.set(id, material);
53
+ }
54
+ const ids = new Set();
55
+ const viewKeys = new Map();
56
+ let vertices = 0, triangles = 0, bytes = 0;
57
+ function captureArray(source, immutable) {
58
+ if (!(source.buffer instanceof ArrayBuffer))
59
+ throw new GeometryError("INVALID_MESH", "Export requires transferable numeric buffers.");
60
+ const key = `${source instanceof Float32Array ? "f" : "u"}:${source.byteOffset}:${source.length}`;
61
+ let ranges = viewKeys.get(source.buffer);
62
+ const previous = ranges?.get(key);
63
+ if (previous !== undefined)
64
+ return previous;
65
+ bytes += source.byteLength;
66
+ if (bytes > limits.maxBytes)
67
+ throw new GeometryError("COMPLEXITY_LIMIT", "Export snapshot exceeds maxBytes.");
68
+ const captured = immutable ? source : source.slice();
69
+ if (ranges === undefined) {
70
+ ranges = new Map();
71
+ viewKeys.set(source.buffer, ranges);
72
+ }
73
+ ranges.set(key, captured);
74
+ return captured;
75
+ }
76
+ const geometries = new MeshViewCache();
77
+ const validatedGeometries = new MeshViewCache();
78
+ const captured = [];
79
+ for (const part of parts) {
80
+ signal?.throwIfAborted();
81
+ if (typeof part !== "object" || part === null)
82
+ throw new GeometryError("INVALID_ARGUMENT", "Export parts must be objects.");
83
+ const id = part.id;
84
+ identifier(id);
85
+ if (ids.has(id))
86
+ throw new GeometryError("INVALID_ARGUMENT", "Export part IDs must be unique canonical identifiers.");
87
+ ids.add(id);
88
+ const input = part.geometry;
89
+ if (typeof input !== "object" || input === null)
90
+ throw new GeometryError("INVALID_MESH", "Export parts require local geometry.");
91
+ const { positions, indices, normals } = input;
92
+ const localPositions = isImmutableBuffer(positions)
93
+ ? immutableBufferView(positions)
94
+ : positions;
95
+ const localIndices = isImmutableBuffer(indices) ? immutableBufferView(indices) : indices;
96
+ const localNormals = normals === undefined
97
+ ? undefined
98
+ : isImmutableBuffer(normals)
99
+ ? immutableBufferView(normals)
100
+ : normals;
101
+ if (!(localPositions instanceof Float32Array) ||
102
+ !(localIndices instanceof Uint32Array) ||
103
+ localPositions.length % 3 !== 0 ||
104
+ localIndices.length % 3 !== 0 ||
105
+ (localNormals !== undefined &&
106
+ (!(localNormals instanceof Float32Array) || localNormals.length !== localPositions.length)))
107
+ throw new GeometryError("INVALID_MESH", "Export geometry requires complete Float32 XYZ positions, Uint32 triangles, and matching optional normals.");
108
+ vertices += localPositions.length / 3;
109
+ triangles += localIndices.length / 3;
110
+ if (vertices > limits.maxVertices || triangles > limits.maxTriangles)
111
+ throw new GeometryError("COMPLEXITY_LIMIT", "Export snapshot exceeds its vertex or triangle limits.");
112
+ const mesh = {
113
+ positions: captureArray(localPositions, isImmutableBuffer(positions)),
114
+ indices: captureArray(localIndices, isImmutableBuffer(indices)),
115
+ ...(localNormals === undefined
116
+ ? {}
117
+ : { normals: captureArray(localNormals, isImmutableBuffer(normals)) }),
118
+ };
119
+ const variants = geometries.get(mesh) ?? [];
120
+ let geometry = variants.find((value) => value.normals === mesh.normals);
121
+ if (geometry === undefined) {
122
+ if (validatedGeometries.get(mesh) !== true) {
123
+ const facts = meshValidation === "solid"
124
+ ? analyzeSolidMesh(mesh)
125
+ : analyzeTriangleMesh(mesh, {
126
+ requireClosed: format === "3mf",
127
+ includeTopology: format === "3mf",
128
+ });
129
+ if (format === "3mf" && !(facts.signedVolume > 0))
130
+ throw new GeometryError("INVALID_TOPOLOGY", "3MF parts require positive oriented volume.");
131
+ validatedGeometries.set(mesh, true);
132
+ }
133
+ if (mesh.normals !== undefined)
134
+ for (let offset = 0; offset < mesh.normals.length; offset += 3) {
135
+ const length = Math.hypot(mesh.normals[offset], mesh.normals[offset + 1], mesh.normals[offset + 2]);
136
+ if (!Number.isFinite(length) || Math.abs(length - 1) > 1e-4)
137
+ throw new GeometryError("INVALID_MESH", "Authored display normals must be finite unit vectors.");
138
+ }
139
+ geometry = Object.freeze(mesh);
140
+ variants.push(geometry);
141
+ geometries.set(mesh, variants);
142
+ }
143
+ const inputTransform = part.transform;
144
+ if (inputTransform !== undefined && (!isArray(inputTransform) || inputTransform.length !== 16))
145
+ throw new GeometryError("INVALID_ARGUMENT", "Export placement requires a row-major matrix of sixteen entries.");
146
+ const transform = inputTransform === undefined
147
+ ? IDENTITY_TRANSFORM3
148
+ : Object.freeze([...inputTransform]);
149
+ validateRigidTransform3(transform);
150
+ // Solid validation includes placed Float32 buffers: large translations can collapse local gaps.
151
+ if (meshValidation === "solid" &&
152
+ transform.some((value, index) => value !== IDENTITY_TRANSFORM3[index]))
153
+ analyzeSolidMesh(transformTriangleMesh(geometry, transform));
154
+ const materialId = part.materialId;
155
+ if (materialId !== undefined && !byMaterial.has(materialId))
156
+ throw new GeometryError("INVALID_ARGUMENT", `Unknown export material ${String(materialId)}.`);
157
+ const color = part.color === undefined
158
+ ? materialId === undefined
159
+ ? undefined
160
+ : byMaterial.get(materialId).color
161
+ : colorValue(part.color);
162
+ captured.push(Object.freeze({
163
+ id,
164
+ geometry,
165
+ transform,
166
+ ...(color === undefined ? {} : { color }),
167
+ ...(materialId === undefined ? {} : { materialId }),
168
+ }));
169
+ }
170
+ return Object.freeze({
171
+ parts: Object.freeze(captured),
172
+ materials: Object.freeze(materials),
173
+ name,
174
+ limits,
175
+ meshValidation,
176
+ ...(signal === undefined ? {} : { signal }),
177
+ });
178
+ }
@@ -0,0 +1,209 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ import { renderMesh } from "../geometry/mesh/mesh-render.js";
3
+ import { captureExport } from "./capture.js";
4
+ import { collectExport, createExportWriter } from "./writer.js";
5
+ const alignedLength = (length) => Math.ceil(length / 4) * 4;
6
+ const linearChannel = (value) => value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
7
+ function baseColor(color) {
8
+ return [
9
+ linearChannel(Number.parseInt(color.slice(1, 3), 16) / 255),
10
+ linearChannel(Number.parseInt(color.slice(3, 5), 16) / 255),
11
+ linearChannel(Number.parseInt(color.slice(5, 7), 16) / 255),
12
+ 1,
13
+ ];
14
+ }
15
+ /**
16
+ * Serializes captured local meshes as uncompressed glTF 2.0 binary, in metres and Y-up.
17
+ * Preserves named parts, placement, shared geometry and display appearance. Authored normals take
18
+ * precedence over crease-aware shading; no engine, renderer or optional compression codec is loaded.
19
+ */
20
+ export function exportGlb(parts, options = {}) {
21
+ return collectExport((sink) => writeGlb(parts, sink, options));
22
+ }
23
+ /**
24
+ * Writes owned GLB chunks with backpressure, cancellation and explicit output limits.
25
+ * Plans accessor and container lengths before writing, then emits bounded binary chunks.
26
+ * Hosts own sink completion, scheduling and recovery after a partially written failure.
27
+ */
28
+ export async function writeGlb(parts, sink, options = {}) {
29
+ const captured = captureExport(parts, options, "glb");
30
+ const creaseAngle = options.creaseAngle ?? 20;
31
+ if (!Number.isFinite(creaseAngle) || creaseAngle < 0 || creaseAngle > 180)
32
+ throw new GeometryError("INVALID_ARGUMENT", "Crease angle must be from 0 through 180 degrees.", {
33
+ operation: "exportGlb",
34
+ });
35
+ const writer = createExportWriter(captured, sink, "glb");
36
+ const accessors = [];
37
+ const bufferViews = [];
38
+ const attributes = [];
39
+ const materials = [];
40
+ const meshes = [];
41
+ const nodes = [];
42
+ const geometryAccessors = new Map();
43
+ const materialIndices = new Map();
44
+ const meshIndices = new Map();
45
+ let binaryLength = 0;
46
+ let lastYield = performance.now();
47
+ const addAttribute = (data, componentType, type, bounds) => {
48
+ const byteLength = data.length * (componentType === 5123 ? 2 : 4);
49
+ const bufferView = bufferViews.length;
50
+ bufferViews.push({
51
+ buffer: 0,
52
+ byteOffset: binaryLength,
53
+ byteLength,
54
+ target: type === "SCALAR" ? 34963 : 34962,
55
+ });
56
+ binaryLength += alignedLength(byteLength);
57
+ if (binaryLength > captured.limits.maxOutputBytes || binaryLength >= 0x1_0000_0000)
58
+ throw new GeometryError("COMPLEXITY_LIMIT", "GLB binary data exceeds the output limits.", {
59
+ operation: "exportGlb",
60
+ });
61
+ attributes.push({ data, componentType, byteLength });
62
+ const accessor = accessors.length;
63
+ accessors.push({
64
+ bufferView,
65
+ componentType,
66
+ count: data.length / (type === "VEC3" ? 3 : 1),
67
+ type,
68
+ ...bounds,
69
+ });
70
+ return accessor;
71
+ };
72
+ for (const part of captured.parts) {
73
+ captured.signal?.throwIfAborted();
74
+ let geometry = geometryAccessors.get(part.geometry);
75
+ if (geometry === undefined) {
76
+ const rendered = part.geometry.normals === undefined
77
+ ? renderMesh(part.geometry, { creaseAngle })
78
+ : { ...part.geometry, normals: part.geometry.normals };
79
+ const min = [Infinity, Infinity, Infinity];
80
+ const max = [-Infinity, -Infinity, -Infinity];
81
+ for (let index = 0; index < rendered.positions.length; index += 3)
82
+ for (let axis = 0; axis < 3; axis += 1) {
83
+ min[axis] = Math.min(min[axis], rendered.positions[index + axis]);
84
+ max[axis] = Math.max(max[axis], rendered.positions[index + axis]);
85
+ }
86
+ const position = addAttribute(rendered.positions, 5126, "VEC3", { min, max });
87
+ const normal = addAttribute(rendered.normals, 5126, "VEC3");
88
+ let maximumIndex = 0;
89
+ for (const index of rendered.indices)
90
+ maximumIndex = Math.max(maximumIndex, index);
91
+ // glTF reserves the component type's largest integer for primitive restart.
92
+ const indices = addAttribute(rendered.indices, maximumIndex < 65_535 ? 5123 : 5125, "SCALAR");
93
+ geometry = { position, normal, indices };
94
+ geometryAccessors.set(part.geometry, geometry);
95
+ }
96
+ const color = part.color ?? "#ffffff";
97
+ const materialKey = `${part.materialId ?? ""}:${color.toLowerCase()}`;
98
+ let material = materialIndices.get(materialKey);
99
+ if (material === undefined) {
100
+ material = materials.length;
101
+ materials.push({
102
+ ...(part.materialId === undefined
103
+ ? {}
104
+ : { name: part.materialId, extras: { materialId: part.materialId } }),
105
+ pbrMetallicRoughness: {
106
+ baseColorFactor: baseColor(color),
107
+ metallicFactor: 0,
108
+ roughnessFactor: 1,
109
+ },
110
+ });
111
+ materialIndices.set(materialKey, material);
112
+ }
113
+ const meshKey = `${geometry.position}:${material}`;
114
+ let mesh = meshIndices.get(meshKey);
115
+ if (mesh === undefined) {
116
+ mesh = meshes.length;
117
+ meshes.push({
118
+ primitives: [
119
+ {
120
+ attributes: { POSITION: geometry.position, NORMAL: geometry.normal },
121
+ indices: geometry.indices,
122
+ material,
123
+ },
124
+ ],
125
+ });
126
+ meshIndices.set(meshKey, mesh);
127
+ }
128
+ const transform = part.transform;
129
+ const matrix = Array.from({ length: 16 }, (_, index) => transform[(index % 4) * 4 + Math.floor(index / 4)]);
130
+ nodes.push({ name: part.id, mesh, matrix });
131
+ if (performance.now() - lastYield >= 16) {
132
+ await new Promise((resolve) => setTimeout(resolve, 0));
133
+ lastYield = performance.now();
134
+ }
135
+ }
136
+ captured.signal?.throwIfAborted();
137
+ const rootNode = nodes.length;
138
+ nodes.push({
139
+ name: captured.name,
140
+ // Column-major matrix: x'=x/1000, y'=z/1000, z'=-y/1000.
141
+ matrix: [0.001, 0, 0, 0, 0, 0, -0.001, 0, 0, 0.001, 0, 0, 0, 0, 0, 1],
142
+ children: Array.from({ length: rootNode }, (_, index) => index),
143
+ });
144
+ const json = new TextEncoder().encode(JSON.stringify({
145
+ asset: { version: "2.0", generator: "MetaMesh" },
146
+ scene: 0,
147
+ scenes: [{ name: captured.name, nodes: [rootNode] }],
148
+ nodes,
149
+ meshes,
150
+ materials,
151
+ accessors,
152
+ bufferViews,
153
+ buffers: [{ byteLength: binaryLength }],
154
+ }));
155
+ const paddedJsonLength = alignedLength(json.byteLength);
156
+ const fileLength = 12 + 8 + paddedJsonLength + 8 + binaryLength;
157
+ if (fileLength >= 0x1_0000_0000 || fileLength > captured.limits.maxOutputBytes)
158
+ throw new GeometryError("COMPLEXITY_LIMIT", "GLB container exceeds the output limits.", {
159
+ operation: "exportGlb",
160
+ });
161
+ const header = new Uint8Array(20);
162
+ const headerView = new DataView(header.buffer);
163
+ headerView.setUint32(0, 0x46546c67, true);
164
+ headerView.setUint32(4, 2, true);
165
+ headerView.setUint32(8, fileLength, true);
166
+ headerView.setUint32(12, paddedJsonLength, true);
167
+ headerView.setUint32(16, 0x4e4f534a, true);
168
+ await writer.write(header);
169
+ const paddedJson = new Uint8Array(paddedJsonLength).fill(0x20);
170
+ paddedJson.set(json);
171
+ for (let start = 0; start < paddedJson.length; start += 65_536)
172
+ await writer.write(paddedJson.slice(start, start + 65_536));
173
+ const binaryHeader = new Uint8Array(8);
174
+ const binaryHeaderView = new DataView(binaryHeader.buffer);
175
+ binaryHeaderView.setUint32(0, binaryLength, true);
176
+ binaryHeaderView.setUint32(4, 0x004e4942, true);
177
+ await writer.write(binaryHeader);
178
+ for (const attribute of attributes) {
179
+ const width = attribute.componentType === 5123 ? 2 : 4;
180
+ const elementsPerChunk = 65_536 / width;
181
+ for (let start = 0; start < attribute.data.length; start += elementsPerChunk) {
182
+ const count = Math.min(elementsPerChunk, attribute.data.length - start);
183
+ const chunk = new Uint8Array(count * width);
184
+ const view = new DataView(chunk.buffer);
185
+ for (let index = 0; index < count; index += 1) {
186
+ const value = attribute.data[start + index];
187
+ if (attribute.componentType === 5126)
188
+ view.setFloat32(index * width, value, true);
189
+ else if (attribute.componentType === 5123)
190
+ view.setUint16(index * width, value, true);
191
+ else
192
+ view.setUint32(index * width, value, true);
193
+ }
194
+ await writer.write(chunk);
195
+ }
196
+ const padding = alignedLength(attribute.byteLength) - attribute.byteLength;
197
+ if (padding > 0)
198
+ await writer.write(new Uint8Array(padding));
199
+ }
200
+ const diagnostics = [];
201
+ const assigned = captured.parts.filter((part) => part.materialId !== undefined);
202
+ if (assigned.length > 0)
203
+ diagnostics.push({
204
+ code: "MATERIAL_ASSIGNMENTS_DROPPED",
205
+ message: "GLB preserves material identities as metadata and appearance, without print material assignment semantics.",
206
+ partIds: assigned.map((part) => part.id),
207
+ });
208
+ return writer.report(diagnostics);
209
+ }
@@ -0,0 +1,5 @@
1
+ /** Runtime-independent completed-mesh export. All input coordinates are millimetres, right-handed, and Z-up. @packageDocumentation */
2
+ export { export3mf, write3mf } from "./3mf.js";
3
+ export { exportStl, writeStl } from "./stl.js";
4
+ export { exportGlb, writeGlb } from "./glb.js";
5
+ export { defaultExportLimits } from "./limits.js";