@metamesh/modeling 0.14.0 → 0.16.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 +61 -0
- package/README.md +55 -13
- package/dist/api/engine.d.ts +15 -7
- package/dist/api/geometry.d.ts +853 -562
- package/dist/api/index.d.ts +604 -227
- package/dist/api/text.d.ts +9 -7
- package/dist/docs/guides/concepts.md +295 -91
- package/dist/docs/guides/fonts.md +9 -8
- package/dist/docs/guides/fundamentals.md +22 -23
- package/dist/docs/guides/generation.md +24 -23
- package/dist/docs/guides/hosting.md +26 -11
- package/dist/docs/guides/recipes.md +74 -48
- package/dist/docs/guides/standalone-model.md +42 -0
- package/dist/docs/manifest.json +1555 -749
- package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
- package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
- package/dist/docs/reference/engine/GenerationOptions.md +1 -1
- package/dist/docs/reference/engine/GeometryResource.md +1 -1
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +1 -1
- package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +21 -10
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +6 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +7 -2
- package/dist/docs/reference/engine/createModelEngine.md +3 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine/validateModel.md +1 -1
- package/dist/docs/reference/engine.md +6 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +6 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +11 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +13 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +11 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +2 -1
- package/dist/docs/reference/geometry/Bounds2-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds2Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds2Input.md +21 -0
- package/dist/docs/reference/geometry/Bounds3-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds3Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds3Input.md +21 -0
- package/dist/docs/reference/geometry/BoundsFit2.md +6 -5
- package/dist/docs/reference/geometry/BoundsFit3.md +6 -5
- package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +5 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +10 -10
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +8 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +5 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -7
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +6 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +6 -1
- package/dist/docs/reference/geometry/Contour.md +10 -4
- package/dist/docs/reference/geometry/ContourCurve.md +5 -1
- package/dist/docs/reference/geometry/ContourPoint.md +6 -1
- package/dist/docs/reference/geometry/ContourSegment.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +5 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +10 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +10 -6
- package/dist/docs/reference/geometry/Curve2.md +5 -1
- package/dist/docs/reference/geometry/Curve3.md +5 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +9 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +7 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +6 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +7 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +6 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +11 -6
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +7 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +10 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +7 -3
- package/dist/docs/reference/geometry/Frame3.md +10 -6
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +5 -5
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +5 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +9 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +9 -4
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +9 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +10 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +7 -2
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +4 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +10 -6
- package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +82 -0
- package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +148 -0
- package/dist/docs/reference/geometry/KnuckleHingeInterval.md +46 -0
- package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +51 -0
- package/dist/docs/reference/geometry/KnuckleHingeSpec.md +22 -0
- package/dist/docs/reference/geometry/LineCurve2.md +8 -4
- package/dist/docs/reference/geometry/LineCurve3.md +8 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +8 -4
- package/dist/docs/reference/geometry/LoftOptions.md +5 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +5 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +5 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +5 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +9 -2
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +6 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +6 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +5 -1
- package/dist/docs/reference/geometry/Path2-type.md +196 -0
- package/dist/docs/reference/geometry/Path2Data.md +50 -0
- package/dist/docs/reference/geometry/Path2Input.md +20 -0
- package/dist/docs/reference/geometry/Path3-type.md +196 -0
- package/dist/docs/reference/geometry/Path3Data.md +50 -0
- package/dist/docs/reference/geometry/Path3Input.md +20 -0
- package/dist/docs/reference/geometry/PathFrame.md +9 -5
- package/dist/docs/reference/geometry/PathLocation.md +69 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +10 -5
- package/dist/docs/reference/geometry/PathOptions.md +38 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +8 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +84 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +2 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +2 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +8 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +26 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +5 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +7 -3
- package/dist/docs/reference/geometry/PolygonData.md +7 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -4
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +8 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +6 -1
- package/dist/docs/reference/geometry/Profile.md +8 -2
- package/dist/docs/reference/geometry/ProfileComponent2.md +5 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +8 -2
- package/dist/docs/reference/geometry/ProfileSpan2.md +7 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +6 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +10 -5
- package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +7 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +5 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +5 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +7 -3
- package/dist/docs/reference/geometry/RegionData.md +6 -2
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +7 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +13 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +7 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +7 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +8 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +8 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +7 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +5 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +6 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +5 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +7 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/StrokeCap.md +14 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +14 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +11 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +5 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +6 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +19 -15
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +16 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +14 -9
- package/dist/docs/reference/geometry/SweepOptions.md +10 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +11 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +9 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +8 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +8 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +7 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +7 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadRole.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +10 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +7 -3
- package/dist/docs/reference/geometry/ThreadedNutShape.md +8 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +10 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +6 -5
- package/dist/docs/reference/geometry/Transform2Data.md +15 -0
- package/dist/docs/reference/geometry/Transform2Input.md +4 -3
- package/dist/docs/reference/geometry/Transform3-type.md +6 -5
- package/dist/docs/reference/geometry/Transform3Data.md +18 -0
- package/dist/docs/reference/geometry/Transform3Input.md +4 -3
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +9 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +8 -4
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +8 -4
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +8 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +6 -5
- package/dist/docs/reference/geometry/Vector2Data.md +15 -0
- package/dist/docs/reference/geometry/Vector2Input.md +4 -3
- package/dist/docs/reference/geometry/Vector3-type.md +6 -5
- package/dist/docs/reference/geometry/Vector3Data.md +15 -0
- package/dist/docs/reference/geometry/Vector3Input.md +4 -3
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +8 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +5 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +7 -3
- package/dist/docs/reference/geometry/VectorTextOptions.md +5 -1
- package/dist/docs/reference/geometry/add2.md +7 -6
- package/dist/docs/reference/geometry/add3.md +7 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +6 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +10 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +9 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
- package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +16 -15
- package/dist/docs/reference/geometry/bounds2.md +38 -0
- package/dist/docs/reference/geometry/bounds3.md +38 -0
- package/dist/docs/reference/geometry/boundsCenter.md +12 -11
- package/dist/docs/reference/geometry/boundsFromSize.md +12 -11
- package/dist/docs/reference/geometry/boundsSize.md +12 -11
- package/dist/docs/reference/geometry/boxAnchor3.md +7 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +23 -6
- package/dist/docs/reference/geometry/categories/curves-paths.md +27 -13
- package/dist/docs/reference/geometry/categories/mechanical.md +27 -15
- package/dist/docs/reference/geometry/categories/meshes.md +18 -10
- package/dist/docs/reference/geometry/categories/pattern-placement.md +11 -9
- package/dist/docs/reference/geometry/categories/primitive-options.md +10 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -13
- package/dist/docs/reference/geometry/categories/resolution-errors.md +5 -3
- package/dist/docs/reference/geometry/categories/transforms-math.md +25 -16
- package/dist/docs/reference/geometry/categories/vector-import.md +15 -9
- package/dist/docs/reference/geometry/circleContour.md +5 -1
- package/dist/docs/reference/geometry/closeToAxis.md +14 -5
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +5 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +9 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +9 -5
- package/dist/docs/reference/geometry/composeTransform3.md +7 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +14 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +17 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +8 -4
- package/dist/docs/reference/geometry/containsBounds.md +10 -9
- package/dist/docs/reference/geometry/contourContainsPoint.md +8 -4
- package/dist/docs/reference/geometry/cross2.md +6 -5
- package/dist/docs/reference/geometry/cross3.md +7 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +7 -6
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/distance2.md +6 -5
- package/dist/docs/reference/geometry/distance3.md +6 -5
- package/dist/docs/reference/geometry/distributeAlongPath.md +12 -6
- package/dist/docs/reference/geometry/dot2.md +6 -5
- package/dist/docs/reference/geometry/dot3.md +6 -5
- package/dist/docs/reference/geometry/ellipseContour.md +5 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +7 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +12 -8
- package/dist/docs/reference/geometry/fitBounds.md +10 -9
- package/dist/docs/reference/geometry/fitTextLayout.md +13 -5
- package/dist/docs/reference/geometry/frameTransform3.md +5 -4
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +7 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +9 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +9 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +6 -5
- package/dist/docs/reference/geometry/isGeometryError.md +5 -2
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +5 -1
- package/dist/docs/reference/geometry/layoutRow.md +11 -7
- package/dist/docs/reference/geometry/length2.md +5 -4
- package/dist/docs/reference/geometry/length3.md +5 -4
- package/dist/docs/reference/geometry/lerp2.md +7 -6
- package/dist/docs/reference/geometry/lerp3.md +7 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/loftMesh.md +6 -1
- package/dist/docs/reference/geometry/matchProfiles.md +11 -2
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +5 -1
- package/dist/docs/reference/geometry/meshBounds.md +8 -4
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +7 -3
- package/dist/docs/reference/geometry/normalize2.md +10 -6
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +8 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -1
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +15 -11
- package/dist/docs/reference/geometry/path2.md +54 -0
- package/dist/docs/reference/geometry/path3.md +49 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +13 -9
- package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +13 -4
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +15 -4
- package/dist/docs/reference/geometry/preflightSvgRegion.md +15 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +14 -4
- package/dist/docs/reference/geometry/preflightThreadedRod.md +14 -4
- package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- package/dist/docs/reference/geometry/rectangleContour.md +10 -3
- package/dist/docs/reference/geometry/rectangleProfile.md +10 -2
- package/dist/docs/reference/geometry/regionArea.md +5 -1
- package/dist/docs/reference/geometry/regionBounds.md +8 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +9 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +9 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +9 -5
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +5 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +5 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +7 -3
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolveKnuckleHinge.md +59 -0
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +5 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +5 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/revolveMesh.md +14 -10
- package/dist/docs/reference/geometry/rotate2.md +6 -5
- package/dist/docs/reference/geometry/rotationTransform3.md +7 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -6
- package/dist/docs/reference/geometry/sampleContour.md +14 -4
- package/dist/docs/reference/geometry/sampleCurve2.md +8 -5
- package/dist/docs/reference/geometry/sampleCurve3.md +6 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleHelix.md +13 -5
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +17 -7
- package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +6 -2
- package/dist/docs/reference/geometry/scale2.md +6 -5
- package/dist/docs/reference/geometry/scale3.md +6 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +7 -6
- package/dist/docs/reference/geometry/signedContourArea.md +5 -1
- package/dist/docs/reference/geometry/starContour.md +8 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +67 -0
- package/dist/docs/reference/geometry/subtract2.md +7 -6
- package/dist/docs/reference/geometry/subtract3.md +7 -6
- package/dist/docs/reference/geometry/sweepMesh.md +13 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +10 -6
- package/dist/docs/reference/geometry/transform2.md +14 -7
- package/dist/docs/reference/geometry/transform3.md +16 -7
- package/dist/docs/reference/geometry/transformDeterminant3.md +5 -4
- package/dist/docs/reference/geometry/transformRegionData.md +5 -1
- package/dist/docs/reference/geometry/transformTriangleMesh.md +10 -6
- package/dist/docs/reference/geometry/translationTransform3.md +7 -6
- package/dist/docs/reference/geometry/triangulateContour.md +5 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +10 -3
- package/dist/docs/reference/geometry/validateTransform3.md +6 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/vector2.md +10 -2
- package/dist/docs/reference/geometry/vector3.md +10 -2
- package/dist/docs/reference/geometry.md +8 -6
- package/dist/docs/reference/model/Anchor3.md +6 -5
- package/dist/docs/reference/model/AttachOptions.md +11 -5
- package/dist/docs/reference/model/Bounds2-type.md +125 -0
- package/dist/docs/reference/model/Bounds2Data.md +44 -0
- package/dist/docs/reference/model/Bounds2Input.md +19 -0
- package/dist/docs/reference/model/Bounds3-type.md +125 -0
- package/dist/docs/reference/model/Bounds3Data.md +44 -0
- package/dist/docs/reference/model/Bounds3Input.md +19 -0
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +10 -10
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +6 -1
- package/dist/docs/reference/model/ComputedValue.md +5 -1
- package/dist/docs/reference/model/Contour.md +6 -4
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CylinderOptions.md +3 -3
- package/dist/docs/reference/model/DiagnosticOptions.md +6 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +3 -3
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/model/FinalizedModel.md +20 -10
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +6 -6
- package/dist/docs/reference/model/GenerateCallback.md +5 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -1
- package/dist/docs/reference/model/GeneratedPart.md +5 -1
- package/dist/docs/reference/model/GenerationDiagnostic.md +6 -1
- package/dist/docs/reference/model/GenerationError.md +5 -1
- package/dist/docs/reference/model/GeometryResolution.md +5 -5
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +12 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +4 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
- package/dist/docs/reference/model/HullOptions.md +5 -5
- package/dist/docs/reference/model/ImmutableBuffer-type.md +5 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +5 -1
- package/dist/docs/reference/model/ImplicitOptions.md +6 -6
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +5 -4
- package/dist/docs/reference/model/KnuckleHinge-type.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +77 -0
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +34 -0
- package/dist/docs/reference/model/KnuckleHingeOptions.md +38 -0
- package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeSpec.md +18 -0
- package/dist/docs/reference/model/KnuckleHingeWeb.md +53 -0
- package/dist/docs/reference/model/LinearPatternOptions.md +13 -5
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +1 -1
- package/dist/docs/reference/model/LoftPlacement.md +1 -1
- package/dist/docs/reference/model/LoftStation.md +3 -3
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +5 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +8 -1
- package/dist/docs/reference/model/PartGeometry.md +5 -1
- package/dist/docs/reference/model/PartOptions.md +5 -1
- package/dist/docs/reference/model/Path2-type.md +196 -0
- package/dist/docs/reference/model/Path2Data.md +50 -0
- package/dist/docs/reference/model/Path2Input.md +20 -0
- package/dist/docs/reference/model/Path3-type.md +196 -0
- package/dist/docs/reference/model/Path3Data.md +50 -0
- package/dist/docs/reference/model/Path3Input.md +20 -0
- package/dist/docs/reference/model/PathLocation.md +69 -0
- package/dist/docs/reference/model/PathNormalGuide.md +6 -5
- package/dist/docs/reference/model/PathOptions.md +38 -0
- package/dist/docs/reference/model/PathPatternOptions.md +4 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +83 -0
- package/dist/docs/reference/model/PatternSource.md +2 -1
- package/dist/docs/reference/model/Pivot2Options.md +2 -1
- package/dist/docs/reference/model/Pivot3Options.md +2 -1
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/PolygonData.md +3 -2
- package/dist/docs/reference/model/PolygonOptions.md +8 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +8 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +42 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +2 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +2 -1
- package/dist/docs/reference/model/Profile.md +4 -2
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +4 -2
- package/dist/docs/reference/model/ProfileSpan2.md +3 -3
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/model/RadialPatternOptions.md +18 -22
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +10 -10
- package/dist/docs/reference/model/RegionData.md +2 -2
- package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
- package/dist/docs/reference/model/RevolveOptions.md +9 -4
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +20 -12
- package/dist/docs/reference/model/SectionHullOptions.md +5 -5
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- package/dist/docs/reference/model/SectionOffsetJoin.md +1 -1
- package/dist/docs/reference/model/SectionOffsetOptions.md +1 -1
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +31 -7
- package/dist/docs/reference/model/SolidInspection.md +7 -7
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/{StrokePathCap.md → StrokeCap.md} +3 -3
- package/dist/docs/reference/model/{StrokePathJoin.md → StrokeJoin.md} +3 -3
- package/dist/docs/reference/model/StrokeOptions.md +6 -6
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
- package/dist/docs/reference/model/SweepOptions.md +6 -6
- package/dist/docs/reference/model/SweepOrientation.md +7 -7
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +2 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +2 -1
- package/dist/docs/reference/model/ThreadHandedness.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +2 -1
- package/dist/docs/reference/model/ThreadProfile.md +4 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +2 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +2 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +5 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +4 -3
- package/dist/docs/reference/model/ThreadedNutShape.md +2 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +5 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +6 -5
- package/dist/docs/reference/model/Transform2Data.md +16 -0
- package/dist/docs/reference/model/Transform2Input.md +4 -3
- package/dist/docs/reference/model/Transform3-type.md +6 -5
- package/dist/docs/reference/model/Transform3Data.md +19 -0
- package/dist/docs/reference/model/Transform3Input.md +4 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +4 -4
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +6 -5
- package/dist/docs/reference/model/{Vector2Tuple.md → Vector2Data.md} +3 -3
- package/dist/docs/reference/model/Vector2Input.md +4 -3
- package/dist/docs/reference/model/Vector3-type.md +6 -5
- package/dist/docs/reference/model/{Vector3Tuple.md → Vector3Data.md} +3 -3
- package/dist/docs/reference/model/Vector3Input.md +4 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +3 -3
- package/dist/docs/reference/model/anchor.md +2 -1
- package/dist/docs/reference/model/bounds2.md +36 -0
- package/dist/docs/reference/model/bounds3.md +36 -0
- package/dist/docs/reference/model/box.md +4 -4
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +10 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +5 -3
- package/dist/docs/reference/model/categories/bounds.md +36 -0
- package/dist/docs/reference/model/categories/contracts.md +4 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +11 -11
- package/dist/docs/reference/model/categories/explicit-profiles.md +7 -5
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +12 -3
- package/dist/docs/reference/model/categories/generation.md +11 -2
- package/dist/docs/reference/model/categories/hinges.md +38 -0
- package/dist/docs/reference/model/categories/inspection.md +12 -6
- package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
- package/dist/docs/reference/model/categories/paths.md +41 -0
- package/dist/docs/reference/model/categories/primitives.md +10 -4
- package/dist/docs/reference/model/categories/resolution.md +4 -2
- package/dist/docs/reference/model/categories/sections.md +12 -8
- package/dist/docs/reference/model/categories/threads.md +11 -8
- package/dist/docs/reference/model/categories/transforms-placement.md +23 -15
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +6 -6
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +1 -1
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +3 -3
- package/dist/docs/reference/model/generate.md +5 -1
- package/dist/docs/reference/model/gridPattern.md +5 -4
- package/dist/docs/reference/model/heightfield.md +5 -2
- package/dist/docs/reference/model/hull.md +1 -1
- package/dist/docs/reference/model/immutableBuffer.md +5 -1
- package/dist/docs/reference/model/immutableMesh.md +5 -1
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +5 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +1 -1
- package/dist/docs/reference/model/knuckleHinge.md +47 -0
- package/dist/docs/reference/model/linearPattern.md +5 -4
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +2 -2
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +54 -0
- package/dist/docs/reference/model/path3.md +49 -0
- package/dist/docs/reference/model/pathPattern.md +14 -12
- package/dist/docs/reference/model/polygon.md +8 -5
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +9 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +9 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +9 -3
- package/dist/docs/reference/model/radialPattern.md +6 -37
- package/dist/docs/reference/model/rectangle.md +7 -4
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +8 -8
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +1 -1
- package/dist/docs/reference/model/sweep.md +7 -7
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +3 -2
- package/dist/docs/reference/model/threadedNut.md +5 -4
- package/dist/docs/reference/model/threadedRod.md +5 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +14 -7
- package/dist/docs/reference/model/transform3.md +16 -7
- package/dist/docs/reference/model/tube.md +3 -3
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +10 -2
- package/dist/docs/reference/model/vector3.md +10 -2
- package/dist/docs/reference/model.md +17 -9
- package/dist/docs/reference/text/Bounds2Data.md +34 -0
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Data.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +2 -2
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +3 -3
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +8 -6
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +4 -2
- package/dist/engine/construction-operations.js +31 -14
- package/dist/engine/execution.js +39 -8
- package/dist/engine/extrusion-finishing.js +1 -1
- package/dist/engine/index.js +6 -1
- package/dist/engine/inspection-operations.js +13 -11
- package/dist/engine/knuckle-hinge-operation.js +85 -0
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/mechanical-operations.js +3 -1
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/modeling-context.js +8 -1
- package/dist/engine/native/material-components.js +305 -0
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/native/threads.js +3 -3
- package/dist/engine/native/transforms.js +5 -7
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +1 -1
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-anchors.js +17 -17
- package/dist/engine/primitive-operations.js +1 -1
- package/dist/engine/primitive-profiles.js +7 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +10 -2
- package/dist/engine/section-operations.js +33 -8
- package/dist/engine/session-snapshot.js +14 -4
- package/dist/engine/session.js +10 -5
- package/dist/engine/shape-anchors.js +3 -3
- package/dist/engine/transform-operations.js +27 -27
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/bounds-value.js +93 -0
- package/dist/geometry/bounds.js +10 -8
- package/dist/geometry/curves/sampling.js +15 -16
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/errors.js +1 -0
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/heightfield.js +12 -1
- package/dist/geometry/index.js +12 -11
- package/dist/geometry/loft/loft-simple-mesh.js +6 -6
- package/dist/geometry/loft/loft.js +22 -13
- package/dist/geometry/math/immutable-value.js +1 -1
- package/dist/geometry/math/vector-value.js +11 -3
- package/dist/geometry/math/vector2.js +1 -0
- package/dist/geometry/math/vector3.js +1 -0
- package/dist/geometry/mechanical/gear-motion.js +3 -3
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +4 -3
- package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
- package/dist/geometry/mechanical/standards.js +1 -1
- package/dist/geometry/mechanical/thread-helices.js +2 -3
- package/dist/geometry/mechanical/thread-mesh-plan.js +11 -7
- package/dist/geometry/mechanical/thread-mesh.js +7 -7
- package/dist/geometry/mechanical/thread-profiles.js +5 -5
- package/dist/geometry/mechanical/thread-solids.js +31 -6
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-centroid.js +1 -0
- package/dist/geometry/mesh/mesh-planar.js +25 -27
- package/dist/geometry/mesh/mesh-quality.js +5 -5
- package/dist/geometry/mesh/mesh-signature.js +13 -13
- package/dist/geometry/mesh/mesh-solid.js +8 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +8 -19
- package/dist/geometry/paths/frames.js +42 -11
- package/dist/geometry/paths/helix.js +17 -6
- package/dist/geometry/paths/path-value.js +268 -0
- package/dist/geometry/paths/planar.js +36 -23
- package/dist/geometry/paths/resampling.js +27 -5
- package/dist/geometry/patterns/placements.js +100 -27
- package/dist/geometry/patterns.js +5 -3
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/profiles/contour.js +7 -6
- package/dist/geometry/profiles/matched.js +5 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +14 -5
- package/dist/geometry/profiles/side-profile.js +9 -7
- package/dist/geometry/profiles/span-sampling.js +1 -1
- package/dist/geometry/resolution.js +34 -34
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +12 -27
- package/dist/geometry/svg/fill.js +7 -21
- package/dist/geometry/svg-import.js +31 -25
- package/dist/geometry/sweeps/options.js +5 -4
- package/dist/geometry/sweeps/orientation.js +5 -5
- package/dist/geometry/sweeps/stations.js +10 -10
- package/dist/geometry/sweeps/sweep-closed.js +2 -2
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +1 -1
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/text-fitting.js +1 -0
- package/dist/geometry/transform-geometry.js +7 -14
- package/dist/geometry/transform-matrix.js +1 -1
- package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
- package/dist/index.js +3 -1
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +62 -10
- package/dist/model/knuckle-hinge.js +1 -0
- package/dist/model/operations.js +79 -26
- package/dist/model/recipe-declaration.js +21 -7
- package/dist/model/shape-handles.js +2 -1
- package/dist/text/index.js +15 -9
- package/dist/text/vector-text-layout.js +31 -26
- package/package.json +1 -1
- package/dist/docs/reference/geometry/Bounds2.md +0 -39
- package/dist/docs/reference/geometry/Bounds3.md +0 -39
- package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +0 -34
- package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +0 -65
- package/dist/docs/reference/geometry/Path2.md +0 -14
- package/dist/docs/reference/geometry/Path3.md +0 -14
- package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
- package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/Transform2Matrix.md +0 -14
- package/dist/docs/reference/geometry/Transform3Matrix.md +0 -17
- package/dist/docs/reference/geometry/Vector2Tuple.md +0 -14
- package/dist/docs/reference/geometry/Vector3Tuple.md +0 -14
- package/dist/docs/reference/geometry/closestPointOnPath.md +0 -110
- package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
- package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
- package/dist/docs/reference/geometry/pathLength.md +0 -33
- package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
- package/dist/docs/reference/geometry/transformContour.md +0 -42
- package/dist/docs/reference/geometry/transformPath2.md +0 -40
- package/dist/docs/reference/geometry/transformPath3.md +0 -33
- package/dist/docs/reference/model/Bounds2.md +0 -39
- package/dist/docs/reference/model/Bounds3.md +0 -39
- package/dist/docs/reference/model/Path2.md +0 -20
- package/dist/docs/reference/model/Transform2Matrix.md +0 -15
- package/dist/docs/reference/model/Transform3Matrix.md +0 -18
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Bounds2.md +0 -34
- package/dist/docs/reference/text/Vector2Tuple.md +0 -7
- package/dist/geometry/paths/path.js +0 -32
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { resolveExtrusionControls, resolveExtrusionDivisions, } from "../extrusion.js";
|
|
3
3
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "../model-limits.js";
|
|
4
|
+
import { capturePath2Input, path2InputData } from "../paths/path-value.js";
|
|
4
5
|
import { assertSamplingCount } from "../sampling-limits.js";
|
|
5
6
|
import { pointLoftProfile, prepareLoftGeometry } from "./loft-geometry.js";
|
|
6
7
|
import {} from "./loft-options.js";
|
|
@@ -14,6 +15,7 @@ export { triangulateContour } from "./loft-triangulation.js";
|
|
|
14
15
|
* Both ends use ear-clipped caps, supporting concave profiles without center fans.
|
|
15
16
|
* Intermediate slices interpolate placed world vertices, never frame axes.
|
|
16
17
|
* Transformed coordinates must fit finite Float32 mesh storage.
|
|
18
|
+
* Path2 profiles must be closed; raw point collections are interpreted as closed.
|
|
17
19
|
*
|
|
18
20
|
* @example Loft with explicit point correspondence
|
|
19
21
|
* ```ts
|
|
@@ -30,21 +32,27 @@ export function loftMesh(stations, options) {
|
|
|
30
32
|
throw new GeometryError("INVALID_ARGUMENT", "Loft requires at least two stations.", {
|
|
31
33
|
operation: "loftMesh",
|
|
32
34
|
});
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return sum + station.profile.length;
|
|
39
|
-
}, 0), "loftMesh", 1_000_000);
|
|
40
|
-
const profiles = input.map((station) => ({
|
|
41
|
-
...station,
|
|
42
|
-
profile: pointLoftProfile(station.profile),
|
|
35
|
+
assertSamplingCount(stations.length, "loftMesh", limits.maxPathPoints);
|
|
36
|
+
const inputs = stations;
|
|
37
|
+
const input = inputs.map(({ profile, ...placement }) => ({
|
|
38
|
+
...placement,
|
|
39
|
+
source: capturePath2Input(profile, true),
|
|
43
40
|
}));
|
|
41
|
+
assertSamplingCount(input.reduce((sum, station) => sum + station.source.count, 0), "loftMesh", 1_000_000);
|
|
42
|
+
let remaining = 1_000_000;
|
|
43
|
+
const profiles = input.map(({ source, ...placement }) => {
|
|
44
|
+
const points = path2InputData(source.input, true, {
|
|
45
|
+
maxPathPoints: Math.max(1, Math.min(limits.maxProfilePoints, remaining)),
|
|
46
|
+
}).points;
|
|
47
|
+
assertSamplingCount(points.length, "loftMesh", remaining);
|
|
48
|
+
remaining -= points.length;
|
|
49
|
+
return { ...placement, profile: pointLoftProfile(points) };
|
|
50
|
+
});
|
|
44
51
|
return simpleLoftMesh(prepareLoftGeometry(profiles, options, limits, false), limits);
|
|
45
52
|
}
|
|
46
53
|
/**
|
|
47
54
|
* Linearly extrudes one simple profile along +Z with robust ear-clipped caps.
|
|
55
|
+
* Path2 profiles must be closed; raw point collections have an implicit closing edge.
|
|
48
56
|
*
|
|
49
57
|
* @example Extrude point data without an engine
|
|
50
58
|
* ```ts
|
|
@@ -52,9 +60,9 @@ export function loftMesh(stations, options) {
|
|
|
52
60
|
* extrudeMesh(outline, { height: 8 });
|
|
53
61
|
* ```
|
|
54
62
|
*/
|
|
55
|
-
export function extrudeMesh(
|
|
63
|
+
export function extrudeMesh(input, options) {
|
|
56
64
|
const { height } = options;
|
|
57
|
-
const { center, scales,
|
|
65
|
+
const { center, scales, twist } = resolveExtrusionControls(height, options, "extrudeMesh");
|
|
58
66
|
if (!Number.isFinite(height) || height <= 0) {
|
|
59
67
|
throw new GeometryError("INVALID_ARGUMENT", "Extrusion height must be finite and positive.", {
|
|
60
68
|
operation: "extrudeMesh",
|
|
@@ -63,6 +71,7 @@ export function extrudeMesh(profile, options) {
|
|
|
63
71
|
}
|
|
64
72
|
const bottom = center ? -height / 2 : 0;
|
|
65
73
|
const limits = resolveModelingLimits(options.limits);
|
|
74
|
+
const profile = path2InputData(input, true, { maxPathPoints: limits.maxProfilePoints }).points;
|
|
66
75
|
assertSamplingCount(profile.length, "extrudeMesh", limits.maxProfilePoints);
|
|
67
76
|
const divisions = resolveExtrusionDivisions(profile, height, options);
|
|
68
77
|
const count = profile.length * (divisions + 2);
|
|
@@ -76,7 +85,7 @@ export function extrudeMesh(profile, options) {
|
|
|
76
85
|
});
|
|
77
86
|
const stations = Array.from({ length: divisions + 2 }, (_, index) => {
|
|
78
87
|
const amount = index / (divisions + 1);
|
|
79
|
-
const angle = ((
|
|
88
|
+
const angle = ((twist * Math.PI) / 180) * amount;
|
|
80
89
|
const cosine = Math.cos(angle), sine = Math.sin(angle);
|
|
81
90
|
const sx = 1 + (scales[0] - 1) * amount, sy = 1 + (scales[1] - 1) * amount;
|
|
82
91
|
return {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// A versioned realm protocol lets separately bundled authoring values cross the host boundary.
|
|
2
|
-
const immutableMath = Symbol.for("@metamesh/modeling/immutable-math/
|
|
2
|
+
const immutableMath = Symbol.for("@metamesh/modeling/immutable-math/8");
|
|
3
3
|
/**
|
|
4
4
|
* Brands and freezes only this constructor's prototype. Pure-annotated callers let bundlers
|
|
5
5
|
* discard unused classes without dropping initialization for classes that remain reachable.
|
|
@@ -34,7 +34,7 @@ const tupleData = (input, dimensions) => {
|
|
|
34
34
|
return invalidVector(dimensions);
|
|
35
35
|
let values = input;
|
|
36
36
|
if (!Array.isArray(input)) {
|
|
37
|
-
const method = Reflect.get(input, "
|
|
37
|
+
const method = Reflect.get(input, "toData");
|
|
38
38
|
if (typeof method !== "function")
|
|
39
39
|
return invalidVector(dimensions);
|
|
40
40
|
values = Reflect.apply(method, input, []);
|
|
@@ -88,7 +88,7 @@ const PlanarVector = /* @__PURE__ */ immutableMathClass(class PlanarVector {
|
|
|
88
88
|
distance(other) {
|
|
89
89
|
return finite(distance2(this.values, operand2(other, "vector2.distance")), "vector2.distance");
|
|
90
90
|
}
|
|
91
|
-
|
|
91
|
+
toData() {
|
|
92
92
|
return this.values;
|
|
93
93
|
}
|
|
94
94
|
});
|
|
@@ -136,15 +136,19 @@ const SpatialVector = /* @__PURE__ */ immutableMathClass(class SpatialVector {
|
|
|
136
136
|
distance(other) {
|
|
137
137
|
return finite(distance3(this.values, operand3(other, "vector3.distance")), "vector3.distance");
|
|
138
138
|
}
|
|
139
|
-
|
|
139
|
+
toData() {
|
|
140
140
|
return this.values;
|
|
141
141
|
}
|
|
142
142
|
});
|
|
143
143
|
/**
|
|
144
144
|
* Creates immutable XY arithmetic from a finite tuple or vector, snapshotting the coordinates.
|
|
145
|
+
*
|
|
145
146
|
* Values and results are finite. Invalid dimensions throw `INVALID_ARGUMENT`; nonfinite coordinates
|
|
146
147
|
* and overflow throw `NON_FINITE_VALUE` GeometryError.
|
|
147
148
|
* Use transform2().applyDirection(value) for rotations and nonuniform scaling.
|
|
149
|
+
*
|
|
150
|
+
* Use `toData()` for frozen tuple interchange, or
|
|
151
|
+
* [normalize2](/docs/reference/geometry/normalize2) for tuple-based normalization in numerical loops.
|
|
148
152
|
*/
|
|
149
153
|
export function vector2(input) {
|
|
150
154
|
const values = operand2(input, "vector2");
|
|
@@ -152,10 +156,14 @@ export function vector2(input) {
|
|
|
152
156
|
}
|
|
153
157
|
/**
|
|
154
158
|
* Creates immutable XYZ arithmetic from a finite tuple or vector, snapshotting the coordinates.
|
|
159
|
+
*
|
|
155
160
|
* Values and results are finite. Invalid dimensions throw `INVALID_ARGUMENT`; nonfinite coordinates
|
|
156
161
|
* and overflow throw `NON_FINITE_VALUE` GeometryError.
|
|
157
162
|
* Use transform3().applyDirection(value) for rotations and nonuniform scaling.
|
|
158
163
|
*
|
|
164
|
+
* Use `toData()` for frozen tuple interchange, or
|
|
165
|
+
* [normalize3](/docs/reference/geometry/normalize3) for tuple-based normalization in numerical loops.
|
|
166
|
+
*
|
|
159
167
|
* @example
|
|
160
168
|
* ```ts
|
|
161
169
|
* const direction = vector3([1, 2, 3]).add([4, 0, 0]).normalize().scale(10);
|
|
@@ -21,6 +21,7 @@ export const length2 = (vector) => Math.hypot(vector[0], vector[1]);
|
|
|
21
21
|
export const distance2 = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1]);
|
|
22
22
|
/**
|
|
23
23
|
* Returns a unit vector; `epsilon` is a finite, non-negative length threshold (default `1e-12`).
|
|
24
|
+
*
|
|
24
25
|
* Rejects invalid thresholds, nonfinite lengths, and lengths at or below the threshold with
|
|
25
26
|
* `INVALID_TOLERANCE`, `NON_FINITE_VALUE`, and `DEGENERATE_GEOMETRY` respectively.
|
|
26
27
|
*/
|
|
@@ -61,6 +61,7 @@ export const length3 = (vector) => Math.hypot(vector[0], vector[1], vector[2]);
|
|
|
61
61
|
export const distance3 = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
|
|
62
62
|
/**
|
|
63
63
|
* Returns a unit vector; `epsilon` is a finite, non-negative length threshold (default `1e-12`).
|
|
64
|
+
*
|
|
64
65
|
* Rejects invalid thresholds, nonfinite lengths, and lengths at or below the threshold with
|
|
65
66
|
* `INVALID_TOLERANCE`, `NON_FINITE_VALUE`, and `DEGENERATE_GEOMETRY` respectively.
|
|
66
67
|
*/
|
|
@@ -71,12 +71,12 @@ export function measureInternalCylindricalGearPairMotion(spec, options = {}) {
|
|
|
71
71
|
const ringSpace = sampleInternalCylindricalGearSpaceOutline(spec.driven, options.outline);
|
|
72
72
|
const ringTipRadius = pair.driven.pitchRadius - pair.driven.addendum;
|
|
73
73
|
const contactWindow = contactWindowPolygon(pair.centerDistance, pair.driver.outsideRadius, ringTipRadius);
|
|
74
|
-
const initialRingPhase = pair.driven.toothCount % 2 === 0 ? 0 : pair.driven.
|
|
75
|
-
const initialDriverPhase = pair.driver.toothCount % 2 === 0 ? 0 : pair.driver.
|
|
74
|
+
const initialRingPhase = pair.driven.toothCount % 2 === 0 ? 0 : pair.driven.angularPitchRadians / 2;
|
|
75
|
+
const initialDriverPhase = pair.driver.toothCount % 2 === 0 ? 0 : pair.driver.angularPitchRadians / 2;
|
|
76
76
|
let maximumOverlapArea = 0;
|
|
77
77
|
let maximumPhase = initialDriverPhase;
|
|
78
78
|
for (let sample = 0; sample < samples; sample += 1) {
|
|
79
|
-
const phase = (pair.driver.
|
|
79
|
+
const phase = (pair.driver.angularPitchRadians * sample) / samples;
|
|
80
80
|
const driverPhase = initialDriverPhase + phase;
|
|
81
81
|
const drivenPhase = initialRingPhase + phase / pair.ratio;
|
|
82
82
|
const posedDriver = clippingPolygon(transformedLoop(driver, driverPhase));
|
|
@@ -33,22 +33,22 @@ const freezePoints = (points) => {
|
|
|
33
33
|
* count `z_v = z / cos³(beta)`, so increasing helix angle can reduce the physical tooth count.
|
|
34
34
|
*/
|
|
35
35
|
export function minimumCylindricalGearToothCountWithoutUndercut(spec = {}) {
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
if (!(
|
|
36
|
+
const pressureAngle = finite(spec.pressureAngle ?? DEFAULT_PRESSURE_ANGLE_DEGREES, "Pressure angle", "minimumCylindricalGearToothCountWithoutUndercut");
|
|
37
|
+
const helixAngle = finite(spec.helixAngle ?? 0, "Helix angle", "minimumCylindricalGearToothCountWithoutUndercut");
|
|
38
|
+
if (!(pressureAngle > 0 && pressureAngle < 45)) {
|
|
39
39
|
throw new GeometryError("INVALID_ARGUMENT", "Pressure angle must be greater than 0 and less than 45 degrees.", {
|
|
40
40
|
operation: "minimumCylindricalGearToothCountWithoutUndercut",
|
|
41
|
-
details: {
|
|
41
|
+
details: { pressureAngle },
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
|
-
if (!(Math.abs(
|
|
44
|
+
if (!(Math.abs(helixAngle) < 45)) {
|
|
45
45
|
throw new GeometryError("INVALID_ARGUMENT", "The absolute helix angle must be less than 45 degrees.", {
|
|
46
46
|
operation: "minimumCylindricalGearToothCountWithoutUndercut",
|
|
47
|
-
details: {
|
|
47
|
+
details: { helixAngle },
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
const pressureAngleRadians = degreesToRadians(
|
|
51
|
-
const helixAngleRadians = degreesToRadians(
|
|
50
|
+
const pressureAngleRadians = degreesToRadians(pressureAngle);
|
|
51
|
+
const helixAngleRadians = degreesToRadians(helixAngle);
|
|
52
52
|
const exact = (2 * Math.cos(helixAngleRadians) ** 3) / Math.sin(pressureAngleRadians) ** 2;
|
|
53
53
|
// Exact boundary cases such as alpha=30° should not round up because of floating-point noise.
|
|
54
54
|
return Math.ceil(exact - Math.max(1, Math.abs(exact)) * 1e-12);
|
|
@@ -64,7 +64,7 @@ const resolveSimpleInvoluteProfileFacts = (dimensions, operation) => {
|
|
|
64
64
|
const halfAngleAtTip = halfAngleAt(dimensions.outsideRadius);
|
|
65
65
|
if (!(startRadius <= dimensions.outsideRadius) ||
|
|
66
66
|
!(halfAngleAtTip > 0) ||
|
|
67
|
-
!(halfAngleAtStart < dimensions.
|
|
67
|
+
!(halfAngleAtStart < dimensions.angularPitchRadians / 2)) {
|
|
68
68
|
throw new GeometryError("DEGENERATE_GEOMETRY", "The selected tooth proportions cannot form a simple involute outline.", {
|
|
69
69
|
operation,
|
|
70
70
|
details: { halfAngleAtStart, halfAngleAtTip, startRadius },
|
|
@@ -73,7 +73,7 @@ const resolveSimpleInvoluteProfileFacts = (dimensions, operation) => {
|
|
|
73
73
|
return Object.freeze({ halfAngleAt, halfAngleAtStart, halfAngleAtTip, startRadius });
|
|
74
74
|
};
|
|
75
75
|
const internalCylindricalGearSpaceDimensions = (dimensions) => {
|
|
76
|
-
const circularPitch = dimensions.
|
|
76
|
+
const circularPitch = dimensions.angularPitchRadians * dimensions.pitchRadius;
|
|
77
77
|
return Object.freeze({
|
|
78
78
|
...dimensions,
|
|
79
79
|
outsideRadius: dimensions.pitchRadius + dimensions.dedendum,
|
|
@@ -90,8 +90,8 @@ const internalCylindricalGearSpaceDimensions = (dimensions) => {
|
|
|
90
90
|
const resolveCylindricalGearDimensions = (spec, profile) => {
|
|
91
91
|
const toothCount = finite(spec.toothCount, "Tooth count");
|
|
92
92
|
const module = finite(spec.module, "Module");
|
|
93
|
-
const
|
|
94
|
-
const
|
|
93
|
+
const pressureAngle = finite(spec.pressureAngle ?? DEFAULT_PRESSURE_ANGLE_DEGREES, "Pressure angle");
|
|
94
|
+
const helixAngle = finite(spec.helixAngle ?? 0, "Helix angle");
|
|
95
95
|
const backlash = finite(spec.backlash ?? 0, "Backlash");
|
|
96
96
|
const clearanceFactor = finite(spec.clearanceFactor ?? DEFAULT_CLEARANCE_FACTOR, "Clearance factor");
|
|
97
97
|
if (!Number.isInteger(toothCount) || toothCount < 6 || toothCount > MAXIMUM_TOOTH_COUNT) {
|
|
@@ -103,29 +103,29 @@ const resolveCylindricalGearDimensions = (spec, profile) => {
|
|
|
103
103
|
details: { module },
|
|
104
104
|
});
|
|
105
105
|
}
|
|
106
|
-
if (!(
|
|
107
|
-
throw new GeometryError("INVALID_ARGUMENT", "Pressure angle must be greater than 0 and less than 45 degrees.", { operation: "resolveCylindricalGear", details: {
|
|
106
|
+
if (!(pressureAngle > 0 && pressureAngle < 45)) {
|
|
107
|
+
throw new GeometryError("INVALID_ARGUMENT", "Pressure angle must be greater than 0 and less than 45 degrees.", { operation: "resolveCylindricalGear", details: { pressureAngle } });
|
|
108
108
|
}
|
|
109
|
-
if (!(Math.abs(
|
|
110
|
-
throw new GeometryError("INVALID_ARGUMENT", "The absolute helix angle must be less than 45 degrees.", { operation: "resolveCylindricalGear", details: {
|
|
109
|
+
if (!(Math.abs(helixAngle) < 45)) {
|
|
110
|
+
throw new GeometryError("INVALID_ARGUMENT", "The absolute helix angle must be less than 45 degrees.", { operation: "resolveCylindricalGear", details: { helixAngle } });
|
|
111
111
|
}
|
|
112
112
|
if (backlash < 0 || clearanceFactor < 0) {
|
|
113
113
|
throw new GeometryError("INVALID_ARGUMENT", "Backlash and clearance factor must be non-negative.", { operation: "resolveCylindricalGear" });
|
|
114
114
|
}
|
|
115
|
-
const pressureAngleRadians = degreesToRadians(
|
|
116
|
-
const helixAngleRadians = degreesToRadians(
|
|
115
|
+
const pressureAngleRadians = degreesToRadians(pressureAngle);
|
|
116
|
+
const helixAngleRadians = degreesToRadians(helixAngle);
|
|
117
117
|
const minimumToothCountWithoutUndercut = minimumCylindricalGearToothCountWithoutUndercut({
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
helixAngle,
|
|
119
|
+
pressureAngle,
|
|
120
120
|
});
|
|
121
121
|
const virtualToothCount = toothCount / Math.cos(helixAngleRadians) ** 3;
|
|
122
122
|
if (profile === "external" && toothCount < minimumToothCountWithoutUndercut) {
|
|
123
|
-
throw new GeometryError("INVALID_ARGUMENT", `An unshifted full-depth external involute at ${
|
|
123
|
+
throw new GeometryError("INVALID_ARGUMENT", `An unshifted full-depth external involute at ${pressureAngle}° pressure angle and ${Math.abs(helixAngle)}° helix angle requires at least ${minimumToothCountWithoutUndercut} teeth to avoid undercut; profile shift is not supported.`, {
|
|
124
124
|
operation: "resolveCylindricalGear",
|
|
125
125
|
details: {
|
|
126
|
-
|
|
126
|
+
helixAngle,
|
|
127
127
|
minimumToothCountWithoutUndercut,
|
|
128
|
-
|
|
128
|
+
pressureAngle,
|
|
129
129
|
toothCount,
|
|
130
130
|
virtualToothCount,
|
|
131
131
|
},
|
|
@@ -151,7 +151,7 @@ const resolveCylindricalGearDimensions = (spec, profile) => {
|
|
|
151
151
|
}
|
|
152
152
|
const dimensions = Object.freeze({
|
|
153
153
|
addendum,
|
|
154
|
-
|
|
154
|
+
angularPitchRadians: (Math.PI * 2) / toothCount,
|
|
155
155
|
backlash,
|
|
156
156
|
baseRadius: pitchRadius * Math.cos(transversePressureAngleRadians),
|
|
157
157
|
dedendum,
|
|
@@ -199,12 +199,12 @@ export function resolveCylindricalGearPair(spec) {
|
|
|
199
199
|
// separate tip/interference constraints are checked by the pair and coupled-motion validators.
|
|
200
200
|
const driven = resolveCylindricalGearDimensions(spec.driven, spec.mesh);
|
|
201
201
|
const epsilon = 1e-10;
|
|
202
|
-
const driverHelixDegrees = spec.driver.
|
|
203
|
-
const drivenHelixDegrees = spec.driven.
|
|
204
|
-
const
|
|
202
|
+
const driverHelixDegrees = spec.driver.helixAngle ?? 0;
|
|
203
|
+
const drivenHelixDegrees = spec.driven.helixAngle ?? 0;
|
|
204
|
+
const requiredDrivenHelixAngle = spec.mesh === "external" ? -driverHelixDegrees : driverHelixDegrees;
|
|
205
205
|
if (Math.abs(driver.module - driven.module) > epsilon ||
|
|
206
206
|
Math.abs(driver.pressureAngleRadians - driven.pressureAngleRadians) > epsilon ||
|
|
207
|
-
Math.abs(drivenHelixDegrees -
|
|
207
|
+
Math.abs(drivenHelixDegrees - requiredDrivenHelixAngle) > epsilon) {
|
|
208
208
|
throw new GeometryError("INVALID_ARGUMENT", "Mating gears must share normal module and pressure angle with conjugate helix hands.", { operation: "resolveCylindricalGearPair" });
|
|
209
209
|
}
|
|
210
210
|
if (spec.mesh === "internal" && driven.pitchRadius <= driver.outsideRadius) {
|
|
@@ -218,7 +218,7 @@ export function resolveCylindricalGearPair(spec) {
|
|
|
218
218
|
driven,
|
|
219
219
|
drivenDirection: spec.mesh === "external" ? -1 : 1,
|
|
220
220
|
ratio: driven.toothCount / driver.toothCount,
|
|
221
|
-
|
|
221
|
+
requiredDrivenHelixAngle,
|
|
222
222
|
});
|
|
223
223
|
}
|
|
224
224
|
const exactSampleCount = (value, label, minimum, maximum, operation) => {
|
|
@@ -345,7 +345,7 @@ const sampleResolvedCylindricalGearOutline = (dimensions, options, operation) =>
|
|
|
345
345
|
const { halfAngleAt, halfAngleAtStart, halfAngleAtTip, startRadius } = resolveSimpleInvoluteProfileFacts(dimensions, operation);
|
|
346
346
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
347
347
|
const resolution = resolveGeometryResolution(options.resolution, limits);
|
|
348
|
-
const rootArcAngle = dimensions.
|
|
348
|
+
const rootArcAngle = dimensions.angularPitchRadians / 2 - halfAngleAtStart;
|
|
349
349
|
const rootArcSamples = options.rootArcSamples === undefined
|
|
350
350
|
? resolveAdaptiveArcSamples(dimensions.rootRadius, rootArcAngle, resolution, limits)
|
|
351
351
|
: exactSampleCount(options.rootArcSamples, "Root arc samples", 1, limits.maxCircularSegments, operation);
|
|
@@ -361,10 +361,12 @@ const sampleResolvedCylindricalGearOutline = (dimensions, options, operation) =>
|
|
|
361
361
|
: exactSampleCount(options.flankSamples, "Flank samples", 2, maximumFlankSamples, operation);
|
|
362
362
|
const estimatedPoints = dimensions.toothCount * (flankSamples * 2 + fixedPerTooth);
|
|
363
363
|
assertSamplingCount(estimatedPoints, operation, limits.maxProfilePoints);
|
|
364
|
-
const points = [
|
|
364
|
+
const points = [
|
|
365
|
+
polarPoint(dimensions.rootRadius, -dimensions.angularPitchRadians / 2),
|
|
366
|
+
];
|
|
365
367
|
for (let tooth = 0; tooth < dimensions.toothCount; tooth += 1) {
|
|
366
|
-
const centerAngle = tooth * dimensions.
|
|
367
|
-
const valleyBefore = centerAngle - dimensions.
|
|
368
|
+
const centerAngle = tooth * dimensions.angularPitchRadians;
|
|
369
|
+
const valleyBefore = centerAngle - dimensions.angularPitchRadians / 2;
|
|
368
370
|
const leftRootAngle = centerAngle - halfAngleAtStart;
|
|
369
371
|
for (let sample = 1; sample <= rootArcSamples; sample += 1) {
|
|
370
372
|
const amount = sample / rootArcSamples;
|
|
@@ -391,7 +393,7 @@ const sampleResolvedCylindricalGearOutline = (dimensions, options, operation) =>
|
|
|
391
393
|
if (startRadius > dimensions.rootRadius) {
|
|
392
394
|
points.push(polarPoint(dimensions.rootRadius, rightRootAngle));
|
|
393
395
|
}
|
|
394
|
-
const valleyAfter = centerAngle + dimensions.
|
|
396
|
+
const valleyAfter = centerAngle + dimensions.angularPitchRadians / 2;
|
|
395
397
|
for (let sample = 1; sample <= rootArcSamples; sample += 1) {
|
|
396
398
|
const amount = sample / rootArcSamples;
|
|
397
399
|
points.push(polarPoint(dimensions.rootRadius, rightRootAngle + (valleyAfter - rightRootAngle) * amount));
|
|
@@ -431,11 +433,9 @@ export function resolveRackPitch(spec) {
|
|
|
431
433
|
const reference = resolveCylindricalGear({
|
|
432
434
|
...(spec.backlash === undefined ? {} : { backlash: spec.backlash }),
|
|
433
435
|
...(spec.clearanceFactor === undefined ? {} : { clearanceFactor: spec.clearanceFactor }),
|
|
434
|
-
...(spec.
|
|
436
|
+
...(spec.helixAngle === undefined ? {} : { helixAngle: spec.helixAngle }),
|
|
435
437
|
module: spec.module,
|
|
436
|
-
...(spec.
|
|
437
|
-
? {}
|
|
438
|
-
: { pressureAngleDegrees: spec.pressureAngleDegrees }),
|
|
438
|
+
...(spec.pressureAngle === undefined ? {} : { pressureAngle: spec.pressureAngle }),
|
|
439
439
|
// Rack pitch facts do not depend on this cylindrical reference count. Use the maximum so the
|
|
440
440
|
// reference remains undercut-free for every supported normal pressure and helix angle.
|
|
441
441
|
toothCount: MAXIMUM_TOOTH_COUNT,
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { minimumCylindricalGearToothCountWithoutUndercut, resolveCylindricalGear, resolveCylindricalGearPair, resolveRackPitch, sampleCylindricalGearOutline, sampleInternalCylindricalGearSpaceOutline, sampleRackToothPath, } from "./gears.js";
|
|
7
7
|
export { measureInternalCylindricalGearPairMotion } from "./gear-motion.js";
|
|
8
|
-
export {
|
|
9
|
-
export { compensateThreadProfileAxially, compensateThreadProfileForFaceting,
|
|
8
|
+
export { helicalThreadRidgeMesh, helicalThreadSolidMesh } from "./thread-mesh.js";
|
|
9
|
+
export { compensateThreadProfileAxially, compensateThreadProfileForFaceting, threadProfile, } from "./thread-profiles.js";
|
|
10
10
|
export { preflightHelicalThreadSolidMesh } from "./thread-mesh-plan.js";
|
|
11
11
|
export { sampleConventionalThreadHelices as sampleThreadHelices } from "./thread-helices.js";
|
|
12
12
|
export { compensateThreadDiameters, PRINTABLE_THREAD_FIT_POLICIES, resolvePrintableThreadFitPolicy, resolveThreadCircularSegments, } from "./threads.js";
|
|
13
|
-
export {
|
|
13
|
+
export { getMetricClearanceHoleDiameter, getMetricFastenerStandard, METRIC_FASTENER_STANDARDS, } from "./standards.js";
|
|
14
|
+
export { resolveKnuckleHinge, } from "./knuckle-hinge.js";
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { assertPositivePrimitive, assertPrimitiveOptions } from "../primitive-resolvers.js";
|
|
3
|
+
import { resolveAlignedCircularSegments } from "../resolution.js";
|
|
4
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
|
|
5
|
+
/** @internal Shared fixed frame; ordinary transforms place the joint in a model. */
|
|
6
|
+
export const knuckleHingeAxis = Object.freeze({
|
|
7
|
+
position: Object.freeze([0, 0, 0]),
|
|
8
|
+
direction: Object.freeze([1, 0, 0]),
|
|
9
|
+
up: Object.freeze([0, 0, 1]),
|
|
10
|
+
});
|
|
11
|
+
const invalid = (message) => {
|
|
12
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "resolveKnuckleHinge" });
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Resolves equal alternating knuckles along +X, centered at the origin, in millimetres.
|
|
16
|
+
*
|
|
17
|
+
* Both faces of each running pair use a common polygon count; face-sized bores contain the
|
|
18
|
+
* shaft's complete rotational envelope. Adaptive sampling satisfies both face and vertex error
|
|
19
|
+
* bounds; an insufficient ceiling rejects instead of reducing quality. Exact counts are intentional
|
|
20
|
+
* facets. Zero allowances describe ideal contact, not a printable running fit.
|
|
21
|
+
*
|
|
22
|
+
* Rejects nonfinite or nonpositive dimensions, invalid mode/count combinations, exhausted axial
|
|
23
|
+
* length, missing/excessive lift-off engagement, and nonpositive conservative faceted barrel walls.
|
|
24
|
+
* Manufacturing minima, strength, mounting, retention, handedness, and motion remain caller policy.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveKnuckleHinge(spec, options = {}) {
|
|
27
|
+
assertPrimitiveOptions(spec, "resolveKnuckleHinge");
|
|
28
|
+
assertPrimitiveOptions(options, "resolveKnuckleHinge");
|
|
29
|
+
for (const key of ["length", "barrelDiameter", "pinDiameter"])
|
|
30
|
+
assertPositivePrimitive(spec[key], key, "resolveKnuckleHinge");
|
|
31
|
+
for (const key of ["radialClearance", "axialGap"])
|
|
32
|
+
if (!Number.isFinite(spec[key]) || spec[key] < 0)
|
|
33
|
+
invalid(`${key} must be finite and nonnegative.`);
|
|
34
|
+
if (!Number.isSafeInteger(spec.knuckleCount) || spec.knuckleCount < 2)
|
|
35
|
+
invalid("knuckleCount must be a safe integer of at least two.");
|
|
36
|
+
if (!["print-in-place", "inserted-pin", "lift-off"].includes(spec.mode))
|
|
37
|
+
invalid("Unknown hinge mode.");
|
|
38
|
+
if (spec.mode === "print-in-place" && spec.knuckleCount % 2 !== 1)
|
|
39
|
+
invalid("Print-in-place needs an odd count.");
|
|
40
|
+
if (spec.mode === "lift-off" && spec.knuckleCount !== 2)
|
|
41
|
+
invalid("Lift-off needs two knuckles.");
|
|
42
|
+
if (spec.mode !== "lift-off" && spec.pinEngagement !== undefined)
|
|
43
|
+
invalid("pinEngagement requires lift-off mode.");
|
|
44
|
+
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
45
|
+
assertSamplingCount(spec.knuckleCount, "resolveKnuckleHinge", limits.maxPathPoints);
|
|
46
|
+
const knuckleLength = (spec.length - (spec.knuckleCount - 1) * spec.axialGap) / spec.knuckleCount;
|
|
47
|
+
if (!Number.isFinite(knuckleLength) || knuckleLength <= 0)
|
|
48
|
+
invalid("Axial gaps consume the knuckles.");
|
|
49
|
+
if (spec.mode === "lift-off" &&
|
|
50
|
+
(!Number.isFinite(spec.pinEngagement) ||
|
|
51
|
+
spec.pinEngagement <= 0 ||
|
|
52
|
+
spec.pinEngagement > knuckleLength))
|
|
53
|
+
invalid("pinEngagement must be positive and fit the socket.");
|
|
54
|
+
const barrelRadius = spec.barrelDiameter / 2;
|
|
55
|
+
const pinRadius = spec.pinDiameter / 2;
|
|
56
|
+
const boreRadius = pinRadius + spec.radialClearance;
|
|
57
|
+
if (!(pinRadius > 0) || !(boreRadius < barrelRadius))
|
|
58
|
+
invalid("Pin and bore must fit inside the barrel.");
|
|
59
|
+
const segments = resolveAlignedCircularSegments(barrelRadius, {
|
|
60
|
+
...options,
|
|
61
|
+
sizing: "face",
|
|
62
|
+
alignTo: [4],
|
|
63
|
+
minSegments: 4,
|
|
64
|
+
});
|
|
65
|
+
const cosine = Math.cos(Math.PI / segments);
|
|
66
|
+
const boreOuterRadius = boreRadius / cosine;
|
|
67
|
+
const minimumBarrelWall = barrelRadius * cosine - boreOuterRadius;
|
|
68
|
+
if (minimumBarrelWall <= 0)
|
|
69
|
+
invalid("Facets consume the wall; increase segments or barrel diameter.");
|
|
70
|
+
const common = {
|
|
71
|
+
length: spec.length,
|
|
72
|
+
knuckleCount: spec.knuckleCount,
|
|
73
|
+
barrelDiameter: spec.barrelDiameter,
|
|
74
|
+
pinDiameter: spec.pinDiameter,
|
|
75
|
+
radialClearance: spec.radialClearance,
|
|
76
|
+
axialGap: spec.axialGap,
|
|
77
|
+
};
|
|
78
|
+
const copied = Object.freeze(spec.mode === "lift-off"
|
|
79
|
+
? {
|
|
80
|
+
...common,
|
|
81
|
+
mode: spec.mode,
|
|
82
|
+
knuckleCount: spec.knuckleCount,
|
|
83
|
+
pinEngagement: spec.pinEngagement,
|
|
84
|
+
}
|
|
85
|
+
: { ...common, mode: spec.mode });
|
|
86
|
+
return Object.freeze({
|
|
87
|
+
spec: copied,
|
|
88
|
+
barrelRadius,
|
|
89
|
+
pinRadius,
|
|
90
|
+
boreRadius,
|
|
91
|
+
boreOuterRadius,
|
|
92
|
+
minimumBarrelWall,
|
|
93
|
+
knuckleLength,
|
|
94
|
+
segments,
|
|
95
|
+
knuckles: Object.freeze(Array.from({ length: spec.knuckleCount }, (_, index) => Object.freeze({
|
|
96
|
+
side: index % 2 === 0 ? "a" : "b",
|
|
97
|
+
start: -spec.length / 2 + index * (knuckleLength + spec.axialGap),
|
|
98
|
+
length: knuckleLength,
|
|
99
|
+
}))),
|
|
100
|
+
pin: spec.mode === "inserted-pin"
|
|
101
|
+
? null
|
|
102
|
+
: Object.freeze({
|
|
103
|
+
start: -spec.length / 2,
|
|
104
|
+
length: spec.mode === "lift-off"
|
|
105
|
+
? knuckleLength + spec.axialGap + spec.pinEngagement
|
|
106
|
+
: spec.length,
|
|
107
|
+
}),
|
|
108
|
+
axis: knuckleHingeAxis,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
@@ -50,7 +50,7 @@ export function getMetricFastenerStandard(size) {
|
|
|
50
50
|
return METRIC_FASTENER_STANDARDS[size];
|
|
51
51
|
}
|
|
52
52
|
/** Returns one recommended metric clearance-hole diameter in millimetres. */
|
|
53
|
-
export function
|
|
53
|
+
export function getMetricClearanceHoleDiameter(size, fit = "normal") {
|
|
54
54
|
const holes = getMetricFastenerStandard(size).clearanceHoles;
|
|
55
55
|
const diameter = fit === "close"
|
|
56
56
|
? holes.close
|
|
@@ -29,10 +29,9 @@ export function sampleConventionalThreadHelices(options) {
|
|
|
29
29
|
const count = Math.max(1, Math.ceil(turns * density));
|
|
30
30
|
assertSamplingCount(starts * (count + 1), operation, resolveGeometrySamplingLimits(options.limits).maxPathPoints);
|
|
31
31
|
const direction = handedness === "right" ? 1 : -1;
|
|
32
|
-
const
|
|
33
|
-
180, "phase", operation);
|
|
32
|
+
const phaseRadians = assertFiniteThreadNumber((assertFiniteThreadNumber(options.phase ?? 0, "phase", operation) * Math.PI) / 180, "phase", operation);
|
|
34
33
|
const paths = Object.freeze(Array.from({ length: starts }, (_, start) => {
|
|
35
|
-
const initial =
|
|
34
|
+
const initial = phaseRadians + (direction * 2 * Math.PI * start) / starts;
|
|
36
35
|
return Object.freeze(Array.from({ length: count + 1 }, (_, index) => {
|
|
37
36
|
const t = index / count;
|
|
38
37
|
const z = length * t;
|
|
@@ -133,9 +133,9 @@ export const resolveHelicalThreadMeshOptions = (options, operation, circularSamp
|
|
|
133
133
|
throw new GeometryError("INVALID_ARGUMENT", "Exact circularSegments must be divisible by the requested thread starts.", { operation, details: { circularSegments: base, starts } });
|
|
134
134
|
}
|
|
135
135
|
const segments = Math.ceil(base / starts) * starts;
|
|
136
|
-
const
|
|
137
|
-
if (segments >
|
|
138
|
-
throw new GeometryError("COMPLEXITY_LIMIT", "Start-aligned thread tessellation exceeds the configured segment safety limit.", { operation, details: {
|
|
136
|
+
const maxSegments = resolution.maxSegments;
|
|
137
|
+
if (segments > maxSegments) {
|
|
138
|
+
throw new GeometryError("COMPLEXITY_LIMIT", "Start-aligned thread tessellation exceeds the configured segment safety limit.", { operation, details: { maxSegments, segments } });
|
|
139
139
|
}
|
|
140
140
|
const handedness = options.handedness ?? "right";
|
|
141
141
|
if (handedness !== "left" && handedness !== "right")
|
|
@@ -199,8 +199,7 @@ export const resolveHelicalThreadMeshOptions = (options, operation, circularSamp
|
|
|
199
199
|
leadInLength,
|
|
200
200
|
leadInShape,
|
|
201
201
|
length,
|
|
202
|
-
phase: (assertFiniteThreadNumber(options.
|
|
203
|
-
180,
|
|
202
|
+
phase: (assertFiniteThreadNumber(options.phase ?? 0, "phase", operation) * Math.PI) / 180,
|
|
204
203
|
section,
|
|
205
204
|
segments,
|
|
206
205
|
starts,
|
|
@@ -349,8 +348,13 @@ export const resolveHelicalThreadSolidMeshPreflight = (options, operation) => {
|
|
|
349
348
|
});
|
|
350
349
|
};
|
|
351
350
|
/**
|
|
352
|
-
*
|
|
353
|
-
*
|
|
351
|
+
* Checks thread dimensions, profile, end treatments, sampling, and conservative estimates against output limits.
|
|
352
|
+
*
|
|
353
|
+
* This pure operation needs no engine and constructs planning data without vertex or index buffers.
|
|
354
|
+
* `circularSegments` is the selected count; row and triangle counts are conservative estimates.
|
|
355
|
+
* Successful preflight leaves generated coordinate and topology checks to mesh construction.
|
|
356
|
+
*
|
|
357
|
+
* @see {@link helicalThreadSolidMesh}
|
|
354
358
|
*/
|
|
355
359
|
export function preflightHelicalThreadSolidMesh(options) {
|
|
356
360
|
return resolveHelicalThreadSolidMeshPreflight(options, "preflightHelicalThreadSolidMesh")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Closed ridge and complete-solid mesh construction from resolved thread plans. */
|
|
2
2
|
import { triangulateContour } from "../loft/loft.js";
|
|
3
|
-
import {
|
|
3
|
+
import { analyzeTriangleMesh, joinTriangleMeshes, reverseTriangleMesh, validateTriangleMesh, } from "../mesh/mesh.js";
|
|
4
4
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "../model-limits.js";
|
|
5
5
|
import { resolveHelicalThreadMeshOptions, resolveHelicalThreadSolidMeshPreflight, } from "./thread-mesh-plan.js";
|
|
6
6
|
import { buildThreadSurfaceColumn, stitchThreadSurfaceColumns } from "./thread-surface.js";
|
|
@@ -61,7 +61,7 @@ const buildThreadRidgeComponent = (options) => {
|
|
|
61
61
|
indices: new Uint32Array(indices),
|
|
62
62
|
};
|
|
63
63
|
validateTriangleMesh(mesh, { requireClosed: true });
|
|
64
|
-
if (
|
|
64
|
+
if (analyzeTriangleMesh(mesh, { requireClosed: true }).signedVolume < 0)
|
|
65
65
|
mesh = reverseTriangleMesh(mesh);
|
|
66
66
|
return mesh;
|
|
67
67
|
};
|
|
@@ -74,8 +74,8 @@ const buildThreadRidgeComponent = (options) => {
|
|
|
74
74
|
* conservative pre-allocation estimate rejects excessive meshes before constructing position
|
|
75
75
|
* arrays.
|
|
76
76
|
*/
|
|
77
|
-
export function
|
|
78
|
-
const operation = "
|
|
77
|
+
export function helicalThreadSolidMesh(options) {
|
|
78
|
+
const operation = "helicalThreadSolidMesh";
|
|
79
79
|
const { maximumAxialSegmentLength, resolved } = resolveHelicalThreadSolidMeshPreflight(options, operation);
|
|
80
80
|
const positions = [];
|
|
81
81
|
const columns = Array.from({ length: resolved.segments }, (_, column) => buildThreadSurfaceColumn(options.profile, resolved, options, resolved.phase + (column * 2 * Math.PI) / resolved.segments, maximumAxialSegmentLength, positions));
|
|
@@ -103,7 +103,7 @@ export function buildHelicalThreadSolidMesh(options) {
|
|
|
103
103
|
indices: new Uint32Array(indices),
|
|
104
104
|
};
|
|
105
105
|
validateTriangleMesh(mesh, { requireClosed: true });
|
|
106
|
-
if (
|
|
106
|
+
if (analyzeTriangleMesh(mesh, { requireClosed: true }).signedVolume < 0) {
|
|
107
107
|
mesh = reverseTriangleMesh(mesh);
|
|
108
108
|
}
|
|
109
109
|
return mesh;
|
|
@@ -113,8 +113,8 @@ export function buildHelicalThreadSolidMesh(options) {
|
|
|
113
113
|
* shaft's radial/axial frame. The mesh is intended for union with its
|
|
114
114
|
* minor-envelope cylinder and never owns WASM objects.
|
|
115
115
|
*/
|
|
116
|
-
export function
|
|
117
|
-
const operation = "
|
|
116
|
+
export function helicalThreadRidgeMesh(options) {
|
|
117
|
+
const operation = "helicalThreadRidgeMesh";
|
|
118
118
|
const resolved = resolveHelicalThreadMeshOptions(options, operation);
|
|
119
119
|
const z0 = resolved.bottomBoundary - resolved.section[0][0];
|
|
120
120
|
const z1 = resolved.topBoundary - resolved.section.at(-1)[0];
|
|
@@ -237,11 +237,11 @@ const standardProfile = (kind, pitch, depth, root, crest, leftRun, rightRun) =>
|
|
|
237
237
|
*
|
|
238
238
|
* @example Printable triangular thread profile
|
|
239
239
|
* ```ts
|
|
240
|
-
*
|
|
240
|
+
* threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
241
241
|
* ```
|
|
242
242
|
*/
|
|
243
|
-
export function
|
|
244
|
-
const operation = "
|
|
243
|
+
export function threadProfile(spec) {
|
|
244
|
+
const operation = "threadProfile";
|
|
245
245
|
const pitch = assertFiniteThreadNumber(spec.pitch, "pitch", operation);
|
|
246
246
|
const tolerance = resolveGeometryTolerance(Math.abs(pitch), spec.tolerance);
|
|
247
247
|
if (!(pitch > tolerance.linear))
|
|
@@ -358,9 +358,9 @@ export function createThreadProfile(spec) {
|
|
|
358
358
|
}
|
|
359
359
|
const includedAngle = spec.kind === "acme"
|
|
360
360
|
? 29
|
|
361
|
-
: assertFiniteThreadNumber(spec.
|
|
361
|
+
: assertFiniteThreadNumber(spec.includedAngle ?? 30, "includedAngle", operation);
|
|
362
362
|
if (includedAngle < 0 || includedAngle >= 180) {
|
|
363
|
-
throw new GeometryError("INVALID_ARGUMENT", "
|
|
363
|
+
throw new GeometryError("INVALID_ARGUMENT", "includedAngle must be at least 0 degrees and below 180 degrees.", { operation });
|
|
364
364
|
}
|
|
365
365
|
const halfIncludedAngle = includedAngle / 2;
|
|
366
366
|
const flankRun = depth * (halfIncludedAngle === 45 ? 1 : Math.tan((halfIncludedAngle * Math.PI) / 180));
|