@metamesh/modeling 0.12.0 → 0.13.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 +27 -0
- package/README.md +60 -72
- package/dist/api/engine.d.ts +123 -97
- package/dist/api/geometry.d.ts +3896 -3307
- package/dist/api/index.d.ts +2489 -2268
- package/dist/api/text.d.ts +119 -107
- package/dist/docs/guides/concepts.md +197 -0
- package/dist/docs/guides/fonts.md +51 -0
- package/dist/docs/guides/fundamentals.md +135 -0
- package/dist/docs/guides/generation.md +221 -0
- package/dist/docs/guides/hosting.md +88 -0
- package/dist/docs/guides/recipes.md +668 -0
- package/dist/docs/manifest.json +9851 -0
- package/dist/docs/reference/engine/Export3mfOptions.md +29 -0
- package/dist/docs/reference/engine/ExportMeshPart.md +65 -0
- package/dist/docs/reference/engine/GenerationOptions.md +62 -0
- package/dist/docs/reference/engine/GeometryResource.md +77 -0
- package/dist/docs/reference/engine/ModelDependencies.md +41 -0
- package/dist/docs/reference/engine/ModelEngine.md +103 -0
- package/dist/docs/reference/engine/ModelEngineOptions.md +33 -0
- package/dist/docs/reference/engine/ModelSession.md +96 -0
- package/dist/docs/reference/engine/ModelSnapshot.md +173 -0
- package/dist/docs/reference/engine/SessionOptions.md +123 -0
- package/dist/docs/reference/engine/SnapshotPart.md +130 -0
- package/dist/docs/reference/engine/categories/host-lifecycle.md +37 -0
- package/dist/docs/reference/engine/createModelEngine.md +56 -0
- package/dist/docs/reference/engine/defaultModelingLimits.md +7 -0
- package/dist/docs/reference/engine/modelingWasmUrl.md +7 -0
- package/dist/docs/reference/engine/validateModel.md +48 -0
- package/dist/docs/reference/engine.md +25 -0
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +75 -0
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +79 -0
- package/dist/docs/reference/geometry/Anchor3.md +49 -0
- package/dist/docs/reference/geometry/ArcCurve2.md +70 -0
- package/dist/docs/reference/geometry/ArcCurve3.md +94 -0
- package/dist/docs/reference/geometry/AttachTransformOptions.md +58 -0
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +61 -0
- package/dist/docs/reference/geometry/Bounds2.md +39 -0
- package/dist/docs/reference/geometry/Bounds3.md +39 -0
- package/dist/docs/reference/geometry/BoundsFit2.md +52 -0
- package/dist/docs/reference/geometry/BoundsFit3.md +52 -0
- package/dist/docs/reference/geometry/BoundsFitOptions.md +23 -0
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +23 -0
- package/dist/docs/reference/geometry/BoxAnchorFace.md +7 -0
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +59 -0
- package/dist/docs/reference/geometry/BoxEdge.md +7 -0
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +14 -0
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +15 -0
- package/dist/docs/reference/geometry/BoxOptions.md +87 -0
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +7 -0
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +93 -0
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +29 -0
- package/dist/docs/reference/geometry/CircleContourOptions.md +15 -0
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +59 -0
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +41 -0
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +7 -0
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +53 -0
- package/dist/docs/reference/geometry/Contour.md +17 -0
- package/dist/docs/reference/geometry/ContourCurve.md +35 -0
- package/dist/docs/reference/geometry/ContourPoint.md +29 -0
- package/dist/docs/reference/geometry/ContourSegment.md +86 -0
- package/dist/docs/reference/geometry/CorrespondingComponent.md +46 -0
- package/dist/docs/reference/geometry/CorrespondingContour.md +46 -0
- package/dist/docs/reference/geometry/CorrespondingProfile.md +22 -0
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +27 -0
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +70 -0
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +70 -0
- package/dist/docs/reference/geometry/Curve2.md +16 -0
- package/dist/docs/reference/geometry/Curve3.md +16 -0
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +64 -0
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +73 -0
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +7 -0
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +83 -0
- package/dist/docs/reference/geometry/CylinderOptions.md +53 -0
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +209 -0
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +7 -0
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +71 -0
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +82 -0
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +34 -0
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +41 -0
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +47 -0
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +82 -0
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -0
- package/dist/docs/reference/geometry/EdgeTreatment.md +17 -0
- package/dist/docs/reference/geometry/EllipseContourOptions.md +15 -0
- package/dist/docs/reference/geometry/EndTreatments.md +34 -0
- package/dist/docs/reference/geometry/ExtrudeOptions.md +134 -0
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +77 -0
- package/dist/docs/reference/geometry/FittedTextLayout.md +60 -0
- package/dist/docs/reference/geometry/Frame3.md +58 -0
- package/dist/docs/reference/geometry/GeometryError.md +97 -0
- package/dist/docs/reference/geometry/GeometryErrorCode.md +7 -0
- package/dist/docs/reference/geometry/GeometryErrorContext.md +29 -0
- package/dist/docs/reference/geometry/GeometryResolution.md +65 -0
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +62 -0
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +41 -0
- package/dist/docs/reference/geometry/GridPatternOptions.md +42 -0
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +14 -0
- package/dist/docs/reference/geometry/HeightfieldOptions.md +67 -0
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +53 -0
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +141 -0
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +265 -0
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +53 -0
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +14 -0
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +242 -0
- package/dist/docs/reference/geometry/LineCurve2.md +46 -0
- package/dist/docs/reference/geometry/LineCurve3.md +46 -0
- package/dist/docs/reference/geometry/LinearPatternOptions.md +30 -0
- package/dist/docs/reference/geometry/LoftCorrespondence.md +19 -0
- package/dist/docs/reference/geometry/LoftMeshStation.md +27 -0
- package/dist/docs/reference/geometry/LoftOptions.md +84 -0
- package/dist/docs/reference/geometry/LoftPlacement.md +66 -0
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +18 -0
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +35 -0
- package/dist/docs/reference/geometry/MetricFastenerSize.md +7 -0
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +72 -0
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +29 -0
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +41 -0
- package/dist/docs/reference/geometry/ModelingLimits.md +126 -0
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +17 -0
- package/dist/docs/reference/geometry/Path2.md +14 -0
- package/dist/docs/reference/geometry/Path3.md +14 -0
- package/dist/docs/reference/geometry/PathFrame.md +46 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +38 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +46 -0
- package/dist/docs/reference/geometry/PathPlacement.md +34 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +7 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +156 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +120 -0
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +190 -0
- package/dist/docs/reference/geometry/Polygon.md +38 -0
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +92 -0
- package/dist/docs/reference/geometry/PrimitivePlacement.md +31 -0
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +83 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +7 -0
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +45 -0
- package/dist/docs/reference/geometry/Profile.md +22 -0
- package/dist/docs/reference/geometry/ProfileComponent2.md +46 -0
- package/dist/docs/reference/geometry/ProfileContour2.md +34 -0
- package/dist/docs/reference/geometry/ProfileSpan2.md +47 -0
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +36 -0
- package/dist/docs/reference/geometry/RackPitchDimensions.md +113 -0
- package/dist/docs/reference/geometry/RackPitchSpec.md +77 -0
- package/dist/docs/reference/geometry/RadialPatternOptions.md +62 -0
- package/dist/docs/reference/geometry/RadialSizing.md +7 -0
- package/dist/docs/reference/geometry/RadialSizingOptions.md +40 -0
- package/dist/docs/reference/geometry/RectangleContourOptions.md +66 -0
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +34 -0
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +14 -0
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +94 -0
- package/dist/docs/reference/geometry/Region.md +14 -0
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +84 -0
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +65 -0
- package/dist/docs/reference/geometry/RevolveOptions.md +82 -0
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +91 -0
- package/dist/docs/reference/geometry/RowLayoutOptions.md +23 -0
- package/dist/docs/reference/geometry/SampleContourOptions.md +71 -0
- package/dist/docs/reference/geometry/SampleHelixOptions.md +95 -0
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +71 -0
- package/dist/docs/reference/geometry/SampledCurve2.md +34 -0
- package/dist/docs/reference/geometry/SampledCurve3.md +34 -0
- package/dist/docs/reference/geometry/SampledThreadHelices.md +58 -0
- package/dist/docs/reference/geometry/SideProfileCurve.md +35 -0
- package/dist/docs/reference/geometry/SideProfilePoint.md +29 -0
- package/dist/docs/reference/geometry/SideProfileSegment.md +86 -0
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +71 -0
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +34 -0
- package/dist/docs/reference/geometry/SphereOptions.md +15 -0
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +75 -0
- package/dist/docs/reference/geometry/StrokePathCap.md +7 -0
- package/dist/docs/reference/geometry/StrokePathJoin.md +7 -0
- package/dist/docs/reference/geometry/StrokePathRegionOptions.md +85 -0
- package/dist/docs/reference/geometry/SvgImportOptions.md +60 -0
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +61 -0
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +118 -0
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +65 -0
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +53 -0
- package/dist/docs/reference/geometry/SweepOptions.md +109 -0
- package/dist/docs/reference/geometry/SweepOrientation.md +109 -0
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +53 -0
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +100 -0
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +73 -0
- package/dist/docs/reference/geometry/ThreadEndStyle.md +7 -0
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +113 -0
- package/dist/docs/reference/geometry/ThreadHandedness.md +7 -0
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +120 -0
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +7 -0
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +7 -0
- package/dist/docs/reference/geometry/ThreadProfile.md +82 -0
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +49 -0
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +19 -0
- package/dist/docs/reference/geometry/ThreadRole.md +7 -0
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +7 -0
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +269 -0
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +94 -0
- package/dist/docs/reference/geometry/ThreadedNutShape.md +7 -0
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +242 -0
- package/dist/docs/reference/geometry/TorusOptions.md +105 -0
- package/dist/docs/reference/geometry/Transform3.md +12 -0
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +91 -0
- package/dist/docs/reference/geometry/TriangleMesh.md +34 -0
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +119 -0
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +75 -0
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +75 -0
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +39 -0
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +190 -0
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +107 -0
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +41 -0
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +29 -0
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +51 -0
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +91 -0
- package/dist/docs/reference/geometry/TubeOptions.md +138 -0
- package/dist/docs/reference/geometry/Vector2.md +7 -0
- package/dist/docs/reference/geometry/Vector3.md +7 -0
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +53 -0
- package/dist/docs/reference/geometry/VectorTextLayout.md +39 -0
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +111 -0
- package/dist/docs/reference/geometry/VectorTextMetrics.md +94 -0
- package/dist/docs/reference/geometry/VectorTextOptions.md +50 -0
- package/dist/docs/reference/geometry/add3.md +38 -0
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +57 -0
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +52 -0
- package/dist/docs/reference/geometry/anchorFrame3.md +40 -0
- package/dist/docs/reference/geometry/applyTransformDirection3.md +41 -0
- package/dist/docs/reference/geometry/applyTransformPoint3.md +39 -0
- package/dist/docs/reference/geometry/attachTransform.md +73 -0
- package/dist/docs/reference/geometry/boundsCenter.md +62 -0
- package/dist/docs/reference/geometry/boundsFromSize.md +83 -0
- package/dist/docs/reference/geometry/boundsSize.md +62 -0
- package/dist/docs/reference/geometry/boxAnchor3.md +48 -0
- package/dist/docs/reference/geometry/buildHelicalThreadRidgeMesh.md +68 -0
- package/dist/docs/reference/geometry/buildHelicalThreadSolidMesh.md +102 -0
- package/dist/docs/reference/geometry/categories/bounds-layout.md +35 -0
- package/dist/docs/reference/geometry/categories/curves-paths.md +63 -0
- package/dist/docs/reference/geometry/categories/mechanical.md +101 -0
- package/dist/docs/reference/geometry/categories/meshes.md +73 -0
- package/dist/docs/reference/geometry/categories/pattern-placement.md +34 -0
- package/dist/docs/reference/geometry/categories/primitive-options.md +36 -0
- package/dist/docs/reference/geometry/categories/profiles-regions.md +74 -0
- package/dist/docs/reference/geometry/categories/resolution-errors.md +46 -0
- package/dist/docs/reference/geometry/categories/transforms-math.md +63 -0
- package/dist/docs/reference/geometry/categories/vector-import.md +40 -0
- package/dist/docs/reference/geometry/circleContour.md +33 -0
- package/dist/docs/reference/geometry/closeToAxis.md +34 -0
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +51 -0
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +42 -0
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +56 -0
- package/dist/docs/reference/geometry/composeTransform3.md +40 -0
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +45 -0
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +47 -0
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +31 -0
- package/dist/docs/reference/geometry/containsBounds.md +72 -0
- package/dist/docs/reference/geometry/contourContainsPoint.md +33 -0
- package/dist/docs/reference/geometry/createAnchor3.md +63 -0
- package/dist/docs/reference/geometry/createThreadProfile.md +37 -0
- package/dist/docs/reference/geometry/createTriangleMeshSignature.md +60 -0
- package/dist/docs/reference/geometry/cross3.md +38 -0
- package/dist/docs/reference/geometry/cumulativePathLengths.md +33 -0
- package/dist/docs/reference/geometry/cylinderAnchor3.md +56 -0
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +14 -0
- package/dist/docs/reference/geometry/distributeAlongPath.md +51 -0
- package/dist/docs/reference/geometry/dot3.md +38 -0
- package/dist/docs/reference/geometry/ellipseContour.md +33 -0
- package/dist/docs/reference/geometry/eulerTransform3.md +38 -0
- package/dist/docs/reference/geometry/extrudeMesh.md +73 -0
- package/dist/docs/reference/geometry/fitBounds.md +95 -0
- package/dist/docs/reference/geometry/fitTextLayout.md +57 -0
- package/dist/docs/reference/geometry/frameTransform3.md +44 -0
- package/dist/docs/reference/geometry/getMetricClearanceHole.md +33 -0
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +27 -0
- package/dist/docs/reference/geometry/gridPatternTransforms.md +31 -0
- package/dist/docs/reference/geometry/heightfieldMesh.md +43 -0
- package/dist/docs/reference/geometry/inverseTransform3.md +30 -0
- package/dist/docs/reference/geometry/isGeometryError.md +26 -0
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +36 -0
- package/dist/docs/reference/geometry/layoutRow.md +43 -0
- package/dist/docs/reference/geometry/length3.md +26 -0
- package/dist/docs/reference/geometry/lerp3.md +38 -0
- package/dist/docs/reference/geometry/linearPatternTransforms.md +31 -0
- package/dist/docs/reference/geometry/loftMesh.md +72 -0
- package/dist/docs/reference/geometry/matchProfiles.md +51 -0
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +47 -0
- package/dist/docs/reference/geometry/measureTriangleMesh.md +55 -0
- package/dist/docs/reference/geometry/meshBounds.md +35 -0
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +29 -0
- package/dist/docs/reference/geometry/normalize3.md +32 -0
- package/dist/docs/reference/geometry/normalizeContour.md +45 -0
- package/dist/docs/reference/geometry/normalizePolygon.md +37 -0
- package/dist/docs/reference/geometry/normalizeRegion.md +33 -0
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +91 -0
- package/dist/docs/reference/geometry/pathLength.md +33 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +57 -0
- package/dist/docs/reference/geometry/preflightHeightfield.md +34 -0
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +96 -0
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +85 -0
- package/dist/docs/reference/geometry/preflightSvgRegion.md +56 -0
- package/dist/docs/reference/geometry/preflightThreadedNut.md +96 -0
- package/dist/docs/reference/geometry/preflightThreadedRod.md +85 -0
- package/dist/docs/reference/geometry/projectOntoPlane3.md +32 -0
- package/dist/docs/reference/geometry/radialPatternTransforms.md +47 -0
- package/dist/docs/reference/geometry/rectangleContour.md +49 -0
- package/dist/docs/reference/geometry/rectangleProfile.md +53 -0
- package/dist/docs/reference/geometry/regionArea.md +34 -0
- package/dist/docs/reference/geometry/regionBounds.md +27 -0
- package/dist/docs/reference/geometry/regularPolygonContour.md +53 -0
- package/dist/docs/reference/geometry/resamplePolyline2.md +64 -0
- package/dist/docs/reference/geometry/resamplePolyline3.md +67 -0
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +79 -0
- package/dist/docs/reference/geometry/resolveArcSegments.md +67 -0
- package/dist/docs/reference/geometry/resolveCircularSegments.md +61 -0
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +31 -0
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +31 -0
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +74 -0
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +26 -0
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +59 -0
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +27 -0
- package/dist/docs/reference/geometry/resolveRackPitch.md +27 -0
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +59 -0
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +30 -0
- package/dist/docs/reference/geometry/revolveMesh.md +76 -0
- package/dist/docs/reference/geometry/rotateAroundAxis3.md +38 -0
- package/dist/docs/reference/geometry/rotationTransform3.md +49 -0
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +50 -0
- package/dist/docs/reference/geometry/sampleContour.md +77 -0
- package/dist/docs/reference/geometry/sampleCurve2.md +61 -0
- package/dist/docs/reference/geometry/sampleCurve3.md +61 -0
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +58 -0
- package/dist/docs/reference/geometry/sampleHelix.md +41 -0
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +59 -0
- package/dist/docs/reference/geometry/sampleRackToothPath.md +39 -0
- package/dist/docs/reference/geometry/sampleSideProfile.md +73 -0
- package/dist/docs/reference/geometry/sampleTextContours.md +53 -0
- package/dist/docs/reference/geometry/sampleThreadHelices.md +63 -0
- package/dist/docs/reference/geometry/scale3.md +38 -0
- package/dist/docs/reference/geometry/scaleTransform3.md +34 -0
- package/dist/docs/reference/geometry/signedContourArea.md +26 -0
- package/dist/docs/reference/geometry/starContour.md +51 -0
- package/dist/docs/reference/geometry/strokePathRegion.md +63 -0
- package/dist/docs/reference/geometry/subtract3.md +38 -0
- package/dist/docs/reference/geometry/sweepMesh.md +82 -0
- package/dist/docs/reference/geometry/transformContour.md +42 -0
- package/dist/docs/reference/geometry/transformDeterminant3.md +32 -0
- package/dist/docs/reference/geometry/transformPath2.md +40 -0
- package/dist/docs/reference/geometry/transformPath3.md +33 -0
- package/dist/docs/reference/geometry/transformRegion.md +40 -0
- package/dist/docs/reference/geometry/transformTriangleMesh.md +42 -0
- package/dist/docs/reference/geometry/translationTransform3.md +31 -0
- package/dist/docs/reference/geometry/triangulateContour.md +26 -0
- package/dist/docs/reference/geometry/validateSolidMesh.md +52 -0
- package/dist/docs/reference/geometry/validateTransform3.md +43 -0
- package/dist/docs/reference/geometry/validateTriangleMesh.md +59 -0
- package/dist/docs/reference/geometry.md +30 -0
- package/dist/docs/reference/model/Anchor3.md +54 -0
- package/dist/docs/reference/model/AttachOptions.md +63 -0
- package/dist/docs/reference/model/Bounds2.md +39 -0
- package/dist/docs/reference/model/Bounds3.md +39 -0
- package/dist/docs/reference/model/BoxEdge.md +15 -0
- package/dist/docs/reference/model/BoxEdgeSelection.md +19 -0
- package/dist/docs/reference/model/BoxEdgeTreatments.md +20 -0
- package/dist/docs/reference/model/BoxOptions.md +92 -0
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +35 -0
- package/dist/docs/reference/model/CircleContourOptions.md +21 -0
- package/dist/docs/reference/model/CircleOptions.md +21 -0
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +64 -0
- package/dist/docs/reference/model/Computed.md +35 -0
- package/dist/docs/reference/model/ComputedValue.md +20 -0
- package/dist/docs/reference/model/Contour.md +22 -0
- package/dist/docs/reference/model/CorrespondingComponent.md +46 -0
- package/dist/docs/reference/model/CorrespondingContour.md +46 -0
- package/dist/docs/reference/model/CorrespondingProfile.md +22 -0
- package/dist/docs/reference/model/CorrespondingProfileStation.md +27 -0
- package/dist/docs/reference/model/CylinderOptions.md +58 -0
- package/dist/docs/reference/model/DiagnosticOptions.md +23 -0
- package/dist/docs/reference/model/EdgeTreatment.md +22 -0
- package/dist/docs/reference/model/EllipseContourOptions.md +21 -0
- package/dist/docs/reference/model/EllipseOptions.md +21 -0
- package/dist/docs/reference/model/EndTreatments.md +39 -0
- package/dist/docs/reference/model/ExtrudeOptions.md +140 -0
- package/dist/docs/reference/model/FinalizedModel.md +121 -0
- package/dist/docs/reference/model/FinalizedPart.md +87 -0
- package/dist/docs/reference/model/Frame3.md +63 -0
- package/dist/docs/reference/model/GenerateCallback.md +37 -0
- package/dist/docs/reference/model/GenerateContext.md +277 -0
- package/dist/docs/reference/model/GeneratedPart.md +93 -0
- package/dist/docs/reference/model/GenerationDiagnostic.md +41 -0
- package/dist/docs/reference/model/GenerationError.md +54 -0
- package/dist/docs/reference/model/GeometryResolution.md +70 -0
- package/dist/docs/reference/model/GeometrySamplingLimits.md +62 -0
- package/dist/docs/reference/model/GeometryToleranceOptions.md +46 -0
- package/dist/docs/reference/model/GridPatternOptions.md +43 -0
- package/dist/docs/reference/model/HeightfieldOptions.md +67 -0
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +140 -0
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +58 -0
- package/dist/docs/reference/model/HullOptions.md +72 -0
- package/dist/docs/reference/model/ImmutableBuffer-type.md +80 -0
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +34 -0
- package/dist/docs/reference/model/ImplicitOptions.md +83 -0
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +245 -0
- package/dist/docs/reference/model/LinearPatternOptions.md +31 -0
- package/dist/docs/reference/model/LoftCorrespondence.md +27 -0
- package/dist/docs/reference/model/LoftOptions.md +91 -0
- package/dist/docs/reference/model/LoftPlacement.md +73 -0
- package/dist/docs/reference/model/LoftStation.md +35 -0
- package/dist/docs/reference/model/MatchProfilesOptions.md +35 -0
- package/dist/docs/reference/model/ModelProgram.md +44 -0
- package/dist/docs/reference/model/ModelingLimits.md +126 -0
- package/dist/docs/reference/model/NumericArray.md +7 -0
- package/dist/docs/reference/model/PartGeometry.md +16 -0
- package/dist/docs/reference/model/PartOptions.md +65 -0
- package/dist/docs/reference/model/PathNormalGuide.md +45 -0
- package/dist/docs/reference/model/PathPatternOptions.md +47 -0
- package/dist/docs/reference/model/PatternSource.md +26 -0
- package/dist/docs/reference/model/PlaneOptions.md +39 -0
- package/dist/docs/reference/model/Polygon-type.md +43 -0
- package/dist/docs/reference/model/PolygonOptions.md +112 -0
- package/dist/docs/reference/model/PrimitivePlacement.md +40 -0
- package/dist/docs/reference/model/PrimitivePlacementOptions.md +88 -0
- package/dist/docs/reference/model/PrintableThreadFit.md +14 -0
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +50 -0
- package/dist/docs/reference/model/Profile.md +22 -0
- package/dist/docs/reference/model/ProfileComponent2.md +46 -0
- package/dist/docs/reference/model/ProfileContour2.md +34 -0
- package/dist/docs/reference/model/ProfileSpan2.md +47 -0
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +41 -0
- package/dist/docs/reference/model/RadialPatternOptions.md +63 -0
- package/dist/docs/reference/model/RadialSizing.md +15 -0
- package/dist/docs/reference/model/RadialSizingOptions.md +40 -0
- package/dist/docs/reference/model/RectangleContourOptions.md +72 -0
- package/dist/docs/reference/model/RectangleCornerTreatment.md +40 -0
- package/dist/docs/reference/model/RectangleCornerTreatments.md +20 -0
- package/dist/docs/reference/model/RectangleOptions.md +107 -0
- package/dist/docs/reference/model/Region.md +19 -0
- package/dist/docs/reference/model/RegionOffsetJoin.md +16 -0
- package/dist/docs/reference/model/RegionOffsetOptions.md +65 -0
- package/dist/docs/reference/model/RegularPolygonOptions.md +53 -0
- package/dist/docs/reference/model/RevolveOptions.md +89 -0
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +96 -0
- package/dist/docs/reference/model/Section.md +450 -0
- package/dist/docs/reference/model/SectionHullOptions.md +72 -0
- package/dist/docs/reference/model/SectionInspection.md +98 -0
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +76 -0
- package/dist/docs/reference/model/Solid.md +350 -0
- package/dist/docs/reference/model/SolidInspection.md +98 -0
- package/dist/docs/reference/model/SolidRayHit.md +58 -0
- package/dist/docs/reference/model/SphereOptions.md +20 -0
- package/dist/docs/reference/model/StarOptions.md +98 -0
- package/dist/docs/reference/model/SvgOrigin.md +16 -0
- package/dist/docs/reference/model/SvgPathSectionOptions.md +78 -0
- package/dist/docs/reference/model/SvgSectionOptions.md +66 -0
- package/dist/docs/reference/model/SweepOptions.md +116 -0
- package/dist/docs/reference/model/SweepOrientation.md +116 -0
- package/dist/docs/reference/model/TextSectionOptions.md +41 -0
- package/dist/docs/reference/model/ThreadEndStyle.md +14 -0
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +117 -0
- package/dist/docs/reference/model/ThreadHandedness.md +14 -0
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +14 -0
- package/dist/docs/reference/model/ThreadLeadInShape.md +14 -0
- package/dist/docs/reference/model/ThreadProfile.md +86 -0
- package/dist/docs/reference/model/ThreadRidgeOptions.md +18 -0
- package/dist/docs/reference/model/ThreadedNutBevel.md +14 -0
- package/dist/docs/reference/model/ThreadedNutOptions.md +273 -0
- package/dist/docs/reference/model/ThreadedNutPreflight.md +98 -0
- package/dist/docs/reference/model/ThreadedNutShape.md +14 -0
- package/dist/docs/reference/model/ThreadedRodOptions.md +245 -0
- package/dist/docs/reference/model/TorusOptions.md +110 -0
- package/dist/docs/reference/model/Transform2.md +15 -0
- package/dist/docs/reference/model/Transform3.md +18 -0
- package/dist/docs/reference/model/TriangleMesh.md +42 -0
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +123 -0
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +79 -0
- package/dist/docs/reference/model/TubeOptions.md +143 -0
- package/dist/docs/reference/model/Vector2.md +15 -0
- package/dist/docs/reference/model/Vector3.md +15 -0
- package/dist/docs/reference/model/VectorTextLayout.md +40 -0
- package/dist/docs/reference/model/VectorTextMetrics.md +100 -0
- package/dist/docs/reference/model/anchor.md +46 -0
- package/dist/docs/reference/model/box.md +62 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +37 -0
- package/dist/docs/reference/model/categories/bounded-surfaces.md +26 -0
- package/dist/docs/reference/model/categories/contracts.md +16 -0
- package/dist/docs/reference/model/categories/core-values-errors.md +30 -0
- package/dist/docs/reference/model/categories/explicit-profiles.md +32 -0
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +42 -0
- package/dist/docs/reference/model/categories/generation.md +44 -0
- package/dist/docs/reference/model/categories/inspection.md +23 -0
- package/dist/docs/reference/model/categories/mesh-inspection.md +29 -0
- package/dist/docs/reference/model/categories/primitives.md +61 -0
- package/dist/docs/reference/model/categories/resolution.md +18 -0
- package/dist/docs/reference/model/categories/sections.md +59 -0
- package/dist/docs/reference/model/categories/threads.md +50 -0
- package/dist/docs/reference/model/categories/transforms-placement.md +43 -0
- package/dist/docs/reference/model/circle.md +39 -0
- package/dist/docs/reference/model/components.md +68 -0
- package/dist/docs/reference/model/compose.md +31 -0
- package/dist/docs/reference/model/cylinder.md +52 -0
- package/dist/docs/reference/model/distance.md +45 -0
- package/dist/docs/reference/model/ellipse.md +39 -0
- package/dist/docs/reference/model/extrude.md +83 -0
- package/dist/docs/reference/model/fromRegion.md +33 -0
- package/dist/docs/reference/model/generate.md +46 -0
- package/dist/docs/reference/model/gridPattern.md +80 -0
- package/dist/docs/reference/model/heightfield.md +40 -0
- package/dist/docs/reference/model/hull.md +74 -0
- package/dist/docs/reference/model/immutableBuffer.md +44 -0
- package/dist/docs/reference/model/immutableMesh.md +40 -0
- package/dist/docs/reference/model/implicit.md +47 -0
- package/dist/docs/reference/model/inspectSection.md +38 -0
- package/dist/docs/reference/model/inspectSolid.md +38 -0
- package/dist/docs/reference/model/internalThreadCutter.md +100 -0
- package/dist/docs/reference/model/intersect.md +70 -0
- package/dist/docs/reference/model/isEmpty.md +39 -0
- package/dist/docs/reference/model/linearPattern.md +80 -0
- package/dist/docs/reference/model/loft.md +137 -0
- package/dist/docs/reference/model/matchProfiles.md +42 -0
- package/dist/docs/reference/model/minkowskiSum.md +37 -0
- package/dist/docs/reference/model/pathPattern.md +118 -0
- package/dist/docs/reference/model/polygon.md +40 -0
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +89 -0
- package/dist/docs/reference/model/preflightThreadedNut.md +100 -0
- package/dist/docs/reference/model/preflightThreadedRod.md +89 -0
- package/dist/docs/reference/model/radialPattern.md +113 -0
- package/dist/docs/reference/model/rayCast.md +40 -0
- package/dist/docs/reference/model/rectangle.md +59 -0
- package/dist/docs/reference/model/regularPolygon.md +39 -0
- package/dist/docs/reference/model/revolve.md +74 -0
- package/dist/docs/reference/model/solidFromMesh.md +42 -0
- package/dist/docs/reference/model/sphere.md +42 -0
- package/dist/docs/reference/model/split.md +54 -0
- package/dist/docs/reference/model/splitByPlane.md +66 -0
- package/dist/docs/reference/model/star.md +63 -0
- package/dist/docs/reference/model/svgPathSection.md +65 -0
- package/dist/docs/reference/model/svgSection.md +64 -0
- package/dist/docs/reference/model/sweep.md +92 -0
- package/dist/docs/reference/model/textSection.md +57 -0
- package/dist/docs/reference/model/threadRidge.md +72 -0
- package/dist/docs/reference/model/threadedNut.md +110 -0
- package/dist/docs/reference/model/threadedRod.md +99 -0
- package/dist/docs/reference/model/toRegion.md +33 -0
- package/dist/docs/reference/model/toTriangleMesh.md +27 -0
- package/dist/docs/reference/model/torus.md +70 -0
- package/dist/docs/reference/model/tube.md +77 -0
- package/dist/docs/reference/model/union.md +72 -0
- package/dist/docs/reference/model.md +39 -0
- package/dist/docs/reference/text/Bounds2.md +34 -0
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -0
- package/dist/docs/reference/text/Vector2.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +186 -0
- package/dist/docs/reference/text/VectorFontOptions.md +17 -0
- package/dist/docs/reference/text/VectorTextArcBaseline.md +53 -0
- package/dist/docs/reference/text/VectorTextLayout.md +34 -0
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +111 -0
- package/dist/docs/reference/text/VectorTextMetrics.md +94 -0
- package/dist/docs/reference/text/VectorTextOptions.md +50 -0
- package/dist/docs/reference/text/categories/font-preparation.md +38 -0
- package/dist/docs/reference/text/prepareVectorFont.md +46 -0
- package/dist/docs/reference/text.md +21 -0
- package/dist/engine/construction-operations.js +10 -3
- package/dist/engine/deferred-context.js +12 -3
- package/dist/engine/execution.js +1 -1
- package/dist/engine/export-3mf.js +2 -2
- package/dist/engine/finalization.js +3 -3
- package/dist/engine/loft-operations.js +4 -4
- package/dist/engine/native/adapter.js +1 -1
- package/dist/engine/native/regions.js +9 -9
- package/dist/engine/pattern-operations.js +24 -13
- package/dist/engine/pattern-transform.js +9 -0
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-operations.js +10 -10
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/section-operations.js +25 -14
- package/dist/engine/session-graph.js +5 -3
- package/dist/engine/session.js +1 -2
- package/dist/geometry/bounds.js +117 -0
- package/dist/geometry/cylinder.js +5 -1
- package/dist/geometry/edge-finishing.js +2 -2
- package/dist/geometry/heightfield.js +1 -1
- package/dist/geometry/index.js +15 -12
- package/dist/geometry/{loft-correspondence.js → loft/loft-correspondence.js} +3 -3
- package/dist/geometry/{loft-geometry.js → loft/loft-geometry.js} +8 -8
- package/dist/geometry/{loft-options.js → loft/loft-options.js} +2 -2
- package/dist/geometry/{loft-simple-mesh.js → loft/loft-simple-mesh.js} +6 -6
- package/dist/geometry/{loft-triangulation.js → loft/loft-triangulation.js} +6 -6
- package/dist/geometry/{loft.js → loft/loft.js} +8 -8
- package/dist/geometry/math/vector3.js +5 -1
- package/dist/geometry/mechanical/gears.js +2 -2
- package/dist/geometry/mechanical/thread-mesh.js +3 -3
- package/dist/geometry/mechanical/thread-profiles.js +2 -2
- package/dist/geometry/mechanical/thread-surface.js +14 -5
- package/dist/geometry/{mesh-centroid.js → mesh/mesh-centroid.js} +1 -1
- package/dist/geometry/{mesh-planar.js → mesh/mesh-planar.js} +1 -1
- package/dist/geometry/{mesh-quality.js → mesh/mesh-quality.js} +2 -2
- package/dist/geometry/{mesh-signature.js → mesh/mesh-signature.js} +2 -2
- package/dist/geometry/{mesh-solid.js → mesh/mesh-solid.js} +2 -2
- package/dist/geometry/{mesh.js → mesh/mesh.js} +7 -8
- package/dist/geometry/paths/frames.js +4 -5
- package/dist/geometry/patterns/options.js +1 -0
- package/dist/{engine/pattern-placements.js → geometry/patterns/placements.js} +22 -8
- package/dist/geometry/patterns.js +25 -0
- package/dist/geometry/primitive-resolvers.js +9 -9
- package/dist/geometry/profiles/contour.js +3 -3
- package/dist/geometry/profiles/matched.js +3 -3
- package/dist/geometry/profiles/profiles.js +10 -10
- package/dist/geometry/profiles/rectangle.js +7 -7
- package/dist/geometry/profiles/shapes.js +9 -9
- package/dist/geometry/profiles/side-profile.js +37 -0
- package/dist/geometry/regions.js +15 -15
- package/dist/geometry/revolve/revolve-mesh.js +5 -5
- package/dist/geometry/stroke-path.js +2 -2
- package/dist/geometry/svg/errors.js +0 -3
- package/dist/geometry/svg/fill.js +7 -7
- package/dist/geometry/svg/index.js +1 -1
- package/dist/geometry/svg/matrix.js +0 -114
- package/dist/geometry/svg/parser.js +1 -439
- package/dist/geometry/svg-import.js +3 -3
- package/dist/geometry/sweeps/sweep-closed.js +1 -1
- package/dist/geometry/sweeps/sweep-mesh.js +1 -1
- package/dist/geometry/sweeps/sweep-open.js +3 -3
- package/dist/geometry/sweeps/validation.js +2 -2
- package/dist/geometry/text-fitting.js +85 -0
- package/dist/geometry/tolerance.js +2 -2
- package/dist/geometry/transform-geometry.js +9 -9
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +1 -1
- package/dist/model/operation-contracts.js +1 -0
- package/dist/model/operation-dispatch.js +6 -0
- package/dist/model/operations.js +19 -49
- package/package.json +10 -8
- /package/dist/geometry/{mesh-edge-table.js → mesh/mesh-edge-table.js} +0 -0
- /package/dist/geometry/{mesh-solid-intersections.js → mesh/mesh-solid-intersections.js} +0 -0
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
# Modeling recipes
|
|
2
|
+
|
|
3
|
+
Adapt typechecked patterns for sections, SVG, text, extrusion, sweeps, heightfields, booleans, placement, anchors, and inspection.
|
|
4
|
+
|
|
5
|
+
Build a plate, route a section through space, join profiles, or place repeated features. Each
|
|
6
|
+
illustrated recipe pairs its complete source with a render of that exact source. Open
|
|
7
|
+
the interactive preview to orbit the result; copy the code into a Studio code Project to edit it.
|
|
8
|
+
|
|
9
|
+
| You want to make | Start here | Main decision |
|
|
10
|
+
| ------------------------ | -------------------------------------------------------------- | --------------------------------------------------------- |
|
|
11
|
+
| A flat part with holes | [Sections and extrusion](#section-hole-offset-and-extrusion) | Solve the filled outline before adding thickness |
|
|
12
|
+
| A badge from artwork | [SVG extrusion](#svg-parameter-and-extrusion) | Set physical size and preserve holes |
|
|
13
|
+
| A lathed cup or knob | [Revolution](#revolve-a-radial-profile) | Describe radius and height in one closed wall profile |
|
|
14
|
+
| A hub with repeated arms | [Radial placement](#primitive-booleans-and-repeated-placement) | Position one feature before repeating it |
|
|
15
|
+
| A routed strip or tube | [Path sweep](#rotation-minimizing-path-sweep) | Choose how the section is oriented along the path |
|
|
16
|
+
| A transition or adapter | [Section loft](#matched-section-loft) | Keep corresponding landmarks between stations |
|
|
17
|
+
| A relief tile | [Heightfield](#sample-a-heightfield) | Choose physical samples and triangle diagonals |
|
|
18
|
+
| A pair of mating pieces | [Anchors](#named-anchors-and-custom-frames) | Define the mating datum rather than duplicate coordinates |
|
|
19
|
+
| Raised lettering | [Prepared text](#text-from-a-font-parameter) | Cache the selected font layout during generation |
|
|
20
|
+
|
|
21
|
+
All dimensions in these recipes are millimetres. MetaMesh uses a right-handed coordinate system
|
|
22
|
+
with +Z up, degrees for angular arguments including `rotate`, and non-duplicated contour seams.
|
|
23
|
+
The examples default-export a synchronous `generate` program. Use ordinary assertions for constraints
|
|
24
|
+
and optional `computed` values for expensive/shared dimensions, geometry or text layouts.
|
|
25
|
+
[Define parameters and validation](https://metamesh.studio/docs/develop/parameters-and-validation) connects
|
|
26
|
+
source values to controls.
|
|
27
|
+
|
|
28
|
+
## Section, hole, offset, and extrusion
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { circle, rectangle } from "@metamesh/modeling";
|
|
34
|
+
import { generate } from "@metamesh/project";
|
|
35
|
+
|
|
36
|
+
export default generate(({ part }) => {
|
|
37
|
+
const plate = rectangle({ size: [80, 45] });
|
|
38
|
+
const hole = circle({ radius: 4 });
|
|
39
|
+
// Positive offset expands material: the outer edge grows and the hole shrinks.
|
|
40
|
+
const rimmedPlate = plate.subtract([hole]).offset(1.2);
|
|
41
|
+
// Keep the plate centered about Z = 0 for later symmetric placement.
|
|
42
|
+
return [part("model", rimmedPlate.extrude({ height: 5, center: true }))];
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Subtract the opening in 2D, offset the filled material, then extrude it into one plate.
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
`rectangle` and `circle` take object options and return filled Sections. `section.subtract(cutters)` and the `union` and `intersect` functions also support Solids,
|
|
51
|
+
with same-dimensional operands in each call. `section.offset(distance)` preserves the filled
|
|
52
|
+
topology. `section.extrude({ height })` preserves
|
|
53
|
+
holes and places the bottom at zero unless `center: true` is requested.
|
|
54
|
+
|
|
55
|
+
Positive offset grows material on every boundary: this example grows the outside by `1.2 mm` and
|
|
56
|
+
reduces the hole radius from `4 mm` to `2.8 mm`. If the final bore must remain `8 mm` in diameter,
|
|
57
|
+
offset the outside first and subtract the hole afterward. See
|
|
58
|
+
[`Section.offset`](../reference/model/Section.md#offset) and [`Section.extrude`](../reference/model/Section.md#extrude).
|
|
59
|
+
|
|
60
|
+
## SVG parameter and extrusion
|
|
61
|
+
|
|
62
|
+
An SVG control is exposed to authored code as a string on the immutable `parameters` argument. Pass
|
|
63
|
+
that string directly to `svgSection`; no DOM parsing or editor-specific JSON is needed.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { svgSection } from "@metamesh/modeling";
|
|
69
|
+
import { generate } from "@metamesh/project";
|
|
70
|
+
|
|
71
|
+
export default generate(({ params: parameters, part }) => {
|
|
72
|
+
const profile = svgSection(parameters.profile6);
|
|
73
|
+
return [part("model", profile.extrude({ height: 3, center: true }))];
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
The property name is the control ID shown in the model-controls editor. For example, use
|
|
80
|
+
`parameters.logo` when the SVG control ID is `logo`.
|
|
81
|
+
|
|
82
|
+
The same function also accepts literal SVG documents. Here two nested paths produce one badge
|
|
83
|
+
with a rectangular opening:
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { inspectSection, svgSection } from "@metamesh/modeling";
|
|
89
|
+
import { generate } from "@metamesh/project";
|
|
90
|
+
|
|
91
|
+
export default generate(({ part }) => {
|
|
92
|
+
// Physical root units make the imported artwork exactly 48 × 32 mm.
|
|
93
|
+
// Even-odd filling turns the second closed subpath into an opening.
|
|
94
|
+
const badge = svgSection(`
|
|
95
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48mm" height="32mm" viewBox="0 0 48 32">
|
|
96
|
+
<path
|
|
97
|
+
fill-rule="evenodd"
|
|
98
|
+
d="M 0 0 H 48 V 32 H 0 Z M 14 8 H 34 V 24 H 14 Z"
|
|
99
|
+
/>
|
|
100
|
+
</svg>
|
|
101
|
+
`);
|
|
102
|
+
// Check the imported topology before using it in the manufacturing solid.
|
|
103
|
+
const measurements = inspectSection(badge);
|
|
104
|
+
if (measurements.parts !== 1 || measurements.contours !== 2) {
|
|
105
|
+
throw new Error("Expected one badge with one rectangular opening.");
|
|
106
|
+
}
|
|
107
|
+
return [part("model", badge.extrude({ height: 4, center: true }))];
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The 48 × 32 mm SVG document retains its physical size and even-odd opening after extrusion.
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
`svgSection` imports painted geometry, not browser-rendered SVG. The even-odd fill rule makes the
|
|
116
|
+
second subpath a hole regardless of winding. Complete documents honor supported physical root units
|
|
117
|
+
and `viewBox`, convert SVG's Y-down coordinates to MetaMesh Y-up, and center the filled bounds by
|
|
118
|
+
default. Use `svgPathSection` for path-data strings where one user unit should equal 1 mm, or pass
|
|
119
|
+
its `scale` option to choose another millimetres-per-unit conversion.
|
|
120
|
+
|
|
121
|
+
Visible fills and bounded strokes contribute geometry; editor metadata is ignored. Editor text is
|
|
122
|
+
outlined to visible paths on Apply. Live `<text>`, images, `<use>`, external resources, class-based
|
|
123
|
+
stylesheets, clipping, masks, filters, and percentage dimensions are rejected. To generate lettering
|
|
124
|
+
directly, use the [text recipe](#text-from-a-font-parameter). SVG export, project assets, custom font
|
|
125
|
+
uploads, text on paths, and general SVG layout are outside this API.
|
|
126
|
+
|
|
127
|
+
## Revolve a radial profile
|
|
128
|
+
|
|
129
|
+
Use revolution when one side outline can describe the entire part around an axis. In the Section
|
|
130
|
+
below, X is radius and Y is final Z height; radii must stay nonnegative. The closed loop includes
|
|
131
|
+
the cup's floor, outside, rim, and inside, so the opening remains intentional.
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
import { polygon } from "@metamesh/modeling";
|
|
137
|
+
import { generate } from "@metamesh/project";
|
|
138
|
+
|
|
139
|
+
export default generate(({ part }) => {
|
|
140
|
+
// Here Section X means radius and Section Y becomes the final Z height.
|
|
141
|
+
// Walk the filled wall counterclockwise, omitting a repeated closing point.
|
|
142
|
+
const wall = polygon([
|
|
143
|
+
[0, 0],
|
|
144
|
+
[16, 0],
|
|
145
|
+
[16, 4],
|
|
146
|
+
[12, 4],
|
|
147
|
+
[10, 28],
|
|
148
|
+
[7, 28],
|
|
149
|
+
[9, 4],
|
|
150
|
+
[0, 4],
|
|
151
|
+
]);
|
|
152
|
+
// A full revolution creates the floor, tapered wall, and open top together.
|
|
153
|
+
return [part("model", wall.revolve())];
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
One radial wall profile revolved around +Z creates the floor and tapered cup wall.
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
[`polygon`](../reference/model/polygon.md) fills the ordered contour.
|
|
162
|
+
[`Section.revolve`](../reference/model/Section.md#revolve) defaults to a complete `360°` turn. Set
|
|
163
|
+
`revolveDegrees: 270` for a capped partial turn that exposes the cross section. Keep the closed
|
|
164
|
+
profile free of self-intersections and never repeat its first point at the end.
|
|
165
|
+
|
|
166
|
+
For an open side outline, [`sampleSideProfile`](../reference/geometry/sampleSideProfile.md)
|
|
167
|
+
returns physical `[radius, height]` points. [`closeToAxis`](../reference/geometry/closeToAxis.md)
|
|
168
|
+
adds the horizontal bottom/top edges needed for a solid body. Fill the result with `polygon`,
|
|
169
|
+
then revolve it. Hollow walls and mounting bores need their own closed material contour.
|
|
170
|
+
|
|
171
|
+
## Choose a primitive
|
|
172
|
+
|
|
173
|
+
Start with the factory that most closely describes the shape. The first row below contains ready
|
|
174
|
+
Solids; the second contains filled Sections extruded to `5 mm` thickness. Each result remains a
|
|
175
|
+
separate named part so you can inspect it in the interactive preview.
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
import { ellipse, regularPolygon, sphere, star, torus, tube } from "@metamesh/modeling";
|
|
181
|
+
import { generate } from "@metamesh/project";
|
|
182
|
+
|
|
183
|
+
export default generate(({ part }) => {
|
|
184
|
+
// Solid primitives are ready for placement; filled Sections need depth first.
|
|
185
|
+
// Place finished parts on two rows while keeping local geometry reusable.
|
|
186
|
+
return [
|
|
187
|
+
part("sphere", { geometry: sphere({ diameter: 14 }), position: [0, 0, 7], color: "#60a5fa" }),
|
|
188
|
+
part("torus", {
|
|
189
|
+
geometry: torus({ majorRadius: 7, minorRadius: 2 }),
|
|
190
|
+
position: [24, 0, 2],
|
|
191
|
+
color: "#34d399",
|
|
192
|
+
}),
|
|
193
|
+
part("tube", {
|
|
194
|
+
geometry: tube({ outerRadius: 7, innerRadius: 4, height: 10, center: false }),
|
|
195
|
+
position: [48, 0, 0],
|
|
196
|
+
color: "#f59e0b",
|
|
197
|
+
}),
|
|
198
|
+
part("ellipse", {
|
|
199
|
+
geometry: ellipse({ size: [18, 12] }).extrude({ height: 5 }),
|
|
200
|
+
position: [0, 24, 0],
|
|
201
|
+
color: "#c084fc",
|
|
202
|
+
}),
|
|
203
|
+
part("star", {
|
|
204
|
+
geometry: star({ outerRadius: 9, innerRadius: 4.5, points: 5 }).extrude({ height: 5 }),
|
|
205
|
+
position: [24, 24, 0],
|
|
206
|
+
color: "#fb7185",
|
|
207
|
+
}),
|
|
208
|
+
part("hexagon", {
|
|
209
|
+
geometry: regularPolygon({ radius: 7, sides: 6, sizing: "face" }).extrude({ height: 5 }),
|
|
210
|
+
position: [48, 24, 0],
|
|
211
|
+
color: "#22d3ee",
|
|
212
|
+
}),
|
|
213
|
+
];
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Sphere, torus, and tube are solid factories. Ellipse, star, and regular polygon create Sections that can be extruded.
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
Use a [`tube`](../reference/model/tube.md) when the bore is concentric; it avoids a separate cutter.
|
|
222
|
+
A [`torus`](../reference/model/torus.md) uses the distance to the circular profile's center as its
|
|
223
|
+
major radius. [`regularPolygon`](../reference/model/regularPolygon.md) has an exact side count;
|
|
224
|
+
`sizing: "face"` makes the specified radius reach the faces instead of the vertices. Keep physical
|
|
225
|
+
curve tolerance for ordinary round shapes and use exact segment counts for deliberate faceting.
|
|
226
|
+
|
|
227
|
+
## Primitive booleans and repeated placement
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
import { box, cylinder, radialPattern, union } from "@metamesh/modeling";
|
|
233
|
+
import { generate } from "@metamesh/project";
|
|
234
|
+
|
|
235
|
+
export default generate(({ part }) => {
|
|
236
|
+
const hub = cylinder({ height: 12, radius: 14 });
|
|
237
|
+
const arm = box({ size: [30, 6, 6] });
|
|
238
|
+
// Translate first, then rotate the whole arm about the world origin.
|
|
239
|
+
// Its inner end overlaps the hub so union creates one connected part.
|
|
240
|
+
const arms = radialPattern(arm.translate([18, 0, 0]).rotate([0, 0, 30]), {
|
|
241
|
+
count: 6,
|
|
242
|
+
axis: [0, 0, 1],
|
|
243
|
+
angleDegrees: 60,
|
|
244
|
+
});
|
|
245
|
+
// Both shapes are Z-centered; extra cutter height clears both hub faces.
|
|
246
|
+
const bore = cylinder({ height: 16, radius: 4 });
|
|
247
|
+
// Combine the repeated features once, then cut the common bore.
|
|
248
|
+
return [part("model", union([hub, ...arms]).subtract([bore]))];
|
|
249
|
+
});
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Position and rotate one arm, repeat it about +Z, union the overlaps, then cut a common bore.
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
Transforms apply in written order: `arm.translate(...).rotate(...)` moves the arm first, then rotates
|
|
257
|
+
its position about the origin. Reversing those calls rotates the arm locally before moving it.
|
|
258
|
+
Keep a deliberate overlap between each arm and the hub so the result is one connected solid.
|
|
259
|
+
|
|
260
|
+
Exact signatures: [`box`](../reference/model/box.md),
|
|
261
|
+
[`cylinder`](../reference/model/cylinder.md), and
|
|
262
|
+
[`radialPattern`](../reference/model/radialPattern.md).
|
|
263
|
+
|
|
264
|
+
## Rotation-minimizing path sweep
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
```ts
|
|
269
|
+
import { rectangle } from "@metamesh/modeling";
|
|
270
|
+
import { generate } from "@metamesh/project";
|
|
271
|
+
|
|
272
|
+
export default generate(({ part }) => {
|
|
273
|
+
// An asymmetric section makes the frame orientation visible in the result.
|
|
274
|
+
const section = rectangle({
|
|
275
|
+
size: [8, 3],
|
|
276
|
+
treatment: { kind: "round", radius: 0.8 },
|
|
277
|
+
});
|
|
278
|
+
const path = [
|
|
279
|
+
[0, 0, 0],
|
|
280
|
+
[15, 0, 8],
|
|
281
|
+
[25, 10, 18],
|
|
282
|
+
[25, 25, 24],
|
|
283
|
+
] as const;
|
|
284
|
+
// The initial normal sets profile +X; transport carries it along the path.
|
|
285
|
+
// The path is open, so the sweep closes both ends with caps.
|
|
286
|
+
return [
|
|
287
|
+
part(
|
|
288
|
+
"model",
|
|
289
|
+
section.sweep(path, { orientation: { kind: "transport", initialNormal: [0, 1, 0] } })
|
|
290
|
+
),
|
|
291
|
+
];
|
|
292
|
+
});
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The asymmetric section makes its transported orientation visible as the path turns.
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
`section.sweep(path, options)` transports the filled shape along the path. Choose the starting profile-X direction with
|
|
300
|
+
`orientation: { kind: "transport", initialNormal: [0, 1, 0] }`. Fixed normals, directed normal guides
|
|
301
|
+
and discrete Frenet frames are explicit alternative policies; singular selected policies reject.
|
|
302
|
+
`twistDegrees` adds total rotation, following physical path length by default; `twistBy: "stations"`
|
|
303
|
+
uses the authored station schedule. `scale` accepts a positive uniform size, XY pair or one XY pair
|
|
304
|
+
per normalized station. `closed: true` joins an implicitly closed path without repeated endpoints;
|
|
305
|
+
orientation, scales and `seamProfileOffset` must describe a compatible closing seam.
|
|
306
|
+
|
|
307
|
+
Start with the open path above, inspect the first cap and the turns, then replace the rectangle
|
|
308
|
+
with a [`circle`](../reference/model/circle.md) for a round rod. A sweep follows the supplied path
|
|
309
|
+
stations; it does not infer a smooth curve between them. Sample a curve with the
|
|
310
|
+
[path helpers](../reference/geometry/categories/curves-paths.md) when you need a curved trajectory.
|
|
311
|
+
|
|
312
|
+
## Named anchors and custom frames
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
import { anchor, box, cylinder } from "@metamesh/modeling";
|
|
318
|
+
import { generate } from "@metamesh/project";
|
|
319
|
+
|
|
320
|
+
export default generate(({ part }) => {
|
|
321
|
+
const base = box({ size: [40, 24, 6], center: false });
|
|
322
|
+
// Named anchors follow dimensions: no duplicated half-height calculation.
|
|
323
|
+
// Mating bottom to top opposes the two outward normals automatically.
|
|
324
|
+
const pin = cylinder({ diameter: 8, height: 12 }).attach("bottom", anchor(base, "top"), {
|
|
325
|
+
gap: 0.2,
|
|
326
|
+
});
|
|
327
|
+
// Keep the gap and the two physical pieces instead of unioning the assembly.
|
|
328
|
+
return [part("base", { geometry: base }), part("pin", { geometry: pin })];
|
|
329
|
+
});
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
The pin's bottom mates to the base's top with a 0.2 mm gap. They remain two named parts.
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
Ordinary primitives know their named anchors, so `anchor(base, "top")` follows the box's dimensions
|
|
337
|
+
and placement. `pin.attach("bottom", anchor(base, "top"))` mates opposed directions. Transforms and
|
|
338
|
+
patterns carry those frames with the shape, with outward normals preserved under nonuniform scale
|
|
339
|
+
and reflection. The axis names are `left/right` (−X/+X), `back/front` (−Y/+Y) and `bottom/top` (−Z/+Z).
|
|
340
|
+
|
|
341
|
+
Use `shape.withAnchors({ mount: createAnchor3(position, direction, up) })` to define a custom datum
|
|
342
|
+
on a new handle. Existing names remain unless replaced; definitions are copied and immutable.
|
|
343
|
+
Boolean and other constructed shapes need explicit definitions because their surfaces may change.
|
|
344
|
+
Anchor names use lowercase kebab-case, with at most 64 characters and 128 definitions per shape.
|
|
345
|
+
Lookup realizes the required recipe in the active generation transaction. Returned frames are plain data.
|
|
346
|
+
|
|
347
|
+
Primitive anchors describe nominal construction dimensions. Finishing and curve sampling do not
|
|
348
|
+
move them. Tube and torus axial datums may lie over an opening; a cone has no cap anchor at its apex.
|
|
349
|
+
Regular polygons and stars expose only `center`. Custom `Anchor3` frames, including pure
|
|
350
|
+
`boxAnchor3` and `cylinderAnchor3` helpers, work wherever a source or target frame is required.
|
|
351
|
+
|
|
352
|
+
Primitive `placement` uses the same source/target anchor, `alignment`, `gap` and `spinDegrees`
|
|
353
|
+
vocabulary as `attach`, including a named `source`. It applies after local shape construction. Filled Section placement must
|
|
354
|
+
preserve the XY plane.
|
|
355
|
+
|
|
356
|
+
The `gap` here separates the two pieces along the target normal; it is a placement distance, not
|
|
357
|
+
a radial fit clearance. Keep separate named parts for an assembly. For one fused part, remove the
|
|
358
|
+
gap, add a small intended overlap, and [`union`](../reference/model/union.md) the solids.
|
|
359
|
+
|
|
360
|
+
## Printable threaded rod and nut
|
|
361
|
+
|
|
362
|
+
Follow [Build printable threads](https://metamesh.studio/docs/develop/printable-threads) for a runnable rod-and-nut example
|
|
363
|
+
and guidance on profiles, fit, lead, end treatments, resolution, and calibration.
|
|
364
|
+
|
|
365
|
+
## Treated boxes, frustums, and mirrored arrays
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
```ts
|
|
370
|
+
import { box, cylinder, gridPattern } from "@metamesh/modeling";
|
|
371
|
+
import { generate } from "@metamesh/project";
|
|
372
|
+
|
|
373
|
+
export default generate(({ part }) => {
|
|
374
|
+
const housing = box({
|
|
375
|
+
size: [46, 30, 12],
|
|
376
|
+
treatment: { kind: "round", radius: 3 },
|
|
377
|
+
});
|
|
378
|
+
const taperedBore = cylinder({
|
|
379
|
+
// The centered cutter extends beyond both faces of the 12 mm housing.
|
|
380
|
+
height: 16,
|
|
381
|
+
// Tuples run from the bottom diameter to the top diameter along +Z.
|
|
382
|
+
diameter: [8, 6],
|
|
383
|
+
sizing: "face",
|
|
384
|
+
ends: { top: { kind: "chamfer", distance: 0.8 } },
|
|
385
|
+
});
|
|
386
|
+
// Pattern the already-positioned tool; X varies fastest through the array.
|
|
387
|
+
const perforations = gridPattern(taperedBore.translate([-13, -6, 0]), {
|
|
388
|
+
count: [3, 2],
|
|
389
|
+
spacing: [13, 12],
|
|
390
|
+
});
|
|
391
|
+
// Mirror the completed housing across the plane with normal +X.
|
|
392
|
+
return [part("model", housing.subtract(perforations).mirror([1, 0, 0]))];
|
|
393
|
+
});
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
Six non-overlapping cutters share the same taper and rim treatment; the completed housing is mirrored.
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
Paired cylinder radii or diameters are always `[bottom, top]` in +Z order. A zero endpoint makes a cone;
|
|
401
|
+
chamfers under `ends.bottom` and `ends.top` may treat either nonzero end and follow the tapered side.
|
|
402
|
+
Boxes and rectangles share `round`, `chamfer`, `smooth`, and explicit `profile` treatments. Boxes
|
|
403
|
+
can select disjoint named edges or groups; rectangles can select each corner. `gridPattern` places
|
|
404
|
+
the cutters on an XY grid, with X varying fastest.
|
|
405
|
+
Zero rounding radius or zero chamfer/smooth setbacks disable that treatment, so an adjustable
|
|
406
|
+
feature can remain in the options object when switched off.
|
|
407
|
+
|
|
408
|
+
The bores use `diameter: [8, 6]` and `13 × 12 mm` spacing to leave material between them. Check
|
|
409
|
+
the widest cutter diameter and the outer wall when changing either value. In this example the
|
|
410
|
+
tool's top chamfer lies above the housing; it shapes the cutter end, not the finished hole's rim.
|
|
411
|
+
Use an explicitly shaped cutting profile if the finished mouth needs a countersink.
|
|
412
|
+
|
|
413
|
+
## Matched-section loft
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
```ts
|
|
418
|
+
import { loft, rectangle } from "@metamesh/modeling";
|
|
419
|
+
import { generate } from "@metamesh/project";
|
|
420
|
+
|
|
421
|
+
export default generate(({ part }) => {
|
|
422
|
+
const base = rectangle({
|
|
423
|
+
size: [24, 16],
|
|
424
|
+
treatment: { kind: "round", radius: 3 },
|
|
425
|
+
});
|
|
426
|
+
// Transform the Section in its XY plane; loft supplies the station heights.
|
|
427
|
+
// Keeping the original rectangle landmarks preserves corner correspondence.
|
|
428
|
+
const top = base.scale([0.8, 1.2]).rotate(10).translate([3, 0]);
|
|
429
|
+
return [
|
|
430
|
+
part(
|
|
431
|
+
"model",
|
|
432
|
+
loft([
|
|
433
|
+
{
|
|
434
|
+
profile: base,
|
|
435
|
+
z: 0,
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
profile: top,
|
|
439
|
+
z: 18,
|
|
440
|
+
},
|
|
441
|
+
])
|
|
442
|
+
),
|
|
443
|
+
];
|
|
444
|
+
});
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
The two rounded rectangles retain matching corner identities while their size and pose change.
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
This [`loft`](../reference/model/loft.md) example places a rounded rectangle at two heights. Use
|
|
452
|
+
`scale`, `rotate` and `translate` to pose the top profile in XY; `rotate` takes degrees. Each
|
|
453
|
+
station uses `z` for an ordinary horizontal plane. To tilt a station, pass
|
|
454
|
+
`frame: anchorFrame3(createAnchor3(position, direction, up))` instead; the direction chooses its
|
|
455
|
+
normal and a nonparallel `up` vector chooses its roll.
|
|
456
|
+
|
|
457
|
+
The primitive retains its corner identities, so `loft` pairs corresponding landmarks without
|
|
458
|
+
extra setup. The same approach works when corners become square or fully rounded. For a hollow
|
|
459
|
+
adapter, loft the outer shape and bore separately, then subtract the bore.
|
|
460
|
+
|
|
461
|
+
Custom hole topology or disconnected components can use an explicit
|
|
462
|
+
[`Profile`](../reference/geometry/Profile.md) family with stable component, contour, and span IDs.
|
|
463
|
+
Prepare [`matchProfiles`](../reference/geometry/matchProfiles.md) once and pass its
|
|
464
|
+
[`CorrespondingProfile`](../reference/geometry/CorrespondingProfile.md) stations to the same `loft`
|
|
465
|
+
function. Topology must remain constant across stations. Arbitrary Boolean Sections need deliberate
|
|
466
|
+
`correspondence: "direct"`, `"reindex"`, `"fast-distance"`, or `"distance"`, or explicit profiles;
|
|
467
|
+
contour order does not establish landmarks. Direct association preserves the supplied seams;
|
|
468
|
+
reindex also chooses a cyclic phase, while distance methods optimize ordered connections. See
|
|
469
|
+
[`LoftOptions`](../reference/model/LoftOptions.md) for sampling and work limits.
|
|
470
|
+
|
|
471
|
+
## Sample a heightfield
|
|
472
|
+
|
|
473
|
+
Build a relief tile from absolute Z heights over a rectangular XY grid. Imported
|
|
474
|
+
[`heightfield`](../reference/model/heightfield.md) returns a Solid for booleans and placement during
|
|
475
|
+
generation. Pure [`heightfieldMesh`](../reference/geometry/heightfieldMesh.md) accepts the same options
|
|
476
|
+
and returns an indexed mesh without an engine. Pass it directly as a mesh part, or wrap it in
|
|
477
|
+
[`immutableMesh`](../reference/model/immutableMesh.md) when returning it from a cached computation.
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
```ts
|
|
482
|
+
import { heightfield } from "@metamesh/modeling";
|
|
483
|
+
import { generate } from "@metamesh/project";
|
|
484
|
+
|
|
485
|
+
export default generate(({ part }) => {
|
|
486
|
+
return [
|
|
487
|
+
part(
|
|
488
|
+
"model",
|
|
489
|
+
heightfield({
|
|
490
|
+
coordinates: {
|
|
491
|
+
x: [-20, -18, -14, -8, 0, 8, 14, 18, 20],
|
|
492
|
+
y: [-12, -10, -6, 0, 6, 10, 12],
|
|
493
|
+
},
|
|
494
|
+
triangulation: "min-edge",
|
|
495
|
+
height: ([x, y]) => 3 + 0.8 * Math.cos(x / 6) * Math.cos(y / 5),
|
|
496
|
+
})
|
|
497
|
+
),
|
|
498
|
+
];
|
|
499
|
+
});
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
The uneven axes place more samples near the border. Coordinates are absolute millimetres, strictly
|
|
505
|
+
increasing, and must remain distinct in Float32 storage. For a uniform grid, replace `coordinates`
|
|
506
|
+
with `size: [40, 24]` and `segments: [40, 24]`; this centers the footprint unless `origin` supplies
|
|
507
|
+
its lower-left corner. Choose one sampling form per call.
|
|
508
|
+
|
|
509
|
+
`baseZ` defaults to zero. Every height is an absolute Z coordinate strictly above that base;
|
|
510
|
+
the builder preserves the sampled heights without rescaling them. It closes the top with shared
|
|
511
|
+
boundary walls and a flat underside.
|
|
512
|
+
|
|
513
|
+
| `triangulation` | Selection per top cell |
|
|
514
|
+
| ---------------- | ---------------------------------------------------------------------------- |
|
|
515
|
+
| `"fixed"` | The default lower-left to upper-right diagonal |
|
|
516
|
+
| `"min-edge"` | The shorter 3D diagonal, using the existing corner heights |
|
|
517
|
+
| `"center-error"` | The diagonal whose interpolated center is closest to one extra height sample |
|
|
518
|
+
|
|
519
|
+
All choices keep two triangles per cell and the same vertices. Center matching evaluates one
|
|
520
|
+
additional physical midpoint per cell. Both selection policies use the fixed diagonal for ties.
|
|
521
|
+
Choose sample spacing for the surface detail you need: these policies do not adapt the grid or
|
|
522
|
+
guarantee accuracy throughout each cell. Explicit axes let your model refine selected regions
|
|
523
|
+
while keeping allocation bounded.
|
|
524
|
+
[`preflightHeightfield`](../reference/geometry/preflightHeightfield.md) reports output counts and
|
|
525
|
+
checks limits without evaluating heights.
|
|
526
|
+
|
|
527
|
+
## Text from a Font parameter
|
|
528
|
+
|
|
529
|
+
Use this recipe for a label, plaque, or raised lettering whose font remains adjustable.
|
|
530
|
+
|
|
531
|
+
1. Open **Model controls**, add a **Font** control with ID `font`, and choose its default face and
|
|
532
|
+
weight. Outfit and JetBrains Mono are bundled starter fonts.
|
|
533
|
+
2. Choose **Apply & return** and use the generation program below in `model.ts`.
|
|
534
|
+
Studio prepares the selected font before the program lays out and extrudes its text.
|
|
535
|
+
3. To make the wording adjustable, add a **Text** control with ID `label` and a non-empty default,
|
|
536
|
+
then replace the literal `"MetaMesh"` with `params.label`.
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
```ts
|
|
541
|
+
import { textSection } from "@metamesh/modeling";
|
|
542
|
+
import { generate } from "@metamesh/project";
|
|
543
|
+
|
|
544
|
+
export default generate(({ params, services, part }) => {
|
|
545
|
+
// The host has loaded the exact selected font before generation.
|
|
546
|
+
const layout = services.text.layout("MetaMesh", {
|
|
547
|
+
fontSize: 8,
|
|
548
|
+
font: params.font,
|
|
549
|
+
letterSpacing: 0.15,
|
|
550
|
+
});
|
|
551
|
+
// textSection preserves counters, such as the enclosed hole in the letter a.
|
|
552
|
+
return [part("label", textSection(layout).extrude({ height: 1.2 }))];
|
|
553
|
+
});
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
The poster uses a pinned bundled Outfit face and preserves the counters inside each letter.
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
`textSection(layout)` converts prepared vector curves into a filled section, preserving holes in
|
|
561
|
+
letters. Extrude that section or combine it with other sections and solids. Use `layout.metrics`
|
|
562
|
+
and its visible `bounds` to size a backing plate or reject text without visible outlines.
|
|
563
|
+
|
|
564
|
+
Check a positioned label with [`containsBounds`](../reference/geometry/containsBounds.md),
|
|
565
|
+
using [`boundsFromSize`](../reference/geometry/boundsFromSize.md) for the available rectangle.
|
|
566
|
+
Horizontal `align: "center"` centers advance width; visible ink can remain asymmetric.
|
|
567
|
+
To resize the ink uniformly and center it inside a target, use
|
|
568
|
+
[`fitTextLayout`](../reference/geometry/fitTextLayout.md) before `textSection`. It transforms
|
|
569
|
+
the retained vector paths before sampling, keeping curve tolerance in final millimetres.
|
|
570
|
+
`maxScale: 1` permits shrinking without enlargement. Minimum readable letter height and
|
|
571
|
+
parameter-specific error messages remain model decisions.
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
```ts
|
|
576
|
+
import {
|
|
577
|
+
boundsFromSize,
|
|
578
|
+
containsBounds,
|
|
579
|
+
fitTextLayout,
|
|
580
|
+
type FittedTextLayout,
|
|
581
|
+
type VectorTextLayout,
|
|
582
|
+
} from "@metamesh/modeling/geometry";
|
|
583
|
+
|
|
584
|
+
export function labelFits(layout: VectorTextLayout): boolean {
|
|
585
|
+
const ink = layout.metrics.bounds;
|
|
586
|
+
return ink !== null && containsBounds(boundsFromSize([40, 12]), ink);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
export function fitLabel(layout: VectorTextLayout): FittedTextLayout {
|
|
590
|
+
// Fit visible ink while preserving proportions and preventing enlargement.
|
|
591
|
+
return fitTextLayout(layout, boundsFromSize([40, 12]), { maxScale: 1 });
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
| Setting | Meaning |
|
|
598
|
+
| --------------- | ------------------------------------------------------------------------------ |
|
|
599
|
+
| `font` | The complete Font control value, including the exact face revision and weight |
|
|
600
|
+
| `fontSize` | Em size in millimetres; visible capital height depends on the font |
|
|
601
|
+
| `letterSpacing` | Extra millimetres between shaped glyph clusters |
|
|
602
|
+
| `align` | Left, center, or right alignment using each line's advance width |
|
|
603
|
+
| `verticalAlign` | First-line baseline by default, or top, center, or bottom using visible bounds |
|
|
604
|
+
| `lineHeight` | Baseline-spacing multiplier; omitted uses the font's natural line spacing |
|
|
605
|
+
|
|
606
|
+
Text uses positive Y upward and supports line breaks, with at most 512 UTF-16 units and 16 lines.
|
|
607
|
+
Empty or whitespace-only text can be measured but cannot create a section. Return a parameter error
|
|
608
|
+
for that expected input; a missing glyph also requires different wording or a font that supports it.
|
|
609
|
+
See [`TextSectionOptions`](../reference/model/TextSectionOptions.md) for exact options.
|
|
610
|
+
|
|
611
|
+
Studio loads declared fonts before generation. Export uses the captured visible mesh. Saving a Project
|
|
612
|
+
preserves the exact selection, including its revision, without embedding font bytes. Fonts beyond
|
|
613
|
+
the bundled starters can require internet; ordinary browser caching does not guarantee them offline.
|
|
614
|
+
If loading fails, Studio preserves the selection and last valid model so you can retry or choose a
|
|
615
|
+
replacement. Custom font uploads and text on paths are not supported.
|
|
616
|
+
|
|
617
|
+
## Solid inspection
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
```ts
|
|
622
|
+
import { box, inspectSolid } from "@metamesh/modeling";
|
|
623
|
+
import { generate } from "@metamesh/project";
|
|
624
|
+
|
|
625
|
+
export default generate(({ part }) => {
|
|
626
|
+
const result = box({ size: [40, 30, 5] });
|
|
627
|
+
const measurements = inspectSolid(result);
|
|
628
|
+
|
|
629
|
+
if (measurements.min[2] < -2.5 || measurements.parts !== 1) {
|
|
630
|
+
throw new Error("Unexpected placement or disconnected result.");
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
return [part("model", result)];
|
|
634
|
+
});
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
Use [`layoutRow`](../reference/geometry/layoutRow.md) to arrange pieces along +X with an explicit
|
|
640
|
+
gap and ground their minimum Y/Z at zero. Pass bounds after any intended rotation; the returned
|
|
641
|
+
translations belong in `part` placement options so geometry remains reusable.
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
```ts
|
|
646
|
+
import { box, generate, inspectSolid } from "@metamesh/modeling";
|
|
647
|
+
import { layoutRow } from "@metamesh/modeling/geometry";
|
|
648
|
+
|
|
649
|
+
export const rowModel = generate<Record<never, never>>(({ part }) => {
|
|
650
|
+
const pieces = [box({ size: [20, 10, 6] }), box({ size: [12, 16, 8] })];
|
|
651
|
+
const positions = layoutRow(pieces.map(inspectSolid), { gap: 4 });
|
|
652
|
+
return pieces.map((geometry, index) =>
|
|
653
|
+
part(`piece-${index}`, { geometry, position: positions[index]! })
|
|
654
|
+
);
|
|
655
|
+
});
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
Inspection copies supported native facts. Manufacturing finalization checks finite, closed,
|
|
661
|
+
oriented and reconstructable output before it becomes the preview or export snapshot. These
|
|
662
|
+
checks do not certify manufacturability: product-specific minimum walls, overhangs, fits and
|
|
663
|
+
parameter messages remain the Generator's job.
|
|
664
|
+
|
|
665
|
+
After adapting a recipe, check its default, the largest and smallest supported dimensions, and
|
|
666
|
+
every optional feature. Inspect the current result in Studio before exporting it. Continue with
|
|
667
|
+
the [source and result contract](generation.md), or use the
|
|
668
|
+
[Modeling API reference](../reference/model.md) for exact signatures and options.
|