1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
21 #include "MEDCalculatorBrowserStep.hxx"
22 #include "MEDCalculatorBrowserField.hxx"
24 #include "MEDLoader.hxx"
25 #include "MEDCouplingFieldDouble.hxx"
32 using namespace MEDCoupling;
34 // Default constructor
35 // Set field name to nm and selection to flase
36 // Init empty vector for all other parameters
37 MEDCalculatorBrowserField::MEDCalculatorBrowserField(const char* nm) : _name(nm),_selection(false)
42 MEDCalculatorBrowserField::~MEDCalculatorBrowserField()
46 // Constructor with two parameters :
47 // - fname, the fileName
48 // - fieldname, the fieldname
49 // First set name to fieldname
50 // Then, read the Med structur to fill time steps, components and meshes
51 MEDCalculatorBrowserField::MEDCalculatorBrowserField(const char *fname, const char *fieldName) : _name(fieldName), _file_name(fname), _selection(false)
53 std::vector< std::string > meshNames=GetMeshNamesOnField(fname,fieldName);
54 std::vector< std::pair< std::pair<int,int>, double > > dtits=GetAllFieldIterations(fname, fieldName);
55 for(std::vector<std::pair< std::pair<int,int>, double > >::const_iterator iter=dtits.begin();iter!=dtits.end();iter++)
57 _steps.push_back(MEDCalculatorBrowserStep((*iter).first.first,(*iter).first.second,(*iter).second,meshNames[0]));
59 std::vector<TypeOfField> types=GetTypesOfField(fname,meshNames[0].c_str(),fieldName);
61 throw INTERP_KERNEL::Exception("MEDCalculatorBrowserField::MEDCalculatorBrowserField : the file is not loadable using MED File 3 API ! Problably presence of field on edges faces...");
62 _type=types[0];//To improve
63 MEDCouplingFieldDouble *tmpf=0;
66 tmpf=ReadField(_type,fname,meshNames[0].c_str(),0,fieldName,dtits[0].first.first,dtits[0].first.second);
68 catch(INTERP_KERNEL::Exception& e)
71 tmpf=ReadField(_type,fname,meshNames[0].c_str(),-1,fieldName,dtits[0].first.first,dtits[0].first.second);
75 int NumberOfComponents=tmpf->getNumberOfComponents();
76 for(int i=0;i<NumberOfComponents;i++)
78 std::string c=tmpf->getArray()->getInfoOnComponent(i);
81 _components.push_back(c);
84 _corresponding_meshes=GetMeshNamesOnField(fname,fieldName);
87 // Equal to string operator,
88 // Test if fieldname of this field is the same as nm
89 bool MEDCalculatorBrowserField::operator==(const std::string& nm)
94 // Equal to bool operator,
95 // Test selection flag is set just as sel
96 bool MEDCalculatorBrowserField::operator==(bool sel)
98 return _selection==sel;
102 // Construct a std::string to print Field, using std::cout for example
103 // Put x or o for selected or not
104 // Add Field fieldname
105 // Add x/o components
106 // Add MEDCalculatorBrowserStep::str() for each step
107 // Return a std::string
108 std::string MEDCalculatorBrowserField::str()
110 std::ostringstream res;
111 _selection?res<<"x ":res<<"o ";
112 res<<"Field "<<_name;
114 res<<"\n\t\tComponents :"<<std::endl;
115 for (unsigned int i = 0; i < _components.size(); i += 1)
117 res<<"\n\t\t\t"<<i<<" : "<<_components[i]<<""<<std::endl;
120 res<<"\n\t\tTimessteps :"<<std::endl;
121 for (unsigned int i = 0; i < _steps.size(); i += 1)
123 res<<"\n\t\t\t"<<_steps[i].str();
129 // Select a specific step according to its id
130 // Use std::find to get the corresponding step
131 // Also select all components if none is selected (avoid having time steps selected, so field selected, without components)
132 void MEDCalculatorBrowserField::selectStep(int ts)
134 std::vector<MEDCalculatorBrowserStep>::iterator it = std::find(_steps.begin(),_steps.end(),ts);
135 if(it != _steps.end())
139 std::vector<bool>::iterator itb = std::find(_selected_components.begin(),_selected_components.end(),true);
140 if(itb == _selected_components.end())
142 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
144 _selected_components[i] = true;
151 // Select all time steps
152 // Also select all components if none is selected (avoid having time steps selected, so field selected, without components)
153 void MEDCalculatorBrowserField::selectAllSteps()
155 for (std::vector<MEDCalculatorBrowserStep>::iterator it = _steps.begin(); it != _steps.end(); ++it)
159 std::vector<bool>::iterator itb = std::find(_selected_components.begin(),_selected_components.end(),true);
160 if(itb == _selected_components.end())
162 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
164 _selected_components[i] = true;
170 // Unselect a specific time step according to its id
171 // Check if there is still time step selected :
172 // - if yes, do nothing;
173 // - if not, set selection flag to false
174 void MEDCalculatorBrowserField::unselectStep(int ts)
176 std::vector<MEDCalculatorBrowserStep>::iterator it = std::find(_steps.begin(),_steps.end(),ts);
177 if(it != _steps.end())
181 it = std::find(_steps.begin(),_steps.end(),true);
182 if(it == _steps.end())
188 // Unselect all time steps
189 // Set selection flag to false
190 void MEDCalculatorBrowserField::unselectAllSteps()
192 for (std::vector<MEDCalculatorBrowserStep>::iterator it = _steps.begin(); it != _steps.end(); ++it)
199 // Return if this field is selected or not, i.e. if some time steps are selected or not
200 bool MEDCalculatorBrowserField::isSelected()
206 const std::string& MEDCalculatorBrowserField::getName() const
211 // Return steps vector
212 const std::vector<MEDCalculatorBrowserStep>& MEDCalculatorBrowserField::getSteps() const
217 // Return the time value corresponding to time step with id ts
218 const double& MEDCalculatorBrowserField::getTimeValue(int ts) const
220 std::vector<MEDCalculatorBrowserStep>::const_iterator it = std::find(_steps.begin(),_steps.end(),ts);
221 return it->getTimeValue();
225 // Return the number of time steps
226 unsigned int MEDCalculatorBrowserField::getStepsSize() const
228 return _steps.size();
231 // Add a time step to steps vector with (id, time value)
232 void MEDCalculatorBrowserField::addStep(int ts, double tv)
234 _steps.push_back(MEDCalculatorBrowserStep(ts,tv));
237 // Select a specific component according to its id
238 void MEDCalculatorBrowserField::selectComponent(int id)
240 _selected_components[id]=true;
243 // Select all components
244 void MEDCalculatorBrowserField::selectAllComponents()
246 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
248 _selected_components[i] = true;
252 // Unselect a specific component according to its id
253 void MEDCalculatorBrowserField::unselectComponent(int id)
255 _selected_components[id]=false;
258 // Unselect all components
259 void MEDCalculatorBrowserField::unselectAllComponents()
261 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
263 _selected_components[i] = false;
267 // Return a copy of the components vector
268 const std::vector<std::string>& MEDCalculatorBrowserField::getComponents() const
273 // Return a copy of the selected components vector
274 const std::vector<bool>& MEDCalculatorBrowserField::getSelectedComponents() const
276 return _selected_components;
279 // Return the number of components
280 unsigned int MEDCalculatorBrowserField::getComponentsSize() const
282 return _components.size();
285 // Return a std::vector of std::string which contains all the meshes name used by all the time steps as supporting meshes
286 const std::vector<std::string>& MEDCalculatorBrowserField::getCorrespondingMeshesFromField() const
288 return _corresponding_meshes;
291 // Return a std::string which contains all the meshes name used by the time steps (id) as supporting meshes
292 const std::string& MEDCalculatorBrowserField::getCorrespondingMeshFromStep(int i) const
294 return _steps[i].getCorrespondingMeshFromStep();
297 // Change the name of a component, if input is empty, the component name is -noname- (for print)
298 void MEDCalculatorBrowserField::setComponentName(int i,const std::string& name)
300 std::string name2(name);
301 if(name2 == std::string(""))
303 _components[i] = name2;
307 * Contrary to isSelected see all time steps.
309 bool MEDCalculatorBrowserField::isAnySelection() const
311 return std::find(_steps.begin(),_steps.end(),true)!=_steps.end();
314 void MEDCalculatorBrowserField::setMeshName(const std::string& m)
316 _corresponding_meshes.resize(1);
317 _corresponding_meshes[0]=m;
321 * This method returns a restriction of this containing only selected TimeSteps.
322 * This methods throws an exception if multiple meshes exists in selected time steps.
324 MEDCalculatorBrowserField MEDCalculatorBrowserField::getSelectedTimeSteps() const throw(INTERP_KERNEL::Exception)
326 int nbOfTs=std::count(_steps.begin(),_steps.end(),true);
327 std::vector<MEDCalculatorBrowserStep> ts(nbOfTs);
328 std::vector<MEDCalculatorBrowserStep>::const_iterator it=_steps.begin();
329 std::set<std::string> meshes;
330 for(int i=0;i<nbOfTs;i++)
332 it=std::find(it,_steps.end(),true);
334 meshes.insert((*it).getCorrespondingMeshFromStep());
336 throw INTERP_KERNEL::Exception("Not managed fields with variable meshes during time !");
338 MEDCalculatorBrowserField ret(*this);
340 ret.setMeshName(*(meshes.begin()));
344 void MEDCalculatorBrowserField::setSteps(const std::vector<MEDCalculatorBrowserStep>& steps)