From: asl Date: Fri, 16 Oct 2015 11:00:58 +0000 (+0300) Subject: code revision X-Git-Tag: v1.5~101^2~1 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=5365963a4377e66070235f9c24c48caa119d9858;p=modules%2Fhydro.git code revision --- diff --git a/src/HYDROData/HYDROData_LandCoverMap.cxx b/src/HYDROData/HYDROData_LandCoverMap.cxx index e6fee2a5..2e7ffffa 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.cxx +++ b/src/HYDROData/HYDROData_LandCoverMap.cxx @@ -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 aVerticesMap; NCollection_IndexedDataMap< TopoDS_Edge, QList > anEdgesMap; NCollection_IndexedDataMap< TopoDS_Face, QList > 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; } /** diff --git a/src/HYDROData/HYDROData_LandCoverMap.h b/src/HYDROData/HYDROData_LandCoverMap.h index fe79b2ec..fad2aceb 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.h +++ b/src/HYDROData/HYDROData_LandCoverMap.h @@ -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: diff --git a/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx b/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx index 5168523c..353e544b 100644 --- a/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx +++ b/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx @@ -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" );