@metamesh/modeling 0.14.0 → 0.16.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 +61 -0
- package/README.md +55 -13
- package/dist/api/engine.d.ts +15 -7
- package/dist/api/geometry.d.ts +853 -562
- package/dist/api/index.d.ts +604 -227
- package/dist/api/text.d.ts +9 -7
- package/dist/docs/guides/concepts.md +295 -91
- package/dist/docs/guides/fonts.md +9 -8
- package/dist/docs/guides/fundamentals.md +22 -23
- package/dist/docs/guides/generation.md +24 -23
- package/dist/docs/guides/hosting.md +26 -11
- package/dist/docs/guides/recipes.md +74 -48
- package/dist/docs/guides/standalone-model.md +42 -0
- package/dist/docs/manifest.json +1555 -749
- 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 +21 -10
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +6 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +7 -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 +6 -2
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/{Anchor3.md → Anchor3-type.md} +6 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +11 -7
- package/dist/docs/reference/geometry/ArcCurve3.md +13 -9
- package/dist/docs/reference/geometry/{AttachTransformOptions.md → AttachOptions.md} +11 -5
- 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/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/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/BoundsFromSizeOptions.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 +10 -10
- 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 +7 -7
- 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 +9 -3
- 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 +6 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +3 -3
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -3
- 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 +7 -3
- 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 +11 -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 +7 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +10 -6
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -5
- 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 +5 -5
- 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 +11 -5
- 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 +9 -5
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +10 -6
- 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 +10 -6
- 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 +12 -5
- package/dist/docs/reference/geometry/LoftCorrespondence.md +6 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +8 -4
- 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 +196 -0
- package/dist/docs/reference/geometry/Path2Data.md +50 -0
- package/dist/docs/reference/geometry/Path2Input.md +20 -0
- package/dist/docs/reference/geometry/Path3-type.md +196 -0
- package/dist/docs/reference/geometry/Path3Data.md +50 -0
- package/dist/docs/reference/geometry/Path3Input.md +20 -0
- package/dist/docs/reference/geometry/PathFrame.md +9 -5
- package/dist/docs/reference/geometry/PathLocation.md +69 -0
- package/dist/docs/reference/geometry/PathNormalGuide.md +10 -5
- package/dist/docs/reference/geometry/PathOptions.md +38 -0
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/PathPlacement.md +8 -4
- package/dist/docs/reference/geometry/PathResamplingOptions.md +84 -0
- 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 +26 -22
- 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 +8 -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 +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 +10 -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 +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 +7 -3
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +13 -4
- 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 +7 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +5 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +7 -3
- 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 +7 -3
- package/dist/docs/reference/geometry/SphereOptions.md +3 -3
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +5 -1
- package/dist/docs/reference/geometry/StrokeCap.md +14 -0
- package/dist/docs/reference/geometry/StrokeJoin.md +14 -0
- package/dist/docs/reference/geometry/{StrokePathRegionOptions.md → StrokeOptions.md} +11 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +5 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +6 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +19 -15
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +16 -11
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +14 -9
- package/dist/docs/reference/geometry/SweepOptions.md +10 -6
- package/dist/docs/reference/geometry/SweepOrientation.md +11 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +5 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +9 -5
- 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 +7 -3
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +8 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +8 -1
- package/dist/docs/reference/geometry/{ThreadProfile.md → 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 +10 -6
- 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 +10 -6
- package/dist/docs/reference/geometry/TorusOptions.md +8 -8
- 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 +9 -4
- package/dist/docs/reference/geometry/TriangleMesh.md +6 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +8 -4
- 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 +7 -3
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +5 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +8 -4
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +8 -3
- 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 +8 -8
- 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 +8 -3
- package/dist/docs/reference/geometry/VectorTextLayout.md +5 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +5 -1
- 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 +6 -2
- package/dist/docs/reference/geometry/{createAnchor3.md → anchor3.md} +10 -9
- package/dist/docs/reference/geometry/anchorFrame3.md +9 -5
- package/dist/docs/reference/geometry/applyTransformDirection3.md +8 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +8 -7
- package/dist/docs/reference/geometry/{attachTransform.md → attachmentTransform3.md} +16 -15
- package/dist/docs/reference/geometry/bounds2.md +38 -0
- package/dist/docs/reference/geometry/bounds3.md +38 -0
- package/dist/docs/reference/geometry/boundsCenter.md +12 -11
- package/dist/docs/reference/geometry/boundsFromSize.md +12 -11
- package/dist/docs/reference/geometry/boundsSize.md +12 -11
- package/dist/docs/reference/geometry/boxAnchor3.md +7 -6
- package/dist/docs/reference/geometry/categories/bounds-layout.md +23 -6
- package/dist/docs/reference/geometry/categories/curves-paths.md +27 -13
- package/dist/docs/reference/geometry/categories/mechanical.md +27 -15
- package/dist/docs/reference/geometry/categories/meshes.md +18 -10
- package/dist/docs/reference/geometry/categories/pattern-placement.md +11 -9
- package/dist/docs/reference/geometry/categories/primitive-options.md +10 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +21 -13
- package/dist/docs/reference/geometry/categories/resolution-errors.md +5 -3
- package/dist/docs/reference/geometry/categories/transforms-math.md +25 -16
- package/dist/docs/reference/geometry/categories/vector-import.md +15 -9
- 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 +9 -5
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +9 -5
- package/dist/docs/reference/geometry/composeTransform3.md +7 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +14 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +17 -7
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +13 -5
- package/dist/docs/reference/geometry/{createTriangleMeshSignature.md → computeTriangleMeshSignature.md} +8 -4
- package/dist/docs/reference/geometry/containsBounds.md +10 -9
- 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 +7 -6
- 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 +12 -6
- 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 +12 -8
- 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/{getMetricClearanceHole.md → getMetricClearanceHoleDiameter.md} +7 -3
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +5 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/heightfieldMesh.md +11 -2
- package/dist/docs/reference/geometry/{buildHelicalThreadRidgeMesh.md → helicalThreadRidgeMesh.md} +9 -5
- package/dist/docs/reference/geometry/{buildHelicalThreadSolidMesh.md → helicalThreadSolidMesh.md} +9 -5
- 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 +5 -5
- package/dist/docs/reference/geometry/loftMesh.md +6 -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 +7 -3
- 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 +15 -11
- package/dist/docs/reference/geometry/path2.md +54 -0
- package/dist/docs/reference/geometry/path3.md +49 -0
- package/dist/docs/reference/geometry/pathPatternTransforms.md +13 -9
- package/dist/docs/reference/geometry/preflightHeightfield.md +11 -2
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +13 -4
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +15 -4
- package/dist/docs/reference/geometry/preflightSvgRegion.md +15 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +14 -4
- package/dist/docs/reference/geometry/preflightThreadedRod.md +14 -4
- package/dist/docs/reference/geometry/projectOntoPlane3.md +7 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +4 -20
- 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 +9 -5
- package/dist/docs/reference/geometry/resamplePolyline2.md +9 -5
- package/dist/docs/reference/geometry/resamplePolyline3.md +9 -5
- 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 +5 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +5 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +7 -3
- 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 +8 -4
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +5 -1
- package/dist/docs/reference/geometry/revolveMesh.md +14 -10
- 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 +12 -6
- package/dist/docs/reference/geometry/sampleContour.md +14 -4
- package/dist/docs/reference/geometry/sampleCurve2.md +8 -5
- package/dist/docs/reference/geometry/sampleCurve3.md +6 -2
- 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 +17 -7
- package/dist/docs/reference/geometry/sampleTextContours.md +5 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +6 -2
- 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 +67 -0
- 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 +13 -9
- package/dist/docs/reference/geometry/{createThreadProfile.md → threadProfile.md} +10 -6
- 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 +10 -6
- 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 +10 -3
- 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 +8 -6
- package/dist/docs/reference/model/Anchor3.md +6 -5
- package/dist/docs/reference/model/AttachOptions.md +11 -5
- 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/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/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +10 -10
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +3 -3
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +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 +3 -3
- 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 +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 +20 -10
- 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 +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 +12 -5
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +4 -3
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +3 -2
- package/dist/docs/reference/model/HullOptions.md +5 -5
- 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 +5 -4
- 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 +34 -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 +13 -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 +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 +196 -0
- package/dist/docs/reference/model/Path2Data.md +50 -0
- package/dist/docs/reference/model/Path2Input.md +20 -0
- package/dist/docs/reference/model/Path3-type.md +196 -0
- package/dist/docs/reference/model/Path3Data.md +50 -0
- package/dist/docs/reference/model/Path3Input.md +20 -0
- package/dist/docs/reference/model/PathLocation.md +69 -0
- package/dist/docs/reference/model/PathNormalGuide.md +6 -5
- package/dist/docs/reference/model/PathOptions.md +38 -0
- package/dist/docs/reference/model/PathPatternOptions.md +4 -3
- package/dist/docs/reference/model/PathResamplingOptions.md +83 -0
- 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 +3 -3
- package/dist/docs/reference/model/PolygonData.md +3 -2
- package/dist/docs/reference/model/PolygonOptions.md +8 -8
- package/dist/docs/reference/model/{PrimitivePlacement.md → PrimitiveAttachment.md} +8 -7
- package/dist/docs/reference/model/{PrimitivePlacementOptions.md → PrimitiveAttachmentOptions.md} +42 -20
- 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 +18 -22
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +10 -10
- package/dist/docs/reference/model/RegionData.md +2 -2
- 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 +20 -12
- package/dist/docs/reference/model/SectionHullOptions.md +5 -5
- package/dist/docs/reference/model/SectionInspection.md +10 -10
- 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 +31 -7
- package/dist/docs/reference/model/SolidInspection.md +7 -7
- package/dist/docs/reference/model/{SolidRayHit.md → SolidSegmentHit.md} +6 -6
- package/dist/docs/reference/model/SphereOptions.md +3 -3
- package/dist/docs/reference/model/StarOptions.md +10 -10
- package/dist/docs/reference/model/{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 +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 +5 -4
- 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 +5 -4
- package/dist/docs/reference/model/TorusOptions.md +8 -8
- 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 +4 -4
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +3 -3
- package/dist/docs/reference/model/TubeOptions.md +8 -8
- 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 +36 -0
- package/dist/docs/reference/model/bounds3.md +36 -0
- package/dist/docs/reference/model/box.md +4 -4
- package/dist/docs/reference/model/castSegment.md +40 -0
- package/dist/docs/reference/model/categories/boolean-operations.md +10 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +5 -3
- package/dist/docs/reference/model/categories/bounds.md +36 -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 +7 -5
- 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 +12 -6
- package/dist/docs/reference/model/categories/mesh-inspection.md +5 -3
- package/dist/docs/reference/model/categories/paths.md +41 -0
- package/dist/docs/reference/model/categories/primitives.md +10 -4
- package/dist/docs/reference/model/categories/resolution.md +4 -2
- package/dist/docs/reference/model/categories/sections.md +12 -8
- package/dist/docs/reference/model/categories/threads.md +11 -8
- package/dist/docs/reference/model/categories/transforms-placement.md +23 -15
- 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 +5 -1
- package/dist/docs/reference/model/gridPattern.md +5 -4
- package/dist/docs/reference/model/heightfield.md +5 -2
- 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 +5 -4
- 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 +5 -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 +54 -0
- package/dist/docs/reference/model/path3.md +49 -0
- package/dist/docs/reference/model/pathPattern.md +14 -12
- package/dist/docs/reference/model/polygon.md +8 -5
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +9 -3
- package/dist/docs/reference/model/preflightThreadedNut.md +9 -3
- package/dist/docs/reference/model/preflightThreadedRod.md +9 -3
- package/dist/docs/reference/model/radialPattern.md +6 -37
- package/dist/docs/reference/model/rectangle.md +7 -4
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +5 -4
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +4 -4
- package/dist/docs/reference/model/stroke.md +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 +3 -2
- package/dist/docs/reference/model/threadedNut.md +5 -4
- package/dist/docs/reference/model/threadedRod.md +5 -4
- package/dist/docs/reference/model/torus.md +3 -3
- 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 +3 -3
- 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 +17 -9
- 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 +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 +3 -3
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +8 -6
- package/dist/docs/reference/text/prepareVectorFont.md +2 -2
- package/dist/docs/reference/text.md +4 -2
- 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/knuckle-hinge-operation.js +85 -0
- package/dist/engine/loft-operations.js +35 -14
- package/dist/engine/mechanical-operations.js +3 -1
- package/dist/engine/model-summary.js +8 -5
- package/dist/engine/modeling-context.js +8 -1
- 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 +10 -2
- 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 +27 -27
- package/dist/geometry/anchors.js +40 -33
- package/dist/geometry/bounds-value.js +93 -0
- package/dist/geometry/bounds.js +10 -8
- package/dist/geometry/curves/sampling.js +15 -16
- package/dist/geometry/edge-finishing.js +1 -1
- package/dist/geometry/errors.js +1 -0
- package/dist/geometry/extrusion.js +13 -16
- package/dist/geometry/heightfield.js +12 -1
- package/dist/geometry/index.js +12 -11
- 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/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/gear-motion.js +3 -3
- package/dist/geometry/mechanical/gears.js +38 -38
- package/dist/geometry/mechanical/index.js +4 -3
- package/dist/geometry/mechanical/knuckle-hinge.js +110 -0
- 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 +11 -7
- 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 +31 -6
- package/dist/geometry/mechanical/thread-surface.js +1 -1
- package/dist/geometry/mechanical/threads.js +8 -8
- package/dist/geometry/mesh/mesh-centroid.js +1 -0
- 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 +8 -7
- package/dist/geometry/mesh/mesh.js +4 -15
- package/dist/geometry/paths/closest-point.js +8 -19
- package/dist/geometry/paths/frames.js +42 -11
- package/dist/geometry/paths/helix.js +17 -6
- package/dist/geometry/paths/path-value.js +268 -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 +5 -3
- package/dist/geometry/polygon-clipping.js +17 -0
- package/dist/geometry/profiles/contour.js +7 -6
- package/dist/geometry/profiles/matched.js +5 -4
- package/dist/geometry/profiles/profiles.js +4 -4
- package/dist/geometry/profiles/rectangle.js +14 -5
- package/dist/geometry/profiles/side-profile.js +9 -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 +31 -25
- 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/text-fitting.js +1 -0
- package/dist/geometry/transform-geometry.js +7 -14
- package/dist/geometry/transform-matrix.js +1 -1
- package/dist/geometry/{transform-chain.js → transform-value.js} +24 -15
- package/dist/index.js +3 -1
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +62 -10
- package/dist/model/knuckle-hinge.js +1 -0
- package/dist/model/operations.js +79 -26
- package/dist/model/recipe-declaration.js +21 -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/Bounds2.md +0 -39
- package/dist/docs/reference/geometry/Bounds3.md +0 -39
- 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/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/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/Bounds2.md +0 -39
- package/dist/docs/reference/model/Bounds3.md +0 -39
- package/dist/docs/reference/model/Path2.md +0 -20
- package/dist/docs/reference/model/Transform2Matrix.md +0 -15
- package/dist/docs/reference/model/Transform3Matrix.md +0 -18
- package/dist/docs/reference/model/rayCast.md +0 -40
- package/dist/docs/reference/model/toTriangleMesh.md +0 -27
- package/dist/docs/reference/text/Bounds2.md +0 -34
- package/dist/docs/reference/text/Vector2Tuple.md +0 -7
- package/dist/geometry/paths/path.js +0 -32
package/dist/geometry/anchors.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { GeometryError } from "./errors.js";
|
|
2
|
+
import { vector3Data } from "./math/vector-value.js";
|
|
3
|
+
import { cross3, dot3 } from "./math/vector3.js";
|
|
2
4
|
import { resolveGeometryTolerance } from "./tolerance.js";
|
|
3
5
|
import { composeTransform3, frameTransform3, inverseTransform3 } from "./transform3.js";
|
|
4
6
|
const boxFaces = {
|
|
@@ -71,7 +73,7 @@ export function boxAnchor3(options) {
|
|
|
71
73
|
return origin[axis] + (direction[axis] * size[axis]) / 2;
|
|
72
74
|
return (origin[axis] + (direction[axis] > 0 ? size[axis] : direction[axis] < 0 ? 0 : size[axis] / 2));
|
|
73
75
|
};
|
|
74
|
-
return
|
|
76
|
+
return anchor3([coordinate(0), coordinate(1), coordinate(2)], direction, up);
|
|
75
77
|
}
|
|
76
78
|
/** Creates a cap-center or radial-side anchor using cylinder()'s construction origin.
|
|
77
79
|
* @remarks Both centered and noncentered cylinders extend along +Z. Side angle uses degrees;
|
|
@@ -82,12 +84,12 @@ export function cylinderAnchor3(options) {
|
|
|
82
84
|
assertAnchorOptions(options, operation);
|
|
83
85
|
const origin = primitiveAnchorOrigin(options, operation);
|
|
84
86
|
const { radius, height, face } = options;
|
|
85
|
-
const
|
|
87
|
+
const angle = options.angle === undefined ? 0 : options.angle;
|
|
86
88
|
if (!Number.isFinite(radius) || radius <= 0 || !Number.isFinite(height) || height <= 0)
|
|
87
89
|
throw new GeometryError("INVALID_ARGUMENT", "Cylinder anchor dimensions must be positive.", {
|
|
88
90
|
operation,
|
|
89
91
|
});
|
|
90
|
-
if (!Number.isFinite(
|
|
92
|
+
if (!Number.isFinite(angle))
|
|
91
93
|
throw new GeometryError("NON_FINITE_VALUE", "Cylinder anchor angle must be finite.", {
|
|
92
94
|
operation,
|
|
93
95
|
});
|
|
@@ -95,19 +97,13 @@ export function cylinderAnchor3(options) {
|
|
|
95
97
|
throw new GeometryError("INVALID_ARGUMENT", "Unsupported cylinder anchor face.", { operation });
|
|
96
98
|
const center = options.center ?? true;
|
|
97
99
|
if (face === "top")
|
|
98
|
-
return
|
|
100
|
+
return anchor3([origin[0], origin[1], origin[2] + (center ? height / 2 : height)], [0, 0, 1], [0, 1, 0]);
|
|
99
101
|
if (face === "bottom")
|
|
100
|
-
return
|
|
101
|
-
const
|
|
102
|
-
const cosine = Math.cos(
|
|
103
|
-
return
|
|
102
|
+
return anchor3([origin[0], origin[1], origin[2] - (center ? height / 2 : 0)], [0, 0, -1], [0, 1, 0]);
|
|
103
|
+
const angleRadians = angle * (Math.PI / 180);
|
|
104
|
+
const cosine = Math.cos(angleRadians), sine = Math.sin(angleRadians);
|
|
105
|
+
return anchor3([origin[0] + radius * cosine, origin[1] + radius * sine, origin[2] + (center ? 0 : height / 2)], [cosine, sine, 0], [0, 0, 1]);
|
|
104
106
|
}
|
|
105
|
-
const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
106
|
-
const cross = (a, b) => [
|
|
107
|
-
a[1] * b[2] - a[2] * b[1],
|
|
108
|
-
a[2] * b[0] - a[0] * b[2],
|
|
109
|
-
a[0] * b[1] - a[1] * b[0],
|
|
110
|
-
];
|
|
111
107
|
const normalized = (vector, label, tolerance) => {
|
|
112
108
|
if (!vector.every(Number.isFinite)) {
|
|
113
109
|
throw new GeometryError("NON_FINITE_VALUE", `${label} coordinates must be finite.`);
|
|
@@ -134,34 +130,44 @@ const normalized = (vector, label, tolerance) => {
|
|
|
134
130
|
* @returns A frozen anchor with unit, orthogonal direction and up vectors.
|
|
135
131
|
* @throws {@link GeometryError} For non-finite or degenerate inputs.
|
|
136
132
|
*/
|
|
137
|
-
export function
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
133
|
+
export function anchor3(position, direction, up = [0, 1, 0], tolerance = {}) {
|
|
134
|
+
const coordinates = (input) => {
|
|
135
|
+
const values = vector3Data(input);
|
|
136
|
+
const point = [values[0], values[1], values[2]];
|
|
137
|
+
if (!point.every(Number.isFinite))
|
|
138
|
+
throw new GeometryError("NON_FINITE_VALUE", "Anchor coordinates must be finite.", {
|
|
139
|
+
operation: "anchor3",
|
|
140
|
+
});
|
|
141
|
+
return point;
|
|
142
|
+
};
|
|
143
|
+
const point = coordinates(position);
|
|
144
|
+
const normal = coordinates(direction);
|
|
145
|
+
const roll = coordinates(up);
|
|
146
|
+
const resolved = resolveGeometryTolerance(Math.max(1, Math.hypot(normal[0], normal[1], normal[2])), tolerance);
|
|
147
|
+
const zAxis = normalized(normal, "Anchor direction", resolved.linear);
|
|
148
|
+
const rollProjection = dot3(roll, zAxis);
|
|
143
149
|
const projectedUp = [
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
150
|
+
roll[0] - zAxis[0] * rollProjection,
|
|
151
|
+
roll[1] - zAxis[1] * rollProjection,
|
|
152
|
+
roll[2] - zAxis[2] * rollProjection,
|
|
147
153
|
];
|
|
148
154
|
const normalizedUp = normalized(projectedUp, "Anchor up direction", resolved.linear);
|
|
149
155
|
return Object.freeze({
|
|
150
156
|
direction: zAxis,
|
|
151
|
-
position: Object.freeze(
|
|
157
|
+
position: Object.freeze(point),
|
|
152
158
|
up: normalizedUp,
|
|
153
159
|
});
|
|
154
160
|
}
|
|
155
161
|
/**
|
|
156
162
|
* Converts an anchor into a right-handed frame with direction as local +Z.
|
|
157
163
|
*
|
|
158
|
-
* @param anchor - Anchor created by {@link
|
|
164
|
+
* @param anchor - Anchor created by {@link anchor3} or equivalent valid data.
|
|
159
165
|
* @param tolerance - Optional comparison overrides.
|
|
160
166
|
* @returns A normalized right-handed frame at the anchor position.
|
|
161
167
|
*/
|
|
162
168
|
export function anchorFrame3(anchor, tolerance = {}) {
|
|
163
|
-
const normalizedAnchor =
|
|
164
|
-
const xAxis = normalized(
|
|
169
|
+
const normalizedAnchor = anchor3(anchor.position, anchor.direction, anchor.up, tolerance);
|
|
170
|
+
const xAxis = normalized(cross3(normalizedAnchor.up, normalizedAnchor.direction), "Anchor X axis", 0);
|
|
165
171
|
return Object.freeze({
|
|
166
172
|
origin: normalizedAnchor.position,
|
|
167
173
|
xAxis,
|
|
@@ -183,9 +189,9 @@ export function anchorFrame3(anchor, tolerance = {}) {
|
|
|
183
189
|
* @returns A frozen affine transform for the moving object.
|
|
184
190
|
* @throws {@link GeometryError} For invalid anchors or non-finite options.
|
|
185
191
|
*/
|
|
186
|
-
export function
|
|
192
|
+
export function attachmentTransform3(source, target, options = {}) {
|
|
187
193
|
const gap = options.gap ?? 0;
|
|
188
|
-
const spin = options.
|
|
194
|
+
const spin = options.spin ?? 0;
|
|
189
195
|
if (options.alignment !== undefined &&
|
|
190
196
|
options.alignment !== "opposed" &&
|
|
191
197
|
options.alignment !== "same") {
|
|
@@ -195,13 +201,14 @@ export function attachTransform(source, target, options = {}) {
|
|
|
195
201
|
throw new GeometryError("NON_FINITE_VALUE", "Attachment gap and spin must be finite.");
|
|
196
202
|
}
|
|
197
203
|
const sourceFrame = anchorFrame3(source, options.tolerance);
|
|
198
|
-
const targetAnchor =
|
|
204
|
+
const targetAnchor = anchor3(target.position, target.direction, target.up, options.tolerance);
|
|
199
205
|
const desiredDirection = (options.alignment ?? "opposed") === "opposed"
|
|
200
206
|
? [-targetAnchor.direction[0], -targetAnchor.direction[1], -targetAnchor.direction[2]]
|
|
201
207
|
: targetAnchor.direction;
|
|
202
|
-
const baseFrame = anchorFrame3(
|
|
203
|
-
const
|
|
204
|
-
const
|
|
208
|
+
const baseFrame = anchorFrame3(anchor3(targetAnchor.position, desiredDirection, targetAnchor.up, options.tolerance), options.tolerance);
|
|
209
|
+
const spinRadians = ((spin % 360) * Math.PI) / 180;
|
|
210
|
+
const cosine = Math.cos(spinRadians);
|
|
211
|
+
const sine = Math.sin(spinRadians);
|
|
205
212
|
const spunX = [
|
|
206
213
|
baseFrame.xAxis[0] * cosine + baseFrame.yAxis[0] * sine,
|
|
207
214
|
baseFrame.xAxis[1] * cosine + baseFrame.yAxis[1] * sine,
|
|
@@ -0,0 +1,93 @@
|
|
|
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)
|
|
10
|
+
fail(dimension, "Bounds require minimum and maximum coordinate tuples.");
|
|
11
|
+
const { min, max } = input;
|
|
12
|
+
if (!Array.isArray(min) ||
|
|
13
|
+
!Array.isArray(max) ||
|
|
14
|
+
min.length !== dimension ||
|
|
15
|
+
max.length !== dimension)
|
|
16
|
+
fail(dimension, `Bounds require matching ${dimension}D minimum and maximum tuples.`);
|
|
17
|
+
const minimum = min, maximum = max;
|
|
18
|
+
const copy = (source) => Object.freeze(Array.from({ length: dimension }, (_, axis) => {
|
|
19
|
+
const value = source[axis];
|
|
20
|
+
return value === 0 ? 0 : value;
|
|
21
|
+
}));
|
|
22
|
+
const data = Object.freeze({ min: copy(minimum), max: copy(maximum) });
|
|
23
|
+
validateBounds(data, `bounds${dimension}`);
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
const PlanarBounds = /* @__PURE__ */ immutableMathClass(class PlanarBounds {
|
|
27
|
+
#data;
|
|
28
|
+
min;
|
|
29
|
+
max;
|
|
30
|
+
constructor(data) {
|
|
31
|
+
this.#data = data;
|
|
32
|
+
this.min = data.min;
|
|
33
|
+
this.max = data.max;
|
|
34
|
+
Object.freeze(this);
|
|
35
|
+
}
|
|
36
|
+
size() {
|
|
37
|
+
return vector2(boundsSize(this));
|
|
38
|
+
}
|
|
39
|
+
center() {
|
|
40
|
+
return vector2(boundsCenter(this));
|
|
41
|
+
}
|
|
42
|
+
containsBounds(other) {
|
|
43
|
+
return containsBounds(this, other);
|
|
44
|
+
}
|
|
45
|
+
toData() {
|
|
46
|
+
return this.#data;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const SpatialBounds = /* @__PURE__ */ immutableMathClass(class SpatialBounds {
|
|
50
|
+
#data;
|
|
51
|
+
min;
|
|
52
|
+
max;
|
|
53
|
+
constructor(data) {
|
|
54
|
+
this.#data = data;
|
|
55
|
+
this.min = data.min;
|
|
56
|
+
this.max = data.max;
|
|
57
|
+
Object.freeze(this);
|
|
58
|
+
}
|
|
59
|
+
size() {
|
|
60
|
+
return vector3(boundsSize(this));
|
|
61
|
+
}
|
|
62
|
+
center() {
|
|
63
|
+
return vector3(boundsCenter(this));
|
|
64
|
+
}
|
|
65
|
+
containsBounds(other) {
|
|
66
|
+
return containsBounds(this, other);
|
|
67
|
+
}
|
|
68
|
+
toData() {
|
|
69
|
+
return this.#data;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* Snapshots finite ordered XY bounds in millimetres as an immutable fluent value.
|
|
74
|
+
*
|
|
75
|
+
* Zero extents are valid. Invalid dimensions, nonfinite coordinates, reversed bounds and
|
|
76
|
+
* overflowing extents throw `INVALID_ARGUMENT` GeometryError. Use `toData()` for plain records.
|
|
77
|
+
* Compiled Generator packages passing these values to host recipes or computed data require
|
|
78
|
+
* runtime 8.0.0 or newer in major 8.
|
|
79
|
+
*/
|
|
80
|
+
export function bounds2(input) {
|
|
81
|
+
return new PlanarBounds(snapshot(input, 2));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Snapshots finite ordered XYZ bounds in millimetres as an immutable fluent value.
|
|
85
|
+
*
|
|
86
|
+
* Zero extents are valid. Invalid dimensions, nonfinite coordinates, reversed bounds and
|
|
87
|
+
* overflowing extents throw `INVALID_ARGUMENT` GeometryError. Use `toData()` for plain records.
|
|
88
|
+
* Compiled Generator packages passing these values to host recipes or computed data require
|
|
89
|
+
* runtime 8.0.0 or newer in major 8.
|
|
90
|
+
*/
|
|
91
|
+
export function bounds3(input) {
|
|
92
|
+
return new SpatialBounds(snapshot(input, 3));
|
|
93
|
+
}
|
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) ||
|
|
@@ -54,23 +55,23 @@ export function boundsFromSize(dimensions, options = {}) {
|
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
export function boundsSize(bounds) {
|
|
57
|
-
|
|
58
|
+
validateBounds(bounds, "boundsSize");
|
|
58
59
|
return vector(size(bounds), "boundsSize");
|
|
59
60
|
}
|
|
60
61
|
export function boundsCenter(bounds) {
|
|
61
|
-
|
|
62
|
+
validateBounds(bounds, "boundsCenter");
|
|
62
63
|
return vector(center(bounds), "boundsCenter");
|
|
63
64
|
}
|
|
64
65
|
export function containsBounds(outer, inner) {
|
|
65
|
-
const dimension =
|
|
66
|
-
if (
|
|
66
|
+
const dimension = validateBounds(outer, "containsBounds");
|
|
67
|
+
if (validateBounds(inner, "containsBounds") !== dimension)
|
|
67
68
|
fail("containsBounds", "Contained bounds must have the same dimension.");
|
|
68
69
|
return outer.min.every((value, axis) => inner.min[axis] >= value && inner.max[axis] <= outer.max[axis]);
|
|
69
70
|
}
|
|
70
71
|
export function fitBounds(source, target, options = {}) {
|
|
71
72
|
const operation = "fitBounds";
|
|
72
|
-
const dimension =
|
|
73
|
-
if (
|
|
73
|
+
const dimension = validateBounds(source, operation);
|
|
74
|
+
if (validateBounds(target, operation) !== dimension)
|
|
74
75
|
fail(operation, "Source and target bounds must have the same dimension.");
|
|
75
76
|
if (typeof options !== "object" || options === null || isArray(options))
|
|
76
77
|
fail(operation, "Fitting options must be an object.");
|
|
@@ -94,6 +95,7 @@ export function fitBounds(source, target, options = {}) {
|
|
|
94
95
|
}
|
|
95
96
|
/**
|
|
96
97
|
* Returns immutable translations for a +X row of finite XYZ bounds with a nonnegative gap.
|
|
98
|
+
*
|
|
97
99
|
* Each minimum Y/Z becomes zero, and the first minimum X becomes zero. Supply bounds after
|
|
98
100
|
* any intended part rotation; translations apply to those bounds. An empty input returns [].
|
|
99
101
|
*/
|
|
@@ -106,7 +108,7 @@ export function layoutRow(bounds, options = {}) {
|
|
|
106
108
|
fail(operation, "Row gap must be finite and nonnegative.");
|
|
107
109
|
let nextX = 0;
|
|
108
110
|
return Object.freeze(Array.from(bounds, (item) => {
|
|
109
|
-
if (
|
|
111
|
+
if (validateBounds(item, operation) !== 3)
|
|
110
112
|
fail(operation, "Row layout requires XYZ bounds.");
|
|
111
113
|
const position = vector([nextX - item.min[0], -item.min[1], -item.min[2]], operation);
|
|
112
114
|
nextX += item.max[0] - item.min[0] + gap;
|
|
@@ -28,10 +28,10 @@ export function createSpatialSampleWriter() {
|
|
|
28
28
|
/** @internal Exact counts override physical resolution, but never the finite output budget. */
|
|
29
29
|
export function resolveSamplingBudget(options) {
|
|
30
30
|
const selected = resolveGeometrySamplingLimits(options.limits).maxPathPoints;
|
|
31
|
-
const maximum = options.
|
|
32
|
-
if (options.
|
|
31
|
+
const maximum = options.maxVertices ?? selected;
|
|
32
|
+
if (options.maxVertices !== undefined &&
|
|
33
33
|
(!Number.isSafeInteger(maximum) || maximum < 2 || maximum > selected))
|
|
34
|
-
curveFailure("INVALID_ARGUMENT", "
|
|
34
|
+
curveFailure("INVALID_ARGUMENT", "maxVertices must be at least two and cannot raise maxPathPoints.");
|
|
35
35
|
if (options.segments !== undefined &&
|
|
36
36
|
(!Number.isSafeInteger(options.segments) || options.segments < 1))
|
|
37
37
|
curveFailure("INVALID_ARGUMENT", "segments must be a positive safe integer.");
|
|
@@ -76,10 +76,10 @@ function validateArc(curve) {
|
|
|
76
76
|
validateCurvePoint3(curve.yAxis);
|
|
77
77
|
if (!Number.isFinite(curve.radius) ||
|
|
78
78
|
curve.radius <= 0 ||
|
|
79
|
-
!Number.isFinite(curve.
|
|
80
|
-
curve.
|
|
81
|
-
Math.abs(curve.
|
|
82
|
-
!Number.isFinite(curve.
|
|
79
|
+
!Number.isFinite(curve.sweepAngle) ||
|
|
80
|
+
curve.sweepAngle === 0 ||
|
|
81
|
+
Math.abs(curve.sweepAngle) > 360 ||
|
|
82
|
+
!Number.isFinite(curve.startAngle ?? 0))
|
|
83
83
|
curveFailure("INVALID_ARGUMENT", "Arc radius must be positive and its nonzero degree sweep at most 360.");
|
|
84
84
|
if (Math.abs(Math.hypot(...curve.xAxis) - 1) > 1e-10 ||
|
|
85
85
|
Math.abs(Math.hypot(...curve.yAxis) - 1) > 1e-10 ||
|
|
@@ -91,17 +91,17 @@ function validateArc(curve) {
|
|
|
91
91
|
function sampleArc(curve, options, maximum, createWriter) {
|
|
92
92
|
validateArc(curve);
|
|
93
93
|
const segments = options.segments ??
|
|
94
|
-
resolveArcSegments(curve.radius, curve.
|
|
94
|
+
resolveArcSegments(curve.radius, curve.sweepAngle, options.resolution, options.limits);
|
|
95
95
|
assertSampleVertexCount(segments + 1, maximum);
|
|
96
96
|
const writer = createWriter();
|
|
97
97
|
const point = [0, 0, 0];
|
|
98
98
|
const tangent = [0, 0, 0];
|
|
99
99
|
const firstPoint = [0, 0, 0];
|
|
100
|
-
const sign = Math.sign(curve.
|
|
100
|
+
const sign = Math.sign(curve.sweepAngle);
|
|
101
101
|
for (let i = 0; i <= segments; i++) {
|
|
102
|
-
const angle = (((curve.
|
|
102
|
+
const angle = (((curve.startAngle ?? 0) + (curve.sweepAngle * i) / segments) * Math.PI) / 180;
|
|
103
103
|
const cos = Math.cos(angle), sin = Math.sin(angle);
|
|
104
|
-
if (i === segments && Math.abs(curve.
|
|
104
|
+
if (i === segments && Math.abs(curve.sweepAngle) === 360) {
|
|
105
105
|
point[0] = firstPoint[0];
|
|
106
106
|
point[1] = firstPoint[1];
|
|
107
107
|
point[2] = firstPoint[2];
|
|
@@ -138,8 +138,8 @@ export function cubicControlMeetsPolicy(control, policy) {
|
|
|
138
138
|
* Every control interval must meet the physical policy, including flatter regions subdivided to
|
|
139
139
|
* match curved ones. The depth-first traversal retains only one bounded stack, without output points.
|
|
140
140
|
*/
|
|
141
|
-
export function resolveUniformCubicSegments(control, policy, maximum,
|
|
142
|
-
let segments =
|
|
141
|
+
export function resolveUniformCubicSegments(control, policy, maximum, minSegments = 1) {
|
|
142
|
+
let segments = minSegments;
|
|
143
143
|
for (let depth = 0; depth <= 32; depth += 1) {
|
|
144
144
|
assertSampleVertexCount(segments, maximum);
|
|
145
145
|
const pending = [{ control, intervals: segments }];
|
|
@@ -237,11 +237,10 @@ 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
|
-
* const turn = sampleCurve2({kind: "arc", center: [0,0], radius: 10,
|
|
243
|
+
* const turn = sampleCurve2({kind: "arc", center: [0,0], radius: 10, sweepAngle: 90});
|
|
245
244
|
* ```
|
|
246
245
|
*/
|
|
247
246
|
export function sampleCurve2(curve, options = {}) {
|
|
@@ -113,7 +113,7 @@ export function edgeTreatmentPointCount(treatment, operation, options = {}) {
|
|
|
113
113
|
: exact;
|
|
114
114
|
if (!Number.isSafeInteger(intervals) || intervals < 1)
|
|
115
115
|
fail(operation, "Smooth treatment segments must be a positive safe integer.");
|
|
116
|
-
assertSamplingCount(intervals, operation, Math.min(policy?.
|
|
116
|
+
assertSamplingCount(intervals, operation, Math.min(policy?.maxSegments ?? selected.limits.maxCircularSegments, selected.limits.maxCircularSegments));
|
|
117
117
|
}
|
|
118
118
|
assertSamplingCount(intervals + 1, operation, selected.limits.maxProfilePoints);
|
|
119
119
|
return intervals + 1;
|
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
|
*/
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "./errors.js";
|
|
2
|
+
import { vector2Data } from "./math/vector-value.js";
|
|
2
3
|
import { assertPositivePrimitive, assertPrimitiveOptions } from "./primitive-resolvers.js";
|
|
3
4
|
import { resolveGeometryResolution } from "./resolution.js";
|
|
4
5
|
import { assertSamplingCount, resolveGeometrySamplingLimits } from "./sampling-limits.js";
|
|
@@ -12,17 +13,13 @@ export function resolveExtrusionControls(height, options, operation) {
|
|
|
12
13
|
operation,
|
|
13
14
|
});
|
|
14
15
|
}
|
|
15
|
-
const
|
|
16
|
-
if (!Number.isFinite(
|
|
17
|
-
throw new GeometryError("NON_FINITE_VALUE", "
|
|
16
|
+
const twist = options.twist ?? 0;
|
|
17
|
+
if (!Number.isFinite(twist)) {
|
|
18
|
+
throw new GeometryError("NON_FINITE_VALUE", "twist must be finite.", { operation });
|
|
18
19
|
}
|
|
19
20
|
const scaleTop = options.scaleTop ?? 1;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
operation,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
const scales = typeof scaleTop === "number" ? [scaleTop, scaleTop] : scaleTop;
|
|
21
|
+
const values = typeof scaleTop === "number" ? [scaleTop, scaleTop] : vector2Data(scaleTop);
|
|
22
|
+
const scales = [values[0], values[1]];
|
|
26
23
|
if (!Number.isFinite(scales[0]) || !Number.isFinite(scales[1])) {
|
|
27
24
|
throw new GeometryError("NON_FINITE_VALUE", "scaleTop values must be finite.", { operation });
|
|
28
25
|
}
|
|
@@ -34,7 +31,7 @@ export function resolveExtrusionControls(height, options, operation) {
|
|
|
34
31
|
}
|
|
35
32
|
if (options.divisions !== undefined)
|
|
36
33
|
assertSamplingCount(options.divisions + 2, operation, resolveGeometrySamplingLimits(options.limits).maxPathPoints);
|
|
37
|
-
return { scales,
|
|
34
|
+
return { scales, twist, center: options.center ?? false };
|
|
38
35
|
}
|
|
39
36
|
/**
|
|
40
37
|
* Resolves intermediate profile copies for linear extrusion from physical curve resolution.
|
|
@@ -86,7 +83,7 @@ export function resolveExtrusionDivisions(profile, height, options = {}) {
|
|
|
86
83
|
/** @internal Shared sampling preflight over explicit contours, without rebuilding filled topology. */
|
|
87
84
|
export function resolveExtrusionContourDivisions(contours, height, options) {
|
|
88
85
|
const operation = "resolveExtrusionDivisions";
|
|
89
|
-
const { scales,
|
|
86
|
+
const { scales, twist } = resolveExtrusionControls(height, options, operation);
|
|
90
87
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
91
88
|
let radius = 0, maximumEdgeLength = 0, profileCount = 0;
|
|
92
89
|
for (const contour of contours) {
|
|
@@ -115,7 +112,7 @@ export function resolveExtrusionContourDivisions(contours, height, options) {
|
|
|
115
112
|
if (options.divisions !== undefined)
|
|
116
113
|
return options.divisions;
|
|
117
114
|
const policy = resolveGeometryResolution(options.resolution, options.limits);
|
|
118
|
-
const angle = (Math.abs(
|
|
115
|
+
const angle = (Math.abs(twist) * Math.PI) / 180;
|
|
119
116
|
const maximumScale = Math.max(1, Math.abs(scales[0]), Math.abs(scales[1]));
|
|
120
117
|
const scaleChange = Math.max(Math.abs(scales[0] - 1), Math.abs(scales[1] - 1));
|
|
121
118
|
// A linear scale multiplied by a rotation has second derivative bounded by this magnitude.
|
|
@@ -127,13 +124,13 @@ export function resolveExtrusionContourDivisions(contours, height, options) {
|
|
|
127
124
|
b = (maximumEdgeLength * (maximumScale * angle + Math.abs(scales[0] - scales[1]))) / 4;
|
|
128
125
|
const chordSegments = policy.circularSegments === undefined
|
|
129
126
|
? Math.max(1, Math.ceil((b + Math.hypot(b, 2 * Math.sqrt(a * policy.maxChordError))) /
|
|
130
|
-
(2 * policy.maxChordError)), Math.ceil((policy.
|
|
131
|
-
: Math.max(1, Math.ceil((policy.circularSegments * Math.abs(
|
|
132
|
-
const angularCap = Math.max(1, scales[0] === scales[1] ? 0 : policy.
|
|
127
|
+
(2 * policy.maxChordError)), Math.ceil((policy.minSegments * Math.abs(twist)) / 360))
|
|
128
|
+
: Math.max(1, Math.ceil((policy.circularSegments * Math.abs(twist)) / 360));
|
|
129
|
+
const angularCap = Math.max(1, scales[0] === scales[1] ? 0 : policy.maxSegments, Math.ceil((policy.maxSegments * Math.abs(twist)) / 360));
|
|
133
130
|
if (chordSegments > angularCap) {
|
|
134
131
|
throw new GeometryError("COMPLEXITY_LIMIT", "Extrusion surface refinement exceeds the full-circle interval safety limit.", {
|
|
135
132
|
operation,
|
|
136
|
-
details: { requiredSegments: chordSegments,
|
|
133
|
+
details: { requiredSegments: chordSegments, maxSegments: angularCap },
|
|
137
134
|
});
|
|
138
135
|
}
|
|
139
136
|
const angularTravel = radius * maximumScale * angle;
|
|
@@ -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({
|
package/dist/geometry/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** Pure geometry foundations without host initialization. @packageDocumentation */
|
|
2
|
+
export { bounds2, bounds3, } from "./bounds-value.js";
|
|
2
3
|
export { boundsFromSize, boundsSize, boundsCenter, containsBounds, fitBounds, layoutRow, } from "./bounds.js";
|
|
3
4
|
export { fitTextLayout } from "./text-fitting.js";
|
|
4
5
|
export { gridPatternTransforms, linearPatternTransforms, radialPatternTransforms, pathPatternTransforms, } from "./patterns.js";
|
|
@@ -7,31 +8,30 @@ export { computeTriangleMeshCentroid } from "./mesh/mesh-centroid.js";
|
|
|
7
8
|
export { matchProfiles, } from "./profiles/matched.js";
|
|
8
9
|
export { heightfieldMesh, preflightHeightfield, } from "./heightfield.js";
|
|
9
10
|
export { preflightThreadedRodSolid as preflightThreadedRod, preflightInternalThreadCutterSolid as preflightInternalThreadCutter, preflightThreadedNutSolid as preflightThreadedNut, } from "./mechanical/thread-solids.js";
|
|
10
|
-
export { anchorFrame3,
|
|
11
|
+
export { anchorFrame3, attachmentTransform3, boxAnchor3, anchor3, cylinderAnchor3, } from "./anchors.js";
|
|
11
12
|
export { defaultGeometrySamplingLimits, resolveGeometrySamplingLimits, } from "./sampling-limits.js";
|
|
12
13
|
export { GeometryError, isGeometryError, } from "./errors.js";
|
|
13
14
|
export { resolveExtrusionDivisions, } from "./extrusion.js";
|
|
14
15
|
export { extrudeMesh, loftMesh, triangulateContour, } from "./loft/loft.js";
|
|
15
|
-
export { transform2, transform3, } from "./transform-
|
|
16
|
+
export { transform2, transform3, } from "./transform-value.js";
|
|
16
17
|
export { vector2, vector3, } from "./math/vector-value.js";
|
|
17
18
|
export { add2, subtract2, scale2, dot2, cross2, length2, distance2, normalize2, lerp2, rotate2, } from "./math/vector2.js";
|
|
18
19
|
export { add3, cross3, dot3, length3, distance3, lerp3, normalize3, projectOntoPlane3, scale3, subtract3, } from "./math/vector3.js";
|
|
19
20
|
export { minimumCylindricalGearToothCountWithoutUndercut, resolveCylindricalGear, resolveCylindricalGearPair, resolveRackPitch, sampleCylindricalGearOutline, sampleInternalCylindricalGearSpaceOutline, sampleRackToothPath, } from "./mechanical/gears.js";
|
|
20
21
|
export { measureInternalCylindricalGearPairMotion, } from "./mechanical/gear-motion.js";
|
|
21
|
-
export { METRIC_FASTENER_STANDARDS,
|
|
22
|
-
export {
|
|
23
|
-
export { compensateThreadProfileAxially, compensateThreadProfileForFaceting,
|
|
22
|
+
export { METRIC_FASTENER_STANDARDS, getMetricClearanceHoleDiameter, getMetricFastenerStandard, } from "./mechanical/standards.js";
|
|
23
|
+
export { helicalThreadRidgeMesh, helicalThreadSolidMesh } from "./mechanical/thread-mesh.js";
|
|
24
|
+
export { compensateThreadProfileAxially, compensateThreadProfileForFaceting, threadProfile, } from "./mechanical/thread-profiles.js";
|
|
24
25
|
export { preflightHelicalThreadSolidMesh, } from "./mechanical/thread-mesh-plan.js";
|
|
25
26
|
export { sampleConventionalThreadHelices as sampleThreadHelices, } from "./mechanical/thread-helices.js";
|
|
26
27
|
export { PRINTABLE_THREAD_FIT_POLICIES, compensateThreadDiameters, resolvePrintableThreadFitPolicy, resolveThreadCircularSegments, } from "./mechanical/threads.js";
|
|
27
|
-
export { analyzeTriangleMesh, joinTriangleMeshes,
|
|
28
|
-
export {
|
|
28
|
+
export { analyzeTriangleMesh, joinTriangleMeshes, meshBounds, reverseTriangleMesh, transformTriangleMesh, validateTriangleMesh, } from "./mesh/mesh.js";
|
|
29
|
+
export { computeTriangleMeshSignature, } from "./mesh/mesh-signature.js";
|
|
29
30
|
export { optimizePlanarPatches, } from "./mesh/mesh-planar.js";
|
|
30
31
|
export { analyzeTriangleMeshQuality, } from "./mesh/mesh-quality.js";
|
|
31
32
|
export { computeClosedParallelTransportFrames, computeParallelTransportFrames, } from "./paths/frames.js";
|
|
32
33
|
export { sampleHelix } from "./paths/helix.js";
|
|
33
|
-
export {
|
|
34
|
-
export { closestPointOnPath, } from "./paths/closest-point.js";
|
|
34
|
+
export { path2, path3, } from "./paths/path-value.js";
|
|
35
35
|
export { distributeAlongPath, roundClosedPolylinePath, } from "./paths/planar.js";
|
|
36
36
|
export { circleContour, rectangleContour, regularPolygonContour, starContour, } from "./profiles/profiles.js";
|
|
37
37
|
export { closeToAxis, sampleSideProfile, } from "./profiles/side-profile.js";
|
|
@@ -42,11 +42,12 @@ export { contourContainsPoint, normalizeContour, normalizePolygon, normalizeRegi
|
|
|
42
42
|
export { resolveAlignedCircularSegments, resolveArcSegments, resolveCircularSegments, } from "./resolution.js";
|
|
43
43
|
export { revolveMesh } from "./revolve/revolve-mesh.js";
|
|
44
44
|
export { preflightSvgRegion, } from "./svg-import.js";
|
|
45
|
-
export {
|
|
45
|
+
export { strokeRegionData, } from "./stroke-path.js";
|
|
46
46
|
export { sweepMesh } from "./sweeps/sweep-mesh.js";
|
|
47
47
|
export { DEFAULT_GEOMETRY_TOLERANCE, resolveGeometryTolerance, } from "./tolerance.js";
|
|
48
|
-
export {
|
|
48
|
+
export { transformRegionData } from "./transform-geometry.js";
|
|
49
49
|
export { IDENTITY_TRANSFORM3, applyTransformDirection3, applyTransformPoint3, composeTransform3, eulerTransform3, frameTransform3, inverseTransform3, rotationTransform3, scaleTransform3, transformDeterminant3, translationTransform3, validateTransform3, } from "./transform3.js";
|
|
50
50
|
export { sampleTextContours } from "./text-contours.js";
|
|
51
51
|
export { sampleCurve2, sampleCurve3 } from "./curves/sampling.js";
|
|
52
52
|
export { resamplePolyline2, resamplePolyline3, } from "./paths/resampling.js";
|
|
53
|
+
export { resolveKnuckleHinge, } from "./mechanical/knuckle-hinge.js";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
import {
|
|
2
|
+
import { analyzeTriangleMesh, validateTriangleMesh } from "../mesh/mesh.js";
|
|
3
3
|
import { assertMeshAllocationWithinLimits } from "../model-limits.js";
|
|
4
4
|
import { writeMeshVertex } from "../numeric.js";
|
|
5
5
|
import { triangulateContour } from "./loft-triangulation.js";
|
|
6
6
|
/** @internal Pure closed simple-contour strips, retaining repeated correspondence slots as shared physical vertices. */
|
|
7
7
|
export function simpleLoftMesh(geometry, limits) {
|
|
8
8
|
const count = geometry.world[0][0].length, rowCount = geometry.world.length;
|
|
9
|
-
const
|
|
10
|
-
const bytes = 12 * (
|
|
11
|
-
assertMeshAllocationWithinLimits(
|
|
12
|
-
const positions = new Float32Array(
|
|
9
|
+
const maxVertices = count * rowCount, maximumTriangles = 2 * count * (rowCount - 1) + 2 * (count - 2);
|
|
10
|
+
const bytes = 12 * (maxVertices + maximumTriangles);
|
|
11
|
+
assertMeshAllocationWithinLimits(maxVertices, maximumTriangles, bytes, "loftMesh", limits);
|
|
12
|
+
const positions = new Float32Array(maxVertices * 3), indices = new Uint32Array(maximumTriangles * 3);
|
|
13
13
|
let vertexCount = 0, cursor = 0;
|
|
14
14
|
const rows = geometry.world.map((contours, row) => {
|
|
15
15
|
const points = [], vertices = [], slots = [];
|
|
@@ -78,7 +78,7 @@ export function simpleLoftMesh(geometry, limits) {
|
|
|
78
78
|
positions: positions.slice(0, vertexCount * 3),
|
|
79
79
|
indices: indices.slice(0, cursor),
|
|
80
80
|
};
|
|
81
|
-
const volume =
|
|
81
|
+
const volume = analyzeTriangleMesh(mesh).signedVolume;
|
|
82
82
|
if (volume === 0)
|
|
83
83
|
throw new GeometryError("DEGENERATE_GEOMETRY", "Loft stations collapse to zero enclosed volume.", { operation: "loftMesh" });
|
|
84
84
|
if (volume < 0)
|