@metamesh/modeling 0.14.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 +42 -0
- package/README.md +25 -10
- package/dist/api/engine.d.ts +11 -4
- package/dist/api/geometry.d.ts +345 -341
- package/dist/api/index.d.ts +262 -144
- package/dist/api/text.d.ts +3 -1
- package/dist/docs/guides/concepts.md +22 -7
- package/dist/docs/guides/fundamentals.md +8 -5
- package/dist/docs/guides/hosting.md +21 -11
- package/dist/docs/guides/recipes.md +42 -21
- package/dist/docs/manifest.json +710 -507
- 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 +2 -2
- 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 +4 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +1 -1
- package/dist/docs/reference/geometry/ArcCurve2.md +5 -5
- package/dist/docs/reference/geometry/ArcCurve3.md +5 -5
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +10 -5
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +1 -1
- package/dist/docs/reference/geometry/Bounds2.md +1 -1
- package/dist/docs/reference/geometry/Bounds3.md +1 -1
- package/dist/docs/reference/geometry/BoundsFit2.md +1 -1
- package/dist/docs/reference/geometry/BoundsFit3.md +1 -1
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +1 -1
- 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 +8 -8
- 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 +7 -7
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +1 -1
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +1 -1
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -3
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +1 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +3 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +5 -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 +9 -3
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +6 -6
- package/dist/docs/reference/geometry/LineCurve2.md +1 -1
- package/dist/docs/reference/geometry/LineCurve3.md +1 -1
- package/dist/docs/reference/geometry/LinearPatternOptions.md +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 +1 -1
- package/dist/docs/reference/geometry/PathLocation.md +65 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +4 -3
- 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 +1 -1
- package/dist/docs/reference/geometry/PathResamplingOptions.md +80 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +1 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +22 -22
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +1 -1
- package/dist/docs/reference/geometry/PolygonData.md +1 -1
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +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 +2 -2
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/RegionData.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/SampledCurve3.md +1 -1
- 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} +7 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +1 -1
- 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} +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/Transform2Input.md +1 -1
- package/dist/docs/reference/geometry/Transform2Matrix.md +1 -1
- package/dist/docs/reference/geometry/Transform3-type.md +1 -1
- package/dist/docs/reference/geometry/Transform3Input.md +1 -1
- package/dist/docs/reference/geometry/Transform3Matrix.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/Vector2Input.md +1 -1
- package/dist/docs/reference/geometry/Vector2Tuple.md +1 -1
- package/dist/docs/reference/geometry/Vector3-type.md +1 -1
- package/dist/docs/reference/geometry/Vector3Input.md +1 -1
- package/dist/docs/reference/geometry/Vector3Tuple.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/add3.md +1 -1
- 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} +9 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +1 -1
- package/dist/docs/reference/geometry/applyTransformPoint3.md +1 -1
- package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +13 -13
- package/dist/docs/reference/geometry/boundsCenter.md +1 -1
- package/dist/docs/reference/geometry/boundsFromSize.md +1 -1
- package/dist/docs/reference/geometry/boundsSize.md +1 -1
- package/dist/docs/reference/geometry/boxAnchor3.md +4 -4
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +15 -13
- 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 +6 -6
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -3
- package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
- package/dist/docs/reference/geometry/categories/transforms-math.md +5 -5
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/cross2.md +1 -1
- package/dist/docs/reference/geometry/cross3.md +1 -1
- package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +1 -1
- package/dist/docs/reference/geometry/distance3.md +1 -1
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -6
- package/dist/docs/reference/geometry/dot2.md +1 -1
- package/dist/docs/reference/geometry/dot3.md +1 -1
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +1 -1
- package/dist/docs/reference/geometry/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 +1 -1
- 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 +2 -2
- 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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/length2.md +1 -1
- package/dist/docs/reference/geometry/length3.md +1 -1
- package/dist/docs/reference/geometry/lerp2.md +1 -1
- package/dist/docs/reference/geometry/lerp3.md +1 -1
- package/dist/docs/reference/geometry/linearPatternTransforms.md +2 -2
- 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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/normalize3.md +1 -1
- package/dist/docs/reference/geometry/normalizeContour.md +1 -1
- package/dist/docs/reference/geometry/normalizePolygon.md +1 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +1 -1
- package/dist/docs/reference/geometry/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 +6 -6
- 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 +1 -1
- package/dist/docs/reference/geometry/radialPatternTransforms.md +1 -17
- package/dist/docs/reference/geometry/rectangleContour.md +1 -1
- package/dist/docs/reference/geometry/rectangleProfile.md +1 -1
- package/dist/docs/reference/geometry/regionArea.md +1 -1
- package/dist/docs/reference/geometry/regionBounds.md +1 -1
- package/dist/docs/reference/geometry/regularPolygonContour.md +2 -2
- package/dist/docs/reference/geometry/resamplePolyline2.md +2 -2
- package/dist/docs/reference/geometry/resamplePolyline3.md +2 -2
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +3 -3
- 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 +1 -1
- package/dist/docs/reference/geometry/rotationTransform3.md +1 -1
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +6 -4
- 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 +2 -2
- 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 +3 -3
- 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 +1 -1
- package/dist/docs/reference/geometry/scale3.md +1 -1
- package/dist/docs/reference/geometry/scaleTransform3.md +1 -1
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +1 -1
- package/dist/docs/reference/geometry/strokeRegionData.md +63 -0
- package/dist/docs/reference/geometry/subtract2.md +1 -1
- package/dist/docs/reference/geometry/subtract3.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/transform3.md +1 -1
- package/dist/docs/reference/geometry/transformDeterminant3.md +1 -1
- package/dist/docs/reference/geometry/transformRegionData.md +1 -1
- package/dist/docs/reference/geometry/transformTriangleMesh.md +6 -6
- package/dist/docs/reference/geometry/translationTransform3.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +1 -1
- package/dist/docs/reference/geometry/vector3.md +1 -1
- package/dist/docs/reference/geometry.md +2 -2
- package/dist/docs/reference/model/Anchor3.md +1 -1
- package/dist/docs/reference/model/AttachOptions.md +10 -5
- package/dist/docs/reference/model/Bounds2.md +1 -1
- package/dist/docs/reference/model/Bounds3.md +1 -1
- 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 +8 -8
- 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 +1 -1
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +1 -1
- package/dist/docs/reference/model/GeneratedPart.md +1 -1
- 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 +9 -3
- package/dist/docs/reference/model/HeightfieldOptions.md +1 -1
- 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 +5 -5
- 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 +1 -1
- 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 +3 -3
- 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 +1 -1
- 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 +4 -3
- 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 +1 -1
- package/dist/docs/reference/model/Pivot2Options.md +1 -1
- package/dist/docs/reference/model/Pivot3Options.md +1 -1
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/PolygonData.md +1 -1
- package/dist/docs/reference/model/PolygonOptions.md +8 -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 +2 -2
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +1 -1
- 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 +1 -1
- 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 +8 -8
- package/dist/docs/reference/model/RegionData.md +1 -1
- 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 +12 -11
- package/dist/docs/reference/model/SectionHullOptions.md +5 -5
- package/dist/docs/reference/model/SectionInspection.md +7 -7
- package/dist/docs/reference/model/SectionOffsetJoin.md +1 -1
- package/dist/docs/reference/model/SectionOffsetOptions.md +1 -1
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +23 -6
- package/dist/docs/reference/model/SolidInspection.md +4 -4
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +3 -3
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/{StrokePathCap.md → StrokeCap.md} +3 -3
- package/dist/docs/reference/model/{StrokePathJoin.md → StrokeJoin.md} +3 -3
- package/dist/docs/reference/model/StrokeOptions.md +6 -6
- 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 +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/Transform2Input.md +1 -1
- package/dist/docs/reference/model/Transform2Matrix.md +1 -1
- package/dist/docs/reference/model/Transform3-type.md +1 -1
- package/dist/docs/reference/model/Transform3Input.md +1 -1
- package/dist/docs/reference/model/Transform3Matrix.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/Vector2Input.md +1 -1
- package/dist/docs/reference/model/Vector2Tuple.md +1 -1
- package/dist/docs/reference/model/Vector3-type.md +1 -1
- package/dist/docs/reference/model/Vector3Input.md +1 -1
- package/dist/docs/reference/model/Vector3Tuple.md +1 -1
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/anchor.md +1 -1
- package/dist/docs/reference/model/box.md +3 -3
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +1 -1
- package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -1
- package/dist/docs/reference/model/categories/contracts.md +2 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +1 -1
- package/dist/docs/reference/model/categories/explicit-profiles.md +2 -2
- 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 +4 -5
- 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 +2 -2
- package/dist/docs/reference/model/categories/resolution.md +2 -2
- package/dist/docs/reference/model/categories/sections.md +3 -4
- package/dist/docs/reference/model/categories/threads.md +5 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +8 -8
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +6 -6
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +1 -1
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +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 +1 -1
- package/dist/docs/reference/model/hull.md +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +3 -3
- 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 +8 -8
- 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 +1 -1
- package/dist/docs/reference/model/transform3.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/vector3.md +1 -1
- package/dist/docs/reference/model.md +3 -2
- package/dist/docs/reference/text/Bounds2.md +1 -1
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +1 -1
- 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 +3 -3
- 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/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 +5 -7
- package/dist/engine/operation-environment.js +2 -2
- package/dist/engine/pattern-operations.js +1 -1
- 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 +7 -7
- package/dist/engine/profile-mesh.js +7 -7
- package/dist/engine/recipe-realization.js +6 -0
- package/dist/engine/section-operations.js +33 -8
- package/dist/engine/session-snapshot.js +14 -4
- package/dist/engine/session.js +10 -5
- package/dist/engine/shape-anchors.js +3 -3
- package/dist/engine/transform-operations.js +24 -24
- 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 +9 -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 +1 -1
- package/dist/geometry/mechanical/gear-motion.js +3 -3
- 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.js +7 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +8 -19
- package/dist/geometry/paths/frames.js +41 -11
- 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/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 +34 -34
- package/dist/geometry/revolve/revolve-mesh.js +12 -7
- package/dist/geometry/stroke-path.js +12 -27
- 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 +10 -10
- package/dist/geometry/sweeps/sweep-closed.js +2 -2
- package/dist/geometry/sweeps/sweep-mesh.js +9 -3
- package/dist/geometry/sweeps/sweep-open.js +1 -1
- package/dist/geometry/sweeps/validation.js +4 -7
- package/dist/geometry/transform-geometry.js +7 -14
- package/dist/index.js +1 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +66 -6
- package/dist/model/operations.js +25 -26
- package/dist/model/recipe-declaration.js +13 -7
- package/dist/model/shape-handles.js +2 -1
- 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/ClosestPointOnPathOptions.md +0 -34
- package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +0 -65
- 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/StrokePathCap.md +0 -7
- package/dist/docs/reference/geometry/StrokePathJoin.md +0 -7
- package/dist/docs/reference/geometry/closestPointOnPath.md +0 -110
- 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/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/model/Path2.md +0 -20
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/geometry/paths/path.js +0 -32
package/dist/engine/execution.js
CHANGED
|
@@ -7,6 +7,7 @@ import { createModelingContext } from "./modeling-context.js";
|
|
|
7
7
|
import { ownScopedManifoldValue, scopedManifoldScope, trackScopedManifoldValue, } from "./native/context.js";
|
|
8
8
|
import { copiedFloat32Array, copiedUint32Array } from "./native/copied-views.js";
|
|
9
9
|
import * as kernel from "./native/index.js";
|
|
10
|
+
import { solidMaterialComponents } from "./native/material-components.js";
|
|
10
11
|
import { assertNativeSolidStatus } from "./native/status.js";
|
|
11
12
|
import { createShapeAnchorOwner } from "./shape-anchors.js";
|
|
12
13
|
/** Internal execution owner; no native value or constructor crosses the public facade. */
|
|
@@ -18,6 +19,8 @@ export function createExecutionContext(module, scope, limits, initialResolution
|
|
|
18
19
|
const canonicalSectionProfiles = new Map();
|
|
19
20
|
let solidInspections;
|
|
20
21
|
let sectionInspections;
|
|
22
|
+
let solidComponents;
|
|
23
|
+
let sectionComponents;
|
|
21
24
|
const primitiveSectionProfiles = new Map();
|
|
22
25
|
let active = true;
|
|
23
26
|
const throwGeometryError = (code, operation, message) => {
|
|
@@ -63,6 +66,30 @@ export function createExecutionContext(module, scope, limits, initialResolution
|
|
|
63
66
|
const owned = ownScopedManifoldValue(scope, value);
|
|
64
67
|
return wrapSection(owned);
|
|
65
68
|
};
|
|
69
|
+
const solidComponentsFor = (handle) => {
|
|
70
|
+
const native = nativeSolid(handle);
|
|
71
|
+
const cached = solidComponents?.get(native);
|
|
72
|
+
if (cached !== undefined)
|
|
73
|
+
return cached;
|
|
74
|
+
const components = solidMaterialComponents(scope, native, limits);
|
|
75
|
+
const cache = (solidComponents ??= new Map());
|
|
76
|
+
cache.set(native, components);
|
|
77
|
+
for (const component of components)
|
|
78
|
+
cache.set(component, Object.freeze([component]));
|
|
79
|
+
return components;
|
|
80
|
+
};
|
|
81
|
+
const sectionComponentsFor = (handle) => {
|
|
82
|
+
const native = nativeSection(handle);
|
|
83
|
+
const cached = sectionComponents?.get(native);
|
|
84
|
+
if (cached !== undefined)
|
|
85
|
+
return cached;
|
|
86
|
+
const components = Object.freeze(native.isEmpty() ? [] : native.decompose().map((part) => ownScopedManifoldValue(scope, part)));
|
|
87
|
+
const cache = (sectionComponents ??= new Map());
|
|
88
|
+
cache.set(native, components);
|
|
89
|
+
for (const component of components)
|
|
90
|
+
cache.set(component, Object.freeze([component]));
|
|
91
|
+
return components;
|
|
92
|
+
};
|
|
66
93
|
// Geometry is immutable for a native value. Validate build ownership before every cache hit,
|
|
67
94
|
// and retain only frozen plain facts so callers cannot corrupt later inspections.
|
|
68
95
|
const solidInspectionFor = (handle) => {
|
|
@@ -72,12 +99,12 @@ export function createExecutionContext(module, scope, limits, initialResolution
|
|
|
72
99
|
return cached;
|
|
73
100
|
assertNativeSolidStatus(native, "inspectSolid");
|
|
74
101
|
const bounds = native.boundingBox();
|
|
75
|
-
const
|
|
102
|
+
const components = solidComponentsFor(handle);
|
|
76
103
|
const facts = Object.freeze({
|
|
77
104
|
min: Object.freeze([...bounds.min]),
|
|
78
105
|
max: Object.freeze([...bounds.max]),
|
|
79
106
|
isEmpty: native.isEmpty(),
|
|
80
|
-
|
|
107
|
+
componentCount: components.length,
|
|
81
108
|
volume: native.volume(),
|
|
82
109
|
surfaceArea: native.surfaceArea(),
|
|
83
110
|
tolerance: native.tolerance(),
|
|
@@ -92,17 +119,15 @@ export function createExecutionContext(module, scope, limits, initialResolution
|
|
|
92
119
|
return cached;
|
|
93
120
|
const bounds = native.bounds();
|
|
94
121
|
const empty = native.isEmpty();
|
|
95
|
-
const
|
|
96
|
-
? []
|
|
97
|
-
: native.decompose().map((part) => ownScopedManifoldValue(scope, part));
|
|
122
|
+
const components = sectionComponentsFor(handle);
|
|
98
123
|
const facts = Object.freeze({
|
|
99
124
|
min: Object.freeze([...bounds.min]),
|
|
100
125
|
max: Object.freeze([...bounds.max]),
|
|
101
126
|
isEmpty: empty,
|
|
102
127
|
area: native.area(),
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
128
|
+
contourCount: native.numContour(),
|
|
129
|
+
componentCount: components.length,
|
|
130
|
+
vertexCount: native.numVert(),
|
|
106
131
|
});
|
|
107
132
|
(sectionInspections ??= new Map()).set(native, facts);
|
|
108
133
|
return facts;
|
|
@@ -244,6 +269,8 @@ export function createExecutionContext(module, scope, limits, initialResolution
|
|
|
244
269
|
analyzedMeshFor,
|
|
245
270
|
solidInspectionFor,
|
|
246
271
|
sectionInspectionFor,
|
|
272
|
+
solidComponentsFor,
|
|
273
|
+
sectionComponentsFor,
|
|
247
274
|
sectionProfileFor,
|
|
248
275
|
primitiveProfileFor,
|
|
249
276
|
rememberPrimitiveProfile,
|
|
@@ -305,8 +332,12 @@ export function createExecutionContext(module, scope, limits, initialResolution
|
|
|
305
332
|
canonicalSectionProfiles.clear();
|
|
306
333
|
solidInspections?.clear();
|
|
307
334
|
sectionInspections?.clear();
|
|
335
|
+
solidComponents?.clear();
|
|
336
|
+
sectionComponents?.clear();
|
|
308
337
|
solidInspections = undefined;
|
|
309
338
|
sectionInspections = undefined;
|
|
339
|
+
solidComponents = undefined;
|
|
340
|
+
sectionComponents = undefined;
|
|
310
341
|
primitiveSectionProfiles.clear();
|
|
311
342
|
shapeAnchors.dispose();
|
|
312
343
|
},
|
|
@@ -10,7 +10,7 @@ const fail = (message) => {
|
|
|
10
10
|
/** Finishes inward convex extrusion rims with exact parallel-edge offsets and retained correspondence. */
|
|
11
11
|
export function buildFinishedExtrusion(module, profile, options) {
|
|
12
12
|
const controls = resolveExtrusionControls(options.height, options, "extrude");
|
|
13
|
-
if (controls.
|
|
13
|
+
if (controls.twist !== 0 ||
|
|
14
14
|
controls.scales.some((scale) => scale !== 1) ||
|
|
15
15
|
options.divisions !== undefined)
|
|
16
16
|
fail("End treatments require a straight extrusion without twist, top scaling or divisions.");
|
package/dist/engine/index.js
CHANGED
|
@@ -97,8 +97,13 @@ function engineFromModule(module, engineLimits) {
|
|
|
97
97
|
*/
|
|
98
98
|
export async function createModelEngine(options = {}) {
|
|
99
99
|
const limits = resolveModelingLimits(options.limits);
|
|
100
|
+
const wasmUrl = options.wasmUrl === undefined ? modelingWasmUrl : options.wasmUrl;
|
|
101
|
+
if (typeof wasmUrl !== "string" || wasmUrl.trim().length === 0)
|
|
102
|
+
throw new GeometryError("INVALID_ARGUMENT", "wasmUrl must be a non-empty asset URL string.", {
|
|
103
|
+
operation: "createModelEngine",
|
|
104
|
+
});
|
|
100
105
|
const module = await createManifoldModule({
|
|
101
|
-
locateFile:
|
|
106
|
+
locateFile: () => wasmUrl,
|
|
102
107
|
});
|
|
103
108
|
module.setup();
|
|
104
109
|
return engineFromModule(module, limits);
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { vector3Data } from "../geometry/math/vector-value.js";
|
|
1
2
|
import { ownScopedManifoldValue } from "./native/context.js";
|
|
2
3
|
import { copiedMeshViews } from "./native/copied-views.js";
|
|
3
4
|
import { measureSolidDistance } from "./native/distance.js";
|
|
4
5
|
import { assertNativeSolidStatus } from "./native/status.js";
|
|
5
6
|
/** Internal host-bound inspection operations. */
|
|
6
7
|
export function createInspectionOperations(environment) {
|
|
7
|
-
const { scope, throwGeometryError, nativeSolid, resolveHandle, ownSolid, ownSection, validateFiniteNumber, requirePositiveNumber, validateCoordinates, analyzedMeshFor, solidInspectionFor, sectionInspectionFor, } = environment;
|
|
8
|
+
const { scope, throwGeometryError, nativeSolid, resolveHandle, ownSolid, ownSection, wrapSolid, wrapSection, validateFiniteNumber, requirePositiveNumber, validateCoordinates, analyzedMeshFor, solidInspectionFor, sectionInspectionFor, solidComponentsFor, sectionComponentsFor, } = environment;
|
|
8
9
|
const operations = {
|
|
9
10
|
toTriangleMesh: (value) => copiedMeshViews(analyzedMeshFor(value).mesh, new Map()),
|
|
10
11
|
inspectSection: sectionInspectionFor,
|
|
@@ -16,12 +17,14 @@ export function createInspectionOperations(environment) {
|
|
|
16
17
|
return native.value.isEmpty();
|
|
17
18
|
},
|
|
18
19
|
distance: (handle, other) => measureSolidDistance(nativeSolid(handle), nativeSolid(other)),
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
castSegment: (handle, inputOrigin, inputEndpoint) => {
|
|
21
|
+
const origin = vector3Data(inputOrigin);
|
|
22
|
+
const endpoint = vector3Data(inputEndpoint);
|
|
23
|
+
validateCoordinates(origin, 3, "castSegment");
|
|
24
|
+
validateCoordinates(endpoint, 3, "castSegment");
|
|
22
25
|
const segmentLength = Math.hypot(...origin.map((value, axis) => value - endpoint[axis]));
|
|
23
26
|
if (!Number.isFinite(segmentLength) || segmentLength === 0)
|
|
24
|
-
throwGeometryError("DEGENERATE_GEOMETRY", "
|
|
27
|
+
throwGeometryError("DEGENERATE_GEOMETRY", "castSegment", "Segment endpoints must differ.");
|
|
25
28
|
return Object.freeze(nativeSolid(handle)
|
|
26
29
|
.rayCast([...origin], [...endpoint])
|
|
27
30
|
.map((hit) => Object.freeze({
|
|
@@ -34,9 +37,8 @@ export function createInspectionOperations(environment) {
|
|
|
34
37
|
components: ((handle) => {
|
|
35
38
|
const native = resolveHandle(handle);
|
|
36
39
|
if (native.kind === "section")
|
|
37
|
-
return Object.freeze(
|
|
38
|
-
|
|
39
|
-
return Object.freeze(native.value.decompose().map(ownSolid));
|
|
40
|
+
return Object.freeze(sectionComponentsFor(handle).map(wrapSection));
|
|
41
|
+
return Object.freeze(solidComponentsFor(handle).map(wrapSolid));
|
|
40
42
|
}),
|
|
41
43
|
simplify: ((handle, tolerance) => {
|
|
42
44
|
const native = resolveHandle(handle);
|
|
@@ -46,9 +48,9 @@ export function createInspectionOperations(environment) {
|
|
|
46
48
|
const original = ownScopedManifoldValue(scope, native.value.asOriginal());
|
|
47
49
|
return ownSolid(original.simplify(distance));
|
|
48
50
|
}),
|
|
49
|
-
|
|
50
|
-
if (validateFiniteNumber(tolerance, "
|
|
51
|
-
throwGeometryError("INVALID_ARGUMENT", "
|
|
51
|
+
withTolerance: (handle, tolerance) => {
|
|
52
|
+
if (validateFiniteNumber(tolerance, "withTolerance") < 0)
|
|
53
|
+
throwGeometryError("INVALID_ARGUMENT", "withTolerance", "Tolerance must be nonnegative millimetres.");
|
|
52
54
|
return ownSolid(nativeSolid(handle).setTolerance(tolerance));
|
|
53
55
|
},
|
|
54
56
|
};
|
|
@@ -2,11 +2,13 @@ import { GeometryError } from "../geometry/errors.js";
|
|
|
2
2
|
import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../geometry/loft/loft-geometry.js";
|
|
3
3
|
import { loftFrame, resolveLoftControls } from "../geometry/loft/loft-options.js";
|
|
4
4
|
import { simpleLoftMesh } from "../geometry/loft/loft-simple-mesh.js";
|
|
5
|
-
import {
|
|
5
|
+
import { analyzeTriangleMesh } from "../geometry/mesh/mesh.js";
|
|
6
|
+
import { capturePath2Input, path2InputData, } from "../geometry/paths/path-value.js";
|
|
6
7
|
import { assertSamplingCount } from "../geometry/sampling-limits.js";
|
|
7
8
|
import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitive-profiles.js";
|
|
8
9
|
import { buildProfileLoftMesh } from "./profile-mesh.js";
|
|
9
10
|
const explicitProfile = (value) => typeof value === "object" && value !== null && "components" in value;
|
|
11
|
+
const pointProfile = (value) => Array.isArray(value) || (typeof value === "object" && value !== null && "toArray" in value);
|
|
10
12
|
const fail = (message) => {
|
|
11
13
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "loft" });
|
|
12
14
|
};
|
|
@@ -63,21 +65,40 @@ function primitivePolygon(profile) {
|
|
|
63
65
|
}
|
|
64
66
|
/** Private host adapter: known authored identity or explicitly requested geometric correspondence. */
|
|
65
67
|
export function createLoftOperation(environment, solidFromMesh) {
|
|
66
|
-
return (
|
|
68
|
+
return (inputStations, value = {}) => {
|
|
67
69
|
environment.assertActive();
|
|
68
|
-
if (!Array.isArray(
|
|
70
|
+
if (!Array.isArray(inputStations) || inputStations.length < 2)
|
|
69
71
|
fail("Loft requires at least two stations.");
|
|
70
|
-
assertSamplingCount(
|
|
71
|
-
|
|
72
|
-
resolveLoftControls(value, stations.length);
|
|
73
|
-
const rawPoints = stations.reduce((sum, station) => sum +
|
|
74
|
-
(explicitProfile(station.profile)
|
|
75
|
-
? loftProfilePointCount(station.profile)
|
|
76
|
-
: Array.isArray(station.profile)
|
|
77
|
-
? station.profile.length
|
|
78
|
-
: environment.nativeSection(station.profile).numVert()), 0);
|
|
79
|
-
assertSamplingCount(rawPoints, "loft", 1_000_000);
|
|
72
|
+
assertSamplingCount(inputStations.length, "loft", environment.limits.maxPathPoints);
|
|
73
|
+
inputStations.forEach((station) => loftFrame(station));
|
|
80
74
|
let selected = environment.withResolutionDefaults(value);
|
|
75
|
+
resolveLoftControls(value, inputStations.length);
|
|
76
|
+
const captured = inputStations.map(({ profile, ...placement }) => {
|
|
77
|
+
const source = pointProfile(profile) ? capturePath2Input(profile, true) : undefined;
|
|
78
|
+
return { placement, profile: source?.input ?? profile, count: source?.count };
|
|
79
|
+
});
|
|
80
|
+
let rawPoints = 0, fixedPoints = 0;
|
|
81
|
+
for (const { profile, count } of captured) {
|
|
82
|
+
const fixed = count === undefined
|
|
83
|
+
? explicitProfile(profile)
|
|
84
|
+
? loftProfilePointCount(profile)
|
|
85
|
+
: environment.nativeSection(profile).numVert()
|
|
86
|
+
: 0;
|
|
87
|
+
fixedPoints += fixed;
|
|
88
|
+
rawPoints += count ?? fixed;
|
|
89
|
+
assertSamplingCount(rawPoints, "loft", 1_000_000);
|
|
90
|
+
}
|
|
91
|
+
let remaining = 1_000_000 - fixedPoints;
|
|
92
|
+
const stations = captured.map(({ placement, profile, count }) => {
|
|
93
|
+
if (count === undefined)
|
|
94
|
+
return { ...placement, profile };
|
|
95
|
+
const points = path2InputData(profile, true, {
|
|
96
|
+
maxPathPoints: Math.max(1, Math.min(selected.limits.maxProfilePoints, remaining)),
|
|
97
|
+
}).points;
|
|
98
|
+
assertSamplingCount(points.length, "loft", remaining);
|
|
99
|
+
remaining -= points.length;
|
|
100
|
+
return { ...placement, profile: points };
|
|
101
|
+
});
|
|
81
102
|
const controls = resolveLoftControls(selected, stations.length);
|
|
82
103
|
const explicit = stations.some((station) => explicitProfile(station.profile));
|
|
83
104
|
let profiles, authoritative = false;
|
|
@@ -145,7 +166,7 @@ export function createLoftOperation(environment, solidFromMesh) {
|
|
|
145
166
|
station.profile.components[0].holes.length === 0))
|
|
146
167
|
return solidFromMesh(simpleLoftMesh(geometry, selected.limits));
|
|
147
168
|
const mesh = buildProfileLoftMesh(environment.module, geometry.stations, selected.limits, false, 0, (station, contour, slot) => geometry.world[station][contour][slot]);
|
|
148
|
-
if (
|
|
169
|
+
if (analyzeTriangleMesh(mesh).signedVolume < 0)
|
|
149
170
|
for (let index = 0; index < mesh.indices.length; index += 3) {
|
|
150
171
|
const b = mesh.indices[index + 1];
|
|
151
172
|
mesh.indices[index + 1] = mesh.indices[index + 2];
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { GeometryError } from "../geometry/errors.js";
|
|
2
2
|
/** Counts manufacturing instances while charging shared backing storage only once. */
|
|
3
3
|
export function createModelSummary(limits) {
|
|
4
|
-
let vertices = 0, triangles = 0, bytes = 0, volumeMm3 = 0;
|
|
4
|
+
let vertices = 0, triangles = 0, bytes = 0, partCount = 0, volumeMm3 = 0;
|
|
5
5
|
const storage = new Set();
|
|
6
6
|
const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];
|
|
7
7
|
return {
|
|
8
8
|
add(geometry) {
|
|
9
|
+
partCount++;
|
|
9
10
|
const measurements = geometry.measurements;
|
|
10
11
|
vertices += measurements.vertexCount;
|
|
11
12
|
triangles += measurements.triangleCount;
|
|
@@ -15,7 +16,8 @@ export function createModelSummary(limits) {
|
|
|
15
16
|
storage.add(buffer);
|
|
16
17
|
bytes += buffer.byteLength;
|
|
17
18
|
}
|
|
18
|
-
if (
|
|
19
|
+
if (partCount > limits.maxParts ||
|
|
20
|
+
vertices > limits.maxVertices ||
|
|
19
21
|
triangles > limits.maxTriangles ||
|
|
20
22
|
bytes > limits.maxBytes)
|
|
21
23
|
throw new GeometryError("COMPLEXITY_LIMIT", "Aggregate output exceeds the execution limits.", { operation: "generate" });
|
|
@@ -29,9 +31,10 @@ export function createModelSummary(limits) {
|
|
|
29
31
|
return {
|
|
30
32
|
bounds: Object.freeze({ min: Object.freeze(min), max: Object.freeze(max) }),
|
|
31
33
|
stats: Object.freeze({
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
partCount,
|
|
35
|
+
vertexCount: vertices,
|
|
36
|
+
triangleCount: triangles,
|
|
37
|
+
byteCount: bytes,
|
|
35
38
|
volumeMm3,
|
|
36
39
|
buildMs: builtAt - startedAt,
|
|
37
40
|
finalizationMs: endedAt - builtAt,
|
|
@@ -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. */
|