]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Improve of retrieving shapes from region and case.
authormzn <mzn@opencascade.com>
Wed, 20 Nov 2013 15:50:57 +0000 (15:50 +0000)
committermzn <mzn@opencascade.com>
Wed, 20 Nov 2013 15:50:57 +0000 (15:50 +0000)
src/HYDROData/HYDROData_CalculationCase.cxx
src/HYDROData/HYDROData_Region.cxx

index 39e5489ed3e0d01b0d18158d517b59e1596064d7..301d043bfc8b4a50e259544ffce0349f912a0a82 100644 (file)
 #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>
 
 #define CALCULATION_REGIONS_PREF GetName() + "_Reg"
 #define CALCULATION_ZONES_PREF GetName() + "_Zone"
@@ -328,12 +331,60 @@ TopoDS_Shell HYDROData_CalculationCase::GetShell()
 {
   TopoDS_Shell aShell;
 
+  // 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() ) {
+      aSewing.Add( aRegionShape );
+    }
+  } // 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 );
+        }
+      }
+    }
+  }
+
+/* TODO: old version
   // Make shell
   BRep_Builder aBuilder;
   aBuilder.MakeShell( aShell );
 
-  bool isShellEmpty = true;
-
   // Make shell containing all region shapes
   HYDROData_SequenceOfObjects aCaseRegions = GetRegions();
   HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions );
@@ -348,13 +399,23 @@ TopoDS_Shell HYDROData_CalculationCase::GetShell()
 
     // Add shape (face or shell) corresponding to the region into the shell
     if( !aRegionShape.IsNull() ) {
-      aBuilder.Add( aShell, aRegionShape );
-      isShellEmpty = false;
+      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
+*/
 
-  // Check if no shapes were added to the shell
-  if ( isShellEmpty ) {
+  // Nullify shell if it is empty
+  if ( !aShell.IsNull() && !TopoDS_Iterator(aShell).More() ) {
     aShell.Nullify();
   }
 
index 384b4bd2400a7b5b913f5d2db19916162f687fcf..090171f9e8b09619801de27ad7976baa15c1c306 100644 (file)
 #include <TopoDS_Face.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopExp_Explorer.hxx>
-#include <ShapeUpgrade_UnifySameDomain.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopExp.hxx>
 #include <BRep_Builder.hxx>
 #include <BRepAlgoAPI_Fuse.hxx>
+#include <ShapeUpgrade_UnifySameDomain.hxx>
 
 #include <QStringList>
 
@@ -196,19 +197,16 @@ TopoDS_Shape HYDROData_Region::GetShape() const
         }
       } // faces iterator
 
+      // Check the result of fuse operation
       if ( !aFuseShape.IsNull() ) {
         ShapeUpgrade_UnifySameDomain anUnifier( aFuseShape );
-        anUnifier.UnifyFacesAndEdges();
         anUnifier.Build();
         TopoDS_Shape anUnitedShape = anUnifier.Shape();
 
-        TopExp_Explorer anExp( anUnitedShape, TopAbs_FACE );
-        if ( anExp.More() ) {
-          aRegionFace = TopoDS::Face( anExp.Current() );
-          anExp.Next();
-          if ( anExp.More() ) {
-            aRegionFace.Nullify();
-          }
+        TopTools_IndexedMapOfShape aMapOfFaces;
+        TopExp::MapShapes( anUnitedShape, TopAbs_FACE, aMapOfFaces );
+        if ( aMapOfFaces.Extent() == 1 ) {
+          aRegionFace = TopoDS::Face( aMapOfFaces(1) );
         }
       }
     }