@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
|
@@ -36,9 +36,9 @@ function validationWork(mesh, options) {
|
|
|
36
36
|
operation: "validateSolidMesh",
|
|
37
37
|
});
|
|
38
38
|
const count = mesh.indices.length / 3;
|
|
39
|
-
const
|
|
40
|
-
if (!Number.isSafeInteger(
|
|
41
|
-
throw new GeometryError("INVALID_ARGUMENT", "Solid validation
|
|
39
|
+
const maxTests = options.maxTests ?? MAXIMUM_TESTS;
|
|
40
|
+
if (!Number.isSafeInteger(maxTests) || maxTests < 1 || maxTests > MAXIMUM_TESTS)
|
|
41
|
+
throw new GeometryError("INVALID_ARGUMENT", "Solid validation maxTests must be an integer from 1 through 2,000,000.", { operation: "validateSolidMesh" });
|
|
42
42
|
if (count > MAXIMUM_TRIANGLES)
|
|
43
43
|
throw new GeometryError("COMPLEXITY_LIMIT", "Solid validation exceeds its triangle ceiling.", {
|
|
44
44
|
operation: "validateSolidMesh",
|
|
@@ -46,7 +46,7 @@ function validationWork(mesh, options) {
|
|
|
46
46
|
});
|
|
47
47
|
if (mesh.positions.length / 3 > mesh.indices.length)
|
|
48
48
|
throw new GeometryError("INVALID_MESH", "Solid validation requires every position-buffer vertex to be referenced.", { operation: "validateSolidMesh" });
|
|
49
|
-
return { count,
|
|
49
|
+
return { count, maxTests };
|
|
50
50
|
}
|
|
51
51
|
/** @internal Fresh measurements precede one adjacency traversal for closure, fans, and shells. */
|
|
52
52
|
export function analyzeSolidMesh(mesh, options = {}) {
|
|
@@ -71,14 +71,14 @@ export function validateAnalyzedSolidMesh(mesh, measurements, options = {}) {
|
|
|
71
71
|
: mesh;
|
|
72
72
|
checkSolidGeometry(source, measurements, options, validationWork(source, options));
|
|
73
73
|
}
|
|
74
|
-
function checkSolidGeometry(mesh, facts, options, { count,
|
|
74
|
+
function checkSolidGeometry(mesh, facts, options, { count, maxTests }) {
|
|
75
75
|
const epsilon = resolveGeometryTolerance(Math.hypot(...facts.bounds.max.map((value, axis) => value - facts.bounds.min[axis])), options.tolerance).linear;
|
|
76
76
|
let tests = 0;
|
|
77
77
|
const spend = () => {
|
|
78
|
-
if (++tests >
|
|
78
|
+
if (++tests > maxTests)
|
|
79
79
|
throw new GeometryError("COMPLEXITY_LIMIT", "Solid validation exhausted its work ceiling.", {
|
|
80
80
|
operation: "validateSolidMesh",
|
|
81
|
-
details: { required: tests, allowed:
|
|
81
|
+
details: { required: tests, allowed: maxTests },
|
|
82
82
|
});
|
|
83
83
|
};
|
|
84
84
|
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);
|
|
@@ -40,15 +52,20 @@ const transportNormal = (normal, previousTangent, tangent) => {
|
|
|
40
52
|
* Builds rotation-minimizing frames by parallel-transporting the previous normal.
|
|
41
53
|
* This avoids the sudden profile flips produced by picking a fresh up-vector per ring.
|
|
42
54
|
* Paths exceeding maxPathPoints (default 100000) reject before frame allocation or guide evaluation.
|
|
55
|
+
* Requires open path values; raw tuples are interpreted as an open path. Invalid paths throw GeometryError.
|
|
56
|
+
* Nonfinite normals and guide results reject. A finite initial guide parallel to the tangent selects a canonical fallback.
|
|
43
57
|
*/
|
|
44
|
-
export const computeParallelTransportFrames = (
|
|
58
|
+
export const computeParallelTransportFrames = (input, initialNormal, normalGuide, limits = {}) => {
|
|
59
|
+
const { points: path } = path3InputData(input, false, limits);
|
|
45
60
|
if (path.length < 2) {
|
|
46
|
-
throw new
|
|
61
|
+
throw new GeometryError("INVALID_ARGUMENT", "A framed path needs at least two points.", {
|
|
62
|
+
operation: "computeParallelTransportFrames",
|
|
63
|
+
});
|
|
47
64
|
}
|
|
48
|
-
assertSamplingCount(path.length, "computeParallelTransportFrames", resolveGeometrySamplingLimits(limits).maxPathPoints);
|
|
49
65
|
const tangents = path.map((_, index) => tangentAt(path, index));
|
|
50
66
|
const firstTangent = tangents[0];
|
|
51
|
-
|
|
67
|
+
const firstGuide = normalGuide?.(path[0], 0) ?? initialNormal;
|
|
68
|
+
let normal = chooseInitialNormal(firstTangent, firstGuide === undefined ? undefined : guideData(firstGuide, "computeParallelTransportFrames"));
|
|
52
69
|
const frames = [
|
|
53
70
|
{
|
|
54
71
|
tangent: firstTangent,
|
|
@@ -64,7 +81,7 @@ export const computeParallelTransportFrames = (path, initialNormal, normalGuide,
|
|
|
64
81
|
normal = transportNormal(normal, previousTangent, tangent);
|
|
65
82
|
}
|
|
66
83
|
else {
|
|
67
|
-
const guided = normalize3(projectOntoPlane3(guide, tangent));
|
|
84
|
+
const guided = normalize3(projectOntoPlane3(guideData(guide, "computeParallelTransportFrames"), tangent));
|
|
68
85
|
// A guide describes an unoriented plane direction. Preserve the prior
|
|
69
86
|
// sign so noisy guide inputs cannot create a 180-degree seam flip.
|
|
70
87
|
normal = dot3(guided, normal) < 0 ? scale3(guided, -1) : guided;
|
|
@@ -92,14 +109,27 @@ const signedAngleAround = (from, to, axis) => Math.atan2(dot3(axis, cross3(from,
|
|
|
92
109
|
* normal back to the first tangent measures seam holonomy; distributing that residual rotation
|
|
93
110
|
* uniformly over all path intervals avoids a visible seam or accumulated frame flip.
|
|
94
111
|
* The maxPathPoints ceiling (default 100000) bounds path points and frames.
|
|
112
|
+
* Requires closed path values; raw tuples are interpreted as closed and must omit their seam point.
|
|
113
|
+
* Invalid paths throw GeometryError.
|
|
114
|
+
* Nonfinite initial normals reject; finite parallel preferences select a canonical fallback.
|
|
95
115
|
*/
|
|
96
|
-
export const computeClosedParallelTransportFrames = (
|
|
116
|
+
export const computeClosedParallelTransportFrames = (input, initialNormal, limits = {}) => {
|
|
117
|
+
const { points: path } = path3InputData(input, true, limits);
|
|
97
118
|
if (path.length < 3) {
|
|
98
|
-
throw new
|
|
119
|
+
throw new GeometryError("INVALID_ARGUMENT", "A closed framed path needs at least three points.", {
|
|
120
|
+
operation: "computeClosedParallelTransportFrames",
|
|
121
|
+
});
|
|
99
122
|
}
|
|
100
|
-
|
|
123
|
+
if (path[0].every((coordinate, axis) => coordinate === path.at(-1)[axis]))
|
|
124
|
+
throw new GeometryError("INVALID_ARGUMENT", "Closed framed paths omit their repeated seam point.", {
|
|
125
|
+
operation: "computeClosedParallelTransportFrames",
|
|
126
|
+
});
|
|
101
127
|
const tangents = path.map((_, index) => closedTangentAt(path, index));
|
|
102
|
-
const transportedNormals = [
|
|
128
|
+
const transportedNormals = [
|
|
129
|
+
chooseInitialNormal(tangents[0], initialNormal === undefined
|
|
130
|
+
? undefined
|
|
131
|
+
: guideData(initialNormal, "computeClosedParallelTransportFrames")),
|
|
132
|
+
];
|
|
103
133
|
for (let index = 1; index < tangents.length; index += 1) {
|
|
104
134
|
transportedNormals.push(transportNormal(transportedNormals[index - 1], tangents[index - 1], tangents[index]));
|
|
105
135
|
}
|
|
@@ -1,31 +1,39 @@
|
|
|
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.
|
|
4
5
|
* Integrated weights must remain finite. The maxPathPoints ceiling defaults to 100000; excessive
|
|
5
6
|
* exact counts reject before evaluating axial weights or allocating sample arrays.
|
|
7
|
+
* Invalid inputs use GeometryError; exceptions thrown by axialWeight propagate unchanged.
|
|
6
8
|
*/
|
|
7
9
|
export const sampleHelix = ({ turns, radius, height, segments, limits, axialWeight = () => 1, }) => {
|
|
8
10
|
if (![turns, radius, height].every(Number.isFinite) || !(turns > 0 && radius > 0 && height > 0)) {
|
|
9
|
-
throw new
|
|
11
|
+
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
12
|
}
|
|
11
13
|
if (!Number.isInteger(segments) || segments < 3) {
|
|
12
|
-
throw new
|
|
14
|
+
throw new GeometryError("INVALID_ARGUMENT", "A helix needs at least three segments.", {
|
|
15
|
+
operation: "sampleHelix",
|
|
16
|
+
});
|
|
13
17
|
}
|
|
14
18
|
assertSamplingCount(segments + 1, "sampleHelix", resolveGeometrySamplingLimits(limits).maxPathPoints);
|
|
15
19
|
const angleRange = Math.PI * 2 * turns;
|
|
16
20
|
if (!Number.isFinite(angleRange)) {
|
|
17
|
-
throw new
|
|
21
|
+
throw new GeometryError("NON_FINITE_VALUE", "Helix angle range must be finite.", {
|
|
22
|
+
operation: "sampleHelix",
|
|
23
|
+
});
|
|
18
24
|
}
|
|
19
25
|
const weights = Array.from({ length: segments }, (_, index) => {
|
|
20
26
|
const value = axialWeight((index + 0.5) / segments);
|
|
21
27
|
if (!Number.isFinite(value) || value <= 0) {
|
|
22
|
-
throw new
|
|
28
|
+
throw new GeometryError(Number.isFinite(value) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", "Helix axial weights must be finite and positive.", { operation: "sampleHelix" });
|
|
23
29
|
}
|
|
24
30
|
return value;
|
|
25
31
|
});
|
|
26
32
|
const totalWeight = weights.reduce((sum, weight) => sum + weight, 0);
|
|
27
33
|
if (!Number.isFinite(totalWeight)) {
|
|
28
|
-
throw new
|
|
34
|
+
throw new GeometryError("NON_FINITE_VALUE", "Helix integrated axial weight must be finite.", {
|
|
35
|
+
operation: "sampleHelix",
|
|
36
|
+
});
|
|
29
37
|
}
|
|
30
38
|
let accumulatedWeight = 0;
|
|
31
39
|
const result = [];
|
|
@@ -41,7 +49,9 @@ export const sampleHelix = ({ turns, radius, height, segments, limits, axialWeig
|
|
|
41
49
|
height * (accumulatedWeight / totalWeight),
|
|
42
50
|
];
|
|
43
51
|
if (!point.every(Number.isFinite)) {
|
|
44
|
-
throw new
|
|
52
|
+
throw new GeometryError("NON_FINITE_VALUE", "Helix sampled coordinates must be finite.", {
|
|
53
|
+
operation: "sampleHelix",
|
|
54
|
+
});
|
|
45
55
|
}
|
|
46
56
|
result.push(point);
|
|
47
57
|
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { immutableMathClass } from "../math/immutable-value.js";
|
|
3
|
+
import { vector2, vector2Data, vector3, vector3Data, } from "../math/vector-value.js";
|
|
4
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
|
|
5
|
+
import { transformPath2, transformPath3 } from "../transform-geometry.js";
|
|
6
|
+
import { closestPointOnValidatedPath } from "./closest-point.js";
|
|
7
|
+
import { resamplePath2Data, resamplePath3Data } from "./resampling.js";
|
|
8
|
+
const fail = (message, code = "INVALID_ARGUMENT") => {
|
|
9
|
+
throw new GeometryError(code, message, { operation: "path" });
|
|
10
|
+
};
|
|
11
|
+
// Ordinary tuples keep numerical loops fast. Never expose this owned storage to callers or guides;
|
|
12
|
+
// the deeply frozen interchange snapshot is created only when a consumer actually needs it.
|
|
13
|
+
const pathStates = new WeakMap();
|
|
14
|
+
const stateOf = (owner) => pathStates.get(owner);
|
|
15
|
+
const points2 = (owner) => stateOf(owner).points;
|
|
16
|
+
const points3 = (owner) => stateOf(owner).points;
|
|
17
|
+
function freezePoints(points) {
|
|
18
|
+
for (const point of points)
|
|
19
|
+
Object.freeze(point);
|
|
20
|
+
return Object.freeze(points);
|
|
21
|
+
}
|
|
22
|
+
function frozenArray(owner) {
|
|
23
|
+
const state = stateOf(owner);
|
|
24
|
+
return (state.array ??= freezePoints(state.points.map((point) => [...point])));
|
|
25
|
+
}
|
|
26
|
+
function closedOption(closed) {
|
|
27
|
+
if (closed !== undefined && typeof closed !== "boolean")
|
|
28
|
+
fail("Path closed must be a boolean.");
|
|
29
|
+
return closed ?? false;
|
|
30
|
+
}
|
|
31
|
+
function snapshot(input, dimension, limits) {
|
|
32
|
+
if (!Array.isArray(input))
|
|
33
|
+
fail("Path points must be an array of coordinate tuples or vectors.");
|
|
34
|
+
const count = input.length;
|
|
35
|
+
assertSamplingCount(count, "path", limits.maxPathPoints);
|
|
36
|
+
const points = [];
|
|
37
|
+
for (let index = 0; index < count; index++) {
|
|
38
|
+
const values = dimension === 2
|
|
39
|
+
? vector2Data(input[index])
|
|
40
|
+
: vector3Data(input[index]);
|
|
41
|
+
// Read exactly the required coordinates once; user accessors and array iterators cannot
|
|
42
|
+
// change an already validated snapshot or grow its allocation beyond the initial ceiling.
|
|
43
|
+
const copied = dimension === 2 ? [values[0], values[1]] : [values[0], values[1], values[2]];
|
|
44
|
+
for (const coordinate of copied)
|
|
45
|
+
if (!Number.isFinite(coordinate))
|
|
46
|
+
fail("Path coordinates must be finite.", "NON_FINITE_VALUE");
|
|
47
|
+
points.push(copied);
|
|
48
|
+
}
|
|
49
|
+
return points;
|
|
50
|
+
}
|
|
51
|
+
function validateClosure(points, closed) {
|
|
52
|
+
if (!closed)
|
|
53
|
+
return;
|
|
54
|
+
if (points.length < 3)
|
|
55
|
+
fail("Closed paths need at least three vertices.");
|
|
56
|
+
const first = points[0], last = points.at(-1);
|
|
57
|
+
if (first.every((coordinate, index) => coordinate === last[index]))
|
|
58
|
+
fail("Closed paths omit the repeated closing vertex.");
|
|
59
|
+
}
|
|
60
|
+
function pathSource(input, closed, dimension) {
|
|
61
|
+
if (Array.isArray(input))
|
|
62
|
+
return { points: input, closed: closedOption(closed) };
|
|
63
|
+
if (typeof input !== "object" ||
|
|
64
|
+
input === null ||
|
|
65
|
+
!("toArray" in input) ||
|
|
66
|
+
typeof input.toArray !== "function" ||
|
|
67
|
+
!("closed" in input) ||
|
|
68
|
+
!("dimension" in input) ||
|
|
69
|
+
input.dimension !== dimension)
|
|
70
|
+
return fail("Expected a path or an array of coordinate tuples or vectors.");
|
|
71
|
+
if (typeof input.closed !== "boolean")
|
|
72
|
+
fail("Path closure metadata must be a boolean.");
|
|
73
|
+
const sourceClosed = input.closed;
|
|
74
|
+
if (closed !== undefined && closedOption(closed) !== sourceClosed)
|
|
75
|
+
fail("The closed option conflicts with the path's closure.");
|
|
76
|
+
const points = pathStates.get(input)?.points ?? input.toArray();
|
|
77
|
+
if (!Array.isArray(points))
|
|
78
|
+
fail("Path points must be an array of coordinate tuples or vectors.");
|
|
79
|
+
return { points, closed: sourceClosed };
|
|
80
|
+
}
|
|
81
|
+
function measuredLength(owner) {
|
|
82
|
+
const state = stateOf(owner);
|
|
83
|
+
const cached = state.length;
|
|
84
|
+
if (cached !== undefined)
|
|
85
|
+
return cached;
|
|
86
|
+
const points = state.points;
|
|
87
|
+
let total = 0;
|
|
88
|
+
const count = owner.closed ? points.length : Math.max(0, points.length - 1);
|
|
89
|
+
for (let index = 0; index < count; index++) {
|
|
90
|
+
const a = points[index], b = points[(index + 1) % points.length];
|
|
91
|
+
total += Math.hypot(b[0] - a[0], b[1] - a[1], (b[2] ?? 0) - (a[2] ?? 0));
|
|
92
|
+
if (!Number.isFinite(total))
|
|
93
|
+
fail("Path length exceeds finite arithmetic.", "NON_FINITE_VALUE");
|
|
94
|
+
}
|
|
95
|
+
state.length = total;
|
|
96
|
+
return total;
|
|
97
|
+
}
|
|
98
|
+
function measuredBounds(points) {
|
|
99
|
+
if (points.length === 0)
|
|
100
|
+
return undefined;
|
|
101
|
+
const min = [...points[0]], max = [...points[0]];
|
|
102
|
+
for (let index = 1; index < points.length; index++) {
|
|
103
|
+
const point = points[index];
|
|
104
|
+
for (let axis = 0; axis < point.length; axis++) {
|
|
105
|
+
min[axis] = Math.min(min[axis], point[axis]);
|
|
106
|
+
max[axis] = Math.max(max[axis], point[axis]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return Object.freeze({ min: Object.freeze(min), max: Object.freeze(max) });
|
|
110
|
+
}
|
|
111
|
+
function samplingOptions(options, closed) {
|
|
112
|
+
if (typeof options !== "object" || options === null || Array.isArray(options))
|
|
113
|
+
fail("Path resampling options must be an object.");
|
|
114
|
+
if ("closed" in options)
|
|
115
|
+
fail("Path resampling preserves its existing closure.");
|
|
116
|
+
return { ...options, closed };
|
|
117
|
+
}
|
|
118
|
+
const PlanarPath = /* @__PURE__ */ immutableMathClass(class PlanarPath {
|
|
119
|
+
closed;
|
|
120
|
+
dimension = 2;
|
|
121
|
+
constructor(points, closed) {
|
|
122
|
+
this.closed = closed;
|
|
123
|
+
pathStates.set(this, { points });
|
|
124
|
+
Object.freeze(this);
|
|
125
|
+
}
|
|
126
|
+
toArray() {
|
|
127
|
+
return frozenArray(this);
|
|
128
|
+
}
|
|
129
|
+
length() {
|
|
130
|
+
return measuredLength(this);
|
|
131
|
+
}
|
|
132
|
+
bounds() {
|
|
133
|
+
return measuredBounds(points2(this));
|
|
134
|
+
}
|
|
135
|
+
closestPoint(point) {
|
|
136
|
+
const location = closestPointOnValidatedPath(points2(this), vector2Data(point), this.closed);
|
|
137
|
+
return Object.freeze({ ...location, point: vector2(location.point) });
|
|
138
|
+
}
|
|
139
|
+
transform(placement) {
|
|
140
|
+
return new PlanarPath(transformPath2(points2(this), placement), this.closed);
|
|
141
|
+
}
|
|
142
|
+
reverse() {
|
|
143
|
+
return new PlanarPath([...points2(this)].reverse(), this.closed);
|
|
144
|
+
}
|
|
145
|
+
resample(options = {}) {
|
|
146
|
+
const policy = samplingOptions(options, this.closed);
|
|
147
|
+
return new PlanarPath(resamplePath2Data(points2(this), policy), this.closed);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
const SpatialPath = /* @__PURE__ */ immutableMathClass(class SpatialPath {
|
|
151
|
+
closed;
|
|
152
|
+
dimension = 3;
|
|
153
|
+
constructor(points, closed) {
|
|
154
|
+
this.closed = closed;
|
|
155
|
+
pathStates.set(this, { points });
|
|
156
|
+
Object.freeze(this);
|
|
157
|
+
}
|
|
158
|
+
toArray() {
|
|
159
|
+
return frozenArray(this);
|
|
160
|
+
}
|
|
161
|
+
length() {
|
|
162
|
+
return measuredLength(this);
|
|
163
|
+
}
|
|
164
|
+
bounds() {
|
|
165
|
+
return measuredBounds(points3(this));
|
|
166
|
+
}
|
|
167
|
+
closestPoint(point) {
|
|
168
|
+
const location = closestPointOnValidatedPath(points3(this), vector3Data(point), this.closed);
|
|
169
|
+
return Object.freeze({ ...location, point: vector3(location.point) });
|
|
170
|
+
}
|
|
171
|
+
transform(placement) {
|
|
172
|
+
return new SpatialPath(transformPath3(points3(this), placement), this.closed);
|
|
173
|
+
}
|
|
174
|
+
reverse() {
|
|
175
|
+
return new SpatialPath([...points3(this)].reverse(), this.closed);
|
|
176
|
+
}
|
|
177
|
+
resample(options = {}) {
|
|
178
|
+
const policy = samplingOptions(options, this.closed);
|
|
179
|
+
return new SpatialPath(resamplePath3Data(points3(this), policy), this.closed);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
/**
|
|
183
|
+
* Snapshots finite XY coordinates as an immutable sampled path, independent of engine initialization.
|
|
184
|
+
* Open paths may be empty or have one point; closed paths need three vertices and omit a duplicated
|
|
185
|
+
* seam. Repeated adjacent vertices are retained. No winding normalization or filling is performed.
|
|
186
|
+
* Malformed dimensions or topology throw INVALID_ARGUMENT; nonfinite coordinates or measurement
|
|
187
|
+
* overflow throw NON_FINITE_VALUE; exhausted allocation ceilings throw COMPLEXITY_LIMIT GeometryError.
|
|
188
|
+
* A path input retains its closure. Limits bound construction only; resampling takes its own limits.
|
|
189
|
+
*/
|
|
190
|
+
export function path2(input, options = {}) {
|
|
191
|
+
validateOptions(options);
|
|
192
|
+
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
193
|
+
const source = pathSource(input, options.closed, 2);
|
|
194
|
+
const points = snapshot(source.points, 2, limits);
|
|
195
|
+
validateClosure(points, source.closed);
|
|
196
|
+
return new PlanarPath(points, source.closed);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Snapshots finite XYZ coordinates as an immutable sampled path with the same closure, seam,
|
|
200
|
+
* allocation and error rules as path2. Analytic curves must be sampled explicitly first.
|
|
201
|
+
*/
|
|
202
|
+
export function path3(input, options = {}) {
|
|
203
|
+
validateOptions(options);
|
|
204
|
+
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
205
|
+
const source = pathSource(input, options.closed, 3);
|
|
206
|
+
const points = snapshot(source.points, 3, limits);
|
|
207
|
+
validateClosure(points, source.closed);
|
|
208
|
+
return new SpatialPath(points, source.closed);
|
|
209
|
+
}
|
|
210
|
+
function validateOptions(options) {
|
|
211
|
+
if (typeof options !== "object" || options === null || Array.isArray(options))
|
|
212
|
+
fail("Path options must be an object.");
|
|
213
|
+
}
|
|
214
|
+
/** Internal aggregate preflight without coordinate reads or copies. */
|
|
215
|
+
export function path2InputPointCount(input, closed) {
|
|
216
|
+
const source = pathSource(input, closed, 2);
|
|
217
|
+
if (!Array.isArray(source.points))
|
|
218
|
+
fail("Path points must be an array of coordinate tuples or vectors.");
|
|
219
|
+
return source.points.length;
|
|
220
|
+
}
|
|
221
|
+
/** Internal source capture for aggregate preflight followed by normalization, reading foreign data once. */
|
|
222
|
+
export function capturePath2Input(input, closed) {
|
|
223
|
+
const source = pathSource(input, closed, 2);
|
|
224
|
+
return {
|
|
225
|
+
input: input instanceof PlanarPath ? input : source.points,
|
|
226
|
+
count: source.points.length,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/** Internal boundary normalization; raw interchange retains the consuming operation's topology rules. */
|
|
230
|
+
export function path2InputData(input, closed, limits) {
|
|
231
|
+
const source = pathSource(input, closed, 2);
|
|
232
|
+
const policy = resolveGeometrySamplingLimits(limits);
|
|
233
|
+
assertSamplingCount(source.points.length, "path", policy.maxPathPoints);
|
|
234
|
+
return {
|
|
235
|
+
points: input instanceof PlanarPath
|
|
236
|
+
? input.toArray()
|
|
237
|
+
: freezePoints(snapshot(source.points, 2, policy)),
|
|
238
|
+
closed: source.closed,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/** Internal boundary normalization; immutable path coordinates can be shared without copying. */
|
|
242
|
+
export function path3InputData(input, closed, limits) {
|
|
243
|
+
const source = pathSource(input, closed, 3);
|
|
244
|
+
const policy = resolveGeometrySamplingLimits(limits);
|
|
245
|
+
assertSamplingCount(source.points.length, "path", policy.maxPathPoints);
|
|
246
|
+
return {
|
|
247
|
+
points: input instanceof SpatialPath
|
|
248
|
+
? input.toArray()
|
|
249
|
+
: freezePoints(snapshot(source.points, 3, policy)),
|
|
250
|
+
closed: source.closed,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { length3, normalize3, subtract3 } from "../math/vector3.js";
|
|
3
3
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
|
|
4
|
+
import { path3InputData } from "./path-value.js";
|
|
5
|
+
const invalidPath = (message, operation) => {
|
|
6
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
7
|
+
};
|
|
4
8
|
const requireFinitePathValues = (values, operation) => {
|
|
5
9
|
if (!values.every(Number.isFinite)) {
|
|
6
10
|
throw new GeometryError("NON_FINITE_VALUE", "Path dimensions and coordinates must be finite.", {
|
|
@@ -22,25 +26,29 @@ const segmentLengths = (path, closed) => path.map((point, index) => {
|
|
|
22
26
|
* open paths include both endpoints when `count` is greater than one.
|
|
23
27
|
* Coordinates and total length must be finite. Input points and output placements are each
|
|
24
28
|
* limited by maxPathPoints (default 100000); exact counts exceeding that ceiling reject before length calculation.
|
|
29
|
+
* Closure defaults to the path value's metadata, or false for tuples. An explicit conflicting closure rejects.
|
|
30
|
+
* Invalid arguments and degenerate paths throw GeometryError.
|
|
25
31
|
*/
|
|
26
|
-
export const distributeAlongPath = (
|
|
27
|
-
if (path.length < (closed ? 3 : 2)) {
|
|
28
|
-
throw new Error(`${closed ? "Closed" : "Open"} distribution paths need more points.`);
|
|
29
|
-
}
|
|
32
|
+
export const distributeAlongPath = (input, count, closed, limits = {}) => {
|
|
30
33
|
if (!Number.isInteger(count) || count < 1) {
|
|
31
|
-
|
|
34
|
+
invalidPath("Path distribution count must be a positive integer.", "distributeAlongPath");
|
|
32
35
|
}
|
|
33
36
|
const maximum = resolveGeometrySamplingLimits(limits).maxPathPoints;
|
|
34
37
|
assertSamplingCount(count, "distributeAlongPath", maximum);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
const { points: path, closed: closePath } = path3InputData(input, closed, limits);
|
|
39
|
+
if (path.length < (closePath ? 3 : 2)) {
|
|
40
|
+
invalidPath(`${closePath ? "Closed" : "Open"} distribution paths need more points.`, "distributeAlongPath");
|
|
41
|
+
}
|
|
42
|
+
if (closePath && path[0].every((coordinate, axis) => coordinate === path.at(-1)[axis]))
|
|
43
|
+
invalidPath("Closed distribution paths omit their repeated seam point.", "distributeAlongPath");
|
|
44
|
+
const lengths = segmentLengths(path, closePath);
|
|
39
45
|
const total = lengths.reduce((sum, length) => sum + length, 0);
|
|
40
46
|
requireFinitePathValues([total], "distributeAlongPath");
|
|
41
47
|
if (!(total > 0))
|
|
42
|
-
throw new
|
|
43
|
-
|
|
48
|
+
throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot distribute along a zero-length path.", {
|
|
49
|
+
operation: "distributeAlongPath",
|
|
50
|
+
});
|
|
51
|
+
const denominator = closePath ? count : Math.max(1, count - 1);
|
|
44
52
|
let traversed = 0;
|
|
45
53
|
let segment = 0;
|
|
46
54
|
return Array.from({ length: count }, (_, itemIndex) => {
|
|
@@ -64,7 +72,7 @@ export const distributeAlongPath = (path, count, closed, limits = {}) => {
|
|
|
64
72
|
}
|
|
65
73
|
traversed += length;
|
|
66
74
|
}
|
|
67
|
-
|
|
75
|
+
return invalidPath("Path distribution invariant failed.", "distributeAlongPath");
|
|
68
76
|
});
|
|
69
77
|
};
|
|
70
78
|
/**
|
|
@@ -75,21 +83,26 @@ export const distributeAlongPath = (path, count, closed, limits = {}) => {
|
|
|
75
83
|
* 45% of adjacent segment lengths to prevent neighboring corners from crossing.
|
|
76
84
|
* The returned path does not duplicate its closing point.
|
|
77
85
|
* Coordinates and radius must be finite; input and output are each limited by maxPathPoints (default 100000).
|
|
86
|
+
* Requires a closed path value; raw tuples are interpreted as closed. Invalid inputs throw GeometryError.
|
|
78
87
|
*/
|
|
79
|
-
export const roundClosedPolylinePath = (
|
|
80
|
-
if (points.length < 3)
|
|
81
|
-
throw new Error("Closed polylines need at least three points.");
|
|
88
|
+
export const roundClosedPolylinePath = (input, radius, segmentsPerCorner, limits = {}) => {
|
|
82
89
|
const maximum = resolveGeometrySamplingLimits(limits).maxPathPoints;
|
|
83
|
-
assertSamplingCount(points.length, "roundClosedPolylinePath", maximum);
|
|
84
90
|
requireFinitePathValues([radius], "roundClosedPolylinePath");
|
|
85
91
|
if (!(radius > 0))
|
|
86
|
-
|
|
92
|
+
invalidPath("Corner radius must be positive.", "roundClosedPolylinePath");
|
|
87
93
|
if (!Number.isInteger(segmentsPerCorner) || segmentsPerCorner < 1) {
|
|
88
|
-
|
|
94
|
+
invalidPath("Rounded corners need at least one segment.", "roundClosedPolylinePath");
|
|
89
95
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
96
|
+
// Reject exact output budgets before snapshotting tuple input or calculating any corner.
|
|
97
|
+
if (Array.isArray(input))
|
|
98
|
+
assertSamplingCount(input.length * (segmentsPerCorner + 1), "roundClosedPolylinePath", maximum);
|
|
99
|
+
const { points } = path3InputData(input, true, limits);
|
|
100
|
+
if (!Array.isArray(input))
|
|
101
|
+
assertSamplingCount(points.length * (segmentsPerCorner + 1), "roundClosedPolylinePath", maximum);
|
|
102
|
+
if (points.length < 3)
|
|
103
|
+
invalidPath("Closed polylines need at least three points.", "roundClosedPolylinePath");
|
|
104
|
+
if (points[0].every((coordinate, axis) => coordinate === points.at(-1)[axis]))
|
|
105
|
+
invalidPath("Closed polylines omit their repeated seam point.", "roundClosedPolylinePath");
|
|
93
106
|
return points.flatMap((point, index) => {
|
|
94
107
|
const previous = points[(index - 1 + points.length) % points.length];
|
|
95
108
|
const next = points[(index + 1) % points.length];
|
|
@@ -99,14 +112,14 @@ export const roundClosedPolylinePath = (points, radius, segmentsPerCorner, limit
|
|
|
99
112
|
const outgoingLength = length3(outgoingDelta);
|
|
100
113
|
requireFinitePathValues([incomingLength, outgoingLength], "roundClosedPolylinePath");
|
|
101
114
|
if (!(incomingLength > 0) || !(outgoingLength > 0)) {
|
|
102
|
-
|
|
115
|
+
invalidPath("Closed polylines cannot contain duplicate adjacent points.", "roundClosedPolylinePath");
|
|
103
116
|
}
|
|
104
117
|
const incoming = normalize3(incomingDelta);
|
|
105
118
|
const outgoing = normalize3(outgoingDelta);
|
|
106
119
|
const cornerCosine = Math.max(-1, Math.min(1, -(incoming[0] * outgoing[0] + incoming[1] * outgoing[1] + incoming[2] * outgoing[2])));
|
|
107
120
|
const cornerAngle = Math.acos(cornerCosine);
|
|
108
121
|
if (cornerAngle < 1e-6 || Math.abs(Math.PI - cornerAngle) < 1e-6) {
|
|
109
|
-
|
|
122
|
+
invalidPath("Rounded polyline corners must change direction.", "roundClosedPolylinePath");
|
|
110
123
|
}
|
|
111
124
|
const tangentDistance = Math.min(radius / Math.tan(cornerAngle / 2), incomingLength * 0.45, outgoingLength * 0.45);
|
|
112
125
|
const entry = [
|