1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-08 14:17:06 +03:00

0030497: [REGRESSION] Mesh - wrong Poly_Polygon3D within local selection of located shape

The previous code has a condition to avoid processing the same faces if the face has a location.
The similar condition should be applied during the edges processing.
If not doing this, in the previous imlementation, IMeshData_Edge instances are created for all edges(even located), but edges of faces located are not filled with curves.
As a result we had wrong local selection of edges.

(cherry picked from commit 9e00d610b88e4f1778a5a55fe9c50d2665169d28)
This commit is contained in:
nds
2019-02-25 11:37:11 +03:00
parent a151681f49
commit bc09b9e3da
2 changed files with 57 additions and 9 deletions

View File

@@ -50,14 +50,11 @@ IMeshTools_ShapeExplorer::~IMeshTools_ShapeExplorer ()
void IMeshTools_ShapeExplorer::Accept (
const Handle (IMeshTools_ShapeVisitor)& theVisitor)
{
// Explore all edges in shape - either free or related to some face.
TopTools_IndexedMapOfShape aEdges;
TopExp::MapShapes (GetShape (), TopAbs_EDGE, aEdges);
TopTools_IndexedMapOfShape::Iterator aEdgeIt (aEdges);
for (; aEdgeIt.More (); aEdgeIt.Next ())
// Explore all free edges in shape.
TopExp_Explorer aFreeEdgesIt (GetShape (), TopAbs_EDGE, TopAbs_FACE);
for (; aFreeEdgesIt.More(); aFreeEdgesIt.Next())
{
const TopoDS_Edge& aEdge = TopoDS::Edge (aEdgeIt.Value ());
const TopoDS_Edge& aEdge = TopoDS::Edge (aFreeEdgesIt.Current());
if (!BRep_Tool::IsGeometric(aEdge))
{
continue;
@@ -66,12 +63,11 @@ void IMeshTools_ShapeExplorer::Accept (
theVisitor->Visit (aEdge);
}
// Explore faces
// Explore all related to some face edges in shape.
TopTools_ListOfShape aFaceList;
BRepLib::ReverseSortFaces (GetShape (), aFaceList);
TopTools_MapOfShape aFaceMap;
// make array of faces suitable for processing (excluding faces without surface)
TopLoc_Location aDummyLoc;
const TopLoc_Location aEmptyLoc;
TopTools_ListIteratorOfListOfShape aFaceIter (aFaceList);
@@ -91,6 +87,40 @@ void IMeshTools_ShapeExplorer::Accept (
continue;
}
TopExp_Explorer anEdgesExp (aFace, TopAbs_EDGE);
for (; anEdgesExp.More(); anEdgesExp.Next())
{
const TopoDS_Edge& aEdge = TopoDS::Edge (anEdgesExp.Current());
if (!BRep_Tool::IsGeometric(aEdge))
{
continue;
}
theVisitor->Visit (aEdge);
}
}
// Explore faces
aFaceMap.Clear();
// make array of faces suitable for processing (excluding faces without surface)
aFaceIter.Init (aFaceList);
for (; aFaceIter.More (); aFaceIter.Next ())
{
TopoDS_Shape aFaceNoLoc = aFaceIter.Value ();
aFaceNoLoc.Location (aEmptyLoc);
if (!aFaceMap.Add(aFaceNoLoc))
{
continue; // already processed
}
TopoDS_Face aFace = TopoDS::Face (aFaceIter.Value ());
const Handle (Geom_Surface)& aSurf = BRep_Tool::Surface (aFace, aDummyLoc);
if (aSurf.IsNull())
{
continue;
}
// Store only forward faces in order to prevent inverse issue.
theVisitor->Visit (TopoDS::Face (aFace.Oriented (TopAbs_FORWARD)));
}

View File

@@ -0,0 +1,18 @@
puts "======="
puts "0030497"
puts "======="
puts ""
##################################################
# [REGRESSION] Mesh - wrong Poly_Polygon3D within local selection of located shape
##################################################
pload XDE VISUALIZATION
testreadstep as1-oc-214-mat.stp s
vclear
vinit View1
vaxo
vdisplay s -dispmode 1
vfit
vselmode 2 1
vmoveto 150 201