@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,13 @@ import { isImmutableMathValue } from "../geometry/math/immutable-value.js";
|
|
|
3
3
|
import { geometryRecipe, isGeometryRecipe } from "./geometry-recipes.js";
|
|
4
4
|
import { adoptImmutableBuffer, immutableBuffer, immutableBufferView, isImmutableBuffer, } from "./immutable-buffer.js";
|
|
5
5
|
const mutableBufferMessage = "Generation data cannot contain mutable typed arrays or raw ArrayBuffers. Use immutableBuffer(array) or immutableMesh(mesh) before caching them or declaring dependencies.";
|
|
6
|
+
const capturedMetadata = new WeakMap();
|
|
7
|
+
const noChildren = Object.freeze([]);
|
|
8
|
+
/** Reuses field accounting only for containers captured or deeply validated by this owner. */
|
|
9
|
+
export function generationDataMetadata(value) {
|
|
10
|
+
return capturedMetadata.get(value);
|
|
11
|
+
}
|
|
12
|
+
const scalarBytes = (value) => (typeof value === "string" ? value.length * 2 : 8);
|
|
6
13
|
/** Iterates plain fields; recipe capture may read each enumerable accessor once. */
|
|
7
14
|
export function* generationDataEntries(value, captureAccessors = false) {
|
|
8
15
|
const prototype = Object.getPrototypeOf(value);
|
|
@@ -45,9 +52,31 @@ export function generationValueBytes(values, ceiling) {
|
|
|
45
52
|
if (seen.has(value))
|
|
46
53
|
return;
|
|
47
54
|
seen.add(value);
|
|
55
|
+
const metadata = capturedMetadata.get(value);
|
|
56
|
+
if (metadata !== undefined) {
|
|
57
|
+
if (depth === 128 && metadata.bytes > 0) {
|
|
58
|
+
bytes = Infinity;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
bytes += 32 + metadata.bytes;
|
|
62
|
+
for (const child of metadata.children)
|
|
63
|
+
visit(child, depth + 1);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
48
66
|
if (isImmutableMathValue(value)) {
|
|
49
67
|
bytes += 32;
|
|
50
|
-
|
|
68
|
+
const data = mathValueData(value);
|
|
69
|
+
visit(data, depth + 1);
|
|
70
|
+
if (typeof data === "object" &&
|
|
71
|
+
data !== null &&
|
|
72
|
+
"dimension" in data &&
|
|
73
|
+
(data.dimension === 2 || data.dimension === 3) &&
|
|
74
|
+
"points" in data &&
|
|
75
|
+
Array.isArray(data.points)) {
|
|
76
|
+
// A path retains private numerical tuples as well as its frozen interchange view.
|
|
77
|
+
// Charge both stores conservatively; the outer seen set still counts value aliases once.
|
|
78
|
+
bytes += 64 + data.points.length * (40 + 8 * data.dimension);
|
|
79
|
+
}
|
|
51
80
|
return;
|
|
52
81
|
}
|
|
53
82
|
const array = isImmutableBuffer(value)
|
|
@@ -158,14 +187,21 @@ export function compareGenerationValues(left, right) {
|
|
|
158
187
|
function mathValueData(value) {
|
|
159
188
|
for (const name of ["toArray", "toMatrix"]) {
|
|
160
189
|
const method = Reflect.get(value, name);
|
|
161
|
-
if (typeof method === "function")
|
|
162
|
-
|
|
190
|
+
if (typeof method === "function") {
|
|
191
|
+
const data = Reflect.apply(method, value, []);
|
|
192
|
+
// Closure and dimension change path behavior; tuple interchange omits both for empty paths.
|
|
193
|
+
const closed = Reflect.get(value, "closed");
|
|
194
|
+
return typeof closed === "boolean"
|
|
195
|
+
? { dimension: Reflect.get(value, "dimension"), points: data, closed }
|
|
196
|
+
: data;
|
|
197
|
+
}
|
|
163
198
|
}
|
|
164
199
|
throw new TypeError("Immutable math values must expose their canonical numeric data.");
|
|
165
200
|
}
|
|
166
201
|
function captureValue(value, mode, readerAllowed = () => false, validated) {
|
|
167
202
|
const recipeInputs = mode === "recipe";
|
|
168
203
|
const seen = new Map();
|
|
204
|
+
const metadata = new Map();
|
|
169
205
|
const copy = (input) => {
|
|
170
206
|
if (typeof input === "function" && !recipeInputs && !readerAllowed(input))
|
|
171
207
|
throw new GeometryError("INVALID_ARGUMENT", "Computed values and dependencies cannot contain arbitrary function closures.", { operation: "computed" });
|
|
@@ -191,20 +227,42 @@ function captureValue(value, mode, readerAllowed = () => false, validated) {
|
|
|
191
227
|
if (input instanceof ArrayBuffer)
|
|
192
228
|
throw new TypeError(mutableBufferMessage);
|
|
193
229
|
const entries = generationDataEntries(input, recipeInputs);
|
|
230
|
+
let bytes = 0;
|
|
231
|
+
const children = [];
|
|
232
|
+
const recordField = (key, field) => {
|
|
233
|
+
bytes += 16 + key.length * 2;
|
|
234
|
+
if (typeof field === "object" && field !== null)
|
|
235
|
+
children.push(field);
|
|
236
|
+
else
|
|
237
|
+
bytes += scalarBytes(field);
|
|
238
|
+
};
|
|
194
239
|
if (mode === "dependency") {
|
|
195
240
|
if (!Object.isFrozen(input))
|
|
196
241
|
throw new GeometryError("INVALID_ARGUMENT", "Computed dependencies require deeply immutable objects and arrays. Read params inside the callback, use a computed value, or depend on individual scalar values.", { operation: "computed" });
|
|
197
242
|
seen.set(input, input);
|
|
198
|
-
for (const [, field] of entries)
|
|
243
|
+
for (const [key, field] of entries) {
|
|
199
244
|
copy(field);
|
|
245
|
+
recordField(key, field);
|
|
246
|
+
}
|
|
247
|
+
metadata.set(input, {
|
|
248
|
+
bytes,
|
|
249
|
+
children: children.length ? Object.freeze(children) : noChildren,
|
|
250
|
+
});
|
|
200
251
|
return input;
|
|
201
252
|
}
|
|
202
253
|
const result = Array.isArray(input)
|
|
203
254
|
? new Array(input.length)
|
|
204
255
|
: Object.create(Object.getPrototypeOf(input) === null ? null : Object.prototype);
|
|
205
256
|
seen.set(input, result);
|
|
206
|
-
for (const [key, field] of entries)
|
|
207
|
-
|
|
257
|
+
for (const [key, field] of entries) {
|
|
258
|
+
const value = copy(field);
|
|
259
|
+
Object.defineProperty(result, key, { value, enumerable: true });
|
|
260
|
+
recordField(key, value);
|
|
261
|
+
}
|
|
262
|
+
metadata.set(result, {
|
|
263
|
+
bytes,
|
|
264
|
+
children: children.length ? Object.freeze(children) : noChildren,
|
|
265
|
+
});
|
|
208
266
|
return Object.freeze(result);
|
|
209
267
|
};
|
|
210
268
|
const result = copy(value);
|
|
@@ -212,6 +270,8 @@ function captureValue(value, mode, readerAllowed = () => false, validated) {
|
|
|
212
270
|
if (mode === "dependency")
|
|
213
271
|
for (const input of seen.keys())
|
|
214
272
|
validated?.add(input);
|
|
273
|
+
for (const [value, entry] of metadata)
|
|
274
|
+
capturedMetadata.set(value, entry);
|
|
215
275
|
return result;
|
|
216
276
|
}
|
|
217
277
|
/** Validates while capturing immutable data; only explicitly allowed session readers may be functions. */
|
package/dist/model/operations.js
CHANGED
|
@@ -139,10 +139,6 @@ export function minkowskiSum(a, b) {
|
|
|
139
139
|
export function solidFromMesh(mesh) {
|
|
140
140
|
return invoke("solidFromMesh", [mesh]);
|
|
141
141
|
}
|
|
142
|
-
/** Copies a handle to manufacturing mesh buffers. */
|
|
143
|
-
export function toTriangleMesh(solid) {
|
|
144
|
-
return invoke("toTriangleMesh", [solid]);
|
|
145
|
-
}
|
|
146
142
|
/**
|
|
147
143
|
* Reads a copied, immutable named anchor from this exact active generation.
|
|
148
144
|
*
|
|
@@ -171,7 +167,7 @@ export function polygon(input) {
|
|
|
171
167
|
/**
|
|
172
168
|
* Creates a centered-width native Section along a sampled XY path.
|
|
173
169
|
*
|
|
174
|
-
* Shares caps, joins and physical sampling with Geometry's
|
|
170
|
+
* Shares caps, joins and physical sampling with Geometry's strokeRegionData. Native union
|
|
175
171
|
* resolves overlapping stroke primitives. Session resolution and resource ceilings apply;
|
|
176
172
|
* closed paths omit the duplicated seam. Returns an immutable deferred recipe.
|
|
177
173
|
*
|
|
@@ -266,7 +262,7 @@ export function extrude(shape, options) {
|
|
|
266
262
|
*
|
|
267
263
|
* // Contour coordinates are [radius, Z].
|
|
268
264
|
* const [profile] = matchProfiles([rectangleProfile({ size: [4, 16], center: false })]);
|
|
269
|
-
* revolve(profile!, {
|
|
265
|
+
* revolve(profile!, { degrees: 270 });
|
|
270
266
|
* ```
|
|
271
267
|
*/
|
|
272
268
|
export function revolve(shape, options) {
|
|
@@ -276,7 +272,10 @@ export function revolve(shape, options) {
|
|
|
276
272
|
export function loft(stations, options) {
|
|
277
273
|
return invoke("loft", [stations, options]);
|
|
278
274
|
}
|
|
279
|
-
/**
|
|
275
|
+
/**
|
|
276
|
+
* Matches a profile family using operation settings over host resolution and limits.
|
|
277
|
+
* Requires active synchronous model execution. Use Geometry's matchProfiles for standalone preparation.
|
|
278
|
+
*/
|
|
280
279
|
export function matchProfiles(profiles, options) {
|
|
281
280
|
return invoke("matchProfiles", [profiles, options]);
|
|
282
281
|
}
|
|
@@ -359,8 +358,8 @@ export function distance(solid, other) {
|
|
|
359
358
|
return invoke("distance", [solid, other]);
|
|
360
359
|
}
|
|
361
360
|
/** Copies intersections along the finite directed origin-to-endpoint segment. */
|
|
362
|
-
export function
|
|
363
|
-
return invoke("
|
|
361
|
+
export function castSegment(solid, origin, endpoint) {
|
|
362
|
+
return invoke("castSegment", [solid, origin, endpoint]);
|
|
364
363
|
}
|
|
365
364
|
export function components(shape) {
|
|
366
365
|
return invoke("components", [shape]);
|
|
@@ -388,17 +387,17 @@ export function implicit(options) {
|
|
|
388
387
|
export function heightfield(options) {
|
|
389
388
|
return invoke("heightfield", [options]);
|
|
390
389
|
}
|
|
391
|
-
export function linearPattern(
|
|
392
|
-
return invoke("linearPattern",
|
|
390
|
+
export function linearPattern(...args) {
|
|
391
|
+
return invoke("linearPattern", args);
|
|
393
392
|
}
|
|
394
|
-
export function radialPattern(
|
|
395
|
-
return invoke("radialPattern",
|
|
393
|
+
export function radialPattern(...args) {
|
|
394
|
+
return invoke("radialPattern", args);
|
|
396
395
|
}
|
|
397
|
-
export function gridPattern(
|
|
398
|
-
return invoke("gridPattern",
|
|
396
|
+
export function gridPattern(...args) {
|
|
397
|
+
return invoke("gridPattern", args);
|
|
399
398
|
}
|
|
400
|
-
export function pathPattern(
|
|
401
|
-
return invoke("pathPattern",
|
|
399
|
+
export function pathPattern(...args) {
|
|
400
|
+
return invoke("pathPattern", args);
|
|
402
401
|
}
|
|
403
402
|
/** Helical ridge mesh construction. */
|
|
404
403
|
export function threadRidge(options) {
|
|
@@ -410,9 +409,9 @@ export function threadRidge(options) {
|
|
|
410
409
|
* @example Threaded rod
|
|
411
410
|
* ```ts
|
|
412
411
|
* import { threadedRod } from "@metamesh/modeling";
|
|
413
|
-
* import {
|
|
412
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
414
413
|
*
|
|
415
|
-
* const profile =
|
|
414
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
416
415
|
* threadedRod({ nominalMajorDiameter: 12, length: 24, profile, fit: "normal" });
|
|
417
416
|
* ```
|
|
418
417
|
*/
|
|
@@ -425,8 +424,8 @@ export function threadedRod(options) {
|
|
|
425
424
|
* @example Internal thread
|
|
426
425
|
* ```ts
|
|
427
426
|
* import { cylinder, internalThreadCutter } from "@metamesh/modeling";
|
|
428
|
-
* import {
|
|
429
|
-
* const profile =
|
|
427
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
428
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
430
429
|
* const body = cylinder({ diameter: 20, height: 12, center: false });
|
|
431
430
|
* const cutter = internalThreadCutter({ nominalMajorDiameter: 12, length: 12, profile });
|
|
432
431
|
* body.subtract([cutter]);
|
|
@@ -441,24 +440,24 @@ export function internalThreadCutter(options) {
|
|
|
441
440
|
* @example Threaded nut
|
|
442
441
|
* ```ts
|
|
443
442
|
* import { threadedNut } from "@metamesh/modeling";
|
|
444
|
-
* import {
|
|
443
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
445
444
|
*
|
|
446
|
-
* const profile =
|
|
445
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
447
446
|
* threadedNut({ nominalMajorDiameter: 12, thickness: 8, width: 20, shape: "hex", profile, fit: "normal" });
|
|
448
447
|
* ```
|
|
449
448
|
*/
|
|
450
449
|
export function threadedNut(options) {
|
|
451
450
|
return invoke("threadedNut", [options]);
|
|
452
451
|
}
|
|
453
|
-
/**
|
|
452
|
+
/** External-thread facts using host resolution and limits; requires active synchronous model execution. */
|
|
454
453
|
export function preflightThreadedRod(options) {
|
|
455
454
|
return invoke("preflightThreadedRod", [options]);
|
|
456
455
|
}
|
|
457
|
-
/**
|
|
456
|
+
/** Internal-thread facts using host resolution and limits; requires active synchronous model execution. */
|
|
458
457
|
export function preflightInternalThreadCutter(options) {
|
|
459
458
|
return invoke("preflightInternalThreadCutter", [options]);
|
|
460
459
|
}
|
|
461
|
-
/**
|
|
460
|
+
/** Nut/cutter facts using host resolution and limits; requires active synchronous model execution. */
|
|
462
461
|
export function preflightThreadedNut(options) {
|
|
463
462
|
return invoke("preflightThreadedNut", [options]);
|
|
464
463
|
}
|
|
@@ -21,7 +21,7 @@ const operationBehaviors = {
|
|
|
21
21
|
compose: "solid",
|
|
22
22
|
minkowskiSum: "solid",
|
|
23
23
|
solidFromMesh: "solid",
|
|
24
|
-
|
|
24
|
+
withTolerance: "solid",
|
|
25
25
|
threadRidge: "solid",
|
|
26
26
|
threadedRod: "solid",
|
|
27
27
|
threadedNut: "solid",
|
|
@@ -57,7 +57,7 @@ const operationBehaviors = {
|
|
|
57
57
|
inspectSolid: "observation",
|
|
58
58
|
isEmpty: "observation",
|
|
59
59
|
distance: "observation",
|
|
60
|
-
|
|
60
|
+
castSegment: "observation",
|
|
61
61
|
anchor: "observation",
|
|
62
62
|
matchProfiles: "observation",
|
|
63
63
|
preflightThreadedRod: "observation",
|
|
@@ -144,13 +144,19 @@ function inputKind(value) {
|
|
|
144
144
|
return recipe.kind;
|
|
145
145
|
if ("sections" in value)
|
|
146
146
|
return "section";
|
|
147
|
-
if ("points" in value &&
|
|
148
|
-
Array.isArray(value.points) &&
|
|
149
|
-
Array.isArray(value.points[0]) &&
|
|
150
|
-
value.points[0].length === 2)
|
|
147
|
+
if ("points" in value && Array.isArray(value.points) && pointDimension(value.points[0]) === 2)
|
|
151
148
|
return "section";
|
|
152
149
|
return "solid";
|
|
153
150
|
}
|
|
151
|
+
function pointDimension(value) {
|
|
152
|
+
if (Array.isArray(value))
|
|
153
|
+
return value.length;
|
|
154
|
+
if (typeof value !== "object" || value === null || !("toArray" in value))
|
|
155
|
+
return undefined;
|
|
156
|
+
const method = value.toArray;
|
|
157
|
+
const points = typeof method === "function" ? Reflect.apply(method, value, []) : undefined;
|
|
158
|
+
return Array.isArray(points) ? points.length : undefined;
|
|
159
|
+
}
|
|
154
160
|
/** Runs every factory during declaration; each placed copy stays deferred until it is used. */
|
|
155
161
|
function declarePattern(operation, resolution, supplied, declaration) {
|
|
156
162
|
const plan = patternPlan(operation, supplied, declaration.limits);
|
|
@@ -171,7 +177,7 @@ function declarePattern(operation, resolution, supplied, declaration) {
|
|
|
171
177
|
operation,
|
|
172
178
|
});
|
|
173
179
|
kind = currentKind;
|
|
174
|
-
const matrix = plan.transformAt(index);
|
|
180
|
+
const matrix = plan.transformAt(index, kind === "section" ? 2 : 3);
|
|
175
181
|
copies.push(declareRecipeOperation("transform", resolution, [shape, kind === "section" ? restrictTransform3(matrix) : matrix], declaration));
|
|
176
182
|
}
|
|
177
183
|
return Object.freeze(copies);
|
|
@@ -26,8 +26,9 @@ const common = {
|
|
|
26
26
|
};
|
|
27
27
|
const solidPrototype = prototype({
|
|
28
28
|
...common,
|
|
29
|
+
toTriangleMesh: forward("toTriangleMesh"),
|
|
29
30
|
attach: forward("attach"),
|
|
30
|
-
|
|
31
|
+
withTolerance: forward("withTolerance"),
|
|
31
32
|
projectSection: forward("projectSection"),
|
|
32
33
|
sliceSection: forward("sliceSection"),
|
|
33
34
|
});
|
package/dist/text/index.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { SVGPathData, SVGPathDataTransformer } from "svg-pathdata";
|
|
2
|
+
import { GeometryError } from "../geometry/errors.js";
|
|
2
3
|
import { createVectorTextLayout } from "./vector-text-layout.js";
|
|
3
4
|
/** Limits apply before parsing or shaping untrusted font data. */
|
|
4
5
|
export const MAX_VECTOR_FONT_BYTES = 16 * 1024 * 1024;
|
|
5
|
-
function fail(message) {
|
|
6
|
-
throw new
|
|
6
|
+
function fail(message, code = "INVALID_ARGUMENT") {
|
|
7
|
+
throw new GeometryError(code, message, { operation: "prepareVectorFont" });
|
|
7
8
|
}
|
|
8
9
|
function serializeVectorText({ paths, metrics }) {
|
|
9
10
|
const bounds = metrics.bounds;
|
|
10
11
|
if (bounds === null || paths.length === 0)
|
|
11
|
-
|
|
12
|
+
throw new GeometryError("DEGENERATE_GEOMETRY", "The selected font produced no visible glyph outlines.", { operation: "VectorFont.toSvg" });
|
|
12
13
|
const d = paths
|
|
13
14
|
.map((path) => new SVGPathData(path).transform(SVGPathDataTransformer.MATRIX(1, 0, 0, -1, 0, 0)).encode())
|
|
14
15
|
.join(" ");
|
|
@@ -16,11 +17,12 @@ function serializeVectorText({ paths, metrics }) {
|
|
|
16
17
|
const height = Math.max(0.001, bounds.max[1] - bounds.min[1]);
|
|
17
18
|
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}mm" height="${height}mm" viewBox="${bounds.min[0]} ${-bounds.max[1]} ${width} ${height}"><path fill="black" fill-rule="nonzero" d="${d}"/></svg>`;
|
|
18
19
|
if (svg.length > 256 * 1024)
|
|
19
|
-
|
|
20
|
+
throw new GeometryError("COMPLEXITY_LIMIT", "Text outlines exceed 256 KiB. Use fewer characters or a simpler font.", { operation: "VectorFont.toSvg" });
|
|
20
21
|
return svg;
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
24
|
* Parses bounded font bytes using optional fontkit and WOFF2 peers; no font fetching occurs here.
|
|
25
|
+
* Argument and resource failures use GeometryError; parser and decoder exceptions propagate unchanged.
|
|
24
26
|
*
|
|
25
27
|
* @example Prepare a label before building geometry
|
|
26
28
|
* ```ts
|
|
@@ -31,20 +33,24 @@ function serializeVectorText({ paths, metrics }) {
|
|
|
31
33
|
* ```
|
|
32
34
|
*/
|
|
33
35
|
export async function prepareVectorFont(bytes, options = {}) {
|
|
34
|
-
if (bytes.byteLength === 0
|
|
36
|
+
if (bytes.byteLength === 0)
|
|
35
37
|
fail("Font files must be non-empty and at most 16 MiB.");
|
|
38
|
+
if (bytes.byteLength > MAX_VECTOR_FONT_BYTES)
|
|
39
|
+
fail("Font files must be non-empty and at most 16 MiB.", "COMPLEXITY_LIMIT");
|
|
36
40
|
const staticWeight = options.staticWeight ?? 400;
|
|
37
41
|
if (!Number.isInteger(staticWeight) || staticWeight < 1 || staticWeight > 1000)
|
|
38
|
-
fail("staticWeight must be an integer from 1 through 1000.");
|
|
42
|
+
fail("staticWeight must be an integer from 1 through 1000.", Number.isFinite(staticWeight) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
|
|
39
43
|
// Own the original bytes: a caller mutating its buffer must not change later lazy font reads.
|
|
40
44
|
let decoded = Uint8Array.from(bytes);
|
|
41
45
|
if (bytes[0] === 0x77 && bytes[1] === 0x4f && bytes[2] === 0x46 && bytes[3] === 0x32) {
|
|
42
|
-
const { default: decompress } = await import("woff2-encoder/decompress")
|
|
46
|
+
const { default: decompress } = await import("woff2-encoder/decompress");
|
|
43
47
|
decoded = await decompress(decoded);
|
|
44
|
-
if (decoded.byteLength === 0
|
|
48
|
+
if (decoded.byteLength === 0)
|
|
45
49
|
fail("The decoded font must be non-empty and at most 32 MiB.");
|
|
50
|
+
if (decoded.byteLength > 32 * 1024 * 1024)
|
|
51
|
+
fail("The decoded font must be non-empty and at most 32 MiB.", "COMPLEXITY_LIMIT");
|
|
46
52
|
}
|
|
47
|
-
const fontkit = await import("fontkit")
|
|
53
|
+
const fontkit = await import("fontkit");
|
|
48
54
|
const font = fontkit.create(decoded);
|
|
49
55
|
if (!("layout" in font))
|
|
50
56
|
fail("Font collections are not supported.");
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { SVGPathData, SVGPathDataTransformer } from "svg-pathdata";
|
|
2
|
+
import { GeometryError } from "../geometry/errors.js";
|
|
2
3
|
const MAX_TEXT_LENGTH = 512;
|
|
3
4
|
const MAX_TEXT_LINES = 16;
|
|
4
5
|
const MAX_TEXT_GLYPHS = 2048;
|
|
5
6
|
const MAX_TEXT_COMMANDS = 32000;
|
|
6
7
|
const MAX_TEXT_PATH_BYTES = 1024 * 1024;
|
|
7
8
|
const supportedText = /^[\p{Script=Latin}\p{Script=Greek}\p{Script=Cyrillic}\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Common}\p{Script=Inherited}]*$/u;
|
|
8
|
-
function fail(message) {
|
|
9
|
-
throw new
|
|
9
|
+
function fail(message, code = "INVALID_ARGUMENT") {
|
|
10
|
+
throw new GeometryError(code, message, { operation: "VectorFont.layout" });
|
|
10
11
|
}
|
|
11
12
|
function checkText(text) {
|
|
12
13
|
if (text.length > MAX_TEXT_LENGTH)
|
|
13
|
-
fail("Text must contain at most 512 characters and 16 lines.");
|
|
14
|
+
fail("Text must contain at most 512 characters and 16 lines.", "COMPLEXITY_LIMIT");
|
|
14
15
|
const lines = text.replaceAll("\r\n", "\n").replaceAll("\r", "\n").split("\n");
|
|
15
16
|
if (lines.length > MAX_TEXT_LINES)
|
|
16
|
-
fail("Text must contain at most 512 characters and 16 lines.");
|
|
17
|
+
fail("Text must contain at most 512 characters and 16 lines.", "COMPLEXITY_LIMIT");
|
|
17
18
|
if (!supportedText.test(text) ||
|
|
18
19
|
/\p{Emoji_Presentation}|\p{Variation_Selector}|[\u200c-\u200f\u202a-\u202e\u2066-\u2069]/u.test(text))
|
|
19
20
|
fail("This writing system or text direction is not supported yet. Use Latin, Greek, Cyrillic, or horizontal CJK text.");
|
|
@@ -27,9 +28,9 @@ function normalizeControls(options, staticWeight) {
|
|
|
27
28
|
if (typeof baseline !== "object" || baseline === null || baseline.kind !== "arc")
|
|
28
29
|
fail("Invalid text baseline; use an arc or omit baseline for horizontal text.");
|
|
29
30
|
if (!Number.isFinite(baseline.radius) || baseline.radius <= 0 || baseline.radius > 10000)
|
|
30
|
-
fail("Arc baseline radius must be positive and at most 10000 mm.");
|
|
31
|
-
if (baseline.
|
|
32
|
-
fail("Arc baseline
|
|
31
|
+
fail("Arc baseline radius must be positive and at most 10000 mm.", Number.isFinite(baseline.radius) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
|
|
32
|
+
if (baseline.centerAngle !== undefined && !Number.isFinite(baseline.centerAngle))
|
|
33
|
+
fail("Arc baseline centerAngle must be finite.", "NON_FINITE_VALUE");
|
|
33
34
|
if (baseline.direction !== undefined &&
|
|
34
35
|
baseline.direction !== "clockwise" &&
|
|
35
36
|
baseline.direction !== "counterclockwise")
|
|
@@ -46,18 +47,18 @@ function normalizeControls(options, staticWeight) {
|
|
|
46
47
|
? undefined
|
|
47
48
|
: {
|
|
48
49
|
radius: baseline.radius,
|
|
49
|
-
|
|
50
|
+
centerAngle: (((baseline.centerAngle ?? 90) % 360) + 360) % 360,
|
|
50
51
|
direction: baseline.direction ?? "clockwise",
|
|
51
52
|
},
|
|
52
53
|
};
|
|
53
54
|
if (!Number.isFinite(controls.fontSize) || controls.fontSize <= 0 || controls.fontSize > 10000)
|
|
54
|
-
fail("fontSize must be positive and at most 10000 mm.");
|
|
55
|
+
fail("fontSize must be positive and at most 10000 mm.", Number.isFinite(controls.fontSize) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
|
|
55
56
|
if (!Number.isInteger(controls.fontWeight) ||
|
|
56
57
|
controls.fontWeight < 1 ||
|
|
57
58
|
controls.fontWeight > 1000)
|
|
58
|
-
fail("fontWeight must be an integer from 1 through 1000.");
|
|
59
|
+
fail("fontWeight must be an integer from 1 through 1000.", Number.isFinite(controls.fontWeight) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
|
|
59
60
|
if (!Number.isFinite(controls.letterSpacing) || Math.abs(controls.letterSpacing) > 100)
|
|
60
|
-
fail("letterSpacing must be finite and between -100 and 100 mm.");
|
|
61
|
+
fail("letterSpacing must be finite and between -100 and 100 mm.", Number.isFinite(controls.letterSpacing) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
|
|
61
62
|
if (controls.align !== "left" && controls.align !== "center" && controls.align !== "right")
|
|
62
63
|
fail("Invalid text alignment.");
|
|
63
64
|
if (controls.verticalAlign !== "baseline" &&
|
|
@@ -69,7 +70,7 @@ function normalizeControls(options, staticWeight) {
|
|
|
69
70
|
fail("Arc text requires baseline vertical alignment.");
|
|
70
71
|
if (controls.lineHeight !== undefined &&
|
|
71
72
|
(!Number.isFinite(controls.lineHeight) || controls.lineHeight < 0.5 || controls.lineHeight > 5))
|
|
72
|
-
fail("lineHeight must be between 0.5 and 5.");
|
|
73
|
+
fail("lineHeight must be between 0.5 and 5.", Number.isFinite(controls.lineHeight) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
|
|
73
74
|
return controls;
|
|
74
75
|
}
|
|
75
76
|
function selectFont(font, weight, staticWeight) {
|
|
@@ -130,8 +131,10 @@ function shapeLines(font, lines, controls) {
|
|
|
130
131
|
// CSS tracking disables optional ligatures, retaining required shaping and combining marks.
|
|
131
132
|
const run = font.layout(line, controls.letterSpacing === 0 ? undefined : { liga: false, clig: false });
|
|
132
133
|
glyphs += run.glyphs.length;
|
|
133
|
-
if (run.glyphs.length !== run.positions.length
|
|
134
|
-
fail("The font returned an invalid
|
|
134
|
+
if (run.glyphs.length !== run.positions.length)
|
|
135
|
+
fail("The font returned an invalid glyph run.");
|
|
136
|
+
if (glyphs > MAX_TEXT_GLYPHS)
|
|
137
|
+
fail("The font returned an excessive glyph run.", "COMPLEXITY_LIMIT");
|
|
135
138
|
let advance = 0;
|
|
136
139
|
let spacingSteps = -1;
|
|
137
140
|
for (let index = 0; index < run.glyphs.length; index++) {
|
|
@@ -139,14 +142,14 @@ function shapeLines(font, lines, controls) {
|
|
|
139
142
|
fail("The selected font shaped a missing glyph.");
|
|
140
143
|
const position = run.positions[index];
|
|
141
144
|
if (![position.xAdvance, position.yAdvance, position.xOffset, position.yOffset].every(Number.isFinite))
|
|
142
|
-
fail("The font returned a non-finite glyph position.");
|
|
145
|
+
fail("The font returned a non-finite glyph position.", "NON_FINITE_VALUE");
|
|
143
146
|
if (index === 0 || position.xAdvance !== 0)
|
|
144
147
|
spacingSteps++;
|
|
145
148
|
advance += position.xAdvance;
|
|
146
149
|
}
|
|
147
150
|
const advanceWidth = advance * scale + Math.max(0, spacingSteps) * controls.letterSpacing;
|
|
148
151
|
if (!Number.isFinite(advanceWidth) || advanceWidth < 0)
|
|
149
|
-
fail("The shaped text advance must be finite and non-negative after letter spacing.");
|
|
152
|
+
fail("The shaped text advance must be finite and non-negative after letter spacing.", Number.isFinite(advanceWidth) ? "INVALID_ARGUMENT" : "NON_FINITE_VALUE");
|
|
150
153
|
return { run, advanceWidth };
|
|
151
154
|
});
|
|
152
155
|
}
|
|
@@ -158,8 +161,10 @@ function convertCommand({ command, args }) {
|
|
|
158
161
|
: command === "bezierCurveTo"
|
|
159
162
|
? 6
|
|
160
163
|
: 2;
|
|
161
|
-
if (args.length !== argumentCount
|
|
164
|
+
if (args.length !== argumentCount)
|
|
162
165
|
fail("The font returned invalid glyph path coordinates.");
|
|
166
|
+
if (!args.every(Number.isFinite))
|
|
167
|
+
fail("The font returned invalid glyph path coordinates.", "NON_FINITE_VALUE");
|
|
163
168
|
switch (command) {
|
|
164
169
|
case "moveTo":
|
|
165
170
|
return { type: SVGPathData.MOVE_TO, relative: false, x: args[0], y: args[1] };
|
|
@@ -234,23 +239,23 @@ function buildLayout(font, fontMetrics, lines, controls) {
|
|
|
234
239
|
const source = run.glyphs[index].path.commands;
|
|
235
240
|
commands += source.length;
|
|
236
241
|
if (commands > MAX_TEXT_COMMANDS)
|
|
237
|
-
fail("Text outlines exceed the supported complexity. Use fewer characters or a simpler font.");
|
|
242
|
+
fail("Text outlines exceed the supported complexity. Use fewer characters or a simpler font.", "COMPLEXITY_LIMIT");
|
|
238
243
|
if (source.length > 0) {
|
|
239
244
|
// Preserve full precision: fontkit's toSVG() rounds before scaling and reparsing it wastes work.
|
|
240
245
|
const path = new SVGPathData(source.map(convertCommand)).transform(SVGPathDataTransformer.MATRIX(scale, 0, 0, scale, (x + position.xOffset) * scale + spacingSteps * controls.letterSpacing + lineX, (y + position.yOffset) * scale - lineIndex * lineHeight));
|
|
241
246
|
let bounds = path.getBounds();
|
|
242
247
|
if (![bounds.minX, bounds.minY, bounds.maxX, bounds.maxY].every(Number.isFinite))
|
|
243
|
-
fail("The font returned invalid glyph outline bounds.");
|
|
248
|
+
fail("The font returned invalid glyph outline bounds.", "NON_FINITE_VALUE");
|
|
244
249
|
if (controls.baseline !== undefined) {
|
|
245
|
-
const { radius,
|
|
250
|
+
const { radius, centerAngle, direction } = controls.baseline;
|
|
246
251
|
const clockwise = direction === "clockwise";
|
|
247
252
|
if (clockwise ? radius + bounds.minY <= 0 : radius - bounds.maxY <= 0)
|
|
248
253
|
fail("Arc glyph outlines cross the circle's center axis. Increase the radius or reduce text size.");
|
|
249
|
-
const
|
|
250
|
-
const
|
|
251
|
-
const cosine = Math.cos(
|
|
252
|
-
const sine = Math.sin(
|
|
253
|
-
path.transform(SVGPathDataTransformer.MATRIX(cosine, sine, -sine, cosine, radius * Math.cos(
|
|
254
|
+
const angleRadians = (centerAngle * Math.PI) / 180 + ((clockwise ? -1 : 1) * groupCenter) / radius;
|
|
255
|
+
const rotationRadians = angleRadians + (clockwise ? -Math.PI / 2 : Math.PI / 2);
|
|
256
|
+
const cosine = Math.cos(rotationRadians);
|
|
257
|
+
const sine = Math.sin(rotationRadians);
|
|
258
|
+
path.transform(SVGPathDataTransformer.MATRIX(cosine, sine, -sine, cosine, radius * Math.cos(angleRadians) - cosine * groupCenter, radius * Math.sin(angleRadians) - sine * groupCenter));
|
|
254
259
|
bounds = path.getBounds();
|
|
255
260
|
}
|
|
256
261
|
minX = Math.min(minX, bounds.minX);
|
|
@@ -278,7 +283,7 @@ function buildLayout(font, fontMetrics, lines, controls) {
|
|
|
278
283
|
// Path commands and finite numeric coordinates are ASCII, so length is the encoded byte count.
|
|
279
284
|
bytes += result.length;
|
|
280
285
|
if (bytes > MAX_TEXT_PATH_BYTES)
|
|
281
|
-
fail("Text outlines exceed 1 MiB. Use fewer characters or a simpler font.");
|
|
286
|
+
fail("Text outlines exceed 1 MiB. Use fewer characters or a simpler font.", "COMPLEXITY_LIMIT");
|
|
282
287
|
return result;
|
|
283
288
|
});
|
|
284
289
|
const metrics = Object.freeze({
|
package/package.json
CHANGED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# ClosestPointOnPathOptions
|
|
2
|
-
|
|
3
|
-
Topology and work ceiling for a closest-point query on a sampled path.
|
|
4
|
-
|
|
5
|
-
## Properties
|
|
6
|
-
|
|
7
|
-
### closed?
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
`readonly` `optional` **closed?**: `boolean`
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Include the last-to-first edge without duplicating the seam point. Defaults to false.
|
|
16
|
-
|
|
17
|
-
***
|
|
18
|
-
|
|
19
|
-
### limits?
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
`readonly` `optional` **limits?**: `Partial`\<[`GeometrySamplingLimits`](GeometrySamplingLimits.md)\>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Explicit path point ceiling; defaults to the package sampling limits.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
## Related APIs
|
|
31
|
-
|
|
32
|
-
- [GeometrySamplingLimits](GeometrySamplingLimits.md)
|
|
33
|
-
|
|
34
|
-
Package: `@metamesh/modeling@0.14.0`.
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# ClosestPointOnPathResult
|
|
2
|
-
|
|
3
|
-
Closest position on a sampled path, measured in millimetres.
|
|
4
|
-
|
|
5
|
-
## Type Parameters
|
|
6
|
-
|
|
7
|
-
### Point
|
|
8
|
-
|
|
9
|
-
`Point` *extends* [`Vector2Tuple`](Vector2Tuple.md) \| [`Vector3Tuple`](Vector3Tuple.md)
|
|
10
|
-
|
|
11
|
-
## Properties
|
|
12
|
-
|
|
13
|
-
### point
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
`readonly` **point**: `Point`
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
Copied position on the selected edge.
|
|
22
|
-
|
|
23
|
-
***
|
|
24
|
-
|
|
25
|
-
### distance
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
`readonly` **distance**: `number`
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
Euclidean distance from the query point to the path.
|
|
34
|
-
|
|
35
|
-
***
|
|
36
|
-
|
|
37
|
-
### edgeIndex
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
`readonly` **edgeIndex**: `number`
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
Zero-based starting vertex of the selected edge. Equal distances keep the first edge.
|
|
46
|
-
|
|
47
|
-
***
|
|
48
|
-
|
|
49
|
-
### fraction
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
`readonly` **fraction**: `number`
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
Clamped interpolation fraction from the edge's start to its end.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
## Related APIs
|
|
61
|
-
|
|
62
|
-
- [Vector2Tuple](Vector2Tuple.md)
|
|
63
|
-
- [Vector3Tuple](Vector3Tuple.md)
|
|
64
|
-
|
|
65
|
-
Package: `@metamesh/modeling@0.14.0`.
|