@metamesh/modeling 0.13.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 +55 -0
- package/README.md +67 -9
- package/dist/api/engine.d.ts +14 -7
- package/dist/api/geometry.d.ts +787 -447
- package/dist/api/index.d.ts +637 -250
- package/dist/api/text.d.ts +6 -4
- package/dist/docs/guides/concepts.md +135 -17
- package/dist/docs/guides/fonts.md +8 -0
- package/dist/docs/guides/fundamentals.md +8 -3
- package/dist/docs/guides/generation.md +6 -4
- package/dist/docs/guides/hosting.md +27 -14
- package/dist/docs/guides/recipes.md +82 -11
- package/dist/docs/manifest.json +1911 -856
- 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 +4 -4
- 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 +17 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +9 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +7 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +9 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +14 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +6 -1
- package/dist/docs/reference/geometry/Bounds2.md +4 -4
- package/dist/docs/reference/geometry/Bounds3.md +4 -4
- package/dist/docs/reference/geometry/BoundsFit2.md +3 -3
- package/dist/docs/reference/geometry/BoundsFit3.md +3 -3
- 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 +8 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +8 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +10 -10
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +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 +107 -0
- 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 +3 -3
- 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 +6 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +6 -6
- 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 +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -5
- 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 +3 -3
- 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 +6 -6
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +14 -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 +11 -5
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +5 -5
- 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 +7 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
- package/dist/docs/reference/geometry/LineCurve2.md +4 -4
- package/dist/docs/reference/geometry/LineCurve3.md +4 -4
- 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 +5 -5
- package/dist/docs/reference/geometry/PathLocation.md +65 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +6 -5
- 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 +4 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
- package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
- 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 +3 -3
- package/dist/docs/reference/geometry/{Polygon.md → PolygonData.md} +2 -2
- 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 +3 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- 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 +3 -3
- 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 +3 -3
- package/dist/docs/reference/geometry/RegionData.md +14 -0
- 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 +4 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +4 -4
- 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} +8 -8
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +3 -3
- 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} +3 -3
- 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 +255 -0
- package/dist/docs/reference/geometry/Transform2Input.md +19 -0
- package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
- package/dist/docs/reference/geometry/Transform3-type.md +295 -0
- package/dist/docs/reference/geometry/Transform3Input.md +19 -0
- package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
- 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 +269 -0
- package/dist/docs/reference/geometry/Vector2Input.md +19 -0
- package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
- package/dist/docs/reference/geometry/Vector3-type.md +281 -0
- package/dist/docs/reference/geometry/Vector3Input.md +19 -0
- package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
- 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 +36 -0
- package/dist/docs/reference/geometry/add3.md +10 -6
- 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} +13 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +11 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +11 -7
- package/dist/docs/reference/geometry/attachmentTransform3.md +77 -0
- package/dist/docs/reference/geometry/boundsCenter.md +7 -7
- package/dist/docs/reference/geometry/boundsFromSize.md +7 -7
- package/dist/docs/reference/geometry/boundsSize.md +7 -7
- package/dist/docs/reference/geometry/boxAnchor3.md +10 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +15 -10
- 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 +7 -7
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +5 -6
- package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -2
- package/dist/docs/reference/geometry/categories/transforms-math.md +41 -12
- 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 +4 -4
- 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 +10 -6
- 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 +4 -4
- 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 +4 -4
- package/dist/docs/reference/geometry/cross2.md +36 -0
- package/dist/docs/reference/geometry/cross3.md +10 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -6
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +36 -0
- package/dist/docs/reference/geometry/distance3.md +36 -0
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
- package/dist/docs/reference/geometry/dot2.md +36 -0
- package/dist/docs/reference/geometry/dot3.md +9 -5
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +10 -6
- 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 +8 -4
- 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 +5 -5
- 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 +9 -5
- 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 +4 -4
- package/dist/docs/reference/geometry/length2.md +30 -0
- package/dist/docs/reference/geometry/length3.md +8 -4
- package/dist/docs/reference/geometry/lerp2.md +42 -0
- package/dist/docs/reference/geometry/lerp3.md +10 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
- 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 +3 -2
- 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 +36 -0
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +4 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -5
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -5
- 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 +8 -8
- 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 +10 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- package/dist/docs/reference/geometry/rectangleContour.md +2 -2
- package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
- package/dist/docs/reference/geometry/regionArea.md +4 -4
- package/dist/docs/reference/geometry/regionBounds.md +4 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +5 -5
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +8 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +6 -6
- package/dist/docs/reference/geometry/resolveCircularSegments.md +6 -5
- 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 +6 -6
- 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 +36 -0
- package/dist/docs/reference/geometry/rotationTransform3.md +10 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -6
- 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 +5 -5
- 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 +6 -6
- 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 +36 -0
- package/dist/docs/reference/geometry/scale3.md +9 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +10 -6
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +4 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
- package/dist/docs/reference/geometry/subtract2.md +36 -0
- package/dist/docs/reference/geometry/subtract3.md +10 -6
- 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 +38 -0
- package/dist/docs/reference/geometry/transform3.md +38 -0
- package/dist/docs/reference/geometry/transformDeterminant3.md +8 -4
- package/dist/docs/reference/geometry/transformRegionData.md +40 -0
- package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
- package/dist/docs/reference/geometry/translationTransform3.md +10 -6
- 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 +9 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +31 -0
- package/dist/docs/reference/geometry/vector3.md +38 -0
- package/dist/docs/reference/geometry.md +3 -3
- package/dist/docs/reference/model/Anchor3.md +5 -5
- package/dist/docs/reference/model/AttachOptions.md +10 -5
- package/dist/docs/reference/model/Bounds2.md +4 -4
- package/dist/docs/reference/model/Bounds3.md +4 -4
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +10 -10
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +1 -1
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +3 -3
- 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 +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +3 -3
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/model/FinalizedModel.md +18 -8
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +6 -6
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -5
- package/dist/docs/reference/model/GeneratedPart.md +6 -6
- 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 +11 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- 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 +7 -7
- 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 +4 -4
- 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 +4 -4
- 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 +6 -6
- 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 +6 -5
- 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 +2 -2
- package/dist/docs/reference/model/Pivot2Options.md +27 -0
- package/dist/docs/reference/model/Pivot3Options.md +27 -0
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/{Polygon-type.md → PolygonData.md} +2 -2
- package/dist/docs/reference/model/PolygonOptions.md +85 -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 +3 -3
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
- 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 +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +10 -10
- package/dist/docs/reference/model/{Region.md → RegionData.md} +4 -4
- 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 +81 -40
- package/dist/docs/reference/model/SectionHullOptions.md +7 -7
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- package/dist/docs/reference/model/{RegionOffsetJoin.md → SectionOffsetJoin.md} +3 -3
- package/dist/docs/reference/model/{RegionOffsetOptions.md → SectionOffsetOptions.md} +4 -4
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +66 -26
- package/dist/docs/reference/model/SolidInspection.md +7 -7
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/StrokeCap.md +16 -0
- package/dist/docs/reference/model/StrokeJoin.md +16 -0
- package/dist/docs/reference/model/StrokeOptions.md +91 -0
- 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 +3 -3
- 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 +256 -0
- package/dist/docs/reference/model/Transform2Input.md +20 -0
- package/dist/docs/reference/model/Transform2Matrix.md +15 -0
- package/dist/docs/reference/model/Transform3-type.md +296 -0
- package/dist/docs/reference/model/Transform3Input.md +20 -0
- package/dist/docs/reference/model/{Transform3.md → Transform3Matrix.md} +3 -3
- 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 +270 -0
- package/dist/docs/reference/model/Vector2Input.md +20 -0
- package/dist/docs/reference/model/{Vector2.md → Vector2Tuple.md} +3 -3
- package/dist/docs/reference/model/Vector3-type.md +282 -0
- package/dist/docs/reference/model/Vector3Input.md +20 -0
- package/dist/docs/reference/model/{Vector3.md → Vector3Tuple.md} +3 -3
- 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 +4 -4
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +4 -4
- package/dist/docs/reference/model/categories/bounded-surfaces.md +3 -3
- package/dist/docs/reference/model/categories/contracts.md +2 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +5 -5
- package/dist/docs/reference/model/categories/explicit-profiles.md +3 -3
- 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 +7 -8
- 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 +3 -3
- package/dist/docs/reference/model/categories/resolution.md +2 -2
- package/dist/docs/reference/model/categories/sections.md +10 -8
- package/dist/docs/reference/model/categories/threads.md +5 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +27 -13
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +10 -7
- 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 +2 -2
- 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 +2 -2
- package/dist/docs/reference/model/hull.md +2 -2
- 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 +3 -3
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +4 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +2 -2
- 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 +4 -4
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +74 -0
- 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 +39 -0
- package/dist/docs/reference/model/transform3.md +39 -0
- 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 +32 -0
- package/dist/docs/reference/model/vector3.md +39 -0
- package/dist/docs/reference/model.md +9 -8
- package/dist/docs/reference/text/Bounds2.md +4 -4
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +2 -2
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +4 -4
- 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/deferred-context.js +11 -181
- 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 +11 -8
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +3 -3
- 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 +8 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +35 -21
- package/dist/engine/section-operations.js +52 -11
- package/dist/engine/session-graph.js +1 -1
- package/dist/engine/session-native.js +1 -1
- package/dist/engine/session-snapshot.js +17 -6
- package/dist/engine/session.js +13 -8
- package/dist/engine/shape-anchors.js +5 -11
- package/dist/engine/transform-operations.js +66 -49
- 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 +13 -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 +20 -0
- package/dist/geometry/math/vector-value.js +168 -0
- package/dist/geometry/math/vector2.js +80 -0
- package/dist/geometry/math/vector3.js +37 -7
- package/dist/geometry/mechanical/gear-motion.js +8 -5
- 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-intersections.js +5 -1
- package/dist/geometry/mesh/mesh-solid.js +7 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +63 -0
- package/dist/geometry/paths/frames.js +44 -14
- 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/primitive-resolution.js +4 -1
- 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 +51 -39
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +57 -68
- 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 +14 -14
- package/dist/geometry/sweeps/sweep-closed.js +5 -5
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +4 -4
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/transform-chain.js +172 -0
- package/dist/geometry/transform-geometry.js +27 -30
- package/dist/geometry/transform-matrix.js +14 -0
- package/dist/geometry/transform2.js +60 -0
- package/dist/geometry/transform3.js +70 -26
- package/dist/index.js +4 -0
- package/dist/model/execution-binding.js +10 -5
- package/dist/model/geometry-recipes.js +15 -0
- package/dist/{engine → model}/immutable-generation-data.js +88 -6
- package/dist/model/operation-dispatch.js +10 -3
- package/dist/model/operations.js +45 -35
- package/dist/model/recipe-declaration.js +199 -0
- package/dist/model/shape-handles.js +17 -5
- 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/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/Region.md +0 -14
- package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/Transform3.md +0 -12
- package/dist/docs/reference/geometry/Vector2.md +0 -7
- package/dist/docs/reference/geometry/Vector3.md +0 -7
- package/dist/docs/reference/geometry/attachTransform.md +0 -73
- 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/rotateAroundAxis3.md +0 -38
- 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/geometry/transformRegion.md +0 -40
- package/dist/docs/reference/model/Transform2.md +0 -15
- package/dist/docs/reference/model/fromRegion.md +0 -33
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toRegion.md +0 -33
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Vector2.md +0 -7
- package/dist/engine/geometry-recipes.js +0 -12
- package/dist/engine/pattern-transform.js +0 -9
- package/dist/geometry/paths/path.js +0 -32
|
@@ -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 = [
|
|
@@ -9,7 +9,7 @@ const distance = (a, b) => {
|
|
|
9
9
|
curveFailure("NON_FINITE_VALUE", "Curve extent exceeds finite arithmetic.");
|
|
10
10
|
return value;
|
|
11
11
|
};
|
|
12
|
-
function resamplePolyline(path, dimensions, options, createWriter) {
|
|
12
|
+
function resamplePolyline(path, dimensions, options, createWriter, includeTangents = true) {
|
|
13
13
|
const maximum = resolveSamplingBudget(options);
|
|
14
14
|
if (options.closed !== undefined && typeof options.closed !== "boolean")
|
|
15
15
|
curveFailure("INVALID_ARGUMENT", "closed must be a boolean.");
|
|
@@ -91,10 +91,12 @@ function resamplePolyline(path, dimensions, options, createWriter) {
|
|
|
91
91
|
point[2] = z(a) + (z(b) - z(a)) * t;
|
|
92
92
|
}
|
|
93
93
|
validateCurvePoint3(point);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
if (includeTangents) {
|
|
95
|
+
tangent[0] = b[0] - a[0];
|
|
96
|
+
tangent[1] = b[1] - a[1];
|
|
97
|
+
tangent[2] = z(b) - z(a);
|
|
98
|
+
normalizeCurveDirection(tangent, tangent);
|
|
99
|
+
}
|
|
98
100
|
writer.append(point, tangent);
|
|
99
101
|
}
|
|
100
102
|
return writer.finish();
|
|
@@ -123,3 +125,23 @@ export function resamplePolyline3(path, options = {}) {
|
|
|
123
125
|
export function resamplePolyline2(path, options = {}) {
|
|
124
126
|
return resamplePolyline(path, 2, options, createPlanarSampleWriter);
|
|
125
127
|
}
|
|
128
|
+
/** Internal points-only writer; Path2 owns these mutable coordinates and freezes public interchange. */
|
|
129
|
+
export function resamplePath2Data(path, options) {
|
|
130
|
+
const points = [];
|
|
131
|
+
return resamplePolyline(path, 2, options, () => ({
|
|
132
|
+
append: (point) => {
|
|
133
|
+
points.push([point[0], point[1]]);
|
|
134
|
+
},
|
|
135
|
+
finish: () => points,
|
|
136
|
+
}), false);
|
|
137
|
+
}
|
|
138
|
+
/** Internal points-only writer; avoids calculating and allocating tangents discarded by Path3. */
|
|
139
|
+
export function resamplePath3Data(path, options) {
|
|
140
|
+
const points = [];
|
|
141
|
+
return resamplePolyline(path, 3, options, () => ({
|
|
142
|
+
append: (point) => {
|
|
143
|
+
points.push([point[0], point[1], point[2]]);
|
|
144
|
+
},
|
|
145
|
+
finish: () => points,
|
|
146
|
+
}), false);
|
|
147
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector3Data } from "../math/vector-value.js";
|
|
2
3
|
import { cross3, dot3, scale3 } from "../math/vector3.js";
|
|
4
|
+
import { path2InputData, path3InputData, } from "../paths/path-value.js";
|
|
3
5
|
import { distributeAlongPath } from "../paths/planar.js";
|
|
4
|
-
import {
|
|
6
|
+
import { restrictTransform3 } from "../transform2.js";
|
|
5
7
|
import { composeTransform3, frameTransform3, IDENTITY_TRANSFORM3, rotationTransform3, translationTransform3, } from "../transform3.js";
|
|
6
8
|
const fail = (operation, message) => {
|
|
7
9
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
@@ -23,13 +25,35 @@ const finite = (value, operation) => {
|
|
|
23
25
|
});
|
|
24
26
|
return value;
|
|
25
27
|
};
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const coordinates = (input, operation) => {
|
|
29
|
+
const value = typeof input === "object" &&
|
|
30
|
+
input !== null &&
|
|
31
|
+
"toArray" in input &&
|
|
32
|
+
typeof input.toArray === "function"
|
|
33
|
+
? input.toArray()
|
|
34
|
+
: input;
|
|
35
|
+
if (!Array.isArray(value) || (value.length !== 2 && value.length !== 3))
|
|
36
|
+
fail(operation, "Pattern vectors require exact XY or XYZ coordinates.");
|
|
37
|
+
const source = value;
|
|
38
|
+
const copied = source.length === 2 ? [source[0], source[1]] : [source[0], source[1], source[2]];
|
|
39
|
+
if (copied.some((coordinate) => typeof coordinate !== "number"))
|
|
40
|
+
fail(operation, "Pattern vectors require numeric coordinates.");
|
|
41
|
+
copied.forEach((coordinate) => finite(coordinate, operation));
|
|
42
|
+
return copied;
|
|
43
|
+
};
|
|
44
|
+
const vector = (input, operation) => {
|
|
45
|
+
const value = coordinates(input, operation);
|
|
46
|
+
if (value.length !== 3)
|
|
47
|
+
fail(operation, "Spatial pattern vectors require XYZ coordinates.");
|
|
48
|
+
return vector3Data(value);
|
|
30
49
|
};
|
|
31
|
-
const
|
|
32
|
-
|
|
50
|
+
const lift = (value) => [value[0], value[1], value[2] ?? 0];
|
|
51
|
+
const requireDimension = (actual, expected, operation) => {
|
|
52
|
+
if (actual !== expected)
|
|
53
|
+
fail(operation, "Pattern coordinates must match the shape dimension.");
|
|
54
|
+
};
|
|
55
|
+
const direction = (input, operation) => {
|
|
56
|
+
const value = vector(input, operation);
|
|
33
57
|
const maximum = Math.max(...value.map(Math.abs));
|
|
34
58
|
if (maximum === 0)
|
|
35
59
|
fail(operation, "Pattern direction must be nonzero.");
|
|
@@ -77,27 +101,46 @@ export function linearPatternPlan(options) {
|
|
|
77
101
|
fail(operation, "Length must be a nonnegative whole multiple of the signed spacing.");
|
|
78
102
|
count = patternCount(Math.round(intervals) + 1, operation);
|
|
79
103
|
}
|
|
80
|
-
const
|
|
104
|
+
const input = options.direction === undefined ? undefined : coordinates(options.direction, operation);
|
|
105
|
+
const axis = direction(input === undefined ? [1, 0, 0] : lift(input), operation);
|
|
81
106
|
finite(spacing * (count - 1), operation);
|
|
82
|
-
return {
|
|
107
|
+
return {
|
|
108
|
+
count,
|
|
109
|
+
transformAt: (index, dimension = 3) => {
|
|
110
|
+
if (input !== undefined)
|
|
111
|
+
requireDimension(input.length, dimension, operation);
|
|
112
|
+
return translationTransform3(scale3(axis, spacing * index));
|
|
113
|
+
},
|
|
114
|
+
};
|
|
83
115
|
}
|
|
84
116
|
export function radialPatternPlan(options) {
|
|
85
117
|
const operation = "radialPattern";
|
|
86
118
|
optionsObject(options, operation);
|
|
87
119
|
const count = patternCount(options.count, operation);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
finite(angle
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
120
|
+
if ("center" in options)
|
|
121
|
+
fail(operation, "Use pivot for a radial pattern's rotation reference.");
|
|
122
|
+
const hasAxis = options.axis !== undefined;
|
|
123
|
+
const axis = direction(options.axis ?? [0, 0, 1], operation);
|
|
124
|
+
const angleRadians = finite((options.angle / 180) * Math.PI, operation);
|
|
125
|
+
if (angleRadians === 0)
|
|
126
|
+
fail(operation, "Pattern angle must be nonzero.");
|
|
127
|
+
finite(angleRadians * (count - 1), operation);
|
|
128
|
+
const pivot = options.pivot === undefined ? undefined : coordinates(options.pivot, operation);
|
|
129
|
+
const before = translationTransform3(scale3(pivot === undefined ? [0, 0, 0] : lift(pivot), -1));
|
|
130
|
+
const after = translationTransform3(pivot === undefined ? [0, 0, 0] : lift(pivot));
|
|
96
131
|
return {
|
|
97
132
|
count,
|
|
98
|
-
transformAt: (index) =>
|
|
99
|
-
|
|
100
|
-
|
|
133
|
+
transformAt: (index, dimension = 3) => {
|
|
134
|
+
if (dimension === 2 && hasAxis)
|
|
135
|
+
fail(operation, "XY radial patterns use the implicit +Z axis.");
|
|
136
|
+
if (dimension === 3 && !hasAxis)
|
|
137
|
+
fail(operation, "Spatial radial patterns require an explicit axis.");
|
|
138
|
+
if (pivot !== undefined)
|
|
139
|
+
requireDimension(pivot.length, dimension, operation);
|
|
140
|
+
return index === 0
|
|
141
|
+
? IDENTITY_TRANSFORM3
|
|
142
|
+
: composeTransform3(after, composeTransform3(rotationTransform3(axis, { radians: angleRadians * index }), before));
|
|
143
|
+
},
|
|
101
144
|
};
|
|
102
145
|
}
|
|
103
146
|
export function gridPatternPlan(options) {
|
|
@@ -111,6 +154,7 @@ export function gridPatternPlan(options) {
|
|
|
111
154
|
fail(operation, "Grid count and spacing require matching XY or XYZ tuples.");
|
|
112
155
|
if (options.center !== undefined && typeof options.center !== "boolean")
|
|
113
156
|
fail(operation, "Grid center must be a boolean.");
|
|
157
|
+
const centered = options.center === true;
|
|
114
158
|
const counts = [options.count[0], options.count[1], dimensions === 3 ? options.count[2] : 1];
|
|
115
159
|
counts.forEach((count) => patternCount(count, operation));
|
|
116
160
|
const count = patternCount(counts[0] * counts[1] * counts[2], operation);
|
|
@@ -138,13 +182,17 @@ export function gridPatternPlan(options) {
|
|
|
138
182
|
const frame = options.frame === undefined ? IDENTITY_TRANSFORM3 : frameTransform3(options.frame);
|
|
139
183
|
return {
|
|
140
184
|
count,
|
|
141
|
-
transformAt: (index) => {
|
|
185
|
+
transformAt: (index, dimension = 3) => {
|
|
186
|
+
if (dimension === 2) {
|
|
187
|
+
requireDimension(dimensions, dimension, operation);
|
|
188
|
+
restrictTransform3(frame);
|
|
189
|
+
}
|
|
142
190
|
const coordinates = [
|
|
143
191
|
index % counts[0],
|
|
144
192
|
Math.floor(index / counts[0]) % counts[1],
|
|
145
193
|
Math.floor(index / (counts[0] * counts[1])),
|
|
146
194
|
];
|
|
147
|
-
const offset = coordinates.map((value, axis) => value * spacing[axis] - (
|
|
195
|
+
const offset = coordinates.map((value, axis) => value * spacing[axis] - (centered ? extent[axis] / 2 : 0));
|
|
148
196
|
return composeTransform3(frame, translationTransform3(offset));
|
|
149
197
|
},
|
|
150
198
|
};
|
|
@@ -164,18 +212,43 @@ export function pathPatternPlan(input, options, limits) {
|
|
|
164
212
|
options.orientation !== "fixed" &&
|
|
165
213
|
options.orientation !== "tangent")
|
|
166
214
|
fail(operation, "Path orientation must be fixed or tangent.");
|
|
167
|
-
const
|
|
215
|
+
const tangentOrientation = options.orientation === "tangent";
|
|
216
|
+
if (typeof input !== "object" || input === null)
|
|
217
|
+
fail(operation, "Path patterns require sampled XY or XYZ coordinates.");
|
|
218
|
+
const first = Array.isArray(input) ? input[0] : undefined;
|
|
219
|
+
const suppliedDimension = Array.isArray(input)
|
|
220
|
+
? Array.isArray(first)
|
|
221
|
+
? first.length
|
|
222
|
+
: typeof first === "object" && first !== null && "z" in first
|
|
223
|
+
? 3
|
|
224
|
+
: 2
|
|
225
|
+
: Reflect.get(input, "dimension");
|
|
226
|
+
if (suppliedDimension !== 2 && suppliedDimension !== 3)
|
|
227
|
+
fail(operation, "Path patterns require sampled XY or XYZ coordinates.");
|
|
228
|
+
const dimension = suppliedDimension === 2 ? 2 : 3;
|
|
229
|
+
const data = dimension === 2
|
|
230
|
+
? path2InputData(input, options.closed, limits)
|
|
231
|
+
: path3InputData(input, options.closed, limits);
|
|
232
|
+
const path = dimension === 2 ? data.points.map(lift) : data.points;
|
|
233
|
+
// Distribution permits reversals, zero-length edges, and open paths returning to their start.
|
|
234
|
+
// Validate the traversal before factories without allocating the complete placement collection.
|
|
235
|
+
const firstPlacement = distributeAlongPath(path, 1, data.closed, limits);
|
|
168
236
|
// Defer the output placement array until the operation has checked the source copy budget.
|
|
169
|
-
let placements;
|
|
237
|
+
let placements = count === 1 ? firstPlacement : undefined;
|
|
170
238
|
return {
|
|
171
239
|
count,
|
|
172
|
-
transformAt: (index) => {
|
|
173
|
-
|
|
240
|
+
transformAt: (index, shapeDimension = 3) => {
|
|
241
|
+
requireDimension(dimension, shapeDimension, operation);
|
|
242
|
+
placements ??= distributeAlongPath(path, count, data.closed, limits);
|
|
174
243
|
const placement = placements[index];
|
|
175
244
|
const translation = translationTransform3(placement.position);
|
|
176
|
-
if (
|
|
245
|
+
if (!tangentOrientation)
|
|
177
246
|
return translation;
|
|
178
247
|
const tangent = placement.tangent;
|
|
248
|
+
if (dimension === 2)
|
|
249
|
+
return composeTransform3(translation, rotationTransform3([0, 0, 1], {
|
|
250
|
+
radians: Math.atan2(tangent[1], tangent[0]),
|
|
251
|
+
}));
|
|
179
252
|
const cosine = Math.max(-1, Math.min(1, dot3([0, 0, 1], tangent)));
|
|
180
253
|
const axis = cross3([0, 0, 1], tangent);
|
|
181
254
|
const sine = Math.hypot(...axis);
|
|
@@ -3,7 +3,7 @@ import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
|
|
|
3
3
|
function transforms(plan) {
|
|
4
4
|
return Object.freeze(Array.from({ length: plan.count }, (_, index) => Object.freeze(plan.transformAt(index))));
|
|
5
5
|
}
|
|
6
|
-
/**
|
|
6
|
+
/** Spatial XYZ matrix placements in millimetres, including the original at the origin. */
|
|
7
7
|
export function linearPatternTransforms(options) {
|
|
8
8
|
return transforms(linearPatternPlan(options));
|
|
9
9
|
}
|
|
@@ -11,7 +11,7 @@ export function linearPatternTransforms(options) {
|
|
|
11
11
|
export function radialPatternTransforms(options) {
|
|
12
12
|
return transforms(radialPatternPlan(options));
|
|
13
13
|
}
|
|
14
|
-
/** XY or XYZ grid
|
|
14
|
+
/** Spatial XYZ matrices for an XY or XYZ grid, in X-fastest order. */
|
|
15
15
|
export function gridPatternTransforms(options) {
|
|
16
16
|
return transforms(gridPatternPlan(options));
|
|
17
17
|
}
|
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import * as clippingModule from "polygon-clipping";
|
|
2
|
+
import { normalizeRegion } from "./regions.js";
|
|
2
3
|
const moduleWithDefault = clippingModule;
|
|
3
4
|
/** @internal Normalizes polygon-clipping's CommonJS and bundled ESM module shapes. */
|
|
4
5
|
export const polygonClipping = moduleWithDefault.default ?? clippingModule;
|
|
6
|
+
/** @internal Copies an open contour into polygon-clipping's explicitly closed ring format. */
|
|
7
|
+
export function clippingRing(points) {
|
|
8
|
+
const result = points.map(([x, y]) => [x, y]);
|
|
9
|
+
const first = result[0];
|
|
10
|
+
const last = result.at(-1);
|
|
11
|
+
if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1]))
|
|
12
|
+
result.push([...first]);
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
/** @internal Converts closed clipping rings into canonical regions with implicit seams. */
|
|
16
|
+
export function regionFromMultiPolygon(value) {
|
|
17
|
+
return normalizeRegion(value.map((polygon) => ({
|
|
18
|
+
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
19
|
+
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
20
|
+
})));
|
|
21
|
+
}
|
|
5
22
|
const CLIPPING_COORDINATE_GRID = 1e9;
|
|
6
23
|
const snapCoordinate = (value) => Math.round(value * CLIPPING_COORDINATE_GRID) / CLIPPING_COORDINATE_GRID;
|
|
7
24
|
/** Canonicalizes shared endpoints below model tolerance before they enter the sweep-line kernel. */
|
|
@@ -8,7 +8,10 @@ import { assertSamplingCount, resolveGeometrySamplingLimits } from "./sampling-l
|
|
|
8
8
|
*/
|
|
9
9
|
export function resolveCircularPrimitiveSegments(radius, options, operation) {
|
|
10
10
|
if (options.segments === undefined) {
|
|
11
|
-
return resolveCircularSegments(radius,
|
|
11
|
+
return resolveCircularSegments(radius, {
|
|
12
|
+
...options.resolution,
|
|
13
|
+
sizing: options.sizing ?? "vertex",
|
|
14
|
+
}, options.limits);
|
|
12
15
|
}
|
|
13
16
|
if (!Number.isSafeInteger(options.segments) || options.segments < 3)
|
|
14
17
|
throw new GeometryError("INVALID_ARGUMENT", "segments must be a safe integer of at least three.", { operation, details: { value: options.segments } });
|