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 MCAuto<MEDCouplingFieldDouble> tmpf;
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);
83 _corresponding_meshes=GetMeshNamesOnField(fname,fieldName);
86 // Equal to string operator,
87 // Test if fieldname of this field is the same as nm
88 bool MEDCalculatorBrowserField::operator==(const std::string& nm)
93 // Equal to bool operator,
94 // Test selection flag is set just as sel
95 bool MEDCalculatorBrowserField::operator==(bool sel)
97 return _selection==sel;
101 // Construct a std::string to print Field, using std::cout for example
102 // Put x or o for selected or not
103 // Add Field fieldname
104 // Add x/o components
105 // Add MEDCalculatorBrowserStep::str() for each step
106 // Return a std::string
107 std::string MEDCalculatorBrowserField::str()
109 std::ostringstream res;
110 _selection?res<<"x ":res<<"o ";
111 res<<"Field "<<_name;
113 res<<"\n\t\tComponents :"<<std::endl;
114 for (unsigned int i = 0; i < _components.size(); i += 1)
116 res<<"\n\t\t\t"<<i<<" : "<<_components[i]<<""<<std::endl;
119 res<<"\n\t\tTimessteps :"<<std::endl;
120 for (unsigned int i = 0; i < _steps.size(); i += 1)
122 res<<"\n\t\t\t"<<_steps[i].str();
128 // Select a specific step according to its id
129 // Use std::find to get the corresponding step
130 // Also select all components if none is selected (avoid having time steps selected, so field selected, without components)
131 void MEDCalculatorBrowserField::selectStep(int ts)
133 std::vector<MEDCalculatorBrowserStep>::iterator it = std::find(_steps.begin(),_steps.end(),ts);
134 if(it != _steps.end())
138 std::vector<bool>::iterator itb = std::find(_selected_components.begin(),_selected_components.end(),true);
139 if(itb == _selected_components.end())
141 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
143 _selected_components[i] = true;
150 // Select all time steps
151 // Also select all components if none is selected (avoid having time steps selected, so field selected, without components)
152 void MEDCalculatorBrowserField::selectAllSteps()
154 for (std::vector<MEDCalculatorBrowserStep>::iterator it = _steps.begin(); it != _steps.end(); ++it)
158 std::vector<bool>::iterator itb = std::find(_selected_components.begin(),_selected_components.end(),true);
159 if(itb == _selected_components.end())
161 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
163 _selected_components[i] = true;
169 // Unselect a specific time step according to its id
170 // Check if there is still time step selected :
171 // - if yes, do nothing;
172 // - if not, set selection flag to false
173 void MEDCalculatorBrowserField::unselectStep(int ts)
175 std::vector<MEDCalculatorBrowserStep>::iterator it = std::find(_steps.begin(),_steps.end(),ts);
176 if(it != _steps.end())
180 it = std::find(_steps.begin(),_steps.end(),true);
181 if(it == _steps.end())
187 // Unselect all time steps
188 // Set selection flag to false
189 void MEDCalculatorBrowserField::unselectAllSteps()
191 for (std::vector<MEDCalculatorBrowserStep>::iterator it = _steps.begin(); it != _steps.end(); ++it)
198 // Return if this field is selected or not, i.e. if some time steps are selected or not
199 bool MEDCalculatorBrowserField::isSelected()
205 const std::string& MEDCalculatorBrowserField::getName() const
210 // Return steps vector
211 const std::vector<MEDCalculatorBrowserStep>& MEDCalculatorBrowserField::getSteps() const
216 // Return the time value corresponding to time step with id ts
217 const double& MEDCalculatorBrowserField::getTimeValue(int ts) const
219 std::vector<MEDCalculatorBrowserStep>::const_iterator it = std::find(_steps.begin(),_steps.end(),ts);
220 return it->getTimeValue();
224 // Return the number of time steps
225 unsigned int MEDCalculatorBrowserField::getStepsSize() const
227 return _steps.size();
230 // Add a time step to steps vector with (id, time value)
231 void MEDCalculatorBrowserField::addStep(int ts, double tv)
233 _steps.push_back(MEDCalculatorBrowserStep(ts,tv));
236 // Select a specific component according to its id
237 void MEDCalculatorBrowserField::selectComponent(int id)
239 _selected_components[id]=true;
242 // Select all components
243 void MEDCalculatorBrowserField::selectAllComponents()
245 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
247 _selected_components[i] = true;
251 // Unselect a specific component according to its id
252 void MEDCalculatorBrowserField::unselectComponent(int id)
254 _selected_components[id]=false;
257 // Unselect all components
258 void MEDCalculatorBrowserField::unselectAllComponents()
260 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
262 _selected_components[i] = false;
266 // Return a copy of the components vector
267 const std::vector<std::string>& MEDCalculatorBrowserField::getComponents() const
272 // Return a copy of the selected components vector
273 const std::vector<bool>& MEDCalculatorBrowserField::getSelectedComponents() const
275 return _selected_components;
278 // Return the number of components
279 unsigned int MEDCalculatorBrowserField::getComponentsSize() const
281 return _components.size();
284 // Return a std::vector of std::string which contains all the meshes name used by all the time steps as supporting meshes
285 const std::vector<std::string>& MEDCalculatorBrowserField::getCorrespondingMeshesFromField() const
287 return _corresponding_meshes;
290 // Return a std::string which contains all the meshes name used by the time steps (id) as supporting meshes
291 const std::string& MEDCalculatorBrowserField::getCorrespondingMeshFromStep(int i) const
293 return _steps[i].getCorrespondingMeshFromStep();
296 // Change the name of a component, if input is empty, the component name is -noname- (for print)
297 void MEDCalculatorBrowserField::setComponentName(int i,const std::string& name)
299 std::string name2(name);
300 if(name2 == std::string(""))
302 _components[i] = name2;
306 * Contrary to isSelected see all time steps.
308 bool MEDCalculatorBrowserField::isAnySelection() const
310 return std::find(_steps.begin(),_steps.end(),true)!=_steps.end();
313 void MEDCalculatorBrowserField::setMeshName(const std::string& m)
315 _corresponding_meshes.resize(1);
316 _corresponding_meshes[0]=m;
320 * This method returns a restriction of this containing only selected TimeSteps.
321 * This methods throws an exception if multiple meshes exists in selected time steps.
323 MEDCalculatorBrowserField MEDCalculatorBrowserField::getSelectedTimeSteps() const throw(INTERP_KERNEL::Exception)
325 int nbOfTs=std::count(_steps.begin(),_steps.end(),true);
326 std::vector<MEDCalculatorBrowserStep> ts(nbOfTs);
327 std::vector<MEDCalculatorBrowserStep>::const_iterator it=_steps.begin();
328 std::set<std::string> meshes;
329 for(int i=0;i<nbOfTs;i++)
331 it=std::find(it,_steps.end(),true);
333 meshes.insert((*it).getCorrespondingMeshFromStep());
335 throw INTERP_KERNEL::Exception("Not managed fields with variable meshes during time !");
337 MEDCalculatorBrowserField ret(*this);
339 ret.setMeshName(*(meshes.begin()));
343 void MEDCalculatorBrowserField::setSteps(const std::vector<MEDCalculatorBrowserStep>& steps)