@metamesh/modeling 0.15.0 → 0.17.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 +59 -0
- package/README.md +54 -6
- package/dist/api/engine.d.ts +4 -3
- package/dist/api/geometry.d.ts +608 -266
- package/dist/api/index.d.ts +516 -110
- package/dist/api/text.d.ts +6 -6
- package/dist/docs/guides/concepts.md +298 -106
- package/dist/docs/guides/fonts.md +9 -8
- package/dist/docs/guides/fundamentals.md +17 -21
- package/dist/docs/guides/generation.md +24 -23
- package/dist/docs/guides/hosting.md +25 -20
- package/dist/docs/guides/recipes.md +68 -36
- package/dist/docs/guides/standalone-model.md +42 -0
- package/dist/docs/manifest.json +1034 -296
- 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 +1 -1
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +2 -2
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +7 -4
- package/dist/docs/reference/engine/categories/host-lifecycle.md +8 -3
- package/dist/docs/reference/engine/createModelEngine.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/Anchor3-type.md +6 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +7 -3
- package/dist/docs/reference/geometry/ArcCurve3.md +9 -5
- package/dist/docs/reference/geometry/AttachOptions.md +2 -1
- 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/Bounds2Options.md +72 -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/Bounds3Options.md +72 -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/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 +3 -3
- 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 +1 -1
- package/dist/docs/reference/geometry/CircularSampling.md +41 -0
- package/dist/docs/reference/geometry/CircularSamplingOptions.md +14 -0
- 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 +5 -1
- 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 +4 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +6 -1
- 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 +5 -1
- 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 +6 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -1
- 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 +1 -1
- 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 +4 -4
- 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 +5 -1
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +5 -1
- 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 +5 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +5 -1
- 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 +12 -8
- package/dist/docs/reference/geometry/Path2Data.md +40 -4
- package/dist/docs/reference/geometry/Path2Input.md +8 -3
- package/dist/docs/reference/geometry/Path3-type.md +12 -8
- package/dist/docs/reference/geometry/Path3Data.md +40 -4
- package/dist/docs/reference/geometry/Path3Input.md +8 -3
- package/dist/docs/reference/geometry/PathFrame.md +9 -5
- package/dist/docs/reference/geometry/PathLocation.md +5 -1
- package/dist/docs/reference/geometry/PathNormalGuide.md +8 -4
- package/dist/docs/reference/geometry/PathOptions.md +5 -1
- package/dist/docs/reference/geometry/PathPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/PathPlacement.md +8 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +5 -1
- 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 +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +1 -1
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +1 -1
- 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 +6 -1
- package/dist/docs/reference/geometry/RadialPatternOptions.md +1 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/SphereOptions.md +1 -1
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/StrokeCap.md +8 -1
- package/dist/docs/reference/geometry/StrokeJoin.md +8 -1
- package/dist/docs/reference/geometry/StrokeOptions.md +5 -1
- package/dist/docs/reference/geometry/SvgImportOptions.md +20 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +21 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +7 -3
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +6 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +6 -1
- package/dist/docs/reference/geometry/SweepOptions.md +5 -1
- package/dist/docs/reference/geometry/SweepOrientation.md +5 -1
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
- package/dist/docs/reference/geometry/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 +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/TorusOptions.md +1 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +7 -3
- 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 +5 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +6 -1
- 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 +1 -1
- 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 +6 -1
- package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +7 -3
- 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 +5 -1
- package/dist/docs/reference/geometry/anchor3.md +2 -1
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -1
- package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
- package/dist/docs/reference/geometry/attachmentTransform3.md +5 -4
- package/dist/docs/reference/geometry/bounds2.md +39 -0
- package/dist/docs/reference/geometry/bounds3.md +39 -0
- package/dist/docs/reference/geometry/boundsCenter.md +12 -11
- package/dist/docs/reference/geometry/boundsSize.md +12 -11
- package/dist/docs/reference/geometry/boxAnchor3.md +4 -3
- package/dist/docs/reference/geometry/categories/bounds-layout.md +25 -9
- package/dist/docs/reference/geometry/categories/curves-paths.md +21 -9
- package/dist/docs/reference/geometry/categories/mechanical.md +22 -10
- package/dist/docs/reference/geometry/categories/meshes.md +16 -7
- package/dist/docs/reference/geometry/categories/pattern-placement.md +6 -4
- package/dist/docs/reference/geometry/categories/primitive-options.md +8 -2
- package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -12
- package/dist/docs/reference/geometry/categories/resolution-errors.md +8 -3
- package/dist/docs/reference/geometry/categories/transforms-math.md +21 -12
- package/dist/docs/reference/geometry/categories/vector-import.md +11 -5
- 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 +5 -1
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -1
- package/dist/docs/reference/geometry/composeTransform3.md +7 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +5 -1
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +11 -2
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
- package/dist/docs/reference/geometry/computeTriangleMeshSignature.md +5 -1
- 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 +3 -2
- 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 +5 -1
- 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 +5 -1
- 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/getMetricClearanceHoleDiameter.md +5 -1
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +4 -4
- package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
- package/dist/docs/reference/geometry/helicalThreadRidgeMesh.md +5 -1
- package/dist/docs/reference/geometry/helicalThreadSolidMesh.md +5 -1
- 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 +4 -4
- package/dist/docs/reference/geometry/loftMesh.md +5 -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 +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/path2.md +14 -2
- package/dist/docs/reference/geometry/path3.md +8 -1
- package/dist/docs/reference/geometry/pathPatternTransforms.md +9 -5
- package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +11 -2
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +13 -2
- package/dist/docs/reference/geometry/preflightSvgRegion.md +24 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +12 -2
- package/dist/docs/reference/geometry/preflightThreadedRod.md +12 -2
- package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -4
- 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 +8 -4
- package/dist/docs/reference/geometry/resamplePolyline2.md +8 -4
- package/dist/docs/reference/geometry/resamplePolyline3.md +8 -4
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveArcSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveCircularSampling.md +40 -0
- 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 +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/revolveMesh.md +5 -1
- 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 +8 -4
- package/dist/docs/reference/geometry/sampleContour.md +12 -2
- package/dist/docs/reference/geometry/sampleCurve2.md +6 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +5 -1
- 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 +15 -5
- package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +5 -1
- 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 +5 -1
- 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 +5 -1
- package/dist/docs/reference/geometry/threadProfile.md +5 -1
- 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 +5 -1
- 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 +9 -2
- 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 +7 -5
- package/dist/docs/reference/model/Anchor3.md +6 -5
- package/dist/docs/reference/model/AttachOptions.md +2 -1
- 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/Bounds2Options.md +70 -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/Bounds3Options.md +70 -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 +3 -3
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +1 -1
- package/dist/docs/reference/model/FinalizedModel.md +3 -3
- 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 +1 -1
- 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 +5 -4
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +2 -1
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
- package/dist/docs/reference/model/HoleCutterOptions.md +77 -0
- package/dist/docs/reference/model/HoleCutterOverrun.md +35 -0
- package/dist/docs/reference/model/HoleCutterRecess.md +87 -0
- package/dist/docs/reference/model/HullOptions.md +1 -1
- 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 +2 -1
- 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 +38 -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 +2 -1
- 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 +1 -1
- 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 +12 -8
- package/dist/docs/reference/model/Path2Data.md +40 -4
- package/dist/docs/reference/model/Path2Input.md +8 -3
- package/dist/docs/reference/model/Path3-type.md +12 -8
- package/dist/docs/reference/model/Path3Data.md +40 -4
- package/dist/docs/reference/model/Path3Input.md +8 -3
- package/dist/docs/reference/model/PathLocation.md +5 -1
- package/dist/docs/reference/model/PathNormalGuide.md +4 -4
- package/dist/docs/reference/model/PathOptions.md +5 -1
- package/dist/docs/reference/model/PathPatternOptions.md +2 -1
- package/dist/docs/reference/model/PathResamplingOptions.md +5 -1
- 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 +1 -1
- package/dist/docs/reference/model/PolygonData.md +3 -2
- package/dist/docs/reference/model/PolygonOptions.md +1 -1
- package/dist/docs/reference/model/PrimitiveAttachment.md +2 -1
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +2 -1
- 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 +2 -1
- 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 +3 -3
- package/dist/docs/reference/model/RegionData.md +2 -2
- package/dist/docs/reference/model/RegularPolygonOptions.md +1 -1
- package/dist/docs/reference/model/RevolveOptions.md +1 -1
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +9 -2
- package/dist/docs/reference/model/SectionHullOptions.md +1 -1
- package/dist/docs/reference/model/SectionInspection.md +4 -4
- 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 +9 -2
- package/dist/docs/reference/model/SolidInspection.md +4 -4
- package/dist/docs/reference/model/SolidSegmentHit.md +4 -4
- package/dist/docs/reference/model/SphereOptions.md +1 -1
- package/dist/docs/reference/model/StarOptions.md +1 -1
- package/dist/docs/reference/model/StrokeCap.md +1 -1
- package/dist/docs/reference/model/StrokeJoin.md +1 -1
- package/dist/docs/reference/model/StrokeOptions.md +1 -1
- 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 +14 -1
- package/dist/docs/reference/model/SweepOptions.md +1 -1
- package/dist/docs/reference/model/SweepOrientation.md +1 -1
- 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 +2 -1
- 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 +2 -1
- package/dist/docs/reference/model/TorusOptions.md +1 -1
- 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 +3 -3
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
- package/dist/docs/reference/model/TubeOptions.md +1 -1
- 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 +37 -0
- package/dist/docs/reference/model/bounds3.md +37 -0
- package/dist/docs/reference/model/box.md +2 -2
- package/dist/docs/reference/model/castSegment.md +1 -1
- 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 +38 -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 +6 -4
- 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 +9 -2
- package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
- package/dist/docs/reference/model/categories/paths.md +15 -7
- package/dist/docs/reference/model/categories/primitives.md +14 -4
- package/dist/docs/reference/model/categories/resolution.md +4 -2
- package/dist/docs/reference/model/categories/sections.md +10 -5
- package/dist/docs/reference/model/categories/threads.md +10 -7
- package/dist/docs/reference/model/categories/transforms-placement.md +17 -9
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/generate.md +5 -1
- package/dist/docs/reference/model/gridPattern.md +2 -1
- package/dist/docs/reference/model/heightfield.md +5 -2
- package/dist/docs/reference/model/holeCutter.md +45 -0
- 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 +2 -1
- 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 +2 -1
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +1 -1
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +14 -2
- package/dist/docs/reference/model/path3.md +8 -1
- package/dist/docs/reference/model/pathPattern.md +2 -1
- package/dist/docs/reference/model/polygon.md +5 -2
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +8 -2
- package/dist/docs/reference/model/preflightThreadedNut.md +8 -2
- package/dist/docs/reference/model/preflightThreadedRod.md +8 -2
- package/dist/docs/reference/model/radialPattern.md +2 -1
- package/dist/docs/reference/model/rectangle.md +5 -2
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/stroke.md +1 -1
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +5 -1
- package/dist/docs/reference/model/sweep.md +1 -1
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +2 -1
- package/dist/docs/reference/model/threadedNut.md +2 -1
- package/dist/docs/reference/model/threadedRod.md +2 -1
- package/dist/docs/reference/model/torus.md +1 -1
- 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 +1 -1
- 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 +15 -8
- 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 +7 -7
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +1 -1
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +3 -3
- 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 +6 -4
- package/dist/docs/reference/text/prepareVectorFont.md +1 -1
- package/dist/docs/reference/text.md +4 -2
- package/dist/engine/construction-operations.js +1 -1
- package/dist/engine/extrusion-finishing.js +2 -29
- package/dist/engine/hole-cutter-operation.js +148 -0
- package/dist/engine/knuckle-hinge-operation.js +128 -0
- package/dist/engine/loft-operations.js +1 -1
- package/dist/engine/mechanical-operations.js +3 -1
- package/dist/engine/modeling-context.js +20 -1
- package/dist/engine/primitive-operations.js +19 -6
- package/dist/engine/recipe-realization.js +4 -2
- package/dist/engine/section-operations.js +2 -2
- package/dist/engine/transform-operations.js +3 -3
- package/dist/geometry/bounds-value.js +121 -0
- package/dist/geometry/bounds.js +10 -25
- package/dist/geometry/circular-sampling.js +45 -0
- package/dist/geometry/convex-offset.js +41 -0
- package/dist/geometry/curves/sampling.js +1 -2
- package/dist/geometry/errors.js +1 -0
- package/dist/geometry/heightfield.js +12 -1
- package/dist/geometry/index.js +5 -2
- 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/index.js +1 -0
- package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
- package/dist/geometry/mechanical/thread-mesh-plan.js +7 -2
- package/dist/geometry/mechanical/thread-solids.js +29 -4
- package/dist/geometry/mesh/mesh-centroid.js +1 -0
- package/dist/geometry/mesh/mesh-solid.js +1 -0
- package/dist/geometry/paths/frames.js +1 -0
- package/dist/geometry/paths/helix.js +1 -0
- package/dist/geometry/paths/path-value.js +43 -27
- package/dist/geometry/paths/resampling.js +2 -2
- package/dist/geometry/patterns/placements.js +3 -3
- package/dist/geometry/patterns.js +3 -1
- package/dist/geometry/profiles/contour.js +1 -0
- package/dist/geometry/profiles/matched.js +1 -0
- package/dist/geometry/profiles/profiles.js +3 -23
- package/dist/geometry/profiles/rectangle.js +10 -1
- package/dist/geometry/profiles/side-profile.js +2 -0
- package/dist/geometry/svg/matrix.js +21 -0
- package/dist/geometry/svg-import.js +140 -52
- package/dist/geometry/sweeps/options.js +1 -1
- package/dist/geometry/text-fitting.js +1 -0
- package/dist/geometry/transform-matrix.js +1 -1
- package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
- package/dist/index.js +2 -1
- package/dist/model/execution-binding.js +1 -1
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/hole-cutter.js +1 -0
- package/dist/model/immutable-generation-data.js +4 -12
- package/dist/model/knuckle-hinge.js +1 -0
- package/dist/model/operations.js +78 -3
- package/dist/model/recipe-declaration.js +11 -2
- 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/BoundsFromSizeOptions.md +0 -23
- 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/boundsFromSize.md +0 -83
- package/dist/docs/reference/geometry/containsBounds.md +0 -72
- package/dist/docs/reference/model/Bounds2.md +0 -39
- package/dist/docs/reference/model/Bounds3.md +0 -39
- package/dist/docs/reference/model/Transform2Matrix.md +0 -15
- package/dist/docs/reference/model/Transform3Matrix.md +0 -18
- package/dist/docs/reference/text/Bounds2.md +0 -34
- package/dist/docs/reference/text/Vector2Tuple.md +0 -7
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { invalid } from "./errors.js";
|
|
1
2
|
export function multiplyMatrices(left, right) {
|
|
2
3
|
return [
|
|
3
4
|
left[0] * right[0] + left[2] * right[1],
|
|
@@ -14,3 +15,23 @@ export function transformPoint(matrix, point) {
|
|
|
14
15
|
matrix[1] * point[0] + matrix[3] * point[1] + matrix[5],
|
|
15
16
|
];
|
|
16
17
|
}
|
|
18
|
+
/** Inverts an affine map after checking relative linear conditioning, independent of unit scale. */
|
|
19
|
+
export function inverseMatrix(matrix, operation) {
|
|
20
|
+
const scale = Math.max(...matrix.slice(0, 4).map(Math.abs));
|
|
21
|
+
const [a, b, c, d] = matrix.slice(0, 4).map((value) => value / scale);
|
|
22
|
+
const determinant = a * d - b * c;
|
|
23
|
+
if (!Number.isFinite(determinant) || Math.abs(determinant) <= 1e-15)
|
|
24
|
+
invalid(operation, "SVG geometry transforms must be non-singular.");
|
|
25
|
+
const divisor = determinant * scale;
|
|
26
|
+
const result = [
|
|
27
|
+
d / divisor,
|
|
28
|
+
-b / divisor,
|
|
29
|
+
-c / divisor,
|
|
30
|
+
a / divisor,
|
|
31
|
+
(c * matrix[5] - d * matrix[4]) / divisor,
|
|
32
|
+
(b * matrix[4] - a * matrix[5]) / divisor,
|
|
33
|
+
];
|
|
34
|
+
if (!result.every(Number.isFinite))
|
|
35
|
+
invalid(operation, "SVG inverse transform must be finite.");
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { SaxesParser } from "saxes";
|
|
2
|
+
import { SVGPathData } from "svg-pathdata";
|
|
3
|
+
import { bounds2 } from "./bounds-value.js";
|
|
4
|
+
import { fitBounds } from "./bounds.js";
|
|
2
5
|
import { GeometryError } from "./errors.js";
|
|
3
6
|
import { regionArea, signedContourArea } from "./regions.js";
|
|
4
7
|
import { resolveCircularSegments, resolveGeometryResolution, } from "./resolution.js";
|
|
5
8
|
import { resolveGeometrySamplingLimits } from "./sampling-limits.js";
|
|
6
9
|
import { strokePathMultiPolygon } from "./stroke-path.js";
|
|
7
10
|
import { createBoundedSvgClipping } from "./svg/fill.js";
|
|
8
|
-
import { multiplyMatrices as multiply, transformPoint } from "./svg/matrix.js";
|
|
11
|
+
import { inverseMatrix, multiplyMatrices as multiply, transformPoint } from "./svg/matrix.js";
|
|
9
12
|
import { flattenSvgSubpaths, SvgVertexBudget } from "./svg/path.js";
|
|
10
13
|
const MAX_SVG_BYTES = 256 * 1024;
|
|
11
14
|
const MAX_SVG_ELEMENTS = 500;
|
|
12
15
|
const MAX_SVG_NESTING_DEPTH = 64;
|
|
13
16
|
const MAX_SVG_NODES = 2_000;
|
|
17
|
+
const MAX_SVG_FIT_PASSES = 8;
|
|
14
18
|
const SHORT_EDGE_LENGTH_MM = 0.01;
|
|
15
19
|
const TINY_ISLAND_AREA_MM2 = 0.01;
|
|
16
20
|
const SUPPORTED_TAGS = new Set([
|
|
@@ -79,6 +83,14 @@ function complexityFail(message, details) {
|
|
|
79
83
|
details,
|
|
80
84
|
});
|
|
81
85
|
}
|
|
86
|
+
function svgResolution(options) {
|
|
87
|
+
return resolveGeometryResolution({
|
|
88
|
+
...options.resolution,
|
|
89
|
+
...(options.circularSegments === undefined
|
|
90
|
+
? {}
|
|
91
|
+
: { circularSegments: options.circularSegments }),
|
|
92
|
+
}, options.limits);
|
|
93
|
+
}
|
|
82
94
|
function finite(value, fallback) {
|
|
83
95
|
if (value === undefined || value.trim() === "") {
|
|
84
96
|
if (fallback !== undefined)
|
|
@@ -301,31 +313,28 @@ function parsePoints(value) {
|
|
|
301
313
|
points.push([numbers[index] ?? 0, numbers[index + 1] ?? 0]);
|
|
302
314
|
return points;
|
|
303
315
|
}
|
|
304
|
-
function inverseMatrix(matrix) {
|
|
305
|
-
const determinant = matrix[0] * matrix[3] - matrix[1] * matrix[2];
|
|
306
|
-
if (!Number.isFinite(determinant) || Math.abs(determinant) <= 1e-15) {
|
|
307
|
-
return fail("SVG geometry transforms must be non-singular.");
|
|
308
|
-
}
|
|
309
|
-
return [
|
|
310
|
-
matrix[3] / determinant,
|
|
311
|
-
-matrix[1] / determinant,
|
|
312
|
-
-matrix[2] / determinant,
|
|
313
|
-
matrix[0] / determinant,
|
|
314
|
-
(matrix[2] * matrix[5] - matrix[3] * matrix[4]) / determinant,
|
|
315
|
-
(matrix[1] * matrix[4] - matrix[0] * matrix[5]) / determinant,
|
|
316
|
-
];
|
|
317
|
-
}
|
|
318
316
|
function maximumLinearScale(matrix) {
|
|
319
317
|
const trace = matrix[0] * matrix[0] + matrix[1] * matrix[1] + matrix[2] * matrix[2] + matrix[3] * matrix[3];
|
|
320
318
|
const determinant = matrix[0] * matrix[3] - matrix[1] * matrix[2];
|
|
321
319
|
return Math.sqrt(Math.max(0, (trace + Math.sqrt(Math.max(0, trace * trace - 4 * determinant * determinant))) / 2));
|
|
322
320
|
}
|
|
323
|
-
function adaptivePathSubpaths(d, transform, resolution, budget) {
|
|
321
|
+
function adaptivePathSubpaths(d, transform, resolution, budget, estimate = false) {
|
|
324
322
|
if (d.trim() === "")
|
|
325
323
|
return fail("SVG path data is required.");
|
|
326
|
-
const inverse = inverseMatrix(transform);
|
|
324
|
+
const inverse = inverseMatrix(transform, "preflightSvgRegion");
|
|
327
325
|
try {
|
|
328
|
-
|
|
326
|
+
let selected = resolution;
|
|
327
|
+
if (estimate) {
|
|
328
|
+
const bounds = new SVGPathData(d).getBounds();
|
|
329
|
+
const estimateError = (Math.hypot(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY) *
|
|
330
|
+
maximumLinearScale(transform)) /
|
|
331
|
+
16;
|
|
332
|
+
selected = {
|
|
333
|
+
...resolution,
|
|
334
|
+
maxChordError: estimateError || resolution.maxChordError,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return flattenSvgSubpaths(d, transform, selected, budget, "preflightSvgRegion").map(({ closed, points }) => ({
|
|
329
338
|
closed,
|
|
330
339
|
points: points.map((point) => transformPoint(inverse, point)),
|
|
331
340
|
}));
|
|
@@ -336,7 +345,7 @@ function adaptivePathSubpaths(d, transform, resolution, budget) {
|
|
|
336
345
|
return fail(error instanceof Error ? `Invalid SVG path: ${error.message}` : "Invalid SVG path data.");
|
|
337
346
|
}
|
|
338
347
|
}
|
|
339
|
-
function elementSubpaths(tag, values, transform, resolution, budget) {
|
|
348
|
+
function elementSubpaths(tag, values, transform, resolution, budget, estimate = false) {
|
|
340
349
|
switch (tag) {
|
|
341
350
|
case "rect": {
|
|
342
351
|
const x = finite(values.x, 0);
|
|
@@ -348,11 +357,11 @@ function elementSubpaths(tag, values, transform, resolution, budget) {
|
|
|
348
357
|
const rx = values.rx === undefined ? finite(values.ry, 0) : finite(values.rx, 0);
|
|
349
358
|
const ry = values.ry === undefined ? rx : finite(values.ry, 0);
|
|
350
359
|
if (rx === 0 || ry === 0) {
|
|
351
|
-
return adaptivePathSubpaths(`M${x} ${y}H${x + width}V${y + height}H${x}Z`, transform, resolution, budget);
|
|
360
|
+
return adaptivePathSubpaths(`M${x} ${y}H${x + width}V${y + height}H${x}Z`, transform, resolution, budget, estimate);
|
|
352
361
|
}
|
|
353
362
|
const radiusX = Math.min(Math.max(0, rx), width / 2);
|
|
354
363
|
const radiusY = Math.min(Math.max(0, ry), height / 2);
|
|
355
|
-
return adaptivePathSubpaths(`M${x + radiusX} ${y}H${x + width - radiusX}A${radiusX} ${radiusY} 0 0 1 ${x + width} ${y + radiusY}V${y + height - radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + width - radiusX} ${y + height}H${x + radiusX}A${radiusX} ${radiusY} 0 0 1 ${x} ${y + height - radiusY}V${y + radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + radiusX} ${y}Z`, transform, resolution, budget);
|
|
364
|
+
return adaptivePathSubpaths(`M${x + radiusX} ${y}H${x + width - radiusX}A${radiusX} ${radiusY} 0 0 1 ${x + width} ${y + radiusY}V${y + height - radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + width - radiusX} ${y + height}H${x + radiusX}A${radiusX} ${radiusY} 0 0 1 ${x} ${y + height - radiusY}V${y + radiusY}A${radiusX} ${radiusY} 0 0 1 ${x + radiusX} ${y}Z`, transform, resolution, budget, estimate);
|
|
356
365
|
}
|
|
357
366
|
case "circle": {
|
|
358
367
|
const radius = finite(values.r);
|
|
@@ -376,17 +385,17 @@ function elementSubpaths(tag, values, transform, resolution, budget) {
|
|
|
376
385
|
];
|
|
377
386
|
}
|
|
378
387
|
case "line":
|
|
379
|
-
return adaptivePathSubpaths(`M${finite(values.x1, 0)} ${finite(values.y1, 0)}L${finite(values.x2, 0)} ${finite(values.y2, 0)}`, transform, resolution, budget);
|
|
388
|
+
return adaptivePathSubpaths(`M${finite(values.x1, 0)} ${finite(values.y1, 0)}L${finite(values.x2, 0)} ${finite(values.y2, 0)}`, transform, resolution, budget, estimate);
|
|
380
389
|
case "polyline": {
|
|
381
390
|
const points = parsePoints(values.points);
|
|
382
|
-
return adaptivePathSubpaths(points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join(""), transform, resolution, budget);
|
|
391
|
+
return adaptivePathSubpaths(points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join(""), transform, resolution, budget, estimate);
|
|
383
392
|
}
|
|
384
393
|
case "polygon": {
|
|
385
394
|
const points = parsePoints(values.points);
|
|
386
|
-
return adaptivePathSubpaths(`${points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join("")}Z`, transform, resolution, budget);
|
|
395
|
+
return adaptivePathSubpaths(`${points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join("")}Z`, transform, resolution, budget, estimate);
|
|
387
396
|
}
|
|
388
397
|
case "path":
|
|
389
|
-
return adaptivePathSubpaths(values.d ?? "", transform, resolution, budget);
|
|
398
|
+
return adaptivePathSubpaths(values.d ?? "", transform, resolution, budget, estimate);
|
|
390
399
|
default:
|
|
391
400
|
return [];
|
|
392
401
|
}
|
|
@@ -476,10 +485,10 @@ function measureSvgRegion(region) {
|
|
|
476
485
|
*
|
|
477
486
|
* @param svg - Complete SVG XML source, limited to 256 KiB of UTF-8.
|
|
478
487
|
* @param options - Physical flattening and viewport-origin controls.
|
|
479
|
-
* @returns The
|
|
488
|
+
* @returns The normalized sampled region plus bounded review metrics and repairs.
|
|
480
489
|
* @throws {@link GeometryError} When XML, supported-feature, geometry, or complexity checks fail.
|
|
481
490
|
*/
|
|
482
|
-
function createSvgRegionPreflight(svg, options = {}) {
|
|
491
|
+
function createSvgRegionPreflight(svg, options = {}, estimate = false) {
|
|
483
492
|
const bytes = new TextEncoder().encode(svg).byteLength;
|
|
484
493
|
if (bytes > MAX_SVG_BYTES)
|
|
485
494
|
return fail("SVG geometry must be 256 KiB or smaller.");
|
|
@@ -488,15 +497,17 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
488
497
|
return fail('SVG origin must be either "center" or "document".');
|
|
489
498
|
}
|
|
490
499
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
491
|
-
const resolution =
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
500
|
+
const resolution = { ...svgResolution(options) };
|
|
501
|
+
// The first fitted pass estimates size using bounded, scale-relative samples. Resolving
|
|
502
|
+
// source curves at the final tolerance first would reject large documents before shrinking.
|
|
503
|
+
if (estimate) {
|
|
504
|
+
resolution.circularSegments ??= resolution.minSegments;
|
|
505
|
+
delete resolution.maxSegmentLength;
|
|
506
|
+
}
|
|
497
507
|
const { assertExpandedVertexCount, boundedMultiPolygon, fillGeometry, multiPolygonVertexCount, regionFromMultiPolygon, unionAll, } = createBoundedSvgClipping(limits.maxProfilePoints);
|
|
498
508
|
const stack = [];
|
|
499
509
|
const geometry = [];
|
|
510
|
+
const estimateGeometry = [];
|
|
500
511
|
let elementCount = 0;
|
|
501
512
|
let emptyElementCount = 0;
|
|
502
513
|
let expandedGeometryVertices = 0;
|
|
@@ -504,6 +515,7 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
504
515
|
let invisibleElementCount = 0;
|
|
505
516
|
let nodeCount = 0;
|
|
506
517
|
let rootSeen = false;
|
|
518
|
+
let coordinateScale = 1;
|
|
507
519
|
let strokeConstructionVertices = 0;
|
|
508
520
|
const budget = new SvgVertexBudget(limits);
|
|
509
521
|
const appendGeometry = (target, value, stage) => {
|
|
@@ -565,6 +577,13 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
565
577
|
const width = lengthMm(values.width, viewWidth);
|
|
566
578
|
const height = lengthMm(values.height, viewHeight);
|
|
567
579
|
transform = multiply(canvasTransform(values, width, height, box, origin), parseTransform(values.transform));
|
|
580
|
+
if (options.fit !== undefined) {
|
|
581
|
+
// Fitted artwork has no meaningful source-unit topology tolerance. Keep sampling,
|
|
582
|
+
// stroking and clipping near a unit viewport, then compose this physical-unit scale
|
|
583
|
+
// into the final fit. Unfitted documents retain their millimetre coordinates.
|
|
584
|
+
coordinateScale = 1 / Math.max(width, height);
|
|
585
|
+
transform = multiply([coordinateScale, 0, 0, coordinateScale, 0, 0], transform);
|
|
586
|
+
}
|
|
568
587
|
}
|
|
569
588
|
else if (parent === undefined) {
|
|
570
589
|
return fail("The SVG root element is missing.");
|
|
@@ -573,13 +592,17 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
573
592
|
elementCount += 1;
|
|
574
593
|
if (elementCount > MAX_SVG_ELEMENTS)
|
|
575
594
|
return fail(`SVG geometry may contain at most ${MAX_SVG_ELEMENTS} elements.`);
|
|
576
|
-
const localSubpaths = elementSubpaths(tag, values, transform, resolution, budget);
|
|
595
|
+
const localSubpaths = elementSubpaths(tag, values, transform, resolution, budget, estimate);
|
|
577
596
|
const subpaths = localSubpaths.map((subpath) => ({
|
|
578
597
|
...subpath,
|
|
579
598
|
points: subpath.points.map((point) => transformPoint(transform, point)),
|
|
580
599
|
}));
|
|
581
600
|
const paintedFill = isPainted(paint.fill, paint.fillOpacity);
|
|
582
601
|
const paintedStroke = isPainted(paint.stroke, paint.strokeOpacity) && paint.strokeWidth > 0;
|
|
602
|
+
if (estimate && (paintedFill || paintedStroke)) {
|
|
603
|
+
for (const { points } of subpaths)
|
|
604
|
+
estimateGeometry.push({ outer: points, holes: [] });
|
|
605
|
+
}
|
|
583
606
|
const elementGeometry = [];
|
|
584
607
|
if (!paintedFill && !paintedStroke)
|
|
585
608
|
invisibleElementCount += 1;
|
|
@@ -624,31 +647,96 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
624
647
|
assertExpandedVertexCount(region.reduce((total, polygon) => total +
|
|
625
648
|
polygon.outer.length +
|
|
626
649
|
polygon.holes.reduce((holeTotal, hole) => holeTotal + hole.length, 0), 0), "normalized region");
|
|
627
|
-
return
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
650
|
+
return [
|
|
651
|
+
Object.freeze({
|
|
652
|
+
geometry: measureSvgRegion(region),
|
|
653
|
+
region,
|
|
654
|
+
repairs: Object.freeze({
|
|
655
|
+
emptyElementCount,
|
|
656
|
+
implicitFilledClosureCount,
|
|
657
|
+
invisibleElementCount,
|
|
658
|
+
removedDuplicateVertexCount: budget.removedDuplicateCount,
|
|
659
|
+
removedSeamVertexCount: budget.removedSeamCount,
|
|
660
|
+
}),
|
|
661
|
+
source: Object.freeze({
|
|
662
|
+
byteCount: bytes,
|
|
663
|
+
elementCount,
|
|
664
|
+
emittedVertexCount: budget.emittedCount,
|
|
665
|
+
parsedVertexCount: budget.parsedCount,
|
|
666
|
+
}),
|
|
642
667
|
}),
|
|
643
|
-
|
|
668
|
+
coordinateScale,
|
|
669
|
+
estimate && region.length === 0 ? measureSvgRegion(estimateGeometry).bounds : null,
|
|
670
|
+
];
|
|
644
671
|
}
|
|
645
672
|
/**
|
|
646
|
-
*
|
|
673
|
+
* Parses and validates bounded SVG input, constructing its normalized sampled region and diagnostics.
|
|
674
|
+
*
|
|
675
|
+
* This pure operation performs curve flattening, fill and stroke construction, and polygon union;
|
|
676
|
+
* it needs no browser or engine. Geometry counts measure the returned region at the selected
|
|
677
|
+
* resolution, rather than predicting later mesh allocation. With `fit`, painted bounds are
|
|
678
|
+
* uniformly centered inside the target and adaptive sampling remains in final millimetres.
|
|
679
|
+
* Refinement runs at most eight bounded import passes; exact circular counts retain precedence.
|
|
680
|
+
* Without `fit` the region may be empty. Tiny-island and short-edge indicators do not establish
|
|
681
|
+
* manufacturability or later solid validity.
|
|
647
682
|
*
|
|
648
683
|
* @param svg - Complete SVG XML source, limited to 256 KiB of UTF-8.
|
|
649
684
|
* @param options - Physical flattening and viewport-origin controls.
|
|
650
685
|
* @returns The canonical normalized region plus bounded source, topology, and safe-repair facts.
|
|
686
|
+
* @throws {@link GeometryError} When XML, supported-feature, geometry, or complexity checks fail.
|
|
651
687
|
*/
|
|
652
688
|
export function preflightSvgRegion(svg, options = {}) {
|
|
653
|
-
|
|
689
|
+
if (options.fit === undefined)
|
|
690
|
+
return createSvgRegionPreflight(svg, options)[0];
|
|
691
|
+
// Capture mutable caller data once; all refinement passes fit to the same finite target.
|
|
692
|
+
const target = bounds2(options.fit);
|
|
693
|
+
const resolution = svgResolution(options);
|
|
694
|
+
let samplingScale = 1;
|
|
695
|
+
for (let pass = 0; pass < MAX_SVG_FIT_PASSES; pass++) {
|
|
696
|
+
// Each pass retains the importer's source, recursion, sampling and clipping ceilings.
|
|
697
|
+
// The fixed pass cap also bounds aggregate work without consuming the final profile's
|
|
698
|
+
// allocation allowance on a discarded scale estimate.
|
|
699
|
+
const [imported, coordinateScale, estimateBounds] = createSvgRegionPreflight(svg, {
|
|
700
|
+
...options,
|
|
701
|
+
resolution: {
|
|
702
|
+
...resolution,
|
|
703
|
+
maxChordError: resolution.maxChordError / samplingScale,
|
|
704
|
+
...(resolution.maxSegmentLength === undefined
|
|
705
|
+
? {}
|
|
706
|
+
: { maxSegmentLength: resolution.maxSegmentLength / samplingScale }),
|
|
707
|
+
},
|
|
708
|
+
}, pass === 0);
|
|
709
|
+
// Coarse estimation can collapse a thin closed curve to a segment. Its sampled span
|
|
710
|
+
// still determines a first scale; only the verified pass may declare painted artwork empty.
|
|
711
|
+
const sourceBounds = imported.geometry.bounds ?? estimateBounds;
|
|
712
|
+
if (sourceBounds === null)
|
|
713
|
+
return fail("Cannot fit empty SVG artwork.");
|
|
714
|
+
const fit = fitBounds(sourceBounds, target);
|
|
715
|
+
if (pass > 0 && fit.scale <= samplingScale) {
|
|
716
|
+
const placement = [fit.scale, 0, 0, fit.scale, ...fit.position];
|
|
717
|
+
const transform = (loop) => Object.freeze(loop.map((point) => Object.freeze(transformPoint(placement, point))));
|
|
718
|
+
// Positive uniform fitting preserves winding and topology. Re-normalizing here would
|
|
719
|
+
// erase small fitted details. fitBounds validates transformed extrema, bounding every
|
|
720
|
+
// transformed point without repeating finite checks for each coordinate.
|
|
721
|
+
const region = Object.freeze(imported.region.map(({ outer, holes }) => Object.freeze({ outer: transform(outer), holes: Object.freeze(holes.map(transform)) })));
|
|
722
|
+
const geometry = measureSvgRegion(region);
|
|
723
|
+
if (!Number.isFinite(geometry.area))
|
|
724
|
+
return fail("Fitted SVG area is not finite.");
|
|
725
|
+
const scale = fit.scale * coordinateScale;
|
|
726
|
+
if (!(scale > 0) || !Number.isFinite(scale))
|
|
727
|
+
return fail("SVG fit scale must be finite and positive.");
|
|
728
|
+
return Object.freeze({
|
|
729
|
+
...imported,
|
|
730
|
+
fit: Object.freeze({ ...fit, scale }),
|
|
731
|
+
geometry,
|
|
732
|
+
region,
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
// One representable relative step avoids retrying solely because a division rounded down.
|
|
736
|
+
// The next pass still verifies the actual fitted scale instead of trusting a safety factor.
|
|
737
|
+
samplingScale = fit.scale * (1 + Number.EPSILON);
|
|
738
|
+
}
|
|
739
|
+
return complexityFail("SVG fit did not converge.", {
|
|
740
|
+
maxFitPasses: MAX_SVG_FIT_PASSES,
|
|
741
|
+
});
|
|
654
742
|
}
|
|
@@ -18,7 +18,7 @@ export function resolveSweepScales(scale, stationCount) {
|
|
|
18
18
|
};
|
|
19
19
|
if (scale === undefined ||
|
|
20
20
|
typeof scale === "number" ||
|
|
21
|
-
(typeof scale === "object" && scale !== null && "
|
|
21
|
+
(typeof scale === "object" && scale !== null && "toData" in scale) ||
|
|
22
22
|
(Array.isArray(scale) && typeof scale[0] === "number")) {
|
|
23
23
|
const value = pair(scale ?? 1);
|
|
24
24
|
return Array.from({ length: stationCount }, () => value);
|
|
@@ -6,6 +6,7 @@ function fail(message) {
|
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* Uniformly fits visible text ink inside finite XY bounds, centering it on the target.
|
|
9
|
+
*
|
|
9
10
|
* Transforms retained vector paths before sampling, so later textSection/sampleTextContours
|
|
10
11
|
* resolution remains in final millimetres. Logical advances scale without translation;
|
|
11
12
|
* line count is unchanged. The input layout is preserved.
|
|
@@ -2,7 +2,7 @@ import { GeometryError } from "./errors.js";
|
|
|
2
2
|
export function readTransformMatrix(input, dimension) {
|
|
3
3
|
let matrix = input;
|
|
4
4
|
if (typeof input === "object" && input !== null && !Array.isArray(input)) {
|
|
5
|
-
const method = Reflect.get(input, "
|
|
5
|
+
const method = Reflect.get(input, "toData");
|
|
6
6
|
if (typeof method === "function")
|
|
7
7
|
matrix = Reflect.apply(method, input, []);
|
|
8
8
|
}
|
|
@@ -89,7 +89,7 @@ const Placement3 = /* @__PURE__ */ immutableMathClass(class Placement3 {
|
|
|
89
89
|
applyNormal(normal) {
|
|
90
90
|
return vector3(applyNormal(this, this.matrix, vector3Data(normal)));
|
|
91
91
|
}
|
|
92
|
-
|
|
92
|
+
toData() {
|
|
93
93
|
return this.matrix;
|
|
94
94
|
}
|
|
95
95
|
to2D() {
|
|
@@ -101,7 +101,7 @@ const Placement2 = /* @__PURE__ */ immutableMathClass(class Placement2 {
|
|
|
101
101
|
matrix;
|
|
102
102
|
constructor(spatial) {
|
|
103
103
|
this.spatial = spatial;
|
|
104
|
-
this.matrix = restrictTransform3(spatial.
|
|
104
|
+
this.matrix = restrictTransform3(spatial.toData());
|
|
105
105
|
Object.freeze(this);
|
|
106
106
|
}
|
|
107
107
|
translate(offset) {
|
|
@@ -124,15 +124,15 @@ const Placement2 = /* @__PURE__ */ immutableMathClass(class Placement2 {
|
|
|
124
124
|
return new Placement2(this.spatial.inverse());
|
|
125
125
|
}
|
|
126
126
|
applyPoint(point) {
|
|
127
|
-
return vector2(xy(applyValidatedTransformPoint3(this.spatial.
|
|
127
|
+
return vector2(xy(applyValidatedTransformPoint3(this.spatial.toData(), xyz(vector2Data(point)))));
|
|
128
128
|
}
|
|
129
129
|
applyDirection(direction) {
|
|
130
|
-
return vector2(xy(applyValidatedTransformDirection3(this.spatial.
|
|
130
|
+
return vector2(xy(applyValidatedTransformDirection3(this.spatial.toData(), xyz(vector2Data(direction)))));
|
|
131
131
|
}
|
|
132
132
|
applyNormal(normal) {
|
|
133
|
-
return vector2(xy(applyNormal(this, this.spatial.
|
|
133
|
+
return vector2(xy(applyNormal(this, this.spatial.toData(), xyz(vector2Data(normal)))));
|
|
134
134
|
}
|
|
135
|
-
|
|
135
|
+
toData() {
|
|
136
136
|
return this.matrix;
|
|
137
137
|
}
|
|
138
138
|
to3D() {
|
|
@@ -140,33 +140,42 @@ const Placement2 = /* @__PURE__ */ immutableMathClass(class Placement2 {
|
|
|
140
140
|
}
|
|
141
141
|
});
|
|
142
142
|
/**
|
|
143
|
-
* Creates an immutable XY transform, identity by default.
|
|
143
|
+
* Creates an immutable XY transform, identity by default.
|
|
144
|
+
*
|
|
145
|
+
* Values and data are copied and validated.
|
|
144
146
|
* Pass it directly to Section.transform() and planar data helpers; to3D() explicitly crosses into XYZ.
|
|
145
147
|
* Zero scales and singular matrices throw GeometryError; negative scales reflect.
|
|
146
148
|
*
|
|
149
|
+
* Use `toData()` for frozen matrix interchange.
|
|
150
|
+
*
|
|
147
151
|
* @example
|
|
148
152
|
* ```ts
|
|
149
153
|
* const placement = transform2().rotate(90).translate([10, 0]);
|
|
150
|
-
* placement.applyPoint([1, 0]).
|
|
154
|
+
* placement.applyPoint([1, 0]).toData(); // approximately [10, 1]
|
|
151
155
|
* ```
|
|
152
156
|
*/
|
|
153
|
-
export function transform2(
|
|
154
|
-
return new Placement2(
|
|
157
|
+
export function transform2(input) {
|
|
158
|
+
return new Placement2(input === undefined
|
|
155
159
|
? new Placement3(IDENTITY_TRANSFORM3)
|
|
156
|
-
: new Placement3(embedTransform2(
|
|
160
|
+
: new Placement3(embedTransform2(readTransformMatrix(input, 2))));
|
|
157
161
|
}
|
|
158
162
|
/**
|
|
159
|
-
* Creates an immutable XYZ transform, identity by default.
|
|
163
|
+
* Creates an immutable XYZ transform, identity by default.
|
|
164
|
+
*
|
|
165
|
+
* Values and data are copied and validated.
|
|
160
166
|
* Calls apply in written order; rotations use degrees and pivots use current world coordinates.
|
|
161
167
|
* Zero scales, singular matrices, nonfinite inputs and zero rotation axes throw GeometryError.
|
|
162
168
|
* Use frameTransform3(frame) as the input for existing orthonormal frame placement.
|
|
163
169
|
*
|
|
170
|
+
* Use `toData()` for frozen matrix interchange.
|
|
171
|
+
* [composeTransform3](/docs/reference/geometry/composeTransform3) takes matrices in after, before order.
|
|
172
|
+
*
|
|
164
173
|
* @example
|
|
165
174
|
* ```ts
|
|
166
175
|
* const placement = transform3().rotate([0, 0, 90]).translate([10, 0, 0]);
|
|
167
|
-
* placement.applyPoint([1, 0, 0]).
|
|
176
|
+
* placement.applyPoint([1, 0, 0]).toData(); // approximately [10, 1, 0]
|
|
168
177
|
* ```
|
|
169
178
|
*/
|
|
170
|
-
export function transform3(
|
|
171
|
-
return new Placement3(snapshotTransform3(
|
|
179
|
+
export function transform3(input = IDENTITY_TRANSFORM3) {
|
|
180
|
+
return new Placement3(snapshotTransform3(readTransformMatrix(input, 3)));
|
|
172
181
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Immutable modeling recipes and math values; the host owns geometry evaluation. @packageDocumentation */
|
|
2
|
-
export {
|
|
2
|
+
export { bounds2, bounds3, } from "./geometry/bounds-value.js";
|
|
3
|
+
export { transform2, transform3, } from "./geometry/transform-value.js";
|
|
3
4
|
export { vector2, vector3, } from "./geometry/math/vector-value.js";
|
|
4
5
|
export { path2, path3, } from "./geometry/paths/path-value.js";
|
|
5
6
|
export * from "./model/operations.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GeometryError } from "../geometry/errors.js";
|
|
2
2
|
// One protocol key lets locally bundled operation wrappers resolve the host's execution
|
|
3
3
|
// without depending on package instances, class identity, or initializing a native runtime.
|
|
4
|
-
const executionKey = Symbol.for("@metamesh/modeling/execution/
|
|
4
|
+
const executionKey = Symbol.for("@metamesh/modeling/execution/9");
|
|
5
5
|
const bindings = globalThis;
|
|
6
6
|
/** Internal host binding. Executable callbacks are synchronous and may not nest executions. */
|
|
7
7
|
export function bindModelContext(context, build) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createSectionHandle, createSolidHandle } from "./shape-handles.js";
|
|
2
2
|
// One realm protocol lets bundled authoring code declare recipes before a host is initialized.
|
|
3
3
|
// The payload contains no native handles and the engine remains responsible for realization.
|
|
4
|
-
const recipeKey = Symbol.for("@metamesh/modeling/recipe/
|
|
4
|
+
const recipeKey = Symbol.for("@metamesh/modeling/recipe/9");
|
|
5
5
|
/** Reads private recipe metadata without requiring an execution context. */
|
|
6
6
|
export const geometryRecipe = (value) => Object.getOwnPropertyDescriptor(value, recipeKey)?.value;
|
|
7
7
|
/** Recognizes only opaque recipe handles issued by this engine. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -185,18 +185,10 @@ export function compareGenerationValues(left, right) {
|
|
|
185
185
|
return compare(left, right);
|
|
186
186
|
}
|
|
187
187
|
function mathValueData(value) {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
// Closure and dimension change path behavior; tuple interchange omits both for empty paths.
|
|
193
|
-
const closed = Reflect.get(value, "closed");
|
|
194
|
-
return typeof closed === "boolean"
|
|
195
|
-
? { dimension: Reflect.get(value, "dimension"), points: data, closed }
|
|
196
|
-
: data;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
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, []);
|
|
200
192
|
}
|
|
201
193
|
function captureValue(value, mode, readerAllowed = () => false, validated) {
|
|
202
194
|
const recipeInputs = mode === "recipe";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/model/operations.js
CHANGED
|
@@ -32,6 +32,27 @@ export function box(options) {
|
|
|
32
32
|
export function cylinder(options) {
|
|
33
33
|
return invoke("cylinder", [options]);
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Declares a +Z hole or blind-pocket cutter with explicit end overrun in millimetres.
|
|
37
|
+
* Choose exactly one circular diameter or existing Section. A 45-degree entry chamfer
|
|
38
|
+
* supports one strictly convex contour without holes; plain profiles may have any topology.
|
|
39
|
+
* Circular entries retain nominal frustum radii; profile entries offset the supplied polygon edges.
|
|
40
|
+
* Circular head recesses are mutually exclusive with entryChamfer. Both overrun ends default
|
|
41
|
+
* to zero, so the nominal bottom remains at Z=0 and blind pocket floors are preserved.
|
|
42
|
+
* Existing Section samples are authoritative; limits and unspecified circular sampling belong
|
|
43
|
+
* to the evaluating host. Compiled packages require runtime major 9.
|
|
44
|
+
*
|
|
45
|
+
* @example A blind hex pocket with an open top
|
|
46
|
+
* ```ts
|
|
47
|
+
* holeCutter({
|
|
48
|
+
* profile: regularPolygon({ sides: 6, radius: 3.5, sizing: "face", rotation: 30 }),
|
|
49
|
+
* height: 12, entryChamfer: 0.5, overrun: { top: 0.05 },
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function holeCutter(options) {
|
|
54
|
+
return invoke("holeCutter", [options]);
|
|
55
|
+
}
|
|
35
56
|
/**
|
|
36
57
|
* Hollow +Z tube.
|
|
37
58
|
*
|
|
@@ -153,6 +174,7 @@ export function anchor(shape, name) {
|
|
|
153
174
|
}
|
|
154
175
|
/**
|
|
155
176
|
* Fills one closed millimetre XY outline, explicit outer/hole topology, or compound contours.
|
|
177
|
+
*
|
|
156
178
|
* Closing edges are implicit. Compound contours use nonzero fill unless selected otherwise.
|
|
157
179
|
* Explicit topology must be simple and disjoint; compound winding may resolve overlaps.
|
|
158
180
|
*
|
|
@@ -182,6 +204,9 @@ export function stroke(path, options) {
|
|
|
182
204
|
/**
|
|
183
205
|
* Filled rectangular section with uniform or independently treated corners.
|
|
184
206
|
*
|
|
207
|
+
* Use [rectangleContour](/docs/reference/geometry/rectangleContour) for sampled boundary coordinates,
|
|
208
|
+
* or [rectangleProfile](/docs/reference/geometry/rectangleProfile) to retain identified loft landmarks.
|
|
209
|
+
*
|
|
185
210
|
* @example Round the corners
|
|
186
211
|
* ```ts
|
|
187
212
|
* rectangle({ size: [30, 20], treatment: { kind: "round", radius: 3 } });
|
|
@@ -373,6 +398,7 @@ export function implicit(options) {
|
|
|
373
398
|
}
|
|
374
399
|
/**
|
|
375
400
|
* Closed rectilinear top above a flat base, with uniform or explicit XY coordinates.
|
|
401
|
+
*
|
|
376
402
|
* Samples each grid height once; center-error triangulation also samples each cell centre.
|
|
377
403
|
* The retained callback must capture independent immutable inputs, not live session readers or parameters.
|
|
378
404
|
*
|
|
@@ -403,6 +429,31 @@ export function pathPattern(...args) {
|
|
|
403
429
|
export function threadRidge(options) {
|
|
404
430
|
return invoke("threadRidge", [options]);
|
|
405
431
|
}
|
|
432
|
+
/**
|
|
433
|
+
* Declares separate knuckle-joint halves along the centered +X pin axis, in millimetres.
|
|
434
|
+
*
|
|
435
|
+
* A starts at negative X. Attach independent webs or use barrels only; caller geometry connects
|
|
436
|
+
* otherwise disconnected intervals. Returns portable recipes without initializing the engine.
|
|
437
|
+
* Unspecified resolution inherits the evaluating session. Axis direction is +X with +Z up.
|
|
438
|
+
*
|
|
439
|
+
* Each half's `chamfer` bevels its barrel outer rims and all web edges. Consumers own plates, screw holes,
|
|
440
|
+
* pin retention, fit policy, and part placement. Added mounting material must preserve the bores.
|
|
441
|
+
* No opening range or collision freedom is implied for arbitrary caller attachments.
|
|
442
|
+
* Compiled Generator packages using this operation require runtime 9.0.0 or newer in major 9.
|
|
443
|
+
*
|
|
444
|
+
* @example Integral-pin hinge with two mounting webs
|
|
445
|
+
* ```ts
|
|
446
|
+
* const joint = knuckleHinge({
|
|
447
|
+
* mode: "print-in-place", length: 30, knuckleCount: 3,
|
|
448
|
+
* barrelDiameter: 10, pinDiameter: 3, radialClearance: 0.3, axialGap: 0.4,
|
|
449
|
+
* halfA: { web: { direction: "positive-y", reach: 8, zMin: -5, thickness: 2 } },
|
|
450
|
+
* halfB: { web: { direction: "negative-y", reach: 8, zMin: -5, thickness: 2 } },
|
|
451
|
+
* });
|
|
452
|
+
* ```
|
|
453
|
+
*/
|
|
454
|
+
export function knuckleHinge(options) {
|
|
455
|
+
return invoke("knuckleHinge", [options]);
|
|
456
|
+
}
|
|
406
457
|
/**
|
|
407
458
|
* Compensated external threaded rod.
|
|
408
459
|
*
|
|
@@ -449,15 +500,39 @@ export function internalThreadCutter(options) {
|
|
|
449
500
|
export function threadedNut(options) {
|
|
450
501
|
return invoke("threadedNut", [options]);
|
|
451
502
|
}
|
|
452
|
-
/**
|
|
503
|
+
/**
|
|
504
|
+
* Checks compensated rod dimensions and conservative mesh estimates against host output limits.
|
|
505
|
+
*
|
|
506
|
+
* Requires active synchronous model execution and uses its resolution and limits. Returns selected
|
|
507
|
+
* sampling and conservative row/triangle estimates without mesh buffers or native objects.
|
|
508
|
+
* Mesh validity, native construction, and aggregate output limits are checked later.
|
|
509
|
+
*
|
|
510
|
+
* @see {@link threadedRod}
|
|
511
|
+
*/
|
|
453
512
|
export function preflightThreadedRod(options) {
|
|
454
513
|
return invoke("preflightThreadedRod", [options]);
|
|
455
514
|
}
|
|
456
|
-
/**
|
|
515
|
+
/**
|
|
516
|
+
* Checks compensated cutter dimensions and conservative mesh estimates against host output limits.
|
|
517
|
+
*
|
|
518
|
+
* Requires active synchronous model execution and uses its resolution and limits. Estimates include
|
|
519
|
+
* the one-pitch extension beyond each requested face, without mesh buffers or native objects.
|
|
520
|
+
* Mesh validity, native construction, and aggregate output limits are checked later.
|
|
521
|
+
*
|
|
522
|
+
* @see {@link internalThreadCutter}
|
|
523
|
+
*/
|
|
457
524
|
export function preflightInternalThreadCutter(options) {
|
|
458
525
|
return invoke("preflightInternalThreadCutter", [options]);
|
|
459
526
|
}
|
|
460
|
-
/**
|
|
527
|
+
/**
|
|
528
|
+
* Checks nut dimensions, chamfers, end-face wall, and the extended compensated cutter's allocation plan.
|
|
529
|
+
*
|
|
530
|
+
* Requires active synchronous model execution and uses its resolution and limits, without mesh
|
|
531
|
+
* buffers or native objects. Returned thread estimates cover the cutter, excluding the body and
|
|
532
|
+
* Boolean result. Mesh validity, native construction, and aggregate output limits are checked later.
|
|
533
|
+
*
|
|
534
|
+
* @see {@link threadedNut}
|
|
535
|
+
*/
|
|
461
536
|
export function preflightThreadedNut(options) {
|
|
462
537
|
return invoke("preflightThreadedNut", [options]);
|
|
463
538
|
}
|