mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
0025132: Visualization - treat any TopoDS_Solid as closed volume
Advanced mechanism implemented: - BRep_Tool::IsClosed() method is used to detect non-manifold solids and open shells - Non-manifold solids are split into closed and open shells Adding message in test case
This commit is contained in:
@@ -257,7 +257,14 @@ namespace
|
||||
}
|
||||
case TopAbs_SOLID:
|
||||
{
|
||||
theBuilder.Add (StdPrs_ToolShadedShape::IsClosed (theShape) ? theCompoundForClosed : theCompoundForOpened, theShape);
|
||||
for (TopoDS_Iterator anIter (theShape); anIter.More(); anIter.Next())
|
||||
{
|
||||
const TopoDS_Shape& aSubShape = anIter.Value();
|
||||
const Standard_Boolean isClosed = aSubShape.ShapeType() == TopAbs_SHELL &&
|
||||
BRep_Tool::IsClosed (aSubShape) &&
|
||||
StdPrs_ToolShadedShape::IsTriangulated (aSubShape);
|
||||
theBuilder.Add (isClosed ? theCompoundForClosed : theCompoundForOpened, aSubShape);
|
||||
}
|
||||
return;
|
||||
}
|
||||
case TopAbs_SHELL:
|
||||
@@ -483,12 +490,15 @@ void StdPrs_ShadedShape::Add (const Handle (Prs3d_Presentation)& thePrs,
|
||||
// add wireframe presentation for isolated edges and vertices
|
||||
wireframeFromShape (thePrs, theShape, theDrawer);
|
||||
|
||||
// IsClosed also verifies triangulation completeness - perform tessellation beforehand
|
||||
// Triangulation completeness is important for "open-closed" analysis - perform tessellation beforehand
|
||||
Tessellate (theShape, theDrawer);
|
||||
const Standard_Boolean isClosed = StdPrs_ToolShadedShape::IsClosed (theShape);
|
||||
|
||||
// The shape types listed below need advanced analysis as potentially containing
|
||||
// both closed and open parts. Solids are also included, because they might
|
||||
// contain non-manifold parts inside (internal open shells)
|
||||
if ((theShape.ShapeType() == TopAbs_COMPOUND
|
||||
|| theShape.ShapeType() == TopAbs_COMPSOLID)
|
||||
&& !isClosed
|
||||
|| theShape.ShapeType() == TopAbs_COMPSOLID
|
||||
|| theShape.ShapeType() == TopAbs_SOLID)
|
||||
&& theToExploreSolids)
|
||||
{
|
||||
// collect two compounds: for opened and closed (solid) sub-shapes
|
||||
@@ -515,7 +525,8 @@ void StdPrs_ShadedShape::Add (const Handle (Prs3d_Presentation)& thePrs,
|
||||
else
|
||||
{
|
||||
shadeFromShape (theShape, thePrs, theDrawer,
|
||||
theHasTexels, theUVOrigin, theUVRepeat, theUVScale, isClosed);
|
||||
theHasTexels, theUVOrigin, theUVRepeat, theUVScale,
|
||||
StdPrs_ToolShadedShape::IsClosed (theShape));
|
||||
}
|
||||
|
||||
if (theDrawer->IsFaceBoundaryDraw())
|
||||
|
@@ -35,27 +35,23 @@
|
||||
#include <TopExp_Explorer.hxx>
|
||||
#include <TopoDS.hxx>
|
||||
|
||||
namespace
|
||||
//=======================================================================
|
||||
//function : isTriangulated
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean StdPrs_ToolShadedShape::IsTriangulated (const TopoDS_Shape& theShape)
|
||||
{
|
||||
//=======================================================================
|
||||
//function : isTriangulated
|
||||
//purpose : Returns true if all faces within shape are triangulated.
|
||||
// Same as BRepTools::Triangulation() but without extra checks.
|
||||
//=======================================================================
|
||||
static Standard_Boolean isTriangulated (const TopoDS_Shape& theShape)
|
||||
TopLoc_Location aLocDummy;
|
||||
for (TopExp_Explorer aFaceIter (theShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next())
|
||||
{
|
||||
TopLoc_Location aLocDummy;
|
||||
for (TopExp_Explorer aFaceIter (theShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next())
|
||||
const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Current());
|
||||
const Handle(Poly_Triangulation)& aTri = BRep_Tool::Triangulation (aFace, aLocDummy);
|
||||
if (aTri.IsNull())
|
||||
{
|
||||
const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Current());
|
||||
const Handle(Poly_Triangulation)& aTri = BRep_Tool::Triangulation (aFace, aLocDummy);
|
||||
if (aTri.IsNull())
|
||||
{
|
||||
return Standard_False;
|
||||
}
|
||||
return Standard_False;
|
||||
}
|
||||
return Standard_True;
|
||||
}
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -88,6 +84,12 @@ Standard_Boolean StdPrs_ToolShadedShape::IsClosed (const TopoDS_Shape& theShape)
|
||||
}
|
||||
case TopAbs_SOLID:
|
||||
{
|
||||
// Check for non-manifold topology first of all:
|
||||
// have to use BRep_Tool::IsClosed() because it checks the face connectivity
|
||||
// inside the shape
|
||||
if (!BRep_Tool::IsClosed (theShape))
|
||||
return Standard_False;
|
||||
|
||||
for (TopoDS_Iterator anIter (theShape); anIter.More(); anIter.Next())
|
||||
{
|
||||
const TopoDS_Shape& aShape = anIter.Value();
|
||||
@@ -96,17 +98,12 @@ Standard_Boolean StdPrs_ToolShadedShape::IsClosed (const TopoDS_Shape& theShape)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (aShape.ShapeType() == TopAbs_SHELL
|
||||
&& !aShape.Closed())
|
||||
{
|
||||
return Standard_False;
|
||||
}
|
||||
else if (aShape.ShapeType() == TopAbs_FACE)
|
||||
if (aShape.ShapeType() == TopAbs_FACE)
|
||||
{
|
||||
// invalid solid
|
||||
return Standard_False;
|
||||
}
|
||||
else if (!isTriangulated (aShape))
|
||||
else if (!IsTriangulated (aShape))
|
||||
{
|
||||
// mesh contains holes
|
||||
return Standard_False;
|
||||
|
@@ -32,8 +32,12 @@ public:
|
||||
|
||||
DEFINE_STANDARD_ALLOC
|
||||
|
||||
//! Similar to BRepTools::Triangulation() but without extra checks.
|
||||
//! @return true if all faces within shape are triangulated.
|
||||
Standard_EXPORT static Standard_Boolean IsTriangulated (const TopoDS_Shape& theShape);
|
||||
|
||||
//! Checks back faces visibility for specified shape (to activate back-face culling). <br>
|
||||
//! @return true if shape is closed Solid or compound of closed Solids. <br>
|
||||
//! @return true if shape is closed manifold Solid or compound of such Solids. <br>
|
||||
Standard_EXPORT static Standard_Boolean IsClosed(const TopoDS_Shape& theShape);
|
||||
|
||||
Standard_EXPORT static Handle_Poly_Triangulation Triangulation(const TopoDS_Face& aFace,
|
||||
|
Reference in New Issue
Block a user