@metamesh/modeling 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/README.md +55 -13
- package/dist/api/engine.d.ts +15 -7
- package/dist/api/geometry.d.ts +853 -562
- package/dist/api/index.d.ts +604 -227
- package/dist/api/text.d.ts +9 -7
- package/dist/docs/guides/concepts.md +295 -91
- package/dist/docs/guides/fonts.md +9 -8
- package/dist/docs/guides/fundamentals.md +22 -23
- package/dist/docs/guides/generation.md +24 -23
- package/dist/docs/guides/hosting.md +26 -11
- package/dist/docs/guides/recipes.md +74 -48
- package/dist/docs/guides/standalone-model.md +42 -0
- package/dist/docs/manifest.json +1555 -749
- package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
- package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
- package/dist/docs/reference/engine/GenerationOptions.md +1 -1
- package/dist/docs/reference/engine/GeometryResource.md +1 -1
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +1 -1
- package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +21 -10
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +6 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +7 -2
- package/dist/docs/reference/engine/createModelEngine.md +3 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine/validateModel.md +1 -1
- package/dist/docs/reference/engine.md +6 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +6 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +11 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +13 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +11 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +2 -1
- package/dist/docs/reference/geometry/Bounds2-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds2Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds2Input.md +21 -0
- package/dist/docs/reference/geometry/Bounds3-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds3Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds3Input.md +21 -0
- package/dist/docs/reference/geometry/BoundsFit2.md +6 -5
- package/dist/docs/reference/geometry/BoundsFit3.md +6 -5
- package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +5 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +10 -10
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +8 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +5 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -7
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +6 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +6 -1
- package/dist/docs/reference/geometry/Contour.md +10 -4
- package/dist/docs/reference/geometry/ContourCurve.md +5 -1
- package/dist/docs/reference/geometry/ContourPoint.md +6 -1
- package/dist/docs/reference/geometry/ContourSegment.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +5 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +10 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +10 -6
- package/dist/docs/reference/geometry/Curve2.md +5 -1
- package/dist/docs/reference/geometry/Curve3.md +5 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +9 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +7 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +6 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +7 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +6 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +11 -6
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +7 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +10 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +7 -3
- package/dist/docs/reference/geometry/Frame3.md +10 -6
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +5 -5
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +5 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +9 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +9 -4
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +9 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +10 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +7 -2
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +4 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +10 -6
- package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +82 -0
- package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +148 -0
- package/dist/docs/reference/geometry/KnuckleHingeInterval.md +46 -0
- package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +51 -0
- package/dist/docs/reference/geometry/KnuckleHingeSpec.md +22 -0
- package/dist/docs/reference/geometry/LineCurve2.md +8 -4
- package/dist/docs/reference/geometry/LineCurve3.md +8 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +8 -4
- package/dist/docs/reference/geometry/LoftOptions.md +5 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +5 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +5 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +5 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +9 -2
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +6 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +6 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +5 -1
- package/dist/docs/reference/geometry/Path2-type.md +196 -0
- package/dist/docs/reference/geometry/Path2Data.md +50 -0
- package/dist/docs/reference/geometry/Path2Input.md +20 -0
- package/dist/docs/reference/geometry/Path3-type.md +196 -0
- package/dist/docs/reference/geometry/Path3Data.md +50 -0
- package/dist/docs/reference/geometry/Path3Input.md +20 -0
- package/dist/docs/reference/geometry/PathFrame.md +9 -5
- package/dist/docs/reference/geometry/PathLocation.md +69 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +10 -5
- package/dist/docs/reference/geometry/PathOptions.md +38 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +8 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +84 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +2 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +2 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +8 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +26 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +5 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +7 -3
- package/dist/docs/reference/geometry/PolygonData.md +7 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -4
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +8 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +6 -1
- package/dist/docs/reference/geometry/Profile.md +8 -2
- package/dist/docs/reference/geometry/ProfileComponent2.md +5 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +8 -2
- package/dist/docs/reference/geometry/ProfileSpan2.md +7 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +6 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +10 -5
- package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +7 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +5 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +5 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +7 -3
- package/dist/docs/reference/geometry/RegionData.md +6 -2
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +7 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +13 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +7 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +7 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +8 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +8 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +7 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +5 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +6 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +5 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +7 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/StrokeCap.md +14 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +14 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +11 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +5 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +6 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +19 -15
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +16 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +14 -9
- package/dist/docs/reference/geometry/SweepOptions.md +10 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +11 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +9 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +8 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +8 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +7 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +7 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadRole.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +10 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +7 -3
- package/dist/docs/reference/geometry/ThreadedNutShape.md +8 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +10 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +6 -5
- package/dist/docs/reference/geometry/Transform2Data.md +15 -0
- package/dist/docs/reference/geometry/Transform2Input.md +4 -3
- package/dist/docs/reference/geometry/Transform3-type.md +6 -5
- package/dist/docs/reference/geometry/Transform3Data.md +18 -0
- package/dist/docs/reference/geometry/Transform3Input.md +4 -3
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +9 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +8 -4
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +8 -4
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +8 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +6 -5
- package/dist/docs/reference/geometry/Vector2Data.md +15 -0
- package/dist/docs/reference/geometry/Vector2Input.md +4 -3
- package/dist/docs/reference/geometry/Vector3-type.md +6 -5
- package/dist/docs/reference/geometry/Vector3Data.md +15 -0
- package/dist/docs/reference/geometry/Vector3Input.md +4 -3
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +8 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +5 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +7 -3
- package/dist/docs/reference/geometry/VectorTextOptions.md +5 -1
- package/dist/docs/reference/geometry/add2.md +7 -6
- package/dist/docs/reference/geometry/add3.md +7 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +6 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +10 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +9 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
- package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +16 -15
- package/dist/docs/reference/geometry/bounds2.md +38 -0
- package/dist/docs/reference/geometry/bounds3.md +38 -0
- package/dist/docs/reference/geometry/boundsCenter.md +12 -11
- package/dist/docs/reference/geometry/boundsFromSize.md +12 -11
- package/dist/docs/reference/geometry/boundsSize.md +12 -11
- package/dist/docs/reference/geometry/boxAnchor3.md +7 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +23 -6
- package/dist/docs/reference/geometry/categories/curves-paths.md +27 -13
- package/dist/docs/reference/geometry/categories/mechanical.md +27 -15
- package/dist/docs/reference/geometry/categories/meshes.md +18 -10
- package/dist/docs/reference/geometry/categories/pattern-placement.md +11 -9
- package/dist/docs/reference/geometry/categories/primitive-options.md +10 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -13
- package/dist/docs/reference/geometry/categories/resolution-errors.md +5 -3
- package/dist/docs/reference/geometry/categories/transforms-math.md +25 -16
- package/dist/docs/reference/geometry/categories/vector-import.md +15 -9
- package/dist/docs/reference/geometry/circleContour.md +5 -1
- package/dist/docs/reference/geometry/closeToAxis.md +14 -5
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +5 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +9 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +9 -5
- package/dist/docs/reference/geometry/composeTransform3.md +7 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +14 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +17 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +8 -4
- package/dist/docs/reference/geometry/containsBounds.md +10 -9
- package/dist/docs/reference/geometry/contourContainsPoint.md +8 -4
- package/dist/docs/reference/geometry/cross2.md +6 -5
- package/dist/docs/reference/geometry/cross3.md +7 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +7 -6
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/distance2.md +6 -5
- package/dist/docs/reference/geometry/distance3.md +6 -5
- package/dist/docs/reference/geometry/distributeAlongPath.md +12 -6
- package/dist/docs/reference/geometry/dot2.md +6 -5
- package/dist/docs/reference/geometry/dot3.md +6 -5
- package/dist/docs/reference/geometry/ellipseContour.md +5 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +7 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +12 -8
- package/dist/docs/reference/geometry/fitBounds.md +10 -9
- package/dist/docs/reference/geometry/fitTextLayout.md +13 -5
- package/dist/docs/reference/geometry/frameTransform3.md +5 -4
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +7 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +9 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +9 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +6 -5
- package/dist/docs/reference/geometry/isGeometryError.md +5 -2
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +5 -1
- package/dist/docs/reference/geometry/layoutRow.md +11 -7
- package/dist/docs/reference/geometry/length2.md +5 -4
- package/dist/docs/reference/geometry/length3.md +5 -4
- package/dist/docs/reference/geometry/lerp2.md +7 -6
- package/dist/docs/reference/geometry/lerp3.md +7 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/loftMesh.md +6 -1
- package/dist/docs/reference/geometry/matchProfiles.md +11 -2
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +5 -1
- package/dist/docs/reference/geometry/meshBounds.md +8 -4
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +7 -3
- package/dist/docs/reference/geometry/normalize2.md +10 -6
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +8 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -1
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +15 -11
- package/dist/docs/reference/geometry/path2.md +54 -0
- package/dist/docs/reference/geometry/path3.md +49 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +13 -9
- package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +13 -4
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +15 -4
- package/dist/docs/reference/geometry/preflightSvgRegion.md +15 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +14 -4
- package/dist/docs/reference/geometry/preflightThreadedRod.md +14 -4
- package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- package/dist/docs/reference/geometry/rectangleContour.md +10 -3
- package/dist/docs/reference/geometry/rectangleProfile.md +10 -2
- package/dist/docs/reference/geometry/regionArea.md +5 -1
- package/dist/docs/reference/geometry/regionBounds.md +8 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +9 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +9 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +9 -5
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +5 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +5 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +7 -3
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolveKnuckleHinge.md +59 -0
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +5 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +5 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/revolveMesh.md +14 -10
- package/dist/docs/reference/geometry/rotate2.md +6 -5
- package/dist/docs/reference/geometry/rotationTransform3.md +7 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -6
- package/dist/docs/reference/geometry/sampleContour.md +14 -4
- package/dist/docs/reference/geometry/sampleCurve2.md +8 -5
- package/dist/docs/reference/geometry/sampleCurve3.md +6 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleHelix.md +13 -5
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +17 -7
- package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +6 -2
- package/dist/docs/reference/geometry/scale2.md +6 -5
- package/dist/docs/reference/geometry/scale3.md +6 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +7 -6
- package/dist/docs/reference/geometry/signedContourArea.md +5 -1
- package/dist/docs/reference/geometry/starContour.md +8 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +67 -0
- package/dist/docs/reference/geometry/subtract2.md +7 -6
- package/dist/docs/reference/geometry/subtract3.md +7 -6
- package/dist/docs/reference/geometry/sweepMesh.md +13 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +10 -6
- package/dist/docs/reference/geometry/transform2.md +14 -7
- package/dist/docs/reference/geometry/transform3.md +16 -7
- package/dist/docs/reference/geometry/transformDeterminant3.md +5 -4
- package/dist/docs/reference/geometry/transformRegionData.md +5 -1
- package/dist/docs/reference/geometry/transformTriangleMesh.md +10 -6
- package/dist/docs/reference/geometry/translationTransform3.md +7 -6
- package/dist/docs/reference/geometry/triangulateContour.md +5 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +10 -3
- package/dist/docs/reference/geometry/validateTransform3.md +6 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/vector2.md +10 -2
- package/dist/docs/reference/geometry/vector3.md +10 -2
- package/dist/docs/reference/geometry.md +8 -6
- package/dist/docs/reference/model/Anchor3.md +6 -5
- package/dist/docs/reference/model/AttachOptions.md +11 -5
- package/dist/docs/reference/model/Bounds2-type.md +125 -0
- package/dist/docs/reference/model/Bounds2Data.md +44 -0
- package/dist/docs/reference/model/Bounds2Input.md +19 -0
- package/dist/docs/reference/model/Bounds3-type.md +125 -0
- package/dist/docs/reference/model/Bounds3Data.md +44 -0
- package/dist/docs/reference/model/Bounds3Input.md +19 -0
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +10 -10
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +6 -1
- package/dist/docs/reference/model/ComputedValue.md +5 -1
- package/dist/docs/reference/model/Contour.md +6 -4
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CylinderOptions.md +3 -3
- package/dist/docs/reference/model/DiagnosticOptions.md +6 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +3 -3
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/model/FinalizedModel.md +20 -10
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +6 -6
- package/dist/docs/reference/model/GenerateCallback.md +5 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -1
- package/dist/docs/reference/model/GeneratedPart.md +5 -1
- package/dist/docs/reference/model/GenerationDiagnostic.md +6 -1
- package/dist/docs/reference/model/GenerationError.md +5 -1
- package/dist/docs/reference/model/GeometryResolution.md +5 -5
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +12 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +4 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
- package/dist/docs/reference/model/HullOptions.md +5 -5
- package/dist/docs/reference/model/ImmutableBuffer-type.md +5 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +5 -1
- package/dist/docs/reference/model/ImplicitOptions.md +6 -6
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +5 -4
- package/dist/docs/reference/model/KnuckleHinge-type.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +77 -0
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +34 -0
- package/dist/docs/reference/model/KnuckleHingeOptions.md +38 -0
- package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeSpec.md +18 -0
- package/dist/docs/reference/model/KnuckleHingeWeb.md +53 -0
- package/dist/docs/reference/model/LinearPatternOptions.md +13 -5
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +1 -1
- package/dist/docs/reference/model/LoftPlacement.md +1 -1
- package/dist/docs/reference/model/LoftStation.md +3 -3
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +5 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +8 -1
- package/dist/docs/reference/model/PartGeometry.md +5 -1
- package/dist/docs/reference/model/PartOptions.md +5 -1
- package/dist/docs/reference/model/Path2-type.md +196 -0
- package/dist/docs/reference/model/Path2Data.md +50 -0
- package/dist/docs/reference/model/Path2Input.md +20 -0
- package/dist/docs/reference/model/Path3-type.md +196 -0
- package/dist/docs/reference/model/Path3Data.md +50 -0
- package/dist/docs/reference/model/Path3Input.md +20 -0
- package/dist/docs/reference/model/PathLocation.md +69 -0
- package/dist/docs/reference/model/PathNormalGuide.md +6 -5
- package/dist/docs/reference/model/PathOptions.md +38 -0
- package/dist/docs/reference/model/PathPatternOptions.md +4 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +83 -0
- package/dist/docs/reference/model/PatternSource.md +2 -1
- package/dist/docs/reference/model/Pivot2Options.md +2 -1
- package/dist/docs/reference/model/Pivot3Options.md +2 -1
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/PolygonData.md +3 -2
- package/dist/docs/reference/model/PolygonOptions.md +8 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +8 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +42 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +2 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +2 -1
- package/dist/docs/reference/model/Profile.md +4 -2
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +4 -2
- package/dist/docs/reference/model/ProfileSpan2.md +3 -3
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/model/RadialPatternOptions.md +18 -22
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +10 -10
- package/dist/docs/reference/model/RegionData.md +2 -2
- package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
- package/dist/docs/reference/model/RevolveOptions.md +9 -4
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +20 -12
- package/dist/docs/reference/model/SectionHullOptions.md +5 -5
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- package/dist/docs/reference/model/SectionOffsetJoin.md +1 -1
- package/dist/docs/reference/model/SectionOffsetOptions.md +1 -1
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +31 -7
- package/dist/docs/reference/model/SolidInspection.md +7 -7
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/{StrokePathCap.md → StrokeCap.md} +3 -3
- package/dist/docs/reference/model/{StrokePathJoin.md → StrokeJoin.md} +3 -3
- package/dist/docs/reference/model/StrokeOptions.md +6 -6
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
- package/dist/docs/reference/model/SweepOptions.md +6 -6
- package/dist/docs/reference/model/SweepOrientation.md +7 -7
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +2 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +2 -1
- package/dist/docs/reference/model/ThreadHandedness.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +2 -1
- package/dist/docs/reference/model/ThreadProfile.md +4 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +2 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +2 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +5 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +4 -3
- package/dist/docs/reference/model/ThreadedNutShape.md +2 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +5 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +6 -5
- package/dist/docs/reference/model/Transform2Data.md +16 -0
- package/dist/docs/reference/model/Transform2Input.md +4 -3
- package/dist/docs/reference/model/Transform3-type.md +6 -5
- package/dist/docs/reference/model/Transform3Data.md +19 -0
- package/dist/docs/reference/model/Transform3Input.md +4 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +4 -4
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +6 -5
- package/dist/docs/reference/model/{Vector2Tuple.md → Vector2Data.md} +3 -3
- package/dist/docs/reference/model/Vector2Input.md +4 -3
- package/dist/docs/reference/model/Vector3-type.md +6 -5
- package/dist/docs/reference/model/{Vector3Tuple.md → Vector3Data.md} +3 -3
- package/dist/docs/reference/model/Vector3Input.md +4 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +3 -3
- package/dist/docs/reference/model/anchor.md +2 -1
- package/dist/docs/reference/model/bounds2.md +36 -0
- package/dist/docs/reference/model/bounds3.md +36 -0
- package/dist/docs/reference/model/box.md +4 -4
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +10 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +5 -3
- package/dist/docs/reference/model/categories/bounds.md +36 -0
- package/dist/docs/reference/model/categories/contracts.md +4 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +11 -11
- package/dist/docs/reference/model/categories/explicit-profiles.md +7 -5
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +12 -3
- package/dist/docs/reference/model/categories/generation.md +11 -2
- package/dist/docs/reference/model/categories/hinges.md +38 -0
- package/dist/docs/reference/model/categories/inspection.md +12 -6
- package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
- package/dist/docs/reference/model/categories/paths.md +41 -0
- package/dist/docs/reference/model/categories/primitives.md +10 -4
- package/dist/docs/reference/model/categories/resolution.md +4 -2
- package/dist/docs/reference/model/categories/sections.md +12 -8
- package/dist/docs/reference/model/categories/threads.md +11 -8
- package/dist/docs/reference/model/categories/transforms-placement.md +23 -15
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +6 -6
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +1 -1
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +3 -3
- package/dist/docs/reference/model/generate.md +5 -1
- package/dist/docs/reference/model/gridPattern.md +5 -4
- package/dist/docs/reference/model/heightfield.md +5 -2
- package/dist/docs/reference/model/hull.md +1 -1
- package/dist/docs/reference/model/immutableBuffer.md +5 -1
- package/dist/docs/reference/model/immutableMesh.md +5 -1
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +5 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +1 -1
- package/dist/docs/reference/model/knuckleHinge.md +47 -0
- package/dist/docs/reference/model/linearPattern.md +5 -4
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +2 -2
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +54 -0
- package/dist/docs/reference/model/path3.md +49 -0
- package/dist/docs/reference/model/pathPattern.md +14 -12
- package/dist/docs/reference/model/polygon.md +8 -5
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +9 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +9 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +9 -3
- package/dist/docs/reference/model/radialPattern.md +6 -37
- package/dist/docs/reference/model/rectangle.md +7 -4
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +8 -8
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +1 -1
- package/dist/docs/reference/model/sweep.md +7 -7
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +3 -2
- package/dist/docs/reference/model/threadedNut.md +5 -4
- package/dist/docs/reference/model/threadedRod.md +5 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +14 -7
- package/dist/docs/reference/model/transform3.md +16 -7
- package/dist/docs/reference/model/tube.md +3 -3
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +10 -2
- package/dist/docs/reference/model/vector3.md +10 -2
- package/dist/docs/reference/model.md +17 -9
- package/dist/docs/reference/text/Bounds2Data.md +34 -0
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Data.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +2 -2
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +3 -3
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +8 -6
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +4 -2
- package/dist/engine/construction-operations.js +31 -14
- package/dist/engine/execution.js +39 -8
- package/dist/engine/extrusion-finishing.js +1 -1
- package/dist/engine/index.js +6 -1
- package/dist/engine/inspection-operations.js +13 -11
- package/dist/engine/knuckle-hinge-operation.js +85 -0
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/mechanical-operations.js +3 -1
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/modeling-context.js +8 -1
- package/dist/engine/native/material-components.js +305 -0
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/native/threads.js +3 -3
- package/dist/engine/native/transforms.js +5 -7
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +1 -1
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-anchors.js +17 -17
- package/dist/engine/primitive-operations.js +1 -1
- package/dist/engine/primitive-profiles.js +7 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +10 -2
- package/dist/engine/section-operations.js +33 -8
- package/dist/engine/session-snapshot.js +14 -4
- package/dist/engine/session.js +10 -5
- package/dist/engine/shape-anchors.js +3 -3
- package/dist/engine/transform-operations.js +27 -27
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/bounds-value.js +93 -0
- package/dist/geometry/bounds.js +10 -8
- package/dist/geometry/curves/sampling.js +15 -16
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/errors.js +1 -0
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/heightfield.js +12 -1
- package/dist/geometry/index.js +12 -11
- package/dist/geometry/loft/loft-simple-mesh.js +6 -6
- package/dist/geometry/loft/loft.js +22 -13
- package/dist/geometry/math/immutable-value.js +1 -1
- package/dist/geometry/math/vector-value.js +11 -3
- package/dist/geometry/math/vector2.js +1 -0
- package/dist/geometry/math/vector3.js +1 -0
- package/dist/geometry/mechanical/gear-motion.js +3 -3
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +4 -3
- package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
- package/dist/geometry/mechanical/standards.js +1 -1
- package/dist/geometry/mechanical/thread-helices.js +2 -3
- package/dist/geometry/mechanical/thread-mesh-plan.js +11 -7
- package/dist/geometry/mechanical/thread-mesh.js +7 -7
- package/dist/geometry/mechanical/thread-profiles.js +5 -5
- package/dist/geometry/mechanical/thread-solids.js +31 -6
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-centroid.js +1 -0
- package/dist/geometry/mesh/mesh-planar.js +25 -27
- package/dist/geometry/mesh/mesh-quality.js +5 -5
- package/dist/geometry/mesh/mesh-signature.js +13 -13
- package/dist/geometry/mesh/mesh-solid.js +8 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +8 -19
- package/dist/geometry/paths/frames.js +42 -11
- package/dist/geometry/paths/helix.js +17 -6
- package/dist/geometry/paths/path-value.js +268 -0
- package/dist/geometry/paths/planar.js +36 -23
- package/dist/geometry/paths/resampling.js +27 -5
- package/dist/geometry/patterns/placements.js +100 -27
- package/dist/geometry/patterns.js +5 -3
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/profiles/contour.js +7 -6
- package/dist/geometry/profiles/matched.js +5 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +14 -5
- package/dist/geometry/profiles/side-profile.js +9 -7
- package/dist/geometry/profiles/span-sampling.js +1 -1
- package/dist/geometry/resolution.js +34 -34
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +12 -27
- package/dist/geometry/svg/fill.js +7 -21
- package/dist/geometry/svg-import.js +31 -25
- package/dist/geometry/sweeps/options.js +5 -4
- package/dist/geometry/sweeps/orientation.js +5 -5
- package/dist/geometry/sweeps/stations.js +10 -10
- package/dist/geometry/sweeps/sweep-closed.js +2 -2
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +1 -1
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/text-fitting.js +1 -0
- package/dist/geometry/transform-geometry.js +7 -14
- package/dist/geometry/transform-matrix.js +1 -1
- package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
- package/dist/index.js +3 -1
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +62 -10
- package/dist/model/knuckle-hinge.js +1 -0
- package/dist/model/operations.js +79 -26
- package/dist/model/recipe-declaration.js +21 -7
- package/dist/model/shape-handles.js +2 -1
- package/dist/text/index.js +15 -9
- package/dist/text/vector-text-layout.js +31 -26
- package/package.json +1 -1
- package/dist/docs/reference/geometry/Bounds2.md +0 -39
- package/dist/docs/reference/geometry/Bounds3.md +0 -39
- package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +0 -34
- package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +0 -65
- package/dist/docs/reference/geometry/Path2.md +0 -14
- package/dist/docs/reference/geometry/Path3.md +0 -14
- package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
- package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/Transform2Matrix.md +0 -14
- package/dist/docs/reference/geometry/Transform3Matrix.md +0 -17
- package/dist/docs/reference/geometry/Vector2Tuple.md +0 -14
- package/dist/docs/reference/geometry/Vector3Tuple.md +0 -14
- package/dist/docs/reference/geometry/closestPointOnPath.md +0 -110
- package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
- package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
- package/dist/docs/reference/geometry/pathLength.md +0 -33
- package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
- package/dist/docs/reference/geometry/transformContour.md +0 -42
- package/dist/docs/reference/geometry/transformPath2.md +0 -40
- package/dist/docs/reference/geometry/transformPath3.md +0 -33
- package/dist/docs/reference/model/Bounds2.md +0 -39
- package/dist/docs/reference/model/Bounds3.md +0 -39
- package/dist/docs/reference/model/Path2.md +0 -20
- package/dist/docs/reference/model/Transform2Matrix.md +0 -15
- package/dist/docs/reference/model/Transform3Matrix.md +0 -18
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Bounds2.md +0 -34
- package/dist/docs/reference/text/Vector2Tuple.md +0 -7
- package/dist/geometry/paths/path.js +0 -32
|
@@ -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. */
|
|
@@ -9,6 +9,7 @@ function invalid(message) {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Samples 2–32 connected line/cubic segments into a simple, nonzero-area, immutable CCW XY loop.
|
|
12
|
+
*
|
|
12
13
|
* Physical scaling precedes adaptive curve sampling; the final end must repeat start exactly.
|
|
13
14
|
* Shared anchors and the closing seam are emitted once. Winding normalization may change the
|
|
14
15
|
* starting vertex. The sampled loop is checked for self-intersection and degeneracy by
|
|
@@ -16,7 +17,7 @@ function invalid(message) {
|
|
|
16
17
|
* coordinate range are required. No native engine, SDK, or ambient resolution is used.
|
|
17
18
|
*
|
|
18
19
|
* @param curve - Closed contour in millimetres unless positive scales convert its coordinates.
|
|
19
|
-
* @param options - Physical resolution and unique vertex budget; defaults to 4096
|
|
20
|
+
* @param options - Physical resolution and unique vertex budget; defaults to min(4096, maxProfilePoints).
|
|
20
21
|
* @returns Frozen counterclockwise loop in millimetres, without a repeated seam endpoint.
|
|
21
22
|
* @throws {@link GeometryError} for invalid data, topology, scale, or exceeded sampling budgets.
|
|
22
23
|
*
|
|
@@ -38,8 +39,8 @@ export function sampleContour(curve, options = {}) {
|
|
|
38
39
|
if (![widthScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0))
|
|
39
40
|
invalid("Cross-section scales must be finite and positive.");
|
|
40
41
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
41
|
-
const
|
|
42
|
-
requireProfileVertexCount(
|
|
42
|
+
const maxVertices = options.maxVertices ?? Math.min(4096, limits.maxProfilePoints);
|
|
43
|
+
requireProfileVertexCount(maxVertices, 3, OPERATION, limits);
|
|
43
44
|
const segmentInput = curve?.segments;
|
|
44
45
|
if (!curve ||
|
|
45
46
|
!Array.isArray(segmentInput) ||
|
|
@@ -66,11 +67,11 @@ export function sampleContour(curve, options = {}) {
|
|
|
66
67
|
invalid("Cross-section segments must be lines or cubics.");
|
|
67
68
|
const end = physical(segment.end);
|
|
68
69
|
const closed = index === curve.segments.length - 1;
|
|
69
|
-
const remainingVertices = Math.min(limits.maxPathPoints,
|
|
70
|
+
const remainingVertices = Math.min(limits.maxPathPoints, maxVertices - output.length + 1 + (closed ? 1 : 0));
|
|
70
71
|
if (remainingVertices < 2)
|
|
71
72
|
throw new GeometryError("COMPLEXITY_LIMIT", "Cross-section sampling exceeds its vertex budget.", {
|
|
72
73
|
operation: OPERATION,
|
|
73
|
-
details: {
|
|
74
|
+
details: { maxVertices },
|
|
74
75
|
});
|
|
75
76
|
let span;
|
|
76
77
|
if (segment.type === "line") {
|
|
@@ -90,7 +91,7 @@ export function sampleContour(curve, options = {}) {
|
|
|
90
91
|
}
|
|
91
92
|
const sampled = sampleCurve2(span, {
|
|
92
93
|
...(options.resolution === undefined ? {} : { resolution: options.resolution }),
|
|
93
|
-
|
|
94
|
+
maxVertices: remainingVertices,
|
|
94
95
|
limits,
|
|
95
96
|
}).points;
|
|
96
97
|
const endIndex = sampled.length - (closed ? 1 : 0);
|
|
@@ -39,10 +39,10 @@ const validateContour = (contour) => {
|
|
|
39
39
|
}
|
|
40
40
|
else if (span.kind === "arc") {
|
|
41
41
|
point(span.center);
|
|
42
|
-
if (![span.radius, span.
|
|
42
|
+
if (![span.radius, span.startAngle, span.sweepAngle].every(Number.isFinite) ||
|
|
43
43
|
span.radius < 0 ||
|
|
44
|
-
Math.abs(span.
|
|
45
|
-
span.
|
|
44
|
+
Math.abs(span.sweepAngle) > 360 ||
|
|
45
|
+
span.sweepAngle === 0)
|
|
46
46
|
fail("Arc spans need nonnegative radius and a nonzero finite sweep no larger than 360 degrees.");
|
|
47
47
|
}
|
|
48
48
|
else
|
|
@@ -64,6 +64,7 @@ const contours = (component) => [
|
|
|
64
64
|
];
|
|
65
65
|
/**
|
|
66
66
|
* Explicitly matches identified component/contour/span topology across a family.
|
|
67
|
+
*
|
|
67
68
|
* Every paired span uses the maximum physical subdivision count requested by any member.
|
|
68
69
|
* Cubics share a checked uniform parameter grid, including grids selected by exact paired requests.
|
|
69
70
|
* Input order and winding are preserved. Collapsed spans retain repeated logical slots, which
|
|
@@ -132,7 +133,7 @@ export function matchProfiles(profiles, options = {}) {
|
|
|
132
133
|
if (span.kind === "arc")
|
|
133
134
|
return span.radius === 0
|
|
134
135
|
? 1
|
|
135
|
-
: resolveArcSegments(span.radius, Math.abs(span.
|
|
136
|
+
: resolveArcSegments(span.radius, Math.abs(span.sweepAngle), selectedResolution, limits);
|
|
136
137
|
if (span.kind === "cubic")
|
|
137
138
|
return resolveUniformCubicSegments(planarCubicControl(span), selectedResolution, cubicBudget);
|
|
138
139
|
return resolveLineSegmentCount(Math.hypot(span.end[0] - span.start[0], span.end[1] - span.start[1]), selectedResolution.maxSegmentLength);
|
|
@@ -49,8 +49,8 @@ export const circleContour = (options) => {
|
|
|
49
49
|
*/
|
|
50
50
|
export const regularPolygonContour = (options) => {
|
|
51
51
|
const operation = "regularPolygonContour";
|
|
52
|
-
const { radius, sides,
|
|
53
|
-
requireFiniteProfileValues([radius,
|
|
52
|
+
const { radius, sides, rotation = 0, sizing = "vertex" } = options;
|
|
53
|
+
requireFiniteProfileValues([radius, rotation], operation);
|
|
54
54
|
if (!(radius > 0)) {
|
|
55
55
|
throw new GeometryError("INVALID_ARGUMENT", "Polygon radius must be positive.", { operation });
|
|
56
56
|
}
|
|
@@ -61,9 +61,9 @@ export const regularPolygonContour = (options) => {
|
|
|
61
61
|
});
|
|
62
62
|
const sampledRadius = sizing === "face" ? radius / Math.cos(Math.PI / sides) : radius;
|
|
63
63
|
requireFiniteProfileValues([sampledRadius], operation);
|
|
64
|
-
const
|
|
64
|
+
const rotationRadians = ((rotation % 360) * Math.PI) / 180;
|
|
65
65
|
return Array.from({ length: sides }, (_, index) => {
|
|
66
|
-
const angle =
|
|
66
|
+
const angle = rotationRadians + (Math.PI * 2 * index) / sides;
|
|
67
67
|
return [sampledRadius * Math.cos(angle), sampledRadius * Math.sin(angle)];
|
|
68
68
|
});
|
|
69
69
|
};
|
|
@@ -72,14 +72,18 @@ export function rectangleCornerSegments(corner, limits) {
|
|
|
72
72
|
return 1;
|
|
73
73
|
return (resolveAlignedCircularSegments(Math.max(corner.radius, Number.MIN_VALUE), {
|
|
74
74
|
alignTo: [4],
|
|
75
|
-
|
|
75
|
+
minSegments: 4,
|
|
76
76
|
...(corner.segments === undefined ? {} : { segments: corner.segments }),
|
|
77
77
|
...(corner.resolution === undefined ? {} : { resolution: corner.resolution }),
|
|
78
78
|
limits: selected,
|
|
79
79
|
}) / 4);
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
|
-
* Creates an immutable CCW rectangle
|
|
82
|
+
* Creates an immutable sampled CCW rectangle boundary. Round radius zero is square; tangent saturated endpoints occur once.
|
|
83
|
+
*
|
|
84
|
+
* Use [rectangle](/docs/reference/model/rectangle) for a filled Section.
|
|
85
|
+
*
|
|
86
|
+
* @see {@link rectangleProfile} for identified edge/corner spans used by matchProfiles.
|
|
83
87
|
*
|
|
84
88
|
* @example Rounded rectangle outline
|
|
85
89
|
* ```ts
|
|
@@ -148,6 +152,11 @@ export function rectangleContour(options) {
|
|
|
148
152
|
/**
|
|
149
153
|
* Creates an identified rectangle whose edge/corner spans survive zero and saturated round radii. Outer winding is CCW.
|
|
150
154
|
*
|
|
155
|
+
* Use [rectangle](/docs/reference/model/rectangle) for a filled Section.
|
|
156
|
+
*
|
|
157
|
+
* @see {@link matchProfiles} to sample a family with shared landmark correspondence.
|
|
158
|
+
* @see {@link rectangleContour} for sampled boundary coordinates.
|
|
159
|
+
*
|
|
151
160
|
* @example Retain rectangle landmarks
|
|
152
161
|
* ```ts
|
|
153
162
|
* rectangleProfile({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
|
|
@@ -194,7 +203,7 @@ export function rectangleProfile(options) {
|
|
|
194
203
|
center: map(index, a, b),
|
|
195
204
|
}));
|
|
196
205
|
corners.forEach((corner, index) => {
|
|
197
|
-
const shape = endpoints[index],
|
|
206
|
+
const shape = endpoints[index], startAngle = vertices[index][2];
|
|
198
207
|
if (corner.kind === "chamfer")
|
|
199
208
|
spans.push({ id: names[index], kind: "line", start: shape.start, end: shape.end });
|
|
200
209
|
else if (corner.kind === "smooth") {
|
|
@@ -230,8 +239,8 @@ export function rectangleProfile(options) {
|
|
|
230
239
|
kind: "arc",
|
|
231
240
|
center: shape.center,
|
|
232
241
|
radius: setbacks[index][0],
|
|
233
|
-
|
|
234
|
-
|
|
242
|
+
startAngle,
|
|
243
|
+
sweepAngle: 90,
|
|
235
244
|
...(exact ? { segments: rectangleCornerSegments(corner, limits) } : {}),
|
|
236
245
|
...(corner.kind === "round" && corner.resolution !== undefined
|
|
237
246
|
? { resolution: { ...corner.resolution } }
|
|
@@ -23,6 +23,7 @@ function distanceToChord(point, start, end) {
|
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Samples 1–31 line/cubic segments into a deeply immutable open [radius,height] polyline.
|
|
26
|
+
*
|
|
26
27
|
* Anchors must progress strictly upward; nonnegative-radius cubic controls must have ordered
|
|
27
28
|
* heights between their endpoints. Cubics use de Casteljau subdivision with a conservative
|
|
28
29
|
* control-hull chord-error bound. Lines also obey the optional physical edge-length ceiling.
|
|
@@ -30,7 +31,7 @@ function distanceToChord(point, start, end) {
|
|
|
30
31
|
* no axis closure, winding normalization, or manufacturing repair is performed.
|
|
31
32
|
*
|
|
32
33
|
* @param curve - Open outline in millimetres unless the positive scales convert its coordinates.
|
|
33
|
-
* @param options - Physical resolution and output budget; defaults to 4096
|
|
34
|
+
* @param options - Physical resolution and output budget; defaults to min(4096, maxProfilePoints).
|
|
34
35
|
* @returns Frozen open polyline in millimetres, ordered from lowest to highest anchor.
|
|
35
36
|
* @throws {@link GeometryError} for invalid coordinates, order, scale, or exceeded subdivision budget.
|
|
36
37
|
*
|
|
@@ -48,9 +49,9 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
48
49
|
if (![radiusScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0)) {
|
|
49
50
|
invalid("Profile scales must be finite and positive.");
|
|
50
51
|
}
|
|
51
|
-
const
|
|
52
|
+
const maxVertices = options.maxVertices ??
|
|
52
53
|
Math.min(4096, resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
|
|
53
|
-
requireProfileVertexCount(
|
|
54
|
+
requireProfileVertexCount(maxVertices, 2, OPERATION, options.limits);
|
|
54
55
|
const maximumProfilePoints = resolveGeometrySamplingLimits(options.limits).maxProfilePoints;
|
|
55
56
|
const segmentInput = curve.segments;
|
|
56
57
|
if (!Array.isArray(segmentInput) ||
|
|
@@ -72,10 +73,10 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
72
73
|
};
|
|
73
74
|
const output = [];
|
|
74
75
|
const append = (point) => {
|
|
75
|
-
if (output.length >=
|
|
76
|
+
if (output.length >= maxVertices || output.length >= maximumProfilePoints) {
|
|
76
77
|
throw new GeometryError("COMPLEXITY_LIMIT", "Profile sampling exceeds its vertex budget.", {
|
|
77
78
|
operation: OPERATION,
|
|
78
|
-
details: {
|
|
79
|
+
details: { maxVertices },
|
|
79
80
|
});
|
|
80
81
|
}
|
|
81
82
|
output.push(Object.freeze(point));
|
|
@@ -109,10 +110,10 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
109
110
|
const count = resolution.maxSegmentLength === undefined
|
|
110
111
|
? 1
|
|
111
112
|
: Math.max(1, Math.ceil(length / resolution.maxSegmentLength));
|
|
112
|
-
if (count >
|
|
113
|
+
if (count > maxVertices - output.length) {
|
|
113
114
|
throw new GeometryError("COMPLEXITY_LIMIT", "Profile line exceeds its vertex budget.", {
|
|
114
115
|
operation: OPERATION,
|
|
115
|
-
details: {
|
|
116
|
+
details: { maxVertices },
|
|
116
117
|
});
|
|
117
118
|
}
|
|
118
119
|
for (let index = 1; index <= count; index++) {
|
|
@@ -138,6 +139,7 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
138
139
|
}
|
|
139
140
|
/**
|
|
140
141
|
* Closes an open, strictly upward [radius, height] side outline to the radius-zero axis.
|
|
142
|
+
*
|
|
141
143
|
* Adds horizontal bottom/top edges at the endpoint heights, retaining axis endpoints once.
|
|
142
144
|
* Returns a counterclockwise filled-boundary contour without a repeated seam vertex.
|
|
143
145
|
* Radii must be nonnegative; the result must enclose nonzero area without touching itself.
|
|
@@ -8,7 +8,7 @@ export function createProfileSpanSampler(span) {
|
|
|
8
8
|
];
|
|
9
9
|
if (span.kind === "arc")
|
|
10
10
|
return (t) => {
|
|
11
|
-
const angle = ((span.
|
|
11
|
+
const angle = ((span.startAngle + span.sweepAngle * t) * Math.PI) / 180;
|
|
12
12
|
const snap = (value) => Math.abs(value) < 1e-14
|
|
13
13
|
? 0
|
|
14
14
|
: Math.abs(Math.abs(value) - 1) < 1e-14
|
|
@@ -13,20 +13,20 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
|
|
|
13
13
|
const merged = policy;
|
|
14
14
|
const circularSegments = merged.circularSegments;
|
|
15
15
|
const allowedMaximum = resolveGeometrySamplingLimits(limits).maxCircularSegments;
|
|
16
|
-
const
|
|
17
|
-
const
|
|
16
|
+
const minSegments = merged.minSegments ?? Math.min(DEFAULT_MINIMUM_SEGMENTS, allowedMaximum);
|
|
17
|
+
const maxSegments = merged.maxSegments ?? allowedMaximum;
|
|
18
18
|
const maxChordError = merged.maxChordError ?? DEFAULT_MAX_CHORD_ERROR;
|
|
19
19
|
const maxSegmentLength = merged.maxSegmentLength;
|
|
20
|
-
if (!Number.isSafeInteger(
|
|
21
|
-
invalid("
|
|
20
|
+
if (!Number.isSafeInteger(minSegments) || minSegments < 3) {
|
|
21
|
+
invalid("minSegments must be an integer of at least three.", { minSegments });
|
|
22
22
|
}
|
|
23
|
-
if (!Number.isSafeInteger(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
invalid("
|
|
23
|
+
if (!Number.isSafeInteger(maxSegments) ||
|
|
24
|
+
maxSegments < minSegments ||
|
|
25
|
+
maxSegments > allowedMaximum) {
|
|
26
|
+
invalid("maxSegments must be a safe integer between minSegments and maxCircularSegments.", {
|
|
27
27
|
allowedMaximum,
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
maxSegments,
|
|
29
|
+
minSegments,
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
if (!Number.isFinite(maxChordError) || maxChordError <= 0) {
|
|
@@ -41,18 +41,18 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
|
|
|
41
41
|
if (circularSegments !== undefined &&
|
|
42
42
|
(!Number.isSafeInteger(circularSegments) ||
|
|
43
43
|
circularSegments < 3 ||
|
|
44
|
-
circularSegments >
|
|
45
|
-
invalid("circularSegments must be an integer from three through
|
|
44
|
+
circularSegments > maxSegments)) {
|
|
45
|
+
invalid("circularSegments must be an integer from three through maxSegments.", {
|
|
46
46
|
circularSegments,
|
|
47
|
-
|
|
47
|
+
maxSegments,
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
return Object.freeze({
|
|
51
51
|
...(circularSegments === undefined ? {} : { circularSegments }),
|
|
52
52
|
maxChordError,
|
|
53
53
|
...(maxSegmentLength === undefined ? {} : { maxSegmentLength }),
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
maxSegments,
|
|
55
|
+
minSegments,
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
const requiredFullCircleSegments = (radius, resolution, sizing) => {
|
|
@@ -66,7 +66,7 @@ const requiredFullCircleSegments = (radius, resolution, sizing) => {
|
|
|
66
66
|
: sizing === "face"
|
|
67
67
|
? Math.ceil(Math.PI / Math.atan(resolution.maxSegmentLength / radius / 2))
|
|
68
68
|
: Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
|
|
69
|
-
return Math.max(resolution.
|
|
69
|
+
return Math.max(resolution.minSegments, chordSegments, lengthSegments);
|
|
70
70
|
};
|
|
71
71
|
const assertRadius = (radius, operation) => {
|
|
72
72
|
if (!Number.isFinite(radius) || radius <= 0) {
|
|
@@ -107,11 +107,11 @@ export function resolveCircularSegments(radius, policy = {}, limits = {}) {
|
|
|
107
107
|
if (resolution.circularSegments !== undefined)
|
|
108
108
|
return resolution.circularSegments;
|
|
109
109
|
const required = requiredFullCircleSegments(radius, resolution, sizing);
|
|
110
|
-
if (required > resolution.
|
|
111
|
-
throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.
|
|
110
|
+
if (required > resolution.maxSegments) {
|
|
111
|
+
throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maxSegments}-segment safety limit.`, {
|
|
112
112
|
operation,
|
|
113
113
|
details: {
|
|
114
|
-
|
|
114
|
+
maxSegments: resolution.maxSegments,
|
|
115
115
|
radius,
|
|
116
116
|
requiredSegments: required,
|
|
117
117
|
},
|
|
@@ -142,7 +142,7 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
|
|
|
142
142
|
* `alignTo` must be non-empty and contain only positive safe integers. Its checked least common
|
|
143
143
|
* multiple defines the alignment grid. An exact `segments` value wins over
|
|
144
144
|
* `resolution.circularSegments` and adaptive sampling, but is never rounded: it must already be
|
|
145
|
-
* aligned and meet `
|
|
145
|
+
* aligned and meet `minSegments`. Adaptive counts are rounded upward and fail with
|
|
146
146
|
* `COMPLEXITY_LIMIT` when the aligned result exceeds the configured safety cap.
|
|
147
147
|
*
|
|
148
148
|
* @param radius - Positive circle radius in millimetres used for adaptive physical sampling.
|
|
@@ -176,9 +176,9 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
176
176
|
}
|
|
177
177
|
alignment = checkedLeastCommonMultiple(alignment, factor, operation);
|
|
178
178
|
}
|
|
179
|
-
const
|
|
180
|
-
if (!Number.isSafeInteger(
|
|
181
|
-
throw new GeometryError("INVALID_ARGUMENT", "
|
|
179
|
+
const minSegments = options.minSegments ?? 3;
|
|
180
|
+
if (!Number.isSafeInteger(minSegments) || minSegments < 3) {
|
|
181
|
+
throw new GeometryError("INVALID_ARGUMENT", "minSegments must be a safe integer of at least three.", { operation, details: { minSegments } });
|
|
182
182
|
}
|
|
183
183
|
const resolution = options.segments === undefined
|
|
184
184
|
? resolveGeometryResolution(options.resolution, options.limits)
|
|
@@ -187,10 +187,10 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
187
187
|
}, options.limits);
|
|
188
188
|
if (resolution.circularSegments !== undefined) {
|
|
189
189
|
const exactSegments = resolution.circularSegments;
|
|
190
|
-
if (exactSegments <
|
|
191
|
-
throw new GeometryError("INVALID_ARGUMENT", "The exact segment count must meet
|
|
190
|
+
if (exactSegments < minSegments || exactSegments % alignment !== 0) {
|
|
191
|
+
throw new GeometryError("INVALID_ARGUMENT", "The exact segment count must meet minSegments and every alignTo factor.", {
|
|
192
192
|
operation,
|
|
193
|
-
details: { alignment, exactSegments,
|
|
193
|
+
details: { alignment, exactSegments, minSegments },
|
|
194
194
|
});
|
|
195
195
|
}
|
|
196
196
|
return exactSegments;
|
|
@@ -199,18 +199,18 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
199
199
|
...resolution,
|
|
200
200
|
sizing: options.sizing ?? "vertex",
|
|
201
201
|
}, options.limits);
|
|
202
|
-
const requiredSegments = Math.max(baseSegments,
|
|
202
|
+
const requiredSegments = Math.max(baseSegments, minSegments);
|
|
203
203
|
const multiplier = Math.ceil(requiredSegments / alignment);
|
|
204
204
|
if (!Number.isSafeInteger(multiplier) || multiplier > Number.MAX_SAFE_INTEGER / alignment) {
|
|
205
205
|
throw new GeometryError("COMPLEXITY_LIMIT", "The aligned segment count exceeds safe integer complexity.", { operation, details: { alignment, requiredSegments } });
|
|
206
206
|
}
|
|
207
207
|
const alignedSegments = multiplier * alignment;
|
|
208
|
-
if (alignedSegments > resolution.
|
|
208
|
+
if (alignedSegments > resolution.maxSegments) {
|
|
209
209
|
throw new GeometryError("COMPLEXITY_LIMIT", "Aligned circular tessellation exceeds the configured segment safety limit.", {
|
|
210
210
|
operation,
|
|
211
211
|
details: {
|
|
212
212
|
alignment,
|
|
213
|
-
|
|
213
|
+
maxSegments: resolution.maxSegments,
|
|
214
214
|
requiredSegments,
|
|
215
215
|
segments: alignedSegments,
|
|
216
216
|
},
|
|
@@ -225,7 +225,7 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
225
225
|
* the reusable BOSL2-style convention while retaining at least one segment.
|
|
226
226
|
*
|
|
227
227
|
* @param radius - Arc radius in millimetres.
|
|
228
|
-
* @param
|
|
228
|
+
* @param angle - Non-zero signed sweep angle no greater than 360 degrees in magnitude.
|
|
229
229
|
* @param policy - Optional operation-level policy over the active model scope.
|
|
230
230
|
* @returns Segment count for the requested arc span.
|
|
231
231
|
* @throws {@link GeometryError} when radius, angle, or resolution policy is invalid, or the
|
|
@@ -237,12 +237,12 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
237
237
|
* const quarterTurnSegments = resolveArcSegments(10, 90);
|
|
238
238
|
* ```
|
|
239
239
|
*/
|
|
240
|
-
export function resolveArcSegments(radius,
|
|
240
|
+
export function resolveArcSegments(radius, angle, policy = {}, limits = {}) {
|
|
241
241
|
const operation = "resolveArcSegments";
|
|
242
242
|
assertRadius(radius, operation);
|
|
243
|
-
if (!Number.isFinite(
|
|
244
|
-
throw new GeometryError("INVALID_ARGUMENT", "
|
|
243
|
+
if (!Number.isFinite(angle) || angle === 0 || Math.abs(angle) > 360) {
|
|
244
|
+
throw new GeometryError("INVALID_ARGUMENT", "angle must be finite, non-zero, and no greater than 360 degrees in magnitude.", { operation, details: { angle } });
|
|
245
245
|
}
|
|
246
|
-
const ratio = Math.abs(
|
|
246
|
+
const ratio = Math.abs(angle) / 360;
|
|
247
247
|
return Math.max(1, Math.ceil(resolveCircularSegments(radius, policy, limits) * ratio));
|
|
248
248
|
}
|
|
@@ -3,6 +3,7 @@ import { triangulateContour } from "../loft/loft.js";
|
|
|
3
3
|
import { validateTriangleMesh } from "../mesh/mesh.js";
|
|
4
4
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
|
|
5
5
|
import { writeMeshVertex } from "../numeric.js";
|
|
6
|
+
import { path2InputData } from "../paths/path-value.js";
|
|
6
7
|
import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
|
|
7
8
|
import { normalizeContour } from "../regions.js";
|
|
8
9
|
import { assertSamplingCount } from "../sampling-limits.js";
|
|
@@ -16,6 +17,7 @@ const AXIS_EPSILON = 1e-10;
|
|
|
16
17
|
* vertices and zero-area quads. Profile edges that lie entirely on the axis
|
|
17
18
|
* collapse to the solid's interior and are intentionally omitted.
|
|
18
19
|
* Profile coordinates must fit finite Float32 mesh storage.
|
|
20
|
+
* Path2 profiles must be closed; raw point collections have an implicit closing edge.
|
|
19
21
|
*
|
|
20
22
|
* @param profile - Closed CCW `[radius, z]` profile without a duplicated seam point.
|
|
21
23
|
* @param options - Optional physical or exact circumferential sampling controls. Defaults to `{}`.
|
|
@@ -24,28 +26,31 @@ const AXIS_EPSILON = 1e-10;
|
|
|
24
26
|
* @example Partial revolution with end caps
|
|
25
27
|
* ```ts
|
|
26
28
|
* // Each point is [radius, Z]; the profile seam is implicit.
|
|
27
|
-
* revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], {
|
|
29
|
+
* revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], { degrees: 270 });
|
|
28
30
|
* ```
|
|
29
31
|
*/
|
|
30
|
-
export const revolveMesh = (
|
|
32
|
+
export const revolveMesh = (input, options = {}) => {
|
|
31
33
|
if (typeof options !== "object" || options === null || Array.isArray(options))
|
|
32
34
|
throw new GeometryError("INVALID_ARGUMENT", "Revolution options require an object.", {
|
|
33
35
|
operation: "revolveMesh",
|
|
34
36
|
});
|
|
35
|
-
const degrees = options.
|
|
37
|
+
const degrees = options.degrees ?? 360;
|
|
36
38
|
if (!Number.isFinite(degrees) || degrees <= 0 || degrees > 360)
|
|
37
|
-
throw new GeometryError("INVALID_ARGUMENT", "
|
|
39
|
+
throw new GeometryError("INVALID_ARGUMENT", "degrees must be in (0, 360].", {
|
|
38
40
|
operation: "revolveMesh",
|
|
39
41
|
});
|
|
42
|
+
const limits = resolveModelingLimits(options.limits);
|
|
43
|
+
let profile = path2InputData(input, true, { maxPathPoints: limits.maxProfilePoints }).points;
|
|
40
44
|
if (profile.length < 3) {
|
|
41
|
-
throw new
|
|
45
|
+
throw new GeometryError("DEGENERATE_GEOMETRY", "A revolved profile needs at least three points.", {
|
|
46
|
+
operation: "revolveMesh",
|
|
47
|
+
});
|
|
42
48
|
}
|
|
43
|
-
const limits = resolveModelingLimits(options.limits);
|
|
44
49
|
assertSamplingCount(profile.length, "revolveMesh", limits.maxProfilePoints);
|
|
45
50
|
let maximumRadius = 0;
|
|
46
51
|
for (const [radius, z] of profile) {
|
|
47
52
|
if (!Number.isFinite(radius) || !Number.isFinite(z) || radius < 0) {
|
|
48
|
-
throw new
|
|
53
|
+
throw new GeometryError(Number.isFinite(radius) && Number.isFinite(z) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", "Revolved profile coordinates must be finite and radii non-negative.", { operation: "revolveMesh" });
|
|
49
54
|
}
|
|
50
55
|
if (!Number.isFinite(Math.fround(radius)) || !Number.isFinite(Math.fround(z))) {
|
|
51
56
|
throw new GeometryError("NON_FINITE_VALUE", "Revolved profile coordinates exceed finite Float32 mesh storage.", { operation: "revolveMesh" });
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
import { GeometryError } from "./errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { path2InputData } from "./paths/path-value.js";
|
|
3
|
+
import { clippingRing, regionFromMultiPolygon, unionPolygonGeometry } from "./polygon-clipping.js";
|
|
4
4
|
import { resolveCircularSegments } from "./resolution.js";
|
|
5
5
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
|
|
6
6
|
import { resolveGeometryTolerance } from "./tolerance.js";
|
|
7
7
|
const DEFAULT_MITER_LIMIT = 4;
|
|
8
8
|
function fail(message) {
|
|
9
|
-
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "
|
|
10
|
-
}
|
|
11
|
-
function ring(points) {
|
|
12
|
-
const result = points.map(([x, y]) => [x, y]);
|
|
13
|
-
const first = result[0];
|
|
14
|
-
const last = result.at(-1);
|
|
15
|
-
if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1])) {
|
|
16
|
-
result.push([...first]);
|
|
17
|
-
}
|
|
18
|
-
return result;
|
|
9
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "strokeRegionData" });
|
|
19
10
|
}
|
|
20
11
|
function ellipsePoints(center, radius, segments) {
|
|
21
12
|
return Array.from({ length: segments }, (_, index) => {
|
|
@@ -76,8 +67,9 @@ function deduplicatePath(path, closed, width) {
|
|
|
76
67
|
return Object.freeze(points);
|
|
77
68
|
}
|
|
78
69
|
/** @internal Bounded CCW stroke primitives shared by native sections and pure clipping. */
|
|
79
|
-
export function strokePathContours(
|
|
80
|
-
const
|
|
70
|
+
export function strokePathContours(input, options, exactCircularSegments) {
|
|
71
|
+
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
72
|
+
const { points: path, closed } = path2InputData(input, options.closed, limits);
|
|
81
73
|
const cap = options.cap ?? "butt";
|
|
82
74
|
const join = options.join ?? "miter";
|
|
83
75
|
if (typeof closed !== "boolean")
|
|
@@ -97,9 +89,8 @@ export function strokePathContours(path, options, exactCircularSegments) {
|
|
|
97
89
|
? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
|
|
98
90
|
: 3);
|
|
99
91
|
const half = options.width / 2;
|
|
100
|
-
|
|
101
|
-
assertSamplingCount(
|
|
102
|
-
assertSamplingCount(circularSegments, "strokePathRegion", limits.maxCircularSegments);
|
|
92
|
+
assertSamplingCount(path.length, "strokeRegionData", limits.maxPathPoints);
|
|
93
|
+
assertSamplingCount(circularSegments, "strokeRegionData", limits.maxCircularSegments);
|
|
103
94
|
const normalizedPath = deduplicatePath(path, closed, options.width);
|
|
104
95
|
if (normalizedPath.length < (closed ? 3 : 2))
|
|
105
96
|
return [];
|
|
@@ -109,7 +100,7 @@ export function strokePathContours(path, options, exactCircularSegments) {
|
|
|
109
100
|
const constructionVertices = segmentCount * 4 +
|
|
110
101
|
joinCount * (join === "round" ? circularSegments : join === "miter" ? 4 : 3) +
|
|
111
102
|
(!closed && cap === "round" ? 2 * circularSegments : 0);
|
|
112
|
-
assertSamplingCount(constructionVertices, "
|
|
103
|
+
assertSamplingCount(constructionVertices, "strokeRegionData", limits.maxProfilePoints);
|
|
113
104
|
for (let index = 0; index < segmentCount; index += 1) {
|
|
114
105
|
let start = normalizedPath[index];
|
|
115
106
|
let end = normalizedPath[(index + 1) % normalizedPath.length];
|
|
@@ -158,17 +149,11 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
|
158
149
|
const contours = strokePathContours(path, options, circularSegments);
|
|
159
150
|
if (contours.length === 0)
|
|
160
151
|
return [];
|
|
161
|
-
const result = unionPolygonGeometry(contours.map((contour) => [
|
|
152
|
+
const result = unionPolygonGeometry(contours.map((contour) => [clippingRing(contour)]));
|
|
162
153
|
const outputVertices = result.reduce((count, polygon) => count + polygon.reduce((total, contour) => total + Math.max(0, contour.length - 1), 0), 0);
|
|
163
|
-
assertSamplingCount(outputVertices, "
|
|
154
|
+
assertSamplingCount(outputVertices, "strokeRegionData", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
|
|
164
155
|
return result;
|
|
165
156
|
}
|
|
166
|
-
function regionFromMultiPolygon(value) {
|
|
167
|
-
return normalizeRegion(value.map((polygon) => ({
|
|
168
|
-
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
169
|
-
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
170
|
-
})));
|
|
171
|
-
}
|
|
172
157
|
/**
|
|
173
158
|
* Converts a sampled millimetre path into the filled region covered by a centered stroke.
|
|
174
159
|
*
|
|
@@ -177,7 +162,7 @@ function regionFromMultiPolygon(value) {
|
|
|
177
162
|
* resolution. Bevels fill the outer corner triangle; miters extend the outer edges to their
|
|
178
163
|
* intersection, falling back to bevels above SVG's default miter limit of 4.
|
|
179
164
|
*/
|
|
180
|
-
export function
|
|
165
|
+
export function strokeRegionData(path, options) {
|
|
181
166
|
const result = strokePathMultiPolygon(path, options);
|
|
182
167
|
if (result.length === 0)
|
|
183
168
|
return fail("The sampled stroke path has no visible length.");
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
import { polygonClipping, unionPolygonGeometry, xorPolygonGeometry } from "../polygon-clipping.js";
|
|
2
|
-
import {
|
|
1
|
+
import { clippingRing, polygonClipping, regionFromMultiPolygon, unionPolygonGeometry, xorPolygonGeometry, } from "../polygon-clipping.js";
|
|
2
|
+
import { 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
|
-
export function createBoundedSvgClipping(
|
|
6
|
-
function ring(points) {
|
|
7
|
-
const result = points.map(([x, y]) => [x, y]);
|
|
8
|
-
const first = result[0];
|
|
9
|
-
const last = result.at(-1);
|
|
10
|
-
if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1]))
|
|
11
|
-
result.push([...first]);
|
|
12
|
-
return result;
|
|
13
|
-
}
|
|
5
|
+
export function createBoundedSvgClipping(maxVertices) {
|
|
14
6
|
function ringVertexCount(value) {
|
|
15
7
|
const first = value[0];
|
|
16
8
|
const last = value.at(-1);
|
|
@@ -21,7 +13,7 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
21
13
|
return value.reduce((total, polygon) => total + polygon.reduce((polygonTotal, path) => polygonTotal + ringVertexCount(path), 0), 0);
|
|
22
14
|
}
|
|
23
15
|
function assertExpandedVertexCount(vertices, stage) {
|
|
24
|
-
assertSamplingCount(vertices, "preflightSvgRegion",
|
|
16
|
+
assertSamplingCount(vertices, "preflightSvgRegion", maxVertices, `SVG ${stage} exceeds ${maxVertices} expanded vertices (requires ${vertices}).`);
|
|
25
17
|
}
|
|
26
18
|
function boundedMultiPolygon(value, stage) {
|
|
27
19
|
assertExpandedVertexCount(multiPolygonVertexCount(value), stage);
|
|
@@ -136,16 +128,16 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
136
128
|
.map((subpath) => subpath.points);
|
|
137
129
|
if (rings.length === 0)
|
|
138
130
|
return [];
|
|
139
|
-
const polygons = rings.map((points) => [
|
|
131
|
+
const polygons = rings.map((points) => [clippingRing(points)]);
|
|
140
132
|
if (fillRule === "evenodd") {
|
|
141
133
|
return boundedXor(polygons.map((polygon) => [polygon]), "even-odd fill output");
|
|
142
134
|
}
|
|
143
135
|
const positive = rings
|
|
144
136
|
.filter((points) => signedContourArea(points) >= 0)
|
|
145
|
-
.map((points) => [
|
|
137
|
+
.map((points) => [clippingRing(points)]);
|
|
146
138
|
const negative = rings
|
|
147
139
|
.filter((points) => signedContourArea(points) < 0)
|
|
148
|
-
.map((points) => [
|
|
140
|
+
.map((points) => [clippingRing(points)]);
|
|
149
141
|
if (positive.length === 0)
|
|
150
142
|
return boundedUnion([negative], "negative fill output");
|
|
151
143
|
if (negative.length === 0)
|
|
@@ -155,12 +147,6 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
155
147
|
// precisely where positive and negative nonzero winding counts match.
|
|
156
148
|
return differingCoverage(positive, negative);
|
|
157
149
|
}
|
|
158
|
-
function regionFromMultiPolygon(value) {
|
|
159
|
-
return normalizeRegion(value.map((polygon) => ({
|
|
160
|
-
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
161
|
-
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
162
|
-
})));
|
|
163
|
-
}
|
|
164
150
|
return {
|
|
165
151
|
assertExpandedVertexCount,
|
|
166
152
|
boundedMultiPolygon,
|