Merge pull request #1081 from paulftw/dev

Add Mixin1D.discretize
This commit is contained in:
Roger Maitland 2025-11-25 13:14:58 -05:00 committed by GitHub
commit 6eb11ad9f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 36 additions and 2 deletions

View file

@ -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]:

View file

@ -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)