1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-03 14:10:33 +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:
san
2014-08-28 14:52:48 +04:00
committed by bugmaster
parent 6da50d2610
commit 4769a39529
5 changed files with 83 additions and 30 deletions

View File

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