Deprecating Shape.is_planar_face Issue #969

This commit is contained in:
Roger Maitland 2026-03-08 19:22:23 -04:00
parent cc7df4554c
commit d4bfeefed3
3 changed files with 27 additions and 14 deletions

View file

@ -448,6 +448,12 @@ class Shape(NodeMixin, Generic[TOPODS]):
@property
def is_planar_face(self) -> bool:
"""Is the shape a planar face even though its geom_type may not be PLANE"""
warnings.warn(
"The ``is_planar_face`` property is deprecated and will be removed in a future version."
"Use ``Face.is_planar`` instead",
DeprecationWarning,
stacklevel=2,
)
if self._wrapped is None or not isinstance(self.wrapped, TopoDS_Face):
return False
surface = BRep_Tool.Surface_s(self.wrapped)
@ -2773,10 +2779,12 @@ class ShapeList(list[T]):
# could be moved out maybe?
def axis_parallel_predicate(axis: Axis, tolerance: float):
def pred(shape: Shape):
if shape.is_planar_face:
assert shape.wrapped is not None and isinstance(
shape.wrapped, TopoDS_Face
)
if (
isinstance(shape.wrapped, TopoDS_Face)
and GeomLib_IsPlanarSurface(
BRep_Tool.Surface_s(shape.wrapped), TOLERANCE
).IsPlanar()
):
gp_pnt = gp_Pnt()
surface_normal = gp_Vec()
u_val, _, v_val, _ = BRepTools.UVBounds_s(shape.wrapped)
@ -2810,10 +2818,12 @@ class ShapeList(list[T]):
def pred(shape: Shape):
if shape.is_planar_face:
assert shape.wrapped is not None and isinstance(
shape.wrapped, TopoDS_Face
)
if (
isinstance(shape.wrapped, TopoDS_Face)
and GeomLib_IsPlanarSurface(
BRep_Tool.Surface_s(shape.wrapped), TOLERANCE
).IsPlanar()
):
gp_pnt: gp_Pnt = gp_Pnt()
surface_normal: gp_Vec = gp_Vec()
u_val, _, v_val, _ = BRepTools.UVBounds_s(shape.wrapped)

View file

@ -100,6 +100,7 @@ from OCP.GeomAPI import (
GeomAPI_PointsToBSplineSurface,
GeomAPI_ProjectPointOnSurf,
)
from OCP.GeomLib import GeomLib_IsPlanarSurface
from OCP.GeomProjLib import GeomProjLib
from OCP.gp import gp_Ax1, gp_Pnt, gp_Vec
from OCP.GProp import GProp_GProps
@ -872,7 +873,7 @@ class Face(Mixin2D[TopoDS_Face]):
if self._wrapped is None:
raise ValueError("Can't determine axes_of_symmetry of empty face")
if not self.is_planar_face:
if not self.is_planar:
raise ValueError("axes_of_symmetry only supports for planar faces")
cog = self.center()
@ -1062,9 +1063,11 @@ class Face(Mixin2D[TopoDS_Face]):
return self._curvature_sign < -TOLERANCE
@property
def is_planar(self) -> bool:
"""Is the face planar even though its geom_type may not be PLANE"""
return self.is_planar_face
def is_planar(self) -> Plane | None:
"""Is the face planar even though its geom_type may not be PLANE - if so return Plane"""
surface = BRep_Tool.Surface_s(self.wrapped)
planar_searcher = GeomLib_IsPlanarSurface(surface, TOLERANCE)
return Plane(planar_searcher.Plan()) if planar_searcher.IsPlanar() else None
@property
def length(self) -> None | float:

View file

@ -1213,7 +1213,7 @@ class TestFace(unittest.TestCase):
wrapped_face: Face = surface.wrap(star, target)
self.assertTrue(isinstance(wrapped_face, Face))
self.assertFalse(wrapped_face.is_planar_face)
self.assertFalse(wrapped_face.is_planar)
self.assertTrue(wrapped_face.inner_wires())
wrapped_edge = surface.wrap(planar_edge, target)
@ -1266,7 +1266,7 @@ class TestFace(unittest.TestCase):
text = Text(txt="ei", font_size=15, align=(Align.MIN, Align.CENTER))
wrapped_faces = surface.wrap_faces(text.faces(), path, 0.2)
self.assertEqual(len(wrapped_faces), 3)
self.assertTrue(all(not f.is_planar_face for f in wrapped_faces))
self.assertTrue(all(not f.is_planar for f in wrapped_faces))
def test_revolve(self):
l1 = Edge.make_line((3, 0), (3, 2))