@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
|
@@ -3,6 +3,7 @@ import { triangulateContour } from "../loft/loft.js";
|
|
|
3
3
|
import { validateTriangleMesh } from "../mesh/mesh.js";
|
|
4
4
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
|
|
5
5
|
import { writeMeshVertex } from "../numeric.js";
|
|
6
|
+
import { path2InputData } from "../paths/path-value.js";
|
|
6
7
|
import { resolveCircularPrimitiveSegments } from "../primitive-resolution.js";
|
|
7
8
|
import { normalizeContour } from "../regions.js";
|
|
8
9
|
import { assertSamplingCount } from "../sampling-limits.js";
|
|
@@ -16,6 +17,7 @@ const AXIS_EPSILON = 1e-10;
|
|
|
16
17
|
* vertices and zero-area quads. Profile edges that lie entirely on the axis
|
|
17
18
|
* collapse to the solid's interior and are intentionally omitted.
|
|
18
19
|
* Profile coordinates must fit finite Float32 mesh storage.
|
|
20
|
+
* Path2 profiles must be closed; raw point collections have an implicit closing edge.
|
|
19
21
|
*
|
|
20
22
|
* @param profile - Closed CCW `[radius, z]` profile without a duplicated seam point.
|
|
21
23
|
* @param options - Optional physical or exact circumferential sampling controls. Defaults to `{}`.
|
|
@@ -24,28 +26,31 @@ const AXIS_EPSILON = 1e-10;
|
|
|
24
26
|
* @example Partial revolution with end caps
|
|
25
27
|
* ```ts
|
|
26
28
|
* // Each point is [radius, Z]; the profile seam is implicit.
|
|
27
|
-
* revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], {
|
|
29
|
+
* revolveMesh([[0, 0], [12, 0], [8, 20], [0, 20]], { degrees: 270 });
|
|
28
30
|
* ```
|
|
29
31
|
*/
|
|
30
|
-
export const revolveMesh = (
|
|
32
|
+
export const revolveMesh = (input, options = {}) => {
|
|
31
33
|
if (typeof options !== "object" || options === null || Array.isArray(options))
|
|
32
34
|
throw new GeometryError("INVALID_ARGUMENT", "Revolution options require an object.", {
|
|
33
35
|
operation: "revolveMesh",
|
|
34
36
|
});
|
|
35
|
-
const degrees = options.
|
|
37
|
+
const degrees = options.degrees ?? 360;
|
|
36
38
|
if (!Number.isFinite(degrees) || degrees <= 0 || degrees > 360)
|
|
37
|
-
throw new GeometryError("INVALID_ARGUMENT", "
|
|
39
|
+
throw new GeometryError("INVALID_ARGUMENT", "degrees must be in (0, 360].", {
|
|
38
40
|
operation: "revolveMesh",
|
|
39
41
|
});
|
|
42
|
+
const limits = resolveModelingLimits(options.limits);
|
|
43
|
+
let profile = path2InputData(input, true, { maxPathPoints: limits.maxProfilePoints }).points;
|
|
40
44
|
if (profile.length < 3) {
|
|
41
|
-
throw new
|
|
45
|
+
throw new GeometryError("DEGENERATE_GEOMETRY", "A revolved profile needs at least three points.", {
|
|
46
|
+
operation: "revolveMesh",
|
|
47
|
+
});
|
|
42
48
|
}
|
|
43
|
-
const limits = resolveModelingLimits(options.limits);
|
|
44
49
|
assertSamplingCount(profile.length, "revolveMesh", limits.maxProfilePoints);
|
|
45
50
|
let maximumRadius = 0;
|
|
46
51
|
for (const [radius, z] of profile) {
|
|
47
52
|
if (!Number.isFinite(radius) || !Number.isFinite(z) || radius < 0) {
|
|
48
|
-
throw new
|
|
53
|
+
throw new GeometryError(Number.isFinite(radius) && Number.isFinite(z) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE", "Revolved profile coordinates must be finite and radii non-negative.", { operation: "revolveMesh" });
|
|
49
54
|
}
|
|
50
55
|
if (!Number.isFinite(Math.fround(radius)) || !Number.isFinite(Math.fround(z))) {
|
|
51
56
|
throw new GeometryError("NON_FINITE_VALUE", "Revolved profile coordinates exceed finite Float32 mesh storage.", { operation: "revolveMesh" });
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
import { GeometryError } from "./errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { path2InputData } from "./paths/path-value.js";
|
|
3
|
+
import { clippingRing, regionFromMultiPolygon, unionPolygonGeometry } from "./polygon-clipping.js";
|
|
4
4
|
import { resolveCircularSegments } from "./resolution.js";
|
|
5
5
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
|
|
6
6
|
import { resolveGeometryTolerance } from "./tolerance.js";
|
|
7
7
|
const DEFAULT_MITER_LIMIT = 4;
|
|
8
8
|
function fail(message) {
|
|
9
|
-
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "
|
|
10
|
-
}
|
|
11
|
-
function ring(points) {
|
|
12
|
-
const result = points.map(([x, y]) => [x, y]);
|
|
13
|
-
const first = result[0];
|
|
14
|
-
const last = result.at(-1);
|
|
15
|
-
if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1])) {
|
|
16
|
-
result.push([...first]);
|
|
17
|
-
}
|
|
18
|
-
return result;
|
|
9
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "strokeRegionData" });
|
|
19
10
|
}
|
|
20
11
|
function ellipsePoints(center, radius, segments) {
|
|
21
12
|
return Array.from({ length: segments }, (_, index) => {
|
|
@@ -76,8 +67,9 @@ function deduplicatePath(path, closed, width) {
|
|
|
76
67
|
return Object.freeze(points);
|
|
77
68
|
}
|
|
78
69
|
/** @internal Bounded CCW stroke primitives shared by native sections and pure clipping. */
|
|
79
|
-
export function strokePathContours(
|
|
80
|
-
const
|
|
70
|
+
export function strokePathContours(input, options, exactCircularSegments) {
|
|
71
|
+
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
72
|
+
const { points: path, closed } = path2InputData(input, options.closed, limits);
|
|
81
73
|
const cap = options.cap ?? "butt";
|
|
82
74
|
const join = options.join ?? "miter";
|
|
83
75
|
if (typeof closed !== "boolean")
|
|
@@ -97,9 +89,8 @@ export function strokePathContours(path, options, exactCircularSegments) {
|
|
|
97
89
|
? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
|
|
98
90
|
: 3);
|
|
99
91
|
const half = options.width / 2;
|
|
100
|
-
|
|
101
|
-
assertSamplingCount(
|
|
102
|
-
assertSamplingCount(circularSegments, "strokePathRegion", limits.maxCircularSegments);
|
|
92
|
+
assertSamplingCount(path.length, "strokeRegionData", limits.maxPathPoints);
|
|
93
|
+
assertSamplingCount(circularSegments, "strokeRegionData", limits.maxCircularSegments);
|
|
103
94
|
const normalizedPath = deduplicatePath(path, closed, options.width);
|
|
104
95
|
if (normalizedPath.length < (closed ? 3 : 2))
|
|
105
96
|
return [];
|
|
@@ -109,7 +100,7 @@ export function strokePathContours(path, options, exactCircularSegments) {
|
|
|
109
100
|
const constructionVertices = segmentCount * 4 +
|
|
110
101
|
joinCount * (join === "round" ? circularSegments : join === "miter" ? 4 : 3) +
|
|
111
102
|
(!closed && cap === "round" ? 2 * circularSegments : 0);
|
|
112
|
-
assertSamplingCount(constructionVertices, "
|
|
103
|
+
assertSamplingCount(constructionVertices, "strokeRegionData", limits.maxProfilePoints);
|
|
113
104
|
for (let index = 0; index < segmentCount; index += 1) {
|
|
114
105
|
let start = normalizedPath[index];
|
|
115
106
|
let end = normalizedPath[(index + 1) % normalizedPath.length];
|
|
@@ -158,17 +149,11 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
|
158
149
|
const contours = strokePathContours(path, options, circularSegments);
|
|
159
150
|
if (contours.length === 0)
|
|
160
151
|
return [];
|
|
161
|
-
const result = unionPolygonGeometry(contours.map((contour) => [
|
|
152
|
+
const result = unionPolygonGeometry(contours.map((contour) => [clippingRing(contour)]));
|
|
162
153
|
const outputVertices = result.reduce((count, polygon) => count + polygon.reduce((total, contour) => total + Math.max(0, contour.length - 1), 0), 0);
|
|
163
|
-
assertSamplingCount(outputVertices, "
|
|
154
|
+
assertSamplingCount(outputVertices, "strokeRegionData", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
|
|
164
155
|
return result;
|
|
165
156
|
}
|
|
166
|
-
function regionFromMultiPolygon(value) {
|
|
167
|
-
return normalizeRegion(value.map((polygon) => ({
|
|
168
|
-
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
169
|
-
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
170
|
-
})));
|
|
171
|
-
}
|
|
172
157
|
/**
|
|
173
158
|
* Converts a sampled millimetre path into the filled region covered by a centered stroke.
|
|
174
159
|
*
|
|
@@ -177,7 +162,7 @@ function regionFromMultiPolygon(value) {
|
|
|
177
162
|
* resolution. Bevels fill the outer corner triangle; miters extend the outer edges to their
|
|
178
163
|
* intersection, falling back to bevels above SVG's default miter limit of 4.
|
|
179
164
|
*/
|
|
180
|
-
export function
|
|
165
|
+
export function strokeRegionData(path, options) {
|
|
181
166
|
const result = strokePathMultiPolygon(path, options);
|
|
182
167
|
if (result.length === 0)
|
|
183
168
|
return fail("The sampled stroke path has no visible length.");
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
import { polygonClipping, unionPolygonGeometry, xorPolygonGeometry } from "../polygon-clipping.js";
|
|
2
|
-
import {
|
|
1
|
+
import { clippingRing, polygonClipping, regionFromMultiPolygon, unionPolygonGeometry, xorPolygonGeometry, } from "../polygon-clipping.js";
|
|
2
|
+
import { signedContourArea } from "../regions.js";
|
|
3
3
|
import { assertSamplingCount } from "../sampling-limits.js";
|
|
4
4
|
/** Private clipping stage with the selected execution's immutable allocation ceiling. */
|
|
5
|
-
export function createBoundedSvgClipping(
|
|
6
|
-
function ring(points) {
|
|
7
|
-
const result = points.map(([x, y]) => [x, y]);
|
|
8
|
-
const first = result[0];
|
|
9
|
-
const last = result.at(-1);
|
|
10
|
-
if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1]))
|
|
11
|
-
result.push([...first]);
|
|
12
|
-
return result;
|
|
13
|
-
}
|
|
5
|
+
export function createBoundedSvgClipping(maxVertices) {
|
|
14
6
|
function ringVertexCount(value) {
|
|
15
7
|
const first = value[0];
|
|
16
8
|
const last = value.at(-1);
|
|
@@ -21,7 +13,7 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
21
13
|
return value.reduce((total, polygon) => total + polygon.reduce((polygonTotal, path) => polygonTotal + ringVertexCount(path), 0), 0);
|
|
22
14
|
}
|
|
23
15
|
function assertExpandedVertexCount(vertices, stage) {
|
|
24
|
-
assertSamplingCount(vertices, "preflightSvgRegion",
|
|
16
|
+
assertSamplingCount(vertices, "preflightSvgRegion", maxVertices, `SVG ${stage} exceeds ${maxVertices} expanded vertices (requires ${vertices}).`);
|
|
25
17
|
}
|
|
26
18
|
function boundedMultiPolygon(value, stage) {
|
|
27
19
|
assertExpandedVertexCount(multiPolygonVertexCount(value), stage);
|
|
@@ -136,16 +128,16 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
136
128
|
.map((subpath) => subpath.points);
|
|
137
129
|
if (rings.length === 0)
|
|
138
130
|
return [];
|
|
139
|
-
const polygons = rings.map((points) => [
|
|
131
|
+
const polygons = rings.map((points) => [clippingRing(points)]);
|
|
140
132
|
if (fillRule === "evenodd") {
|
|
141
133
|
return boundedXor(polygons.map((polygon) => [polygon]), "even-odd fill output");
|
|
142
134
|
}
|
|
143
135
|
const positive = rings
|
|
144
136
|
.filter((points) => signedContourArea(points) >= 0)
|
|
145
|
-
.map((points) => [
|
|
137
|
+
.map((points) => [clippingRing(points)]);
|
|
146
138
|
const negative = rings
|
|
147
139
|
.filter((points) => signedContourArea(points) < 0)
|
|
148
|
-
.map((points) => [
|
|
140
|
+
.map((points) => [clippingRing(points)]);
|
|
149
141
|
if (positive.length === 0)
|
|
150
142
|
return boundedUnion([negative], "negative fill output");
|
|
151
143
|
if (negative.length === 0)
|
|
@@ -155,12 +147,6 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
155
147
|
// precisely where positive and negative nonzero winding counts match.
|
|
156
148
|
return differingCoverage(positive, negative);
|
|
157
149
|
}
|
|
158
|
-
function regionFromMultiPolygon(value) {
|
|
159
|
-
return normalizeRegion(value.map((polygon) => ({
|
|
160
|
-
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
161
|
-
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
162
|
-
})));
|
|
163
|
-
}
|
|
164
150
|
return {
|
|
165
151
|
assertExpandedVertexCount,
|
|
166
152
|
boundedMultiPolygon,
|
|
@@ -429,7 +429,7 @@ function measureSvgRegion(region) {
|
|
|
429
429
|
let minEdgeLength = Number.POSITIVE_INFINITY;
|
|
430
430
|
let minX = Number.POSITIVE_INFINITY;
|
|
431
431
|
let minY = Number.POSITIVE_INFINITY;
|
|
432
|
-
let
|
|
432
|
+
let shortEdgeCount = 0;
|
|
433
433
|
let vertices = 0;
|
|
434
434
|
for (const polygon of region) {
|
|
435
435
|
for (const loop of [polygon.outer, ...polygon.holes]) {
|
|
@@ -443,7 +443,7 @@ function measureSvgRegion(region) {
|
|
|
443
443
|
for (const length of loopEdgeLengths(loop)) {
|
|
444
444
|
minEdgeLength = Math.min(minEdgeLength, length);
|
|
445
445
|
if (length < SHORT_EDGE_LENGTH_MM)
|
|
446
|
-
|
|
446
|
+
shortEdgeCount += 1;
|
|
447
447
|
}
|
|
448
448
|
}
|
|
449
449
|
}
|
|
@@ -456,13 +456,13 @@ function measureSvgRegion(region) {
|
|
|
456
456
|
return Object.freeze({
|
|
457
457
|
area: regionArea(region),
|
|
458
458
|
bounds,
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
holes,
|
|
459
|
+
componentCount: region.length,
|
|
460
|
+
contourCount: region.length + holes,
|
|
461
|
+
holeCount: holes,
|
|
462
462
|
minEdgeLength: Number.isFinite(minEdgeLength) ? minEdgeLength : null,
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
vertices,
|
|
463
|
+
shortEdgeCount,
|
|
464
|
+
tinyIslandCount: region.filter((polygon) => polygonArea(polygon) < TINY_ISLAND_AREA_MM2).length,
|
|
465
|
+
vertexCount: vertices,
|
|
466
466
|
});
|
|
467
467
|
}
|
|
468
468
|
/**
|
|
@@ -498,10 +498,10 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
498
498
|
const stack = [];
|
|
499
499
|
const geometry = [];
|
|
500
500
|
let elementCount = 0;
|
|
501
|
-
let
|
|
501
|
+
let emptyElementCount = 0;
|
|
502
502
|
let expandedGeometryVertices = 0;
|
|
503
|
-
let
|
|
504
|
-
let
|
|
503
|
+
let implicitFilledClosureCount = 0;
|
|
504
|
+
let invisibleElementCount = 0;
|
|
505
505
|
let nodeCount = 0;
|
|
506
506
|
let rootSeen = false;
|
|
507
507
|
let strokeConstructionVertices = 0;
|
|
@@ -582,9 +582,9 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
582
582
|
const paintedStroke = isPainted(paint.stroke, paint.strokeOpacity) && paint.strokeWidth > 0;
|
|
583
583
|
const elementGeometry = [];
|
|
584
584
|
if (!paintedFill && !paintedStroke)
|
|
585
|
-
|
|
585
|
+
invisibleElementCount += 1;
|
|
586
586
|
if (paintedFill) {
|
|
587
|
-
|
|
587
|
+
implicitFilledClosureCount += subpaths.filter((subpath) => !subpath.closed && subpath.points.length >= 3).length;
|
|
588
588
|
appendGeometry(elementGeometry, fillGeometry(subpaths, paint.fillRule), "element fill output");
|
|
589
589
|
}
|
|
590
590
|
if (paintedStroke) {
|
|
@@ -606,7 +606,7 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
606
606
|
}
|
|
607
607
|
}
|
|
608
608
|
if ((paintedFill || paintedStroke) && elementGeometry.every((value) => value.length === 0)) {
|
|
609
|
-
|
|
609
|
+
emptyElementCount += 1;
|
|
610
610
|
}
|
|
611
611
|
geometry.push(...elementGeometry);
|
|
612
612
|
}
|
|
@@ -628,17 +628,17 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
628
628
|
geometry: measureSvgRegion(region),
|
|
629
629
|
region,
|
|
630
630
|
repairs: Object.freeze({
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
631
|
+
emptyElementCount,
|
|
632
|
+
implicitFilledClosureCount,
|
|
633
|
+
invisibleElementCount,
|
|
634
|
+
removedDuplicateVertexCount: budget.removedDuplicateCount,
|
|
635
|
+
removedSeamVertexCount: budget.removedSeamCount,
|
|
636
636
|
}),
|
|
637
637
|
source: Object.freeze({
|
|
638
|
-
bytes,
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
638
|
+
byteCount: bytes,
|
|
639
|
+
elementCount,
|
|
640
|
+
emittedVertexCount: budget.emittedCount,
|
|
641
|
+
parsedVertexCount: budget.parsedCount,
|
|
642
642
|
}),
|
|
643
643
|
});
|
|
644
644
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector2Data } from "../math/vector-value.js";
|
|
2
3
|
/** @internal Validates local scales before any manufacturing buffer allocation. */
|
|
3
4
|
export function resolveSweepScales(scale, stationCount) {
|
|
4
5
|
const fail = () => {
|
|
@@ -10,14 +11,14 @@ export function resolveSweepScales(scale, stationCount) {
|
|
|
10
11
|
fail();
|
|
11
12
|
return [value, value];
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
!value.every((n) => typeof n === "number" && Number.isFinite(n) && n > 0))
|
|
14
|
+
const coordinates = vector2Data(value);
|
|
15
|
+
if (!coordinates.every((n) => typeof n === "number" && Number.isFinite(n) && n > 0))
|
|
16
16
|
fail();
|
|
17
|
-
return
|
|
17
|
+
return coordinates;
|
|
18
18
|
};
|
|
19
19
|
if (scale === undefined ||
|
|
20
20
|
typeof scale === "number" ||
|
|
21
|
+
(typeof scale === "object" && scale !== null && "toArray" in scale) ||
|
|
21
22
|
(Array.isArray(scale) && typeof scale[0] === "number")) {
|
|
22
23
|
const value = pair(scale ?? 1);
|
|
23
24
|
return Array.from({ length: stationCount }, () => value);
|
|
@@ -14,7 +14,7 @@ export function validateSweepOptions(options) {
|
|
|
14
14
|
"limits",
|
|
15
15
|
"orientation",
|
|
16
16
|
"resolution",
|
|
17
|
-
"
|
|
17
|
+
"twist",
|
|
18
18
|
"twistBy",
|
|
19
19
|
"scale",
|
|
20
20
|
"seamProfileOffset",
|
|
@@ -27,8 +27,8 @@ export function validateSweepOptions(options) {
|
|
|
27
27
|
options.twistBy !== "length" &&
|
|
28
28
|
options.twistBy !== "stations")
|
|
29
29
|
fail("Sweep twistBy must be length or stations.");
|
|
30
|
-
if (!Number.isFinite(options.
|
|
31
|
-
throw new GeometryError("NON_FINITE_VALUE", "Sweep
|
|
30
|
+
if (!Number.isFinite(options.twist ?? 0))
|
|
31
|
+
throw new GeometryError("NON_FINITE_VALUE", "Sweep twist must be finite.", {
|
|
32
32
|
operation: "sweep",
|
|
33
33
|
});
|
|
34
34
|
const policy = options.orientation;
|
|
@@ -58,8 +58,8 @@ export function validateSweepOptions(options) {
|
|
|
58
58
|
if (Object.keys(policy).some((key) => !keys.includes(key)))
|
|
59
59
|
fail("Unsupported field for the selected sweep orientation.");
|
|
60
60
|
}
|
|
61
|
-
function directedNormal(
|
|
62
|
-
validateSweepNormal(
|
|
61
|
+
function directedNormal(input, tangent, label) {
|
|
62
|
+
const value = validateSweepNormal(input, "sweep");
|
|
63
63
|
const maximum = Math.max(...value.map(Math.abs));
|
|
64
64
|
const unit = normalize3([value[0] / maximum, value[1] / maximum, value[2] / maximum]);
|
|
65
65
|
const projected = projectOntoPlane3(unit, tangent);
|
|
@@ -65,14 +65,14 @@ function frameRotation(from, to) {
|
|
|
65
65
|
export function planSweepStations(contours, path, scales, options, frames) {
|
|
66
66
|
const closed = options.closed ?? false;
|
|
67
67
|
const segmentCount = closed ? path.length : path.length - 1;
|
|
68
|
-
const
|
|
69
|
-
if (!Number.isFinite(
|
|
70
|
-
throw new GeometryError("NON_FINITE_VALUE", "Sweep
|
|
68
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
69
|
+
if (!Number.isFinite(twistRadians))
|
|
70
|
+
throw new GeometryError("NON_FINITE_VALUE", "Sweep twist must be finite.", {
|
|
71
71
|
operation: "sweep",
|
|
72
72
|
});
|
|
73
73
|
const intervals = [];
|
|
74
74
|
const progress = sweepProgress(path, options);
|
|
75
|
-
if (
|
|
75
|
+
if (twistRadians === 0)
|
|
76
76
|
return { intervals: Array(segmentCount).fill(1), stationCount: path.length, progress };
|
|
77
77
|
const resolution = resolveGeometryResolution(options.resolution, options.limits);
|
|
78
78
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
@@ -92,7 +92,7 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
92
92
|
let stationCount = closed ? 0 : 1;
|
|
93
93
|
for (let i = 0; i < segmentCount; i++) {
|
|
94
94
|
const next = (i + 1) % path.length;
|
|
95
|
-
const twistStep = Math.abs(
|
|
95
|
+
const twistStep = Math.abs(twistRadians * (progress[i + 1] - progress[i]));
|
|
96
96
|
const frameAngle = frames === undefined ? 0 : frameRotation(frames[i], frames[next]).angle;
|
|
97
97
|
const angle = frameAngle + twistStep;
|
|
98
98
|
const maximumScale = Math.max(...scales[i], ...scales[next]);
|
|
@@ -104,9 +104,9 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
104
104
|
const a = curvature / 8, b = (edgeLength * (maximumScale * angle + scaleChange)) / 4;
|
|
105
105
|
const requiredAngular = resolution.circularSegments === undefined
|
|
106
106
|
? Math.max(1, Math.ceil((b + Math.hypot(b, 2 * Math.sqrt(a * resolution.maxChordError))) /
|
|
107
|
-
(2 * resolution.maxChordError)), Math.ceil((resolution.
|
|
107
|
+
(2 * resolution.maxChordError)), Math.ceil((resolution.minSegments * angle) / (2 * Math.PI)))
|
|
108
108
|
: Math.max(1, Math.ceil((resolution.circularSegments * angle) / (2 * Math.PI)));
|
|
109
|
-
const allowedAngular = Math.max(1, scaleChange === 0 ? 0 : resolution.
|
|
109
|
+
const allowedAngular = Math.max(1, scaleChange === 0 ? 0 : resolution.maxSegments, Math.ceil((resolution.maxSegments * angle) / (2 * Math.PI)));
|
|
110
110
|
if (requiredAngular > allowedAngular)
|
|
111
111
|
throw new GeometryError("COMPLEXITY_LIMIT", `Sweep surface refinement requires ${requiredAngular} intervals; the selected circular ceiling allows ${allowedAngular}.`, {
|
|
112
112
|
operation: "sweep",
|
|
@@ -126,7 +126,7 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
126
126
|
}
|
|
127
127
|
/** Inserts twist samples without calling authored guides again or changing original station meaning. */
|
|
128
128
|
export function refineSweepStations(path, scales, frames, options, plan) {
|
|
129
|
-
const
|
|
129
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
130
130
|
const segmentCount = plan.intervals.length;
|
|
131
131
|
const points = [], sampledScales = [], sampledFrames = [], twists = [];
|
|
132
132
|
for (let i = 0; i < segmentCount; i++) {
|
|
@@ -148,14 +148,14 @@ export function refineSweepStations(path, scales, frames, options, plan) {
|
|
|
148
148
|
binormal: rotateAroundAxis3Radians(frames[i].binormal, rotation.axis, rotation.angle * amount),
|
|
149
149
|
tangent: rotateAroundAxis3Radians(frames[i].tangent, rotation.axis, rotation.angle * amount),
|
|
150
150
|
});
|
|
151
|
-
twists.push(
|
|
151
|
+
twists.push(twistRadians * (plan.progress[i] + (plan.progress[i + 1] - plan.progress[i]) * amount));
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
if (options.closed !== true) {
|
|
155
155
|
points.push(path.at(-1));
|
|
156
156
|
sampledScales.push(scales.at(-1));
|
|
157
157
|
sampledFrames.push(frames.at(-1));
|
|
158
|
-
twists.push(
|
|
158
|
+
twists.push(twistRadians);
|
|
159
159
|
}
|
|
160
160
|
return { path: points, scales: sampledScales, frames: sampledFrames, twists };
|
|
161
161
|
}
|
|
@@ -20,9 +20,9 @@ export const buildClosedSweepMesh = (profile, path, options = {}) => {
|
|
|
20
20
|
operation,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
-
const twistRadians = ((options.
|
|
23
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
24
24
|
if (!Number.isFinite(twistRadians)) {
|
|
25
|
-
throw new GeometryError("NON_FINITE_VALUE", "Sweep
|
|
25
|
+
throw new GeometryError("NON_FINITE_VALUE", "Sweep twist must be finite.", {
|
|
26
26
|
operation,
|
|
27
27
|
});
|
|
28
28
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { resolveModelingLimits } from "../model-limits.js";
|
|
3
|
+
import { path2InputData, path3InputData, } from "../paths/path-value.js";
|
|
2
4
|
import { validateSweepOptions } from "./orientation.js";
|
|
3
5
|
import { buildClosedSweepMesh } from "./sweep-closed.js";
|
|
4
6
|
import { buildOpenSweepMesh } from "./sweep-open.js";
|
|
@@ -15,12 +17,16 @@ import { buildOpenSweepMesh } from "./sweep-open.js";
|
|
|
15
17
|
*/
|
|
16
18
|
export function sweepMesh(profile, path, options = {}) {
|
|
17
19
|
validateSweepOptions(options);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
const limits = resolveModelingLimits(options.limits);
|
|
21
|
+
const outline = path2InputData(profile, true, { maxPathPoints: limits.maxProfilePoints }).points;
|
|
22
|
+
const data = path3InputData(path, options.closed, limits);
|
|
23
|
+
const selected = { ...options, closed: data.closed };
|
|
24
|
+
if (data.closed) {
|
|
25
|
+
return buildClosedSweepMesh(outline, data.points, selected);
|
|
20
26
|
}
|
|
21
27
|
if ((options.seamProfileOffset ?? 0) !== 0)
|
|
22
28
|
throw new GeometryError("INVALID_ARGUMENT", "A seamProfileOffset requires a closed path.", {
|
|
23
29
|
operation: "sweep",
|
|
24
30
|
});
|
|
25
|
-
return buildOpenSweepMesh(
|
|
31
|
+
return buildOpenSweepMesh(outline, data.points, selected);
|
|
26
32
|
}
|
|
@@ -13,7 +13,7 @@ export const buildOpenSweepMesh = (profile, path, options = {}) => {
|
|
|
13
13
|
path = normalizeSweepPath(path, false, operation, options.limits);
|
|
14
14
|
assertSweepAllocation(path.length, profile.length, false, operation, options.limits);
|
|
15
15
|
let scales = resolveSweepScales(options.scale, path.length);
|
|
16
|
-
const twistRadians = ((options.
|
|
16
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
17
17
|
if (twistRadians !== 0) {
|
|
18
18
|
const plan = planSweepStations([profile], path, scales, options);
|
|
19
19
|
assertSweepAllocation(plan.stationCount, profile.length, false, operation, options.limits);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector3Data } from "../math/vector-value.js";
|
|
2
3
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
|
|
3
4
|
import { writeMeshVertex } from "../numeric.js";
|
|
4
5
|
import { normalizeContour } from "../regions.js";
|
|
@@ -97,13 +98,8 @@ export function writeSweepVertex(positions, offset, point, operation) {
|
|
|
97
98
|
writeMeshVertex(positions, offset, point, operation);
|
|
98
99
|
}
|
|
99
100
|
/** @internal Checks user-provided orientation controls before vector normalization. */
|
|
100
|
-
export function validateSweepNormal(
|
|
101
|
-
const
|
|
102
|
-
if (!hasArrayShape || normal.length !== 3) {
|
|
103
|
-
throw new GeometryError("INVALID_ARGUMENT", "Sweep normals must be exact XYZ tuples.", {
|
|
104
|
-
operation,
|
|
105
|
-
});
|
|
106
|
-
}
|
|
101
|
+
export function validateSweepNormal(input, operation) {
|
|
102
|
+
const normal = vector3Data(input);
|
|
107
103
|
if (![normal[0], normal[1], normal[2]].every(Number.isFinite)) {
|
|
108
104
|
throw new GeometryError("NON_FINITE_VALUE", "Sweep normal coordinates must be finite XYZ values.", { operation });
|
|
109
105
|
}
|
|
@@ -112,4 +108,5 @@ export function validateSweepNormal(normal, operation) {
|
|
|
112
108
|
operation,
|
|
113
109
|
});
|
|
114
110
|
}
|
|
111
|
+
return normal;
|
|
115
112
|
}
|
|
@@ -3,35 +3,28 @@ import { normalizeContour, normalizeRegion, signedContourArea } from "./regions.
|
|
|
3
3
|
import { readTransformMatrix } from "./transform-matrix.js";
|
|
4
4
|
import { embedTransform2 } from "./transform2.js";
|
|
5
5
|
import { applyValidatedTransformPoint3, validateTransform3 } from "./transform3.js";
|
|
6
|
-
/**
|
|
6
|
+
/** Internal owned coordinates for a Path3 result; no mutable coordinates escape the path value. */
|
|
7
7
|
export function transformPath3(path, placement) {
|
|
8
8
|
const transform = readTransformMatrix(placement, 3);
|
|
9
9
|
validateTransform3(transform);
|
|
10
|
-
return
|
|
10
|
+
return path.map((point) => applyValidatedTransformPoint3(transform, point));
|
|
11
11
|
}
|
|
12
12
|
const transformPoint2 = (point, transform) => {
|
|
13
13
|
const values = vector2Data(point);
|
|
14
14
|
const transformed = applyValidatedTransformPoint3(transform, [values[0], values[1], 0]);
|
|
15
|
-
return
|
|
15
|
+
return [transformed[0], transformed[1]];
|
|
16
16
|
};
|
|
17
|
-
const transformPlanarPath = (path, transform) => Object.freeze(path.map((point) => transformPoint2(point, transform)));
|
|
18
|
-
/**
|
|
17
|
+
const transformPlanarPath = (path, transform) => Object.freeze(path.map((point) => Object.freeze(transformPoint2(point, transform))));
|
|
18
|
+
/** Internal owned XY coordinates preserving path traversal; public interchange is frozen by Path2. */
|
|
19
19
|
export function transformPath2(path, transform, tolerance = {}) {
|
|
20
|
-
|
|
20
|
+
const matrix = embedTransform2(readTransformMatrix(transform, 2), tolerance);
|
|
21
|
+
return path.map((point) => transformPoint2(point, matrix));
|
|
21
22
|
}
|
|
22
23
|
const transformContourWithMatrix = (loop, transform, tolerance) => {
|
|
23
24
|
const counterClockwise = signedContourArea(loop) > 0;
|
|
24
25
|
const normalized = normalizeContour(loop, counterClockwise, tolerance);
|
|
25
26
|
return normalizeContour(transformPlanarPath(normalized, transform), counterClockwise, tolerance);
|
|
26
27
|
};
|
|
27
|
-
/**
|
|
28
|
-
* Applies a canonical affine XY transform to a closed loop and preserves its original winding.
|
|
29
|
-
*
|
|
30
|
-
* Reflections reverse the point order automatically through normalization.
|
|
31
|
-
*/
|
|
32
|
-
export function transformContour(loop, transform, tolerance = {}) {
|
|
33
|
-
return transformContourWithMatrix(loop, embedTransform2(readTransformMatrix(transform, 2), tolerance), tolerance);
|
|
34
|
-
}
|
|
35
28
|
/**
|
|
36
29
|
* Transforms serialized polygon data with reflection-safe winding, without an engine.
|
|
37
30
|
* Use Section.transform(placement) when authoring filled geometry; this utility serves pure data preparation.
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Immutable modeling recipes and math values; the host owns geometry evaluation. @packageDocumentation */
|
|
2
2
|
export { transform2, transform3, } from "./geometry/transform-chain.js";
|
|
3
3
|
export { vector2, vector3, } from "./geometry/math/vector-value.js";
|
|
4
|
+
export { path2, path3, } from "./geometry/paths/path-value.js";
|
|
4
5
|
export * from "./model/operations.js";
|
|
5
6
|
export * from "./model/generation.js";
|
|
6
7
|
export { immutableBuffer, immutableMesh } from "./model/immutable-buffer.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GeometryError } from "../geometry/errors.js";
|
|
2
2
|
// One protocol key lets locally bundled operation wrappers resolve the host's execution
|
|
3
3
|
// without depending on package instances, class identity, or initializing a native runtime.
|
|
4
|
-
const executionKey = Symbol.for("@metamesh/modeling/execution/
|
|
4
|
+
const executionKey = Symbol.for("@metamesh/modeling/execution/7");
|
|
5
5
|
const bindings = globalThis;
|
|
6
6
|
/** Internal host binding. Executable callbacks are synchronous and may not nest executions. */
|
|
7
7
|
export function bindModelContext(context, build) {
|
|
@@ -10,7 +10,7 @@ export function bindModelContext(context, build) {
|
|
|
10
10
|
operation: "build",
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
bindings[executionKey] = { version:
|
|
13
|
+
bindings[executionKey] = { version: 7, context };
|
|
14
14
|
try {
|
|
15
15
|
return build();
|
|
16
16
|
}
|
|
@@ -31,5 +31,5 @@ export function currentModelContext(operation) {
|
|
|
31
31
|
/** Reads an optional binding without initializing an engine or creating ambient authoring state. */
|
|
32
32
|
export function activeModelContext() {
|
|
33
33
|
const binding = bindings[executionKey];
|
|
34
|
-
return binding?.version ===
|
|
34
|
+
return binding?.version === 7 ? binding.context : undefined;
|
|
35
35
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createSectionHandle, createSolidHandle } from "./shape-handles.js";
|
|
2
2
|
// One realm protocol lets bundled authoring code declare recipes before a host is initialized.
|
|
3
3
|
// The payload contains no native handles and the engine remains responsible for realization.
|
|
4
|
-
const recipeKey = Symbol.for("@metamesh/modeling/recipe/
|
|
4
|
+
const recipeKey = Symbol.for("@metamesh/modeling/recipe/7");
|
|
5
5
|
/** Reads private recipe metadata without requiring an execution context. */
|
|
6
6
|
export const geometryRecipe = (value) => Object.getOwnPropertyDescriptor(value, recipeKey)?.value;
|
|
7
7
|
/** Recognizes only opaque recipe handles issued by this engine. */
|