Salome HOME
import & export from DBF
authorisn <isn@opencascade.com>
Mon, 19 Oct 2015 15:01:04 +0000 (18:01 +0300)
committerisn <isn@opencascade.com>
Mon, 19 Oct 2015 15:01:04 +0000 (18:01 +0300)
src/HYDROData/HYDROData_LandCoverMap.cxx
src/HYDROData/HYDROData_LandCoverMap.h
src/HYDROData/HYDROData_ShapeFile.h

index d97e858e40c7b182e200561630c5066185e38b3f..449c443e57a404c5e0db173570de386dc22f87ef 100644 (file)
@@ -20,6 +20,7 @@
 #include <HYDROData_Object.h>
 #include <HYDROData_PolylineXY.h>
 #include <HYDROData_Tool.h>
+#include <HYDROData_ShapeFile.h>
 
 #include <BOPAlgo_BOP.hxx>
 #include <BOPAlgo_Builder.hxx>
@@ -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<int, int> 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<HYDROData_ShapeFile::DBF_AttrValue> 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<HYDROData_ShapeFile::DBF_AttrValue> 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 )
index ce8fd88c9648ee01548b97030a6d6a1022ff02e2..7c3120bdbf653a90a5b6691da1f0b05510a0856f 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <HYDROData_Entity.h>
 #include <TDataStd_ExtStringArray.hxx>
+#include <QMap>
 
 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<int, int> 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 );
index 96cd08ec6762fe66ccecac8086a5e990a1949e69..38ae19f361ad36e930e787c20b02fb2591d549f4 100644 (file)
@@ -44,6 +44,8 @@ class Handle_HYDROData_Entity;
 class HYDROData_ShapeFile 
 {
 
+public:
+
 enum ShapeType
 {
   ShapeType_Polyline,