@metamesh/modeling 0.14.0 → 0.15.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 +42 -0
- package/README.md +25 -10
- package/dist/api/engine.d.ts +11 -4
- package/dist/api/geometry.d.ts +345 -341
- package/dist/api/index.d.ts +262 -144
- package/dist/api/text.d.ts +3 -1
- package/dist/docs/guides/concepts.md +22 -7
- package/dist/docs/guides/fundamentals.md +8 -5
- package/dist/docs/guides/hosting.md +21 -11
- package/dist/docs/guides/recipes.md +42 -21
- package/dist/docs/manifest.json +710 -507
- 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 +20 -9
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +2 -2
- package/dist/docs/reference/engine/categories/host-lifecycle.md +2 -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 +2 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +1 -1
- package/dist/docs/reference/geometry/ArcCurve2.md +5 -5
- package/dist/docs/reference/geometry/ArcCurve3.md +5 -5
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +10 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +1 -1
- package/dist/docs/reference/geometry/Bounds2.md +1 -1
- package/dist/docs/reference/geometry/Bounds3.md +1 -1
- package/dist/docs/reference/geometry/BoundsFit2.md +1 -1
- package/dist/docs/reference/geometry/BoundsFit3.md +1 -1
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +1 -1
- 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 +8 -8
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +1 -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 +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +1 -1
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +1 -1
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +3 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -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 +1 -1
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
- package/dist/docs/reference/geometry/Frame3.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +9 -3
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +6 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +1 -1
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
- package/dist/docs/reference/geometry/LineCurve2.md +1 -1
- package/dist/docs/reference/geometry/LineCurve3.md +1 -1
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +4 -4
- package/dist/docs/reference/geometry/LoftOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
- package/dist/docs/reference/geometry/Path2-type.md +192 -0
- package/dist/docs/reference/geometry/Path2Data.md +14 -0
- package/dist/docs/reference/geometry/Path2Input.md +15 -0
- package/dist/docs/reference/geometry/Path3-type.md +192 -0
- package/dist/docs/reference/geometry/Path3Data.md +14 -0
- package/dist/docs/reference/geometry/Path3Input.md +15 -0
- package/dist/docs/reference/geometry/PathFrame.md +1 -1
- package/dist/docs/reference/geometry/PathLocation.md +65 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +4 -3
- package/dist/docs/reference/geometry/PathOptions.md +34 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +1 -1
- package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +1 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +1 -1
- package/dist/docs/reference/geometry/PolygonData.md +1 -1
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +4 -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 +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/Profile.md +1 -1
- package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
- package/dist/docs/reference/geometry/ProfileSpan2.md +2 -2
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +5 -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 +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +1 -1
- package/dist/docs/reference/geometry/RegionData.md +1 -1
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +9 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +1 -1
- package/dist/docs/reference/geometry/SampledCurve3.md +1 -1
- package/dist/docs/reference/geometry/SampledThreadHelices.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +3 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/StrokeCap.md +7 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +7 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +7 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +13 -13
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +11 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +9 -9
- package/dist/docs/reference/geometry/SweepOptions.md +6 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +1 -1
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadRole.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +6 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +6 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +1 -1
- package/dist/docs/reference/geometry/Transform2Input.md +1 -1
- package/dist/docs/reference/geometry/Transform2Matrix.md +1 -1
- package/dist/docs/reference/geometry/Transform3-type.md +1 -1
- package/dist/docs/reference/geometry/Transform3Input.md +1 -1
- package/dist/docs/reference/geometry/Transform3Matrix.md +1 -1
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +1 -1
- package/dist/docs/reference/geometry/Vector2Input.md +1 -1
- package/dist/docs/reference/geometry/Vector2Tuple.md +1 -1
- package/dist/docs/reference/geometry/Vector3-type.md +1 -1
- package/dist/docs/reference/geometry/Vector3Input.md +1 -1
- package/dist/docs/reference/geometry/Vector3Tuple.md +1 -1
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
- package/dist/docs/reference/geometry/add2.md +1 -1
- package/dist/docs/reference/geometry/add3.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +2 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +9 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +1 -1
- package/dist/docs/reference/geometry/applyTransformPoint3.md +1 -1
- package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +13 -13
- package/dist/docs/reference/geometry/boundsCenter.md +1 -1
- package/dist/docs/reference/geometry/boundsFromSize.md +1 -1
- package/dist/docs/reference/geometry/boundsSize.md +1 -1
- package/dist/docs/reference/geometry/boxAnchor3.md +4 -4
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +15 -13
- package/dist/docs/reference/geometry/categories/mechanical.md +6 -6
- package/dist/docs/reference/geometry/categories/meshes.md +3 -4
- package/dist/docs/reference/geometry/categories/pattern-placement.md +6 -6
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -3
- package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
- package/dist/docs/reference/geometry/categories/transforms-math.md +5 -5
- package/dist/docs/reference/geometry/categories/vector-import.md +5 -5
- package/dist/docs/reference/geometry/circleContour.md +1 -1
- package/dist/docs/reference/geometry/closeToAxis.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -5
- package/dist/docs/reference/geometry/composeTransform3.md +1 -1
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +10 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +1 -1
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +4 -4
- package/dist/docs/reference/geometry/containsBounds.md +1 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +1 -1
- package/dist/docs/reference/geometry/cross2.md +1 -1
- package/dist/docs/reference/geometry/cross3.md +1 -1
- package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +1 -1
- package/dist/docs/reference/geometry/distance3.md +1 -1
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
- package/dist/docs/reference/geometry/dot2.md +1 -1
- package/dist/docs/reference/geometry/dot3.md +1 -1
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +1 -1
- package/dist/docs/reference/geometry/extrudeMesh.md +8 -8
- package/dist/docs/reference/geometry/fitBounds.md +1 -1
- package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
- package/dist/docs/reference/geometry/frameTransform3.md +1 -1
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +3 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +2 -2
- package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +5 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +5 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +1 -1
- package/dist/docs/reference/geometry/isGeometryError.md +1 -1
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
- package/dist/docs/reference/geometry/layoutRow.md +1 -1
- package/dist/docs/reference/geometry/length2.md +1 -1
- package/dist/docs/reference/geometry/length3.md +1 -1
- package/dist/docs/reference/geometry/lerp2.md +1 -1
- package/dist/docs/reference/geometry/lerp3.md +1 -1
- package/dist/docs/reference/geometry/linearPatternTransforms.md +2 -2
- package/dist/docs/reference/geometry/loftMesh.md +2 -1
- package/dist/docs/reference/geometry/matchProfiles.md +1 -1
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +1 -1
- package/dist/docs/reference/geometry/meshBounds.md +1 -1
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +3 -3
- package/dist/docs/reference/geometry/normalize2.md +1 -1
- package/dist/docs/reference/geometry/normalize3.md +1 -1
- package/dist/docs/reference/geometry/normalizeContour.md +1 -1
- package/dist/docs/reference/geometry/normalizePolygon.md +1 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +1 -1
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +11 -11
- package/dist/docs/reference/geometry/path2.md +42 -0
- package/dist/docs/reference/geometry/path3.md +42 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +3 -3
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
- package/dist/docs/reference/geometry/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/geometry/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/geometry/projectOntoPlane3.md +1 -1
- package/dist/docs/reference/geometry/radialPatternTransforms.md +1 -17
- package/dist/docs/reference/geometry/rectangleContour.md +1 -1
- package/dist/docs/reference/geometry/rectangleProfile.md +1 -1
- package/dist/docs/reference/geometry/regionArea.md +1 -1
- package/dist/docs/reference/geometry/regionBounds.md +1 -1
- package/dist/docs/reference/geometry/regularPolygonContour.md +2 -2
- package/dist/docs/reference/geometry/resamplePolyline2.md +2 -2
- package/dist/docs/reference/geometry/resamplePolyline3.md +2 -2
- 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 +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +3 -3
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/revolveMesh.md +10 -10
- package/dist/docs/reference/geometry/rotate2.md +1 -1
- package/dist/docs/reference/geometry/rotationTransform3.md +1 -1
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +6 -4
- package/dist/docs/reference/geometry/sampleContour.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve2.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +2 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleHelix.md +2 -2
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +4 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +3 -3
- package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +2 -2
- package/dist/docs/reference/geometry/scale2.md +1 -1
- package/dist/docs/reference/geometry/scale3.md +1 -1
- package/dist/docs/reference/geometry/scaleTransform3.md +1 -1
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +1 -1
- package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
- package/dist/docs/reference/geometry/subtract2.md +1 -1
- package/dist/docs/reference/geometry/subtract3.md +1 -1
- package/dist/docs/reference/geometry/sweepMesh.md +9 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +6 -6
- package/dist/docs/reference/geometry/transform2.md +1 -1
- package/dist/docs/reference/geometry/transform3.md +1 -1
- package/dist/docs/reference/geometry/transformDeterminant3.md +1 -1
- package/dist/docs/reference/geometry/transformRegionData.md +1 -1
- package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
- package/dist/docs/reference/geometry/translationTransform3.md +1 -1
- package/dist/docs/reference/geometry/triangulateContour.md +1 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +2 -2
- package/dist/docs/reference/geometry/validateTransform3.md +1 -1
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +1 -1
- package/dist/docs/reference/geometry/vector3.md +1 -1
- package/dist/docs/reference/geometry.md +2 -2
- package/dist/docs/reference/model/Anchor3.md +1 -1
- package/dist/docs/reference/model/AttachOptions.md +10 -5
- package/dist/docs/reference/model/Bounds2.md +1 -1
- package/dist/docs/reference/model/Bounds3.md +1 -1
- 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 +8 -8
- 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 +1 -1
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +1 -1
- 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 +18 -8
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +1 -1
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +1 -1
- package/dist/docs/reference/model/GeneratedPart.md +1 -1
- package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
- package/dist/docs/reference/model/GenerationError.md +1 -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 +9 -3
- package/dist/docs/reference/model/HeightfieldOptions.md +1 -1
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +3 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/model/HullOptions.md +5 -5
- package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
- package/dist/docs/reference/model/ImplicitOptions.md +1 -1
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +4 -4
- package/dist/docs/reference/model/LinearPatternOptions.md +12 -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 +1 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +1 -1
- package/dist/docs/reference/model/PartGeometry.md +1 -1
- package/dist/docs/reference/model/PartOptions.md +1 -1
- package/dist/docs/reference/model/Path2-type.md +192 -0
- package/dist/docs/reference/model/Path2Data.md +14 -0
- package/dist/docs/reference/model/Path2Input.md +15 -0
- package/dist/docs/reference/model/Path3-type.md +192 -0
- package/dist/docs/reference/model/Path3Data.md +14 -0
- package/dist/docs/reference/model/Path3Input.md +15 -0
- package/dist/docs/reference/model/PathLocation.md +65 -0
- package/dist/docs/reference/model/PathNormalGuide.md +4 -3
- package/dist/docs/reference/model/PathOptions.md +34 -0
- package/dist/docs/reference/model/PathPatternOptions.md +3 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +79 -0
- package/dist/docs/reference/model/PatternSource.md +1 -1
- package/dist/docs/reference/model/Pivot2Options.md +1 -1
- package/dist/docs/reference/model/Pivot3Options.md +1 -1
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/PolygonData.md +1 -1
- package/dist/docs/reference/model/PolygonOptions.md +8 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +7 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +41 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/model/Profile.md +1 -1
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +1 -1
- package/dist/docs/reference/model/ProfileSpan2.md +2 -2
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/RadialPatternOptions.md +17 -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 +1 -1
- 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 +8 -8
- package/dist/docs/reference/model/RegionData.md +1 -1
- 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 +12 -11
- package/dist/docs/reference/model/SectionHullOptions.md +5 -5
- package/dist/docs/reference/model/SectionInspection.md +7 -7
- 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 +23 -6
- package/dist/docs/reference/model/SolidInspection.md +4 -4
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +3 -3
- 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 +1 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/model/ThreadHandedness.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/model/ThreadProfile.md +1 -1
- package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +4 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +4 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +1 -1
- package/dist/docs/reference/model/Transform2Input.md +1 -1
- package/dist/docs/reference/model/Transform2Matrix.md +1 -1
- package/dist/docs/reference/model/Transform3-type.md +1 -1
- package/dist/docs/reference/model/Transform3Input.md +1 -1
- package/dist/docs/reference/model/Transform3Matrix.md +1 -1
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +1 -1
- package/dist/docs/reference/model/Vector2Input.md +1 -1
- package/dist/docs/reference/model/Vector2Tuple.md +1 -1
- package/dist/docs/reference/model/Vector3-type.md +1 -1
- package/dist/docs/reference/model/Vector3Input.md +1 -1
- package/dist/docs/reference/model/Vector3Tuple.md +1 -1
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/anchor.md +1 -1
- package/dist/docs/reference/model/box.md +3 -3
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +1 -1
- package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -1
- package/dist/docs/reference/model/categories/contracts.md +2 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +1 -1
- package/dist/docs/reference/model/categories/explicit-profiles.md +2 -2
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +2 -2
- package/dist/docs/reference/model/categories/generation.md +1 -1
- package/dist/docs/reference/model/categories/inspection.md +4 -5
- package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
- package/dist/docs/reference/model/categories/paths.md +33 -0
- package/dist/docs/reference/model/categories/primitives.md +2 -2
- package/dist/docs/reference/model/categories/resolution.md +2 -2
- package/dist/docs/reference/model/categories/sections.md +3 -4
- package/dist/docs/reference/model/categories/threads.md +5 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +8 -8
- 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 +1 -1
- package/dist/docs/reference/model/gridPattern.md +4 -4
- package/dist/docs/reference/model/heightfield.md +1 -1
- package/dist/docs/reference/model/hull.md +1 -1
- package/dist/docs/reference/model/immutableBuffer.md +1 -1
- package/dist/docs/reference/model/immutableMesh.md +1 -1
- package/dist/docs/reference/model/implicit.md +1 -1
- 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 +4 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +1 -1
- package/dist/docs/reference/model/linearPattern.md +4 -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 +42 -0
- package/dist/docs/reference/model/path3.md +42 -0
- package/dist/docs/reference/model/pathPattern.md +13 -12
- package/dist/docs/reference/model/polygon.md +4 -4
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/model/radialPattern.md +5 -37
- package/dist/docs/reference/model/rectangle.md +3 -3
- 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 +2 -2
- package/dist/docs/reference/model/threadedNut.md +4 -4
- package/dist/docs/reference/model/threadedRod.md +4 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +1 -1
- package/dist/docs/reference/model/transform3.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/vector3.md +1 -1
- package/dist/docs/reference/model.md +3 -2
- package/dist/docs/reference/text/Bounds2.md +1 -1
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +3 -3
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +1 -1
- 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/loft-operations.js +35 -14
- package/dist/engine/model-summary.js +8 -5
- 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 +6 -0
- 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 +24 -24
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/curves/sampling.js +14 -14
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/index.js +9 -10
- 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/mechanical/gear-motion.js +3 -3
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +3 -3
- 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 +4 -5
- 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 +2 -2
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- 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 +7 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +8 -19
- package/dist/geometry/paths/frames.js +41 -11
- package/dist/geometry/paths/helix.js +16 -6
- package/dist/geometry/paths/path-value.js +252 -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 +2 -2
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/profiles/contour.js +6 -6
- package/dist/geometry/profiles/matched.js +4 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +4 -4
- package/dist/geometry/profiles/side-profile.js +7 -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 +23 -23
- 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/transform-geometry.js +7 -14
- package/dist/index.js +1 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +66 -6
- package/dist/model/operations.js +25 -26
- package/dist/model/recipe-declaration.js +13 -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/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/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/Path2.md +0 -20
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/geometry/paths/path.js +0 -32
|
@@ -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,9 @@
|
|
|
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";
|
|
@@ -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,
|
|
@@ -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));
|
|
@@ -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 }),
|
|
@@ -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
|
}
|
|
@@ -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
|
}
|