Salome HOME
Minor changes.
[modules/hydro.git] / src / HYDROData / HYDROData_CalculationCase.cxx
index 326af7419c0f7746e9db70e867cd481ed8489769..3441d309b83d1d5a41c56415ee27cff13b20274c 100644 (file)
@@ -5,12 +5,21 @@
 #include "HYDROData_Document.h"
 #include "HYDROData_Iterator.h"
 #include "HYDROData_NaturalObject.h"
-#include "HYDROData_Polyline.h"
+#include "HYDROData_PolylineXY.h"
 #include "HYDROData_SplitToZonesTool.h"
 #include "HYDROData_Region.h"
 #include "HYDROData_Tool.h"
 #include "HYDROData_Zone.h"
 
+#include <TopoDS.hxx>
+#include <TopoDS_Shell.hxx>
+#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_Sewing.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopExp.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+
 #define CALCULATION_REGIONS_PREF GetName() + "_Reg"
 #define CALCULATION_ZONES_PREF GetName() + "_Zone"
 
@@ -28,6 +37,50 @@ HYDROData_CalculationCase::~HYDROData_CalculationCase()
 {
 }
 
+void HYDROData_CalculationCase::SetName( const QString& theName )
+{
+  QString anOldCaseName = GetName();
+  if ( anOldCaseName != theName )
+  {
+    HYDROData_SequenceOfObjects aRegions = GetRegions();
+
+    HYDROData_SequenceOfObjects::Iterator anIter( aRegions );
+    for ( ; anIter.More(); anIter.Next() )
+    {
+      Handle(HYDROData_Region) aRegion =
+        Handle(HYDROData_Region)::DownCast( anIter.Value() );
+      if ( aRegion.IsNull() )
+        continue;
+
+      QString aRegionName = aRegion->GetName();
+      if ( aRegionName.startsWith( anOldCaseName ) )
+      {
+        aRegionName.replace( anOldCaseName, theName );
+        aRegion->SetName( aRegionName );
+      }
+
+      HYDROData_SequenceOfObjects aZones = aRegion->GetZones();
+      HYDROData_SequenceOfObjects::Iterator anIter( aZones );
+      for ( ; anIter.More(); anIter.Next() )
+      {
+        Handle(HYDROData_Zone) aRegZone =
+          Handle(HYDROData_Zone)::DownCast( anIter.Value() );
+        if ( aRegZone.IsNull() )
+          continue;
+
+        QString aRegionZoneName = aRegZone->GetName();
+        if ( aRegionZoneName.startsWith( anOldCaseName ) )
+        {
+          aRegionZoneName.replace( anOldCaseName, theName );
+          aRegZone->SetName( aRegionZoneName );
+        }
+      }
+    }
+  }
+
+  HYDROData_Entity::SetName( theName );
+}
+
 QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
 {
   QStringList aResList;
@@ -85,7 +138,7 @@ void HYDROData_CalculationCase::SplitGeometryObjects()
   if ( aDocument.IsNull() )
     return;
 
-  Handle(HYDROData_Polyline) aBoundaryPolyline = GetBoundaryPolyline();
+  Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline();
   HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
   if ( aGeomObjects.IsEmpty() )
     return;
@@ -176,9 +229,9 @@ void HYDROData_CalculationCase::RemoveGeometryObjects()
   SetToUpdate( true );
 }
 
-void HYDROData_CalculationCase::SetBoundaryPolyline( const Handle(HYDROData_Polyline)& thePolyline )
+void HYDROData_CalculationCase::SetBoundaryPolyline( const Handle(HYDROData_PolylineXY)& thePolyline )
 {
-  Handle(HYDROData_Polyline) aPrevPolyline = GetBoundaryPolyline();
+  Handle(HYDROData_PolylineXY) aPrevPolyline = GetBoundaryPolyline();
 
   SetReferenceObject( thePolyline, DataTag_Polyline );
 
@@ -186,15 +239,15 @@ void HYDROData_CalculationCase::SetBoundaryPolyline( const Handle(HYDROData_Poly
   SetToUpdate( !IsEqual( aPrevPolyline, thePolyline ) || IsMustBeUpdated() );
 }
 
-Handle(HYDROData_Polyline) HYDROData_CalculationCase::GetBoundaryPolyline() const
+Handle(HYDROData_PolylineXY) HYDROData_CalculationCase::GetBoundaryPolyline() const
 {
-  return Handle(HYDROData_Polyline)::DownCast( 
+  return Handle(HYDROData_PolylineXY)::DownCast( 
            GetReferenceObject( DataTag_Polyline ) );
 }
 
 void HYDROData_CalculationCase::RemoveBoundaryPolyline()
 {
-  Handle(HYDROData_Polyline) aPrevPolyline = GetBoundaryPolyline();
+  Handle(HYDROData_PolylineXY) aPrevPolyline = GetBoundaryPolyline();
 
   ClearReferenceObjects( DataTag_Polyline );
 
@@ -321,3 +374,132 @@ Handle(HYDROData_Region) HYDROData_CalculationCase::addNewRegion()
   return aNewRegion;
 }
 
+TopoDS_Shell HYDROData_CalculationCase::GetShell()
+{
+  TopoDS_Shell aShell;
+
+  TopTools_ListOfShape aFacesList;
+
+  // Make shell containing all region shapes
+  BRepBuilderAPI_Sewing aSewing( Precision::Confusion()*10.0 );
+
+  HYDROData_SequenceOfObjects aCaseRegions = GetRegions();
+  HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions );
+  for ( ; aRegionIter.More(); aRegionIter.Next() ) {
+    Handle(HYDROData_Region) aRegion =
+      Handle(HYDROData_Region)::DownCast( aRegionIter.Value() );
+    if( aRegion.IsNull() ) {
+      continue;
+    }
+
+    TopoDS_Shape aRegionShape = aRegion->GetShape();
+    if( !aRegionShape.IsNull() ) {
+      if ( aRegionShape.ShapeType() == TopAbs_FACE ) {
+        TopoDS_Face aFace = TopoDS::Face( aRegionShape );
+        if ( !aFace.IsNull() ) {
+          aFacesList.Append( aFace );
+          aSewing.Add( aFace );
+        }
+      } else {
+        TopExp_Explorer anExp( aRegionShape, TopAbs_FACE );
+        for ( ; anExp.More(); anExp.Next() ) {
+          TopoDS_Face aFace = TopoDS::Face( anExp.Current() );
+          if ( !aFace.IsNull() ) {
+            aFacesList.Append( aFace );
+            aSewing.Add( aFace );
+          }
+        }
+      }
+    }
+  } // regions iterator
+  
+  aSewing.Perform();
+  TopoDS_Shape aSewedShape = aSewing.SewedShape();
+
+  if ( aSewedShape.ShapeType() == TopAbs_FACE && aCaseRegions.Length() ==1 ) {
+    // create shell from one face
+    BRep_Builder aBuilder;
+    aBuilder.MakeShell( aShell );
+    aBuilder.Add( aShell, aSewedShape);
+  } else {
+    TopExp_Explorer anExpShells( aSewedShape, TopAbs_SHELL );
+    Standard_Integer aNbOfShells = 0;
+    for ( ; anExpShells.More(); anExpShells.Next() ) {
+      aShell = TopoDS::Shell( anExpShells.Current() );
+      aNbOfShells++;
+    }
+
+    if ( aNbOfShells != 1 ) {
+      aShell.Nullify();
+      BRep_Builder aBuilder;
+      aBuilder.MakeShell( aShell );
+
+      TopExp_Explorer anExpFaces( aSewedShape, TopAbs_FACE );
+      for ( ; anExpFaces.More(); anExpFaces.Next() ) {
+        TopoDS_Face aFace = TopoDS::Face( anExpFaces.Current() );
+        if ( !aFace.IsNull() ) {
+          aBuilder.Add( aShell, aFace );
+        }
+      }
+    }
+  }
+
+  if ( !aShell.IsNull() ) {
+    TopTools_IndexedMapOfShape aMapOfFaces;
+    TopExp::MapShapes( aShell, TopAbs_FACE, aMapOfFaces );
+    if ( aMapOfFaces.Extent() != aFacesList.Extent() ) {
+      aShell.Nullify();
+      BRep_Builder aBuilder;
+      aBuilder.MakeShell( aShell );
+
+      TopTools_ListIteratorOfListOfShape anIter( aFacesList );
+      for ( ; anIter.More(); anIter.Next() ) {
+        TopoDS_Face aFace = TopoDS::Face( anIter.Value() );
+        aBuilder.Add( aShell, aFace );
+      }
+    }
+  }
+
+/* TODO: old version
+  // Make shell
+  BRep_Builder aBuilder;
+  aBuilder.MakeShell( aShell );
+
+  // Make shell containing all region shapes
+  HYDROData_SequenceOfObjects aCaseRegions = GetRegions();
+  HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions );
+  for ( ; aRegionIter.More(); aRegionIter.Next() ) {
+    Handle(HYDROData_Region) aRegion =
+      Handle(HYDROData_Region)::DownCast( aRegionIter.Value() );
+    if( aRegion.IsNull() ) {
+      continue;
+    }
+
+    TopoDS_Shape aRegionShape = aRegion->GetShape();
+
+    // Add shape (face or shell) corresponding to the region into the shell
+    if( !aRegionShape.IsNull() ) {
+      if ( aRegionShape.ShapeType() == TopAbs_FACE ) {
+        aBuilder.Add( aShell, aRegionShape );
+      } else {
+        TopExp_Explorer anExp( aRegionShape, TopAbs_FACE );
+        for( ; anExp.More(); anExp.Next() ) {
+          TopoDS_Face aFace = TopoDS::Face( anExp.Current() );
+          if( !aFace.IsNull() ) {
+            aBuilder.Add( aShell, aFace );
+          }
+        }
+      }
+    }
+  } // regions iterator
+*/
+
+  // Nullify shell if it is empty
+  if ( !aShell.IsNull() && !TopoDS_Iterator(aShell).More() ) {
+    aShell.Nullify();
+  }
+
+  return aShell;
+}
+
+