X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_LandCoverMap.cxx;h=a429e381ae43931784e002cf925fac6169926e8a;hb=545854182f0363f61284d5abe34c3627d4f3b088;hp=2e7ffffa29416343c07d4f4cfec44b7a1e76567d;hpb=fdfbecc502e984321f7e660d64e6031df35e26c2;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LandCoverMap.cxx b/src/HYDROData/HYDROData_LandCoverMap.cxx index 2e7ffffa..a429e381 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.cxx +++ b/src/HYDROData/HYDROData_LandCoverMap.cxx @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -90,8 +91,12 @@ void HYDROData_LandCoverMap::Iterator::Init( const HYDROData_LandCoverMap& theMa myIterator = 0; else myIterator = new TopoDS_Iterator( aShape ); - myIndex = 0; + theMap.myLab.FindChild( DataTag_Types ).FindAttribute( TDataStd_ExtStringArray::GetID(), myArray ); + if( myArray.IsNull() ) + myIndex = -1; + else + myIndex = myArray->Lower(); } /** @@ -102,6 +107,18 @@ HYDROData_LandCoverMap::Iterator::~Iterator() delete myIterator; } +/** + Return the current 0-based index of the iterator + @return the current index +*/ +int HYDROData_LandCoverMap::Iterator::Index() const +{ + if( myArray.IsNull() ) + return -1; + else + return myIndex - myArray->Lower(); +} + /** Return if the iterator has more elements @return if the iterator has more elements @@ -147,6 +164,18 @@ QString HYDROData_LandCoverMap::Iterator::StricklerType() const return HYDROData_Tool::toQString( myArray->Value( myIndex ) ); } +/** + Set the Strickler type for the current land cover + @param theType the Strickler type +*/ +void HYDROData_LandCoverMap::Iterator::SetStricklerType( const QString& theType ) +{ + if( myArray.IsNull() || myIndex < myArray->Lower() || myIndex > myArray->Upper() ) + return; + else + myArray->SetValue( myIndex, HYDROData_Tool::toExtString( theType ) ); +} + /** Constructor */ @@ -172,25 +201,77 @@ const ObjectKind HYDROData_LandCoverMap::GetKind() const } /** - Import the land cover map from QGIS - @param theFileName the name of file - @return if the import is successful + Load attributes from DBF File +/// */ -bool HYDROData_LandCoverMap::ImportQGIS( const QString& theFileName ) +HYDROData_LandCoverMap::DBFStatus HYDROData_LandCoverMap::ImportDBF( const QString& theDBFFileName, + const QString& theFieldName, + const QStringList& theDBFValues, + const QStringList& theStricklerTypes, + const QList& theIndices ) { - //TODO - return false; + if (theDBFValues.size() != theStricklerTypes.size()) + return DBFStatus_DIFF_SIZE_ERROR; + HYDROData_ShapeFile aDBFImporter; + if (!aDBFImporter.DBF_OpenDBF(theDBFFileName)) + return DBFStatus_OPEN_FILE_ERROR; //cant open file + + QStringList FieldList = aDBFImporter.DBF_GetFieldList(); + int FieldNameIndex = FieldList.indexOf(theFieldName); + if (FieldNameIndex == -1) + return DBFStatus_NO_SUCH_FIELD_ERROR; //no such field + + std::vector theAttrV; + aDBFImporter.DBF_GetAttributeList(FieldNameIndex, theAttrV ); + + bool allOK = true; + Iterator anIt( *this ); + for( ; anIt.More(); anIt.Next() ) + { + int CurIndex = anIt.Index(); + HYDROData_ShapeFile::DBF_AttrValue AValue = theAttrV[theIndices[CurIndex]]; + int StricklerTypesInd = theDBFValues.indexOf(QString(AValue.myStrVal)); + if ( StricklerTypesInd != -1) + anIt.SetStricklerType(theStricklerTypes[StricklerTypesInd]); + else + allOK = false; + } + if (allOK) + return DBFStatus_OK; + else + return DBFStatus_NO_DBFVALUES_CORRESPONDENCE_WARNING; } /** - Export the land cover map to QGIS - @param theFileName the name of file - @return if the export is successful + Export attributes to DBF File +/// */ -bool HYDROData_LandCoverMap::ExportQGIS( const QString& theFileName ) const +void HYDROData_LandCoverMap::ExportDBF( const QString& theDBFFileName, + const QString& theFieldName, + const QStringList& theDBFValues, + const QStringList& theStricklerTypes) const { - //TODO - return false; + HYDROData_ShapeFile anExporter; + std::vector theAttrV; + Iterator anIt( *this ); + for( ; anIt.More(); anIt.Next() ) + { + QString CurST = anIt.StricklerType(); + HYDROData_ShapeFile::DBF_AttrValue aCurAttrV; + aCurAttrV.myIsNull = false; + int StricklerTypesInd = theStricklerTypes.indexOf(CurST); + if (StricklerTypesInd != -1) + { + aCurAttrV.myStrVal = theDBFValues[StricklerTypesInd]; + aCurAttrV.myFieldType = HYDROData_ShapeFile::DBF_FieldType_String; + theAttrV.push_back(aCurAttrV); + } + else + aCurAttrV.myIsNull = true; + } + + anExporter.DBF_WriteFieldAndValues(theDBFFileName, theFieldName, HYDROData_ShapeFile::DBF_FieldType_String, theAttrV, true); + } int HashCode( const gp_Pnt& thePoint, const Standard_Integer theUpper ) @@ -444,7 +525,11 @@ TopoDS_Shape HYDROData_LandCoverMap::MergeFaces( const TopTools_ListOfShape& the BOPCol_ListOfShape aLC; anIt.Initialize(theFaces); for( ; anIt.More(); anIt.Next() ) + { + if (anIt.Value().ShapeType() != TopAbs_FACE) + return TopoDS_Shape(); aLC.Append( anIt.Value() ); + } BOPAlgo_PaveFiller aPF; aPF.SetArguments( aLC ); @@ -619,9 +704,11 @@ bool HYDROData_LandCoverMap::LocalPartition( const TopoDS_Shape& theNewShape, co */ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStricklerType& theMap ) { - TopoDS_Compound aCompound; - BRep_Builder aCompoundBuilder; - aCompoundBuilder.MakeCompound( aCompound ); + TopoDS_Shell aShell; + BRep_Builder aShellBuilder; + aShellBuilder.MakeShell( aShell ); + aShell.Closed( Standard_False ); + TopTools_ListOfShape aListOfFaces; int n = theMap.Size(); Handle( TDataStd_ExtStringArray ) aTypes = @@ -630,12 +717,16 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl for( int i=0; aNFIt.More(); aNFIt.Next(), i++ ) { TopoDS_Face aFace = aNFIt.Key(); + if (aFace.IsNull()) + continue; QString aType = aNFIt.Value(); - aCompoundBuilder.Add( aCompound, aFace ); + aShellBuilder.Add( aShell, aFace ); + aListOfFaces.Append(aFace); aTypes->SetValue( i, HYDROData_Tool::toExtString( aType ) ); } + TopoDS_Shape aMF = MergeFaces(aListOfFaces, false); - SetShape( aCompound ); + SetShape( aListOfFaces.Extent() < 2 ? aShell : MergeFaces(aListOfFaces, false)); } /** @@ -658,3 +749,27 @@ TopoDS_Face HYDROData_LandCoverMap::FindByPoint( const gp_Pnt2d& thePoint, QStri theType = ""; return TopoDS_Face(); } + +/** + Dump to Python + @param theTreatedObjects the map of treated objects +*/ +QStringList HYDROData_LandCoverMap::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +{ + QStringList aResList = dumpObjectCreation( theTreatedObjects ); + QString aName = GetObjPyName(); + + //Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + //setPythonReferenceObject( theTreatedObjects, aResList, aHydAxis, "SetHydraulicAxis" ); + + //HYDROData_SequenceOfObjects aSeqOfProfiles = GetProfiles(); + //for ( int i = 1, aNb = aSeqOfProfiles.Size(); i <= aNb; ++i ) + //{ + //const Handle(HYDROData_Entity) aProfile = aSeqOfProfiles.Value( i ); + //setPythonReferenceObject( theTreatedObjects, aResList, aProfile, "AddProfile" ); + //} + + //TODO + + return aResList; +}