@metamesh/modeling 0.14.0 → 0.16.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 +61 -0
- package/README.md +55 -13
- package/dist/api/engine.d.ts +15 -7
- package/dist/api/geometry.d.ts +853 -562
- package/dist/api/index.d.ts +604 -227
- package/dist/api/text.d.ts +9 -7
- package/dist/docs/guides/concepts.md +295 -91
- package/dist/docs/guides/fonts.md +9 -8
- package/dist/docs/guides/fundamentals.md +22 -23
- package/dist/docs/guides/generation.md +24 -23
- package/dist/docs/guides/hosting.md +26 -11
- package/dist/docs/guides/recipes.md +74 -48
- package/dist/docs/guides/standalone-model.md +42 -0
- package/dist/docs/manifest.json +1555 -749
- 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 +21 -10
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +6 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +7 -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 +6 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +6 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +11 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +13 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +11 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +2 -1
- package/dist/docs/reference/geometry/Bounds2-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds2Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds2Input.md +21 -0
- package/dist/docs/reference/geometry/Bounds3-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds3Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds3Input.md +21 -0
- package/dist/docs/reference/geometry/BoundsFit2.md +6 -5
- package/dist/docs/reference/geometry/BoundsFit3.md +6 -5
- package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +5 -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 +8 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +5 -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 +6 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +6 -1
- package/dist/docs/reference/geometry/Contour.md +10 -4
- package/dist/docs/reference/geometry/ContourCurve.md +5 -1
- package/dist/docs/reference/geometry/ContourPoint.md +6 -1
- package/dist/docs/reference/geometry/ContourSegment.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +5 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +10 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +10 -6
- package/dist/docs/reference/geometry/Curve2.md +5 -1
- package/dist/docs/reference/geometry/Curve3.md +5 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +9 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +7 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +6 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +7 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +6 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +11 -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 +7 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +10 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +7 -3
- package/dist/docs/reference/geometry/Frame3.md +10 -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 +5 -5
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +5 -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 +5 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +9 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +9 -4
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +9 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +10 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +7 -2
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +4 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +10 -6
- package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +82 -0
- package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +148 -0
- package/dist/docs/reference/geometry/KnuckleHingeInterval.md +46 -0
- package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +51 -0
- package/dist/docs/reference/geometry/KnuckleHingeSpec.md +22 -0
- package/dist/docs/reference/geometry/LineCurve2.md +8 -4
- package/dist/docs/reference/geometry/LineCurve3.md +8 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +8 -4
- package/dist/docs/reference/geometry/LoftOptions.md +5 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +5 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +5 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +5 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +9 -2
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +6 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +6 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +5 -1
- package/dist/docs/reference/geometry/Path2-type.md +196 -0
- package/dist/docs/reference/geometry/Path2Data.md +50 -0
- package/dist/docs/reference/geometry/Path2Input.md +20 -0
- package/dist/docs/reference/geometry/Path3-type.md +196 -0
- package/dist/docs/reference/geometry/Path3Data.md +50 -0
- package/dist/docs/reference/geometry/Path3Input.md +20 -0
- package/dist/docs/reference/geometry/PathFrame.md +9 -5
- package/dist/docs/reference/geometry/PathLocation.md +69 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +10 -5
- package/dist/docs/reference/geometry/PathOptions.md +38 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +8 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +84 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +2 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +2 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +8 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +26 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +5 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +7 -3
- package/dist/docs/reference/geometry/PolygonData.md +7 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -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 +8 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +6 -1
- package/dist/docs/reference/geometry/Profile.md +8 -2
- package/dist/docs/reference/geometry/ProfileComponent2.md +5 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +8 -2
- package/dist/docs/reference/geometry/ProfileSpan2.md +7 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +6 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +10 -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 +7 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +5 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +5 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +7 -3
- package/dist/docs/reference/geometry/RegionData.md +6 -2
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +7 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +13 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +7 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +7 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +8 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +8 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +7 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +5 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +6 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +5 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +7 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/StrokeCap.md +14 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +14 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +11 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +5 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +6 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +19 -15
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +16 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +14 -9
- package/dist/docs/reference/geometry/SweepOptions.md +10 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +11 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +9 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +8 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +8 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +7 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +7 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadRole.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +10 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +7 -3
- package/dist/docs/reference/geometry/ThreadedNutShape.md +8 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +10 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +6 -5
- package/dist/docs/reference/geometry/Transform2Data.md +15 -0
- package/dist/docs/reference/geometry/Transform2Input.md +4 -3
- package/dist/docs/reference/geometry/Transform3-type.md +6 -5
- package/dist/docs/reference/geometry/Transform3Data.md +18 -0
- package/dist/docs/reference/geometry/Transform3Input.md +4 -3
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +9 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +8 -4
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +8 -4
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +8 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +6 -5
- package/dist/docs/reference/geometry/Vector2Data.md +15 -0
- package/dist/docs/reference/geometry/Vector2Input.md +4 -3
- package/dist/docs/reference/geometry/Vector3-type.md +6 -5
- package/dist/docs/reference/geometry/Vector3Data.md +15 -0
- package/dist/docs/reference/geometry/Vector3Input.md +4 -3
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +8 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +5 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +7 -3
- package/dist/docs/reference/geometry/VectorTextOptions.md +5 -1
- package/dist/docs/reference/geometry/add2.md +7 -6
- package/dist/docs/reference/geometry/add3.md +7 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +6 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +10 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +9 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
- package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +16 -15
- package/dist/docs/reference/geometry/bounds2.md +38 -0
- package/dist/docs/reference/geometry/bounds3.md +38 -0
- package/dist/docs/reference/geometry/boundsCenter.md +12 -11
- package/dist/docs/reference/geometry/boundsFromSize.md +12 -11
- package/dist/docs/reference/geometry/boundsSize.md +12 -11
- package/dist/docs/reference/geometry/boxAnchor3.md +7 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +23 -6
- package/dist/docs/reference/geometry/categories/curves-paths.md +27 -13
- package/dist/docs/reference/geometry/categories/mechanical.md +27 -15
- package/dist/docs/reference/geometry/categories/meshes.md +18 -10
- package/dist/docs/reference/geometry/categories/pattern-placement.md +11 -9
- package/dist/docs/reference/geometry/categories/primitive-options.md +10 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -13
- package/dist/docs/reference/geometry/categories/resolution-errors.md +5 -3
- package/dist/docs/reference/geometry/categories/transforms-math.md +25 -16
- package/dist/docs/reference/geometry/categories/vector-import.md +15 -9
- package/dist/docs/reference/geometry/circleContour.md +5 -1
- package/dist/docs/reference/geometry/closeToAxis.md +14 -5
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +5 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +9 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +9 -5
- package/dist/docs/reference/geometry/composeTransform3.md +7 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +14 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +17 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +8 -4
- package/dist/docs/reference/geometry/containsBounds.md +10 -9
- package/dist/docs/reference/geometry/contourContainsPoint.md +8 -4
- package/dist/docs/reference/geometry/cross2.md +6 -5
- package/dist/docs/reference/geometry/cross3.md +7 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +7 -6
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/distance2.md +6 -5
- package/dist/docs/reference/geometry/distance3.md +6 -5
- package/dist/docs/reference/geometry/distributeAlongPath.md +12 -6
- package/dist/docs/reference/geometry/dot2.md +6 -5
- package/dist/docs/reference/geometry/dot3.md +6 -5
- package/dist/docs/reference/geometry/ellipseContour.md +5 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +7 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +12 -8
- package/dist/docs/reference/geometry/fitBounds.md +10 -9
- package/dist/docs/reference/geometry/fitTextLayout.md +13 -5
- package/dist/docs/reference/geometry/frameTransform3.md +5 -4
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +7 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +9 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +9 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +6 -5
- package/dist/docs/reference/geometry/isGeometryError.md +5 -2
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +5 -1
- package/dist/docs/reference/geometry/layoutRow.md +11 -7
- package/dist/docs/reference/geometry/length2.md +5 -4
- package/dist/docs/reference/geometry/length3.md +5 -4
- package/dist/docs/reference/geometry/lerp2.md +7 -6
- package/dist/docs/reference/geometry/lerp3.md +7 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/loftMesh.md +6 -1
- package/dist/docs/reference/geometry/matchProfiles.md +11 -2
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +5 -1
- package/dist/docs/reference/geometry/meshBounds.md +8 -4
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +7 -3
- package/dist/docs/reference/geometry/normalize2.md +10 -6
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +8 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -1
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +15 -11
- package/dist/docs/reference/geometry/path2.md +54 -0
- package/dist/docs/reference/geometry/path3.md +49 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +13 -9
- package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +13 -4
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +15 -4
- package/dist/docs/reference/geometry/preflightSvgRegion.md +15 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +14 -4
- package/dist/docs/reference/geometry/preflightThreadedRod.md +14 -4
- package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- package/dist/docs/reference/geometry/rectangleContour.md +10 -3
- package/dist/docs/reference/geometry/rectangleProfile.md +10 -2
- package/dist/docs/reference/geometry/regionArea.md +5 -1
- package/dist/docs/reference/geometry/regionBounds.md +8 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +9 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +9 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +9 -5
- 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 +5 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +5 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +7 -3
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolveKnuckleHinge.md +59 -0
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +5 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +5 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/revolveMesh.md +14 -10
- package/dist/docs/reference/geometry/rotate2.md +6 -5
- package/dist/docs/reference/geometry/rotationTransform3.md +7 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -6
- package/dist/docs/reference/geometry/sampleContour.md +14 -4
- package/dist/docs/reference/geometry/sampleCurve2.md +8 -5
- package/dist/docs/reference/geometry/sampleCurve3.md +6 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleHelix.md +13 -5
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +17 -7
- package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +6 -2
- package/dist/docs/reference/geometry/scale2.md +6 -5
- package/dist/docs/reference/geometry/scale3.md +6 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +7 -6
- package/dist/docs/reference/geometry/signedContourArea.md +5 -1
- package/dist/docs/reference/geometry/starContour.md +8 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +67 -0
- package/dist/docs/reference/geometry/subtract2.md +7 -6
- package/dist/docs/reference/geometry/subtract3.md +7 -6
- package/dist/docs/reference/geometry/sweepMesh.md +13 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +10 -6
- package/dist/docs/reference/geometry/transform2.md +14 -7
- package/dist/docs/reference/geometry/transform3.md +16 -7
- package/dist/docs/reference/geometry/transformDeterminant3.md +5 -4
- package/dist/docs/reference/geometry/transformRegionData.md +5 -1
- package/dist/docs/reference/geometry/transformTriangleMesh.md +10 -6
- package/dist/docs/reference/geometry/translationTransform3.md +7 -6
- package/dist/docs/reference/geometry/triangulateContour.md +5 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +10 -3
- package/dist/docs/reference/geometry/validateTransform3.md +6 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/vector2.md +10 -2
- package/dist/docs/reference/geometry/vector3.md +10 -2
- package/dist/docs/reference/geometry.md +8 -6
- package/dist/docs/reference/model/Anchor3.md +6 -5
- package/dist/docs/reference/model/AttachOptions.md +11 -5
- package/dist/docs/reference/model/Bounds2-type.md +125 -0
- package/dist/docs/reference/model/Bounds2Data.md +44 -0
- package/dist/docs/reference/model/Bounds2Input.md +19 -0
- package/dist/docs/reference/model/Bounds3-type.md +125 -0
- package/dist/docs/reference/model/Bounds3Data.md +44 -0
- package/dist/docs/reference/model/Bounds3Input.md +19 -0
- 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 +6 -1
- package/dist/docs/reference/model/ComputedValue.md +5 -1
- package/dist/docs/reference/model/Contour.md +6 -4
- 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 +6 -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 +20 -10
- 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 +5 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -1
- package/dist/docs/reference/model/GeneratedPart.md +5 -1
- package/dist/docs/reference/model/GenerationDiagnostic.md +6 -1
- package/dist/docs/reference/model/GenerationError.md +5 -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 +12 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +4 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
- package/dist/docs/reference/model/HullOptions.md +5 -5
- package/dist/docs/reference/model/ImmutableBuffer-type.md +5 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +5 -1
- package/dist/docs/reference/model/ImplicitOptions.md +6 -6
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +5 -4
- package/dist/docs/reference/model/KnuckleHinge-type.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +77 -0
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +34 -0
- package/dist/docs/reference/model/KnuckleHingeOptions.md +38 -0
- package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeSpec.md +18 -0
- package/dist/docs/reference/model/KnuckleHingeWeb.md +53 -0
- package/dist/docs/reference/model/LinearPatternOptions.md +13 -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 +5 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +8 -1
- package/dist/docs/reference/model/PartGeometry.md +5 -1
- package/dist/docs/reference/model/PartOptions.md +5 -1
- package/dist/docs/reference/model/Path2-type.md +196 -0
- package/dist/docs/reference/model/Path2Data.md +50 -0
- package/dist/docs/reference/model/Path2Input.md +20 -0
- package/dist/docs/reference/model/Path3-type.md +196 -0
- package/dist/docs/reference/model/Path3Data.md +50 -0
- package/dist/docs/reference/model/Path3Input.md +20 -0
- package/dist/docs/reference/model/PathLocation.md +69 -0
- package/dist/docs/reference/model/PathNormalGuide.md +6 -5
- package/dist/docs/reference/model/PathOptions.md +38 -0
- package/dist/docs/reference/model/PathPatternOptions.md +4 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +83 -0
- package/dist/docs/reference/model/PatternSource.md +2 -1
- package/dist/docs/reference/model/Pivot2Options.md +2 -1
- package/dist/docs/reference/model/Pivot3Options.md +2 -1
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/PolygonData.md +3 -2
- package/dist/docs/reference/model/PolygonOptions.md +8 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +8 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +42 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +2 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +2 -1
- package/dist/docs/reference/model/Profile.md +4 -2
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +4 -2
- 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 +18 -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/RegionData.md +2 -2
- 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 +20 -12
- package/dist/docs/reference/model/SectionHullOptions.md +5 -5
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- 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 +31 -7
- 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/{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 +2 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +2 -1
- package/dist/docs/reference/model/ThreadHandedness.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +2 -1
- package/dist/docs/reference/model/ThreadProfile.md +4 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +2 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +2 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +5 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +4 -3
- package/dist/docs/reference/model/ThreadedNutShape.md +2 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +5 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +6 -5
- package/dist/docs/reference/model/Transform2Data.md +16 -0
- package/dist/docs/reference/model/Transform2Input.md +4 -3
- package/dist/docs/reference/model/Transform3-type.md +6 -5
- package/dist/docs/reference/model/Transform3Data.md +19 -0
- package/dist/docs/reference/model/Transform3Input.md +4 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +4 -4
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +6 -5
- package/dist/docs/reference/model/{Vector2Tuple.md → Vector2Data.md} +3 -3
- package/dist/docs/reference/model/Vector2Input.md +4 -3
- package/dist/docs/reference/model/Vector3-type.md +6 -5
- package/dist/docs/reference/model/{Vector3Tuple.md → Vector3Data.md} +3 -3
- package/dist/docs/reference/model/Vector3Input.md +4 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +3 -3
- package/dist/docs/reference/model/anchor.md +2 -1
- package/dist/docs/reference/model/bounds2.md +36 -0
- package/dist/docs/reference/model/bounds3.md +36 -0
- 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 +10 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +5 -3
- package/dist/docs/reference/model/categories/bounds.md +36 -0
- package/dist/docs/reference/model/categories/contracts.md +4 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +11 -11
- package/dist/docs/reference/model/categories/explicit-profiles.md +7 -5
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +12 -3
- package/dist/docs/reference/model/categories/generation.md +11 -2
- package/dist/docs/reference/model/categories/hinges.md +38 -0
- package/dist/docs/reference/model/categories/inspection.md +12 -6
- package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
- package/dist/docs/reference/model/categories/paths.md +41 -0
- package/dist/docs/reference/model/categories/primitives.md +10 -4
- package/dist/docs/reference/model/categories/resolution.md +4 -2
- package/dist/docs/reference/model/categories/sections.md +12 -8
- package/dist/docs/reference/model/categories/threads.md +11 -8
- package/dist/docs/reference/model/categories/transforms-placement.md +23 -15
- 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 +5 -1
- package/dist/docs/reference/model/gridPattern.md +5 -4
- package/dist/docs/reference/model/heightfield.md +5 -2
- package/dist/docs/reference/model/hull.md +1 -1
- package/dist/docs/reference/model/immutableBuffer.md +5 -1
- package/dist/docs/reference/model/immutableMesh.md +5 -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 +5 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +1 -1
- package/dist/docs/reference/model/knuckleHinge.md +47 -0
- package/dist/docs/reference/model/linearPattern.md +5 -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 +54 -0
- package/dist/docs/reference/model/path3.md +49 -0
- package/dist/docs/reference/model/pathPattern.md +14 -12
- package/dist/docs/reference/model/polygon.md +8 -5
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +9 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +9 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +9 -3
- package/dist/docs/reference/model/radialPattern.md +6 -37
- package/dist/docs/reference/model/rectangle.md +7 -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 +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 +3 -2
- package/dist/docs/reference/model/threadedNut.md +5 -4
- package/dist/docs/reference/model/threadedRod.md +5 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +14 -7
- package/dist/docs/reference/model/transform3.md +16 -7
- 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 +10 -2
- package/dist/docs/reference/model/vector3.md +10 -2
- package/dist/docs/reference/model.md +17 -9
- package/dist/docs/reference/text/Bounds2Data.md +34 -0
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Data.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 +3 -3
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +8 -6
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +4 -2
- 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/knuckle-hinge-operation.js +85 -0
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/mechanical-operations.js +3 -1
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/modeling-context.js +8 -1
- 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 +10 -2
- 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 +27 -27
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/bounds-value.js +93 -0
- package/dist/geometry/bounds.js +10 -8
- package/dist/geometry/curves/sampling.js +15 -16
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/errors.js +1 -0
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/heightfield.js +12 -1
- package/dist/geometry/index.js +12 -11
- 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/math/vector-value.js +11 -3
- package/dist/geometry/math/vector2.js +1 -0
- package/dist/geometry/math/vector3.js +1 -0
- package/dist/geometry/mechanical/gear-motion.js +3 -3
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +4 -3
- package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
- 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 +11 -7
- 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 +31 -6
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-centroid.js +1 -0
- 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 +8 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +8 -19
- package/dist/geometry/paths/frames.js +42 -11
- package/dist/geometry/paths/helix.js +17 -6
- package/dist/geometry/paths/path-value.js +268 -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 +5 -3
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/profiles/contour.js +7 -6
- package/dist/geometry/profiles/matched.js +5 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +14 -5
- package/dist/geometry/profiles/side-profile.js +9 -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 +31 -25
- 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/text-fitting.js +1 -0
- package/dist/geometry/transform-geometry.js +7 -14
- package/dist/geometry/transform-matrix.js +1 -1
- package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
- package/dist/index.js +3 -1
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +62 -10
- package/dist/model/knuckle-hinge.js +1 -0
- package/dist/model/operations.js +79 -26
- package/dist/model/recipe-declaration.js +21 -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/Bounds2.md +0 -39
- package/dist/docs/reference/geometry/Bounds3.md +0 -39
- 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/Transform2Matrix.md +0 -14
- package/dist/docs/reference/geometry/Transform3Matrix.md +0 -17
- package/dist/docs/reference/geometry/Vector2Tuple.md +0 -14
- package/dist/docs/reference/geometry/Vector3Tuple.md +0 -14
- 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/Bounds2.md +0 -39
- package/dist/docs/reference/model/Bounds3.md +0 -39
- package/dist/docs/reference/model/Path2.md +0 -20
- package/dist/docs/reference/model/Transform2Matrix.md +0 -15
- package/dist/docs/reference/model/Transform3Matrix.md +0 -18
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Bounds2.md +0 -34
- package/dist/docs/reference/text/Vector2Tuple.md +0 -7
- 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)
|
|
@@ -156,16 +185,15 @@ export function compareGenerationValues(left, right) {
|
|
|
156
185
|
return compare(left, right);
|
|
157
186
|
}
|
|
158
187
|
function mathValueData(value) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
throw new TypeError("Immutable math values must expose their canonical numeric data.");
|
|
188
|
+
const method = Reflect.get(value, "toData");
|
|
189
|
+
if (typeof method !== "function")
|
|
190
|
+
throw new TypeError("Immutable math values must expose canonical data through toData().");
|
|
191
|
+
return Reflect.apply(method, value, []);
|
|
165
192
|
}
|
|
166
193
|
function captureValue(value, mode, readerAllowed = () => false, validated) {
|
|
167
194
|
const recipeInputs = mode === "recipe";
|
|
168
195
|
const seen = new Map();
|
|
196
|
+
const metadata = new Map();
|
|
169
197
|
const copy = (input) => {
|
|
170
198
|
if (typeof input === "function" && !recipeInputs && !readerAllowed(input))
|
|
171
199
|
throw new GeometryError("INVALID_ARGUMENT", "Computed values and dependencies cannot contain arbitrary function closures.", { operation: "computed" });
|
|
@@ -191,20 +219,42 @@ function captureValue(value, mode, readerAllowed = () => false, validated) {
|
|
|
191
219
|
if (input instanceof ArrayBuffer)
|
|
192
220
|
throw new TypeError(mutableBufferMessage);
|
|
193
221
|
const entries = generationDataEntries(input, recipeInputs);
|
|
222
|
+
let bytes = 0;
|
|
223
|
+
const children = [];
|
|
224
|
+
const recordField = (key, field) => {
|
|
225
|
+
bytes += 16 + key.length * 2;
|
|
226
|
+
if (typeof field === "object" && field !== null)
|
|
227
|
+
children.push(field);
|
|
228
|
+
else
|
|
229
|
+
bytes += scalarBytes(field);
|
|
230
|
+
};
|
|
194
231
|
if (mode === "dependency") {
|
|
195
232
|
if (!Object.isFrozen(input))
|
|
196
233
|
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
234
|
seen.set(input, input);
|
|
198
|
-
for (const [, field] of entries)
|
|
235
|
+
for (const [key, field] of entries) {
|
|
199
236
|
copy(field);
|
|
237
|
+
recordField(key, field);
|
|
238
|
+
}
|
|
239
|
+
metadata.set(input, {
|
|
240
|
+
bytes,
|
|
241
|
+
children: children.length ? Object.freeze(children) : noChildren,
|
|
242
|
+
});
|
|
200
243
|
return input;
|
|
201
244
|
}
|
|
202
245
|
const result = Array.isArray(input)
|
|
203
246
|
? new Array(input.length)
|
|
204
247
|
: Object.create(Object.getPrototypeOf(input) === null ? null : Object.prototype);
|
|
205
248
|
seen.set(input, result);
|
|
206
|
-
for (const [key, field] of entries)
|
|
207
|
-
|
|
249
|
+
for (const [key, field] of entries) {
|
|
250
|
+
const value = copy(field);
|
|
251
|
+
Object.defineProperty(result, key, { value, enumerable: true });
|
|
252
|
+
recordField(key, value);
|
|
253
|
+
}
|
|
254
|
+
metadata.set(result, {
|
|
255
|
+
bytes,
|
|
256
|
+
children: children.length ? Object.freeze(children) : noChildren,
|
|
257
|
+
});
|
|
208
258
|
return Object.freeze(result);
|
|
209
259
|
};
|
|
210
260
|
const result = copy(value);
|
|
@@ -212,6 +262,8 @@ function captureValue(value, mode, readerAllowed = () => false, validated) {
|
|
|
212
262
|
if (mode === "dependency")
|
|
213
263
|
for (const input of seen.keys())
|
|
214
264
|
validated?.add(input);
|
|
265
|
+
for (const [value, entry] of metadata)
|
|
266
|
+
capturedMetadata.set(value, entry);
|
|
215
267
|
return result;
|
|
216
268
|
}
|
|
217
269
|
/** Validates while capturing immutable data; only explicitly allowed session readers may be functions. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
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
|
*
|
|
@@ -157,6 +153,7 @@ export function anchor(shape, name) {
|
|
|
157
153
|
}
|
|
158
154
|
/**
|
|
159
155
|
* Fills one closed millimetre XY outline, explicit outer/hole topology, or compound contours.
|
|
156
|
+
*
|
|
160
157
|
* Closing edges are implicit. Compound contours use nonzero fill unless selected otherwise.
|
|
161
158
|
* Explicit topology must be simple and disjoint; compound winding may resolve overlaps.
|
|
162
159
|
*
|
|
@@ -171,7 +168,7 @@ export function polygon(input) {
|
|
|
171
168
|
/**
|
|
172
169
|
* Creates a centered-width native Section along a sampled XY path.
|
|
173
170
|
*
|
|
174
|
-
* Shares caps, joins and physical sampling with Geometry's
|
|
171
|
+
* Shares caps, joins and physical sampling with Geometry's strokeRegionData. Native union
|
|
175
172
|
* resolves overlapping stroke primitives. Session resolution and resource ceilings apply;
|
|
176
173
|
* closed paths omit the duplicated seam. Returns an immutable deferred recipe.
|
|
177
174
|
*
|
|
@@ -186,6 +183,9 @@ export function stroke(path, options) {
|
|
|
186
183
|
/**
|
|
187
184
|
* Filled rectangular section with uniform or independently treated corners.
|
|
188
185
|
*
|
|
186
|
+
* Use [rectangleContour](/docs/reference/geometry/rectangleContour) for sampled boundary coordinates,
|
|
187
|
+
* or [rectangleProfile](/docs/reference/geometry/rectangleProfile) to retain identified loft landmarks.
|
|
188
|
+
*
|
|
189
189
|
* @example Round the corners
|
|
190
190
|
* ```ts
|
|
191
191
|
* rectangle({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
|
|
@@ -266,7 +266,7 @@ export function extrude(shape, options) {
|
|
|
266
266
|
*
|
|
267
267
|
* // Contour coordinates are [radius, Z].
|
|
268
268
|
* const [profile] = matchProfiles([rectangleProfile({ size: [4, 16], center: false })]);
|
|
269
|
-
* revolve(profile!, {
|
|
269
|
+
* revolve(profile!, { degrees: 270 });
|
|
270
270
|
* ```
|
|
271
271
|
*/
|
|
272
272
|
export function revolve(shape, options) {
|
|
@@ -276,7 +276,10 @@ export function revolve(shape, options) {
|
|
|
276
276
|
export function loft(stations, options) {
|
|
277
277
|
return invoke("loft", [stations, options]);
|
|
278
278
|
}
|
|
279
|
-
/**
|
|
279
|
+
/**
|
|
280
|
+
* Matches a profile family using operation settings over host resolution and limits.
|
|
281
|
+
* Requires active synchronous model execution. Use Geometry's matchProfiles for standalone preparation.
|
|
282
|
+
*/
|
|
280
283
|
export function matchProfiles(profiles, options) {
|
|
281
284
|
return invoke("matchProfiles", [profiles, options]);
|
|
282
285
|
}
|
|
@@ -359,8 +362,8 @@ export function distance(solid, other) {
|
|
|
359
362
|
return invoke("distance", [solid, other]);
|
|
360
363
|
}
|
|
361
364
|
/** Copies intersections along the finite directed origin-to-endpoint segment. */
|
|
362
|
-
export function
|
|
363
|
-
return invoke("
|
|
365
|
+
export function castSegment(solid, origin, endpoint) {
|
|
366
|
+
return invoke("castSegment", [solid, origin, endpoint]);
|
|
364
367
|
}
|
|
365
368
|
export function components(shape) {
|
|
366
369
|
return invoke("components", [shape]);
|
|
@@ -374,6 +377,7 @@ export function implicit(options) {
|
|
|
374
377
|
}
|
|
375
378
|
/**
|
|
376
379
|
* Closed rectilinear top above a flat base, with uniform or explicit XY coordinates.
|
|
380
|
+
*
|
|
377
381
|
* Samples each grid height once; center-error triangulation also samples each cell centre.
|
|
378
382
|
* The retained callback must capture independent immutable inputs, not live session readers or parameters.
|
|
379
383
|
*
|
|
@@ -388,31 +392,56 @@ export function implicit(options) {
|
|
|
388
392
|
export function heightfield(options) {
|
|
389
393
|
return invoke("heightfield", [options]);
|
|
390
394
|
}
|
|
391
|
-
export function linearPattern(
|
|
392
|
-
return invoke("linearPattern",
|
|
395
|
+
export function linearPattern(...args) {
|
|
396
|
+
return invoke("linearPattern", args);
|
|
393
397
|
}
|
|
394
|
-
export function radialPattern(
|
|
395
|
-
return invoke("radialPattern",
|
|
398
|
+
export function radialPattern(...args) {
|
|
399
|
+
return invoke("radialPattern", args);
|
|
396
400
|
}
|
|
397
|
-
export function gridPattern(
|
|
398
|
-
return invoke("gridPattern",
|
|
401
|
+
export function gridPattern(...args) {
|
|
402
|
+
return invoke("gridPattern", args);
|
|
399
403
|
}
|
|
400
|
-
export function pathPattern(
|
|
401
|
-
return invoke("pathPattern",
|
|
404
|
+
export function pathPattern(...args) {
|
|
405
|
+
return invoke("pathPattern", args);
|
|
402
406
|
}
|
|
403
407
|
/** Helical ridge mesh construction. */
|
|
404
408
|
export function threadRidge(options) {
|
|
405
409
|
return invoke("threadRidge", [options]);
|
|
406
410
|
}
|
|
411
|
+
/**
|
|
412
|
+
* Declares separate knuckle-joint halves along the centered +X pin axis, in millimetres.
|
|
413
|
+
*
|
|
414
|
+
* A starts at negative X. Attach independent webs or use barrels only; caller geometry connects
|
|
415
|
+
* otherwise disconnected intervals. Returns portable recipes without initializing the engine.
|
|
416
|
+
* Unspecified resolution inherits the evaluating session. Axis direction is +X with +Z up.
|
|
417
|
+
*
|
|
418
|
+
* Barrel end chamfers affect outer rims only; webs have square edges. Consumers own plates, screw holes,
|
|
419
|
+
* pin retention, fit policy, and part placement. Added mounting material must preserve the bores.
|
|
420
|
+
* No opening range or collision freedom is implied for arbitrary caller attachments.
|
|
421
|
+
* Compiled Generator packages using this operation require runtime 8.0.0 or newer in major 8.
|
|
422
|
+
*
|
|
423
|
+
* @example Integral-pin hinge with two mounting webs
|
|
424
|
+
* ```ts
|
|
425
|
+
* const joint = knuckleHinge({
|
|
426
|
+
* mode: "print-in-place", length: 30, knuckleCount: 3,
|
|
427
|
+
* barrelDiameter: 10, pinDiameter: 3, radialClearance: 0.3, axialGap: 0.4,
|
|
428
|
+
* halfA: { web: { direction: "positive-y", reach: 8, zMin: -5, thickness: 2 } },
|
|
429
|
+
* halfB: { web: { direction: "negative-y", reach: 8, zMin: -5, thickness: 2 } },
|
|
430
|
+
* });
|
|
431
|
+
* ```
|
|
432
|
+
*/
|
|
433
|
+
export function knuckleHinge(options) {
|
|
434
|
+
return invoke("knuckleHinge", [options]);
|
|
435
|
+
}
|
|
407
436
|
/**
|
|
408
437
|
* Compensated external threaded rod.
|
|
409
438
|
*
|
|
410
439
|
* @example Threaded rod
|
|
411
440
|
* ```ts
|
|
412
441
|
* import { threadedRod } from "@metamesh/modeling";
|
|
413
|
-
* import {
|
|
442
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
414
443
|
*
|
|
415
|
-
* const profile =
|
|
444
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
416
445
|
* threadedRod({ nominalMajorDiameter: 12, length: 24, profile, fit: "normal" });
|
|
417
446
|
* ```
|
|
418
447
|
*/
|
|
@@ -425,8 +454,8 @@ export function threadedRod(options) {
|
|
|
425
454
|
* @example Internal thread
|
|
426
455
|
* ```ts
|
|
427
456
|
* import { cylinder, internalThreadCutter } from "@metamesh/modeling";
|
|
428
|
-
* import {
|
|
429
|
-
* const profile =
|
|
457
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
458
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
430
459
|
* const body = cylinder({ diameter: 20, height: 12, center: false });
|
|
431
460
|
* const cutter = internalThreadCutter({ nominalMajorDiameter: 12, length: 12, profile });
|
|
432
461
|
* body.subtract([cutter]);
|
|
@@ -441,24 +470,48 @@ export function internalThreadCutter(options) {
|
|
|
441
470
|
* @example Threaded nut
|
|
442
471
|
* ```ts
|
|
443
472
|
* import { threadedNut } from "@metamesh/modeling";
|
|
444
|
-
* import {
|
|
473
|
+
* import { threadProfile } from "@metamesh/modeling/geometry";
|
|
445
474
|
*
|
|
446
|
-
* const profile =
|
|
475
|
+
* const profile = threadProfile({ kind: "triangular", pitch: 1.75 });
|
|
447
476
|
* threadedNut({ nominalMajorDiameter: 12, thickness: 8, width: 20, shape: "hex", profile, fit: "normal" });
|
|
448
477
|
* ```
|
|
449
478
|
*/
|
|
450
479
|
export function threadedNut(options) {
|
|
451
480
|
return invoke("threadedNut", [options]);
|
|
452
481
|
}
|
|
453
|
-
/**
|
|
482
|
+
/**
|
|
483
|
+
* Checks compensated rod dimensions and conservative mesh estimates against host output limits.
|
|
484
|
+
*
|
|
485
|
+
* Requires active synchronous model execution and uses its resolution and limits. Returns selected
|
|
486
|
+
* sampling and conservative row/triangle estimates without mesh buffers or native objects.
|
|
487
|
+
* Mesh validity, native construction, and aggregate output limits are checked later.
|
|
488
|
+
*
|
|
489
|
+
* @see {@link threadedRod}
|
|
490
|
+
*/
|
|
454
491
|
export function preflightThreadedRod(options) {
|
|
455
492
|
return invoke("preflightThreadedRod", [options]);
|
|
456
493
|
}
|
|
457
|
-
/**
|
|
494
|
+
/**
|
|
495
|
+
* Checks compensated cutter dimensions and conservative mesh estimates against host output limits.
|
|
496
|
+
*
|
|
497
|
+
* Requires active synchronous model execution and uses its resolution and limits. Estimates include
|
|
498
|
+
* the one-pitch extension beyond each requested face, without mesh buffers or native objects.
|
|
499
|
+
* Mesh validity, native construction, and aggregate output limits are checked later.
|
|
500
|
+
*
|
|
501
|
+
* @see {@link internalThreadCutter}
|
|
502
|
+
*/
|
|
458
503
|
export function preflightInternalThreadCutter(options) {
|
|
459
504
|
return invoke("preflightInternalThreadCutter", [options]);
|
|
460
505
|
}
|
|
461
|
-
/**
|
|
506
|
+
/**
|
|
507
|
+
* Checks nut dimensions, chamfers, end-face wall, and the extended compensated cutter's allocation plan.
|
|
508
|
+
*
|
|
509
|
+
* Requires active synchronous model execution and uses its resolution and limits, without mesh
|
|
510
|
+
* buffers or native objects. Returned thread estimates cover the cutter, excluding the body and
|
|
511
|
+
* Boolean result. Mesh validity, native construction, and aggregate output limits are checked later.
|
|
512
|
+
*
|
|
513
|
+
* @see {@link threadedNut}
|
|
514
|
+
*/
|
|
462
515
|
export function preflightThreadedNut(options) {
|
|
463
516
|
return invoke("preflightThreadedNut", [options]);
|
|
464
517
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../geometry/errors.js";
|
|
2
|
+
import { knuckleHingeAxis } from "../geometry/mechanical/knuckle-hinge.js";
|
|
2
3
|
import { defaultModelingLimits } from "../geometry/model-limits.js";
|
|
3
4
|
import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../geometry/patterns/placements.js";
|
|
4
5
|
import { restrictTransform3 } from "../geometry/transform2.js";
|
|
@@ -21,11 +22,12 @@ const operationBehaviors = {
|
|
|
21
22
|
compose: "solid",
|
|
22
23
|
minkowskiSum: "solid",
|
|
23
24
|
solidFromMesh: "solid",
|
|
24
|
-
|
|
25
|
+
withTolerance: "solid",
|
|
25
26
|
threadRidge: "solid",
|
|
26
27
|
threadedRod: "solid",
|
|
27
28
|
threadedNut: "solid",
|
|
28
29
|
internalThreadCutter: "solid",
|
|
30
|
+
knuckleHinge: "joint",
|
|
29
31
|
polygon: "section",
|
|
30
32
|
stroke: "section",
|
|
31
33
|
rectangle: "section",
|
|
@@ -57,7 +59,7 @@ const operationBehaviors = {
|
|
|
57
59
|
inspectSolid: "observation",
|
|
58
60
|
isEmpty: "observation",
|
|
59
61
|
distance: "observation",
|
|
60
|
-
|
|
62
|
+
castSegment: "observation",
|
|
61
63
|
anchor: "observation",
|
|
62
64
|
matchProfiles: "observation",
|
|
63
65
|
preflightThreadedRod: "observation",
|
|
@@ -101,6 +103,12 @@ export function declareRecipeOperation(operation, resolution, supplied, declarat
|
|
|
101
103
|
kind: resultKind(behavior, args[0]),
|
|
102
104
|
call,
|
|
103
105
|
};
|
|
106
|
+
if (behavior === "joint")
|
|
107
|
+
return Object.freeze({
|
|
108
|
+
halfA: recordGeometryRecipe({ ...recipe, index: "halfA" }, declaration.dispatch),
|
|
109
|
+
halfB: recordGeometryRecipe({ ...recipe, index: "halfB" }, declaration.dispatch),
|
|
110
|
+
axis: knuckleHingeAxis,
|
|
111
|
+
});
|
|
104
112
|
if (behavior === "split")
|
|
105
113
|
return Object.freeze([
|
|
106
114
|
recordGeometryRecipe({ ...recipe, index: 0 }, declaration.dispatch),
|
|
@@ -144,13 +152,19 @@ function inputKind(value) {
|
|
|
144
152
|
return recipe.kind;
|
|
145
153
|
if ("sections" in value)
|
|
146
154
|
return "section";
|
|
147
|
-
if ("points" in value &&
|
|
148
|
-
Array.isArray(value.points) &&
|
|
149
|
-
Array.isArray(value.points[0]) &&
|
|
150
|
-
value.points[0].length === 2)
|
|
155
|
+
if ("points" in value && Array.isArray(value.points) && pointDimension(value.points[0]) === 2)
|
|
151
156
|
return "section";
|
|
152
157
|
return "solid";
|
|
153
158
|
}
|
|
159
|
+
function pointDimension(value) {
|
|
160
|
+
if (Array.isArray(value))
|
|
161
|
+
return value.length;
|
|
162
|
+
if (typeof value !== "object" || value === null || !("toData" in value))
|
|
163
|
+
return undefined;
|
|
164
|
+
const method = value.toData;
|
|
165
|
+
const points = typeof method === "function" ? Reflect.apply(method, value, []) : undefined;
|
|
166
|
+
return Array.isArray(points) ? points.length : undefined;
|
|
167
|
+
}
|
|
154
168
|
/** Runs every factory during declaration; each placed copy stays deferred until it is used. */
|
|
155
169
|
function declarePattern(operation, resolution, supplied, declaration) {
|
|
156
170
|
const plan = patternPlan(operation, supplied, declaration.limits);
|
|
@@ -171,7 +185,7 @@ function declarePattern(operation, resolution, supplied, declaration) {
|
|
|
171
185
|
operation,
|
|
172
186
|
});
|
|
173
187
|
kind = currentKind;
|
|
174
|
-
const matrix = plan.transformAt(index);
|
|
188
|
+
const matrix = plan.transformAt(index, kind === "section" ? 2 : 3);
|
|
175
189
|
copies.push(declareRecipeOperation("transform", resolution, [shape, kind === "section" ? restrictTransform3(matrix) : matrix], declaration));
|
|
176
190
|
}
|
|
177
191
|
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({
|