@metamesh/modeling 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/README.md +25 -10
- package/dist/api/engine.d.ts +11 -4
- package/dist/api/geometry.d.ts +345 -341
- package/dist/api/index.d.ts +262 -144
- package/dist/api/text.d.ts +3 -1
- package/dist/docs/guides/concepts.md +22 -7
- package/dist/docs/guides/fundamentals.md +8 -5
- package/dist/docs/guides/hosting.md +21 -11
- package/dist/docs/guides/recipes.md +42 -21
- package/dist/docs/manifest.json +710 -507
- package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
- package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
- package/dist/docs/reference/engine/GenerationOptions.md +1 -1
- package/dist/docs/reference/engine/GeometryResource.md +1 -1
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +1 -1
- package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +20 -9
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +2 -2
- package/dist/docs/reference/engine/categories/host-lifecycle.md +2 -2
- package/dist/docs/reference/engine/createModelEngine.md +3 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine/validateModel.md +1 -1
- package/dist/docs/reference/engine.md +2 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +1 -1
- package/dist/docs/reference/geometry/ArcCurve2.md +5 -5
- package/dist/docs/reference/geometry/ArcCurve3.md +5 -5
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +10 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +1 -1
- package/dist/docs/reference/geometry/Bounds2.md +1 -1
- package/dist/docs/reference/geometry/Bounds3.md +1 -1
- package/dist/docs/reference/geometry/BoundsFit2.md +1 -1
- package/dist/docs/reference/geometry/BoundsFit3.md +1 -1
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +8 -8
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -7
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +1 -1
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +1 -1
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +3 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -6
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +1 -1
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
- package/dist/docs/reference/geometry/Frame3.md +1 -1
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +5 -5
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +9 -3
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +6 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +1 -1
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
- package/dist/docs/reference/geometry/LineCurve2.md +1 -1
- package/dist/docs/reference/geometry/LineCurve3.md +1 -1
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +4 -4
- package/dist/docs/reference/geometry/LoftOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
- package/dist/docs/reference/geometry/Path2-type.md +192 -0
- package/dist/docs/reference/geometry/Path2Data.md +14 -0
- package/dist/docs/reference/geometry/Path2Input.md +15 -0
- package/dist/docs/reference/geometry/Path3-type.md +192 -0
- package/dist/docs/reference/geometry/Path3Data.md +14 -0
- package/dist/docs/reference/geometry/Path3Input.md +15 -0
- package/dist/docs/reference/geometry/PathFrame.md +1 -1
- package/dist/docs/reference/geometry/PathLocation.md +65 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +4 -3
- package/dist/docs/reference/geometry/PathOptions.md +34 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +1 -1
- package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +1 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +1 -1
- package/dist/docs/reference/geometry/PolygonData.md +1 -1
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +4 -4
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/Profile.md +1 -1
- package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
- package/dist/docs/reference/geometry/ProfileSpan2.md +2 -2
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +5 -5
- package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +1 -1
- package/dist/docs/reference/geometry/RegionData.md +1 -1
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +9 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +1 -1
- package/dist/docs/reference/geometry/SampledCurve3.md +1 -1
- package/dist/docs/reference/geometry/SampledThreadHelices.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +3 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/StrokeCap.md +7 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +7 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +7 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +13 -13
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +11 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +9 -9
- package/dist/docs/reference/geometry/SweepOptions.md +6 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +1 -1
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadRole.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +6 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +6 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +1 -1
- package/dist/docs/reference/geometry/Transform2Input.md +1 -1
- package/dist/docs/reference/geometry/Transform2Matrix.md +1 -1
- package/dist/docs/reference/geometry/Transform3-type.md +1 -1
- package/dist/docs/reference/geometry/Transform3Input.md +1 -1
- package/dist/docs/reference/geometry/Transform3Matrix.md +1 -1
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +1 -1
- package/dist/docs/reference/geometry/Vector2Input.md +1 -1
- package/dist/docs/reference/geometry/Vector2Tuple.md +1 -1
- package/dist/docs/reference/geometry/Vector3-type.md +1 -1
- package/dist/docs/reference/geometry/Vector3Input.md +1 -1
- package/dist/docs/reference/geometry/Vector3Tuple.md +1 -1
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
- package/dist/docs/reference/geometry/add2.md +1 -1
- package/dist/docs/reference/geometry/add3.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +2 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +9 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +1 -1
- package/dist/docs/reference/geometry/applyTransformPoint3.md +1 -1
- package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +13 -13
- package/dist/docs/reference/geometry/boundsCenter.md +1 -1
- package/dist/docs/reference/geometry/boundsFromSize.md +1 -1
- package/dist/docs/reference/geometry/boundsSize.md +1 -1
- package/dist/docs/reference/geometry/boxAnchor3.md +4 -4
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +15 -13
- package/dist/docs/reference/geometry/categories/mechanical.md +6 -6
- package/dist/docs/reference/geometry/categories/meshes.md +3 -4
- package/dist/docs/reference/geometry/categories/pattern-placement.md +6 -6
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -3
- package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
- package/dist/docs/reference/geometry/categories/transforms-math.md +5 -5
- package/dist/docs/reference/geometry/categories/vector-import.md +5 -5
- package/dist/docs/reference/geometry/circleContour.md +1 -1
- package/dist/docs/reference/geometry/closeToAxis.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -5
- package/dist/docs/reference/geometry/composeTransform3.md +1 -1
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +10 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +1 -1
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +4 -4
- package/dist/docs/reference/geometry/containsBounds.md +1 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +1 -1
- package/dist/docs/reference/geometry/cross2.md +1 -1
- package/dist/docs/reference/geometry/cross3.md +1 -1
- package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +1 -1
- package/dist/docs/reference/geometry/distance3.md +1 -1
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
- package/dist/docs/reference/geometry/dot2.md +1 -1
- package/dist/docs/reference/geometry/dot3.md +1 -1
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +1 -1
- package/dist/docs/reference/geometry/extrudeMesh.md +8 -8
- package/dist/docs/reference/geometry/fitBounds.md +1 -1
- package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
- package/dist/docs/reference/geometry/frameTransform3.md +1 -1
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +3 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +2 -2
- package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +5 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +5 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +1 -1
- package/dist/docs/reference/geometry/isGeometryError.md +1 -1
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
- package/dist/docs/reference/geometry/layoutRow.md +1 -1
- package/dist/docs/reference/geometry/length2.md +1 -1
- package/dist/docs/reference/geometry/length3.md +1 -1
- package/dist/docs/reference/geometry/lerp2.md +1 -1
- package/dist/docs/reference/geometry/lerp3.md +1 -1
- package/dist/docs/reference/geometry/linearPatternTransforms.md +2 -2
- package/dist/docs/reference/geometry/loftMesh.md +2 -1
- package/dist/docs/reference/geometry/matchProfiles.md +1 -1
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +1 -1
- package/dist/docs/reference/geometry/meshBounds.md +1 -1
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +3 -3
- package/dist/docs/reference/geometry/normalize2.md +1 -1
- package/dist/docs/reference/geometry/normalize3.md +1 -1
- package/dist/docs/reference/geometry/normalizeContour.md +1 -1
- package/dist/docs/reference/geometry/normalizePolygon.md +1 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +1 -1
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +11 -11
- package/dist/docs/reference/geometry/path2.md +42 -0
- package/dist/docs/reference/geometry/path3.md +42 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +3 -3
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
- package/dist/docs/reference/geometry/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/geometry/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/geometry/projectOntoPlane3.md +1 -1
- package/dist/docs/reference/geometry/radialPatternTransforms.md +1 -17
- package/dist/docs/reference/geometry/rectangleContour.md +1 -1
- package/dist/docs/reference/geometry/rectangleProfile.md +1 -1
- package/dist/docs/reference/geometry/regionArea.md +1 -1
- package/dist/docs/reference/geometry/regionBounds.md +1 -1
- package/dist/docs/reference/geometry/regularPolygonContour.md +2 -2
- package/dist/docs/reference/geometry/resamplePolyline2.md +2 -2
- package/dist/docs/reference/geometry/resamplePolyline3.md +2 -2
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +3 -3
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/revolveMesh.md +10 -10
- package/dist/docs/reference/geometry/rotate2.md +1 -1
- package/dist/docs/reference/geometry/rotationTransform3.md +1 -1
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +6 -4
- package/dist/docs/reference/geometry/sampleContour.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve2.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +2 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleHelix.md +2 -2
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +4 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +3 -3
- package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +2 -2
- package/dist/docs/reference/geometry/scale2.md +1 -1
- package/dist/docs/reference/geometry/scale3.md +1 -1
- package/dist/docs/reference/geometry/scaleTransform3.md +1 -1
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +1 -1
- package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
- package/dist/docs/reference/geometry/subtract2.md +1 -1
- package/dist/docs/reference/geometry/subtract3.md +1 -1
- package/dist/docs/reference/geometry/sweepMesh.md +9 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +6 -6
- package/dist/docs/reference/geometry/transform2.md +1 -1
- package/dist/docs/reference/geometry/transform3.md +1 -1
- package/dist/docs/reference/geometry/transformDeterminant3.md +1 -1
- package/dist/docs/reference/geometry/transformRegionData.md +1 -1
- package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
- package/dist/docs/reference/geometry/translationTransform3.md +1 -1
- package/dist/docs/reference/geometry/triangulateContour.md +1 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +2 -2
- package/dist/docs/reference/geometry/validateTransform3.md +1 -1
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +1 -1
- package/dist/docs/reference/geometry/vector3.md +1 -1
- package/dist/docs/reference/geometry.md +2 -2
- package/dist/docs/reference/model/Anchor3.md +1 -1
- package/dist/docs/reference/model/AttachOptions.md +10 -5
- package/dist/docs/reference/model/Bounds2.md +1 -1
- package/dist/docs/reference/model/Bounds3.md +1 -1
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +8 -8
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +1 -1
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +1 -1
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CylinderOptions.md +3 -3
- package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +1 -1
- package/dist/docs/reference/model/EllipseOptions.md +3 -3
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/model/FinalizedModel.md +18 -8
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +1 -1
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +1 -1
- package/dist/docs/reference/model/GeneratedPart.md +1 -1
- package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
- package/dist/docs/reference/model/GenerationError.md +1 -1
- package/dist/docs/reference/model/GeometryResolution.md +5 -5
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +9 -3
- package/dist/docs/reference/model/HeightfieldOptions.md +1 -1
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +3 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/model/HullOptions.md +5 -5
- package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
- package/dist/docs/reference/model/ImplicitOptions.md +1 -1
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +4 -4
- package/dist/docs/reference/model/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +1 -1
- package/dist/docs/reference/model/LoftPlacement.md +1 -1
- package/dist/docs/reference/model/LoftStation.md +3 -3
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +1 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +1 -1
- package/dist/docs/reference/model/PartGeometry.md +1 -1
- package/dist/docs/reference/model/PartOptions.md +1 -1
- package/dist/docs/reference/model/Path2-type.md +192 -0
- package/dist/docs/reference/model/Path2Data.md +14 -0
- package/dist/docs/reference/model/Path2Input.md +15 -0
- package/dist/docs/reference/model/Path3-type.md +192 -0
- package/dist/docs/reference/model/Path3Data.md +14 -0
- package/dist/docs/reference/model/Path3Input.md +15 -0
- package/dist/docs/reference/model/PathLocation.md +65 -0
- package/dist/docs/reference/model/PathNormalGuide.md +4 -3
- package/dist/docs/reference/model/PathOptions.md +34 -0
- package/dist/docs/reference/model/PathPatternOptions.md +3 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +79 -0
- package/dist/docs/reference/model/PatternSource.md +1 -1
- package/dist/docs/reference/model/Pivot2Options.md +1 -1
- package/dist/docs/reference/model/Pivot3Options.md +1 -1
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/PolygonData.md +1 -1
- package/dist/docs/reference/model/PolygonOptions.md +8 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +7 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +41 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/model/Profile.md +1 -1
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +1 -1
- package/dist/docs/reference/model/ProfileSpan2.md +2 -2
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +8 -8
- package/dist/docs/reference/model/RegionData.md +1 -1
- package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
- package/dist/docs/reference/model/RevolveOptions.md +9 -4
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +12 -11
- package/dist/docs/reference/model/SectionHullOptions.md +5 -5
- package/dist/docs/reference/model/SectionInspection.md +7 -7
- package/dist/docs/reference/model/SectionOffsetJoin.md +1 -1
- package/dist/docs/reference/model/SectionOffsetOptions.md +1 -1
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +23 -6
- package/dist/docs/reference/model/SolidInspection.md +4 -4
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +3 -3
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/{StrokePathCap.md → StrokeCap.md} +3 -3
- package/dist/docs/reference/model/{StrokePathJoin.md → StrokeJoin.md} +3 -3
- package/dist/docs/reference/model/StrokeOptions.md +6 -6
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
- package/dist/docs/reference/model/SweepOptions.md +6 -6
- package/dist/docs/reference/model/SweepOrientation.md +7 -7
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/model/ThreadHandedness.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/model/ThreadProfile.md +1 -1
- package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +4 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +4 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +1 -1
- package/dist/docs/reference/model/Transform2Input.md +1 -1
- package/dist/docs/reference/model/Transform2Matrix.md +1 -1
- package/dist/docs/reference/model/Transform3-type.md +1 -1
- package/dist/docs/reference/model/Transform3Input.md +1 -1
- package/dist/docs/reference/model/Transform3Matrix.md +1 -1
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +1 -1
- package/dist/docs/reference/model/Vector2Input.md +1 -1
- package/dist/docs/reference/model/Vector2Tuple.md +1 -1
- package/dist/docs/reference/model/Vector3-type.md +1 -1
- package/dist/docs/reference/model/Vector3Input.md +1 -1
- package/dist/docs/reference/model/Vector3Tuple.md +1 -1
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/anchor.md +1 -1
- package/dist/docs/reference/model/box.md +3 -3
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +1 -1
- package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -1
- package/dist/docs/reference/model/categories/contracts.md +2 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +1 -1
- package/dist/docs/reference/model/categories/explicit-profiles.md +2 -2
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +2 -2
- package/dist/docs/reference/model/categories/generation.md +1 -1
- package/dist/docs/reference/model/categories/inspection.md +4 -5
- package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
- package/dist/docs/reference/model/categories/paths.md +33 -0
- package/dist/docs/reference/model/categories/primitives.md +2 -2
- package/dist/docs/reference/model/categories/resolution.md +2 -2
- package/dist/docs/reference/model/categories/sections.md +3 -4
- package/dist/docs/reference/model/categories/threads.md +5 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +8 -8
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +6 -6
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +1 -1
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +3 -3
- package/dist/docs/reference/model/generate.md +1 -1
- package/dist/docs/reference/model/gridPattern.md +4 -4
- package/dist/docs/reference/model/heightfield.md +1 -1
- package/dist/docs/reference/model/hull.md +1 -1
- package/dist/docs/reference/model/immutableBuffer.md +1 -1
- package/dist/docs/reference/model/immutableMesh.md +1 -1
- package/dist/docs/reference/model/implicit.md +1 -1
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +4 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +1 -1
- package/dist/docs/reference/model/linearPattern.md +4 -4
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +2 -2
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +42 -0
- package/dist/docs/reference/model/path3.md +42 -0
- package/dist/docs/reference/model/pathPattern.md +13 -12
- package/dist/docs/reference/model/polygon.md +4 -4
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/model/radialPattern.md +5 -37
- package/dist/docs/reference/model/rectangle.md +3 -3
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +8 -8
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +1 -1
- package/dist/docs/reference/model/sweep.md +7 -7
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +2 -2
- package/dist/docs/reference/model/threadedNut.md +4 -4
- package/dist/docs/reference/model/threadedRod.md +4 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +1 -1
- package/dist/docs/reference/model/transform3.md +1 -1
- package/dist/docs/reference/model/tube.md +3 -3
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +1 -1
- package/dist/docs/reference/model/vector3.md +1 -1
- package/dist/docs/reference/model.md +3 -2
- package/dist/docs/reference/text/Bounds2.md +1 -1
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +1 -1
- package/dist/docs/reference/text/VectorFont.md +2 -2
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +3 -3
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +1 -1
- package/dist/engine/construction-operations.js +31 -14
- package/dist/engine/execution.js +39 -8
- package/dist/engine/extrusion-finishing.js +1 -1
- package/dist/engine/index.js +6 -1
- package/dist/engine/inspection-operations.js +13 -11
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/native/material-components.js +305 -0
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/native/threads.js +3 -3
- package/dist/engine/native/transforms.js +5 -7
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +1 -1
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-anchors.js +17 -17
- package/dist/engine/primitive-operations.js +1 -1
- package/dist/engine/primitive-profiles.js +7 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +6 -0
- package/dist/engine/section-operations.js +33 -8
- package/dist/engine/session-snapshot.js +14 -4
- package/dist/engine/session.js +10 -5
- package/dist/engine/shape-anchors.js +3 -3
- package/dist/engine/transform-operations.js +24 -24
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/curves/sampling.js +14 -14
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/index.js +9 -10
- package/dist/geometry/loft/loft-simple-mesh.js +6 -6
- package/dist/geometry/loft/loft.js +22 -13
- package/dist/geometry/math/immutable-value.js +1 -1
- package/dist/geometry/mechanical/gear-motion.js +3 -3
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +3 -3
- package/dist/geometry/mechanical/standards.js +1 -1
- package/dist/geometry/mechanical/thread-helices.js +2 -3
- package/dist/geometry/mechanical/thread-mesh-plan.js +4 -5
- package/dist/geometry/mechanical/thread-mesh.js +7 -7
- package/dist/geometry/mechanical/thread-profiles.js +5 -5
- package/dist/geometry/mechanical/thread-solids.js +2 -2
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-planar.js +25 -27
- package/dist/geometry/mesh/mesh-quality.js +5 -5
- package/dist/geometry/mesh/mesh-signature.js +13 -13
- package/dist/geometry/mesh/mesh-solid.js +7 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +8 -19
- package/dist/geometry/paths/frames.js +41 -11
- package/dist/geometry/paths/helix.js +16 -6
- package/dist/geometry/paths/path-value.js +252 -0
- package/dist/geometry/paths/planar.js +36 -23
- package/dist/geometry/paths/resampling.js +27 -5
- package/dist/geometry/patterns/placements.js +100 -27
- package/dist/geometry/patterns.js +2 -2
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/profiles/contour.js +6 -6
- package/dist/geometry/profiles/matched.js +4 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +4 -4
- package/dist/geometry/profiles/side-profile.js +7 -7
- package/dist/geometry/profiles/span-sampling.js +1 -1
- package/dist/geometry/resolution.js +34 -34
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +12 -27
- package/dist/geometry/svg/fill.js +7 -21
- package/dist/geometry/svg-import.js +23 -23
- package/dist/geometry/sweeps/options.js +5 -4
- package/dist/geometry/sweeps/orientation.js +5 -5
- package/dist/geometry/sweeps/stations.js +10 -10
- package/dist/geometry/sweeps/sweep-closed.js +2 -2
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +1 -1
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/transform-geometry.js +7 -14
- package/dist/index.js +1 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +66 -6
- package/dist/model/operations.js +25 -26
- package/dist/model/recipe-declaration.js +13 -7
- package/dist/model/shape-handles.js +2 -1
- package/dist/text/index.js +15 -9
- package/dist/text/vector-text-layout.js +31 -26
- package/package.json +1 -1
- package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +0 -34
- package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +0 -65
- package/dist/docs/reference/geometry/Path2.md +0 -14
- package/dist/docs/reference/geometry/Path3.md +0 -14
- package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
- package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/closestPointOnPath.md +0 -110
- package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
- package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
- package/dist/docs/reference/geometry/pathLength.md +0 -33
- package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
- package/dist/docs/reference/geometry/transformContour.md +0 -42
- package/dist/docs/reference/geometry/transformPath2.md +0 -40
- package/dist/docs/reference/geometry/transformPath3.md +0 -33
- package/dist/docs/reference/model/Path2.md +0 -20
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/geometry/paths/path.js +0 -32
|
@@ -9,7 +9,7 @@ const distance = (a, b) => {
|
|
|
9
9
|
curveFailure("NON_FINITE_VALUE", "Curve extent exceeds finite arithmetic.");
|
|
10
10
|
return value;
|
|
11
11
|
};
|
|
12
|
-
function resamplePolyline(path, dimensions, options, createWriter) {
|
|
12
|
+
function resamplePolyline(path, dimensions, options, createWriter, includeTangents = true) {
|
|
13
13
|
const maximum = resolveSamplingBudget(options);
|
|
14
14
|
if (options.closed !== undefined && typeof options.closed !== "boolean")
|
|
15
15
|
curveFailure("INVALID_ARGUMENT", "closed must be a boolean.");
|
|
@@ -91,10 +91,12 @@ function resamplePolyline(path, dimensions, options, createWriter) {
|
|
|
91
91
|
point[2] = z(a) + (z(b) - z(a)) * t;
|
|
92
92
|
}
|
|
93
93
|
validateCurvePoint3(point);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
if (includeTangents) {
|
|
95
|
+
tangent[0] = b[0] - a[0];
|
|
96
|
+
tangent[1] = b[1] - a[1];
|
|
97
|
+
tangent[2] = z(b) - z(a);
|
|
98
|
+
normalizeCurveDirection(tangent, tangent);
|
|
99
|
+
}
|
|
98
100
|
writer.append(point, tangent);
|
|
99
101
|
}
|
|
100
102
|
return writer.finish();
|
|
@@ -123,3 +125,23 @@ export function resamplePolyline3(path, options = {}) {
|
|
|
123
125
|
export function resamplePolyline2(path, options = {}) {
|
|
124
126
|
return resamplePolyline(path, 2, options, createPlanarSampleWriter);
|
|
125
127
|
}
|
|
128
|
+
/** Internal points-only writer; Path2 owns these mutable coordinates and freezes public interchange. */
|
|
129
|
+
export function resamplePath2Data(path, options) {
|
|
130
|
+
const points = [];
|
|
131
|
+
return resamplePolyline(path, 2, options, () => ({
|
|
132
|
+
append: (point) => {
|
|
133
|
+
points.push([point[0], point[1]]);
|
|
134
|
+
},
|
|
135
|
+
finish: () => points,
|
|
136
|
+
}), false);
|
|
137
|
+
}
|
|
138
|
+
/** Internal points-only writer; avoids calculating and allocating tangents discarded by Path3. */
|
|
139
|
+
export function resamplePath3Data(path, options) {
|
|
140
|
+
const points = [];
|
|
141
|
+
return resamplePolyline(path, 3, options, () => ({
|
|
142
|
+
append: (point) => {
|
|
143
|
+
points.push([point[0], point[1], point[2]]);
|
|
144
|
+
},
|
|
145
|
+
finish: () => points,
|
|
146
|
+
}), false);
|
|
147
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector3Data } from "../math/vector-value.js";
|
|
2
3
|
import { cross3, dot3, scale3 } from "../math/vector3.js";
|
|
4
|
+
import { path2InputData, path3InputData, } from "../paths/path-value.js";
|
|
3
5
|
import { distributeAlongPath } from "../paths/planar.js";
|
|
4
|
-
import {
|
|
6
|
+
import { restrictTransform3 } from "../transform2.js";
|
|
5
7
|
import { composeTransform3, frameTransform3, IDENTITY_TRANSFORM3, rotationTransform3, translationTransform3, } from "../transform3.js";
|
|
6
8
|
const fail = (operation, message) => {
|
|
7
9
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
@@ -23,13 +25,35 @@ const finite = (value, operation) => {
|
|
|
23
25
|
});
|
|
24
26
|
return value;
|
|
25
27
|
};
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const coordinates = (input, operation) => {
|
|
29
|
+
const value = typeof input === "object" &&
|
|
30
|
+
input !== null &&
|
|
31
|
+
"toArray" in input &&
|
|
32
|
+
typeof input.toArray === "function"
|
|
33
|
+
? input.toArray()
|
|
34
|
+
: input;
|
|
35
|
+
if (!Array.isArray(value) || (value.length !== 2 && value.length !== 3))
|
|
36
|
+
fail(operation, "Pattern vectors require exact XY or XYZ coordinates.");
|
|
37
|
+
const source = value;
|
|
38
|
+
const copied = source.length === 2 ? [source[0], source[1]] : [source[0], source[1], source[2]];
|
|
39
|
+
if (copied.some((coordinate) => typeof coordinate !== "number"))
|
|
40
|
+
fail(operation, "Pattern vectors require numeric coordinates.");
|
|
41
|
+
copied.forEach((coordinate) => finite(coordinate, operation));
|
|
42
|
+
return copied;
|
|
43
|
+
};
|
|
44
|
+
const vector = (input, operation) => {
|
|
45
|
+
const value = coordinates(input, operation);
|
|
46
|
+
if (value.length !== 3)
|
|
47
|
+
fail(operation, "Spatial pattern vectors require XYZ coordinates.");
|
|
48
|
+
return vector3Data(value);
|
|
30
49
|
};
|
|
31
|
-
const
|
|
32
|
-
|
|
50
|
+
const lift = (value) => [value[0], value[1], value[2] ?? 0];
|
|
51
|
+
const requireDimension = (actual, expected, operation) => {
|
|
52
|
+
if (actual !== expected)
|
|
53
|
+
fail(operation, "Pattern coordinates must match the shape dimension.");
|
|
54
|
+
};
|
|
55
|
+
const direction = (input, operation) => {
|
|
56
|
+
const value = vector(input, operation);
|
|
33
57
|
const maximum = Math.max(...value.map(Math.abs));
|
|
34
58
|
if (maximum === 0)
|
|
35
59
|
fail(operation, "Pattern direction must be nonzero.");
|
|
@@ -77,27 +101,46 @@ export function linearPatternPlan(options) {
|
|
|
77
101
|
fail(operation, "Length must be a nonnegative whole multiple of the signed spacing.");
|
|
78
102
|
count = patternCount(Math.round(intervals) + 1, operation);
|
|
79
103
|
}
|
|
80
|
-
const
|
|
104
|
+
const input = options.direction === undefined ? undefined : coordinates(options.direction, operation);
|
|
105
|
+
const axis = direction(input === undefined ? [1, 0, 0] : lift(input), operation);
|
|
81
106
|
finite(spacing * (count - 1), operation);
|
|
82
|
-
return {
|
|
107
|
+
return {
|
|
108
|
+
count,
|
|
109
|
+
transformAt: (index, dimension = 3) => {
|
|
110
|
+
if (input !== undefined)
|
|
111
|
+
requireDimension(input.length, dimension, operation);
|
|
112
|
+
return translationTransform3(scale3(axis, spacing * index));
|
|
113
|
+
},
|
|
114
|
+
};
|
|
83
115
|
}
|
|
84
116
|
export function radialPatternPlan(options) {
|
|
85
117
|
const operation = "radialPattern";
|
|
86
118
|
optionsObject(options, operation);
|
|
87
119
|
const count = patternCount(options.count, operation);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
finite(angle
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
120
|
+
if ("center" in options)
|
|
121
|
+
fail(operation, "Use pivot for a radial pattern's rotation reference.");
|
|
122
|
+
const hasAxis = options.axis !== undefined;
|
|
123
|
+
const axis = direction(options.axis ?? [0, 0, 1], operation);
|
|
124
|
+
const angleRadians = finite((options.angle / 180) * Math.PI, operation);
|
|
125
|
+
if (angleRadians === 0)
|
|
126
|
+
fail(operation, "Pattern angle must be nonzero.");
|
|
127
|
+
finite(angleRadians * (count - 1), operation);
|
|
128
|
+
const pivot = options.pivot === undefined ? undefined : coordinates(options.pivot, operation);
|
|
129
|
+
const before = translationTransform3(scale3(pivot === undefined ? [0, 0, 0] : lift(pivot), -1));
|
|
130
|
+
const after = translationTransform3(pivot === undefined ? [0, 0, 0] : lift(pivot));
|
|
96
131
|
return {
|
|
97
132
|
count,
|
|
98
|
-
transformAt: (index) =>
|
|
99
|
-
|
|
100
|
-
|
|
133
|
+
transformAt: (index, dimension = 3) => {
|
|
134
|
+
if (dimension === 2 && hasAxis)
|
|
135
|
+
fail(operation, "XY radial patterns use the implicit +Z axis.");
|
|
136
|
+
if (dimension === 3 && !hasAxis)
|
|
137
|
+
fail(operation, "Spatial radial patterns require an explicit axis.");
|
|
138
|
+
if (pivot !== undefined)
|
|
139
|
+
requireDimension(pivot.length, dimension, operation);
|
|
140
|
+
return index === 0
|
|
141
|
+
? IDENTITY_TRANSFORM3
|
|
142
|
+
: composeTransform3(after, composeTransform3(rotationTransform3(axis, { radians: angleRadians * index }), before));
|
|
143
|
+
},
|
|
101
144
|
};
|
|
102
145
|
}
|
|
103
146
|
export function gridPatternPlan(options) {
|
|
@@ -111,6 +154,7 @@ export function gridPatternPlan(options) {
|
|
|
111
154
|
fail(operation, "Grid count and spacing require matching XY or XYZ tuples.");
|
|
112
155
|
if (options.center !== undefined && typeof options.center !== "boolean")
|
|
113
156
|
fail(operation, "Grid center must be a boolean.");
|
|
157
|
+
const centered = options.center === true;
|
|
114
158
|
const counts = [options.count[0], options.count[1], dimensions === 3 ? options.count[2] : 1];
|
|
115
159
|
counts.forEach((count) => patternCount(count, operation));
|
|
116
160
|
const count = patternCount(counts[0] * counts[1] * counts[2], operation);
|
|
@@ -138,13 +182,17 @@ export function gridPatternPlan(options) {
|
|
|
138
182
|
const frame = options.frame === undefined ? IDENTITY_TRANSFORM3 : frameTransform3(options.frame);
|
|
139
183
|
return {
|
|
140
184
|
count,
|
|
141
|
-
transformAt: (index) => {
|
|
185
|
+
transformAt: (index, dimension = 3) => {
|
|
186
|
+
if (dimension === 2) {
|
|
187
|
+
requireDimension(dimensions, dimension, operation);
|
|
188
|
+
restrictTransform3(frame);
|
|
189
|
+
}
|
|
142
190
|
const coordinates = [
|
|
143
191
|
index % counts[0],
|
|
144
192
|
Math.floor(index / counts[0]) % counts[1],
|
|
145
193
|
Math.floor(index / (counts[0] * counts[1])),
|
|
146
194
|
];
|
|
147
|
-
const offset = coordinates.map((value, axis) => value * spacing[axis] - (
|
|
195
|
+
const offset = coordinates.map((value, axis) => value * spacing[axis] - (centered ? extent[axis] / 2 : 0));
|
|
148
196
|
return composeTransform3(frame, translationTransform3(offset));
|
|
149
197
|
},
|
|
150
198
|
};
|
|
@@ -164,18 +212,43 @@ export function pathPatternPlan(input, options, limits) {
|
|
|
164
212
|
options.orientation !== "fixed" &&
|
|
165
213
|
options.orientation !== "tangent")
|
|
166
214
|
fail(operation, "Path orientation must be fixed or tangent.");
|
|
167
|
-
const
|
|
215
|
+
const tangentOrientation = options.orientation === "tangent";
|
|
216
|
+
if (typeof input !== "object" || input === null)
|
|
217
|
+
fail(operation, "Path patterns require sampled XY or XYZ coordinates.");
|
|
218
|
+
const first = Array.isArray(input) ? input[0] : undefined;
|
|
219
|
+
const suppliedDimension = Array.isArray(input)
|
|
220
|
+
? Array.isArray(first)
|
|
221
|
+
? first.length
|
|
222
|
+
: typeof first === "object" && first !== null && "z" in first
|
|
223
|
+
? 3
|
|
224
|
+
: 2
|
|
225
|
+
: Reflect.get(input, "dimension");
|
|
226
|
+
if (suppliedDimension !== 2 && suppliedDimension !== 3)
|
|
227
|
+
fail(operation, "Path patterns require sampled XY or XYZ coordinates.");
|
|
228
|
+
const dimension = suppliedDimension === 2 ? 2 : 3;
|
|
229
|
+
const data = dimension === 2
|
|
230
|
+
? path2InputData(input, options.closed, limits)
|
|
231
|
+
: path3InputData(input, options.closed, limits);
|
|
232
|
+
const path = dimension === 2 ? data.points.map(lift) : data.points;
|
|
233
|
+
// Distribution permits reversals, zero-length edges, and open paths returning to their start.
|
|
234
|
+
// Validate the traversal before factories without allocating the complete placement collection.
|
|
235
|
+
const firstPlacement = distributeAlongPath(path, 1, data.closed, limits);
|
|
168
236
|
// Defer the output placement array until the operation has checked the source copy budget.
|
|
169
|
-
let placements;
|
|
237
|
+
let placements = count === 1 ? firstPlacement : undefined;
|
|
170
238
|
return {
|
|
171
239
|
count,
|
|
172
|
-
transformAt: (index) => {
|
|
173
|
-
|
|
240
|
+
transformAt: (index, shapeDimension = 3) => {
|
|
241
|
+
requireDimension(dimension, shapeDimension, operation);
|
|
242
|
+
placements ??= distributeAlongPath(path, count, data.closed, limits);
|
|
174
243
|
const placement = placements[index];
|
|
175
244
|
const translation = translationTransform3(placement.position);
|
|
176
|
-
if (
|
|
245
|
+
if (!tangentOrientation)
|
|
177
246
|
return translation;
|
|
178
247
|
const tangent = placement.tangent;
|
|
248
|
+
if (dimension === 2)
|
|
249
|
+
return composeTransform3(translation, rotationTransform3([0, 0, 1], {
|
|
250
|
+
radians: Math.atan2(tangent[1], tangent[0]),
|
|
251
|
+
}));
|
|
179
252
|
const cosine = Math.max(-1, Math.min(1, dot3([0, 0, 1], tangent)));
|
|
180
253
|
const axis = cross3([0, 0, 1], tangent);
|
|
181
254
|
const sine = Math.hypot(...axis);
|
|
@@ -3,7 +3,7 @@ import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
|
|
|
3
3
|
function transforms(plan) {
|
|
4
4
|
return Object.freeze(Array.from({ length: plan.count }, (_, index) => Object.freeze(plan.transformAt(index))));
|
|
5
5
|
}
|
|
6
|
-
/**
|
|
6
|
+
/** Spatial XYZ matrix placements in millimetres, including the original at the origin. */
|
|
7
7
|
export function linearPatternTransforms(options) {
|
|
8
8
|
return transforms(linearPatternPlan(options));
|
|
9
9
|
}
|
|
@@ -11,7 +11,7 @@ export function linearPatternTransforms(options) {
|
|
|
11
11
|
export function radialPatternTransforms(options) {
|
|
12
12
|
return transforms(radialPatternPlan(options));
|
|
13
13
|
}
|
|
14
|
-
/** XY or XYZ grid
|
|
14
|
+
/** Spatial XYZ matrices for an XY or XYZ grid, in X-fastest order. */
|
|
15
15
|
export function gridPatternTransforms(options) {
|
|
16
16
|
return transforms(gridPatternPlan(options));
|
|
17
17
|
}
|
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import * as clippingModule from "polygon-clipping";
|
|
2
|
+
import { normalizeRegion } from "./regions.js";
|
|
2
3
|
const moduleWithDefault = clippingModule;
|
|
3
4
|
/** @internal Normalizes polygon-clipping's CommonJS and bundled ESM module shapes. */
|
|
4
5
|
export const polygonClipping = moduleWithDefault.default ?? clippingModule;
|
|
6
|
+
/** @internal Copies an open contour into polygon-clipping's explicitly closed ring format. */
|
|
7
|
+
export function clippingRing(points) {
|
|
8
|
+
const result = points.map(([x, y]) => [x, y]);
|
|
9
|
+
const first = result[0];
|
|
10
|
+
const last = result.at(-1);
|
|
11
|
+
if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1]))
|
|
12
|
+
result.push([...first]);
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
/** @internal Converts closed clipping rings into canonical regions with implicit seams. */
|
|
16
|
+
export function regionFromMultiPolygon(value) {
|
|
17
|
+
return normalizeRegion(value.map((polygon) => ({
|
|
18
|
+
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
19
|
+
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
20
|
+
})));
|
|
21
|
+
}
|
|
5
22
|
const CLIPPING_COORDINATE_GRID = 1e9;
|
|
6
23
|
const snapCoordinate = (value) => Math.round(value * CLIPPING_COORDINATE_GRID) / CLIPPING_COORDINATE_GRID;
|
|
7
24
|
/** Canonicalizes shared endpoints below model tolerance before they enter the sweep-line kernel. */
|
|
@@ -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,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
|
}
|