diff --git a/src/build123d/topology/one_d.py b/src/build123d/topology/one_d.py index 27f9b11..6a717d9 100644 --- a/src/build123d/topology/one_d.py +++ b/src/build123d/topology/one_d.py @@ -89,8 +89,12 @@ from OCP.BRepPrimAPI import BRepPrimAPI_MakeHalfSpace from OCP.BRepProj import BRepProj_Projection from OCP.BRepTools import BRepTools, BRepTools_WireExplorer from OCP.GC import GC_MakeArcOfCircle, GC_MakeArcOfEllipse -from OCP.GccEnt import GccEnt_unqualified, GccEnt_Position -from OCP.GCPnts import GCPnts_AbscissaPoint +from OCP.GCPnts import ( + GCPnts_AbscissaPoint, + GCPnts_QuasiUniformDeflection, + GCPnts_UniformDeflection, +) +from OCP.GProp import GProp_GProps from OCP.Geom import ( Geom_BezierCurve, Geom_BSplineCurve, @@ -541,6 +545,31 @@ class Mixin1D(Shape[TOPODS]): return result + def discretize(self, deflection: float = 0.1, quasi=True) -> list[Vector]: + """Discretize the shape into a list of points""" + if self.wrapped is None: + raise ValueError("Cannot discretize an empty shape") + curve = self.geom_adaptor() + if quasi: + discretizer = GCPnts_QuasiUniformDeflection() + else: + discretizer = GCPnts_UniformDeflection() + discretizer.Initialize( + curve, + deflection, + curve.FirstParameter(), + curve.LastParameter(), + ) + + assert discretizer.IsDone() + + return [ + Vector(v.X(), v.Y(), v.Z()) + for v in ( + curve.Value(discretizer.Parameter(i)) + for i in range(1, discretizer.NbPoints() + 1) + ) + ] def curvature_comb( self, count: int = 100, max_tooth_size: float | None = None ) -> ShapeList[Edge]: diff --git a/tests/test_direct_api/test_mixin1_d.py b/tests/test_direct_api/test_mixin1_d.py index 1d7791b..d2bc54e 100644 --- a/tests/test_direct_api/test_mixin1_d.py +++ b/tests/test_direct_api/test_mixin1_d.py @@ -368,6 +368,11 @@ class TestMixin1D(unittest.TestCase): self.assertAlmostEqual(common.z_dir.Y, 0, 5) self.assertAlmostEqual(common.z_dir.Z, 0, 5) + def test_discretize(self): + edge = Edge.make_circle(2, start_angle=0, end_angle=180) + points = edge.discretize(0.1) + self.assertEqual(len(points), 6) + def test_edge_volume(self): edge = Edge.make_line((0, 0), (1, 1)) self.assertAlmostEqual(edge.volume, 0, 5)