@metamesh/modeling 0.19.0 → 0.20.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 +49 -0
- package/README.md +34 -18
- package/dist/api/engine.d.ts +217 -121
- package/dist/api/export.d.ts +123 -79
- package/dist/api/geometry.d.ts +406 -2102
- package/dist/api/index.d.ts +472 -1798
- package/dist/api/math.d.ts +315 -0
- package/dist/api/mechanical.d.ts +1041 -0
- package/dist/api/mesh.d.ts +360 -88
- package/dist/api/text.d.ts +24 -44
- package/dist/docs/guides/concepts.md +67 -33
- package/dist/docs/guides/exporting.md +88 -0
- package/dist/docs/guides/fonts.md +5 -3
- package/dist/docs/guides/fundamentals.md +12 -24
- package/dist/docs/guides/generation.md +24 -16
- package/dist/docs/guides/geometry-values.md +192 -134
- package/dist/docs/guides/hosting.md +51 -96
- package/dist/docs/guides/profiles-and-extrusion.md +159 -11
- package/dist/docs/guides/recipes.md +121 -28
- package/dist/docs/guides/resolution-and-inspection.md +43 -23
- package/dist/docs/guides/solid-joins.md +12 -2
- package/dist/docs/guides/standalone-model.md +4 -2
- package/dist/docs/guides/svg-and-text.md +76 -39
- package/dist/docs/guides/sweeps-and-lofts.md +88 -44
- package/dist/docs/guides/transforms-and-placement.md +113 -103
- package/dist/docs/guides/workers.md +166 -0
- package/dist/docs/manifest.json +4133 -4153
- package/dist/docs/reference/engine/GenerationOptions.md +2 -3
- package/dist/docs/reference/engine/GeometryResource.md +6 -6
- package/dist/docs/reference/engine/ModelDependencies.md +2 -2
- package/dist/docs/reference/engine/ModelEngine.md +2 -3
- package/dist/docs/reference/engine/ModelEngineOptions.md +2 -7
- package/dist/docs/reference/engine/ModelPart.md +6 -6
- package/dist/docs/reference/engine/ModelResult.md +2 -2
- package/dist/docs/reference/engine/ModelRunArguments.md +2 -2
- package/dist/docs/reference/engine/ModelRunOptions.md +2 -3
- package/dist/docs/reference/engine/ModelSession.md +2 -2
- package/dist/docs/reference/engine/SessionOptions.md +2 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +9 -3
- package/dist/docs/reference/engine/checkModel.md +6 -2
- package/dist/docs/reference/engine/createModelEngine.md +5 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +4 -11
- package/dist/docs/reference/engine/modelingWasmUrl.md +2 -2
- package/dist/docs/reference/engine.md +7 -1
- package/dist/docs/reference/export/Export3mfOptions.md +2 -6
- package/dist/docs/reference/export/ExportDiagnostic.md +2 -14
- package/dist/docs/reference/export/ExportFormat.md +2 -14
- package/dist/docs/reference/export/ExportGeometry.md +3 -15
- package/dist/docs/reference/export/ExportGlbOptions.md +14 -18
- package/dist/docs/reference/export/ExportLimits.md +2 -14
- package/dist/docs/reference/export/ExportMaterial.md +2 -14
- package/dist/docs/reference/export/ExportOptions.md +2 -14
- package/dist/docs/reference/export/ExportPart.md +2 -14
- package/dist/docs/reference/export/ExportReport.md +2 -14
- package/dist/docs/reference/export/ExportSink.md +5 -15
- package/dist/docs/reference/export/ExportStlOptions.md +2 -6
- package/dist/docs/reference/export/ExportedFile.md +14 -26
- package/dist/docs/reference/export/categories/mesh-serialization.md +9 -3
- package/dist/docs/reference/export/defaultExportLimits.md +2 -2
- package/dist/docs/reference/export/export3mf.md +4 -6
- package/dist/docs/reference/export/exportGlb.md +8 -10
- package/dist/docs/reference/export/exportStl.md +4 -6
- package/dist/docs/reference/export/write3mf.md +6 -6
- package/dist/docs/reference/export/writeGlb.md +10 -10
- package/dist/docs/reference/export/writeStl.md +6 -6
- package/dist/docs/reference/export.md +9 -3
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/Anchor3-type.md +3 -7
- package/dist/docs/reference/geometry/Anchor3Options.md +70 -0
- package/dist/docs/reference/geometry/ArcCurve2.md +3 -3
- package/dist/docs/reference/geometry/ArcCurve3.md +3 -3
- package/dist/docs/reference/geometry/AttachOptions.md +4 -9
- package/dist/docs/reference/geometry/Bounds2-type.md +9 -30
- package/dist/docs/reference/geometry/Bounds2Data.md +2 -19
- package/dist/docs/reference/geometry/Bounds2Input.md +2 -10
- package/dist/docs/reference/geometry/Bounds2Options.md +2 -6
- package/dist/docs/reference/geometry/Bounds3-type.md +9 -30
- package/dist/docs/reference/geometry/Bounds3Data.md +2 -15
- package/dist/docs/reference/geometry/Bounds3Input.md +2 -10
- package/dist/docs/reference/geometry/Bounds3Options.md +2 -6
- package/dist/docs/reference/geometry/BoundsFit2.md +2 -2
- package/dist/docs/reference/geometry/BoundsFit3.md +2 -2
- package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -2
- package/dist/docs/reference/geometry/BoxAnchorFace.md +3 -3
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +3 -3
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +3 -7
- package/dist/docs/reference/geometry/CircleContourOptions.md +3 -7
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +3 -12
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +2 -2
- package/dist/docs/reference/geometry/CircularSampling.md +2 -2
- package/dist/docs/reference/geometry/CircularSamplingOptions.md +2 -2
- package/dist/docs/reference/geometry/Contour.md +4 -9
- package/dist/docs/reference/geometry/ContourCurve.md +3 -3
- package/dist/docs/reference/geometry/ContourPoint.md +3 -3
- package/dist/docs/reference/geometry/ContourSegment.md +3 -3
- package/dist/docs/reference/geometry/CorrespondingComponent.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingContour.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingProfile.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +4 -8
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +3 -3
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +3 -3
- package/dist/docs/reference/geometry/Curve2.md +3 -3
- package/dist/docs/reference/geometry/Curve3.md +3 -3
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +3 -11
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +4 -4
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +2 -2
- package/dist/docs/reference/geometry/EdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -7
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -18
- package/dist/docs/reference/geometry/FittedTextLayout.md +2 -2
- package/dist/docs/reference/geometry/{Frame3.md → Frame3-type.md} +4 -11
- package/dist/docs/reference/geometry/Frame3Options.md +69 -0
- package/dist/docs/reference/geometry/GeometryError.md +2 -6
- package/dist/docs/reference/geometry/GeometryErrorCode.md +2 -6
- package/dist/docs/reference/geometry/GeometryErrorContext.md +2 -6
- package/dist/docs/reference/geometry/GeometryResolution.md +2 -10
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +3 -11
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +3 -11
- package/dist/docs/reference/geometry/GridPatternOptions.md +7 -9
- package/dist/docs/reference/geometry/ImmutableBuffer-type.md +2 -10
- package/dist/docs/reference/geometry/LineCurve2.md +3 -3
- package/dist/docs/reference/geometry/LineCurve3.md +3 -3
- package/dist/docs/reference/geometry/LinearPatternOptions.md +2 -6
- package/dist/docs/reference/geometry/LoftPlacement.md +13 -21
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +3 -7
- package/dist/docs/reference/geometry/ModelingLimits.md +2 -14
- package/dist/docs/reference/geometry/NumericArray.md +2 -10
- package/dist/docs/reference/geometry/Path2-type.md +153 -12
- package/dist/docs/reference/geometry/Path2Data.md +3 -11
- package/dist/docs/reference/geometry/Path2Input.md +3 -11
- package/dist/docs/reference/geometry/Path3-type.md +153 -12
- package/dist/docs/reference/geometry/Path3Data.md +3 -11
- package/dist/docs/reference/geometry/Path3Input.md +3 -11
- package/dist/docs/reference/geometry/PathFrame.md +3 -3
- package/dist/docs/reference/geometry/PathLocation.md +3 -11
- package/dist/docs/reference/geometry/PathNormalGuide.md +4 -12
- package/dist/docs/reference/geometry/PathOptions.md +3 -7
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -7
- package/dist/docs/reference/geometry/PathPlacement.md +5 -5
- package/dist/docs/reference/geometry/PathResamplingOptions.md +3 -11
- package/dist/docs/reference/geometry/PathStation.md +87 -0
- package/dist/docs/reference/geometry/PathSubdivisionOptions.md +44 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +3 -11
- package/dist/docs/reference/geometry/Pivot3Options.md +3 -11
- package/dist/docs/reference/geometry/PolygonData.md +4 -8
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +3 -3
- package/dist/docs/reference/geometry/Profile.md +3 -4
- package/dist/docs/reference/geometry/ProfileComponent2.md +3 -7
- package/dist/docs/reference/geometry/ProfileContour2.md +3 -7
- package/dist/docs/reference/geometry/ProfileSpan2.md +3 -7
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +5 -8
- package/dist/docs/reference/geometry/RadialPatternOptions.md +2 -6
- package/dist/docs/reference/geometry/RadialSizing.md +2 -6
- package/dist/docs/reference/geometry/RadialSizingOptions.md +2 -6
- package/dist/docs/reference/geometry/RectangleContourOptions.md +4 -7
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +3 -7
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +3 -7
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +3 -7
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryResolution.md +71 -0
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +2 -2
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -2
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve3.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +3 -3
- package/dist/docs/reference/geometry/SideProfilePoint.md +3 -3
- package/dist/docs/reference/geometry/SideProfileSegment.md +3 -3
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/SplineOptions.md +69 -0
- package/dist/docs/reference/geometry/StarContourOptions.md +7 -7
- package/dist/docs/reference/geometry/StrokeCap.md +2 -6
- package/dist/docs/reference/geometry/StrokeJoin.md +2 -6
- package/dist/docs/reference/geometry/StrokeOptions.md +3 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +4 -4
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +2 -2
- package/dist/docs/reference/geometry/Transform2-type.md +3 -11
- package/dist/docs/reference/geometry/Transform2Data.md +3 -11
- package/dist/docs/reference/geometry/Transform2Input.md +3 -11
- package/dist/docs/reference/geometry/Transform3-type.md +4 -12
- package/dist/docs/reference/geometry/Transform3Data.md +3 -11
- package/dist/docs/reference/geometry/Transform3Input.md +6 -13
- package/dist/docs/reference/geometry/Vector2-type.md +3 -11
- package/dist/docs/reference/geometry/Vector2Data.md +3 -15
- package/dist/docs/reference/geometry/Vector2Input.md +3 -11
- package/dist/docs/reference/geometry/Vector3-type.md +27 -11
- package/dist/docs/reference/geometry/Vector3Data.md +3 -11
- package/dist/docs/reference/geometry/Vector3Input.md +3 -11
- package/dist/docs/reference/geometry/VectorTextLayout.md +2 -10
- package/dist/docs/reference/geometry/VectorTextMetrics.md +3 -11
- package/dist/docs/reference/geometry/anchor3.md +17 -26
- package/dist/docs/reference/geometry/anchorFrame3.md +6 -6
- package/dist/docs/reference/geometry/attachmentTransform3.md +8 -8
- package/dist/docs/reference/geometry/bounds2.md +6 -8
- package/dist/docs/reference/geometry/bounds3.md +4 -6
- package/dist/docs/reference/geometry/boundsCenter.md +2 -2
- package/dist/docs/reference/geometry/boundsSize.md +2 -2
- package/dist/docs/reference/geometry/boxAnchor3.md +3 -3
- package/dist/docs/reference/geometry/categories/bounds-layout.md +9 -3
- package/dist/docs/reference/geometry/categories/curves-paths.md +24 -13
- package/dist/docs/reference/geometry/categories/immutable-data.md +40 -0
- package/dist/docs/reference/geometry/categories/pattern-placement.md +10 -4
- package/dist/docs/reference/geometry/categories/primitive-options.md +8 -13
- package/dist/docs/reference/geometry/categories/profiles-regions.md +11 -5
- package/dist/docs/reference/geometry/categories/resolution-errors.md +8 -1
- package/dist/docs/reference/geometry/categories/transforms-math.md +20 -51
- package/dist/docs/reference/geometry/categories/vector-import.md +7 -4
- package/dist/docs/reference/geometry/circleContour.md +3 -3
- package/dist/docs/reference/geometry/closeToAxis.md +7 -3
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +9 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +13 -6
- package/dist/docs/reference/geometry/contourContainsPoint.md +7 -3
- package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +3 -3
- package/dist/docs/reference/geometry/distributeAlongPath.md +16 -11
- package/dist/docs/reference/geometry/ellipseContour.md +3 -3
- package/dist/docs/reference/geometry/fitBounds.md +10 -2
- package/dist/docs/reference/geometry/fitTextLayout.md +5 -5
- package/dist/docs/reference/geometry/frame3.md +66 -0
- package/dist/docs/reference/geometry/gridPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/immutableBuffer.md +5 -7
- package/dist/docs/reference/geometry/isGeometryError.md +2 -6
- package/dist/docs/reference/geometry/layoutRow.md +4 -2
- package/dist/docs/reference/geometry/linearPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/matchProfiles.md +5 -3
- package/dist/docs/reference/geometry/normalizeContour.md +8 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -3
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -3
- package/dist/docs/reference/geometry/path2.md +7 -7
- package/dist/docs/reference/geometry/path3.md +7 -7
- package/dist/docs/reference/geometry/pathPatternTransforms.md +12 -8
- package/dist/docs/reference/geometry/preflightSvgRegion.md +5 -5
- package/dist/docs/reference/geometry/radialPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/rectangleContour.md +3 -3
- package/dist/docs/reference/geometry/rectangleProfile.md +3 -4
- package/dist/docs/reference/geometry/regionArea.md +3 -3
- package/dist/docs/reference/geometry/regionBounds.md +6 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +3 -3
- package/dist/docs/reference/geometry/resamplePolyline2.md +7 -3
- package/dist/docs/reference/geometry/resamplePolyline3.md +7 -3
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +5 -5
- package/dist/docs/reference/geometry/resolveArcSegments.md +8 -6
- package/dist/docs/reference/geometry/resolveCircularSampling.md +2 -2
- package/dist/docs/reference/geometry/resolveCircularSegments.md +5 -3
- package/dist/docs/reference/geometry/{resolveExtrusionDivisions.md → resolveExtrusionSlices.md} +16 -15
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -3
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +3 -3
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -5
- package/dist/docs/reference/geometry/sampleContour.md +5 -5
- package/dist/docs/reference/geometry/sampleCurve2.md +7 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +7 -3
- package/dist/docs/reference/geometry/sampleHelix.md +3 -3
- package/dist/docs/reference/geometry/sampleSideProfile.md +5 -5
- package/dist/docs/reference/geometry/sampleTextContours.md +3 -3
- package/dist/docs/reference/geometry/signedContourArea.md +5 -3
- package/dist/docs/reference/geometry/spline2.md +68 -0
- package/dist/docs/reference/geometry/spline3.md +62 -0
- package/dist/docs/reference/geometry/starContour.md +3 -3
- package/dist/docs/reference/geometry/strokeRegionData.md +8 -5
- package/dist/docs/reference/geometry/transform2.md +5 -7
- package/dist/docs/reference/geometry/transform3.md +23 -10
- package/dist/docs/reference/geometry/transformRegionData.md +7 -3
- package/dist/docs/reference/geometry/triangulateContour.md +6 -4
- package/dist/docs/reference/geometry/vector2.md +6 -8
- package/dist/docs/reference/geometry/vector3.md +8 -8
- package/dist/docs/reference/geometry.md +13 -18
- package/dist/docs/reference/{geometry → math}/AxisAngleRotation3.md +4 -5
- package/dist/docs/reference/math/IDENTITY_TRANSFORM3.md +20 -0
- package/dist/docs/reference/math/add2.md +38 -0
- package/dist/docs/reference/math/add3.md +46 -0
- package/dist/docs/reference/math/applyTransformDirection3.md +46 -0
- package/dist/docs/reference/math/applyTransformPoint3.md +44 -0
- package/dist/docs/reference/math/categories/tuple-matrix.md +67 -0
- package/dist/docs/reference/math/cross2.md +38 -0
- package/dist/docs/reference/math/cross3.md +44 -0
- package/dist/docs/reference/math/distance2.md +38 -0
- package/dist/docs/reference/math/distance3.md +38 -0
- package/dist/docs/reference/math/dot2.md +38 -0
- package/dist/docs/reference/math/dot3.md +44 -0
- package/dist/docs/reference/math/eulerTransform3.md +43 -0
- package/dist/docs/reference/math/inverseTransform3.md +36 -0
- package/dist/docs/reference/math/length2.md +32 -0
- package/dist/docs/reference/math/length3.md +32 -0
- package/dist/docs/reference/math/lerp2.md +46 -0
- package/dist/docs/reference/math/lerp3.md +46 -0
- package/dist/docs/reference/math/multiplyTransform3.md +46 -0
- package/dist/docs/reference/math/normalize2.md +45 -0
- package/dist/docs/reference/math/normalize3.md +45 -0
- package/dist/docs/reference/math/projectOntoPlane3.md +40 -0
- package/dist/docs/reference/math/rotate2.md +40 -0
- package/dist/docs/reference/math/rotationTransform3.md +56 -0
- package/dist/docs/reference/math/scale2.md +38 -0
- package/dist/docs/reference/math/scale3.md +44 -0
- package/dist/docs/reference/math/scaleTransform3.md +39 -0
- package/dist/docs/reference/math/subtract2.md +38 -0
- package/dist/docs/reference/math/subtract3.md +44 -0
- package/dist/docs/reference/math/transformDeterminant3.md +38 -0
- package/dist/docs/reference/math/translationTransform3.md +36 -0
- package/dist/docs/reference/math/validateRigidTransform3.md +38 -0
- package/dist/docs/reference/math/validateTransform3.md +48 -0
- package/dist/docs/reference/math.md +22 -0
- package/dist/docs/reference/{geometry → mechanical}/AcmeThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/Bevel.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/BevelSize.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ButtressPressureFlankSide.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ButtressThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleFit.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CompensatedThreadDiameters.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CustomThreadProfileSpec.md +5 -15
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearMeshKind.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearOutlineOptions.md +5 -10
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionOptions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionReport.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/InternalThreadCutterOptions.md +6 -13
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeBaseSpec.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeDimensions.md +4 -5
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeInterval.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSamplingOptions.md +5 -14
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSpec.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/METRIC_FASTENER_STANDARDS.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricFastenerSize.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricFastenerStandard.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricHexNutDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricSocketCapHeadDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/PRINTABLE_THREAD_FIT_POLICIES.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFit.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFitPolicy.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/RackPitchDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/RackPitchSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/SampledThreadHelices.md +4 -8
- package/dist/docs/reference/{geometry → mechanical}/SquareThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ThreadBevelOptions.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadCircularSegmentsOptions.md +5 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadCompensationOptions.md +4 -5
- package/dist/docs/reference/{geometry → mechanical}/ThreadEndStyle.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadEndTreatmentOptions.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadHandedness.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadHelixOptions.md +5 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInEnvelope.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInShape.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfile-type.md +5 -17
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfileBaseSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfileSpec.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadRidgeOptions.md +7 -18
- package/dist/docs/reference/{geometry → mechanical}/ThreadRole.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/ThreadSolidOptions.md +8 -15
- package/dist/docs/reference/{geometry → mechanical}/ThreadSolidPreflight.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutOptions.md +7 -14
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutPreflight.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutShape.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadedRodOptions.md +6 -13
- package/dist/docs/reference/{geometry → mechanical}/TrapezoidalThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/TriangularThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/categories/mechanical.md +8 -2
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadDiameters.md +4 -4
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileAxially.md +12 -6
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileForFaceting.md +13 -3
- package/dist/docs/reference/{geometry → mechanical}/getMetricClearanceHoleDiameter.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/getMetricFastenerStandard.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/measureInternalCylindricalGearPairMotion.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/minimumCylindricalGearToothCountWithoutUndercut.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/preflightInternalThreadCutter.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/preflightThreadedNut.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/preflightThreadedRod.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGear.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGearPair.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveKnuckleHinge.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/resolvePrintableThreadFitPolicy.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveRackPitch.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveThreadCircularSegments.md +7 -5
- package/dist/docs/reference/{geometry → mechanical}/sampleCylindricalGearOutline.md +9 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleInternalCylindricalGearSpaceOutline.md +9 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleRackToothPath.md +10 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleThreadHelices.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/threadProfile.md +7 -3
- package/dist/docs/reference/mechanical.md +19 -0
- package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +128 -0
- package/dist/docs/reference/{geometry → mesh}/HeightfieldMeshLimits.md +5 -13
- package/dist/docs/reference/{geometry → mesh}/HeightfieldPreflight.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/ImmutableTriangleMesh.md +5 -17
- package/dist/docs/reference/mesh/LoftMeshStation.md +32 -0
- package/dist/docs/reference/mesh/MeshRenderOptions.md +3 -3
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationFallbackReason.md +4 -8
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationResult.md +4 -8
- package/dist/docs/reference/{geometry → mesh}/PlanarPatchQuality.md +4 -12
- package/dist/docs/reference/mesh/RenderMesh.md +19 -19
- package/dist/docs/reference/{geometry → mesh}/SolidMeshValidationOptions.md +4 -12
- package/dist/docs/reference/{geometry → mesh}/TriangleMesh.md +8 -12
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysis.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysisOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshInput.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshMeasurements.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityReport.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignature.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureOptions.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureTolerances.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshTopologyAnalysis.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshValidationOptions.md +4 -9
- package/dist/docs/reference/mesh/analyze.md +26 -18
- package/dist/docs/reference/mesh/analyzeQuality.md +12 -12
- package/dist/docs/reference/mesh/bounds.md +5 -6
- package/dist/docs/reference/mesh/categories/operations.md +37 -4
- package/dist/docs/reference/mesh/centroid.md +5 -6
- package/dist/docs/reference/mesh/extrude.md +21 -20
- package/dist/docs/reference/mesh/heightfield.md +8 -8
- package/dist/docs/reference/mesh/immutable.md +7 -5
- package/dist/docs/reference/mesh/join.md +7 -7
- package/dist/docs/reference/mesh/loft.md +19 -18
- package/dist/docs/reference/mesh/optimizePlanarPatches.md +21 -21
- package/dist/docs/reference/mesh/preflightHeightfield.md +8 -8
- package/dist/docs/reference/mesh/preflightThreadSolid.md +22 -25
- package/dist/docs/reference/mesh/render.md +7 -5
- package/dist/docs/reference/mesh/reverse.md +7 -7
- package/dist/docs/reference/mesh/revolve.md +12 -14
- package/dist/docs/reference/mesh/signature.md +12 -12
- package/dist/docs/reference/mesh/sweep.md +96 -25
- package/dist/docs/reference/mesh/threadRidge.md +19 -18
- package/dist/docs/reference/mesh/threadSolid.md +23 -22
- package/dist/docs/reference/mesh/transform.md +8 -9
- package/dist/docs/reference/mesh/validate.md +11 -11
- package/dist/docs/reference/mesh/validateSolid.md +10 -10
- package/dist/docs/reference/mesh.md +8 -2
- package/dist/docs/reference/model/BoxEdge.md +23 -0
- package/dist/docs/reference/model/BoxEdgeSelection.md +27 -0
- package/dist/docs/reference/model/BoxEdgeTreatments.md +27 -0
- package/dist/docs/reference/{geometry → model}/BoxOptions.md +12 -12
- package/dist/docs/reference/model/CircleOptions.md +4 -5
- package/dist/docs/reference/model/CornerCutterOptions.md +93 -0
- package/dist/docs/reference/model/CornerCutterTreatment.md +53 -0
- package/dist/docs/reference/model/{HoleCutterOverrun.md → CutterOverrun.md} +8 -7
- package/dist/docs/reference/model/CylinderOptions.md +64 -0
- package/dist/docs/reference/model/DiagnosticOptions.md +2 -2
- package/dist/docs/reference/model/EdgeCutterOptions.md +129 -0
- package/dist/docs/reference/model/EllipseOptions.md +4 -5
- package/dist/docs/reference/model/EndTreatments.md +43 -0
- package/dist/docs/reference/model/ExtrudeOptions.md +153 -0
- package/dist/docs/reference/model/GenerateCallback.md +2 -2
- package/dist/docs/reference/model/GenerateContext.md +27 -3
- package/dist/docs/reference/model/GenerationDiagnostic.md +2 -2
- package/dist/docs/reference/model/GenerationError.md +2 -2
- package/dist/docs/reference/{geometry → model}/HeightfieldOptions.md +5 -23
- package/dist/docs/reference/model/HoleCutterOpening.md +27 -0
- package/dist/docs/reference/model/HoleCutterOptions.md +9 -22
- package/dist/docs/reference/model/HoleCutterRecess.md +5 -4
- package/dist/docs/reference/model/HullOptions.md +2 -3
- package/dist/docs/reference/model/ImmutableValue.md +2 -2
- package/dist/docs/reference/model/ImplicitOptions.md +3 -9
- package/dist/docs/reference/model/JoinOptions.md +2 -5
- package/dist/docs/reference/model/JoinTransition.md +2 -2
- package/dist/docs/reference/model/KnuckleHinge-type.md +2 -3
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +2 -2
- package/dist/docs/reference/model/KnuckleHingeOptions.md +3 -5
- package/dist/docs/reference/model/KnuckleHingeWeb.md +2 -2
- package/dist/docs/reference/{geometry → model}/LoftCorrespondence.md +8 -11
- package/dist/docs/reference/{geometry → model}/LoftOptions.md +11 -16
- package/dist/docs/reference/model/LoftStation.md +4 -5
- package/dist/docs/reference/model/Memo.md +2 -2
- package/dist/docs/reference/model/ModelProgram.md +2 -2
- package/dist/docs/reference/model/PartDeclaration.md +4 -5
- package/dist/docs/reference/model/PartGeometry.md +3 -5
- package/dist/docs/reference/model/PartOptions.md +4 -5
- package/dist/docs/reference/model/PatternSource.md +4 -4
- package/dist/docs/reference/model/PlaneOptions.md +3 -7
- package/dist/docs/reference/model/PolygonOptions.md +2 -7
- package/dist/docs/reference/model/PrimitiveAttachment.md +50 -0
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +111 -0
- package/dist/docs/reference/model/RectangleOptions.md +21 -26
- package/dist/docs/reference/model/RegularPolygonOptions.md +4 -37
- package/dist/docs/reference/{geometry → model}/RevolveOptions.md +15 -24
- package/dist/docs/reference/model/Section.md +115 -53
- package/dist/docs/reference/model/SectionHullOptions.md +2 -3
- package/dist/docs/reference/model/SectionInspection.md +2 -6
- package/dist/docs/reference/model/SectionOffsetJoin.md +2 -2
- package/dist/docs/reference/model/SectionOffsetOptions.md +2 -3
- package/dist/docs/reference/model/Solid.md +24 -12
- package/dist/docs/reference/model/SolidInspection.md +2 -6
- package/dist/docs/reference/model/SolidSegmentHit.md +2 -6
- package/dist/docs/reference/model/SphereOptions.md +27 -0
- package/dist/docs/reference/model/StarOptions.md +21 -23
- package/dist/docs/reference/model/SvgOrigin.md +2 -2
- package/dist/docs/reference/model/SvgPathSectionOptions.md +3 -5
- package/dist/docs/reference/model/SvgSectionOptions.md +3 -6
- package/dist/docs/reference/model/SweepOptions.md +109 -0
- package/dist/docs/reference/model/SweepOrientation.md +119 -0
- package/dist/docs/reference/model/SweepTransformOptions.md +105 -0
- package/dist/docs/reference/model/TextSectionOptions.md +2 -7
- package/dist/docs/reference/{geometry → model}/TorusOptions.md +11 -10
- package/dist/docs/reference/model/TubeOptions.md +84 -0
- package/dist/docs/reference/model/box.md +11 -10
- package/dist/docs/reference/model/categories/boolean-operations.md +9 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +13 -1
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +26 -7
- package/dist/docs/reference/model/categories/generation.md +11 -3
- package/dist/docs/reference/model/categories/hinges.md +7 -1
- package/dist/docs/reference/model/categories/mesh-inspection.md +7 -1
- package/dist/docs/reference/model/categories/primitives.md +34 -6
- package/dist/docs/reference/model/categories/sections.md +8 -2
- package/dist/docs/reference/model/categories/threads.md +8 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +15 -10
- package/dist/docs/reference/model/circle.md +7 -3
- package/dist/docs/reference/model/cornerCutter.md +88 -0
- package/dist/docs/reference/model/cylinder.md +6 -5
- package/dist/docs/reference/model/edgeCutter.md +91 -0
- package/dist/docs/reference/model/ellipse.md +7 -3
- package/dist/docs/reference/model/extrude.md +29 -23
- package/dist/docs/reference/model/generate.md +4 -2
- package/dist/docs/reference/model/gridPattern.md +11 -4
- package/dist/docs/reference/model/heightfield.md +5 -5
- package/dist/docs/reference/model/holeCutter.md +26 -12
- package/dist/docs/reference/model/hull.md +2 -2
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/internalThreadCutter.md +32 -21
- package/dist/docs/reference/model/intersect.md +7 -3
- package/dist/docs/reference/model/join.md +6 -2
- package/dist/docs/reference/model/knuckleHinge.md +2 -3
- package/dist/docs/reference/model/linearPattern.md +11 -4
- package/dist/docs/reference/model/loft.md +28 -24
- package/dist/docs/reference/model/minkowskiSum.md +3 -3
- package/dist/docs/reference/model/pathPattern.md +17 -8
- package/dist/docs/reference/model/polygon.md +8 -3
- package/dist/docs/reference/model/radialPattern.md +11 -4
- package/dist/docs/reference/model/rectangle.md +11 -7
- package/dist/docs/reference/model/regularPolygon.md +7 -3
- package/dist/docs/reference/model/revolve.md +18 -12
- package/dist/docs/reference/model/solidFromMesh.md +10 -6
- package/dist/docs/reference/model/sphere.md +7 -6
- package/dist/docs/reference/model/star.md +11 -7
- package/dist/docs/reference/model/stroke.md +12 -8
- package/dist/docs/reference/model/svgPathSection.md +10 -4
- package/dist/docs/reference/model/svgSection.md +10 -4
- package/dist/docs/reference/model/sweep.md +102 -25
- package/dist/docs/reference/model/textSection.md +7 -3
- package/dist/docs/reference/model/threadRidge.md +16 -17
- package/dist/docs/reference/model/threadedNut.md +25 -22
- package/dist/docs/reference/model/threadedRod.md +21 -18
- package/dist/docs/reference/model/torus.md +13 -12
- package/dist/docs/reference/model/tube.md +6 -5
- package/dist/docs/reference/model/union.md +7 -3
- package/dist/docs/reference/model.md +10 -5
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +2 -2
- package/dist/docs/reference/text/VectorFont.md +38 -34
- package/dist/docs/reference/text/VectorFontOptions.md +2 -2
- package/dist/docs/reference/{geometry → text}/VectorTextArcBaseline.md +2 -11
- package/dist/docs/reference/{geometry → text}/VectorTextLayoutOptions.md +3 -11
- package/dist/docs/reference/{geometry → text}/VectorTextOptions.md +2 -10
- package/dist/docs/reference/text/categories/font-preparation.md +10 -1
- package/dist/docs/reference/text/prepareVectorFont.md +4 -2
- package/dist/docs/reference/text.md +7 -1
- package/dist/engine/execution.js +5 -3
- package/dist/engine/finalization.js +5 -5
- package/dist/engine/index.js +9 -4
- package/dist/engine/native/adapter.js +1 -1
- package/dist/engine/native/construction-mesh.js +15 -5
- package/dist/engine/native/context.js +10 -7
- package/dist/engine/native/index.js +1 -1
- package/dist/engine/native/material-components.js +2 -2
- package/dist/engine/native/mesh-observation.js +1 -1
- package/dist/engine/native/regions.js +44 -24
- package/dist/engine/native/scoped-primitives.js +3 -3
- package/dist/engine/native/scoped-threads.js +1 -13
- package/dist/engine/native/threads.js +2 -2
- package/dist/engine/native/transforms.js +2 -2
- package/dist/engine/operations/construction.js +77 -27
- package/dist/engine/operations/context.js +13 -6
- package/dist/engine/operations/cutters.js +112 -0
- package/dist/engine/operations/environment.js +2 -2
- package/dist/engine/operations/extrusion-finishing.js +42 -16
- package/dist/engine/operations/hole-cutter.js +125 -114
- package/dist/engine/operations/join-collar-profile.js +19 -19
- package/dist/engine/operations/join.js +86 -73
- package/dist/engine/operations/knuckle-hinge.js +25 -20
- package/dist/engine/operations/loft.js +9 -16
- package/dist/engine/operations/mechanical.js +4 -15
- package/dist/engine/operations/primitives/anchors.js +23 -19
- package/dist/engine/operations/primitives/construction.js +38 -12
- package/dist/engine/operations/primitives/correspondence.js +2 -2
- package/dist/engine/operations/primitives/profile-mesh.js +41 -80
- package/dist/engine/operations/primitives/profiles.js +5 -5
- package/dist/engine/operations/sections.js +8 -8
- package/dist/engine/operations/transforms.js +19 -39
- package/dist/engine/placement.js +3 -3
- package/dist/engine/recipe-realization.js +86 -30
- package/dist/engine/session/declarations.js +98 -0
- package/dist/engine/session/dependencies.js +81 -28
- package/dist/engine/session/graph.js +39 -137
- package/dist/engine/session/parameters.js +78 -0
- package/dist/engine/session/session.js +2 -2
- package/dist/engine/session/snapshot-cache.js +2 -2
- package/dist/engine/shape-anchors.js +13 -6
- package/dist/export/3mf.js +9 -2
- package/dist/export/capture.js +10 -6
- package/dist/export/glb.js +7 -2
- package/dist/export/stl.js +21 -6
- package/dist/geometry/{bounds.js → bounds/operations.js} +3 -1
- package/dist/geometry/{bounds-value.js → bounds/value.js} +20 -16
- package/dist/geometry/curves/evaluation.js +5 -6
- package/dist/geometry/curves/sampling.js +30 -6
- package/dist/geometry/{extrusion.js → extrusion/controls.js} +58 -35
- package/dist/geometry/extrusion/mesh.js +92 -0
- package/dist/geometry/extrusion/stations.js +35 -0
- package/dist/geometry/extrusion/twisted-chamfer.js +265 -0
- package/dist/geometry/immutable-buffer.js +7 -1
- package/dist/geometry/index.js +24 -32
- package/dist/geometry/{model-limits.js → limits.js} +1 -1
- package/dist/geometry/loft/{loft-correspondence.js → correspondence.js} +31 -20
- package/dist/geometry/loft/{loft-geometry.js → geometry.js} +15 -17
- package/dist/geometry/loft/mesh.js +53 -0
- package/dist/geometry/loft/{loft-options.js → options.js} +13 -11
- package/dist/geometry/loft/{loft-simple-mesh.js → simple-mesh.js} +26 -17
- package/dist/geometry/math/interpolation.js +9 -0
- package/dist/geometry/math/vector-value.js +12 -3
- package/dist/geometry/math/vector2.js +18 -5
- package/dist/geometry/math/vector3.js +28 -5
- package/dist/geometry/math-api.js +4 -0
- package/dist/geometry/mechanical/gear-motion.js +7 -5
- package/dist/geometry/mechanical/gears.js +21 -4
- package/dist/geometry/mechanical/knuckle-hinge.js +7 -5
- package/dist/geometry/mechanical/threads/fit.js +8 -2
- package/dist/geometry/mechanical/threads/helices.js +4 -2
- package/dist/geometry/mechanical/threads/mesh-plan.js +4 -2
- package/dist/geometry/mechanical/threads/mesh.js +12 -9
- package/dist/geometry/mechanical/threads/profiles.js +18 -4
- package/dist/geometry/mechanical/threads/solids.js +11 -2
- package/dist/geometry/mechanical-api.js +10 -0
- package/dist/geometry/mesh/{mesh-centroid.js → centroid.js} +2 -1
- package/dist/geometry/{heightfield.js → mesh/heightfield.js} +9 -5
- package/dist/geometry/{join-geometry.js → mesh/join-layers.js} +53 -59
- package/dist/geometry/mesh/{mesh.js → operations.js} +11 -18
- package/dist/geometry/mesh/{mesh-planar.js → planar.js} +8 -18
- package/dist/geometry/mesh/{mesh-quality.js → quality.js} +10 -42
- package/dist/geometry/mesh/{mesh-render.js → render-buffers.js} +22 -7
- package/dist/geometry/mesh/{mesh-signature.js → signature.js} +1 -1
- package/dist/geometry/mesh/{mesh-solid-intersections.js → solid-intersections.js} +2 -0
- package/dist/geometry/mesh/{mesh-solid.js → solid.js} +4 -4
- package/dist/geometry/mesh/triangle-quality.js +42 -0
- package/dist/geometry/mesh/winding.js +11 -0
- package/dist/geometry/{numeric.js → mesh/write-vertex.js} +1 -1
- package/dist/geometry/mesh-api.js +12 -11
- package/dist/geometry/paths/distribution.js +43 -0
- package/dist/geometry/paths/editing.js +76 -0
- package/dist/geometry/paths/frames.js +16 -11
- package/dist/geometry/paths/helix.js +1 -1
- package/dist/geometry/paths/resampling.js +46 -61
- package/dist/geometry/paths/{planar.js → rounding.js} +8 -67
- package/dist/geometry/paths/spline.js +116 -0
- package/dist/geometry/paths/traversal.js +107 -0
- package/dist/geometry/paths/{path-value.js → value.js} +97 -18
- package/dist/geometry/patterns/placements.js +20 -29
- package/dist/geometry/{patterns.js → patterns/transforms.js} +11 -7
- package/dist/geometry/primitives/cutters.js +70 -0
- package/dist/geometry/{cylinder.js → primitives/cylinder.js} +4 -4
- package/dist/geometry/{edge-finishing.js → primitives/edges.js} +5 -5
- package/dist/geometry/{primitive-resolvers.js → primitives/resolvers.js} +9 -9
- package/dist/geometry/primitives/sampling.js +41 -0
- package/dist/geometry/profiles/contour.js +19 -7
- package/dist/geometry/profiles/{match-profiles.js → matching.js} +9 -6
- package/dist/geometry/profiles/primitives/circle.js +1 -1
- package/dist/geometry/profiles/primitives/ellipse.js +2 -2
- package/dist/geometry/profiles/primitives/rectangle.js +8 -8
- package/dist/geometry/profiles/primitives/star.js +1 -1
- package/dist/geometry/profiles/side-profile.js +8 -5
- package/dist/geometry/profiles/validation.js +1 -1
- package/dist/geometry/{polygon-clipping.js → regions/clipping.js} +1 -1
- package/dist/geometry/{convex-offset.js → regions/convex-offset.js} +1 -1
- package/dist/geometry/{region-offset.js → regions/offset.js} +7 -5
- package/dist/geometry/{regions.js → regions/operations.js} +59 -22
- package/dist/geometry/{stroke-path.js → regions/stroke.js} +46 -20
- package/dist/geometry/{loft/loft-triangulation.js → regions/triangulation.js} +35 -2
- package/dist/geometry/revolve/{revolve-mesh.js → mesh.js} +9 -10
- package/dist/geometry/{circular-sampling.js → sampling/circular.js} +3 -3
- package/dist/geometry/{sampling-limits.js → sampling/limits.js} +6 -2
- package/dist/geometry/{resolution.js → sampling/resolution.js} +15 -14
- package/dist/geometry/svg/fill.js +4 -3
- package/dist/geometry/svg/import.js +47 -64
- package/dist/geometry/svg/path.js +3 -3
- package/dist/geometry/sweep/closed.js +55 -0
- package/dist/geometry/sweep/mesh.js +30 -0
- package/dist/geometry/{sweeps/sweep-open.js → sweep/open.js} +9 -24
- package/dist/geometry/{sweeps → sweep}/orientation.js +14 -11
- package/dist/geometry/sweep/seam.js +30 -0
- package/dist/geometry/{sweeps → sweep}/stations.js +75 -10
- package/dist/geometry/sweep/transforms.js +30 -0
- package/dist/geometry/{sweeps → sweep}/validation.js +4 -4
- package/dist/geometry/{text-contours.js → text/contours.js} +3 -3
- package/dist/geometry/{text-fitting.js → text/fitting.js} +4 -3
- package/dist/geometry/text/layout.js +1 -0
- package/dist/geometry/{transform3.js → transforms/affine3.js} +31 -46
- package/dist/geometry/{anchors.js → transforms/anchors.js} +43 -24
- package/dist/geometry/{transform-geometry.js → transforms/apply.js} +8 -5
- package/dist/geometry/{transform2.js → transforms/dimensions.js} +23 -19
- package/dist/geometry/transforms/frame.js +64 -0
- package/dist/geometry/{transform-matrix.js → transforms/matrix-input.js} +8 -1
- package/dist/geometry/{transform-value.js → transforms/value.js} +29 -11
- package/dist/index.js +3 -9
- package/dist/model/cutters.js +1 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +2 -0
- package/dist/model/immutable-generation-data.js +2 -0
- package/dist/model/operations.js +130 -94
- package/dist/model/recipe-declaration.js +5 -7
- package/dist/text/index.js +3 -0
- package/dist/text/vector-text-layout.js +1 -0
- package/package.json +15 -17
- package/dist/api/export-3mf.d.ts +0 -2
- package/dist/api/export-glb.d.ts +0 -2
- package/dist/api/export-stl.d.ts +0 -2
- package/dist/docs/reference/geometry/BoxEdge.md +0 -17
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +0 -24
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +0 -25
- package/dist/docs/reference/geometry/CylinderOptions.md +0 -63
- package/dist/docs/reference/geometry/EndTreatments.md +0 -44
- package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +0 -144
- package/dist/docs/reference/geometry/ExtrudeOptions.md +0 -156
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +0 -25
- package/dist/docs/reference/geometry/LoftMeshStation.md +0 -41
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +0 -39
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +0 -114
- package/dist/docs/reference/geometry/SphereOptions.md +0 -25
- package/dist/docs/reference/geometry/SweepOptions.md +0 -127
- package/dist/docs/reference/geometry/SweepOrientation.md +0 -127
- package/dist/docs/reference/geometry/TubeOptions.md +0 -72
- package/dist/docs/reference/geometry/add2.md +0 -43
- package/dist/docs/reference/geometry/add3.md +0 -49
- package/dist/docs/reference/geometry/applyTransformDirection3.md +0 -52
- package/dist/docs/reference/geometry/applyTransformPoint3.md +0 -50
- package/dist/docs/reference/geometry/categories/meshes.md +0 -68
- package/dist/docs/reference/geometry/composeTransform3.md +0 -51
- package/dist/docs/reference/geometry/cross2.md +0 -43
- package/dist/docs/reference/geometry/cross3.md +0 -49
- package/dist/docs/reference/geometry/distance2.md +0 -43
- package/dist/docs/reference/geometry/distance3.md +0 -43
- package/dist/docs/reference/geometry/dot2.md +0 -43
- package/dist/docs/reference/geometry/dot3.md +0 -49
- package/dist/docs/reference/geometry/eulerTransform3.md +0 -49
- package/dist/docs/reference/geometry/frameTransform3.md +0 -55
- package/dist/docs/reference/geometry/inverseTransform3.md +0 -41
- package/dist/docs/reference/geometry/length2.md +0 -37
- package/dist/docs/reference/geometry/length3.md +0 -37
- package/dist/docs/reference/geometry/lerp2.md +0 -49
- package/dist/docs/reference/geometry/lerp3.md +0 -49
- package/dist/docs/reference/geometry/normalize2.md +0 -46
- package/dist/docs/reference/geometry/normalize3.md +0 -46
- package/dist/docs/reference/geometry/projectOntoPlane3.md +0 -43
- package/dist/docs/reference/geometry/rotate2.md +0 -43
- package/dist/docs/reference/geometry/rotationTransform3.md +0 -60
- package/dist/docs/reference/geometry/scale2.md +0 -43
- package/dist/docs/reference/geometry/scale3.md +0 -49
- package/dist/docs/reference/geometry/scaleTransform3.md +0 -45
- package/dist/docs/reference/geometry/subtract2.md +0 -43
- package/dist/docs/reference/geometry/subtract3.md +0 -49
- package/dist/docs/reference/geometry/transformDeterminant3.md +0 -43
- package/dist/docs/reference/geometry/translationTransform3.md +0 -42
- package/dist/docs/reference/geometry/validateRigidTransform3.md +0 -41
- package/dist/docs/reference/geometry/validateTransform3.md +0 -54
- package/dist/docs/reference/model/Profile.md +0 -30
- package/dist/docs/reference/model/categories/explicit-profiles.md +0 -21
- package/dist/docs/reference/model/matchProfiles.md +0 -48
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +0 -93
- package/dist/docs/reference/model/preflightThreadedNut.md +0 -109
- package/dist/docs/reference/model/preflightThreadedRod.md +0 -93
- package/dist/engine/operations/patterns.js +0 -47
- package/dist/geometry/loft/loft.js +0 -105
- package/dist/geometry/mechanical/index.js +0 -14
- package/dist/geometry/primitive-resolution.js +0 -20
- package/dist/geometry/svg/index.js +0 -1
- package/dist/geometry/sweeps/options.js +0 -29
- package/dist/geometry/sweeps/sweep-closed.js +0 -96
- package/dist/geometry/sweeps/sweep-mesh.js +0 -32
- /package/dist/geometry/mechanical/{standards.js → fastener-standards.js} +0 -0
- /package/dist/geometry/mesh/{mesh-edge-table.js → edge-table.js} +0 -0
- /package/dist/geometry/mesh/{mesh-types.js → types.js} +0 -0
- /package/dist/geometry/mesh/{mesh-view-cache.js → view-cache.js} +0 -0
- /package/dist/geometry/{primitive-options.js → primitives/options.js} +0 -0
- /package/dist/geometry/{text-layout.js → sweep/options.js} +0 -0
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import { curveFailure,
|
|
1
|
+
import { curveFailure, validateCurvePoint3 } from "../curves/evaluation.js";
|
|
2
2
|
import { assertSampleVertexCount, createPlanarSampleWriter, createSpatialSampleWriter, resolveSamplingBudget, } from "../curves/sampling.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
if (!Number.isFinite(value))
|
|
9
|
-
curveFailure("NON_FINITE_VALUE", "Curve extent exceeds finite arithmetic.");
|
|
10
|
-
return value;
|
|
11
|
-
};
|
|
12
|
-
function resamplePolyline(path, dimensions, options, createWriter, includeTangents = true) {
|
|
3
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling/limits.js";
|
|
4
|
+
import { resolveGeometryResolution } from "../sampling/resolution.js";
|
|
5
|
+
import { createPathTraversal, locatePathDistance, pathEdgeLength, writePathPoint, writePathTangent, } from "./traversal.js";
|
|
6
|
+
const isArray = (value) => Array.isArray(value);
|
|
7
|
+
function resamplePolyline(path, dimensions, options, createWriter, output = {}) {
|
|
13
8
|
const maximum = resolveSamplingBudget(options);
|
|
9
|
+
if (!isArray(path))
|
|
10
|
+
curveFailure("INVALID_ARGUMENT", "Polyline points must be an array.");
|
|
14
11
|
if (options.closed !== undefined && typeof options.closed !== "boolean")
|
|
15
12
|
curveFailure("INVALID_ARGUMENT", "closed must be a boolean.");
|
|
16
13
|
const closed = options.closed ?? false;
|
|
@@ -19,42 +16,35 @@ function resamplePolyline(path, dimensions, options, createWriter, includeTangen
|
|
|
19
16
|
assertSamplingCount(path.length, "sampleCurve", resolveGeometrySamplingLimits(options.limits).maxPathPoints, "Polyline input exceeds the configured path point ceiling.");
|
|
20
17
|
if (options.segments !== undefined)
|
|
21
18
|
assertSampleVertexCount(options.segments + (closed ? 0 : 1), maximum);
|
|
22
|
-
// Keep caller point references only within this synchronous operation. Unlike 2D promotion,
|
|
23
|
-
// normalization needs no extra 3D vector for every input point.
|
|
24
19
|
const points = [];
|
|
25
|
-
const
|
|
26
|
-
let
|
|
27
|
-
|
|
28
|
-
if (input.length !== dimensions)
|
|
20
|
+
const count = path.length;
|
|
21
|
+
for (let index = 0; index < count; index++) {
|
|
22
|
+
const input = path[index];
|
|
23
|
+
if (!isArray(input) || input.length !== dimensions)
|
|
29
24
|
curveFailure(dimensions === 2 ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", dimensions === 2
|
|
30
25
|
? "Planar curve points must have two coordinates."
|
|
31
26
|
: "Curve coordinates must be finite three-dimensional points.");
|
|
32
|
-
|
|
27
|
+
const point = output.ownedInput
|
|
28
|
+
? input
|
|
29
|
+
: dimensions === 2
|
|
30
|
+
? [input[0], input[1]]
|
|
31
|
+
: [input[0], input[1], input[2]];
|
|
32
|
+
if (!output.ownedInput && !point.every(Number.isFinite))
|
|
33
33
|
curveFailure("NON_FINITE_VALUE", "Curve coordinates must be finite three-dimensional points.");
|
|
34
34
|
const previous = points.at(-1);
|
|
35
|
-
|
|
36
|
-
if (previous !== undefined && length === 0)
|
|
35
|
+
if (previous !== undefined && pathEdgeLength(previous, point) === 0)
|
|
37
36
|
continue;
|
|
38
|
-
|
|
39
|
-
if (!Number.isFinite(total))
|
|
40
|
-
curveFailure("NON_FINITE_VALUE", "Polyline length exceeds finite arithmetic.");
|
|
41
|
-
points.push(input);
|
|
42
|
-
lengths.push(total);
|
|
37
|
+
points.push(point);
|
|
43
38
|
}
|
|
44
39
|
if (closed) {
|
|
45
|
-
if (points.length > 1 &&
|
|
40
|
+
if (points.length > 1 && pathEdgeLength(points[0], points.at(-1)) === 0) {
|
|
46
41
|
points.pop();
|
|
47
|
-
lengths.pop();
|
|
48
|
-
total = lengths.at(-1) ?? 0;
|
|
49
42
|
}
|
|
50
43
|
if (points.length < 3)
|
|
51
44
|
curveFailure("DEGENERATE_GEOMETRY", "A closed polyline needs at least three distinct consecutive points.");
|
|
52
|
-
total += distance(points.at(-1), points[0]);
|
|
53
|
-
if (!Number.isFinite(total))
|
|
54
|
-
curveFailure("NON_FINITE_VALUE", "Polyline length exceeds finite arithmetic.");
|
|
55
|
-
points.push(points[0]);
|
|
56
|
-
lengths.push(total);
|
|
57
45
|
}
|
|
46
|
+
const traversal = createPathTraversal(points, closed);
|
|
47
|
+
const total = traversal.length;
|
|
58
48
|
if (total === 0)
|
|
59
49
|
curveFailure("DEGENERATE_GEOMETRY", "A zero-length polyline cannot be resampled.");
|
|
60
50
|
const policy = options.segments === undefined
|
|
@@ -62,7 +52,7 @@ function resamplePolyline(path, dimensions, options, createWriter, includeTangen
|
|
|
62
52
|
: undefined;
|
|
63
53
|
const segments = options.segments ??
|
|
64
54
|
(policy?.maxSegmentLength === undefined
|
|
65
|
-
? points.length - 1
|
|
55
|
+
? points.length - (closed ? 0 : 1)
|
|
66
56
|
: Math.max(closed ? 3 : 1, Math.ceil(total / policy.maxSegmentLength)));
|
|
67
57
|
if (closed && segments < 3)
|
|
68
58
|
curveFailure("INVALID_ARGUMENT", "Closed polyline sampling needs at least three segments.");
|
|
@@ -70,39 +60,29 @@ function resamplePolyline(path, dimensions, options, createWriter, includeTangen
|
|
|
70
60
|
assertSampleVertexCount(vertexCount, maximum);
|
|
71
61
|
const writer = createWriter();
|
|
72
62
|
const point = [0, 0, 0], tangent = [0, 0, 0];
|
|
73
|
-
let source =
|
|
63
|
+
let source = 0;
|
|
74
64
|
for (let i = 0; i < vertexCount; i++) {
|
|
75
65
|
const at = total * (i / segments);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const a = points[source - 1], b = points[source];
|
|
80
|
-
if (i === 0 || i === segments) {
|
|
81
|
-
const endpoint = i === 0 ? points[0] : points.at(-1);
|
|
82
|
-
point[0] = endpoint[0];
|
|
83
|
-
point[1] = endpoint[1];
|
|
84
|
-
point[2] = z(endpoint);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
const t = (at - lengths[source - 1]) / (lengths[source] - lengths[source - 1]);
|
|
88
|
-
// Preserve the original direct interpolation order used by existing mechanical paths.
|
|
89
|
-
point[0] = a[0] + (b[0] - a[0]) * t;
|
|
90
|
-
point[1] = a[1] + (b[1] - a[1]) * t;
|
|
91
|
-
point[2] = z(a) + (z(b) - z(a)) * t;
|
|
92
|
-
}
|
|
66
|
+
const location = locatePathDistance(traversal, at, source);
|
|
67
|
+
source = location.edgeIndex;
|
|
68
|
+
writePathPoint(traversal, location, point);
|
|
93
69
|
validateCurvePoint3(point);
|
|
94
|
-
if (
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
70
|
+
if (closed &&
|
|
71
|
+
i === vertexCount - 1 &&
|
|
72
|
+
point.every((coordinate, axis) => coordinate === (points[0][axis] ?? 0)))
|
|
73
|
+
curveFailure("DEGENERATE_GEOMETRY", "Closed resampling must not repeat its seam point; select a different segment count.");
|
|
74
|
+
if (output.tangents !== false)
|
|
75
|
+
writePathTangent(traversal, location, tangent);
|
|
100
76
|
writer.append(point, tangent);
|
|
101
77
|
}
|
|
102
78
|
return writer.finish();
|
|
103
79
|
}
|
|
104
80
|
/**
|
|
105
81
|
* Resamples a spatial polyline at equal arc lengths with directed outgoing tangents.
|
|
82
|
+
*
|
|
83
|
+
* @param path - XYZ points in millimetres; duplicate neighbors are removed.
|
|
84
|
+
* @param options - Closure and exact intervals or physical edge spacing.
|
|
85
|
+
*
|
|
106
86
|
* @remarks Open paths retain both endpoints; closed paths include the closing edge and omit the
|
|
107
87
|
* repeated seam. Repeated adjacent inputs and explicit closing duplicates are removed. Physical
|
|
108
88
|
* maxSegmentLength bounds arc-length intervals; exact counts override that policy. Output edges
|
|
@@ -115,7 +95,12 @@ function resamplePolyline(path, dimensions, options, createWriter, includeTangen
|
|
|
115
95
|
export function resamplePolyline3(path, options = {}) {
|
|
116
96
|
return resamplePolyline(path, 3, options, createSpatialSampleWriter);
|
|
117
97
|
}
|
|
118
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Resamples a planar polyline with the same point, tangent, seam and budget guarantees as 3D.
|
|
100
|
+
*
|
|
101
|
+
* @param path - XY points in millimetres; duplicate neighbors are removed.
|
|
102
|
+
* @param options - Closure and exact intervals or physical edge spacing.
|
|
103
|
+
*
|
|
119
104
|
* @remarks Only final 2D output vectors are copied and frozen. No immutable 3D intermediate is built.
|
|
120
105
|
* @example
|
|
121
106
|
* ```ts
|
|
@@ -133,7 +118,7 @@ export function resamplePath2Points(path, options) {
|
|
|
133
118
|
points.push([point[0], point[1]]);
|
|
134
119
|
},
|
|
135
120
|
finish: () => points,
|
|
136
|
-
}), false);
|
|
121
|
+
}), { tangents: false, ownedInput: true });
|
|
137
122
|
}
|
|
138
123
|
/** Internal points-only writer; avoids calculating and allocating tangents discarded by Path3. */
|
|
139
124
|
export function resamplePath3Points(path, options) {
|
|
@@ -143,5 +128,5 @@ export function resamplePath3Points(path, options) {
|
|
|
143
128
|
points.push([point[0], point[1], point[2]]);
|
|
144
129
|
},
|
|
145
130
|
finish: () => points,
|
|
146
|
-
}), false);
|
|
131
|
+
}), { tangents: false, ownedInput: true });
|
|
147
132
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { length3, normalize3, subtract3 } from "../math/vector3.js";
|
|
3
|
-
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling
|
|
4
|
-
import { path3InputData } from "./
|
|
3
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
|
|
4
|
+
import { path3InputData } from "./value.js";
|
|
5
5
|
const invalidPath = (message, operation) => {
|
|
6
6
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
7
7
|
};
|
|
@@ -12,69 +12,6 @@ const requireFinitePathValues = (values, operation) => {
|
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
14
|
};
|
|
15
|
-
const segmentLengths = (path, closed) => path.map((point, index) => {
|
|
16
|
-
if (!closed && index === path.length - 1)
|
|
17
|
-
return 0;
|
|
18
|
-
const next = path[(index + 1) % path.length];
|
|
19
|
-
const delta = subtract3(next, point);
|
|
20
|
-
return Math.hypot(delta[0], delta[1], delta[2]);
|
|
21
|
-
});
|
|
22
|
-
/**
|
|
23
|
-
* Places an exact item count at equal arc-length intervals along a sampled path.
|
|
24
|
-
*
|
|
25
|
-
* Coordinates are unit-agnostic. Closed paths must omit their duplicated seam;
|
|
26
|
-
* open paths include both endpoints when `count` is greater than one.
|
|
27
|
-
* Coordinates and total length must be finite. Input points and output placements are each
|
|
28
|
-
* limited by maxPathPoints (default 100000); exact counts exceeding that ceiling reject before length calculation.
|
|
29
|
-
* Closure defaults to the path value's metadata, or false for tuples. An explicit conflicting closure rejects.
|
|
30
|
-
* Invalid arguments and degenerate paths throw GeometryError.
|
|
31
|
-
*/
|
|
32
|
-
export const distributeAlongPath = (input, count, closed, limits = {}) => {
|
|
33
|
-
if (!Number.isInteger(count) || count < 1) {
|
|
34
|
-
invalidPath("Path distribution count must be a positive integer.", "distributeAlongPath");
|
|
35
|
-
}
|
|
36
|
-
const maximum = resolveGeometrySamplingLimits(limits).maxPathPoints;
|
|
37
|
-
assertSamplingCount(count, "distributeAlongPath", maximum);
|
|
38
|
-
const { points: path, closed: closePath } = path3InputData(input, closed, limits);
|
|
39
|
-
if (path.length < (closePath ? 3 : 2)) {
|
|
40
|
-
invalidPath(`${closePath ? "Closed" : "Open"} distribution paths need more points.`, "distributeAlongPath");
|
|
41
|
-
}
|
|
42
|
-
if (closePath && path[0].every((coordinate, axis) => coordinate === path.at(-1)[axis]))
|
|
43
|
-
invalidPath("Closed distribution paths omit their repeated seam point.", "distributeAlongPath");
|
|
44
|
-
const lengths = segmentLengths(path, closePath);
|
|
45
|
-
const total = lengths.reduce((sum, length) => sum + length, 0);
|
|
46
|
-
requireFinitePathValues([total], "distributeAlongPath");
|
|
47
|
-
if (!(total > 0))
|
|
48
|
-
throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot distribute along a zero-length path.", {
|
|
49
|
-
operation: "distributeAlongPath",
|
|
50
|
-
});
|
|
51
|
-
const denominator = closePath ? count : Math.max(1, count - 1);
|
|
52
|
-
let traversed = 0;
|
|
53
|
-
let segment = 0;
|
|
54
|
-
return Array.from({ length: count }, (_, itemIndex) => {
|
|
55
|
-
const target = total * (itemIndex / denominator);
|
|
56
|
-
for (; segment < lengths.length; segment += 1) {
|
|
57
|
-
const length = lengths[segment];
|
|
58
|
-
if (length === 0)
|
|
59
|
-
continue;
|
|
60
|
-
if (target <= traversed + length || segment === lengths.length - 1) {
|
|
61
|
-
const start = path[segment];
|
|
62
|
-
const end = path[(segment + 1) % path.length];
|
|
63
|
-
const amount = Math.min(1, Math.max(0, (target - traversed) / length));
|
|
64
|
-
return {
|
|
65
|
-
position: [
|
|
66
|
-
start[0] + (end[0] - start[0]) * amount,
|
|
67
|
-
start[1] + (end[1] - start[1]) * amount,
|
|
68
|
-
start[2] + (end[2] - start[2]) * amount,
|
|
69
|
-
],
|
|
70
|
-
tangent: normalize3(subtract3(end, start)),
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
traversed += length;
|
|
74
|
-
}
|
|
75
|
-
return invalidPath("Path distribution invariant failed.", "distributeAlongPath");
|
|
76
|
-
});
|
|
77
|
-
};
|
|
78
15
|
/**
|
|
79
16
|
* Replaces each vertex of a non-duplicated closed polyline with a sampled
|
|
80
17
|
* quadratic corner in the same coordinate system as the input.
|
|
@@ -82,8 +19,12 @@ export const distributeAlongPath = (input, count, closed, limits = {}) => {
|
|
|
82
19
|
* `radius` is the desired tangent distance for a right angle and is capped to
|
|
83
20
|
* 45% of adjacent segment lengths to prevent neighboring corners from crossing.
|
|
84
21
|
* The returned path does not duplicate its closing point.
|
|
85
|
-
*
|
|
86
|
-
*
|
|
22
|
+
* Invalid coordinates, topology, dimensions, or exhausted budgets throw GeometryError.
|
|
23
|
+
*
|
|
24
|
+
* @param input - Closed XYZ path or points in millimetres, without a repeated seam.
|
|
25
|
+
* @param radius - Positive right-angle tangent distance in millimetres.
|
|
26
|
+
* @param segmentsPerCorner - Quadratic intervals per corner; a positive integer.
|
|
27
|
+
* @param limits - Limits on input and rounded path points.
|
|
87
28
|
*/
|
|
88
29
|
export const roundClosedPolylinePath = (input, radius, segmentsPerCorner, limits = {}) => {
|
|
89
30
|
const maximum = resolveGeometrySamplingLimits(limits).maxPathPoints;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { sampleCubicControlPoints } from "../curves/sampling.js";
|
|
2
|
+
import { GeometryError } from "../errors.js";
|
|
3
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
|
|
4
|
+
import { pathEdgeLength } from "./traversal.js";
|
|
5
|
+
import { path2, path2InputData, path3, path3InputData, } from "./value.js";
|
|
6
|
+
const fail = (message) => {
|
|
7
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "spline" });
|
|
8
|
+
};
|
|
9
|
+
function optionsPolicy(options, input) {
|
|
10
|
+
if (typeof options !== "object" || options === null || Array.isArray(options))
|
|
11
|
+
fail("Spline options must be an object.");
|
|
12
|
+
if (options.closed !== undefined && typeof options.closed !== "boolean")
|
|
13
|
+
fail("Spline closed must be a boolean.");
|
|
14
|
+
if (options.segmentsPerSpan !== undefined &&
|
|
15
|
+
(!Number.isSafeInteger(options.segmentsPerSpan) || options.segmentsPerSpan < 1))
|
|
16
|
+
fail("segmentsPerSpan must be a positive safe integer.");
|
|
17
|
+
const maximum = resolveGeometrySamplingLimits(options.limits).maxPathPoints;
|
|
18
|
+
if (Array.isArray(input) && options.segmentsPerSpan !== undefined)
|
|
19
|
+
assertSamplingCount((input.length - (options.closed ? 0 : 1)) * options.segmentsPerSpan +
|
|
20
|
+
(options.closed ? 0 : 1), "spline", maximum);
|
|
21
|
+
return maximum;
|
|
22
|
+
}
|
|
23
|
+
/** Converts one centripetal Catmull–Rom span into equivalent cubic Bézier controls. */
|
|
24
|
+
function controls(points, edge, closed) {
|
|
25
|
+
const count = points.length;
|
|
26
|
+
const start = points[edge], end = points[(edge + 1) % count];
|
|
27
|
+
const before = points[(edge - 1 + count) % count], after = points[(edge + 2) % count];
|
|
28
|
+
// Square-root chord lengths define the knots; one-sided secants avoid extrapolated endpoints.
|
|
29
|
+
const span = Math.sqrt(pathEdgeLength(start, end));
|
|
30
|
+
const previous = !closed && edge === 0 ? span : Math.sqrt(pathEdgeLength(before, start));
|
|
31
|
+
const next = !closed && edge === count - 2 ? span : Math.sqrt(pathEdgeLength(end, after));
|
|
32
|
+
const first = [], second = [];
|
|
33
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
34
|
+
const a = start[axis] ?? 0, b = end[axis] ?? 0;
|
|
35
|
+
const delta = b - a;
|
|
36
|
+
const incoming = !closed && edge === 0 ? delta : a - (before[axis] ?? 0);
|
|
37
|
+
const outgoing = !closed && edge === count - 2 ? delta : (after[axis] ?? 0) - b;
|
|
38
|
+
// Unit-span derivatives become Bézier controls at one third of each endpoint tangent.
|
|
39
|
+
const firstTangent = (incoming / previous) * span * (span / (previous + span)) +
|
|
40
|
+
delta * (previous / (previous + span));
|
|
41
|
+
const secondTangent = delta * (next / (span + next)) + (outgoing / next) * span * (span / (span + next));
|
|
42
|
+
first.push(a + firstTangent / 3);
|
|
43
|
+
second.push(b - secondTangent / 3);
|
|
44
|
+
}
|
|
45
|
+
return [
|
|
46
|
+
[start[0], start[1], start[2] ?? 0],
|
|
47
|
+
first,
|
|
48
|
+
second,
|
|
49
|
+
[end[0], end[1], end[2] ?? 0],
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
function splinePoints(points, closed, options, maximum) {
|
|
53
|
+
if (points.length < (closed ? 3 : 2))
|
|
54
|
+
fail("Open splines need two waypoints; closed splines need three.");
|
|
55
|
+
const spans = points.length - (closed ? 0 : 1);
|
|
56
|
+
// Every span needs an output edge, even before adaptive physical refinement.
|
|
57
|
+
assertSamplingCount(spans * (options.segmentsPerSpan ?? 1) + (closed ? 0 : 1), "spline", maximum);
|
|
58
|
+
for (let edge = 0; edge < spans; edge++)
|
|
59
|
+
if (pathEdgeLength(points[edge], points[(edge + 1) % points.length]) === 0)
|
|
60
|
+
fail("Spline waypoints must not contain adjacent duplicates or a repeated closed seam.");
|
|
61
|
+
const result = [points[0]];
|
|
62
|
+
for (let edge = 0; edge < spans; edge++) {
|
|
63
|
+
const omitSeam = closed && edge === spans - 1;
|
|
64
|
+
// Reserve one endpoint for each later span; the final closed endpoint is not retained.
|
|
65
|
+
const reserved = spans - edge - 1 - (closed ? 1 : 0);
|
|
66
|
+
const budget = maximum - result.length - reserved + 1;
|
|
67
|
+
sampleCubicControlPoints(controls(points, edge, closed), {
|
|
68
|
+
...(options.segmentsPerSpan === undefined ? {} : { segments: options.segmentsPerSpan }),
|
|
69
|
+
...(options.resolution === undefined ? {} : { resolution: options.resolution }),
|
|
70
|
+
limits: options.limits ?? {},
|
|
71
|
+
maxVertices: budget,
|
|
72
|
+
}, (sample, endpoint) => {
|
|
73
|
+
if (omitSeam && endpoint)
|
|
74
|
+
return;
|
|
75
|
+
result.push((points[0].length === 2
|
|
76
|
+
? [sample[0], sample[1]]
|
|
77
|
+
: [sample[0], sample[1], sample[2]]));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Samples an immutable XY centripetal Catmull–Rom path through every waypoint in traversal order.
|
|
84
|
+
* Open endpoints use one-sided secants; closed paths are periodic and omit their repeated seam.
|
|
85
|
+
* Adjacent duplicate waypoints reject. The default physical policy bounds each cubic control hull;
|
|
86
|
+
* segmentsPerSpan instead selects exact uniform parameters per span. Sampling never coarsens to fit
|
|
87
|
+
* maxPathPoints. Invalid topology, nonfinite arithmetic, and exhausted budgets throw GeometryError.
|
|
88
|
+
*
|
|
89
|
+
* @param input - XY waypoints in millimetres; path values retain closure.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const route = spline2([[0, 0], [10, 8], [25, 0]], { resolution: { maxChordError: 0.02 } });
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export function spline2(input, options = {}) {
|
|
97
|
+
const maximum = optionsPolicy(options, input);
|
|
98
|
+
const data = path2InputData(input, options.closed, options.limits);
|
|
99
|
+
return path2(splinePoints(data.points, data.closed, options, maximum), {
|
|
100
|
+
closed: data.closed,
|
|
101
|
+
limits: options.limits ?? {},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Samples an immutable XYZ centripetal Catmull–Rom path with the same interpolation, seam, sampling, and ceiling rules as spline2.
|
|
106
|
+
*
|
|
107
|
+
* @param input - XYZ waypoints in millimetres; path values retain closure.
|
|
108
|
+
*/
|
|
109
|
+
export function spline3(input, options = {}) {
|
|
110
|
+
const maximum = optionsPolicy(options, input);
|
|
111
|
+
const data = path3InputData(input, options.closed, options.limits);
|
|
112
|
+
return path3(splinePoints(data.points, data.closed, options, maximum), {
|
|
113
|
+
closed: data.closed,
|
|
114
|
+
limits: options.limits ?? {},
|
|
115
|
+
});
|
|
116
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { interpolateCoordinate } from "../math/interpolation.js";
|
|
3
|
+
const fail = (message, code) => {
|
|
4
|
+
throw new GeometryError(code, message, { operation: "path" });
|
|
5
|
+
};
|
|
6
|
+
/** Internal finite edge length without a temporary vector. */
|
|
7
|
+
export function pathEdgeLength(a, b) {
|
|
8
|
+
const length = Math.hypot(b[0] - a[0], b[1] - a[1], (b[2] ?? 0) - (a[2] ?? 0));
|
|
9
|
+
if (!Number.isFinite(length))
|
|
10
|
+
fail("Path extent exceeds finite arithmetic.", "NON_FINITE_VALUE");
|
|
11
|
+
return length;
|
|
12
|
+
}
|
|
13
|
+
/** Internal allocation-free measurement for paths that do not need an arc-length index. */
|
|
14
|
+
export function measurePathLength(points, closed) {
|
|
15
|
+
let length = 0;
|
|
16
|
+
const count = closed ? points.length : Math.max(0, points.length - 1);
|
|
17
|
+
for (let edge = 0; edge < count; edge++) {
|
|
18
|
+
length += pathEdgeLength(points[edge], points[(edge + 1) % points.length]);
|
|
19
|
+
if (!Number.isFinite(length))
|
|
20
|
+
fail("Path length exceeds finite arithmetic.", "NON_FINITE_VALUE");
|
|
21
|
+
}
|
|
22
|
+
return length;
|
|
23
|
+
}
|
|
24
|
+
/** Internal index over already captured coordinates; no caller data is retained by public factories. */
|
|
25
|
+
export function createPathTraversal(points, closed) {
|
|
26
|
+
const cumulative = [0];
|
|
27
|
+
const count = closed ? points.length : Math.max(0, points.length - 1);
|
|
28
|
+
let length = 0;
|
|
29
|
+
let lastNonzeroEdge = -1;
|
|
30
|
+
for (let edge = 0; edge < count; edge++) {
|
|
31
|
+
const edgeLength = pathEdgeLength(points[edge], points[(edge + 1) % points.length]);
|
|
32
|
+
if (edgeLength > 0)
|
|
33
|
+
lastNonzeroEdge = edge;
|
|
34
|
+
length += edgeLength;
|
|
35
|
+
if (!Number.isFinite(length))
|
|
36
|
+
fail("Path length exceeds finite arithmetic.", "NON_FINITE_VALUE");
|
|
37
|
+
cumulative.push(length);
|
|
38
|
+
}
|
|
39
|
+
return { points, closed, cumulative, length, lastNonzeroEdge };
|
|
40
|
+
}
|
|
41
|
+
/** Internal strict distance check; callers must not silently clamp authored ranges. */
|
|
42
|
+
export function validatePathDistance(distance, length) {
|
|
43
|
+
if (!Number.isFinite(distance))
|
|
44
|
+
fail("Path distance must be finite.", "NON_FINITE_VALUE");
|
|
45
|
+
if (distance < 0 || distance > length)
|
|
46
|
+
fail("Path distance must be between zero and its total length.", "INVALID_ARGUMENT");
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Internal outgoing-edge lookup. Zero-length edges are skipped; an open final endpoint uses its
|
|
50
|
+
* incoming edge, and a closed final endpoint uses the outgoing seam. A cursor keeps ordered scans linear.
|
|
51
|
+
*/
|
|
52
|
+
export function locatePathDistance(traversal, distance, cursor) {
|
|
53
|
+
const { cumulative, length, closed } = traversal;
|
|
54
|
+
validatePathDistance(distance, length);
|
|
55
|
+
if (length === 0)
|
|
56
|
+
fail("A zero-length path has no usable edge.", "DEGENERATE_GEOMETRY");
|
|
57
|
+
const count = cumulative.length - 1;
|
|
58
|
+
if (distance === length && !closed) {
|
|
59
|
+
return { edgeIndex: traversal.lastNonzeroEdge, fraction: 1 };
|
|
60
|
+
}
|
|
61
|
+
const target = distance === length ? 0 : distance;
|
|
62
|
+
let edgeIndex;
|
|
63
|
+
if (cursor !== undefined && target >= cumulative[cursor]) {
|
|
64
|
+
edgeIndex = cursor;
|
|
65
|
+
while (edgeIndex < count - 1 && cumulative[edgeIndex + 1] <= target)
|
|
66
|
+
edgeIndex++;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Upper bound selects the outgoing edge and skips repeated cumulative distances.
|
|
70
|
+
let low = 0, high = count - 1;
|
|
71
|
+
while (low < high) {
|
|
72
|
+
const middle = Math.floor((low + high) / 2);
|
|
73
|
+
if (cumulative[middle + 1] <= target)
|
|
74
|
+
low = middle + 1;
|
|
75
|
+
else
|
|
76
|
+
high = middle;
|
|
77
|
+
}
|
|
78
|
+
edgeIndex = low;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
edgeIndex,
|
|
82
|
+
fraction: (target - cumulative[edgeIndex]) / (cumulative[edgeIndex + 1] - cumulative[edgeIndex]),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Internal interpolation into owned scratch or output coordinates, preserving exact vertices. */
|
|
86
|
+
export function writePathPoint(traversal, location, result) {
|
|
87
|
+
const a = traversal.points[location.edgeIndex], b = traversal.points[(location.edgeIndex + 1) % traversal.points.length];
|
|
88
|
+
for (let axis = 0; axis < 3; axis++)
|
|
89
|
+
result[axis] = interpolateCoordinate(a[axis] ?? 0, b[axis] ?? 0, location.fraction);
|
|
90
|
+
}
|
|
91
|
+
/** Internal unit edge tangent; coordinate units do not introduce a normalization threshold. */
|
|
92
|
+
export function writePathTangent(traversal, location, result) {
|
|
93
|
+
const a = traversal.points[location.edgeIndex], b = traversal.points[(location.edgeIndex + 1) % traversal.points.length];
|
|
94
|
+
let length = pathEdgeLength(a, b);
|
|
95
|
+
let x = b[0] - a[0], y = b[1] - a[1], z = (b[2] ?? 0) - (a[2] ?? 0);
|
|
96
|
+
if (length < 2 ** -1022) {
|
|
97
|
+
// Subnormal hypotenuses lose relative precision; normalize their scaled components instead.
|
|
98
|
+
const maximum = Math.max(Math.abs(x), Math.abs(y), Math.abs(z));
|
|
99
|
+
x /= maximum;
|
|
100
|
+
y /= maximum;
|
|
101
|
+
z /= maximum;
|
|
102
|
+
length = Math.hypot(x, y, z);
|
|
103
|
+
}
|
|
104
|
+
result[0] = x / length;
|
|
105
|
+
result[1] = y / length;
|
|
106
|
+
result[2] = z / length;
|
|
107
|
+
}
|