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;
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);
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)));
}