@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
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { GeometryError } from "../../geometry/errors.js";
|
|
2
|
+
import { triangleSolidAngle } from "../../geometry/mesh/mesh-solid-intersections.js";
|
|
3
|
+
import { assertMeshAllocationWithinLimits, } from "../../geometry/model-limits.js";
|
|
4
|
+
import { ownScopedManifoldValue, scopedManifoldModule, } from "./context.js";
|
|
5
|
+
import { assertNativeSolidStatus } from "./status.js";
|
|
6
|
+
const MAXIMUM_CONTAINMENT_TESTS = 2_000_000;
|
|
7
|
+
/** Certifies the native sign only when its floating-point error cannot reach zero. */
|
|
8
|
+
function certifiedNativeOrientation(volume, bounds, triangles) {
|
|
9
|
+
const magnitudes = bounds.min.map((value, axis) => Math.max(Math.abs(value), Math.abs(bounds.max[axis])));
|
|
10
|
+
const ranges = bounds.min.map((value, axis) => bounds.max[axis] - value);
|
|
11
|
+
const magnitude = Math.max(...magnitudes);
|
|
12
|
+
// Pinned Manifold 3.5.4 src/properties.cpp:245-270 computes edge-cross/dot/6
|
|
13
|
+
// terms q followed by s'=fl(s+q), c+=fl(fl(s-s')+q). In exact algebra the
|
|
14
|
+
// compensation cancels the running-sum errors. For u=2^-53 and n*u<1/4,
|
|
15
|
+
// remaining summation error is <=(6u+7n^2*u^2)*sum(abs(q)). For
|
|
16
|
+
// P=sum(Mi*Rj*Rk), each triangle's absolute product sum is <=P/3 and its
|
|
17
|
+
// arithmetic error is <=64uP. Their total is <80*u*n*P*(1+n^2*u);
|
|
18
|
+
// 512 also covers rounding of ranges/P. This selects arithmetic, never size.
|
|
19
|
+
// These windows keep the bound finite/normal and absolute subnormal errors
|
|
20
|
+
// below its spare margin; coordinates outside them use exact arithmetic.
|
|
21
|
+
if (!Number.isFinite(volume) ||
|
|
22
|
+
triangles < 4 ||
|
|
23
|
+
triangles >= 2 ** 31 ||
|
|
24
|
+
magnitude < 2 ** -300 ||
|
|
25
|
+
magnitude > 2 ** 300 ||
|
|
26
|
+
ranges.some((range) => range < 2 ** -300 || range > 2 ** 300))
|
|
27
|
+
return undefined;
|
|
28
|
+
const productSum = magnitudes[0] * ranges[1] * ranges[2] +
|
|
29
|
+
magnitudes[1] * ranges[0] * ranges[2] +
|
|
30
|
+
magnitudes[2] * ranges[0] * ranges[1];
|
|
31
|
+
const unitRoundoff = Number.EPSILON / 2;
|
|
32
|
+
const error = 512 * unitRoundoff * triangles * productSum * (1 + triangles * triangles * unitRoundoff);
|
|
33
|
+
if (!Number.isFinite(error))
|
|
34
|
+
return undefined;
|
|
35
|
+
return Math.abs(volume) > error ? (volume < 0 ? -1 : 1) : undefined;
|
|
36
|
+
}
|
|
37
|
+
/** Observes native coordinates and topology without converting geometry to Float32. */
|
|
38
|
+
function nativeShellMesh(scope, shell, limits) {
|
|
39
|
+
const vertices = shell.numVert();
|
|
40
|
+
const properties = shell.numPropVert();
|
|
41
|
+
const triangles = shell.numTri();
|
|
42
|
+
// Both native observation work and copied topology stay within the host's mesh limits.
|
|
43
|
+
// Charge the Float64 coordinates, Float32 property mesh, index map and triangle indices.
|
|
44
|
+
assertMeshAllocationWithinLimits(Math.max(vertices, properties), triangles, vertices * 24 + properties * (shell.numProp() + 4) * 4 + triangles * 12, "components", limits);
|
|
45
|
+
const coordinates = new Float64Array(vertices * 3);
|
|
46
|
+
const encoded = ownScopedManifoldValue(scope, shell.warpBatch((positions, count) => {
|
|
47
|
+
coordinates.set(positions);
|
|
48
|
+
for (let vertex = 0; vertex < count; vertex++) {
|
|
49
|
+
// Exact Float32-safe IDs recover native indices even when property vertices
|
|
50
|
+
// are duplicated or reordered by getMesh(). The original coordinates stay Float64.
|
|
51
|
+
positions[vertex * 3] = vertex % 65536;
|
|
52
|
+
positions[vertex * 3 + 1] = Math.floor(vertex / 65536);
|
|
53
|
+
positions[vertex * 3 + 2] = 0;
|
|
54
|
+
}
|
|
55
|
+
}));
|
|
56
|
+
assertNativeSolidStatus(encoded, "components");
|
|
57
|
+
if (encoded.numVert() !== vertices || encoded.numTri() !== triangles)
|
|
58
|
+
throw new GeometryError("INVALID_TOPOLOGY", "Native observation changed shell topology.", {
|
|
59
|
+
operation: "components",
|
|
60
|
+
});
|
|
61
|
+
const mesh = encoded.getMesh();
|
|
62
|
+
if (mesh.numVert !== properties || mesh.numTri !== triangles)
|
|
63
|
+
throw new GeometryError("INVALID_TOPOLOGY", "Native observation changed property topology.", {
|
|
64
|
+
operation: "components",
|
|
65
|
+
});
|
|
66
|
+
const indices = new Uint32Array(properties);
|
|
67
|
+
for (let vertex = 0; vertex < properties; vertex++) {
|
|
68
|
+
const offset = vertex * mesh.numProp;
|
|
69
|
+
const low = mesh.vertProperties[offset];
|
|
70
|
+
const high = mesh.vertProperties[offset + 1];
|
|
71
|
+
const index = low + high * 65536;
|
|
72
|
+
if (!Number.isInteger(low) ||
|
|
73
|
+
low < 0 ||
|
|
74
|
+
low >= 65536 ||
|
|
75
|
+
!Number.isInteger(high) ||
|
|
76
|
+
high < 0 ||
|
|
77
|
+
!Number.isSafeInteger(index) ||
|
|
78
|
+
index >= vertices ||
|
|
79
|
+
mesh.vertProperties[offset + 2] !== 0)
|
|
80
|
+
throw new GeometryError("INVALID_TOPOLOGY", "Native observation lost a vertex identity.", {
|
|
81
|
+
operation: "components",
|
|
82
|
+
});
|
|
83
|
+
indices[vertex] = index;
|
|
84
|
+
}
|
|
85
|
+
return { coordinates, vertexIndices: indices, triangles: mesh.triVerts };
|
|
86
|
+
}
|
|
87
|
+
/** Computes signed enclosed volume without rounding, including folded contact boundaries. */
|
|
88
|
+
function nativeShellOrientation(mesh) {
|
|
89
|
+
const { coordinates, vertexIndices, triangles } = mesh;
|
|
90
|
+
const bits = new DataView(new ArrayBuffer(8));
|
|
91
|
+
const fractionMask = (1n << 52n) - 1n;
|
|
92
|
+
const representation = (value) => {
|
|
93
|
+
bits.setFloat64(0, value);
|
|
94
|
+
return bits.getBigUint64(0);
|
|
95
|
+
};
|
|
96
|
+
let minimumExponent = 2047;
|
|
97
|
+
for (const value of coordinates) {
|
|
98
|
+
if (!Number.isFinite(value))
|
|
99
|
+
throw new GeometryError("NON_FINITE_VALUE", "Native coordinates must be finite.", {
|
|
100
|
+
operation: "components",
|
|
101
|
+
});
|
|
102
|
+
if (value !== 0)
|
|
103
|
+
minimumExponent = Math.min(minimumExponent, Number((representation(value) >> 52n) & 2047n) || 1);
|
|
104
|
+
}
|
|
105
|
+
// One common binary scale makes each coefficient exact while avoiding thousands
|
|
106
|
+
// of unnecessary zero bits for ordinary millimetre coordinates.
|
|
107
|
+
const integer = (value) => {
|
|
108
|
+
if (value === 0)
|
|
109
|
+
return 0n;
|
|
110
|
+
const encodedValue = representation(value);
|
|
111
|
+
const exponent = Number((encodedValue >> 52n) & 2047n);
|
|
112
|
+
const significand = (encodedValue & fractionMask) | (exponent === 0 ? 0n : 1n << 52n);
|
|
113
|
+
const magnitude = significand << BigInt((exponent || 1) - minimumExponent);
|
|
114
|
+
return encodedValue >> 63n === 0n ? magnitude : -magnitude;
|
|
115
|
+
};
|
|
116
|
+
const origin = [integer(coordinates[0]), integer(coordinates[1]), integer(coordinates[2])];
|
|
117
|
+
const pointAt = (propertyVertex) => {
|
|
118
|
+
const offset = vertexIndices[propertyVertex] * 3;
|
|
119
|
+
return [
|
|
120
|
+
integer(coordinates[offset]) - origin[0],
|
|
121
|
+
integer(coordinates[offset + 1]) - origin[1],
|
|
122
|
+
integer(coordinates[offset + 2]) - origin[2],
|
|
123
|
+
];
|
|
124
|
+
};
|
|
125
|
+
let volume = 0n;
|
|
126
|
+
for (let triangle = 0; triangle < triangles.length; triangle += 3) {
|
|
127
|
+
const a = pointAt(triangles[triangle]);
|
|
128
|
+
const b = pointAt(triangles[triangle + 1]);
|
|
129
|
+
const c = pointAt(triangles[triangle + 2]);
|
|
130
|
+
volume +=
|
|
131
|
+
a[0] * (b[1] * c[2] - b[2] * c[1]) +
|
|
132
|
+
a[1] * (b[2] * c[0] - b[0] * c[2]) +
|
|
133
|
+
a[2] * (b[0] * c[1] - b[1] * c[0]);
|
|
134
|
+
}
|
|
135
|
+
return volume < 0n ? -1 : volume > 0n ? 1 : 0;
|
|
136
|
+
}
|
|
137
|
+
/** Internal material decomposition; inward boundary shells stay with their enclosing exterior. */
|
|
138
|
+
export function solidMaterialComponents(scope, solid, limits) {
|
|
139
|
+
assertNativeSolidStatus(solid, "components");
|
|
140
|
+
assertMeshAllocationWithinLimits(Math.max(solid.numVert(), solid.numPropVert()), solid.numTri(), solid.numPropVert() * (solid.numProp() + 3) * 4 + solid.numTri() * 12, "components", limits);
|
|
141
|
+
const shells = solid.decompose().map((shell) => ownScopedManifoldValue(scope, shell));
|
|
142
|
+
const boundaries = shells
|
|
143
|
+
.map((shell) => ({ shell, volume: shell.volume(), bounds: shell.boundingBox() }))
|
|
144
|
+
.filter(({ bounds }) => {
|
|
145
|
+
// Coplanar Boolean contact can leave native boundary shells without any material.
|
|
146
|
+
// Exact collapsed native bounds identify axis-aligned contacts cheaply. Do not
|
|
147
|
+
// use volume, an epsilon or Float32 mesh tests: any of them could
|
|
148
|
+
// discard a thin positive piece or an inward shell enclosing a real cavity.
|
|
149
|
+
return bounds.min.every((value, axis) => value !== bounds.max[axis]);
|
|
150
|
+
})
|
|
151
|
+
.map((entry) => ({
|
|
152
|
+
...entry,
|
|
153
|
+
orientation: certifiedNativeOrientation(entry.volume, entry.bounds, entry.shell.numTri()),
|
|
154
|
+
}));
|
|
155
|
+
const uncertain = boundaries.filter(({ orientation }) => orientation === undefined);
|
|
156
|
+
if (uncertain.length > 0) {
|
|
157
|
+
let vertices = 0;
|
|
158
|
+
let properties = 0;
|
|
159
|
+
let triangles = 0;
|
|
160
|
+
let bytes = 0;
|
|
161
|
+
for (const { shell } of uncertain) {
|
|
162
|
+
vertices += shell.numVert();
|
|
163
|
+
properties += shell.numPropVert();
|
|
164
|
+
triangles += shell.numTri();
|
|
165
|
+
bytes +=
|
|
166
|
+
shell.numVert() * 24 +
|
|
167
|
+
shell.numPropVert() * (shell.numProp() + 4) * 4 +
|
|
168
|
+
shell.numTri() * 12;
|
|
169
|
+
}
|
|
170
|
+
assertMeshAllocationWithinLimits(Math.max(vertices, properties), triangles, bytes, "components", limits);
|
|
171
|
+
}
|
|
172
|
+
const meshes = new Map();
|
|
173
|
+
let observedVertices = 0;
|
|
174
|
+
let observedProperties = 0;
|
|
175
|
+
let observedTriangles = 0;
|
|
176
|
+
let observedBytes = 0;
|
|
177
|
+
const meshFor = (shell) => {
|
|
178
|
+
const cached = meshes.get(shell);
|
|
179
|
+
if (cached !== undefined)
|
|
180
|
+
return cached;
|
|
181
|
+
const vertices = observedVertices + shell.numVert();
|
|
182
|
+
const properties = observedProperties + shell.numPropVert();
|
|
183
|
+
const triangles = observedTriangles + shell.numTri();
|
|
184
|
+
const bytes = observedBytes +
|
|
185
|
+
shell.numVert() * 24 +
|
|
186
|
+
shell.numPropVert() * (shell.numProp() + 4) * 4 +
|
|
187
|
+
shell.numTri() * 12;
|
|
188
|
+
assertMeshAllocationWithinLimits(Math.max(vertices, properties), triangles, bytes, "components", limits);
|
|
189
|
+
const mesh = nativeShellMesh(scope, shell, limits);
|
|
190
|
+
meshes.set(shell, mesh);
|
|
191
|
+
observedVertices = vertices;
|
|
192
|
+
observedProperties = properties;
|
|
193
|
+
observedTriangles = triangles;
|
|
194
|
+
observedBytes = bytes;
|
|
195
|
+
return mesh;
|
|
196
|
+
};
|
|
197
|
+
const entries = boundaries
|
|
198
|
+
.map((entry) => ({
|
|
199
|
+
...entry,
|
|
200
|
+
orientation: entry.orientation ?? nativeShellOrientation(meshFor(entry.shell)),
|
|
201
|
+
}))
|
|
202
|
+
.filter(({ orientation }) => orientation !== 0);
|
|
203
|
+
let tests = 0;
|
|
204
|
+
const spend = (count = 1) => {
|
|
205
|
+
tests += count;
|
|
206
|
+
if (tests > MAXIMUM_CONTAINMENT_TESTS)
|
|
207
|
+
throw new GeometryError("COMPLEXITY_LIMIT", "Material component containment exceeds its work ceiling.", {
|
|
208
|
+
operation: "components",
|
|
209
|
+
details: { required: tests, allowed: MAXIMUM_CONTAINMENT_TESTS },
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
const exteriors = entries.filter(({ orientation }) => orientation > 0);
|
|
213
|
+
const cavities = entries.filter(({ orientation }) => orientation < 0);
|
|
214
|
+
if (exteriors.length === 0)
|
|
215
|
+
return Object.freeze([]);
|
|
216
|
+
if (cavities.length === 0)
|
|
217
|
+
return Object.freeze(exteriors.map(({ shell }) => shell));
|
|
218
|
+
const pointAt = (mesh, index) => {
|
|
219
|
+
const offset = mesh.vertexIndices[index] * 3;
|
|
220
|
+
return [
|
|
221
|
+
mesh.coordinates[offset],
|
|
222
|
+
mesh.coordinates[offset + 1],
|
|
223
|
+
mesh.coordinates[offset + 2],
|
|
224
|
+
];
|
|
225
|
+
};
|
|
226
|
+
const candidates = [...exteriors].sort((left, right) => Math.abs(left.volume) - Math.abs(right.volume));
|
|
227
|
+
const enclosingExterior = (entry) => {
|
|
228
|
+
return candidates.find((candidate) => {
|
|
229
|
+
spend();
|
|
230
|
+
if (candidate === entry ||
|
|
231
|
+
entry.bounds.min.some((value, axis) => value < candidate.bounds.min[axis]) ||
|
|
232
|
+
entry.bounds.max.some((value, axis) => value > candidate.bounds.max[axis]))
|
|
233
|
+
return false;
|
|
234
|
+
const childMesh = meshFor(entry.shell);
|
|
235
|
+
const point = pointAt(childMesh, childMesh.triangles[0]);
|
|
236
|
+
const mesh = meshFor(candidate.shell);
|
|
237
|
+
let angle = 0;
|
|
238
|
+
for (let triangle = 0; triangle < mesh.triangles.length; triangle += 3) {
|
|
239
|
+
spend();
|
|
240
|
+
angle += triangleSolidAngle(point, [
|
|
241
|
+
pointAt(mesh, mesh.triangles[triangle]),
|
|
242
|
+
pointAt(mesh, mesh.triangles[triangle + 1]),
|
|
243
|
+
pointAt(mesh, mesh.triangles[triangle + 2]),
|
|
244
|
+
]);
|
|
245
|
+
}
|
|
246
|
+
return Math.abs(angle) > 2 * Math.PI;
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
const module = scopedManifoldModule(scope);
|
|
250
|
+
const enclosedCavities = cavities.map((cavity) => ({
|
|
251
|
+
cavity,
|
|
252
|
+
parent: enclosingExterior(cavity),
|
|
253
|
+
}));
|
|
254
|
+
const orphanedCavity = enclosedCavities.some(({ parent }) => parent === undefined);
|
|
255
|
+
if (exteriors.length === 1 && entries.length === shells.length && !orphanedCavity)
|
|
256
|
+
return Object.freeze([solid]);
|
|
257
|
+
if (entries.length !== shells.length || orphanedCavity) {
|
|
258
|
+
// Selecting from the original would retain contact sheets inside a sealed cavity.
|
|
259
|
+
// Rebuild only this exceptional case from its material boundaries. The JS kernel's
|
|
260
|
+
// compose aliases union, so turn inward shells into positive native cutters instead.
|
|
261
|
+
const cutters = new Map(exteriors.map(({ shell }) => [shell, []]));
|
|
262
|
+
for (const { cavity, parent } of enclosedCavities) {
|
|
263
|
+
// An inward shell removes positive occupancy only inside an exterior. A lone
|
|
264
|
+
// inward contact remnant cannot define a bounded piece of material.
|
|
265
|
+
if (parent === undefined)
|
|
266
|
+
continue;
|
|
267
|
+
// Warp preserves winding while native mirror reverses it. The two exact X sign
|
|
268
|
+
// changes restore all Float64 coordinates without a mesh round-trip or tolerance.
|
|
269
|
+
spend(cavity.shell.numVert());
|
|
270
|
+
const reflected = ownScopedManifoldValue(scope, cavity.shell.warpBatch((vertices, count) => {
|
|
271
|
+
for (let vertex = 0; vertex < count; vertex++) {
|
|
272
|
+
vertices[vertex * 3] = -vertices[vertex * 3];
|
|
273
|
+
}
|
|
274
|
+
}));
|
|
275
|
+
const cutter = ownScopedManifoldValue(scope, reflected.mirror([1, 0, 0]));
|
|
276
|
+
assertNativeSolidStatus(cutter, "components");
|
|
277
|
+
cutters.get(parent.shell).push(cutter);
|
|
278
|
+
}
|
|
279
|
+
return Object.freeze(exteriors.map(({ shell }) => {
|
|
280
|
+
const holes = cutters.get(shell);
|
|
281
|
+
const component = holes.length === 0
|
|
282
|
+
? shell
|
|
283
|
+
: ownScopedManifoldValue(scope, module.Manifold.difference([shell, ...holes]));
|
|
284
|
+
assertNativeSolidStatus(component, "components");
|
|
285
|
+
return component;
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
const children = new Map(exteriors.map(({ shell }) => [shell, []]));
|
|
289
|
+
for (const exterior of exteriors) {
|
|
290
|
+
const parent = enclosingExterior(exterior);
|
|
291
|
+
if (parent !== undefined)
|
|
292
|
+
children.get(parent.shell).push(exterior.shell);
|
|
293
|
+
}
|
|
294
|
+
// The JS kernel aliases compose to union, which fills independently supplied inward shells.
|
|
295
|
+
// Select from the original material instead, retaining its native precision and cavity winding.
|
|
296
|
+
return Object.freeze(exteriors.map(({ shell }) => {
|
|
297
|
+
const selected = ownScopedManifoldValue(scope, solid.intersect(shell));
|
|
298
|
+
const nested = children.get(shell);
|
|
299
|
+
const component = nested.length === 0
|
|
300
|
+
? selected
|
|
301
|
+
: ownScopedManifoldValue(scope, module.Manifold.difference([selected, ...nested]));
|
|
302
|
+
assertNativeSolidStatus(component, "components");
|
|
303
|
+
return component;
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
@@ -2,7 +2,8 @@ import { GeometryError } from "../../geometry/errors.js";
|
|
|
2
2
|
import { contourContainsPoint, normalizeContour, normalizeRegion, signedContourArea, } from "../../geometry/regions.js";
|
|
3
3
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../../geometry/sampling-limits.js";
|
|
4
4
|
import { assertScopedManifoldValue, ownScopedManifoldValue, scopedManifoldModule, } from "./context.js";
|
|
5
|
-
|
|
5
|
+
/** @internal One contour ceiling shared with authored input normalization preflights. */
|
|
6
|
+
export const MAX_AGGREGATE_CONTOURS = 25_000;
|
|
6
7
|
const assertRegionBounds = (regions, operation, limits = {}) => {
|
|
7
8
|
const hasArrayShape = Array.isArray(regions);
|
|
8
9
|
if (!hasArrayShape) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { helicalThreadRidgeMesh, helicalThreadSolidMesh } from "../../geometry/mechanical/index.js";
|
|
2
2
|
import { resolveCompensatedThreadSolidMesh, resolveThreadedNutSolid, } from "../../geometry/mechanical/thread-solids.js";
|
|
3
3
|
import { triangleMeshToManifold } from "./adapter.js";
|
|
4
4
|
export { preflightThreadedRodSolid, preflightInternalThreadCutterSolid, preflightThreadedNutSolid, } from "../../geometry/mechanical/thread-solids.js";
|
|
5
5
|
/** Converts the runtime-neutral ridge mesh into a scope-owned Manifold solid. */
|
|
6
6
|
export function threadRidgeSolid(module, options, scope) {
|
|
7
|
-
return triangleMeshToManifold(module,
|
|
7
|
+
return triangleMeshToManifold(module, helicalThreadRidgeMesh(options), scope);
|
|
8
8
|
}
|
|
9
9
|
const compensatedThreadSolid = (module, options, role, scope) => {
|
|
10
10
|
const resolved = resolveCompensatedThreadSolidMesh(options, role);
|
|
@@ -12,7 +12,7 @@ const compensatedThreadSolid = (module, options, role, scope) => {
|
|
|
12
12
|
};
|
|
13
13
|
const compensatedThreadSolidFromResolved = (module, resolved, scope) => {
|
|
14
14
|
const { axialExtension, meshOptions } = resolved;
|
|
15
|
-
const combined = triangleMeshToManifold(module,
|
|
15
|
+
const combined = triangleMeshToManifold(module, helicalThreadSolidMesh(meshOptions), scope);
|
|
16
16
|
return axialExtension === 0 ? combined : scope.own(combined.translate([0, 0, -axialExtension]));
|
|
17
17
|
};
|
|
18
18
|
/** Creates a compensated, scope-owned external threaded rod along +Z. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { attachmentTransform3 } from "../../geometry/anchors.js";
|
|
2
2
|
import { GeometryError } from "../../geometry/errors.js";
|
|
3
3
|
import { assertScopedManifoldValue, ownScopedManifoldValue, } from "./context.js";
|
|
4
4
|
const finiteVector = (value, name, operation) => {
|
|
@@ -33,7 +33,12 @@ export function rotate(context, solid, xyzDegrees) {
|
|
|
33
33
|
export function scale(context, solid, factors) {
|
|
34
34
|
assertScopedManifoldValue(context, solid);
|
|
35
35
|
const values = typeof factors === "number" ? [factors] : factors;
|
|
36
|
-
if (!values.every(Number.isFinite)
|
|
36
|
+
if (!values.every(Number.isFinite)) {
|
|
37
|
+
throw new GeometryError("NON_FINITE_VALUE", "Scale factors must be finite.", {
|
|
38
|
+
operation: "scale",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (values.some((value) => value === 0)) {
|
|
37
42
|
throw new GeometryError("SINGULAR_TRANSFORM", "Scale factors must be finite and non-zero.", {
|
|
38
43
|
operation: "scale",
|
|
39
44
|
});
|
|
@@ -95,17 +100,15 @@ export function transform(context, solid, matrix) {
|
|
|
95
100
|
}
|
|
96
101
|
/** Moves a local source anchor onto a world-space target anchor. */
|
|
97
102
|
export function attach(context, solid, source, target, options = {}) {
|
|
98
|
-
if (options.
|
|
99
|
-
throw new GeometryError("NON_FINITE_VALUE", "
|
|
103
|
+
if (options.spin !== undefined && !Number.isFinite(options.spin)) {
|
|
104
|
+
throw new GeometryError("NON_FINITE_VALUE", "spin must be finite.", {
|
|
100
105
|
operation: "attach",
|
|
101
106
|
});
|
|
102
107
|
}
|
|
103
|
-
return transform(context, solid,
|
|
108
|
+
return transform(context, solid, attachmentTransform3(source, target, {
|
|
104
109
|
...(options.alignment === undefined ? {} : { alignment: options.alignment }),
|
|
105
110
|
...(options.gap === undefined ? {} : { gap: options.gap }),
|
|
106
|
-
...(options.
|
|
107
|
-
? {}
|
|
108
|
-
: { spinRadians: (options.spinDegrees * Math.PI) / 180 }),
|
|
111
|
+
...(options.spin === undefined ? {} : { spin: options.spin }),
|
|
109
112
|
...(options.tolerance === undefined ? {} : { tolerance: options.tolerance }),
|
|
110
113
|
}));
|
|
111
114
|
}
|
|
@@ -9,8 +9,8 @@ export function createOperationEnvironment(owner, resolution) {
|
|
|
9
9
|
...value,
|
|
10
10
|
resolution: {
|
|
11
11
|
...resolution,
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
maxSegments: Math.min(resolution.maxSegments ?? limits.maxCircularSegments, limits.maxCircularSegments),
|
|
13
|
+
minSegments: Math.min(resolution.minSegments ?? 16, limits.maxCircularSegments),
|
|
14
14
|
...value.resolution,
|
|
15
15
|
},
|
|
16
16
|
limits,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { gridPatternPlan, linearPatternPlan, pathPatternPlan, radialPatternPlan, } from "../geometry/patterns/placements.js";
|
|
2
2
|
import { assertSamplingCount } from "../geometry/sampling-limits.js";
|
|
3
|
+
import { restrictTransform3 } from "../geometry/transform2.js";
|
|
3
4
|
import { IDENTITY_TRANSFORM3 } from "../geometry/transform3.js";
|
|
4
|
-
import { sectionPatternTransform } from "./pattern-transform.js";
|
|
5
5
|
/** Private pattern owner; all copies use the shared transform/metadata/lifetime path. */
|
|
6
6
|
export function createPatternOperations(environment, transforms) {
|
|
7
7
|
const apply = (source, makePlan, operation) => {
|
|
@@ -28,11 +28,11 @@ export function createPatternOperations(environment, transforms) {
|
|
|
28
28
|
const shape = typeof source === "function" ? source(index) : source;
|
|
29
29
|
if (typeof source === "function")
|
|
30
30
|
budget(shape, 1);
|
|
31
|
-
const matrix = plan.transformAt(index);
|
|
31
|
+
const matrix = plan.transformAt(index, kind === "section" ? 2 : 3);
|
|
32
32
|
copies.push(matrix.every((value, i) => value === IDENTITY_TRANSFORM3[i])
|
|
33
33
|
? shape
|
|
34
34
|
: kind === "section"
|
|
35
|
-
? transforms.operations.transform(shape,
|
|
35
|
+
? transforms.operations.transform(shape, restrictTransform3(matrix))
|
|
36
36
|
: transforms.operations.transform(shape, matrix));
|
|
37
37
|
}
|
|
38
38
|
return copies;
|
package/dist/engine/placement.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { validateAnalyzedSolidMesh } from "../geometry/mesh/mesh-solid.js";
|
|
2
|
-
import {
|
|
2
|
+
import { analyzeTriangleMesh } from "../geometry/mesh/mesh.js";
|
|
3
3
|
import { composeTransform3, eulerTransform3, translationTransform3, } from "../geometry/transform3.js";
|
|
4
4
|
/** Places already validated immutable geometry once, retaining its indexed topology. */
|
|
5
5
|
export function placeFinalizedGeometry(source, position, rotation, meshValidation) {
|
|
@@ -16,7 +16,7 @@ export function placeFinalizedGeometry(source, position, rotation, meshValidatio
|
|
|
16
16
|
const mesh = { positions, indices: source.indices };
|
|
17
17
|
// Rigid placement preserves indexed connectivity. Measure actual Float32 world output to keep
|
|
18
18
|
// exact bounds/volume/area without another topology or kernel pass under the default policy.
|
|
19
|
-
const measurements = Object.freeze({ ...source.measurements, ...
|
|
19
|
+
const measurements = Object.freeze({ ...source.measurements, ...analyzeTriangleMesh(mesh) });
|
|
20
20
|
// Float32 placement can close gaps between shells even when the local mesh passed validation.
|
|
21
21
|
if (meshValidation === "solid")
|
|
22
22
|
validateAnalyzedSolidMesh(mesh, measurements);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { anchor3, boxAnchor3 } from "../geometry/anchors.js";
|
|
2
2
|
import { resolveCylinderRadii } from "../geometry/cylinder.js";
|
|
3
3
|
const faces = ["left", "right", "back", "front", "bottom", "top"];
|
|
4
4
|
/** Nominal primitive datums; construction validates dimensions before these factories run. */
|
|
@@ -6,7 +6,7 @@ export function boxAnchors(options) {
|
|
|
6
6
|
const size = typeof options.size === "number" ? [options.size, options.size, options.size] : options.size;
|
|
7
7
|
const center = options.center === false ? [size[0] / 2, size[1] / 2, size[2] / 2] : [0, 0, 0];
|
|
8
8
|
return {
|
|
9
|
-
center:
|
|
9
|
+
center: anchor3(center, [0, 0, 1]),
|
|
10
10
|
...Object.fromEntries(faces.map((face) => [
|
|
11
11
|
face,
|
|
12
12
|
boxAnchor3({
|
|
@@ -24,13 +24,13 @@ function axialAnchors(radii, height, centered) {
|
|
|
24
24
|
const radius = (radii[0] + radii[1]) / 2;
|
|
25
25
|
const slope = (radii[1] - radii[0]) / height;
|
|
26
26
|
return {
|
|
27
|
-
center:
|
|
28
|
-
...(radii[0] === 0 ? {} : { bottom:
|
|
29
|
-
...(radii[1] === 0 ? {} : { top:
|
|
30
|
-
right:
|
|
31
|
-
left:
|
|
32
|
-
front:
|
|
33
|
-
back:
|
|
27
|
+
center: anchor3([0, 0, middle], [0, 0, 1]),
|
|
28
|
+
...(radii[0] === 0 ? {} : { bottom: anchor3([0, 0, bottom], [0, 0, -1]) }),
|
|
29
|
+
...(radii[1] === 0 ? {} : { top: anchor3([0, 0, bottom + height], [0, 0, 1]) }),
|
|
30
|
+
right: anchor3([radius, 0, middle], [1, 0, -slope], [0, 0, 1]),
|
|
31
|
+
left: anchor3([-radius, 0, middle], [-1, 0, -slope], [0, 0, 1]),
|
|
32
|
+
front: anchor3([0, radius, middle], [0, 1, -slope], [0, 0, 1]),
|
|
33
|
+
back: anchor3([0, -radius, middle], [0, -1, -slope], [0, 0, 1]),
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
/** Cylinder and frustum cap anchors omit an end whose nominal radius is zero. */
|
|
@@ -55,16 +55,16 @@ export function torusAnchors(options) {
|
|
|
55
55
|
export function planarAnchors(size, centered = true) {
|
|
56
56
|
const x = centered ? 0 : size[0] / 2, y = centered ? 0 : size[1] / 2;
|
|
57
57
|
return {
|
|
58
|
-
center:
|
|
59
|
-
top:
|
|
60
|
-
bottom:
|
|
61
|
-
right:
|
|
62
|
-
left:
|
|
63
|
-
front:
|
|
64
|
-
back:
|
|
58
|
+
center: anchor3([x, y, 0], [0, 0, 1]),
|
|
59
|
+
top: anchor3([x, y, 0], [0, 0, 1]),
|
|
60
|
+
bottom: anchor3([x, y, 0], [0, 0, -1]),
|
|
61
|
+
right: anchor3([x + size[0] / 2, y, 0], [1, 0, 0], [0, 0, 1]),
|
|
62
|
+
left: anchor3([x - size[0] / 2, y, 0], [-1, 0, 0], [0, 0, 1]),
|
|
63
|
+
front: anchor3([x, y + size[1] / 2, 0], [0, 1, 0], [0, 0, 1]),
|
|
64
|
+
back: anchor3([x, y - size[1] / 2, 0], [0, -1, 0], [0, 0, 1]),
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
/** A construction-origin reference for primitives without meaningful principal side datums. */
|
|
68
68
|
export const originAnchor = () => ({
|
|
69
|
-
center:
|
|
69
|
+
center: anchor3([0, 0, 0], [0, 0, 1]),
|
|
70
70
|
});
|
|
@@ -137,7 +137,7 @@ export function createPrimitiveOperations(environment, transforms, sections) {
|
|
|
137
137
|
return environment.rememberPrimitiveProfile(section, polygonSectionProfile(`polygon-${value.sides}`, loop, resolved.resolution, resolved.limits));
|
|
138
138
|
}),
|
|
139
139
|
star: (value) => placedSection(value, () => {
|
|
140
|
-
const angle = (validateFiniteNumber(value.
|
|
140
|
+
const angle = (validateFiniteNumber(value.rotation ?? 0, "star") * Math.PI) / 180;
|
|
141
141
|
const resolved = withResolutionDefaults(value);
|
|
142
142
|
const loop = starContour(value.outerRadius, value.points, value.innerRadius, resolved.limits).map(([x, y]) => [
|
|
143
143
|
x * Math.cos(angle) - y * Math.sin(angle),
|
|
@@ -44,8 +44,8 @@ export function ellipticalSectionProfile(radii, options, resolution, limits, fac
|
|
|
44
44
|
kind: "arc",
|
|
45
45
|
center: [0, 0],
|
|
46
46
|
radius,
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
startAngle: 0,
|
|
48
|
+
sweepAngle: 360,
|
|
49
49
|
...(segments === undefined ? {} : { segments }),
|
|
50
50
|
},
|
|
51
51
|
],
|
|
@@ -181,15 +181,16 @@ export function correspondingPrimitiveProfiles(sources, options, limits) {
|
|
|
181
181
|
const policy = source.spanResolution?.[span.id] ?? source.resolution;
|
|
182
182
|
const original = resolveGeometryResolution({
|
|
183
183
|
...policy,
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
maxSegments: Math.min(policy.maxSegments ?? selected.maxCircularSegments, selected.maxCircularSegments),
|
|
185
|
+
minSegments: Math.min(policy.minSegments ?? 16, selected.maxCircularSegments),
|
|
186
186
|
}, selected);
|
|
187
187
|
const edgeLength = Math.min(original.maxSegmentLength ?? Infinity, target.maxSegmentLength ?? Infinity) /
|
|
188
188
|
scale;
|
|
189
189
|
const resolution = {
|
|
190
|
+
sizing: source.faceSizing ? "face" : "vertex",
|
|
190
191
|
maxChordError: Math.min(original.maxChordError, target.maxChordError) / scale,
|
|
191
|
-
|
|
192
|
-
|
|
192
|
+
maxSegments: Math.min(original.maxSegments, target.maxSegments),
|
|
193
|
+
minSegments: Math.min(Math.max(original.minSegments, target.minSegments), Math.min(original.maxSegments, target.maxSegments)),
|
|
193
194
|
...(Number.isFinite(edgeLength) ? { maxSegmentLength: edgeLength } : {}),
|
|
194
195
|
...(target.circularSegments === undefined
|
|
195
196
|
? {}
|
|
@@ -198,7 +199,7 @@ export function correspondingPrimitiveProfiles(sources, options, limits) {
|
|
|
198
199
|
const segments = span.kind === "arc"
|
|
199
200
|
? span.radius === 0
|
|
200
201
|
? 1
|
|
201
|
-
: resolveArcSegments(span.radius, Math.abs(span.
|
|
202
|
+
: resolveArcSegments(span.radius, Math.abs(span.sweepAngle), resolution, selected)
|
|
202
203
|
: span.kind === "line"
|
|
203
204
|
? resolveLineSegmentCount(Math.hypot(span.end[0] - span.start[0], span.end[1] - span.start[1]), resolution.maxSegmentLength)
|
|
204
205
|
: resolveUniformCubicSegments(planarCubicControl(span), resolveGeometryResolution(resolution, selected), selected.maxProfilePoints);
|
|
@@ -42,12 +42,12 @@ function profileMeshAllocation(first, stationCount, limits, closed) {
|
|
|
42
42
|
fail("Matched contours require at least three logical points and paired span identities.");
|
|
43
43
|
logicalCount += contour.points.length;
|
|
44
44
|
}
|
|
45
|
-
const
|
|
45
|
+
const maxVertices = logicalCount * stationCount;
|
|
46
46
|
const capTriangles = 2 * (logicalCount + firstContours.length * 2);
|
|
47
47
|
const maximumTriangles = (closed ? stationCount : stationCount - 1) * logicalCount * 2 + (closed ? 0 : capTriangles);
|
|
48
48
|
assertSamplingCount(logicalCount, "loft", limits.maxProfilePoints);
|
|
49
|
-
assertMeshAllocationWithinLimits(
|
|
50
|
-
return { firstContours,
|
|
49
|
+
assertMeshAllocationWithinLimits(maxVertices, maximumTriangles, 12 * (maxVertices + maximumTriangles), "loft", limits);
|
|
50
|
+
return { firstContours, maxVertices, maximumTriangles };
|
|
51
51
|
}
|
|
52
52
|
/** Internal native hole-cap triangulation over copied, explicit matched logical slots. */
|
|
53
53
|
export function buildProfileLoftMesh(module, stations, limits, closed = false, seamProfileOffset = 0, positionFor) {
|
|
@@ -55,8 +55,8 @@ export function buildProfileLoftMesh(module, stations, limits, closed = false, s
|
|
|
55
55
|
fail("Profile lofts require a bounded station array with two stations, or three for a closed path.");
|
|
56
56
|
assertSamplingCount(stations.length, "loft", limits.maxPathPoints);
|
|
57
57
|
const first = stations[0].profile;
|
|
58
|
-
const { firstContours,
|
|
59
|
-
const positions = new Float32Array(
|
|
58
|
+
const { firstContours, maxVertices, maximumTriangles } = profileMeshAllocation(first, stations.length, limits, closed);
|
|
59
|
+
const positions = new Float32Array(maxVertices * 3);
|
|
60
60
|
const indices = new Uint32Array(maximumTriangles * 3);
|
|
61
61
|
let vertexCount = 0, cursor = 0;
|
|
62
62
|
const physicalStations = stations.map((station, stationIndex) => {
|
|
@@ -205,9 +205,9 @@ export function buildProfileSweepMesh(module, profile, inputPath, options, limit
|
|
|
205
205
|
assertSamplingCount(contourList(profile).reduce((count, contour) => count + contour.points.length, 0), "sweep", limits.maxSweepProfilePoints);
|
|
206
206
|
profileMeshAllocation(profile, path.length, limits, closed);
|
|
207
207
|
let scales = resolveSweepScales(options.scale, path.length);
|
|
208
|
-
const twist = options.
|
|
208
|
+
const twist = options.twist ?? 0;
|
|
209
209
|
if (!Number.isFinite(twist))
|
|
210
|
-
fail("Sweep
|
|
210
|
+
fail("Sweep twist must be finite.");
|
|
211
211
|
const seamProfileOffset = options.seamProfileOffset ?? 0;
|
|
212
212
|
if (!Number.isSafeInteger(seamProfileOffset) || (!closed && seamProfileOffset !== 0))
|
|
213
213
|
fail("A finite integer seamProfileOffset requires a closed path.");
|