X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_LandCoverMap.cxx;h=c582b16fcc4143a2842f97b97fa89f57f3de270b;hb=a95289fabbb6fbf6f32c06207422c65aafd5bd65;hp=e5dacdf560869235397b3065f0c32672152f8020;hpb=e6d09f89dd71eb9a0af117680f51d99e028e8f9b;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LandCoverMap.cxx b/src/HYDROData/HYDROData_LandCoverMap.cxx index e5dacdf5..c582b16f 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.cxx +++ b/src/HYDROData/HYDROData_LandCoverMap.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -60,13 +61,18 @@ #include #include #include +#include +#include #include #include #include #include +#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" + const char TELEMAC_FORMAT = 'f'; const int TELEMAC_PRECISION = 3; @@ -641,6 +647,7 @@ TopoDS_Shape HYDROData_LandCoverMap::MergeFaces( const TopTools_ListOfShape& the TopTools_IndexedDataMapOfShapeListOfShape* theShHistory, double theTolerance) { + //DEBTRACE("MergeFaces"); int anError; TopTools_ListIteratorOfListOfShape anIt; BOPCol_ListOfShape aLC; @@ -825,6 +832,7 @@ bool HYDROData_LandCoverMap::LocalPartition( const TopoDS_Shape& theNewShape, co aShapesList.Append( anIt.Face() ); aShapesList.Append( theNewShape ); + //DEBTRACE("theNewType " << theNewType); if( aShapesList.Size()==1 && theNewShape.ShapeType()==TopAbs_FACE ) { aNewFaces.Add( TopoDS::Face( theNewShape ), theNewType ); @@ -862,6 +870,7 @@ bool HYDROData_LandCoverMap::LocalPartition( const TopoDS_Shape& theNewShape, co for( ; aMIt.More(); aMIt.Next() ) { //std::cout << " " << aMIt.Value() << std::endl; + //DEBTRACE(aMIt.Value()); int aKey = (int)(uintptr_t)aMIt.Value().TShape().operator->(); aShapesFromNewFace.Add( aKey ); } @@ -871,11 +880,13 @@ bool HYDROData_LandCoverMap::LocalPartition( const TopoDS_Shape& theNewShape, co for( ; anIt.More(); anIt.Next() ) { QString aSType = anIt.StricklerType(); + //DEBTRACE(anIt.StricklerType() << " " << anIt.Face()); //std::cout << "from " << anIt.Face() << ": " << anIt.StricklerType() << std::endl; TopTools_ListOfShape aModified = aBuilder.Modified( anIt.Face() ); // if( aModified.Extent() == 0 ) aModified.Append( anIt.Face() ); + //DEBTRACE(anIt.StricklerType() << " " << anIt.Face()); TopTools_ListIteratorOfListOfShape aMIt( aModified ); for( ; aMIt.More(); aMIt.Next() ) @@ -888,14 +899,21 @@ bool HYDROData_LandCoverMap::LocalPartition( const TopoDS_Shape& theNewShape, co if( isFace && !isAlsoFromNew ) aNewFaces.Add( TopoDS::Face( aShape ), aSType ); } + //DEBTRACE(anIt.StricklerType() << " " << anIt.Face()); } - // c. add the new shape if it is face with its type if( theNewShape.ShapeType()==TopAbs_FACE ) aNewFaces.Add( TopoDS::Face( theNewShape ), theNewType ); + //DEBTRACE(theNewShape << " " << theNewType); // convert map of shape to type to compound and list of types StoreLandCovers( aNewFaces ); + +// anIt.Init( *this ); +// for( ; anIt.More(); anIt.Next() ) +// { +// DEBTRACE(anIt.StricklerType() << " " << anIt.Face()); +// } return true; } @@ -907,6 +925,7 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl { TopTools_ListOfShape aListOfFaces; + //DEBTRACE("theMap.Extent() " << theMap.Extent()); for( int i = 1; i <= theMap.Extent(); i++ ) { TopoDS_Face aFace = theMap.FindKey(i); @@ -916,6 +935,7 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl } TopTools_IndexedDataMapOfShapeListOfShape ShHistory; + ShHistory.Clear(); TopoDS_Shape aResult; if( aListOfFaces.Extent() == 1 ) @@ -925,8 +945,10 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl //remove internal edges //if nothing changes => the result shape should be the same - //in any other case the history of modifications may be broken - aResult = RemoveInternal(aResult); + //hence the map will be empty + + NCollection_IndexedDataMap ShF2FHistory; + RemoveInternal(aResult, &ShF2FHistory); //one face => mark as unchanged if( aListOfFaces.Extent() == 1 ) @@ -938,21 +960,57 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl for( int i = 1; i <= theMap.Extent(); i++ ) { TopoDS_Face aFF = theMap.FindKey(i); + //DEBTRACE(" --- " << aFF); if( aFF.IsNull() ) continue; - TopTools_ListOfShape aLS = ShHistory.FindFromKey(aFF); + //DEBTRACE(ShHistory.IsEmpty()); + //DEBTRACE(aFF.Checked()); + TopTools_ListOfShape aLS; + try + { + aLS = ShHistory.FindFromKey(aFF); //TODO: bug to fix. Observed on an incomplete split of a face + } + catch (...) + { + DEBTRACE("TODO: bug to fix. Observed on an incomplete split of a face"); + //continue; // No, keep aLS empty and propagate the type of the original face + } if (aLS.IsEmpty()) { - QString SType = theMap.FindFromKey(aFF); - aChF2ST.Add(aFF, SType); + //DEBTRACE("--- aLS.IsEmpty()"); + QString aSType = theMap.FindFromKey(aFF); + //DEBTRACE(" --- " << aSType.toStdString()); + if (ShF2FHistory.Contains(aFF)) + { + //DEBTRACE("ShF2FHistory.FindFromKey(aFF) " << ShF2FHistory.FindFromKey(aFF)); + aChF2ST.Add(ShF2FHistory.FindFromKey(aFF), aSType); + } + else + { + //DEBTRACE("aFF " << aFF); + aChF2ST.Add(aFF, aSType); + } } else { + //DEBTRACE("--- !aLS.IsEmpty()"); TopTools_ListIteratorOfListOfShape anIt(aLS); for (; anIt.More(); anIt.Next()) { QString aSType = theMap.FindFromKey(aFF); - aChF2ST.Add(TopoDS::Face(anIt.Value()), aSType); + //DEBTRACE(" --- " << aSType.toStdString()); + const TopoDS_Face& aMF = TopoDS::Face(anIt.Value()); + //if (ShF2FHistory.Contains(aFF)) + if (ShF2FHistory.Contains(aMF)) + { + //DEBTRACE("ShF2FHistory.FindFromKey(aMF) " << ShF2FHistory.FindFromKey(aFF)); + aChF2ST.Add(ShF2FHistory.FindFromKey(aMF), aSType); + } + else + { + //DEBTRACE("aMF " << aMF); + aChF2ST.Add(aMF, aSType); + } } } } @@ -967,6 +1025,7 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl QString aST = ""; if (aChF2ST.Contains(aFace)) aST = aChF2ST.FindFromKey(aFace); + //DEBTRACE("aFace " << aFace << " aST " << aST.toStdString()); aSTypes << aST; } @@ -974,6 +1033,7 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl int k = 0; foreach (QString aST, aSTypes) { + //DEBTRACE("aST " << aST.toStdString()); aTypes->SetValue( k, HYDROData_Tool::toExtString( aST ) ); k++; } @@ -1049,35 +1109,56 @@ QStringList HYDROData_LandCoverMap::DumpToPython( const QString& thePyScri return aResList; } -TopoDS_Shape HYDROData_LandCoverMap::RemoveInternal(const TopoDS_Shape& InSh) +void HYDROData_LandCoverMap::RemoveInternal(TopoDS_Shape& ShToRebuild, NCollection_IndexedDataMap* aF2FReplace) { + //DEBTRACE("RemoveInternal"); //Shape must be topologically correct - TopExp_Explorer anExp(InSh, TopAbs_EDGE); - TopTools_ListOfShape anEdgesToRemove; - - for(; anExp.More(); anExp.Next() ) + TopExp_Explorer anExpF(ShToRebuild, TopAbs_FACE); + // + for(; anExpF.More(); anExpF.Next() ) { - TopoDS_Edge CurEdge = TopoDS::Edge(anExp.Current()); - if (CurEdge.Orientation() == TopAbs_INTERNAL) - anEdgesToRemove.Append(CurEdge); + TopoDS_Face CurFace = TopoDS::Face(anExpF.Current()); + // + TopExp_Explorer anExp(CurFace, 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); + } + // + if (!anEdgesToRemove.IsEmpty()) + { + Handle_ShapeBuild_ReShape aReshape = new ShapeBuild_ReShape(); + TopoDS_Shape OutF = aReshape->Apply(CurFace); + TopTools_ListIteratorOfListOfShape aIt(anEdgesToRemove); + for (; aIt.More(); aIt.Next()) + aReshape->Remove(aIt.Value()); + OutF = aReshape->Apply(CurFace); + + Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape; + sfs->Init(OutF); + sfs->Perform(); + OutF = sfs->Shape(); + aF2FReplace->Add(CurFace, TopoDS::Face(OutF)); + } } - - if (!anEdgesToRemove.IsEmpty()) + // + Handle_ShapeBuild_ReShape anExtReshape = new ShapeBuild_ReShape(); + for (int i = 1; i <= aF2FReplace->Extent(); i++) { - 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(); + TopoDS_Face aFK = aF2FReplace->FindKey(i); + TopoDS_Face aFV = aF2FReplace->FindFromIndex(i); + anExtReshape->Replace(aFK, aFV); + ShToRebuild = anExtReshape->Apply(ShToRebuild); } - else - return InSh; +// for (int i = 1; i <= aF2FReplace->Extent(); i++) +// { +// DEBTRACE("aF2FReplace key,value " << aF2FReplace->FindKey(i) << " " << aF2FReplace->FindFromIndex(i)); +// } + } void HYDROData_LandCoverMap::SetTransparency( double theTransparency ) @@ -1097,7 +1178,7 @@ bool HYDROData_LandCoverMap::ImportSHP( const QString& theSHPFileName, QStringList aPolyList; TopTools_SequenceOfShape aFaces; int aSHapeType = -1; - int Stat = anImporter.ImportPolygons(theSHPFileName, aPolyList, aFaces, aSHapeType); + int Stat = anImporter.ImportPolygons(HYDROData_Document::Document(1), theSHPFileName, aPolyList, aFaces, aSHapeType); // if (Stat != 1) return false; @@ -1138,7 +1219,7 @@ bool HYDROData_LandCoverMap::ExportSHP( const QString& theSHPFileName, bool bUse { HYDROData_ShapeFile anExporter; QStringList aList; - anExporter.Export(theSHPFileName, this, aList, bUseDiscr, theDefl ); + anExporter.Export(HYDROData_Document::Document(1), theSHPFileName, this, aList, bUseDiscr, theDefl ); if (aList.empty()) return true; else @@ -1170,3 +1251,45 @@ bool HYDROData_LandCoverMap::CheckLinear() } return true; } + +void HYDROData_LandCoverMap::UpdateLocalCS( double theDx, double theDy ) +{ + TopoDS_Shape aShape = GetShape(); + TopoDS_Shape aLocatedShape = HYDROData_ShapesTool::Translated( aShape, theDx, theDy, 0 ); + SetShape( aLocatedShape ); +} + +void HYDROData_LandCoverMap::ClassifyPoints( const std::vector& thePoints, std::vector >& theTypes ) const +{ + HYDROData_LCM_FaceClassifier FC(this); + FC.Classify(thePoints, theTypes, NULL); +} + +void HYDROData_LandCoverMap::ClassifyPoints( const std::vector& thePoints, + Handle(HYDROData_StricklerTable) theTable, + std::vector& theCoeffs, double DefValue, bool UseMax ) const +{ + std::vector > Types; + HYDROData_LCM_FaceClassifier FC(this); + FC.Classify(thePoints, Types, NULL); + theCoeffs.resize(thePoints.size()); + for (size_t i = 0; i < Types.size(); i++) + { + const std::set& SStr = Types[i]; + if (SStr.empty()) + theCoeffs[i] = DefValue; + else + { + std::set::const_iterator it; + std::vector C1(SStr.size()); + for (it = SStr.begin(); it != SStr.end(); ++it) + C1.push_back(theTable->Get( *it, DefValue )); + double Val; + if (UseMax) + Val = *(std::max_element( C1.begin(), C1.end() ) ); + else + Val = *(std::min_element( C1.begin(), C1.end() ) ); + theCoeffs[i] = Val; + } + } +}