@metamesh/modeling 0.16.0 → 0.18.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 +193 -0
- package/README.md +137 -142
- package/dist/api/engine.d.ts +128 -65
- package/dist/api/geometry.d.ts +327 -483
- package/dist/api/index.d.ts +537 -415
- package/dist/api/mesh.d.ts +460 -0
- package/dist/api/text.d.ts +1 -1
- package/dist/docs/guides/concepts.md +130 -87
- package/dist/docs/guides/fonts.md +11 -10
- package/dist/docs/guides/fundamentals.md +30 -29
- package/dist/docs/guides/generation.md +44 -31
- package/dist/docs/guides/hosting.md +122 -46
- package/dist/docs/guides/recipes.md +94 -56
- package/dist/docs/guides/standalone-model.md +8 -7
- package/dist/docs/manifest.json +2941 -968
- package/dist/docs/reference/engine/Export3mfOptions.md +19 -2
- package/dist/docs/reference/engine/ExportMeshPart.md +5 -39
- package/dist/docs/reference/engine/GenerationOptions.md +4 -3
- package/dist/docs/reference/engine/GeometryResource.md +13 -13
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +26 -23
- package/dist/docs/reference/engine/ModelEngineOptions.md +6 -1
- package/dist/docs/reference/engine/ModelPart.md +108 -0
- package/dist/docs/reference/engine/ModelResult.md +175 -0
- package/dist/docs/reference/engine/ModelRunArguments.md +28 -0
- package/dist/docs/reference/engine/ModelRunOptions.md +104 -0
- package/dist/docs/reference/engine/ModelSession.md +16 -16
- package/dist/docs/reference/engine/ModelingLimits.md +121 -0
- package/dist/docs/reference/engine/SessionOptions.md +13 -8
- package/dist/docs/reference/engine/categories/host-lifecycle.md +25 -15
- package/dist/docs/reference/engine/checkModel.md +43 -0
- package/dist/docs/reference/engine/createModelEngine.md +4 -13
- package/dist/docs/reference/engine/defaultModelingLimits.md +8 -1
- package/dist/docs/reference/engine/export3mf.md +55 -0
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine.md +8 -15
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +1 -1
- package/dist/docs/reference/geometry/Anchor3-type.md +1 -1
- package/dist/docs/reference/geometry/ArcCurve2.md +1 -1
- package/dist/docs/reference/geometry/ArcCurve3.md +1 -1
- package/dist/docs/reference/geometry/AttachOptions.md +1 -1
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +1 -1
- package/dist/docs/reference/geometry/Bevel.md +18 -0
- package/dist/docs/reference/geometry/BevelSize.md +14 -0
- package/dist/docs/reference/geometry/Bounds2-type.md +1 -1
- package/dist/docs/reference/geometry/Bounds2Data.md +1 -1
- package/dist/docs/reference/geometry/Bounds2Input.md +1 -1
- package/dist/docs/reference/geometry/Bounds2Options.md +112 -0
- package/dist/docs/reference/geometry/Bounds3-type.md +1 -1
- package/dist/docs/reference/geometry/Bounds3Data.md +1 -1
- package/dist/docs/reference/geometry/Bounds3Input.md +1 -1
- package/dist/docs/reference/geometry/Bounds3Options.md +112 -0
- package/dist/docs/reference/geometry/BoundsFit2.md +1 -1
- package/dist/docs/reference/geometry/BoundsFit3.md +1 -1
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +4 -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 +1 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -3
- 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 +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +1 -1
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +1 -1
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +1 -1
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +3 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +1 -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 +3 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +130 -0
- package/dist/docs/reference/geometry/ExtrudeOptions.md +17 -9
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +3 -3
- package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
- package/dist/docs/reference/geometry/Frame3.md +1 -1
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +1 -1
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +3 -2
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +1 -1
- package/dist/docs/reference/geometry/ImmutableBuffer-type.md +108 -0
- package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +43 -0
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +52 -83
- package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +1 -1
- package/dist/docs/reference/geometry/KnuckleHingeInterval.md +1 -1
- package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +1 -1
- package/dist/docs/reference/geometry/KnuckleHingeSpec.md +1 -1
- package/dist/docs/reference/geometry/LineCurve2.md +1 -1
- package/dist/docs/reference/geometry/LineCurve3.md +1 -1
- package/dist/docs/reference/geometry/LinearPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +1 -1
- package/dist/docs/reference/geometry/LoftOptions.md +3 -3
- package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/NumericArray.md +14 -0
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
- package/dist/docs/reference/geometry/Path2-type.md +1 -1
- package/dist/docs/reference/geometry/Path2Data.md +1 -1
- package/dist/docs/reference/geometry/Path2Input.md +1 -1
- package/dist/docs/reference/geometry/Path3-type.md +1 -1
- package/dist/docs/reference/geometry/Path3Data.md +1 -1
- package/dist/docs/reference/geometry/Path3Input.md +1 -1
- package/dist/docs/reference/geometry/PathFrame.md +1 -1
- package/dist/docs/reference/geometry/PathLocation.md +1 -1
- package/dist/docs/reference/geometry/PathNormalGuide.md +1 -1
- package/dist/docs/reference/geometry/PathOptions.md +1 -1
- package/dist/docs/reference/geometry/PathPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/PathPlacement.md +1 -1
- package/dist/docs/reference/geometry/PathResamplingOptions.md +1 -1
- package/dist/docs/reference/geometry/Pivot2Options.md +1 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +1 -1
- package/dist/docs/reference/geometry/PolygonData.md +1 -1
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +1 -1
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +1 -3
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/Profile.md +1 -1
- package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
- package/dist/docs/reference/geometry/ProfileSpan2.md +1 -1
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +1 -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 +3 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +1 -1
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +1 -1
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +2 -2
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +1 -1
- package/dist/docs/reference/geometry/SampledCurve2.md +1 -1
- package/dist/docs/reference/geometry/SampledCurve3.md +1 -1
- package/dist/docs/reference/geometry/SampledThreadHelices.md +1 -1
- package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/SphereOptions.md +1 -1
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/StarContourOptions.md +74 -0
- package/dist/docs/reference/geometry/StrokeCap.md +1 -1
- package/dist/docs/reference/geometry/StrokeJoin.md +1 -1
- package/dist/docs/reference/geometry/StrokeOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgImportOptions.md +16 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +16 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +1 -1
- package/dist/docs/reference/geometry/SweepOptions.md +1 -1
- package/dist/docs/reference/geometry/SweepOrientation.md +1 -1
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +7 -30
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfile-type.md +2 -2
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/{HelicalThreadRidgeMeshOptions.md → ThreadRidgeOptions.md} +4 -4
- package/dist/docs/reference/geometry/ThreadRole.md +1 -1
- package/dist/docs/reference/geometry/{HelicalThreadSolidMeshOptions.md → ThreadSolidOptions.md} +18 -65
- package/dist/docs/reference/geometry/{HelicalThreadSolidMeshPreflight.md → ThreadSolidPreflight.md} +2 -2
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +75 -86
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +18 -6
- package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +52 -83
- package/dist/docs/reference/geometry/TorusOptions.md +1 -1
- package/dist/docs/reference/geometry/Transform2-type.md +1 -1
- package/dist/docs/reference/geometry/Transform2Data.md +1 -1
- package/dist/docs/reference/geometry/Transform2Input.md +1 -1
- package/dist/docs/reference/geometry/Transform3-type.md +1 -1
- package/dist/docs/reference/geometry/Transform3Data.md +1 -1
- package/dist/docs/reference/geometry/Transform3Input.md +1 -1
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TriangleMesh.md +3 -8
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +10 -4
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshInput.md +19 -0
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +131 -0
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TubeOptions.md +10 -86
- package/dist/docs/reference/geometry/Vector2-type.md +1 -1
- package/dist/docs/reference/geometry/Vector2Data.md +1 -1
- package/dist/docs/reference/geometry/Vector2Input.md +1 -1
- package/dist/docs/reference/geometry/Vector3-type.md +1 -1
- package/dist/docs/reference/geometry/Vector3Data.md +1 -1
- package/dist/docs/reference/geometry/Vector3Input.md +1 -1
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
- package/dist/docs/reference/geometry/add2.md +1 -1
- package/dist/docs/reference/geometry/add3.md +1 -1
- package/dist/docs/reference/geometry/anchor3.md +1 -1
- package/dist/docs/reference/geometry/anchorFrame3.md +1 -1
- package/dist/docs/reference/geometry/applyTransformDirection3.md +1 -1
- package/dist/docs/reference/geometry/applyTransformPoint3.md +1 -1
- package/dist/docs/reference/geometry/attachmentTransform3.md +1 -1
- package/dist/docs/reference/geometry/bounds2.md +7 -6
- package/dist/docs/reference/geometry/bounds3.md +7 -6
- package/dist/docs/reference/geometry/boundsCenter.md +1 -1
- package/dist/docs/reference/geometry/boundsSize.md +1 -1
- package/dist/docs/reference/geometry/boxAnchor3.md +3 -3
- package/dist/docs/reference/geometry/categories/bounds-layout.md +8 -9
- package/dist/docs/reference/geometry/categories/curves-paths.md +2 -2
- package/dist/docs/reference/geometry/categories/mechanical.md +8 -10
- package/dist/docs/reference/geometry/categories/meshes.md +19 -32
- package/dist/docs/reference/geometry/categories/pattern-placement.md +2 -2
- package/dist/docs/reference/geometry/categories/primitive-options.md +3 -3
- package/dist/docs/reference/geometry/categories/profiles-regions.md +5 -4
- package/dist/docs/reference/geometry/categories/resolution-errors.md +7 -4
- package/dist/docs/reference/geometry/categories/transforms-math.md +3 -2
- package/dist/docs/reference/geometry/categories/vector-import.md +3 -3
- package/dist/docs/reference/geometry/circleContour.md +1 -1
- package/dist/docs/reference/geometry/closeToAxis.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +1 -1
- package/dist/docs/reference/geometry/composeTransform3.md +1 -1
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +1 -1
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +1 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +1 -1
- package/dist/docs/reference/geometry/cross2.md +1 -1
- package/dist/docs/reference/geometry/cross3.md +1 -1
- package/dist/docs/reference/geometry/cylinderAnchor3.md +2 -2
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +1 -1
- package/dist/docs/reference/geometry/distance3.md +1 -1
- package/dist/docs/reference/geometry/distributeAlongPath.md +1 -1
- package/dist/docs/reference/geometry/dot2.md +1 -1
- package/dist/docs/reference/geometry/dot3.md +1 -1
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +1 -1
- package/dist/docs/reference/geometry/fitBounds.md +1 -1
- package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
- package/dist/docs/reference/geometry/frameTransform3.md +1 -1
- package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +1 -1
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +1 -1
- package/dist/docs/reference/geometry/immutableBuffer.md +49 -0
- package/dist/docs/reference/geometry/inverseTransform3.md +1 -1
- package/dist/docs/reference/geometry/isGeometryError.md +1 -1
- package/dist/docs/reference/geometry/layoutRow.md +1 -1
- package/dist/docs/reference/geometry/length2.md +1 -1
- package/dist/docs/reference/geometry/length3.md +1 -1
- package/dist/docs/reference/geometry/lerp2.md +1 -1
- package/dist/docs/reference/geometry/lerp3.md +1 -1
- package/dist/docs/reference/geometry/linearPatternTransforms.md +1 -1
- package/dist/docs/reference/geometry/matchProfiles.md +1 -1
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +1 -1
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +1 -1
- package/dist/docs/reference/geometry/normalize2.md +1 -1
- package/dist/docs/reference/geometry/normalize3.md +1 -1
- package/dist/docs/reference/geometry/normalizeContour.md +1 -1
- package/dist/docs/reference/geometry/normalizePolygon.md +1 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +1 -1
- package/dist/docs/reference/geometry/path2.md +1 -1
- package/dist/docs/reference/geometry/path3.md +1 -1
- package/dist/docs/reference/geometry/pathPatternTransforms.md +1 -1
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +18 -25
- package/dist/docs/reference/geometry/preflightSvgRegion.md +12 -3
- package/dist/docs/reference/geometry/preflightThreadedNut.md +24 -26
- package/dist/docs/reference/geometry/preflightThreadedRod.md +18 -25
- package/dist/docs/reference/geometry/projectOntoPlane3.md +1 -1
- package/dist/docs/reference/geometry/radialPatternTransforms.md +1 -1
- package/dist/docs/reference/geometry/rectangleContour.md +10 -5
- package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
- package/dist/docs/reference/geometry/regionArea.md +1 -1
- package/dist/docs/reference/geometry/regionBounds.md +1 -1
- package/dist/docs/reference/geometry/regularPolygonContour.md +2 -2
- package/dist/docs/reference/geometry/resamplePolyline2.md +1 -1
- package/dist/docs/reference/geometry/resamplePolyline3.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolveKnuckleHinge.md +1 -1
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/rotate2.md +1 -1
- package/dist/docs/reference/geometry/rotationTransform3.md +1 -1
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +1 -1
- package/dist/docs/reference/geometry/sampleContour.md +1 -1
- package/dist/docs/reference/geometry/sampleCurve2.md +1 -1
- package/dist/docs/reference/geometry/sampleCurve3.md +1 -1
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleHelix.md +1 -1
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +1 -1
- package/dist/docs/reference/geometry/sampleSideProfile.md +1 -1
- package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +1 -1
- package/dist/docs/reference/geometry/scale2.md +1 -1
- package/dist/docs/reference/geometry/scale3.md +1 -1
- package/dist/docs/reference/geometry/scaleTransform3.md +1 -1
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +17 -15
- package/dist/docs/reference/geometry/strokeRegionData.md +1 -1
- package/dist/docs/reference/geometry/subtract2.md +1 -1
- package/dist/docs/reference/geometry/subtract3.md +1 -1
- package/dist/docs/reference/geometry/threadProfile.md +1 -1
- package/dist/docs/reference/geometry/transform2.md +1 -1
- package/dist/docs/reference/geometry/transform3.md +1 -1
- package/dist/docs/reference/geometry/transformDeterminant3.md +1 -1
- package/dist/docs/reference/geometry/transformRegionData.md +1 -1
- package/dist/docs/reference/geometry/translationTransform3.md +1 -1
- package/dist/docs/reference/geometry/triangulateContour.md +1 -1
- package/dist/docs/reference/geometry/validateRigidTransform3.md +35 -0
- package/dist/docs/reference/geometry/validateTransform3.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +1 -1
- package/dist/docs/reference/geometry/vector3.md +1 -1
- package/dist/docs/reference/geometry.md +9 -9
- package/dist/docs/reference/mesh/AcmeThreadProfileSpec.md +79 -0
- package/dist/docs/reference/mesh/Bevel.md +18 -0
- package/dist/docs/reference/mesh/BevelSize.md +14 -0
- package/dist/docs/reference/mesh/Bounds2.md +125 -0
- package/dist/docs/reference/mesh/Bounds2Data.md +43 -0
- package/dist/docs/reference/mesh/Bounds2Input.md +19 -0
- package/dist/docs/reference/mesh/Bounds3.md +125 -0
- package/dist/docs/reference/mesh/Bounds3Data.md +43 -0
- package/dist/docs/reference/mesh/Bounds3Input.md +19 -0
- package/dist/docs/reference/mesh/ButtressPressureFlankSide.md +14 -0
- package/dist/docs/reference/mesh/ButtressThreadProfileSpec.md +97 -0
- package/dist/docs/reference/mesh/CircularPrimitiveOptions.md +60 -0
- package/dist/docs/reference/mesh/CurveSamplingOptions.md +69 -0
- package/dist/docs/reference/mesh/CustomThreadProfileSpec.md +77 -0
- package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +129 -0
- package/dist/docs/reference/mesh/ExtrusionSamplingOptions.md +81 -0
- package/dist/docs/reference/mesh/Frame3.md +62 -0
- package/dist/docs/reference/mesh/GeometryResolution.md +74 -0
- package/dist/docs/reference/mesh/GeometrySamplingLimits.md +66 -0
- package/dist/docs/reference/mesh/GeometryToleranceOptions.md +46 -0
- package/dist/docs/reference/mesh/HeightfieldMeshLimits.md +18 -0
- package/dist/docs/reference/mesh/HeightfieldOptions.md +72 -0
- package/dist/docs/reference/mesh/HeightfieldPreflight.md +58 -0
- package/dist/docs/reference/mesh/ImmutableBuffer.md +108 -0
- package/dist/docs/reference/mesh/ImmutableTriangleMesh.md +43 -0
- package/dist/docs/reference/mesh/LoftCorrespondence.md +24 -0
- package/dist/docs/reference/mesh/LoftMeshStation.md +31 -0
- package/dist/docs/reference/mesh/LoftOptions.md +88 -0
- package/dist/docs/reference/mesh/LoftPlacement.md +70 -0
- package/dist/docs/reference/mesh/ModelingLimits.md +130 -0
- package/dist/docs/reference/mesh/NumericArray.md +14 -0
- package/dist/docs/reference/mesh/Path2.md +197 -0
- package/dist/docs/reference/mesh/Path2Data.md +50 -0
- package/dist/docs/reference/mesh/Path2Input.md +20 -0
- package/dist/docs/reference/mesh/Path3.md +197 -0
- package/dist/docs/reference/mesh/Path3Data.md +50 -0
- package/dist/docs/reference/mesh/Path3Input.md +20 -0
- package/dist/docs/reference/mesh/PathLocation.md +69 -0
- package/dist/docs/reference/mesh/PathNormalGuide.md +43 -0
- package/dist/docs/reference/mesh/PathResamplingOptions.md +84 -0
- package/dist/docs/reference/mesh/Pivot2Options.md +26 -0
- package/dist/docs/reference/mesh/Pivot3Options.md +26 -0
- package/dist/docs/reference/mesh/PlanarMeshOptimizationFallbackReason.md +14 -0
- package/dist/docs/reference/mesh/PlanarMeshOptimizationOptions.md +160 -0
- package/dist/docs/reference/mesh/PlanarMeshOptimizationResult.md +124 -0
- package/dist/docs/reference/mesh/PlanarPatchQuality.md +194 -0
- package/dist/docs/reference/mesh/RevolveOptions.md +91 -0
- package/dist/docs/reference/mesh/SolidMeshValidationOptions.md +38 -0
- package/dist/docs/reference/mesh/SquareThreadProfileSpec.md +79 -0
- package/dist/docs/reference/mesh/SweepOptions.md +113 -0
- package/dist/docs/reference/mesh/SweepOrientation.md +113 -0
- package/dist/docs/reference/mesh/ThreadEndStyle.md +14 -0
- package/dist/docs/reference/mesh/ThreadEndTreatmentOptions.md +117 -0
- package/dist/docs/reference/mesh/ThreadHandedness.md +14 -0
- package/dist/docs/reference/mesh/ThreadLeadInEnvelope.md +14 -0
- package/dist/docs/reference/mesh/ThreadLeadInShape.md +14 -0
- package/dist/docs/reference/mesh/ThreadProfile.md +86 -0
- package/dist/docs/reference/mesh/ThreadProfileBaseSpec.md +53 -0
- package/dist/docs/reference/mesh/ThreadProfileSpec.md +23 -0
- package/dist/docs/reference/{model/HelicalThreadRidgeMeshOptions.md → mesh/ThreadRidgeOptions.md} +14 -10
- package/dist/docs/reference/mesh/ThreadSolidOptions.md +222 -0
- package/dist/docs/reference/mesh/ThreadSolidPreflight.md +58 -0
- package/dist/docs/reference/mesh/Transform2.md +256 -0
- package/dist/docs/reference/mesh/Transform2Data.md +14 -0
- package/dist/docs/reference/mesh/Transform2Input.md +19 -0
- package/dist/docs/reference/mesh/Transform3.md +296 -0
- package/dist/docs/reference/mesh/Transform3Data.md +17 -0
- package/dist/docs/reference/mesh/Transform3Input.md +19 -0
- package/dist/docs/reference/mesh/TrapezoidalThreadProfileSpec.md +96 -0
- package/dist/docs/reference/mesh/TriangleMesh.md +34 -0
- package/dist/docs/reference/mesh/TriangleMeshAnalysis.md +129 -0
- package/dist/docs/reference/mesh/TriangleMeshAnalysisOptions.md +79 -0
- package/dist/docs/reference/mesh/TriangleMeshInput.md +19 -0
- package/dist/docs/reference/mesh/TriangleMeshMeasurements.md +79 -0
- package/dist/docs/reference/mesh/TriangleMeshQualityOptions.md +43 -0
- package/dist/docs/reference/mesh/TriangleMeshQualityReport.md +194 -0
- package/dist/docs/reference/mesh/TriangleMeshSignature.md +111 -0
- package/dist/docs/reference/mesh/TriangleMeshSignatureOptions.md +46 -0
- package/dist/docs/reference/mesh/TriangleMeshSignatureTolerances.md +34 -0
- package/dist/docs/reference/mesh/TriangleMeshTopologyAnalysis.md +131 -0
- package/dist/docs/reference/mesh/TriangleMeshValidationOptions.md +55 -0
- package/dist/docs/reference/mesh/TriangularThreadProfileSpec.md +95 -0
- package/dist/docs/reference/mesh/Vector2.md +270 -0
- package/dist/docs/reference/mesh/Vector2Data.md +14 -0
- package/dist/docs/reference/mesh/Vector2Input.md +19 -0
- package/dist/docs/reference/mesh/Vector3.md +282 -0
- package/dist/docs/reference/mesh/Vector3Data.md +14 -0
- package/dist/docs/reference/mesh/Vector3Input.md +19 -0
- package/dist/docs/reference/mesh/analyze.md +96 -0
- package/dist/docs/reference/{geometry/analyzeTriangleMeshQuality.md → mesh/analyzeQuality.md} +9 -9
- package/dist/docs/reference/mesh/bounds.md +39 -0
- package/dist/docs/reference/mesh/categories/operations.md +147 -0
- package/dist/docs/reference/{geometry/computeTriangleMeshCentroid.md → mesh/centroid.md} +7 -7
- package/dist/docs/reference/mesh/extrude.md +73 -0
- package/dist/docs/reference/{geometry/heightfieldMesh.md → mesh/heightfield.md} +7 -8
- package/dist/docs/reference/mesh/immutable.md +47 -0
- package/dist/docs/reference/{geometry/joinTriangleMeshes.md → mesh/join.md} +7 -6
- package/dist/docs/reference/{geometry/loftMesh.md → mesh/loft.md} +15 -15
- package/dist/docs/reference/mesh/optimizePlanarPatches.md +96 -0
- package/dist/docs/reference/{geometry → mesh}/preflightHeightfield.md +5 -6
- package/dist/docs/reference/mesh/preflightThreadSolid.md +90 -0
- package/dist/docs/reference/{geometry/reverseTriangleMesh.md → mesh/reverse.md} +6 -5
- package/dist/docs/reference/{geometry/revolveMesh.md → mesh/revolve.md} +13 -13
- package/dist/docs/reference/{geometry/computeTriangleMeshSignature.md → mesh/signature.md} +11 -11
- package/dist/docs/reference/mesh/sweep.md +86 -0
- package/dist/docs/reference/mesh/threadRidge.md +72 -0
- package/dist/docs/reference/mesh/threadSolid.md +90 -0
- package/dist/docs/reference/{geometry/transformTriangleMesh.md → mesh/transform.md} +7 -6
- package/dist/docs/reference/{geometry/validateTriangleMesh.md → mesh/validate.md} +17 -11
- package/dist/docs/reference/{geometry/validateSolidMesh.md → mesh/validateSolid.md} +15 -9
- package/dist/docs/reference/mesh.md +21 -0
- package/dist/docs/reference/model/AcmeThreadProfileSpec.md +80 -0
- package/dist/docs/reference/model/Anchor3.md +1 -1
- package/dist/docs/reference/model/AttachOptions.md +1 -1
- package/dist/docs/reference/model/Bevel.md +19 -0
- package/dist/docs/reference/model/{ThreadedNutBevel.md → BevelSize.md} +4 -4
- package/dist/docs/reference/model/Bounds2-type.md +1 -1
- package/dist/docs/reference/model/Bounds2Data.md +1 -1
- package/dist/docs/reference/model/Bounds2Input.md +1 -1
- package/dist/docs/reference/model/Bounds2Options.md +110 -0
- package/dist/docs/reference/model/Bounds3-type.md +1 -1
- package/dist/docs/reference/model/Bounds3Data.md +1 -1
- package/dist/docs/reference/model/Bounds3Input.md +1 -1
- package/dist/docs/reference/model/Bounds3Options.md +110 -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/ButtressPressureFlankSide.md +15 -0
- package/dist/docs/reference/model/ButtressThreadProfileSpec.md +98 -0
- 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 -3
- package/dist/docs/reference/model/Computed.md +7 -3
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +1 -1
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CurveSamplingOptions.md +68 -0
- package/dist/docs/reference/model/CustomThreadProfileSpec.md +78 -0
- package/dist/docs/reference/model/CylinderOptions.md +1 -1
- package/dist/docs/reference/model/DiagnosticOptions.md +15 -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/ExtrudeMeshOptions.md +133 -0
- package/dist/docs/reference/model/ExtrudeOptions.md +17 -8
- package/dist/docs/reference/model/ExtrusionSamplingOptions.md +84 -0
- package/dist/docs/reference/model/Frame3.md +1 -1
- package/dist/docs/reference/model/GenerateCallback.md +5 -5
- package/dist/docs/reference/model/GenerateContext.md +15 -63
- package/dist/docs/reference/model/GenerationDiagnostic.md +13 -1
- package/dist/docs/reference/model/GenerationError.md +1 -1
- package/dist/docs/reference/model/GeometryError.md +102 -0
- package/dist/docs/reference/model/GeometryErrorCode.md +15 -0
- package/dist/docs/reference/model/GeometryErrorContext.md +35 -0
- 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 +1 -1
- package/dist/docs/reference/model/HeightfieldOptions.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 +27 -3
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +8 -3
- package/dist/docs/reference/model/ImmutableValue.md +20 -0
- package/dist/docs/reference/model/ImplicitOptions.md +1 -1
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +54 -84
- package/dist/docs/reference/model/KnuckleHinge-type.md +1 -1
- package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +1 -1
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +9 -5
- package/dist/docs/reference/model/KnuckleHingeOptions.md +3 -3
- package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +1 -1
- package/dist/docs/reference/model/KnuckleHingeSpec.md +1 -1
- package/dist/docs/reference/model/KnuckleHingeWeb.md +2 -2
- package/dist/docs/reference/model/LinearPatternOptions.md +1 -1
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +3 -3
- 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 +2 -2
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +1 -1
- package/dist/docs/reference/model/{GeneratedPart.md → PartDeclaration.md} +8 -23
- package/dist/docs/reference/model/PartGeometry.md +2 -2
- package/dist/docs/reference/model/PartOptions.md +8 -19
- package/dist/docs/reference/model/Path2-type.md +1 -1
- package/dist/docs/reference/model/Path2Data.md +1 -1
- package/dist/docs/reference/model/Path2Input.md +1 -1
- package/dist/docs/reference/model/Path3-type.md +1 -1
- package/dist/docs/reference/model/Path3Data.md +1 -1
- package/dist/docs/reference/model/Path3Input.md +1 -1
- package/dist/docs/reference/model/PathLocation.md +1 -1
- package/dist/docs/reference/model/PathNormalGuide.md +1 -1
- package/dist/docs/reference/model/PathOptions.md +1 -1
- package/dist/docs/reference/model/PathPatternOptions.md +1 -1
- package/dist/docs/reference/model/PathResamplingOptions.md +7 -6
- package/dist/docs/reference/model/PatternSource.md +1 -1
- package/dist/docs/reference/model/Pivot2Options.md +1 -1
- package/dist/docs/reference/model/Pivot3Options.md +1 -1
- package/dist/docs/reference/model/PlaneOptions.md +1 -1
- package/dist/docs/reference/model/PolygonData.md +1 -1
- package/dist/docs/reference/model/PolygonOptions.md +1 -1
- package/dist/docs/reference/model/PrimitiveAttachment.md +1 -3
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/model/Profile.md +1 -1
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +1 -1
- package/dist/docs/reference/model/ProfileSpan2.md +1 -1
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/RadialPatternOptions.md +1 -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 +1 -1
- package/dist/docs/reference/model/RegularPolygonOptions.md +1 -1
- package/dist/docs/reference/model/RevolveOptions.md +2 -2
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +131 -6
- package/dist/docs/reference/model/SectionHullOptions.md +1 -1
- package/dist/docs/reference/model/SectionInspection.md +5 -17
- 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 +245 -8
- package/dist/docs/reference/model/SolidInspection.md +5 -17
- package/dist/docs/reference/model/SolidSegmentHit.md +5 -1
- package/dist/docs/reference/model/SphereOptions.md +1 -1
- package/dist/docs/reference/model/SquareThreadProfileSpec.md +80 -0
- package/dist/docs/reference/model/StarContourOptions.md +81 -0
- package/dist/docs/reference/model/StarOptions.md +38 -16
- 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/ThreadBevelOptions.md +35 -0
- package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/model/ThreadHandedness.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/model/ThreadProfile.md +2 -2
- package/dist/docs/reference/model/ThreadProfileBaseSpec.md +54 -0
- package/dist/docs/reference/model/ThreadProfileSpec.md +24 -0
- package/dist/docs/reference/model/ThreadRidgeOptions.md +126 -4
- package/dist/docs/reference/model/{HelicalThreadSolidMeshPreflight.md → ThreadSolidPreflight.md} +2 -2
- package/dist/docs/reference/model/ThreadedNutOptions.md +75 -86
- package/dist/docs/reference/model/ThreadedNutPreflight.md +18 -6
- package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +54 -84
- package/dist/docs/reference/model/TorusOptions.md +1 -1
- package/dist/docs/reference/model/Transform2-type.md +1 -1
- package/dist/docs/reference/model/Transform2Data.md +1 -1
- package/dist/docs/reference/model/Transform2Input.md +1 -1
- package/dist/docs/reference/model/Transform3-type.md +1 -1
- package/dist/docs/reference/model/Transform3Data.md +1 -1
- package/dist/docs/reference/model/Transform3Input.md +1 -1
- package/dist/docs/reference/model/TrapezoidalThreadProfileSpec.md +97 -0
- package/dist/docs/reference/model/TriangleMesh.md +3 -11
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +10 -4
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/model/TriangleMeshTopologyAnalysis.md +131 -0
- package/dist/docs/reference/model/TriangularThreadProfileSpec.md +96 -0
- package/dist/docs/reference/model/TubeOptions.md +10 -86
- package/dist/docs/reference/model/Vector2-type.md +1 -1
- package/dist/docs/reference/model/Vector2Data.md +1 -1
- package/dist/docs/reference/model/Vector2Input.md +1 -1
- package/dist/docs/reference/model/Vector3-type.md +1 -1
- package/dist/docs/reference/model/Vector3Data.md +1 -1
- package/dist/docs/reference/model/Vector3Input.md +1 -1
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/bounds2.md +7 -6
- package/dist/docs/reference/model/bounds3.md +7 -6
- package/dist/docs/reference/model/box.md +2 -2
- package/dist/docs/reference/model/categories/boolean-operations.md +6 -10
- package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -1
- package/dist/docs/reference/model/categories/bounds.md +6 -4
- package/dist/docs/reference/model/categories/contracts.md +3 -5
- package/dist/docs/reference/model/categories/core-values-errors.md +17 -3
- package/dist/docs/reference/model/categories/explicit-profiles.md +1 -1
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +10 -8
- package/dist/docs/reference/model/categories/generation.md +8 -8
- package/dist/docs/reference/model/categories/hinges.md +2 -2
- package/dist/docs/reference/model/categories/mesh-inspection.md +15 -6
- package/dist/docs/reference/model/categories/paths.md +4 -3
- package/dist/docs/reference/model/categories/primitives.md +8 -4
- package/dist/docs/reference/model/categories/resolution.md +1 -1
- package/dist/docs/reference/model/categories/sections.md +4 -3
- package/dist/docs/reference/model/categories/threads.md +16 -6
- package/dist/docs/reference/model/categories/transforms-placement.md +2 -3
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +5 -4
- package/dist/docs/reference/model/generate.md +4 -4
- package/dist/docs/reference/model/gridPattern.md +1 -1
- package/dist/docs/reference/model/heightfield.md +1 -1
- package/dist/docs/reference/model/holeCutter.md +55 -0
- package/dist/docs/reference/model/hull.md +1 -1
- package/dist/docs/reference/model/immutableBuffer.md +5 -4
- package/dist/docs/reference/model/implicit.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +12 -20
- package/dist/docs/reference/model/intersect.md +3 -3
- package/dist/docs/reference/model/isGeometryError.md +34 -0
- package/dist/docs/reference/model/knuckleHinge.md +3 -3
- package/dist/docs/reference/model/linearPattern.md +1 -1
- package/dist/docs/reference/model/loft.md +6 -5
- 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 +1 -1
- package/dist/docs/reference/model/path3.md +1 -1
- package/dist/docs/reference/model/pathPattern.md +1 -1
- package/dist/docs/reference/model/polygon.md +1 -1
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +15 -23
- package/dist/docs/reference/model/preflightThreadedNut.md +22 -25
- package/dist/docs/reference/model/preflightThreadedRod.md +15 -23
- package/dist/docs/reference/model/radialPattern.md +1 -1
- package/dist/docs/reference/model/rectangle.md +2 -2
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +6 -5
- package/dist/docs/reference/model/solidFromMesh.md +7 -6
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/star.md +7 -7
- 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 +5 -4
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +14 -14
- package/dist/docs/reference/model/threadedNut.md +22 -25
- package/dist/docs/reference/model/threadedRod.md +12 -20
- package/dist/docs/reference/model/torus.md +1 -1
- package/dist/docs/reference/model/transform2.md +1 -1
- package/dist/docs/reference/model/transform3.md +1 -1
- package/dist/docs/reference/model/tube.md +1 -36
- package/dist/docs/reference/model/union.md +3 -3
- package/dist/docs/reference/model/vector2.md +1 -1
- package/dist/docs/reference/model/vector3.md +1 -1
- package/dist/docs/reference/model.md +15 -19
- package/dist/docs/reference/text/Bounds2Data.md +1 -1
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +2 -2
- package/dist/docs/reference/text/Vector2Data.md +1 -1
- package/dist/docs/reference/text/VectorFont.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +3 -3
- package/dist/docs/reference/text/prepareVectorFont.md +1 -1
- package/dist/docs/reference/text.md +4 -4
- package/dist/engine/execution.js +10 -6
- package/dist/engine/export-3mf.js +22 -115
- package/dist/engine/finalization.js +10 -10
- package/dist/engine/index.js +25 -31
- package/dist/engine/model-parts.js +8 -0
- package/dist/engine/model-summary.js +5 -5
- package/dist/engine/native/index.js +1 -1
- package/dist/engine/native/material-components.js +3 -3
- package/dist/engine/native/operations.js +0 -7
- package/dist/engine/native/scoped-primitives.js +5 -4
- package/dist/engine/native/threads.js +14 -14
- package/dist/engine/{construction-operations.js → operations/construction.js} +25 -23
- package/dist/engine/{modeling-context.js → operations/context.js} +21 -9
- package/dist/engine/{operation-environment.js → operations/environment.js} +2 -2
- package/dist/engine/{extrusion-finishing.js → operations/extrusion-finishing.js} +8 -35
- package/dist/engine/operations/hole-cutter.js +148 -0
- package/dist/engine/{inspection-operations.js → operations/inspection.js} +6 -6
- package/dist/engine/operations/knuckle-hinge.js +128 -0
- package/dist/engine/{loft-operations.js → operations/loft.js} +13 -12
- package/dist/engine/{mechanical-operations.js → operations/mechanical.js} +2 -2
- package/dist/engine/{pattern-operations.js → operations/patterns.js} +4 -4
- package/dist/engine/{primitive-anchors.js → operations/primitives/anchors.js} +9 -4
- package/dist/engine/{primitive-operations.js → operations/primitives/construction.js} +36 -24
- package/dist/engine/{primitive-correspondence.js → operations/primitives/correspondence.js} +4 -4
- package/dist/engine/{profile-mesh.js → operations/primitives/profile-mesh.js} +12 -12
- package/dist/engine/{primitive-profiles.js → operations/primitives/profiles.js} +7 -7
- package/dist/engine/{section-operations.js → operations/sections.js} +9 -9
- package/dist/engine/{transform-operations.js → operations/transforms.js} +8 -8
- package/dist/engine/placement.js +3 -4
- package/dist/engine/recipe-realization.js +1 -1
- package/dist/engine/serialize-3mf.js +116 -0
- package/dist/engine/{deferred-context.js → session/deferred-context.js} +4 -4
- package/dist/engine/{model-dependencies.js → session/dependencies.js} +1 -1
- package/dist/engine/{session-graph.js → session/graph.js} +13 -11
- package/dist/engine/{session-native.js → session/native-cache.js} +1 -1
- package/dist/engine/{session.js → session/session.js} +16 -10
- package/dist/engine/{session-snapshot.js → session/snapshot-cache.js} +29 -59
- package/dist/geometry/anchors.js +4 -11
- package/dist/geometry/bounds-value.js +49 -11
- package/dist/geometry/bounds.js +0 -17
- package/dist/geometry/circular-sampling.js +45 -0
- package/dist/geometry/convex-offset.js +41 -0
- package/dist/geometry/heightfield.js +10 -12
- package/dist/{model → geometry}/immutable-buffer.js +28 -7
- package/dist/geometry/index.js +18 -23
- package/dist/geometry/loft/loft.js +11 -6
- package/dist/geometry/math/immutable-value.js +1 -1
- package/dist/geometry/mechanical/index.js +5 -5
- package/dist/geometry/mechanical/threads/bevel.js +24 -0
- package/dist/geometry/mechanical/{threads.js → threads/fit.js} +4 -4
- package/dist/geometry/mechanical/{thread-helices.js → threads/helices.js} +3 -3
- package/dist/geometry/mechanical/{thread-mesh-plan.js → threads/mesh-plan.js} +38 -53
- package/dist/geometry/mechanical/{thread-mesh.js → threads/mesh.js} +9 -9
- package/dist/geometry/mechanical/{thread-profiles.js → threads/profiles.js} +3 -3
- package/dist/geometry/mechanical/{thread-solids.js → threads/solids.js} +58 -89
- package/dist/geometry/mechanical/{thread-surface.js → threads/surface.js} +7 -8
- package/dist/geometry/mesh/mesh-centroid.js +3 -2
- package/dist/geometry/mesh/mesh-planar.js +27 -8
- package/dist/geometry/mesh/mesh-quality.js +2 -1
- package/dist/geometry/mesh/mesh-signature.js +7 -6
- package/dist/geometry/mesh/mesh-solid.js +2 -3
- package/dist/geometry/mesh/mesh-types.js +1 -0
- package/dist/geometry/mesh/mesh.js +13 -22
- package/dist/geometry/mesh-api.js +14 -0
- package/dist/geometry/primitive-resolvers.js +42 -14
- package/dist/geometry/profiles/primitives/circle.js +19 -0
- package/dist/geometry/profiles/{shapes.js → primitives/ellipse.js} +6 -10
- package/dist/geometry/profiles/{rectangle.js → primitives/rectangle.js} +14 -12
- package/dist/geometry/profiles/primitives/regular-polygon.js +33 -0
- package/dist/geometry/profiles/primitives/star.js +28 -0
- package/dist/geometry/revolve/revolve-mesh.js +1 -1
- package/dist/geometry/{svg-import.js → svg/import.js} +141 -59
- package/dist/geometry/svg/matrix.js +21 -0
- package/dist/geometry/sweeps/sweep-mesh.js +1 -1
- package/dist/geometry/transform3.js +29 -0
- package/dist/index.js +2 -1
- package/dist/model/diagnostic-path.js +26 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +8 -2
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/hole-cutter.js +1 -0
- package/dist/model/immutable-generation-data.js +33 -2
- package/dist/model/operations.js +35 -144
- package/dist/model/recipe-declaration.js +7 -2
- package/dist/model/shape-handles.js +30 -7
- package/dist/text/index.js +1 -1
- package/package.json +21 -11
- package/dist/docs/reference/engine/ModelSnapshot.md +0 -184
- package/dist/docs/reference/engine/SnapshotPart.md +0 -133
- package/dist/docs/reference/engine/validateModel.md +0 -48
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +0 -24
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +0 -14
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +0 -61
- package/dist/docs/reference/geometry/boundsFromSize.md +0 -84
- package/dist/docs/reference/geometry/containsBounds.md +0 -73
- package/dist/docs/reference/geometry/extrudeMesh.md +0 -77
- package/dist/docs/reference/geometry/helicalThreadRidgeMesh.md +0 -72
- package/dist/docs/reference/geometry/helicalThreadSolidMesh.md +0 -106
- package/dist/docs/reference/geometry/meshBounds.md +0 -39
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +0 -95
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +0 -105
- package/dist/docs/reference/geometry/sweepMesh.md +0 -86
- package/dist/docs/reference/model/FinalizedModel.md +0 -131
- package/dist/docs/reference/model/FinalizedPart.md +0 -87
- package/dist/docs/reference/model/anchor.md +0 -47
- package/dist/docs/reference/model/castSegment.md +0 -40
- package/dist/docs/reference/model/categories/inspection.md +0 -29
- package/dist/docs/reference/model/components.md +0 -71
- package/dist/docs/reference/model/compose.md +0 -31
- package/dist/docs/reference/model/distance.md +0 -45
- package/dist/docs/reference/model/immutableMesh.md +0 -44
- package/dist/docs/reference/model/inspectSection.md +0 -38
- package/dist/docs/reference/model/inspectSolid.md +0 -38
- package/dist/docs/reference/model/isEmpty.md +0 -39
- package/dist/docs/reference/model/split.md +0 -54
- package/dist/docs/reference/model/splitByPlane.md +0 -66
- package/dist/engine/knuckle-hinge-operation.js +0 -85
- package/dist/geometry/profiles/profiles.js +0 -91
- /package/dist/engine/{primitive-profile-types.js → operations/primitives/profile-types.js} +0 -0
- /package/dist/geometry/profiles/{matched.js → match-profiles.js} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment, } from "./edge-finishing.js";
|
|
2
2
|
import { GeometryError } from "./errors.js";
|
|
3
|
+
import { vector3Data } from "./math/vector-value.js";
|
|
3
4
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits } from "./model-limits.js";
|
|
4
5
|
import { resolveCircularPrimitiveSegments } from "./primitive-resolution.js";
|
|
5
6
|
/** @internal Face pairs define the twelve nominal box edges in deterministic order. */
|
|
@@ -87,13 +88,9 @@ export function resolveBoxPrimitive(options) {
|
|
|
87
88
|
operation,
|
|
88
89
|
});
|
|
89
90
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
operation,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
const dimensions = typeof options.size === "number" ? [options.size, options.size, options.size] : options.size;
|
|
91
|
+
const dimensions = typeof options.size === "number"
|
|
92
|
+
? [options.size, options.size, options.size]
|
|
93
|
+
: vector3Data(options.size);
|
|
97
94
|
for (let axis = 0; axis < 3; axis += 1) {
|
|
98
95
|
assertPositivePrimitive(dimensions[axis], `size[${axis}]`, operation);
|
|
99
96
|
}
|
|
@@ -193,17 +190,48 @@ export function resolveBoxPrimitive(options) {
|
|
|
193
190
|
},
|
|
194
191
|
};
|
|
195
192
|
}
|
|
196
|
-
/** @internal
|
|
197
|
-
export function
|
|
193
|
+
/** @internal Resolves one complete radius or diameter pair before applying faceting compensation. */
|
|
194
|
+
export function resolveTubeRadii(options) {
|
|
198
195
|
assertPrimitiveOptions(options, "tube");
|
|
199
|
-
|
|
200
|
-
|
|
196
|
+
const radii = options.innerRadius !== undefined || options.outerRadius !== undefined;
|
|
197
|
+
const diameters = options.innerDiameter !== undefined || options.outerDiameter !== undefined;
|
|
198
|
+
if (radii === diameters)
|
|
199
|
+
throw new GeometryError("INVALID_ARGUMENT", "Supply one complete radius or diameter pair.", {
|
|
200
|
+
operation: "tube",
|
|
201
|
+
});
|
|
202
|
+
const innerRadius = radii ? options.innerRadius : options.innerDiameter / 2;
|
|
203
|
+
const outerRadius = radii ? options.outerRadius : options.outerDiameter / 2;
|
|
204
|
+
assertPositivePrimitive(innerRadius, "innerRadius", "tube");
|
|
205
|
+
assertPositivePrimitive(outerRadius, "outerRadius", "tube");
|
|
206
|
+
if (!(outerRadius > innerRadius))
|
|
207
|
+
throw new GeometryError("INVALID_ARGUMENT", "Outer size must be larger than inner size.", {
|
|
208
|
+
operation: "tube",
|
|
209
|
+
});
|
|
210
|
+
return { innerRadius, outerRadius };
|
|
211
|
+
}
|
|
212
|
+
/** @internal Resolves shared faceting so compensated inner and outer rings retain a positive wall. */
|
|
213
|
+
export function resolveTubePrimitive(options) {
|
|
214
|
+
const { innerRadius, outerRadius } = resolveTubeRadii(options);
|
|
201
215
|
assertPositivePrimitive(options.height, "height", "tube");
|
|
202
|
-
if (
|
|
203
|
-
throw new GeometryError("INVALID_ARGUMENT", "
|
|
216
|
+
if (options.center !== undefined && typeof options.center !== "boolean")
|
|
217
|
+
throw new GeometryError("INVALID_ARGUMENT", "center must be boolean when supplied.", {
|
|
204
218
|
operation: "tube",
|
|
205
219
|
});
|
|
206
|
-
|
|
220
|
+
const sizing = (value) => {
|
|
221
|
+
if (value !== undefined && value !== "vertex" && value !== "face")
|
|
222
|
+
throw new GeometryError("INVALID_ARGUMENT", "Tube sizing must be vertex or face.", {
|
|
223
|
+
operation: "tube",
|
|
224
|
+
});
|
|
225
|
+
return value ?? "vertex";
|
|
226
|
+
};
|
|
227
|
+
const innerSizing = sizing(options.innerSizing), outerSizing = sizing(options.outerSizing);
|
|
228
|
+
const segments = Math.max(resolveCircularPrimitiveSegments(innerRadius, { ...options, sizing: innerSizing }, "tube"), resolveCircularPrimitiveSegments(outerRadius, { ...options, sizing: outerSizing }, "tube"));
|
|
229
|
+
const cosine = Math.cos(Math.PI / segments);
|
|
230
|
+
const innerVertexRadius = innerSizing === "face" ? innerRadius / cosine : innerRadius;
|
|
231
|
+
const outerVertexRadius = outerSizing === "face" ? outerRadius / cosine : outerRadius;
|
|
232
|
+
if (!Number.isFinite(outerVertexRadius) || !(outerVertexRadius > innerVertexRadius))
|
|
233
|
+
throw new GeometryError("INVALID_ARGUMENT", "Tube sizing and sampling must leave a finite positive wall.", { operation: "tube" });
|
|
234
|
+
return { innerVertexRadius, outerVertexRadius, segments };
|
|
207
235
|
}
|
|
208
236
|
/** @internal Resolves sphere sampling shared by compiled and authored adapters. */
|
|
209
237
|
export function resolveSpherePrimitive(options) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { resolveCircularSampling } from "../../circular-sampling.js";
|
|
2
|
+
import { requireProfileVertexCount } from "../validation.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates an immutable centered CCW circle with +X seam and vertex or face radial sizing.
|
|
5
|
+
*
|
|
6
|
+
* @example Explicit circular point data
|
|
7
|
+
* ```ts
|
|
8
|
+
* circleContour({ diameter: 20, segments: 32 });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export const circleContour = (options) => {
|
|
12
|
+
const operation = "circleContour";
|
|
13
|
+
const { segments, vertexRadius } = resolveCircularSampling(options);
|
|
14
|
+
requireProfileVertexCount(segments, 3, operation, options.limits);
|
|
15
|
+
return Object.freeze(Array.from({ length: segments }, (_, index) => {
|
|
16
|
+
const angle = (Math.PI * 2 * index) / segments;
|
|
17
|
+
return Object.freeze([vertexRadius * Math.cos(angle), vertexRadius * Math.sin(angle)]);
|
|
18
|
+
}));
|
|
19
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { GeometryError } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { GeometryError } from "../../errors.js";
|
|
2
|
+
import { vector2Data } from "../../math/vector-value.js";
|
|
3
|
+
import { resolveCircularPrimitiveSegments } from "../../primitive-resolution.js";
|
|
4
|
+
import { assertPrimitiveOptions } from "../../primitive-resolvers.js";
|
|
5
|
+
import { requireFiniteProfileValues, requireProfileVertexCount } from "../validation.js";
|
|
5
6
|
/**
|
|
6
7
|
* Creates an immutable centered CCW ellipse with +X seam within the selected sampling ceiling.
|
|
7
8
|
*
|
|
@@ -17,12 +18,7 @@ export function ellipseContour(options) {
|
|
|
17
18
|
operation: "ellipseContour",
|
|
18
19
|
});
|
|
19
20
|
}
|
|
20
|
-
const dimensions = options.radius ?? options.size;
|
|
21
|
-
if (!Array.isArray(dimensions) || dimensions.length !== 2) {
|
|
22
|
-
throw new GeometryError("INVALID_ARGUMENT", "Ellipse dimensions must be an exact XY tuple.", {
|
|
23
|
-
operation: "ellipseContour",
|
|
24
|
-
});
|
|
25
|
-
}
|
|
21
|
+
const dimensions = vector2Data(options.radius ?? options.size);
|
|
26
22
|
const factor = options.radius === undefined ? 0.5 : 1;
|
|
27
23
|
const radiusX = dimensions[0] * factor;
|
|
28
24
|
const radiusY = dimensions[1] * factor;
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment, } from "
|
|
2
|
-
import { GeometryError } from "
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { edgeTreatmentPointCount, edgeTreatmentSetbacks, sampleEdgeTreatment, } from "../../edge-finishing.js";
|
|
2
|
+
import { GeometryError } from "../../errors.js";
|
|
3
|
+
import { vector2Data } from "../../math/vector-value.js";
|
|
4
|
+
import { resolveModelingLimits } from "../../model-limits.js";
|
|
5
|
+
import { assertPrimitiveOptions } from "../../primitive-resolvers.js";
|
|
6
|
+
import { resolveAlignedCircularSegments } from "../../resolution.js";
|
|
7
|
+
import { assertSamplingCount } from "../../sampling-limits.js";
|
|
8
|
+
import { requireFiniteProfileValues, requireProfileVertexCount } from "../validation.js";
|
|
8
9
|
const fail = (operation, message) => {
|
|
9
10
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
10
11
|
};
|
|
11
12
|
/** @internal Validates the shared rectangle family before native or pure allocation. */
|
|
12
13
|
export function resolveRectangle(options, operation) {
|
|
13
14
|
assertPrimitiveOptions(options, operation);
|
|
14
|
-
if (typeof options.size !== "number" &&
|
|
15
|
-
(!Array.isArray(options.size) || options.size.length !== 2))
|
|
16
|
-
fail(operation, "size must be a number or an exact XY tuple.");
|
|
17
15
|
if (options.center !== undefined && typeof options.center !== "boolean")
|
|
18
16
|
fail(operation, "center must be boolean.");
|
|
19
|
-
const [width, height] = typeof options.size === "number" ? [options.size, options.size] : options.size;
|
|
17
|
+
const [width, height] = typeof options.size === "number" ? [options.size, options.size] : vector2Data(options.size);
|
|
20
18
|
requireFiniteProfileValues([width, height], operation);
|
|
21
19
|
if (!(width > 0) || !(height > 0))
|
|
22
20
|
fail(operation, "Rectangle dimensions must be positive.");
|
|
@@ -79,7 +77,11 @@ export function rectangleCornerSegments(corner, limits) {
|
|
|
79
77
|
}) / 4);
|
|
80
78
|
}
|
|
81
79
|
/**
|
|
82
|
-
* Creates an immutable sampled CCW rectangle boundary.
|
|
80
|
+
* Creates an immutable sampled CCW rectangle boundary.
|
|
81
|
+
*
|
|
82
|
+
* @remarks
|
|
83
|
+
* A zero round radius leaves square corners. When rounded corners meet, their shared endpoints
|
|
84
|
+
* appear once.
|
|
83
85
|
*
|
|
84
86
|
* Use [rectangle](/docs/reference/model/rectangle) for a filled Section.
|
|
85
87
|
*
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { GeometryError } from "../../errors.js";
|
|
2
|
+
import { requireFiniteProfileValues, requireProfileVertexCount } from "../validation.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates an immutable centered CCW point loop with vertex or face radial sizing and an implicit seam.
|
|
5
|
+
*
|
|
6
|
+
* @example Hexagon sized to its faces
|
|
7
|
+
* ```ts
|
|
8
|
+
* regularPolygonContour({ radius: 10, sides: 6, sizing: "face" });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export const regularPolygonContour = (options) => {
|
|
12
|
+
const operation = "regularPolygonContour";
|
|
13
|
+
const { radius, sides, rotation = 0, sizing = "vertex" } = options;
|
|
14
|
+
requireFiniteProfileValues([radius, rotation], operation);
|
|
15
|
+
if (!(radius > 0)) {
|
|
16
|
+
throw new GeometryError("INVALID_ARGUMENT", "Polygon radius must be positive.", { operation });
|
|
17
|
+
}
|
|
18
|
+
requireProfileVertexCount(sides, 3, operation, options.limits);
|
|
19
|
+
if (sizing !== "vertex" && sizing !== "face")
|
|
20
|
+
throw new GeometryError("INVALID_ARGUMENT", "Polygon sizing must be vertex or face.", {
|
|
21
|
+
operation,
|
|
22
|
+
});
|
|
23
|
+
const sampledRadius = sizing === "face" ? radius / Math.cos(Math.PI / sides) : radius;
|
|
24
|
+
requireFiniteProfileValues([sampledRadius], operation);
|
|
25
|
+
const rotationRadians = ((rotation % 360) * Math.PI) / 180;
|
|
26
|
+
return Object.freeze(Array.from({ length: sides }, (_, index) => {
|
|
27
|
+
const angle = rotationRadians + (Math.PI * 2 * index) / sides;
|
|
28
|
+
return Object.freeze([
|
|
29
|
+
sampledRadius * Math.cos(angle),
|
|
30
|
+
sampledRadius * Math.sin(angle),
|
|
31
|
+
]);
|
|
32
|
+
}));
|
|
33
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { GeometryError } from "../../errors.js";
|
|
2
|
+
import { assertPrimitiveOptions } from "../../primitive-resolvers.js";
|
|
3
|
+
import { requireFiniteProfileValues, requireProfileVertexCount } from "../validation.js";
|
|
4
|
+
/**
|
|
5
|
+
* Creates an immutable centered CCW alternating-radius star within the selected profile sampling ceiling.
|
|
6
|
+
*
|
|
7
|
+
* @example Five-point outline
|
|
8
|
+
* ```ts
|
|
9
|
+
* starContour({ outerRadius: 12, innerRadius: 6, points: 5 });
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export const starContour = (options) => {
|
|
13
|
+
const operation = "starContour";
|
|
14
|
+
assertPrimitiveOptions(options, operation);
|
|
15
|
+
const { outerRadius, innerRadius, points, rotation = 0, limits } = options;
|
|
16
|
+
requireFiniteProfileValues([outerRadius, innerRadius, rotation], operation);
|
|
17
|
+
if (!(outerRadius > 0) || !(innerRadius > 0) || innerRadius >= outerRadius) {
|
|
18
|
+
throw new GeometryError("INVALID_ARGUMENT", "Star radii must be positive, with the inner radius smaller than the outer.", { operation });
|
|
19
|
+
}
|
|
20
|
+
requireProfileVertexCount(points, 3, operation, limits);
|
|
21
|
+
requireProfileVertexCount(points * 2, 6, operation, limits);
|
|
22
|
+
const rotationRadians = ((rotation % 360) * Math.PI) / 180;
|
|
23
|
+
return Object.freeze(Array.from({ length: points * 2 }, (_, index) => {
|
|
24
|
+
const radius = index % 2 === 0 ? outerRadius : innerRadius;
|
|
25
|
+
const angle = (Math.PI * index) / points + rotationRadians;
|
|
26
|
+
return Object.freeze([radius * Math.cos(angle), radius * Math.sin(angle)]);
|
|
27
|
+
}));
|
|
28
|
+
};
|
|
@@ -26,7 +26,7 @@ const AXIS_EPSILON = 1e-10;
|
|
|
26
26
|
* @example Partial revolution with end caps
|
|
27
27
|
* ```ts
|
|
28
28
|
* // Each point is [radius, Z]; the profile seam is implicit.
|
|
29
|
-
*
|
|
29
|
+
* mesh.revolve([[0, 0], [12, 0], [8, 20], [0, 20]], { degrees: 270 });
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
32
|
export const revolveMesh = (input, options = {}) => {
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { SaxesParser } from "saxes";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
2
|
+
import { SVGPathData } from "svg-pathdata";
|
|
3
|
+
import { bounds2 } from "../bounds-value.js";
|
|
4
|
+
import { fitBounds } from "../bounds.js";
|
|
5
|
+
import { GeometryError } from "../errors.js";
|
|
6
|
+
import { regionArea, signedContourArea } from "../regions.js";
|
|
7
|
+
import { resolveCircularSegments, resolveGeometryResolution, } from "../resolution.js";
|
|
8
|
+
import { resolveGeometrySamplingLimits } from "../sampling-limits.js";
|
|
9
|
+
import { strokePathMultiPolygon } from "../stroke-path.js";
|
|
10
|
+
import { createBoundedSvgClipping } from "./fill.js";
|
|
11
|
+
import { inverseMatrix, multiplyMatrices as multiply, transformPoint } from "./matrix.js";
|
|
12
|
+
import { flattenSvgSubpaths, SvgVertexBudget } from "./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
|
}
|
|
@@ -479,7 +488,7 @@ function measureSvgRegion(region) {
|
|
|
479
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,38 @@ 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.
|
|
647
674
|
*
|
|
648
675
|
* This pure operation performs curve flattening, fill and stroke construction, and polygon union;
|
|
649
676
|
* it needs no browser or engine. Geometry counts measure the returned region at the selected
|
|
650
|
-
* resolution, rather than predicting later mesh allocation.
|
|
651
|
-
*
|
|
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.
|
|
652
682
|
*
|
|
653
683
|
* @param svg - Complete SVG XML source, limited to 256 KiB of UTF-8.
|
|
654
684
|
* @param options - Physical flattening and viewport-origin controls.
|
|
@@ -656,5 +686,57 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
656
686
|
* @throws {@link GeometryError} When XML, supported-feature, geometry, or complexity checks fail.
|
|
657
687
|
*/
|
|
658
688
|
export function preflightSvgRegion(svg, options = {}) {
|
|
659
|
-
|
|
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
|
+
});
|
|
660
742
|
}
|
|
@@ -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
|
+
}
|
|
@@ -10,7 +10,7 @@ import { buildOpenSweepMesh } from "./sweep-open.js";
|
|
|
10
10
|
* @example Sweep point data along a bent path
|
|
11
11
|
* ```ts
|
|
12
12
|
* const profile = rectangleContour({ size: [6, 3] });
|
|
13
|
-
*
|
|
13
|
+
* mesh.sweep(profile, [[0, 0, 0], [0, 0, 15], [10, 0, 25]], {
|
|
14
14
|
* orientation: { kind: "transport", initialNormal: [0, 1, 0] },
|
|
15
15
|
* });
|
|
16
16
|
* ```
|
|
@@ -59,6 +59,35 @@ export function validateTransform3(transform, tolerance = {}) {
|
|
|
59
59
|
}
|
|
60
60
|
return transform;
|
|
61
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Validates a proper rigid transform: finite translation and a right-handed orthonormal rotation.
|
|
64
|
+
* Scale, shear, reflection, and perspective are rejected within the default angular tolerance.
|
|
65
|
+
* Returns the original row-major 4x4 matrix without copying or normalizing it.
|
|
66
|
+
*
|
|
67
|
+
* @throws {@link GeometryError} For a malformed, non-finite, or non-rigid matrix.
|
|
68
|
+
*/
|
|
69
|
+
export function validateRigidTransform3(transform) {
|
|
70
|
+
if (!Array.isArray(transform) || transform.length !== 16)
|
|
71
|
+
throw new GeometryError("INVALID_ARGUMENT", "Rigid transforms require sixteen matrix entries.");
|
|
72
|
+
for (let index = 0; index < 16; index++) {
|
|
73
|
+
if (!Object.hasOwn(transform, index) || !Number.isFinite(transform[index]))
|
|
74
|
+
throw new GeometryError("NON_FINITE_VALUE", "Rigid transforms require sixteen finite values.");
|
|
75
|
+
}
|
|
76
|
+
validateTransform3(transform);
|
|
77
|
+
const tolerance = resolveGeometryTolerance().angular;
|
|
78
|
+
for (let row = 0; row < 3; row++) {
|
|
79
|
+
for (let other = row; other < 3; other++) {
|
|
80
|
+
let product = 0;
|
|
81
|
+
for (let column = 0; column < 3; column++)
|
|
82
|
+
product += transform[row * 4 + column] * transform[other * 4 + column];
|
|
83
|
+
if (Math.abs(product - (row === other ? 1 : 0)) > tolerance)
|
|
84
|
+
throw new GeometryError("INVALID_ARGUMENT", "Rigid placement permits only translation and rotation; scale and shear are not supported.");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (Math.abs(transformDeterminant3(transform) - 1) > tolerance)
|
|
88
|
+
throw new GeometryError("INVALID_ARGUMENT", "Rigid placement does not support reflection.");
|
|
89
|
+
return transform;
|
|
90
|
+
}
|
|
62
91
|
/**
|
|
63
92
|
* Creates an immutable translation transform.
|
|
64
93
|
*
|