@metamesh/modeling 0.19.0 → 0.20.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 +49 -0
- package/README.md +34 -18
- package/dist/api/engine.d.ts +217 -121
- package/dist/api/export.d.ts +123 -79
- package/dist/api/geometry.d.ts +406 -2102
- package/dist/api/index.d.ts +472 -1798
- package/dist/api/math.d.ts +315 -0
- package/dist/api/mechanical.d.ts +1041 -0
- package/dist/api/mesh.d.ts +360 -88
- package/dist/api/text.d.ts +24 -44
- package/dist/docs/guides/concepts.md +67 -33
- package/dist/docs/guides/exporting.md +88 -0
- package/dist/docs/guides/fonts.md +5 -3
- package/dist/docs/guides/fundamentals.md +12 -24
- package/dist/docs/guides/generation.md +24 -16
- package/dist/docs/guides/geometry-values.md +192 -134
- package/dist/docs/guides/hosting.md +51 -96
- package/dist/docs/guides/profiles-and-extrusion.md +159 -11
- package/dist/docs/guides/recipes.md +121 -28
- package/dist/docs/guides/resolution-and-inspection.md +43 -23
- package/dist/docs/guides/solid-joins.md +12 -2
- package/dist/docs/guides/standalone-model.md +4 -2
- package/dist/docs/guides/svg-and-text.md +76 -39
- package/dist/docs/guides/sweeps-and-lofts.md +88 -44
- package/dist/docs/guides/transforms-and-placement.md +113 -103
- package/dist/docs/guides/workers.md +166 -0
- package/dist/docs/manifest.json +4133 -4153
- package/dist/docs/reference/engine/GenerationOptions.md +2 -3
- package/dist/docs/reference/engine/GeometryResource.md +6 -6
- package/dist/docs/reference/engine/ModelDependencies.md +2 -2
- package/dist/docs/reference/engine/ModelEngine.md +2 -3
- package/dist/docs/reference/engine/ModelEngineOptions.md +2 -7
- package/dist/docs/reference/engine/ModelPart.md +6 -6
- package/dist/docs/reference/engine/ModelResult.md +2 -2
- package/dist/docs/reference/engine/ModelRunArguments.md +2 -2
- package/dist/docs/reference/engine/ModelRunOptions.md +2 -3
- package/dist/docs/reference/engine/ModelSession.md +2 -2
- package/dist/docs/reference/engine/SessionOptions.md +2 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +9 -3
- package/dist/docs/reference/engine/checkModel.md +6 -2
- package/dist/docs/reference/engine/createModelEngine.md +5 -3
- package/dist/docs/reference/engine/defaultModelingLimits.md +4 -11
- package/dist/docs/reference/engine/modelingWasmUrl.md +2 -2
- package/dist/docs/reference/engine.md +7 -1
- package/dist/docs/reference/export/Export3mfOptions.md +2 -6
- package/dist/docs/reference/export/ExportDiagnostic.md +2 -14
- package/dist/docs/reference/export/ExportFormat.md +2 -14
- package/dist/docs/reference/export/ExportGeometry.md +3 -15
- package/dist/docs/reference/export/ExportGlbOptions.md +14 -18
- package/dist/docs/reference/export/ExportLimits.md +2 -14
- package/dist/docs/reference/export/ExportMaterial.md +2 -14
- package/dist/docs/reference/export/ExportOptions.md +2 -14
- package/dist/docs/reference/export/ExportPart.md +2 -14
- package/dist/docs/reference/export/ExportReport.md +2 -14
- package/dist/docs/reference/export/ExportSink.md +5 -15
- package/dist/docs/reference/export/ExportStlOptions.md +2 -6
- package/dist/docs/reference/export/ExportedFile.md +14 -26
- package/dist/docs/reference/export/categories/mesh-serialization.md +9 -3
- package/dist/docs/reference/export/defaultExportLimits.md +2 -2
- package/dist/docs/reference/export/export3mf.md +4 -6
- package/dist/docs/reference/export/exportGlb.md +8 -10
- package/dist/docs/reference/export/exportStl.md +4 -6
- package/dist/docs/reference/export/write3mf.md +6 -6
- package/dist/docs/reference/export/writeGlb.md +10 -10
- package/dist/docs/reference/export/writeStl.md +6 -6
- package/dist/docs/reference/export.md +9 -3
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +4 -4
- package/dist/docs/reference/geometry/Anchor3-type.md +3 -7
- package/dist/docs/reference/geometry/Anchor3Options.md +70 -0
- package/dist/docs/reference/geometry/ArcCurve2.md +3 -3
- package/dist/docs/reference/geometry/ArcCurve3.md +3 -3
- package/dist/docs/reference/geometry/AttachOptions.md +4 -9
- package/dist/docs/reference/geometry/Bounds2-type.md +9 -30
- package/dist/docs/reference/geometry/Bounds2Data.md +2 -19
- package/dist/docs/reference/geometry/Bounds2Input.md +2 -10
- package/dist/docs/reference/geometry/Bounds2Options.md +2 -6
- package/dist/docs/reference/geometry/Bounds3-type.md +9 -30
- package/dist/docs/reference/geometry/Bounds3Data.md +2 -15
- package/dist/docs/reference/geometry/Bounds3Input.md +2 -10
- package/dist/docs/reference/geometry/Bounds3Options.md +2 -6
- package/dist/docs/reference/geometry/BoundsFit2.md +2 -2
- package/dist/docs/reference/geometry/BoundsFit3.md +2 -2
- package/dist/docs/reference/geometry/BoundsFitOptions.md +2 -2
- package/dist/docs/reference/geometry/BoxAnchorFace.md +3 -3
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +3 -3
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +3 -7
- package/dist/docs/reference/geometry/CircleContourOptions.md +3 -7
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +3 -12
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +2 -2
- package/dist/docs/reference/geometry/CircularSampling.md +2 -2
- package/dist/docs/reference/geometry/CircularSamplingOptions.md +2 -2
- package/dist/docs/reference/geometry/Contour.md +4 -9
- package/dist/docs/reference/geometry/ContourCurve.md +3 -3
- package/dist/docs/reference/geometry/ContourPoint.md +3 -3
- package/dist/docs/reference/geometry/ContourSegment.md +3 -3
- package/dist/docs/reference/geometry/CorrespondingComponent.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingContour.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingProfile.md +3 -7
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +4 -8
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +3 -3
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +3 -3
- package/dist/docs/reference/geometry/Curve2.md +3 -3
- package/dist/docs/reference/geometry/Curve3.md +3 -3
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +3 -11
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +4 -4
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +2 -2
- package/dist/docs/reference/geometry/EdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -7
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +9 -18
- package/dist/docs/reference/geometry/FittedTextLayout.md +2 -2
- package/dist/docs/reference/geometry/{Frame3.md → Frame3-type.md} +4 -11
- package/dist/docs/reference/geometry/Frame3Options.md +69 -0
- package/dist/docs/reference/geometry/GeometryError.md +2 -6
- package/dist/docs/reference/geometry/GeometryErrorCode.md +2 -6
- package/dist/docs/reference/geometry/GeometryErrorContext.md +2 -6
- package/dist/docs/reference/geometry/GeometryResolution.md +2 -10
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +3 -11
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +3 -11
- package/dist/docs/reference/geometry/GridPatternOptions.md +7 -9
- package/dist/docs/reference/geometry/ImmutableBuffer-type.md +2 -10
- package/dist/docs/reference/geometry/LineCurve2.md +3 -3
- package/dist/docs/reference/geometry/LineCurve3.md +3 -3
- package/dist/docs/reference/geometry/LinearPatternOptions.md +2 -6
- package/dist/docs/reference/geometry/LoftPlacement.md +13 -21
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +3 -7
- package/dist/docs/reference/geometry/ModelingLimits.md +2 -14
- package/dist/docs/reference/geometry/NumericArray.md +2 -10
- package/dist/docs/reference/geometry/Path2-type.md +153 -12
- package/dist/docs/reference/geometry/Path2Data.md +3 -11
- package/dist/docs/reference/geometry/Path2Input.md +3 -11
- package/dist/docs/reference/geometry/Path3-type.md +153 -12
- package/dist/docs/reference/geometry/Path3Data.md +3 -11
- package/dist/docs/reference/geometry/Path3Input.md +3 -11
- package/dist/docs/reference/geometry/PathFrame.md +3 -3
- package/dist/docs/reference/geometry/PathLocation.md +3 -11
- package/dist/docs/reference/geometry/PathNormalGuide.md +4 -12
- package/dist/docs/reference/geometry/PathOptions.md +3 -7
- package/dist/docs/reference/geometry/PathPatternOptions.md +3 -7
- package/dist/docs/reference/geometry/PathPlacement.md +5 -5
- package/dist/docs/reference/geometry/PathResamplingOptions.md +3 -11
- package/dist/docs/reference/geometry/PathStation.md +87 -0
- package/dist/docs/reference/geometry/PathSubdivisionOptions.md +44 -0
- package/dist/docs/reference/geometry/Pivot2Options.md +3 -11
- package/dist/docs/reference/geometry/Pivot3Options.md +3 -11
- package/dist/docs/reference/geometry/PolygonData.md +4 -8
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +3 -3
- package/dist/docs/reference/geometry/Profile.md +3 -4
- package/dist/docs/reference/geometry/ProfileComponent2.md +3 -7
- package/dist/docs/reference/geometry/ProfileContour2.md +3 -7
- package/dist/docs/reference/geometry/ProfileSpan2.md +3 -7
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +5 -8
- package/dist/docs/reference/geometry/RadialPatternOptions.md +2 -6
- package/dist/docs/reference/geometry/RadialSizing.md +2 -6
- package/dist/docs/reference/geometry/RadialSizingOptions.md +2 -6
- package/dist/docs/reference/geometry/RectangleContourOptions.md +4 -7
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +3 -7
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +3 -7
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +3 -7
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +3 -3
- package/dist/docs/reference/geometry/ResolvedGeometryResolution.md +71 -0
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +2 -2
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/RowLayoutOptions.md +2 -2
- package/dist/docs/reference/geometry/SampleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleHelixOptions.md +3 -3
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve2.md +3 -3
- package/dist/docs/reference/geometry/SampledCurve3.md +3 -3
- package/dist/docs/reference/geometry/SideProfileCurve.md +3 -3
- package/dist/docs/reference/geometry/SideProfilePoint.md +3 -3
- package/dist/docs/reference/geometry/SideProfileSegment.md +3 -3
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +2 -6
- package/dist/docs/reference/geometry/SplineOptions.md +69 -0
- package/dist/docs/reference/geometry/StarContourOptions.md +7 -7
- package/dist/docs/reference/geometry/StrokeCap.md +2 -6
- package/dist/docs/reference/geometry/StrokeJoin.md +2 -6
- package/dist/docs/reference/geometry/StrokeOptions.md +3 -7
- package/dist/docs/reference/geometry/SvgImportOptions.md +4 -4
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +2 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +2 -2
- package/dist/docs/reference/geometry/Transform2-type.md +3 -11
- package/dist/docs/reference/geometry/Transform2Data.md +3 -11
- package/dist/docs/reference/geometry/Transform2Input.md +3 -11
- package/dist/docs/reference/geometry/Transform3-type.md +4 -12
- package/dist/docs/reference/geometry/Transform3Data.md +3 -11
- package/dist/docs/reference/geometry/Transform3Input.md +6 -13
- package/dist/docs/reference/geometry/Vector2-type.md +3 -11
- package/dist/docs/reference/geometry/Vector2Data.md +3 -15
- package/dist/docs/reference/geometry/Vector2Input.md +3 -11
- package/dist/docs/reference/geometry/Vector3-type.md +27 -11
- package/dist/docs/reference/geometry/Vector3Data.md +3 -11
- package/dist/docs/reference/geometry/Vector3Input.md +3 -11
- package/dist/docs/reference/geometry/VectorTextLayout.md +2 -10
- package/dist/docs/reference/geometry/VectorTextMetrics.md +3 -11
- package/dist/docs/reference/geometry/anchor3.md +17 -26
- package/dist/docs/reference/geometry/anchorFrame3.md +6 -6
- package/dist/docs/reference/geometry/attachmentTransform3.md +8 -8
- package/dist/docs/reference/geometry/bounds2.md +6 -8
- package/dist/docs/reference/geometry/bounds3.md +4 -6
- package/dist/docs/reference/geometry/boundsCenter.md +2 -2
- package/dist/docs/reference/geometry/boundsSize.md +2 -2
- package/dist/docs/reference/geometry/boxAnchor3.md +3 -3
- package/dist/docs/reference/geometry/categories/bounds-layout.md +9 -3
- package/dist/docs/reference/geometry/categories/curves-paths.md +24 -13
- package/dist/docs/reference/geometry/categories/immutable-data.md +40 -0
- package/dist/docs/reference/geometry/categories/pattern-placement.md +10 -4
- package/dist/docs/reference/geometry/categories/primitive-options.md +8 -13
- package/dist/docs/reference/geometry/categories/profiles-regions.md +11 -5
- package/dist/docs/reference/geometry/categories/resolution-errors.md +8 -1
- package/dist/docs/reference/geometry/categories/transforms-math.md +20 -51
- package/dist/docs/reference/geometry/categories/vector-import.md +7 -4
- package/dist/docs/reference/geometry/circleContour.md +3 -3
- package/dist/docs/reference/geometry/closeToAxis.md +7 -3
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +9 -6
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +13 -6
- package/dist/docs/reference/geometry/contourContainsPoint.md +7 -3
- package/dist/docs/reference/geometry/cylinderAnchor3.md +5 -5
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +3 -3
- package/dist/docs/reference/geometry/distributeAlongPath.md +16 -11
- package/dist/docs/reference/geometry/ellipseContour.md +3 -3
- package/dist/docs/reference/geometry/fitBounds.md +10 -2
- package/dist/docs/reference/geometry/fitTextLayout.md +5 -5
- package/dist/docs/reference/geometry/frame3.md +66 -0
- package/dist/docs/reference/geometry/gridPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/immutableBuffer.md +5 -7
- package/dist/docs/reference/geometry/isGeometryError.md +2 -6
- package/dist/docs/reference/geometry/layoutRow.md +4 -2
- package/dist/docs/reference/geometry/linearPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/matchProfiles.md +5 -3
- package/dist/docs/reference/geometry/normalizeContour.md +8 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -3
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -3
- package/dist/docs/reference/geometry/path2.md +7 -7
- package/dist/docs/reference/geometry/path3.md +7 -7
- package/dist/docs/reference/geometry/pathPatternTransforms.md +12 -8
- package/dist/docs/reference/geometry/preflightSvgRegion.md +5 -5
- package/dist/docs/reference/geometry/radialPatternTransforms.md +5 -5
- package/dist/docs/reference/geometry/rectangleContour.md +3 -3
- package/dist/docs/reference/geometry/rectangleProfile.md +3 -4
- package/dist/docs/reference/geometry/regionArea.md +3 -3
- package/dist/docs/reference/geometry/regionBounds.md +6 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +3 -3
- package/dist/docs/reference/geometry/resamplePolyline2.md +7 -3
- package/dist/docs/reference/geometry/resamplePolyline3.md +7 -3
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +5 -5
- package/dist/docs/reference/geometry/resolveArcSegments.md +8 -6
- package/dist/docs/reference/geometry/resolveCircularSampling.md +2 -2
- package/dist/docs/reference/geometry/resolveCircularSegments.md +5 -3
- package/dist/docs/reference/geometry/{resolveExtrusionDivisions.md → resolveExtrusionSlices.md} +16 -15
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +5 -3
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +3 -3
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +12 -5
- package/dist/docs/reference/geometry/sampleContour.md +5 -5
- package/dist/docs/reference/geometry/sampleCurve2.md +7 -3
- package/dist/docs/reference/geometry/sampleCurve3.md +7 -3
- package/dist/docs/reference/geometry/sampleHelix.md +3 -3
- package/dist/docs/reference/geometry/sampleSideProfile.md +5 -5
- package/dist/docs/reference/geometry/sampleTextContours.md +3 -3
- package/dist/docs/reference/geometry/signedContourArea.md +5 -3
- package/dist/docs/reference/geometry/spline2.md +68 -0
- package/dist/docs/reference/geometry/spline3.md +62 -0
- package/dist/docs/reference/geometry/starContour.md +3 -3
- package/dist/docs/reference/geometry/strokeRegionData.md +8 -5
- package/dist/docs/reference/geometry/transform2.md +5 -7
- package/dist/docs/reference/geometry/transform3.md +23 -10
- package/dist/docs/reference/geometry/transformRegionData.md +7 -3
- package/dist/docs/reference/geometry/triangulateContour.md +6 -4
- package/dist/docs/reference/geometry/vector2.md +6 -8
- package/dist/docs/reference/geometry/vector3.md +8 -8
- package/dist/docs/reference/geometry.md +13 -18
- package/dist/docs/reference/{geometry → math}/AxisAngleRotation3.md +4 -5
- package/dist/docs/reference/math/IDENTITY_TRANSFORM3.md +20 -0
- package/dist/docs/reference/math/add2.md +38 -0
- package/dist/docs/reference/math/add3.md +46 -0
- package/dist/docs/reference/math/applyTransformDirection3.md +46 -0
- package/dist/docs/reference/math/applyTransformPoint3.md +44 -0
- package/dist/docs/reference/math/categories/tuple-matrix.md +67 -0
- package/dist/docs/reference/math/cross2.md +38 -0
- package/dist/docs/reference/math/cross3.md +44 -0
- package/dist/docs/reference/math/distance2.md +38 -0
- package/dist/docs/reference/math/distance3.md +38 -0
- package/dist/docs/reference/math/dot2.md +38 -0
- package/dist/docs/reference/math/dot3.md +44 -0
- package/dist/docs/reference/math/eulerTransform3.md +43 -0
- package/dist/docs/reference/math/inverseTransform3.md +36 -0
- package/dist/docs/reference/math/length2.md +32 -0
- package/dist/docs/reference/math/length3.md +32 -0
- package/dist/docs/reference/math/lerp2.md +46 -0
- package/dist/docs/reference/math/lerp3.md +46 -0
- package/dist/docs/reference/math/multiplyTransform3.md +46 -0
- package/dist/docs/reference/math/normalize2.md +45 -0
- package/dist/docs/reference/math/normalize3.md +45 -0
- package/dist/docs/reference/math/projectOntoPlane3.md +40 -0
- package/dist/docs/reference/math/rotate2.md +40 -0
- package/dist/docs/reference/math/rotationTransform3.md +56 -0
- package/dist/docs/reference/math/scale2.md +38 -0
- package/dist/docs/reference/math/scale3.md +44 -0
- package/dist/docs/reference/math/scaleTransform3.md +39 -0
- package/dist/docs/reference/math/subtract2.md +38 -0
- package/dist/docs/reference/math/subtract3.md +44 -0
- package/dist/docs/reference/math/transformDeterminant3.md +38 -0
- package/dist/docs/reference/math/translationTransform3.md +36 -0
- package/dist/docs/reference/math/validateRigidTransform3.md +38 -0
- package/dist/docs/reference/math/validateTransform3.md +48 -0
- package/dist/docs/reference/math.md +22 -0
- package/dist/docs/reference/{geometry → mechanical}/AcmeThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/Bevel.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/BevelSize.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ButtressPressureFlankSide.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ButtressThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/ClearanceHoleFit.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CompensatedThreadDiameters.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CustomThreadProfileSpec.md +5 -15
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearMeshKind.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearOutlineOptions.md +5 -10
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionOptions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairMotionReport.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearPairSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/CylindricalGearSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/InternalThreadCutterOptions.md +6 -13
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeBaseSpec.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeDimensions.md +4 -5
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeInterval.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSamplingOptions.md +5 -14
- package/dist/docs/reference/{geometry → mechanical}/KnuckleHingeSpec.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/METRIC_FASTENER_STANDARDS.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricFastenerSize.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricFastenerStandard.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricHexNutDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/MetricSocketCapHeadDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/PRINTABLE_THREAD_FIT_POLICIES.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFit.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/PrintableThreadFitPolicy.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/RackPitchDimensions.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/RackPitchSpec.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/SampledThreadHelices.md +4 -8
- package/dist/docs/reference/{geometry → mechanical}/SquareThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ThreadBevelOptions.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadCircularSegmentsOptions.md +5 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadCompensationOptions.md +4 -5
- package/dist/docs/reference/{geometry → mechanical}/ThreadEndStyle.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadEndTreatmentOptions.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadHandedness.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadHelixOptions.md +5 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInEnvelope.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadLeadInShape.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfile-type.md +5 -17
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfileBaseSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/ThreadProfileSpec.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadRidgeOptions.md +7 -18
- package/dist/docs/reference/{geometry → mechanical}/ThreadRole.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/ThreadSolidOptions.md +8 -15
- package/dist/docs/reference/{geometry → mechanical}/ThreadSolidPreflight.md +3 -11
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutOptions.md +7 -14
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutPreflight.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadedNutShape.md +3 -7
- package/dist/docs/reference/{geometry → mechanical}/ThreadedRodOptions.md +6 -13
- package/dist/docs/reference/{geometry → mechanical}/TrapezoidalThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/TriangularThreadProfileSpec.md +4 -13
- package/dist/docs/reference/{geometry → mechanical}/categories/mechanical.md +8 -2
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadDiameters.md +4 -4
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileAxially.md +12 -6
- package/dist/docs/reference/{geometry → mechanical}/compensateThreadProfileForFaceting.md +13 -3
- package/dist/docs/reference/{geometry → mechanical}/getMetricClearanceHoleDiameter.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/getMetricFastenerStandard.md +3 -3
- package/dist/docs/reference/{geometry → mechanical}/measureInternalCylindricalGearPairMotion.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/minimumCylindricalGearToothCountWithoutUndercut.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/preflightInternalThreadCutter.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/preflightThreadedNut.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/preflightThreadedRod.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGear.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveCylindricalGearPair.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveKnuckleHinge.md +9 -7
- package/dist/docs/reference/{geometry → mechanical}/resolvePrintableThreadFitPolicy.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveRackPitch.md +5 -3
- package/dist/docs/reference/{geometry → mechanical}/resolveThreadCircularSegments.md +7 -5
- package/dist/docs/reference/{geometry → mechanical}/sampleCylindricalGearOutline.md +9 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleInternalCylindricalGearSpaceOutline.md +9 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleRackToothPath.md +10 -8
- package/dist/docs/reference/{geometry → mechanical}/sampleThreadHelices.md +8 -6
- package/dist/docs/reference/{geometry → mechanical}/threadProfile.md +7 -3
- package/dist/docs/reference/mechanical.md +19 -0
- package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +128 -0
- package/dist/docs/reference/{geometry → mesh}/HeightfieldMeshLimits.md +5 -13
- package/dist/docs/reference/{geometry → mesh}/HeightfieldPreflight.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/ImmutableTriangleMesh.md +5 -17
- package/dist/docs/reference/mesh/LoftMeshStation.md +32 -0
- package/dist/docs/reference/mesh/MeshRenderOptions.md +3 -3
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationFallbackReason.md +4 -8
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/PlanarMeshOptimizationResult.md +4 -8
- package/dist/docs/reference/{geometry → mesh}/PlanarPatchQuality.md +4 -12
- package/dist/docs/reference/mesh/RenderMesh.md +19 -19
- package/dist/docs/reference/{geometry → mesh}/SolidMeshValidationOptions.md +4 -12
- package/dist/docs/reference/{geometry → mesh}/TriangleMesh.md +8 -12
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysis.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshAnalysisOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshInput.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshMeasurements.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityOptions.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshQualityReport.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignature.md +4 -9
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureOptions.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshSignatureTolerances.md +3 -7
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshTopologyAnalysis.md +5 -14
- package/dist/docs/reference/{geometry → mesh}/TriangleMeshValidationOptions.md +4 -9
- package/dist/docs/reference/mesh/analyze.md +26 -18
- package/dist/docs/reference/mesh/analyzeQuality.md +12 -12
- package/dist/docs/reference/mesh/bounds.md +5 -6
- package/dist/docs/reference/mesh/categories/operations.md +37 -4
- package/dist/docs/reference/mesh/centroid.md +5 -6
- package/dist/docs/reference/mesh/extrude.md +21 -20
- package/dist/docs/reference/mesh/heightfield.md +8 -8
- package/dist/docs/reference/mesh/immutable.md +7 -5
- package/dist/docs/reference/mesh/join.md +7 -7
- package/dist/docs/reference/mesh/loft.md +19 -18
- package/dist/docs/reference/mesh/optimizePlanarPatches.md +21 -21
- package/dist/docs/reference/mesh/preflightHeightfield.md +8 -8
- package/dist/docs/reference/mesh/preflightThreadSolid.md +22 -25
- package/dist/docs/reference/mesh/render.md +7 -5
- package/dist/docs/reference/mesh/reverse.md +7 -7
- package/dist/docs/reference/mesh/revolve.md +12 -14
- package/dist/docs/reference/mesh/signature.md +12 -12
- package/dist/docs/reference/mesh/sweep.md +96 -25
- package/dist/docs/reference/mesh/threadRidge.md +19 -18
- package/dist/docs/reference/mesh/threadSolid.md +23 -22
- package/dist/docs/reference/mesh/transform.md +8 -9
- package/dist/docs/reference/mesh/validate.md +11 -11
- package/dist/docs/reference/mesh/validateSolid.md +10 -10
- package/dist/docs/reference/mesh.md +8 -2
- package/dist/docs/reference/model/BoxEdge.md +23 -0
- package/dist/docs/reference/model/BoxEdgeSelection.md +27 -0
- package/dist/docs/reference/model/BoxEdgeTreatments.md +27 -0
- package/dist/docs/reference/{geometry → model}/BoxOptions.md +12 -12
- package/dist/docs/reference/model/CircleOptions.md +4 -5
- package/dist/docs/reference/model/CornerCutterOptions.md +93 -0
- package/dist/docs/reference/model/CornerCutterTreatment.md +53 -0
- package/dist/docs/reference/model/{HoleCutterOverrun.md → CutterOverrun.md} +8 -7
- package/dist/docs/reference/model/CylinderOptions.md +64 -0
- package/dist/docs/reference/model/DiagnosticOptions.md +2 -2
- package/dist/docs/reference/model/EdgeCutterOptions.md +129 -0
- package/dist/docs/reference/model/EllipseOptions.md +4 -5
- package/dist/docs/reference/model/EndTreatments.md +43 -0
- package/dist/docs/reference/model/ExtrudeOptions.md +153 -0
- package/dist/docs/reference/model/GenerateCallback.md +2 -2
- package/dist/docs/reference/model/GenerateContext.md +27 -3
- package/dist/docs/reference/model/GenerationDiagnostic.md +2 -2
- package/dist/docs/reference/model/GenerationError.md +2 -2
- package/dist/docs/reference/{geometry → model}/HeightfieldOptions.md +5 -23
- package/dist/docs/reference/model/HoleCutterOpening.md +27 -0
- package/dist/docs/reference/model/HoleCutterOptions.md +9 -22
- package/dist/docs/reference/model/HoleCutterRecess.md +5 -4
- package/dist/docs/reference/model/HullOptions.md +2 -3
- package/dist/docs/reference/model/ImmutableValue.md +2 -2
- package/dist/docs/reference/model/ImplicitOptions.md +3 -9
- package/dist/docs/reference/model/JoinOptions.md +2 -5
- package/dist/docs/reference/model/JoinTransition.md +2 -2
- package/dist/docs/reference/model/KnuckleHinge-type.md +2 -3
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +2 -2
- package/dist/docs/reference/model/KnuckleHingeOptions.md +3 -5
- package/dist/docs/reference/model/KnuckleHingeWeb.md +2 -2
- package/dist/docs/reference/{geometry → model}/LoftCorrespondence.md +8 -11
- package/dist/docs/reference/{geometry → model}/LoftOptions.md +11 -16
- package/dist/docs/reference/model/LoftStation.md +4 -5
- package/dist/docs/reference/model/Memo.md +2 -2
- package/dist/docs/reference/model/ModelProgram.md +2 -2
- package/dist/docs/reference/model/PartDeclaration.md +4 -5
- package/dist/docs/reference/model/PartGeometry.md +3 -5
- package/dist/docs/reference/model/PartOptions.md +4 -5
- package/dist/docs/reference/model/PatternSource.md +4 -4
- package/dist/docs/reference/model/PlaneOptions.md +3 -7
- package/dist/docs/reference/model/PolygonOptions.md +2 -7
- package/dist/docs/reference/model/PrimitiveAttachment.md +50 -0
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +111 -0
- package/dist/docs/reference/model/RectangleOptions.md +21 -26
- package/dist/docs/reference/model/RegularPolygonOptions.md +4 -37
- package/dist/docs/reference/{geometry → model}/RevolveOptions.md +15 -24
- package/dist/docs/reference/model/Section.md +115 -53
- package/dist/docs/reference/model/SectionHullOptions.md +2 -3
- package/dist/docs/reference/model/SectionInspection.md +2 -6
- package/dist/docs/reference/model/SectionOffsetJoin.md +2 -2
- package/dist/docs/reference/model/SectionOffsetOptions.md +2 -3
- package/dist/docs/reference/model/Solid.md +24 -12
- package/dist/docs/reference/model/SolidInspection.md +2 -6
- package/dist/docs/reference/model/SolidSegmentHit.md +2 -6
- package/dist/docs/reference/model/SphereOptions.md +27 -0
- package/dist/docs/reference/model/StarOptions.md +21 -23
- package/dist/docs/reference/model/SvgOrigin.md +2 -2
- package/dist/docs/reference/model/SvgPathSectionOptions.md +3 -5
- package/dist/docs/reference/model/SvgSectionOptions.md +3 -6
- package/dist/docs/reference/model/SweepOptions.md +109 -0
- package/dist/docs/reference/model/SweepOrientation.md +119 -0
- package/dist/docs/reference/model/SweepTransformOptions.md +105 -0
- package/dist/docs/reference/model/TextSectionOptions.md +2 -7
- package/dist/docs/reference/{geometry → model}/TorusOptions.md +11 -10
- package/dist/docs/reference/model/TubeOptions.md +84 -0
- package/dist/docs/reference/model/box.md +11 -10
- package/dist/docs/reference/model/categories/boolean-operations.md +9 -3
- package/dist/docs/reference/model/categories/bounded-surfaces.md +13 -1
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +26 -7
- package/dist/docs/reference/model/categories/generation.md +11 -3
- package/dist/docs/reference/model/categories/hinges.md +7 -1
- package/dist/docs/reference/model/categories/mesh-inspection.md +7 -1
- package/dist/docs/reference/model/categories/primitives.md +34 -6
- package/dist/docs/reference/model/categories/sections.md +8 -2
- package/dist/docs/reference/model/categories/threads.md +8 -5
- package/dist/docs/reference/model/categories/transforms-placement.md +15 -10
- package/dist/docs/reference/model/circle.md +7 -3
- package/dist/docs/reference/model/cornerCutter.md +88 -0
- package/dist/docs/reference/model/cylinder.md +6 -5
- package/dist/docs/reference/model/edgeCutter.md +91 -0
- package/dist/docs/reference/model/ellipse.md +7 -3
- package/dist/docs/reference/model/extrude.md +29 -23
- package/dist/docs/reference/model/generate.md +4 -2
- package/dist/docs/reference/model/gridPattern.md +11 -4
- package/dist/docs/reference/model/heightfield.md +5 -5
- package/dist/docs/reference/model/holeCutter.md +26 -12
- package/dist/docs/reference/model/hull.md +2 -2
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/internalThreadCutter.md +32 -21
- package/dist/docs/reference/model/intersect.md +7 -3
- package/dist/docs/reference/model/join.md +6 -2
- package/dist/docs/reference/model/knuckleHinge.md +2 -3
- package/dist/docs/reference/model/linearPattern.md +11 -4
- package/dist/docs/reference/model/loft.md +28 -24
- package/dist/docs/reference/model/minkowskiSum.md +3 -3
- package/dist/docs/reference/model/pathPattern.md +17 -8
- package/dist/docs/reference/model/polygon.md +8 -3
- package/dist/docs/reference/model/radialPattern.md +11 -4
- package/dist/docs/reference/model/rectangle.md +11 -7
- package/dist/docs/reference/model/regularPolygon.md +7 -3
- package/dist/docs/reference/model/revolve.md +18 -12
- package/dist/docs/reference/model/solidFromMesh.md +10 -6
- package/dist/docs/reference/model/sphere.md +7 -6
- package/dist/docs/reference/model/star.md +11 -7
- package/dist/docs/reference/model/stroke.md +12 -8
- package/dist/docs/reference/model/svgPathSection.md +10 -4
- package/dist/docs/reference/model/svgSection.md +10 -4
- package/dist/docs/reference/model/sweep.md +102 -25
- package/dist/docs/reference/model/textSection.md +7 -3
- package/dist/docs/reference/model/threadRidge.md +16 -17
- package/dist/docs/reference/model/threadedNut.md +25 -22
- package/dist/docs/reference/model/threadedRod.md +21 -18
- package/dist/docs/reference/model/torus.md +13 -12
- package/dist/docs/reference/model/tube.md +6 -5
- package/dist/docs/reference/model/union.md +7 -3
- package/dist/docs/reference/model.md +10 -5
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +2 -2
- package/dist/docs/reference/text/VectorFont.md +38 -34
- package/dist/docs/reference/text/VectorFontOptions.md +2 -2
- package/dist/docs/reference/{geometry → text}/VectorTextArcBaseline.md +2 -11
- package/dist/docs/reference/{geometry → text}/VectorTextLayoutOptions.md +3 -11
- package/dist/docs/reference/{geometry → text}/VectorTextOptions.md +2 -10
- package/dist/docs/reference/text/categories/font-preparation.md +10 -1
- package/dist/docs/reference/text/prepareVectorFont.md +4 -2
- package/dist/docs/reference/text.md +7 -1
- package/dist/engine/execution.js +5 -3
- package/dist/engine/finalization.js +5 -5
- package/dist/engine/index.js +9 -4
- package/dist/engine/native/adapter.js +1 -1
- package/dist/engine/native/construction-mesh.js +15 -5
- package/dist/engine/native/context.js +10 -7
- package/dist/engine/native/index.js +1 -1
- package/dist/engine/native/material-components.js +2 -2
- package/dist/engine/native/mesh-observation.js +1 -1
- package/dist/engine/native/regions.js +44 -24
- package/dist/engine/native/scoped-primitives.js +3 -3
- package/dist/engine/native/scoped-threads.js +1 -13
- package/dist/engine/native/threads.js +2 -2
- package/dist/engine/native/transforms.js +2 -2
- package/dist/engine/operations/construction.js +77 -27
- package/dist/engine/operations/context.js +13 -6
- package/dist/engine/operations/cutters.js +112 -0
- package/dist/engine/operations/environment.js +2 -2
- package/dist/engine/operations/extrusion-finishing.js +42 -16
- package/dist/engine/operations/hole-cutter.js +125 -114
- package/dist/engine/operations/join-collar-profile.js +19 -19
- package/dist/engine/operations/join.js +86 -73
- package/dist/engine/operations/knuckle-hinge.js +25 -20
- package/dist/engine/operations/loft.js +9 -16
- package/dist/engine/operations/mechanical.js +4 -15
- package/dist/engine/operations/primitives/anchors.js +23 -19
- package/dist/engine/operations/primitives/construction.js +38 -12
- package/dist/engine/operations/primitives/correspondence.js +2 -2
- package/dist/engine/operations/primitives/profile-mesh.js +41 -80
- package/dist/engine/operations/primitives/profiles.js +5 -5
- package/dist/engine/operations/sections.js +8 -8
- package/dist/engine/operations/transforms.js +19 -39
- package/dist/engine/placement.js +3 -3
- package/dist/engine/recipe-realization.js +86 -30
- package/dist/engine/session/declarations.js +98 -0
- package/dist/engine/session/dependencies.js +81 -28
- package/dist/engine/session/graph.js +39 -137
- package/dist/engine/session/parameters.js +78 -0
- package/dist/engine/session/session.js +2 -2
- package/dist/engine/session/snapshot-cache.js +2 -2
- package/dist/engine/shape-anchors.js +13 -6
- package/dist/export/3mf.js +9 -2
- package/dist/export/capture.js +10 -6
- package/dist/export/glb.js +7 -2
- package/dist/export/stl.js +21 -6
- package/dist/geometry/{bounds.js → bounds/operations.js} +3 -1
- package/dist/geometry/{bounds-value.js → bounds/value.js} +20 -16
- package/dist/geometry/curves/evaluation.js +5 -6
- package/dist/geometry/curves/sampling.js +30 -6
- package/dist/geometry/{extrusion.js → extrusion/controls.js} +58 -35
- package/dist/geometry/extrusion/mesh.js +92 -0
- package/dist/geometry/extrusion/stations.js +35 -0
- package/dist/geometry/extrusion/twisted-chamfer.js +265 -0
- package/dist/geometry/immutable-buffer.js +7 -1
- package/dist/geometry/index.js +24 -32
- package/dist/geometry/{model-limits.js → limits.js} +1 -1
- package/dist/geometry/loft/{loft-correspondence.js → correspondence.js} +31 -20
- package/dist/geometry/loft/{loft-geometry.js → geometry.js} +15 -17
- package/dist/geometry/loft/mesh.js +53 -0
- package/dist/geometry/loft/{loft-options.js → options.js} +13 -11
- package/dist/geometry/loft/{loft-simple-mesh.js → simple-mesh.js} +26 -17
- package/dist/geometry/math/interpolation.js +9 -0
- package/dist/geometry/math/vector-value.js +12 -3
- package/dist/geometry/math/vector2.js +18 -5
- package/dist/geometry/math/vector3.js +28 -5
- package/dist/geometry/math-api.js +4 -0
- package/dist/geometry/mechanical/gear-motion.js +7 -5
- package/dist/geometry/mechanical/gears.js +21 -4
- package/dist/geometry/mechanical/knuckle-hinge.js +7 -5
- package/dist/geometry/mechanical/threads/fit.js +8 -2
- package/dist/geometry/mechanical/threads/helices.js +4 -2
- package/dist/geometry/mechanical/threads/mesh-plan.js +4 -2
- package/dist/geometry/mechanical/threads/mesh.js +12 -9
- package/dist/geometry/mechanical/threads/profiles.js +18 -4
- package/dist/geometry/mechanical/threads/solids.js +11 -2
- package/dist/geometry/mechanical-api.js +10 -0
- package/dist/geometry/mesh/{mesh-centroid.js → centroid.js} +2 -1
- package/dist/geometry/{heightfield.js → mesh/heightfield.js} +9 -5
- package/dist/geometry/{join-geometry.js → mesh/join-layers.js} +53 -59
- package/dist/geometry/mesh/{mesh.js → operations.js} +11 -18
- package/dist/geometry/mesh/{mesh-planar.js → planar.js} +8 -18
- package/dist/geometry/mesh/{mesh-quality.js → quality.js} +10 -42
- package/dist/geometry/mesh/{mesh-render.js → render-buffers.js} +22 -7
- package/dist/geometry/mesh/{mesh-signature.js → signature.js} +1 -1
- package/dist/geometry/mesh/{mesh-solid-intersections.js → solid-intersections.js} +2 -0
- package/dist/geometry/mesh/{mesh-solid.js → solid.js} +4 -4
- package/dist/geometry/mesh/triangle-quality.js +42 -0
- package/dist/geometry/mesh/winding.js +11 -0
- package/dist/geometry/{numeric.js → mesh/write-vertex.js} +1 -1
- package/dist/geometry/mesh-api.js +12 -11
- package/dist/geometry/paths/distribution.js +43 -0
- package/dist/geometry/paths/editing.js +76 -0
- package/dist/geometry/paths/frames.js +16 -11
- package/dist/geometry/paths/helix.js +1 -1
- package/dist/geometry/paths/resampling.js +46 -61
- package/dist/geometry/paths/{planar.js → rounding.js} +8 -67
- package/dist/geometry/paths/spline.js +116 -0
- package/dist/geometry/paths/traversal.js +107 -0
- package/dist/geometry/paths/{path-value.js → value.js} +97 -18
- package/dist/geometry/patterns/placements.js +20 -29
- package/dist/geometry/{patterns.js → patterns/transforms.js} +11 -7
- package/dist/geometry/primitives/cutters.js +70 -0
- package/dist/geometry/{cylinder.js → primitives/cylinder.js} +4 -4
- package/dist/geometry/{edge-finishing.js → primitives/edges.js} +5 -5
- package/dist/geometry/{primitive-resolvers.js → primitives/resolvers.js} +9 -9
- package/dist/geometry/primitives/sampling.js +41 -0
- package/dist/geometry/profiles/contour.js +19 -7
- package/dist/geometry/profiles/{match-profiles.js → matching.js} +9 -6
- package/dist/geometry/profiles/primitives/circle.js +1 -1
- package/dist/geometry/profiles/primitives/ellipse.js +2 -2
- package/dist/geometry/profiles/primitives/rectangle.js +8 -8
- package/dist/geometry/profiles/primitives/star.js +1 -1
- package/dist/geometry/profiles/side-profile.js +8 -5
- package/dist/geometry/profiles/validation.js +1 -1
- package/dist/geometry/{polygon-clipping.js → regions/clipping.js} +1 -1
- package/dist/geometry/{convex-offset.js → regions/convex-offset.js} +1 -1
- package/dist/geometry/{region-offset.js → regions/offset.js} +7 -5
- package/dist/geometry/{regions.js → regions/operations.js} +59 -22
- package/dist/geometry/{stroke-path.js → regions/stroke.js} +46 -20
- package/dist/geometry/{loft/loft-triangulation.js → regions/triangulation.js} +35 -2
- package/dist/geometry/revolve/{revolve-mesh.js → mesh.js} +9 -10
- package/dist/geometry/{circular-sampling.js → sampling/circular.js} +3 -3
- package/dist/geometry/{sampling-limits.js → sampling/limits.js} +6 -2
- package/dist/geometry/{resolution.js → sampling/resolution.js} +15 -14
- package/dist/geometry/svg/fill.js +4 -3
- package/dist/geometry/svg/import.js +47 -64
- package/dist/geometry/svg/path.js +3 -3
- package/dist/geometry/sweep/closed.js +55 -0
- package/dist/geometry/sweep/mesh.js +30 -0
- package/dist/geometry/{sweeps/sweep-open.js → sweep/open.js} +9 -24
- package/dist/geometry/{sweeps → sweep}/orientation.js +14 -11
- package/dist/geometry/sweep/seam.js +30 -0
- package/dist/geometry/{sweeps → sweep}/stations.js +75 -10
- package/dist/geometry/sweep/transforms.js +30 -0
- package/dist/geometry/{sweeps → sweep}/validation.js +4 -4
- package/dist/geometry/{text-contours.js → text/contours.js} +3 -3
- package/dist/geometry/{text-fitting.js → text/fitting.js} +4 -3
- package/dist/geometry/text/layout.js +1 -0
- package/dist/geometry/{transform3.js → transforms/affine3.js} +31 -46
- package/dist/geometry/{anchors.js → transforms/anchors.js} +43 -24
- package/dist/geometry/{transform-geometry.js → transforms/apply.js} +8 -5
- package/dist/geometry/{transform2.js → transforms/dimensions.js} +23 -19
- package/dist/geometry/transforms/frame.js +64 -0
- package/dist/geometry/{transform-matrix.js → transforms/matrix-input.js} +8 -1
- package/dist/geometry/{transform-value.js → transforms/value.js} +29 -11
- package/dist/index.js +3 -9
- package/dist/model/cutters.js +1 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +2 -0
- package/dist/model/immutable-generation-data.js +2 -0
- package/dist/model/operations.js +130 -94
- package/dist/model/recipe-declaration.js +5 -7
- package/dist/text/index.js +3 -0
- package/dist/text/vector-text-layout.js +1 -0
- package/package.json +15 -17
- package/dist/api/export-3mf.d.ts +0 -2
- package/dist/api/export-glb.d.ts +0 -2
- package/dist/api/export-stl.d.ts +0 -2
- package/dist/docs/reference/geometry/BoxEdge.md +0 -17
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +0 -24
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +0 -25
- package/dist/docs/reference/geometry/CylinderOptions.md +0 -63
- package/dist/docs/reference/geometry/EndTreatments.md +0 -44
- package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +0 -144
- package/dist/docs/reference/geometry/ExtrudeOptions.md +0 -156
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +0 -25
- package/dist/docs/reference/geometry/LoftMeshStation.md +0 -41
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +0 -39
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +0 -114
- package/dist/docs/reference/geometry/SphereOptions.md +0 -25
- package/dist/docs/reference/geometry/SweepOptions.md +0 -127
- package/dist/docs/reference/geometry/SweepOrientation.md +0 -127
- package/dist/docs/reference/geometry/TubeOptions.md +0 -72
- package/dist/docs/reference/geometry/add2.md +0 -43
- package/dist/docs/reference/geometry/add3.md +0 -49
- package/dist/docs/reference/geometry/applyTransformDirection3.md +0 -52
- package/dist/docs/reference/geometry/applyTransformPoint3.md +0 -50
- package/dist/docs/reference/geometry/categories/meshes.md +0 -68
- package/dist/docs/reference/geometry/composeTransform3.md +0 -51
- package/dist/docs/reference/geometry/cross2.md +0 -43
- package/dist/docs/reference/geometry/cross3.md +0 -49
- package/dist/docs/reference/geometry/distance2.md +0 -43
- package/dist/docs/reference/geometry/distance3.md +0 -43
- package/dist/docs/reference/geometry/dot2.md +0 -43
- package/dist/docs/reference/geometry/dot3.md +0 -49
- package/dist/docs/reference/geometry/eulerTransform3.md +0 -49
- package/dist/docs/reference/geometry/frameTransform3.md +0 -55
- package/dist/docs/reference/geometry/inverseTransform3.md +0 -41
- package/dist/docs/reference/geometry/length2.md +0 -37
- package/dist/docs/reference/geometry/length3.md +0 -37
- package/dist/docs/reference/geometry/lerp2.md +0 -49
- package/dist/docs/reference/geometry/lerp3.md +0 -49
- package/dist/docs/reference/geometry/normalize2.md +0 -46
- package/dist/docs/reference/geometry/normalize3.md +0 -46
- package/dist/docs/reference/geometry/projectOntoPlane3.md +0 -43
- package/dist/docs/reference/geometry/rotate2.md +0 -43
- package/dist/docs/reference/geometry/rotationTransform3.md +0 -60
- package/dist/docs/reference/geometry/scale2.md +0 -43
- package/dist/docs/reference/geometry/scale3.md +0 -49
- package/dist/docs/reference/geometry/scaleTransform3.md +0 -45
- package/dist/docs/reference/geometry/subtract2.md +0 -43
- package/dist/docs/reference/geometry/subtract3.md +0 -49
- package/dist/docs/reference/geometry/transformDeterminant3.md +0 -43
- package/dist/docs/reference/geometry/translationTransform3.md +0 -42
- package/dist/docs/reference/geometry/validateRigidTransform3.md +0 -41
- package/dist/docs/reference/geometry/validateTransform3.md +0 -54
- package/dist/docs/reference/model/Profile.md +0 -30
- package/dist/docs/reference/model/categories/explicit-profiles.md +0 -21
- package/dist/docs/reference/model/matchProfiles.md +0 -48
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +0 -93
- package/dist/docs/reference/model/preflightThreadedNut.md +0 -109
- package/dist/docs/reference/model/preflightThreadedRod.md +0 -93
- package/dist/engine/operations/patterns.js +0 -47
- package/dist/geometry/loft/loft.js +0 -105
- package/dist/geometry/mechanical/index.js +0 -14
- package/dist/geometry/primitive-resolution.js +0 -20
- package/dist/geometry/svg/index.js +0 -1
- package/dist/geometry/sweeps/options.js +0 -29
- package/dist/geometry/sweeps/sweep-closed.js +0 -96
- package/dist/geometry/sweeps/sweep-mesh.js +0 -32
- /package/dist/geometry/mechanical/{standards.js → fastener-standards.js} +0 -0
- /package/dist/geometry/mesh/{mesh-edge-table.js → edge-table.js} +0 -0
- /package/dist/geometry/mesh/{mesh-types.js → types.js} +0 -0
- /package/dist/geometry/mesh/{mesh-view-cache.js → view-cache.js} +0 -0
- /package/dist/geometry/{primitive-options.js → primitives/options.js} +0 -0
- /package/dist/geometry/{text-layout.js → sweep/options.js} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { anchor3, anchorFrame3 } from "../../geometry/anchors.js";
|
|
2
1
|
import { GeometryError } from "../../geometry/errors.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { planRegionOffsets } from "../../geometry/
|
|
7
|
-
import { contourContainsPoint } from "../../geometry/regions.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
2
|
+
import { assertMeshAllocationWithinLimits } from "../../geometry/limits.js";
|
|
3
|
+
import { clipJoinPolygon, createJoinPolygonIndex, expandJoinPolygon, inJoinPolygon, intersectJoinPolygons, joinArea, joinHeight, JoinWork, prepareJoinLayer, subtractJoinPolygon, } from "../../geometry/mesh/join-layers.js";
|
|
4
|
+
import { validateSolidMesh } from "../../geometry/mesh/solid.js";
|
|
5
|
+
import { planRegionOffsets } from "../../geometry/regions/offset.js";
|
|
6
|
+
import { contourContainsPoint } from "../../geometry/regions/operations.js";
|
|
7
|
+
import { assertSamplingCount } from "../../geometry/sampling/limits.js";
|
|
8
|
+
import { resolveGeometryResolution } from "../../geometry/sampling/resolution.js";
|
|
10
9
|
import { resolveGeometryTolerance } from "../../geometry/tolerance.js";
|
|
10
|
+
import { anchor3, anchorFrame3 } from "../../geometry/transforms/anchors.js";
|
|
11
11
|
import { nativeConstructionMesh } from "../native/construction-mesh.js";
|
|
12
12
|
import { ownScopedManifoldValue } from "../native/context.js";
|
|
13
13
|
import { observeNativeMesh } from "../native/mesh-observation.js";
|
|
@@ -16,12 +16,18 @@ import { nativeCollarProfile } from "./join-collar-profile.js";
|
|
|
16
16
|
const fail = (message, phase) => {
|
|
17
17
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "join", details: { phase } });
|
|
18
18
|
};
|
|
19
|
+
// Keep these kernels local to isolate V8's array-type feedback from other modeling operations.
|
|
20
|
+
// Shared helpers see more array representations, which can slow hot loops even when inlined.
|
|
19
21
|
const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
20
|
-
const
|
|
22
|
+
const profileContours = (profile) => profile.components.flatMap((component) => [
|
|
21
23
|
component.outer.points,
|
|
22
24
|
...component.holes.map((hole) => hole.points),
|
|
23
25
|
]);
|
|
24
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Builds one connection from authoritative native operands. Proves support coverage, material,
|
|
28
|
+
* and the constant-section collar before constructing the transition. Only the finished collar
|
|
29
|
+
* is transformed back and fused with the unchanged original operands.
|
|
30
|
+
*/
|
|
25
31
|
export function createJoinOperation(environment) {
|
|
26
32
|
return (base, feature, options) => {
|
|
27
33
|
const { module, scope } = environment;
|
|
@@ -70,9 +76,21 @@ export function createJoinOperation(environment) {
|
|
|
70
76
|
: options.source;
|
|
71
77
|
if (typeof supplied !== "object" || supplied === null)
|
|
72
78
|
fail("Join source must name a feature anchor or supply an Anchor3.", "source");
|
|
73
|
-
const sourceAnchor = anchor3(
|
|
79
|
+
const sourceAnchor = anchor3({
|
|
80
|
+
position: supplied.position,
|
|
81
|
+
direction: supplied.direction,
|
|
82
|
+
up: supplied.up,
|
|
83
|
+
});
|
|
74
84
|
// The root points out of the feature; chart Z points into its unchanged straight collar.
|
|
75
|
-
const frame = anchorFrame3(anchor3(
|
|
85
|
+
const frame = anchorFrame3(anchor3({
|
|
86
|
+
position: sourceAnchor.position,
|
|
87
|
+
direction: [
|
|
88
|
+
-sourceAnchor.direction[0],
|
|
89
|
+
-sourceAnchor.direction[1],
|
|
90
|
+
-sourceAnchor.direction[2],
|
|
91
|
+
],
|
|
92
|
+
up: sourceAnchor.up,
|
|
93
|
+
}));
|
|
76
94
|
const { xAxis: x, yAxis: y, zAxis: z, origin: o } = frame;
|
|
77
95
|
const forward = [
|
|
78
96
|
x[0],
|
|
@@ -134,11 +152,11 @@ export function createJoinOperation(environment) {
|
|
|
134
152
|
const closingInset = epsilon * 8;
|
|
135
153
|
const offset = planRegionOffsets(source, [-width, closingInset], "join", limits);
|
|
136
154
|
work.use(offset.workCount);
|
|
137
|
-
const
|
|
155
|
+
const crossSectionFromContours = (contours) => own(contours.length === 0
|
|
138
156
|
? sourceSection.subtract(sourceSection)
|
|
139
|
-
: new module.CrossSection(
|
|
157
|
+
: new module.CrossSection(contours.map((contour) => contour.map((p) => [p[0], p[1]])), "NonZero"));
|
|
140
158
|
const expandedProfile = offset.profileAt(-width);
|
|
141
|
-
const footprint =
|
|
159
|
+
const footprint = crossSectionFromContours(profileContours(expandedProfile));
|
|
142
160
|
const triangles = [];
|
|
143
161
|
const canonicalPlanes = [];
|
|
144
162
|
const chartTolerance = resolveGeometryTolerance(scale);
|
|
@@ -174,12 +192,12 @@ export function createJoinOperation(environment) {
|
|
|
174
192
|
polygon = clipJoinPolygon(polygon, [-plane[0], -plane[1], maxZ - plane[2]]);
|
|
175
193
|
if (polygon.length < 3 || Math.abs(joinArea(polygon)) <= meshEpsilon ** 2)
|
|
176
194
|
continue;
|
|
177
|
-
const clipped = own(
|
|
195
|
+
const clipped = own(crossSectionFromContours([polygon]).intersect(footprint));
|
|
178
196
|
if (clipped.isEmpty())
|
|
179
197
|
continue;
|
|
180
198
|
for (const point of points)
|
|
181
199
|
chartArithmeticScale = Math.max(chartArithmeticScale, ...point.map(Math.abs));
|
|
182
|
-
//
|
|
200
|
+
// Float64 arithmetic can give coplanar tessellation triangles slightly different equations.
|
|
183
201
|
// Match dimensionless unit normals and actual height predictions, never encoded face IDs.
|
|
184
202
|
const priorPlane = canonicalPlanes.find((candidate) => {
|
|
185
203
|
work.use();
|
|
@@ -196,9 +214,9 @@ export function createJoinOperation(environment) {
|
|
|
196
214
|
}
|
|
197
215
|
// Convex components need one exact clip, not arbitrary triangulation seams.
|
|
198
216
|
// Inspect the actual clipping coordinates; holes and concavity retain their full partition.
|
|
199
|
-
const convexPartition = (
|
|
200
|
-
const outer =
|
|
201
|
-
const convex =
|
|
217
|
+
const convexPartition = (contours) => {
|
|
218
|
+
const outer = contours[0];
|
|
219
|
+
const convex = contours.length === 1 &&
|
|
202
220
|
outer.length >= 3 &&
|
|
203
221
|
joinArea(outer) > 0 &&
|
|
204
222
|
outer.every((point, i) => {
|
|
@@ -210,12 +228,15 @@ export function createJoinOperation(environment) {
|
|
|
210
228
|
});
|
|
211
229
|
if (convex)
|
|
212
230
|
return [outer];
|
|
213
|
-
const vertices =
|
|
231
|
+
const vertices = contours.flat();
|
|
214
232
|
return module
|
|
215
|
-
.triangulate(
|
|
233
|
+
.triangulate(contours.map((contour) => contour.map((p) => [p[0], p[1]])), 0, false)
|
|
216
234
|
.map((ids) => ids.map((id) => vertices[id]));
|
|
217
235
|
};
|
|
218
|
-
const footprintCells = expandedProfile.components.flatMap((component) => convexPartition(
|
|
236
|
+
const footprintCells = expandedProfile.components.flatMap((component) => convexPartition(crossSectionFromContours([
|
|
237
|
+
component.outer.points,
|
|
238
|
+
...component.holes.map((hole) => hole.points),
|
|
239
|
+
]).toPolygons()));
|
|
219
240
|
const usable = (polygon) => polygon.length >= 3 && Math.abs(joinArea(polygon)) > meshEpsilon ** 2;
|
|
220
241
|
const cells = [];
|
|
221
242
|
// Remove every nearer exit over its complete projected overlap, rather than probing a few rays.
|
|
@@ -254,21 +275,21 @@ export function createJoinOperation(environment) {
|
|
|
254
275
|
// Bound each affine proof cell's extension by epsilon/2 in Euclidean distance.
|
|
255
276
|
// The native union must cover the complete footprint; every extended part is
|
|
256
277
|
// included in the material witness below, so a real slit cannot be waived.
|
|
257
|
-
const
|
|
278
|
+
const proofSections = cells.map((cell) => {
|
|
258
279
|
work.use(cell.polygon.length);
|
|
259
280
|
const expanded = expandJoinPolygon(cell.polygon, epsilon / (2 * Math.SQRT2), work);
|
|
260
|
-
return
|
|
281
|
+
return crossSectionFromContours([expanded]);
|
|
261
282
|
});
|
|
262
|
-
const proofPoints =
|
|
283
|
+
const proofPoints = proofSections.reduce((count, section) => count + section.numVert(), 0);
|
|
263
284
|
assertMeshAllocationWithinLimits(proofPoints * 2, proofPoints * 4, proofPoints * 96, "join", limits);
|
|
264
|
-
const proofCoverage = own(module.CrossSection.union(
|
|
285
|
+
const proofCoverage = own(module.CrossSection.union(proofSections));
|
|
265
286
|
if (!own(footprint.subtract(proofCoverage)).isEmpty())
|
|
266
287
|
fail("The entire transition footprint needs a regular outward support patch after the source datum.", "support");
|
|
267
|
-
let maximumSlope = 0,
|
|
288
|
+
let maximumSlope = 0, highestSupport = -Infinity;
|
|
268
289
|
for (const cell of cells) {
|
|
269
290
|
maximumSlope = Math.max(maximumSlope, Math.hypot(cell.plane[0], cell.plane[1]));
|
|
270
291
|
for (const point of cell.polygon) {
|
|
271
|
-
|
|
292
|
+
highestSupport = Math.max(highestSupport, joinHeight(cell.plane, point));
|
|
272
293
|
}
|
|
273
294
|
}
|
|
274
295
|
allowance *= 1 + maximumSlope;
|
|
@@ -286,14 +307,18 @@ export function createJoinOperation(environment) {
|
|
|
286
307
|
Math.abs(joinHeight(cell.plane, point) - joinHeight(other.plane, point)) > allowance)
|
|
287
308
|
fail("Support patch must be continuous; height jumps and branch changes are unsupported.", "support");
|
|
288
309
|
}
|
|
289
|
-
const
|
|
290
|
-
if (
|
|
310
|
+
const collarTop = highestSupport + height + allowance;
|
|
311
|
+
if (collarTop > maxZ + epsilon)
|
|
291
312
|
fail("Feature needs a longer constant-section collar above the support patch.", "collar");
|
|
292
|
-
const proofDomain = own(module.Manifold.extrude(footprint,
|
|
313
|
+
const proofDomain = own(module.Manifold.extrude(footprint, collarTop + allowance * 3).translate([
|
|
314
|
+
0,
|
|
315
|
+
0,
|
|
316
|
+
-allowance * 2,
|
|
317
|
+
]));
|
|
293
318
|
const toNative = (mesh) => nativeConstructionMesh(scope, mesh, limits, "join");
|
|
294
319
|
const terrain = (top, bottom) => {
|
|
295
320
|
const pieces = cells.flatMap((cell, index) => {
|
|
296
|
-
const area =
|
|
321
|
+
const area = proofSections[index];
|
|
297
322
|
if (area.isEmpty())
|
|
298
323
|
return [];
|
|
299
324
|
const guard = epsilon * (2 + Math.hypot(cell.plane[0], cell.plane[1]) / 2);
|
|
@@ -314,33 +339,33 @@ export function createJoinOperation(environment) {
|
|
|
314
339
|
const witness = terrain((value, guard) => value - guard, (value, guard) => value - guard - epsilon * 6);
|
|
315
340
|
if (!own(witness.subtract(support)).isEmpty())
|
|
316
341
|
fail("Support material is missing or too thin beneath the complete curved footprint.", "support");
|
|
317
|
-
const overhead = terrain(() =>
|
|
342
|
+
const overhead = terrain(() => collarTop + allowance, (value, guard) => value + guard);
|
|
318
343
|
if (!own(overhead.intersect(support)).isEmpty())
|
|
319
344
|
fail("Support reenters the connection band above the selected patch.", "support");
|
|
320
345
|
// Guard both directions over the full collar volume: matching two cross-sections is insufficient.
|
|
321
|
-
const domain = own(module.Manifold.extrude(footprint,
|
|
346
|
+
const domain = own(module.Manifold.extrude(footprint, collarTop - epsilon * 2).translate([0, 0, epsilon * 2]));
|
|
322
347
|
const innerSection = own(sourceSection.offset(-epsilon * 2, "Miter"));
|
|
323
348
|
const outerSection = own(sourceSection.offset(epsilon * 2, "Miter"));
|
|
324
|
-
const expected = own(module.Manifold.extrude(innerSection,
|
|
325
|
-
const outer = own(module.Manifold.extrude(outerSection,
|
|
349
|
+
const expected = own(module.Manifold.extrude(innerSection, collarTop - epsilon * 2).translate([0, 0, epsilon * 2]));
|
|
350
|
+
const outer = own(module.Manifold.extrude(outerSection, collarTop - epsilon * 2).translate([0, 0, epsilon * 2]));
|
|
326
351
|
const actual = own(neck.intersect(domain));
|
|
327
352
|
if (!own(expected.subtract(actual)).isEmpty() || !own(actual.subtract(outer)).isEmpty())
|
|
328
353
|
fail("Feature must have a straight constant-section collar throughout the complete connection band.", "collar");
|
|
329
354
|
if (width === 0)
|
|
330
355
|
return environment.wrapSolid(own(originalBase.add(originalFeature)));
|
|
331
|
-
const
|
|
356
|
+
const originalContours = profileContours(source), outsideContours = profileContours(expandedProfile);
|
|
332
357
|
// Close inside the real feature wall, proving this private numerical overlap adds no exposed shape.
|
|
333
358
|
const insideProfile = offset.profileAt(closingInset);
|
|
334
|
-
const
|
|
335
|
-
const closingSection =
|
|
359
|
+
const insideContours = profileContours(insideProfile);
|
|
360
|
+
const closingSection = crossSectionFromContours(insideContours);
|
|
336
361
|
if (closingSection.isEmpty() || closingSection.numContour() !== sourceSection.numContour())
|
|
337
362
|
fail("Source boundaries cannot resolve the private closing allowance.", "precision");
|
|
338
|
-
const closingCore = own(module.Manifold.extrude(closingSection,
|
|
363
|
+
const closingCore = own(module.Manifold.extrude(closingSection, collarTop));
|
|
339
364
|
if (!own(own(closingCore.subtract(neck)).subtract(support)).isEmpty())
|
|
340
365
|
fail("The private closing boundary cannot be contained in the supplied solids.", "precision");
|
|
341
366
|
const strips = [];
|
|
342
|
-
for (let
|
|
343
|
-
const original =
|
|
367
|
+
for (let contourIndex = 0; contourIndex < originalContours.length; contourIndex++) {
|
|
368
|
+
const original = originalContours[contourIndex], expanded = outsideContours[contourIndex];
|
|
344
369
|
for (let i = 0; i < original.length; i++) {
|
|
345
370
|
const next = (i + 1) % original.length, a = original[i], b = original[next];
|
|
346
371
|
const length = Math.hypot(b[0] - a[0], b[1] - a[1]);
|
|
@@ -382,6 +407,16 @@ export function createJoinOperation(environment) {
|
|
|
382
407
|
}
|
|
383
408
|
return group;
|
|
384
409
|
});
|
|
410
|
+
const appendClippedCells = (polygon) => {
|
|
411
|
+
for (const [cellIndex, cell] of cells.entries()) {
|
|
412
|
+
work.use();
|
|
413
|
+
const piece = intersectJoinPolygons(polygon, cell.polygon);
|
|
414
|
+
if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
|
|
415
|
+
polygons.push(piece);
|
|
416
|
+
bottomGroups.push(cellGroups[cellIndex]);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
};
|
|
385
420
|
// Split at every chart crossing so the generated surface retains actual support facets and creases.
|
|
386
421
|
for (const strip of strips)
|
|
387
422
|
for (let row = 0; row < divisions; row++) {
|
|
@@ -395,45 +430,23 @@ export function createJoinOperation(environment) {
|
|
|
395
430
|
const band = clipJoinPolygon(clipJoinPolygon(strip.polygon, [projection[0], projection[1], projection[2] - rb]), [-projection[0], -projection[1], ra - projection[2]]);
|
|
396
431
|
if (band.length < 3)
|
|
397
432
|
continue;
|
|
398
|
-
|
|
399
|
-
work.use();
|
|
400
|
-
const piece = intersectJoinPolygons(band, cell.polygon);
|
|
401
|
-
if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
|
|
402
|
-
polygons.push(piece);
|
|
403
|
-
bottomGroups.push(cellGroups[cellIndex]);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
433
|
+
appendClippedCells(band);
|
|
406
434
|
}
|
|
407
435
|
// Use the same corresponding boundaries and clipping arithmetic as the outside strips.
|
|
408
436
|
// Independent native offsets/intersections would round these shared mesh seams differently.
|
|
409
|
-
for (let
|
|
410
|
-
const original =
|
|
437
|
+
for (let contourIndex = 0; contourIndex < originalContours.length; contourIndex++) {
|
|
438
|
+
const original = originalContours[contourIndex], inside = insideContours[contourIndex];
|
|
411
439
|
for (let i = 0; i < original.length; i++) {
|
|
412
440
|
const next = (i + 1) % original.length;
|
|
413
441
|
const ring = [original[i], original[next], inside[next], inside[i]];
|
|
414
|
-
|
|
415
|
-
work.use();
|
|
416
|
-
const piece = intersectJoinPolygons(ring, cell.polygon);
|
|
417
|
-
if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
|
|
418
|
-
polygons.push(piece);
|
|
419
|
-
bottomGroups.push(cellGroups[cellIndex]);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
442
|
+
appendClippedCells(ring);
|
|
422
443
|
}
|
|
423
444
|
}
|
|
424
445
|
// Fill the already-proven feature interior down to the same support witness. An annular-only
|
|
425
446
|
// collar can enclose a numerical contact sheet when two independently transformed caps meet.
|
|
426
447
|
const coreCells = insideProfile.components.flatMap((component) => convexPartition([component.outer.points, ...component.holes.map((hole) => hole.points)]));
|
|
427
|
-
for (const coreCell of coreCells)
|
|
428
|
-
|
|
429
|
-
work.use();
|
|
430
|
-
const piece = intersectJoinPolygons(coreCell, cell.polygon);
|
|
431
|
-
if (piece.length >= 3 && Math.abs(joinArea(piece)) > meshEpsilon ** 2) {
|
|
432
|
-
polygons.push(piece);
|
|
433
|
-
bottomGroups.push(cellGroups[cellIndex]);
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
448
|
+
for (const coreCell of coreCells)
|
|
449
|
+
appendClippedCells(coreCell);
|
|
437
450
|
const stripIndex = createJoinPolygonIndex(strips.map((strip) => strip.polygon), work, limits);
|
|
438
451
|
const rise = (p) => {
|
|
439
452
|
for (const index of stripIndex(p, epsilon)) {
|
|
@@ -452,7 +465,7 @@ export function createJoinOperation(environment) {
|
|
|
452
465
|
const layerOptions = {
|
|
453
466
|
bottomGroups,
|
|
454
467
|
supportPlanes,
|
|
455
|
-
triangulate: (
|
|
468
|
+
triangulate: (contours) => module.triangulate(contours.map((contour) => contour.map((p) => [p[0], p[1]])), 0, false),
|
|
456
469
|
};
|
|
457
470
|
const layer = prepareJoinLayer(polygons, meshEpsilon, limits, work, layerOptions);
|
|
458
471
|
// Prepared nodes retain their incident support planes, avoiding a second spatial guess at creases.
|
|
@@ -465,7 +478,7 @@ export function createJoinOperation(environment) {
|
|
|
465
478
|
const missingFoot = own(own(footNative.subtract(support)).subtract(neck));
|
|
466
479
|
if (!missingFoot.isEmpty()) {
|
|
467
480
|
// Native subtraction can retain zero-thickness contact sheets. Bound each component at
|
|
468
|
-
//
|
|
481
|
+
// Float64 roundoff, never by the larger construction allowance or another component's area.
|
|
469
482
|
const missingComponents = missingFoot.decompose().map(own);
|
|
470
483
|
if (missingComponents.length === 0)
|
|
471
484
|
fail("Numerical connection containment could not be established.", "support");
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { GeometryError } from "../../geometry/errors.js";
|
|
2
2
|
import { resolveKnuckleHinge } from "../../geometry/mechanical/knuckle-hinge.js";
|
|
3
|
-
import { assertPrimitiveOptions } from "../../geometry/
|
|
4
|
-
import { assertSamplingCount } from "../../geometry/sampling
|
|
3
|
+
import { assertPrimitiveOptions } from "../../geometry/primitives/resolvers.js";
|
|
4
|
+
import { assertSamplingCount } from "../../geometry/sampling/limits.js";
|
|
5
|
+
import { frameTransform3 } from "../../geometry/transforms/affine3.js";
|
|
5
6
|
/** Composes existing scoped operations after resolving both halves against one host policy. */
|
|
6
7
|
export function createKnuckleHingeOperation(environment, operations) {
|
|
7
8
|
return (options) => {
|
|
8
9
|
environment.assertActive();
|
|
9
10
|
assertPrimitiveOptions(options, "knuckleHinge");
|
|
10
11
|
const resolved = environment.withResolutionDefaults(options);
|
|
11
|
-
const
|
|
12
|
-
assertSamplingCount(
|
|
12
|
+
const dimensions = resolveKnuckleHinge(options, resolved);
|
|
13
|
+
assertSamplingCount(dimensions.segments * dimensions.spec.knuckleCount * 2, "knuckleHinge", resolved.limits.maxVertices);
|
|
13
14
|
const invalid = (message) => {
|
|
14
15
|
throw new GeometryError("INVALID_ARGUMENT", message, { operation: "knuckleHinge" });
|
|
15
16
|
};
|
|
@@ -18,8 +19,8 @@ export function createKnuckleHingeOperation(environment, operations) {
|
|
|
18
19
|
const chamfer = half.chamfer ?? 0;
|
|
19
20
|
if (!Number.isFinite(chamfer) ||
|
|
20
21
|
chamfer < 0 ||
|
|
21
|
-
2 * chamfer >=
|
|
22
|
-
chamfer >=
|
|
22
|
+
2 * chamfer >= dimensions.knuckleLength ||
|
|
23
|
+
chamfer >= dimensions.minimumBarrelWall)
|
|
23
24
|
invalid("chamfer must be nonnegative and leave a positive axial band and faceted barrel wall.");
|
|
24
25
|
const web = half.web;
|
|
25
26
|
if (web !== undefined) {
|
|
@@ -34,9 +35,9 @@ export function createKnuckleHingeOperation(environment, operations) {
|
|
|
34
35
|
!Number.isFinite(web.zMin + web.thickness))
|
|
35
36
|
invalid("Web dimensions must be finite, with positive reach and thickness.");
|
|
36
37
|
if (2 * chamfer >= web.thickness ||
|
|
37
|
-
2 * Math.SQRT2 * chamfer >= Math.min(
|
|
38
|
+
2 * Math.SQRT2 * chamfer >= Math.min(dimensions.knuckleLength, web.reach))
|
|
38
39
|
invalid("chamfer must leave a positive web band and noncollapsed end contours.");
|
|
39
|
-
const innerRadius =
|
|
40
|
+
const innerRadius = dimensions.barrelRadius * Math.cos(Math.PI / dimensions.segments);
|
|
40
41
|
if (web.zMin >= innerRadius || web.zMin + web.thickness <= -innerRadius)
|
|
41
42
|
invalid("A web must overlap the interior of its barrel.");
|
|
42
43
|
}
|
|
@@ -49,7 +50,7 @@ export function createKnuckleHingeOperation(environment, operations) {
|
|
|
49
50
|
radius,
|
|
50
51
|
height: length,
|
|
51
52
|
center: false,
|
|
52
|
-
segments:
|
|
53
|
+
segments: dimensions.segments,
|
|
53
54
|
sizing: bore ? "face" : "vertex",
|
|
54
55
|
...(chamfer === 0
|
|
55
56
|
? {}
|
|
@@ -69,7 +70,7 @@ export function createKnuckleHingeOperation(environment, operations) {
|
|
|
69
70
|
// Parallel offsets finish the exposed tip; the two root corners stay square.
|
|
70
71
|
const corner = { kind: "chamfer", distance: chamfer + (Math.SQRT2 - 2) * inset };
|
|
71
72
|
const profile = operations.rectangle({
|
|
72
|
-
size: [
|
|
73
|
+
size: [dimensions.knuckleLength - 2 * inset, web.reach - inset],
|
|
73
74
|
center: false,
|
|
74
75
|
treatment: [corner, corner, { kind: "square" }, { kind: "square" }],
|
|
75
76
|
});
|
|
@@ -78,10 +79,10 @@ export function createKnuckleHingeOperation(environment, operations) {
|
|
|
78
79
|
web.direction === "positive-y" ? 1 : -1,
|
|
79
80
|
]);
|
|
80
81
|
};
|
|
81
|
-
for (const interval of
|
|
82
|
+
for (const interval of dimensions.knuckles) {
|
|
82
83
|
if (interval.side !== side)
|
|
83
84
|
continue;
|
|
84
|
-
features.push(atBase(axial(
|
|
85
|
+
features.push(atBase(axial(dimensions.barrelRadius, interval.start, interval.length, false, chamfer)));
|
|
85
86
|
if (web !== undefined) {
|
|
86
87
|
features.push(chamfer === 0
|
|
87
88
|
? operations.translate(operations.box({
|
|
@@ -99,30 +100,34 @@ export function createKnuckleHingeOperation(environment, operations) {
|
|
|
99
100
|
[chamfer, web.thickness],
|
|
100
101
|
].map(([inset, z]) => ({
|
|
101
102
|
profile: webProfile(web, inset),
|
|
102
|
-
|
|
103
|
+
transform: frameTransform3({
|
|
103
104
|
origin: [interval.start, 0, z],
|
|
104
105
|
xAxis: [1, 0, 0],
|
|
105
106
|
yAxis: [0, 1, 0],
|
|
106
107
|
zAxis: [0, 0, 1],
|
|
107
|
-
},
|
|
108
|
+
}),
|
|
108
109
|
}))));
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
|
-
if (side === "a" &&
|
|
112
|
-
features.push(atBase(axial(
|
|
112
|
+
if (side === "a" && dimensions.pin !== null)
|
|
113
|
+
features.push(atBase(axial(dimensions.pinRadius, dimensions.pin.start, dimensions.pin.length)));
|
|
113
114
|
// Match the kernel cylinders to the same mesh precision as the explicit web stations.
|
|
114
115
|
const solid = operations.union(features.map((feature) => chamfer === 0 || web === undefined
|
|
115
116
|
? feature
|
|
116
117
|
: operations.solidFromMesh(environment.analyzedMeshFor(feature).mesh)));
|
|
117
118
|
// Overtravel is numerical cutter extent, independent of the physical radial/axial allowances.
|
|
118
|
-
const overtravel = Math.min(
|
|
119
|
-
const result = side === "a" &&
|
|
119
|
+
const overtravel = Math.min(dimensions.knuckleLength, dimensions.barrelRadius) * 0.01;
|
|
120
|
+
const result = side === "a" && dimensions.pin !== null
|
|
120
121
|
? solid
|
|
121
122
|
: operations.subtract(solid, [
|
|
122
|
-
atBase(axial(
|
|
123
|
+
atBase(axial(dimensions.boreRadius, -dimensions.spec.length / 2 - overtravel, dimensions.spec.length + 2 * overtravel, true)),
|
|
123
124
|
]);
|
|
124
125
|
return operations.translate(result, [0, 0, baseZ]);
|
|
125
126
|
};
|
|
126
|
-
return Object.freeze({
|
|
127
|
+
return Object.freeze({
|
|
128
|
+
halfA: buildHalf("a", a),
|
|
129
|
+
halfB: buildHalf("b", b),
|
|
130
|
+
axis: dimensions.axis,
|
|
131
|
+
});
|
|
127
132
|
};
|
|
128
133
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { GeometryError } from "../../geometry/errors.js";
|
|
2
|
-
import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../../geometry/loft/
|
|
3
|
-
import {
|
|
4
|
-
import { simpleLoftMesh } from "../../geometry/loft/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { assertSamplingCount, } from "../../geometry/sampling-limits.js";
|
|
2
|
+
import { loftProfilePointCount, pointLoftProfile, prepareLoftGeometry, } from "../../geometry/loft/geometry.js";
|
|
3
|
+
import { loftTransform, resolveLoftControls } from "../../geometry/loft/options.js";
|
|
4
|
+
import { simpleLoftMesh } from "../../geometry/loft/simple-mesh.js";
|
|
5
|
+
import { capturePath2Input, path2InputData } from "../../geometry/paths/value.js";
|
|
6
|
+
import { assertSamplingCount, } from "../../geometry/sampling/limits.js";
|
|
8
7
|
import { buildProfileLoftMesh } from "./primitives/profile-mesh.js";
|
|
9
8
|
import { correspondingPrimitiveProfiles, rectangularPrimitiveFamily, } from "./primitives/profiles.js";
|
|
10
9
|
const explicitProfile = (value) => typeof value === "object" &&
|
|
@@ -73,7 +72,7 @@ export function createLoftOperation(environment, solidFromMesh) {
|
|
|
73
72
|
if (!Array.isArray(inputStations) || inputStations.length < 2)
|
|
74
73
|
fail("Loft requires at least two stations.");
|
|
75
74
|
assertSamplingCount(inputStations.length, "loft", environment.limits.maxPathPoints);
|
|
76
|
-
inputStations.forEach((station) =>
|
|
75
|
+
inputStations.forEach((station) => loftTransform(station));
|
|
77
76
|
let selected = environment.withResolutionDefaults(value);
|
|
78
77
|
resolveLoftControls(value, inputStations.length);
|
|
79
78
|
const captured = inputStations.map(({ profile, ...placement }) => {
|
|
@@ -108,7 +107,7 @@ export function createLoftOperation(environment, solidFromMesh) {
|
|
|
108
107
|
let recipeSampled;
|
|
109
108
|
if (explicit) {
|
|
110
109
|
if (!stations.every((station) => explicitProfile(station.profile)))
|
|
111
|
-
fail("Identified profile stations cannot be mixed with Sections or point
|
|
110
|
+
fail("Identified profile stations cannot be mixed with Sections or point contours.");
|
|
112
111
|
profiles = stations.map((station) => station.profile);
|
|
113
112
|
authoritative = true;
|
|
114
113
|
}
|
|
@@ -159,20 +158,14 @@ export function createLoftOperation(environment, solidFromMesh) {
|
|
|
159
158
|
if (authoritative && controls.methods.some((method) => method !== "direct"))
|
|
160
159
|
fail("Identified landmarks cannot be remapped by geometric loft correspondence.");
|
|
161
160
|
const input = stations.map((station, index) => ({
|
|
162
|
-
|
|
161
|
+
transform: loftTransform(station),
|
|
163
162
|
profile: profiles[index],
|
|
164
163
|
}));
|
|
165
164
|
const geometry = prepareLoftGeometry(input, selected, selected.limits, authoritative, recipeSampled);
|
|
166
165
|
if (geometry.stations.every((station) => station.profile.components.length === 1 &&
|
|
167
166
|
station.profile.components[0].holes.length === 0))
|
|
168
167
|
return solidFromMesh(simpleLoftMesh(geometry, selected.limits));
|
|
169
|
-
const mesh = buildProfileLoftMesh(environment.module, geometry.stations, selected.limits, false,
|
|
170
|
-
if (analyzeTriangleMesh(mesh).signedVolume < 0)
|
|
171
|
-
for (let index = 0; index < mesh.indices.length; index += 3) {
|
|
172
|
-
const b = mesh.indices[index + 1];
|
|
173
|
-
mesh.indices[index + 1] = mesh.indices[index + 2];
|
|
174
|
-
mesh.indices[index + 2] = b;
|
|
175
|
-
}
|
|
168
|
+
const mesh = buildProfileLoftMesh(environment.module, geometry.stations, selected.limits, false, [], (station, contour, slot) => geometry.world[station][contour][slot]);
|
|
176
169
|
return solidFromMesh(mesh);
|
|
177
170
|
};
|
|
178
171
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { preflightInternalThreadCutterSolid, preflightThreadedNutSolid, preflightThreadedRodSolid, } from "../../geometry/mechanical/threads/solids.js";
|
|
1
2
|
import * as kernel from "../native/index.js";
|
|
2
3
|
import { createKnuckleHingeOperation } from "./knuckle-hinge.js";
|
|
3
4
|
/** Internal host-bound mechanical operations. */
|
|
@@ -18,33 +19,21 @@ export function createMechanicalOperations(environment, construction) {
|
|
|
18
19
|
threadedRod: (value) => {
|
|
19
20
|
assertActive();
|
|
20
21
|
const resolved = withResolutionDefaults(value);
|
|
21
|
-
|
|
22
|
+
preflightThreadedRodSolid(resolved);
|
|
22
23
|
return wrapSolid(kernel.threadedRod(scope, resolved));
|
|
23
24
|
},
|
|
24
25
|
internalThreadCutter: (value) => {
|
|
25
26
|
assertActive();
|
|
26
27
|
const resolved = withResolutionDefaults(value);
|
|
27
|
-
|
|
28
|
+
preflightInternalThreadCutterSolid(resolved);
|
|
28
29
|
return wrapSolid(kernel.internalThreadCutter(scope, resolved));
|
|
29
30
|
},
|
|
30
31
|
threadedNut: (value) => {
|
|
31
32
|
assertActive();
|
|
32
33
|
const resolved = nutOptions(value);
|
|
33
|
-
|
|
34
|
+
preflightThreadedNutSolid(resolved);
|
|
34
35
|
return wrapSolid(kernel.threadedNut(scope, resolved));
|
|
35
36
|
},
|
|
36
|
-
preflightThreadedRod: (value) => {
|
|
37
|
-
assertActive();
|
|
38
|
-
return kernel.preflightThreadedRod(withResolutionDefaults(value));
|
|
39
|
-
},
|
|
40
|
-
preflightThreadedNut: (value) => {
|
|
41
|
-
assertActive();
|
|
42
|
-
return kernel.preflightThreadedNut(nutOptions(value));
|
|
43
|
-
},
|
|
44
|
-
preflightInternalThreadCutter: (value) => {
|
|
45
|
-
assertActive();
|
|
46
|
-
return kernel.preflightInternalThreadCutter(withResolutionDefaults(value));
|
|
47
|
-
},
|
|
48
37
|
};
|
|
49
38
|
return operations;
|
|
50
39
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { anchor3, boxAnchor3 } from "../../../geometry/anchors.js";
|
|
2
|
-
import { resolveCylinderRadii } from "../../../geometry/cylinder.js";
|
|
3
1
|
import { vector3Data } from "../../../geometry/math/vector-value.js";
|
|
4
|
-
import {
|
|
2
|
+
import { resolveCylinderRadii } from "../../../geometry/primitives/cylinder.js";
|
|
3
|
+
import { resolveTubeRadii } from "../../../geometry/primitives/resolvers.js";
|
|
4
|
+
import { anchor3, boxAnchor3 } from "../../../geometry/transforms/anchors.js";
|
|
5
5
|
const faces = ["left", "right", "back", "front", "bottom", "top"];
|
|
6
6
|
/** Nominal primitive datums; construction validates dimensions before these factories run. */
|
|
7
7
|
export function boxAnchors(options) {
|
|
@@ -10,7 +10,7 @@ export function boxAnchors(options) {
|
|
|
10
10
|
: vector3Data(options.size);
|
|
11
11
|
const center = options.center === false ? [size[0] / 2, size[1] / 2, size[2] / 2] : [0, 0, 0];
|
|
12
12
|
return {
|
|
13
|
-
center: anchor3(center, [0, 0, 1]),
|
|
13
|
+
center: anchor3({ position: center, direction: [0, 0, 1] }),
|
|
14
14
|
...Object.fromEntries(faces.map((face) => [
|
|
15
15
|
face,
|
|
16
16
|
boxAnchor3({
|
|
@@ -28,13 +28,17 @@ function axialAnchors(radii, height, centered) {
|
|
|
28
28
|
const radius = (radii[0] + radii[1]) / 2;
|
|
29
29
|
const slope = (radii[1] - radii[0]) / height;
|
|
30
30
|
return {
|
|
31
|
-
center: anchor3([0, 0, middle], [0, 0, 1]),
|
|
32
|
-
...(radii[0] === 0
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
center: anchor3({ position: [0, 0, middle], direction: [0, 0, 1] }),
|
|
32
|
+
...(radii[0] === 0
|
|
33
|
+
? {}
|
|
34
|
+
: { bottom: anchor3({ position: [0, 0, bottom], direction: [0, 0, -1] }) }),
|
|
35
|
+
...(radii[1] === 0
|
|
36
|
+
? {}
|
|
37
|
+
: { top: anchor3({ position: [0, 0, bottom + height], direction: [0, 0, 1] }) }),
|
|
38
|
+
right: anchor3({ position: [radius, 0, middle], direction: [1, 0, -slope], up: [0, 0, 1] }),
|
|
39
|
+
left: anchor3({ position: [-radius, 0, middle], direction: [-1, 0, -slope], up: [0, 0, 1] }),
|
|
40
|
+
front: anchor3({ position: [0, radius, middle], direction: [0, 1, -slope], up: [0, 0, 1] }),
|
|
41
|
+
back: anchor3({ position: [0, -radius, middle], direction: [0, -1, -slope], up: [0, 0, 1] }),
|
|
38
42
|
};
|
|
39
43
|
}
|
|
40
44
|
/** Cylinder and frustum cap anchors omit an end whose nominal radius is zero. */
|
|
@@ -60,16 +64,16 @@ export function torusAnchors(options) {
|
|
|
60
64
|
export function planarAnchors(size, centered = true) {
|
|
61
65
|
const x = centered ? 0 : size[0] / 2, y = centered ? 0 : size[1] / 2;
|
|
62
66
|
return {
|
|
63
|
-
center: anchor3([x, y, 0], [0, 0, 1]),
|
|
64
|
-
top: anchor3([x, y, 0], [0, 0, 1]),
|
|
65
|
-
bottom: anchor3([x, y, 0], [0, 0, -1]),
|
|
66
|
-
right: anchor3([x + size[0] / 2, y, 0], [1, 0, 0], [0, 0, 1]),
|
|
67
|
-
left: anchor3([x - size[0] / 2, y, 0], [-1, 0, 0], [0, 0, 1]),
|
|
68
|
-
front: anchor3([x, y + size[1] / 2, 0], [0, 1, 0], [0, 0, 1]),
|
|
69
|
-
back: anchor3([x, y - size[1] / 2, 0], [0, -1, 0], [0, 0, 1]),
|
|
67
|
+
center: anchor3({ position: [x, y, 0], direction: [0, 0, 1] }),
|
|
68
|
+
top: anchor3({ position: [x, y, 0], direction: [0, 0, 1] }),
|
|
69
|
+
bottom: anchor3({ position: [x, y, 0], direction: [0, 0, -1] }),
|
|
70
|
+
right: anchor3({ position: [x + size[0] / 2, y, 0], direction: [1, 0, 0], up: [0, 0, 1] }),
|
|
71
|
+
left: anchor3({ position: [x - size[0] / 2, y, 0], direction: [-1, 0, 0], up: [0, 0, 1] }),
|
|
72
|
+
front: anchor3({ position: [x, y + size[1] / 2, 0], direction: [0, 1, 0], up: [0, 0, 1] }),
|
|
73
|
+
back: anchor3({ position: [x, y - size[1] / 2, 0], direction: [0, -1, 0], up: [0, 0, 1] }),
|
|
70
74
|
};
|
|
71
75
|
}
|
|
72
76
|
/** A construction-origin reference for primitives without meaningful principal side datums. */
|
|
73
77
|
export const originAnchor = () => ({
|
|
74
|
-
center: anchor3([0, 0, 0], [0, 0, 1]),
|
|
78
|
+
center: anchor3({ position: [0, 0, 0], direction: [0, 0, 1] }),
|
|
75
79
|
});
|