]> SALOME platform Git repositories - modules/med.git/commitdiff
Salome HOME
First scalar map implementation. No GUI (tree browser) update.
authorabn <adrien.bruneton@cea.fr>
Fri, 31 Jul 2015 13:57:59 +0000 (15:57 +0200)
committerabn <adrien.bruneton@cea.fr>
Fri, 31 Jul 2015 13:57:59 +0000 (15:57 +0200)
idl/MEDDataManager.idl
idl/MEDPresentationManager.idl
src/MEDCalc/cmp/CMakeLists.txt
src/MEDCalc/cmp/MEDDataManager_i.cxx
src/MEDCalc/cmp/MEDDataManager_i.hxx
src/MEDCalc/cmp/MEDPresentation.cxx [new file with mode: 0644]
src/MEDCalc/cmp/MEDPresentation.hxx [new file with mode: 0644]
src/MEDCalc/cmp/MEDPresentationManager_i.cxx
src/MEDCalc/cmp/MEDPresentationManager_i.hxx
src/MEDCalc/tui/medpresentation.py

index 06d9e4d2ecf7e4dc2a5d83a0934e10cb10f7dd31..c18c0740efc0aaff2faedb5a27fc5e28475568b0 100644 (file)
@@ -118,6 +118,7 @@ module MEDCALC
     //==========================================================
     DatasourceHandler loadDatasource(in string filepath);
     DatasourceHandler getDatasourceHandler(in string filepath);
+    DatasourceHandler getDatasourceHandlerFromID(in long sourceid);
 
     //==========================================================
     // Mesh data management
index cab47d06441e5427f3dc53826ea4fcb9843df4a4..83a05392e03e61fa2555c94bdc59093b296f6cfa 100644 (file)
@@ -25,7 +25,6 @@
 
 module MEDCALC
 {
-
   enum MEDPresentationViewMode {
     VIEW_MODE_OVERLAP,
     VIEW_MODE_REPLACE,
@@ -41,8 +40,9 @@ module MEDCALC
   interface MEDPresentationManager : SALOME::GenericObj
   {
 
-    void MakeScalarMap(in ScalarMapParameters params);
-
+    long makeScalarMap(in ScalarMapParameters params);
+    void setPresentationProperty(in long presId, in string propName, in string propValue);
+    
   };
 
 };
index 57ed9e3e34b93b6ddde6867e0bd076e59848872d..1c54b6c75902a4b5c25ad768e75c6f3309370863 100644 (file)
@@ -24,6 +24,7 @@ INCLUDE_DIRECTORIES(
   ${MEDFILE_INCLUDE_DIRS}
   ${HDF5_INCLUDE_DIRS}
   ${PTHREAD_INCLUDE_DIR}
+  ${PYTHON_INCLUDE_DIRS}
   ${CMAKE_CURRENT_BINARY_DIR}
   ${PROJECT_BINARY_DIR}/idl
   ${PROJECT_SOURCE_DIR}/src/MEDCoupling
@@ -38,27 +39,20 @@ SET(MEDFactoryEngine_SOURCES
   MEDCalculator_i.cxx
   MEDPresentationManager_i.cxx
   MEDFactory_i.cxx
+  MEDPresentation.cxx
 )
 
 SET(COMMON_LIBS
-  medloader
+  ${PLATFORM_LIBRARIES}
   SalomeIDLMED
-  ${KERNEL_TOOLSDS}
-  ${KERNEL_SalomeHDFPersist}
-  ${KERNEL_SalomeContainer}
-  ${KERNEL_SalomeCommunication}
-  ${KERNEL_SalomeKernelHelpers}
-  ${KERNEL_SalomeLifeCycleCORBA}
-  ${KERNEL_SALOMELocalTrace}
-  ${KERNEL_SALOMEBasics}
+  ${KERNEL_TOOLSDS} ${KERNEL_SalomeHDFPersist} ${KERNEL_SalomeContainer} ${KERNEL_SalomeCommunication}
+  ${KERNEL_SalomeKernelHelpers} ${KERNEL_SalomeLifeCycleCORBA} ${KERNEL_SALOMELocalTrace} ${KERNEL_SALOMEBasics}
   ${KERNEL_SalomeGenericObj}
-  medcoupling
-  medcouplingremapper
-  interpkernel
+  medloader medcoupling medcouplingremapper interpkernel
   ${MEDFILE_C_LIBRARIES}
   ${HDF5_LIBRARIES}
   ${OMNIORB_LIBRARIES}
-  ${PLATFORM_LIBRARIES}
+  ${PYTHON_LIBRARIES}
 )
 
 # This undefines the macros MIN and MAX which are specified in the windows headers
@@ -68,7 +62,7 @@ ENDIF(WIN32)
 
 ADD_LIBRARY(MEDFactoryEngine SHARED ${MEDFactoryEngine_SOURCES})
 SET_TARGET_PROPERTIES(MEDFactoryEngine PROPERTIES COMPILE_FLAGS "${COMMON_FLAGS}")
-TARGET_LINK_LIBRARIES(MEDFactoryEngine SalomeIDLMED ${COMMON_LIBS})
+TARGET_LINK_LIBRARIES(MEDFactoryEngine ${COMMON_LIBS})
 
 INSTALL(TARGETS MEDFactoryEngine DESTINATION ${SALOME_INSTALL_LIBS})
 
index ce81c29d904d8058870da1bd3cccecff159db9a5..3f9f460551cbed7336478039747a8a623576b607 100644 (file)
@@ -216,6 +216,16 @@ MEDDataManager_i::getDatasourceHandler(const char *filepath)
   return NULL;
 }
 
+MEDCALC::DatasourceHandler*
+MEDDataManager_i::getDatasourceHandlerFromID(CORBA::Long sourceid)
+{
+  DatasourceHandlerMapIterator it = _datasourceHandlerMap.find(sourceid);
+  if (it != _datasourceHandlerMap.end())
+    {
+      return it->second;
+    }
+  return NULL;
+}
 
 MEDCALC::MeshHandler * MEDDataManager_i::getMesh(CORBA::Long meshId) {
   if ( _meshHandlerMap.count(meshId) == 0 ) {
index bb20a0944e49e0b3fc97d36aaac6ee5709063391..5192fedb8ea95e3c148fb90dd0b10911fbb83c37 100644 (file)
@@ -71,6 +71,7 @@ public:
   // Datasource management
   MEDCALC::DatasourceHandler * loadDatasource(const char *filepath);
   MEDCALC::DatasourceHandler * getDatasourceHandler(const char *filepath);
+  MEDCALC::DatasourceHandler * getDatasourceHandlerFromID(CORBA::Long sourceId);
 
   // -----------------------------------------------------------
   // Mesh management
diff --git a/src/MEDCalc/cmp/MEDPresentation.cxx b/src/MEDCalc/cmp/MEDPresentation.cxx
new file mode 100644 (file)
index 0000000..3c1956c
--- /dev/null
@@ -0,0 +1,117 @@
+// Copyright (C) 2011-2015  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Authors: A Bruneton (CEA), C Aguerre (EdF)
+
+#include "MEDFactoryClient.hxx"
+#include "MEDPresentation.hxx"
+#include "MEDCouplingRefCountObject.hxx"
+#include <PyInterp_Utils.h>
+#include <iostream>
+
+void MEDPresentation::generatePipeline()
+{
+  // Might be more complicated in the future:
+
+  this->internalGeneratePipeline();
+}
+
+void MEDPresentation::pushInternal(PyObject * obj, PyObject * disp)
+{
+  _pipeline.push_back(obj);
+  _display.push_back(disp);
+}
+
+void MEDPresentation::setProperty(const char * propName, const char * propValue)
+{
+  // LIMITED!!! For now switch the first display element to Wireframe
+
+  PyLockWrapper lock;
+  PyObject_CallMethod(_display[0], (char*)"SetRepresentationType", (char*)"(s)", "Wireframe");
+}
+
+PyObject * MEDPresentation::getPythonObjectFromMain(const char * python_var)
+{
+  // TODO: improve to avoid getting dict at each call
+
+  // All the calls below returns *borrowed* references
+  PyObject* main_module = PyImport_AddModule((char*)"__main__");
+  PyObject* global_dict = PyModule_GetDict(main_module);
+  return PyDict_GetItemString(global_dict, python_var);
+}
+
+std::string MEDPresentation::getFieldTypeString()
+{
+  ParaMEDMEM::TypeOfField typ = (ParaMEDMEM::TypeOfField)_fieldHandler->type;
+  switch(typ)
+  {
+    case ParaMEDMEM::ON_CELLS:
+      return "CELLS";
+    case ParaMEDMEM::ON_NODES:
+      return "NODES";
+    default:
+      std::cerr << "MEDPresentation::getFieldTypeString() -- Not implemented ! Gauss points?";
+      return "";
+  }
+}
+
+
+void MEDPresentationScalarMap::internalGeneratePipeline()
+{
+  MEDCALC::MEDDataManager_ptr dataManager(MEDFactoryClient::getDataManager());
+
+  MEDCALC::MeshHandler* meshHandler = dataManager->getMesh(_fieldHandler->meshid);
+  MEDCALC::DatasourceHandler* dataSHandler = dataManager->getDatasourceHandlerFromID(meshHandler->sourceid);
+
+  std::string fileName(dataSHandler->uri);
+  std::string fieldName(_fieldHandler->fieldname);
+  std::string fieldType = getFieldTypeString();
+
+  std::cout << "Generating pipeline for SCALAR MAP:" <<std::endl;
+  std::cout << "\tfileName: " <<  fileName << std::endl;
+  std::cout << "\tfiedName: " << fieldName << std::endl;
+  if (fileName.substr(0, 7) != std::string("file://"))
+    {
+      std::cerr << "\tData source is not a file! Can not proceed." << std::endl;
+      return;
+    }
+
+  fileName = fileName.substr(7, fileName.size());
+  std::cout << "\tfileName: " <<  fileName << std::endl;
+
+  {  // PyLock protected section
+    PyLockWrapper lock;
+
+    PyRun_SimpleString("print 'hello world'");
+    std::string cmd = std::string(
+        "import pvsimple as pvs;"
+        "__obj1 = pvs.MEDReader(FileName='") + fileName + std::string("');"
+        "__disp1 = pvs.Show(__obj1);"
+        "pvs.ColorBy(__disp1, ('") + fieldType + std::string("', '") + fieldName + std::string("'));"
+        "pvs.GetActiveViewOrCreate('RenderView').ResetCamera()");
+
+    std::cerr << "Python command:" << std::endl;
+    std::cerr << cmd << std::endl;
+    PyRun_SimpleString(cmd.c_str());
+    // Retrieve Python object for internal storage:
+    PyObject * obj = getPythonObjectFromMain("__obj1");
+    PyObject * disp = getPythonObjectFromMain("__disp1");
+    pushInternal(obj, disp);
+  }
+
+}
diff --git a/src/MEDCalc/cmp/MEDPresentation.hxx b/src/MEDCalc/cmp/MEDPresentation.hxx
new file mode 100644 (file)
index 0000000..d7754fd
--- /dev/null
@@ -0,0 +1,82 @@
+// Copyright (C) 2011-2015  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Authors: A Bruneton (CEA), C Aguerre (EdF)
+
+#ifndef SRC_MEDCALC_CMP_MEDPRESENTATION_HXX_
+#define SRC_MEDCALC_CMP_MEDPRESENTATION_HXX_
+
+#include <Python.h>
+#include "MEDCALC.hxx"
+
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(MEDDataManager)
+#include CORBA_SERVER_HEADER(MEDPresentationManager)
+
+#include <vector>
+#include <string>
+
+class MEDCALC_EXPORT MEDPresentation
+{
+public:
+  friend class MEDPresentationManager_i;
+
+  MEDPresentation(MEDCALC::FieldHandler* fieldHdl):
+    _fieldHandler(fieldHdl), _pipeline(0), _display(0)
+  {}
+  virtual ~MEDPresentation() {}
+
+  void setProperty(const char * propName, const char * propValue);
+  std::string getFieldTypeString();
+
+protected:
+
+  void generatePipeline();
+  virtual void internalGeneratePipeline() = 0;
+  PyObject * getPythonObjectFromMain(const char * var);
+  void pushInternal(PyObject * obj, PyObject * disp = NULL);
+
+protected:
+
+  ///! field reference - borrowed.
+  MEDCALC::FieldHandler* _fieldHandler;
+
+  ///! Pipeline elements
+  std::vector< PyObject * > _pipeline;
+
+  ///! Corresponding display object, if any:
+  std::vector< PyObject * > _display;
+};
+
+class MEDCALC_EXPORT MEDPresentationScalarMap :  public MEDPresentation
+{
+public:
+  MEDPresentationScalarMap(MEDCALC::FieldHandler* fieldHdl, bool wireframe) :
+    MEDPresentation(fieldHdl),
+    _isWireframe(wireframe)
+  {}
+  virtual ~MEDPresentationScalarMap() {}
+
+protected:
+  virtual void internalGeneratePipeline();
+
+private:
+  bool _isWireframe;
+};
+
+#endif /* SRC_MEDCALC_CMP_MEDPRESENTATION_HXX_ */
index eb0be04fd1bfddb27f39178528d7e77d5da72731..47cca67da0cd6293c7c092f93c4dcd897446b94c 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "MEDPresentationManager_i.hxx"
 #include "MEDFactoryClient.hxx"
+#include "MEDPresentation.hxx"
 
 MEDPresentationManager_i* MEDPresentationManager_i::_instance = NULL;
 
@@ -45,19 +46,52 @@ MEDPresentationManager_i::~MEDPresentationManager_i()
   */
 }
 
+TypeID MEDPresentationManager_i::GenerateID()
+{
+  static TypeID START_ID = -1;
+  START_ID++;
+  return START_ID;
+}
+
 #include <iostream>
 
 void
-MEDPresentationManager_i::MakeScalarMap(const MEDCALC::ScalarMapParameters& params)
+MEDPresentationManager_i::setPresentationProperty(TypeID presentationID, const char * propName, const char *  propValue)
+{
+  if (_presentations.find(presentationID) != _presentations.end())
+    {
+      MEDPresentation * pres(_presentations[presentationID]);
+      pres->setProperty(propName, propValue);
+    }
+  else
+    {
+      std::cerr << "setPresentationProperty(): presentation not found!!" << std::endl;
+    }
+}
+
+TypeID
+MEDPresentationManager_i::makeScalarMap(const MEDCALC::ScalarMapParameters& params)
 {
-  std::cout << "MEDPresentationManager_i::MakeScalarMap: Not implemented yet\n";
+  MEDCALC::MEDDataManager_ptr dataManager(MEDFactoryClient::getDataManager());
 
-  std::size_t fieldHandlerId = params.fieldHandlerId;
+  TypeID fieldHandlerId = params.fieldHandlerId;
   MEDCALC::MEDPresentationViewMode viewMode = params.viewMode;
 
+  MEDCALC::FieldHandler* fieldHandler = dataManager->getFieldHandler(fieldHandlerId);
+  MEDCALC::MeshHandler* meshHandler = dataManager->getMesh(fieldHandler->meshid);
+  MEDCALC::DatasourceHandler* dataSHandler = dataManager->getDatasourceHandlerFromID(meshHandler->sourceid);
+
   std::cout << "\tfieldHandlerId: " << fieldHandlerId << std::endl;
   std::cout << "\tviewMode: " << viewMode << std::endl;
+  std::cout << "\tfileName: " <<  dataSHandler->uri << std::endl;
+  std::cout << "\tfiedName: " << fieldHandler->fieldname << std::endl;
+
+  // Create a new presentation instance
+  TypeID newID = MEDPresentationManager_i::GenerateID();
+  MEDPresentationScalarMap * scalarMap = new MEDPresentationScalarMap(fieldHandler, true);  // on stack or on heap?? stack for now
+  _presentations.insert( std::pair<TypeID, MEDPresentation *>(newID, scalarMap) );
 
-  MEDCALC::FieldHandler* fieldHandler = MEDFactoryClient::getDataManager()->getFieldHandler(fieldHandlerId);
+  scalarMap->generatePipeline();
 
+  return newID;
 }
index 4d81c28e3bce5252d63d5e943ca353ed81688aec..fca4267eab31515341011b2e8d766f89e0b5b3da 100644 (file)
 
 #include <vector>
 
+typedef ::CORBA::Long TypeID;
+
+class MEDPresentation;
+
 class MEDCALC_EXPORT MEDPresentationManager_i: public POA_MEDCALC::MEDPresentationManager,
                                                public SALOME::GenericObj_i
 {
@@ -37,10 +41,10 @@ class MEDCALC_EXPORT MEDPresentationManager_i: public POA_MEDCALC::MEDPresentati
 
   static MEDPresentationManager_i* getInstance();
 
-  void MakeScalarMap(const MEDCALC::ScalarMapParameters&);
+  TypeID makeScalarMap(const MEDCALC::ScalarMapParameters&);
+  void setPresentationProperty(TypeID presentationID, const char * propName, const char *  propValue);
 
  private:
-
   MEDPresentationManager_i();
   virtual ~MEDPresentationManager_i();
 
@@ -49,9 +53,10 @@ class MEDCALC_EXPORT MEDPresentationManager_i: public POA_MEDCALC::MEDPresentati
   // The MEDPresentationManager is a singleton, whose instance can be obtained
   // using the getInstance static method.
   static MEDPresentationManager_i * _instance;
+  static TypeID GenerateID();
 
   // Owns a list of MEDPresentation objects
-  //std::vector<MEDPresentation*> _presentations;
+  std::map< TypeID, MEDPresentation * > _presentations;
 
 };
 
index 5e4945ca3263f666b0b729987fc12e8cde1c303d..c0a158e9d86361de1b51b381145190281f7ed96b 100644 (file)
@@ -31,7 +31,7 @@ def MakeScalarMap(proxy, viewMode=MEDCALC.VIEW_MODE_REPLACE):
   print "viewMode:", viewMode, " [", type(viewMode), "]"
 
   params = MEDCALC.ScalarMapParameters(proxy.id, viewMode)
-  __manager.MakeScalarMap(params)
+  __manager.makeScalarMap(params)
 
 #