@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
|
@@ -45,12 +45,12 @@ export const resolveCompensatedThreadSolidMesh = (options, role) => {
|
|
|
45
45
|
const femaleBevelOutset = (style, size) => style === "blunt"
|
|
46
46
|
? Math.min(size, hypotheticalFemaleLength / 2)
|
|
47
47
|
: Math.max(0, Math.min(size, hypotheticalFemaleLength / 2) - options.profile.depth);
|
|
48
|
-
const
|
|
48
|
+
const maxRadialOutset = Math.max(options.bevelBottom === true ? femaleBevelOutset(bottomStyle, femaleBottomBevelSize) : 0, options.bevelTop === true ? femaleBevelOutset(topStyle, femaleTopBevelSize) : 0);
|
|
49
49
|
const segments = resolveThreadCircularSegments({
|
|
50
50
|
nominalMajorDiameter: options.nominalMajorDiameter,
|
|
51
51
|
profile: options.profile,
|
|
52
52
|
starts,
|
|
53
|
-
|
|
53
|
+
maxRadialOutset,
|
|
54
54
|
...(options.limits === undefined ? {} : { limits: options.limits }),
|
|
55
55
|
...(options.fit === undefined ? {} : { fit: options.fit }),
|
|
56
56
|
...(options.resolution === undefined ? {} : { resolution: options.resolution }),
|
|
@@ -96,11 +96,30 @@ export const resolveCompensatedThreadSolidMesh = (options, role) => {
|
|
|
96
96
|
});
|
|
97
97
|
};
|
|
98
98
|
const preflightCompensatedThreadSolid = (options, role) => preflightHelicalThreadSolidMesh(resolveCompensatedThreadSolidMesh(options, role).meshOptions);
|
|
99
|
-
/**
|
|
99
|
+
/**
|
|
100
|
+
* Resolves compensated rod dimensions and checks conservative mesh estimates against output limits.
|
|
101
|
+
*
|
|
102
|
+
* This pure operation uses explicit resolution and limits or package defaults, without an active
|
|
103
|
+
* host execution. It creates planning data without mesh buffers or native objects; returned row
|
|
104
|
+
* and triangle counts are estimates. Mesh validity and native construction are checked later.
|
|
105
|
+
*
|
|
106
|
+
* @see {@link preflightHelicalThreadSolidMesh}
|
|
107
|
+
* @see {@link helicalThreadSolidMesh}
|
|
108
|
+
*/
|
|
100
109
|
export function preflightThreadedRodSolid(options) {
|
|
101
110
|
return preflightCompensatedThreadSolid(options, "male");
|
|
102
111
|
}
|
|
103
|
-
/**
|
|
112
|
+
/**
|
|
113
|
+
* Resolves compensated cutter dimensions and checks extended mesh estimates against output limits.
|
|
114
|
+
*
|
|
115
|
+
* This pure operation uses explicit resolution and limits or package defaults, without an active
|
|
116
|
+
* host execution. It includes the cutter's one-pitch extension beyond each requested face and
|
|
117
|
+
* creates planning data without mesh buffers or native objects. Row and triangle counts are
|
|
118
|
+
* estimates; mesh validity and native construction are checked later.
|
|
119
|
+
*
|
|
120
|
+
* @see {@link preflightHelicalThreadSolidMesh}
|
|
121
|
+
* @see {@link helicalThreadSolidMesh}
|
|
122
|
+
*/
|
|
104
123
|
export function preflightInternalThreadCutterSolid(options) {
|
|
105
124
|
return preflightCompensatedThreadSolid(options, "female");
|
|
106
125
|
}
|
|
@@ -222,8 +241,14 @@ export const resolveThreadedNutSolid = (options, operation) => {
|
|
|
222
241
|
});
|
|
223
242
|
};
|
|
224
243
|
/**
|
|
225
|
-
*
|
|
226
|
-
*
|
|
244
|
+
* Checks nut dimensions, chamfers, end-face wall, and the extended compensated cutter's allocation plan.
|
|
245
|
+
*
|
|
246
|
+
* This pure operation uses explicit resolution and limits or package defaults, without an active
|
|
247
|
+
* host execution. It resolves body/cutter dimensions without mesh buffers or native objects.
|
|
248
|
+
* `thread` contains conservative cutter estimates, excluding the body and Boolean result.
|
|
249
|
+
* Successful preflight leaves mesh validity, native construction, and manufacturing fit to later checks.
|
|
250
|
+
*
|
|
251
|
+
* @see {@link preflightHelicalThreadSolidMesh}
|
|
227
252
|
*/
|
|
228
253
|
export function preflightThreadedNutSolid(options) {
|
|
229
254
|
return resolveThreadedNutSolid(options, "preflightThreadedNutSolid").preflight;
|
|
@@ -348,7 +348,7 @@ export const buildThreadSurfaceColumn = (profile, resolved, options, angle, maxi
|
|
|
348
348
|
let previousZ;
|
|
349
349
|
for (const sample of sampled) {
|
|
350
350
|
const radius = radiusAt(sample, sample.z);
|
|
351
|
-
requirePositiveThreadSurfaceRadius(radius, resolved, "
|
|
351
|
+
requirePositiveThreadSurfaceRadius(radius, resolved, "helicalThreadSolidMesh");
|
|
352
352
|
if (previousRadius !== undefined &&
|
|
353
353
|
previousZ !== undefined &&
|
|
354
354
|
Math.abs(sample.z - previousZ) <= resolved.tolerance.linear &&
|
|
@@ -81,17 +81,17 @@ export function compensateThreadDiameters(options) {
|
|
|
81
81
|
* Resolves a role-independent, start-aligned facet count from the larger female mating envelope.
|
|
82
82
|
*
|
|
83
83
|
* An exact `circularSegments` value must already be divisible by `starts`; it is never silently
|
|
84
|
-
* raised. Adaptive policies align upward and fail if that would exceed `
|
|
84
|
+
* raised. Adaptive policies align upward and fail if that would exceed `maxSegments`.
|
|
85
85
|
*/
|
|
86
86
|
export function resolveThreadCircularSegments(options) {
|
|
87
87
|
const operation = "resolveThreadCircularSegments";
|
|
88
88
|
const nominalMajorDiameter = finite(options.nominalMajorDiameter, "Nominal major diameter");
|
|
89
|
-
const
|
|
89
|
+
const maxRadialOutset = finite(options.maxRadialOutset ?? 0, "Maximum radial outset");
|
|
90
90
|
const pitch = finite(options.profile.pitch, "Profile pitch");
|
|
91
91
|
const starts = finite(options.starts ?? 1, "Starts");
|
|
92
92
|
if (!(nominalMajorDiameter > 0) ||
|
|
93
93
|
!(pitch > 0) ||
|
|
94
|
-
|
|
94
|
+
maxRadialOutset < 0 ||
|
|
95
95
|
!Number.isInteger(starts) ||
|
|
96
96
|
starts < 1 ||
|
|
97
97
|
starts > 32) {
|
|
@@ -100,22 +100,22 @@ export function resolveThreadCircularSegments(options) {
|
|
|
100
100
|
const policy = resolvePrintableThreadFitPolicy(options.fit);
|
|
101
101
|
const resolution = resolveGeometryResolution(options.resolution, options.limits);
|
|
102
102
|
const femaleMajorDiameter = nominalMajorDiameter + policy.femaleRadialOutset * 2;
|
|
103
|
-
const maximumFemaleRadius = femaleMajorDiameter / 2 +
|
|
103
|
+
const maximumFemaleRadius = femaleMajorDiameter / 2 + maxRadialOutset;
|
|
104
104
|
const effectiveRadius = Math.hypot(Math.PI * maximumFemaleRadius * 2, pitch * starts) / (Math.PI * 2);
|
|
105
105
|
const baseSegments = resolveCircularSegments(effectiveRadius, options.resolution, options.limits);
|
|
106
106
|
if (resolution.circularSegments !== undefined && baseSegments % starts !== 0) {
|
|
107
107
|
throw new GeometryError("INVALID_ARGUMENT", "Exact circularSegments must be divisible by the requested thread starts.", { operation, details: { circularSegments: baseSegments, starts } });
|
|
108
108
|
}
|
|
109
109
|
let segments = Math.ceil(baseSegments / starts) * starts;
|
|
110
|
-
if (segments > resolution.
|
|
111
|
-
throw new GeometryError("COMPLEXITY_LIMIT", "Start-aligned thread tessellation exceeds the configured segment safety limit.", { operation, details: {
|
|
110
|
+
if (segments > resolution.maxSegments) {
|
|
111
|
+
throw new GeometryError("COMPLEXITY_LIMIT", "Start-aligned thread tessellation exceeds the configured segment safety limit.", { operation, details: { maxSegments: resolution.maxSegments, segments } });
|
|
112
112
|
}
|
|
113
113
|
// Physical circle error is only the lower bound for a mating thread grid. Independently
|
|
114
114
|
// triangulated male and female helices also need enough angular facets to distribute their full
|
|
115
115
|
// phase-span allowance without consuming either profile's crest or root flats. Adaptive policies
|
|
116
116
|
// therefore refine by complete start-aligned steps; an exact caller override remains exact and
|
|
117
117
|
// fails instead of being silently changed.
|
|
118
|
-
while (segments <= resolution.
|
|
118
|
+
while (segments <= resolution.maxSegments) {
|
|
119
119
|
try {
|
|
120
120
|
compensateThreadProfileForFaceting(options.profile, policy.axialBacklash, "male", starts, segments);
|
|
121
121
|
compensateThreadProfileForFaceting(options.profile, policy.axialBacklash, "female", starts, segments);
|
|
@@ -132,6 +132,6 @@ export function resolveThreadCircularSegments(options) {
|
|
|
132
132
|
}
|
|
133
133
|
throw new GeometryError("COMPLEXITY_LIMIT", "Mating thread faceting requires more segments than the configured safety limit.", {
|
|
134
134
|
operation,
|
|
135
|
-
details: {
|
|
135
|
+
details: { maxSegments: resolution.maxSegments, starts },
|
|
136
136
|
});
|
|
137
137
|
}
|
|
@@ -2,6 +2,7 @@ import { GeometryError } from "../errors.js";
|
|
|
2
2
|
import { analyzeTriangleMesh } from "./mesh.js";
|
|
3
3
|
/**
|
|
4
4
|
* Computes the uniform-density volume centroid of an oriented closed solid, including cavity shells.
|
|
5
|
+
*
|
|
5
6
|
* Coordinates are millimetres. Indexed closure and positive aggregate volume are required; callers
|
|
6
7
|
* may use validateSolidMesh first when geometric intersections and shell orientation are untrusted.
|
|
7
8
|
* Fresh mutable input is inspected on every call, and buffers are never changed.
|
|
@@ -41,29 +41,27 @@ const positiveFinite = (value, label) => {
|
|
|
41
41
|
return value;
|
|
42
42
|
};
|
|
43
43
|
const resolveOptions = (options) => {
|
|
44
|
-
const
|
|
45
|
-
if (!Number.isFinite(
|
|
46
|
-
triggerMaximumFanRatio < 0 ||
|
|
47
|
-
triggerMaximumFanRatio > 1) {
|
|
44
|
+
const triggerMaxFanRatio = options.triggerMaxFanRatio ?? DEFAULT_TRIGGER_MAXIMUM_FAN_RATIO;
|
|
45
|
+
if (!Number.isFinite(triggerMaxFanRatio) || triggerMaxFanRatio < 0 || triggerMaxFanRatio > 1) {
|
|
48
46
|
throw new GeometryError("INVALID_ARGUMENT", "Maximum fan ratio trigger must be finite and between zero and one.");
|
|
49
47
|
}
|
|
50
|
-
const
|
|
51
|
-
if (
|
|
48
|
+
const triggerMinAngleDegrees = positiveFinite(options.triggerMinAngleDegrees ?? DEFAULT_TRIGGER_MINIMUM_ANGLE_DEGREES, "Minimum angle trigger");
|
|
49
|
+
if (triggerMinAngleDegrees >= 180) {
|
|
52
50
|
throw new GeometryError("INVALID_ARGUMENT", "Minimum angle trigger must be below 180 degrees.");
|
|
53
51
|
}
|
|
54
52
|
return {
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
maxEdgeRevisits: positiveInteger(options.maxEdgeRevisits ?? DEFAULT_MAXIMUM_EDGE_REVISITS, "Maximum edge revisits"),
|
|
54
|
+
maxFlipAttempts: options.maxFlipAttempts === undefined
|
|
57
55
|
? undefined
|
|
58
|
-
: positiveInteger(options.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
: positiveInteger(options.maxFlipAttempts, "Maximum flip attempts"),
|
|
57
|
+
maxPatchTriangles: positiveInteger(options.maxPatchTriangles ?? DEFAULT_MAXIMUM_PATCH_TRIANGLE_COUNT, "Maximum patch triangle count"),
|
|
58
|
+
maxProcessedTriangles: positiveInteger(options.maxProcessedTriangles ?? DEFAULT_MAXIMUM_PROCESSED_TRIANGLE_COUNT, "Maximum processed triangle count"),
|
|
59
|
+
minPatchTriangles: positiveInteger(options.minPatchTriangles ?? DEFAULT_MINIMUM_PATCH_TRIANGLE_COUNT, "Minimum patch triangle count"),
|
|
60
|
+
triggerMaxAspectRatio: positiveFinite(options.triggerMaxAspectRatio ?? DEFAULT_TRIGGER_MAXIMUM_ASPECT_RATIO, "Maximum aspect-ratio trigger"),
|
|
61
|
+
triggerMaxFanRatio,
|
|
62
|
+
triggerMaxVertexTriangleIncidence: positiveInteger(options.triggerMaxVertexTriangleIncidence ??
|
|
65
63
|
DEFAULT_TRIGGER_MAXIMUM_VERTEX_TRIANGLE_INCIDENCE, "Maximum vertex triangle-incidence trigger"),
|
|
66
|
-
|
|
64
|
+
triggerMinAngleDegrees,
|
|
67
65
|
};
|
|
68
66
|
};
|
|
69
67
|
const pairQuality = (positions, first, second) => {
|
|
@@ -118,11 +116,11 @@ const localConcentrationPotential = (vertices, incidence, valence, changes = new
|
|
|
118
116
|
};
|
|
119
117
|
const isTriggeredPatch = (patch, options) => {
|
|
120
118
|
const report = patch.report;
|
|
121
|
-
return (report.triangleCount >= options.
|
|
122
|
-
(report.minimumTriangleAngleDegrees < options.
|
|
123
|
-
report.maximumTriangleAspectRatio > options.
|
|
124
|
-
report.maximumVertexTriangleIncidence > options.
|
|
125
|
-
report.fanRatio > options.
|
|
119
|
+
return (report.triangleCount >= options.minPatchTriangles &&
|
|
120
|
+
(report.minimumTriangleAngleDegrees < options.triggerMinAngleDegrees ||
|
|
121
|
+
report.maximumTriangleAspectRatio > options.triggerMaxAspectRatio ||
|
|
122
|
+
report.maximumVertexTriangleIncidence > options.triggerMaxVertexTriangleIncidence ||
|
|
123
|
+
report.fanRatio > options.triggerMaxFanRatio));
|
|
126
124
|
};
|
|
127
125
|
const unchangedResult = (mesh, report, skippedPatchCount, budgetExhausted, fallbackReason) => ({
|
|
128
126
|
after: report,
|
|
@@ -189,8 +187,8 @@ export function optimizePlanarPatches(mesh, options = {}) {
|
|
|
189
187
|
for (const patch of before.patches) {
|
|
190
188
|
if (!isTriggeredPatch(patch, resolved))
|
|
191
189
|
continue;
|
|
192
|
-
if (patch.report.triangleCount > resolved.
|
|
193
|
-
selectedTriangleCount + patch.report.triangleCount > resolved.
|
|
190
|
+
if (patch.report.triangleCount > resolved.maxPatchTriangles ||
|
|
191
|
+
selectedTriangleCount + patch.report.triangleCount > resolved.maxProcessedTriangles) {
|
|
194
192
|
skippedPatchCount += 1;
|
|
195
193
|
budgetExhausted = true;
|
|
196
194
|
continue;
|
|
@@ -225,9 +223,9 @@ export function optimizePlanarPatches(mesh, options = {}) {
|
|
|
225
223
|
const initialEdges = [...edges.values()]
|
|
226
224
|
.filter(isCandidateEdge)
|
|
227
225
|
.sort((left, right) => left.first - right.first || left.second - right.second);
|
|
228
|
-
const
|
|
226
|
+
const maxFlipAttempts = resolved.maxFlipAttempts ??
|
|
229
227
|
Math.min(DEFAULT_MAXIMUM_FLIP_ATTEMPTS, initialEdges.length * ATTEMPTS_PER_INITIAL_EDGE);
|
|
230
|
-
if (
|
|
228
|
+
if (maxFlipAttempts === 0) {
|
|
231
229
|
return unchangedResult(mesh, before.report, skippedPatchCount, budgetExhausted);
|
|
232
230
|
}
|
|
233
231
|
const queue = initialEdges.map(({ key }) => key);
|
|
@@ -281,14 +279,14 @@ export function optimizePlanarPatches(mesh, options = {}) {
|
|
|
281
279
|
}
|
|
282
280
|
const sorted = [...candidates.values()].sort((left, right) => left.first - right.first || left.second - right.second);
|
|
283
281
|
for (const { key } of sorted) {
|
|
284
|
-
if (queued.has(key) || (revisitCounts.get(key) ?? 0) >= resolved.
|
|
282
|
+
if (queued.has(key) || (revisitCounts.get(key) ?? 0) >= resolved.maxEdgeRevisits) {
|
|
285
283
|
continue;
|
|
286
284
|
}
|
|
287
285
|
queued.add(key);
|
|
288
286
|
queue.push(key);
|
|
289
287
|
}
|
|
290
288
|
};
|
|
291
|
-
while (queueOffset < queue.length && attemptCount <
|
|
289
|
+
while (queueOffset < queue.length && attemptCount < maxFlipAttempts) {
|
|
292
290
|
const key = queue[queueOffset++];
|
|
293
291
|
queued.delete(key);
|
|
294
292
|
const revisits = (revisitCounts.get(key) ?? 0) + 1;
|
|
@@ -39,7 +39,7 @@ const positiveInteger = (value, label) => {
|
|
|
39
39
|
}
|
|
40
40
|
return value;
|
|
41
41
|
};
|
|
42
|
-
const structurallyValidateMesh = (mesh,
|
|
42
|
+
const structurallyValidateMesh = (mesh, maxTriangles) => {
|
|
43
43
|
if (!(mesh.positions instanceof Float32Array) || !(mesh.indices instanceof Uint32Array)) {
|
|
44
44
|
throw new GeometryError("INVALID_MESH", "Triangle meshes require Float32Array positions and Uint32Array indices.");
|
|
45
45
|
}
|
|
@@ -50,8 +50,8 @@ const structurallyValidateMesh = (mesh, maximumTriangleCount) => {
|
|
|
50
50
|
throw new GeometryError("INVALID_MESH", "Mesh indices must contain complete triangles.");
|
|
51
51
|
}
|
|
52
52
|
const triangleCount = mesh.indices.length / 3;
|
|
53
|
-
if (triangleCount >
|
|
54
|
-
throw new GeometryError("COMPLEXITY_LIMIT", `Mesh quality analysis is limited to ${
|
|
53
|
+
if (triangleCount > maxTriangles) {
|
|
54
|
+
throw new GeometryError("COMPLEXITY_LIMIT", `Mesh quality analysis is limited to ${maxTriangles} triangles.`);
|
|
55
55
|
}
|
|
56
56
|
for (let index = 0; index < mesh.positions.length; index += 1) {
|
|
57
57
|
if (!Number.isFinite(mesh.positions[index])) {
|
|
@@ -236,8 +236,8 @@ const buildPatchAnalysis = (faces, edges, faceIndices, id) => {
|
|
|
236
236
|
/** @internal */
|
|
237
237
|
export function buildTriangleMeshQualityAnalysis(mesh, options = {}) {
|
|
238
238
|
const source = { positions: mesh.positions, indices: mesh.indices };
|
|
239
|
-
const
|
|
240
|
-
structurallyValidateMesh(source,
|
|
239
|
+
const maxTriangles = positiveInteger(options.maxTriangles ?? DEFAULT_MAXIMUM_TRIANGLE_COUNT, "Maximum analyzed triangle count");
|
|
240
|
+
structurallyValidateMesh(source, maxTriangles);
|
|
241
241
|
const { bounds, extent } = meshBoundsAndExtent(source.positions);
|
|
242
242
|
const tolerance = resolveGeometryTolerance(extent, options.tolerance);
|
|
243
243
|
const planarLinearTolerance = Math.max(tolerance.linear, Math.max(extent, 1) * FLOAT32_EPSILON * 8);
|
|
@@ -6,7 +6,7 @@ const DEFAULT_MAXIMUM_TRIANGLE_COUNT = 200_000;
|
|
|
6
6
|
const validatePositiveTolerance = (value, name) => {
|
|
7
7
|
if (!Number.isFinite(value) || value <= 0) {
|
|
8
8
|
throw new GeometryError("INVALID_TOLERANCE", `${name} must be finite and greater than zero.`, {
|
|
9
|
-
operation: "
|
|
9
|
+
operation: "computeTriangleMeshSignature",
|
|
10
10
|
details: { [name]: value },
|
|
11
11
|
});
|
|
12
12
|
}
|
|
@@ -17,7 +17,7 @@ const quantizedInteger = (value, tolerance, name) => {
|
|
|
17
17
|
const quantized = scaled < 0 ? -Math.round(-scaled) : Math.round(scaled);
|
|
18
18
|
if (!Number.isSafeInteger(quantized)) {
|
|
19
19
|
throw new GeometryError("INVALID_TOLERANCE", `${name} cannot be represented safely at the requested signature tolerance.`, {
|
|
20
|
-
operation: "
|
|
20
|
+
operation: "computeTriangleMeshSignature",
|
|
21
21
|
details: { tolerance, value },
|
|
22
22
|
});
|
|
23
23
|
}
|
|
@@ -70,23 +70,23 @@ const hashCanonicalKeys = (header, groups) => {
|
|
|
70
70
|
* @returns Compact counts, bounds, volume, topology, tolerances, and canonical fingerprint.
|
|
71
71
|
* @throws {@link GeometryError} When validation, topology, tolerance, or complexity checks fail.
|
|
72
72
|
*/
|
|
73
|
-
export function
|
|
73
|
+
export function computeTriangleMeshSignature(mesh, options = {}) {
|
|
74
74
|
const source = { positions: mesh.positions, indices: mesh.indices };
|
|
75
|
-
const
|
|
76
|
-
if (!Number.isSafeInteger(
|
|
77
|
-
throw new GeometryError("INVALID_ARGUMENT", "
|
|
78
|
-
operation: "
|
|
79
|
-
details: {
|
|
75
|
+
const maxTriangles = options.maxTriangles ?? DEFAULT_MAXIMUM_TRIANGLE_COUNT;
|
|
76
|
+
if (!Number.isSafeInteger(maxTriangles) || maxTriangles <= 0) {
|
|
77
|
+
throw new GeometryError("INVALID_ARGUMENT", "maxTriangles must be a positive safe integer.", {
|
|
78
|
+
operation: "computeTriangleMeshSignature",
|
|
79
|
+
details: { maxTriangles },
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
if (!(source.positions instanceof Float32Array) || !(source.indices instanceof Uint32Array)) {
|
|
83
83
|
validateTriangleMesh(source, { requireClosed: true });
|
|
84
84
|
}
|
|
85
85
|
const triangleCount = source.indices.length / 3;
|
|
86
|
-
if (triangleCount >
|
|
87
|
-
throw new GeometryError("COMPLEXITY_LIMIT", `Mesh signature analysis is limited to ${
|
|
88
|
-
operation: "
|
|
89
|
-
details: {
|
|
86
|
+
if (triangleCount > maxTriangles) {
|
|
87
|
+
throw new GeometryError("COMPLEXITY_LIMIT", `Mesh signature analysis is limited to ${maxTriangles} triangles; received ${triangleCount}.`, {
|
|
88
|
+
operation: "computeTriangleMeshSignature",
|
|
89
|
+
details: { maxTriangles, triangleCount },
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
const positionTolerance = validatePositiveTolerance(options.positionTolerance ?? DEFAULT_POSITION_TOLERANCE, "positionTolerance");
|
|
@@ -98,7 +98,7 @@ export function createTriangleMeshSignature(mesh, options = {}) {
|
|
|
98
98
|
const twiceGenus = connectedComponentCount * 2 - eulerCharacteristic;
|
|
99
99
|
if (twiceGenus < 0 || twiceGenus % 2 !== 0) {
|
|
100
100
|
throw new GeometryError("INVALID_TOPOLOGY", "Closed mesh topology does not describe orientable vertex-manifold components.", {
|
|
101
|
-
operation: "
|
|
101
|
+
operation: "computeTriangleMeshSignature",
|
|
102
102
|
details: { connectedComponentCount, edgeCount, eulerCharacteristic },
|
|
103
103
|
});
|
|
104
104
|
}
|
|
@@ -7,6 +7,7 @@ const MAXIMUM_TRIANGLES = 200_000;
|
|
|
7
7
|
const MAXIMUM_TESTS = 2_000_000;
|
|
8
8
|
/**
|
|
9
9
|
* Checks closed indexed topology, triangle intersections, and alternating nested shell orientation.
|
|
10
|
+
*
|
|
10
11
|
* Outward exterior shells and inward cavity shells are accepted. Separate shells must not touch,
|
|
11
12
|
* intersect, or overlap as material. Indexed neighbours may share their own vertex or edge.
|
|
12
13
|
*
|
|
@@ -36,9 +37,9 @@ function validationWork(mesh, options) {
|
|
|
36
37
|
operation: "validateSolidMesh",
|
|
37
38
|
});
|
|
38
39
|
const count = mesh.indices.length / 3;
|
|
39
|
-
const
|
|
40
|
-
if (!Number.isSafeInteger(
|
|
41
|
-
throw new GeometryError("INVALID_ARGUMENT", "Solid validation
|
|
40
|
+
const maxTests = options.maxTests ?? MAXIMUM_TESTS;
|
|
41
|
+
if (!Number.isSafeInteger(maxTests) || maxTests < 1 || maxTests > MAXIMUM_TESTS)
|
|
42
|
+
throw new GeometryError("INVALID_ARGUMENT", "Solid validation maxTests must be an integer from 1 through 2,000,000.", { operation: "validateSolidMesh" });
|
|
42
43
|
if (count > MAXIMUM_TRIANGLES)
|
|
43
44
|
throw new GeometryError("COMPLEXITY_LIMIT", "Solid validation exceeds its triangle ceiling.", {
|
|
44
45
|
operation: "validateSolidMesh",
|
|
@@ -46,7 +47,7 @@ function validationWork(mesh, options) {
|
|
|
46
47
|
});
|
|
47
48
|
if (mesh.positions.length / 3 > mesh.indices.length)
|
|
48
49
|
throw new GeometryError("INVALID_MESH", "Solid validation requires every position-buffer vertex to be referenced.", { operation: "validateSolidMesh" });
|
|
49
|
-
return { count,
|
|
50
|
+
return { count, maxTests };
|
|
50
51
|
}
|
|
51
52
|
/** @internal Fresh measurements precede one adjacency traversal for closure, fans, and shells. */
|
|
52
53
|
export function analyzeSolidMesh(mesh, options = {}) {
|
|
@@ -71,14 +72,14 @@ export function validateAnalyzedSolidMesh(mesh, measurements, options = {}) {
|
|
|
71
72
|
: mesh;
|
|
72
73
|
checkSolidGeometry(source, measurements, options, validationWork(source, options));
|
|
73
74
|
}
|
|
74
|
-
function checkSolidGeometry(mesh, facts, options, { count,
|
|
75
|
+
function checkSolidGeometry(mesh, facts, options, { count, maxTests }) {
|
|
75
76
|
const epsilon = resolveGeometryTolerance(Math.hypot(...facts.bounds.max.map((value, axis) => value - facts.bounds.min[axis])), options.tolerance).linear;
|
|
76
77
|
let tests = 0;
|
|
77
78
|
const spend = () => {
|
|
78
|
-
if (++tests >
|
|
79
|
+
if (++tests > maxTests)
|
|
79
80
|
throw new GeometryError("COMPLEXITY_LIMIT", "Solid validation exhausted its work ceiling.", {
|
|
80
81
|
operation: "validateSolidMesh",
|
|
81
|
-
details: { required: tests, allowed:
|
|
82
|
+
details: { required: tests, allowed: maxTests },
|
|
82
83
|
});
|
|
83
84
|
};
|
|
84
85
|
const vertex = (index) => [
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { writeMeshVertex } from "../numeric.js";
|
|
3
3
|
import { resolveGeometryTolerance } from "../tolerance.js";
|
|
4
|
+
import { readTransformMatrix } from "../transform-matrix.js";
|
|
4
5
|
import { transformDeterminant3, validateTransform3 } from "../transform3.js";
|
|
5
6
|
import { IndexedMeshEdgeTable } from "./mesh-edge-table.js";
|
|
6
7
|
function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = false) {
|
|
@@ -184,19 +185,6 @@ export function validateTriangleMesh(mesh, options = {}) {
|
|
|
184
185
|
export const meshBounds = (mesh) => {
|
|
185
186
|
return inspectTriangleMesh(mesh, {}, "bounds");
|
|
186
187
|
};
|
|
187
|
-
/**
|
|
188
|
-
* Measures bounds, surface area, and signed volume without changing the mesh.
|
|
189
|
-
*
|
|
190
|
-
* Signed volume is meaningful for a consistently wound closed mesh. Set
|
|
191
|
-
* `requireClosed` when measurements will be used as manufacturing assertions.
|
|
192
|
-
*
|
|
193
|
-
* @param mesh - Mesh to validate and measure.
|
|
194
|
-
* @param options - Validation policy applied before measurement.
|
|
195
|
-
* @returns Immutable deterministic scalar and bounds measurements.
|
|
196
|
-
*/
|
|
197
|
-
export function measureTriangleMesh(mesh, options = {}) {
|
|
198
|
-
return inspectTriangleMesh(mesh, options, "measure");
|
|
199
|
-
}
|
|
200
188
|
/**
|
|
201
189
|
* Concatenates meshes into one indexed mesh without welding coincident vertices.
|
|
202
190
|
*
|
|
@@ -257,12 +245,13 @@ export function reverseTriangleMesh(mesh) {
|
|
|
257
245
|
* automatically reverses every triangle. Singular transforms are rejected.
|
|
258
246
|
*
|
|
259
247
|
* @param mesh - Mesh to transform without mutation.
|
|
260
|
-
* @param
|
|
248
|
+
* @param placement - Immutable spatial placement or canonical row-major affine matrix.
|
|
261
249
|
* @returns A mesh with fresh transformed positions and copied or reversed indices.
|
|
262
250
|
*/
|
|
263
|
-
export function transformTriangleMesh(mesh,
|
|
251
|
+
export function transformTriangleMesh(mesh, placement) {
|
|
264
252
|
const source = { positions: mesh.positions, indices: mesh.indices };
|
|
265
253
|
validateTriangleMesh(source);
|
|
254
|
+
const transform = readTransformMatrix(placement, 3);
|
|
266
255
|
validateTransform3(transform);
|
|
267
256
|
const positions = new Float32Array(source.positions.length);
|
|
268
257
|
for (let offset = 0; offset < source.positions.length; offset += 3) {
|
|
@@ -1,37 +1,26 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
|
|
3
|
-
export function
|
|
2
|
+
/** Internal scalar scan. Immutable paths validate their coordinates and ceiling once at construction. */
|
|
3
|
+
export function closestPointOnValidatedPath(path, point, closed) {
|
|
4
4
|
const fail = (message, code = "INVALID_ARGUMENT") => {
|
|
5
|
-
throw new GeometryError(code, message, { operation: "
|
|
5
|
+
throw new GeometryError(code, message, { operation: "path.closestPoint" });
|
|
6
6
|
};
|
|
7
7
|
const dimensions = point.length;
|
|
8
|
-
const closed = options.closed ?? false;
|
|
9
|
-
if (typeof closed !== "boolean" || (dimensions !== 2 && dimensions !== 3))
|
|
10
|
-
fail("Use a 2D or 3D point and a boolean closed option.");
|
|
11
|
-
assertSamplingCount(path.length, "closestPointOnPath", resolveGeometrySamplingLimits(options.limits).maxPathPoints);
|
|
12
8
|
if (path.length < (closed ? 3 : 2))
|
|
13
9
|
fail("Open paths need two points; closed paths need three.");
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
!Number.isFinite(value[1]) ||
|
|
19
|
-
(dimensions === 3 && !Number.isFinite(value[2])))
|
|
20
|
-
fail("Path and query coordinates must be finite.", "NON_FINITE_VALUE");
|
|
21
|
-
};
|
|
22
|
-
validate(point);
|
|
23
|
-
validate(path[0]);
|
|
10
|
+
if (!Number.isFinite(point[0]) ||
|
|
11
|
+
!Number.isFinite(point[1]) ||
|
|
12
|
+
(dimensions === 3 && !Number.isFinite(point[2])))
|
|
13
|
+
fail("Query coordinates must be finite.", "NON_FINITE_VALUE");
|
|
24
14
|
let bestDistance = Infinity, bestSquared = Infinity, edgeIndex = 0, fraction = 0;
|
|
25
15
|
let bestX = 0, bestY = 0, bestZ = 0;
|
|
26
16
|
const count = closed ? path.length : path.length - 1;
|
|
27
17
|
for (let i = 0; i < count; i++) {
|
|
28
18
|
const a = path[i], b = path[(i + 1) % path.length];
|
|
29
|
-
validate(b);
|
|
30
19
|
const dx = b[0] - a[0], dy = b[1] - a[1], dz = (b[2] ?? 0) - (a[2] ?? 0);
|
|
31
20
|
const px = point[0] - a[0], py = point[1] - a[1], pz = (point[2] ?? 0) - (a[2] ?? 0);
|
|
32
21
|
const lengthSquared = dx * dx + dy * dy + dz * dz;
|
|
33
22
|
let projection = (px * dx + py * dy + pz * dz) / lengthSquared;
|
|
34
|
-
if (!Number.isFinite(projection)) {
|
|
23
|
+
if (!Number.isFinite(lengthSquared) || !Number.isFinite(projection)) {
|
|
35
24
|
// Normalize only extreme extents; ordinary boundary scans use scalar squared arithmetic.
|
|
36
25
|
const scale = Math.max(Math.abs(dx), Math.abs(dy), Math.abs(dz));
|
|
37
26
|
if (!Number.isFinite(scale))
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector3Data } from "../math/vector-value.js";
|
|
1
3
|
import { cross3, dot3, length3, normalize3, projectOntoPlane3, rotateAroundAxis3Radians, scale3, subtract3, } from "../math/vector3.js";
|
|
2
|
-
import {
|
|
4
|
+
import { path3InputData } from "./path-value.js";
|
|
5
|
+
const guideData = (input, operation) => {
|
|
6
|
+
const coordinates = vector3Data(input);
|
|
7
|
+
if (!coordinates.every(Number.isFinite))
|
|
8
|
+
throw new GeometryError("NON_FINITE_VALUE", "Path frame guides must have finite coordinates.", {
|
|
9
|
+
operation,
|
|
10
|
+
});
|
|
11
|
+
return coordinates;
|
|
12
|
+
};
|
|
3
13
|
const tangentAt = (path, index) => {
|
|
4
14
|
if (index === 0) {
|
|
5
15
|
return normalize3(subtract3(path[1], path[0]));
|
|
@@ -23,7 +33,9 @@ const chooseInitialNormal = (tangent, preferred) => {
|
|
|
23
33
|
return normalize3(projected);
|
|
24
34
|
}
|
|
25
35
|
}
|
|
26
|
-
throw new
|
|
36
|
+
throw new GeometryError("DEGENERATE_GEOMETRY", "Unable to choose an initial path normal.", {
|
|
37
|
+
operation: "computeParallelTransportFrames",
|
|
38
|
+
});
|
|
27
39
|
};
|
|
28
40
|
const transportNormal = (normal, previousTangent, tangent) => {
|
|
29
41
|
const rotationAxis = cross3(previousTangent, tangent);
|
|
@@ -38,17 +50,23 @@ const transportNormal = (normal, previousTangent, tangent) => {
|
|
|
38
50
|
};
|
|
39
51
|
/**
|
|
40
52
|
* Builds rotation-minimizing frames by parallel-transporting the previous normal.
|
|
53
|
+
*
|
|
41
54
|
* This avoids the sudden profile flips produced by picking a fresh up-vector per ring.
|
|
42
55
|
* Paths exceeding maxPathPoints (default 100000) reject before frame allocation or guide evaluation.
|
|
56
|
+
* Requires open path values; raw tuples are interpreted as an open path. Invalid paths throw GeometryError.
|
|
57
|
+
* Nonfinite normals and guide results reject. A finite initial guide parallel to the tangent selects a canonical fallback.
|
|
43
58
|
*/
|
|
44
|
-
export const computeParallelTransportFrames = (
|
|
59
|
+
export const computeParallelTransportFrames = (input, initialNormal, normalGuide, limits = {}) => {
|
|
60
|
+
const { points: path } = path3InputData(input, false, limits);
|
|
45
61
|
if (path.length < 2) {
|
|
46
|
-
throw new
|
|
62
|
+
throw new GeometryError("INVALID_ARGUMENT", "A framed path needs at least two points.", {
|
|
63
|
+
operation: "computeParallelTransportFrames",
|
|
64
|
+
});
|
|
47
65
|
}
|
|
48
|
-
assertSamplingCount(path.length, "computeParallelTransportFrames", resolveGeometrySamplingLimits(limits).maxPathPoints);
|
|
49
66
|
const tangents = path.map((_, index) => tangentAt(path, index));
|
|
50
67
|
const firstTangent = tangents[0];
|
|
51
|
-
|
|
68
|
+
const firstGuide = normalGuide?.(path[0], 0) ?? initialNormal;
|
|
69
|
+
let normal = chooseInitialNormal(firstTangent, firstGuide === undefined ? undefined : guideData(firstGuide, "computeParallelTransportFrames"));
|
|
52
70
|
const frames = [
|
|
53
71
|
{
|
|
54
72
|
tangent: firstTangent,
|
|
@@ -64,7 +82,7 @@ export const computeParallelTransportFrames = (path, initialNormal, normalGuide,
|
|
|
64
82
|
normal = transportNormal(normal, previousTangent, tangent);
|
|
65
83
|
}
|
|
66
84
|
else {
|
|
67
|
-
const guided = normalize3(projectOntoPlane3(guide, tangent));
|
|
85
|
+
const guided = normalize3(projectOntoPlane3(guideData(guide, "computeParallelTransportFrames"), tangent));
|
|
68
86
|
// A guide describes an unoriented plane direction. Preserve the prior
|
|
69
87
|
// sign so noisy guide inputs cannot create a 180-degree seam flip.
|
|
70
88
|
normal = dot3(guided, normal) < 0 ? scale3(guided, -1) : guided;
|
|
@@ -92,14 +110,27 @@ const signedAngleAround = (from, to, axis) => Math.atan2(dot3(axis, cross3(from,
|
|
|
92
110
|
* normal back to the first tangent measures seam holonomy; distributing that residual rotation
|
|
93
111
|
* uniformly over all path intervals avoids a visible seam or accumulated frame flip.
|
|
94
112
|
* The maxPathPoints ceiling (default 100000) bounds path points and frames.
|
|
113
|
+
* Requires closed path values; raw tuples are interpreted as closed and must omit their seam point.
|
|
114
|
+
* Invalid paths throw GeometryError.
|
|
115
|
+
* Nonfinite initial normals reject; finite parallel preferences select a canonical fallback.
|
|
95
116
|
*/
|
|
96
|
-
export const computeClosedParallelTransportFrames = (
|
|
117
|
+
export const computeClosedParallelTransportFrames = (input, initialNormal, limits = {}) => {
|
|
118
|
+
const { points: path } = path3InputData(input, true, limits);
|
|
97
119
|
if (path.length < 3) {
|
|
98
|
-
throw new
|
|
120
|
+
throw new GeometryError("INVALID_ARGUMENT", "A closed framed path needs at least three points.", {
|
|
121
|
+
operation: "computeClosedParallelTransportFrames",
|
|
122
|
+
});
|
|
99
123
|
}
|
|
100
|
-
|
|
124
|
+
if (path[0].every((coordinate, axis) => coordinate === path.at(-1)[axis]))
|
|
125
|
+
throw new GeometryError("INVALID_ARGUMENT", "Closed framed paths omit their repeated seam point.", {
|
|
126
|
+
operation: "computeClosedParallelTransportFrames",
|
|
127
|
+
});
|
|
101
128
|
const tangents = path.map((_, index) => closedTangentAt(path, index));
|
|
102
|
-
const transportedNormals = [
|
|
129
|
+
const transportedNormals = [
|
|
130
|
+
chooseInitialNormal(tangents[0], initialNormal === undefined
|
|
131
|
+
? undefined
|
|
132
|
+
: guideData(initialNormal, "computeClosedParallelTransportFrames")),
|
|
133
|
+
];
|
|
103
134
|
for (let index = 1; index < tangents.length; index += 1) {
|
|
104
135
|
transportedNormals.push(transportNormal(transportedNormals[index - 1], tangents[index - 1], tangents[index]));
|
|
105
136
|
}
|
|
@@ -1,31 +1,40 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
1
2
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
|
|
2
3
|
/**
|
|
3
4
|
* Creates `segments + 1` points including exact helix endpoints from finite positive dimensions.
|
|
5
|
+
*
|
|
4
6
|
* Integrated weights must remain finite. The maxPathPoints ceiling defaults to 100000; excessive
|
|
5
7
|
* exact counts reject before evaluating axial weights or allocating sample arrays.
|
|
8
|
+
* Invalid inputs use GeometryError; exceptions thrown by axialWeight propagate unchanged.
|
|
6
9
|
*/
|
|
7
10
|
export const sampleHelix = ({ turns, radius, height, segments, limits, axialWeight = () => 1, }) => {
|
|
8
11
|
if (![turns, radius, height].every(Number.isFinite) || !(turns > 0 && radius > 0 && height > 0)) {
|
|
9
|
-
throw new
|
|
12
|
+
throw new GeometryError([turns, radius, height].every(Number.isFinite) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", "Helix turns, radius, and height must be finite and positive.", { operation: "sampleHelix" });
|
|
10
13
|
}
|
|
11
14
|
if (!Number.isInteger(segments) || segments < 3) {
|
|
12
|
-
throw new
|
|
15
|
+
throw new GeometryError("INVALID_ARGUMENT", "A helix needs at least three segments.", {
|
|
16
|
+
operation: "sampleHelix",
|
|
17
|
+
});
|
|
13
18
|
}
|
|
14
19
|
assertSamplingCount(segments + 1, "sampleHelix", resolveGeometrySamplingLimits(limits).maxPathPoints);
|
|
15
20
|
const angleRange = Math.PI * 2 * turns;
|
|
16
21
|
if (!Number.isFinite(angleRange)) {
|
|
17
|
-
throw new
|
|
22
|
+
throw new GeometryError("NON_FINITE_VALUE", "Helix angle range must be finite.", {
|
|
23
|
+
operation: "sampleHelix",
|
|
24
|
+
});
|
|
18
25
|
}
|
|
19
26
|
const weights = Array.from({ length: segments }, (_, index) => {
|
|
20
27
|
const value = axialWeight((index + 0.5) / segments);
|
|
21
28
|
if (!Number.isFinite(value) || value <= 0) {
|
|
22
|
-
throw new
|
|
29
|
+
throw new GeometryError(Number.isFinite(value) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", "Helix axial weights must be finite and positive.", { operation: "sampleHelix" });
|
|
23
30
|
}
|
|
24
31
|
return value;
|
|
25
32
|
});
|
|
26
33
|
const totalWeight = weights.reduce((sum, weight) => sum + weight, 0);
|
|
27
34
|
if (!Number.isFinite(totalWeight)) {
|
|
28
|
-
throw new
|
|
35
|
+
throw new GeometryError("NON_FINITE_VALUE", "Helix integrated axial weight must be finite.", {
|
|
36
|
+
operation: "sampleHelix",
|
|
37
|
+
});
|
|
29
38
|
}
|
|
30
39
|
let accumulatedWeight = 0;
|
|
31
40
|
const result = [];
|
|
@@ -41,7 +50,9 @@ export const sampleHelix = ({ turns, radius, height, segments, limits, axialWeig
|
|
|
41
50
|
height * (accumulatedWeight / totalWeight),
|
|
42
51
|
];
|
|
43
52
|
if (!point.every(Number.isFinite)) {
|
|
44
|
-
throw new
|
|
53
|
+
throw new GeometryError("NON_FINITE_VALUE", "Helix sampled coordinates must be finite.", {
|
|
54
|
+
operation: "sampleHelix",
|
|
55
|
+
});
|
|
45
56
|
}
|
|
46
57
|
result.push(point);
|
|
47
58
|
}
|