]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
VTK files writing for quick check on debug. pyCASTEM_porting_to_ParaMEDMEM
authorageay <ageay>
Thu, 29 Sep 2011 08:33:02 +0000 (08:33 +0000)
committerageay <ageay>
Thu, 29 Sep 2011 08:33:02 +0000 (08:33 +0000)
15 files changed:
src/MEDCoupling/MEDCouplingCMesh.cxx
src/MEDCoupling/MEDCouplingCMesh.hxx
src/MEDCoupling/MEDCouplingExtrudedMesh.cxx
src/MEDCoupling/MEDCouplingExtrudedMesh.hxx
src/MEDCoupling/MEDCouplingFieldDouble.cxx
src/MEDCoupling/MEDCouplingFieldDouble.hxx
src/MEDCoupling/MEDCouplingMemArray.cxx
src/MEDCoupling/MEDCouplingMemArray.hxx
src/MEDCoupling/MEDCouplingMesh.cxx
src/MEDCoupling/MEDCouplingMesh.hxx
src/MEDCoupling/MEDCouplingUMesh.cxx
src/MEDCoupling/MEDCouplingUMesh.hxx
src/MEDCoupling/MEDCouplingUMeshDesc.cxx
src/MEDCoupling/MEDCouplingUMeshDesc.hxx
src/MEDCoupling_Swig/MEDCoupling.i

index 78325929e2f96a02a0fbfdd022213c2ab8d68806..4cd6ea90fe243e06b44edcc1784c58adc3b5ca3a 100644 (file)
@@ -971,3 +971,12 @@ void MEDCouplingCMesh::unserialization(const std::vector<double>& tinyInfoD, con
   setTime(tinyInfoD[0],tinyInfo[3],tinyInfo[4]);
 }
 
+void MEDCouplingCMesh::writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception)
+{
+  throw INTERP_KERNEL::Exception("MEDCouplingCMesh::writeVTKLL : not implemented yet !");
+}
+
+std::string MEDCouplingCMesh::getVTKDataSetType() const throw(INTERP_KERNEL::Exception)
+{
+  return std::string("RectilinearGrid");
+}
index 64cdd2a1537890d75951075dd153dc622fc47c47..33d316249f3c94a7bbcb96dd91b4722f2ec2482c 100644 (file)
@@ -102,6 +102,8 @@ namespace ParaMEDMEM
     MEDCouplingCMesh();
     MEDCouplingCMesh(const MEDCouplingCMesh& other, bool deepCpy);
     ~MEDCouplingCMesh();
+    void writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception);
+    std::string getVTKDataSetType() const throw(INTERP_KERNEL::Exception);
   private:
     DataArrayDouble *_x_array;
     DataArrayDouble *_y_array;
index 21bd5f594a1a228ad95b0ca957ec88fe3115142b..8e187d956bc260f4384ac586ecb457d8ec12a282 100644 (file)
@@ -21,6 +21,7 @@
 #include "MEDCouplingUMesh.hxx"
 #include "MEDCouplingMemArray.hxx"
 #include "MEDCouplingFieldDouble.hxx"
+#include "MEDCouplingAutoRefCountObjectPtr.hxx"
 #include "CellModel.hxx"
 
 #include "InterpolationUtils.hxx"
@@ -838,3 +839,14 @@ void MEDCouplingExtrudedMesh::unserialization(const std::vector<double>& tinyInf
   _mesh3D_ids->alloc(szIds,1);
   std::copy(a1Ptr,a1Ptr+szIds,_mesh3D_ids->getPointer());
 }
+
+void MEDCouplingExtrudedMesh::writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception)
+{
+  MEDCouplingAutoRefCountObjectPtr<MEDCouplingUMesh> m=buildUnstructured();
+  m->writeVTKLL(ofs,cellData,pointData);
+}
+
+std::string MEDCouplingExtrudedMesh::getVTKDataSetType() const throw(INTERP_KERNEL::Exception)
+{
+  return _mesh2D->getVTKDataSetType();
+}
index 5495369312b0dd07cb9a00fd7cbf83d54042897d..8bf350930a44b7619eb390911dd97942faeeddb0 100644 (file)
@@ -110,6 +110,8 @@ namespace ParaMEDMEM
                            const int *conn2D, const int *conn2DIndx) throw(INTERP_KERNEL::Exception);
     void computeBaryCenterOfFace(const std::vector<int>& nodalConnec, int lev1DId);
     ~MEDCouplingExtrudedMesh();
+    void writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception);
+    std::string getVTKDataSetType() const throw(INTERP_KERNEL::Exception);
   private:
     MEDCouplingUMesh *_mesh2D;
     MEDCouplingUMesh *_mesh1D;
index 5f59890de8adad08d40f35d90b290b1277c99720..79042319b72e0338980ab41d7e3d80826ef1d3c5 100644 (file)
@@ -1578,3 +1578,39 @@ const MEDCouplingFieldDouble &MEDCouplingFieldDouble::operator/=(const MEDCoupli
   _time_discr->divideEqual(other._time_discr);
   return *this;
 }
+
+/*!
+ * This method writes the field series 'fs' in the VTK file 'fileName'.
+ * If 'fs' is empty no file is written. If fields lies on more than one mesh an exception will be thrown and no file will be written too.
+ * If the single mesh is empty an exception will be thrown.
+ * Finally there is a field in 'fs' with no name an exception will be thrown too.
+ */
+void MEDCouplingFieldDouble::WriteVTK(const char *fileName, const std::vector<const MEDCouplingFieldDouble *>& fs) throw(INTERP_KERNEL::Exception)
+{
+  if(fs.empty())
+    return;
+  std::size_t nfs=fs.size();
+  const MEDCouplingMesh *m=fs[0]->getMesh();
+  for(std::size_t i=1;i<nfs;i++)
+    if(fs[i]->getMesh()!=m)
+      throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::WriteVTK : Fields are not lying on a same mesh ! Expected by VTK ! MEDCouplingFieldDouble::setMesh or MEDCouplingFieldDouble::changeUnderlyingMesh can help to that.");
+  if(!m)
+    throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::WriteVTK : Fields are lying on a same mesh but it is empty !");
+  std::ostringstream coss,noss;
+  for(std::size_t i=0;i<nfs;i++)
+    {
+      const MEDCouplingFieldDouble *cur=fs[i];
+      std::string name(cur->getName());
+      if(name.empty())
+        {
+          std::ostringstream oss; oss << "MEDCouplingFieldDouble::WriteVTK : Field in pos #" << i << " has no name !";
+          throw INTERP_KERNEL::Exception(oss.str().c_str());
+        }
+      TypeOfField typ=cur->getTypeOfField();
+      if(typ==ON_CELLS)
+        cur->getArray()->writeVTK(coss,8,cur->getName());
+      else if(typ==ON_NODES)
+        cur->getArray()->writeVTK(noss,8,cur->getName());
+    }
+  m->writeVTKAdvanced(fileName,coss.str(),noss.str());
+}
index db1b332a0272ca9d1765f265c3930e40068138f1..909f323351522cdce3d1628bb9d281a7ebea53e8 100644 (file)
@@ -175,6 +175,7 @@ namespace ParaMEDMEM
     MEDCouplingFieldDouble *operator/(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return DivideFields(this,&other); }
     const MEDCouplingFieldDouble &operator/=(const MEDCouplingFieldDouble& other) throw(INTERP_KERNEL::Exception);
     static MEDCouplingFieldDouble *DivideFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
+    static void WriteVTK(const char *fileName, const std::vector<const MEDCouplingFieldDouble *>& fs) throw(INTERP_KERNEL::Exception);
   public:
     const MEDCouplingTimeDiscretization *getTimeDiscretizationUnderGround() const { return _time_discr; }
     MEDCouplingTimeDiscretization *getTimeDiscretizationUnderGround() { return _time_discr; }
index 9c62cd09cef129d7356fc68fa4f50a1704a8ee7e..c520689464baf1da2b2b8a6343dcae9aa6129247 100644 (file)
@@ -416,6 +416,16 @@ std::string DataArrayDouble::reprZip() const
   return ret.str();
 }
 
+void DataArrayDouble::writeVTK(std::ostream& ofs, int indent, const char *nameInFile) const throw(INTERP_KERNEL::Exception)
+{
+  std::string idt(indent,' ');
+  ofs.precision(15);
+  ofs << idt << "<DataArray type=\"Float32\" Name=\"" << nameInFile << "\" NumberOfComponents=\"" << getNumberOfComponents() << "\"";
+  ofs << " format=\"ascii\" RangeMin=\"" << getMinValueInArray() << "\" RangeMax=\"" << getMaxValueInArray() << "\">\n" << idt;
+  std::copy(begin(),end(),std::ostream_iterator<double>(ofs," "));
+  ofs << std::endl << idt << "</DataArray>\n";
+}
+
 void DataArrayDouble::reprStream(std::ostream& stream) const
 {
   stream << "Name of double array : \"" << _name << "\"\n";
@@ -977,7 +987,7 @@ void DataArrayDouble::checkNoNullValues() const throw(INTERP_KERNEL::Exception)
 double DataArrayDouble::getMaxValue(int& tupleId) const throw(INTERP_KERNEL::Exception)
 {
   if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::getMaxValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before !");
+    throw INTERP_KERNEL::Exception("DataArrayDouble::getMaxValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before or call 'getMaxValueInArray' method !");
   int nbOfTuples=getNumberOfTuples();
   if(nbOfTuples<=0)
     throw INTERP_KERNEL::Exception("DataArrayDouble::getMaxValue : array exists but number of tuples must be > 0 !");
@@ -987,6 +997,16 @@ double DataArrayDouble::getMaxValue(int& tupleId) const throw(INTERP_KERNEL::Exc
   return *loc;
 }
 
+/*!
+ * Idem to DataArrayDouble::getMaxValue expect that here number of components can be >=1.
+ */
+double DataArrayDouble::getMaxValueInArray() const throw(INTERP_KERNEL::Exception)
+{
+  checkAllocated();
+  const double *loc=std::max_element(begin(),end());
+  return *loc;
+}
+
 double DataArrayDouble::getMaxValue2(DataArrayInt*& tupleIds) const throw(INTERP_KERNEL::Exception)
 {
   int tmp;
@@ -999,7 +1019,7 @@ double DataArrayDouble::getMaxValue2(DataArrayInt*& tupleIds) const throw(INTERP
 double DataArrayDouble::getMinValue(int& tupleId) const throw(INTERP_KERNEL::Exception)
 {
   if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::getMinValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before !");
+    throw INTERP_KERNEL::Exception("DataArrayDouble::getMinValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before call 'getMinValueInArray' method !");
   int nbOfTuples=getNumberOfTuples();
   if(nbOfTuples<=0)
     throw INTERP_KERNEL::Exception("DataArrayDouble::getMinValue : array exists but number of tuples must be > 0 !");
@@ -1009,6 +1029,16 @@ double DataArrayDouble::getMinValue(int& tupleId) const throw(INTERP_KERNEL::Exc
   return *loc;
 }
 
+/*!
+ * Idem to DataArrayDouble::getMinValue expect that here number of components can be >=1.
+ */
+double DataArrayDouble::getMinValueInArray() const throw(INTERP_KERNEL::Exception)
+{
+  checkAllocated();
+  const double *loc=std::min_element(begin(),end());
+  return *loc;
+}
+
 double DataArrayDouble::getMinValue2(DataArrayInt*& tupleIds) const throw(INTERP_KERNEL::Exception)
 {
   int tmp;
@@ -2211,6 +2241,15 @@ std::string DataArrayInt::reprZip() const
   return ret.str();
 }
 
+void DataArrayInt::writeVTK(std::ostream& ofs, int indent, const char *type, const char *nameInFile) const throw(INTERP_KERNEL::Exception)
+{
+  std::string idt(indent,' ');
+  ofs << idt << "<DataArray type=\"" << type << "\" Name=\"" << nameInFile << "\" NumberOfComponents=\"" << getNumberOfComponents() << "\"";
+  ofs << " format=\"ascii\" RangeMin=\"" << getMinValueInArray() << "\" RangeMax=\"" << getMaxValueInArray() << "\">\n" << idt;
+  std::copy(begin(),end(),std::ostream_iterator<int>(ofs," "));
+  ofs << std::endl << idt << "</DataArray>\n";
+}
+
 void DataArrayInt::reprStream(std::ostream& stream) const
 {
   stream << "Name of int array : \"" << _name << "\"\n";
@@ -2235,6 +2274,13 @@ void DataArrayInt::reprZipWithoutNameStream(std::ostream& stream) const
   _mem.reprZip(getNumberOfComponents(),stream);
 }
 
+/*!
+ * This method expects a number of components equal to 1.
+ * This method sweeps all the values (tuples) in 'this' (it should be allocated) and for each value v is replaced by
+ * indArr[v] where 'indArr' is defined by ['indArrBg','indArrEnd').
+ * This method is safe that is to say if there is a value in 'this' not in [0,std::distance('indArrBg','indArrEnd')) an exception
+ * will be thrown.
+ */
 void DataArrayInt::transformWithIndArr(const int *indArrBg, const int *indArrEnd) throw(INTERP_KERNEL::Exception)
 {
   if(getNumberOfComponents()!=1)
@@ -2321,6 +2367,14 @@ void DataArrayInt::splitByValueRange(const int *arrBg, const int *arrEnd,
   castsPresent=ret3;
 }
 
+/*!
+ * This method expects a number of components equal to 1.
+ * This method sweeps all the values (tuples) in 'this' (it should be allocated) and for each value v on place i, place indArr[v] will have 
+ * value i.
+ * indArr[v] where 'indArr' is defined by ['indArrBg','indArrEnd').
+ * This method is half/safe that is to say if there is location i so that indArr[v] is not in [0,this->getNumberOfTuples()) an exception
+ * will be thrown.
+ */
 DataArrayInt *DataArrayInt::transformWithIndArrR(const int *indArrBg, const int *indArrEnd) const throw(INTERP_KERNEL::Exception)
 {
   if(getNumberOfComponents()!=1)
@@ -3231,6 +3285,16 @@ int DataArrayInt::getMaxValue(int& tupleId) const throw(INTERP_KERNEL::Exception
   return *loc;
 }
 
+/*!
+ * Idem to DataArrayInt::getMaxValue expect that here number of components can be >=1.
+ */
+int DataArrayInt::getMaxValueInArray() const throw(INTERP_KERNEL::Exception)
+{
+  checkAllocated();
+  const int *loc=std::max_element(begin(),end());
+  return *loc;
+}
+
 int DataArrayInt::getMinValue(int& tupleId) const throw(INTERP_KERNEL::Exception)
 {
   if(getNumberOfComponents()!=1)
@@ -3244,6 +3308,16 @@ int DataArrayInt::getMinValue(int& tupleId) const throw(INTERP_KERNEL::Exception
   return *loc;
 }
 
+/*!
+ * Idem to DataArrayInt::getMinValue expect that here number of components can be >=1.
+ */
+int DataArrayInt::getMinValueInArray() const throw(INTERP_KERNEL::Exception)
+{
+  checkAllocated();
+  const int *loc=std::min_element(begin(),end());
+  return *loc;
+}
+
 void DataArrayInt::applyLin(int a, int b, int compoId) throw(INTERP_KERNEL::Exception)
 {
   checkAllocated();
index 8603cfda0fcc4f19c10b0b56d93acb5202673026..cac2828c7e386361d57349ad1cdd43b3b128ee1b 100644 (file)
@@ -148,6 +148,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT bool isMonotonic(double eps) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT std::string repr() const;
     MEDCOUPLING_EXPORT std::string reprZip() const;
+    MEDCOUPLING_EXPORT void writeVTK(std::ostream& ofs, int indent, const char *nameInFile) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void reprStream(std::ostream& stream) const;
     MEDCOUPLING_EXPORT void reprZipStream(std::ostream& stream) const;
     MEDCOUPLING_EXPORT void reprWithoutNameStream(std::ostream& stream) const;
@@ -193,7 +194,9 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT void writeOnPlace(int id, double element0, const double *others, int sizeOfOthers) { _mem.writeOnPlace(id,element0,others,sizeOfOthers); }
     MEDCOUPLING_EXPORT void checkNoNullValues() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT double getMaxValue(int& tupleId) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT double getMaxValueInArray() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT double getMinValue(int& tupleId) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT double getMinValueInArray() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT double getMaxValue2(DataArrayInt*& tupleIds) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT double getMinValue2(DataArrayInt*& tupleIds) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT double getAverageValue() const throw(INTERP_KERNEL::Exception);
@@ -306,6 +309,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT void iota(int init=0) throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT std::string repr() const;
     MEDCOUPLING_EXPORT std::string reprZip() const;
+    MEDCOUPLING_EXPORT void writeVTK(std::ostream& ofs, int indent, const char *type, const char *nameInFile) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void reprStream(std::ostream& stream) const;
     MEDCOUPLING_EXPORT void reprZipStream(std::ostream& stream) const;
     MEDCOUPLING_EXPORT void reprWithoutNameStream(std::ostream& stream) const;
@@ -362,7 +366,9 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT DataArrayInt *getIdsNotEqualList(const std::vector<int>& vals) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT bool presenceOfValue(const std::vector<int>& vals) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT int getMaxValue(int& tupleId) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT int getMaxValueInArray() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT int getMinValue(int& tupleId) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT int getMinValueInArray() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void applyLin(int a, int b, int compoId) throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void applyLin(int a, int b) throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void applyInv(int numerator) throw(INTERP_KERNEL::Exception);
index 4cf46d526b6cfc58c62302d0adffe0a07601fcd3..f1e56e168103c88fa0a8f9d44a10e70f6c9e2b93 100644 (file)
@@ -26,6 +26,7 @@
 #include <set>
 #include <cmath>
 #include <sstream>
+#include <fstream>
 #include <iterator>
 
 using namespace ParaMEDMEM;
@@ -326,3 +327,22 @@ void MEDCouplingMesh::getCellsContainingPoints(const double *pos, int nbOfPoints
         eltsIndex[i+1]=eltsIndex[i];
     }
 }
+
+/*!
+ * This method writes a file in VTK format into file 'fileName'.
+ * An exception is thrown if the file is not writable.
+ */
+void MEDCouplingMesh::writeVTK(const char *fileName) const throw(INTERP_KERNEL::Exception)
+{
+  std::string cda,pda;
+  writeVTKAdvanced(fileName,cda,pda);
+}
+
+void MEDCouplingMesh::writeVTKAdvanced(const char *fileName, const std::string& cda, const std::string& pda) const throw(INTERP_KERNEL::Exception)
+{
+  std::ofstream ofs(fileName);
+  ofs << "<VTKFile type=\""  << getVTKDataSetType() << "\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
+  writeVTKLL(ofs,cda,pda);
+  ofs << "</VTKFile>\n";
+  ofs.close();
+}
index cee3750a3cc0cb984018a0c265867beb4fcad168..31399a09b20f2eb0c5036272a249eb63eec71e76 100644 (file)
@@ -120,9 +120,15 @@ namespace ParaMEDMEM
     virtual void serialize(DataArrayInt *&a1, DataArrayDouble *&a2) const = 0;
     virtual void unserialization(const std::vector<double>& tinyInfoD, const std::vector<int>& tinyInfo, const DataArrayInt *a1, DataArrayDouble *a2,
                                  const std::vector<std::string>& littleStrings) = 0;
+    void writeVTK(const char *fileName) const throw(INTERP_KERNEL::Exception);
+    /// @cond INTERNAL
+    void writeVTKAdvanced(const char *fileName, const std::string& cda, const std::string& pda) const throw(INTERP_KERNEL::Exception);
+    /// @endcond
+    virtual void writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception) = 0;
   protected:
     MEDCouplingMesh();
     MEDCouplingMesh(const MEDCouplingMesh& other);
+    virtual std::string getVTKDataSetType() const throw(INTERP_KERNEL::Exception) = 0;
     virtual ~MEDCouplingMesh() { }
   private:
     std::string _name;
index 49a744e457ec89630cc55d05472543b407b4cd5e..54025ae422f6ae59e37fb0aa0c7761f51ce15638 100644 (file)
@@ -32,6 +32,7 @@
 #include "InterpKernelAutoPtr.hxx"
 
 #include <sstream>
+#include <fstream>
 #include <numeric>
 #include <cstring>
 #include <limits>
@@ -4449,6 +4450,46 @@ void MEDCouplingUMesh::fillInCompact3DMode(int spaceDim, int nbOfNodesInCell, co
     throw INTERP_KERNEL::Exception("MEDCouplingUMesh::fillInCompact3DMode : Invalid spaceDim specified : must be 2 or 3 !");
 }
 
+void MEDCouplingUMesh::writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception)
+{
+  static const int PARAMEDMEM2VTKTYPETRADUCER[INTERP_KERNEL::NORM_MAXTYPE+1]={1,3,21,5,9,7,22,-1,23,-1,-1,-1,-1,-1,10,14,13,-1,12,-1,24,-1,16,27,-1,26,-1,-1,-1,-1,25,42};
+  ofs << "  <" << getVTKDataSetType() << ">\n";
+  ofs << "    <Piece NumberOfPoints=\"" << getNumberOfNodes() << "\" NumberOfCells=\"" << getNumberOfCells() << "\">\n";
+  ofs << "      <PointData>\n" << pointData << std::endl;
+  ofs << "      </PointData>\n";
+  ofs << "      <CellData>\n" << cellData << std::endl;
+  ofs << "      </CellData>\n";
+  ofs << "      <Points>\n";
+  if(getSpaceDimension()==3)
+    _coords->writeVTK(ofs,8,"Points");
+  else
+    {
+      MEDCouplingAutoRefCountObjectPtr<DataArrayDouble> coo=_coords->changeNbOfComponents(3,0.);
+      coo->writeVTK(ofs,8,"Points");
+    }
+  ofs << "      </Points>\n";
+  ofs << "      <Cells>\n";
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> c0=_nodal_connec_index->buildComplement(_nodal_connec->getNumberOfTuples()+1);
+  c0=_nodal_connec->selectByTupleId(c0->begin(),c0->end());
+  c0->writeVTK(ofs,8,"Int64","connectivity");
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> c1=_nodal_connec_index->deltaShiftIndex();
+  c1->applyLin(1,-1);
+  c1->computeOffsets2();
+  c1=c1->selectByTupleId2(1,c1->getNumberOfTuples(),1);
+  c1->writeVTK(ofs,8,"Int64","offsets");
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> c2=_nodal_connec->selectByTupleId(_nodal_connec_index->getConstPointer(),_nodal_connec_index->getConstPointer()+getNumberOfCells());
+  c2->transformWithIndArr(PARAMEDMEM2VTKTYPETRADUCER,PARAMEDMEM2VTKTYPETRADUCER+INTERP_KERNEL::NORM_MAXTYPE);
+  c2->writeVTK(ofs,8,"UInt8","types");
+  ofs << "      </Cells>\n";
+  ofs << "    </Piece>\n";
+  ofs << "  </UnstructuredGrid>\n";
+}
+
+std::string MEDCouplingUMesh::getVTKDataSetType() const throw(INTERP_KERNEL::Exception)
+{
+  return std::string("UnstructuredGrid");
+}
+
 MEDCouplingUMeshCellIterator::MEDCouplingUMeshCellIterator(MEDCouplingUMesh *mesh):_mesh(mesh),_cell(new MEDCouplingUMeshCell(mesh)),
                                                                                    _own_cell(true),_cell_id(-1),_nb_cell(0)
 {
@@ -4613,4 +4654,3 @@ const int *MEDCouplingUMeshCell::getAllConn(int& lgth) const
   else
     return 0;
 }
-
index afb9879490da952368427952f492ecf4967ce991..e6e680c2b94ec0d5c84ef28425f4ab07b3e76f3f 100644 (file)
@@ -83,6 +83,9 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT void resizeForUnserialization(const std::vector<int>& tinyInfo, DataArrayInt *a1, DataArrayDouble *a2, std::vector<std::string>& littleStrings) const;
     MEDCOUPLING_EXPORT void serialize(DataArrayInt *&a1, DataArrayDouble *&a2) const;
     MEDCOUPLING_EXPORT void unserialization(const std::vector<double>& tinyInfoD, const std::vector<int>& tinyInfo, const DataArrayInt *a1, DataArrayDouble *a2, const std::vector<std::string>& littleStrings);
+    MEDCOUPLING_EXPORT std::string getVTKDataSetType() const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT void writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT void writeVTK(const char *fileName) const throw(INTERP_KERNEL::Exception);
     //tools
     MEDCOUPLING_EXPORT bool areCellsEqual(int cell1, int cell2, int compType) const;
     MEDCOUPLING_EXPORT bool areCellsEqual0(int cell1, int cell2) const;
index 4e5d004a2047366b6ed60d8d6e3f8243504f2c5b..9f956fa6b3821a6ad9a40536b220a9b2a94b79ee 100644 (file)
@@ -491,3 +491,14 @@ int MEDCouplingUMeshDesc::getCellContainingPoint(const double *pos, double eps)
 {
   throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::getCellContainingPoint : not implemented yet !");
 }
+
+void MEDCouplingUMeshDesc::writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception)
+{
+  throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::writeVTKLL : not implemented yet !");
+}
+
+std::string MEDCouplingUMeshDesc::getVTKDataSetType() const throw(INTERP_KERNEL::Exception)
+{
+  throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::getVTKDataSetType : not implemented yet !");
+}
+
index e8367df2bbf3ee526b79c0ed97beaf79a3932778..ba62253a20f5ebdcbe8da8a0e9e26c344fc4fbe3 100644 (file)
@@ -91,6 +91,8 @@ namespace ParaMEDMEM
     ~MEDCouplingUMeshDesc();
     void computeTypes();
     void checkFullyDefined() const throw(INTERP_KERNEL::Exception);
+    void writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception);
+    std::string getVTKDataSetType() const throw(INTERP_KERNEL::Exception);
   private:
     int _mesh_dim;
     DataArrayInt *_desc_connec;
index 983789907ba42fe954530210e5542e4836a1e728..a5da7e9806d21e3ea5f237063be24d7b24b8b48f 100644 (file)
@@ -370,6 +370,7 @@ namespace ParaMEDMEM
     virtual INTERP_KERNEL::NormalizedCellType getTypeOfCell(int cellId) const throw(INTERP_KERNEL::Exception) = 0;
     virtual std::string simpleRepr() const = 0;
     virtual std::string advancedRepr() const = 0;
+    void writeVTK(const char *fileName) const throw(INTERP_KERNEL::Exception);
     // tools
     virtual MEDCouplingFieldDouble *getMeasureField(bool isAbs) const throw(INTERP_KERNEL::Exception) = 0;
     virtual MEDCouplingFieldDouble *getMeasureFieldOnNode(bool isAbs) const throw(INTERP_KERNEL::Exception) = 0;
@@ -4672,6 +4673,13 @@ namespace ParaMEDMEM
         convertPyObjToVecFieldDblCst(li,tmp);
         return MEDCouplingFieldDouble::MergeFields(tmp);
       }
+
+      static void WriteVTK(const char *fileName, PyObject *li) throw(INTERP_KERNEL::Exception)
+      {
+        std::vector<const MEDCouplingFieldDouble *> tmp;
+        convertPyObjToVecFieldDblCst(li,tmp);
+        MEDCouplingFieldDouble::WriteVTK(fileName,tmp);
+      }
     }
   };