@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,7 +1,8 @@
|
|
|
1
1
|
/** Closed ridge and complete-solid mesh construction from resolved thread plans. */
|
|
2
|
-
import {
|
|
3
|
-
import { analyzeTriangleMesh, joinTriangleMeshes,
|
|
4
|
-
import {
|
|
2
|
+
import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "../../limits.js";
|
|
3
|
+
import { analyzeTriangleMesh, joinTriangleMeshes, } from "../../mesh/operations.js";
|
|
4
|
+
import { reverseOwnedTriangleWinding } from "../../mesh/winding.js";
|
|
5
|
+
import { triangulateContour } from "../../regions/triangulation.js";
|
|
5
6
|
import { resolveHelicalThreadMeshOptions, resolveHelicalThreadSolidMeshPreflight, } from "./mesh-plan.js";
|
|
6
7
|
import { buildThreadSurfaceColumn, stitchThreadSurfaceColumns } from "./surface.js";
|
|
7
8
|
const MINIMUM_TAPERED_RIDGE_HEIGHT = 0.0005;
|
|
@@ -56,13 +57,12 @@ const buildThreadRidgeComponent = (options) => {
|
|
|
56
57
|
};
|
|
57
58
|
cap(0, false);
|
|
58
59
|
cap(spans, true);
|
|
59
|
-
|
|
60
|
+
const mesh = {
|
|
60
61
|
positions: new Float32Array(positions),
|
|
61
62
|
indices: new Uint32Array(indices),
|
|
62
63
|
};
|
|
63
|
-
validateTriangleMesh(mesh, { requireClosed: true });
|
|
64
64
|
if (analyzeTriangleMesh(mesh, { requireClosed: true }).signedVolume < 0)
|
|
65
|
-
|
|
65
|
+
reverseOwnedTriangleWinding(mesh.indices);
|
|
66
66
|
return mesh;
|
|
67
67
|
};
|
|
68
68
|
/**
|
|
@@ -73,6 +73,8 @@ const buildThreadRidgeComponent = (options) => {
|
|
|
73
73
|
* monotone strip, with optional intermediate rows bounded by physical `maxSegmentLength`. A
|
|
74
74
|
* conservative pre-allocation estimate rejects excessive meshes before constructing position
|
|
75
75
|
* arrays.
|
|
76
|
+
*
|
|
77
|
+
* @param options - Dimensions in millimetres and a validated profile; apply any fit compensation first.
|
|
76
78
|
*/
|
|
77
79
|
export function threadSolidMesh(options) {
|
|
78
80
|
const operation = "threadSolidMesh";
|
|
@@ -98,13 +100,12 @@ export function threadSolidMesh(options) {
|
|
|
98
100
|
indices.push(bottomCenter, nextBottom, bottom, topCenter, top, nextTop);
|
|
99
101
|
}
|
|
100
102
|
assertMeshAllocationWithinLimits(positions.length / 3, indices.length / 3, (positions.length + indices.length) * 4, operation, resolveModelingLimits(options.limits));
|
|
101
|
-
|
|
103
|
+
const mesh = {
|
|
102
104
|
positions: new Float32Array(positions),
|
|
103
105
|
indices: new Uint32Array(indices),
|
|
104
106
|
};
|
|
105
|
-
validateTriangleMesh(mesh, { requireClosed: true });
|
|
106
107
|
if (analyzeTriangleMesh(mesh, { requireClosed: true }).signedVolume < 0) {
|
|
107
|
-
|
|
108
|
+
reverseOwnedTriangleWinding(mesh.indices);
|
|
108
109
|
}
|
|
109
110
|
return mesh;
|
|
110
111
|
}
|
|
@@ -112,6 +113,8 @@ export function threadSolidMesh(options) {
|
|
|
112
113
|
* Builds closed thread-ridge components with every profile locked to the
|
|
113
114
|
* shaft's radial/axial frame. The mesh is intended for union with its
|
|
114
115
|
* minor-envelope cylinder and never owns WASM objects.
|
|
116
|
+
*
|
|
117
|
+
* @param options - Dimensions in millimetres and a validated profile; apply any fit compensation first.
|
|
115
118
|
*/
|
|
116
119
|
export function threadRidgeMesh(options) {
|
|
117
120
|
const operation = "threadRidgeMesh";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Periodic thread profiles and axial/radial fit compensation. */
|
|
2
2
|
import { GeometryError } from "../../errors.js";
|
|
3
|
-
import { triangulateContour } from "../../
|
|
3
|
+
import { triangulateContour } from "../../regions/triangulation.js";
|
|
4
4
|
import { resolveGeometryTolerance } from "../../tolerance.js";
|
|
5
5
|
const BUTTRESS_DEFAULT_DEPTH_RATIO = 0.66271;
|
|
6
6
|
const BUTTRESS_CREST_FLAT_RATIO = 0.16316;
|
|
@@ -11,9 +11,13 @@ export const MAX_THREAD_PROFILE_POINTS = 1_024;
|
|
|
11
11
|
/**
|
|
12
12
|
* Applies axial fit allowance to a validated periodic profile.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Each flank moves by one quarter of the mating pair's total backlash: male ridges narrow and
|
|
15
|
+
* female cutter ridges widen. Periodic root endpoints remain fixed, preserving pitch and lead.
|
|
16
|
+
* Changed profiles are deeply immutable; zero backlash returns the input unchanged.
|
|
17
|
+
*
|
|
18
|
+
* @param profile - Validated `[axial, radial]` profile in millimetres.
|
|
19
|
+
* @param axialBacklash - Nonnegative total pair allowance in millimetres, below half the pitch.
|
|
20
|
+
* @param role - Male ridge to narrow or female cutter ridge to widen.
|
|
17
21
|
*/
|
|
18
22
|
export function compensateThreadProfileAxially(profile, axialBacklash, role) {
|
|
19
23
|
const operation = "compensateThreadProfileAxially";
|
|
@@ -92,6 +96,12 @@ export function scaleThreadProfileRadially(profile, scale) {
|
|
|
92
96
|
* This helper distributes the full conservative flank clearance between the male crest and female
|
|
93
97
|
* root according to their available flat widths, and rejects a resolution that cannot represent
|
|
94
98
|
* it exactly.
|
|
99
|
+
*
|
|
100
|
+
* @param profile - Uncompensated `[axial, radial]` profile in millimetres.
|
|
101
|
+
* @param axialBacklash - Nonnegative total pair allowance in millimetres, below half the pitch.
|
|
102
|
+
* @param role - Male ridge or female cutter receiving its share of the allowances.
|
|
103
|
+
* @param starts - Integer start count from 1 through 32.
|
|
104
|
+
* @param circularSegments - Full-circle facet count, at least 3 and divisible by starts.
|
|
95
105
|
*/
|
|
96
106
|
export function compensateThreadProfileForFaceting(profile, axialBacklash, role, starts, circularSegments) {
|
|
97
107
|
const operation = "compensateThreadProfileForFaceting";
|
|
@@ -235,8 +245,12 @@ const standardProfile = (kind, pitch, depth, root, crest, leftRun, rightRun) =>
|
|
|
235
245
|
* values point toward the shaft. Custom paths must be finite, axially
|
|
236
246
|
* non-decreasing, periodic at their endpoints, and reach radial zero.
|
|
237
247
|
*
|
|
248
|
+
* @param spec - Profile family or custom one-pitch `[axial, radial]` path, in millimetres.
|
|
249
|
+
*
|
|
238
250
|
* @example Printable triangular thread profile
|
|
239
251
|
* ```ts
|
|
252
|
+
* import { threadProfile } from "@metamesh/modeling/geometry/mechanical";
|
|
253
|
+
*
|
|
240
254
|
* threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
241
255
|
* ```
|
|
242
256
|
*/
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { GeometryError } from "../../errors.js";
|
|
2
|
-
import { resolveCircularSegments } from "../../resolution.js";
|
|
2
|
+
import { resolveCircularSegments } from "../../sampling/resolution.js";
|
|
3
3
|
import { resolveGeometryTolerance } from "../../tolerance.js";
|
|
4
|
-
import { compensateThreadDiameters, preflightThreadSolidMesh, resolveThreadCircularSegments, } from "../index.js";
|
|
5
4
|
import { resolveBevel } from "./bevel.js";
|
|
5
|
+
import { compensateThreadDiameters, resolveThreadCircularSegments, } from "./fit.js";
|
|
6
|
+
import { preflightThreadSolidMesh, } from "./mesh-plan.js";
|
|
6
7
|
import { compensateThreadProfileForFaceting, scaleThreadProfileRadially } from "./profiles.js";
|
|
7
8
|
const THREAD_FACETING_MARGIN = 0.001;
|
|
8
9
|
const resolveCompensatedThreadBevelSize = (role, compensated, style, depth) => {
|
|
@@ -11,6 +12,7 @@ const resolveCompensatedThreadBevelSize = (role, compensated, style, depth) => {
|
|
|
11
12
|
const envelopeDiameter = role === "female" ? compensated.majorDiameter : compensated.minorDiameter;
|
|
12
13
|
return envelopeDiameter / 12;
|
|
13
14
|
};
|
|
15
|
+
/** @internal Applies shared mating allowances before role-specific bevel and mesh planning. */
|
|
14
16
|
export const resolveCompensatedThreadSolidMesh = (options, role) => {
|
|
15
17
|
const compensated = compensateThreadDiameters({
|
|
16
18
|
nominalMajorDiameter: options.nominalMajorDiameter,
|
|
@@ -97,6 +99,8 @@ const preflightCompensatedThreadSolid = (options, role) => preflightThreadSolidM
|
|
|
97
99
|
*
|
|
98
100
|
* See `mesh.preflightThreadSolid` for standalone mesh estimates.
|
|
99
101
|
* See `mesh.threadSolid` for standalone mesh construction.
|
|
102
|
+
*
|
|
103
|
+
* @param options - Nominal rod dimensions in millimetres, fit, and sampling controls.
|
|
100
104
|
*/
|
|
101
105
|
export function preflightThreadedRodSolid(options) {
|
|
102
106
|
return preflightCompensatedThreadSolid(options, "male");
|
|
@@ -111,6 +115,8 @@ export function preflightThreadedRodSolid(options) {
|
|
|
111
115
|
*
|
|
112
116
|
* See `mesh.preflightThreadSolid` for standalone mesh estimates.
|
|
113
117
|
* See `mesh.threadSolid` for standalone mesh construction.
|
|
118
|
+
*
|
|
119
|
+
* @param options - Nominal cavity dimensions in millimetres, before fit and face extension.
|
|
114
120
|
*/
|
|
115
121
|
export function preflightInternalThreadCutterSolid(options) {
|
|
116
122
|
return preflightCompensatedThreadSolid(options, "female");
|
|
@@ -121,6 +127,7 @@ const throwInvalidNutScalar = (label, parameter, requirement, operation) => {
|
|
|
121
127
|
details: { parameter },
|
|
122
128
|
});
|
|
123
129
|
};
|
|
130
|
+
/** @internal Checks nut faces and plans the compensated cutter before native allocation. */
|
|
124
131
|
export const resolveThreadedNutSolid = (options, operation) => {
|
|
125
132
|
// Keep these public boundary checks ahead of resolution and all Manifold body construction.
|
|
126
133
|
if (!Number.isFinite(options.width) || !(options.width > 0)) {
|
|
@@ -218,6 +225,8 @@ export const resolveThreadedNutSolid = (options, operation) => {
|
|
|
218
225
|
* Successful preflight leaves mesh validity, native construction, and manufacturing fit to later checks.
|
|
219
226
|
*
|
|
220
227
|
* See `mesh.preflightThreadSolid` for standalone mesh estimates.
|
|
228
|
+
*
|
|
229
|
+
* @param options - Nominal nut dimensions in millimetres, fit, and sampling controls.
|
|
221
230
|
*/
|
|
222
231
|
export function preflightThreadedNutSolid(options) {
|
|
223
232
|
return resolveThreadedNutSolid(options, "preflightThreadedNutSolid").preflight;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Pure mechanical dimensions, fit policies, standards, and preflight calculations. @packageDocumentation */
|
|
2
|
+
export { preflightThreadedRodSolid as preflightThreadedRod, preflightInternalThreadCutterSolid as preflightInternalThreadCutter, preflightThreadedNutSolid as preflightThreadedNut, } from "./mechanical/threads/solids.js";
|
|
3
|
+
export { minimumCylindricalGearToothCountWithoutUndercut, resolveCylindricalGear, resolveCylindricalGearPair, resolveRackPitch, sampleCylindricalGearOutline, sampleInternalCylindricalGearSpaceOutline, sampleRackToothPath, } from "./mechanical/gears.js";
|
|
4
|
+
export { measureInternalCylindricalGearPairMotion, } from "./mechanical/gear-motion.js";
|
|
5
|
+
export { METRIC_FASTENER_STANDARDS, getMetricClearanceHoleDiameter, getMetricFastenerStandard, } from "./mechanical/fastener-standards.js";
|
|
6
|
+
export { compensateThreadProfileAxially, compensateThreadProfileForFaceting, threadProfile, } from "./mechanical/threads/profiles.js";
|
|
7
|
+
export {} from "./mechanical/threads/mesh-plan.js";
|
|
8
|
+
export { sampleConventionalThreadHelices as sampleThreadHelices, } from "./mechanical/threads/helices.js";
|
|
9
|
+
export { PRINTABLE_THREAD_FIT_POLICIES, compensateThreadDiameters, resolvePrintableThreadFitPolicy, resolveThreadCircularSegments, } from "./mechanical/threads/fit.js";
|
|
10
|
+
export { resolveKnuckleHinge, } from "./mechanical/knuckle-hinge.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { immutableMeshView } from "../immutable-buffer.js";
|
|
3
|
-
import { analyzeTriangleMesh } from "./
|
|
3
|
+
import { analyzeTriangleMesh } from "./operations.js";
|
|
4
4
|
/**
|
|
5
5
|
* Computes the uniform-density volume centroid of an oriented closed solid, including cavity shells.
|
|
6
6
|
*
|
|
@@ -16,6 +16,7 @@ export function computeTriangleMeshCentroid(mesh) {
|
|
|
16
16
|
const facts = analyzeTriangleMesh(source, { requireClosed: true });
|
|
17
17
|
if (!(facts.signedVolume > 0))
|
|
18
18
|
throw new GeometryError("INVALID_TOPOLOGY", "A volume centroid requires positive oriented volume.", { operation: "computeTriangleMeshCentroid" });
|
|
19
|
+
// Translate tetrahedra near the mesh before summing moments to limit cancellation at large offsets.
|
|
19
20
|
const origin = facts.bounds.min;
|
|
20
21
|
const totals = [0, 0, 0], corrections = [0, 0, 0];
|
|
21
22
|
for (let offset = 0; offset < source.indices.length; offset += 3) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { writeMeshVertex } from "./
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../limits.js";
|
|
3
|
+
import { vector2Data } from "../math/vector-value.js";
|
|
4
|
+
import { validateTriangleMesh } from "./operations.js";
|
|
5
|
+
import { writeMeshVertex } from "./write-vertex.js";
|
|
6
6
|
function planHeightfield(options, limits) {
|
|
7
7
|
const operation = "preflightHeightfield";
|
|
8
8
|
if (typeof options !== "object" ||
|
|
@@ -82,6 +82,8 @@ function planHeightfield(options, limits) {
|
|
|
82
82
|
* Successful preflight leaves height values, Float32 base storage, and generated mesh validity to
|
|
83
83
|
* construction. `byteCount` covers position and index buffers, not total working memory.
|
|
84
84
|
*
|
|
85
|
+
* @param options - Grid in millimetres; the height callback is not evaluated.
|
|
86
|
+
*
|
|
85
87
|
* @see `mesh.heightfield`
|
|
86
88
|
*/
|
|
87
89
|
export function preflightHeightfield(options, limits = {}) {
|
|
@@ -94,6 +96,8 @@ export function preflightHeightfield(options, limits = {}) {
|
|
|
94
96
|
* Top winding is +Z, the base is -Z, and sides face outward. Coordinates and heights must fit
|
|
95
97
|
* Float32 storage. Explicit axes are captured before sampling; shared wall vertices prevent cracks.
|
|
96
98
|
*
|
|
99
|
+
* @param options - Grid and absolute height callback in millimetres.
|
|
100
|
+
*
|
|
97
101
|
* @see `mesh.preflightHeightfield`
|
|
98
102
|
*
|
|
99
103
|
* @example Sample a closed wavy mesh
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import { assertMeshAllocationWithinLimits } from "
|
|
3
|
-
import { signedContourArea } from "
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { assertMeshAllocationWithinLimits } from "../limits.js";
|
|
3
|
+
import { signedContourArea } from "../regions/operations.js";
|
|
4
4
|
/** @internal One bounded traversal budget for connection arrangement and meshing. */
|
|
5
5
|
export class JoinWork {
|
|
6
6
|
count;
|
|
@@ -23,9 +23,12 @@ export function clipJoinPolygon(polygon, plane) {
|
|
|
23
23
|
}
|
|
24
24
|
function clipJoinHalfPlane(polygon, distance) {
|
|
25
25
|
const output = [];
|
|
26
|
+
if (polygon.length === 0)
|
|
27
|
+
return output;
|
|
28
|
+
let da = distance(polygon[0]);
|
|
26
29
|
for (let i = 0; i < polygon.length; i++) {
|
|
27
30
|
const a = polygon[i], b = polygon[(i + 1) % polygon.length];
|
|
28
|
-
const
|
|
31
|
+
const db = distance(b);
|
|
29
32
|
const aInside = da >= 0, bInside = db >= 0;
|
|
30
33
|
if (aInside)
|
|
31
34
|
output.push(a);
|
|
@@ -33,6 +36,7 @@ function clipJoinHalfPlane(polygon, distance) {
|
|
|
33
36
|
const t = da / (da - db);
|
|
34
37
|
output.push([a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]);
|
|
35
38
|
}
|
|
39
|
+
da = db;
|
|
36
40
|
}
|
|
37
41
|
return output;
|
|
38
42
|
}
|
|
@@ -232,7 +236,8 @@ export function createJoinPolygonIndex(polygons, work, limits) {
|
|
|
232
236
|
return result;
|
|
233
237
|
};
|
|
234
238
|
}
|
|
235
|
-
/**
|
|
239
|
+
/**
|
|
240
|
+
* @internal Prepare one conforming XY partition for proof and visible layers at different heights.
|
|
236
241
|
* Shared construction vertices are captured once; this does not weld or repair an input mesh.
|
|
237
242
|
*/
|
|
238
243
|
export function prepareJoinLayer(polygons, epsilon, limits, work, options = {}) {
|
|
@@ -389,23 +394,16 @@ export function prepareJoinLayer(polygons, epsilon, limits, work, options = {})
|
|
|
389
394
|
});
|
|
390
395
|
for (let i = 0; i < face.length; i++) {
|
|
391
396
|
const a = face[i], b = face[(i + 1) % face.length];
|
|
392
|
-
|
|
393
|
-
const edge = edges.get(key);
|
|
394
|
-
if (edge === undefined)
|
|
395
|
-
edges.set(key, { a, b, count: 1 });
|
|
396
|
-
else if (edge.a !== b || edge.b !== a || edge.count !== 1)
|
|
397
|
-
throw new GeometryError("INVALID_TOPOLOGY", "Join partition cells reverse or repeat a shared boundary.", {
|
|
398
|
-
operation: "join",
|
|
399
|
-
details: { x1: points[a][0], y1: points[a][1], x2: points[b][0], y2: points[b][1] },
|
|
400
|
-
});
|
|
401
|
-
else
|
|
402
|
-
edge.count++;
|
|
397
|
+
appendJoinEdge(edges, a, b, points);
|
|
403
398
|
}
|
|
404
399
|
}
|
|
400
|
+
// Affine support caps can drop transverse cell edges. The sampled top keeps
|
|
401
|
+
// every cell because its heights can vary within a single support group.
|
|
405
402
|
if (options.triangulate !== undefined)
|
|
406
403
|
appendJoinCaps(faces, cells.map((cell) => cell.group), points, options.triangulate, (a, b, c) => triangle(bottomTriangles, a, b, c), work);
|
|
407
404
|
const realize = (top, bottom, maximumLength, upperTriangles) => {
|
|
408
405
|
const positions = [], nativePositions = [], indices = [];
|
|
406
|
+
// Each upper vertex is immediately followed by its lower partner.
|
|
409
407
|
const vertices = new Map();
|
|
410
408
|
const vertex = (id) => {
|
|
411
409
|
const cached = vertices.get(id);
|
|
@@ -415,38 +413,27 @@ export function prepareJoinLayer(polygons, epsilon, limits, work, options = {})
|
|
|
415
413
|
const native = nativePoints[id], nativeHi = top(native, nativeSupportHeights?.[id]), nativeLo = bottom(native, nativeSupportHeights?.[id]);
|
|
416
414
|
if (![hi, lo, nativeHi, nativeLo].every(Number.isFinite) || hi <= lo || nativeHi <= nativeLo)
|
|
417
415
|
throw new GeometryError("DEGENERATE_GEOMETRY", "Join layer needs resolved positive thickness.", { operation: "join" });
|
|
418
|
-
const
|
|
416
|
+
const upper = positions.length / 3;
|
|
419
417
|
assertMeshAllocationWithinLimits(positions.length / 3 + 2, indices.length / 3, (positions.length + 6) * 12 + indices.length * 4, "join", limits);
|
|
420
418
|
positions.push(p[0], p[1], hi, p[0], p[1], lo);
|
|
421
419
|
nativePositions.push(native[0], native[1], nativeHi, native[0], native[1], nativeLo);
|
|
422
|
-
vertices.set(id,
|
|
423
|
-
return
|
|
420
|
+
vertices.set(id, upper);
|
|
421
|
+
return upper;
|
|
424
422
|
};
|
|
425
423
|
const append = (a, b, c) => {
|
|
426
424
|
assertMeshAllocationWithinLimits(positions.length / 3, indices.length / 3 + 1, positions.length * 12 + (indices.length + 3) * 4, "join", limits);
|
|
427
425
|
indices.push(a, b, c);
|
|
428
426
|
};
|
|
429
427
|
for (let i = 0; i < upperTriangles.length; i += 3)
|
|
430
|
-
append(vertex(upperTriangles[i])
|
|
428
|
+
append(vertex(upperTriangles[i]), vertex(upperTriangles[i + 1]), vertex(upperTriangles[i + 2]));
|
|
431
429
|
for (let i = 0; i < bottomTriangles.length; i += 3)
|
|
432
|
-
append(vertex(bottomTriangles[i])
|
|
430
|
+
append(vertex(bottomTriangles[i]) + 1, vertex(bottomTriangles[i + 1]) + 1, vertex(bottomTriangles[i + 2]) + 1);
|
|
433
431
|
for (const edge of edges.values()) {
|
|
434
|
-
if (edge.
|
|
432
|
+
if (edge.paired)
|
|
435
433
|
continue;
|
|
436
|
-
if (edge.count !== 1)
|
|
437
|
-
throw new GeometryError("INVALID_TOPOLOGY", "Join chart partition overlaps.", {
|
|
438
|
-
operation: "join",
|
|
439
|
-
details: {
|
|
440
|
-
count: edge.count,
|
|
441
|
-
x1: points[edge.a][0],
|
|
442
|
-
y1: points[edge.a][1],
|
|
443
|
-
x2: points[edge.b][0],
|
|
444
|
-
y2: points[edge.b][1],
|
|
445
|
-
},
|
|
446
|
-
});
|
|
447
434
|
const a = vertex(edge.a), b = vertex(edge.b);
|
|
448
|
-
append(a
|
|
449
|
-
append(a
|
|
435
|
+
append(a, a + 1, b + 1);
|
|
436
|
+
append(a, b + 1, b);
|
|
450
437
|
}
|
|
451
438
|
assertMeshAllocationWithinLimits(positions.length / 3, indices.length / 3, positions.length * 12 + indices.length * 4, "join", limits);
|
|
452
439
|
// Coarse caps need no unused partners for fine top interior vertices.
|
|
@@ -477,7 +464,7 @@ export function prepareJoinLayer(polygons, epsilon, limits, work, options = {})
|
|
|
477
464
|
throw new GeometryError("DEGENERATE_GEOMETRY", "Join layer thickness exceeds coordinate precision.", { operation: "join" });
|
|
478
465
|
compactIndices.push(a, b, c);
|
|
479
466
|
}
|
|
480
|
-
return refineJoinLayer(
|
|
467
|
+
return refineJoinLayer(compact, compactNative, compactIndices, maximumLength, limits, work);
|
|
481
468
|
};
|
|
482
469
|
return {
|
|
483
470
|
build: (top, bottom, maximumLength) => realize(top, bottom, maximumLength, topTriangles),
|
|
@@ -660,6 +647,27 @@ function triangulateJoinCell(face, points, work, append) {
|
|
|
660
647
|
operation: "join",
|
|
661
648
|
});
|
|
662
649
|
}
|
|
650
|
+
// Shared edges must occur exactly twice with opposite winding, in both the full
|
|
651
|
+
// partition and each cap group. Keep paired records so a third use still rejects.
|
|
652
|
+
function appendJoinEdge(edges, a, b, points) {
|
|
653
|
+
const key = `${Math.min(a, b)},${Math.max(a, b)}`;
|
|
654
|
+
const previous = edges.get(key);
|
|
655
|
+
if (previous === undefined)
|
|
656
|
+
edges.set(key, { a, b, paired: false });
|
|
657
|
+
else if (previous.a !== b || previous.b !== a || previous.paired)
|
|
658
|
+
throw new GeometryError("INVALID_TOPOLOGY", "Join partition cells reverse or repeat a shared boundary.", {
|
|
659
|
+
operation: "join",
|
|
660
|
+
details: {
|
|
661
|
+
count: previous.paired ? 2 : 1,
|
|
662
|
+
x1: points[a][0],
|
|
663
|
+
y1: points[a][1],
|
|
664
|
+
x2: points[b][0],
|
|
665
|
+
y2: points[b][1],
|
|
666
|
+
},
|
|
667
|
+
});
|
|
668
|
+
else
|
|
669
|
+
previous.paired = true;
|
|
670
|
+
}
|
|
663
671
|
function appendJoinCaps(faces, groups, points, triangulate, append, work) {
|
|
664
672
|
const grouped = new Map();
|
|
665
673
|
for (let index = 0; index < faces.length; index++) {
|
|
@@ -673,27 +681,11 @@ function appendJoinCaps(faces, groups, points, triangulate, append, work) {
|
|
|
673
681
|
for (let i = 0; i < face.length; i++) {
|
|
674
682
|
work.use();
|
|
675
683
|
const a = face[i], b = face[(i + 1) % face.length];
|
|
676
|
-
|
|
677
|
-
const previous = edges.get(key);
|
|
678
|
-
if (previous === undefined)
|
|
679
|
-
edges.set(key, { a, b, count: 1 });
|
|
680
|
-
else if (previous.a !== b || previous.b !== a || previous.count !== 1)
|
|
681
|
-
throw new GeometryError("INVALID_TOPOLOGY", "Join cap cells overlap or reverse lineage.", {
|
|
682
|
-
operation: "join",
|
|
683
|
-
details: {
|
|
684
|
-
count: previous.count,
|
|
685
|
-
x1: points[a][0],
|
|
686
|
-
y1: points[a][1],
|
|
687
|
-
x2: points[b][0],
|
|
688
|
-
y2: points[b][1],
|
|
689
|
-
},
|
|
690
|
-
});
|
|
691
|
-
else
|
|
692
|
-
previous.count = 2;
|
|
684
|
+
appendJoinEdge(edges, a, b, points);
|
|
693
685
|
}
|
|
694
686
|
}
|
|
695
687
|
for (const edges of grouped.values()) {
|
|
696
|
-
const boundary = [...edges.values()].filter((edge) => edge.
|
|
688
|
+
const boundary = [...edges.values()].filter((edge) => !edge.paired);
|
|
697
689
|
const outgoing = new Map();
|
|
698
690
|
for (const edge of boundary) {
|
|
699
691
|
const entries = outgoing.get(edge.a);
|
|
@@ -754,22 +746,24 @@ function appendJoinCaps(faces, groups, points, triangulate, append, work) {
|
|
|
754
746
|
}
|
|
755
747
|
}
|
|
756
748
|
}
|
|
757
|
-
function refineJoinLayer(
|
|
749
|
+
function refineJoinLayer(positions, nativePositions, initialIndices, maximumLength, limits, work) {
|
|
750
|
+
// Inputs are owned arrays with proxy positions already rounded to Float32.
|
|
751
|
+
// Keep native coordinates separate until both buffers are finalized.
|
|
758
752
|
if (maximumLength === undefined)
|
|
759
753
|
return {
|
|
760
|
-
positions:
|
|
761
|
-
nativePositions:
|
|
754
|
+
positions: Float32Array.from(positions),
|
|
755
|
+
nativePositions: Float64Array.from(nativePositions),
|
|
762
756
|
indices: Uint32Array.from(initialIndices),
|
|
763
757
|
};
|
|
764
758
|
if (!Number.isFinite(maximumLength) || maximumLength <= 0)
|
|
765
759
|
throw new GeometryError("INVALID_ARGUMENT", "Join segment length must be finite and positive.", {
|
|
766
760
|
operation: "join",
|
|
767
761
|
});
|
|
768
|
-
const positions = Array.from(initial);
|
|
769
|
-
const nativePositions = Array.from(initialNative);
|
|
770
762
|
let indices = initialIndices;
|
|
771
763
|
const key = (a, b) => (a < b ? `${a},${b}` : `${b},${a}`);
|
|
772
764
|
while (true) {
|
|
765
|
+
// Discover all splits before replacing faces so every incident triangle
|
|
766
|
+
// shares each edge midpoint, regardless of its other edge lengths.
|
|
773
767
|
const midpoints = new Map();
|
|
774
768
|
for (let i = 0; i < indices.length; i += 3) {
|
|
775
769
|
const face = [indices[i], indices[i + 1], indices[i + 2]];
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { immutableMeshView } from "../immutable-buffer.js";
|
|
3
|
-
import { writeMeshVertex } from "../numeric.js";
|
|
4
3
|
import { resolveGeometryTolerance } from "../tolerance.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { IndexedMeshEdgeTable } from "./
|
|
4
|
+
import { transformDeterminant3, validateTransform3 } from "../transforms/affine3.js";
|
|
5
|
+
import { readTransformMatrix } from "../transforms/matrix-input.js";
|
|
6
|
+
import { IndexedMeshEdgeTable } from "./edge-table.js";
|
|
7
|
+
import { reverseOwnedTriangleWinding } from "./winding.js";
|
|
8
|
+
import { writeMeshVertex } from "./write-vertex.js";
|
|
8
9
|
function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = false) {
|
|
9
10
|
// Normalize immutable storage and read raw input accessors once before traversal.
|
|
10
11
|
const source = immutableMeshView(mesh);
|
|
@@ -77,6 +78,7 @@ function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = f
|
|
|
77
78
|
};
|
|
78
79
|
// Keep the two hot-loop accumulators independent and local: no mutable numeric objects escape.
|
|
79
80
|
let surfaceArea = 0, areaCorrection = 0, signedVolume = 0, volumeCorrection = 0;
|
|
81
|
+
// A local tetrahedron origin limits cancellation when the mesh has a large world offset.
|
|
80
82
|
const originX = source.positions[0] ?? 0, originY = source.positions[1] ?? 0, originZ = source.positions[2] ?? 0;
|
|
81
83
|
for (let offset = 0; offset < source.indices.length; offset += 3) {
|
|
82
84
|
const a = source.indices[offset], b = source.indices[offset + 1], c = source.indices[offset + 2];
|
|
@@ -157,7 +159,7 @@ export function analyzeTriangleMesh(mesh, options = {}) {
|
|
|
157
159
|
* and non-manifold edges. It establishes edge connectivity without detecting geometric
|
|
158
160
|
* self-intersections between faces. The mesh is neither mutated nor copied.
|
|
159
161
|
*
|
|
160
|
-
* @param mesh -
|
|
162
|
+
* @param mesh - Raw or captured indexed buffers with complete finite XYZ vertices.
|
|
161
163
|
* @param options - Empty-mesh, topology, and tolerance policy.
|
|
162
164
|
* @returns The original mesh after successful validation.
|
|
163
165
|
* @throws `GeometryError` When any requested invariant fails.
|
|
@@ -222,11 +224,7 @@ export function reverseTriangleMesh(mesh) {
|
|
|
222
224
|
const source = immutableMeshView(mesh);
|
|
223
225
|
validateTriangleMesh(source);
|
|
224
226
|
const indices = new Uint32Array(source.indices);
|
|
225
|
-
|
|
226
|
-
const second = indices[offset + 1];
|
|
227
|
-
indices[offset + 1] = indices[offset + 2];
|
|
228
|
-
indices[offset + 2] = second;
|
|
229
|
-
}
|
|
227
|
+
reverseOwnedTriangleWinding(indices);
|
|
230
228
|
return { indices, positions: new Float32Array(source.positions) };
|
|
231
229
|
}
|
|
232
230
|
/**
|
|
@@ -236,7 +234,7 @@ export function reverseTriangleMesh(mesh) {
|
|
|
236
234
|
* automatically reverses every triangle. Singular transforms are rejected.
|
|
237
235
|
*
|
|
238
236
|
* @param mesh - Mesh to transform without mutation.
|
|
239
|
-
* @param placement -
|
|
237
|
+
* @param placement - Frame, fluent transform, or row-major affine matrix.
|
|
240
238
|
* @returns A mesh with fresh transformed positions and copied or reversed indices.
|
|
241
239
|
*/
|
|
242
240
|
export function transformTriangleMesh(mesh, placement) {
|
|
@@ -256,12 +254,7 @@ export function transformTriangleMesh(mesh, placement) {
|
|
|
256
254
|
], "transformTriangleMesh");
|
|
257
255
|
}
|
|
258
256
|
const indices = new Uint32Array(source.indices);
|
|
259
|
-
if (transformDeterminant3(transform) < 0)
|
|
260
|
-
|
|
261
|
-
const second = indices[offset + 1];
|
|
262
|
-
indices[offset + 1] = indices[offset + 2];
|
|
263
|
-
indices[offset + 2] = second;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
257
|
+
if (transformDeterminant3(transform) < 0)
|
|
258
|
+
reverseOwnedTriangleWinding(indices);
|
|
266
259
|
return validateTriangleMesh({ indices, positions });
|
|
267
260
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { immutableMeshView, isImmutableBuffer } from "../immutable-buffer.js";
|
|
3
|
-
import { buildTriangleMeshQualityAnalysis, } from "./
|
|
3
|
+
import { buildTriangleMeshQualityAnalysis, } from "./quality.js";
|
|
4
|
+
import { triangleQuality } from "./triangle-quality.js";
|
|
4
5
|
const DEFAULT_MAXIMUM_FLIP_ATTEMPTS = 1_000_000;
|
|
5
6
|
const DEFAULT_MAXIMUM_PATCH_TRIANGLE_COUNT = 50_000;
|
|
6
7
|
const DEFAULT_MAXIMUM_PROCESSED_TRIANGLE_COUNT = 200_000;
|
|
@@ -17,6 +18,8 @@ const pointAt = (positions, vertex) => [
|
|
|
17
18
|
positions[vertex * 3 + 1],
|
|
18
19
|
positions[vertex * 3 + 2],
|
|
19
20
|
];
|
|
21
|
+
// Keep these kernels local to isolate V8's array-type feedback from other modeling operations.
|
|
22
|
+
// Shared helpers see more array representations, which can slow hot loops even when inlined.
|
|
20
23
|
const subtract = (left, right) => [
|
|
21
24
|
left[0] - right[0],
|
|
22
25
|
left[1] - right[1],
|
|
@@ -70,22 +73,9 @@ const pairQuality = (positions, first, second) => {
|
|
|
70
73
|
let maximumAspectRatio = 0;
|
|
71
74
|
for (const triangle of [first, second]) {
|
|
72
75
|
const points = triangle.map((vertex) => pointAt(positions, vertex));
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
subtract(points[0], points[2]),
|
|
77
|
-
];
|
|
78
|
-
const edgeSquaredLengths = edgeVectors.map(squaredLength);
|
|
79
|
-
const doubleArea = Math.sqrt(squaredLength(cross(edgeVectors[0], subtract(points[2], points[0]))));
|
|
80
|
-
maximumAspectRatio = Math.max(maximumAspectRatio, doubleArea === 0
|
|
81
|
-
? Number.POSITIVE_INFINITY
|
|
82
|
-
: (Math.sqrt(3) * Math.max(...edgeSquaredLengths)) / (2 * doubleArea));
|
|
83
|
-
for (let corner = 0; corner < 3; corner += 1) {
|
|
84
|
-
const origin = points[corner];
|
|
85
|
-
const incoming = subtract(points[(corner + 1) % 3], origin);
|
|
86
|
-
const outgoing = subtract(points[(corner + 2) % 3], origin);
|
|
87
|
-
angles.push(Math.atan2(Math.sqrt(squaredLength(cross(incoming, outgoing))), dot(incoming, outgoing)));
|
|
88
|
-
}
|
|
76
|
+
const quality = triangleQuality(points[0], points[1], points[2], "squared");
|
|
77
|
+
maximumAspectRatio = Math.max(maximumAspectRatio, quality.aspectRatio);
|
|
78
|
+
angles.push(...quality.angles);
|
|
89
79
|
}
|
|
90
80
|
angles.sort((left, right) => left - right);
|
|
91
81
|
return { angles, maximumAspectRatio };
|
|
@@ -170,7 +160,7 @@ const fallbackReasonForCandidate = (before, after, boundaryEdgeKeys) => {
|
|
|
170
160
|
* original raw mesh object. Immutable inputs produce owned raw output buffers, including unchanged
|
|
171
161
|
* results. Malformed buffers and the configured analysis complexity limit throw.
|
|
172
162
|
*
|
|
173
|
-
* @param mesh - Closed, consistently wound
|
|
163
|
+
* @param mesh - Closed, consistently wound mesh in consistent units.
|
|
174
164
|
* @param options - Patch eligibility, numeric tolerance, and deterministic work bounds.
|
|
175
165
|
* @returns Optimized connectivity and before/after diagnostics, or an unchanged safe fallback.
|
|
176
166
|
*/
|