-
- aBuilder.Build();
- W = TopoDS::Wire(aBuilder.Shape());
- W.Orientation(TopAbs_FORWARD);
- BRepBuilderAPI_MakeFace aDB(pln, W);
- TopoDS_Face aDummyFace = TopoDS::Face(aDB.Shape());
- BRepTopAdaptor_FClass2d FClass(aDummyFace, Precision::PConfusion());
- if ( i == 0 && FClass.PerformInfinitePoint() != TopAbs_OUT)
+ allWires.Append(W);
+ }
+
+ int OutWIndex = -1;
+ if (allWires.Size() > 1)
+ {
+ NCollection_Sequence<Bnd_Box> BBs;
+ //try to find the largest bbox
+ for (int i = 1; i <= allWires.Size(); i++)
+ {
+ TopoDS_Wire W = allWires(i);
+ Bnd_Box BB;
+ BRepBndLib::AddClose(W, BB);
+ BBs.Append(BB);
+ }
+ for (int i = 1; i <= BBs.Size(); i++)
+ {
+ bool IsIn = false;
+ for (int j = 1; j <= BBs.Size(); j++)
+ {
+ if (i == j)
+ continue;
+ Standard_Real iXmax, iXmin, iYmax, iYmin, z0, z1;
+ Standard_Real jXmax, jXmin, jYmax, jYmin;
+ BBs(i).Get(iXmin, iYmin, z0, iXmax, iYmax, z1);
+ BBs(j).Get(jXmin, jYmin, z0, jXmax, jYmax, z1);
+ if (!(iXmin > jXmin &&
+ iYmin > jYmin &&
+ iXmax < jXmax &&
+ iYmax < jYmax))
+ IsIn = true;
+ }
+ if (IsIn)
+ {
+ OutWIndex = i;
+ break;
+ }
+ }
+ }
+ else
+ OutWIndex = 1; //one wire => no need to check
+
+ for (int i = 1; i <= allWires.Size(); i++)
+ {
+ TopoDS_Face DF;
+ BB.MakeFace(DF);
+ TopoDS_Wire W = allWires(i);
+ BB.Add(DF, W);
+ BB.UpdateFace(DF, aPlaneSur, TopLoc_Location(), Precision::Confusion());
+ //
+ BRepTopAdaptor_FClass2d FClass(DF, Precision::PConfusion());
+ if ( i == OutWIndex && FClass.PerformInfinitePoint() == TopAbs_IN)