#include <TopExp_Explorer.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <BRep_Builder.hxx>
-
+#include <BRepAlgo_FaceRestrictor.hxx>
+#include <BRepCheck_Analyzer.hxx>
#include <QColor>
#include <QStringList>
#define PYTHON_IMMERSIBLE_ZONE_ID "KIND_IMMERSIBLE_ZONE"
+//#define HYDRODATA_IMZONE_DEB 1
IMPLEMENT_STANDARD_HANDLE(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
IMPLEMENT_STANDARD_RTTIEXT(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
if ( !aPolylineShape.IsNull() &&
aPolylineShape.ShapeType() == TopAbs_WIRE ) {
- TopoDS_Wire aPolylineWire = TopoDS::Wire( aPolylineShape );
+ const TopoDS_Wire& aPolylineWire = TopoDS::Wire( aPolylineShape );
if ( !aPolylineWire.IsNull() ) {
BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True );
aMakeFace.Build();
}
}
} else {
- TopExp_Explorer anExp( aPolylineShape, TopAbs_WIRE );
- for ( ; anExp.More(); anExp.Next() ) {
- TopoDS_Wire aWire = TopoDS::Wire( anExp.Current() );
- aWiresList.Append( aWire );
- }
- }
-
- TopoDS_Compound aCompound;
- BRep_Builder aBuilder;
- aBuilder.MakeCompound( aCompound );
-
- TopTools_ListIteratorOfListOfShape anIter( aWiresList );
- for ( ; anIter.More(); anIter.Next() ) {
- TopoDS_Wire aWire = TopoDS::Wire( anIter.Value() );
- if ( aWire.IsNull() ) {
- continue;
- }
-
- BRepBuilderAPI_MakeFace aMakeFace( aWire, Standard_True );
- aMakeFace.Build();
- if( aMakeFace.IsDone() ) {
- aBuilder.Add( aCompound, aMakeFace.Face() );
- }
- }
-
- aResShape = aCompound;
+ TopExp_Explorer anExp( aPolylineShape, TopAbs_WIRE );
+ for ( ; anExp.More(); anExp.Next() ) {
+ if(!anExp.Current().IsNull()) {
+ const TopoDS_Wire& aWire = TopoDS::Wire( anExp.Current() );
+ aWiresList.Append( aWire );
+ }
+ }
+ if(aWiresList.IsEmpty())
+ return aResShape;
+ BRepAlgo_FaceRestrictor aFR;
+ TopoDS_Face aRefFace;
+ TopoDS_Shape aS = aWiresList.First();
+ BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire(aWiresList.First()), Standard_True );
+ aMakeFace.Build();
+ if( aMakeFace.IsDone() ) {
+ aRefFace = aMakeFace.Face();
+ }
+ if(aRefFace.IsNull())
+ return aResShape;
+ aFR.Init(aRefFace,Standard_False, Standard_True);
+ TopTools_ListIteratorOfListOfShape anIt( aWiresList );
+ for ( ; anIt.More(); anIt.Next() ) {
+ TopoDS_Wire& aWire = TopoDS::Wire( anIt.Value() );
+ if ( aWire.IsNull() )
+ continue;
+ aFR.Add(aWire);
+ }
+ aFR.Perform();
+ if (aFR.IsDone()) {
+ TopoDS_Compound aResult;
+ BRep_Builder aBB;
+ aBB.MakeCompound(aResult);
+ for (; aFR.More(); aFR.Next()) {
+ const TopoDS_Face& aFF = aFR.Current();
+ aBB.Add(aResult,aFF);
+ }
+ BRepCheck_Analyzer aChecker(aResult);
+ if(aChecker.IsValid())
+ aResShape = aResult;
+#ifdef HYDRODATA_IMZONE_DEB
+ else {
+ aResShape = aResult;
+ }
+#endif
+ }
+ }
}
-
return aResShape;
}