@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.
- package/CHANGELOG.md +33 -0
- package/README.md +73 -57
- package/dist/api/engine.d.ts +7 -47
- package/dist/api/export-3mf.d.ts +2 -0
- package/dist/api/export-glb.d.ts +2 -0
- package/dist/api/export-stl.d.ts +2 -0
- package/dist/api/export.d.ts +160 -0
- package/dist/api/geometry.d.ts +7 -7
- package/dist/api/index.d.ts +85 -35
- package/dist/api/mesh.d.ts +35 -6
- package/dist/docs/guides/concepts.md +32 -535
- package/dist/docs/guides/fonts.md +4 -4
- package/dist/docs/guides/generation.md +52 -45
- package/dist/docs/guides/geometry-values.md +193 -0
- package/dist/docs/guides/hosting.md +53 -30
- package/dist/docs/guides/profiles-and-extrusion.md +252 -0
- package/dist/docs/guides/recipes.md +33 -780
- package/dist/docs/guides/resolution-and-inspection.md +133 -0
- package/dist/docs/guides/solid-joins.md +126 -0
- package/dist/docs/guides/standalone-model.md +1 -1
- package/dist/docs/guides/svg-and-text.md +215 -0
- package/dist/docs/guides/sweeps-and-lofts.md +179 -0
- package/dist/docs/guides/transforms-and-placement.md +313 -0
- package/dist/docs/manifest.json +2818 -5862
- package/dist/docs/reference/engine/GenerationOptions.md +10 -4
- package/dist/docs/reference/engine/GeometryResource.md +8 -2
- package/dist/docs/reference/engine/ModelDependencies.md +9 -3
- package/dist/docs/reference/engine/ModelEngine.md +9 -3
- package/dist/docs/reference/engine/ModelEngineOptions.md +9 -3
- package/dist/docs/reference/engine/ModelPart.md +9 -3
- package/dist/docs/reference/engine/ModelResult.md +8 -2
- package/dist/docs/reference/engine/ModelRunArguments.md +7 -1
- package/dist/docs/reference/engine/ModelRunOptions.md +10 -4
- package/dist/docs/reference/engine/ModelSession.md +7 -1
- package/dist/docs/reference/engine/SessionOptions.md +10 -4
- package/dist/docs/reference/engine/categories/host-lifecycle.md +3 -8
- package/dist/docs/reference/engine/checkModel.md +7 -1
- package/dist/docs/reference/engine/createModelEngine.md +10 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +9 -3
- package/dist/docs/reference/engine/modelingWasmUrl.md +7 -1
- package/dist/docs/reference/engine.md +7 -7
- package/dist/docs/reference/export/Export3mfOptions.md +24 -0
- package/dist/docs/reference/export/ExportDiagnostic.md +59 -0
- package/dist/docs/reference/export/ExportFormat.md +25 -0
- package/dist/docs/reference/export/ExportGeometry.md +39 -0
- package/dist/docs/reference/export/ExportGlbOptions.md +118 -0
- package/dist/docs/reference/export/ExportLimits.md +83 -0
- package/dist/docs/reference/export/ExportMaterial.md +47 -0
- package/dist/docs/reference/export/ExportOptions.md +94 -0
- package/dist/docs/reference/export/ExportPart.md +88 -0
- package/dist/docs/reference/export/ExportReport.md +82 -0
- package/dist/docs/reference/export/ExportSink.md +39 -0
- package/dist/docs/reference/export/ExportStlOptions.md +24 -0
- package/dist/docs/reference/export/ExportedFile.md +110 -0
- package/dist/docs/reference/export/categories/mesh-serialization.md +47 -0
- package/dist/docs/reference/export/defaultExportLimits.md +20 -0
- package/dist/docs/reference/export/export3mf.md +64 -0
- package/dist/docs/reference/export/exportGlb.md +68 -0
- package/dist/docs/reference/export/exportStl.md +64 -0
- package/dist/docs/reference/export/write3mf.md +71 -0
- package/dist/docs/reference/export/writeGlb.md +75 -0
- package/dist/docs/reference/export/writeStl.md +71 -0
- package/dist/docs/reference/export.md +21 -0
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +7 -1
- package/dist/docs/reference/geometry/Anchor3-type.md +13 -3
- package/dist/docs/reference/geometry/ArcCurve2.md +8 -2
- package/dist/docs/reference/geometry/ArcCurve3.md +8 -2
- package/dist/docs/reference/geometry/AttachOptions.md +13 -3
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +9 -3
- package/dist/docs/reference/geometry/Bevel.md +16 -2
- package/dist/docs/reference/geometry/BevelSize.md +16 -2
- package/dist/docs/reference/geometry/Bounds2-type.md +18 -4
- package/dist/docs/reference/geometry/Bounds2Data.md +22 -4
- package/dist/docs/reference/geometry/Bounds2Input.md +18 -4
- package/dist/docs/reference/geometry/Bounds2Options.md +14 -4
- package/dist/docs/reference/geometry/Bounds3-type.md +18 -4
- package/dist/docs/reference/geometry/Bounds3Data.md +18 -4
- package/dist/docs/reference/geometry/Bounds3Input.md +18 -4
- package/dist/docs/reference/geometry/Bounds3Options.md +14 -4
- package/dist/docs/reference/geometry/BoundsFit2.md +10 -4
- package/dist/docs/reference/geometry/BoundsFit3.md +10 -4
- package/dist/docs/reference/geometry/BoundsFitOptions.md +10 -4
- package/dist/docs/reference/geometry/BoxAnchorFace.md +9 -3
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +9 -3
- package/dist/docs/reference/geometry/BoxEdge.md +11 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +11 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +11 -1
- package/dist/docs/reference/geometry/BoxOptions.md +11 -1
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +16 -2
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +12 -2
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +15 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -1
- package/dist/docs/reference/geometry/CircularSampling.md +7 -1
- package/dist/docs/reference/geometry/CircularSamplingOptions.md +7 -1
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +8 -2
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -2
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +8 -2
- package/dist/docs/reference/geometry/Contour.md +12 -2
- package/dist/docs/reference/geometry/ContourCurve.md +8 -2
- package/dist/docs/reference/geometry/ContourPoint.md +8 -2
- package/dist/docs/reference/geometry/ContourSegment.md +8 -2
- package/dist/docs/reference/geometry/CorrespondingComponent.md +12 -2
- package/dist/docs/reference/geometry/CorrespondingContour.md +12 -2
- package/dist/docs/reference/geometry/CorrespondingProfile.md +12 -2
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +12 -2
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +8 -2
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +8 -2
- package/dist/docs/reference/geometry/Curve2.md +8 -2
- package/dist/docs/reference/geometry/Curve3.md +8 -2
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +16 -2
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +9 -3
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +11 -1
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +8 -2
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +12 -2
- package/dist/docs/reference/geometry/EndTreatments.md +12 -2
- package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +16 -2
- package/dist/docs/reference/geometry/ExtrudeOptions.md +13 -3
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +16 -2
- package/dist/docs/reference/geometry/FittedTextLayout.md +8 -2
- package/dist/docs/reference/geometry/Frame3.md +16 -2
- package/dist/docs/reference/geometry/GeometryError.md +11 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +11 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +11 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +15 -1
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +16 -2
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +15 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +12 -2
- package/dist/docs/reference/geometry/HeightfieldOptions.md +16 -2
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +12 -2
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +9 -3
- package/dist/docs/reference/geometry/ImmutableBuffer-type.md +16 -14
- package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +17 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +12 -2
- package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +12 -2
- package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +8 -2
- package/dist/docs/reference/geometry/KnuckleHingeInterval.md +8 -2
- package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +12 -2
- package/dist/docs/reference/geometry/KnuckleHingeSpec.md +12 -2
- package/dist/docs/reference/geometry/LineCurve2.md +8 -2
- package/dist/docs/reference/geometry/LineCurve3.md +8 -2
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/LoftCorrespondence.md +16 -2
- package/dist/docs/reference/geometry/LoftMeshStation.md +12 -2
- package/dist/docs/reference/geometry/LoftOptions.md +16 -2
- package/dist/docs/reference/geometry/LoftPlacement.md +16 -2
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +8 -2
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +12 -2
- package/dist/docs/reference/geometry/MetricFastenerSize.md +8 -2
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +8 -2
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +8 -2
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +8 -2
- package/dist/docs/reference/geometry/ModelingLimits.md +19 -1
- package/dist/docs/reference/geometry/NumericArray.md +16 -2
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +8 -2
- package/dist/docs/reference/geometry/Path2-type.md +16 -2
- package/dist/docs/reference/geometry/Path2Data.md +16 -2
- package/dist/docs/reference/geometry/Path2Input.md +16 -2
- package/dist/docs/reference/geometry/Path3-type.md +16 -2
- package/dist/docs/reference/geometry/Path3Data.md +16 -2
- package/dist/docs/reference/geometry/Path3Input.md +16 -2
- package/dist/docs/reference/geometry/PathFrame.md +8 -2
- package/dist/docs/reference/geometry/PathLocation.md +16 -2
- package/dist/docs/reference/geometry/PathNormalGuide.md +16 -2
- package/dist/docs/reference/geometry/PathOptions.md +12 -2
- package/dist/docs/reference/geometry/PathPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/PathPlacement.md +8 -2
- package/dist/docs/reference/geometry/PathResamplingOptions.md +16 -2
- package/dist/docs/reference/geometry/Pivot2Options.md +17 -3
- package/dist/docs/reference/geometry/Pivot3Options.md +17 -3
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +12 -2
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +12 -2
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +12 -2
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +12 -2
- package/dist/docs/reference/geometry/PolygonData.md +12 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -2
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +11 -1
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +11 -1
- package/dist/docs/reference/geometry/PrintableThreadFit.md +12 -2
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +12 -2
- package/dist/docs/reference/geometry/Profile.md +8 -2
- package/dist/docs/reference/geometry/ProfileComponent2.md +12 -2
- package/dist/docs/reference/geometry/ProfileContour2.md +12 -2
- package/dist/docs/reference/geometry/ProfileSpan2.md +12 -2
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/RackPitchDimensions.md +8 -2
- package/dist/docs/reference/geometry/RackPitchSpec.md +8 -2
- package/dist/docs/reference/geometry/RadialPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/RadialSizing.md +11 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +11 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +12 -2
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +12 -2
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +12 -2
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +8 -2
- package/dist/docs/reference/geometry/RegionData.md +12 -2
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +8 -2
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +7 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +16 -2
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +10 -4
- package/dist/docs/reference/geometry/SampleContourOptions.md +8 -2
- package/dist/docs/reference/geometry/SampleHelixOptions.md +8 -2
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +8 -2
- package/dist/docs/reference/geometry/SampledCurve2.md +8 -2
- package/dist/docs/reference/geometry/SampledCurve3.md +8 -2
- package/dist/docs/reference/geometry/SampledThreadHelices.md +8 -2
- package/dist/docs/reference/geometry/SideProfileCurve.md +8 -2
- package/dist/docs/reference/geometry/SideProfilePoint.md +8 -2
- package/dist/docs/reference/geometry/SideProfileSegment.md +8 -2
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +12 -2
- package/dist/docs/reference/geometry/SphereOptions.md +11 -1
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/StarContourOptions.md +12 -2
- package/dist/docs/reference/geometry/StrokeCap.md +12 -2
- package/dist/docs/reference/geometry/StrokeJoin.md +12 -2
- package/dist/docs/reference/geometry/StrokeOptions.md +12 -2
- package/dist/docs/reference/geometry/SvgImportOptions.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +8 -2
- package/dist/docs/reference/geometry/SweepOptions.md +16 -2
- package/dist/docs/reference/geometry/SweepOrientation.md +16 -2
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +12 -2
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +8 -2
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +8 -2
- package/dist/docs/reference/geometry/ThreadEndStyle.md +16 -2
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +16 -2
- package/dist/docs/reference/geometry/ThreadHandedness.md +16 -2
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +8 -2
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +16 -2
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +16 -2
- package/dist/docs/reference/geometry/ThreadProfile-type.md +16 -2
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +16 -2
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/ThreadRidgeOptions.md +16 -2
- package/dist/docs/reference/geometry/ThreadRole.md +8 -2
- package/dist/docs/reference/geometry/ThreadSolidOptions.md +12 -2
- package/dist/docs/reference/geometry/ThreadSolidPreflight.md +16 -2
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +12 -2
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +12 -2
- package/dist/docs/reference/geometry/ThreadedNutShape.md +12 -2
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +12 -2
- package/dist/docs/reference/geometry/TorusOptions.md +11 -1
- package/dist/docs/reference/geometry/Transform2-type.md +17 -3
- package/dist/docs/reference/geometry/Transform2Data.md +17 -3
- package/dist/docs/reference/geometry/Transform2Input.md +17 -3
- package/dist/docs/reference/geometry/Transform3-type.md +17 -3
- package/dist/docs/reference/geometry/Transform3Data.md +17 -3
- package/dist/docs/reference/geometry/Transform3Input.md +17 -3
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/TriangleMesh.md +20 -2
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +16 -2
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshInput.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +16 -2
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +16 -2
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +12 -2
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/TubeOptions.md +11 -1
- package/dist/docs/reference/geometry/Vector2-type.md +17 -3
- package/dist/docs/reference/geometry/Vector2Data.md +21 -3
- package/dist/docs/reference/geometry/Vector2Input.md +17 -3
- package/dist/docs/reference/geometry/Vector3-type.md +17 -3
- package/dist/docs/reference/geometry/Vector3Data.md +17 -3
- package/dist/docs/reference/geometry/Vector3Input.md +17 -3
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +12 -2
- package/dist/docs/reference/geometry/VectorTextLayout.md +16 -2
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +12 -2
- package/dist/docs/reference/geometry/VectorTextMetrics.md +16 -2
- package/dist/docs/reference/geometry/VectorTextOptions.md +12 -2
- package/dist/docs/reference/geometry/add2.md +9 -3
- package/dist/docs/reference/geometry/add3.md +9 -3
- package/dist/docs/reference/geometry/anchor3.md +9 -3
- package/dist/docs/reference/geometry/anchorFrame3.md +8 -2
- package/dist/docs/reference/geometry/applyTransformDirection3.md +9 -3
- package/dist/docs/reference/geometry/applyTransformPoint3.md +9 -3
- package/dist/docs/reference/geometry/attachmentTransform3.md +9 -3
- package/dist/docs/reference/geometry/bounds2.md +16 -6
- package/dist/docs/reference/geometry/bounds3.md +16 -6
- package/dist/docs/reference/geometry/boundsCenter.md +10 -4
- package/dist/docs/reference/geometry/boundsSize.md +10 -4
- package/dist/docs/reference/geometry/boxAnchor3.md +9 -3
- package/dist/docs/reference/geometry/categories/bounds-layout.md +4 -4
- package/dist/docs/reference/geometry/categories/curves-paths.md +2 -2
- package/dist/docs/reference/geometry/categories/mechanical.md +2 -2
- package/dist/docs/reference/geometry/categories/meshes.md +3 -3
- package/dist/docs/reference/geometry/categories/pattern-placement.md +2 -2
- package/dist/docs/reference/geometry/categories/primitive-options.md +2 -2
- package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -2
- package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
- package/dist/docs/reference/geometry/categories/transforms-math.md +3 -3
- package/dist/docs/reference/geometry/categories/vector-import.md +2 -2
- package/dist/docs/reference/geometry/circleContour.md +8 -2
- package/dist/docs/reference/geometry/closeToAxis.md +8 -2
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +8 -2
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +8 -2
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +8 -2
- package/dist/docs/reference/geometry/composeTransform3.md +9 -3
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +8 -2
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -2
- package/dist/docs/reference/geometry/contourContainsPoint.md +8 -2
- package/dist/docs/reference/geometry/cross2.md +9 -3
- package/dist/docs/reference/geometry/cross3.md +9 -3
- package/dist/docs/reference/geometry/cylinderAnchor3.md +9 -3
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +8 -2
- package/dist/docs/reference/geometry/distance2.md +9 -3
- package/dist/docs/reference/geometry/distance3.md +9 -3
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -2
- package/dist/docs/reference/geometry/dot2.md +9 -3
- package/dist/docs/reference/geometry/dot3.md +9 -3
- package/dist/docs/reference/geometry/ellipseContour.md +8 -2
- package/dist/docs/reference/geometry/eulerTransform3.md +9 -3
- package/dist/docs/reference/geometry/fitBounds.md +10 -4
- package/dist/docs/reference/geometry/fitTextLayout.md +8 -2
- package/dist/docs/reference/geometry/frameTransform3.md +9 -3
- package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +8 -2
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +8 -2
- package/dist/docs/reference/geometry/gridPatternTransforms.md +8 -2
- package/dist/docs/reference/geometry/immutableBuffer.md +12 -2
- package/dist/docs/reference/geometry/inverseTransform3.md +9 -3
- package/dist/docs/reference/geometry/isGeometryError.md +11 -1
- package/dist/docs/reference/geometry/layoutRow.md +10 -4
- package/dist/docs/reference/geometry/length2.md +9 -3
- package/dist/docs/reference/geometry/length3.md +9 -3
- package/dist/docs/reference/geometry/lerp2.md +9 -3
- package/dist/docs/reference/geometry/lerp3.md +9 -3
- package/dist/docs/reference/geometry/linearPatternTransforms.md +8 -2
- package/dist/docs/reference/geometry/matchProfiles.md +8 -2
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +8 -2
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +8 -2
- package/dist/docs/reference/geometry/normalize2.md +9 -3
- package/dist/docs/reference/geometry/normalize3.md +9 -3
- package/dist/docs/reference/geometry/normalizeContour.md +8 -2
- package/dist/docs/reference/geometry/normalizePolygon.md +8 -2
- package/dist/docs/reference/geometry/normalizeRegion.md +8 -2
- package/dist/docs/reference/geometry/path2.md +12 -2
- package/dist/docs/reference/geometry/path3.md +12 -2
- package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -2
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +8 -2
- package/dist/docs/reference/geometry/preflightSvgRegion.md +8 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +8 -2
- package/dist/docs/reference/geometry/preflightThreadedRod.md +8 -2
- package/dist/docs/reference/geometry/projectOntoPlane3.md +9 -3
- package/dist/docs/reference/geometry/radialPatternTransforms.md +8 -2
- package/dist/docs/reference/geometry/rectangleContour.md +8 -2
- package/dist/docs/reference/geometry/rectangleProfile.md +8 -2
- package/dist/docs/reference/geometry/regionArea.md +8 -2
- package/dist/docs/reference/geometry/regionBounds.md +8 -2
- package/dist/docs/reference/geometry/regularPolygonContour.md +8 -2
- package/dist/docs/reference/geometry/resamplePolyline2.md +8 -2
- package/dist/docs/reference/geometry/resamplePolyline3.md +8 -2
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +7 -1
- package/dist/docs/reference/geometry/resolveArcSegments.md +7 -1
- package/dist/docs/reference/geometry/resolveCircularSampling.md +7 -1
- package/dist/docs/reference/geometry/resolveCircularSegments.md +7 -1
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +8 -2
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +8 -2
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +8 -2
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +8 -2
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +7 -1
- package/dist/docs/reference/geometry/resolveKnuckleHinge.md +8 -2
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +8 -2
- package/dist/docs/reference/geometry/resolveRackPitch.md +8 -2
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -2
- package/dist/docs/reference/geometry/rotate2.md +9 -3
- package/dist/docs/reference/geometry/rotationTransform3.md +9 -3
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -2
- package/dist/docs/reference/geometry/sampleContour.md +8 -2
- package/dist/docs/reference/geometry/sampleCurve2.md +8 -2
- package/dist/docs/reference/geometry/sampleCurve3.md +8 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +8 -2
- package/dist/docs/reference/geometry/sampleHelix.md +8 -2
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +8 -2
- package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -2
- package/dist/docs/reference/geometry/sampleSideProfile.md +8 -2
- package/dist/docs/reference/geometry/sampleTextContours.md +8 -2
- package/dist/docs/reference/geometry/sampleThreadHelices.md +8 -2
- package/dist/docs/reference/geometry/scale2.md +9 -3
- package/dist/docs/reference/geometry/scale3.md +9 -3
- package/dist/docs/reference/geometry/scaleTransform3.md +9 -3
- package/dist/docs/reference/geometry/signedContourArea.md +8 -2
- package/dist/docs/reference/geometry/starContour.md +8 -2
- package/dist/docs/reference/geometry/strokeRegionData.md +8 -2
- package/dist/docs/reference/geometry/subtract2.md +9 -3
- package/dist/docs/reference/geometry/subtract3.md +9 -3
- package/dist/docs/reference/geometry/threadProfile.md +8 -2
- package/dist/docs/reference/geometry/transform2.md +13 -3
- package/dist/docs/reference/geometry/transform3.md +13 -3
- package/dist/docs/reference/geometry/transformDeterminant3.md +9 -3
- package/dist/docs/reference/geometry/transformRegionData.md +8 -2
- package/dist/docs/reference/geometry/translationTransform3.md +9 -3
- package/dist/docs/reference/geometry/triangulateContour.md +8 -2
- package/dist/docs/reference/geometry/validateRigidTransform3.md +9 -3
- package/dist/docs/reference/geometry/validateTransform3.md +9 -3
- package/dist/docs/reference/geometry/vector2.md +13 -3
- package/dist/docs/reference/geometry/vector3.md +13 -3
- package/dist/docs/reference/geometry.md +2 -2
- package/dist/docs/reference/mesh/MeshRenderOptions.md +28 -0
- package/dist/docs/reference/mesh/RenderMesh.md +68 -0
- package/dist/docs/reference/mesh/analyze.md +12 -6
- package/dist/docs/reference/mesh/analyzeQuality.md +11 -5
- package/dist/docs/reference/mesh/bounds.md +10 -4
- package/dist/docs/reference/mesh/categories/operations.md +5 -95
- package/dist/docs/reference/mesh/centroid.md +10 -4
- package/dist/docs/reference/mesh/extrude.md +11 -5
- package/dist/docs/reference/mesh/heightfield.md +11 -5
- package/dist/docs/reference/mesh/immutable.md +13 -9
- package/dist/docs/reference/mesh/join.md +10 -4
- package/dist/docs/reference/mesh/loft.md +11 -5
- package/dist/docs/reference/mesh/optimizePlanarPatches.md +11 -5
- package/dist/docs/reference/mesh/preflightHeightfield.md +11 -5
- package/dist/docs/reference/mesh/preflightThreadSolid.md +10 -4
- package/dist/docs/reference/mesh/render.md +57 -0
- package/dist/docs/reference/mesh/reverse.md +10 -4
- package/dist/docs/reference/mesh/revolve.md +11 -5
- package/dist/docs/reference/mesh/signature.md +11 -5
- package/dist/docs/reference/mesh/sweep.md +12 -6
- package/dist/docs/reference/mesh/threadRidge.md +10 -4
- package/dist/docs/reference/mesh/threadSolid.md +10 -4
- package/dist/docs/reference/mesh/transform.md +11 -5
- package/dist/docs/reference/mesh/validate.md +10 -4
- package/dist/docs/reference/mesh/validateSolid.md +10 -4
- package/dist/docs/reference/mesh.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +13 -7
- package/dist/docs/reference/model/DiagnosticOptions.md +7 -1
- package/dist/docs/reference/model/EllipseOptions.md +13 -7
- package/dist/docs/reference/model/GenerateCallback.md +7 -1
- package/dist/docs/reference/model/GenerateContext.md +14 -39
- package/dist/docs/reference/model/GenerationDiagnostic.md +7 -1
- package/dist/docs/reference/model/GenerationError.md +8 -2
- package/dist/docs/reference/model/HoleCutterOptions.md +17 -10
- package/dist/docs/reference/model/HoleCutterOverrun.md +10 -3
- package/dist/docs/reference/model/HoleCutterRecess.md +10 -3
- package/dist/docs/reference/model/HullOptions.md +13 -6
- package/dist/docs/reference/model/ImmutableValue.md +7 -1
- package/dist/docs/reference/model/ImplicitOptions.md +12 -6
- package/dist/docs/reference/model/JoinOptions.md +76 -0
- package/dist/docs/reference/model/JoinTransition.md +54 -0
- package/dist/docs/reference/model/KnuckleHinge-type.md +9 -3
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +7 -1
- package/dist/docs/reference/model/KnuckleHingeOptions.md +10 -4
- package/dist/docs/reference/model/KnuckleHingeWeb.md +7 -1
- package/dist/docs/reference/model/LoftStation.md +16 -9
- package/dist/docs/reference/model/Memo.md +54 -0
- package/dist/docs/reference/model/ModelProgram.md +7 -1
- package/dist/docs/reference/model/PartDeclaration.md +11 -6
- package/dist/docs/reference/model/PartGeometry.md +10 -4
- package/dist/docs/reference/model/PartOptions.md +11 -6
- package/dist/docs/reference/model/PatternSource.md +10 -4
- package/dist/docs/reference/model/PlaneOptions.md +11 -4
- package/dist/docs/reference/model/PolygonOptions.md +20 -14
- package/dist/docs/reference/model/Profile.md +10 -4
- package/dist/docs/reference/model/RectangleOptions.md +28 -22
- package/dist/docs/reference/model/RegularPolygonOptions.md +13 -7
- package/dist/docs/reference/model/Section.md +68 -74
- package/dist/docs/reference/model/SectionHullOptions.md +13 -6
- package/dist/docs/reference/model/SectionInspection.md +10 -4
- package/dist/docs/reference/model/SectionOffsetJoin.md +10 -4
- package/dist/docs/reference/model/SectionOffsetOptions.md +12 -6
- package/dist/docs/reference/model/Solid.md +101 -53
- package/dist/docs/reference/model/SolidInspection.md +10 -4
- package/dist/docs/reference/model/SolidSegmentHit.md +11 -5
- package/dist/docs/reference/model/StarOptions.md +24 -18
- package/dist/docs/reference/model/SvgOrigin.md +10 -4
- package/dist/docs/reference/model/SvgPathSectionOptions.md +14 -8
- package/dist/docs/reference/model/SvgSectionOptions.md +16 -10
- package/dist/docs/reference/model/TextSectionOptions.md +14 -8
- package/dist/docs/reference/model/box.md +18 -11
- package/dist/docs/reference/model/categories/boolean-operations.md +8 -2
- package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -7
- package/dist/docs/reference/model/categories/explicit-profiles.md +1 -14
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +6 -20
- package/dist/docs/reference/model/categories/generation.md +5 -10
- package/dist/docs/reference/model/categories/hinges.md +1 -4
- package/dist/docs/reference/model/categories/mesh-inspection.md +2 -6
- package/dist/docs/reference/model/categories/primitives.md +5 -21
- package/dist/docs/reference/model/categories/sections.md +4 -15
- package/dist/docs/reference/model/categories/threads.md +2 -39
- package/dist/docs/reference/model/categories/transforms-placement.md +4 -33
- package/dist/docs/reference/model/circle.md +10 -4
- package/dist/docs/reference/model/cylinder.md +13 -6
- package/dist/docs/reference/model/ellipse.md +10 -4
- package/dist/docs/reference/model/extrude.md +26 -19
- package/dist/docs/reference/model/generate.md +8 -2
- package/dist/docs/reference/model/gridPattern.md +15 -9
- package/dist/docs/reference/model/heightfield.md +10 -4
- package/dist/docs/reference/model/holeCutter.md +10 -3
- package/dist/docs/reference/model/hull.md +9 -2
- package/dist/docs/reference/model/implicit.md +9 -3
- package/dist/docs/reference/model/internalThreadCutter.md +23 -17
- package/dist/docs/reference/model/intersect.md +9 -2
- package/dist/docs/reference/model/join.md +89 -0
- package/dist/docs/reference/model/knuckleHinge.md +7 -1
- package/dist/docs/reference/model/linearPattern.md +15 -9
- package/dist/docs/reference/model/loft.md +31 -24
- package/dist/docs/reference/model/matchProfiles.md +14 -8
- package/dist/docs/reference/model/minkowskiSum.md +9 -2
- package/dist/docs/reference/model/pathPattern.md +25 -19
- package/dist/docs/reference/model/polygon.md +13 -7
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +25 -19
- package/dist/docs/reference/model/preflightThreadedNut.md +29 -23
- package/dist/docs/reference/model/preflightThreadedRod.md +25 -19
- package/dist/docs/reference/model/radialPattern.md +15 -9
- package/dist/docs/reference/model/rectangle.md +14 -8
- package/dist/docs/reference/model/regularPolygon.md +10 -4
- package/dist/docs/reference/model/revolve.md +22 -15
- package/dist/docs/reference/model/solidFromMesh.md +12 -6
- package/dist/docs/reference/model/sphere.md +13 -6
- package/dist/docs/reference/model/star.md +12 -6
- package/dist/docs/reference/model/stroke.md +21 -15
- package/dist/docs/reference/model/svgPathSection.md +12 -6
- package/dist/docs/reference/model/svgSection.md +13 -7
- package/dist/docs/reference/model/sweep.md +27 -20
- package/dist/docs/reference/model/textSection.md +15 -9
- package/dist/docs/reference/model/threadRidge.md +21 -15
- package/dist/docs/reference/model/threadedNut.md +27 -21
- package/dist/docs/reference/model/threadedRod.md +23 -17
- package/dist/docs/reference/model/torus.md +20 -13
- package/dist/docs/reference/model/tube.md +13 -6
- package/dist/docs/reference/model/union.md +9 -2
- package/dist/docs/reference/model.md +3 -8
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -1
- package/dist/docs/reference/text/VectorFont.md +39 -33
- package/dist/docs/reference/text/VectorFontOptions.md +7 -1
- package/dist/docs/reference/text/categories/font-preparation.md +1 -13
- package/dist/docs/reference/text/prepareVectorFont.md +7 -1
- package/dist/docs/reference/text.md +1 -1
- package/dist/engine/finalization.js +2 -74
- package/dist/engine/index.js +2 -2
- package/dist/engine/native/construction-mesh.js +41 -0
- package/dist/engine/native/material-components.js +2 -51
- package/dist/engine/native/mesh-observation.js +55 -0
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/operations/context.js +2 -0
- package/dist/engine/operations/extrusion-finishing.js +17 -16
- package/dist/engine/operations/join-collar-profile.js +120 -0
- package/dist/engine/operations/join.js +508 -0
- package/dist/engine/recipe-realization.js +1 -1
- package/dist/engine/session/dependencies.js +89 -42
- package/dist/engine/session/graph.js +319 -342
- package/dist/engine/session/native-cache.js +1 -1
- package/dist/engine/session/session.js +5 -5
- package/dist/engine/session/snapshot-cache.js +2 -2
- package/dist/export/3mf.js +190 -0
- package/dist/export/capture.js +178 -0
- package/dist/export/glb.js +209 -0
- package/dist/export/index.js +5 -0
- package/dist/export/limits.js +18 -0
- package/dist/export/stl.js +105 -0
- package/dist/export/types.js +1 -0
- package/dist/export/writer.js +54 -0
- package/dist/geometry/bounds-value.js +4 -4
- package/dist/geometry/immutable-buffer.js +4 -6
- package/dist/geometry/join-geometry.js +839 -0
- package/dist/geometry/mesh/mesh-render.js +205 -0
- package/dist/geometry/mesh/mesh-solid-intersections.js +43 -17
- package/dist/geometry/mesh/mesh-solid.js +6 -2
- package/dist/geometry/mesh-api.js +1 -0
- package/dist/geometry/region-offset.js +278 -0
- package/dist/geometry/regions.js +11 -1
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +2 -2
- package/dist/model/immutable-generation-data.js +13 -13
- package/dist/model/join.js +1 -0
- package/dist/model/operations.js +20 -0
- package/dist/model/recipe-declaration.js +1 -0
- package/dist/model/shape-handles.js +1 -0
- package/package.json +18 -1
- package/dist/docs/reference/engine/Export3mfOptions.md +0 -46
- package/dist/docs/reference/engine/ExportMeshPart.md +0 -31
- package/dist/docs/reference/engine/ModelingLimits.md +0 -121
- package/dist/docs/reference/engine/export3mf.md +0 -55
- package/dist/docs/reference/mesh/AcmeThreadProfileSpec.md +0 -79
- package/dist/docs/reference/mesh/Bevel.md +0 -18
- package/dist/docs/reference/mesh/BevelSize.md +0 -14
- package/dist/docs/reference/mesh/Bounds2.md +0 -125
- package/dist/docs/reference/mesh/Bounds2Data.md +0 -43
- package/dist/docs/reference/mesh/Bounds2Input.md +0 -19
- package/dist/docs/reference/mesh/Bounds3.md +0 -125
- package/dist/docs/reference/mesh/Bounds3Data.md +0 -43
- package/dist/docs/reference/mesh/Bounds3Input.md +0 -19
- package/dist/docs/reference/mesh/ButtressPressureFlankSide.md +0 -14
- package/dist/docs/reference/mesh/ButtressThreadProfileSpec.md +0 -97
- package/dist/docs/reference/mesh/CircularPrimitiveOptions.md +0 -60
- package/dist/docs/reference/mesh/CurveSamplingOptions.md +0 -69
- package/dist/docs/reference/mesh/CustomThreadProfileSpec.md +0 -77
- package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +0 -129
- package/dist/docs/reference/mesh/ExtrusionSamplingOptions.md +0 -81
- package/dist/docs/reference/mesh/Frame3.md +0 -62
- package/dist/docs/reference/mesh/GeometryResolution.md +0 -74
- package/dist/docs/reference/mesh/GeometrySamplingLimits.md +0 -66
- package/dist/docs/reference/mesh/GeometryToleranceOptions.md +0 -46
- package/dist/docs/reference/mesh/HeightfieldMeshLimits.md +0 -18
- package/dist/docs/reference/mesh/HeightfieldOptions.md +0 -72
- package/dist/docs/reference/mesh/HeightfieldPreflight.md +0 -58
- package/dist/docs/reference/mesh/ImmutableBuffer.md +0 -108
- package/dist/docs/reference/mesh/ImmutableTriangleMesh.md +0 -43
- package/dist/docs/reference/mesh/LoftCorrespondence.md +0 -24
- package/dist/docs/reference/mesh/LoftMeshStation.md +0 -31
- package/dist/docs/reference/mesh/LoftOptions.md +0 -88
- package/dist/docs/reference/mesh/LoftPlacement.md +0 -70
- package/dist/docs/reference/mesh/ModelingLimits.md +0 -130
- package/dist/docs/reference/mesh/NumericArray.md +0 -14
- package/dist/docs/reference/mesh/Path2.md +0 -197
- package/dist/docs/reference/mesh/Path2Data.md +0 -50
- package/dist/docs/reference/mesh/Path2Input.md +0 -20
- package/dist/docs/reference/mesh/Path3.md +0 -197
- package/dist/docs/reference/mesh/Path3Data.md +0 -50
- package/dist/docs/reference/mesh/Path3Input.md +0 -20
- package/dist/docs/reference/mesh/PathLocation.md +0 -69
- package/dist/docs/reference/mesh/PathNormalGuide.md +0 -43
- package/dist/docs/reference/mesh/PathResamplingOptions.md +0 -84
- package/dist/docs/reference/mesh/Pivot2Options.md +0 -26
- package/dist/docs/reference/mesh/Pivot3Options.md +0 -26
- package/dist/docs/reference/mesh/PlanarMeshOptimizationFallbackReason.md +0 -14
- package/dist/docs/reference/mesh/PlanarMeshOptimizationOptions.md +0 -160
- package/dist/docs/reference/mesh/PlanarMeshOptimizationResult.md +0 -124
- package/dist/docs/reference/mesh/PlanarPatchQuality.md +0 -194
- package/dist/docs/reference/mesh/RevolveOptions.md +0 -91
- package/dist/docs/reference/mesh/SolidMeshValidationOptions.md +0 -38
- package/dist/docs/reference/mesh/SquareThreadProfileSpec.md +0 -79
- package/dist/docs/reference/mesh/SweepOptions.md +0 -113
- package/dist/docs/reference/mesh/SweepOrientation.md +0 -113
- package/dist/docs/reference/mesh/ThreadEndStyle.md +0 -14
- package/dist/docs/reference/mesh/ThreadEndTreatmentOptions.md +0 -117
- package/dist/docs/reference/mesh/ThreadHandedness.md +0 -14
- package/dist/docs/reference/mesh/ThreadLeadInEnvelope.md +0 -14
- package/dist/docs/reference/mesh/ThreadLeadInShape.md +0 -14
- package/dist/docs/reference/mesh/ThreadProfile.md +0 -86
- package/dist/docs/reference/mesh/ThreadProfileBaseSpec.md +0 -53
- package/dist/docs/reference/mesh/ThreadProfileSpec.md +0 -23
- package/dist/docs/reference/mesh/ThreadRidgeOptions.md +0 -145
- package/dist/docs/reference/mesh/ThreadSolidOptions.md +0 -222
- package/dist/docs/reference/mesh/ThreadSolidPreflight.md +0 -58
- package/dist/docs/reference/mesh/Transform2.md +0 -256
- package/dist/docs/reference/mesh/Transform2Data.md +0 -14
- package/dist/docs/reference/mesh/Transform2Input.md +0 -19
- package/dist/docs/reference/mesh/Transform3.md +0 -296
- package/dist/docs/reference/mesh/Transform3Data.md +0 -17
- package/dist/docs/reference/mesh/Transform3Input.md +0 -19
- package/dist/docs/reference/mesh/TrapezoidalThreadProfileSpec.md +0 -96
- package/dist/docs/reference/mesh/TriangleMesh.md +0 -34
- package/dist/docs/reference/mesh/TriangleMeshAnalysis.md +0 -129
- package/dist/docs/reference/mesh/TriangleMeshAnalysisOptions.md +0 -79
- package/dist/docs/reference/mesh/TriangleMeshInput.md +0 -19
- package/dist/docs/reference/mesh/TriangleMeshMeasurements.md +0 -79
- package/dist/docs/reference/mesh/TriangleMeshQualityOptions.md +0 -43
- package/dist/docs/reference/mesh/TriangleMeshQualityReport.md +0 -194
- package/dist/docs/reference/mesh/TriangleMeshSignature.md +0 -111
- package/dist/docs/reference/mesh/TriangleMeshSignatureOptions.md +0 -46
- package/dist/docs/reference/mesh/TriangleMeshSignatureTolerances.md +0 -34
- package/dist/docs/reference/mesh/TriangleMeshTopologyAnalysis.md +0 -131
- package/dist/docs/reference/mesh/TriangleMeshValidationOptions.md +0 -55
- package/dist/docs/reference/mesh/TriangularThreadProfileSpec.md +0 -95
- package/dist/docs/reference/mesh/Vector2.md +0 -270
- package/dist/docs/reference/mesh/Vector2Data.md +0 -14
- package/dist/docs/reference/mesh/Vector2Input.md +0 -19
- package/dist/docs/reference/mesh/Vector3.md +0 -282
- package/dist/docs/reference/mesh/Vector3Data.md +0 -14
- package/dist/docs/reference/mesh/Vector3Input.md +0 -19
- package/dist/docs/reference/model/AcmeThreadProfileSpec.md +0 -80
- package/dist/docs/reference/model/Anchor3.md +0 -55
- package/dist/docs/reference/model/AttachOptions.md +0 -69
- package/dist/docs/reference/model/Bevel.md +0 -19
- package/dist/docs/reference/model/BevelSize.md +0 -15
- package/dist/docs/reference/model/Bounds2-type.md +0 -125
- package/dist/docs/reference/model/Bounds2Data.md +0 -44
- package/dist/docs/reference/model/Bounds2Input.md +0 -19
- package/dist/docs/reference/model/Bounds2Options.md +0 -110
- package/dist/docs/reference/model/Bounds3-type.md +0 -125
- package/dist/docs/reference/model/Bounds3Data.md +0 -44
- package/dist/docs/reference/model/Bounds3Input.md +0 -19
- package/dist/docs/reference/model/Bounds3Options.md +0 -110
- package/dist/docs/reference/model/BoxEdge.md +0 -15
- package/dist/docs/reference/model/BoxEdgeSelection.md +0 -19
- package/dist/docs/reference/model/BoxEdgeTreatments.md +0 -20
- package/dist/docs/reference/model/BoxOptions.md +0 -92
- package/dist/docs/reference/model/ButtressPressureFlankSide.md +0 -15
- package/dist/docs/reference/model/ButtressThreadProfileSpec.md +0 -98
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +0 -35
- package/dist/docs/reference/model/CircleContourOptions.md +0 -21
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +0 -62
- package/dist/docs/reference/model/Computed.md +0 -44
- package/dist/docs/reference/model/ComputedValue.md +0 -24
- package/dist/docs/reference/model/Contour.md +0 -24
- package/dist/docs/reference/model/CorrespondingComponent.md +0 -46
- package/dist/docs/reference/model/CorrespondingContour.md +0 -46
- package/dist/docs/reference/model/CorrespondingProfile.md +0 -22
- package/dist/docs/reference/model/CorrespondingProfileStation.md +0 -27
- package/dist/docs/reference/model/CurveSamplingOptions.md +0 -68
- package/dist/docs/reference/model/CustomThreadProfileSpec.md +0 -78
- package/dist/docs/reference/model/CylinderOptions.md +0 -58
- package/dist/docs/reference/model/EdgeTreatment.md +0 -22
- package/dist/docs/reference/model/EllipseContourOptions.md +0 -21
- package/dist/docs/reference/model/EndTreatments.md +0 -39
- package/dist/docs/reference/model/ExtrudeMeshOptions.md +0 -133
- package/dist/docs/reference/model/ExtrudeOptions.md +0 -149
- package/dist/docs/reference/model/ExtrusionSamplingOptions.md +0 -84
- package/dist/docs/reference/model/Frame3.md +0 -63
- package/dist/docs/reference/model/GeometryError.md +0 -102
- package/dist/docs/reference/model/GeometryErrorCode.md +0 -15
- package/dist/docs/reference/model/GeometryErrorContext.md +0 -35
- package/dist/docs/reference/model/GeometryResolution.md +0 -70
- package/dist/docs/reference/model/GeometrySamplingLimits.md +0 -62
- package/dist/docs/reference/model/GeometryToleranceOptions.md +0 -46
- package/dist/docs/reference/model/GridPatternOptions.md +0 -50
- package/dist/docs/reference/model/HeightfieldOptions.md +0 -68
- package/dist/docs/reference/model/ImmutableBuffer-type.md +0 -108
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +0 -43
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +0 -216
- package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +0 -77
- package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +0 -47
- package/dist/docs/reference/model/KnuckleHingeSpec.md +0 -18
- package/dist/docs/reference/model/LinearPatternOptions.md +0 -39
- package/dist/docs/reference/model/LoftCorrespondence.md +0 -27
- package/dist/docs/reference/model/LoftOptions.md +0 -91
- package/dist/docs/reference/model/LoftPlacement.md +0 -73
- package/dist/docs/reference/model/MatchProfilesOptions.md +0 -35
- package/dist/docs/reference/model/ModelingLimits.md +0 -126
- package/dist/docs/reference/model/NumericArray.md +0 -14
- package/dist/docs/reference/model/Path2-type.md +0 -196
- package/dist/docs/reference/model/Path2Data.md +0 -50
- package/dist/docs/reference/model/Path2Input.md +0 -20
- package/dist/docs/reference/model/Path3-type.md +0 -196
- package/dist/docs/reference/model/Path3Data.md +0 -50
- package/dist/docs/reference/model/Path3Input.md +0 -20
- package/dist/docs/reference/model/PathLocation.md +0 -69
- package/dist/docs/reference/model/PathNormalGuide.md +0 -46
- package/dist/docs/reference/model/PathOptions.md +0 -38
- package/dist/docs/reference/model/PathPatternOptions.md +0 -48
- package/dist/docs/reference/model/PathResamplingOptions.md +0 -84
- package/dist/docs/reference/model/Pivot2Options.md +0 -28
- package/dist/docs/reference/model/Pivot3Options.md +0 -28
- package/dist/docs/reference/model/PolygonData.md +0 -44
- package/dist/docs/reference/model/PrimitiveAttachment.md +0 -39
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +0 -110
- package/dist/docs/reference/model/PrintableThreadFit.md +0 -15
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +0 -51
- package/dist/docs/reference/model/ProfileComponent2.md +0 -46
- package/dist/docs/reference/model/ProfileContour2.md +0 -36
- package/dist/docs/reference/model/ProfileSpan2.md +0 -47
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +0 -41
- package/dist/docs/reference/model/RadialPatternOptions.md +0 -59
- package/dist/docs/reference/model/RadialSizing.md +0 -15
- package/dist/docs/reference/model/RadialSizingOptions.md +0 -40
- package/dist/docs/reference/model/RectangleContourOptions.md +0 -72
- package/dist/docs/reference/model/RectangleCornerTreatment.md +0 -40
- package/dist/docs/reference/model/RectangleCornerTreatments.md +0 -20
- package/dist/docs/reference/model/RegionData.md +0 -19
- package/dist/docs/reference/model/RevolveOptions.md +0 -94
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +0 -96
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +0 -76
- package/dist/docs/reference/model/SphereOptions.md +0 -20
- package/dist/docs/reference/model/SquareThreadProfileSpec.md +0 -80
- package/dist/docs/reference/model/StarContourOptions.md +0 -81
- package/dist/docs/reference/model/StrokeCap.md +0 -16
- package/dist/docs/reference/model/StrokeJoin.md +0 -16
- package/dist/docs/reference/model/StrokeOptions.md +0 -91
- package/dist/docs/reference/model/SweepOptions.md +0 -116
- package/dist/docs/reference/model/SweepOrientation.md +0 -116
- package/dist/docs/reference/model/ThreadBevelOptions.md +0 -35
- package/dist/docs/reference/model/ThreadEndStyle.md +0 -15
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +0 -118
- package/dist/docs/reference/model/ThreadHandedness.md +0 -15
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +0 -15
- package/dist/docs/reference/model/ThreadLeadInShape.md +0 -15
- package/dist/docs/reference/model/ThreadProfile.md +0 -87
- package/dist/docs/reference/model/ThreadProfileBaseSpec.md +0 -54
- package/dist/docs/reference/model/ThreadProfileSpec.md +0 -24
- package/dist/docs/reference/model/ThreadRidgeOptions.md +0 -141
- package/dist/docs/reference/model/ThreadSolidPreflight.md +0 -59
- package/dist/docs/reference/model/ThreadedNutOptions.md +0 -263
- package/dist/docs/reference/model/ThreadedNutPreflight.md +0 -111
- package/dist/docs/reference/model/ThreadedNutShape.md +0 -15
- package/dist/docs/reference/model/ThreadedRodOptions.md +0 -216
- package/dist/docs/reference/model/TorusOptions.md +0 -110
- package/dist/docs/reference/model/Transform2-type.md +0 -257
- package/dist/docs/reference/model/Transform2Data.md +0 -16
- package/dist/docs/reference/model/Transform2Input.md +0 -21
- package/dist/docs/reference/model/Transform3-type.md +0 -297
- package/dist/docs/reference/model/Transform3Data.md +0 -19
- package/dist/docs/reference/model/Transform3Input.md +0 -21
- package/dist/docs/reference/model/TrapezoidalThreadProfileSpec.md +0 -97
- package/dist/docs/reference/model/TriangleMesh.md +0 -34
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +0 -129
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +0 -79
- package/dist/docs/reference/model/TriangleMeshTopologyAnalysis.md +0 -131
- package/dist/docs/reference/model/TriangularThreadProfileSpec.md +0 -96
- package/dist/docs/reference/model/TubeOptions.md +0 -67
- package/dist/docs/reference/model/Vector2-type.md +0 -271
- package/dist/docs/reference/model/Vector2Data.md +0 -15
- package/dist/docs/reference/model/Vector2Input.md +0 -21
- package/dist/docs/reference/model/Vector3-type.md +0 -283
- package/dist/docs/reference/model/Vector3Data.md +0 -15
- package/dist/docs/reference/model/Vector3Input.md +0 -21
- package/dist/docs/reference/model/VectorTextLayout.md +0 -40
- package/dist/docs/reference/model/VectorTextMetrics.md +0 -100
- package/dist/docs/reference/model/bounds2.md +0 -37
- package/dist/docs/reference/model/bounds3.md +0 -37
- package/dist/docs/reference/model/categories/bounds.md +0 -38
- package/dist/docs/reference/model/categories/contracts.md +0 -16
- package/dist/docs/reference/model/categories/core-values-errors.md +0 -44
- package/dist/docs/reference/model/categories/paths.md +0 -42
- package/dist/docs/reference/model/categories/resolution.md +0 -20
- package/dist/docs/reference/model/immutableBuffer.md +0 -49
- package/dist/docs/reference/model/isGeometryError.md +0 -34
- package/dist/docs/reference/model/path2.md +0 -54
- package/dist/docs/reference/model/path3.md +0 -49
- package/dist/docs/reference/model/transform2.md +0 -46
- package/dist/docs/reference/model/transform3.md +0 -48
- package/dist/docs/reference/model/vector2.md +0 -40
- package/dist/docs/reference/model/vector3.md +0 -47
- package/dist/docs/reference/text/Bounds2Data.md +0 -34
- package/dist/docs/reference/text/Vector2Data.md +0 -7
- package/dist/docs/reference/text/VectorTextArcBaseline.md +0 -53
- package/dist/docs/reference/text/VectorTextLayout.md +0 -34
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +0 -111
- package/dist/docs/reference/text/VectorTextMetrics.md +0 -94
- package/dist/docs/reference/text/VectorTextOptions.md +0 -50
- package/dist/engine/export-3mf.js +0 -23
- package/dist/engine/serialize-3mf.js +0 -116
- /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
|
|
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
|
|
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
|
|
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(
|
|
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 =
|
|
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.
|
|
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(
|
|
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 =
|
|
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) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[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";
|