@metamesh/modeling 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +67 -9
- package/dist/api/engine.d.ts +14 -7
- package/dist/api/geometry.d.ts +787 -447
- package/dist/api/index.d.ts +637 -250
- package/dist/api/text.d.ts +6 -4
- package/dist/docs/guides/concepts.md +135 -17
- package/dist/docs/guides/fonts.md +8 -0
- package/dist/docs/guides/fundamentals.md +8 -3
- package/dist/docs/guides/generation.md +6 -4
- package/dist/docs/guides/hosting.md +27 -14
- package/dist/docs/guides/recipes.md +82 -11
- package/dist/docs/manifest.json +1911 -856
- package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
- package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
- package/dist/docs/reference/engine/GenerationOptions.md +1 -1
- package/dist/docs/reference/engine/GeometryResource.md +1 -1
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +1 -1
- package/dist/docs/reference/engine/ModelEngineOptions.md +4 -8
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +20 -9
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +4 -4
- package/dist/docs/reference/engine/categories/host-lifecycle.md +2 -2
- package/dist/docs/reference/engine/createModelEngine.md +3 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine/validateModel.md +1 -1
- package/dist/docs/reference/engine.md +2 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +17 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +9 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +7 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +9 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +14 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +6 -1
- package/dist/docs/reference/geometry/Bounds2.md +4 -4
- package/dist/docs/reference/geometry/Bounds3.md +4 -4
- package/dist/docs/reference/geometry/BoundsFit2.md +3 -3
- package/dist/docs/reference/geometry/BoundsFit3.md +3 -3
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +8 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +10 -10
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +107 -0
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +3 -3
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +6 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +6 -6
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -6
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -5
- package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
- package/dist/docs/reference/geometry/Frame3.md +6 -6
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +14 -5
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +11 -5
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +6 -6
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +7 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
- package/dist/docs/reference/geometry/LineCurve2.md +4 -4
- package/dist/docs/reference/geometry/LineCurve3.md +4 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +4 -4
- package/dist/docs/reference/geometry/LoftOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
- package/dist/docs/reference/geometry/Path2-type.md +192 -0
- package/dist/docs/reference/geometry/Path2Data.md +14 -0
- package/dist/docs/reference/geometry/Path2Input.md +15 -0
- package/dist/docs/reference/geometry/Path3-type.md +192 -0
- package/dist/docs/reference/geometry/Path3Data.md +14 -0
- package/dist/docs/reference/geometry/Path3Input.md +15 -0
- package/dist/docs/reference/geometry/PathFrame.md +5 -5
- package/dist/docs/reference/geometry/PathLocation.md +65 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +6 -5
- package/dist/docs/reference/geometry/PathOptions.md +34 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +4 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
- package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +3 -3
- package/dist/docs/reference/geometry/{Polygon.md → PolygonData.md} +2 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +4 -4
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +31 -0
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +104 -0
- package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/Profile.md +1 -1
- package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
- package/dist/docs/reference/geometry/ProfileSpan2.md +3 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +5 -5
- package/dist/docs/reference/geometry/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +14 -0
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +9 -4
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +4 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +4 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +3 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/StrokeCap.md +7 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +7 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +8 -8
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +3 -3
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +13 -13
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +11 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +9 -9
- package/dist/docs/reference/geometry/SweepOptions.md +6 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -5
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → ThreadProfile-type.md} +3 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadRole.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +6 -6
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +6 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- package/dist/docs/reference/geometry/Transform2-type.md +255 -0
- package/dist/docs/reference/geometry/Transform2Input.md +19 -0
- package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
- package/dist/docs/reference/geometry/Transform3-type.md +295 -0
- package/dist/docs/reference/geometry/Transform3Input.md +19 -0
- package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +2 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +3 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TubeOptions.md +8 -8
- package/dist/docs/reference/geometry/Vector2-type.md +269 -0
- package/dist/docs/reference/geometry/Vector2Input.md +19 -0
- package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
- package/dist/docs/reference/geometry/Vector3-type.md +281 -0
- package/dist/docs/reference/geometry/Vector3Input.md +19 -0
- package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
- package/dist/docs/reference/geometry/add2.md +36 -0
- package/dist/docs/reference/geometry/add3.md +10 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +2 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +13 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +11 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +11 -7
- package/dist/docs/reference/geometry/attachmentTransform3.md +77 -0
- package/dist/docs/reference/geometry/boundsCenter.md +7 -7
- package/dist/docs/reference/geometry/boundsFromSize.md +7 -7
- package/dist/docs/reference/geometry/boundsSize.md +7 -7
- package/dist/docs/reference/geometry/boxAnchor3.md +10 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +15 -10
- package/dist/docs/reference/geometry/categories/mechanical.md +6 -6
- package/dist/docs/reference/geometry/categories/meshes.md +3 -4
- package/dist/docs/reference/geometry/categories/pattern-placement.md +7 -7
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +5 -6
- package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -2
- package/dist/docs/reference/geometry/categories/transforms-math.md +41 -12
- package/dist/docs/reference/geometry/categories/vector-import.md +5 -5
- package/dist/docs/reference/geometry/circleContour.md +1 -1
- package/dist/docs/reference/geometry/closeToAxis.md +4 -4
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -5
- package/dist/docs/reference/geometry/composeTransform3.md +10 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +10 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +4 -4
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +4 -4
- package/dist/docs/reference/geometry/containsBounds.md +1 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +4 -4
- package/dist/docs/reference/geometry/cross2.md +36 -0
- package/dist/docs/reference/geometry/cross3.md +10 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -6
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +36 -0
- package/dist/docs/reference/geometry/distance3.md +36 -0
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
- package/dist/docs/reference/geometry/dot2.md +36 -0
- package/dist/docs/reference/geometry/dot3.md +9 -5
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +10 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +8 -8
- package/dist/docs/reference/geometry/fitBounds.md +1 -1
- package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
- package/dist/docs/reference/geometry/frameTransform3.md +8 -4
- package/dist/docs/reference/geometry/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +3 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +5 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +5 -5
- package/dist/docs/reference/geometry/inverseTransform3.md +9 -5
- package/dist/docs/reference/geometry/isGeometryError.md +1 -1
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
- package/dist/docs/reference/geometry/layoutRow.md +4 -4
- package/dist/docs/reference/geometry/length2.md +30 -0
- package/dist/docs/reference/geometry/length3.md +8 -4
- package/dist/docs/reference/geometry/lerp2.md +42 -0
- package/dist/docs/reference/geometry/lerp3.md +10 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/loftMesh.md +2 -1
- package/dist/docs/reference/geometry/matchProfiles.md +1 -1
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +3 -2
- package/dist/docs/reference/geometry/meshBounds.md +1 -1
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +3 -3
- package/dist/docs/reference/geometry/normalize2.md +36 -0
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +4 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -5
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -5
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +11 -11
- package/dist/docs/reference/geometry/path2.md +42 -0
- package/dist/docs/reference/geometry/path3.md +42 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -8
- package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +3 -3
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
- package/dist/docs/reference/geometry/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/geometry/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/geometry/projectOntoPlane3.md +10 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- package/dist/docs/reference/geometry/rectangleContour.md +2 -2
- package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
- package/dist/docs/reference/geometry/regionArea.md +4 -4
- package/dist/docs/reference/geometry/regionBounds.md +4 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +5 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +5 -5
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +8 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +6 -6
- package/dist/docs/reference/geometry/resolveCircularSegments.md +6 -5
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +6 -6
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/revolveMesh.md +10 -10
- package/dist/docs/reference/geometry/rotate2.md +36 -0
- package/dist/docs/reference/geometry/rotationTransform3.md +10 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -6
- package/dist/docs/reference/geometry/sampleContour.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve2.md +3 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +2 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleHelix.md +5 -5
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +4 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +6 -6
- package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +2 -2
- package/dist/docs/reference/geometry/scale2.md +36 -0
- package/dist/docs/reference/geometry/scale3.md +9 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +10 -6
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +4 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
- package/dist/docs/reference/geometry/subtract2.md +36 -0
- package/dist/docs/reference/geometry/subtract3.md +10 -6
- package/dist/docs/reference/geometry/sweepMesh.md +9 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +6 -6
- package/dist/docs/reference/geometry/transform2.md +38 -0
- package/dist/docs/reference/geometry/transform3.md +38 -0
- package/dist/docs/reference/geometry/transformDeterminant3.md +8 -4
- package/dist/docs/reference/geometry/transformRegionData.md +40 -0
- package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
- package/dist/docs/reference/geometry/translationTransform3.md +10 -6
- package/dist/docs/reference/geometry/triangulateContour.md +1 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +2 -2
- package/dist/docs/reference/geometry/validateTransform3.md +9 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +31 -0
- package/dist/docs/reference/geometry/vector3.md +38 -0
- package/dist/docs/reference/geometry.md +3 -3
- package/dist/docs/reference/model/Anchor3.md +5 -5
- package/dist/docs/reference/model/AttachOptions.md +10 -5
- package/dist/docs/reference/model/Bounds2.md +4 -4
- package/dist/docs/reference/model/Bounds3.md +4 -4
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +10 -10
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +1 -1
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +3 -3
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CylinderOptions.md +3 -3
- package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +3 -3
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +6 -6
- package/dist/docs/reference/model/FinalizedModel.md +18 -8
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +6 -6
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -5
- package/dist/docs/reference/model/GeneratedPart.md +6 -6
- package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
- package/dist/docs/reference/model/GenerationError.md +1 -1
- package/dist/docs/reference/model/GeometryResolution.md +5 -5
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +11 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +3 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/model/HullOptions.md +7 -7
- package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
- package/dist/docs/reference/model/ImplicitOptions.md +4 -4
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +4 -4
- package/dist/docs/reference/model/LinearPatternOptions.md +12 -5
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +1 -1
- package/dist/docs/reference/model/LoftPlacement.md +1 -1
- package/dist/docs/reference/model/LoftStation.md +4 -4
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +1 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +1 -1
- package/dist/docs/reference/model/PartGeometry.md +1 -1
- package/dist/docs/reference/model/PartOptions.md +6 -6
- package/dist/docs/reference/model/Path2-type.md +192 -0
- package/dist/docs/reference/model/Path2Data.md +14 -0
- package/dist/docs/reference/model/Path2Input.md +15 -0
- package/dist/docs/reference/model/Path3-type.md +192 -0
- package/dist/docs/reference/model/Path3Data.md +14 -0
- package/dist/docs/reference/model/Path3Input.md +15 -0
- package/dist/docs/reference/model/PathLocation.md +65 -0
- package/dist/docs/reference/model/PathNormalGuide.md +6 -5
- package/dist/docs/reference/model/PathOptions.md +34 -0
- package/dist/docs/reference/model/PathPatternOptions.md +3 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +79 -0
- package/dist/docs/reference/model/PatternSource.md +2 -2
- package/dist/docs/reference/model/Pivot2Options.md +27 -0
- package/dist/docs/reference/model/Pivot3Options.md +27 -0
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/{Polygon-type.md → PolygonData.md} +2 -2
- package/dist/docs/reference/model/PolygonOptions.md +85 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +7 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +41 -20
- package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/model/Profile.md +1 -1
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +1 -1
- package/dist/docs/reference/model/ProfileSpan2.md +3 -3
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/model/RadialPatternOptions.md +17 -22
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +10 -10
- package/dist/docs/reference/model/{Region.md → RegionData.md} +4 -4
- package/dist/docs/reference/model/RegularPolygonOptions.md +5 -5
- package/dist/docs/reference/model/RevolveOptions.md +9 -4
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +81 -40
- package/dist/docs/reference/model/SectionHullOptions.md +7 -7
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- package/dist/docs/reference/model/{RegionOffsetJoin.md → SectionOffsetJoin.md} +3 -3
- package/dist/docs/reference/model/{RegionOffsetOptions.md → SectionOffsetOptions.md} +4 -4
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +66 -26
- package/dist/docs/reference/model/SolidInspection.md +7 -7
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/StrokeCap.md +16 -0
- package/dist/docs/reference/model/StrokeJoin.md +16 -0
- package/dist/docs/reference/model/StrokeOptions.md +91 -0
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
- package/dist/docs/reference/model/SweepOptions.md +6 -6
- package/dist/docs/reference/model/SweepOrientation.md +7 -7
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/model/ThreadHandedness.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/model/ThreadProfile.md +3 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +4 -4
- package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +4 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- package/dist/docs/reference/model/Transform2-type.md +256 -0
- package/dist/docs/reference/model/Transform2Input.md +20 -0
- package/dist/docs/reference/model/Transform2Matrix.md +15 -0
- package/dist/docs/reference/model/Transform3-type.md +296 -0
- package/dist/docs/reference/model/Transform3Input.md +20 -0
- package/dist/docs/reference/model/{Transform3.md → Transform3Matrix.md} +3 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +2 -2
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- package/dist/docs/reference/model/Vector2-type.md +270 -0
- package/dist/docs/reference/model/Vector2Input.md +20 -0
- package/dist/docs/reference/model/{Vector2.md → Vector2Tuple.md} +3 -3
- package/dist/docs/reference/model/Vector3-type.md +282 -0
- package/dist/docs/reference/model/Vector3Input.md +20 -0
- package/dist/docs/reference/model/{Vector3.md → Vector3Tuple.md} +3 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/anchor.md +1 -1
- package/dist/docs/reference/model/box.md +4 -4
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +4 -4
- package/dist/docs/reference/model/categories/bounded-surfaces.md +3 -3
- package/dist/docs/reference/model/categories/contracts.md +2 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +5 -5
- package/dist/docs/reference/model/categories/explicit-profiles.md +3 -3
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +2 -2
- package/dist/docs/reference/model/categories/generation.md +1 -1
- package/dist/docs/reference/model/categories/inspection.md +7 -8
- package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
- package/dist/docs/reference/model/categories/paths.md +33 -0
- package/dist/docs/reference/model/categories/primitives.md +3 -3
- package/dist/docs/reference/model/categories/resolution.md +2 -2
- package/dist/docs/reference/model/categories/sections.md +10 -8
- package/dist/docs/reference/model/categories/threads.md +5 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +27 -13
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +10 -7
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +2 -2
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +3 -3
- package/dist/docs/reference/model/generate.md +1 -1
- package/dist/docs/reference/model/gridPattern.md +4 -4
- package/dist/docs/reference/model/heightfield.md +2 -2
- package/dist/docs/reference/model/hull.md +2 -2
- package/dist/docs/reference/model/immutableBuffer.md +1 -1
- package/dist/docs/reference/model/immutableMesh.md +1 -1
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +4 -4
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +2 -2
- package/dist/docs/reference/model/linearPattern.md +4 -4
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +2 -2
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +42 -0
- package/dist/docs/reference/model/path3.md +42 -0
- package/dist/docs/reference/model/pathPattern.md +13 -12
- package/dist/docs/reference/model/polygon.md +4 -4
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +3 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +3 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +3 -3
- package/dist/docs/reference/model/radialPattern.md +5 -37
- package/dist/docs/reference/model/rectangle.md +4 -4
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +74 -0
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +1 -1
- package/dist/docs/reference/model/sweep.md +7 -7
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +2 -2
- package/dist/docs/reference/model/threadedNut.md +4 -4
- package/dist/docs/reference/model/threadedRod.md +4 -4
- package/dist/docs/reference/model/torus.md +3 -3
- package/dist/docs/reference/model/transform2.md +39 -0
- package/dist/docs/reference/model/transform3.md +39 -0
- package/dist/docs/reference/model/tube.md +3 -3
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +32 -0
- package/dist/docs/reference/model/vector3.md +39 -0
- package/dist/docs/reference/model.md +9 -8
- package/dist/docs/reference/text/Bounds2.md +4 -4
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +2 -2
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +3 -3
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +4 -4
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +1 -1
- package/dist/engine/construction-operations.js +31 -14
- package/dist/engine/deferred-context.js +11 -181
- package/dist/engine/execution.js +39 -8
- package/dist/engine/extrusion-finishing.js +1 -1
- package/dist/engine/index.js +6 -1
- package/dist/engine/inspection-operations.js +13 -11
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/native/material-components.js +305 -0
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/native/threads.js +3 -3
- package/dist/engine/native/transforms.js +11 -8
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +3 -3
- package/dist/engine/placement.js +2 -2
- package/dist/engine/primitive-anchors.js +17 -17
- package/dist/engine/primitive-operations.js +1 -1
- package/dist/engine/primitive-profiles.js +8 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +35 -21
- package/dist/engine/section-operations.js +52 -11
- package/dist/engine/session-graph.js +1 -1
- package/dist/engine/session-native.js +1 -1
- package/dist/engine/session-snapshot.js +17 -6
- package/dist/engine/session.js +13 -8
- package/dist/engine/shape-anchors.js +5 -11
- package/dist/engine/transform-operations.js +66 -49
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/curves/sampling.js +14 -14
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/index.js +13 -10
- package/dist/geometry/loft/loft-simple-mesh.js +6 -6
- package/dist/geometry/loft/loft.js +22 -13
- package/dist/geometry/math/immutable-value.js +20 -0
- package/dist/geometry/math/vector-value.js +168 -0
- package/dist/geometry/math/vector2.js +80 -0
- package/dist/geometry/math/vector3.js +37 -7
- package/dist/geometry/mechanical/gear-motion.js +8 -5
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +3 -3
- package/dist/geometry/mechanical/standards.js +1 -1
- package/dist/geometry/mechanical/thread-helices.js +2 -3
- package/dist/geometry/mechanical/thread-mesh-plan.js +4 -5
- package/dist/geometry/mechanical/thread-mesh.js +7 -7
- package/dist/geometry/mechanical/thread-profiles.js +5 -5
- package/dist/geometry/mechanical/thread-solids.js +2 -2
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-planar.js +25 -27
- package/dist/geometry/mesh/mesh-quality.js +5 -5
- package/dist/geometry/mesh/mesh-signature.js +13 -13
- package/dist/geometry/mesh/mesh-solid-intersections.js +5 -1
- package/dist/geometry/mesh/mesh-solid.js +7 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +63 -0
- package/dist/geometry/paths/frames.js +44 -14
- package/dist/geometry/paths/helix.js +16 -6
- package/dist/geometry/paths/path-value.js +252 -0
- package/dist/geometry/paths/planar.js +36 -23
- package/dist/geometry/paths/resampling.js +27 -5
- package/dist/geometry/patterns/placements.js +100 -27
- package/dist/geometry/patterns.js +2 -2
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/primitive-resolution.js +4 -1
- package/dist/geometry/profiles/contour.js +6 -6
- package/dist/geometry/profiles/matched.js +4 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +4 -4
- package/dist/geometry/profiles/side-profile.js +7 -7
- package/dist/geometry/profiles/span-sampling.js +1 -1
- package/dist/geometry/resolution.js +51 -39
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +57 -68
- package/dist/geometry/svg/fill.js +7 -21
- package/dist/geometry/svg-import.js +23 -23
- package/dist/geometry/sweeps/options.js +5 -4
- package/dist/geometry/sweeps/orientation.js +5 -5
- package/dist/geometry/sweeps/stations.js +14 -14
- package/dist/geometry/sweeps/sweep-closed.js +5 -5
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +4 -4
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/transform-chain.js +172 -0
- package/dist/geometry/transform-geometry.js +27 -30
- package/dist/geometry/transform-matrix.js +14 -0
- package/dist/geometry/transform2.js +60 -0
- package/dist/geometry/transform3.js +70 -26
- package/dist/index.js +4 -0
- package/dist/model/execution-binding.js +10 -5
- package/dist/model/geometry-recipes.js +15 -0
- package/dist/{engine → model}/immutable-generation-data.js +88 -6
- package/dist/model/operation-dispatch.js +10 -3
- package/dist/model/operations.js +45 -35
- package/dist/model/recipe-declaration.js +199 -0
- package/dist/model/shape-handles.js +17 -5
- package/dist/text/index.js +15 -9
- package/dist/text/vector-text-layout.js +31 -26
- package/package.json +1 -1
- package/dist/docs/reference/geometry/Path2.md +0 -14
- package/dist/docs/reference/geometry/Path3.md +0 -14
- package/dist/docs/reference/geometry/PrimitivePlacement.md +0 -31
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +0 -83
- package/dist/docs/reference/geometry/Region.md +0 -14
- package/dist/docs/reference/geometry/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/Transform3.md +0 -12
- package/dist/docs/reference/geometry/Vector2.md +0 -7
- package/dist/docs/reference/geometry/Vector3.md +0 -7
- package/dist/docs/reference/geometry/attachTransform.md +0 -73
- package/dist/docs/reference/geometry/cumulativePathLengths.md +0 -33
- package/dist/docs/reference/geometry/measureTriangleMesh.md +0 -55
- package/dist/docs/reference/geometry/pathLength.md +0 -33
- package/dist/docs/reference/geometry/rotateAroundAxis3.md +0 -38
- package/dist/docs/reference/geometry/strokePathRegion.md +0 -63
- package/dist/docs/reference/geometry/transformContour.md +0 -42
- package/dist/docs/reference/geometry/transformPath2.md +0 -40
- package/dist/docs/reference/geometry/transformPath3.md +0 -33
- package/dist/docs/reference/geometry/transformRegion.md +0 -40
- package/dist/docs/reference/model/Transform2.md +0 -15
- package/dist/docs/reference/model/fromRegion.md +0 -33
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toRegion.md +0 -33
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Vector2.md +0 -7
- package/dist/engine/geometry-recipes.js +0 -12
- package/dist/engine/pattern-transform.js +0 -9
- package/dist/geometry/paths/path.js +0 -32
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
import { polygonClipping, unionPolygonGeometry, xorPolygonGeometry } from "../polygon-clipping.js";
|
|
2
|
-
import {
|
|
1
|
+
import { clippingRing, polygonClipping, regionFromMultiPolygon, unionPolygonGeometry, xorPolygonGeometry, } from "../polygon-clipping.js";
|
|
2
|
+
import { signedContourArea } from "../regions.js";
|
|
3
3
|
import { assertSamplingCount } from "../sampling-limits.js";
|
|
4
4
|
/** Private clipping stage with the selected execution's immutable allocation ceiling. */
|
|
5
|
-
export function createBoundedSvgClipping(
|
|
6
|
-
function ring(points) {
|
|
7
|
-
const result = points.map(([x, y]) => [x, y]);
|
|
8
|
-
const first = result[0];
|
|
9
|
-
const last = result.at(-1);
|
|
10
|
-
if (first !== undefined && last !== undefined && (first[0] !== last[0] || first[1] !== last[1]))
|
|
11
|
-
result.push([...first]);
|
|
12
|
-
return result;
|
|
13
|
-
}
|
|
5
|
+
export function createBoundedSvgClipping(maxVertices) {
|
|
14
6
|
function ringVertexCount(value) {
|
|
15
7
|
const first = value[0];
|
|
16
8
|
const last = value.at(-1);
|
|
@@ -21,7 +13,7 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
21
13
|
return value.reduce((total, polygon) => total + polygon.reduce((polygonTotal, path) => polygonTotal + ringVertexCount(path), 0), 0);
|
|
22
14
|
}
|
|
23
15
|
function assertExpandedVertexCount(vertices, stage) {
|
|
24
|
-
assertSamplingCount(vertices, "preflightSvgRegion",
|
|
16
|
+
assertSamplingCount(vertices, "preflightSvgRegion", maxVertices, `SVG ${stage} exceeds ${maxVertices} expanded vertices (requires ${vertices}).`);
|
|
25
17
|
}
|
|
26
18
|
function boundedMultiPolygon(value, stage) {
|
|
27
19
|
assertExpandedVertexCount(multiPolygonVertexCount(value), stage);
|
|
@@ -136,16 +128,16 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
136
128
|
.map((subpath) => subpath.points);
|
|
137
129
|
if (rings.length === 0)
|
|
138
130
|
return [];
|
|
139
|
-
const polygons = rings.map((points) => [
|
|
131
|
+
const polygons = rings.map((points) => [clippingRing(points)]);
|
|
140
132
|
if (fillRule === "evenodd") {
|
|
141
133
|
return boundedXor(polygons.map((polygon) => [polygon]), "even-odd fill output");
|
|
142
134
|
}
|
|
143
135
|
const positive = rings
|
|
144
136
|
.filter((points) => signedContourArea(points) >= 0)
|
|
145
|
-
.map((points) => [
|
|
137
|
+
.map((points) => [clippingRing(points)]);
|
|
146
138
|
const negative = rings
|
|
147
139
|
.filter((points) => signedContourArea(points) < 0)
|
|
148
|
-
.map((points) => [
|
|
140
|
+
.map((points) => [clippingRing(points)]);
|
|
149
141
|
if (positive.length === 0)
|
|
150
142
|
return boundedUnion([negative], "negative fill output");
|
|
151
143
|
if (negative.length === 0)
|
|
@@ -155,12 +147,6 @@ export function createBoundedSvgClipping(maximumVertices) {
|
|
|
155
147
|
// precisely where positive and negative nonzero winding counts match.
|
|
156
148
|
return differingCoverage(positive, negative);
|
|
157
149
|
}
|
|
158
|
-
function regionFromMultiPolygon(value) {
|
|
159
|
-
return normalizeRegion(value.map((polygon) => ({
|
|
160
|
-
outer: polygon[0].slice(0, -1).map(([x, y]) => [x, y]),
|
|
161
|
-
holes: polygon.slice(1).map((hole) => hole.slice(0, -1).map(([x, y]) => [x, y])),
|
|
162
|
-
})));
|
|
163
|
-
}
|
|
164
150
|
return {
|
|
165
151
|
assertExpandedVertexCount,
|
|
166
152
|
boundedMultiPolygon,
|
|
@@ -429,7 +429,7 @@ function measureSvgRegion(region) {
|
|
|
429
429
|
let minEdgeLength = Number.POSITIVE_INFINITY;
|
|
430
430
|
let minX = Number.POSITIVE_INFINITY;
|
|
431
431
|
let minY = Number.POSITIVE_INFINITY;
|
|
432
|
-
let
|
|
432
|
+
let shortEdgeCount = 0;
|
|
433
433
|
let vertices = 0;
|
|
434
434
|
for (const polygon of region) {
|
|
435
435
|
for (const loop of [polygon.outer, ...polygon.holes]) {
|
|
@@ -443,7 +443,7 @@ function measureSvgRegion(region) {
|
|
|
443
443
|
for (const length of loopEdgeLengths(loop)) {
|
|
444
444
|
minEdgeLength = Math.min(minEdgeLength, length);
|
|
445
445
|
if (length < SHORT_EDGE_LENGTH_MM)
|
|
446
|
-
|
|
446
|
+
shortEdgeCount += 1;
|
|
447
447
|
}
|
|
448
448
|
}
|
|
449
449
|
}
|
|
@@ -456,13 +456,13 @@ function measureSvgRegion(region) {
|
|
|
456
456
|
return Object.freeze({
|
|
457
457
|
area: regionArea(region),
|
|
458
458
|
bounds,
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
holes,
|
|
459
|
+
componentCount: region.length,
|
|
460
|
+
contourCount: region.length + holes,
|
|
461
|
+
holeCount: holes,
|
|
462
462
|
minEdgeLength: Number.isFinite(minEdgeLength) ? minEdgeLength : null,
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
vertices,
|
|
463
|
+
shortEdgeCount,
|
|
464
|
+
tinyIslandCount: region.filter((polygon) => polygonArea(polygon) < TINY_ISLAND_AREA_MM2).length,
|
|
465
|
+
vertexCount: vertices,
|
|
466
466
|
});
|
|
467
467
|
}
|
|
468
468
|
/**
|
|
@@ -498,10 +498,10 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
498
498
|
const stack = [];
|
|
499
499
|
const geometry = [];
|
|
500
500
|
let elementCount = 0;
|
|
501
|
-
let
|
|
501
|
+
let emptyElementCount = 0;
|
|
502
502
|
let expandedGeometryVertices = 0;
|
|
503
|
-
let
|
|
504
|
-
let
|
|
503
|
+
let implicitFilledClosureCount = 0;
|
|
504
|
+
let invisibleElementCount = 0;
|
|
505
505
|
let nodeCount = 0;
|
|
506
506
|
let rootSeen = false;
|
|
507
507
|
let strokeConstructionVertices = 0;
|
|
@@ -582,9 +582,9 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
582
582
|
const paintedStroke = isPainted(paint.stroke, paint.strokeOpacity) && paint.strokeWidth > 0;
|
|
583
583
|
const elementGeometry = [];
|
|
584
584
|
if (!paintedFill && !paintedStroke)
|
|
585
|
-
|
|
585
|
+
invisibleElementCount += 1;
|
|
586
586
|
if (paintedFill) {
|
|
587
|
-
|
|
587
|
+
implicitFilledClosureCount += subpaths.filter((subpath) => !subpath.closed && subpath.points.length >= 3).length;
|
|
588
588
|
appendGeometry(elementGeometry, fillGeometry(subpaths, paint.fillRule), "element fill output");
|
|
589
589
|
}
|
|
590
590
|
if (paintedStroke) {
|
|
@@ -606,7 +606,7 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
606
606
|
}
|
|
607
607
|
}
|
|
608
608
|
if ((paintedFill || paintedStroke) && elementGeometry.every((value) => value.length === 0)) {
|
|
609
|
-
|
|
609
|
+
emptyElementCount += 1;
|
|
610
610
|
}
|
|
611
611
|
geometry.push(...elementGeometry);
|
|
612
612
|
}
|
|
@@ -628,17 +628,17 @@ function createSvgRegionPreflight(svg, options = {}) {
|
|
|
628
628
|
geometry: measureSvgRegion(region),
|
|
629
629
|
region,
|
|
630
630
|
repairs: Object.freeze({
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
631
|
+
emptyElementCount,
|
|
632
|
+
implicitFilledClosureCount,
|
|
633
|
+
invisibleElementCount,
|
|
634
|
+
removedDuplicateVertexCount: budget.removedDuplicateCount,
|
|
635
|
+
removedSeamVertexCount: budget.removedSeamCount,
|
|
636
636
|
}),
|
|
637
637
|
source: Object.freeze({
|
|
638
|
-
bytes,
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
638
|
+
byteCount: bytes,
|
|
639
|
+
elementCount,
|
|
640
|
+
emittedVertexCount: budget.emittedCount,
|
|
641
|
+
parsedVertexCount: budget.parsedCount,
|
|
642
642
|
}),
|
|
643
643
|
});
|
|
644
644
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector2Data } from "../math/vector-value.js";
|
|
2
3
|
/** @internal Validates local scales before any manufacturing buffer allocation. */
|
|
3
4
|
export function resolveSweepScales(scale, stationCount) {
|
|
4
5
|
const fail = () => {
|
|
@@ -10,14 +11,14 @@ export function resolveSweepScales(scale, stationCount) {
|
|
|
10
11
|
fail();
|
|
11
12
|
return [value, value];
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
!value.every((n) => typeof n === "number" && Number.isFinite(n) && n > 0))
|
|
14
|
+
const coordinates = vector2Data(value);
|
|
15
|
+
if (!coordinates.every((n) => typeof n === "number" && Number.isFinite(n) && n > 0))
|
|
16
16
|
fail();
|
|
17
|
-
return
|
|
17
|
+
return coordinates;
|
|
18
18
|
};
|
|
19
19
|
if (scale === undefined ||
|
|
20
20
|
typeof scale === "number" ||
|
|
21
|
+
(typeof scale === "object" && scale !== null && "toArray" in scale) ||
|
|
21
22
|
(Array.isArray(scale) && typeof scale[0] === "number")) {
|
|
22
23
|
const value = pair(scale ?? 1);
|
|
23
24
|
return Array.from({ length: stationCount }, () => value);
|
|
@@ -14,7 +14,7 @@ export function validateSweepOptions(options) {
|
|
|
14
14
|
"limits",
|
|
15
15
|
"orientation",
|
|
16
16
|
"resolution",
|
|
17
|
-
"
|
|
17
|
+
"twist",
|
|
18
18
|
"twistBy",
|
|
19
19
|
"scale",
|
|
20
20
|
"seamProfileOffset",
|
|
@@ -27,8 +27,8 @@ export function validateSweepOptions(options) {
|
|
|
27
27
|
options.twistBy !== "length" &&
|
|
28
28
|
options.twistBy !== "stations")
|
|
29
29
|
fail("Sweep twistBy must be length or stations.");
|
|
30
|
-
if (!Number.isFinite(options.
|
|
31
|
-
throw new GeometryError("NON_FINITE_VALUE", "Sweep
|
|
30
|
+
if (!Number.isFinite(options.twist ?? 0))
|
|
31
|
+
throw new GeometryError("NON_FINITE_VALUE", "Sweep twist must be finite.", {
|
|
32
32
|
operation: "sweep",
|
|
33
33
|
});
|
|
34
34
|
const policy = options.orientation;
|
|
@@ -58,8 +58,8 @@ export function validateSweepOptions(options) {
|
|
|
58
58
|
if (Object.keys(policy).some((key) => !keys.includes(key)))
|
|
59
59
|
fail("Unsupported field for the selected sweep orientation.");
|
|
60
60
|
}
|
|
61
|
-
function directedNormal(
|
|
62
|
-
validateSweepNormal(
|
|
61
|
+
function directedNormal(input, tangent, label) {
|
|
62
|
+
const value = validateSweepNormal(input, "sweep");
|
|
63
63
|
const maximum = Math.max(...value.map(Math.abs));
|
|
64
64
|
const unit = normalize3([value[0] / maximum, value[1] / maximum, value[2] / maximum]);
|
|
65
65
|
const projected = projectOntoPlane3(unit, tangent);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
import { cross3, dot3, lerp3, normalize3,
|
|
2
|
+
import { cross3, dot3, lerp3, normalize3, rotateAroundAxis3Radians } from "../math/vector3.js";
|
|
3
3
|
import { resolveGeometryResolution } from "../resolution.js";
|
|
4
4
|
import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling-limits.js";
|
|
5
5
|
/** @internal Original station progression, with a virtual final seam endpoint for closed paths. */
|
|
@@ -65,14 +65,14 @@ function frameRotation(from, to) {
|
|
|
65
65
|
export function planSweepStations(contours, path, scales, options, frames) {
|
|
66
66
|
const closed = options.closed ?? false;
|
|
67
67
|
const segmentCount = closed ? path.length : path.length - 1;
|
|
68
|
-
const
|
|
69
|
-
if (!Number.isFinite(
|
|
70
|
-
throw new GeometryError("NON_FINITE_VALUE", "Sweep
|
|
68
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
69
|
+
if (!Number.isFinite(twistRadians))
|
|
70
|
+
throw new GeometryError("NON_FINITE_VALUE", "Sweep twist must be finite.", {
|
|
71
71
|
operation: "sweep",
|
|
72
72
|
});
|
|
73
73
|
const intervals = [];
|
|
74
74
|
const progress = sweepProgress(path, options);
|
|
75
|
-
if (
|
|
75
|
+
if (twistRadians === 0)
|
|
76
76
|
return { intervals: Array(segmentCount).fill(1), stationCount: path.length, progress };
|
|
77
77
|
const resolution = resolveGeometryResolution(options.resolution, options.limits);
|
|
78
78
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
@@ -92,7 +92,7 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
92
92
|
let stationCount = closed ? 0 : 1;
|
|
93
93
|
for (let i = 0; i < segmentCount; i++) {
|
|
94
94
|
const next = (i + 1) % path.length;
|
|
95
|
-
const twistStep = Math.abs(
|
|
95
|
+
const twistStep = Math.abs(twistRadians * (progress[i + 1] - progress[i]));
|
|
96
96
|
const frameAngle = frames === undefined ? 0 : frameRotation(frames[i], frames[next]).angle;
|
|
97
97
|
const angle = frameAngle + twistStep;
|
|
98
98
|
const maximumScale = Math.max(...scales[i], ...scales[next]);
|
|
@@ -104,9 +104,9 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
104
104
|
const a = curvature / 8, b = (edgeLength * (maximumScale * angle + scaleChange)) / 4;
|
|
105
105
|
const requiredAngular = resolution.circularSegments === undefined
|
|
106
106
|
? Math.max(1, Math.ceil((b + Math.hypot(b, 2 * Math.sqrt(a * resolution.maxChordError))) /
|
|
107
|
-
(2 * resolution.maxChordError)), Math.ceil((resolution.
|
|
107
|
+
(2 * resolution.maxChordError)), Math.ceil((resolution.minSegments * angle) / (2 * Math.PI)))
|
|
108
108
|
: Math.max(1, Math.ceil((resolution.circularSegments * angle) / (2 * Math.PI)));
|
|
109
|
-
const allowedAngular = Math.max(1, scaleChange === 0 ? 0 : resolution.
|
|
109
|
+
const allowedAngular = Math.max(1, scaleChange === 0 ? 0 : resolution.maxSegments, Math.ceil((resolution.maxSegments * angle) / (2 * Math.PI)));
|
|
110
110
|
if (requiredAngular > allowedAngular)
|
|
111
111
|
throw new GeometryError("COMPLEXITY_LIMIT", `Sweep surface refinement requires ${requiredAngular} intervals; the selected circular ceiling allows ${allowedAngular}.`, {
|
|
112
112
|
operation: "sweep",
|
|
@@ -126,7 +126,7 @@ export function planSweepStations(contours, path, scales, options, frames) {
|
|
|
126
126
|
}
|
|
127
127
|
/** Inserts twist samples without calling authored guides again or changing original station meaning. */
|
|
128
128
|
export function refineSweepStations(path, scales, frames, options, plan) {
|
|
129
|
-
const
|
|
129
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
130
130
|
const segmentCount = plan.intervals.length;
|
|
131
131
|
const points = [], sampledScales = [], sampledFrames = [], twists = [];
|
|
132
132
|
for (let i = 0; i < segmentCount; i++) {
|
|
@@ -144,18 +144,18 @@ export function refineSweepStations(path, scales, frames, options, plan) {
|
|
|
144
144
|
sampledFrames.push(amount === 0
|
|
145
145
|
? frames[i]
|
|
146
146
|
: {
|
|
147
|
-
normal:
|
|
148
|
-
binormal:
|
|
149
|
-
tangent:
|
|
147
|
+
normal: rotateAroundAxis3Radians(frames[i].normal, rotation.axis, rotation.angle * amount),
|
|
148
|
+
binormal: rotateAroundAxis3Radians(frames[i].binormal, rotation.axis, rotation.angle * amount),
|
|
149
|
+
tangent: rotateAroundAxis3Radians(frames[i].tangent, rotation.axis, rotation.angle * amount),
|
|
150
150
|
});
|
|
151
|
-
twists.push(
|
|
151
|
+
twists.push(twistRadians * (plan.progress[i] + (plan.progress[i + 1] - plan.progress[i]) * amount));
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
if (options.closed !== true) {
|
|
155
155
|
points.push(path.at(-1));
|
|
156
156
|
sampledScales.push(scales.at(-1));
|
|
157
157
|
sampledFrames.push(frames.at(-1));
|
|
158
|
-
twists.push(
|
|
158
|
+
twists.push(twistRadians);
|
|
159
159
|
}
|
|
160
160
|
return { path: points, scales: sampledScales, frames: sampledFrames, twists };
|
|
161
161
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
import { add3,
|
|
2
|
+
import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
|
|
3
3
|
import { validateTriangleMesh } from "../mesh/mesh.js";
|
|
4
4
|
import { resolveGeometryTolerance } from "../tolerance.js";
|
|
5
5
|
import { resolveSweepScales } from "./options.js";
|
|
@@ -20,9 +20,9 @@ export const buildClosedSweepMesh = (profile, path, options = {}) => {
|
|
|
20
20
|
operation,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
-
const twistRadians = ((options.
|
|
23
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
24
24
|
if (!Number.isFinite(twistRadians)) {
|
|
25
|
-
throw new GeometryError("NON_FINITE_VALUE", "Sweep
|
|
25
|
+
throw new GeometryError("NON_FINITE_VALUE", "Sweep twist must be finite.", {
|
|
26
26
|
operation,
|
|
27
27
|
});
|
|
28
28
|
}
|
|
@@ -63,8 +63,8 @@ export const buildClosedSweepMesh = (profile, path, options = {}) => {
|
|
|
63
63
|
const tangent = transportedFrames[ring].tangent;
|
|
64
64
|
const twist = twists?.[ring] ?? twistRadians * (ring / path.length);
|
|
65
65
|
const baseNormal = transportedFrames[ring].normal;
|
|
66
|
-
const normal =
|
|
67
|
-
const binormal =
|
|
66
|
+
const normal = rotateAroundAxis3Radians(baseNormal, tangent, twist);
|
|
67
|
+
const binormal = rotateAroundAxis3Radians(transportedFrames[ring].binormal, tangent, twist);
|
|
68
68
|
const [scaleX, scaleY] = scales[ring];
|
|
69
69
|
for (let profileIndex = 0; profileIndex < profile.length; profileIndex += 1) {
|
|
70
70
|
const [x, y] = profile[profileIndex];
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { resolveModelingLimits } from "../model-limits.js";
|
|
3
|
+
import { path2InputData, path3InputData, } from "../paths/path-value.js";
|
|
2
4
|
import { validateSweepOptions } from "./orientation.js";
|
|
3
5
|
import { buildClosedSweepMesh } from "./sweep-closed.js";
|
|
4
6
|
import { buildOpenSweepMesh } from "./sweep-open.js";
|
|
@@ -15,12 +17,16 @@ import { buildOpenSweepMesh } from "./sweep-open.js";
|
|
|
15
17
|
*/
|
|
16
18
|
export function sweepMesh(profile, path, options = {}) {
|
|
17
19
|
validateSweepOptions(options);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
const limits = resolveModelingLimits(options.limits);
|
|
21
|
+
const outline = path2InputData(profile, true, { maxPathPoints: limits.maxProfilePoints }).points;
|
|
22
|
+
const data = path3InputData(path, options.closed, limits);
|
|
23
|
+
const selected = { ...options, closed: data.closed };
|
|
24
|
+
if (data.closed) {
|
|
25
|
+
return buildClosedSweepMesh(outline, data.points, selected);
|
|
20
26
|
}
|
|
21
27
|
if ((options.seamProfileOffset ?? 0) !== 0)
|
|
22
28
|
throw new GeometryError("INVALID_ARGUMENT", "A seamProfileOffset requires a closed path.", {
|
|
23
29
|
operation: "sweep",
|
|
24
30
|
});
|
|
25
|
-
return buildOpenSweepMesh(
|
|
31
|
+
return buildOpenSweepMesh(outline, data.points, selected);
|
|
26
32
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { triangulateContour } from "../loft/loft.js";
|
|
2
|
-
import { add3,
|
|
2
|
+
import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
|
|
3
3
|
import { validateTriangleMesh } from "../mesh/mesh.js";
|
|
4
4
|
import { resolveSweepScales } from "./options.js";
|
|
5
5
|
import { computeSweepFrames, validateSweepOptions } from "./orientation.js";
|
|
@@ -13,7 +13,7 @@ export const buildOpenSweepMesh = (profile, path, options = {}) => {
|
|
|
13
13
|
path = normalizeSweepPath(path, false, operation, options.limits);
|
|
14
14
|
assertSweepAllocation(path.length, profile.length, false, operation, options.limits);
|
|
15
15
|
let scales = resolveSweepScales(options.scale, path.length);
|
|
16
|
-
const twistRadians = ((options.
|
|
16
|
+
const twistRadians = ((options.twist ?? 0) / 180) * Math.PI;
|
|
17
17
|
if (twistRadians !== 0) {
|
|
18
18
|
const plan = planSweepStations([profile], path, scales, options);
|
|
19
19
|
assertSweepAllocation(plan.stationCount, profile.length, false, operation, options.limits);
|
|
@@ -37,8 +37,8 @@ export const buildOpenSweepMesh = (profile, path, options = {}) => {
|
|
|
37
37
|
const point = path[ring];
|
|
38
38
|
const frame = frames[ring];
|
|
39
39
|
const twist = twists?.[ring] ?? (twistRadians * ring) / (path.length - 1);
|
|
40
|
-
const normal =
|
|
41
|
-
const binormal =
|
|
40
|
+
const normal = rotateAroundAxis3Radians(frame.normal, frame.tangent, twist);
|
|
41
|
+
const binormal = rotateAroundAxis3Radians(frame.binormal, frame.tangent, twist);
|
|
42
42
|
const [scaleX, scaleY] = scales[ring];
|
|
43
43
|
for (let profileIndex = 0; profileIndex < profile.length; profileIndex += 1) {
|
|
44
44
|
const [x, y] = profile[profileIndex];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { vector3Data } from "../math/vector-value.js";
|
|
2
3
|
import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "../model-limits.js";
|
|
3
4
|
import { writeMeshVertex } from "../numeric.js";
|
|
4
5
|
import { normalizeContour } from "../regions.js";
|
|
@@ -97,13 +98,8 @@ export function writeSweepVertex(positions, offset, point, operation) {
|
|
|
97
98
|
writeMeshVertex(positions, offset, point, operation);
|
|
98
99
|
}
|
|
99
100
|
/** @internal Checks user-provided orientation controls before vector normalization. */
|
|
100
|
-
export function validateSweepNormal(
|
|
101
|
-
const
|
|
102
|
-
if (!hasArrayShape || normal.length !== 3) {
|
|
103
|
-
throw new GeometryError("INVALID_ARGUMENT", "Sweep normals must be exact XYZ tuples.", {
|
|
104
|
-
operation,
|
|
105
|
-
});
|
|
106
|
-
}
|
|
101
|
+
export function validateSweepNormal(input, operation) {
|
|
102
|
+
const normal = vector3Data(input);
|
|
107
103
|
if (![normal[0], normal[1], normal[2]].every(Number.isFinite)) {
|
|
108
104
|
throw new GeometryError("NON_FINITE_VALUE", "Sweep normal coordinates must be finite XYZ values.", { operation });
|
|
109
105
|
}
|
|
@@ -112,4 +108,5 @@ export function validateSweepNormal(normal, operation) {
|
|
|
112
108
|
operation,
|
|
113
109
|
});
|
|
114
110
|
}
|
|
111
|
+
return normal;
|
|
115
112
|
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { GeometryError } from "./errors.js";
|
|
2
|
+
import { immutableMathClass } from "./math/immutable-value.js";
|
|
3
|
+
import { vector2, vector2Data, vector3, vector3Data, } from "./math/vector-value.js";
|
|
4
|
+
import { readTransformMatrix } from "./transform-matrix.js";
|
|
5
|
+
import { embedTransform2, restrictTransform3 } from "./transform2.js";
|
|
6
|
+
import { applyInverseTranspose3, applyValidatedTransformDirection3, applyValidatedTransformPoint3, composeTransform3, eulerTransform3, IDENTITY_TRANSFORM3, inverseLinearTransform3, inverseTransform3, rotationTransform3, scaleTransform3, translationTransform3, validateTransform3, } from "./transform3.js";
|
|
7
|
+
const pivotTransform = (matrix, pivot) => pivot === undefined
|
|
8
|
+
? matrix
|
|
9
|
+
: composeTransform3(translationTransform3(pivot), composeTransform3(matrix, translationTransform3([-pivot[0], -pivot[1], -pivot[2]])));
|
|
10
|
+
const xyz = (point) => [point[0], point[1], 0];
|
|
11
|
+
const xy = (point) => [point[0], point[1]];
|
|
12
|
+
const pivot2 = (options) => {
|
|
13
|
+
validatePivotOptions(options);
|
|
14
|
+
return options?.pivot === undefined ? undefined : xyz(vector2Data(options.pivot));
|
|
15
|
+
};
|
|
16
|
+
const pivot3 = (options) => {
|
|
17
|
+
validatePivotOptions(options);
|
|
18
|
+
return options?.pivot === undefined ? undefined : vector3Data(options.pivot);
|
|
19
|
+
};
|
|
20
|
+
function validatePivotOptions(options) {
|
|
21
|
+
if (options !== undefined &&
|
|
22
|
+
(options === null || typeof options !== "object" || Array.isArray(options))) {
|
|
23
|
+
throw new GeometryError("INVALID_ARGUMENT", "Rotation and scaling options require a named pivot.");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Translation does not affect normals. Inverting only the linear component also avoids
|
|
27
|
+
// irrelevant overflow from a large inverse translation. Cache once per immutable placement.
|
|
28
|
+
const normalMatrices = new WeakMap();
|
|
29
|
+
function applyNormal(owner, matrix, normal) {
|
|
30
|
+
let inverse = normalMatrices.get(owner);
|
|
31
|
+
if (inverse === undefined) {
|
|
32
|
+
inverse = inverseLinearTransform3(matrix);
|
|
33
|
+
normalMatrices.set(owner, inverse);
|
|
34
|
+
}
|
|
35
|
+
return applyInverseTranspose3(inverse, normal);
|
|
36
|
+
}
|
|
37
|
+
const snapshotTransform3 = (matrix) => {
|
|
38
|
+
validateTransform3(matrix);
|
|
39
|
+
return Object.freeze([
|
|
40
|
+
matrix[0],
|
|
41
|
+
matrix[1],
|
|
42
|
+
matrix[2],
|
|
43
|
+
matrix[3],
|
|
44
|
+
matrix[4],
|
|
45
|
+
matrix[5],
|
|
46
|
+
matrix[6],
|
|
47
|
+
matrix[7],
|
|
48
|
+
matrix[8],
|
|
49
|
+
matrix[9],
|
|
50
|
+
matrix[10],
|
|
51
|
+
matrix[11],
|
|
52
|
+
0,
|
|
53
|
+
0,
|
|
54
|
+
0,
|
|
55
|
+
1,
|
|
56
|
+
]);
|
|
57
|
+
};
|
|
58
|
+
const Placement3 = /* @__PURE__ */ immutableMathClass(class Placement3 {
|
|
59
|
+
matrix;
|
|
60
|
+
constructor(matrix) {
|
|
61
|
+
this.matrix = matrix;
|
|
62
|
+
Object.freeze(this);
|
|
63
|
+
}
|
|
64
|
+
translate(offset) {
|
|
65
|
+
return this.andThen(translationTransform3(vector3Data(offset)));
|
|
66
|
+
}
|
|
67
|
+
rotate(degrees, options) {
|
|
68
|
+
return this.andThen(pivotTransform(eulerTransform3(vector3Data(degrees)), pivot3(options)));
|
|
69
|
+
}
|
|
70
|
+
rotateAxis(axis, degrees, options) {
|
|
71
|
+
return this.andThen(pivotTransform(rotationTransform3(vector3Data(axis), { degrees }), pivot3(options)));
|
|
72
|
+
}
|
|
73
|
+
scale(factors, options) {
|
|
74
|
+
const values = typeof factors === "number" ? [factors, factors, factors] : vector3Data(factors);
|
|
75
|
+
return this.andThen(pivotTransform(scaleTransform3(values), pivot3(options)));
|
|
76
|
+
}
|
|
77
|
+
andThen(next) {
|
|
78
|
+
return new Placement3(composeTransform3(snapshotTransform3(readTransformMatrix(next, 3)), this.matrix));
|
|
79
|
+
}
|
|
80
|
+
inverse() {
|
|
81
|
+
return new Placement3(inverseTransform3(this.matrix));
|
|
82
|
+
}
|
|
83
|
+
applyPoint(point) {
|
|
84
|
+
return vector3(applyValidatedTransformPoint3(this.matrix, vector3Data(point)));
|
|
85
|
+
}
|
|
86
|
+
applyDirection(direction) {
|
|
87
|
+
return vector3(applyValidatedTransformDirection3(this.matrix, vector3Data(direction)));
|
|
88
|
+
}
|
|
89
|
+
applyNormal(normal) {
|
|
90
|
+
return vector3(applyNormal(this, this.matrix, vector3Data(normal)));
|
|
91
|
+
}
|
|
92
|
+
toMatrix() {
|
|
93
|
+
return this.matrix;
|
|
94
|
+
}
|
|
95
|
+
to2D() {
|
|
96
|
+
return transform2(restrictTransform3(this.matrix));
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
const Placement2 = /* @__PURE__ */ immutableMathClass(class Placement2 {
|
|
100
|
+
spatial;
|
|
101
|
+
matrix;
|
|
102
|
+
constructor(spatial) {
|
|
103
|
+
this.spatial = spatial;
|
|
104
|
+
this.matrix = restrictTransform3(spatial.toMatrix());
|
|
105
|
+
Object.freeze(this);
|
|
106
|
+
}
|
|
107
|
+
translate(offset) {
|
|
108
|
+
return new Placement2(this.spatial.translate(xyz(vector2Data(offset))));
|
|
109
|
+
}
|
|
110
|
+
rotate(degrees, options) {
|
|
111
|
+
const pivot = pivot2(options);
|
|
112
|
+
return new Placement2(this.spatial.rotateAxis([0, 0, 1], degrees, pivot === undefined ? undefined : { pivot }));
|
|
113
|
+
}
|
|
114
|
+
scale(factors, options) {
|
|
115
|
+
const pair = typeof factors === "number" ? [factors, factors] : vector2Data(factors);
|
|
116
|
+
const values = [pair[0], pair[1], 1];
|
|
117
|
+
const pivot = pivot2(options);
|
|
118
|
+
return new Placement2(this.spatial.scale(values, pivot === undefined ? undefined : { pivot }));
|
|
119
|
+
}
|
|
120
|
+
andThen(next) {
|
|
121
|
+
return new Placement2(this.spatial.andThen(embedTransform2(readTransformMatrix(next, 2))));
|
|
122
|
+
}
|
|
123
|
+
inverse() {
|
|
124
|
+
return new Placement2(this.spatial.inverse());
|
|
125
|
+
}
|
|
126
|
+
applyPoint(point) {
|
|
127
|
+
return vector2(xy(applyValidatedTransformPoint3(this.spatial.toMatrix(), xyz(vector2Data(point)))));
|
|
128
|
+
}
|
|
129
|
+
applyDirection(direction) {
|
|
130
|
+
return vector2(xy(applyValidatedTransformDirection3(this.spatial.toMatrix(), xyz(vector2Data(direction)))));
|
|
131
|
+
}
|
|
132
|
+
applyNormal(normal) {
|
|
133
|
+
return vector2(xy(applyNormal(this, this.spatial.toMatrix(), xyz(vector2Data(normal)))));
|
|
134
|
+
}
|
|
135
|
+
toMatrix() {
|
|
136
|
+
return this.matrix;
|
|
137
|
+
}
|
|
138
|
+
to3D() {
|
|
139
|
+
return this.spatial;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
/**
|
|
143
|
+
* Creates an immutable XY transform, identity by default. Matrices are copied and validated.
|
|
144
|
+
* Pass it directly to Section.transform() and planar data helpers; to3D() explicitly crosses into XYZ.
|
|
145
|
+
* Zero scales and singular matrices throw GeometryError; negative scales reflect.
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```ts
|
|
149
|
+
* const placement = transform2().rotate(90).translate([10, 0]);
|
|
150
|
+
* placement.applyPoint([1, 0]).toArray(); // approximately [10, 1]
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export function transform2(matrix) {
|
|
154
|
+
return new Placement2(matrix === undefined
|
|
155
|
+
? new Placement3(IDENTITY_TRANSFORM3)
|
|
156
|
+
: new Placement3(embedTransform2(matrix)));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Creates an immutable XYZ transform, identity by default. Matrices are copied and validated.
|
|
160
|
+
* Calls apply in written order; rotations use degrees and pivots use current world coordinates.
|
|
161
|
+
* Zero scales, singular matrices, nonfinite inputs and zero rotation axes throw GeometryError.
|
|
162
|
+
* Use frameTransform3(frame) as the input for existing orthonormal frame placement.
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```ts
|
|
166
|
+
* const placement = transform3().rotate([0, 0, 90]).translate([10, 0, 0]);
|
|
167
|
+
* placement.applyPoint([1, 0, 0]).toArray(); // approximately [10, 1, 0]
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export function transform3(matrix = IDENTITY_TRANSFORM3) {
|
|
171
|
+
return new Placement3(snapshotTransform3(matrix));
|
|
172
|
+
}
|
|
@@ -1,41 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { vector2Data } from "./math/vector-value.js";
|
|
2
2
|
import { normalizeContour, normalizeRegion, signedContourArea } from "./regions.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import { readTransformMatrix } from "./transform-matrix.js";
|
|
4
|
+
import { embedTransform2 } from "./transform2.js";
|
|
5
|
+
import { applyValidatedTransformPoint3, validateTransform3 } from "./transform3.js";
|
|
6
|
+
/** Internal owned coordinates for a Path3 result; no mutable coordinates escape the path value. */
|
|
7
|
+
export function transformPath3(path, placement) {
|
|
8
|
+
const transform = readTransformMatrix(placement, 3);
|
|
7
9
|
validateTransform3(transform);
|
|
8
|
-
return
|
|
10
|
+
return path.map((point) => applyValidatedTransformPoint3(transform, point));
|
|
9
11
|
}
|
|
10
|
-
const transformPoint2 = (point, transform
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
throw new GeometryError("INVALID_ARGUMENT", "A 2D transform must preserve the XY plane.", {
|
|
15
|
-
operation: "transformPath2",
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
return Object.freeze([transformed[0], transformed[1]]);
|
|
12
|
+
const transformPoint2 = (point, transform) => {
|
|
13
|
+
const values = vector2Data(point);
|
|
14
|
+
const transformed = applyValidatedTransformPoint3(transform, [values[0], values[1], 0]);
|
|
15
|
+
return [transformed[0], transformed[1]];
|
|
19
16
|
};
|
|
20
|
-
|
|
17
|
+
const transformPlanarPath = (path, transform) => Object.freeze(path.map((point) => Object.freeze(transformPoint2(point, transform))));
|
|
18
|
+
/** Internal owned XY coordinates preserving path traversal; public interchange is frozen by Path2. */
|
|
21
19
|
export function transformPath2(path, transform, tolerance = {}) {
|
|
22
|
-
|
|
23
|
-
return
|
|
20
|
+
const matrix = embedTransform2(readTransformMatrix(transform, 2), tolerance);
|
|
21
|
+
return path.map((point) => transformPoint2(point, matrix));
|
|
24
22
|
}
|
|
25
|
-
|
|
26
|
-
* Transforms a closed loop and preserves its original winding convention.
|
|
27
|
-
*
|
|
28
|
-
* Reflections reverse the point order automatically through normalization.
|
|
29
|
-
*/
|
|
30
|
-
export function transformContour(loop, transform, tolerance = {}) {
|
|
23
|
+
const transformContourWithMatrix = (loop, transform, tolerance) => {
|
|
31
24
|
const counterClockwise = signedContourArea(loop) > 0;
|
|
32
25
|
const normalized = normalizeContour(loop, counterClockwise, tolerance);
|
|
33
|
-
return normalizeContour(
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
|
|
26
|
+
return normalizeContour(transformPlanarPath(normalized, transform), counterClockwise, tolerance);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Transforms serialized polygon data with reflection-safe winding, without an engine.
|
|
30
|
+
* Use Section.transform(placement) when authoring filled geometry; this utility serves pure data preparation.
|
|
31
|
+
*/
|
|
32
|
+
export function transformRegionData(region, transform, tolerance = {}) {
|
|
33
|
+
const planar = embedTransform2(readTransformMatrix(transform, 2), tolerance);
|
|
37
34
|
return normalizeRegion(region.map((polygon) => ({
|
|
38
|
-
holes: polygon.holes.map((hole) =>
|
|
39
|
-
outer:
|
|
35
|
+
holes: polygon.holes.map((hole) => transformContourWithMatrix(hole, planar, tolerance)),
|
|
36
|
+
outer: transformContourWithMatrix(polygon.outer, planar, tolerance),
|
|
40
37
|
})), tolerance);
|
|
41
38
|
}
|