Salome HOME
Copyright update 2022
[modules/med.git] / src / MEDCouplingCorba / MEDCouplingMultiFieldsServant.cxx
1 // Copyright (C) 2007-2022  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay (CEA/DEN)
20
21 #include "MEDCouplingMultiFieldsServant.hxx"
22 #include "DataArrayDoubleServant.hxx"
23 #include "MEDCouplingFieldServant.hxx"
24 #include "MEDCouplingMultiFields.hxx"
25 #include "MEDCouplingFieldDouble.hxx"
26 #include "MEDCouplingFieldTemplate.hxx"
27 #include "MEDCouplingMemArray.hxx"
28
29 using namespace MEDCoupling;
30
31 MEDCouplingMultiFieldsServant::MEDCouplingMultiFieldsServant(const MEDCouplingMultiFields *cppPointer):MEDCouplingRefCountServant(cppPointer,cppPointer)
32 {
33 }
34
35 SALOME_MED::MEDCouplingMeshesCorbaInterface *MEDCouplingMultiFieldsServant::getMeshes()
36 {
37   SALOME_MED::MEDCouplingMeshesCorbaInterface *ret=new SALOME_MED::MEDCouplingMeshesCorbaInterface;
38   std::vector<int> tmp;
39   std::vector<MEDCouplingMesh *> cppMeshes=getPointer()->getDifferentMeshes(tmp);
40   int sz=cppMeshes.size();
41   ret->length(sz);
42   for(int i=0;i<sz;i++)
43     (*ret)[i]=MEDCouplingFieldServant::BuildCorbaRefFromCppPointer(cppMeshes[i]);
44   return ret;
45 }
46
47 SALOME_MED::MEDCouplingMeshCorbaInterface_ptr MEDCouplingMultiFieldsServant::getMeshWithId(CORBA::Long id)
48 {
49   std::vector<int> tmp;
50   std::vector<MEDCouplingMesh *> cppMeshes=getPointer()->getDifferentMeshes(tmp);
51   return MEDCouplingFieldServant::BuildCorbaRefFromCppPointer(cppMeshes[id]);
52 }
53
54 char *MEDCouplingMultiFieldsServant::getName()
55 {
56   return CORBA::string_dup(getPointer()->getName().c_str());
57 }
58
59 SALOME_TYPES::ListOfString *MEDCouplingMultiFieldsServant::getInfoOnComponents()
60 {
61   std::vector<const MEDCouplingFieldDouble *> fs=getPointer()->getFields();
62   for(std::vector<const MEDCouplingFieldDouble *>::const_iterator it=fs.begin();it!=fs.end();it++)
63     {
64       if(*it)
65         {
66           const DataArrayDouble *arr=(*it)->getArray();
67           if(arr)
68             {
69               SALOME_TYPES::ListOfString *ret=new SALOME_TYPES::ListOfString;
70               const std::vector<std::string> &comps=arr->getInfoOnComponents();
71               ret->length(comps.size());
72               for(std::size_t i=0;i<comps.size();i++)
73                 (*ret)[i]=CORBA::string_dup(comps[i].c_str());
74               return ret;
75             }
76         }
77     }
78   throw INTERP_KERNEL::Exception("MEDCouplingMultiFieldsServant::getInfoOnComponents : impossible to find a not null DataArrayDouble !");
79 }
80
81 CORBA::Long MEDCouplingMultiFieldsServant::getMainTinyInfo(SALOME_TYPES::ListOfLong_out la, SALOME_TYPES::ListOfDouble_out da, CORBA::Long& nbOfArrays, CORBA::Long& nbOfFields)
82 {
83   std::vector<mcIdType> tinyInfo;
84   std::vector<double> tinyInfo2;
85   int nbOfDiffMeshes, nbOfDiffArr;
86   nbOfFields=getPointer()->getNumberOfFields();
87   getPointer()->getTinySerializationInformation(tinyInfo,tinyInfo2,nbOfDiffMeshes,nbOfDiffArr);
88   nbOfArrays=nbOfDiffArr;
89   la=new SALOME_TYPES::ListOfLong;
90   la->length(tinyInfo.size());
91   for(int i=0;i<(int)tinyInfo.size();i++)
92     (*la)[i]=tinyInfo[i];
93   //
94   da=new SALOME_TYPES::ListOfDouble;
95   da->length(tinyInfo2.size());
96   for(int i=0;i<(int)tinyInfo2.size();i++)
97     (*da)[i]=tinyInfo2[i];
98   return nbOfDiffMeshes;
99 }
100
101 void MEDCouplingMultiFieldsServant::getTinyInfo(CORBA::Long id, SALOME_TYPES::ListOfLong_out la, SALOME_TYPES::ListOfDouble_out da, SALOME_TYPES::ListOfString_out sa)
102 {
103   const MEDCouplingFieldDouble *f=getPointer()->getFieldWithId(id);
104   MEDCouplingFieldTemplate *f2=MEDCouplingFieldTemplate::New(*f);
105   la=new SALOME_TYPES::ListOfLong;
106   std::vector<mcIdType> tinyInfo;
107   f2->getTinySerializationIntInformation(tinyInfo);
108   la->length(tinyInfo.size());
109   for(int i=0;i<(int)tinyInfo.size();i++)
110     (*la)[i]=tinyInfo[i];
111   //
112   da=new SALOME_TYPES::ListOfDouble;
113   std::vector<double> tinyInfo2;
114   f2->getTinySerializationDbleInformation(tinyInfo2);
115   da->length(tinyInfo2.size());
116   for(int i=0;i<(int)tinyInfo2.size();i++)
117     (*da)[i]=tinyInfo2[i];
118   //
119   sa=new SALOME_TYPES::ListOfString;
120   std::vector<std::string> tinyInfo3;
121   f2->getTinySerializationStrInformation(tinyInfo3);
122   sa->length(tinyInfo3.size());
123   for(int i=0;i<(int)tinyInfo3.size();i++)
124     (*sa)[i]=CORBA::string_dup(tinyInfo3[i].c_str());
125   f2->decrRef();
126 }
127
128 void MEDCouplingMultiFieldsServant::getSerialisationData(CORBA::Long id, SALOME_TYPES::ListOfLong_out la)
129 {
130   const MEDCouplingFieldDouble *f=getPointer()->getFieldWithId(id);
131   MEDCouplingFieldTemplate *f2=MEDCouplingFieldTemplate::New(*f);
132   DataArrayIdType *dataInt;
133   f2->serialize(dataInt);
134   //
135   la=new SALOME_TYPES::ListOfLong;
136   if(dataInt)
137     {
138       mcIdType lgth=dataInt->getNbOfElems();
139       const mcIdType *ptr=dataInt->getConstPointer();
140       la->length(lgth);
141       for(mcIdType i=0;i<lgth;i++)
142         (*la)[i]=ptr[i];
143     }
144   else
145     la->length(0);
146   f2->decrRef();
147 }
148
149 SALOME_MED::DataArrayDoubleCorbaInterface_ptr MEDCouplingMultiFieldsServant::getArray(CORBA::Long id)
150 {
151   std::vector< std::vector<int> > refs;
152   std::vector<DataArrayDouble *> das=getPointer()->getDifferentArrays(refs);
153   DataArrayDoubleServant *retServ=new DataArrayDoubleServant(das[id]);
154   return retServ->_this();
155 }
156
157 CORBA::Boolean MEDCouplingMultiFieldsServant::ExportDataAs(const char *format, SALOME::GenericObj_out exporter)
158 {
159   std::string frmCpp(format);
160   if(frmCpp=="MEDCorba")
161     {
162       SALOME_MED::MEDCouplingMultiFieldsCorbaInterface_ptr cPtr=_this();
163       Register();
164       exporter=cPtr;
165       return true;
166     }
167   exporter=SALOME::GenericObj::_nil();
168   return false;
169 }