@metamesh/modeling 0.15.0 → 0.17.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 +59 -0
- package/README.md +54 -6
- package/dist/api/engine.d.ts +4 -3
- package/dist/api/geometry.d.ts +608 -266
- package/dist/api/index.d.ts +516 -110
- package/dist/api/text.d.ts +6 -6
- package/dist/docs/guides/concepts.md +298 -106
- package/dist/docs/guides/fonts.md +9 -8
- package/dist/docs/guides/fundamentals.md +17 -21
- package/dist/docs/guides/generation.md +24 -23
- package/dist/docs/guides/hosting.md +25 -20
- package/dist/docs/guides/recipes.md +68 -36
- package/dist/docs/guides/standalone-model.md +42 -0
- package/dist/docs/manifest.json +1034 -296
- 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 +1 -1
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +2 -2
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +7 -4
- package/dist/docs/reference/engine/categories/host-lifecycle.md +8 -3
- package/dist/docs/reference/engine/createModelEngine.md +1 -1
- 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 +6 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +1 -1
- package/dist/docs/reference/geometry/Anchor3-type.md +6 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +7 -3
- package/dist/docs/reference/geometry/ArcCurve3.md +9 -5
- package/dist/docs/reference/geometry/AttachOptions.md +2 -1
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +2 -1
- package/dist/docs/reference/geometry/Bounds2-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds2Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds2Input.md +21 -0
- package/dist/docs/reference/geometry/Bounds2Options.md +72 -0
- package/dist/docs/reference/geometry/Bounds3-type.md +127 -0
- package/dist/docs/reference/geometry/Bounds3Data.md +45 -0
- package/dist/docs/reference/geometry/Bounds3Input.md +21 -0
- package/dist/docs/reference/geometry/Bounds3Options.md +72 -0
- package/dist/docs/reference/geometry/BoundsFit2.md +6 -5
- package/dist/docs/reference/geometry/BoundsFit3.md +6 -5
- package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +5 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +3 -3
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +8 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +5 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularSampling.md +41 -0
- package/dist/docs/reference/geometry/CircularSamplingOptions.md +14 -0
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +6 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -1
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +6 -1
- package/dist/docs/reference/geometry/Contour.md +10 -4
- package/dist/docs/reference/geometry/ContourCurve.md +5 -1
- package/dist/docs/reference/geometry/ContourPoint.md +6 -1
- package/dist/docs/reference/geometry/ContourSegment.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +5 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +5 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +10 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +10 -6
- package/dist/docs/reference/geometry/Curve2.md +5 -1
- package/dist/docs/reference/geometry/Curve3.md +5 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +5 -1
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +7 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +2 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +4 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +6 -1
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +6 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +5 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +6 -1
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +7 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +5 -1
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +5 -1
- package/dist/docs/reference/geometry/FittedTextLayout.md +7 -3
- package/dist/docs/reference/geometry/Frame3.md +10 -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 +1 -1
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +4 -4
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +5 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +9 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +9 -4
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +5 -1
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +5 -1
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +7 -2
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +4 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +5 -1
- package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +82 -0
- package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +148 -0
- package/dist/docs/reference/geometry/KnuckleHingeInterval.md +46 -0
- package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +51 -0
- package/dist/docs/reference/geometry/KnuckleHingeSpec.md +22 -0
- package/dist/docs/reference/geometry/LineCurve2.md +8 -4
- package/dist/docs/reference/geometry/LineCurve3.md +8 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +5 -1
- package/dist/docs/reference/geometry/LoftOptions.md +5 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +5 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +5 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +5 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +9 -2
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +6 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +6 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +5 -1
- package/dist/docs/reference/geometry/Path2-type.md +12 -8
- package/dist/docs/reference/geometry/Path2Data.md +40 -4
- package/dist/docs/reference/geometry/Path2Input.md +8 -3
- package/dist/docs/reference/geometry/Path3-type.md +12 -8
- package/dist/docs/reference/geometry/Path3Data.md +40 -4
- package/dist/docs/reference/geometry/Path3Input.md +8 -3
- package/dist/docs/reference/geometry/PathFrame.md +9 -5
- package/dist/docs/reference/geometry/PathLocation.md +5 -1
- package/dist/docs/reference/geometry/PathNormalGuide.md +8 -4
- package/dist/docs/reference/geometry/PathOptions.md +5 -1
- package/dist/docs/reference/geometry/PathPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/PathPlacement.md +8 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +5 -1
- package/dist/docs/reference/geometry/Pivot2Options.md +2 -1
- package/dist/docs/reference/geometry/Pivot3Options.md +2 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +8 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +5 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +5 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +7 -3
- package/dist/docs/reference/geometry/PolygonData.md +7 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +5 -1
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +1 -1
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFit.md +8 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +6 -1
- package/dist/docs/reference/geometry/Profile.md +8 -2
- package/dist/docs/reference/geometry/ProfileComponent2.md +5 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +8 -2
- package/dist/docs/reference/geometry/ProfileSpan2.md +7 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +6 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +6 -1
- package/dist/docs/reference/geometry/RadialPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +7 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +5 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +5 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +7 -3
- package/dist/docs/reference/geometry/RegionData.md +6 -2
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +5 -1
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +5 -1
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +5 -1
- package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +5 -1
- package/dist/docs/reference/geometry/SampledCurve2.md +8 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +8 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +7 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +5 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +6 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +5 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +5 -1
- package/dist/docs/reference/geometry/SphereOptions.md +1 -1
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/StrokeCap.md +8 -1
- package/dist/docs/reference/geometry/StrokeJoin.md +8 -1
- package/dist/docs/reference/geometry/StrokeOptions.md +5 -1
- package/dist/docs/reference/geometry/SvgImportOptions.md +20 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +21 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +7 -3
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +6 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +6 -1
- package/dist/docs/reference/geometry/SweepOptions.md +5 -1
- package/dist/docs/reference/geometry/SweepOrientation.md +5 -1
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +8 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +8 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
- package/dist/docs/reference/geometry/ThreadProfile-type.md +7 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/ThreadRole.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +8 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +7 -3
- package/dist/docs/reference/geometry/ThreadedNutShape.md +8 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +5 -1
- package/dist/docs/reference/geometry/TorusOptions.md +1 -1
- package/dist/docs/reference/geometry/Transform2-type.md +6 -5
- package/dist/docs/reference/geometry/Transform2Data.md +15 -0
- package/dist/docs/reference/geometry/Transform2Input.md +4 -3
- package/dist/docs/reference/geometry/Transform3-type.md +6 -5
- package/dist/docs/reference/geometry/Transform3Data.md +18 -0
- package/dist/docs/reference/geometry/Transform3Input.md +4 -3
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +7 -3
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +5 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/TubeOptions.md +1 -1
- package/dist/docs/reference/geometry/Vector2-type.md +6 -5
- package/dist/docs/reference/geometry/Vector2Data.md +15 -0
- package/dist/docs/reference/geometry/Vector2Input.md +4 -3
- package/dist/docs/reference/geometry/Vector3-type.md +6 -5
- package/dist/docs/reference/geometry/Vector3Data.md +15 -0
- package/dist/docs/reference/geometry/Vector3Input.md +4 -3
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +6 -1
- package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +7 -3
- package/dist/docs/reference/geometry/VectorTextMetrics.md +7 -3
- package/dist/docs/reference/geometry/VectorTextOptions.md +5 -1
- package/dist/docs/reference/geometry/add2.md +7 -6
- package/dist/docs/reference/geometry/add3.md +7 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +5 -1
- package/dist/docs/reference/geometry/anchor3.md +2 -1
- package/dist/docs/reference/geometry/anchorFrame3.md +5 -1
- package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
- package/dist/docs/reference/geometry/attachmentTransform3.md +5 -4
- package/dist/docs/reference/geometry/bounds2.md +39 -0
- package/dist/docs/reference/geometry/bounds3.md +39 -0
- package/dist/docs/reference/geometry/boundsCenter.md +12 -11
- package/dist/docs/reference/geometry/boundsSize.md +12 -11
- package/dist/docs/reference/geometry/boxAnchor3.md +4 -3
- package/dist/docs/reference/geometry/categories/bounds-layout.md +25 -9
- package/dist/docs/reference/geometry/categories/curves-paths.md +21 -9
- package/dist/docs/reference/geometry/categories/mechanical.md +22 -10
- package/dist/docs/reference/geometry/categories/meshes.md +16 -7
- package/dist/docs/reference/geometry/categories/pattern-placement.md +6 -4
- package/dist/docs/reference/geometry/categories/primitive-options.md +8 -2
- package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -12
- package/dist/docs/reference/geometry/categories/resolution-errors.md +8 -3
- package/dist/docs/reference/geometry/categories/transforms-math.md +21 -12
- package/dist/docs/reference/geometry/categories/vector-import.md +11 -5
- package/dist/docs/reference/geometry/circleContour.md +5 -1
- package/dist/docs/reference/geometry/closeToAxis.md +14 -5
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +5 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +5 -1
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +5 -1
- package/dist/docs/reference/geometry/composeTransform3.md +7 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +5 -1
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +11 -2
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
- package/dist/docs/reference/geometry/computeTriangleMeshSignature.md +5 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +8 -4
- package/dist/docs/reference/geometry/cross2.md +6 -5
- package/dist/docs/reference/geometry/cross3.md +7 -6
- package/dist/docs/reference/geometry/cylinderAnchor3.md +3 -2
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/distance2.md +6 -5
- package/dist/docs/reference/geometry/distance3.md +6 -5
- package/dist/docs/reference/geometry/distributeAlongPath.md +5 -1
- package/dist/docs/reference/geometry/dot2.md +6 -5
- package/dist/docs/reference/geometry/dot3.md +6 -5
- package/dist/docs/reference/geometry/ellipseContour.md +5 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +7 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +5 -1
- package/dist/docs/reference/geometry/fitBounds.md +10 -9
- package/dist/docs/reference/geometry/fitTextLayout.md +13 -5
- package/dist/docs/reference/geometry/frameTransform3.md +5 -4
- package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +5 -1
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +4 -4
- package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
- package/dist/docs/reference/geometry/helicalThreadRidgeMesh.md +5 -1
- package/dist/docs/reference/geometry/helicalThreadSolidMesh.md +5 -1
- package/dist/docs/reference/geometry/inverseTransform3.md +6 -5
- package/dist/docs/reference/geometry/isGeometryError.md +5 -2
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +5 -1
- package/dist/docs/reference/geometry/layoutRow.md +11 -7
- package/dist/docs/reference/geometry/length2.md +5 -4
- package/dist/docs/reference/geometry/length3.md +5 -4
- package/dist/docs/reference/geometry/lerp2.md +7 -6
- package/dist/docs/reference/geometry/lerp3.md +7 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +4 -4
- package/dist/docs/reference/geometry/loftMesh.md +5 -1
- package/dist/docs/reference/geometry/matchProfiles.md +11 -2
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +5 -1
- package/dist/docs/reference/geometry/meshBounds.md +8 -4
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +5 -1
- package/dist/docs/reference/geometry/normalize2.md +10 -6
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +8 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -1
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -1
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +5 -1
- package/dist/docs/reference/geometry/path2.md +14 -2
- package/dist/docs/reference/geometry/path3.md +8 -1
- package/dist/docs/reference/geometry/pathPatternTransforms.md +9 -5
- package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +11 -2
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +13 -2
- package/dist/docs/reference/geometry/preflightSvgRegion.md +24 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +12 -2
- package/dist/docs/reference/geometry/preflightThreadedRod.md +12 -2
- package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -4
- package/dist/docs/reference/geometry/rectangleContour.md +10 -3
- package/dist/docs/reference/geometry/rectangleProfile.md +10 -2
- package/dist/docs/reference/geometry/regionArea.md +5 -1
- package/dist/docs/reference/geometry/regionBounds.md +8 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +8 -4
- package/dist/docs/reference/geometry/resamplePolyline2.md +8 -4
- package/dist/docs/reference/geometry/resamplePolyline3.md +8 -4
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveArcSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveCircularSampling.md +40 -0
- package/dist/docs/reference/geometry/resolveCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +5 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +5 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +5 -1
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolveKnuckleHinge.md +59 -0
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +5 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +5 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +5 -1
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/revolveMesh.md +5 -1
- package/dist/docs/reference/geometry/rotate2.md +6 -5
- package/dist/docs/reference/geometry/rotationTransform3.md +7 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -4
- package/dist/docs/reference/geometry/sampleContour.md +12 -2
- package/dist/docs/reference/geometry/sampleCurve2.md +6 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +5 -1
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleHelix.md +13 -5
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +5 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -4
- package/dist/docs/reference/geometry/sampleSideProfile.md +15 -5
- package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +5 -1
- package/dist/docs/reference/geometry/scale2.md +6 -5
- package/dist/docs/reference/geometry/scale3.md +6 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +7 -6
- package/dist/docs/reference/geometry/signedContourArea.md +5 -1
- package/dist/docs/reference/geometry/starContour.md +8 -4
- package/dist/docs/reference/geometry/strokeRegionData.md +5 -1
- package/dist/docs/reference/geometry/subtract2.md +7 -6
- package/dist/docs/reference/geometry/subtract3.md +7 -6
- package/dist/docs/reference/geometry/sweepMesh.md +5 -1
- package/dist/docs/reference/geometry/threadProfile.md +5 -1
- package/dist/docs/reference/geometry/transform2.md +14 -7
- package/dist/docs/reference/geometry/transform3.md +16 -7
- package/dist/docs/reference/geometry/transformDeterminant3.md +5 -4
- package/dist/docs/reference/geometry/transformRegionData.md +5 -1
- package/dist/docs/reference/geometry/transformTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/translationTransform3.md +7 -6
- package/dist/docs/reference/geometry/triangulateContour.md +5 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +9 -2
- package/dist/docs/reference/geometry/validateTransform3.md +6 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/vector2.md +10 -2
- package/dist/docs/reference/geometry/vector3.md +10 -2
- package/dist/docs/reference/geometry.md +7 -5
- package/dist/docs/reference/model/Anchor3.md +6 -5
- package/dist/docs/reference/model/AttachOptions.md +2 -1
- package/dist/docs/reference/model/Bounds2-type.md +125 -0
- package/dist/docs/reference/model/Bounds2Data.md +44 -0
- package/dist/docs/reference/model/Bounds2Input.md +19 -0
- package/dist/docs/reference/model/Bounds2Options.md +70 -0
- package/dist/docs/reference/model/Bounds3-type.md +125 -0
- package/dist/docs/reference/model/Bounds3Data.md +44 -0
- package/dist/docs/reference/model/Bounds3Input.md +19 -0
- package/dist/docs/reference/model/Bounds3Options.md +70 -0
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +3 -3
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +1 -1
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +6 -1
- package/dist/docs/reference/model/ComputedValue.md +5 -1
- package/dist/docs/reference/model/Contour.md +6 -4
- 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 +1 -1
- package/dist/docs/reference/model/DiagnosticOptions.md +6 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +1 -1
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +1 -1
- package/dist/docs/reference/model/FinalizedModel.md +3 -3
- 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 +5 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -1
- package/dist/docs/reference/model/GeneratedPart.md +5 -1
- package/dist/docs/reference/model/GenerationDiagnostic.md +6 -1
- package/dist/docs/reference/model/GenerationError.md +5 -1
- package/dist/docs/reference/model/GeometryResolution.md +1 -1
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +5 -4
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +2 -1
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
- package/dist/docs/reference/model/HoleCutterOptions.md +77 -0
- package/dist/docs/reference/model/HoleCutterOverrun.md +35 -0
- package/dist/docs/reference/model/HoleCutterRecess.md +87 -0
- package/dist/docs/reference/model/HullOptions.md +1 -1
- package/dist/docs/reference/model/ImmutableBuffer-type.md +5 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +5 -1
- package/dist/docs/reference/model/ImplicitOptions.md +6 -6
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +2 -1
- package/dist/docs/reference/model/KnuckleHinge-type.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +77 -0
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +38 -0
- package/dist/docs/reference/model/KnuckleHingeOptions.md +38 -0
- package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +47 -0
- package/dist/docs/reference/model/KnuckleHingeSpec.md +18 -0
- package/dist/docs/reference/model/KnuckleHingeWeb.md +53 -0
- package/dist/docs/reference/model/LinearPatternOptions.md +2 -1
- 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 +1 -1
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +5 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +8 -1
- package/dist/docs/reference/model/PartGeometry.md +5 -1
- package/dist/docs/reference/model/PartOptions.md +5 -1
- package/dist/docs/reference/model/Path2-type.md +12 -8
- package/dist/docs/reference/model/Path2Data.md +40 -4
- package/dist/docs/reference/model/Path2Input.md +8 -3
- package/dist/docs/reference/model/Path3-type.md +12 -8
- package/dist/docs/reference/model/Path3Data.md +40 -4
- package/dist/docs/reference/model/Path3Input.md +8 -3
- package/dist/docs/reference/model/PathLocation.md +5 -1
- package/dist/docs/reference/model/PathNormalGuide.md +4 -4
- package/dist/docs/reference/model/PathOptions.md +5 -1
- package/dist/docs/reference/model/PathPatternOptions.md +2 -1
- package/dist/docs/reference/model/PathResamplingOptions.md +5 -1
- package/dist/docs/reference/model/PatternSource.md +2 -1
- package/dist/docs/reference/model/Pivot2Options.md +2 -1
- package/dist/docs/reference/model/Pivot3Options.md +2 -1
- package/dist/docs/reference/model/PlaneOptions.md +1 -1
- package/dist/docs/reference/model/PolygonData.md +3 -2
- package/dist/docs/reference/model/PolygonOptions.md +1 -1
- package/dist/docs/reference/model/PrimitiveAttachment.md +2 -1
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +2 -1
- package/dist/docs/reference/model/PrintableThreadFit.md +2 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +2 -1
- package/dist/docs/reference/model/Profile.md +4 -2
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +4 -2
- 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 +2 -1
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +3 -3
- package/dist/docs/reference/model/RegionData.md +2 -2
- package/dist/docs/reference/model/RegularPolygonOptions.md +1 -1
- package/dist/docs/reference/model/RevolveOptions.md +1 -1
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +9 -2
- package/dist/docs/reference/model/SectionHullOptions.md +1 -1
- package/dist/docs/reference/model/SectionInspection.md +4 -4
- 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 +9 -2
- package/dist/docs/reference/model/SolidInspection.md +4 -4
- package/dist/docs/reference/model/SolidSegmentHit.md +4 -4
- package/dist/docs/reference/model/SphereOptions.md +1 -1
- package/dist/docs/reference/model/StarOptions.md +1 -1
- package/dist/docs/reference/model/StrokeCap.md +1 -1
- package/dist/docs/reference/model/StrokeJoin.md +1 -1
- package/dist/docs/reference/model/StrokeOptions.md +1 -1
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +14 -1
- package/dist/docs/reference/model/SweepOptions.md +1 -1
- package/dist/docs/reference/model/SweepOrientation.md +1 -1
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +2 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +2 -1
- package/dist/docs/reference/model/ThreadHandedness.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +2 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +2 -1
- package/dist/docs/reference/model/ThreadProfile.md +4 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +2 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +2 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +2 -1
- package/dist/docs/reference/model/ThreadedNutPreflight.md +4 -3
- package/dist/docs/reference/model/ThreadedNutShape.md +2 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +2 -1
- package/dist/docs/reference/model/TorusOptions.md +1 -1
- package/dist/docs/reference/model/Transform2-type.md +6 -5
- package/dist/docs/reference/model/Transform2Data.md +16 -0
- package/dist/docs/reference/model/Transform2Input.md +4 -3
- package/dist/docs/reference/model/Transform3-type.md +6 -5
- package/dist/docs/reference/model/Transform3Data.md +19 -0
- package/dist/docs/reference/model/Transform3Input.md +4 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +3 -3
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
- package/dist/docs/reference/model/TubeOptions.md +1 -1
- package/dist/docs/reference/model/Vector2-type.md +6 -5
- package/dist/docs/reference/model/{Vector2Tuple.md → Vector2Data.md} +3 -3
- package/dist/docs/reference/model/Vector2Input.md +4 -3
- package/dist/docs/reference/model/Vector3-type.md +6 -5
- package/dist/docs/reference/model/{Vector3Tuple.md → Vector3Data.md} +3 -3
- package/dist/docs/reference/model/Vector3Input.md +4 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +3 -3
- package/dist/docs/reference/model/anchor.md +2 -1
- package/dist/docs/reference/model/bounds2.md +37 -0
- package/dist/docs/reference/model/bounds3.md +37 -0
- package/dist/docs/reference/model/box.md +2 -2
- package/dist/docs/reference/model/castSegment.md +1 -1
- package/dist/docs/reference/model/categories/boolean-operations.md +10 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +5 -3
- package/dist/docs/reference/model/categories/bounds.md +38 -0
- package/dist/docs/reference/model/categories/contracts.md +4 -2
- package/dist/docs/reference/model/categories/core-values-errors.md +11 -11
- package/dist/docs/reference/model/categories/explicit-profiles.md +6 -4
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +12 -3
- package/dist/docs/reference/model/categories/generation.md +11 -2
- package/dist/docs/reference/model/categories/hinges.md +38 -0
- package/dist/docs/reference/model/categories/inspection.md +9 -2
- package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
- package/dist/docs/reference/model/categories/paths.md +15 -7
- package/dist/docs/reference/model/categories/primitives.md +14 -4
- package/dist/docs/reference/model/categories/resolution.md +4 -2
- package/dist/docs/reference/model/categories/sections.md +10 -5
- package/dist/docs/reference/model/categories/threads.md +10 -7
- package/dist/docs/reference/model/categories/transforms-placement.md +17 -9
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/generate.md +5 -1
- package/dist/docs/reference/model/gridPattern.md +2 -1
- package/dist/docs/reference/model/heightfield.md +5 -2
- package/dist/docs/reference/model/holeCutter.md +45 -0
- package/dist/docs/reference/model/hull.md +1 -1
- package/dist/docs/reference/model/immutableBuffer.md +5 -1
- package/dist/docs/reference/model/immutableMesh.md +5 -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 +2 -1
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +1 -1
- package/dist/docs/reference/model/knuckleHinge.md +47 -0
- package/dist/docs/reference/model/linearPattern.md +2 -1
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +1 -1
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/path2.md +14 -2
- package/dist/docs/reference/model/path3.md +8 -1
- package/dist/docs/reference/model/pathPattern.md +2 -1
- package/dist/docs/reference/model/polygon.md +5 -2
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +8 -2
- package/dist/docs/reference/model/preflightThreadedNut.md +8 -2
- package/dist/docs/reference/model/preflightThreadedRod.md +8 -2
- package/dist/docs/reference/model/radialPattern.md +2 -1
- package/dist/docs/reference/model/rectangle.md +5 -2
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +1 -1
- 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 +1 -1
- package/dist/docs/reference/model/stroke.md +1 -1
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +5 -1
- package/dist/docs/reference/model/sweep.md +1 -1
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +2 -1
- package/dist/docs/reference/model/threadedNut.md +2 -1
- package/dist/docs/reference/model/threadedRod.md +2 -1
- package/dist/docs/reference/model/torus.md +1 -1
- package/dist/docs/reference/model/transform2.md +14 -7
- package/dist/docs/reference/model/transform3.md +16 -7
- package/dist/docs/reference/model/tube.md +1 -1
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +10 -2
- package/dist/docs/reference/model/vector3.md +10 -2
- package/dist/docs/reference/model.md +15 -8
- package/dist/docs/reference/text/Bounds2Data.md +34 -0
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Data.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +7 -7
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +1 -1
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +3 -3
- package/dist/docs/reference/text/VectorTextMetrics.md +3 -3
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +6 -4
- package/dist/docs/reference/text/prepareVectorFont.md +1 -1
- package/dist/docs/reference/text.md +4 -2
- package/dist/engine/construction-operations.js +1 -1
- package/dist/engine/extrusion-finishing.js +2 -29
- package/dist/engine/hole-cutter-operation.js +148 -0
- package/dist/engine/knuckle-hinge-operation.js +128 -0
- package/dist/engine/loft-operations.js +1 -1
- package/dist/engine/mechanical-operations.js +3 -1
- package/dist/engine/modeling-context.js +20 -1
- package/dist/engine/primitive-operations.js +19 -6
- package/dist/engine/recipe-realization.js +4 -2
- package/dist/engine/section-operations.js +2 -2
- package/dist/engine/transform-operations.js +3 -3
- package/dist/geometry/bounds-value.js +121 -0
- package/dist/geometry/bounds.js +10 -25
- package/dist/geometry/circular-sampling.js +45 -0
- package/dist/geometry/convex-offset.js +41 -0
- package/dist/geometry/curves/sampling.js +1 -2
- package/dist/geometry/errors.js +1 -0
- package/dist/geometry/heightfield.js +12 -1
- package/dist/geometry/index.js +5 -2
- package/dist/geometry/math/immutable-value.js +1 -1
- package/dist/geometry/math/vector-value.js +11 -3
- package/dist/geometry/math/vector2.js +1 -0
- package/dist/geometry/math/vector3.js +1 -0
- package/dist/geometry/mechanical/index.js +1 -0
- package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
- package/dist/geometry/mechanical/thread-mesh-plan.js +7 -2
- package/dist/geometry/mechanical/thread-solids.js +29 -4
- package/dist/geometry/mesh/mesh-centroid.js +1 -0
- package/dist/geometry/mesh/mesh-solid.js +1 -0
- package/dist/geometry/paths/frames.js +1 -0
- package/dist/geometry/paths/helix.js +1 -0
- package/dist/geometry/paths/path-value.js +43 -27
- package/dist/geometry/paths/resampling.js +2 -2
- package/dist/geometry/patterns/placements.js +3 -3
- package/dist/geometry/patterns.js +3 -1
- package/dist/geometry/profiles/contour.js +1 -0
- package/dist/geometry/profiles/matched.js +1 -0
- package/dist/geometry/profiles/profiles.js +3 -23
- package/dist/geometry/profiles/rectangle.js +10 -1
- package/dist/geometry/profiles/side-profile.js +2 -0
- package/dist/geometry/svg/matrix.js +21 -0
- package/dist/geometry/svg-import.js +140 -52
- package/dist/geometry/sweeps/options.js +1 -1
- package/dist/geometry/text-fitting.js +1 -0
- package/dist/geometry/transform-matrix.js +1 -1
- package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
- package/dist/index.js +2 -1
- package/dist/model/execution-binding.js +1 -1
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/hole-cutter.js +1 -0
- package/dist/model/immutable-generation-data.js +4 -12
- package/dist/model/knuckle-hinge.js +1 -0
- package/dist/model/operations.js +78 -3
- package/dist/model/recipe-declaration.js +11 -2
- package/package.json +1 -1
- package/dist/docs/reference/geometry/Bounds2.md +0 -39
- package/dist/docs/reference/geometry/Bounds3.md +0 -39
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +0 -23
- package/dist/docs/reference/geometry/Transform2Matrix.md +0 -14
- package/dist/docs/reference/geometry/Transform3Matrix.md +0 -17
- package/dist/docs/reference/geometry/Vector2Tuple.md +0 -14
- package/dist/docs/reference/geometry/Vector3Tuple.md +0 -14
- package/dist/docs/reference/geometry/boundsFromSize.md +0 -83
- package/dist/docs/reference/geometry/containsBounds.md +0 -72
- package/dist/docs/reference/model/Bounds2.md +0 -39
- package/dist/docs/reference/model/Bounds3.md +0 -39
- package/dist/docs/reference/model/Transform2Matrix.md +0 -15
- package/dist/docs/reference/model/Transform3Matrix.md +0 -18
- package/dist/docs/reference/text/Bounds2.md +0 -34
- package/dist/docs/reference/text/Vector2Tuple.md +0 -7
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { GeometryError } from "../geometry/errors.js";
|
|
2
|
+
import { resolveKnuckleHinge } from "../geometry/mechanical/knuckle-hinge.js";
|
|
3
|
+
import { assertPrimitiveOptions } from "../geometry/primitive-resolvers.js";
|
|
4
|
+
import { assertSamplingCount } from "../geometry/sampling-limits.js";
|
|
5
|
+
/** Composes existing scoped operations after resolving both halves against one host policy. */
|
|
6
|
+
export function createKnuckleHingeOperation(environment, operations) {
|
|
7
|
+
return (options) => {
|
|
8
|
+
environment.assertActive();
|
|
9
|
+
assertPrimitiveOptions(options, "knuckleHinge");
|
|
10
|
+
const resolved = environment.withResolutionDefaults(options);
|
|
11
|
+
const d = resolveKnuckleHinge(options, resolved);
|
|
12
|
+
assertSamplingCount(d.segments * d.spec.knuckleCount * 2, "knuckleHinge", resolved.limits.maxVertices);
|
|
13
|
+
const invalid = (message) => {
|
|
14
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "knuckleHinge" });
|
|
15
|
+
};
|
|
16
|
+
const validateHalf = (half = {}) => {
|
|
17
|
+
assertPrimitiveOptions(half, "knuckleHinge");
|
|
18
|
+
const chamfer = half.chamfer ?? 0;
|
|
19
|
+
if (!Number.isFinite(chamfer) ||
|
|
20
|
+
chamfer < 0 ||
|
|
21
|
+
2 * chamfer >= d.knuckleLength ||
|
|
22
|
+
chamfer >= d.minimumBarrelWall)
|
|
23
|
+
invalid("chamfer must be nonnegative and leave a positive axial band and faceted barrel wall.");
|
|
24
|
+
const web = half.web;
|
|
25
|
+
if (web !== undefined) {
|
|
26
|
+
assertPrimitiveOptions(web, "knuckleHinge");
|
|
27
|
+
if (web.direction !== "positive-y" && web.direction !== "negative-y")
|
|
28
|
+
invalid("Unknown web direction.");
|
|
29
|
+
if (!Number.isFinite(web.reach) ||
|
|
30
|
+
web.reach <= 0 ||
|
|
31
|
+
!Number.isFinite(web.thickness) ||
|
|
32
|
+
web.thickness <= 0 ||
|
|
33
|
+
!Number.isFinite(web.zMin) ||
|
|
34
|
+
!Number.isFinite(web.zMin + web.thickness))
|
|
35
|
+
invalid("Web dimensions must be finite, with positive reach and thickness.");
|
|
36
|
+
if (2 * chamfer >= web.thickness ||
|
|
37
|
+
2 * Math.SQRT2 * chamfer >= Math.min(d.knuckleLength, web.reach))
|
|
38
|
+
invalid("chamfer must leave a positive web band and noncollapsed end contours.");
|
|
39
|
+
const innerRadius = d.barrelRadius * Math.cos(Math.PI / d.segments);
|
|
40
|
+
if (web.zMin >= innerRadius || web.zMin + web.thickness <= -innerRadius)
|
|
41
|
+
invalid("A web must overlap the interior of its barrel.");
|
|
42
|
+
}
|
|
43
|
+
return { chamfer, web };
|
|
44
|
+
};
|
|
45
|
+
// Validate both attachments before allocating either half.
|
|
46
|
+
const a = validateHalf(options.halfA);
|
|
47
|
+
const b = validateHalf(options.halfB);
|
|
48
|
+
const axial = (radius, start, length, bore = false, chamfer = 0) => operations.translate(operations.rotate(operations.cylinder({
|
|
49
|
+
radius,
|
|
50
|
+
height: length,
|
|
51
|
+
center: false,
|
|
52
|
+
segments: d.segments,
|
|
53
|
+
sizing: bore ? "face" : "vertex",
|
|
54
|
+
...(chamfer === 0
|
|
55
|
+
? {}
|
|
56
|
+
: {
|
|
57
|
+
ends: {
|
|
58
|
+
bottom: { kind: "chamfer", distance: chamfer },
|
|
59
|
+
top: { kind: "chamfer", distance: chamfer },
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
62
|
+
}), [0, 90, 0]), [start, 0, 0]);
|
|
63
|
+
const buildHalf = (side, { chamfer, web }) => {
|
|
64
|
+
const features = [];
|
|
65
|
+
// Use the web bottom as the shared Float32 datum for barrel, web, and mounting bevels.
|
|
66
|
+
const baseZ = chamfer > 0 && web !== undefined ? web.zMin : 0;
|
|
67
|
+
const atBase = (solid) => operations.translate(solid, [0, 0, -baseZ]);
|
|
68
|
+
const webProfile = (web, inset) => {
|
|
69
|
+
// Parallel offsets finish the exposed tip; the two root corners stay square.
|
|
70
|
+
const corner = { kind: "chamfer", distance: chamfer + (Math.SQRT2 - 2) * inset };
|
|
71
|
+
const profile = operations.rectangle({
|
|
72
|
+
size: [d.knuckleLength - 2 * inset, web.reach - inset],
|
|
73
|
+
center: false,
|
|
74
|
+
treatment: [corner, corner, { kind: "square" }, { kind: "square" }],
|
|
75
|
+
});
|
|
76
|
+
return operations.scale(operations.translate(profile, [inset, 0]), [
|
|
77
|
+
1,
|
|
78
|
+
web.direction === "positive-y" ? 1 : -1,
|
|
79
|
+
]);
|
|
80
|
+
};
|
|
81
|
+
for (const interval of d.knuckles) {
|
|
82
|
+
if (interval.side !== side)
|
|
83
|
+
continue;
|
|
84
|
+
features.push(atBase(axial(d.barrelRadius, interval.start, interval.length, false, chamfer)));
|
|
85
|
+
if (web !== undefined) {
|
|
86
|
+
features.push(chamfer === 0
|
|
87
|
+
? operations.translate(operations.box({
|
|
88
|
+
size: [interval.length, web.reach, web.thickness],
|
|
89
|
+
center: false,
|
|
90
|
+
}), [
|
|
91
|
+
interval.start,
|
|
92
|
+
web.direction === "positive-y" ? 0 : -web.reach,
|
|
93
|
+
web.zMin - baseZ,
|
|
94
|
+
])
|
|
95
|
+
: operations.loft([
|
|
96
|
+
[chamfer, 0],
|
|
97
|
+
[0, chamfer],
|
|
98
|
+
[0, web.thickness - chamfer],
|
|
99
|
+
[chamfer, web.thickness],
|
|
100
|
+
].map(([inset, z]) => ({
|
|
101
|
+
profile: webProfile(web, inset),
|
|
102
|
+
frame: {
|
|
103
|
+
origin: [interval.start, 0, z],
|
|
104
|
+
xAxis: [1, 0, 0],
|
|
105
|
+
yAxis: [0, 1, 0],
|
|
106
|
+
zAxis: [0, 0, 1],
|
|
107
|
+
},
|
|
108
|
+
}))));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (side === "a" && d.pin !== null)
|
|
112
|
+
features.push(atBase(axial(d.pinRadius, d.pin.start, d.pin.length)));
|
|
113
|
+
// Match the kernel cylinders to the same mesh precision as the explicit web stations.
|
|
114
|
+
const solid = operations.union(features.map((feature) => chamfer === 0 || web === undefined
|
|
115
|
+
? feature
|
|
116
|
+
: operations.solidFromMesh(environment.analyzedMeshFor(feature).mesh)));
|
|
117
|
+
// Overtravel is numerical cutter extent, independent of the physical radial/axial allowances.
|
|
118
|
+
const overtravel = Math.min(d.knuckleLength, d.barrelRadius) * 0.01;
|
|
119
|
+
const result = side === "a" && d.pin !== null
|
|
120
|
+
? solid
|
|
121
|
+
: operations.subtract(solid, [
|
|
122
|
+
atBase(axial(d.boreRadius, -d.spec.length / 2 - overtravel, d.spec.length + 2 * overtravel, true)),
|
|
123
|
+
]);
|
|
124
|
+
return operations.translate(result, [0, 0, baseZ]);
|
|
125
|
+
};
|
|
126
|
+
return Object.freeze({ halfA: buildHalf("a", a), halfB: buildHalf("b", b), axis: d.axis });
|
|
127
|
+
};
|
|
128
|
+
}
|
|
@@ -8,7 +8,7 @@ import { assertSamplingCount } from "../geometry/sampling-limits.js";
|
|
|
8
8
|
import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitive-profiles.js";
|
|
9
9
|
import { buildProfileLoftMesh } from "./profile-mesh.js";
|
|
10
10
|
const explicitProfile = (value) => typeof value === "object" && value !== null && "components" in value;
|
|
11
|
-
const pointProfile = (value) => Array.isArray(value) || (typeof value === "object" && value !== null && "
|
|
11
|
+
const pointProfile = (value) => Array.isArray(value) || (typeof value === "object" && value !== null && "toData" in value);
|
|
12
12
|
const fail = (message) => {
|
|
13
13
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "loft" });
|
|
14
14
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { createKnuckleHingeOperation } from "./knuckle-hinge-operation.js";
|
|
1
2
|
import * as kernel from "./native/index.js";
|
|
2
3
|
/** Internal host-bound mechanical operations. */
|
|
3
|
-
export function createMechanicalOperations(environment) {
|
|
4
|
+
export function createMechanicalOperations(environment, construction) {
|
|
4
5
|
const { resolution } = environment;
|
|
5
6
|
const { scope, assertActive, wrapSolid, withResolutionDefaults } = environment;
|
|
6
7
|
const nutOptions = (value) => ({
|
|
@@ -9,6 +10,7 @@ export function createMechanicalOperations(environment) {
|
|
|
9
10
|
});
|
|
10
11
|
// Explicit preflight preserves the stable error operation names exposed by these constructors.
|
|
11
12
|
const operations = {
|
|
13
|
+
knuckleHinge: createKnuckleHingeOperation(environment, construction),
|
|
12
14
|
threadRidge: (value) => {
|
|
13
15
|
assertActive();
|
|
14
16
|
return wrapSolid(kernel.threadRidge(scope, withResolutionDefaults(value)));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { resolveGeometryResolution } from "../geometry/resolution.js";
|
|
2
2
|
import { createConstructionOperations } from "./construction-operations.js";
|
|
3
|
+
import { createHoleCutterOperation } from "./hole-cutter-operation.js";
|
|
3
4
|
import { createInspectionOperations } from "./inspection-operations.js";
|
|
4
5
|
import { createMechanicalOperations } from "./mechanical-operations.js";
|
|
5
6
|
import { createOperationEnvironment } from "./operation-environment.js";
|
|
@@ -15,7 +16,18 @@ export function createModelingContext(owner, initialResolution) {
|
|
|
15
16
|
const sections = createSectionOperations(environment, transforms);
|
|
16
17
|
const primitives = createPrimitiveOperations(environment, transforms, sections);
|
|
17
18
|
const construction = createConstructionOperations(environment, sections);
|
|
18
|
-
const mechanical = createMechanicalOperations(environment
|
|
19
|
+
const mechanical = createMechanicalOperations(environment, {
|
|
20
|
+
cylinder: primitives.cylinder,
|
|
21
|
+
box: primitives.box,
|
|
22
|
+
rectangle: primitives.rectangle,
|
|
23
|
+
scale: transforms.operations.scale,
|
|
24
|
+
solidFromMesh: construction.solidFromMesh,
|
|
25
|
+
loft: construction.loft,
|
|
26
|
+
union: construction.union,
|
|
27
|
+
rotate: transforms.operations.rotate,
|
|
28
|
+
translate: transforms.operations.translate,
|
|
29
|
+
subtract: construction.subtract,
|
|
30
|
+
});
|
|
19
31
|
const patterns = createPatternOperations(environment, transforms);
|
|
20
32
|
const inspection = createInspectionOperations(environment);
|
|
21
33
|
return Object.freeze({
|
|
@@ -27,6 +39,13 @@ export function createModelingContext(owner, initialResolution) {
|
|
|
27
39
|
...sections,
|
|
28
40
|
...primitives,
|
|
29
41
|
...construction,
|
|
42
|
+
holeCutter: createHoleCutterOperation(environment, {
|
|
43
|
+
cylinder: primitives.cylinder,
|
|
44
|
+
extrude: construction.extrude,
|
|
45
|
+
loft: construction.loft,
|
|
46
|
+
translate: transforms.operations.translate,
|
|
47
|
+
union: construction.union,
|
|
48
|
+
}),
|
|
30
49
|
...mechanical,
|
|
31
50
|
...patterns,
|
|
32
51
|
...inspection,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveCircularSampling } from "../geometry/circular-sampling.js";
|
|
1
2
|
import { resolveCylinderRadii } from "../geometry/cylinder.js";
|
|
2
3
|
import { resolveModelingLimits } from "../geometry/model-limits.js";
|
|
3
4
|
import { assertPrimitiveOptions } from "../geometry/primitive-resolvers.js";
|
|
@@ -48,7 +49,15 @@ export function createPrimitiveOperations(environment, transforms, sections) {
|
|
|
48
49
|
if (value.sizing !== "face")
|
|
49
50
|
return placedSolid(value, () => kernel.cylinder(scope, resolved), () => cylinderAnchors(value));
|
|
50
51
|
const radii = resolveCylinderRadii(value);
|
|
51
|
-
const
|
|
52
|
+
const maximumRadius = Math.max(...radii);
|
|
53
|
+
const sampling = resolveCircularSampling({
|
|
54
|
+
radius: maximumRadius,
|
|
55
|
+
sizing: "face",
|
|
56
|
+
...(resolved.segments === undefined ? {} : { segments: resolved.segments }),
|
|
57
|
+
resolution: resolved.resolution,
|
|
58
|
+
limits: resolved.limits,
|
|
59
|
+
});
|
|
60
|
+
const count = sampling.segments, correction = sampling.vertexRadius / maximumRadius;
|
|
52
61
|
return placedSolid(value, () => kernel.cylinder(scope, {
|
|
53
62
|
height: resolved.height,
|
|
54
63
|
radius: [radii[0] * correction, radii[1] * correction],
|
|
@@ -106,12 +115,16 @@ export function createPrimitiveOperations(environment, transforms, sections) {
|
|
|
106
115
|
throwGeometryError("INVALID_ARGUMENT", "circle", "Specify exactly one radius or diameter.");
|
|
107
116
|
const radius = value.radius ?? value.diameter / 2;
|
|
108
117
|
requirePositiveNumber(radius, "circle");
|
|
109
|
-
const count = resolveCircularSegments(radius, value);
|
|
110
|
-
requireProfileVertexCount(count, 3, "circle", withResolutionDefaults(value).limits);
|
|
111
|
-
if (value.sizing !== undefined && value.sizing !== "vertex" && value.sizing !== "face")
|
|
112
|
-
throwGeometryError("INVALID_ARGUMENT", "circle", "sizing must be vertex or face.");
|
|
113
|
-
const section = ownSection(module.CrossSection.circle(value.sizing === "face" ? radius / Math.cos(Math.PI / count) : radius, count));
|
|
114
118
|
const resolved = withResolutionDefaults(value);
|
|
119
|
+
const { segments: count, vertexRadius } = resolveCircularSampling({
|
|
120
|
+
radius,
|
|
121
|
+
sizing: value.sizing ?? "vertex",
|
|
122
|
+
...(resolved.segments === undefined ? {} : { segments: resolved.segments }),
|
|
123
|
+
resolution: resolved.resolution,
|
|
124
|
+
limits: resolved.limits,
|
|
125
|
+
});
|
|
126
|
+
requireProfileVertexCount(count, 3, "circle", resolved.limits);
|
|
127
|
+
const section = ownSection(module.CrossSection.circle(vertexRadius, count));
|
|
115
128
|
environment.rememberAnchors(section, planarAnchors([2 * radius, 2 * radius]));
|
|
116
129
|
return environment.rememberPrimitiveProfile(section, ellipticalSectionProfile([radius, radius], value, resolved.resolution, resolved.limits, value.sizing === "face"));
|
|
117
130
|
}),
|
|
@@ -36,7 +36,7 @@ export class RecipeRealization {
|
|
|
36
36
|
const args = this.resolveValue(call.args, true);
|
|
37
37
|
return this.duringNative(() => Reflect.apply(operation, undefined, args));
|
|
38
38
|
}
|
|
39
|
-
/**
|
|
39
|
+
/** Joint/split/component handles share one operation result, even when selected separately. */
|
|
40
40
|
evaluate(call) {
|
|
41
41
|
if (!this.resolvedCalls.has(call))
|
|
42
42
|
this.resolvedCalls.set(call, this.invoke(call));
|
|
@@ -76,7 +76,9 @@ export class RecipeRealization {
|
|
|
76
76
|
return retained;
|
|
77
77
|
}
|
|
78
78
|
const result = this.evaluate(recipe.call);
|
|
79
|
-
const selected = recipe.index === undefined
|
|
79
|
+
const selected = recipe.index === undefined
|
|
80
|
+
? result
|
|
81
|
+
: result[recipe.index];
|
|
80
82
|
this.realized.set(shape, selected);
|
|
81
83
|
return selected;
|
|
82
84
|
}
|
|
@@ -43,7 +43,7 @@ export function createSectionOperations(environment, transforms) {
|
|
|
43
43
|
polygon: (input) => {
|
|
44
44
|
assertActive();
|
|
45
45
|
if (Array.isArray(input) ||
|
|
46
|
-
(typeof input === "object" && input !== null && "
|
|
46
|
+
(typeof input === "object" && input !== null && ("toData" in input || "dimension" in input)))
|
|
47
47
|
return fromContours([input]);
|
|
48
48
|
if (typeof input !== "object" || input === null)
|
|
49
49
|
throwGeometryError("INVALID_ARGUMENT", "polygon", "Use an outline or polygon options.");
|
|
@@ -118,7 +118,7 @@ export function createSectionOperations(environment, transforms) {
|
|
|
118
118
|
},
|
|
119
119
|
svgSection: (svg, value = {}) => {
|
|
120
120
|
let result = wrapSection(kernel.regionToCrossSection(scope, preflightSvgRegion(svg, { ...withResolutionDefaults(value), origin: "document" }).region, limits));
|
|
121
|
-
if ((value.origin ?? "center") === "center") {
|
|
121
|
+
if (value.fit === undefined && (value.origin ?? "center") === "center") {
|
|
122
122
|
const bounds = nativeSection(result).bounds();
|
|
123
123
|
result = translate(result, [
|
|
124
124
|
-(bounds.min[0] + bounds.max[0]) / 2,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { attachmentTransform3 } from "../geometry/anchors.js";
|
|
2
2
|
import { vector2Data, vector3Data, } from "../geometry/math/vector-value.js";
|
|
3
3
|
import { assertPrimitiveOptions } from "../geometry/primitive-resolvers.js";
|
|
4
|
-
import { transform2, transform3, } from "../geometry/transform-chain.js";
|
|
5
4
|
import { readTransformMatrix } from "../geometry/transform-matrix.js";
|
|
5
|
+
import { transform2, transform3, } from "../geometry/transform-value.js";
|
|
6
6
|
import { eulerTransform3, scaleTransform3, translationTransform3, validateTransform3, } from "../geometry/transform3.js";
|
|
7
7
|
import * as kernel from "./native/index.js";
|
|
8
8
|
import { transformPrimitiveSectionProfile } from "./primitive-profiles.js";
|
|
@@ -160,8 +160,8 @@ export function createTransformOperations(environment) {
|
|
|
160
160
|
const transform = ((value, placement) => {
|
|
161
161
|
const native = resolveHandle(value);
|
|
162
162
|
const matrix = native.kind === "solid"
|
|
163
|
-
? transform3(readTransformMatrix(placement, 3)).
|
|
164
|
-
: transform2(readTransformMatrix(placement, 2)).
|
|
163
|
+
? transform3(readTransformMatrix(placement, 3)).toData()
|
|
164
|
+
: transform2(readTransformMatrix(placement, 2)).toData();
|
|
165
165
|
if (native.kind === "solid") {
|
|
166
166
|
validateCoordinates(matrix, 16, "transform");
|
|
167
167
|
return environment.preserveAnchors(value, wrapSolid(kernel.transform(scope, native.value, matrix)), matrix);
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { boundsCenter, boundsSize, containsBounds, validateBounds } from "./bounds.js";
|
|
2
|
+
import { GeometryError } from "./errors.js";
|
|
3
|
+
import { immutableMathClass } from "./math/immutable-value.js";
|
|
4
|
+
import { vector2, vector3 } from "./math/vector-value.js";
|
|
5
|
+
function fail(dimension, message) {
|
|
6
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation: `bounds${dimension}` });
|
|
7
|
+
}
|
|
8
|
+
function snapshot(input, dimension) {
|
|
9
|
+
if (typeof input !== "object" || input === null || Array.isArray(input))
|
|
10
|
+
fail(dimension, "Bounds require extrema or size.");
|
|
11
|
+
const { size, center } = input;
|
|
12
|
+
let min, max;
|
|
13
|
+
// Existing immutable bounds expose size()/center(); only a size value selects construction.
|
|
14
|
+
if ("size" in input && typeof size !== "function") {
|
|
15
|
+
if ("min" in input || "max" in input)
|
|
16
|
+
fail(dimension, "Supply size or min/max, never both.");
|
|
17
|
+
if (!Array.isArray(size) || size.length !== dimension)
|
|
18
|
+
fail(dimension, `Size requires ${dimension}D coordinates.`);
|
|
19
|
+
if (center !== undefined && typeof center !== "boolean")
|
|
20
|
+
fail(dimension, "center must be boolean.");
|
|
21
|
+
const coordinates = size;
|
|
22
|
+
const dimensions = Array.from({ length: dimension }, (_, axis) => {
|
|
23
|
+
const value = coordinates[axis];
|
|
24
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
|
|
25
|
+
fail(dimension, "Size must be finite and nonnegative.");
|
|
26
|
+
return value;
|
|
27
|
+
});
|
|
28
|
+
const centered = center ?? true;
|
|
29
|
+
min = dimensions.map((value) => (centered ? -value / 2 : 0));
|
|
30
|
+
max = dimensions.map((value) => (centered ? value / 2 : value));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
if (center !== undefined && typeof center !== "function")
|
|
34
|
+
fail(dimension, "center requires size construction.");
|
|
35
|
+
const extrema = input;
|
|
36
|
+
min = extrema.min;
|
|
37
|
+
max = extrema.max;
|
|
38
|
+
}
|
|
39
|
+
if (!Array.isArray(min) ||
|
|
40
|
+
!Array.isArray(max) ||
|
|
41
|
+
min.length !== dimension ||
|
|
42
|
+
max.length !== dimension)
|
|
43
|
+
fail(dimension, `Bounds require matching ${dimension}D minimum and maximum tuples.`);
|
|
44
|
+
const copy = (source) => Object.freeze(Array.from({ length: dimension }, (_, axis) => {
|
|
45
|
+
const value = source[axis];
|
|
46
|
+
return value === 0 ? 0 : value;
|
|
47
|
+
}));
|
|
48
|
+
const data = Object.freeze({ min: copy(min), max: copy(max) });
|
|
49
|
+
validateBounds(data, `bounds${dimension}`);
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
const PlanarBounds = /* @__PURE__ */ immutableMathClass(class PlanarBounds {
|
|
53
|
+
#data;
|
|
54
|
+
min;
|
|
55
|
+
max;
|
|
56
|
+
constructor(data) {
|
|
57
|
+
this.#data = data;
|
|
58
|
+
this.min = data.min;
|
|
59
|
+
this.max = data.max;
|
|
60
|
+
Object.freeze(this);
|
|
61
|
+
}
|
|
62
|
+
size() {
|
|
63
|
+
return vector2(boundsSize(this));
|
|
64
|
+
}
|
|
65
|
+
center() {
|
|
66
|
+
return vector2(boundsCenter(this));
|
|
67
|
+
}
|
|
68
|
+
containsBounds(other) {
|
|
69
|
+
return containsBounds(this, other);
|
|
70
|
+
}
|
|
71
|
+
toData() {
|
|
72
|
+
return this.#data;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
const SpatialBounds = /* @__PURE__ */ immutableMathClass(class SpatialBounds {
|
|
76
|
+
#data;
|
|
77
|
+
min;
|
|
78
|
+
max;
|
|
79
|
+
constructor(data) {
|
|
80
|
+
this.#data = data;
|
|
81
|
+
this.min = data.min;
|
|
82
|
+
this.max = data.max;
|
|
83
|
+
Object.freeze(this);
|
|
84
|
+
}
|
|
85
|
+
size() {
|
|
86
|
+
return vector3(boundsSize(this));
|
|
87
|
+
}
|
|
88
|
+
center() {
|
|
89
|
+
return vector3(boundsCenter(this));
|
|
90
|
+
}
|
|
91
|
+
containsBounds(other) {
|
|
92
|
+
return containsBounds(this, other);
|
|
93
|
+
}
|
|
94
|
+
toData() {
|
|
95
|
+
return this.#data;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* Constructs immutable finite XY bounds from ordered extrema or nonnegative size in millimetres.
|
|
100
|
+
*
|
|
101
|
+
* Zero extents are valid. Invalid dimensions, nonfinite coordinates, reversed bounds and
|
|
102
|
+
* overflowing extents throw `INVALID_ARGUMENT` GeometryError. Use `toData()` for plain records.
|
|
103
|
+
* Size construction centers on the origin unless `center` is false. Size and extrema are exclusive.
|
|
104
|
+
* Compiled Generator packages passing these values to host recipes or computed data require
|
|
105
|
+
* runtime 9.0.0 or newer in major 9.
|
|
106
|
+
*/
|
|
107
|
+
export function bounds2(input) {
|
|
108
|
+
return new PlanarBounds(snapshot(input, 2));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Constructs immutable finite XYZ bounds from ordered extrema or nonnegative size in millimetres.
|
|
112
|
+
*
|
|
113
|
+
* Zero extents are valid. Invalid dimensions, nonfinite coordinates, reversed bounds and
|
|
114
|
+
* overflowing extents throw `INVALID_ARGUMENT` GeometryError. Use `toData()` for plain records.
|
|
115
|
+
* Size construction centers on the origin unless `center` is false. Size and extrema are exclusive.
|
|
116
|
+
* Compiled Generator packages passing these values to host recipes or computed data require
|
|
117
|
+
* runtime 9.0.0 or newer in major 9.
|
|
118
|
+
*/
|
|
119
|
+
export function bounds3(input) {
|
|
120
|
+
return new SpatialBounds(snapshot(input, 3));
|
|
121
|
+
}
|
package/dist/geometry/bounds.js
CHANGED
|
@@ -13,7 +13,8 @@ function vector(values, operation) {
|
|
|
13
13
|
? Object.freeze([normalized[0], normalized[1]])
|
|
14
14
|
: Object.freeze([normalized[0], normalized[1], normalized[2]]);
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
/** Internal shared validation for tuple algorithms and immutable bounds snapshots. */
|
|
17
|
+
export function validateBounds(bounds, operation) {
|
|
17
18
|
if (typeof bounds !== "object" ||
|
|
18
19
|
bounds === null ||
|
|
19
20
|
!isArray(bounds.min) ||
|
|
@@ -36,41 +37,24 @@ function size(bounds) {
|
|
|
36
37
|
function center(bounds) {
|
|
37
38
|
return bounds.min.map((value, axis) => value / 2 + bounds.max[axis] / 2);
|
|
38
39
|
}
|
|
39
|
-
export function boundsFromSize(dimensions, options = {}) {
|
|
40
|
-
const operation = "boundsFromSize";
|
|
41
|
-
if (!isArray(dimensions) ||
|
|
42
|
-
(dimensions.length !== 2 && dimensions.length !== 3) ||
|
|
43
|
-
Array.from(dimensions).some((value) => !Number.isFinite(value) || value < 0))
|
|
44
|
-
fail(operation, "Bounds dimensions require two or three finite nonnegative values.");
|
|
45
|
-
if (typeof options !== "object" ||
|
|
46
|
-
options === null ||
|
|
47
|
-
isArray(options) ||
|
|
48
|
-
(options.center !== undefined && typeof options.center !== "boolean"))
|
|
49
|
-
fail(operation, "Bounds placement requires an optional boolean center value.");
|
|
50
|
-
const centered = options.center ?? true;
|
|
51
|
-
return Object.freeze({
|
|
52
|
-
min: vector(dimensions.map((value) => (centered ? -value / 2 : 0)), operation),
|
|
53
|
-
max: vector(dimensions.map((value) => (centered ? value / 2 : value)), operation),
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
40
|
export function boundsSize(bounds) {
|
|
57
|
-
|
|
41
|
+
validateBounds(bounds, "boundsSize");
|
|
58
42
|
return vector(size(bounds), "boundsSize");
|
|
59
43
|
}
|
|
60
44
|
export function boundsCenter(bounds) {
|
|
61
|
-
|
|
45
|
+
validateBounds(bounds, "boundsCenter");
|
|
62
46
|
return vector(center(bounds), "boundsCenter");
|
|
63
47
|
}
|
|
64
48
|
export function containsBounds(outer, inner) {
|
|
65
|
-
const dimension =
|
|
66
|
-
if (
|
|
49
|
+
const dimension = validateBounds(outer, "containsBounds");
|
|
50
|
+
if (validateBounds(inner, "containsBounds") !== dimension)
|
|
67
51
|
fail("containsBounds", "Contained bounds must have the same dimension.");
|
|
68
52
|
return outer.min.every((value, axis) => inner.min[axis] >= value && inner.max[axis] <= outer.max[axis]);
|
|
69
53
|
}
|
|
70
54
|
export function fitBounds(source, target, options = {}) {
|
|
71
55
|
const operation = "fitBounds";
|
|
72
|
-
const dimension =
|
|
73
|
-
if (
|
|
56
|
+
const dimension = validateBounds(source, operation);
|
|
57
|
+
if (validateBounds(target, operation) !== dimension)
|
|
74
58
|
fail(operation, "Source and target bounds must have the same dimension.");
|
|
75
59
|
if (typeof options !== "object" || options === null || isArray(options))
|
|
76
60
|
fail(operation, "Fitting options must be an object.");
|
|
@@ -94,6 +78,7 @@ export function fitBounds(source, target, options = {}) {
|
|
|
94
78
|
}
|
|
95
79
|
/**
|
|
96
80
|
* Returns immutable translations for a +X row of finite XYZ bounds with a nonnegative gap.
|
|
81
|
+
*
|
|
97
82
|
* Each minimum Y/Z becomes zero, and the first minimum X becomes zero. Supply bounds after
|
|
98
83
|
* any intended part rotation; translations apply to those bounds. An empty input returns [].
|
|
99
84
|
*/
|
|
@@ -106,7 +91,7 @@ export function layoutRow(bounds, options = {}) {
|
|
|
106
91
|
fail(operation, "Row gap must be finite and nonnegative.");
|
|
107
92
|
let nextX = 0;
|
|
108
93
|
return Object.freeze(Array.from(bounds, (item) => {
|
|
109
|
-
if (
|
|
94
|
+
if (validateBounds(item, operation) !== 3)
|
|
110
95
|
fail(operation, "Row layout requires XYZ bounds.");
|
|
111
96
|
const position = vector([nextX - item.min[0], -item.min[1], -item.min[2]], operation);
|
|
112
97
|
nextX += item.max[0] - item.min[0] + gap;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { GeometryError } from "./errors.js";
|
|
2
|
+
import { resolveCircularPrimitiveSegments } from "./primitive-resolution.js";
|
|
3
|
+
import { assertPrimitiveOptions } from "./primitive-resolvers.js";
|
|
4
|
+
function fail(message, nonfinite = false) {
|
|
5
|
+
throw new GeometryError(nonfinite ? "NON_FINITE_VALUE" : "INVALID_ARGUMENT", message, {
|
|
6
|
+
operation: "resolveCircularSampling",
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolves circular sampling and its actual radial envelopes without allocating boundary points.
|
|
11
|
+
*
|
|
12
|
+
* Vertex sizing retains the nominal vertex radius; face sizing retains the nominal face radius.
|
|
13
|
+
* Exact `segments` override resolution, while allocation ceilings still apply. Adaptive sampling
|
|
14
|
+
* uses the same count calculation as `resolveCircularSegments` and `circleContour` and rejects
|
|
15
|
+
* exhausted limits rather than coarsening. The returned record is immutable and needs no engine.
|
|
16
|
+
*
|
|
17
|
+
* @example Check a nominal 8 mm face-sized bore
|
|
18
|
+
* ```ts
|
|
19
|
+
* const bore = resolveCircularSampling({ diameter: 8, segments: 64, sizing: "face" });
|
|
20
|
+
* bore.faceRadius; // 4 mm
|
|
21
|
+
* bore.vertexRadius; // slightly larger than 4 mm
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function resolveCircularSampling(options) {
|
|
25
|
+
const operation = "resolveCircularSampling";
|
|
26
|
+
assertPrimitiveOptions(options, operation);
|
|
27
|
+
if ((options.radius === undefined) === (options.diameter === undefined)) {
|
|
28
|
+
fail("Specify exactly one radius or diameter.");
|
|
29
|
+
}
|
|
30
|
+
const radius = options.radius ?? options.diameter / 2;
|
|
31
|
+
const finite = Number.isFinite(radius);
|
|
32
|
+
if (!finite || radius <= 0)
|
|
33
|
+
fail("Circle radius must be finite and positive.", !finite);
|
|
34
|
+
const sizing = options.sizing ?? "vertex";
|
|
35
|
+
if (sizing !== "vertex" && sizing !== "face") {
|
|
36
|
+
fail("sizing must be vertex or face.");
|
|
37
|
+
}
|
|
38
|
+
const segments = resolveCircularPrimitiveSegments(radius, options, operation);
|
|
39
|
+
const cosine = Math.cos(Math.PI / segments);
|
|
40
|
+
const vertexRadius = sizing === "face" ? radius / cosine : radius;
|
|
41
|
+
const faceRadius = sizing === "face" ? radius : radius * cosine;
|
|
42
|
+
if (!Number.isFinite(vertexRadius))
|
|
43
|
+
fail("Sampled radii must remain finite.", true);
|
|
44
|
+
return Object.freeze({ segments, vertexRadius, faceRadius });
|
|
45
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { GeometryError } from "./errors.js";
|
|
2
|
+
/** @internal Parallel-edge offsets shared by convex extrusion rims and pocket entries. */
|
|
3
|
+
export function convexContourOffsets(points, operation) {
|
|
4
|
+
const fail = (message) => {
|
|
5
|
+
throw new GeometryError("INVALID_ARGUMENT", message, { operation });
|
|
6
|
+
};
|
|
7
|
+
if (points.length < 3)
|
|
8
|
+
fail("A convex contour needs at least three vertices.");
|
|
9
|
+
const edges = points.map((point, index) => {
|
|
10
|
+
const next = points[(index + 1) % points.length];
|
|
11
|
+
const dx = next[0] - point[0], dy = next[1] - point[1];
|
|
12
|
+
const length = Math.hypot(dx, dy);
|
|
13
|
+
if (!(length > 0) || !Number.isFinite(length))
|
|
14
|
+
fail("Contours must have distinct finite vertices.");
|
|
15
|
+
return [dx / length, dy / length];
|
|
16
|
+
});
|
|
17
|
+
const miters = edges.map((edge, index) => {
|
|
18
|
+
const previous = edges[(index + edges.length - 1) % edges.length];
|
|
19
|
+
const turn = previous[0] * edge[1] - previous[1] * edge[0];
|
|
20
|
+
if (!(turn > 1e-12))
|
|
21
|
+
fail("Entry and end treatments require a strictly convex counterclockwise contour without collinear vertices.");
|
|
22
|
+
const denominator = 1 + previous[0] * edge[0] + previous[1] * edge[1];
|
|
23
|
+
return [(-previous[1] - edge[1]) / denominator, (previous[0] + edge[0]) / denominator];
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
magnification: miters.reduce((maximum, [x, y]) => Math.max(maximum, Math.hypot(x, y)), 1),
|
|
27
|
+
offset(inset) {
|
|
28
|
+
const result = points.map(([x, y], index) => [
|
|
29
|
+
x + miters[index][0] * inset,
|
|
30
|
+
y + miters[index][1] * inset,
|
|
31
|
+
]);
|
|
32
|
+
for (let index = 0; index < result.length; index++) {
|
|
33
|
+
const point = result[index], next = result[(index + 1) % result.length], edge = edges[index];
|
|
34
|
+
if (!point.every(Number.isFinite) ||
|
|
35
|
+
!((next[0] - point[0]) * edge[0] + (next[1] - point[1]) * edge[1] > 0))
|
|
36
|
+
fail("Treatment offset collapses or reverses a contour edge.");
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -237,8 +237,7 @@ export function sampleCurve3(curve, options = {}) {
|
|
|
237
237
|
return sampleCurve(curve, options, createSpatialSampleWriter);
|
|
238
238
|
}
|
|
239
239
|
/** Samples a planar curve with the same guarantees and policy as spatial sampling.
|
|
240
|
-
* @remarks
|
|
241
|
-
* frozen. At stationary tangents, outgoing secants are preferred and endpoints use a backward fallback.
|
|
240
|
+
* @remarks Returned planar points and tangents are copied and frozen. At stationary tangents, outgoing secants are preferred and endpoints use a backward fallback.
|
|
242
241
|
* @example
|
|
243
242
|
* ```ts
|
|
244
243
|
* const turn = sampleCurve2({kind: "arc", center: [0,0], radius: 10, sweepAngle: 90});
|
package/dist/geometry/errors.js
CHANGED
|
@@ -50,6 +50,7 @@ export class GeometryError extends Error {
|
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
52
|
* Recognizes structured geometry errors from separately bundled Modeling copies in the same realm.
|
|
53
|
+
*
|
|
53
54
|
* Ordinary errors and unmarked code-shaped objects are rejected. The marker is execution-local and
|
|
54
55
|
* does not survive structured cloning; worker protocols carry their own serialized error envelope.
|
|
55
56
|
*/
|
|
@@ -77,16 +77,27 @@ function planHeightfield(options, limits) {
|
|
|
77
77
|
facts: Object.freeze({ sampleCount, vertexCount, triangleCount, byteCount }),
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
|
-
/**
|
|
80
|
+
/**
|
|
81
|
+
* Checks grid options, Float32 axis precision, and output limits; returns exact mesh buffer counts.
|
|
82
|
+
*
|
|
83
|
+
* This pure operation needs no engine and neither evaluates `height` nor allocates mesh buffers.
|
|
84
|
+
* Successful preflight leaves height values, Float32 base storage, and generated mesh validity to
|
|
85
|
+
* construction. `byteCount` covers position and index buffers, not total working memory.
|
|
86
|
+
*
|
|
87
|
+
* @see {@link heightfieldMesh}
|
|
88
|
+
*/
|
|
81
89
|
export function preflightHeightfield(options, limits = {}) {
|
|
82
90
|
return planHeightfield(options, limits).facts;
|
|
83
91
|
}
|
|
84
92
|
/**
|
|
85
93
|
* Builds a closed indexed mesh from a rectilinear top, matched boundary walls, and flat base.
|
|
94
|
+
*
|
|
86
95
|
* Heights run once per grid point after preflight; center-error adds one evaluation per cell.
|
|
87
96
|
* Top winding is +Z, the base is -Z, and sides face outward. Coordinates and heights must fit
|
|
88
97
|
* Float32 storage. Explicit axes are captured before sampling; shared wall vertices prevent cracks.
|
|
89
98
|
*
|
|
99
|
+
* @see {@link preflightHeightfield}
|
|
100
|
+
*
|
|
90
101
|
* @example Sample a closed wavy mesh
|
|
91
102
|
* ```ts
|
|
92
103
|
* heightfieldMesh({
|