@metamesh/modeling 0.11.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 +39 -0
- package/README.md +60 -58
- package/dist/api/engine.d.ts +123 -97
- package/dist/api/geometry.d.ts +3896 -3307
- package/dist/api/index.d.ts +2489 -2267
- 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/immutable-generation-data.js +36 -6
- 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 +40 -33
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GeometryError } from "../geometry/errors.js";
|
|
2
2
|
import { GenerationError, } from "../model/generation.js";
|
|
3
|
-
import { captureGenerationValue, compareGenerationValues, generationDataEntries, } from "./immutable-generation-data.js";
|
|
3
|
+
import { captureGenerationDependencies, captureGenerationValue, compareGenerationValues, generationDataEntries, } from "./immutable-generation-data.js";
|
|
4
4
|
import { createModelDependencies } from "./model-dependencies.js";
|
|
5
5
|
import { assertSynchronousScopeResult } from "./native/ownership.js";
|
|
6
6
|
function reusableEntry(node) {
|
|
@@ -11,17 +11,13 @@ function reusableEntry(node) {
|
|
|
11
11
|
return undefined;
|
|
12
12
|
}
|
|
13
13
|
const parameterKeys = Symbol("parameter-keys");
|
|
14
|
-
const
|
|
14
|
+
const emptyInputs = Object.freeze([]);
|
|
15
15
|
const isArray = (value) => Array.isArray(value);
|
|
16
16
|
const canonicalId = (id) => typeof id === "string" && id.length <= 64 && /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id);
|
|
17
17
|
function invalid(message) {
|
|
18
18
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "generate" });
|
|
19
19
|
}
|
|
20
|
-
const
|
|
21
|
-
const keys = Object.keys(left);
|
|
22
|
-
return (keys.length === Object.keys(right).length &&
|
|
23
|
-
keys.every((key) => Object.hasOwn(right, key) && Object.is(left[key], right[key])));
|
|
24
|
-
};
|
|
20
|
+
const sameInputs = (left, right) => left.length === right.length && left.every((value, index) => Object.is(value, right[index]));
|
|
25
21
|
function evaluateComputed(callback) {
|
|
26
22
|
const result = callback();
|
|
27
23
|
assertSynchronousScopeResult(result, () => new GeometryError("INVALID_ARGUMENT", "Computed callbacks must be synchronous.", {
|
|
@@ -46,16 +42,18 @@ class ComputationRevision {
|
|
|
46
42
|
parameterSnapshot;
|
|
47
43
|
committed;
|
|
48
44
|
readerIds;
|
|
45
|
+
validatedInputs;
|
|
49
46
|
assertActive;
|
|
50
47
|
assertNoFailedAssertion;
|
|
51
48
|
nodes = new Map();
|
|
52
49
|
keySignature;
|
|
53
50
|
stack = [];
|
|
54
|
-
constructor(options, parameterSnapshot, committed, readerIds, assertActive, assertNoFailedAssertion) {
|
|
51
|
+
constructor(options, parameterSnapshot, committed, readerIds, validatedInputs, assertActive, assertNoFailedAssertion) {
|
|
55
52
|
this.options = options;
|
|
56
53
|
this.parameterSnapshot = parameterSnapshot;
|
|
57
54
|
this.committed = committed;
|
|
58
55
|
this.readerIds = readerIds;
|
|
56
|
+
this.validatedInputs = validatedInputs;
|
|
59
57
|
this.assertActive = assertActive;
|
|
60
58
|
this.assertNoFailedAssertion = assertNoFailedAssertion;
|
|
61
59
|
// Structural reads share one unambiguous signature, even when parameter names contain NUL.
|
|
@@ -77,27 +75,22 @@ class ComputationRevision {
|
|
|
77
75
|
this.nodes.clear();
|
|
78
76
|
this.committed = new Map();
|
|
79
77
|
}
|
|
80
|
-
register(id,
|
|
78
|
+
register(id, callback, dependencies = emptyInputs) {
|
|
81
79
|
if (!canonicalId(id) || this.nodes.has(id))
|
|
82
80
|
invalid("Computed IDs must be unique canonical lowercase identifiers of at most 64 characters.");
|
|
83
81
|
if (this.nodes.size >= 100_000)
|
|
84
82
|
throw new GeometryError("COMPLEXITY_LIMIT", "Too many declared computations.", {
|
|
85
83
|
operation: "computed",
|
|
86
84
|
});
|
|
87
|
-
|
|
88
|
-
?
|
|
89
|
-
|
|
85
|
+
if (typeof callback !== "function" || !Array.isArray(dependencies))
|
|
86
|
+
invalid("Use computed(id, callback, dependencies?) with an optional dependency array.");
|
|
87
|
+
const inputs = dependencies === emptyInputs
|
|
88
|
+
? emptyInputs
|
|
89
|
+
: captureGenerationDependencies(dependencies, (value) => this.readerIds.has(value), this.validatedInputs);
|
|
90
90
|
const previous = this.committed.get(id);
|
|
91
|
-
let boundInputs;
|
|
92
|
-
if (previous !== undefined && sameBindings(previous.bindings, bindings))
|
|
93
|
-
boundInputs = previous.boundInputs;
|
|
94
|
-
else
|
|
95
|
-
boundInputs = captureGenerationValue(bindings, (value) => this.readerIds.has(value));
|
|
96
|
-
const invoke = typeof bindingsOrCallback === "function" ? bindingsOrCallback : () => callback(boundInputs);
|
|
97
91
|
this.nodes.set(id, {
|
|
98
|
-
callback
|
|
99
|
-
|
|
100
|
-
boundInputs,
|
|
92
|
+
callback,
|
|
93
|
+
inputs,
|
|
101
94
|
previous,
|
|
102
95
|
state: { kind: "pending" },
|
|
103
96
|
});
|
|
@@ -162,7 +155,7 @@ class ComputationRevision {
|
|
|
162
155
|
}
|
|
163
156
|
}
|
|
164
157
|
canReuse(node, previous) {
|
|
165
|
-
if (this.options.cache === false || node.
|
|
158
|
+
if (this.options.cache === false || !sameInputs(node.inputs, previous.inputs))
|
|
166
159
|
return false;
|
|
167
160
|
for (const [key, value] of previous.parameters) {
|
|
168
161
|
const current = key === parameterKeys ? this.keySignature : Reflect.get(this.parameterSnapshot, key);
|
|
@@ -191,6 +184,18 @@ class ComputationRevision {
|
|
|
191
184
|
evaluation.parameters.clear();
|
|
192
185
|
evaluation.dependencies.clear();
|
|
193
186
|
evaluation.cacheable = true;
|
|
187
|
+
// Declared readers depend on their output, not just their stable callable identity.
|
|
188
|
+
for (const input of node.inputs) {
|
|
189
|
+
const dependency = typeof input === "function" ? this.readerIds.get(input) : undefined;
|
|
190
|
+
if (dependency !== undefined) {
|
|
191
|
+
try {
|
|
192
|
+
this.read(dependency);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Failed reads already prevent reuse; the callback owns propagation or fallback.
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
194
199
|
const result = evaluateComputed(node.callback);
|
|
195
200
|
this.assertNoFailedAssertion();
|
|
196
201
|
const previous = node.previous;
|
|
@@ -198,14 +203,13 @@ class ComputationRevision {
|
|
|
198
203
|
if (reusable && previous !== undefined) {
|
|
199
204
|
const comparison = compareGenerationValues(previous.value, result);
|
|
200
205
|
if (comparison === "different")
|
|
201
|
-
invalid(`Cache verification for '${id}' found a changed result without a tracked dependency.
|
|
206
|
+
invalid(`Cache verification for '${id}' found a changed result without a tracked dependency. Add changing outer values to the dependency array.`);
|
|
202
207
|
if (comparison === "unsupported")
|
|
203
208
|
invalid(`Cache verification for '${id}' cannot compare this result within its bounded data/recipe probe. Use cache: false for a full output equivalence check.`);
|
|
204
209
|
value = previous.value;
|
|
205
210
|
}
|
|
206
211
|
return Object.freeze({
|
|
207
|
-
|
|
208
|
-
boundInputs: node.boundInputs,
|
|
212
|
+
inputs: node.inputs,
|
|
209
213
|
parameters: evaluation.parameters,
|
|
210
214
|
dependencies: evaluation.dependencies,
|
|
211
215
|
value,
|
|
@@ -221,11 +225,12 @@ export function createGenerationGraph(options, maxParts) {
|
|
|
221
225
|
let committed = new Map();
|
|
222
226
|
const readers = new Map();
|
|
223
227
|
const readerIds = new WeakMap();
|
|
228
|
+
const validatedInputs = new WeakSet();
|
|
224
229
|
let activeRead;
|
|
225
230
|
let previousInput = {};
|
|
226
231
|
let previousParameterSnapshot = {};
|
|
227
232
|
// Build stable readers outside registration's lexical scope so they cannot retain a revision's
|
|
228
|
-
// callback, captured locals, or
|
|
233
|
+
// callback, captured locals, or dependency inputs after that revision closes.
|
|
229
234
|
const createReader = (id) => (() => {
|
|
230
235
|
if (activeRead === undefined)
|
|
231
236
|
return invalid("Computed readers can only be used during their active model session revision.");
|
|
@@ -251,7 +256,7 @@ export function createGenerationGraph(options, maxParts) {
|
|
|
251
256
|
if (assertionFailure !== undefined)
|
|
252
257
|
throw assertionFailure;
|
|
253
258
|
};
|
|
254
|
-
const computations = new ComputationRevision(options, parameterSnapshot, committed, readerIds, assertActive, assertNoFailedAssertion);
|
|
259
|
+
const computations = new ComputationRevision(options, parameterSnapshot, committed, readerIds, validatedInputs, assertActive, assertNoFailedAssertion);
|
|
255
260
|
const params = new Proxy(parameterSnapshot, {
|
|
256
261
|
get: (target, key) => {
|
|
257
262
|
assertActive();
|
|
@@ -300,11 +305,11 @@ export function createGenerationGraph(options, maxParts) {
|
|
|
300
305
|
},
|
|
301
306
|
});
|
|
302
307
|
activeRead = computations.read;
|
|
303
|
-
const computed = ((id,
|
|
308
|
+
const computed = ((id, callback, dependencies) => {
|
|
304
309
|
assertActive();
|
|
305
310
|
if (!declaring || computations.evaluating)
|
|
306
311
|
invalid("Declare computations only in the outer generation callback.");
|
|
307
|
-
computations.register(id,
|
|
312
|
+
computations.register(id, callback, dependencies);
|
|
308
313
|
let reader = readers.get(id);
|
|
309
314
|
if (reader === undefined) {
|
|
310
315
|
reader = createReader(id);
|
|
@@ -379,18 +384,20 @@ export function createGenerationGraph(options, maxParts) {
|
|
|
379
384
|
// Catching an assertion does not turn its revision into a successful snapshot.
|
|
380
385
|
assertNoFailedAssertion();
|
|
381
386
|
declaring = false;
|
|
382
|
-
|
|
387
|
+
const parts = isArray(output) ? output : [output];
|
|
388
|
+
if (parts.length === 0)
|
|
383
389
|
invalid("Generation must return at least one declared part.");
|
|
384
|
-
if (
|
|
390
|
+
if (parts.length > maxParts)
|
|
385
391
|
throw new GeometryError("COMPLEXITY_LIMIT", `Output exceeds ${maxParts} parts.`, {
|
|
386
392
|
operation: "generate",
|
|
387
393
|
});
|
|
388
394
|
const returnedIds = new Set();
|
|
389
|
-
for (const descriptor of
|
|
395
|
+
for (const descriptor of parts) {
|
|
390
396
|
if (!declaredParts.has(descriptor) || returnedIds.has(descriptor.id))
|
|
391
397
|
invalid("Return each declared output part at most once.");
|
|
392
398
|
returnedIds.add(descriptor.id);
|
|
393
399
|
}
|
|
400
|
+
return parts;
|
|
394
401
|
},
|
|
395
402
|
dependencies(output) {
|
|
396
403
|
return createModelDependencies(output, modelParameters, new Map([...computations.nodes].map(([id, node]) => [id, reusableEntry(node)])), readerIds);
|
|
@@ -403,7 +410,7 @@ export function createGenerationGraph(options, maxParts) {
|
|
|
403
410
|
for (const node of computations.nodes.values()) {
|
|
404
411
|
const entry = reusableEntry(node);
|
|
405
412
|
if (entry !== undefined)
|
|
406
|
-
retained.push(entry.value, entry.
|
|
413
|
+
retained.push(entry.value, entry.inputs, ...entry.parameters.values());
|
|
407
414
|
}
|
|
408
415
|
return [...retained, parameterSnapshot, inputValues];
|
|
409
416
|
},
|
package/dist/engine/session.js
CHANGED
|
@@ -110,8 +110,7 @@ class SessionRevision {
|
|
|
110
110
|
generate(revision, deferred, native, mode) {
|
|
111
111
|
const { program, services, caches } = this.session;
|
|
112
112
|
const startedAt = performance.now();
|
|
113
|
-
const output = program.generate({ ...revision.context, services });
|
|
114
|
-
revision.finish(output);
|
|
113
|
+
const output = revision.finish(program.generate({ ...revision.context, services }));
|
|
115
114
|
if (mode === "validate")
|
|
116
115
|
return { kind: "validation", diagnostics: Object.freeze([...revision.diagnostics]) };
|
|
117
116
|
const captured = caches.snapshots.capture({
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { GeometryError } from "./errors.js";
|
|
2
|
+
function fail(operation, message) {
|
|
3
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
4
|
+
}
|
|
5
|
+
function isArray(value) {
|
|
6
|
+
return Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function vector(values, operation) {
|
|
9
|
+
if (values.some((value) => !Number.isFinite(value)))
|
|
10
|
+
fail(operation, "Bounds calculations must produce finite coordinates.");
|
|
11
|
+
const normalized = values.map((value) => (value === 0 ? 0 : value));
|
|
12
|
+
return values.length === 2
|
|
13
|
+
? Object.freeze([normalized[0], normalized[1]])
|
|
14
|
+
: Object.freeze([normalized[0], normalized[1], normalized[2]]);
|
|
15
|
+
}
|
|
16
|
+
function validate(bounds, operation) {
|
|
17
|
+
if (typeof bounds !== "object" ||
|
|
18
|
+
bounds === null ||
|
|
19
|
+
!isArray(bounds.min) ||
|
|
20
|
+
!isArray(bounds.max) ||
|
|
21
|
+
(bounds.min.length !== 2 && bounds.min.length !== 3) ||
|
|
22
|
+
bounds.max.length !== bounds.min.length)
|
|
23
|
+
fail(operation, "Bounds require matching XY or XYZ minimum and maximum tuples.");
|
|
24
|
+
for (let axis = 0; axis < bounds.min.length; axis++) {
|
|
25
|
+
const minimum = bounds.min[axis], maximum = bounds.max[axis];
|
|
26
|
+
if (!Number.isFinite(minimum) || !Number.isFinite(maximum) || minimum > maximum)
|
|
27
|
+
fail(operation, "Bounds coordinates must be finite and ordered from minimum to maximum.");
|
|
28
|
+
if (!Number.isFinite(maximum - minimum))
|
|
29
|
+
fail(operation, "Bounds dimensions must be finite.");
|
|
30
|
+
}
|
|
31
|
+
return bounds.min.length;
|
|
32
|
+
}
|
|
33
|
+
function size(bounds) {
|
|
34
|
+
return bounds.max.map((value, axis) => value - bounds.min[axis]);
|
|
35
|
+
}
|
|
36
|
+
function center(bounds) {
|
|
37
|
+
return bounds.min.map((value, axis) => value / 2 + bounds.max[axis] / 2);
|
|
38
|
+
}
|
|
39
|
+
export function boundsFromSize(dimensions, options = {}) {
|
|
40
|
+
const operation = "boundsFromSize";
|
|
41
|
+
if (!isArray(dimensions) ||
|
|
42
|
+
(dimensions.length !== 2 && dimensions.length !== 3) ||
|
|
43
|
+
Array.from(dimensions).some((value) => !Number.isFinite(value) || value < 0))
|
|
44
|
+
fail(operation, "Bounds dimensions require two or three finite nonnegative values.");
|
|
45
|
+
if (typeof options !== "object" ||
|
|
46
|
+
options === null ||
|
|
47
|
+
isArray(options) ||
|
|
48
|
+
(options.center !== undefined && typeof options.center !== "boolean"))
|
|
49
|
+
fail(operation, "Bounds placement requires an optional boolean center value.");
|
|
50
|
+
const centered = options.center ?? true;
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
min: vector(dimensions.map((value) => (centered ? -value / 2 : 0)), operation),
|
|
53
|
+
max: vector(dimensions.map((value) => (centered ? value / 2 : value)), operation),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export function boundsSize(bounds) {
|
|
57
|
+
validate(bounds, "boundsSize");
|
|
58
|
+
return vector(size(bounds), "boundsSize");
|
|
59
|
+
}
|
|
60
|
+
export function boundsCenter(bounds) {
|
|
61
|
+
validate(bounds, "boundsCenter");
|
|
62
|
+
return vector(center(bounds), "boundsCenter");
|
|
63
|
+
}
|
|
64
|
+
export function containsBounds(outer, inner) {
|
|
65
|
+
const dimension = validate(outer, "containsBounds");
|
|
66
|
+
if (validate(inner, "containsBounds") !== dimension)
|
|
67
|
+
fail("containsBounds", "Contained bounds must have the same dimension.");
|
|
68
|
+
return outer.min.every((value, axis) => inner.min[axis] >= value && inner.max[axis] <= outer.max[axis]);
|
|
69
|
+
}
|
|
70
|
+
export function fitBounds(source, target, options = {}) {
|
|
71
|
+
const operation = "fitBounds";
|
|
72
|
+
const dimension = validate(source, operation);
|
|
73
|
+
if (validate(target, operation) !== dimension)
|
|
74
|
+
fail(operation, "Source and target bounds must have the same dimension.");
|
|
75
|
+
if (typeof options !== "object" || options === null || isArray(options))
|
|
76
|
+
fail(operation, "Fitting options must be an object.");
|
|
77
|
+
if (options.maxScale !== undefined &&
|
|
78
|
+
(!Number.isFinite(options.maxScale) || options.maxScale <= 0))
|
|
79
|
+
fail(operation, "Maximum fitting scale must be finite and positive.");
|
|
80
|
+
const sourceSize = size(source), targetSize = size(target);
|
|
81
|
+
const ratios = sourceSize.flatMap((extent, axis) => extent === 0 ? [] : [targetSize[axis] / extent]);
|
|
82
|
+
if (ratios.length === 0)
|
|
83
|
+
fail(operation, "Fitting needs at least one positive source extent.");
|
|
84
|
+
const scale = Math.min(...ratios, options.maxScale ?? Infinity);
|
|
85
|
+
if (!Number.isFinite(scale) || scale <= 0)
|
|
86
|
+
fail(operation, "Target bounds must allow a finite positive fitting scale.");
|
|
87
|
+
const sourceCenter = center(source), targetCenter = center(target);
|
|
88
|
+
const position = vector(targetCenter.map((value, axis) => value - sourceCenter[axis] * scale), operation);
|
|
89
|
+
const bounds = Object.freeze({
|
|
90
|
+
min: vector(source.min.map((value, axis) => value * scale + position[axis]), operation),
|
|
91
|
+
max: vector(source.max.map((value, axis) => value * scale + position[axis]), operation),
|
|
92
|
+
});
|
|
93
|
+
return Object.freeze({ scale, position, bounds });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Returns immutable translations for a +X row of finite XYZ bounds with a nonnegative gap.
|
|
97
|
+
* Each minimum Y/Z becomes zero, and the first minimum X becomes zero. Supply bounds after
|
|
98
|
+
* any intended part rotation; translations apply to those bounds. An empty input returns [].
|
|
99
|
+
*/
|
|
100
|
+
export function layoutRow(bounds, options = {}) {
|
|
101
|
+
const operation = "layoutRow";
|
|
102
|
+
if (!isArray(bounds) || typeof options !== "object" || options === null || isArray(options))
|
|
103
|
+
fail(operation, "Row layout requires bounds and an options object.");
|
|
104
|
+
const gap = options.gap ?? 0;
|
|
105
|
+
if (!Number.isFinite(gap) || gap < 0)
|
|
106
|
+
fail(operation, "Row gap must be finite and nonnegative.");
|
|
107
|
+
let nextX = 0;
|
|
108
|
+
return Object.freeze(Array.from(bounds, (item) => {
|
|
109
|
+
if (validate(item, operation) !== 3)
|
|
110
|
+
fail(operation, "Row layout requires XYZ bounds.");
|
|
111
|
+
const position = vector([nextX - item.min[0], -item.min[1], -item.min[2]], operation);
|
|
112
|
+
nextX += item.max[0] - item.min[0] + gap;
|
|
113
|
+
if (!Number.isFinite(nextX))
|
|
114
|
+
fail(operation, "Row layout exceeds finite coordinates.");
|
|
115
|
+
return position;
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
@@ -60,11 +60,15 @@ export function resolveCylinderPrimitive(options) {
|
|
|
60
60
|
invalid("Cylinder side dimensions must remain finite.");
|
|
61
61
|
const sideX = radialChange / sideLength, sideZ = options.height / sideLength;
|
|
62
62
|
const bottomAngle = Math.acos(-sideX), topAngle = Math.acos(sideX);
|
|
63
|
-
|
|
63
|
+
let bottom = options.ends?.bottom, top = options.ends?.top;
|
|
64
64
|
const bottomSetbacks = bottom === undefined
|
|
65
65
|
? [0, 0]
|
|
66
66
|
: edgeTreatmentSetbacks(bottom, "cylinder", bottomAngle, options.limits);
|
|
67
67
|
const topSetbacks = top === undefined ? [0, 0] : edgeTreatmentSetbacks(top, "cylinder", topAngle, options.limits);
|
|
68
|
+
if (bottomSetbacks[0] === 0 && bottomSetbacks[1] === 0)
|
|
69
|
+
bottom = undefined;
|
|
70
|
+
if (topSetbacks[0] === 0 && topSetbacks[1] === 0)
|
|
71
|
+
top = undefined;
|
|
68
72
|
if ((bottom && bottomRadius === 0) || (top && topRadius === 0))
|
|
69
73
|
invalid("A zero-radius cone apex cannot receive an end treatment.");
|
|
70
74
|
if ((bottom && bottomSetbacks[0] >= bottomRadius) || (top && topSetbacks[0] >= topRadius))
|
|
@@ -29,8 +29,8 @@ export function edgeTreatmentSetbacks(treatment, operation, angle = Math.PI / 2,
|
|
|
29
29
|
throw new GeometryError("NON_FINITE_VALUE", "Treatment setbacks must be finite.", {
|
|
30
30
|
operation,
|
|
31
31
|
});
|
|
32
|
-
if (result.some((value) => value
|
|
33
|
-
fail(operation, "Treatment setbacks must be positive.");
|
|
32
|
+
if (result.some((value) => value < 0) || (result[0] === 0) !== (result[1] === 0))
|
|
33
|
+
fail(operation, "Treatment setbacks must be positive or both zero.");
|
|
34
34
|
}
|
|
35
35
|
else if (treatment.kind === "profile") {
|
|
36
36
|
const points = treatment.profile;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "./errors.js";
|
|
2
|
-
import { validateTriangleMesh } from "./mesh.js";
|
|
2
|
+
import { validateTriangleMesh } from "./mesh/mesh.js";
|
|
3
3
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "./model-limits.js";
|
|
4
4
|
import { writeMeshVertex } from "./numeric.js";
|
|
5
5
|
function planHeightfield(options, limits) {
|
package/dist/geometry/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/** Pure geometry foundations without host initialization. @packageDocumentation */
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
2
|
+
export { boundsFromSize, boundsSize, boundsCenter, containsBounds, fitBounds, layoutRow, } from "./bounds.js";
|
|
3
|
+
export { fitTextLayout } from "./text-fitting.js";
|
|
4
|
+
export { gridPatternTransforms, linearPatternTransforms, radialPatternTransforms, pathPatternTransforms, } from "./patterns.js";
|
|
5
|
+
export { validateSolidMesh } from "./mesh/mesh-solid.js";
|
|
6
|
+
export { computeTriangleMeshCentroid } from "./mesh/mesh-centroid.js";
|
|
4
7
|
export { matchProfiles, } from "./profiles/matched.js";
|
|
5
8
|
export { heightfieldMesh, preflightHeightfield, } from "./heightfield.js";
|
|
6
9
|
export { preflightThreadedRodSolid as preflightThreadedRod, preflightInternalThreadCutterSolid as preflightInternalThreadCutter, preflightThreadedNutSolid as preflightThreadedNut, } from "./mechanical/thread-solids.js";
|
|
@@ -8,7 +11,7 @@ export { anchorFrame3, attachTransform, boxAnchor3, createAnchor3, cylinderAncho
|
|
|
8
11
|
export { defaultGeometrySamplingLimits, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
|
|
9
12
|
export { GeometryError, isGeometryError, } from "./errors.js";
|
|
10
13
|
export { resolveExtrusionDivisions, } from "./extrusion.js";
|
|
11
|
-
export { extrudeMesh, loftMesh,
|
|
14
|
+
export { extrudeMesh, loftMesh, triangulateContour, } from "./loft/loft.js";
|
|
12
15
|
export { add3, cross3, dot3, length3, lerp3, normalize3, projectOntoPlane3, rotateAroundAxis3, scale3, subtract3, } from "./math/vector3.js";
|
|
13
16
|
export { minimumCylindricalGearToothCountWithoutUndercut, resolveCylindricalGear, resolveCylindricalGearPair, resolveRackPitch, sampleCylindricalGearOutline, sampleInternalCylindricalGearSpaceOutline, sampleRackToothPath, } from "./mechanical/gears.js";
|
|
14
17
|
export { measureInternalCylindricalGearPairMotion, } from "./mechanical/gear-motion.js";
|
|
@@ -18,27 +21,27 @@ export { compensateThreadProfileAxially, compensateThreadProfileForFaceting, cre
|
|
|
18
21
|
export { preflightHelicalThreadSolidMesh, } from "./mechanical/thread-mesh-plan.js";
|
|
19
22
|
export { sampleConventionalThreadHelices as sampleThreadHelices, } from "./mechanical/thread-helices.js";
|
|
20
23
|
export { PRINTABLE_THREAD_FIT_POLICIES, compensateThreadDiameters, resolvePrintableThreadFitPolicy, resolveThreadCircularSegments, } from "./mechanical/threads.js";
|
|
21
|
-
export { analyzeTriangleMesh, joinTriangleMeshes, measureTriangleMesh, meshBounds, reverseTriangleMesh, transformTriangleMesh, validateTriangleMesh, } from "./mesh.js";
|
|
22
|
-
export { createTriangleMeshSignature, } from "./mesh-signature.js";
|
|
23
|
-
export { optimizePlanarPatches, } from "./mesh-planar.js";
|
|
24
|
-
export { analyzeTriangleMeshQuality, } from "./mesh-quality.js";
|
|
24
|
+
export { analyzeTriangleMesh, joinTriangleMeshes, measureTriangleMesh, meshBounds, reverseTriangleMesh, transformTriangleMesh, validateTriangleMesh, } from "./mesh/mesh.js";
|
|
25
|
+
export { createTriangleMeshSignature, } from "./mesh/mesh-signature.js";
|
|
26
|
+
export { optimizePlanarPatches, } from "./mesh/mesh-planar.js";
|
|
27
|
+
export { analyzeTriangleMeshQuality, } from "./mesh/mesh-quality.js";
|
|
25
28
|
export { computeClosedParallelTransportFrames, computeParallelTransportFrames, } from "./paths/frames.js";
|
|
26
29
|
export { sampleHelix } from "./paths/helix.js";
|
|
27
30
|
export { cumulativePathLengths, pathLength } from "./paths/path.js";
|
|
28
31
|
export { distributeAlongPath, roundClosedPolylinePath, } from "./paths/planar.js";
|
|
29
|
-
export {
|
|
30
|
-
export { sampleSideProfile, } from "./profiles/side-profile.js";
|
|
32
|
+
export { circleContour, rectangleContour, regularPolygonContour, starContour, } from "./profiles/profiles.js";
|
|
33
|
+
export { closeToAxis, sampleSideProfile, } from "./profiles/side-profile.js";
|
|
31
34
|
export { sampleContour, } from "./profiles/contour.js";
|
|
32
|
-
export {
|
|
35
|
+
export { ellipseContour } from "./profiles/shapes.js";
|
|
33
36
|
export { rectangleProfile, } from "./profiles/rectangle.js";
|
|
34
|
-
export {
|
|
37
|
+
export { contourContainsPoint, normalizeContour, normalizePolygon, normalizeRegion, regionArea, regionBounds, signedContourArea, } from "./regions.js";
|
|
35
38
|
export { resolveAlignedCircularSegments, resolveArcSegments, resolveCircularSegments, } from "./resolution.js";
|
|
36
39
|
export { revolveMesh } from "./revolve/revolve-mesh.js";
|
|
37
40
|
export { preflightSvgRegion, } from "./svg-import.js";
|
|
38
41
|
export { strokePathRegion, } from "./stroke-path.js";
|
|
39
42
|
export { sweepMesh } from "./sweeps/sweep-mesh.js";
|
|
40
43
|
export { DEFAULT_GEOMETRY_TOLERANCE, resolveGeometryTolerance, } from "./tolerance.js";
|
|
41
|
-
export {
|
|
44
|
+
export { transformContour, transformPath2, transformPath3, transformRegion, } from "./transform-geometry.js";
|
|
42
45
|
export { IDENTITY_TRANSFORM3, applyTransformDirection3, applyTransformPoint3, composeTransform3, eulerTransform3, frameTransform3, inverseTransform3, rotationTransform3, scaleTransform3, transformDeterminant3, translationTransform3, validateTransform3, } from "./transform3.js";
|
|
43
46
|
export { sampleTextContours } from "./text-contours.js";
|
|
44
47
|
export { sampleCurve2, sampleCurve3 } from "./curves/sampling.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import { assertMeshAllocationWithinLimits } from "
|
|
3
|
-
import { assertSamplingCount } from "
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { assertMeshAllocationWithinLimits } from "../model-limits.js";
|
|
3
|
+
import { assertSamplingCount } from "../sampling-limits.js";
|
|
4
4
|
const maximumComparisons = 8_000_000;
|
|
5
5
|
const fail = (message) => {
|
|
6
6
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "loft" });
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { normalizeContour, normalizeRegion, signedContourArea } from "../regions.js";
|
|
3
|
+
import { resolveGeometryResolution } from "../resolution.js";
|
|
4
|
+
import { assertSamplingCount } from "../sampling-limits.js";
|
|
5
|
+
import { frameTransform3 } from "../transform3.js";
|
|
2
6
|
import { alignLoftRows, assertLoftGrid, loftSubdivisions, sliceLoftRows, subdivideLoftRow, } from "./loft-correspondence.js";
|
|
3
7
|
import { loftFrame, resolveLoftControls } from "./loft-options.js";
|
|
4
|
-
import { normalizeLoop2, normalizeRegion2, signedAreaLoop2 } from "./regions.js";
|
|
5
|
-
import { resolveGeometryResolution } from "./resolution.js";
|
|
6
|
-
import { assertSamplingCount } from "./sampling-limits.js";
|
|
7
|
-
import { frameTransform3 } from "./transform3.js";
|
|
8
8
|
const fail = (message) => {
|
|
9
9
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "loft" });
|
|
10
10
|
};
|
|
@@ -55,8 +55,8 @@ function checkedLoop(points, outer, authoritative, limits) {
|
|
|
55
55
|
if (!Array.isArray(points))
|
|
56
56
|
fail("Loft contours must be ordered point arrays.");
|
|
57
57
|
assertSamplingCount(points.length, "loft", limits.maxProfilePoints);
|
|
58
|
-
|
|
59
|
-
const sameWinding =
|
|
58
|
+
normalizeContour(points, outer);
|
|
59
|
+
const sameWinding = signedContourArea(points) > 0 === outer;
|
|
60
60
|
if (!sameWinding && authoritative)
|
|
61
61
|
fail("Identified loft contours must retain outer CCW and hole CW winding.");
|
|
62
62
|
const copied = points.map((point) => [point[0], point[1]]);
|
|
@@ -106,7 +106,7 @@ export function prepareLoftGeometry(input, options, limits, authoritative, recip
|
|
|
106
106
|
const maxLengths = input.map((_, index) => recipeSampled?.[index] === true ? undefined : resolution.maxSegmentLength);
|
|
107
107
|
// Validate every original station's filled topology, including middle stations.
|
|
108
108
|
// Inserted world grids may have no useful local plane and are checked by mesh topology.
|
|
109
|
-
input.forEach((station) =>
|
|
109
|
+
input.forEach((station) => normalizeRegion(station.profile.components.map((component) => ({
|
|
110
110
|
outer: component.outer.points,
|
|
111
111
|
holes: component.holes.map((hole) => hole.points),
|
|
112
112
|
}))));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import { frameTransform3 } from "
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { frameTransform3 } from "../transform3.js";
|
|
3
3
|
/** @internal Resolves placement without sorting stations or interpolating their axes. */
|
|
4
4
|
export function loftFrame(placement, operation = "loft") {
|
|
5
5
|
if (typeof placement !== "object" ||
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { measureTriangleMesh, validateTriangleMesh } from "../mesh/mesh.js";
|
|
3
|
+
import { assertMeshAllocationWithinLimits } from "../model-limits.js";
|
|
4
|
+
import { writeMeshVertex } from "../numeric.js";
|
|
5
|
+
import { triangulateContour } from "./loft-triangulation.js";
|
|
6
6
|
/** @internal Pure closed simple-contour strips, retaining repeated correspondence slots as shared physical vertices. */
|
|
7
7
|
export function simpleLoftMesh(geometry, limits) {
|
|
8
8
|
const count = geometry.world[0][0].length, rowCount = geometry.world.length;
|
|
@@ -68,7 +68,7 @@ export function simpleLoftMesh(geometry, limits) {
|
|
|
68
68
|
triangle(a.slots[index], b.slots[next], b.slots[index]);
|
|
69
69
|
}
|
|
70
70
|
const cap = (row, top) => {
|
|
71
|
-
const contour = rows[row], triangles =
|
|
71
|
+
const contour = rows[row], triangles = triangulateContour(contour.points);
|
|
72
72
|
for (let index = 0; index < triangles.length; index += 3)
|
|
73
73
|
triangle(contour.vertices[triangles[index]], contour.vertices[triangles[index + (top ? 1 : 2)]], contour.vertices[triangles[index + (top ? 2 : 1)]]);
|
|
74
74
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import {
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { normalizeContour } from "../regions.js";
|
|
3
3
|
const maximumComparisons = 8_000_000;
|
|
4
4
|
const cross = (a, b, c) => (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
|
|
5
5
|
const pointInTriangle = (point, a, b, c, epsilon) => {
|
|
@@ -9,12 +9,12 @@ const pointInTriangle = (point, a, b, c, epsilon) => {
|
|
|
9
9
|
return ab >= -epsilon && bc >= -epsilon && ca >= -epsilon;
|
|
10
10
|
};
|
|
11
11
|
/** Ear-clips one normalized simple CCW loop into stable local vertex indices. */
|
|
12
|
-
export function
|
|
13
|
-
const normalized =
|
|
12
|
+
export function triangulateContour(loop) {
|
|
13
|
+
const normalized = normalizeContour(loop, true);
|
|
14
14
|
const assertComparisonLimit = (requiredCount) => {
|
|
15
15
|
if (requiredCount > maximumComparisons)
|
|
16
16
|
throw new GeometryError("COMPLEXITY_LIMIT", "Profile cap triangulation exceeds its eight-million-comparison work limit.", {
|
|
17
|
-
operation: "
|
|
17
|
+
operation: "triangulateContour",
|
|
18
18
|
details: { requiredCount, allowedCount: maximumComparisons },
|
|
19
19
|
});
|
|
20
20
|
};
|
|
@@ -59,7 +59,7 @@ export function triangulateLoop2(loop) {
|
|
|
59
59
|
break;
|
|
60
60
|
}
|
|
61
61
|
if (!clipped) {
|
|
62
|
-
throw new GeometryError("INVALID_TOPOLOGY", "Profile cap triangulation could not find a valid ear.", { operation: "
|
|
62
|
+
throw new GeometryError("INVALID_TOPOLOGY", "Profile cap triangulation could not find a valid ear.", { operation: "triangulateContour" });
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
triangles.push(remaining[0], remaining[1], remaining[2]);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import { resolveExtrusionControls, resolveExtrusionDivisions, } from "
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { resolveExtrusionControls, resolveExtrusionDivisions, } from "../extrusion.js";
|
|
3
|
+
import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "../model-limits.js";
|
|
4
|
+
import { assertSamplingCount } from "../sampling-limits.js";
|
|
3
5
|
import { pointLoftProfile, prepareLoftGeometry } from "./loft-geometry.js";
|
|
4
6
|
import {} from "./loft-options.js";
|
|
5
7
|
import { simpleLoftMesh } from "./loft-simple-mesh.js";
|
|
6
|
-
|
|
7
|
-
import { assertSamplingCount } from "./sampling-limits.js";
|
|
8
|
-
export { triangulateLoop2 } from "./loft-triangulation.js";
|
|
8
|
+
export { triangulateContour } from "./loft-triangulation.js";
|
|
9
9
|
/**
|
|
10
10
|
* Lofts simple point loops at z heights or explicit right-handed frames, in input order.
|
|
11
11
|
*
|
|
@@ -17,8 +17,8 @@ export { triangulateLoop2 } from "./loft-triangulation.js";
|
|
|
17
17
|
*
|
|
18
18
|
* @example Loft with explicit point correspondence
|
|
19
19
|
* ```ts
|
|
20
|
-
* const bottom =
|
|
21
|
-
* const top =
|
|
20
|
+
* const bottom = rectangleContour({ size: [20, 12] });
|
|
21
|
+
* const top = rectangleContour({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
|
|
22
22
|
* loftMesh([{ profile: bottom, z: 0 }, { profile: top, z: 30 }], { correspondence: "reindex" });
|
|
23
23
|
* ```
|
|
24
24
|
*/
|
|
@@ -48,7 +48,7 @@ export function loftMesh(stations, options) {
|
|
|
48
48
|
*
|
|
49
49
|
* @example Extrude point data without an engine
|
|
50
50
|
* ```ts
|
|
51
|
-
* const outline =
|
|
51
|
+
* const outline = rectangleContour({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
|
|
52
52
|
* extrudeMesh(outline, { height: 8 });
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
@@ -13,7 +13,11 @@ export const add3 = (a, b) => [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
|
|
|
13
13
|
* subtract3([4, 5, 6], [1, 2, 3]); // [3, 3, 3]
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
|
-
export const subtract3 = (a, b) => [
|
|
16
|
+
export const subtract3 = (a, b) => [
|
|
17
|
+
a[0] - b[0],
|
|
18
|
+
a[1] - b[1],
|
|
19
|
+
a[2] - b[2],
|
|
20
|
+
];
|
|
17
21
|
/**
|
|
18
22
|
* Multiplies a vector by a dimensionless scalar.
|
|
19
23
|
* @example
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
import {
|
|
2
|
+
import { signedContourArea } from "../regions.js";
|
|
3
3
|
import { resolveCircularSegments, resolveGeometryResolution, } from "../resolution.js";
|
|
4
4
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
|
|
5
5
|
const DEFAULT_PRESSURE_ANGLE_DEGREES = 20;
|
|
@@ -398,7 +398,7 @@ const sampleResolvedCylindricalGearOutline = (dimensions, options, operation) =>
|
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
400
|
points.pop();
|
|
401
|
-
if (!(
|
|
401
|
+
if (!(signedContourArea(points) > 0)) {
|
|
402
402
|
throw new GeometryError("INVALID_TOPOLOGY", "The sampled gear outline must be counter-clockwise.", {
|
|
403
403
|
operation,
|
|
404
404
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Closed ridge and complete-solid mesh construction from resolved thread plans. */
|
|
2
|
-
import {
|
|
3
|
-
import { joinTriangleMeshes, measureTriangleMesh, reverseTriangleMesh, validateTriangleMesh, } from "../mesh.js";
|
|
2
|
+
import { triangulateContour } from "../loft/loft.js";
|
|
3
|
+
import { joinTriangleMeshes, measureTriangleMesh, reverseTriangleMesh, validateTriangleMesh, } from "../mesh/mesh.js";
|
|
4
4
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "../model-limits.js";
|
|
5
5
|
import { resolveHelicalThreadMeshOptions, resolveHelicalThreadSolidMeshPreflight, } from "./thread-mesh-plan.js";
|
|
6
6
|
import { buildThreadSurfaceColumn, stitchThreadSurfaceColumns } from "./thread-surface.js";
|
|
@@ -45,7 +45,7 @@ const buildThreadRidgeComponent = (options) => {
|
|
|
45
45
|
const c = (column + 1) * size + next, d = (column + 1) * size + point;
|
|
46
46
|
indices.push(a, b, c, a, c, d);
|
|
47
47
|
}
|
|
48
|
-
const capTriangles =
|
|
48
|
+
const capTriangles = triangulateContour([...section].reverse());
|
|
49
49
|
const cap = (column, top) => {
|
|
50
50
|
for (let offset = 0; offset < capTriangles.length; offset += 3) {
|
|
51
51
|
const a = column * size + (size - 1 - capTriangles[offset]);
|