@metamesh/modeling 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +67 -9
- package/dist/api/engine.d.ts +14 -7
- package/dist/api/geometry.d.ts +787 -447
- package/dist/api/index.d.ts +637 -250
- package/dist/api/text.d.ts +6 -4
- package/dist/docs/guides/concepts.md +135 -17
- package/dist/docs/guides/fonts.md +8 -0
- package/dist/docs/guides/fundamentals.md +8 -3
- package/dist/docs/guides/generation.md +6 -4
- package/dist/docs/guides/hosting.md +27 -14
- package/dist/docs/guides/recipes.md +82 -11
- package/dist/docs/manifest.json +1911 -856
- package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
- package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
- package/dist/docs/reference/engine/GenerationOptions.md +1 -1
- package/dist/docs/reference/engine/GeometryResource.md +1 -1
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +1 -1
- package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +20 -9
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +4 -4
- package/dist/docs/reference/engine/categories/host-lifecycle.md +2 -2
- package/dist/docs/reference/engine/createModelEngine.md +3 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine/validateModel.md +1 -1
- package/dist/docs/reference/engine.md +2 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +17 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +9 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +7 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +9 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +14 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +6 -1
- package/dist/docs/reference/geometry/Bounds2.md +4 -4
- package/dist/docs/reference/geometry/Bounds3.md +4 -4
- package/dist/docs/reference/geometry/BoundsFit2.md +3 -3
- package/dist/docs/reference/geometry/BoundsFit3.md +3 -3
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +8 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +10 -10
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +107 -0
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +3 -3
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +6 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +6 -6
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -6
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
- package/dist/docs/reference/geometry/Frame3.md +6 -6
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +14 -5
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +6 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +7 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
- package/dist/docs/reference/geometry/LineCurve2.md +4 -4
- package/dist/docs/reference/geometry/LineCurve3.md +4 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +4 -4
- package/dist/docs/reference/geometry/LoftOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
- package/dist/docs/reference/geometry/Path2-type.md +192 -0
- package/dist/docs/reference/geometry/Path2Data.md +14 -0
- package/dist/docs/reference/geometry/Path2Input.md +15 -0
- package/dist/docs/reference/geometry/Path3-type.md +192 -0
- package/dist/docs/reference/geometry/Path3Data.md +14 -0
- package/dist/docs/reference/geometry/Path3Input.md +15 -0
- package/dist/docs/reference/geometry/PathFrame.md +5 -5
- package/dist/docs/reference/geometry/PathLocation.md +65 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +6 -5
- package/dist/docs/reference/geometry/PathOptions.md +34 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +4 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
- package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +3 -3
- package/dist/docs/reference/geometry/{Polygon.md → PolygonData.md} +2 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +4 -4
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/Profile.md +1 -1
- package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
- package/dist/docs/reference/geometry/ProfileSpan2.md +3 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +5 -5
- package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +14 -0
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +9 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +4 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +4 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +3 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/StrokeCap.md +7 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +7 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +8 -8
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +3 -3
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +13 -13
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +11 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +9 -9
- package/dist/docs/reference/geometry/SweepOptions.md +6 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +3 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadRole.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +6 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +6 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +255 -0
- package/dist/docs/reference/geometry/Transform2Input.md +19 -0
- package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
- package/dist/docs/reference/geometry/Transform3-type.md +295 -0
- package/dist/docs/reference/geometry/Transform3Input.md +19 -0
- package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +269 -0
- package/dist/docs/reference/geometry/Vector2Input.md +19 -0
- package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
- package/dist/docs/reference/geometry/Vector3-type.md +281 -0
- package/dist/docs/reference/geometry/Vector3Input.md +19 -0
- package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
- package/dist/docs/reference/geometry/add2.md +36 -0
- package/dist/docs/reference/geometry/add3.md +10 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +2 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +13 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +11 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +11 -7
- package/dist/docs/reference/geometry/attachmentTransform3.md +77 -0
- package/dist/docs/reference/geometry/boundsCenter.md +7 -7
- package/dist/docs/reference/geometry/boundsFromSize.md +7 -7
- package/dist/docs/reference/geometry/boundsSize.md +7 -7
- package/dist/docs/reference/geometry/boxAnchor3.md +10 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +15 -10
- package/dist/docs/reference/geometry/categories/mechanical.md +6 -6
- package/dist/docs/reference/geometry/categories/meshes.md +3 -4
- package/dist/docs/reference/geometry/categories/pattern-placement.md +7 -7
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +5 -6
- package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -2
- package/dist/docs/reference/geometry/categories/transforms-math.md +41 -12
- package/dist/docs/reference/geometry/categories/vector-import.md +5 -5
- package/dist/docs/reference/geometry/circleContour.md +1 -1
- package/dist/docs/reference/geometry/closeToAxis.md +4 -4
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -5
- package/dist/docs/reference/geometry/composeTransform3.md +10 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +10 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +4 -4
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +4 -4
- package/dist/docs/reference/geometry/containsBounds.md +1 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +4 -4
- package/dist/docs/reference/geometry/cross2.md +36 -0
- package/dist/docs/reference/geometry/cross3.md +10 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -6
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +36 -0
- package/dist/docs/reference/geometry/distance3.md +36 -0
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
- package/dist/docs/reference/geometry/dot2.md +36 -0
- package/dist/docs/reference/geometry/dot3.md +9 -5
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +10 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +8 -8
- package/dist/docs/reference/geometry/fitBounds.md +1 -1
- package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
- package/dist/docs/reference/geometry/frameTransform3.md +8 -4
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +3 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +5 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +5 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +9 -5
- package/dist/docs/reference/geometry/isGeometryError.md +1 -1
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
- package/dist/docs/reference/geometry/layoutRow.md +4 -4
- package/dist/docs/reference/geometry/length2.md +30 -0
- package/dist/docs/reference/geometry/length3.md +8 -4
- package/dist/docs/reference/geometry/lerp2.md +42 -0
- package/dist/docs/reference/geometry/lerp3.md +10 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/loftMesh.md +2 -1
- package/dist/docs/reference/geometry/matchProfiles.md +1 -1
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +3 -2
- package/dist/docs/reference/geometry/meshBounds.md +1 -1
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +3 -3
- package/dist/docs/reference/geometry/normalize2.md +36 -0
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +4 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -5
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -5
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +11 -11
- package/dist/docs/reference/geometry/path2.md +42 -0
- package/dist/docs/reference/geometry/path3.md +42 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -8
- package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +3 -3
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
- package/dist/docs/reference/geometry/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/geometry/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/geometry/projectOntoPlane3.md +10 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- package/dist/docs/reference/geometry/rectangleContour.md +2 -2
- package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
- package/dist/docs/reference/geometry/regionArea.md +4 -4
- package/dist/docs/reference/geometry/regionBounds.md +4 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +5 -5
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +8 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +6 -6
- package/dist/docs/reference/geometry/resolveCircularSegments.md +6 -5
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +6 -6
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/revolveMesh.md +10 -10
- package/dist/docs/reference/geometry/rotate2.md +36 -0
- package/dist/docs/reference/geometry/rotationTransform3.md +10 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -6
- package/dist/docs/reference/geometry/sampleContour.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve2.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +2 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleHelix.md +5 -5
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +4 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +6 -6
- package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +2 -2
- package/dist/docs/reference/geometry/scale2.md +36 -0
- package/dist/docs/reference/geometry/scale3.md +9 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +10 -6
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +4 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
- package/dist/docs/reference/geometry/subtract2.md +36 -0
- package/dist/docs/reference/geometry/subtract3.md +10 -6
- package/dist/docs/reference/geometry/sweepMesh.md +9 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +6 -6
- package/dist/docs/reference/geometry/transform2.md +38 -0
- package/dist/docs/reference/geometry/transform3.md +38 -0
- package/dist/docs/reference/geometry/transformDeterminant3.md +8 -4
- package/dist/docs/reference/geometry/transformRegionData.md +40 -0
- package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
- package/dist/docs/reference/geometry/translationTransform3.md +10 -6
- package/dist/docs/reference/geometry/triangulateContour.md +1 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +2 -2
- package/dist/docs/reference/geometry/validateTransform3.md +9 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +31 -0
- package/dist/docs/reference/geometry/vector3.md +38 -0
- package/dist/docs/reference/geometry.md +3 -3
- package/dist/docs/reference/model/Anchor3.md +5 -5
- package/dist/docs/reference/model/AttachOptions.md +10 -5
- package/dist/docs/reference/model/Bounds2.md +4 -4
- package/dist/docs/reference/model/Bounds3.md +4 -4
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +10 -10
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +1 -1
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +3 -3
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CylinderOptions.md +3 -3
- package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +3 -3
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/model/FinalizedModel.md +18 -8
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +6 -6
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -5
- package/dist/docs/reference/model/GeneratedPart.md +6 -6
- package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
- package/dist/docs/reference/model/GenerationError.md +1 -1
- package/dist/docs/reference/model/GeometryResolution.md +5 -5
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +11 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +3 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/model/HullOptions.md +7 -7
- package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
- package/dist/docs/reference/model/ImplicitOptions.md +4 -4
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +4 -4
- package/dist/docs/reference/model/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +1 -1
- package/dist/docs/reference/model/LoftPlacement.md +1 -1
- package/dist/docs/reference/model/LoftStation.md +4 -4
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +1 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +1 -1
- package/dist/docs/reference/model/PartGeometry.md +1 -1
- package/dist/docs/reference/model/PartOptions.md +6 -6
- package/dist/docs/reference/model/Path2-type.md +192 -0
- package/dist/docs/reference/model/Path2Data.md +14 -0
- package/dist/docs/reference/model/Path2Input.md +15 -0
- package/dist/docs/reference/model/Path3-type.md +192 -0
- package/dist/docs/reference/model/Path3Data.md +14 -0
- package/dist/docs/reference/model/Path3Input.md +15 -0
- package/dist/docs/reference/model/PathLocation.md +65 -0
- package/dist/docs/reference/model/PathNormalGuide.md +6 -5
- package/dist/docs/reference/model/PathOptions.md +34 -0
- package/dist/docs/reference/model/PathPatternOptions.md +3 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +79 -0
- package/dist/docs/reference/model/PatternSource.md +2 -2
- package/dist/docs/reference/model/Pivot2Options.md +27 -0
- package/dist/docs/reference/model/Pivot3Options.md +27 -0
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/{Polygon-type.md → PolygonData.md} +2 -2
- package/dist/docs/reference/model/PolygonOptions.md +85 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +7 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +41 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/model/Profile.md +1 -1
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +1 -1
- package/dist/docs/reference/model/ProfileSpan2.md +3 -3
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/model/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +10 -10
- package/dist/docs/reference/model/{Region.md → RegionData.md} +4 -4
- package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
- package/dist/docs/reference/model/RevolveOptions.md +9 -4
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +81 -40
- package/dist/docs/reference/model/SectionHullOptions.md +7 -7
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- package/dist/docs/reference/model/{RegionOffsetJoin.md → SectionOffsetJoin.md} +3 -3
- package/dist/docs/reference/model/{RegionOffsetOptions.md → SectionOffsetOptions.md} +4 -4
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +66 -26
- package/dist/docs/reference/model/SolidInspection.md +7 -7
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/StrokeCap.md +16 -0
- package/dist/docs/reference/model/StrokeJoin.md +16 -0
- package/dist/docs/reference/model/StrokeOptions.md +91 -0
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
- package/dist/docs/reference/model/SweepOptions.md +6 -6
- package/dist/docs/reference/model/SweepOrientation.md +7 -7
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/model/ThreadHandedness.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/model/ThreadProfile.md +3 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +4 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +4 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +256 -0
- package/dist/docs/reference/model/Transform2Input.md +20 -0
- package/dist/docs/reference/model/Transform2Matrix.md +15 -0
- package/dist/docs/reference/model/Transform3-type.md +296 -0
- package/dist/docs/reference/model/Transform3Input.md +20 -0
- package/dist/docs/reference/model/{Transform3.md → Transform3Matrix.md} +3 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +270 -0
- package/dist/docs/reference/model/Vector2Input.md +20 -0
- package/dist/docs/reference/model/{Vector2.md → Vector2Tuple.md} +3 -3
- package/dist/docs/reference/model/Vector3-type.md +282 -0
- package/dist/docs/reference/model/Vector3Input.md +20 -0
- package/dist/docs/reference/model/{Vector3.md → Vector3Tuple.md} +3 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/anchor.md +1 -1
- package/dist/docs/reference/model/box.md +4 -4
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +4 -4
- package/dist/docs/reference/model/categories/bounded-surfaces.md +3 -3
- package/dist/docs/reference/model/categories/contracts.md +2 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +5 -5
- package/dist/docs/reference/model/categories/explicit-profiles.md +3 -3
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +2 -2
- package/dist/docs/reference/model/categories/generation.md +1 -1
- package/dist/docs/reference/model/categories/inspection.md +7 -8
- package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
- package/dist/docs/reference/model/categories/paths.md +33 -0
- package/dist/docs/reference/model/categories/primitives.md +3 -3
- package/dist/docs/reference/model/categories/resolution.md +2 -2
- package/dist/docs/reference/model/categories/sections.md +10 -8
- package/dist/docs/reference/model/categories/threads.md +5 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +27 -13
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +10 -7
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +2 -2
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +3 -3
- package/dist/docs/reference/model/generate.md +1 -1
- package/dist/docs/reference/model/gridPattern.md +4 -4
- package/dist/docs/reference/model/heightfield.md +2 -2
- package/dist/docs/reference/model/hull.md +2 -2
- package/dist/docs/reference/model/immutableBuffer.md +1 -1
- package/dist/docs/reference/model/immutableMesh.md +1 -1
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +4 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +2 -2
- package/dist/docs/reference/model/linearPattern.md +4 -4
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +2 -2
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +42 -0
- package/dist/docs/reference/model/path3.md +42 -0
- package/dist/docs/reference/model/pathPattern.md +13 -12
- package/dist/docs/reference/model/polygon.md +4 -4
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/model/radialPattern.md +5 -37
- package/dist/docs/reference/model/rectangle.md +4 -4
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +74 -0
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +1 -1
- package/dist/docs/reference/model/sweep.md +7 -7
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +2 -2
- package/dist/docs/reference/model/threadedNut.md +4 -4
- package/dist/docs/reference/model/threadedRod.md +4 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +39 -0
- package/dist/docs/reference/model/transform3.md +39 -0
- package/dist/docs/reference/model/tube.md +3 -3
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +32 -0
- package/dist/docs/reference/model/vector3.md +39 -0
- package/dist/docs/reference/model.md +9 -8
- package/dist/docs/reference/text/Bounds2.md +4 -4
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +2 -2
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +4 -4
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +1 -1
- package/dist/engine/construction-operations.js +31 -14
- package/dist/engine/deferred-context.js +11 -181
- package/dist/engine/execution.js +39 -8
- package/dist/engine/extrusion-finishing.js +1 -1
- package/dist/engine/index.js +6 -1
- package/dist/engine/inspection-operations.js +13 -11
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/native/material-components.js +305 -0
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/native/threads.js +3 -3
- package/dist/engine/native/transforms.js +11 -8
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +3 -3
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-anchors.js +17 -17
- package/dist/engine/primitive-operations.js +1 -1
- package/dist/engine/primitive-profiles.js +8 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +35 -21
- package/dist/engine/section-operations.js +52 -11
- package/dist/engine/session-graph.js +1 -1
- package/dist/engine/session-native.js +1 -1
- package/dist/engine/session-snapshot.js +17 -6
- package/dist/engine/session.js +13 -8
- package/dist/engine/shape-anchors.js +5 -11
- package/dist/engine/transform-operations.js +66 -49
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/curves/sampling.js +14 -14
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/index.js +13 -10
- package/dist/geometry/loft/loft-simple-mesh.js +6 -6
- package/dist/geometry/loft/loft.js +22 -13
- package/dist/geometry/math/immutable-value.js +20 -0
- package/dist/geometry/math/vector-value.js +168 -0
- package/dist/geometry/math/vector2.js +80 -0
- package/dist/geometry/math/vector3.js +37 -7
- package/dist/geometry/mechanical/gear-motion.js +8 -5
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +3 -3
- package/dist/geometry/mechanical/standards.js +1 -1
- package/dist/geometry/mechanical/thread-helices.js +2 -3
- package/dist/geometry/mechanical/thread-mesh-plan.js +4 -5
- package/dist/geometry/mechanical/thread-mesh.js +7 -7
- package/dist/geometry/mechanical/thread-profiles.js +5 -5
- package/dist/geometry/mechanical/thread-solids.js +2 -2
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-planar.js +25 -27
- package/dist/geometry/mesh/mesh-quality.js +5 -5
- package/dist/geometry/mesh/mesh-signature.js +13 -13
- package/dist/geometry/mesh/mesh-solid-intersections.js +5 -1
- package/dist/geometry/mesh/mesh-solid.js +7 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +63 -0
- package/dist/geometry/paths/frames.js +44 -14
- package/dist/geometry/paths/helix.js +16 -6
- package/dist/geometry/paths/path-value.js +252 -0
- package/dist/geometry/paths/planar.js +36 -23
- package/dist/geometry/paths/resampling.js +27 -5
- package/dist/geometry/patterns/placements.js +100 -27
- package/dist/geometry/patterns.js +2 -2
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/primitive-resolution.js +4 -1
- package/dist/geometry/profiles/contour.js +6 -6
- package/dist/geometry/profiles/matched.js +4 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +4 -4
- package/dist/geometry/profiles/side-profile.js +7 -7
- package/dist/geometry/profiles/span-sampling.js +1 -1
- package/dist/geometry/resolution.js +51 -39
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +57 -68
- package/dist/geometry/svg/fill.js +7 -21
- package/dist/geometry/svg-import.js +23 -23
- package/dist/geometry/sweeps/options.js +5 -4
- package/dist/geometry/sweeps/orientation.js +5 -5
- package/dist/geometry/sweeps/stations.js +14 -14
- package/dist/geometry/sweeps/sweep-closed.js +5 -5
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +4 -4
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/transform-chain.js +172 -0
- package/dist/geometry/transform-geometry.js +27 -30
- package/dist/geometry/transform-matrix.js +14 -0
- package/dist/geometry/transform2.js +60 -0
- package/dist/geometry/transform3.js +70 -26
- package/dist/index.js +4 -0
- package/dist/model/execution-binding.js +10 -5
- package/dist/model/geometry-recipes.js +15 -0
- package/dist/{engine → model}/immutable-generation-data.js +88 -6
- package/dist/model/operation-dispatch.js +10 -3
- package/dist/model/operations.js +45 -35
- package/dist/model/recipe-declaration.js +199 -0
- package/dist/model/shape-handles.js +17 -5
- package/dist/text/index.js +15 -9
- package/dist/text/vector-text-layout.js +31 -26
- package/package.json +1 -1
- package/dist/docs/reference/geometry/Path2.md +0 -14
- package/dist/docs/reference/geometry/Path3.md +0 -14
- package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
- package/dist/docs/reference/geometry/Region.md +0 -14
- package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/Transform3.md +0 -12
- package/dist/docs/reference/geometry/Vector2.md +0 -7
- package/dist/docs/reference/geometry/Vector3.md +0 -7
- package/dist/docs/reference/geometry/attachTransform.md +0 -73
- package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
- package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
- package/dist/docs/reference/geometry/pathLength.md +0 -33
- package/dist/docs/reference/geometry/rotateAroundAxis3.md +0 -38
- package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
- package/dist/docs/reference/geometry/transformContour.md +0 -42
- package/dist/docs/reference/geometry/transformPath2.md +0 -40
- package/dist/docs/reference/geometry/transformPath3.md +0 -33
- package/dist/docs/reference/geometry/transformRegion.md +0 -40
- package/dist/docs/reference/model/Transform2.md +0 -15
- package/dist/docs/reference/model/fromRegion.md +0 -33
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toRegion.md +0 -33
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Vector2.md +0 -7
- package/dist/engine/geometry-recipes.js +0 -12
- package/dist/engine/pattern-transform.js +0 -9
- package/dist/geometry/paths/path.js +0 -32
|
@@ -16,7 +16,7 @@ function invalid(message) {
|
|
|
16
16
|
* coordinate range are required. No native engine, SDK, or ambient resolution is used.
|
|
17
17
|
*
|
|
18
18
|
* @param curve - Closed contour in millimetres unless positive scales convert its coordinates.
|
|
19
|
-
* @param options - Physical resolution and unique vertex budget; defaults to 4096
|
|
19
|
+
* @param options - Physical resolution and unique vertex budget; defaults to min(4096, maxProfilePoints).
|
|
20
20
|
* @returns Frozen counterclockwise loop in millimetres, without a repeated seam endpoint.
|
|
21
21
|
* @throws {@link GeometryError} for invalid data, topology, scale, or exceeded sampling budgets.
|
|
22
22
|
*
|
|
@@ -38,8 +38,8 @@ export function sampleContour(curve, options = {}) {
|
|
|
38
38
|
if (![widthScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0))
|
|
39
39
|
invalid("Cross-section scales must be finite and positive.");
|
|
40
40
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
41
|
-
const
|
|
42
|
-
requireProfileVertexCount(
|
|
41
|
+
const maxVertices = options.maxVertices ?? Math.min(4096, limits.maxProfilePoints);
|
|
42
|
+
requireProfileVertexCount(maxVertices, 3, OPERATION, limits);
|
|
43
43
|
const segmentInput = curve?.segments;
|
|
44
44
|
if (!curve ||
|
|
45
45
|
!Array.isArray(segmentInput) ||
|
|
@@ -66,11 +66,11 @@ export function sampleContour(curve, options = {}) {
|
|
|
66
66
|
invalid("Cross-section segments must be lines or cubics.");
|
|
67
67
|
const end = physical(segment.end);
|
|
68
68
|
const closed = index === curve.segments.length - 1;
|
|
69
|
-
const remainingVertices = Math.min(limits.maxPathPoints,
|
|
69
|
+
const remainingVertices = Math.min(limits.maxPathPoints, maxVertices - output.length + 1 + (closed ? 1 : 0));
|
|
70
70
|
if (remainingVertices < 2)
|
|
71
71
|
throw new GeometryError("COMPLEXITY_LIMIT", "Cross-section sampling exceeds its vertex budget.", {
|
|
72
72
|
operation: OPERATION,
|
|
73
|
-
details: {
|
|
73
|
+
details: { maxVertices },
|
|
74
74
|
});
|
|
75
75
|
let span;
|
|
76
76
|
if (segment.type === "line") {
|
|
@@ -90,7 +90,7 @@ export function sampleContour(curve, options = {}) {
|
|
|
90
90
|
}
|
|
91
91
|
const sampled = sampleCurve2(span, {
|
|
92
92
|
...(options.resolution === undefined ? {} : { resolution: options.resolution }),
|
|
93
|
-
|
|
93
|
+
maxVertices: remainingVertices,
|
|
94
94
|
limits,
|
|
95
95
|
}).points;
|
|
96
96
|
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
|
|
@@ -132,7 +132,7 @@ export function matchProfiles(profiles, options = {}) {
|
|
|
132
132
|
if (span.kind === "arc")
|
|
133
133
|
return span.radius === 0
|
|
134
134
|
? 1
|
|
135
|
-
: resolveArcSegments(span.radius, Math.abs(span.
|
|
135
|
+
: resolveArcSegments(span.radius, Math.abs(span.sweepAngle), selectedResolution, limits);
|
|
136
136
|
if (span.kind === "cubic")
|
|
137
137
|
return resolveUniformCubicSegments(planarCubicControl(span), selectedResolution, cubicBudget);
|
|
138
138
|
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,7 +72,7 @@ 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,
|
|
@@ -194,7 +194,7 @@ export function rectangleProfile(options) {
|
|
|
194
194
|
center: map(index, a, b),
|
|
195
195
|
}));
|
|
196
196
|
corners.forEach((corner, index) => {
|
|
197
|
-
const shape = endpoints[index],
|
|
197
|
+
const shape = endpoints[index], startAngle = vertices[index][2];
|
|
198
198
|
if (corner.kind === "chamfer")
|
|
199
199
|
spans.push({ id: names[index], kind: "line", start: shape.start, end: shape.end });
|
|
200
200
|
else if (corner.kind === "smooth") {
|
|
@@ -230,8 +230,8 @@ export function rectangleProfile(options) {
|
|
|
230
230
|
kind: "arc",
|
|
231
231
|
center: shape.center,
|
|
232
232
|
radius: setbacks[index][0],
|
|
233
|
-
|
|
234
|
-
|
|
233
|
+
startAngle,
|
|
234
|
+
sweepAngle: 90,
|
|
235
235
|
...(exact ? { segments: rectangleCornerSegments(corner, limits) } : {}),
|
|
236
236
|
...(corner.kind === "round" && corner.resolution !== undefined
|
|
237
237
|
? { resolution: { ...corner.resolution } }
|
|
@@ -30,7 +30,7 @@ function distanceToChord(point, start, end) {
|
|
|
30
30
|
* no axis closure, winding normalization, or manufacturing repair is performed.
|
|
31
31
|
*
|
|
32
32
|
* @param curve - Open outline in millimetres unless the positive scales convert its coordinates.
|
|
33
|
-
* @param options - Physical resolution and output budget; defaults to 4096
|
|
33
|
+
* @param options - Physical resolution and output budget; defaults to min(4096, maxProfilePoints).
|
|
34
34
|
* @returns Frozen open polyline in millimetres, ordered from lowest to highest anchor.
|
|
35
35
|
* @throws {@link GeometryError} for invalid coordinates, order, scale, or exceeded subdivision budget.
|
|
36
36
|
*
|
|
@@ -48,9 +48,9 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
48
48
|
if (![radiusScale, heightScale].every((scale) => Number.isFinite(scale) && scale > 0)) {
|
|
49
49
|
invalid("Profile scales must be finite and positive.");
|
|
50
50
|
}
|
|
51
|
-
const
|
|
51
|
+
const maxVertices = options.maxVertices ??
|
|
52
52
|
Math.min(4096, resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
|
|
53
|
-
requireProfileVertexCount(
|
|
53
|
+
requireProfileVertexCount(maxVertices, 2, OPERATION, options.limits);
|
|
54
54
|
const maximumProfilePoints = resolveGeometrySamplingLimits(options.limits).maxProfilePoints;
|
|
55
55
|
const segmentInput = curve.segments;
|
|
56
56
|
if (!Array.isArray(segmentInput) ||
|
|
@@ -72,10 +72,10 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
72
72
|
};
|
|
73
73
|
const output = [];
|
|
74
74
|
const append = (point) => {
|
|
75
|
-
if (output.length >=
|
|
75
|
+
if (output.length >= maxVertices || output.length >= maximumProfilePoints) {
|
|
76
76
|
throw new GeometryError("COMPLEXITY_LIMIT", "Profile sampling exceeds its vertex budget.", {
|
|
77
77
|
operation: OPERATION,
|
|
78
|
-
details: {
|
|
78
|
+
details: { maxVertices },
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
81
|
output.push(Object.freeze(point));
|
|
@@ -109,10 +109,10 @@ export function sampleSideProfile(curve, options = {}) {
|
|
|
109
109
|
const count = resolution.maxSegmentLength === undefined
|
|
110
110
|
? 1
|
|
111
111
|
: Math.max(1, Math.ceil(length / resolution.maxSegmentLength));
|
|
112
|
-
if (count >
|
|
112
|
+
if (count > maxVertices - output.length) {
|
|
113
113
|
throw new GeometryError("COMPLEXITY_LIMIT", "Profile line exceeds its vertex budget.", {
|
|
114
114
|
operation: OPERATION,
|
|
115
|
-
details: {
|
|
115
|
+
details: { maxVertices },
|
|
116
116
|
});
|
|
117
117
|
}
|
|
118
118
|
for (let index = 1; index <= count; index++) {
|
|
@@ -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,27 +41,32 @@ 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
|
-
const requiredFullCircleSegments = (radius, resolution) => {
|
|
59
|
-
const chordAngle = 2 *
|
|
58
|
+
const requiredFullCircleSegments = (radius, resolution, sizing) => {
|
|
59
|
+
const chordAngle = 2 *
|
|
60
|
+
Math.acos(sizing === "face"
|
|
61
|
+
? 1 / (1 + resolution.maxChordError / radius)
|
|
62
|
+
: Math.max(-1, Math.min(1, 1 - resolution.maxChordError / radius)));
|
|
60
63
|
const chordSegments = chordAngle === 0 ? Number.POSITIVE_INFINITY : Math.ceil((Math.PI * 2) / chordAngle);
|
|
61
64
|
const lengthSegments = resolution.maxSegmentLength === undefined
|
|
62
65
|
? 0
|
|
63
|
-
:
|
|
64
|
-
|
|
66
|
+
: sizing === "face"
|
|
67
|
+
? Math.ceil(Math.PI / Math.atan(resolution.maxSegmentLength / radius / 2))
|
|
68
|
+
: Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
|
|
69
|
+
return Math.max(resolution.minSegments, chordSegments, lengthSegments);
|
|
65
70
|
};
|
|
66
71
|
const assertRadius = (radius, operation) => {
|
|
67
72
|
if (!Number.isFinite(radius) || radius <= 0) {
|
|
@@ -75,7 +80,8 @@ const assertRadius = (radius, operation) => {
|
|
|
75
80
|
* Resolves a deterministic full-circle segment count for one radius.
|
|
76
81
|
*
|
|
77
82
|
* An exact `circularSegments` value wins. Otherwise the smallest regular polygon satisfying both
|
|
78
|
-
* physical error criteria is used.
|
|
83
|
+
* physical error criteria is used. Face sizing bounds the circumscribed polygon's outward
|
|
84
|
+
* excess and actual edge length. A safety cap that would violate either criterion raises
|
|
79
85
|
* `COMPLEXITY_LIMIT` rather than silently reducing quality.
|
|
80
86
|
*
|
|
81
87
|
* @param radius - Circle radius in millimetres.
|
|
@@ -94,15 +100,18 @@ const assertRadius = (radius, operation) => {
|
|
|
94
100
|
export function resolveCircularSegments(radius, policy = {}, limits = {}) {
|
|
95
101
|
const operation = "resolveCircularSegments";
|
|
96
102
|
assertRadius(radius, operation);
|
|
103
|
+
const sizing = policy.sizing ?? "vertex";
|
|
104
|
+
if (sizing !== "vertex" && sizing !== "face")
|
|
105
|
+
invalid("sizing must be vertex or face.");
|
|
97
106
|
const resolution = resolveGeometryResolution(policy, limits);
|
|
98
107
|
if (resolution.circularSegments !== undefined)
|
|
99
108
|
return resolution.circularSegments;
|
|
100
|
-
const required = requiredFullCircleSegments(radius, resolution);
|
|
101
|
-
if (required > resolution.
|
|
102
|
-
throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.
|
|
109
|
+
const required = requiredFullCircleSegments(radius, resolution, sizing);
|
|
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.`, {
|
|
103
112
|
operation,
|
|
104
113
|
details: {
|
|
105
|
-
|
|
114
|
+
maxSegments: resolution.maxSegments,
|
|
106
115
|
radius,
|
|
107
116
|
requiredSegments: required,
|
|
108
117
|
},
|
|
@@ -133,7 +142,7 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
|
|
|
133
142
|
* `alignTo` must be non-empty and contain only positive safe integers. Its checked least common
|
|
134
143
|
* multiple defines the alignment grid. An exact `segments` value wins over
|
|
135
144
|
* `resolution.circularSegments` and adaptive sampling, but is never rounded: it must already be
|
|
136
|
-
* aligned and meet `
|
|
145
|
+
* aligned and meet `minSegments`. Adaptive counts are rounded upward and fail with
|
|
137
146
|
* `COMPLEXITY_LIMIT` when the aligned result exceeds the configured safety cap.
|
|
138
147
|
*
|
|
139
148
|
* @param radius - Positive circle radius in millimetres used for adaptive physical sampling.
|
|
@@ -151,6 +160,8 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
|
|
|
151
160
|
export function resolveAlignedCircularSegments(radius, options) {
|
|
152
161
|
const operation = "resolveAlignedCircularSegments";
|
|
153
162
|
assertRadius(radius, operation);
|
|
163
|
+
if (options.sizing !== undefined && options.sizing !== "vertex" && options.sizing !== "face")
|
|
164
|
+
invalid("sizing must be vertex or face.");
|
|
154
165
|
const alignTo = options.alignTo;
|
|
155
166
|
const hasArrayShape = Array.isArray(alignTo);
|
|
156
167
|
if (!hasArrayShape || alignTo.length === 0) {
|
|
@@ -165,9 +176,9 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
165
176
|
}
|
|
166
177
|
alignment = checkedLeastCommonMultiple(alignment, factor, operation);
|
|
167
178
|
}
|
|
168
|
-
const
|
|
169
|
-
if (!Number.isSafeInteger(
|
|
170
|
-
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 } });
|
|
171
182
|
}
|
|
172
183
|
const resolution = options.segments === undefined
|
|
173
184
|
? resolveGeometryResolution(options.resolution, options.limits)
|
|
@@ -176,29 +187,30 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
176
187
|
}, options.limits);
|
|
177
188
|
if (resolution.circularSegments !== undefined) {
|
|
178
189
|
const exactSegments = resolution.circularSegments;
|
|
179
|
-
if (exactSegments <
|
|
180
|
-
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.", {
|
|
181
192
|
operation,
|
|
182
|
-
details: { alignment, exactSegments,
|
|
193
|
+
details: { alignment, exactSegments, minSegments },
|
|
183
194
|
});
|
|
184
195
|
}
|
|
185
196
|
return exactSegments;
|
|
186
197
|
}
|
|
187
198
|
const baseSegments = resolveCircularSegments(radius, {
|
|
188
199
|
...resolution,
|
|
200
|
+
sizing: options.sizing ?? "vertex",
|
|
189
201
|
}, options.limits);
|
|
190
|
-
const requiredSegments = Math.max(baseSegments,
|
|
202
|
+
const requiredSegments = Math.max(baseSegments, minSegments);
|
|
191
203
|
const multiplier = Math.ceil(requiredSegments / alignment);
|
|
192
204
|
if (!Number.isSafeInteger(multiplier) || multiplier > Number.MAX_SAFE_INTEGER / alignment) {
|
|
193
205
|
throw new GeometryError("COMPLEXITY_LIMIT", "The aligned segment count exceeds safe integer complexity.", { operation, details: { alignment, requiredSegments } });
|
|
194
206
|
}
|
|
195
207
|
const alignedSegments = multiplier * alignment;
|
|
196
|
-
if (alignedSegments > resolution.
|
|
208
|
+
if (alignedSegments > resolution.maxSegments) {
|
|
197
209
|
throw new GeometryError("COMPLEXITY_LIMIT", "Aligned circular tessellation exceeds the configured segment safety limit.", {
|
|
198
210
|
operation,
|
|
199
211
|
details: {
|
|
200
212
|
alignment,
|
|
201
|
-
|
|
213
|
+
maxSegments: resolution.maxSegments,
|
|
202
214
|
requiredSegments,
|
|
203
215
|
segments: alignedSegments,
|
|
204
216
|
},
|
|
@@ -213,7 +225,7 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
213
225
|
* the reusable BOSL2-style convention while retaining at least one segment.
|
|
214
226
|
*
|
|
215
227
|
* @param radius - Arc radius in millimetres.
|
|
216
|
-
* @param
|
|
228
|
+
* @param angle - Non-zero signed sweep angle no greater than 360 degrees in magnitude.
|
|
217
229
|
* @param policy - Optional operation-level policy over the active model scope.
|
|
218
230
|
* @returns Segment count for the requested arc span.
|
|
219
231
|
* @throws {@link GeometryError} when radius, angle, or resolution policy is invalid, or the
|
|
@@ -225,12 +237,12 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
225
237
|
* const quarterTurnSegments = resolveArcSegments(10, 90);
|
|
226
238
|
* ```
|
|
227
239
|
*/
|
|
228
|
-
export function resolveArcSegments(radius,
|
|
240
|
+
export function resolveArcSegments(radius, angle, policy = {}, limits = {}) {
|
|
229
241
|
const operation = "resolveArcSegments";
|
|
230
242
|
assertRadius(radius, operation);
|
|
231
|
-
if (!Number.isFinite(
|
|
232
|
-
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 } });
|
|
233
245
|
}
|
|
234
|
-
const ratio = Math.abs(
|
|
246
|
+
const ratio = Math.abs(angle) / 360;
|
|
235
247
|
return Math.max(1, Math.ceil(resolveCircularSegments(radius, policy, limits) * ratio));
|
|
236
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) => {
|
|
@@ -23,10 +14,7 @@ function ellipsePoints(center, radius, segments) {
|
|
|
23
14
|
return [center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius];
|
|
24
15
|
});
|
|
25
16
|
}
|
|
26
|
-
function
|
|
27
|
-
return [ring(ellipsePoints(center, radius, segments))];
|
|
28
|
-
}
|
|
29
|
-
function cornerPolygon(previous, point, next, halfWidth, join) {
|
|
17
|
+
function cornerContour(previous, point, next, halfWidth, join) {
|
|
30
18
|
const incomingLength = Math.hypot(point[0] - previous[0], point[1] - previous[1]);
|
|
31
19
|
const outgoingLength = Math.hypot(next[0] - point[0], next[1] - point[1]);
|
|
32
20
|
const incoming = [
|
|
@@ -54,11 +42,13 @@ function cornerPolygon(previous, point, next, halfWidth, join) {
|
|
|
54
42
|
]);
|
|
55
43
|
}
|
|
56
44
|
points.push([point[0] + after[0], point[1] + after[1]]);
|
|
57
|
-
return
|
|
45
|
+
return turn > 0 ? points : points.reverse();
|
|
58
46
|
}
|
|
59
47
|
/** Removes consecutive points that cannot define a visible stroke segment at model scale. */
|
|
60
48
|
function deduplicatePath(path, closed, width) {
|
|
61
|
-
|
|
49
|
+
let scale = width;
|
|
50
|
+
for (const [x, y] of path)
|
|
51
|
+
scale = Math.max(scale, Math.abs(x), Math.abs(y));
|
|
62
52
|
const tolerance = resolveGeometryTolerance(scale).linear;
|
|
63
53
|
const points = [];
|
|
64
54
|
for (const point of path) {
|
|
@@ -76,25 +66,41 @@ function deduplicatePath(path, closed, width) {
|
|
|
76
66
|
}
|
|
77
67
|
return Object.freeze(points);
|
|
78
68
|
}
|
|
79
|
-
/** @internal
|
|
80
|
-
export function
|
|
81
|
-
const
|
|
69
|
+
/** @internal Bounded CCW stroke primitives shared by native sections and pure clipping. */
|
|
70
|
+
export function strokePathContours(input, options, exactCircularSegments) {
|
|
71
|
+
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
72
|
+
const { points: path, closed } = path2InputData(input, options.closed, limits);
|
|
82
73
|
const cap = options.cap ?? "butt";
|
|
83
74
|
const join = options.join ?? "miter";
|
|
75
|
+
if (typeof closed !== "boolean")
|
|
76
|
+
return fail("closed must be a boolean.");
|
|
77
|
+
if (!Number.isFinite(options.width) || options.width <= 0)
|
|
78
|
+
return fail("Stroke width must be finite and greater than zero.");
|
|
79
|
+
if (path.length < (closed ? 3 : 2))
|
|
80
|
+
return fail(`${closed ? "Closed" : "Open"} strokes need more sampled path points.`);
|
|
81
|
+
if (!path.every((point) => point.length === 2 && point.every(Number.isFinite)))
|
|
82
|
+
return fail("Stroke path coordinates must be finite XY points.");
|
|
83
|
+
if (!["butt", "round", "square"].includes(cap))
|
|
84
|
+
return fail("Stroke cap must be butt, round, or square.");
|
|
85
|
+
if (!["bevel", "miter", "round"].includes(join))
|
|
86
|
+
return fail("Stroke join must be bevel, miter, or round.");
|
|
87
|
+
const circularSegments = exactCircularSegments ??
|
|
88
|
+
(cap === "round" || join === "round"
|
|
89
|
+
? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
|
|
90
|
+
: 3);
|
|
84
91
|
const half = options.width / 2;
|
|
85
|
-
|
|
86
|
-
assertSamplingCount(
|
|
87
|
-
assertSamplingCount(circularSegments, "strokePathRegion", limits.maxCircularSegments);
|
|
92
|
+
assertSamplingCount(path.length, "strokeRegionData", limits.maxPathPoints);
|
|
93
|
+
assertSamplingCount(circularSegments, "strokeRegionData", limits.maxCircularSegments);
|
|
88
94
|
const normalizedPath = deduplicatePath(path, closed, options.width);
|
|
89
95
|
if (normalizedPath.length < (closed ? 3 : 2))
|
|
90
96
|
return [];
|
|
91
|
-
const
|
|
97
|
+
const contours = [];
|
|
92
98
|
const segmentCount = closed ? normalizedPath.length : normalizedPath.length - 1;
|
|
93
99
|
const joinCount = closed ? normalizedPath.length : Math.max(0, normalizedPath.length - 2);
|
|
94
100
|
const constructionVertices = segmentCount * 4 +
|
|
95
101
|
joinCount * (join === "round" ? circularSegments : join === "miter" ? 4 : 3) +
|
|
96
102
|
(!closed && cap === "round" ? 2 * circularSegments : 0);
|
|
97
|
-
assertSamplingCount(constructionVertices, "
|
|
103
|
+
assertSamplingCount(constructionVertices, "strokeRegionData", limits.maxProfilePoints);
|
|
98
104
|
for (let index = 0; index < segmentCount; index += 1) {
|
|
99
105
|
let start = normalizedPath[index];
|
|
100
106
|
let end = normalizedPath[(index + 1) % normalizedPath.length];
|
|
@@ -108,42 +114,46 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
|
108
114
|
}
|
|
109
115
|
}
|
|
110
116
|
const normal = [-tangent[1] * half, tangent[0] * half];
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
[start[0] - normal[0], start[1] - normal[1]],
|
|
117
|
-
]),
|
|
117
|
+
contours.push([
|
|
118
|
+
[start[0] - normal[0], start[1] - normal[1]],
|
|
119
|
+
[end[0] - normal[0], end[1] - normal[1]],
|
|
120
|
+
[end[0] + normal[0], end[1] + normal[1]],
|
|
121
|
+
[start[0] + normal[0], start[1] + normal[1]],
|
|
118
122
|
]);
|
|
119
123
|
}
|
|
124
|
+
const disk = join === "round" || (!closed && cap === "round")
|
|
125
|
+
? ellipsePoints([0, 0], half, circularSegments)
|
|
126
|
+
: [];
|
|
127
|
+
const circleAt = ([x, y]) => disk.map(([u, v]) => [x + u, y + v]);
|
|
120
128
|
if (join === "round") {
|
|
121
129
|
const joinPoints = closed ? normalizedPath : normalizedPath.slice(1, -1);
|
|
122
|
-
|
|
130
|
+
for (const point of joinPoints)
|
|
131
|
+
contours.push(circleAt(point));
|
|
123
132
|
}
|
|
124
133
|
else {
|
|
125
134
|
const first = closed ? 0 : 1;
|
|
126
135
|
const end = closed ? normalizedPath.length : normalizedPath.length - 1;
|
|
127
136
|
for (let index = first; index < end; index += 1) {
|
|
128
|
-
const corner =
|
|
137
|
+
const corner = cornerContour(normalizedPath[(index - 1 + normalizedPath.length) % normalizedPath.length], normalizedPath[index], normalizedPath[(index + 1) % normalizedPath.length], half, join);
|
|
129
138
|
if (corner !== undefined)
|
|
130
|
-
|
|
139
|
+
contours.push(corner);
|
|
131
140
|
}
|
|
132
141
|
}
|
|
133
142
|
if (!closed && cap === "round") {
|
|
134
|
-
|
|
143
|
+
contours.push(circleAt(normalizedPath[0]), circleAt(normalizedPath.at(-1)));
|
|
135
144
|
}
|
|
136
|
-
|
|
145
|
+
return contours;
|
|
146
|
+
}
|
|
147
|
+
/** @internal Polygon-clipping representation shared with the bounded SVG importer. */
|
|
148
|
+
export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
149
|
+
const contours = strokePathContours(path, options, circularSegments);
|
|
150
|
+
if (contours.length === 0)
|
|
151
|
+
return [];
|
|
152
|
+
const result = unionPolygonGeometry(contours.map((contour) => [clippingRing(contour)]));
|
|
137
153
|
const outputVertices = result.reduce((count, polygon) => count + polygon.reduce((total, contour) => total + Math.max(0, contour.length - 1), 0), 0);
|
|
138
|
-
assertSamplingCount(outputVertices, "
|
|
154
|
+
assertSamplingCount(outputVertices, "strokeRegionData", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
|
|
139
155
|
return result;
|
|
140
156
|
}
|
|
141
|
-
function regionFromMultiPolygon(value) {
|
|
142
|
-
return normalizeRegion(value.map((polygon) => ({
|
|
143
|
-
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
144
|
-
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
145
|
-
})));
|
|
146
|
-
}
|
|
147
157
|
/**
|
|
148
158
|
* Converts a sampled millimetre path into the filled region covered by a centered stroke.
|
|
149
159
|
*
|
|
@@ -152,29 +162,8 @@ function regionFromMultiPolygon(value) {
|
|
|
152
162
|
* resolution. Bevels fill the outer corner triangle; miters extend the outer edges to their
|
|
153
163
|
* intersection, falling back to bevels above SVG's default miter limit of 4.
|
|
154
164
|
*/
|
|
155
|
-
export function
|
|
156
|
-
const
|
|
157
|
-
if (!Number.isFinite(options.width) || options.width <= 0) {
|
|
158
|
-
return fail("Stroke width must be finite and greater than zero.");
|
|
159
|
-
}
|
|
160
|
-
if (path.length < (closed ? 3 : 2)) {
|
|
161
|
-
return fail(`${closed ? "Closed" : "Open"} strokes need more sampled path points.`);
|
|
162
|
-
}
|
|
163
|
-
if (!path.every((point) => Number.isFinite(point[0]) && Number.isFinite(point[1]))) {
|
|
164
|
-
return fail("Stroke path coordinates must be finite.");
|
|
165
|
-
}
|
|
166
|
-
const cap = options.cap ?? "butt";
|
|
167
|
-
const join = options.join ?? "miter";
|
|
168
|
-
if (!["butt", "round", "square"].includes(cap)) {
|
|
169
|
-
return fail("Stroke cap must be butt, round, or square.");
|
|
170
|
-
}
|
|
171
|
-
if (!["bevel", "miter", "round"].includes(join)) {
|
|
172
|
-
return fail("Stroke join must be bevel, miter, or round.");
|
|
173
|
-
}
|
|
174
|
-
const circularSegments = cap === "round" || join === "round"
|
|
175
|
-
? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
|
|
176
|
-
: 3;
|
|
177
|
-
const result = strokePathMultiPolygon(path, { ...options, cap, closed, join }, circularSegments);
|
|
165
|
+
export function strokeRegionData(path, options) {
|
|
166
|
+
const result = strokePathMultiPolygon(path, options);
|
|
178
167
|
if (result.length === 0)
|
|
179
168
|
return fail("The sampled stroke path has no visible length.");
|
|
180
169
|
return regionFromMultiPolygon(result);
|