]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Dump of document data to Python sript.
authoradv <adv@opencascade.com>
Fri, 6 Sep 2013 13:11:32 +0000 (13:11 +0000)
committeradv <adv@opencascade.com>
Fri, 6 Sep 2013 13:11:32 +0000 (13:11 +0000)
src/HYDROData/HYDROData_Application.cxx
src/HYDROData/HYDROData_Application.h
src/HYDROData/HYDROData_Document.cxx
src/HYDROData/HYDROData_Document.h
src/HYDROData/HYDROData_Object.cxx
src/HYDROData/HYDROData_Object.h
src/HYDROData/HYDROData_Tool.cxx
src/HYDROData/HYDROData_Tool.h

index 3c03259b597c8cadfde7756745c6c8e746c0e42b..bd65e98f6f6116e042df3df04a49a90e197be211 100644 (file)
@@ -17,10 +17,30 @@ HYDROData_Application* HYDROData_Application::GetApplication()
 }
 
 //=======================================================================
-//function : getDocument
+//function : GetDocument
 //purpose  : 
 //=======================================================================
-Handle(HYDROData_Document) HYDROData_Application::GetDocument(int theStudyID)
+bool HYDROData_Application::GetDocumentId(const Handle(HYDROData_Document)& theDocument,
+                                          int&                              theDocId) const
+{
+  DataMapOfStudyIDDocument::Iterator aMapit( myDocuments );
+  for ( ; aMapit.More(); aMapit.Next() )
+  {
+    if ( aMapit.Value() != theDocument )
+      continue;
+
+    theDocId = aMapit.Key();
+    return true;
+  }
+
+  return false;
+}
+
+//=======================================================================
+//function : GetDocument
+//purpose  : 
+//=======================================================================
+Handle(HYDROData_Document) HYDROData_Application::GetDocument(int theStudyID) const
 {
   if (myDocuments.IsBound(theStudyID)) {
     return myDocuments.Find(theStudyID);
@@ -44,7 +64,7 @@ HYDROData_Application::HYDROData_Application ()
 //function : addDocument
 //purpose  : 
 //=======================================================================
-void HYDROData_Application::AddDocument(int theStudyID, Handle(HYDROData_Document) theDocument)
+void HYDROData_Application::AddDocument(int theStudyID, const Handle(HYDROData_Document)& theDocument)
 {
   myDocuments.Bind(theStudyID, theDocument);
 }
@@ -53,7 +73,7 @@ void HYDROData_Application::AddDocument(int theStudyID, Handle(HYDROData_Documen
 //function : removeDocument
 //purpose  : 
 //=======================================================================
-void HYDROData_Application::RemoveDocument(Handle(HYDROData_Document) theDocument)
+void HYDROData_Application::RemoveDocument(const Handle(HYDROData_Document)& theDocument)
 {
   DataMapOfStudyIDDocument::Iterator anIter(myDocuments);
   for(; anIter.More(); anIter.Next())
index b0fa53db4a5adb69840cbe6ed81308a4521c2514..b20eaefc8d820e7b8563fbd697485b71164e07ab 100644 (file)
@@ -38,13 +38,17 @@ public: // Redefined OCAF methods
 
 private:
   //! Returns document by its study ID, if document doesn't exists return null
-  Handle(HYDROData_Document) GetDocument(int theStudyID);
+  Handle(HYDROData_Document) GetDocument(int theStudyID) const;
+
+  //! Get study id by document instance, if document doesn't exists return false
+  bool GetDocumentId(const Handle(HYDROData_Document)& theDocument,
+                     int&                              theDocId) const;
 
   //! Appends document to the application
-  void AddDocument(int theStudyID, Handle(HYDROData_Document) theDocument);
+  void AddDocument(int theStudyID, const Handle(HYDROData_Document)& theDocument);
 
   //! Removes document from the application
-  void RemoveDocument(Handle(HYDROData_Document) theDocument);
+  void RemoveDocument( const Handle(HYDROData_Document)& theDocument );
 
   //! map from SALOME study ID to the document
   DataMapOfStudyIDDocument myDocuments;
index 722a39e84c9dff6b01e4678b99b3a64b8b6e82e3..da06a2c8ba819b0fb09bcdf9daa06b6cd771fe55 100644 (file)
@@ -1,6 +1,8 @@
+
 #include <HYDROData_Document.h>
 #include <HYDROData_Application.h>
 #include <HYDROData_Iterator.h>
+#include <HYDROData_Tool.h>
 
 #include <TDataStd_Integer.hxx>
 
@@ -13,6 +15,8 @@
 IMPLEMENT_STANDARD_HANDLE(HYDROData_Document,MMgt_TShared)
 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Document,MMgt_TShared)
 
+#define PYTHON_DOC_NAME "doc"
+
 static const int UNDO_LIMIT = 10; // number of possible undo operations in the module
 
 static const int TAG_PROPS = 1; // general properties tag
@@ -40,6 +44,12 @@ bool HYDROData_Document::HasDocument(const int theStudyID)
   return !aResult.IsNull();
 }
 
+bool HYDROData_Document::DocumentId(const Handle(HYDROData_Document)& theDocument,
+                                    int&                              theDocId )
+{
+  return HYDROData_Application::GetApplication()->GetDocumentId(theDocument, theDocId);
+}
+
 Data_DocError HYDROData_Document::Load(const char* theFileName, const int theStudyID)
 {
   Handle(TDocStd_Document) aResult;
@@ -134,22 +144,62 @@ bool HYDROData_Document::DumpToPython( const QString& theFileName ) const
 {
   // Try to open the file
   QFile aFile( theFileName );
-  if ( !aFile.exists() || !aFile.open( QIODevice::WriteOnly ) )
+  if ( !aFile.open( QIODevice::WriteOnly ) )
     return false;
 
-  QMap<QString,Handle(HYDROData_Object)> aDumpedObjects;
+  MapOfTreatedObjects aTreatedObjects;
+
+  // Dump header for python script
+  QStringList aHeaderDump = DumpToPython( aTreatedObjects );
+  if ( aHeaderDump.isEmpty() )
+    return false;
 
-  bool aRes =    dumpPartitionToPython( aFile, aDumpedObjects, KIND_IMAGE      );
-  aRes = aRes && dumpPartitionToPython( aFile, aDumpedObjects, KIND_POLYLINE   );
-  aRes = aRes && dumpPartitionToPython( aFile, aDumpedObjects, KIND_BATHYMETRY );
+  HYDROData_Tool::WriteStringsToFile( aFile, aHeaderDump );
+
+  bool aRes = true;
+
+  // Dump all model objects to Python script
+  aRes = aRes && dumpPartitionToPython( aFile, aTreatedObjects, KIND_IMAGE      );
+  aRes = aRes && dumpPartitionToPython( aFile, aTreatedObjects, KIND_POLYLINE   );
+  aRes = aRes && dumpPartitionToPython( aFile, aTreatedObjects, KIND_BATHYMETRY );
 
   return aRes;
 }
 
-bool HYDROData_Document::dumpPartitionToPython(
-  QFile&                                  theFile,
-  QMap<QString,Handle(HYDROData_Object)>& theDumpedObjects,
-  const ObjectKind&                       theObjectKind ) const
+QString HYDROData_Document::GetDocPyName() const
+{
+  QString aDocName = PYTHON_DOC_NAME;
+  
+  int aDocId = 1;
+  if ( DocumentId( this, aDocId ) )
+    aDocName += "_" + QString::number( aDocId );
+  
+  return aDocName;
+}
+
+QStringList HYDROData_Document::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
+{
+  QString aDocName = GetDocPyName();
+
+  // Append document in to the map of treated objects to prevent names overlaping
+  theTreatedObjects.insert( aDocName, this );
+
+  int aDocId = 1;
+  if ( !DocumentId( this, aDocId ) )
+    aDocId = 1;
+
+  QStringList aResScript;
+
+  aResScript << QString( "from HYDROData import *" );
+  aResScript << QString( "" );
+  aResScript << QString( "%1 = HYDROData_Document.Document( %2 );" ).arg( aDocName ).arg( aDocId );
+
+  return aResScript;
+}
+
+bool HYDROData_Document::dumpPartitionToPython( QFile&               theFile,
+                                                MapOfTreatedObjects& theTreatedObjects,
+                                                const ObjectKind&    theObjectKind ) const
 {
   if ( !theFile.isOpen() )
     return false;
@@ -166,20 +216,14 @@ bool HYDROData_Document::dumpPartitionToPython(
       continue;
 
     QString anObjName = anObject->GetName();
-    if ( theDumpedObjects.contains( anObjName ) )
+    if ( theTreatedObjects.contains( anObjName ) )
       continue;
 
-    theDumpedObjects.insert( anObjName, anObject );
+    theTreatedObjects.insert( anObjName, anObject );
 
-    QStringList anObjDump = anObject->DumpToPython();
-    if ( anObjDump.isEmpty() )
-      continue;
+    QStringList anObjDump = anObject->DumpToPython( theTreatedObjects );
     
-    QString anObjDumpStr = anObjDump.join( "\n" );
-    if ( anObjDumpStr.isEmpty() )
-      continue;
-
-    anOutStream << anObjDumpStr << "\n";
+    HYDROData_Tool::WriteStringsToFile( theFile, anObjDump );
   }
   
   return aRes;
index 1ec24ee7e11540fc86a1c47665f771660f690094..28ac1f4133ccafc2cf9042fc7f9f79704a17e42d 100644 (file)
@@ -8,7 +8,6 @@
 
 class QFile;
 
-
 /**
  * Errors that could appear on document open/save actions.
  * If there is no error, it is "OK".
@@ -45,6 +44,10 @@ public:
   //! Returns true if data model contains document for this study
   HYDRODATA_EXPORT static bool HasDocument(const int theStudyID);
 
+  //! Get study id by document instance, if document doesn't exists return false
+  HYDRODATA_EXPORT static bool DocumentId( const Handle(HYDROData_Document)& theDocument,
+                                           int&                              theDocId );
+
   //! Loads the OCAF document from the file.
   //! \param theFileName full name of the file to load
   //! \param theStudyID identifier of the SALOME study to associate with loaded file
@@ -59,11 +62,17 @@ public:
   //! Removes document data
   HYDRODATA_EXPORT void Close();
 
+  // Returns name of document instance in python dump script
+  HYDRODATA_EXPORT QString GetDocPyName() const;
+
   //! Dump study document to Python script representation.
   //! \param theFileName full name of the file to store
   //! \returns true if document has been successfuly dumped
   HYDRODATA_EXPORT bool DumpToPython( const QString& theFileName ) const;
 
+  //! Dump model data to Python script representation.
+  HYDRODATA_EXPORT virtual QStringList DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const;
+
   //! Starts a new operation (opens a tansaction)
   HYDRODATA_EXPORT void StartOperation();
   //! Finishes the previously started operation (closes the transaction)
@@ -119,10 +128,14 @@ protected:
 
 private:
   
+  // Dump header Python part in to file \c theFile
+  bool DumpToPython( QFile&               theFile,
+                     MapOfTreatedObjects& theTreatedObjects ) const;
+
   // Dump objects of type \c theObjectKind to file \c theFile
-  bool dumpPartitionToPython( QFile&                                  theFile,
-                              QMap<QString,Handle(HYDROData_Object)>& theDumpedObjects,
-                              const ObjectKind&                       theObjectKind ) const;
+  bool dumpPartitionToPython( QFile&               theFile,
+                              MapOfTreatedObjects& theDumpedObjects,
+                              const ObjectKind&    theObjectKind ) const;
 
 private:
   Handle(TDocStd_Document) myDoc; ///< OCAF document instance corresponding for keeping all persistent data
index eb9d0f7205de109e43a843c725ad74ae8b021a6e..c2bad239e1ab93cd2f530c6357895177d09699a9 100644 (file)
@@ -35,7 +35,7 @@ void HYDROData_Object::SetName(const QString& theName)
   TDataStd_Name::Set(myLab, TCollection_ExtendedString(theName.toLatin1().constData()));
 }
 
-QStringList HYDROData_Object::DumpToPython() const
+QStringList HYDROData_Object::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
 {
   QStringList anEmptyList;
   return anEmptyList;
index 4f2ae435e1570f20557053379f822131c98c1a70..84d601560fd18e115f06b38d1bb6c3cbfe396bb6 100644 (file)
@@ -21,6 +21,8 @@ const ObjectKind KIND_BATHYMETRY = 4;
 
 DEFINE_STANDARD_HANDLE(HYDROData_Object, MMgt_TShared)
 
+typedef QMap<QString,Handle(Standard_Transient)> MapOfTreatedObjects;
+
 /**\class HYDROData_Object
  * \brief Generic class of any object in the data model.
  *
@@ -64,7 +66,7 @@ public:
    * You should reimplement this function in your derived class if it
    * has Python API and can be imported/exported from/to Python script.
    */
-  HYDRODATA_EXPORT virtual QStringList DumpToPython() const;
+  HYDRODATA_EXPORT virtual QStringList DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const;
 
   /**
    * Checks is object exists in the data structure.
index 9ed8f0be5063deaae02dd4be0843c127db56ff42..0cd144270fe620e29b9936ee0a4cc679cce5f4f8 100644 (file)
@@ -1,2 +1,21 @@
 
 #include "HYDROData_Tool.h"
+
+#include <QFile>
+#include <QStringList>
+#include <QTextStream>
+
+void HYDROData_Tool::WriteStringsToFile( QFile&             theFile,
+                                         const QStringList& theStrings,
+                                         const QString&     theSep )
+{
+  if ( !theFile.isOpen() || theStrings.isEmpty() )
+    return;
+  
+  QString aWriteStr = theStrings.join( theSep );
+  if ( aWriteStr.isEmpty() )
+    return;
+
+  QTextStream anOutStream( &theFile );
+  anOutStream << aWriteStr << theSep;
+}
index e2306013ba25e6ee04b662125eace51d1e895a50..5be4ba3ab2e65b366605a09a4e167b4ed4ec81c7 100644 (file)
@@ -4,12 +4,18 @@
 
 #include <Precision.hxx>
 
+#include <QString>
 
+class QFile;
+class QStringList;
 
 class HYDROData_Tool {
 
 public:
 
+  static void                           WriteStringsToFile( QFile&             theFile,
+                                                            const QStringList& theStrings,
+                                                            const QString&     theSep = "\n" );
 
 };