@metamesh/modeling 0.12.0 → 0.13.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 +27 -0
- package/README.md +60 -72
- package/dist/api/engine.d.ts +123 -97
- package/dist/api/geometry.d.ts +3896 -3307
- package/dist/api/index.d.ts +2489 -2268
- package/dist/api/text.d.ts +119 -107
- package/dist/docs/guides/concepts.md +197 -0
- package/dist/docs/guides/fonts.md +51 -0
- package/dist/docs/guides/fundamentals.md +135 -0
- package/dist/docs/guides/generation.md +221 -0
- package/dist/docs/guides/hosting.md +88 -0
- package/dist/docs/guides/recipes.md +668 -0
- package/dist/docs/manifest.json +9851 -0
- package/dist/docs/reference/engine/Export3mfOptions.md +29 -0
- package/dist/docs/reference/engine/ExportMeshPart.md +65 -0
- package/dist/docs/reference/engine/GenerationOptions.md +62 -0
- package/dist/docs/reference/engine/GeometryResource.md +77 -0
- package/dist/docs/reference/engine/ModelDependencies.md +41 -0
- package/dist/docs/reference/engine/ModelEngine.md +103 -0
- package/dist/docs/reference/engine/ModelEngineOptions.md +33 -0
- package/dist/docs/reference/engine/ModelSession.md +96 -0
- package/dist/docs/reference/engine/ModelSnapshot.md +173 -0
- package/dist/docs/reference/engine/SessionOptions.md +123 -0
- package/dist/docs/reference/engine/SnapshotPart.md +130 -0
- package/dist/docs/reference/engine/categories/host-lifecycle.md +37 -0
- package/dist/docs/reference/engine/createModelEngine.md +56 -0
- package/dist/docs/reference/engine/defaultModelingLimits.md +7 -0
- package/dist/docs/reference/engine/modelingWasmUrl.md +7 -0
- package/dist/docs/reference/engine/validateModel.md +48 -0
- package/dist/docs/reference/engine.md +25 -0
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +75 -0
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +79 -0
- package/dist/docs/reference/geometry/Anchor3.md +49 -0
- package/dist/docs/reference/geometry/ArcCurve2.md +70 -0
- package/dist/docs/reference/geometry/ArcCurve3.md +94 -0
- package/dist/docs/reference/geometry/AttachTransformOptions.md +58 -0
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +61 -0
- package/dist/docs/reference/geometry/Bounds2.md +39 -0
- package/dist/docs/reference/geometry/Bounds3.md +39 -0
- package/dist/docs/reference/geometry/BoundsFit2.md +52 -0
- package/dist/docs/reference/geometry/BoundsFit3.md +52 -0
- package/dist/docs/reference/geometry/BoundsFitOptions.md +23 -0
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +23 -0
- package/dist/docs/reference/geometry/BoxAnchorFace.md +7 -0
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +59 -0
- package/dist/docs/reference/geometry/BoxEdge.md +7 -0
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +14 -0
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +15 -0
- package/dist/docs/reference/geometry/BoxOptions.md +87 -0
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +7 -0
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +93 -0
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +29 -0
- package/dist/docs/reference/geometry/CircleContourOptions.md +15 -0
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +59 -0
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +41 -0
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +7 -0
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +53 -0
- package/dist/docs/reference/geometry/Contour.md +17 -0
- package/dist/docs/reference/geometry/ContourCurve.md +35 -0
- package/dist/docs/reference/geometry/ContourPoint.md +29 -0
- package/dist/docs/reference/geometry/ContourSegment.md +86 -0
- package/dist/docs/reference/geometry/CorrespondingComponent.md +46 -0
- package/dist/docs/reference/geometry/CorrespondingContour.md +46 -0
- package/dist/docs/reference/geometry/CorrespondingProfile.md +22 -0
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +27 -0
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +70 -0
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +70 -0
- package/dist/docs/reference/geometry/Curve2.md +16 -0
- package/dist/docs/reference/geometry/Curve3.md +16 -0
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +64 -0
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +73 -0
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +7 -0
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +83 -0
- package/dist/docs/reference/geometry/CylinderOptions.md +53 -0
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +209 -0
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +7 -0
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +71 -0
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +82 -0
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +34 -0
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +41 -0
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +47 -0
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +82 -0
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -0
- package/dist/docs/reference/geometry/EdgeTreatment.md +17 -0
- package/dist/docs/reference/geometry/EllipseContourOptions.md +15 -0
- package/dist/docs/reference/geometry/EndTreatments.md +34 -0
- package/dist/docs/reference/geometry/ExtrudeOptions.md +134 -0
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +77 -0
- package/dist/docs/reference/geometry/FittedTextLayout.md +60 -0
- package/dist/docs/reference/geometry/Frame3.md +58 -0
- package/dist/docs/reference/geometry/GeometryError.md +97 -0
- package/dist/docs/reference/geometry/GeometryErrorCode.md +7 -0
- package/dist/docs/reference/geometry/GeometryErrorContext.md +29 -0
- package/dist/docs/reference/geometry/GeometryResolution.md +65 -0
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +62 -0
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +41 -0
- package/dist/docs/reference/geometry/GridPatternOptions.md +42 -0
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +14 -0
- package/dist/docs/reference/geometry/HeightfieldOptions.md +67 -0
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +53 -0
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +141 -0
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +265 -0
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +53 -0
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +14 -0
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +242 -0
- package/dist/docs/reference/geometry/LineCurve2.md +46 -0
- package/dist/docs/reference/geometry/LineCurve3.md +46 -0
- package/dist/docs/reference/geometry/LinearPatternOptions.md +30 -0
- package/dist/docs/reference/geometry/LoftCorrespondence.md +19 -0
- package/dist/docs/reference/geometry/LoftMeshStation.md +27 -0
- package/dist/docs/reference/geometry/LoftOptions.md +84 -0
- package/dist/docs/reference/geometry/LoftPlacement.md +66 -0
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +18 -0
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +35 -0
- package/dist/docs/reference/geometry/MetricFastenerSize.md +7 -0
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +72 -0
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +29 -0
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +41 -0
- package/dist/docs/reference/geometry/ModelingLimits.md +126 -0
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +17 -0
- package/dist/docs/reference/geometry/Path2.md +14 -0
- package/dist/docs/reference/geometry/Path3.md +14 -0
- package/dist/docs/reference/geometry/PathFrame.md +46 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +38 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +46 -0
- package/dist/docs/reference/geometry/PathPlacement.md +34 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +7 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +156 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +120 -0
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +190 -0
- package/dist/docs/reference/geometry/Polygon.md +38 -0
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +92 -0
- package/dist/docs/reference/geometry/PrimitivePlacement.md +31 -0
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +83 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +7 -0
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +45 -0
- package/dist/docs/reference/geometry/Profile.md +22 -0
- package/dist/docs/reference/geometry/ProfileComponent2.md +46 -0
- package/dist/docs/reference/geometry/ProfileContour2.md +34 -0
- package/dist/docs/reference/geometry/ProfileSpan2.md +47 -0
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +36 -0
- package/dist/docs/reference/geometry/RackPitchDimensions.md +113 -0
- package/dist/docs/reference/geometry/RackPitchSpec.md +77 -0
- package/dist/docs/reference/geometry/RadialPatternOptions.md +62 -0
- package/dist/docs/reference/geometry/RadialSizing.md +7 -0
- package/dist/docs/reference/geometry/RadialSizingOptions.md +40 -0
- package/dist/docs/reference/geometry/RectangleContourOptions.md +66 -0
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +34 -0
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +14 -0
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +94 -0
- package/dist/docs/reference/geometry/Region.md +14 -0
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +84 -0
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +65 -0
- package/dist/docs/reference/geometry/RevolveOptions.md +82 -0
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +91 -0
- package/dist/docs/reference/geometry/RowLayoutOptions.md +23 -0
- package/dist/docs/reference/geometry/SampleContourOptions.md +71 -0
- package/dist/docs/reference/geometry/SampleHelixOptions.md +95 -0
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +71 -0
- package/dist/docs/reference/geometry/SampledCurve2.md +34 -0
- package/dist/docs/reference/geometry/SampledCurve3.md +34 -0
- package/dist/docs/reference/geometry/SampledThreadHelices.md +58 -0
- package/dist/docs/reference/geometry/SideProfileCurve.md +35 -0
- package/dist/docs/reference/geometry/SideProfilePoint.md +29 -0
- package/dist/docs/reference/geometry/SideProfileSegment.md +86 -0
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +71 -0
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +34 -0
- package/dist/docs/reference/geometry/SphereOptions.md +15 -0
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +75 -0
- package/dist/docs/reference/geometry/StrokePathCap.md +7 -0
- package/dist/docs/reference/geometry/StrokePathJoin.md +7 -0
- package/dist/docs/reference/geometry/StrokePathRegionOptions.md +85 -0
- package/dist/docs/reference/geometry/SvgImportOptions.md +60 -0
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +61 -0
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +118 -0
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +65 -0
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +53 -0
- package/dist/docs/reference/geometry/SweepOptions.md +109 -0
- package/dist/docs/reference/geometry/SweepOrientation.md +109 -0
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +53 -0
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +100 -0
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +73 -0
- package/dist/docs/reference/geometry/ThreadEndStyle.md +7 -0
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +113 -0
- package/dist/docs/reference/geometry/ThreadHandedness.md +7 -0
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +120 -0
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +7 -0
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +7 -0
- package/dist/docs/reference/geometry/ThreadProfile.md +82 -0
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +49 -0
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +19 -0
- package/dist/docs/reference/geometry/ThreadRole.md +7 -0
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +7 -0
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +269 -0
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +94 -0
- package/dist/docs/reference/geometry/ThreadedNutShape.md +7 -0
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +242 -0
- package/dist/docs/reference/geometry/TorusOptions.md +105 -0
- package/dist/docs/reference/geometry/Transform3.md +12 -0
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +91 -0
- package/dist/docs/reference/geometry/TriangleMesh.md +34 -0
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +119 -0
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +75 -0
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +75 -0
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +39 -0
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +190 -0
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +107 -0
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +41 -0
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +29 -0
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +51 -0
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +91 -0
- package/dist/docs/reference/geometry/TubeOptions.md +138 -0
- package/dist/docs/reference/geometry/Vector2.md +7 -0
- package/dist/docs/reference/geometry/Vector3.md +7 -0
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +53 -0
- package/dist/docs/reference/geometry/VectorTextLayout.md +39 -0
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +111 -0
- package/dist/docs/reference/geometry/VectorTextMetrics.md +94 -0
- package/dist/docs/reference/geometry/VectorTextOptions.md +50 -0
- package/dist/docs/reference/geometry/add3.md +38 -0
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +57 -0
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +52 -0
- package/dist/docs/reference/geometry/anchorFrame3.md +40 -0
- package/dist/docs/reference/geometry/applyTransformDirection3.md +41 -0
- package/dist/docs/reference/geometry/applyTransformPoint3.md +39 -0
- package/dist/docs/reference/geometry/attachTransform.md +73 -0
- package/dist/docs/reference/geometry/boundsCenter.md +62 -0
- package/dist/docs/reference/geometry/boundsFromSize.md +83 -0
- package/dist/docs/reference/geometry/boundsSize.md +62 -0
- package/dist/docs/reference/geometry/boxAnchor3.md +48 -0
- package/dist/docs/reference/geometry/buildHelicalThreadRidgeMesh.md +68 -0
- package/dist/docs/reference/geometry/buildHelicalThreadSolidMesh.md +102 -0
- package/dist/docs/reference/geometry/categories/bounds-layout.md +35 -0
- package/dist/docs/reference/geometry/categories/curves-paths.md +63 -0
- package/dist/docs/reference/geometry/categories/mechanical.md +101 -0
- package/dist/docs/reference/geometry/categories/meshes.md +73 -0
- package/dist/docs/reference/geometry/categories/pattern-placement.md +34 -0
- package/dist/docs/reference/geometry/categories/primitive-options.md +36 -0
- package/dist/docs/reference/geometry/categories/profiles-regions.md +74 -0
- package/dist/docs/reference/geometry/categories/resolution-errors.md +46 -0
- package/dist/docs/reference/geometry/categories/transforms-math.md +63 -0
- package/dist/docs/reference/geometry/categories/vector-import.md +40 -0
- package/dist/docs/reference/geometry/circleContour.md +33 -0
- package/dist/docs/reference/geometry/closeToAxis.md +34 -0
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +51 -0
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +42 -0
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +56 -0
- package/dist/docs/reference/geometry/composeTransform3.md +40 -0
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +45 -0
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +47 -0
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +31 -0
- package/dist/docs/reference/geometry/containsBounds.md +72 -0
- package/dist/docs/reference/geometry/contourContainsPoint.md +33 -0
- package/dist/docs/reference/geometry/createAnchor3.md +63 -0
- package/dist/docs/reference/geometry/createThreadProfile.md +37 -0
- package/dist/docs/reference/geometry/createTriangleMeshSignature.md +60 -0
- package/dist/docs/reference/geometry/cross3.md +38 -0
- package/dist/docs/reference/geometry/cumulativePathLengths.md +33 -0
- package/dist/docs/reference/geometry/cylinderAnchor3.md +56 -0
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +14 -0
- package/dist/docs/reference/geometry/distributeAlongPath.md +51 -0
- package/dist/docs/reference/geometry/dot3.md +38 -0
- package/dist/docs/reference/geometry/ellipseContour.md +33 -0
- package/dist/docs/reference/geometry/eulerTransform3.md +38 -0
- package/dist/docs/reference/geometry/extrudeMesh.md +73 -0
- package/dist/docs/reference/geometry/fitBounds.md +95 -0
- package/dist/docs/reference/geometry/fitTextLayout.md +57 -0
- package/dist/docs/reference/geometry/frameTransform3.md +44 -0
- package/dist/docs/reference/geometry/getMetricClearanceHole.md +33 -0
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +27 -0
- package/dist/docs/reference/geometry/gridPatternTransforms.md +31 -0
- package/dist/docs/reference/geometry/heightfieldMesh.md +43 -0
- package/dist/docs/reference/geometry/inverseTransform3.md +30 -0
- package/dist/docs/reference/geometry/isGeometryError.md +26 -0
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +36 -0
- package/dist/docs/reference/geometry/layoutRow.md +43 -0
- package/dist/docs/reference/geometry/length3.md +26 -0
- package/dist/docs/reference/geometry/lerp3.md +38 -0
- package/dist/docs/reference/geometry/linearPatternTransforms.md +31 -0
- package/dist/docs/reference/geometry/loftMesh.md +72 -0
- package/dist/docs/reference/geometry/matchProfiles.md +51 -0
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +47 -0
- package/dist/docs/reference/geometry/measureTriangleMesh.md +55 -0
- package/dist/docs/reference/geometry/meshBounds.md +35 -0
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +29 -0
- package/dist/docs/reference/geometry/normalize3.md +32 -0
- package/dist/docs/reference/geometry/normalizeContour.md +45 -0
- package/dist/docs/reference/geometry/normalizePolygon.md +37 -0
- package/dist/docs/reference/geometry/normalizeRegion.md +33 -0
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +91 -0
- package/dist/docs/reference/geometry/pathLength.md +33 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +57 -0
- package/dist/docs/reference/geometry/preflightHeightfield.md +34 -0
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +96 -0
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +85 -0
- package/dist/docs/reference/geometry/preflightSvgRegion.md +56 -0
- package/dist/docs/reference/geometry/preflightThreadedNut.md +96 -0
- package/dist/docs/reference/geometry/preflightThreadedRod.md +85 -0
- package/dist/docs/reference/geometry/projectOntoPlane3.md +32 -0
- package/dist/docs/reference/geometry/radialPatternTransforms.md +47 -0
- package/dist/docs/reference/geometry/rectangleContour.md +49 -0
- package/dist/docs/reference/geometry/rectangleProfile.md +53 -0
- package/dist/docs/reference/geometry/regionArea.md +34 -0
- package/dist/docs/reference/geometry/regionBounds.md +27 -0
- package/dist/docs/reference/geometry/regularPolygonContour.md +53 -0
- package/dist/docs/reference/geometry/resamplePolyline2.md +64 -0
- package/dist/docs/reference/geometry/resamplePolyline3.md +67 -0
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +79 -0
- package/dist/docs/reference/geometry/resolveArcSegments.md +67 -0
- package/dist/docs/reference/geometry/resolveCircularSegments.md +61 -0
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +31 -0
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +31 -0
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +74 -0
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +26 -0
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +59 -0
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +27 -0
- package/dist/docs/reference/geometry/resolveRackPitch.md +27 -0
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +59 -0
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +30 -0
- package/dist/docs/reference/geometry/revolveMesh.md +76 -0
- package/dist/docs/reference/geometry/rotateAroundAxis3.md +38 -0
- package/dist/docs/reference/geometry/rotationTransform3.md +49 -0
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +50 -0
- package/dist/docs/reference/geometry/sampleContour.md +77 -0
- package/dist/docs/reference/geometry/sampleCurve2.md +61 -0
- package/dist/docs/reference/geometry/sampleCurve3.md +61 -0
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +58 -0
- package/dist/docs/reference/geometry/sampleHelix.md +41 -0
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +59 -0
- package/dist/docs/reference/geometry/sampleRackToothPath.md +39 -0
- package/dist/docs/reference/geometry/sampleSideProfile.md +73 -0
- package/dist/docs/reference/geometry/sampleTextContours.md +53 -0
- package/dist/docs/reference/geometry/sampleThreadHelices.md +63 -0
- package/dist/docs/reference/geometry/scale3.md +38 -0
- package/dist/docs/reference/geometry/scaleTransform3.md +34 -0
- package/dist/docs/reference/geometry/signedContourArea.md +26 -0
- package/dist/docs/reference/geometry/starContour.md +51 -0
- package/dist/docs/reference/geometry/strokePathRegion.md +63 -0
- package/dist/docs/reference/geometry/subtract3.md +38 -0
- package/dist/docs/reference/geometry/sweepMesh.md +82 -0
- package/dist/docs/reference/geometry/transformContour.md +42 -0
- package/dist/docs/reference/geometry/transformDeterminant3.md +32 -0
- package/dist/docs/reference/geometry/transformPath2.md +40 -0
- package/dist/docs/reference/geometry/transformPath3.md +33 -0
- package/dist/docs/reference/geometry/transformRegion.md +40 -0
- package/dist/docs/reference/geometry/transformTriangleMesh.md +42 -0
- package/dist/docs/reference/geometry/translationTransform3.md +31 -0
- package/dist/docs/reference/geometry/triangulateContour.md +26 -0
- package/dist/docs/reference/geometry/validateSolidMesh.md +52 -0
- package/dist/docs/reference/geometry/validateTransform3.md +43 -0
- package/dist/docs/reference/geometry/validateTriangleMesh.md +59 -0
- package/dist/docs/reference/geometry.md +30 -0
- package/dist/docs/reference/model/Anchor3.md +54 -0
- package/dist/docs/reference/model/AttachOptions.md +63 -0
- package/dist/docs/reference/model/Bounds2.md +39 -0
- package/dist/docs/reference/model/Bounds3.md +39 -0
- package/dist/docs/reference/model/BoxEdge.md +15 -0
- package/dist/docs/reference/model/BoxEdgeSelection.md +19 -0
- package/dist/docs/reference/model/BoxEdgeTreatments.md +20 -0
- package/dist/docs/reference/model/BoxOptions.md +92 -0
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +35 -0
- package/dist/docs/reference/model/CircleContourOptions.md +21 -0
- package/dist/docs/reference/model/CircleOptions.md +21 -0
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +64 -0
- package/dist/docs/reference/model/Computed.md +35 -0
- package/dist/docs/reference/model/ComputedValue.md +20 -0
- package/dist/docs/reference/model/Contour.md +22 -0
- package/dist/docs/reference/model/CorrespondingComponent.md +46 -0
- package/dist/docs/reference/model/CorrespondingContour.md +46 -0
- package/dist/docs/reference/model/CorrespondingProfile.md +22 -0
- package/dist/docs/reference/model/CorrespondingProfileStation.md +27 -0
- package/dist/docs/reference/model/CylinderOptions.md +58 -0
- package/dist/docs/reference/model/DiagnosticOptions.md +23 -0
- package/dist/docs/reference/model/EdgeTreatment.md +22 -0
- package/dist/docs/reference/model/EllipseContourOptions.md +21 -0
- package/dist/docs/reference/model/EllipseOptions.md +21 -0
- package/dist/docs/reference/model/EndTreatments.md +39 -0
- package/dist/docs/reference/model/ExtrudeOptions.md +140 -0
- package/dist/docs/reference/model/FinalizedModel.md +121 -0
- package/dist/docs/reference/model/FinalizedPart.md +87 -0
- package/dist/docs/reference/model/Frame3.md +63 -0
- package/dist/docs/reference/model/GenerateCallback.md +37 -0
- package/dist/docs/reference/model/GenerateContext.md +277 -0
- package/dist/docs/reference/model/GeneratedPart.md +93 -0
- package/dist/docs/reference/model/GenerationDiagnostic.md +41 -0
- package/dist/docs/reference/model/GenerationError.md +54 -0
- package/dist/docs/reference/model/GeometryResolution.md +70 -0
- package/dist/docs/reference/model/GeometrySamplingLimits.md +62 -0
- package/dist/docs/reference/model/GeometryToleranceOptions.md +46 -0
- package/dist/docs/reference/model/GridPatternOptions.md +43 -0
- package/dist/docs/reference/model/HeightfieldOptions.md +67 -0
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +140 -0
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +58 -0
- package/dist/docs/reference/model/HullOptions.md +72 -0
- package/dist/docs/reference/model/ImmutableBuffer-type.md +80 -0
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +34 -0
- package/dist/docs/reference/model/ImplicitOptions.md +83 -0
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +245 -0
- package/dist/docs/reference/model/LinearPatternOptions.md +31 -0
- package/dist/docs/reference/model/LoftCorrespondence.md +27 -0
- package/dist/docs/reference/model/LoftOptions.md +91 -0
- package/dist/docs/reference/model/LoftPlacement.md +73 -0
- package/dist/docs/reference/model/LoftStation.md +35 -0
- package/dist/docs/reference/model/MatchProfilesOptions.md +35 -0
- package/dist/docs/reference/model/ModelProgram.md +44 -0
- package/dist/docs/reference/model/ModelingLimits.md +126 -0
- package/dist/docs/reference/model/NumericArray.md +7 -0
- package/dist/docs/reference/model/PartGeometry.md +16 -0
- package/dist/docs/reference/model/PartOptions.md +65 -0
- package/dist/docs/reference/model/PathNormalGuide.md +45 -0
- package/dist/docs/reference/model/PathPatternOptions.md +47 -0
- package/dist/docs/reference/model/PatternSource.md +26 -0
- package/dist/docs/reference/model/PlaneOptions.md +39 -0
- package/dist/docs/reference/model/Polygon-type.md +43 -0
- package/dist/docs/reference/model/PolygonOptions.md +112 -0
- package/dist/docs/reference/model/PrimitivePlacement.md +40 -0
- package/dist/docs/reference/model/PrimitivePlacementOptions.md +88 -0
- package/dist/docs/reference/model/PrintableThreadFit.md +14 -0
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +50 -0
- package/dist/docs/reference/model/Profile.md +22 -0
- package/dist/docs/reference/model/ProfileComponent2.md +46 -0
- package/dist/docs/reference/model/ProfileContour2.md +34 -0
- package/dist/docs/reference/model/ProfileSpan2.md +47 -0
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +41 -0
- package/dist/docs/reference/model/RadialPatternOptions.md +63 -0
- package/dist/docs/reference/model/RadialSizing.md +15 -0
- package/dist/docs/reference/model/RadialSizingOptions.md +40 -0
- package/dist/docs/reference/model/RectangleContourOptions.md +72 -0
- package/dist/docs/reference/model/RectangleCornerTreatment.md +40 -0
- package/dist/docs/reference/model/RectangleCornerTreatments.md +20 -0
- package/dist/docs/reference/model/RectangleOptions.md +107 -0
- package/dist/docs/reference/model/Region.md +19 -0
- package/dist/docs/reference/model/RegionOffsetJoin.md +16 -0
- package/dist/docs/reference/model/RegionOffsetOptions.md +65 -0
- package/dist/docs/reference/model/RegularPolygonOptions.md +53 -0
- package/dist/docs/reference/model/RevolveOptions.md +89 -0
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +96 -0
- package/dist/docs/reference/model/Section.md +450 -0
- package/dist/docs/reference/model/SectionHullOptions.md +72 -0
- package/dist/docs/reference/model/SectionInspection.md +98 -0
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +76 -0
- package/dist/docs/reference/model/Solid.md +350 -0
- package/dist/docs/reference/model/SolidInspection.md +98 -0
- package/dist/docs/reference/model/SolidRayHit.md +58 -0
- package/dist/docs/reference/model/SphereOptions.md +20 -0
- package/dist/docs/reference/model/StarOptions.md +98 -0
- package/dist/docs/reference/model/SvgOrigin.md +16 -0
- package/dist/docs/reference/model/SvgPathSectionOptions.md +78 -0
- package/dist/docs/reference/model/SvgSectionOptions.md +66 -0
- package/dist/docs/reference/model/SweepOptions.md +116 -0
- package/dist/docs/reference/model/SweepOrientation.md +116 -0
- package/dist/docs/reference/model/TextSectionOptions.md +41 -0
- package/dist/docs/reference/model/ThreadEndStyle.md +14 -0
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +117 -0
- package/dist/docs/reference/model/ThreadHandedness.md +14 -0
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +14 -0
- package/dist/docs/reference/model/ThreadLeadInShape.md +14 -0
- package/dist/docs/reference/model/ThreadProfile.md +86 -0
- package/dist/docs/reference/model/ThreadRidgeOptions.md +18 -0
- package/dist/docs/reference/model/ThreadedNutBevel.md +14 -0
- package/dist/docs/reference/model/ThreadedNutOptions.md +273 -0
- package/dist/docs/reference/model/ThreadedNutPreflight.md +98 -0
- package/dist/docs/reference/model/ThreadedNutShape.md +14 -0
- package/dist/docs/reference/model/ThreadedRodOptions.md +245 -0
- package/dist/docs/reference/model/TorusOptions.md +110 -0
- package/dist/docs/reference/model/Transform2.md +15 -0
- package/dist/docs/reference/model/Transform3.md +18 -0
- package/dist/docs/reference/model/TriangleMesh.md +42 -0
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +123 -0
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +79 -0
- package/dist/docs/reference/model/TubeOptions.md +143 -0
- package/dist/docs/reference/model/Vector2.md +15 -0
- package/dist/docs/reference/model/Vector3.md +15 -0
- package/dist/docs/reference/model/VectorTextLayout.md +40 -0
- package/dist/docs/reference/model/VectorTextMetrics.md +100 -0
- package/dist/docs/reference/model/anchor.md +46 -0
- package/dist/docs/reference/model/box.md +62 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +37 -0
- package/dist/docs/reference/model/categories/bounded-surfaces.md +26 -0
- package/dist/docs/reference/model/categories/contracts.md +16 -0
- package/dist/docs/reference/model/categories/core-values-errors.md +30 -0
- package/dist/docs/reference/model/categories/explicit-profiles.md +32 -0
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +42 -0
- package/dist/docs/reference/model/categories/generation.md +44 -0
- package/dist/docs/reference/model/categories/inspection.md +23 -0
- package/dist/docs/reference/model/categories/mesh-inspection.md +29 -0
- package/dist/docs/reference/model/categories/primitives.md +61 -0
- package/dist/docs/reference/model/categories/resolution.md +18 -0
- package/dist/docs/reference/model/categories/sections.md +59 -0
- package/dist/docs/reference/model/categories/threads.md +50 -0
- package/dist/docs/reference/model/categories/transforms-placement.md +43 -0
- package/dist/docs/reference/model/circle.md +39 -0
- package/dist/docs/reference/model/components.md +68 -0
- package/dist/docs/reference/model/compose.md +31 -0
- package/dist/docs/reference/model/cylinder.md +52 -0
- package/dist/docs/reference/model/distance.md +45 -0
- package/dist/docs/reference/model/ellipse.md +39 -0
- package/dist/docs/reference/model/extrude.md +83 -0
- package/dist/docs/reference/model/fromRegion.md +33 -0
- package/dist/docs/reference/model/generate.md +46 -0
- package/dist/docs/reference/model/gridPattern.md +80 -0
- package/dist/docs/reference/model/heightfield.md +40 -0
- package/dist/docs/reference/model/hull.md +74 -0
- package/dist/docs/reference/model/immutableBuffer.md +44 -0
- package/dist/docs/reference/model/immutableMesh.md +40 -0
- package/dist/docs/reference/model/implicit.md +47 -0
- package/dist/docs/reference/model/inspectSection.md +38 -0
- package/dist/docs/reference/model/inspectSolid.md +38 -0
- package/dist/docs/reference/model/internalThreadCutter.md +100 -0
- package/dist/docs/reference/model/intersect.md +70 -0
- package/dist/docs/reference/model/isEmpty.md +39 -0
- package/dist/docs/reference/model/linearPattern.md +80 -0
- package/dist/docs/reference/model/loft.md +137 -0
- package/dist/docs/reference/model/matchProfiles.md +42 -0
- package/dist/docs/reference/model/minkowskiSum.md +37 -0
- package/dist/docs/reference/model/pathPattern.md +118 -0
- package/dist/docs/reference/model/polygon.md +40 -0
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +89 -0
- package/dist/docs/reference/model/preflightThreadedNut.md +100 -0
- package/dist/docs/reference/model/preflightThreadedRod.md +89 -0
- package/dist/docs/reference/model/radialPattern.md +113 -0
- package/dist/docs/reference/model/rayCast.md +40 -0
- package/dist/docs/reference/model/rectangle.md +59 -0
- package/dist/docs/reference/model/regularPolygon.md +39 -0
- package/dist/docs/reference/model/revolve.md +74 -0
- package/dist/docs/reference/model/solidFromMesh.md +42 -0
- package/dist/docs/reference/model/sphere.md +42 -0
- package/dist/docs/reference/model/split.md +54 -0
- package/dist/docs/reference/model/splitByPlane.md +66 -0
- package/dist/docs/reference/model/star.md +63 -0
- package/dist/docs/reference/model/svgPathSection.md +65 -0
- package/dist/docs/reference/model/svgSection.md +64 -0
- package/dist/docs/reference/model/sweep.md +92 -0
- package/dist/docs/reference/model/textSection.md +57 -0
- package/dist/docs/reference/model/threadRidge.md +72 -0
- package/dist/docs/reference/model/threadedNut.md +110 -0
- package/dist/docs/reference/model/threadedRod.md +99 -0
- package/dist/docs/reference/model/toRegion.md +33 -0
- package/dist/docs/reference/model/toTriangleMesh.md +27 -0
- package/dist/docs/reference/model/torus.md +70 -0
- package/dist/docs/reference/model/tube.md +77 -0
- package/dist/docs/reference/model/union.md +72 -0
- package/dist/docs/reference/model.md +39 -0
- package/dist/docs/reference/text/Bounds2.md +34 -0
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -0
- package/dist/docs/reference/text/Vector2.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +186 -0
- package/dist/docs/reference/text/VectorFontOptions.md +17 -0
- package/dist/docs/reference/text/VectorTextArcBaseline.md +53 -0
- package/dist/docs/reference/text/VectorTextLayout.md +34 -0
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +111 -0
- package/dist/docs/reference/text/VectorTextMetrics.md +94 -0
- package/dist/docs/reference/text/VectorTextOptions.md +50 -0
- package/dist/docs/reference/text/categories/font-preparation.md +38 -0
- package/dist/docs/reference/text/prepareVectorFont.md +46 -0
- package/dist/docs/reference/text.md +21 -0
- package/dist/engine/construction-operations.js +10 -3
- package/dist/engine/deferred-context.js +12 -3
- package/dist/engine/execution.js +1 -1
- package/dist/engine/export-3mf.js +2 -2
- package/dist/engine/finalization.js +3 -3
- package/dist/engine/loft-operations.js +4 -4
- package/dist/engine/native/adapter.js +1 -1
- package/dist/engine/native/regions.js +9 -9
- package/dist/engine/pattern-operations.js +24 -13
- package/dist/engine/pattern-transform.js +9 -0
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-operations.js +10 -10
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/section-operations.js +25 -14
- package/dist/engine/session-graph.js +5 -3
- package/dist/engine/session.js +1 -2
- package/dist/geometry/bounds.js +117 -0
- package/dist/geometry/cylinder.js +5 -1
- package/dist/geometry/edge-finishing.js +2 -2
- package/dist/geometry/heightfield.js +1 -1
- package/dist/geometry/index.js +15 -12
- package/dist/geometry/{loft-correspondence.js → loft/loft-correspondence.js} +3 -3
- package/dist/geometry/{loft-geometry.js → loft/loft-geometry.js} +8 -8
- package/dist/geometry/{loft-options.js → loft/loft-options.js} +2 -2
- package/dist/geometry/{loft-simple-mesh.js → loft/loft-simple-mesh.js} +6 -6
- package/dist/geometry/{loft-triangulation.js → loft/loft-triangulation.js} +6 -6
- package/dist/geometry/{loft.js → loft/loft.js} +8 -8
- package/dist/geometry/math/vector3.js +5 -1
- package/dist/geometry/mechanical/gears.js +2 -2
- package/dist/geometry/mechanical/thread-mesh.js +3 -3
- package/dist/geometry/mechanical/thread-profiles.js +2 -2
- package/dist/geometry/mechanical/thread-surface.js +14 -5
- package/dist/geometry/{mesh-centroid.js → mesh/mesh-centroid.js} +1 -1
- package/dist/geometry/{mesh-planar.js → mesh/mesh-planar.js} +1 -1
- package/dist/geometry/{mesh-quality.js → mesh/mesh-quality.js} +2 -2
- package/dist/geometry/{mesh-signature.js → mesh/mesh-signature.js} +2 -2
- package/dist/geometry/{mesh-solid.js → mesh/mesh-solid.js} +2 -2
- package/dist/geometry/{mesh.js → mesh/mesh.js} +7 -8
- package/dist/geometry/paths/frames.js +4 -5
- package/dist/geometry/patterns/options.js +1 -0
- package/dist/{engine/pattern-placements.js → geometry/patterns/placements.js} +22 -8
- package/dist/geometry/patterns.js +25 -0
- package/dist/geometry/primitive-resolvers.js +9 -9
- package/dist/geometry/profiles/contour.js +3 -3
- package/dist/geometry/profiles/matched.js +3 -3
- package/dist/geometry/profiles/profiles.js +10 -10
- package/dist/geometry/profiles/rectangle.js +7 -7
- package/dist/geometry/profiles/shapes.js +9 -9
- package/dist/geometry/profiles/side-profile.js +37 -0
- package/dist/geometry/regions.js +15 -15
- package/dist/geometry/revolve/revolve-mesh.js +5 -5
- package/dist/geometry/stroke-path.js +2 -2
- package/dist/geometry/svg/errors.js +0 -3
- package/dist/geometry/svg/fill.js +7 -7
- package/dist/geometry/svg/index.js +1 -1
- package/dist/geometry/svg/matrix.js +0 -114
- package/dist/geometry/svg/parser.js +1 -439
- package/dist/geometry/svg-import.js +3 -3
- package/dist/geometry/sweeps/sweep-closed.js +1 -1
- package/dist/geometry/sweeps/sweep-mesh.js +1 -1
- package/dist/geometry/sweeps/sweep-open.js +3 -3
- package/dist/geometry/sweeps/validation.js +2 -2
- package/dist/geometry/text-fitting.js +85 -0
- package/dist/geometry/tolerance.js +2 -2
- package/dist/geometry/transform-geometry.js +9 -9
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +1 -1
- package/dist/model/operation-contracts.js +1 -0
- package/dist/model/operation-dispatch.js +6 -0
- package/dist/model/operations.js +19 -49
- package/package.json +10 -8
- /package/dist/geometry/{mesh-edge-table.js → mesh/mesh-edge-table.js} +0 -0
- /package/dist/geometry/{mesh-solid-intersections.js → mesh/mesh-solid-intersections.js} +0 -0
|
@@ -2,17 +2,17 @@ import { GeometryError } from "../errors.js";
|
|
|
2
2
|
import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
|
|
3
3
|
import { assertPrimitiveOptions } from "../primitive-resolvers.js";
|
|
4
4
|
import { requireFiniteProfileValues, requireProfileVertexCount } from "./validation.js";
|
|
5
|
-
export {
|
|
5
|
+
export { rectangleContour } from "./rectangle.js";
|
|
6
6
|
/**
|
|
7
7
|
* Creates an immutable centered CCW circle with +X seam and vertex or face radial sizing.
|
|
8
8
|
*
|
|
9
9
|
* @example Explicit circular point data
|
|
10
10
|
* ```ts
|
|
11
|
-
*
|
|
11
|
+
* circleContour({ diameter: 20, segments: 32 });
|
|
12
12
|
* ```
|
|
13
13
|
*/
|
|
14
|
-
export const
|
|
15
|
-
const operation = "
|
|
14
|
+
export const circleContour = (options) => {
|
|
15
|
+
const operation = "circleContour";
|
|
16
16
|
assertPrimitiveOptions(options, operation);
|
|
17
17
|
if ((options.radius === undefined) === (options.diameter === undefined)) {
|
|
18
18
|
throw new GeometryError("INVALID_ARGUMENT", "Specify exactly one radius or diameter.", {
|
|
@@ -44,11 +44,11 @@ export const circleLoop = (options) => {
|
|
|
44
44
|
*
|
|
45
45
|
* @example Hexagon sized to its faces
|
|
46
46
|
* ```ts
|
|
47
|
-
*
|
|
47
|
+
* regularPolygonContour({ radius: 10, sides: 6, sizing: "face" });
|
|
48
48
|
* ```
|
|
49
49
|
*/
|
|
50
|
-
export const
|
|
51
|
-
const operation = "
|
|
50
|
+
export const regularPolygonContour = (options) => {
|
|
51
|
+
const operation = "regularPolygonContour";
|
|
52
52
|
const { radius, sides, rotationDegrees = 0, sizing = "vertex" } = options;
|
|
53
53
|
requireFiniteProfileValues([radius, rotationDegrees], operation);
|
|
54
54
|
if (!(radius > 0)) {
|
|
@@ -72,11 +72,11 @@ export const regularPolygonLoop = (options) => {
|
|
|
72
72
|
*
|
|
73
73
|
* @example Five-point outline
|
|
74
74
|
* ```ts
|
|
75
|
-
*
|
|
75
|
+
* starContour(12, 5, 6);
|
|
76
76
|
* ```
|
|
77
77
|
*/
|
|
78
|
-
export const
|
|
79
|
-
const operation = "
|
|
78
|
+
export const starContour = (outerRadius, points, innerRadius = outerRadius / 2, limits = {}) => {
|
|
79
|
+
const operation = "starContour";
|
|
80
80
|
requireFiniteProfileValues([outerRadius, innerRadius], operation);
|
|
81
81
|
if (!(outerRadius > 0) || !(innerRadius > 0) || innerRadius >= outerRadius) {
|
|
82
82
|
throw new GeometryError("INVALID_ARGUMENT", "Star radii must be positive, with the inner radius smaller than the outer.", { operation });
|
|
@@ -65,7 +65,7 @@ export function rectangleCornerSegments(corner, limits) {
|
|
|
65
65
|
const selected = resolveModelingLimits(limits);
|
|
66
66
|
const exact = corner.segments ?? corner.resolution?.circularSegments;
|
|
67
67
|
if (exact !== undefined && Number.isSafeInteger(exact) && exact >= 3)
|
|
68
|
-
assertSamplingCount(exact, "
|
|
68
|
+
assertSamplingCount(exact, "rectangleContour", selected.maxCircularSegments);
|
|
69
69
|
if (corner.radius === 0 &&
|
|
70
70
|
corner.segments === undefined &&
|
|
71
71
|
corner.resolution?.circularSegments === undefined)
|
|
@@ -83,11 +83,11 @@ export function rectangleCornerSegments(corner, limits) {
|
|
|
83
83
|
*
|
|
84
84
|
* @example Rounded rectangle outline
|
|
85
85
|
* ```ts
|
|
86
|
-
*
|
|
86
|
+
* rectangleContour({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
|
|
87
87
|
* ```
|
|
88
88
|
*/
|
|
89
|
-
export function
|
|
90
|
-
const { width, height, corners, limits } = resolveRectangle(options, "
|
|
89
|
+
export function rectangleContour(options) {
|
|
90
|
+
const { width, height, corners, limits } = resolveRectangle(options, "rectangleContour");
|
|
91
91
|
const counts = corners.map((corner) => {
|
|
92
92
|
if (corner.kind === "square")
|
|
93
93
|
return 1;
|
|
@@ -95,9 +95,9 @@ export function rectangleLoop(options) {
|
|
|
95
95
|
const intervals = rectangleCornerSegments(corner, limits);
|
|
96
96
|
return corner.radius > 0 ? intervals + 1 : 1;
|
|
97
97
|
}
|
|
98
|
-
return edgeTreatmentPointCount(corner, "
|
|
98
|
+
return edgeTreatmentPointCount(corner, "rectangleContour", { limits });
|
|
99
99
|
});
|
|
100
|
-
requireProfileVertexCount(counts.reduce((sum, count) => sum + count, 0), 3, "
|
|
100
|
+
requireProfileVertexCount(counts.reduce((sum, count) => sum + count, 0), 3, "rectangleContour", limits);
|
|
101
101
|
const x = width / 2, y = height / 2;
|
|
102
102
|
const vertices = [
|
|
103
103
|
[x, y],
|
|
@@ -131,7 +131,7 @@ export function rectangleLoop(options) {
|
|
|
131
131
|
}
|
|
132
132
|
const samples = corner.kind === "square"
|
|
133
133
|
? [[0, 0]]
|
|
134
|
-
: sampleEdgeTreatment(corner, "
|
|
134
|
+
: sampleEdgeTreatment(corner, "rectangleContour", { limits });
|
|
135
135
|
for (const [a, b] of samples)
|
|
136
136
|
points.push([
|
|
137
137
|
vertices[index][0] + incoming[index][0] * a + outgoing[index][0] * b,
|
|
@@ -7,33 +7,33 @@ import { requireFiniteProfileValues, requireProfileVertexCount } from "./validat
|
|
|
7
7
|
*
|
|
8
8
|
* @example Ellipse by full dimensions
|
|
9
9
|
* ```ts
|
|
10
|
-
*
|
|
10
|
+
* ellipseContour({ size: [30, 20] });
|
|
11
11
|
* ```
|
|
12
12
|
*/
|
|
13
|
-
export function
|
|
14
|
-
assertPrimitiveOptions(options, "
|
|
13
|
+
export function ellipseContour(options) {
|
|
14
|
+
assertPrimitiveOptions(options, "ellipseContour");
|
|
15
15
|
if ((options.radius === undefined) === (options.size === undefined)) {
|
|
16
16
|
throw new GeometryError("INVALID_ARGUMENT", "Specify exactly one radius or size tuple.", {
|
|
17
|
-
operation: "
|
|
17
|
+
operation: "ellipseContour",
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
20
|
const dimensions = options.radius ?? options.size;
|
|
21
21
|
if (!Array.isArray(dimensions) || dimensions.length !== 2) {
|
|
22
22
|
throw new GeometryError("INVALID_ARGUMENT", "Ellipse dimensions must be an exact XY tuple.", {
|
|
23
|
-
operation: "
|
|
23
|
+
operation: "ellipseContour",
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
const factor = options.radius === undefined ? 0.5 : 1;
|
|
27
27
|
const radiusX = dimensions[0] * factor;
|
|
28
28
|
const radiusY = dimensions[1] * factor;
|
|
29
|
-
requireFiniteProfileValues([radiusX, radiusY], "
|
|
29
|
+
requireFiniteProfileValues([radiusX, radiusY], "ellipseContour");
|
|
30
30
|
if (![radiusX, radiusY].every((value) => Number.isFinite(value) && value > 0)) {
|
|
31
31
|
throw new GeometryError("INVALID_ARGUMENT", "Ellipse radii must be finite and positive.", {
|
|
32
|
-
operation: "
|
|
32
|
+
operation: "ellipseContour",
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
|
-
const segments = resolveCircularPrimitiveSegments(Math.max(radiusX, radiusY), options, "
|
|
36
|
-
requireProfileVertexCount(segments, 3, "
|
|
35
|
+
const segments = resolveCircularPrimitiveSegments(Math.max(radiusX, radiusY), options, "ellipseContour");
|
|
36
|
+
requireProfileVertexCount(segments, 3, "ellipseContour", options.limits);
|
|
37
37
|
return Object.freeze(Array.from({ length: segments }, (_, index) => {
|
|
38
38
|
const angle = (index * Math.PI * 2) / segments;
|
|
39
39
|
return Object.freeze([radiusX * Math.cos(angle), radiusY * Math.sin(angle)]);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { normalizeContour } from "../regions.js";
|
|
2
3
|
import { resolveGeometryResolution } from "../resolution.js";
|
|
3
4
|
import { resolveGeometrySamplingLimits } from "../sampling-limits.js";
|
|
4
5
|
import { requireProfileVertexCount } from "./validation.js";
|
|
@@ -135,3 +136,39 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
135
136
|
}
|
|
136
137
|
return Object.freeze(output);
|
|
137
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Closes an open, strictly upward [radius, height] side outline to the radius-zero axis.
|
|
141
|
+
* Adds horizontal bottom/top edges at the endpoint heights, retaining axis endpoints once.
|
|
142
|
+
* Returns a counterclockwise filled-boundary contour without a repeated seam vertex.
|
|
143
|
+
* Radii must be nonnegative; the result must enclose nonzero area without touching itself.
|
|
144
|
+
* This is a solid-body closure, not a hollow-wall or mounting-bore construction.
|
|
145
|
+
*/
|
|
146
|
+
export function closeToAxis(side, limits) {
|
|
147
|
+
const operation = "closeToAxis";
|
|
148
|
+
const arrayShape = Array.isArray(side);
|
|
149
|
+
if (!arrayShape || side.length < 2)
|
|
150
|
+
throw new GeometryError("INVALID_ARGUMENT", "A side outline needs at least two points.", {
|
|
151
|
+
operation,
|
|
152
|
+
});
|
|
153
|
+
requireProfileVertexCount(side.length, 2, operation, limits);
|
|
154
|
+
for (let index = 0; index < side.length; index++) {
|
|
155
|
+
const point = side[index];
|
|
156
|
+
const pointShape = Array.isArray(point) && point.length === 2;
|
|
157
|
+
if (!pointShape ||
|
|
158
|
+
!point.every(Number.isFinite) ||
|
|
159
|
+
point[0] < 0 ||
|
|
160
|
+
(index > 0 && point[1] <= side[index - 1][1]))
|
|
161
|
+
throw new GeometryError("INVALID_ARGUMENT", "Side points require finite nonnegative radii and strictly increasing heights.", { operation });
|
|
162
|
+
}
|
|
163
|
+
const first = side[0];
|
|
164
|
+
const last = side.at(-1);
|
|
165
|
+
requireProfileVertexCount(side.length + Number(first[0] !== 0) + Number(last[0] !== 0), 3, operation, limits);
|
|
166
|
+
const contour = [];
|
|
167
|
+
if (first[0] !== 0)
|
|
168
|
+
contour.push([0, first[1]]);
|
|
169
|
+
for (const point of side)
|
|
170
|
+
contour.push(point);
|
|
171
|
+
if (last[0] !== 0)
|
|
172
|
+
contour.push([0, last[1]]);
|
|
173
|
+
return normalizeContour(contour, true);
|
|
174
|
+
}
|
package/dist/geometry/regions.js
CHANGED
|
@@ -28,7 +28,7 @@ const coordinateScale = (loop) => {
|
|
|
28
28
|
return Math.max(maxX - minX, maxY - minY);
|
|
29
29
|
};
|
|
30
30
|
/** Returns the signed area of a non-duplicated loop; positive means CCW. */
|
|
31
|
-
export function
|
|
31
|
+
export function signedContourArea(loop) {
|
|
32
32
|
if (loop.length === 0)
|
|
33
33
|
return 0;
|
|
34
34
|
const origin = loop[0];
|
|
@@ -48,7 +48,7 @@ export function signedAreaLoop2(loop) {
|
|
|
48
48
|
return (twiceArea + correction) / 2;
|
|
49
49
|
}
|
|
50
50
|
/** Returns true when a point lies inside or on the boundary of a loop. */
|
|
51
|
-
export function
|
|
51
|
+
export function contourContainsPoint(loop, point) {
|
|
52
52
|
let inside = false;
|
|
53
53
|
for (let index = 0, previous = loop.length - 1; index < loop.length; previous = index++) {
|
|
54
54
|
const a = loop[index];
|
|
@@ -128,7 +128,7 @@ const boundedSegments = (loop, epsilon) => loop.map((a, index) => {
|
|
|
128
128
|
const consumeIntersectionCandidate = (budget) => {
|
|
129
129
|
budget.candidates += 1;
|
|
130
130
|
if (budget.candidates > MAX_INTERSECTION_CANDIDATES) {
|
|
131
|
-
throw new GeometryError("COMPLEXITY_LIMIT", "Region validation exceeds the 2000000 intersection-candidate work limit.", { operation: "
|
|
131
|
+
throw new GeometryError("COMPLEXITY_LIMIT", "Region validation exceeds the 2000000 intersection-candidate work limit.", { operation: "normalizeRegion", details: { maximumCandidates: MAX_INTERSECTION_CANDIDATES } });
|
|
132
132
|
}
|
|
133
133
|
};
|
|
134
134
|
const boundedIntersections = (segments, epsilon, budget, sameLoop) => {
|
|
@@ -170,7 +170,7 @@ const loopsIntersect = (a, b, epsilon, budget) => a === b ||
|
|
|
170
170
|
* result must be simple and have non-zero area. Previously validated immutable results may be
|
|
171
171
|
* returned unchanged when their winding and tolerance policy match.
|
|
172
172
|
*/
|
|
173
|
-
export function
|
|
173
|
+
export function normalizeContour(input, counterClockwise, tolerance = {}) {
|
|
174
174
|
return normalizeLoopWithBudget(input, counterClockwise, tolerance, { candidates: 0 });
|
|
175
175
|
}
|
|
176
176
|
const normalizeLoopWithBudget = (input, counterClockwise, tolerance, budget) => {
|
|
@@ -199,7 +199,7 @@ const normalizeLoopWithBudget = (input, counterClockwise, tolerance, budget) =>
|
|
|
199
199
|
if (boundedIntersections(boundedSegments(cleaned, resolved.linear), resolved.linear, budget, true)) {
|
|
200
200
|
throw new GeometryError("SELF_INTERSECTION", "A loop must not self-intersect.");
|
|
201
201
|
}
|
|
202
|
-
const area =
|
|
202
|
+
const area = signedContourArea(cleaned);
|
|
203
203
|
if (!Number.isFinite(area)) {
|
|
204
204
|
throw new GeometryError("NON_FINITE_VALUE", "Loop area must be finite.");
|
|
205
205
|
}
|
|
@@ -223,7 +223,7 @@ const normalizeLoopWithBudget = (input, counterClockwise, tolerance, budget) =>
|
|
|
223
223
|
* within its exterior and boundaries may not intersect. Previously validated immutable results
|
|
224
224
|
* may be returned unchanged under the same tolerance policy.
|
|
225
225
|
*/
|
|
226
|
-
export function
|
|
226
|
+
export function normalizePolygon(polygon, tolerance = {}) {
|
|
227
227
|
return normalizePolygonWithBudget(polygon, tolerance, { candidates: 0 });
|
|
228
228
|
}
|
|
229
229
|
const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
|
|
@@ -236,7 +236,7 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
|
|
|
236
236
|
const epsilon = resolveGeometryTolerance(scale, policy).linear;
|
|
237
237
|
for (let index = 0; index < holes.length; index += 1) {
|
|
238
238
|
const hole = holes[index];
|
|
239
|
-
if (!
|
|
239
|
+
if (!contourContainsPoint(outer, hole[0]) || loopsIntersect(outer, hole, epsilon, budget)) {
|
|
240
240
|
throw new GeometryError("INVALID_TOPOLOGY", "Every hole must lie inside its exterior.");
|
|
241
241
|
}
|
|
242
242
|
}
|
|
@@ -254,8 +254,8 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
|
|
|
254
254
|
if (!boundsOverlap(previous, current, 2 * epsilon))
|
|
255
255
|
continue;
|
|
256
256
|
if (loopsIntersect(previous.loop, current.loop, epsilon, budget) ||
|
|
257
|
-
|
|
258
|
-
|
|
257
|
+
contourContainsPoint(previous.loop, current.loop[0]) ||
|
|
258
|
+
contourContainsPoint(current.loop, previous.loop[0])) {
|
|
259
259
|
throw new GeometryError("INVALID_TOPOLOGY", "Polygon holes must be disjoint.");
|
|
260
260
|
}
|
|
261
261
|
}
|
|
@@ -273,7 +273,7 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
|
|
|
273
273
|
* Validates a disjoint explicit region and returns immutable normalized data.
|
|
274
274
|
* Previously validated immutable results may be returned unchanged under the same tolerance policy.
|
|
275
275
|
*/
|
|
276
|
-
export function
|
|
276
|
+
export function normalizeRegion(region, tolerance = {}) {
|
|
277
277
|
const policy = resolveGeometryTolerance(1, tolerance);
|
|
278
278
|
if (samePolicy(normalizedRegions.get(region), policy))
|
|
279
279
|
return region;
|
|
@@ -284,8 +284,8 @@ export function normalizeRegion2(region, tolerance = {}) {
|
|
|
284
284
|
}
|
|
285
285
|
const budget = { candidates: 0 };
|
|
286
286
|
const polygons = region.map((polygon) => normalizePolygonWithBudget(polygon, policy, budget));
|
|
287
|
-
const containsFilledPoint = (polygon, point) =>
|
|
288
|
-
!polygon.holes.some((hole) =>
|
|
287
|
+
const containsFilledPoint = (polygon, point) => contourContainsPoint(polygon.outer, point) &&
|
|
288
|
+
!polygon.holes.some((hole) => contourContainsPoint(hole, point));
|
|
289
289
|
// Broad phase preserves exact contact semantics while avoiding pairwise loop
|
|
290
290
|
// walks for separated polygons (for example many disconnected QR modules).
|
|
291
291
|
const bounded = polygons
|
|
@@ -336,7 +336,7 @@ export function normalizeRegion2(region, tolerance = {}) {
|
|
|
336
336
|
* Returns the total filled area of a normalized region in square millimetres.
|
|
337
337
|
*
|
|
338
338
|
* Each polygon contributes its outer-loop area minus the areas of its holes. An empty region has
|
|
339
|
-
* zero area. Call {@link
|
|
339
|
+
* zero area. Call {@link normalizeRegion} first when input winding or topology is not already
|
|
340
340
|
* canonical.
|
|
341
341
|
*
|
|
342
342
|
* @param region - Normalized disjoint polygons with CCW outers and clockwise holes.
|
|
@@ -344,8 +344,8 @@ export function normalizeRegion2(region, tolerance = {}) {
|
|
|
344
344
|
*/
|
|
345
345
|
export function regionArea(region) {
|
|
346
346
|
return region.reduce((total, polygon) => total +
|
|
347
|
-
Math.abs(
|
|
348
|
-
polygon.holes.reduce((holeTotal, hole) => holeTotal + Math.abs(
|
|
347
|
+
Math.abs(signedContourArea(polygon.outer)) -
|
|
348
|
+
polygon.holes.reduce((holeTotal, hole) => holeTotal + Math.abs(signedContourArea(hole)), 0), 0);
|
|
349
349
|
}
|
|
350
350
|
/** Returns finite axis-aligned bounds for a non-empty region. */
|
|
351
351
|
export function regionBounds(region) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import { validateTriangleMesh } from "../mesh.js";
|
|
2
|
+
import { triangulateContour } from "../loft/loft.js";
|
|
3
|
+
import { validateTriangleMesh } from "../mesh/mesh.js";
|
|
4
4
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
|
|
5
5
|
import { writeMeshVertex } from "../numeric.js";
|
|
6
6
|
import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
|
|
7
|
-
import {
|
|
7
|
+
import { normalizeContour } from "../regions.js";
|
|
8
8
|
import { assertSamplingCount } from "../sampling-limits.js";
|
|
9
9
|
const AXIS_EPSILON = 1e-10;
|
|
10
10
|
/**
|
|
@@ -52,7 +52,7 @@ export const revolveMesh = (profile, options = {}) => {
|
|
|
52
52
|
}
|
|
53
53
|
maximumRadius = Math.max(maximumRadius, radius);
|
|
54
54
|
}
|
|
55
|
-
profile =
|
|
55
|
+
profile = normalizeContour(profile, true);
|
|
56
56
|
const circularSegments = resolveCircularPrimitiveSegments(maximumRadius, options, "revolveMesh");
|
|
57
57
|
const closed = degrees === 360;
|
|
58
58
|
const segments = closed
|
|
@@ -117,7 +117,7 @@ export const revolveMesh = (profile, options = {}) => {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
if (!closed) {
|
|
120
|
-
const cap =
|
|
120
|
+
const cap = triangulateContour(profile);
|
|
121
121
|
const at = (profileIndex, station) => vertexIndices[profileIndex][profile[profileIndex][0] <= AXIS_EPSILON ? 0 : station];
|
|
122
122
|
for (let offset = 0; offset < cap.length; offset += 3) {
|
|
123
123
|
const a = cap[offset], b = cap[offset + 1], c = cap[offset + 2];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GeometryError } from "./errors.js";
|
|
2
2
|
import { unionPolygonGeometry } from "./polygon-clipping.js";
|
|
3
|
-
import {
|
|
3
|
+
import { normalizeRegion } from "./regions.js";
|
|
4
4
|
import { resolveCircularSegments } from "./resolution.js";
|
|
5
5
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
|
|
6
6
|
import { resolveGeometryTolerance } from "./tolerance.js";
|
|
@@ -139,7 +139,7 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
|
139
139
|
return result;
|
|
140
140
|
}
|
|
141
141
|
function regionFromMultiPolygon(value) {
|
|
142
|
-
return
|
|
142
|
+
return normalizeRegion(value.map((polygon) => ({
|
|
143
143
|
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
144
144
|
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
145
145
|
})));
|
|
@@ -2,9 +2,6 @@ import { GeometryError } from "../errors.js";
|
|
|
2
2
|
export function invalid(operation, message) {
|
|
3
3
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
4
4
|
}
|
|
5
|
-
export function unsupported(operation, message) {
|
|
6
|
-
throw new GeometryError("UNSUPPORTED_RUNTIME", message, { operation });
|
|
7
|
-
}
|
|
8
5
|
export function emptyGeometry(operation, message) {
|
|
9
6
|
throw new GeometryError("DEGENERATE_GEOMETRY", message, { operation });
|
|
10
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { polygonClipping, unionPolygonGeometry, xorPolygonGeometry } from "../polygon-clipping.js";
|
|
2
|
-
import {
|
|
2
|
+
import { normalizeRegion, signedContourArea } from "../regions.js";
|
|
3
3
|
import { assertSamplingCount } from "../sampling-limits.js";
|
|
4
4
|
/** Private clipping stage with the selected execution's immutable allocation ceiling. */
|
|
5
5
|
export function createBoundedSvgClipping(maximumVertices) {
|
|
@@ -52,12 +52,12 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
52
52
|
if (outer === undefined)
|
|
53
53
|
return total;
|
|
54
54
|
return (total +
|
|
55
|
-
Math.abs(
|
|
56
|
-
holes.reduce((holeTotal, hole) => holeTotal + Math.abs(
|
|
55
|
+
Math.abs(signedContourArea(outer)) -
|
|
56
|
+
holes.reduce((holeTotal, hole) => holeTotal + Math.abs(signedContourArea(hole)), 0));
|
|
57
57
|
}, 0);
|
|
58
58
|
}
|
|
59
59
|
function coverageHasMultiplicity(rings, union) {
|
|
60
|
-
const summedArea = rings.reduce((total, points) => total + Math.abs(
|
|
60
|
+
const summedArea = rings.reduce((total, points) => total + Math.abs(signedContourArea(points)), 0);
|
|
61
61
|
const tolerance = Math.max(1, summedArea) * 1e-9;
|
|
62
62
|
return Math.abs(summedArea - multiPolygonArea(union)) > tolerance;
|
|
63
63
|
}
|
|
@@ -141,10 +141,10 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
141
141
|
return boundedXor(polygons.map((polygon) => [polygon]), "even-odd fill output");
|
|
142
142
|
}
|
|
143
143
|
const positive = rings
|
|
144
|
-
.filter((points) =>
|
|
144
|
+
.filter((points) => signedContourArea(points) >= 0)
|
|
145
145
|
.map((points) => [ring(points)]);
|
|
146
146
|
const negative = rings
|
|
147
|
-
.filter((points) =>
|
|
147
|
+
.filter((points) => signedContourArea(points) < 0)
|
|
148
148
|
.map((points) => [ring(points)]);
|
|
149
149
|
if (positive.length === 0)
|
|
150
150
|
return boundedUnion([negative], "negative fill output");
|
|
@@ -156,7 +156,7 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
156
156
|
return differingCoverage(positive, negative);
|
|
157
157
|
}
|
|
158
158
|
function regionFromMultiPolygon(value) {
|
|
159
|
-
return
|
|
159
|
+
return normalizeRegion(value.map((polygon) => ({
|
|
160
160
|
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
161
161
|
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
162
162
|
})));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { parseSvgPath } from "./parser.js";
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { invalid } from "./errors.js";
|
|
2
|
-
export const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
|
|
3
1
|
export function multiplyMatrices(left, right) {
|
|
4
2
|
return [
|
|
5
3
|
left[0] * right[0] + left[2] * right[1],
|
|
@@ -16,115 +14,3 @@ export function transformPoint(matrix, point) {
|
|
|
16
14
|
matrix[1] * point[0] + matrix[3] * point[1] + matrix[5],
|
|
17
15
|
];
|
|
18
16
|
}
|
|
19
|
-
const NUMBER_PATTERN = /[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?/g;
|
|
20
|
-
/** Parses compact SVG number sequences while rejecting unconsumed syntax. */
|
|
21
|
-
export function parseNumberSequence(value, operation) {
|
|
22
|
-
const numbers = [];
|
|
23
|
-
let end = 0;
|
|
24
|
-
NUMBER_PATTERN.lastIndex = 0;
|
|
25
|
-
for (let match = NUMBER_PATTERN.exec(value); match !== null; match = NUMBER_PATTERN.exec(value)) {
|
|
26
|
-
const separator = value.slice(end, match.index);
|
|
27
|
-
if (!/^[\s,]*$/.test(separator) ||
|
|
28
|
-
(separator.match(/,/g)?.length ?? 0) > 1 ||
|
|
29
|
-
(numbers.length === 0 && separator.includes(","))) {
|
|
30
|
-
invalid(operation, `Invalid numeric syntax near "${separator}".`);
|
|
31
|
-
}
|
|
32
|
-
const parsed = Number(match[0]);
|
|
33
|
-
if (!Number.isFinite(parsed)) {
|
|
34
|
-
invalid(operation, "SVG numeric values must be finite.");
|
|
35
|
-
}
|
|
36
|
-
numbers.push(parsed);
|
|
37
|
-
end = match.index + match[0].length;
|
|
38
|
-
}
|
|
39
|
-
if (!/^\s*$/.test(value.slice(end))) {
|
|
40
|
-
invalid(operation, "Invalid trailing numeric syntax.");
|
|
41
|
-
}
|
|
42
|
-
if (numbers.length === 0 && value.trim() !== "") {
|
|
43
|
-
invalid(operation, `Expected a numeric value, received "${value}".`);
|
|
44
|
-
}
|
|
45
|
-
return numbers;
|
|
46
|
-
}
|
|
47
|
-
function transformFor(name, values, operation) {
|
|
48
|
-
switch (name) {
|
|
49
|
-
case "matrix":
|
|
50
|
-
if (values.length !== 6)
|
|
51
|
-
invalid(operation, "matrix() requires six numbers.");
|
|
52
|
-
return values;
|
|
53
|
-
case "translate":
|
|
54
|
-
if (values.length < 1 || values.length > 2) {
|
|
55
|
-
invalid(operation, "translate() requires one or two numbers.");
|
|
56
|
-
}
|
|
57
|
-
return [1, 0, 0, 1, values[0] ?? 0, values[1] ?? 0];
|
|
58
|
-
case "scale": {
|
|
59
|
-
if (values.length < 1 || values.length > 2) {
|
|
60
|
-
invalid(operation, "scale() requires one or two numbers.");
|
|
61
|
-
}
|
|
62
|
-
const sx = values[0] ?? 1;
|
|
63
|
-
return [sx, 0, 0, values[1] ?? sx, 0, 0];
|
|
64
|
-
}
|
|
65
|
-
case "rotate": {
|
|
66
|
-
if (values.length !== 1 && values.length !== 3) {
|
|
67
|
-
invalid(operation, "rotate() requires an angle, optionally followed by a center.");
|
|
68
|
-
}
|
|
69
|
-
const radians = ((values[0] ?? 0) * Math.PI) / 180;
|
|
70
|
-
const rotation = [
|
|
71
|
-
Math.cos(radians),
|
|
72
|
-
Math.sin(radians),
|
|
73
|
-
-Math.sin(radians),
|
|
74
|
-
Math.cos(radians),
|
|
75
|
-
0,
|
|
76
|
-
0,
|
|
77
|
-
];
|
|
78
|
-
if (values.length === 1)
|
|
79
|
-
return rotation;
|
|
80
|
-
const cx = values[1] ?? 0;
|
|
81
|
-
const cy = values[2] ?? 0;
|
|
82
|
-
return multiplyMatrices(multiplyMatrices([1, 0, 0, 1, cx, cy], rotation), [
|
|
83
|
-
1,
|
|
84
|
-
0,
|
|
85
|
-
0,
|
|
86
|
-
1,
|
|
87
|
-
-cx,
|
|
88
|
-
-cy,
|
|
89
|
-
]);
|
|
90
|
-
}
|
|
91
|
-
case "skewX": {
|
|
92
|
-
if (values.length !== 1)
|
|
93
|
-
invalid(operation, "skewX() requires one angle.");
|
|
94
|
-
const tangent = Math.tan(((values[0] ?? 0) * Math.PI) / 180);
|
|
95
|
-
if (!Number.isFinite(tangent))
|
|
96
|
-
invalid(operation, "skewX() produced a non-finite matrix.");
|
|
97
|
-
return [1, 0, tangent, 1, 0, 0];
|
|
98
|
-
}
|
|
99
|
-
case "skewY": {
|
|
100
|
-
if (values.length !== 1)
|
|
101
|
-
invalid(operation, "skewY() requires one angle.");
|
|
102
|
-
const tangent = Math.tan(((values[0] ?? 0) * Math.PI) / 180);
|
|
103
|
-
if (!Number.isFinite(tangent))
|
|
104
|
-
invalid(operation, "skewY() produced a non-finite matrix.");
|
|
105
|
-
return [1, tangent, 0, 1, 0, 0];
|
|
106
|
-
}
|
|
107
|
-
default:
|
|
108
|
-
invalid(operation, `Unsupported SVG transform "${name}".`);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/** Parses an SVG transform list using standard post-multiplication order. */
|
|
112
|
-
export function parseTransform(value, operation) {
|
|
113
|
-
if (value === undefined || value.trim() === "")
|
|
114
|
-
return IDENTITY_MATRIX;
|
|
115
|
-
const callPattern = /([A-Za-z]+)\s*\(([^()]*)\)/g;
|
|
116
|
-
let result = IDENTITY_MATRIX;
|
|
117
|
-
let end = 0;
|
|
118
|
-
for (let match = callPattern.exec(value); match !== null; match = callPattern.exec(value)) {
|
|
119
|
-
if (!/^[\s,]*$/.test(value.slice(end, match.index))) {
|
|
120
|
-
invalid(operation, "Malformed SVG transform list.");
|
|
121
|
-
}
|
|
122
|
-
const values = parseNumberSequence(match[2] ?? "", operation);
|
|
123
|
-
result = multiplyMatrices(result, transformFor(match[1] ?? "", values, operation));
|
|
124
|
-
end = match.index + match[0].length;
|
|
125
|
-
}
|
|
126
|
-
if (end === 0 || !/^\s*$/.test(value.slice(end))) {
|
|
127
|
-
invalid(operation, "Malformed SVG transform list.");
|
|
128
|
-
}
|
|
129
|
-
return result;
|
|
130
|
-
}
|