Salome HOME
code revision
authorasl <asl@opencascade.com>
Fri, 16 Oct 2015 11:00:58 +0000 (14:00 +0300)
committerasl <asl@opencascade.com>
Fri, 16 Oct 2015 11:04:01 +0000 (14:04 +0300)
src/HYDROData/HYDROData_LandCoverMap.cxx
src/HYDROData/HYDROData_LandCoverMap.h
src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx

index e6fee2a5dd06a02fd34393a508f2537eafa168ce..2e7ffffa29416343c07d4f4cfec44b7a1e76567d 100644 (file)
@@ -239,14 +239,20 @@ bool EdgeDiscretization( const TopoDS_Edge& theEdge,
 */
 bool HYDROData_LandCoverMap::ExportTelemac( const QString& theFileName, Standard_Real theDeflection ) const
 {
-  TopoDS_Shell aShell;  //TODO: unite all the faces of land covers into the shell
+  TopoDS_Shape aLandCoverMapShape = GetShape();
+  TopTools_ListOfShape aListOfFaces;
+  TopExp_Explorer anExp( aLandCoverMapShape, TopAbs_FACE );
+  for( ; anExp.More(); anExp.Next() )
+    aListOfFaces.Append( anExp.Current() );
+
+  TopoDS_Shape aShape = MergeFaces( aListOfFaces, false );
 
   NCollection_IndexedMap<gp_Pnt> aVerticesMap;
   NCollection_IndexedDataMap< TopoDS_Edge, QList<int> > anEdgesMap;
   NCollection_IndexedDataMap< TopoDS_Face, QList<int> > aFacesMap;
 
   // add into the map all edges existing in the shell
-  TopExp_Explorer anExp1( aShell, TopAbs_EDGE );
+  TopExp_Explorer anExp1( aShape, TopAbs_EDGE );
   for( ; anExp1.More(); anExp1.Next() )
   {
     TopoDS_Edge anEdge = TopoDS::Edge( anExp1.Current() );
@@ -256,7 +262,7 @@ bool HYDROData_LandCoverMap::ExportTelemac( const QString& theFileName, Standard
   }
 
   // add into the map all faces existing in the shell and correspondence between face and edges ids
-  TopExp_Explorer anExp2( aShell, TopAbs_FACE );
+  TopExp_Explorer anExp2( aShape, TopAbs_FACE );
   for( ; anExp2.More(); anExp2.Next() )
   {
     TopoDS_Face aFace = TopoDS::Face( anExp2.Current() );
@@ -418,93 +424,88 @@ bool HYDROData_LandCoverMap::Split( const Handle( HYDROData_PolylineXY )& thePol
 bool HYDROData_LandCoverMap::Merge( const TopTools_ListOfShape& theFaces, const QString& theType )
 {
   // 1. to fuse the faces into the new face
-  TopoDS_Shape aMergedFace;
-  if( MergeFaces( theFaces, true, aMergedFace ) )
+  TopoDS_Shape aMergedFace = MergeFaces( theFaces, true );
+  if( aMergedFace.ShapeType()==TopAbs_FACE )
   {
-    if( aMergedFace.ShapeType()==TopAbs_FACE )
-    {
-      // 2. to remove the merged faces from the current map
-      Remove( theFaces );
+    // 2. to remove the merged faces from the current map
+    Remove( theFaces );
 
-      // 3. to add the face into the map
-      return LocalPartition( TopoDS::Face( aMergedFace ), theType );
-    }
+    // 3. to add the face into the map
+    return LocalPartition( TopoDS::Face( aMergedFace ), theType );
   }
   return false;
 }
 
-bool HYDROData_LandCoverMap::MergeFaces(const TopTools_ListOfShape& theFaces, bool IsToUnify, TopoDS_Shape& outSh)
+TopoDS_Shape HYDROData_LandCoverMap::MergeFaces( const TopTools_ListOfShape& theFaces,
+                                                 bool IsToUnify, double theTolerance )
 {
-  int iErr;
-  TopTools_ListIteratorOfListOfShape aIt;
+  int anError;
+  TopTools_ListIteratorOfListOfShape anIt;
   BOPCol_ListOfShape aLC;
-  aIt.Initialize(theFaces);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS=aIt.Value();
-    aLC.Append(aS);
-  }
+  anIt.Initialize(theFaces);
+  for( ; anIt.More(); anIt.Next() )
+    aLC.Append( anIt.Value() );
+
   BOPAlgo_PaveFiller aPF;
-  aPF.SetArguments(aLC);
-  aPF.SetRunParallel(Standard_False);
-  aPF.SetFuzzyValue(1e-02);
+  aPF.SetArguments( aLC );
+  aPF.SetRunParallel( Standard_False );
+  aPF.SetFuzzyValue( theTolerance );
 
   aPF.Perform();
-  iErr=aPF.ErrorStatus();
-  if (iErr)
-    return false;
+  anError = aPF.ErrorStatus();
+  if( anError )
+    return TopoDS_Shape();
 
-  BOPAlgo_Builder aBuilder;
-  aIt.Initialize(theFaces);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS=aIt.Value();
-    aBuilder.AddArgument(aS);
-  }
+  BOPAlgo_Builder anAlgo;
+  anIt.Initialize( theFaces );
+  for( ; anIt.More(); anIt.Next() )
+    anAlgo.AddArgument( anIt.Value() );
 
-  aBuilder.PerformWithFiller(aPF); 
-  iErr = aBuilder.ErrorStatus();
-  if (iErr)
-    return false;
-  const TopoDS_Shape& aMergedShape=aBuilder.Shape();
-
-  //
-  BRep_Builder BB;
-  TopoDS_Shell she
-  BB.MakeShell(she); 
-  she.Closed(Standard_False);
-  TopExp_Explorer ff(aMergedShape, TopAbs_FACE);
-  for(; ff.More(); ff.Next()
+  anAlgo.PerformWithFiller( aPF ); 
+  anError = anAlgo.ErrorStatus();
+  if( anError )
+    return TopoDS_Shape();
+
+  const TopoDS_Shape& aMergedShape = anAlgo.Shape();
+
+  BRep_Builder aBuilder;
+  TopoDS_Shell aShell
+  aBuilder.MakeShell( aShell ); 
+  aShell.Closed( Standard_False );
+  TopExp_Explorer anExplorer( aMergedShape, TopAbs_FACE );
+  for( ; anExplorer.More(); anExplorer.Next() 
   {
-    const TopoDS_Face& F = TopoDS::Face(ff.Current());
-    if (F.IsNull()
+    const TopoDS_Face& aFace = TopoDS::Face(anExplorer.Current());
+    if( aFace.IsNull() 
       continue;
-    if (F.ShapeType() == TopAbs_FACE) {
-      BB.Add(she, F);
-      she.Closed (Standard_False);
+    if( aFace.ShapeType() == TopAbs_FACE )
+    {
+      aBuilder.Add( aShell, aFace );
+      aShell.Closed( Standard_False );
     }
   }
 
-  if (IsToUnify)
+  TopoDS_Shape aResult;
+  if( IsToUnify )
   {
-    ShapeUpgrade_UnifySameDomain USD;
-    USD.Initialize(she);
-    USD.Build();
-    outSh = USD.Shape();
+    ShapeUpgrade_UnifySameDomain aUSD;
+    aUSD.Initialize( aShell );
+    aUSD.Build();
+    aResult = aUSD.Shape();
   }
   else
-  {
-    outSh = she;
-  }
+    aResult = aShell;
 
-  ff.Init(outSh, TopAbs_FACE);
+  anExplorer.Init( aResult, TopAbs_FACE );
   int i = 0;
-  TopoDS_Face OneF;
-  for(; ff.More(); ff.Next(), i++) 
-    OneF = TopoDS::Face(ff.Current());
-  if (i == 1)
-    outSh = OneF;
+  TopoDS_Face anOneFace;
+  for( ; anExplorer.More(); anExplorer.Next(), i++ ) 
+    anOneFace = TopoDS::Face( anExplorer.Current() );
 
-  return true;
+  if( i == 1 )
+    aResult = anOneFace;
 
+  return aResult;
 }
 
 /**
index fe79b2ec8c749c84783e09a844ce979f7f20b3a8..fad2aceb833121e96279120e91f2c4017aa69d20 100644 (file)
@@ -73,7 +73,7 @@ public:
 
   bool ImportQGIS( const QString& theFileName );
   bool ExportQGIS( const QString& theFileName ) const;
-  bool ExportTelemac( const QString& theFileName, Standard_Real theDeflection ) const;
+  bool ExportTelemac( const QString& theFileName, double theDeflection ) const;
 
   bool Add( const Handle( HYDROData_Object )&, const QString& theType );
   bool Add( const Handle( HYDROData_PolylineXY )&, const QString& theType );
@@ -91,7 +91,8 @@ protected:
   void SetShape( const TopoDS_Shape& );
 
   bool LocalPartition( const TopoDS_Shape&, const QString& theNewType );
-  bool MergeFaces(const TopTools_ListOfShape& theFaces, bool IsToUnify, TopoDS_Shape& outSh);
+  static TopoDS_Shape MergeFaces(const TopTools_ListOfShape& theFaces,
+                      bool IsToUnify, double theTolerance = 1E-3 );
   void StoreLandCovers( const HYDROData_MapOfFaceToStricklerType& );
 
 public:
index 5168523c47438fef7edfb53a01fcd836db7952b3..353e544b22fcff407b4e03c0fc1dd6bf0a8c455d 100644 (file)
@@ -206,7 +206,6 @@ void test_HYDROData_LandCoverMap::test_merge()
   aList.Append( aMap->FindByPoint( aPnt2, aType2 ) );
   CPPUNIT_ASSERT_EQUAL( true, aMap->Merge( aList, "new" ) );
 
-
   TestViewer::show( aMap->GetShape(), AIS_Shaded, true );
   //TestViewer::show( BRepBuilderAPI_MakeEdge( gp_Pnt(aPnt1.X(), aPnt1.Y(), 0), gp_Pnt(aPnt2.X(), aPnt2.Y(), 0) ).Edge(), QColor( Qt::blue ), AIS_Shaded );
   TestViewer::AssertEqual( "LandCoverMap_Merge_1" );