From 40025264ffe3c9de3de7b8f20da4cc73b1ad3f14 Mon Sep 17 00:00:00 2001 From: isn Date: Mon, 19 Oct 2015 18:01:04 +0300 Subject: [PATCH] import & export from DBF --- src/HYDROData/HYDROData_LandCoverMap.cxx | 75 ++++++++++++++++++++---- src/HYDROData/HYDROData_LandCoverMap.h | 22 ++++++- src/HYDROData/HYDROData_ShapeFile.h | 2 + 3 files changed, 85 insertions(+), 14 deletions(-) diff --git a/src/HYDROData/HYDROData_LandCoverMap.cxx b/src/HYDROData/HYDROData_LandCoverMap.cxx index d97e858e..449c443e 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.cxx +++ b/src/HYDROData/HYDROData_LandCoverMap.cxx @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -200,25 +201,75 @@ 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, + QMap theIndices ) { - //TODO - return false; + 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(theDBFValues[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 ) diff --git a/src/HYDROData/HYDROData_LandCoverMap.h b/src/HYDROData/HYDROData_LandCoverMap.h index ce8fd88c..7c3120bd 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.h +++ b/src/HYDROData/HYDROData_LandCoverMap.h @@ -21,6 +21,7 @@ #include #include +#include DEFINE_STANDARD_HANDLE( HYDROData_LandCoverMap, HYDROData_Entity ) @@ -68,13 +69,30 @@ public: Handle(TDataStd_ExtStringArray) myArray; }; + enum DBFStatus + { + DBFStatus_OK, + DBFStatus_OPEN_FILE_ERROR, + DBFStatus_NO_SUCH_FIELD_ERROR, + DBFStatus_NO_DBFVALUES_CORRESPONDENCE_WARNING + }; + HYDROData_LandCoverMap(); ~HYDROData_LandCoverMap(); virtual const ObjectKind GetKind() const; - bool ImportQGIS( const QString& theFileName ); - bool ExportQGIS( const QString& theFileName ) const; + DBFStatus ImportDBF( const QString& theDBFFileName, + const QString& theFieldName, + const QStringList& DBFValues, + const QStringList& StricklerTypes, + QMap theIndices ); + + void ExportDBF( const QString& theDBFFileName, + const QString& theFieldName, + const QStringList& theDBFValues, + const QStringList& theStricklerTypes) const; + bool ExportTelemac( const QString& theFileName, double theDeflection ) const; bool Add( const Handle( HYDROData_Object )&, const QString& theType ); diff --git a/src/HYDROData/HYDROData_ShapeFile.h b/src/HYDROData/HYDROData_ShapeFile.h index 96cd08ec..38ae19f3 100644 --- a/src/HYDROData/HYDROData_ShapeFile.h +++ b/src/HYDROData/HYDROData_ShapeFile.h @@ -44,6 +44,8 @@ class Handle_HYDROData_Entity; class HYDROData_ShapeFile { +public: + enum ShapeType { ShapeType_Polyline, -- 2.39.2