]> SALOME platform Git repositories - modules/multipr.git/commitdiff
Salome HOME
Dump python task implemented. T_MULTIPR_INDUS_Dump_python
authorjfa <jfa@opencascade.com>
Mon, 2 Jul 2007 13:15:35 +0000 (13:15 +0000)
committerjfa <jfa@opencascade.com>
Mon, 2 Jul 2007 13:15:35 +0000 (13:15 +0000)
idl/MULTIPR.idl
src/MULTIPR/MULTIPR_i.cxx
src/MULTIPR/MULTIPR_i.hxx
src/MULTIPRGUI/MULTIPR_GUI.cxx

index 94c1d787903ccf4cc76749d57b9bb7de9fa3e446..d571fd8603f1b4b92d7b2271cbcff4698f78b97c 100644 (file)
@@ -255,6 +255,21 @@ interface MULTIPR_Gen : Engines::Component, SALOMEDS::Driver
        MULTIPR_Obj getObject(in string medFilename)
                raises (SALOME::SALOME_Exception);
 
+        //------------------------------------------------------------------------
+       // Engine API
+       // Methods to correctly serve Persistence and Dump Python.
+       //------------------------------------------------------------------------
+
+        /*!
+        * Set the current study
+        */
+        void SetCurrentStudy (in SALOMEDS::Study theStudy);
+
+        /*!
+        * Get the current study
+        */
+        SALOMEDS::Study GetCurrentStudy();
+
 }; // interface MULTIPR_Gen
  
   
index bdb3540c2bcbca2f576bfadccd95e091db674446..05318b7e4dd2f8886fb5729147c5c7252b6367dd 100644 (file)
@@ -88,14 +88,13 @@ namespace MULTIPR
   {
     if (--myCounter == 0)
     {
-      //SALOMEDS::Study_ptr aStudy = aMULTIPRGen->GetCurrentStudy();
-      //if (!aStudy->_is_nil())
-      {
-        std::string aString = myStream.str();
-        //myEngine->AddToPythonScript(aStudy->StudyId(), aCollection);
-        myEngine->AddToPythonScript(1, aString);
-        if(MYDEBUG) MESSAGE(" *DP* " << aString.c_str());
-      }
+      SALOMEDS::Study_ptr aStudy = myEngine->GetCurrentStudy();
+      int aStudyID = -1;
+      if (!aStudy->_is_nil()) aStudyID = aStudy->StudyId();
+
+      std::string aString = myStream.str();
+      myEngine->AddToPythonScript(aStudyID, aString);
+      //if(MYDEBUG) MESSAGE(" *DP* " << aString.c_str());
     }
   }
 
@@ -723,6 +722,44 @@ void MULTIPR_Obj_i::setEngine (MULTIPR_Gen_i* theEngine)
 }
 
 
+//-----------------------------------------------------------------------------
+// Set/Get current study (for Persistence & Dump Python)
+//-----------------------------------------------------------------------------
+
+/*! Set current study
+ */
+void MULTIPR_Gen_i::SetCurrentStudy (SALOMEDS::Study_ptr theStudy)
+{
+  //if(MYDEBUG) MESSAGE("MULTIPR_Gen_i::SetCurrentStudy");
+
+  // theStudy or myCurrentStudy may be nil
+  if (!CORBA::is_nil(theStudy))
+  {
+    if (CORBA::is_nil(myCurrentStudy))
+    {
+      // move python trace of unknown study to the real study
+      int studyId = theStudy->StudyId();
+      if (myPythonScripts.find(-1) != myPythonScripts.end())
+      {
+        myPythonScripts[studyId].insert(myPythonScripts[studyId].begin(), // at
+                                        myPythonScripts[-1].begin(), // from
+                                        myPythonScripts[-1].end());  // to
+        myPythonScripts[-1].clear();
+      }
+    }
+  }
+
+  myCurrentStudy = SALOMEDS::Study::_duplicate(theStudy);
+}
+
+/*! Get current study
+ */
+SALOMEDS::Study_ptr MULTIPR_Gen_i::GetCurrentStudy()
+{
+  //if(MYDEBUG) MESSAGE("MULTIPR_Gen_i::GetCurrentStudy: study Id = " << GetCurrentStudyID());
+  return SALOMEDS::Study::_duplicate(myCurrentStudy);
+}
+
 //-----------------------------------------------------------------------------
 // SALOMEDS::Driver methods (Persistence & Dump Python)
 //-----------------------------------------------------------------------------
@@ -735,58 +772,87 @@ SALOMEDS::TMPFile* MULTIPR_Gen_i::Save (SALOMEDS::SComponent_ptr theComponent,
 {
   INFOS( "MULTIPR_Gen_i::Save" );
 
-  //if (myCurrentStudy->_is_nil() ||
-  //    theComponent->GetStudy()->StudyId() != myCurrentStudy->StudyId())
-  //  SetCurrentStudy(theComponent->GetStudy());
+  if (myCurrentStudy->_is_nil() ||
+      theComponent->GetStudy()->StudyId() != myCurrentStudy->StudyId())
+    SetCurrentStudy(theComponent->GetStudy());
 
   // Store study contents as a set of python commands
-  //SavePython(myCurrentStudy);
+  SavePython(myCurrentStudy);
 
   // Declare a byte stream
   SALOMEDS::TMPFile_var aStreamFile;
 
-  // Obtain a temporary dir
-  //TCollection_AsciiString tmpDir =
-  //  isMultiFile ? TCollection_AsciiString((char*)theURL) : (char*)SALOMEDS_Tool::GetTmpDir().c_str();
+  SALOMEDS::ChildIterator_ptr obj_it (myCurrentStudy->NewChildIterator(theComponent));
 
-  // Create a sequence of files processed
-  SALOMEDS::ListOfFileNames_var aFileSeq = new SALOMEDS::ListOfFileNames;
-  aFileSeq->length(2);
+  // TODO: iterate on all objects under theComponent
+  if (!obj_it->More())
+    return aStreamFile._retn();
 
-  //TCollection_AsciiString aStudyName;
-  //if (isMultiFile) 
-  //  aStudyName = ((char*)SALOMEDS_Tool::GetNameFromPath(myCurrentStudy->URL()).c_str());
+  SALOMEDS::SObject_ptr aSObj = obj_it->Value();
+  CORBA::Object_var anObj = aSObj->GetObject();
+  MULTIPR_ORB::MULTIPR_Obj_ptr obj = MULTIPR_ORB::MULTIPR_Obj::_narrow(anObj);
+  if (CORBA::is_nil(obj))
+    return aStreamFile._retn();
 
-  // Set names of temporary files
-  //TCollection_AsciiString filename =
-  //  aStudyName + TCollection_AsciiString( "_MULTIPR.hdf" );        // for MULTIPR data itself
-  //TCollection_AsciiString meshfile =
-  //  aStudyName + TCollection_AsciiString( "_MULTIPR_Mesh.med" );   // for MED data to be stored in MED file
-
-  //aFileSeq[0] = CORBA::string_dup(filename.ToCString());
-  //aFileSeq[1] = CORBA::string_dup(meshfile.ToCString());
-  //filename = tmpDir + filename;
-  //meshfile = tmpDir + meshfile;
-
-  //Remove the files if they exist
-//#ifndef WNT
-//  TCollection_AsciiString cmd ("rm -f \"");
-//#else
-//  TCollection_AsciiString cmd ("del /F \"");
-//#endif
-
-  //cmd+=filename;
-  //cmd+="\" \"";
-  //cmd+=meshfile;
-  //cmd+="\"";
-  //system(cmd.ToCString());
-
-  // Convert temporary files to stream
-  //aStreamFile = SALOMEDS_Tool::PutFilesToStream(tmpDir.ToCString(), aFileSeq.in(), isMultiFile);
-
-  // Remove temporary files and directory
-  //if (!isMultiFile)
-  //  SALOMEDS_Tool::RemoveTemporaryFiles(tmpDir.ToCString(), aFileSeq.in(), true);
+  if (obj->isValidSequentialMEDFile())
+  {
+    // TODO
+  }
+  else if (obj->isValidDistributedMEDFile())
+  {
+    /*
+    // Obtain a temporary dir
+    std::string tmpDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
+
+    // Create a sequence of files processed
+    SALOMEDS::ListOfFileNames_var aFileSeq = new SALOMEDS::ListOfFileNames;
+
+    std::string aStudyName;
+    if (isMultiFile) 
+      aStudyName = SALOMEDS_Tool::GetNameFromPath(myCurrentStudy->URL());
+
+    // ?? create a new dir in <tmpDir> for all parts of distributed file
+    // or it will be created automatically ??
+    obj->save(tmpDir.c_str());
+
+    // TODO: set real length
+    aFileSeq->length(1); // nb.distributed files + 1 (_maitre.med)
+
+    // Set names of temporary files
+    std::string meshdir =
+      aStudyName + "_MULTIPR_Mesh"; // for MED data to be stored in distributed MED file
+    //std::string filename = aStudyName + "_MULTIPR.hdf"; // for MULTIPR data itself
+
+    aFileSeq[0] = CORBA::string_dup(meshdir.c_str());
+    //aFileSeq[1] = CORBA::string_dup(meshfile.ToCString());
+    meshdir = tmpDir + meshfile;
+    //filename = tmpDir + filename;
+    //*/
+
+    //Remove the files if they exist
+    //#ifndef WNT
+    //  TCollection_AsciiString cmd ("rm -f \"");
+    //#else
+    //  TCollection_AsciiString cmd ("del /F \"");
+    //#endif
+
+    //cmd+=filename;
+    //cmd+="\" \"";
+    //cmd+=meshfile;
+    //cmd+="\"";
+    //system(cmd.ToCString());
+
+    // Convert temporary files to stream
+    //aStreamFile = SALOMEDS_Tool::PutFilesToStream(tmpDir.ToCString(), aFileSeq.in(), isMultiFile);
+
+    // Remove temporary files and directory
+    //if (!isMultiFile)
+    //  SALOMEDS_Tool::RemoveTemporaryFiles(tmpDir.ToCString(), aFileSeq.in(), true);
+  }
+  else
+  {
+    // ??
+  }
 
   INFOS("MULTIPR_Gen_i::Save() completed");
   return aStreamFile._retn();
@@ -812,9 +878,9 @@ bool MULTIPR_Gen_i::Load (SALOMEDS::SComponent_ptr theComponent,
 {
   INFOS("MULTIPR_Gen_i::Load");
 
-  //if (myCurrentStudy->_is_nil() ||
-  //    theComponent->GetStudy()->StudyId() != myCurrentStudy->StudyId())
-  //  SetCurrentStudy(theComponent->GetStudy());
+  if (myCurrentStudy->_is_nil() ||
+      theComponent->GetStudy()->StudyId() != myCurrentStudy->StudyId())
+    SetCurrentStudy(theComponent->GetStudy());
 
   // Get temporary files location
   //TCollection_AsciiString tmpDir =
@@ -1003,6 +1069,7 @@ std::string MULTIPR_Gen_i::DumpPython_impl (int theStudyID,
   //  aScript += helper + "\t" + aGen + ".SetCurrentStudy(theStudy)";
   //else
   //  aScript += helper + "\t" + aGen + ".SetCurrentStudy(None)";
+  aScript += helper + "\t" + aGen + ".SetCurrentStudy(theStudy)\n";
 
   // Dump trace of restored study
   if (theSavedTrace.length() > 0)
@@ -1134,6 +1201,10 @@ SALOMEDS::SObject_ptr MULTIPR_Gen_i::PublishInStudy (SALOMEDS::Study_ptr   theSt
 
   if(MYDEBUG) MESSAGE("MULTIPR_Gen_i::PublishInStudy");
 
+  //if (myCurrentStudy->_is_nil() || theStudy->StudyId() != myCurrentStudy->StudyId())
+  if (myCurrentStudy->_is_nil())
+    SetCurrentStudy(theStudy);
+
   SALOMEDS::SObject_var aSO;
   if (CORBA::is_nil(theStudy) || CORBA::is_nil(theIOR))
     return aSO._retn();
index f97592f4a40a79014d6429e7d750c416ed7712da..9a18cd3651a159438543eec825fe6554d611c537 100644 (file)
@@ -320,6 +320,14 @@ public:
     MULTIPR_ORB::MULTIPR_Obj_ptr getObject(const char* medFilename)
         throw (SALOME::SALOME_Exception);
 
+  // ****************************************************
+  // Set/Get current study for Persistence and Dump Python
+  // ****************************************************
+
+  // Set current study
+  void SetCurrentStudy (SALOMEDS::Study_ptr theStudy);
+  // Get current study
+  SALOMEDS::Study_ptr GetCurrentStudy();
 
   // ****************************************************
   // Interface inherited methods (from SALOMEDS::Driver)
@@ -407,6 +415,8 @@ private:
   void SavePython (SALOMEDS::Study_ptr theStudy);
 
 private:
+  // Current study
+  SALOMEDS::Study_var myCurrentStudy;
   // Dump Python: trace of API methods calls
   std::map < int, std::vector <std::string> > myPythonScripts;
 };
index 1c1e2c84511915e2cccc40dbe7e3313dae44005e..43e3ea7bd8dc3b334d53bca01e1772b51bf54909 100644 (file)
@@ -86,27 +86,34 @@ namespace multipr
 //*****************************************************************************
 
 // singleton
-MULTIPR_ORB::MULTIPR_Gen_ptr GetMultiprGen(const CAM_Module* theModule)
+MULTIPR_ORB::MULTIPR_Gen_ptr GetMultiprGen (const CAM_Module* theModule)
 {
     static MULTIPR_ORB::MULTIPR_Gen_ptr aGen = NULL;
-    
+
     if (!aGen)
     {
-        SALOME_LifeCycleCORBA aLCC(SalomeApp_Application::namingService());
+        SALOME_LifeCycleCORBA aLCC (SalomeApp_Application::namingService());
         Engines::Component_var aComponent = aLCC.FindOrLoad_Component("FactoryServer", "MULTIPR");
         aGen = MULTIPR_ORB::MULTIPR_Gen::_narrow(aComponent);
         if (!CORBA::is_nil(aGen))
         {
-            //aGen->SetCurrentStudy(GetDSStudy(GetCStudy(GetAppStudy(theModule))));
+          // Set current study
+          SalomeApp_Study* aSAStudy =
+            dynamic_cast<SalomeApp_Study*>(theModule->application()->activeStudy());
+          _PTR(Study) aStudy = aSAStudy->studyDS();
+          SALOMEDS::Study_ptr aStudyDS;
+          if (aStudy)
+            aStudyDS = _CAST(Study,aStudy)->GetStudy();
+          aGen->SetCurrentStudy(aStudyDS);
         }
     }
-    
+
     if (CORBA::is_nil(aGen))
         throw std::runtime_error("Can't find MULTIPR component");
-    
+
     return aGen;
 }
-  
+
 
 //*****************************************************************************
 // Class MULTIPR_GUI implementation
@@ -1009,6 +1016,13 @@ void MULTIPR_GUI_DataModel::buildAll (LightApp_Study* theStudy)
           // set Object to MULTIPR_GUI
           mMULTIPR_GUI->setMULTIPRObj(obj);
         }
+        //CORBA::Object_var anObj = aSObj->GetObject();
+        //obj = MULTIPR_ORB::MULTIPR_Obj::_narrow(anObj);
+        //if (!CORBA::is_nil(obj))
+        //{
+        //  // set Object to MULTIPR_GUI
+        //  mMULTIPR_GUI->setMULTIPRObj(obj);
+        //}
       }
 
       // remove Data Objects, automatically built for not loaded MULTIPR module