@metamesh/modeling 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +67 -9
- package/dist/api/engine.d.ts +14 -7
- package/dist/api/geometry.d.ts +787 -447
- package/dist/api/index.d.ts +637 -250
- package/dist/api/text.d.ts +6 -4
- package/dist/docs/guides/concepts.md +135 -17
- package/dist/docs/guides/fonts.md +8 -0
- package/dist/docs/guides/fundamentals.md +8 -3
- package/dist/docs/guides/generation.md +6 -4
- package/dist/docs/guides/hosting.md +27 -14
- package/dist/docs/guides/recipes.md +82 -11
- package/dist/docs/manifest.json +1911 -856
- package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
- package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
- package/dist/docs/reference/engine/GenerationOptions.md +1 -1
- package/dist/docs/reference/engine/GeometryResource.md +1 -1
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +1 -1
- package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +20 -9
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +4 -4
- package/dist/docs/reference/engine/categories/host-lifecycle.md +2 -2
- package/dist/docs/reference/engine/createModelEngine.md +3 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine/validateModel.md +1 -1
- package/dist/docs/reference/engine.md +2 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +17 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +9 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +7 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +9 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +14 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +6 -1
- package/dist/docs/reference/geometry/Bounds2.md +4 -4
- package/dist/docs/reference/geometry/Bounds3.md +4 -4
- package/dist/docs/reference/geometry/BoundsFit2.md +3 -3
- package/dist/docs/reference/geometry/BoundsFit3.md +3 -3
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +8 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +10 -10
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +107 -0
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +3 -3
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +6 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +6 -6
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -6
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
- package/dist/docs/reference/geometry/Frame3.md +6 -6
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +14 -5
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +6 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +7 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
- package/dist/docs/reference/geometry/LineCurve2.md +4 -4
- package/dist/docs/reference/geometry/LineCurve3.md +4 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +4 -4
- package/dist/docs/reference/geometry/LoftOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
- package/dist/docs/reference/geometry/Path2-type.md +192 -0
- package/dist/docs/reference/geometry/Path2Data.md +14 -0
- package/dist/docs/reference/geometry/Path2Input.md +15 -0
- package/dist/docs/reference/geometry/Path3-type.md +192 -0
- package/dist/docs/reference/geometry/Path3Data.md +14 -0
- package/dist/docs/reference/geometry/Path3Input.md +15 -0
- package/dist/docs/reference/geometry/PathFrame.md +5 -5
- package/dist/docs/reference/geometry/PathLocation.md +65 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +6 -5
- package/dist/docs/reference/geometry/PathOptions.md +34 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +4 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
- package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +3 -3
- package/dist/docs/reference/geometry/{Polygon.md → PolygonData.md} +2 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +4 -4
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/Profile.md +1 -1
- package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
- package/dist/docs/reference/geometry/ProfileSpan2.md +3 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +5 -5
- package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +14 -0
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +9 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +4 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +4 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +3 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/StrokeCap.md +7 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +7 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +8 -8
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +3 -3
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +13 -13
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +11 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +9 -9
- package/dist/docs/reference/geometry/SweepOptions.md +6 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +3 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadRole.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +6 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +6 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +255 -0
- package/dist/docs/reference/geometry/Transform2Input.md +19 -0
- package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
- package/dist/docs/reference/geometry/Transform3-type.md +295 -0
- package/dist/docs/reference/geometry/Transform3Input.md +19 -0
- package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +269 -0
- package/dist/docs/reference/geometry/Vector2Input.md +19 -0
- package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
- package/dist/docs/reference/geometry/Vector3-type.md +281 -0
- package/dist/docs/reference/geometry/Vector3Input.md +19 -0
- package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
- package/dist/docs/reference/geometry/add2.md +36 -0
- package/dist/docs/reference/geometry/add3.md +10 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +2 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +13 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +11 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +11 -7
- package/dist/docs/reference/geometry/attachmentTransform3.md +77 -0
- package/dist/docs/reference/geometry/boundsCenter.md +7 -7
- package/dist/docs/reference/geometry/boundsFromSize.md +7 -7
- package/dist/docs/reference/geometry/boundsSize.md +7 -7
- package/dist/docs/reference/geometry/boxAnchor3.md +10 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +15 -10
- package/dist/docs/reference/geometry/categories/mechanical.md +6 -6
- package/dist/docs/reference/geometry/categories/meshes.md +3 -4
- package/dist/docs/reference/geometry/categories/pattern-placement.md +7 -7
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +5 -6
- package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -2
- package/dist/docs/reference/geometry/categories/transforms-math.md +41 -12
- package/dist/docs/reference/geometry/categories/vector-import.md +5 -5
- package/dist/docs/reference/geometry/circleContour.md +1 -1
- package/dist/docs/reference/geometry/closeToAxis.md +4 -4
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -5
- package/dist/docs/reference/geometry/composeTransform3.md +10 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +10 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +4 -4
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +4 -4
- package/dist/docs/reference/geometry/containsBounds.md +1 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +4 -4
- package/dist/docs/reference/geometry/cross2.md +36 -0
- package/dist/docs/reference/geometry/cross3.md +10 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -6
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +36 -0
- package/dist/docs/reference/geometry/distance3.md +36 -0
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
- package/dist/docs/reference/geometry/dot2.md +36 -0
- package/dist/docs/reference/geometry/dot3.md +9 -5
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +10 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +8 -8
- package/dist/docs/reference/geometry/fitBounds.md +1 -1
- package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
- package/dist/docs/reference/geometry/frameTransform3.md +8 -4
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +3 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +5 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +5 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +9 -5
- package/dist/docs/reference/geometry/isGeometryError.md +1 -1
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
- package/dist/docs/reference/geometry/layoutRow.md +4 -4
- package/dist/docs/reference/geometry/length2.md +30 -0
- package/dist/docs/reference/geometry/length3.md +8 -4
- package/dist/docs/reference/geometry/lerp2.md +42 -0
- package/dist/docs/reference/geometry/lerp3.md +10 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/loftMesh.md +2 -1
- package/dist/docs/reference/geometry/matchProfiles.md +1 -1
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +3 -2
- package/dist/docs/reference/geometry/meshBounds.md +1 -1
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +3 -3
- package/dist/docs/reference/geometry/normalize2.md +36 -0
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +4 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -5
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -5
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +11 -11
- package/dist/docs/reference/geometry/path2.md +42 -0
- package/dist/docs/reference/geometry/path3.md +42 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -8
- package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +3 -3
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
- package/dist/docs/reference/geometry/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/geometry/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/geometry/projectOntoPlane3.md +10 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- package/dist/docs/reference/geometry/rectangleContour.md +2 -2
- package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
- package/dist/docs/reference/geometry/regionArea.md +4 -4
- package/dist/docs/reference/geometry/regionBounds.md +4 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +5 -5
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +8 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +6 -6
- package/dist/docs/reference/geometry/resolveCircularSegments.md +6 -5
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +6 -6
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/revolveMesh.md +10 -10
- package/dist/docs/reference/geometry/rotate2.md +36 -0
- package/dist/docs/reference/geometry/rotationTransform3.md +10 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -6
- package/dist/docs/reference/geometry/sampleContour.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve2.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +2 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleHelix.md +5 -5
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +4 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +6 -6
- package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +2 -2
- package/dist/docs/reference/geometry/scale2.md +36 -0
- package/dist/docs/reference/geometry/scale3.md +9 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +10 -6
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +4 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
- package/dist/docs/reference/geometry/subtract2.md +36 -0
- package/dist/docs/reference/geometry/subtract3.md +10 -6
- package/dist/docs/reference/geometry/sweepMesh.md +9 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +6 -6
- package/dist/docs/reference/geometry/transform2.md +38 -0
- package/dist/docs/reference/geometry/transform3.md +38 -0
- package/dist/docs/reference/geometry/transformDeterminant3.md +8 -4
- package/dist/docs/reference/geometry/transformRegionData.md +40 -0
- package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
- package/dist/docs/reference/geometry/translationTransform3.md +10 -6
- package/dist/docs/reference/geometry/triangulateContour.md +1 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +2 -2
- package/dist/docs/reference/geometry/validateTransform3.md +9 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +31 -0
- package/dist/docs/reference/geometry/vector3.md +38 -0
- package/dist/docs/reference/geometry.md +3 -3
- package/dist/docs/reference/model/Anchor3.md +5 -5
- package/dist/docs/reference/model/AttachOptions.md +10 -5
- package/dist/docs/reference/model/Bounds2.md +4 -4
- package/dist/docs/reference/model/Bounds3.md +4 -4
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +10 -10
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +1 -1
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +3 -3
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CylinderOptions.md +3 -3
- package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +3 -3
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/model/FinalizedModel.md +18 -8
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +6 -6
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -5
- package/dist/docs/reference/model/GeneratedPart.md +6 -6
- package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
- package/dist/docs/reference/model/GenerationError.md +1 -1
- package/dist/docs/reference/model/GeometryResolution.md +5 -5
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +11 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +3 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/model/HullOptions.md +7 -7
- package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
- package/dist/docs/reference/model/ImplicitOptions.md +4 -4
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +4 -4
- package/dist/docs/reference/model/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +1 -1
- package/dist/docs/reference/model/LoftPlacement.md +1 -1
- package/dist/docs/reference/model/LoftStation.md +4 -4
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +1 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +1 -1
- package/dist/docs/reference/model/PartGeometry.md +1 -1
- package/dist/docs/reference/model/PartOptions.md +6 -6
- package/dist/docs/reference/model/Path2-type.md +192 -0
- package/dist/docs/reference/model/Path2Data.md +14 -0
- package/dist/docs/reference/model/Path2Input.md +15 -0
- package/dist/docs/reference/model/Path3-type.md +192 -0
- package/dist/docs/reference/model/Path3Data.md +14 -0
- package/dist/docs/reference/model/Path3Input.md +15 -0
- package/dist/docs/reference/model/PathLocation.md +65 -0
- package/dist/docs/reference/model/PathNormalGuide.md +6 -5
- package/dist/docs/reference/model/PathOptions.md +34 -0
- package/dist/docs/reference/model/PathPatternOptions.md +3 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +79 -0
- package/dist/docs/reference/model/PatternSource.md +2 -2
- package/dist/docs/reference/model/Pivot2Options.md +27 -0
- package/dist/docs/reference/model/Pivot3Options.md +27 -0
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/{Polygon-type.md → PolygonData.md} +2 -2
- package/dist/docs/reference/model/PolygonOptions.md +85 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +7 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +41 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/model/Profile.md +1 -1
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +1 -1
- package/dist/docs/reference/model/ProfileSpan2.md +3 -3
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/model/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +10 -10
- package/dist/docs/reference/model/{Region.md → RegionData.md} +4 -4
- package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
- package/dist/docs/reference/model/RevolveOptions.md +9 -4
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +81 -40
- package/dist/docs/reference/model/SectionHullOptions.md +7 -7
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- package/dist/docs/reference/model/{RegionOffsetJoin.md → SectionOffsetJoin.md} +3 -3
- package/dist/docs/reference/model/{RegionOffsetOptions.md → SectionOffsetOptions.md} +4 -4
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +66 -26
- package/dist/docs/reference/model/SolidInspection.md +7 -7
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/StrokeCap.md +16 -0
- package/dist/docs/reference/model/StrokeJoin.md +16 -0
- package/dist/docs/reference/model/StrokeOptions.md +91 -0
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
- package/dist/docs/reference/model/SweepOptions.md +6 -6
- package/dist/docs/reference/model/SweepOrientation.md +7 -7
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/model/ThreadHandedness.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/model/ThreadProfile.md +3 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +4 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +4 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +256 -0
- package/dist/docs/reference/model/Transform2Input.md +20 -0
- package/dist/docs/reference/model/Transform2Matrix.md +15 -0
- package/dist/docs/reference/model/Transform3-type.md +296 -0
- package/dist/docs/reference/model/Transform3Input.md +20 -0
- package/dist/docs/reference/model/{Transform3.md → Transform3Matrix.md} +3 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +270 -0
- package/dist/docs/reference/model/Vector2Input.md +20 -0
- package/dist/docs/reference/model/{Vector2.md → Vector2Tuple.md} +3 -3
- package/dist/docs/reference/model/Vector3-type.md +282 -0
- package/dist/docs/reference/model/Vector3Input.md +20 -0
- package/dist/docs/reference/model/{Vector3.md → Vector3Tuple.md} +3 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/anchor.md +1 -1
- package/dist/docs/reference/model/box.md +4 -4
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +4 -4
- package/dist/docs/reference/model/categories/bounded-surfaces.md +3 -3
- package/dist/docs/reference/model/categories/contracts.md +2 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +5 -5
- package/dist/docs/reference/model/categories/explicit-profiles.md +3 -3
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +2 -2
- package/dist/docs/reference/model/categories/generation.md +1 -1
- package/dist/docs/reference/model/categories/inspection.md +7 -8
- package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
- package/dist/docs/reference/model/categories/paths.md +33 -0
- package/dist/docs/reference/model/categories/primitives.md +3 -3
- package/dist/docs/reference/model/categories/resolution.md +2 -2
- package/dist/docs/reference/model/categories/sections.md +10 -8
- package/dist/docs/reference/model/categories/threads.md +5 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +27 -13
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +10 -7
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +2 -2
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +3 -3
- package/dist/docs/reference/model/generate.md +1 -1
- package/dist/docs/reference/model/gridPattern.md +4 -4
- package/dist/docs/reference/model/heightfield.md +2 -2
- package/dist/docs/reference/model/hull.md +2 -2
- package/dist/docs/reference/model/immutableBuffer.md +1 -1
- package/dist/docs/reference/model/immutableMesh.md +1 -1
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +4 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +2 -2
- package/dist/docs/reference/model/linearPattern.md +4 -4
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +2 -2
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +42 -0
- package/dist/docs/reference/model/path3.md +42 -0
- package/dist/docs/reference/model/pathPattern.md +13 -12
- package/dist/docs/reference/model/polygon.md +4 -4
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/model/radialPattern.md +5 -37
- package/dist/docs/reference/model/rectangle.md +4 -4
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +74 -0
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +1 -1
- package/dist/docs/reference/model/sweep.md +7 -7
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +2 -2
- package/dist/docs/reference/model/threadedNut.md +4 -4
- package/dist/docs/reference/model/threadedRod.md +4 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +39 -0
- package/dist/docs/reference/model/transform3.md +39 -0
- package/dist/docs/reference/model/tube.md +3 -3
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +32 -0
- package/dist/docs/reference/model/vector3.md +39 -0
- package/dist/docs/reference/model.md +9 -8
- package/dist/docs/reference/text/Bounds2.md +4 -4
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +2 -2
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +4 -4
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +1 -1
- package/dist/engine/construction-operations.js +31 -14
- package/dist/engine/deferred-context.js +11 -181
- package/dist/engine/execution.js +39 -8
- package/dist/engine/extrusion-finishing.js +1 -1
- package/dist/engine/index.js +6 -1
- package/dist/engine/inspection-operations.js +13 -11
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/native/material-components.js +305 -0
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/native/threads.js +3 -3
- package/dist/engine/native/transforms.js +11 -8
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +3 -3
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-anchors.js +17 -17
- package/dist/engine/primitive-operations.js +1 -1
- package/dist/engine/primitive-profiles.js +8 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +35 -21
- package/dist/engine/section-operations.js +52 -11
- package/dist/engine/session-graph.js +1 -1
- package/dist/engine/session-native.js +1 -1
- package/dist/engine/session-snapshot.js +17 -6
- package/dist/engine/session.js +13 -8
- package/dist/engine/shape-anchors.js +5 -11
- package/dist/engine/transform-operations.js +66 -49
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/curves/sampling.js +14 -14
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/index.js +13 -10
- package/dist/geometry/loft/loft-simple-mesh.js +6 -6
- package/dist/geometry/loft/loft.js +22 -13
- package/dist/geometry/math/immutable-value.js +20 -0
- package/dist/geometry/math/vector-value.js +168 -0
- package/dist/geometry/math/vector2.js +80 -0
- package/dist/geometry/math/vector3.js +37 -7
- package/dist/geometry/mechanical/gear-motion.js +8 -5
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +3 -3
- package/dist/geometry/mechanical/standards.js +1 -1
- package/dist/geometry/mechanical/thread-helices.js +2 -3
- package/dist/geometry/mechanical/thread-mesh-plan.js +4 -5
- package/dist/geometry/mechanical/thread-mesh.js +7 -7
- package/dist/geometry/mechanical/thread-profiles.js +5 -5
- package/dist/geometry/mechanical/thread-solids.js +2 -2
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-planar.js +25 -27
- package/dist/geometry/mesh/mesh-quality.js +5 -5
- package/dist/geometry/mesh/mesh-signature.js +13 -13
- package/dist/geometry/mesh/mesh-solid-intersections.js +5 -1
- package/dist/geometry/mesh/mesh-solid.js +7 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +63 -0
- package/dist/geometry/paths/frames.js +44 -14
- package/dist/geometry/paths/helix.js +16 -6
- package/dist/geometry/paths/path-value.js +252 -0
- package/dist/geometry/paths/planar.js +36 -23
- package/dist/geometry/paths/resampling.js +27 -5
- package/dist/geometry/patterns/placements.js +100 -27
- package/dist/geometry/patterns.js +2 -2
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/primitive-resolution.js +4 -1
- package/dist/geometry/profiles/contour.js +6 -6
- package/dist/geometry/profiles/matched.js +4 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +4 -4
- package/dist/geometry/profiles/side-profile.js +7 -7
- package/dist/geometry/profiles/span-sampling.js +1 -1
- package/dist/geometry/resolution.js +51 -39
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +57 -68
- package/dist/geometry/svg/fill.js +7 -21
- package/dist/geometry/svg-import.js +23 -23
- package/dist/geometry/sweeps/options.js +5 -4
- package/dist/geometry/sweeps/orientation.js +5 -5
- package/dist/geometry/sweeps/stations.js +14 -14
- package/dist/geometry/sweeps/sweep-closed.js +5 -5
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +4 -4
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/transform-chain.js +172 -0
- package/dist/geometry/transform-geometry.js +27 -30
- package/dist/geometry/transform-matrix.js +14 -0
- package/dist/geometry/transform2.js +60 -0
- package/dist/geometry/transform3.js +70 -26
- package/dist/index.js +4 -0
- package/dist/model/execution-binding.js +10 -5
- package/dist/model/geometry-recipes.js +15 -0
- package/dist/{engine → model}/immutable-generation-data.js +88 -6
- package/dist/model/operation-dispatch.js +10 -3
- package/dist/model/operations.js +45 -35
- package/dist/model/recipe-declaration.js +199 -0
- package/dist/model/shape-handles.js +17 -5
- package/dist/text/index.js +15 -9
- package/dist/text/vector-text-layout.js +31 -26
- package/package.json +1 -1
- package/dist/docs/reference/geometry/Path2.md +0 -14
- package/dist/docs/reference/geometry/Path3.md +0 -14
- package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
- package/dist/docs/reference/geometry/Region.md +0 -14
- package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/Transform3.md +0 -12
- package/dist/docs/reference/geometry/Vector2.md +0 -7
- package/dist/docs/reference/geometry/Vector3.md +0 -7
- package/dist/docs/reference/geometry/attachTransform.md +0 -73
- package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
- package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
- package/dist/docs/reference/geometry/pathLength.md +0 -33
- package/dist/docs/reference/geometry/rotateAroundAxis3.md +0 -38
- package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
- package/dist/docs/reference/geometry/transformContour.md +0 -42
- package/dist/docs/reference/geometry/transformPath2.md +0 -40
- package/dist/docs/reference/geometry/transformPath3.md +0 -33
- package/dist/docs/reference/geometry/transformRegion.md +0 -40
- package/dist/docs/reference/model/Transform2.md +0 -15
- package/dist/docs/reference/model/fromRegion.md +0 -33
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toRegion.md +0 -33
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Vector2.md +0 -7
- package/dist/engine/geometry-recipes.js +0 -12
- package/dist/engine/pattern-transform.js +0 -9
- package/dist/geometry/paths/path.js +0 -32
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
|
*
|
|
@@ -168,13 +164,20 @@ export function anchor(shape, name) {
|
|
|
168
164
|
export function polygon(input) {
|
|
169
165
|
return invoke("polygon", [input]);
|
|
170
166
|
}
|
|
171
|
-
/**
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
167
|
+
/**
|
|
168
|
+
* Creates a centered-width native Section along a sampled XY path.
|
|
169
|
+
*
|
|
170
|
+
* Shares caps, joins and physical sampling with Geometry's strokeRegionData. Native union
|
|
171
|
+
* resolves overlapping stroke primitives. Session resolution and resource ceilings apply;
|
|
172
|
+
* closed paths omit the duplicated seam. Returns an immutable deferred recipe.
|
|
173
|
+
*
|
|
174
|
+
* @example Extrude a rounded track
|
|
175
|
+
* ```ts
|
|
176
|
+
* stroke([[0, 0], [20, 0], [20, 10]], { width: 3, join: "round", cap: "round" }).extrude({ height: 2 });
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export function stroke(path, options) {
|
|
180
|
+
return invoke("stroke", [path, options]);
|
|
178
181
|
}
|
|
179
182
|
/**
|
|
180
183
|
* Filled rectangular section with uniform or independently treated corners.
|
|
@@ -259,7 +262,7 @@ export function extrude(shape, options) {
|
|
|
259
262
|
*
|
|
260
263
|
* // Contour coordinates are [radius, Z].
|
|
261
264
|
* const [profile] = matchProfiles([rectangleProfile({ size: [4, 16], center: false })]);
|
|
262
|
-
* revolve(profile!, {
|
|
265
|
+
* revolve(profile!, { degrees: 270 });
|
|
263
266
|
* ```
|
|
264
267
|
*/
|
|
265
268
|
export function revolve(shape, options) {
|
|
@@ -269,7 +272,10 @@ export function revolve(shape, options) {
|
|
|
269
272
|
export function loft(stations, options) {
|
|
270
273
|
return invoke("loft", [stations, options]);
|
|
271
274
|
}
|
|
272
|
-
/**
|
|
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
|
+
*/
|
|
273
279
|
export function matchProfiles(profiles, options) {
|
|
274
280
|
return invoke("matchProfiles", [profiles, options]);
|
|
275
281
|
}
|
|
@@ -317,7 +323,7 @@ export function inspectSolid(solid) {
|
|
|
317
323
|
return invoke("inspectSolid", [solid]);
|
|
318
324
|
}
|
|
319
325
|
/**
|
|
320
|
-
* Checks whether a
|
|
326
|
+
* Checks whether a solid or filled section contains no geometry during host execution.
|
|
321
327
|
*
|
|
322
328
|
* Accepts a 3D Solid or 2D Section handle, not a finalized model or raw triangle mesh.
|
|
323
329
|
* Useful after a Boolean operation whose inputs may not overlap; no mesh is extracted.
|
|
@@ -339,7 +345,7 @@ export function isEmpty(shape) {
|
|
|
339
345
|
* Uses actual geometry, not bounding-box separation or distance between object origins.
|
|
340
346
|
* Contact or overlapping material returns zero, including one solid inside another.
|
|
341
347
|
* The kernel's search range is managed internally; the result is not capped at a caller limit.
|
|
342
|
-
* Empty
|
|
348
|
+
* Empty geometry and component selections from another session reject. Results follow native numeric precision.
|
|
343
349
|
*
|
|
344
350
|
* @example Measure the gap between two blocks
|
|
345
351
|
* ```ts
|
|
@@ -352,19 +358,23 @@ export function distance(solid, other) {
|
|
|
352
358
|
return invoke("distance", [solid, other]);
|
|
353
359
|
}
|
|
354
360
|
/** Copies intersections along the finite directed origin-to-endpoint segment. */
|
|
355
|
-
export function
|
|
356
|
-
return invoke("
|
|
361
|
+
export function castSegment(solid, origin, endpoint) {
|
|
362
|
+
return invoke("castSegment", [solid, origin, endpoint]);
|
|
357
363
|
}
|
|
358
364
|
export function components(shape) {
|
|
359
365
|
return invoke("components", [shape]);
|
|
360
366
|
}
|
|
361
|
-
/**
|
|
367
|
+
/**
|
|
368
|
+
* Bounded positive-inside implicit field constructor.
|
|
369
|
+
* The retained callback must capture independent immutable inputs, not live session readers or parameters.
|
|
370
|
+
*/
|
|
362
371
|
export function implicit(options) {
|
|
363
372
|
return invoke("implicit", [options]);
|
|
364
373
|
}
|
|
365
374
|
/**
|
|
366
375
|
* Closed rectilinear top above a flat base, with uniform or explicit XY coordinates.
|
|
367
376
|
* Samples each grid height once; center-error triangulation also samples each cell centre.
|
|
377
|
+
* The retained callback must capture independent immutable inputs, not live session readers or parameters.
|
|
368
378
|
*
|
|
369
379
|
* @example Heightfield
|
|
370
380
|
* ```ts
|
|
@@ -377,17 +387,17 @@ export function implicit(options) {
|
|
|
377
387
|
export function heightfield(options) {
|
|
378
388
|
return invoke("heightfield", [options]);
|
|
379
389
|
}
|
|
380
|
-
export function linearPattern(
|
|
381
|
-
return invoke("linearPattern",
|
|
390
|
+
export function linearPattern(...args) {
|
|
391
|
+
return invoke("linearPattern", args);
|
|
382
392
|
}
|
|
383
|
-
export function radialPattern(
|
|
384
|
-
return invoke("radialPattern",
|
|
393
|
+
export function radialPattern(...args) {
|
|
394
|
+
return invoke("radialPattern", args);
|
|
385
395
|
}
|
|
386
|
-
export function gridPattern(
|
|
387
|
-
return invoke("gridPattern",
|
|
396
|
+
export function gridPattern(...args) {
|
|
397
|
+
return invoke("gridPattern", args);
|
|
388
398
|
}
|
|
389
|
-
export function pathPattern(
|
|
390
|
-
return invoke("pathPattern",
|
|
399
|
+
export function pathPattern(...args) {
|
|
400
|
+
return invoke("pathPattern", args);
|
|
391
401
|
}
|
|
392
402
|
/** Helical ridge mesh construction. */
|
|
393
403
|
export function threadRidge(options) {
|
|
@@ -399,9 +409,9 @@ export function threadRidge(options) {
|
|
|
399
409
|
* @example Threaded rod
|
|
400
410
|
* ```ts
|
|
401
411
|
* import { threadedRod } from "@metamesh/modeling";
|
|
402
|
-
* import {
|
|
412
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
403
413
|
*
|
|
404
|
-
* const profile =
|
|
414
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
405
415
|
* threadedRod({ nominalMajorDiameter: 12, length: 24, profile, fit: "normal" });
|
|
406
416
|
* ```
|
|
407
417
|
*/
|
|
@@ -414,8 +424,8 @@ export function threadedRod(options) {
|
|
|
414
424
|
* @example Internal thread
|
|
415
425
|
* ```ts
|
|
416
426
|
* import { cylinder, internalThreadCutter } from "@metamesh/modeling";
|
|
417
|
-
* import {
|
|
418
|
-
* const profile =
|
|
427
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
428
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
419
429
|
* const body = cylinder({ diameter: 20, height: 12, center: false });
|
|
420
430
|
* const cutter = internalThreadCutter({ nominalMajorDiameter: 12, length: 12, profile });
|
|
421
431
|
* body.subtract([cutter]);
|
|
@@ -430,24 +440,24 @@ export function internalThreadCutter(options) {
|
|
|
430
440
|
* @example Threaded nut
|
|
431
441
|
* ```ts
|
|
432
442
|
* import { threadedNut } from "@metamesh/modeling";
|
|
433
|
-
* import {
|
|
443
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
434
444
|
*
|
|
435
|
-
* const profile =
|
|
445
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
436
446
|
* threadedNut({ nominalMajorDiameter: 12, thickness: 8, width: 20, shape: "hex", profile, fit: "normal" });
|
|
437
447
|
* ```
|
|
438
448
|
*/
|
|
439
449
|
export function threadedNut(options) {
|
|
440
450
|
return invoke("threadedNut", [options]);
|
|
441
451
|
}
|
|
442
|
-
/**
|
|
452
|
+
/** External-thread facts using host resolution and limits; requires active synchronous model execution. */
|
|
443
453
|
export function preflightThreadedRod(options) {
|
|
444
454
|
return invoke("preflightThreadedRod", [options]);
|
|
445
455
|
}
|
|
446
|
-
/**
|
|
456
|
+
/** Internal-thread facts using host resolution and limits; requires active synchronous model execution. */
|
|
447
457
|
export function preflightInternalThreadCutter(options) {
|
|
448
458
|
return invoke("preflightInternalThreadCutter", [options]);
|
|
449
459
|
}
|
|
450
|
-
/**
|
|
460
|
+
/** Nut/cutter facts using host resolution and limits; requires active synchronous model execution. */
|
|
451
461
|
export function preflightThreadedNut(options) {
|
|
452
462
|
return invoke("preflightThreadedNut", [options]);
|
|
453
463
|
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { GeometryError } from "../geometry/errors.js";
|
|
2
|
+
import { defaultModelingLimits } from "../geometry/model-limits.js";
|
|
3
|
+
import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../geometry/patterns/placements.js";
|
|
4
|
+
import { restrictTransform3 } from "../geometry/transform2.js";
|
|
5
|
+
import { geometryRecipe, recordGeometryRecipe, } from "./geometry-recipes.js";
|
|
6
|
+
import { captureRecipeInputs } from "./immutable-generation-data.js";
|
|
7
|
+
// Every public operation must explicitly choose its realization and result behavior.
|
|
8
|
+
const operationBehaviors = {
|
|
9
|
+
withResolution: "resolution",
|
|
10
|
+
box: "solid",
|
|
11
|
+
cylinder: "solid",
|
|
12
|
+
tube: "solid",
|
|
13
|
+
sphere: "solid",
|
|
14
|
+
torus: "solid",
|
|
15
|
+
heightfield: "solid",
|
|
16
|
+
implicit: "solid",
|
|
17
|
+
extrude: "solid",
|
|
18
|
+
revolve: "solid",
|
|
19
|
+
loft: "solid",
|
|
20
|
+
sweep: "solid",
|
|
21
|
+
compose: "solid",
|
|
22
|
+
minkowskiSum: "solid",
|
|
23
|
+
solidFromMesh: "solid",
|
|
24
|
+
withTolerance: "solid",
|
|
25
|
+
threadRidge: "solid",
|
|
26
|
+
threadedRod: "solid",
|
|
27
|
+
threadedNut: "solid",
|
|
28
|
+
internalThreadCutter: "solid",
|
|
29
|
+
polygon: "section",
|
|
30
|
+
stroke: "section",
|
|
31
|
+
rectangle: "section",
|
|
32
|
+
circle: "section",
|
|
33
|
+
ellipse: "section",
|
|
34
|
+
regularPolygon: "section",
|
|
35
|
+
star: "section",
|
|
36
|
+
projectSection: "section",
|
|
37
|
+
sliceSection: "section",
|
|
38
|
+
textSection: "section",
|
|
39
|
+
svgSection: "section",
|
|
40
|
+
svgPathSection: "section",
|
|
41
|
+
translate: "preserve",
|
|
42
|
+
rotate: "preserve",
|
|
43
|
+
scale: "preserve",
|
|
44
|
+
mirror: "preserve",
|
|
45
|
+
transform: "preserve",
|
|
46
|
+
offset: "preserve",
|
|
47
|
+
simplify: "preserve",
|
|
48
|
+
withAnchors: "preserve",
|
|
49
|
+
attach: "preserve",
|
|
50
|
+
union: "preserve",
|
|
51
|
+
intersect: "preserve",
|
|
52
|
+
subtract: "preserve",
|
|
53
|
+
hull: "preserve",
|
|
54
|
+
toTriangleMesh: "observation",
|
|
55
|
+
toRegionData: "observation",
|
|
56
|
+
inspectSection: "observation",
|
|
57
|
+
inspectSolid: "observation",
|
|
58
|
+
isEmpty: "observation",
|
|
59
|
+
distance: "observation",
|
|
60
|
+
castSegment: "observation",
|
|
61
|
+
anchor: "observation",
|
|
62
|
+
matchProfiles: "observation",
|
|
63
|
+
preflightThreadedRod: "observation",
|
|
64
|
+
preflightInternalThreadCutter: "observation",
|
|
65
|
+
preflightThreadedNut: "observation",
|
|
66
|
+
split: "split",
|
|
67
|
+
splitByPlane: "split",
|
|
68
|
+
components: "components",
|
|
69
|
+
linearPattern: "pattern",
|
|
70
|
+
radialPattern: "pattern",
|
|
71
|
+
gridPattern: "pattern",
|
|
72
|
+
pathPattern: "pattern",
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Creates the shared declaration surface for portable recipes or one active revision.
|
|
76
|
+
* Handles retain captured inputs; native results remain private to the host realization owner.
|
|
77
|
+
*/
|
|
78
|
+
export function createRecipeContext(resolution, declaration) {
|
|
79
|
+
return Object.freeze(Object.fromEntries(Object.keys(operationBehaviors).map((key) => [
|
|
80
|
+
key,
|
|
81
|
+
(...supplied) => declareRecipeOperation(key, resolution, supplied, declaration),
|
|
82
|
+
])));
|
|
83
|
+
}
|
|
84
|
+
/** Captures and validates inputs before deciding whether an operation needs native geometry now. */
|
|
85
|
+
export function declareRecipeOperation(operation, resolution, supplied, declaration) {
|
|
86
|
+
declaration.assertActive?.();
|
|
87
|
+
const behavior = operationBehaviors[operation];
|
|
88
|
+
if (behavior === "observation" || behavior === "components")
|
|
89
|
+
requireRealization(declaration, operation);
|
|
90
|
+
if (behavior === "resolution") {
|
|
91
|
+
const nextResolution = Object.freeze({ ...resolution, ...supplied[0] });
|
|
92
|
+
return createRecipeContext(nextResolution, declaration);
|
|
93
|
+
}
|
|
94
|
+
if (behavior === "pattern")
|
|
95
|
+
return declarePattern(operation, resolution, supplied, declaration);
|
|
96
|
+
const args = captureRecipeInputs(supplied);
|
|
97
|
+
const call = { method: operation, args, resolution };
|
|
98
|
+
if (behavior === "observation")
|
|
99
|
+
return requireRealization(declaration, operation).invoke(call);
|
|
100
|
+
const recipe = {
|
|
101
|
+
kind: resultKind(behavior, args[0]),
|
|
102
|
+
call,
|
|
103
|
+
};
|
|
104
|
+
if (behavior === "split")
|
|
105
|
+
return Object.freeze([
|
|
106
|
+
recordGeometryRecipe({ ...recipe, index: 0 }, declaration.dispatch),
|
|
107
|
+
recordGeometryRecipe({ ...recipe, index: 1 }, declaration.dispatch),
|
|
108
|
+
]);
|
|
109
|
+
if (behavior === "components") {
|
|
110
|
+
// Cardinality and ordering are observations of this session's sampled geometry.
|
|
111
|
+
// Retain native precision rather than baking the selected component through mesh interchange.
|
|
112
|
+
const realization = requireRealization(declaration, operation);
|
|
113
|
+
const values = realization.evaluate(call);
|
|
114
|
+
return Object.freeze(values.map((_value, index) => recordGeometryRecipe({ ...recipe, index, observedSession: realization.session }, declaration.dispatch)));
|
|
115
|
+
}
|
|
116
|
+
return recordGeometryRecipe(recipe, declaration.dispatch);
|
|
117
|
+
}
|
|
118
|
+
/** Declares a portable recipe without resolving an engine, resolution or session identity. */
|
|
119
|
+
export function declarePortableOperation(operation, args, dispatch) {
|
|
120
|
+
return declareRecipeOperation(operation, undefined, args, {
|
|
121
|
+
limits: defaultModelingLimits,
|
|
122
|
+
dispatch,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function requireRealization(declaration, operation) {
|
|
126
|
+
if (declaration.realization === undefined)
|
|
127
|
+
throw new GeometryError("INVALID_ARGUMENT", "Geometry observations require an active model execution.", { operation });
|
|
128
|
+
return declaration.realization;
|
|
129
|
+
}
|
|
130
|
+
function resultKind(behavior, input) {
|
|
131
|
+
if (behavior === "section")
|
|
132
|
+
return "section";
|
|
133
|
+
if (behavior === "preserve" || behavior === "components")
|
|
134
|
+
return inputKind(input);
|
|
135
|
+
return "solid";
|
|
136
|
+
}
|
|
137
|
+
function inputKind(value) {
|
|
138
|
+
if (Array.isArray(value))
|
|
139
|
+
return inputKind(value[0]);
|
|
140
|
+
if (typeof value !== "object" || value === null)
|
|
141
|
+
return "solid";
|
|
142
|
+
const recipe = geometryRecipe(value);
|
|
143
|
+
if (recipe !== undefined)
|
|
144
|
+
return recipe.kind;
|
|
145
|
+
if ("sections" in value)
|
|
146
|
+
return "section";
|
|
147
|
+
if ("points" in value && Array.isArray(value.points) && pointDimension(value.points[0]) === 2)
|
|
148
|
+
return "section";
|
|
149
|
+
return "solid";
|
|
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
|
+
}
|
|
160
|
+
/** Runs every factory during declaration; each placed copy stays deferred until it is used. */
|
|
161
|
+
function declarePattern(operation, resolution, supplied, declaration) {
|
|
162
|
+
const plan = patternPlan(operation, supplied, declaration.limits);
|
|
163
|
+
if (plan.count > declaration.limits.maxVertices)
|
|
164
|
+
throw new GeometryError("COMPLEXITY_LIMIT", "Pattern declaration exceeds execution limits.", {
|
|
165
|
+
operation,
|
|
166
|
+
});
|
|
167
|
+
const source = supplied[0];
|
|
168
|
+
const copies = [];
|
|
169
|
+
let kind;
|
|
170
|
+
for (let index = 0; index < plan.count; index++) {
|
|
171
|
+
const shape = typeof source === "function"
|
|
172
|
+
? source(index)
|
|
173
|
+
: source;
|
|
174
|
+
const currentKind = inputKind(shape);
|
|
175
|
+
if (kind !== undefined && kind !== currentKind)
|
|
176
|
+
throw new GeometryError("INVALID_ARGUMENT", "Pattern factories must return one shape dimension.", {
|
|
177
|
+
operation,
|
|
178
|
+
});
|
|
179
|
+
kind = currentKind;
|
|
180
|
+
const matrix = plan.transformAt(index, kind === "section" ? 2 : 3);
|
|
181
|
+
copies.push(declareRecipeOperation("transform", resolution, [shape, kind === "section" ? restrictTransform3(matrix) : matrix], declaration));
|
|
182
|
+
}
|
|
183
|
+
return Object.freeze(copies);
|
|
184
|
+
}
|
|
185
|
+
function patternPlan(operation, supplied, limits) {
|
|
186
|
+
const options = supplied[1];
|
|
187
|
+
switch (operation) {
|
|
188
|
+
case "linearPattern":
|
|
189
|
+
return linearPatternPlan(options);
|
|
190
|
+
case "radialPattern":
|
|
191
|
+
return radialPatternPlan(options);
|
|
192
|
+
case "gridPattern":
|
|
193
|
+
return gridPatternPlan(options);
|
|
194
|
+
case "pathPattern":
|
|
195
|
+
return pathPatternPlan(options, supplied[2], limits);
|
|
196
|
+
default:
|
|
197
|
+
throw new Error(`Operation ${operation} does not declare a pattern.`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { currentModelContext } from "./execution-binding.js";
|
|
2
|
+
const dispatchers = new WeakMap();
|
|
2
3
|
// Resolve the current transaction on every call: cached recipes outlive the revision that
|
|
3
4
|
// created them. Neither instances nor these shared methods retain an execution or native value.
|
|
4
5
|
function forward(name) {
|
|
5
6
|
return function (...args) {
|
|
7
|
+
const dispatch = dispatchers.get(this);
|
|
8
|
+
if (dispatch !== undefined)
|
|
9
|
+
return dispatch(name, [this, ...args]);
|
|
6
10
|
const context = currentModelContext(name);
|
|
7
11
|
return Reflect.apply(context[name], undefined, [this, ...args]);
|
|
8
12
|
};
|
|
@@ -22,23 +26,31 @@ const common = {
|
|
|
22
26
|
};
|
|
23
27
|
const solidPrototype = prototype({
|
|
24
28
|
...common,
|
|
29
|
+
toTriangleMesh: forward("toTriangleMesh"),
|
|
25
30
|
attach: forward("attach"),
|
|
26
|
-
|
|
31
|
+
withTolerance: forward("withTolerance"),
|
|
27
32
|
projectSection: forward("projectSection"),
|
|
28
33
|
sliceSection: forward("sliceSection"),
|
|
29
34
|
});
|
|
30
35
|
const sectionPrototype = prototype({
|
|
31
36
|
...common,
|
|
37
|
+
toRegionData: forward("toRegionData"),
|
|
32
38
|
offset: forward("offset"),
|
|
33
39
|
extrude: forward("extrude"),
|
|
34
40
|
revolve: forward("revolve"),
|
|
35
41
|
sweep: forward("sweep"),
|
|
36
42
|
});
|
|
37
43
|
/** Creates only the immutable public facade; the caller owns its private geometry identity. */
|
|
38
|
-
export function createSolidHandle() {
|
|
39
|
-
|
|
44
|
+
export function createSolidHandle(dispatch, properties) {
|
|
45
|
+
const handle = Object.freeze(Object.create(solidPrototype, properties ?? {}));
|
|
46
|
+
if (dispatch !== undefined)
|
|
47
|
+
dispatchers.set(handle, dispatch);
|
|
48
|
+
return handle;
|
|
40
49
|
}
|
|
41
50
|
/** Creates only the immutable public facade; the caller owns its private geometry identity. */
|
|
42
|
-
export function createSectionHandle() {
|
|
43
|
-
|
|
51
|
+
export function createSectionHandle(dispatch, properties) {
|
|
52
|
+
const handle = Object.freeze(Object.create(sectionPrototype, properties ?? {}));
|
|
53
|
+
if (dispatch !== undefined)
|
|
54
|
+
dispatchers.set(handle, dispatch);
|
|
55
|
+
return handle;
|
|
44
56
|
}
|
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({
|