X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_LandCoverMap.cxx;h=969ce6d077423bc7f159fe8fedc31d29dfa19c82;hb=670039d7a5d25b1da51956b668f212756d31a86e;hp=d33d90de40047b6a2053e075817cdea06352a0af;hpb=d4bb018666a815232d1dbd84c90dfa30b995168b;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LandCoverMap.cxx b/src/HYDROData/HYDROData_LandCoverMap.cxx index d33d90de..969ce6d0 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.cxx +++ b/src/HYDROData/HYDROData_LandCoverMap.cxx @@ -39,10 +39,18 @@ #include #include #include +#include #include #include #include #include +#include +#include +#include +#include +#include +#include + #include #include @@ -59,16 +67,16 @@ IMPLEMENT_STANDARD_RTTIEXT(HYDROData_LandCoverMap, HYDROData_Entity) Constructor @param theMap the land cover map to iterate through */ -HYDROData_LandCoverMap::Iterator::Iterator( const HYDROData_LandCoverMap& theMap ) +HYDROData_LandCoverMap::Explorer::Explorer( const HYDROData_LandCoverMap& theMap ) { Init( theMap ); } -HYDROData_LandCoverMap::Iterator::Iterator( const Handle( HYDROData_LandCoverMap )& theMap ) +HYDROData_LandCoverMap::Explorer::Explorer( const Handle( HYDROData_LandCoverMap )& theMap ) { if( theMap.IsNull() ) { - myIterator = 0; + myExplorer = 0; myIndex = -1; } else @@ -79,13 +87,16 @@ HYDROData_LandCoverMap::Iterator::Iterator( const Handle( HYDROData_LandCoverMap Initialize the iterator @param theMap the land cover map to iterate through */ -void HYDROData_LandCoverMap::Iterator::Init( const HYDROData_LandCoverMap& theMap ) +void HYDROData_LandCoverMap::Explorer::Init( const HYDROData_LandCoverMap& theMap ) { TopoDS_Shape aShape = theMap.GetShape(); if( aShape.IsNull() ) - myIterator = 0; + myExplorer = 0; else - myIterator = new TopoDS_Iterator( aShape ); + { + myExplorer = new TopExp_Explorer(); + myExplorer->Init( aShape, TopAbs_FACE ); + } theMap.myLab.FindChild( DataTag_Types ).FindAttribute( TDataStd_ExtStringArray::GetID(), myArray ); if( myArray.IsNull() ) @@ -97,16 +108,16 @@ void HYDROData_LandCoverMap::Iterator::Init( const HYDROData_LandCoverMap& theMa /** Destructor */ -HYDROData_LandCoverMap::Iterator::~Iterator() +HYDROData_LandCoverMap::Explorer::~Explorer() { - delete myIterator; + delete myExplorer; } /** Return the current 0-based index of the iterator @return the current index */ -int HYDROData_LandCoverMap::Iterator::Index() const +int HYDROData_LandCoverMap::Explorer::Index() const { if( myArray.IsNull() ) return -1; @@ -118,19 +129,19 @@ int HYDROData_LandCoverMap::Iterator::Index() const Return if the iterator has more elements @return if the iterator has more elements */ -bool HYDROData_LandCoverMap::Iterator::More() const +bool HYDROData_LandCoverMap::Explorer::More() const { - return !myArray.IsNull() && myIterator && myIterator->More(); + return !myArray.IsNull() && myExplorer && myExplorer->More(); } /** Move iterator to the next element */ -void HYDROData_LandCoverMap::Iterator::Next() +void HYDROData_LandCoverMap::Explorer::Next() { - if( myIterator ) + if( myExplorer ) { - myIterator->Next(); + myExplorer->Next(); myIndex++; } } @@ -139,10 +150,10 @@ void HYDROData_LandCoverMap::Iterator::Next() Get the current land cover (face) @return the land cover's face */ -TopoDS_Face HYDROData_LandCoverMap::Iterator::Face() const +TopoDS_Face HYDROData_LandCoverMap::Explorer::Face() const { - if( myIterator ) - return TopoDS::Face( myIterator->Value() ); + if( myExplorer ) + return TopoDS::Face( myExplorer->Current() ); else return TopoDS_Face(); } @@ -151,7 +162,7 @@ TopoDS_Face HYDROData_LandCoverMap::Iterator::Face() const Get the current land cover's Strickler type @return the land cover's Strickler type */ -QString HYDROData_LandCoverMap::Iterator::StricklerType() const +QString HYDROData_LandCoverMap::Explorer::StricklerType() const { if( myArray.IsNull() || myIndex < myArray->Lower() || myIndex > myArray->Upper() ) return ""; @@ -163,7 +174,7 @@ QString HYDROData_LandCoverMap::Iterator::StricklerType() const Set the Strickler type for the current land cover @param theType the Strickler type */ -void HYDROData_LandCoverMap::Iterator::SetStricklerType( const QString& theType ) +void HYDROData_LandCoverMap::Explorer::SetStricklerType( const QString& theType ) { if( myArray.IsNull() || myIndex < myArray->Lower() || myIndex > myArray->Upper() ) return; @@ -197,7 +208,7 @@ const ObjectKind HYDROData_LandCoverMap::GetKind() const int HYDROData_LandCoverMap::GetLCCount() const { - Iterator anIt( *this ); + Explorer anIt( *this ); int i = 0; for( ; anIt.More(); anIt.Next() ) i++; @@ -206,7 +217,7 @@ int HYDROData_LandCoverMap::GetLCCount() const bool HYDROData_LandCoverMap::IsEmpty() const { - Iterator anIt( *this ); + Explorer anIt( *this ); if ( !anIt.More() ) return true; else @@ -238,7 +249,7 @@ HYDROData_LandCoverMap::DBFStatus HYDROData_LandCoverMap::ImportDBF( const QStri aDBFImporter.DBF_GetAttributeList(FieldNameIndex, theAttrV ); bool allOK = true; - Iterator anIt( *this ); + Explorer anIt( *this ); for( ; anIt.More(); anIt.Next() ) { int CurIndex = anIt.Index(); @@ -268,7 +279,7 @@ void HYDROData_LandCoverMap::ExportDBF( const QString& theDBFFileName, return; HYDROData_ShapeFile anExporter; std::vector theAttrV; - Iterator anIt( *this ); + Explorer anIt( *this ); for( ; anIt.More(); anIt.Next() ) { QString CurST = anIt.StricklerType(); @@ -504,7 +515,7 @@ bool HYDROData_LandCoverMap::Remove( const TopTools_ListOfShape& theFacesToRemov aFacesToRemove.Add( TopoDS::Face( aShape ), "" ); } - Iterator anIt( *this ); + Explorer anIt( *this ); for( ; anIt.More(); anIt.Next() ) if( !aFacesToRemove.Contains( anIt.Face() ) ) aNewFaces.Add( anIt.Face(), anIt.StricklerType() ); @@ -640,8 +651,18 @@ TopoDS_Shape HYDROData_LandCoverMap::MergeFaces( const TopTools_ListOfShape& the for( ; anExplorer.More(); anExplorer.Next(), n++ ) anOneFace = TopoDS::Face( anExplorer.Current() ); - if( n == 1 ) + if (n == 1) aResult = anOneFace; + else if (aResult.ShapeType() == TopAbs_SHELL) + { + BRepCheck_Shell aBCS(TopoDS::Shell(aResult)); + if (aBCS.Status().First() != BRepCheck_NoError) + { + ShapeFix_Shell aFixer; + aFixer.FixFaceOrientation(TopoDS::Shell(aResult), 1); + aResult = aFixer.Shape(); + } + } return aResult; } @@ -664,7 +685,7 @@ bool HYDROData_LandCoverMap::ChangeType( const TopTools_ListOfShape& theFaces, c } int aNbChanges = 0; - Iterator anIt( *this ); + Explorer anIt( *this ); for( ; anIt.More(); anIt.Next() ) if( aFacesToChangeType.Contains( anIt.Face() ) ) { @@ -694,7 +715,7 @@ QString HYDROData_LandCoverMap::StricklerType( const TopoDS_Face& theLandCover ) { QString aType = ""; - Iterator anIt( *this ); + Explorer anIt( *this ); for( ; anIt.More(); anIt.Next() ) if( anIt.Face().IsEqual( theLandCover) ) { @@ -730,7 +751,7 @@ bool HYDROData_LandCoverMap::LocalPartition( const TopoDS_Shape& theNewShape, co HYDROData_MapOfFaceToStricklerType aNewFaces; // add faces to shapes list - Iterator anIt( *this ); + Explorer anIt( *this ); for( ; anIt.More(); anIt.Next() ) aShapesList.Append( anIt.Face() ); aShapesList.Append( theNewShape ); @@ -835,16 +856,18 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl TopoDS_Shape aResult; if( aListOfFaces.Extent() == 1 ) { - TopoDS_Shell aShell; + /*TopoDS_Shell aShell; BRep_Builder aShellBuilder; aShellBuilder.MakeShell( aShell ); aShell.Closed( Standard_False ); - aShellBuilder.Add( aShell, aListOfFaces.First() ); - aResult = aShell; + aShellBuilder.Add( aShell, aListOfFaces.First() );*/ + aResult = aListOfFaces.First(); //aShell; } else if( aListOfFaces.Extent() > 1 ) aResult = MergeFaces( aListOfFaces, false ); + //remove internal edges + aResult = RemoveInternal(aResult); SetShape( aResult ); } @@ -857,7 +880,7 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl TopoDS_Face HYDROData_LandCoverMap::FindByPoint( const gp_Pnt2d& thePoint, QString& theType ) const { //TODO: some more optimal algorithm - Iterator anIt( *this ); + Explorer anIt( *this ); for( ; anIt.More(); anIt.Next() ) if( HYDROData_Tool::ComputePointState( thePoint.XY(), anIt.Face() ) == TopAbs_IN ) { @@ -892,3 +915,30 @@ QStringList HYDROData_LandCoverMap::DumpToPython( MapOfTreatedObjects& theTreate return aResList; } + +TopoDS_Shape HYDROData_LandCoverMap::RemoveInternal(const TopoDS_Shape& InSh) +{ + //Shape must be topologically correct + TopExp_Explorer anExp(InSh, TopAbs_EDGE); + TopTools_ListOfShape anEdgesToRemove; + + for(; anExp.More(); anExp.Next() ) + { + TopoDS_Edge CurEdge = TopoDS::Edge(anExp.Current()); + if (CurEdge.Orientation() == TopAbs_INTERNAL) + anEdgesToRemove.Append(CurEdge); + } + + Handle_ShapeBuild_ReShape aReshape = new ShapeBuild_ReShape(); + TopoDS_Shape OutSh = aReshape->Apply(InSh); + TopTools_ListIteratorOfListOfShape aIt(anEdgesToRemove); + for (; aIt.More(); aIt.Next()) + aReshape->Remove(aIt.Value()); + OutSh = aReshape->Apply(InSh); + + Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape; + sfs->Init(OutSh); + sfs->Perform(); + return sfs->Shape(); + +}