]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
*** empty log message ***
authorageay <ageay>
Fri, 10 Dec 2010 11:37:02 +0000 (11:37 +0000)
committerageay <ageay>
Fri, 10 Dec 2010 11:37:02 +0000 (11:37 +0000)
src/MEDLoader/MEDFileMesh.cxx
src/MEDLoader/MEDFileMesh.hxx
src/MEDLoader/MEDFileMeshLL.cxx
src/MEDLoader/MEDFileMeshLL.hxx
src/MEDLoader/Swig/MEDLoader.i
src/MEDLoader/Swig/MEDLoaderTest.py
src/MEDLoader/Swig/MEDLoaderTest3.py
src/MEDLoader/Swig/MEDLoaderTypemaps.i

index 98aacab85bd5df7db8ff92c6bc10a80a1dd833e4..b970bc51bd1df7fc7cb2418a5f6f79d85086dd17 100644 (file)
@@ -152,6 +152,31 @@ int MEDFileUMesh::getFamilyId(const char *name) const throw(INTERP_KERNEL::Excep
   return (*it).second;
 }
 
+std::vector<int> MEDFileUMesh::getFamiliesIds(const std::vector<std::string>& famNames) const throw(INTERP_KERNEL::Exception)
+{
+  std::vector<int> famIds;
+  for(std::vector<std::string>::const_iterator it=famNames.begin();it!=famNames.end();it++)
+    {
+      std::map<std::string,int>::const_iterator it2=_families.find(*it);
+      if(it2==_families.end())
+        {
+          std::ostringstream oss; oss << "No such family in mesh \"" << _name << "\" : " << *it; 
+          throw INTERP_KERNEL::Exception(oss.str().c_str());
+        }
+      famIds.push_back((*it2).second);
+    }
+  return famIds;
+}
+
+std::string MEDFileUMesh::getFamilyNameGivenId(int id) const throw(INTERP_KERNEL::Exception)
+{
+  for(std::map<std::string,int>::const_iterator it=_families.begin();it!=_families.end();it++)
+    if((*it).second==id)
+      return (*it).first;
+  std::ostringstream oss; oss << "MEDFileUMesh::getFamilyNameGivenId : no such family id : " << id;
+  throw INTERP_KERNEL::Exception(oss.str().c_str());
+}
+
 int MEDFileUMesh::getMeshDimension() const
 {
   int lev=0;
@@ -350,34 +375,14 @@ DataArrayInt *MEDFileUMesh::getFamilyArr(int meshDimRelToMax, const char *fam) c
 
 MEDCouplingUMesh *MEDFileUMesh::getFamilies(int meshDimRelToMax, const std::vector<std::string>& fams) const throw(INTERP_KERNEL::Exception)
 {
-  std::vector<int> famIds;
-  for(std::vector<std::string>::const_iterator it=fams.begin();it!=fams.end();it++)
-    {
-      std::map<std::string,int>::const_iterator it2=_families.find(*it);
-      if(it2==_families.end())
-        {
-          std::ostringstream oss; oss << "No such family in mesh \"" << _name << "\" : " << *it; 
-          throw INTERP_KERNEL::Exception(oss.str().c_str());
-        }
-      famIds.push_back((*it2).second);
-    }
+  std::vector<int> famIds=getFamiliesIds(fams);
   const MEDFileUMeshSplitL1 *l1=getMeshAtLevSafe(meshDimRelToMax);
   return l1->getFamilyPart(famIds);
 }
 
 DataArrayInt *MEDFileUMesh::getFamiliesArr(int meshDimRelToMax, const std::vector<std::string>& fams) const throw(INTERP_KERNEL::Exception)
 {
-  std::vector<int> famIds;
-  for(std::vector<std::string>::const_iterator it=fams.begin();it!=fams.end();it++)
-    {
-      std::map<std::string,int>::const_iterator it2=_families.find(*it);
-      if(it2==_families.end())
-        {
-          std::ostringstream oss; oss << "No such family in mesh \"" << _name << "\" : " << *it; 
-          throw INTERP_KERNEL::Exception(oss.str().c_str());
-        }
-      famIds.push_back((*it2).second);
-    }
+  std::vector<int> famIds=getFamiliesIds(fams);
   const MEDFileUMeshSplitL1 *l1=getMeshAtLevSafe(meshDimRelToMax);
   return l1->getFamilyPartArr(famIds);
 }
@@ -419,7 +424,9 @@ DataArrayInt *MEDFileUMesh::getNodeFamilyArr(const char *fam) const throw(INTERP
 
 DataArrayInt *MEDFileUMesh::getNodeFamiliesArr(const std::vector<std::string>& fams) const throw(INTERP_KERNEL::Exception)
 {
-  return 0;
+  std::vector<int> famIds=getFamiliesIds(fams);
+  DataArrayInt *da=_fam_coords->getIdsEqualList(famIds);
+  return MEDFileUMeshSplitL1::renumber(_num_coords,da);
 }
 
 MEDCouplingUMesh *MEDFileUMesh::getMeshAtRank(int meshDimRelToMax) const throw(INTERP_KERNEL::Exception)
index b10731bcf5135c2bb65bc2c8ac3f6836df2af5c9..8b25c801fed7b9dd6d788c1b1585211dc212c491 100644 (file)
@@ -59,6 +59,8 @@ namespace ParaMEDMEM
     int getNumberOfLevels() const { return _ms.size(); }
     int getNumberOfNonEmptyLevels() const;
     int getFamilyId(const char *name) const throw(INTERP_KERNEL::Exception);
+    std::vector<int> getFamiliesIds(const std::vector<std::string>& famNames) const throw(INTERP_KERNEL::Exception);
+    std::string getFamilyNameGivenId(int id) const throw(INTERP_KERNEL::Exception);
     int getMeshDimension() const;
     std::vector<std::string> getFamiliesOnGroup(const char *name) const throw(INTERP_KERNEL::Exception);
     std::vector<std::string> getGroupsNames() const;
index 701641e7e850caa1ca4248b41ad5456059b63243..3625d7c8761f05dd541c6196b26c46d09225c28f 100644 (file)
@@ -377,16 +377,21 @@ MEDCouplingUMesh *MEDFileUMeshSplitL1::renumIfNeeded(MEDCouplingUMesh *m, const
   return m;
 }
 
-DataArrayInt *MEDFileUMeshSplitL1::renumIfNeededArr(DataArrayInt *da) const
+DataArrayInt *MEDFileUMeshSplitL1::renumber(const DataArrayInt *renum, DataArrayInt *da)
 {
-  if((const DataArrayInt *)_num==0)
+  if((const DataArrayInt *)renum==0)
     return da;
-  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> locnum=_num->selectByTupleId(da->getConstPointer(),da->getConstPointer()+da->getNumberOfTuples());
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> locnum=renum->selectByTupleId(da->getConstPointer(),da->getConstPointer()+da->getNumberOfTuples());
   da->decrRef();
   locnum->incrRef();
   return locnum;
 }
 
+DataArrayInt *MEDFileUMeshSplitL1::renumIfNeededArr(DataArrayInt *da) const
+{
+  return renumber(_num,da);
+}
+
 std::vector<int> MEDFileUMeshSplitL1::getNewFamiliesNumber(int nb, const std::map<std::string,int>& families)
 {
   int id=-1;
index 3ed1e994b992382057bb3e287ec786841ed835c4..90704a757c308087c77d973018da95835df60a30 100644 (file)
@@ -95,6 +95,7 @@ namespace ParaMEDMEM
     static std::vector<int> getNewFamiliesNumber(int nb, const std::map<std::string,int>& families);
     static void traduceFamilyNumber(const std::vector< std::vector<int> >& fidsGrps, std::map<std::string,int>& familyIds,
                                     std::map<int,int>& famIdTrad, std::map<int,std::string>& newfams);
+    static DataArrayInt *renumber(const DataArrayInt *renum, DataArrayInt *da);
   private:
     MEDCouplingUMesh *renumIfNeeded(MEDCouplingUMesh *m, const int *cellIds) const;
     DataArrayInt *renumIfNeededArr(DataArrayInt *da) const;
index 59cdce0a5d873275b34b1080cabffa78cbaed3e7..2ed7fa83d22d404db0421028c686d736fb70f5c0 100644 (file)
@@ -179,9 +179,19 @@ public:
            PyList_SetItem(ret,i,PyInt_FromLong((int)v[i]));
          return ret;
        }
+       static ParaMEDMEM::MEDCouplingUMesh *ReadUMeshFromGroups(const char *fileName, const char *meshName, int meshDimRelToMax, PyObject *li) throw(INTERP_KERNEL::Exception)
+       {
+         std::vector<std::string> grps;
+         converPyListToVecString(li,grps);
+         return MEDLoader::ReadUMeshFromGroups(fileName,meshName,meshDimRelToMax,grps);
+       }
+       static ParaMEDMEM::MEDCouplingUMesh *ReadUMeshFromFamilies(const char *fileName, const char *meshName, int meshDimRelToMax, PyObject *li) throw(INTERP_KERNEL::Exception)
+       {
+         std::vector<std::string> fams;
+         converPyListToVecString(li,fams);
+         return MEDLoader::ReadUMeshFromFamilies(fileName,meshName,meshDimRelToMax,fams);
+       }
      }
-  static ParaMEDMEM::MEDCouplingUMesh *ReadUMeshFromFamilies(const char *fileName, const char *meshName, int meshDimRelToMax, const std::vector<std::string>& fams) throw(INTERP_KERNEL::Exception);
-  static ParaMEDMEM::MEDCouplingUMesh *ReadUMeshFromGroups(const char *fileName, const char *meshName, int meshDimRelToMax, const std::vector<std::string>& grps) throw(INTERP_KERNEL::Exception);
   static ParaMEDMEM::MEDCouplingUMesh *ReadUMeshFromFile(const char *fileName, const char *meshName, int meshDimRelToMax=0) throw(INTERP_KERNEL::Exception);
   static ParaMEDMEM::MEDCouplingUMesh *ReadUMeshFromFile(const char *fileName, int meshDimRelToMax=0) throw(INTERP_KERNEL::Exception);
   static ParaMEDMEM::MEDCouplingFieldDouble *ReadField(ParaMEDMEM::TypeOfField type, const char *fileName, const char *meshName, int meshDimRelToMax, const char *fieldName, int iteration, int order) throw(INTERP_KERNEL::Exception);
index bfb8f14628bbc32a4da352a66631f96d6392df6e..f3dec1cae3995630f5d4434ce83c244cdad1419e 100644 (file)
@@ -245,7 +245,7 @@ class MEDLoaderTest(unittest.TestCase):
         grps.index("mesh4");
         grps.index("3DMesh_1");
         #
-        vec=["mesh2"];
+        vec=("mesh2",);
         mesh2_2=MEDLoader.MEDLoader.ReadUMeshFromGroups(fileName,mnane,0,vec);
         self.assertTrue(mesh2_2.isEqual(mesh2,1e-12));
         vec=["mesh3"];
@@ -254,7 +254,7 @@ class MEDLoaderTest(unittest.TestCase):
         vec=["mesh4"];
         mesh4_2=MEDLoader.MEDLoader.ReadUMeshFromGroups(fileName,mnane,0,vec);
         self.assertTrue(mesh4_2.isEqual(mesh4,1e-12));
-        vec=["3DMesh_1"];
+        vec="3DMesh_1";
         mesh1_2=MEDLoader.MEDLoader.ReadUMeshFromGroups(fileName,mnane,0,vec);
         mesh1.setName("3DMesh_1");
         self.assertTrue(mesh1_2.isEqual(mesh1,1e-12));
index 36d97f68cdde4fb06b37031a7f7e07a10bca06a0..06be3aa8be0845b557350bb1e93f44693c43a484 100644 (file)
@@ -68,6 +68,10 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual([2,3,16],medmesh.getFamilyArr(0,"Family_2").getValues());
         self.assertEqual([2,3,5,14,16],medmesh.getFamiliesArr(0,["Family_4","Family_2"]).getValues());
         self.assertEqual([2,3,4,5,14,15,16],medmesh.getGroupsArr(0,["mesh2","mesh3"]).getValues());
+        famn=medmesh.getFamilyNameGivenId(0)
+        self.assertEqual(range(60),medmesh.getNodeFamilyArr(famn).getValues());
+        # without renum
+        
         pass
     pass
 
index e362503354ccb39f19e2304b1395a4ecae9d2744..b6f40fa23a11baea42a9714086893ded7a2bd87a 100644 (file)
@@ -102,6 +102,45 @@ static std::vector<std::pair<int,int> > convertTimePairIdsFromPy(PyObject *pyLi)
   return ret;
 }
 
+static void converPyListToVecString(PyObject *pyLi, std::vector<std::string>& v)
+{
+  if(PyList_Check(pyLi))
+    {
+      int size=PyList_Size(pyLi);
+      v.resize(size);
+      for(int i=0;i<size;i++)
+        {
+          PyObject *o=PyList_GetItem(pyLi,i);
+          if(!PyString_Check(o))
+            throw INTERP_KERNEL::Exception("In list passed in argument some elements are NOT strings ! Expected a list containing only strings !");
+          const char *st=PyString_AsString(o);
+          v[i]=std::string(st);
+        }
+    }
+  else if(PyTuple_Check(pyLi))
+    {
+      int size=PyTuple_Size(pyLi);
+      v.resize(size);
+      for(int i=0;i<size;i++)
+        {
+          PyObject *o=PyTuple_GetItem(pyLi,i);
+          if(!PyString_Check(o))
+            throw INTERP_KERNEL::Exception("In tuple passed in argument some elements are NOT strings ! Expected a tuple containing only strings !");
+          const char *st=PyString_AsString(o);
+          v[i]=std::string(st);
+        }
+    }
+  else if(PyString_Check(pyLi))
+    {
+      v.resize(1);
+      v[0]=std::string((const char *)PyString_AsString(pyLi));
+    }
+  else
+    {
+      throw INTERP_KERNEL::Exception("Unrecognized python argument : expected a list of string or tuple of string or string !");
+    }
+}
+
 static PyObject *convertFieldDoubleVecToPy(const std::vector<ParaMEDMEM::MEDCouplingFieldDouble *>& li)
 {
   int sz=li.size();