@metamesh/modeling 0.19.0 → 0.20.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 +49 -0
- package/README.md +34 -18
- package/dist/api/engine.d.ts +217 -121
- package/dist/api/export.d.ts +123 -79
- package/dist/api/geometry.d.ts +406 -2102
- package/dist/api/index.d.ts +472 -1798
- package/dist/api/math.d.ts +315 -0
- package/dist/api/mechanical.d.ts +1041 -0
- package/dist/api/mesh.d.ts +360 -88
- package/dist/api/text.d.ts +24 -44
- package/dist/docs/guides/concepts.md +67 -33
- package/dist/docs/guides/exporting.md +88 -0
- package/dist/docs/guides/fonts.md +5 -3
- package/dist/docs/guides/fundamentals.md +12 -24
- package/dist/docs/guides/generation.md +24 -16
- package/dist/docs/guides/geometry-values.md +192 -134
- package/dist/docs/guides/hosting.md +51 -96
- package/dist/docs/guides/profiles-and-extrusion.md +159 -11
- package/dist/docs/guides/recipes.md +121 -28
- package/dist/docs/guides/resolution-and-inspection.md +43 -23
- package/dist/docs/guides/solid-joins.md +12 -2
- package/dist/docs/guides/standalone-model.md +4 -2
- package/dist/docs/guides/svg-and-text.md +76 -39
- package/dist/docs/guides/sweeps-and-lofts.md +88 -44
- package/dist/docs/guides/transforms-and-placement.md +113 -103
- package/dist/docs/guides/workers.md +166 -0
- package/dist/docs/manifest.json +4133 -4153
- package/dist/docs/reference/engine/GenerationOptions.md +2 -3
- package/dist/docs/reference/engine/GeometryResource.md +6 -6
- package/dist/docs/reference/engine/ModelDependencies.md +2 -2
- package/dist/docs/reference/engine/ModelEngine.md +2 -3
- package/dist/docs/reference/engine/ModelEngineOptions.md +2 -7
- package/dist/docs/reference/engine/ModelPart.md +6 -6
- package/dist/docs/reference/engine/ModelResult.md +2 -2
- package/dist/docs/reference/engine/ModelRunArguments.md +2 -2
- package/dist/docs/reference/engine/ModelRunOptions.md +2 -3
- package/dist/docs/reference/engine/ModelSession.md +2 -2
- package/dist/docs/reference/engine/SessionOptions.md +2 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +9 -3
- package/dist/docs/reference/engine/checkModel.md +6 -2
- package/dist/docs/reference/engine/createModelEngine.md +5 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +4 -11
- package/dist/docs/reference/engine/modelingWasmUrl.md +2 -2
- package/dist/docs/reference/engine.md +7 -1
- package/dist/docs/reference/export/Export3mfOptions.md +2 -6
- package/dist/docs/reference/export/ExportDiagnostic.md +2 -14
- package/dist/docs/reference/export/ExportFormat.md +2 -14
- package/dist/docs/reference/export/ExportGeometry.md +3 -15
- package/dist/docs/reference/export/ExportGlbOptions.md +14 -18
- package/dist/docs/reference/export/ExportLimits.md +2 -14
- package/dist/docs/reference/export/ExportMaterial.md +2 -14
- package/dist/docs/reference/export/ExportOptions.md +2 -14
- package/dist/docs/reference/export/ExportPart.md +2 -14
- package/dist/docs/reference/export/ExportReport.md +2 -14
- package/dist/docs/reference/export/ExportSink.md +5 -15
- package/dist/docs/reference/export/ExportStlOptions.md +2 -6
- package/dist/docs/reference/export/ExportedFile.md +14 -26
- package/dist/docs/reference/export/categories/mesh-serialization.md +9 -3
- package/dist/docs/reference/export/defaultExportLimits.md +2 -2
- package/dist/docs/reference/export/export3mf.md +4 -6
- package/dist/docs/reference/export/exportGlb.md +8 -10
- package/dist/docs/reference/export/exportStl.md +4 -6
- package/dist/docs/reference/export/write3mf.md +6 -6
- package/dist/docs/reference/export/writeGlb.md +10 -10
- package/dist/docs/reference/export/writeStl.md +6 -6
- package/dist/docs/reference/export.md +9 -3
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/Anchor3-type.md +3 -7
- package/dist/docs/reference/geometry/Anchor3Options.md +70 -0
- package/dist/docs/reference/geometry/ArcCurve2.md +3 -3
- package/dist/docs/reference/geometry/ArcCurve3.md +3 -3
- package/dist/docs/reference/geometry/AttachOptions.md +4 -9
- package/dist/docs/reference/geometry/Bounds2-type.md +9 -30
- package/dist/docs/reference/geometry/Bounds2Data.md +2 -19
- package/dist/docs/reference/geometry/Bounds2Input.md +2 -10
- package/dist/docs/reference/geometry/Bounds2Options.md +2 -6
- package/dist/docs/reference/geometry/Bounds3-type.md +9 -30
- package/dist/docs/reference/geometry/Bounds3Data.md +2 -15
- package/dist/docs/reference/geometry/Bounds3Input.md +2 -10
- package/dist/docs/reference/geometry/Bounds3Options.md +2 -6
- package/dist/docs/reference/geometry/BoundsFit2.md +2 -2
- package/dist/docs/reference/geometry/BoundsFit3.md +2 -2
- package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -2
- package/dist/docs/reference/geometry/BoxAnchorFace.md +3 -3
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +3 -3
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +3 -7
- package/dist/docs/reference/geometry/CircleContourOptions.md +3 -7
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +3 -12
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +2 -2
- package/dist/docs/reference/geometry/CircularSampling.md +2 -2
- package/dist/docs/reference/geometry/CircularSamplingOptions.md +2 -2
- package/dist/docs/reference/geometry/Contour.md +4 -9
- package/dist/docs/reference/geometry/ContourCurve.md +3 -3
- package/dist/docs/reference/geometry/ContourPoint.md +3 -3
- package/dist/docs/reference/geometry/ContourSegment.md +3 -3
- package/dist/docs/reference/geometry/CorrespondingComponent.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingContour.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingProfile.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +4 -8
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +3 -3
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +3 -3
- package/dist/docs/reference/geometry/Curve2.md +3 -3
- package/dist/docs/reference/geometry/Curve3.md +3 -3
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +3 -11
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +4 -4
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +2 -2
- package/dist/docs/reference/geometry/EdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -7
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -18
- package/dist/docs/reference/geometry/FittedTextLayout.md +2 -2
- package/dist/docs/reference/geometry/{Frame3.md → Frame3-type.md} +4 -11
- package/dist/docs/reference/geometry/Frame3Options.md +69 -0
- package/dist/docs/reference/geometry/GeometryError.md +2 -6
- package/dist/docs/reference/geometry/GeometryErrorCode.md +2 -6
- package/dist/docs/reference/geometry/GeometryErrorContext.md +2 -6
- package/dist/docs/reference/geometry/GeometryResolution.md +2 -10
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +3 -11
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +3 -11
- package/dist/docs/reference/geometry/GridPatternOptions.md +7 -9
- package/dist/docs/reference/geometry/ImmutableBuffer-type.md +2 -10
- package/dist/docs/reference/geometry/LineCurve2.md +3 -3
- package/dist/docs/reference/geometry/LineCurve3.md +3 -3
- package/dist/docs/reference/geometry/LinearPatternOptions.md +2 -6
- package/dist/docs/reference/geometry/LoftPlacement.md +13 -21
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +3 -7
- package/dist/docs/reference/geometry/ModelingLimits.md +2 -14
- package/dist/docs/reference/geometry/NumericArray.md +2 -10
- package/dist/docs/reference/geometry/Path2-type.md +153 -12
- package/dist/docs/reference/geometry/Path2Data.md +3 -11
- package/dist/docs/reference/geometry/Path2Input.md +3 -11
- package/dist/docs/reference/geometry/Path3-type.md +153 -12
- package/dist/docs/reference/geometry/Path3Data.md +3 -11
- package/dist/docs/reference/geometry/Path3Input.md +3 -11
- package/dist/docs/reference/geometry/PathFrame.md +3 -3
- package/dist/docs/reference/geometry/PathLocation.md +3 -11
- package/dist/docs/reference/geometry/PathNormalGuide.md +4 -12
- package/dist/docs/reference/geometry/PathOptions.md +3 -7
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -7
- package/dist/docs/reference/geometry/PathPlacement.md +5 -5
- package/dist/docs/reference/geometry/PathResamplingOptions.md +3 -11
- package/dist/docs/reference/geometry/PathStation.md +87 -0
- package/dist/docs/reference/geometry/PathSubdivisionOptions.md +44 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +3 -11
- package/dist/docs/reference/geometry/Pivot3Options.md +3 -11
- package/dist/docs/reference/geometry/PolygonData.md +4 -8
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +3 -3
- package/dist/docs/reference/geometry/Profile.md +3 -4
- package/dist/docs/reference/geometry/ProfileComponent2.md +3 -7
- package/dist/docs/reference/geometry/ProfileContour2.md +3 -7
- package/dist/docs/reference/geometry/ProfileSpan2.md +3 -7
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +5 -8
- package/dist/docs/reference/geometry/RadialPatternOptions.md +2 -6
- package/dist/docs/reference/geometry/RadialSizing.md +2 -6
- package/dist/docs/reference/geometry/RadialSizingOptions.md +2 -6
- package/dist/docs/reference/geometry/RectangleContourOptions.md +4 -7
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +3 -7
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +3 -7
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +3 -7
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryResolution.md +71 -0
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +2 -2
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -2
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve3.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +3 -3
- package/dist/docs/reference/geometry/SideProfilePoint.md +3 -3
- package/dist/docs/reference/geometry/SideProfileSegment.md +3 -3
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/SplineOptions.md +69 -0
- package/dist/docs/reference/geometry/StarContourOptions.md +7 -7
- package/dist/docs/reference/geometry/StrokeCap.md +2 -6
- package/dist/docs/reference/geometry/StrokeJoin.md +2 -6
- package/dist/docs/reference/geometry/StrokeOptions.md +3 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +4 -4
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +2 -2
- package/dist/docs/reference/geometry/Transform2-type.md +3 -11
- package/dist/docs/reference/geometry/Transform2Data.md +3 -11
- package/dist/docs/reference/geometry/Transform2Input.md +3 -11
- package/dist/docs/reference/geometry/Transform3-type.md +4 -12
- package/dist/docs/reference/geometry/Transform3Data.md +3 -11
- package/dist/docs/reference/geometry/Transform3Input.md +6 -13
- package/dist/docs/reference/geometry/Vector2-type.md +3 -11
- package/dist/docs/reference/geometry/Vector2Data.md +3 -15
- package/dist/docs/reference/geometry/Vector2Input.md +3 -11
- package/dist/docs/reference/geometry/Vector3-type.md +27 -11
- package/dist/docs/reference/geometry/Vector3Data.md +3 -11
- package/dist/docs/reference/geometry/Vector3Input.md +3 -11
- package/dist/docs/reference/geometry/VectorTextLayout.md +2 -10
- package/dist/docs/reference/geometry/VectorTextMetrics.md +3 -11
- package/dist/docs/reference/geometry/anchor3.md +17 -26
- package/dist/docs/reference/geometry/anchorFrame3.md +6 -6
- package/dist/docs/reference/geometry/attachmentTransform3.md +8 -8
- package/dist/docs/reference/geometry/bounds2.md +6 -8
- package/dist/docs/reference/geometry/bounds3.md +4 -6
- package/dist/docs/reference/geometry/boundsCenter.md +2 -2
- package/dist/docs/reference/geometry/boundsSize.md +2 -2
- package/dist/docs/reference/geometry/boxAnchor3.md +3 -3
- package/dist/docs/reference/geometry/categories/bounds-layout.md +9 -3
- package/dist/docs/reference/geometry/categories/curves-paths.md +24 -13
- package/dist/docs/reference/geometry/categories/immutable-data.md +40 -0
- package/dist/docs/reference/geometry/categories/pattern-placement.md +10 -4
- package/dist/docs/reference/geometry/categories/primitive-options.md +8 -13
- package/dist/docs/reference/geometry/categories/profiles-regions.md +11 -5
- package/dist/docs/reference/geometry/categories/resolution-errors.md +8 -1
- package/dist/docs/reference/geometry/categories/transforms-math.md +20 -51
- package/dist/docs/reference/geometry/categories/vector-import.md +7 -4
- package/dist/docs/reference/geometry/circleContour.md +3 -3
- package/dist/docs/reference/geometry/closeToAxis.md +7 -3
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +9 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +13 -6
- package/dist/docs/reference/geometry/contourContainsPoint.md +7 -3
- package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +3 -3
- package/dist/docs/reference/geometry/distributeAlongPath.md +16 -11
- package/dist/docs/reference/geometry/ellipseContour.md +3 -3
- package/dist/docs/reference/geometry/fitBounds.md +10 -2
- package/dist/docs/reference/geometry/fitTextLayout.md +5 -5
- package/dist/docs/reference/geometry/frame3.md +66 -0
- package/dist/docs/reference/geometry/gridPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/immutableBuffer.md +5 -7
- package/dist/docs/reference/geometry/isGeometryError.md +2 -6
- package/dist/docs/reference/geometry/layoutRow.md +4 -2
- package/dist/docs/reference/geometry/linearPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/matchProfiles.md +5 -3
- package/dist/docs/reference/geometry/normalizeContour.md +8 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -3
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -3
- package/dist/docs/reference/geometry/path2.md +7 -7
- package/dist/docs/reference/geometry/path3.md +7 -7
- package/dist/docs/reference/geometry/pathPatternTransforms.md +12 -8
- package/dist/docs/reference/geometry/preflightSvgRegion.md +5 -5
- package/dist/docs/reference/geometry/radialPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/rectangleContour.md +3 -3
- package/dist/docs/reference/geometry/rectangleProfile.md +3 -4
- package/dist/docs/reference/geometry/regionArea.md +3 -3
- package/dist/docs/reference/geometry/regionBounds.md +6 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +3 -3
- package/dist/docs/reference/geometry/resamplePolyline2.md +7 -3
- package/dist/docs/reference/geometry/resamplePolyline3.md +7 -3
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +5 -5
- package/dist/docs/reference/geometry/resolveArcSegments.md +8 -6
- package/dist/docs/reference/geometry/resolveCircularSampling.md +2 -2
- package/dist/docs/reference/geometry/resolveCircularSegments.md +5 -3
- package/dist/docs/reference/geometry/{resolveExtrusionDivisions.md → resolveExtrusionSlices.md} +16 -15
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -3
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +3 -3
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -5
- package/dist/docs/reference/geometry/sampleContour.md +5 -5
- package/dist/docs/reference/geometry/sampleCurve2.md +7 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +7 -3
- package/dist/docs/reference/geometry/sampleHelix.md +3 -3
- package/dist/docs/reference/geometry/sampleSideProfile.md +5 -5
- package/dist/docs/reference/geometry/sampleTextContours.md +3 -3
- package/dist/docs/reference/geometry/signedContourArea.md +5 -3
- package/dist/docs/reference/geometry/spline2.md +68 -0
- package/dist/docs/reference/geometry/spline3.md +62 -0
- package/dist/docs/reference/geometry/starContour.md +3 -3
- package/dist/docs/reference/geometry/strokeRegionData.md +8 -5
- package/dist/docs/reference/geometry/transform2.md +5 -7
- package/dist/docs/reference/geometry/transform3.md +23 -10
- package/dist/docs/reference/geometry/transformRegionData.md +7 -3
- package/dist/docs/reference/geometry/triangulateContour.md +6 -4
- package/dist/docs/reference/geometry/vector2.md +6 -8
- package/dist/docs/reference/geometry/vector3.md +8 -8
- package/dist/docs/reference/geometry.md +13 -18
- package/dist/docs/reference/{geometry → math}/AxisAngleRotation3.md +4 -5
- package/dist/docs/reference/math/IDENTITY_TRANSFORM3.md +20 -0
- package/dist/docs/reference/math/add2.md +38 -0
- package/dist/docs/reference/math/add3.md +46 -0
- package/dist/docs/reference/math/applyTransformDirection3.md +46 -0
- package/dist/docs/reference/math/applyTransformPoint3.md +44 -0
- package/dist/docs/reference/math/categories/tuple-matrix.md +67 -0
- package/dist/docs/reference/math/cross2.md +38 -0
- package/dist/docs/reference/math/cross3.md +44 -0
- package/dist/docs/reference/math/distance2.md +38 -0
- package/dist/docs/reference/math/distance3.md +38 -0
- package/dist/docs/reference/math/dot2.md +38 -0
- package/dist/docs/reference/math/dot3.md +44 -0
- package/dist/docs/reference/math/eulerTransform3.md +43 -0
- package/dist/docs/reference/math/inverseTransform3.md +36 -0
- package/dist/docs/reference/math/length2.md +32 -0
- package/dist/docs/reference/math/length3.md +32 -0
- package/dist/docs/reference/math/lerp2.md +46 -0
- package/dist/docs/reference/math/lerp3.md +46 -0
- package/dist/docs/reference/math/multiplyTransform3.md +46 -0
- package/dist/docs/reference/math/normalize2.md +45 -0
- package/dist/docs/reference/math/normalize3.md +45 -0
- package/dist/docs/reference/math/projectOntoPlane3.md +40 -0
- package/dist/docs/reference/math/rotate2.md +40 -0
- package/dist/docs/reference/math/rotationTransform3.md +56 -0
- package/dist/docs/reference/math/scale2.md +38 -0
- package/dist/docs/reference/math/scale3.md +44 -0
- package/dist/docs/reference/math/scaleTransform3.md +39 -0
- package/dist/docs/reference/math/subtract2.md +38 -0
- package/dist/docs/reference/math/subtract3.md +44 -0
- package/dist/docs/reference/math/transformDeterminant3.md +38 -0
- package/dist/docs/reference/math/translationTransform3.md +36 -0
- package/dist/docs/reference/math/validateRigidTransform3.md +38 -0
- package/dist/docs/reference/math/validateTransform3.md +48 -0
- package/dist/docs/reference/math.md +22 -0
- package/dist/docs/reference/{geometry → mechanical}/AcmeThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/Bevel.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/BevelSize.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ButtressPressureFlankSide.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ButtressThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleFit.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CompensatedThreadDiameters.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CustomThreadProfileSpec.md +5 -15
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearMeshKind.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearOutlineOptions.md +5 -10
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionOptions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionReport.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/InternalThreadCutterOptions.md +6 -13
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeBaseSpec.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeDimensions.md +4 -5
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeInterval.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSamplingOptions.md +5 -14
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSpec.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/METRIC_FASTENER_STANDARDS.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricFastenerSize.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricFastenerStandard.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricHexNutDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricSocketCapHeadDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/PRINTABLE_THREAD_FIT_POLICIES.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFit.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFitPolicy.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/RackPitchDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/RackPitchSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/SampledThreadHelices.md +4 -8
- package/dist/docs/reference/{geometry → mechanical}/SquareThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ThreadBevelOptions.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadCircularSegmentsOptions.md +5 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadCompensationOptions.md +4 -5
- package/dist/docs/reference/{geometry → mechanical}/ThreadEndStyle.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadEndTreatmentOptions.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadHandedness.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadHelixOptions.md +5 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInEnvelope.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInShape.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfile-type.md +5 -17
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfileBaseSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfileSpec.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadRidgeOptions.md +7 -18
- package/dist/docs/reference/{geometry → mechanical}/ThreadRole.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/ThreadSolidOptions.md +8 -15
- package/dist/docs/reference/{geometry → mechanical}/ThreadSolidPreflight.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutOptions.md +7 -14
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutPreflight.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutShape.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadedRodOptions.md +6 -13
- package/dist/docs/reference/{geometry → mechanical}/TrapezoidalThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/TriangularThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/categories/mechanical.md +8 -2
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadDiameters.md +4 -4
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileAxially.md +12 -6
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileForFaceting.md +13 -3
- package/dist/docs/reference/{geometry → mechanical}/getMetricClearanceHoleDiameter.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/getMetricFastenerStandard.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/measureInternalCylindricalGearPairMotion.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/minimumCylindricalGearToothCountWithoutUndercut.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/preflightInternalThreadCutter.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/preflightThreadedNut.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/preflightThreadedRod.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGear.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGearPair.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveKnuckleHinge.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/resolvePrintableThreadFitPolicy.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveRackPitch.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveThreadCircularSegments.md +7 -5
- package/dist/docs/reference/{geometry → mechanical}/sampleCylindricalGearOutline.md +9 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleInternalCylindricalGearSpaceOutline.md +9 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleRackToothPath.md +10 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleThreadHelices.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/threadProfile.md +7 -3
- package/dist/docs/reference/mechanical.md +19 -0
- package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +128 -0
- package/dist/docs/reference/{geometry → mesh}/HeightfieldMeshLimits.md +5 -13
- package/dist/docs/reference/{geometry → mesh}/HeightfieldPreflight.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/ImmutableTriangleMesh.md +5 -17
- package/dist/docs/reference/mesh/LoftMeshStation.md +32 -0
- package/dist/docs/reference/mesh/MeshRenderOptions.md +3 -3
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationFallbackReason.md +4 -8
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationResult.md +4 -8
- package/dist/docs/reference/{geometry → mesh}/PlanarPatchQuality.md +4 -12
- package/dist/docs/reference/mesh/RenderMesh.md +19 -19
- package/dist/docs/reference/{geometry → mesh}/SolidMeshValidationOptions.md +4 -12
- package/dist/docs/reference/{geometry → mesh}/TriangleMesh.md +8 -12
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysis.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysisOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshInput.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshMeasurements.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityReport.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignature.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureOptions.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureTolerances.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshTopologyAnalysis.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshValidationOptions.md +4 -9
- package/dist/docs/reference/mesh/analyze.md +26 -18
- package/dist/docs/reference/mesh/analyzeQuality.md +12 -12
- package/dist/docs/reference/mesh/bounds.md +5 -6
- package/dist/docs/reference/mesh/categories/operations.md +37 -4
- package/dist/docs/reference/mesh/centroid.md +5 -6
- package/dist/docs/reference/mesh/extrude.md +21 -20
- package/dist/docs/reference/mesh/heightfield.md +8 -8
- package/dist/docs/reference/mesh/immutable.md +7 -5
- package/dist/docs/reference/mesh/join.md +7 -7
- package/dist/docs/reference/mesh/loft.md +19 -18
- package/dist/docs/reference/mesh/optimizePlanarPatches.md +21 -21
- package/dist/docs/reference/mesh/preflightHeightfield.md +8 -8
- package/dist/docs/reference/mesh/preflightThreadSolid.md +22 -25
- package/dist/docs/reference/mesh/render.md +7 -5
- package/dist/docs/reference/mesh/reverse.md +7 -7
- package/dist/docs/reference/mesh/revolve.md +12 -14
- package/dist/docs/reference/mesh/signature.md +12 -12
- package/dist/docs/reference/mesh/sweep.md +96 -25
- package/dist/docs/reference/mesh/threadRidge.md +19 -18
- package/dist/docs/reference/mesh/threadSolid.md +23 -22
- package/dist/docs/reference/mesh/transform.md +8 -9
- package/dist/docs/reference/mesh/validate.md +11 -11
- package/dist/docs/reference/mesh/validateSolid.md +10 -10
- package/dist/docs/reference/mesh.md +8 -2
- package/dist/docs/reference/model/BoxEdge.md +23 -0
- package/dist/docs/reference/model/BoxEdgeSelection.md +27 -0
- package/dist/docs/reference/model/BoxEdgeTreatments.md +27 -0
- package/dist/docs/reference/{geometry → model}/BoxOptions.md +12 -12
- package/dist/docs/reference/model/CircleOptions.md +4 -5
- package/dist/docs/reference/model/CornerCutterOptions.md +93 -0
- package/dist/docs/reference/model/CornerCutterTreatment.md +53 -0
- package/dist/docs/reference/model/{HoleCutterOverrun.md → CutterOverrun.md} +8 -7
- package/dist/docs/reference/model/CylinderOptions.md +64 -0
- package/dist/docs/reference/model/DiagnosticOptions.md +2 -2
- package/dist/docs/reference/model/EdgeCutterOptions.md +129 -0
- package/dist/docs/reference/model/EllipseOptions.md +4 -5
- package/dist/docs/reference/model/EndTreatments.md +43 -0
- package/dist/docs/reference/model/ExtrudeOptions.md +153 -0
- package/dist/docs/reference/model/GenerateCallback.md +2 -2
- package/dist/docs/reference/model/GenerateContext.md +27 -3
- package/dist/docs/reference/model/GenerationDiagnostic.md +2 -2
- package/dist/docs/reference/model/GenerationError.md +2 -2
- package/dist/docs/reference/{geometry → model}/HeightfieldOptions.md +5 -23
- package/dist/docs/reference/model/HoleCutterOpening.md +27 -0
- package/dist/docs/reference/model/HoleCutterOptions.md +9 -22
- package/dist/docs/reference/model/HoleCutterRecess.md +5 -4
- package/dist/docs/reference/model/HullOptions.md +2 -3
- package/dist/docs/reference/model/ImmutableValue.md +2 -2
- package/dist/docs/reference/model/ImplicitOptions.md +3 -9
- package/dist/docs/reference/model/JoinOptions.md +2 -5
- package/dist/docs/reference/model/JoinTransition.md +2 -2
- package/dist/docs/reference/model/KnuckleHinge-type.md +2 -3
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +2 -2
- package/dist/docs/reference/model/KnuckleHingeOptions.md +3 -5
- package/dist/docs/reference/model/KnuckleHingeWeb.md +2 -2
- package/dist/docs/reference/{geometry → model}/LoftCorrespondence.md +8 -11
- package/dist/docs/reference/{geometry → model}/LoftOptions.md +11 -16
- package/dist/docs/reference/model/LoftStation.md +4 -5
- package/dist/docs/reference/model/Memo.md +2 -2
- package/dist/docs/reference/model/ModelProgram.md +2 -2
- package/dist/docs/reference/model/PartDeclaration.md +4 -5
- package/dist/docs/reference/model/PartGeometry.md +3 -5
- package/dist/docs/reference/model/PartOptions.md +4 -5
- package/dist/docs/reference/model/PatternSource.md +4 -4
- package/dist/docs/reference/model/PlaneOptions.md +3 -7
- package/dist/docs/reference/model/PolygonOptions.md +2 -7
- package/dist/docs/reference/model/PrimitiveAttachment.md +50 -0
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +111 -0
- package/dist/docs/reference/model/RectangleOptions.md +21 -26
- package/dist/docs/reference/model/RegularPolygonOptions.md +4 -37
- package/dist/docs/reference/{geometry → model}/RevolveOptions.md +15 -24
- package/dist/docs/reference/model/Section.md +115 -53
- package/dist/docs/reference/model/SectionHullOptions.md +2 -3
- package/dist/docs/reference/model/SectionInspection.md +2 -6
- package/dist/docs/reference/model/SectionOffsetJoin.md +2 -2
- package/dist/docs/reference/model/SectionOffsetOptions.md +2 -3
- package/dist/docs/reference/model/Solid.md +24 -12
- package/dist/docs/reference/model/SolidInspection.md +2 -6
- package/dist/docs/reference/model/SolidSegmentHit.md +2 -6
- package/dist/docs/reference/model/SphereOptions.md +27 -0
- package/dist/docs/reference/model/StarOptions.md +21 -23
- package/dist/docs/reference/model/SvgOrigin.md +2 -2
- package/dist/docs/reference/model/SvgPathSectionOptions.md +3 -5
- package/dist/docs/reference/model/SvgSectionOptions.md +3 -6
- package/dist/docs/reference/model/SweepOptions.md +109 -0
- package/dist/docs/reference/model/SweepOrientation.md +119 -0
- package/dist/docs/reference/model/SweepTransformOptions.md +105 -0
- package/dist/docs/reference/model/TextSectionOptions.md +2 -7
- package/dist/docs/reference/{geometry → model}/TorusOptions.md +11 -10
- package/dist/docs/reference/model/TubeOptions.md +84 -0
- package/dist/docs/reference/model/box.md +11 -10
- package/dist/docs/reference/model/categories/boolean-operations.md +9 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +13 -1
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +26 -7
- package/dist/docs/reference/model/categories/generation.md +11 -3
- package/dist/docs/reference/model/categories/hinges.md +7 -1
- package/dist/docs/reference/model/categories/mesh-inspection.md +7 -1
- package/dist/docs/reference/model/categories/primitives.md +34 -6
- package/dist/docs/reference/model/categories/sections.md +8 -2
- package/dist/docs/reference/model/categories/threads.md +8 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +15 -10
- package/dist/docs/reference/model/circle.md +7 -3
- package/dist/docs/reference/model/cornerCutter.md +88 -0
- package/dist/docs/reference/model/cylinder.md +6 -5
- package/dist/docs/reference/model/edgeCutter.md +91 -0
- package/dist/docs/reference/model/ellipse.md +7 -3
- package/dist/docs/reference/model/extrude.md +29 -23
- package/dist/docs/reference/model/generate.md +4 -2
- package/dist/docs/reference/model/gridPattern.md +11 -4
- package/dist/docs/reference/model/heightfield.md +5 -5
- package/dist/docs/reference/model/holeCutter.md +26 -12
- package/dist/docs/reference/model/hull.md +2 -2
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/internalThreadCutter.md +32 -21
- package/dist/docs/reference/model/intersect.md +7 -3
- package/dist/docs/reference/model/join.md +6 -2
- package/dist/docs/reference/model/knuckleHinge.md +2 -3
- package/dist/docs/reference/model/linearPattern.md +11 -4
- package/dist/docs/reference/model/loft.md +28 -24
- package/dist/docs/reference/model/minkowskiSum.md +3 -3
- package/dist/docs/reference/model/pathPattern.md +17 -8
- package/dist/docs/reference/model/polygon.md +8 -3
- package/dist/docs/reference/model/radialPattern.md +11 -4
- package/dist/docs/reference/model/rectangle.md +11 -7
- package/dist/docs/reference/model/regularPolygon.md +7 -3
- package/dist/docs/reference/model/revolve.md +18 -12
- package/dist/docs/reference/model/solidFromMesh.md +10 -6
- package/dist/docs/reference/model/sphere.md +7 -6
- package/dist/docs/reference/model/star.md +11 -7
- package/dist/docs/reference/model/stroke.md +12 -8
- package/dist/docs/reference/model/svgPathSection.md +10 -4
- package/dist/docs/reference/model/svgSection.md +10 -4
- package/dist/docs/reference/model/sweep.md +102 -25
- package/dist/docs/reference/model/textSection.md +7 -3
- package/dist/docs/reference/model/threadRidge.md +16 -17
- package/dist/docs/reference/model/threadedNut.md +25 -22
- package/dist/docs/reference/model/threadedRod.md +21 -18
- package/dist/docs/reference/model/torus.md +13 -12
- package/dist/docs/reference/model/tube.md +6 -5
- package/dist/docs/reference/model/union.md +7 -3
- package/dist/docs/reference/model.md +10 -5
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +2 -2
- package/dist/docs/reference/text/VectorFont.md +38 -34
- package/dist/docs/reference/text/VectorFontOptions.md +2 -2
- package/dist/docs/reference/{geometry → text}/VectorTextArcBaseline.md +2 -11
- package/dist/docs/reference/{geometry → text}/VectorTextLayoutOptions.md +3 -11
- package/dist/docs/reference/{geometry → text}/VectorTextOptions.md +2 -10
- package/dist/docs/reference/text/categories/font-preparation.md +10 -1
- package/dist/docs/reference/text/prepareVectorFont.md +4 -2
- package/dist/docs/reference/text.md +7 -1
- package/dist/engine/execution.js +5 -3
- package/dist/engine/finalization.js +5 -5
- package/dist/engine/index.js +9 -4
- package/dist/engine/native/adapter.js +1 -1
- package/dist/engine/native/construction-mesh.js +15 -5
- package/dist/engine/native/context.js +10 -7
- package/dist/engine/native/index.js +1 -1
- package/dist/engine/native/material-components.js +2 -2
- package/dist/engine/native/mesh-observation.js +1 -1
- package/dist/engine/native/regions.js +44 -24
- package/dist/engine/native/scoped-primitives.js +3 -3
- package/dist/engine/native/scoped-threads.js +1 -13
- package/dist/engine/native/threads.js +2 -2
- package/dist/engine/native/transforms.js +2 -2
- package/dist/engine/operations/construction.js +77 -27
- package/dist/engine/operations/context.js +13 -6
- package/dist/engine/operations/cutters.js +112 -0
- package/dist/engine/operations/environment.js +2 -2
- package/dist/engine/operations/extrusion-finishing.js +42 -16
- package/dist/engine/operations/hole-cutter.js +125 -114
- package/dist/engine/operations/join-collar-profile.js +19 -19
- package/dist/engine/operations/join.js +86 -73
- package/dist/engine/operations/knuckle-hinge.js +25 -20
- package/dist/engine/operations/loft.js +9 -16
- package/dist/engine/operations/mechanical.js +4 -15
- package/dist/engine/operations/primitives/anchors.js +23 -19
- package/dist/engine/operations/primitives/construction.js +38 -12
- package/dist/engine/operations/primitives/correspondence.js +2 -2
- package/dist/engine/operations/primitives/profile-mesh.js +41 -80
- package/dist/engine/operations/primitives/profiles.js +5 -5
- package/dist/engine/operations/sections.js +8 -8
- package/dist/engine/operations/transforms.js +19 -39
- package/dist/engine/placement.js +3 -3
- package/dist/engine/recipe-realization.js +86 -30
- package/dist/engine/session/declarations.js +98 -0
- package/dist/engine/session/dependencies.js +81 -28
- package/dist/engine/session/graph.js +39 -137
- package/dist/engine/session/parameters.js +78 -0
- package/dist/engine/session/session.js +2 -2
- package/dist/engine/session/snapshot-cache.js +2 -2
- package/dist/engine/shape-anchors.js +13 -6
- package/dist/export/3mf.js +9 -2
- package/dist/export/capture.js +10 -6
- package/dist/export/glb.js +7 -2
- package/dist/export/stl.js +21 -6
- package/dist/geometry/{bounds.js → bounds/operations.js} +3 -1
- package/dist/geometry/{bounds-value.js → bounds/value.js} +20 -16
- package/dist/geometry/curves/evaluation.js +5 -6
- package/dist/geometry/curves/sampling.js +30 -6
- package/dist/geometry/{extrusion.js → extrusion/controls.js} +58 -35
- package/dist/geometry/extrusion/mesh.js +92 -0
- package/dist/geometry/extrusion/stations.js +35 -0
- package/dist/geometry/extrusion/twisted-chamfer.js +265 -0
- package/dist/geometry/immutable-buffer.js +7 -1
- package/dist/geometry/index.js +24 -32
- package/dist/geometry/{model-limits.js → limits.js} +1 -1
- package/dist/geometry/loft/{loft-correspondence.js → correspondence.js} +31 -20
- package/dist/geometry/loft/{loft-geometry.js → geometry.js} +15 -17
- package/dist/geometry/loft/mesh.js +53 -0
- package/dist/geometry/loft/{loft-options.js → options.js} +13 -11
- package/dist/geometry/loft/{loft-simple-mesh.js → simple-mesh.js} +26 -17
- package/dist/geometry/math/interpolation.js +9 -0
- package/dist/geometry/math/vector-value.js +12 -3
- package/dist/geometry/math/vector2.js +18 -5
- package/dist/geometry/math/vector3.js +28 -5
- package/dist/geometry/math-api.js +4 -0
- package/dist/geometry/mechanical/gear-motion.js +7 -5
- package/dist/geometry/mechanical/gears.js +21 -4
- package/dist/geometry/mechanical/knuckle-hinge.js +7 -5
- package/dist/geometry/mechanical/threads/fit.js +8 -2
- package/dist/geometry/mechanical/threads/helices.js +4 -2
- package/dist/geometry/mechanical/threads/mesh-plan.js +4 -2
- package/dist/geometry/mechanical/threads/mesh.js +12 -9
- package/dist/geometry/mechanical/threads/profiles.js +18 -4
- package/dist/geometry/mechanical/threads/solids.js +11 -2
- package/dist/geometry/mechanical-api.js +10 -0
- package/dist/geometry/mesh/{mesh-centroid.js → centroid.js} +2 -1
- package/dist/geometry/{heightfield.js → mesh/heightfield.js} +9 -5
- package/dist/geometry/{join-geometry.js → mesh/join-layers.js} +53 -59
- package/dist/geometry/mesh/{mesh.js → operations.js} +11 -18
- package/dist/geometry/mesh/{mesh-planar.js → planar.js} +8 -18
- package/dist/geometry/mesh/{mesh-quality.js → quality.js} +10 -42
- package/dist/geometry/mesh/{mesh-render.js → render-buffers.js} +22 -7
- package/dist/geometry/mesh/{mesh-signature.js → signature.js} +1 -1
- package/dist/geometry/mesh/{mesh-solid-intersections.js → solid-intersections.js} +2 -0
- package/dist/geometry/mesh/{mesh-solid.js → solid.js} +4 -4
- package/dist/geometry/mesh/triangle-quality.js +42 -0
- package/dist/geometry/mesh/winding.js +11 -0
- package/dist/geometry/{numeric.js → mesh/write-vertex.js} +1 -1
- package/dist/geometry/mesh-api.js +12 -11
- package/dist/geometry/paths/distribution.js +43 -0
- package/dist/geometry/paths/editing.js +76 -0
- package/dist/geometry/paths/frames.js +16 -11
- package/dist/geometry/paths/helix.js +1 -1
- package/dist/geometry/paths/resampling.js +46 -61
- package/dist/geometry/paths/{planar.js → rounding.js} +8 -67
- package/dist/geometry/paths/spline.js +116 -0
- package/dist/geometry/paths/traversal.js +107 -0
- package/dist/geometry/paths/{path-value.js → value.js} +97 -18
- package/dist/geometry/patterns/placements.js +20 -29
- package/dist/geometry/{patterns.js → patterns/transforms.js} +11 -7
- package/dist/geometry/primitives/cutters.js +70 -0
- package/dist/geometry/{cylinder.js → primitives/cylinder.js} +4 -4
- package/dist/geometry/{edge-finishing.js → primitives/edges.js} +5 -5
- package/dist/geometry/{primitive-resolvers.js → primitives/resolvers.js} +9 -9
- package/dist/geometry/primitives/sampling.js +41 -0
- package/dist/geometry/profiles/contour.js +19 -7
- package/dist/geometry/profiles/{match-profiles.js → matching.js} +9 -6
- package/dist/geometry/profiles/primitives/circle.js +1 -1
- package/dist/geometry/profiles/primitives/ellipse.js +2 -2
- package/dist/geometry/profiles/primitives/rectangle.js +8 -8
- package/dist/geometry/profiles/primitives/star.js +1 -1
- package/dist/geometry/profiles/side-profile.js +8 -5
- package/dist/geometry/profiles/validation.js +1 -1
- package/dist/geometry/{polygon-clipping.js → regions/clipping.js} +1 -1
- package/dist/geometry/{convex-offset.js → regions/convex-offset.js} +1 -1
- package/dist/geometry/{region-offset.js → regions/offset.js} +7 -5
- package/dist/geometry/{regions.js → regions/operations.js} +59 -22
- package/dist/geometry/{stroke-path.js → regions/stroke.js} +46 -20
- package/dist/geometry/{loft/loft-triangulation.js → regions/triangulation.js} +35 -2
- package/dist/geometry/revolve/{revolve-mesh.js → mesh.js} +9 -10
- package/dist/geometry/{circular-sampling.js → sampling/circular.js} +3 -3
- package/dist/geometry/{sampling-limits.js → sampling/limits.js} +6 -2
- package/dist/geometry/{resolution.js → sampling/resolution.js} +15 -14
- package/dist/geometry/svg/fill.js +4 -3
- package/dist/geometry/svg/import.js +47 -64
- package/dist/geometry/svg/path.js +3 -3
- package/dist/geometry/sweep/closed.js +55 -0
- package/dist/geometry/sweep/mesh.js +30 -0
- package/dist/geometry/{sweeps/sweep-open.js → sweep/open.js} +9 -24
- package/dist/geometry/{sweeps → sweep}/orientation.js +14 -11
- package/dist/geometry/sweep/seam.js +30 -0
- package/dist/geometry/{sweeps → sweep}/stations.js +75 -10
- package/dist/geometry/sweep/transforms.js +30 -0
- package/dist/geometry/{sweeps → sweep}/validation.js +4 -4
- package/dist/geometry/{text-contours.js → text/contours.js} +3 -3
- package/dist/geometry/{text-fitting.js → text/fitting.js} +4 -3
- package/dist/geometry/text/layout.js +1 -0
- package/dist/geometry/{transform3.js → transforms/affine3.js} +31 -46
- package/dist/geometry/{anchors.js → transforms/anchors.js} +43 -24
- package/dist/geometry/{transform-geometry.js → transforms/apply.js} +8 -5
- package/dist/geometry/{transform2.js → transforms/dimensions.js} +23 -19
- package/dist/geometry/transforms/frame.js +64 -0
- package/dist/geometry/{transform-matrix.js → transforms/matrix-input.js} +8 -1
- package/dist/geometry/{transform-value.js → transforms/value.js} +29 -11
- package/dist/index.js +3 -9
- package/dist/model/cutters.js +1 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +2 -0
- package/dist/model/immutable-generation-data.js +2 -0
- package/dist/model/operations.js +130 -94
- package/dist/model/recipe-declaration.js +5 -7
- package/dist/text/index.js +3 -0
- package/dist/text/vector-text-layout.js +1 -0
- package/package.json +15 -17
- package/dist/api/export-3mf.d.ts +0 -2
- package/dist/api/export-glb.d.ts +0 -2
- package/dist/api/export-stl.d.ts +0 -2
- package/dist/docs/reference/geometry/BoxEdge.md +0 -17
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +0 -24
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +0 -25
- package/dist/docs/reference/geometry/CylinderOptions.md +0 -63
- package/dist/docs/reference/geometry/EndTreatments.md +0 -44
- package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +0 -144
- package/dist/docs/reference/geometry/ExtrudeOptions.md +0 -156
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +0 -25
- package/dist/docs/reference/geometry/LoftMeshStation.md +0 -41
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +0 -39
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +0 -114
- package/dist/docs/reference/geometry/SphereOptions.md +0 -25
- package/dist/docs/reference/geometry/SweepOptions.md +0 -127
- package/dist/docs/reference/geometry/SweepOrientation.md +0 -127
- package/dist/docs/reference/geometry/TubeOptions.md +0 -72
- package/dist/docs/reference/geometry/add2.md +0 -43
- package/dist/docs/reference/geometry/add3.md +0 -49
- package/dist/docs/reference/geometry/applyTransformDirection3.md +0 -52
- package/dist/docs/reference/geometry/applyTransformPoint3.md +0 -50
- package/dist/docs/reference/geometry/categories/meshes.md +0 -68
- package/dist/docs/reference/geometry/composeTransform3.md +0 -51
- package/dist/docs/reference/geometry/cross2.md +0 -43
- package/dist/docs/reference/geometry/cross3.md +0 -49
- package/dist/docs/reference/geometry/distance2.md +0 -43
- package/dist/docs/reference/geometry/distance3.md +0 -43
- package/dist/docs/reference/geometry/dot2.md +0 -43
- package/dist/docs/reference/geometry/dot3.md +0 -49
- package/dist/docs/reference/geometry/eulerTransform3.md +0 -49
- package/dist/docs/reference/geometry/frameTransform3.md +0 -55
- package/dist/docs/reference/geometry/inverseTransform3.md +0 -41
- package/dist/docs/reference/geometry/length2.md +0 -37
- package/dist/docs/reference/geometry/length3.md +0 -37
- package/dist/docs/reference/geometry/lerp2.md +0 -49
- package/dist/docs/reference/geometry/lerp3.md +0 -49
- package/dist/docs/reference/geometry/normalize2.md +0 -46
- package/dist/docs/reference/geometry/normalize3.md +0 -46
- package/dist/docs/reference/geometry/projectOntoPlane3.md +0 -43
- package/dist/docs/reference/geometry/rotate2.md +0 -43
- package/dist/docs/reference/geometry/rotationTransform3.md +0 -60
- package/dist/docs/reference/geometry/scale2.md +0 -43
- package/dist/docs/reference/geometry/scale3.md +0 -49
- package/dist/docs/reference/geometry/scaleTransform3.md +0 -45
- package/dist/docs/reference/geometry/subtract2.md +0 -43
- package/dist/docs/reference/geometry/subtract3.md +0 -49
- package/dist/docs/reference/geometry/transformDeterminant3.md +0 -43
- package/dist/docs/reference/geometry/translationTransform3.md +0 -42
- package/dist/docs/reference/geometry/validateRigidTransform3.md +0 -41
- package/dist/docs/reference/geometry/validateTransform3.md +0 -54
- package/dist/docs/reference/model/Profile.md +0 -30
- package/dist/docs/reference/model/categories/explicit-profiles.md +0 -21
- package/dist/docs/reference/model/matchProfiles.md +0 -48
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +0 -93
- package/dist/docs/reference/model/preflightThreadedNut.md +0 -109
- package/dist/docs/reference/model/preflightThreadedRod.md +0 -93
- package/dist/engine/operations/patterns.js +0 -47
- package/dist/geometry/loft/loft.js +0 -105
- package/dist/geometry/mechanical/index.js +0 -14
- package/dist/geometry/primitive-resolution.js +0 -20
- package/dist/geometry/svg/index.js +0 -1
- package/dist/geometry/sweeps/options.js +0 -29
- package/dist/geometry/sweeps/sweep-closed.js +0 -96
- package/dist/geometry/sweeps/sweep-mesh.js +0 -32
- /package/dist/geometry/mechanical/{standards.js → fastener-standards.js} +0 -0
- /package/dist/geometry/mesh/{mesh-edge-table.js → edge-table.js} +0 -0
- /package/dist/geometry/mesh/{mesh-types.js → types.js} +0 -0
- /package/dist/geometry/mesh/{mesh-view-cache.js → view-cache.js} +0 -0
- /package/dist/geometry/{primitive-options.js → primitives/options.js} +0 -0
- /package/dist/geometry/{text-layout.js → sweep/options.js} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { SaxesParser } from "saxes";
|
|
2
2
|
import { SVGPathData } from "svg-pathdata";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { fitBounds } from "../bounds/operations.js";
|
|
4
|
+
import { bounds2 } from "../bounds/value.js";
|
|
5
5
|
import { GeometryError } from "../errors.js";
|
|
6
|
-
import { regionArea, signedContourArea } from "../regions.js";
|
|
7
|
-
import {
|
|
8
|
-
import { resolveGeometrySamplingLimits } from "../sampling
|
|
9
|
-
import {
|
|
6
|
+
import { regionArea, signedContourArea } from "../regions/operations.js";
|
|
7
|
+
import { strokePathMultiPolygon } from "../regions/stroke.js";
|
|
8
|
+
import { resolveGeometrySamplingLimits } from "../sampling/limits.js";
|
|
9
|
+
import { resolveCircularSegments, resolveGeometryResolution, } from "../sampling/resolution.js";
|
|
10
10
|
import { createBoundedSvgClipping } from "./fill.js";
|
|
11
11
|
import { inverseMatrix, multiplyMatrices as multiply, transformPoint } from "./matrix.js";
|
|
12
12
|
import { flattenSvgSubpaths, SvgVertexBudget } from "./path.js";
|
|
@@ -32,7 +32,7 @@ const SUPPORTED_TAGS = new Set([
|
|
|
32
32
|
const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
33
33
|
const NUMBER_PATTERN = /^[-+]?(?:\d*\.\d+|\d+\.?)(?:e[-+]?\d+)?$/i;
|
|
34
34
|
const SAFE_COLOR_PATTERN = /^(?:none|#[0-9a-f]{3,8}|(?:rgb|hsl)a?\([\d\s.,%+-]+\)|[a-z]+)$/i;
|
|
35
|
-
const
|
|
35
|
+
const PAINT_ATTRIBUTES = new Set([
|
|
36
36
|
"fill",
|
|
37
37
|
"fill-opacity",
|
|
38
38
|
"fill-rule",
|
|
@@ -41,9 +41,8 @@ const PRESENTATION_ATTRIBUTES = [
|
|
|
41
41
|
"stroke-linejoin",
|
|
42
42
|
"stroke-opacity",
|
|
43
43
|
"stroke-width",
|
|
44
|
-
|
|
45
|
-
];
|
|
46
|
-
const COMMON_ATTRIBUTES = new Set(["id", "name", "transform", ...PRESENTATION_ATTRIBUTES]);
|
|
44
|
+
]);
|
|
45
|
+
const COMMON_ATTRIBUTES = new Set(["id", "name", "transform", "style", ...PAINT_ATTRIBUTES]);
|
|
47
46
|
const ATTRIBUTES_BY_TAG = {
|
|
48
47
|
svg: new Set([
|
|
49
48
|
...COMMON_ATTRIBUTES,
|
|
@@ -170,22 +169,12 @@ function inlineStyle(value) {
|
|
|
170
169
|
if (value === undefined || value.trim() === "")
|
|
171
170
|
return {};
|
|
172
171
|
const output = {};
|
|
173
|
-
const allowed = new Set([
|
|
174
|
-
"fill",
|
|
175
|
-
"fill-opacity",
|
|
176
|
-
"fill-rule",
|
|
177
|
-
"stroke",
|
|
178
|
-
"stroke-linecap",
|
|
179
|
-
"stroke-linejoin",
|
|
180
|
-
"stroke-opacity",
|
|
181
|
-
"stroke-width",
|
|
182
|
-
]);
|
|
183
172
|
for (const declaration of value.split(";")) {
|
|
184
173
|
if (declaration.trim() === "")
|
|
185
174
|
continue;
|
|
186
175
|
const separator = declaration.indexOf(":");
|
|
187
176
|
const key = declaration.slice(0, separator).trim().toLowerCase();
|
|
188
|
-
if (separator <= 0 || !
|
|
177
|
+
if (separator <= 0 || !PAINT_ATTRIBUTES.has(key))
|
|
189
178
|
return fail(`Unsupported SVG style “${key}”.`);
|
|
190
179
|
output[key] = declaration.slice(separator + 1).trim();
|
|
191
180
|
}
|
|
@@ -346,6 +335,7 @@ function adaptivePathSubpaths(d, transform, resolution, budget, estimate = false
|
|
|
346
335
|
}
|
|
347
336
|
}
|
|
348
337
|
function elementSubpaths(tag, values, transform, resolution, budget, estimate = false) {
|
|
338
|
+
let pathData;
|
|
349
339
|
switch (tag) {
|
|
350
340
|
case "rect": {
|
|
351
341
|
const x = finite(values.x, 0);
|
|
@@ -357,25 +347,19 @@ function elementSubpaths(tag, values, transform, resolution, budget, estimate =
|
|
|
357
347
|
const rx = values.rx === undefined ? finite(values.ry, 0) : finite(values.rx, 0);
|
|
358
348
|
const ry = values.ry === undefined ? rx : finite(values.ry, 0);
|
|
359
349
|
if (rx === 0 || ry === 0) {
|
|
360
|
-
|
|
350
|
+
pathData = `M${x} ${y}H${x + width}V${y + height}H${x}Z`;
|
|
361
351
|
}
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const segments = resolveCircularSegments(radius * maximumLinearScale(transform), resolution, budget.limits);
|
|
369
|
-
return [
|
|
370
|
-
{
|
|
371
|
-
closed: true,
|
|
372
|
-
points: ellipsePoints(finite(values.cx, 0), finite(values.cy, 0), radius, radius, segments, budget),
|
|
373
|
-
},
|
|
374
|
-
];
|
|
352
|
+
else {
|
|
353
|
+
const radiusX = Math.min(Math.max(0, rx), width / 2);
|
|
354
|
+
const radiusY = Math.min(Math.max(0, ry), height / 2);
|
|
355
|
+
pathData = `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`;
|
|
356
|
+
}
|
|
357
|
+
break;
|
|
375
358
|
}
|
|
359
|
+
case "circle":
|
|
376
360
|
case "ellipse": {
|
|
377
|
-
const radiusX = finite(values.rx);
|
|
378
|
-
const radiusY = finite(values.ry);
|
|
361
|
+
const radiusX = finite(tag === "circle" ? values.r : values.rx);
|
|
362
|
+
const radiusY = tag === "circle" ? radiusX : finite(values.ry);
|
|
379
363
|
const segments = resolveCircularSegments(Math.max(radiusX, radiusY) * maximumLinearScale(transform), resolution, budget.limits);
|
|
380
364
|
return [
|
|
381
365
|
{
|
|
@@ -385,20 +369,23 @@ function elementSubpaths(tag, values, transform, resolution, budget, estimate =
|
|
|
385
369
|
];
|
|
386
370
|
}
|
|
387
371
|
case "line":
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
return adaptivePathSubpaths(points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join(""), transform, resolution, budget, estimate);
|
|
392
|
-
}
|
|
372
|
+
pathData = `M${finite(values.x1, 0)} ${finite(values.y1, 0)}L${finite(values.x2, 0)} ${finite(values.y2, 0)}`;
|
|
373
|
+
break;
|
|
374
|
+
case "polyline":
|
|
393
375
|
case "polygon": {
|
|
394
376
|
const points = parsePoints(values.points);
|
|
395
|
-
|
|
377
|
+
pathData = points.map(([x, y], index) => `${index === 0 ? "M" : "L"}${x} ${y}`).join("");
|
|
378
|
+
if (tag === "polygon")
|
|
379
|
+
pathData += "Z";
|
|
380
|
+
break;
|
|
396
381
|
}
|
|
397
382
|
case "path":
|
|
398
|
-
|
|
383
|
+
pathData = values.d ?? "";
|
|
384
|
+
break;
|
|
399
385
|
default:
|
|
400
386
|
return [];
|
|
401
387
|
}
|
|
388
|
+
return adaptivePathSubpaths(pathData, transform, resolution, budget, estimate);
|
|
402
389
|
}
|
|
403
390
|
function strokeConstructionVertexCount(subpath, paint, circularSegments) {
|
|
404
391
|
const minimumPoints = subpath.closed ? 3 : 2;
|
|
@@ -413,7 +400,9 @@ function strokeConstructionVertexCount(subpath, paint, circularSegments) {
|
|
|
413
400
|
: paint.strokeLinejoin === "miter"
|
|
414
401
|
? 4
|
|
415
402
|
: 3) +
|
|
416
|
-
(!subpath.closed && paint.strokeLinecap === "round"
|
|
403
|
+
(!subpath.closed && paint.strokeLinecap === "round"
|
|
404
|
+
? 2 * (Math.ceil(circularSegments / 2) - 1)
|
|
405
|
+
: 0));
|
|
417
406
|
}
|
|
418
407
|
function transformMultiPolygon(value, matrix) {
|
|
419
408
|
return value.map((polygon) => polygon.map((path) => path.map((point) => {
|
|
@@ -425,12 +414,6 @@ function polygonArea(polygon) {
|
|
|
425
414
|
return (Math.abs(signedContourArea(polygon.outer)) -
|
|
426
415
|
polygon.holes.reduce((total, hole) => total + Math.abs(signedContourArea(hole)), 0));
|
|
427
416
|
}
|
|
428
|
-
function loopEdgeLengths(loop) {
|
|
429
|
-
return loop.map((point, index) => {
|
|
430
|
-
const next = loop[(index + 1) % loop.length];
|
|
431
|
-
return Math.hypot(next[0] - point[0], next[1] - point[1]);
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
417
|
function measureSvgRegion(region) {
|
|
435
418
|
const holes = region.reduce((total, polygon) => total + polygon.holes.length, 0);
|
|
436
419
|
let maxX = Number.NEGATIVE_INFINITY;
|
|
@@ -443,13 +426,14 @@ function measureSvgRegion(region) {
|
|
|
443
426
|
for (const polygon of region) {
|
|
444
427
|
for (const loop of [polygon.outer, ...polygon.holes]) {
|
|
445
428
|
vertices += loop.length;
|
|
446
|
-
for (
|
|
429
|
+
for (let index = 0; index < loop.length; index += 1) {
|
|
430
|
+
const point = loop[index];
|
|
431
|
+
const next = loop[(index + 1) % loop.length];
|
|
447
432
|
minX = Math.min(minX, point[0]);
|
|
448
433
|
minY = Math.min(minY, point[1]);
|
|
449
434
|
maxX = Math.max(maxX, point[0]);
|
|
450
435
|
maxY = Math.max(maxY, point[1]);
|
|
451
|
-
|
|
452
|
-
for (const length of loopEdgeLengths(loop)) {
|
|
436
|
+
const length = Math.hypot(next[0] - point[0], next[1] - point[1]);
|
|
453
437
|
minEdgeLength = Math.min(minEdgeLength, length);
|
|
454
438
|
if (length < SHORT_EDGE_LENGTH_MM)
|
|
455
439
|
shortEdgeCount += 1;
|
|
@@ -475,18 +459,13 @@ function measureSvgRegion(region) {
|
|
|
475
459
|
});
|
|
476
460
|
}
|
|
477
461
|
/**
|
|
478
|
-
*
|
|
462
|
+
* Runs one bounded SVG import pass, optionally retaining coarse spans for fitted bounds.
|
|
479
463
|
*
|
|
480
464
|
* Presentation colors are ignored, but every visible fill and positive-width stroke contributes
|
|
481
465
|
* geometry. Open filled subpaths use SVG's implicit closure while open strokes remain open.
|
|
482
466
|
* Transforms and declared physical units are flattened, viewport placement is explicit, and
|
|
483
467
|
* metadata is ignored. Tiny-island and short-edge counts are conservative physical indicators,
|
|
484
468
|
* not proof of raster provenance or process-specific manufacturability.
|
|
485
|
-
*
|
|
486
|
-
* @param svg - Complete SVG XML source, limited to 256 KiB of UTF-8.
|
|
487
|
-
* @param options - Physical flattening and viewport-origin controls.
|
|
488
|
-
* @returns The normalized sampled region plus bounded review metrics and repairs.
|
|
489
|
-
* @throws {@link GeometryError} When XML, supported-feature, geometry, or complexity checks fail.
|
|
490
469
|
*/
|
|
491
470
|
function createSvgRegionPreflight(svg, options = {}, estimate = false) {
|
|
492
471
|
const bytes = new TextEncoder().encode(svg).byteLength;
|
|
@@ -566,7 +545,8 @@ function createSvgRegionPreflight(svg, options = {}, estimate = false) {
|
|
|
566
545
|
}
|
|
567
546
|
if (tag === "svg" && parent !== undefined)
|
|
568
547
|
return fail("Nested SVG roots are not supported.");
|
|
569
|
-
|
|
548
|
+
const localTransform = parseTransform(values.transform);
|
|
549
|
+
let transform = multiply(parent?.transform ?? [1, 0, 0, 1, 0, 0], localTransform);
|
|
570
550
|
const paint = parsePaint(values, parent?.paint ?? DEFAULT_PAINT);
|
|
571
551
|
if (tag === "svg") {
|
|
572
552
|
if (rootSeen)
|
|
@@ -576,7 +556,7 @@ function createSvgRegionPreflight(svg, options = {}, estimate = false) {
|
|
|
576
556
|
const [, , viewWidth, viewHeight] = box;
|
|
577
557
|
const width = lengthMm(values.width, viewWidth);
|
|
578
558
|
const height = lengthMm(values.height, viewHeight);
|
|
579
|
-
transform = multiply(canvasTransform(values, width, height, box, origin),
|
|
559
|
+
transform = multiply(canvasTransform(values, width, height, box, origin), localTransform);
|
|
580
560
|
if (options.fit !== undefined) {
|
|
581
561
|
// Fitted artwork has no meaningful source-unit topology tolerance. Keep sampling,
|
|
582
562
|
// stroking and clipping near a unit viewport, then compose this physical-unit scale
|
|
@@ -592,6 +572,8 @@ function createSvgRegionPreflight(svg, options = {}, estimate = false) {
|
|
|
592
572
|
elementCount += 1;
|
|
593
573
|
if (elementCount > MAX_SVG_ELEMENTS)
|
|
594
574
|
return fail(`SVG geometry may contain at most ${MAX_SVG_ELEMENTS} elements.`);
|
|
575
|
+
// Flatten with transformed error bounds, retaining source coordinates for stroke widths.
|
|
576
|
+
// Fills can use transformed points immediately; stroke outlines must be built locally first.
|
|
595
577
|
const localSubpaths = elementSubpaths(tag, values, transform, resolution, budget, estimate);
|
|
596
578
|
const subpaths = localSubpaths.map((subpath) => ({
|
|
597
579
|
...subpath,
|
|
@@ -607,6 +589,7 @@ function createSvgRegionPreflight(svg, options = {}, estimate = false) {
|
|
|
607
589
|
if (!paintedFill && !paintedStroke)
|
|
608
590
|
invisibleElementCount += 1;
|
|
609
591
|
if (paintedFill) {
|
|
592
|
+
// SVG implicitly closes filled paths without closing those same paths for strokes.
|
|
610
593
|
implicitFilledClosureCount += subpaths.filter((subpath) => !subpath.closed && subpath.points.length >= 3).length;
|
|
611
594
|
appendGeometry(elementGeometry, fillGeometry(subpaths, paint.fillRule), "element fill output");
|
|
612
595
|
}
|
|
@@ -681,7 +664,7 @@ function createSvgRegionPreflight(svg, options = {}, estimate = false) {
|
|
|
681
664
|
* manufacturability or later solid validity.
|
|
682
665
|
*
|
|
683
666
|
* @param svg - Complete SVG XML source, limited to 256 KiB of UTF-8.
|
|
684
|
-
* @param options - Physical
|
|
667
|
+
* @param options - Physical sampling, viewport origin, and optional fitting to millimetre bounds.
|
|
685
668
|
* @returns The canonical normalized region plus bounded source, topology, and safe-repair facts.
|
|
686
669
|
* @throws {@link GeometryError} When XML, supported-feature, geometry, or complexity checks fail.
|
|
687
670
|
*/
|
|
@@ -689,7 +672,7 @@ export function preflightSvgRegion(svg, options = {}) {
|
|
|
689
672
|
if (options.fit === undefined)
|
|
690
673
|
return createSvgRegionPreflight(svg, options)[0];
|
|
691
674
|
// Capture mutable caller data once; all refinement passes fit to the same finite target.
|
|
692
|
-
const target = bounds2(options.fit);
|
|
675
|
+
const target = bounds2(options.fit).toData();
|
|
693
676
|
const resolution = svgResolution(options);
|
|
694
677
|
let samplingScale = 1;
|
|
695
678
|
for (let pass = 0; pass < MAX_SVG_FIT_PASSES; pass++) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { SVGPathData, SVGPathDataTransformer } from "svg-pathdata";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling/limits.js";
|
|
3
|
+
import { resolveArcSegments, resolveGeometryResolution, } from "../sampling/resolution.js";
|
|
4
4
|
import { complexity, invalid, rethrowAsInvalid } from "./errors.js";
|
|
5
5
|
import { transformPoint } from "./matrix.js";
|
|
6
|
-
|
|
6
|
+
const MAX_CURVE_RECURSION = 16;
|
|
7
7
|
export class SvgVertexBudget {
|
|
8
8
|
limits;
|
|
9
9
|
#emittedCount = 0;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
|
|
2
|
+
import { validateTriangleMesh } from "../mesh/operations.js";
|
|
3
|
+
import { validateSweepOptions } from "./orientation.js";
|
|
4
|
+
import { sweepSeamOffset } from "./seam.js";
|
|
5
|
+
import { prepareSweepStations, resolveSweepScales } from "./stations.js";
|
|
6
|
+
import { assertSweepAllocation, normalizeSweepPath, normalizeSweepProfile, writeSweepVertex, } from "./validation.js";
|
|
7
|
+
/** @internal Checks host allocation policy before frames or manufacturing buffers. */
|
|
8
|
+
export const buildClosedSweepMesh = (profile, inputPath, options = {}) => {
|
|
9
|
+
const operation = "sweep";
|
|
10
|
+
validateSweepOptions(options);
|
|
11
|
+
profile = normalizeSweepProfile(profile, operation, options.limits);
|
|
12
|
+
const normalizedPath = normalizeSweepPath(inputPath, true, operation, options.limits);
|
|
13
|
+
assertSweepAllocation(normalizedPath.length, profile.length, true, operation, options.limits);
|
|
14
|
+
const originalScales = resolveSweepScales(options.scale, normalizedPath, options.closed);
|
|
15
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
16
|
+
const ringVertexCount = profile.length;
|
|
17
|
+
const normalizedSeamProfileOffset = sweepSeamOffset(profile, originalScales[0], options.twist ?? 0);
|
|
18
|
+
const { path, scales, frames: transportedFrames, twists, } = prepareSweepStations([profile], normalizedPath, originalScales, options, (count) => assertSweepAllocation(count, profile.length, true, operation, options.limits));
|
|
19
|
+
const positions = new Float32Array(path.length * ringVertexCount * 3);
|
|
20
|
+
for (let ring = 0; ring < path.length; ring += 1) {
|
|
21
|
+
const point = path[ring];
|
|
22
|
+
const tangent = transportedFrames[ring].tangent;
|
|
23
|
+
const twist = twists?.[ring] ?? twistRadians * (ring / path.length);
|
|
24
|
+
const baseNormal = transportedFrames[ring].normal;
|
|
25
|
+
const normal = rotateAroundAxis3Radians(baseNormal, tangent, twist);
|
|
26
|
+
const binormal = rotateAroundAxis3Radians(transportedFrames[ring].binormal, tangent, twist);
|
|
27
|
+
const [scaleX, scaleY] = scales[ring];
|
|
28
|
+
for (let profileIndex = 0; profileIndex < profile.length; profileIndex += 1) {
|
|
29
|
+
const [x, y] = profile[profileIndex];
|
|
30
|
+
const vertex = add3(point, add3(scale3(normal, x * scaleX), scale3(binormal, y * scaleY)));
|
|
31
|
+
writeSweepVertex(positions, (ring * ringVertexCount + profileIndex) * 3, vertex, operation);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const indices = new Uint32Array(path.length * ringVertexCount * 2 * 3);
|
|
35
|
+
let cursor = 0;
|
|
36
|
+
for (let ring = 0; ring < path.length; ring += 1) {
|
|
37
|
+
const nextRing = (ring + 1) % path.length;
|
|
38
|
+
const nextProfileOffset = nextRing === 0 ? normalizedSeamProfileOffset : 0;
|
|
39
|
+
for (let profileIndex = 0; profileIndex < ringVertexCount; profileIndex += 1) {
|
|
40
|
+
const following = (profileIndex + 1) % ringVertexCount;
|
|
41
|
+
const a = ring * ringVertexCount + profileIndex;
|
|
42
|
+
const b = ring * ringVertexCount + following;
|
|
43
|
+
const c = nextRing * ringVertexCount + ((following + nextProfileOffset) % ringVertexCount);
|
|
44
|
+
const d = nextRing * ringVertexCount + ((profileIndex + nextProfileOffset) % ringVertexCount);
|
|
45
|
+
indices[cursor] = a;
|
|
46
|
+
indices[cursor + 1] = b;
|
|
47
|
+
indices[cursor + 2] = c;
|
|
48
|
+
indices[cursor + 3] = a;
|
|
49
|
+
indices[cursor + 4] = c;
|
|
50
|
+
indices[cursor + 5] = d;
|
|
51
|
+
cursor += 6;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return validateTriangleMesh({ indices, positions });
|
|
55
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { resolveModelingLimits } from "../limits.js";
|
|
2
|
+
import { pointLoftProfile, prepareLoftGeometry } from "../loft/geometry.js";
|
|
3
|
+
import { simpleLoftMesh } from "../loft/simple-mesh.js";
|
|
4
|
+
import { path2InputData, path3InputData, } from "../paths/value.js";
|
|
5
|
+
import { buildClosedSweepMesh } from "./closed.js";
|
|
6
|
+
import { buildOpenSweepMesh } from "./open.js";
|
|
7
|
+
import { validateSweepOptions, validateSweepTransformOptions } from "./orientation.js";
|
|
8
|
+
import { isSweepTransformRoute, sweepTransforms } from "./transforms.js";
|
|
9
|
+
import { normalizeSweepProfile } from "./validation.js";
|
|
10
|
+
export function sweepMesh(profile, route, options = {}) {
|
|
11
|
+
const explicit = isSweepTransformRoute(route);
|
|
12
|
+
if (explicit)
|
|
13
|
+
validateSweepTransformOptions(options);
|
|
14
|
+
else
|
|
15
|
+
validateSweepOptions(options);
|
|
16
|
+
const limits = resolveModelingLimits(options.limits);
|
|
17
|
+
const outline = path2InputData(profile, true, { maxPathPoints: limits.maxProfilePoints }).points;
|
|
18
|
+
if (explicit) {
|
|
19
|
+
const transforms = sweepTransforms(route, options.closed ?? false, limits);
|
|
20
|
+
const profile = pointLoftProfile(normalizeSweepProfile(outline, "sweep", limits));
|
|
21
|
+
const geometry = prepareLoftGeometry(transforms.map((transform) => ({ profile, transform })), {}, limits, true);
|
|
22
|
+
return simpleLoftMesh(geometry, limits, options.closed ?? false);
|
|
23
|
+
}
|
|
24
|
+
const data = path3InputData(route, options.closed, limits);
|
|
25
|
+
const selected = { ...options, closed: data.closed };
|
|
26
|
+
if (data.closed) {
|
|
27
|
+
return buildClosedSweepMesh(outline, data.points, selected);
|
|
28
|
+
}
|
|
29
|
+
return buildOpenSweepMesh(outline, data.points, selected);
|
|
30
|
+
}
|
|
@@ -1,34 +1,19 @@
|
|
|
1
|
-
import { triangulateContour } from "../loft/loft.js";
|
|
2
1
|
import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
|
|
3
|
-
import { validateTriangleMesh } from "../mesh/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { validateTriangleMesh } from "../mesh/operations.js";
|
|
3
|
+
import { triangulateContour } from "../regions/triangulation.js";
|
|
4
|
+
import { validateSweepOptions } from "./orientation.js";
|
|
5
|
+
import { prepareSweepStations, resolveSweepScales } from "./stations.js";
|
|
7
6
|
import { assertSweepAllocation, normalizeSweepPath, normalizeSweepProfile, writeSweepVertex, } from "./validation.js";
|
|
8
7
|
/** @internal Checks host allocation policy before frames, caps or manufacturing buffers. */
|
|
9
|
-
export const buildOpenSweepMesh = (profile,
|
|
8
|
+
export const buildOpenSweepMesh = (profile, inputPath, options = {}) => {
|
|
10
9
|
const operation = "sweep";
|
|
11
10
|
validateSweepOptions(options);
|
|
12
11
|
profile = normalizeSweepProfile(profile, operation, options.limits);
|
|
13
|
-
|
|
14
|
-
assertSweepAllocation(
|
|
15
|
-
|
|
12
|
+
const normalizedPath = normalizeSweepPath(inputPath, false, operation, options.limits);
|
|
13
|
+
assertSweepAllocation(normalizedPath.length, profile.length, false, operation, options.limits);
|
|
14
|
+
const originalScales = resolveSweepScales(options.scale, normalizedPath, options.closed);
|
|
16
15
|
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
17
|
-
|
|
18
|
-
const plan = planSweepStations([profile], path, scales, options);
|
|
19
|
-
assertSweepAllocation(plan.stationCount, profile.length, false, operation, options.limits);
|
|
20
|
-
}
|
|
21
|
-
let frames = computeSweepFrames(path, options);
|
|
22
|
-
let twists;
|
|
23
|
-
if (twistRadians !== 0) {
|
|
24
|
-
const plan = planSweepStations([profile], path, scales, options, frames);
|
|
25
|
-
assertSweepAllocation(plan.stationCount, profile.length, false, operation, options.limits);
|
|
26
|
-
const refined = refineSweepStations(path, scales, frames, options, plan);
|
|
27
|
-
path = refined.path;
|
|
28
|
-
scales = refined.scales;
|
|
29
|
-
frames = refined.frames;
|
|
30
|
-
twists = refined.twists;
|
|
31
|
-
}
|
|
16
|
+
const { path, scales, frames, twists } = prepareSweepStations([profile], normalizedPath, originalScales, options, (count) => assertSweepAllocation(count, profile.length, false, operation, options.limits));
|
|
32
17
|
const caps = triangulateContour(profile);
|
|
33
18
|
const ringVertexCount = profile.length;
|
|
34
19
|
const sideVertexCount = path.length * ringVertexCount;
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
2
|
import { cross3, normalize3, projectOntoPlane3, subtract3 } from "../math/vector3.js";
|
|
3
3
|
import { computeClosedParallelTransportFrames, computeParallelTransportFrames, } from "../paths/frames.js";
|
|
4
|
+
import { resolveGeometryResolution } from "../sampling/resolution.js";
|
|
4
5
|
import { validateSweepNormal } from "./validation.js";
|
|
5
6
|
const fail = (message, code = "INVALID_ARGUMENT") => {
|
|
6
7
|
throw new GeometryError(code, message, { operation: "sweep" });
|
|
7
8
|
};
|
|
8
|
-
/** @internal Validates
|
|
9
|
+
/** @internal Validates explicit station controls without accepting path deformation. */
|
|
10
|
+
export function validateSweepTransformOptions(options) {
|
|
11
|
+
if (typeof options !== "object" || options === null || Array.isArray(options))
|
|
12
|
+
fail("Sweep options must be an object.");
|
|
13
|
+
if (Object.keys(options).some((key) => !["closed", "limits"].includes(key)))
|
|
14
|
+
fail("Explicit sweep transforms cannot be combined with path controls.");
|
|
15
|
+
if (options.closed !== undefined && typeof options.closed !== "boolean")
|
|
16
|
+
fail("Sweep closed must be boolean.");
|
|
17
|
+
}
|
|
18
|
+
/** @internal Validates path controls without evaluating authored normal guides. */
|
|
9
19
|
export function validateSweepOptions(options) {
|
|
10
20
|
if (typeof options !== "object" || options === null || Array.isArray(options))
|
|
11
21
|
fail("Sweep options must be an object.");
|
|
12
|
-
const allowed = [
|
|
13
|
-
"closed",
|
|
14
|
-
"limits",
|
|
15
|
-
"orientation",
|
|
16
|
-
"resolution",
|
|
17
|
-
"twist",
|
|
18
|
-
"twistBy",
|
|
19
|
-
"scale",
|
|
20
|
-
"seamProfileOffset",
|
|
21
|
-
];
|
|
22
|
+
const allowed = ["closed", "limits", "orientation", "resolution", "twist", "twistBy", "scale"];
|
|
22
23
|
if (Object.keys(options).some((key) => !allowed.includes(key)))
|
|
23
24
|
fail("Unsupported sweep option.");
|
|
24
25
|
if (options.closed !== undefined && typeof options.closed !== "boolean")
|
|
@@ -31,6 +32,8 @@ export function validateSweepOptions(options) {
|
|
|
31
32
|
throw new GeometryError("NON_FINITE_VALUE", "Sweep twist must be finite.", {
|
|
32
33
|
operation: "sweep",
|
|
33
34
|
});
|
|
35
|
+
if (options.resolution !== undefined)
|
|
36
|
+
resolveGeometryResolution(options.resolution, options.limits);
|
|
34
37
|
const policy = options.orientation;
|
|
35
38
|
if (policy === undefined)
|
|
36
39
|
return;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { resolveGeometryTolerance } from "../tolerance.js";
|
|
3
|
+
/** @internal Finds a verified cyclic closure; ordinary full turns retain the zero-offset path. */
|
|
4
|
+
export function sweepSeamOffset(profile, scale, twist) {
|
|
5
|
+
const angle = ((twist % 360) * Math.PI) / 180;
|
|
6
|
+
const cosine = Math.cos(angle), sine = Math.sin(angle);
|
|
7
|
+
const points = profile.map(([x, y]) => [x * scale[0], y * scale[1]]);
|
|
8
|
+
const tolerance = resolveGeometryTolerance(points.reduce((extent, [x, y]) => Math.max(extent, Math.abs(x), Math.abs(y)), 1)).linear;
|
|
9
|
+
const rotated = points.map(([x, y]) => [
|
|
10
|
+
x * cosine - y * sine,
|
|
11
|
+
x * sine + y * cosine,
|
|
12
|
+
]);
|
|
13
|
+
let comparisons = 0;
|
|
14
|
+
const matches = (index, offset) => {
|
|
15
|
+
if (++comparisons > 1_000_000)
|
|
16
|
+
throw new GeometryError("COMPLEXITY_LIMIT", "Sweep seam matching exceeded its comparison budget.", { operation: "sweep" });
|
|
17
|
+
const a = rotated[index], b = points[(index + offset) % points.length];
|
|
18
|
+
return Math.hypot(a[0] - b[0], a[1] - b[1]) <= tolerance;
|
|
19
|
+
};
|
|
20
|
+
for (let offset = 0; offset < points.length; offset++) {
|
|
21
|
+
if (!matches(0, offset))
|
|
22
|
+
continue;
|
|
23
|
+
let index = 1;
|
|
24
|
+
while (index < points.length && matches(index, offset))
|
|
25
|
+
index++;
|
|
26
|
+
if (index === points.length)
|
|
27
|
+
return offset;
|
|
28
|
+
}
|
|
29
|
+
throw new GeometryError("INVALID_TOPOLOGY", "Sweep twist must return every profile boundary to a coincident cyclic alignment.", { operation: "sweep" });
|
|
30
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector2Data } from "../math/vector-value.js";
|
|
2
3
|
import { cross3, dot3, lerp3, normalize3, rotateAroundAxis3Radians } from "../math/vector3.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
4
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling/limits.js";
|
|
5
|
+
import { resolveGeometryResolution } from "../sampling/resolution.js";
|
|
6
|
+
import { computeSweepFrames } from "./orientation.js";
|
|
5
7
|
/** @internal Original station progression, with a virtual final seam endpoint for closed paths. */
|
|
6
8
|
export function sweepProgress(path, options) {
|
|
7
9
|
if (options.twistBy !== undefined &&
|
|
@@ -24,6 +26,62 @@ export function sweepProgress(path, options) {
|
|
|
24
26
|
throw new GeometryError("DEGENERATE_GEOMETRY", "Sweep progression needs finite positive path length.", { operation: "sweep" });
|
|
25
27
|
return cumulative.map((length) => length / total);
|
|
26
28
|
}
|
|
29
|
+
/** @internal Resolves positive physical station scales independently of twist progression. */
|
|
30
|
+
export function resolveSweepScales(scale, path, closed = false) {
|
|
31
|
+
const fail = () => {
|
|
32
|
+
throw new GeometryError("INVALID_ARGUMENT", "Sweep scales must be positive finite XY pairs, with one pair per original station when varying.", { operation: "sweep" });
|
|
33
|
+
};
|
|
34
|
+
const pair = (value) => {
|
|
35
|
+
if (typeof value === "number") {
|
|
36
|
+
if (!(value > 0) || !Number.isFinite(value))
|
|
37
|
+
fail();
|
|
38
|
+
return [value, value];
|
|
39
|
+
}
|
|
40
|
+
const coordinates = vector2Data(value);
|
|
41
|
+
if (!coordinates.every((n) => Number.isFinite(n) && n > 0))
|
|
42
|
+
fail();
|
|
43
|
+
return coordinates;
|
|
44
|
+
};
|
|
45
|
+
if (scale === undefined ||
|
|
46
|
+
typeof scale === "number" ||
|
|
47
|
+
(typeof scale === "object" && scale !== null && "toData" in scale) ||
|
|
48
|
+
(Array.isArray(scale) && typeof scale[0] === "number")) {
|
|
49
|
+
const value = pair(scale ?? 1);
|
|
50
|
+
if (closed || (value[0] === 1 && value[1] === 1))
|
|
51
|
+
return Array.from({ length: path.length }, () => value);
|
|
52
|
+
return sweepProgress(path, {}).map((amount) => [
|
|
53
|
+
1 + (value[0] - 1) * amount,
|
|
54
|
+
1 + (value[1] - 1) * amount,
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
if (!Array.isArray(scale) || scale.length !== path.length)
|
|
58
|
+
fail();
|
|
59
|
+
return scale.map(pair);
|
|
60
|
+
}
|
|
61
|
+
/** @internal Untwisted, constant-scale sweeps keep their original station-only mesh. */
|
|
62
|
+
function needsSweepRefinement(scales, options) {
|
|
63
|
+
return ((options.twist ?? 0) !== 0 ||
|
|
64
|
+
options.resolution?.maxSegmentLength !== undefined ||
|
|
65
|
+
scales.some((scale, i) => i > 0 && (scale[0] !== scales[i - 1][0] || scale[1] !== scales[i - 1][1])));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @internal Prepares frames and refinement after caller-owned normalization, initial allocation,
|
|
69
|
+
* scales and seam checks. Rejects predicted work before authored guides, then checks frame-aware
|
|
70
|
+
* work before interpolation. Callers retain their own simple or hole-aware allocation budgets.
|
|
71
|
+
*/
|
|
72
|
+
export function prepareSweepStations(contours, path, scales, options, assertAllocation) {
|
|
73
|
+
const refine = needsSweepRefinement(scales, options);
|
|
74
|
+
if (refine) {
|
|
75
|
+
const plan = planSweepStations(contours, path, scales, options);
|
|
76
|
+
assertAllocation(plan.stationCount);
|
|
77
|
+
}
|
|
78
|
+
const frames = computeSweepFrames(path, options);
|
|
79
|
+
if (!refine)
|
|
80
|
+
return { path, scales, frames, twists: undefined };
|
|
81
|
+
const plan = planSweepStations(contours, path, scales, options, frames);
|
|
82
|
+
assertAllocation(plan.stationCount);
|
|
83
|
+
return refineSweepStations(path, scales, frames, options, plan);
|
|
84
|
+
}
|
|
27
85
|
/** Shortest rotation between two right-handed transported frames, including a stable half turn. */
|
|
28
86
|
function frameRotation(from, to) {
|
|
29
87
|
const cosine = Math.max(-1, Math.min(1, (dot3(from.normal, to.normal) +
|
|
@@ -61,7 +119,7 @@ function frameRotation(from, to) {
|
|
|
61
119
|
halfTurn[i] = (matrix[i][principal] + matrix[principal][i]) / (4 * component);
|
|
62
120
|
return { axis: normalize3(halfTurn), angle };
|
|
63
121
|
}
|
|
64
|
-
/** Plans refinement of the whole triangulated surface, including its mixed edge/twist error. */
|
|
122
|
+
/** @internal Plans refinement of the whole triangulated surface, including its mixed edge/twist error. */
|
|
65
123
|
export function planSweepStations(contours, path, scales, options, frames) {
|
|
66
124
|
const closed = options.closed ?? false;
|
|
67
125
|
const segmentCount = closed ? path.length : path.length - 1;
|
|
@@ -72,7 +130,7 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
72
130
|
});
|
|
73
131
|
const intervals = [];
|
|
74
132
|
const progress = sweepProgress(path, options);
|
|
75
|
-
if (
|
|
133
|
+
if (!needsSweepRefinement(scales, options))
|
|
76
134
|
return { intervals: Array(segmentCount).fill(1), stationCount: path.length, progress };
|
|
77
135
|
const resolution = resolveGeometryResolution(options.resolution, options.limits);
|
|
78
136
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
@@ -101,11 +159,18 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
101
159
|
// term bounds the mixed profile-edge/station derivative; bounding only vertex
|
|
102
160
|
// trajectories misses the systematic inward bias of a twisted quad diagonal.
|
|
103
161
|
const curvature = radius * (maximumScale * (angle * angle + frameAngle * twistStep) + 2 * scaleChange * angle);
|
|
104
|
-
const a = curvature / 8,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
162
|
+
const a = curvature / 8,
|
|
163
|
+
// A straight homothetic taper has planar walls; only differential XY
|
|
164
|
+
// scaling adds mixed surface error when the frame and twist stay fixed.
|
|
165
|
+
mixedScaleChange = angle === 0 && scales[i][0] * scales[next][1] === scales[i][1] * scales[next][0]
|
|
166
|
+
? 0
|
|
167
|
+
: scaleChange, b = (edgeLength * (maximumScale * angle + mixedScaleChange)) / 4;
|
|
168
|
+
const requiredPhysical = Math.max(1, Math.ceil((b + Math.hypot(b, 2 * Math.sqrt(a * resolution.maxChordError))) /
|
|
169
|
+
(2 * resolution.maxChordError)));
|
|
170
|
+
const angularIntervals = Math.max(1, Math.ceil(((resolution.circularSegments ?? resolution.minSegments) * angle) / (2 * Math.PI)));
|
|
171
|
+
const requiredAngular = resolution.circularSegments === undefined || scaleChange > 0
|
|
172
|
+
? Math.max(requiredPhysical, angularIntervals)
|
|
173
|
+
: angularIntervals;
|
|
109
174
|
const allowedAngular = Math.max(1, scaleChange === 0 ? 0 : resolution.maxSegments, Math.ceil((resolution.maxSegments * angle) / (2 * Math.PI)));
|
|
110
175
|
if (requiredAngular > allowedAngular)
|
|
111
176
|
throw new GeometryError("COMPLEXITY_LIMIT", `Sweep surface refinement requires ${requiredAngular} intervals; the selected circular ceiling allows ${allowedAngular}.`, {
|
|
@@ -124,7 +189,7 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
124
189
|
}
|
|
125
190
|
return { intervals, stationCount, progress };
|
|
126
191
|
}
|
|
127
|
-
/** Inserts
|
|
192
|
+
/** @internal Inserts physical samples without recalling authored guides or changing original station meaning. */
|
|
128
193
|
export function refineSweepStations(path, scales, frames, options, plan) {
|
|
129
194
|
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
130
195
|
const segmentCount = plan.intervals.length;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { assertSamplingCount } from "../sampling/limits.js";
|
|
3
|
+
import { isFrame3Input } from "../transforms/matrix-input.js";
|
|
4
|
+
import { transform3 } from "../transforms/value.js";
|
|
5
|
+
/** @internal Distinguishes point paths from placements without allocating a frame matrix. */
|
|
6
|
+
export function isSweepTransformRoute(route) {
|
|
7
|
+
if (!Array.isArray(route) || route.length === 0)
|
|
8
|
+
return false;
|
|
9
|
+
const first = route[0];
|
|
10
|
+
if (Array.isArray(first))
|
|
11
|
+
return first.length === 16;
|
|
12
|
+
const method = typeof first === "object" && first !== null ? Reflect.get(first, "toData") : undefined;
|
|
13
|
+
if (typeof method !== "function")
|
|
14
|
+
return isFrame3Input(first);
|
|
15
|
+
const data = Reflect.apply(method, first, []);
|
|
16
|
+
return Array.isArray(data) && data.length === 16;
|
|
17
|
+
}
|
|
18
|
+
/** @internal Checks station budgets before capturing explicit affine placements. */
|
|
19
|
+
export function sweepTransforms(transforms, closed, limits) {
|
|
20
|
+
if (!Array.isArray(transforms) || transforms.length < (closed ? 3 : 2))
|
|
21
|
+
throw new GeometryError("INVALID_ARGUMENT", "Sweep requires at least two transforms, or three for a closed sweep.", { operation: "sweep" });
|
|
22
|
+
assertSamplingCount(transforms.length, "sweep", limits.maxPathPoints);
|
|
23
|
+
return Array.from(transforms, (placement) => {
|
|
24
|
+
if (placement === undefined)
|
|
25
|
+
throw new GeometryError("INVALID_ARGUMENT", "Every sweep station requires a transform.", {
|
|
26
|
+
operation: "sweep",
|
|
27
|
+
});
|
|
28
|
+
return transform3(placement).toData();
|
|
29
|
+
});
|
|
30
|
+
}
|