1 // Copyright (C) 2007-2022 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 ! Probably presence of field on edges faces...");
62 _type=types[0];//To improve
63 MCAuto<MEDCouplingFieldDouble> tmpf;
66 MCAuto<MEDCouplingField> tmpf2(ReadField(_type,fname,meshNames[0].c_str(),0,fieldName,dtits[0].first.first,dtits[0].first.second));
67 tmpf=DynamicCast<MEDCouplingField,MEDCouplingFieldDouble>(tmpf2);
69 catch(INTERP_KERNEL::Exception& e)
73 MCAuto<MEDCouplingField> tmpf2(ReadField(_type,fname,meshNames[0].c_str(),-1,fieldName,dtits[0].first.first,dtits[0].first.second));
74 tmpf=DynamicCast<MEDCouplingField,MEDCouplingFieldDouble>(tmpf2);
79 int NumberOfComponents=tmpf->getNumberOfComponents();
80 for(int i=0;i<NumberOfComponents;i++)
82 std::string c=tmpf->getArray()->getInfoOnComponent(i);
85 _components.push_back(c);
87 _corresponding_meshes=GetMeshNamesOnField(fname,fieldName);
90 // Equal to string operator,
91 // Test if fieldname of this field is the same as nm
92 bool MEDCalculatorBrowserField::operator==(const std::string& nm)
97 // Equal to bool operator,
98 // Test selection flag is set just as sel
99 bool MEDCalculatorBrowserField::operator==(bool sel)
101 return _selection==sel;
105 // Construct a std::string to print Field, using std::cout for example
106 // Put x or o for selected or not
107 // Add Field fieldname
108 // Add x/o components
109 // Add MEDCalculatorBrowserStep::str() for each step
110 // Return a std::string
111 std::string MEDCalculatorBrowserField::str()
113 std::ostringstream res;
114 _selection?res<<"x ":res<<"o ";
115 res<<"Field "<<_name;
117 res<<"\n\t\tComponents :"<<std::endl;
118 for (unsigned int i = 0; i < _components.size(); i += 1)
120 res<<"\n\t\t\t"<<i<<" : "<<_components[i]<<""<<std::endl;
123 res<<"\n\t\tTimessteps :"<<std::endl;
124 for (unsigned int i = 0; i < _steps.size(); i += 1)
126 res<<"\n\t\t\t"<<_steps[i].str();
132 // Select a specific step according to its id
133 // Use std::find to get the corresponding step
134 // Also select all components if none is selected (avoid having time steps selected, so field selected, without components)
135 void MEDCalculatorBrowserField::selectStep(int ts)
137 std::vector<MEDCalculatorBrowserStep>::iterator it = std::find(_steps.begin(),_steps.end(),ts);
138 if(it != _steps.end())
142 std::vector<bool>::iterator itb = std::find(_selected_components.begin(),_selected_components.end(),true);
143 if(itb == _selected_components.end())
145 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
147 _selected_components[i] = true;
154 // Select all time steps
155 // Also select all components if none is selected (avoid having time steps selected, so field selected, without components)
156 void MEDCalculatorBrowserField::selectAllSteps()
158 for (std::vector<MEDCalculatorBrowserStep>::iterator it = _steps.begin(); it != _steps.end(); ++it)
162 std::vector<bool>::iterator itb = std::find(_selected_components.begin(),_selected_components.end(),true);
163 if(itb == _selected_components.end())
165 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
167 _selected_components[i] = true;
173 // Unselect a specific time step according to its id
174 // Check if there is still time step selected :
175 // - if yes, do nothing;
176 // - if not, set selection flag to false
177 void MEDCalculatorBrowserField::unselectStep(int ts)
179 std::vector<MEDCalculatorBrowserStep>::iterator it = std::find(_steps.begin(),_steps.end(),ts);
180 if(it != _steps.end())
184 it = std::find(_steps.begin(),_steps.end(),true);
185 if(it == _steps.end())
191 // Unselect all time steps
192 // Set selection flag to false
193 void MEDCalculatorBrowserField::unselectAllSteps()
195 for (std::vector<MEDCalculatorBrowserStep>::iterator it = _steps.begin(); it != _steps.end(); ++it)
202 // Return if this field is selected or not, i.e. if some time steps are selected or not
203 bool MEDCalculatorBrowserField::isSelected()
209 const std::string& MEDCalculatorBrowserField::getName() const
214 // Return steps vector
215 const std::vector<MEDCalculatorBrowserStep>& MEDCalculatorBrowserField::getSteps() const
220 // Return the time value corresponding to time step with id ts
221 const double& MEDCalculatorBrowserField::getTimeValue(int ts) const
223 std::vector<MEDCalculatorBrowserStep>::const_iterator it = std::find(_steps.begin(),_steps.end(),ts);
224 return it->getTimeValue();
228 // Return the number of time steps
229 unsigned int MEDCalculatorBrowserField::getStepsSize() const
231 return _steps.size();
234 // Add a time step to steps vector with (id, time value)
235 void MEDCalculatorBrowserField::addStep(int ts, double tv)
237 _steps.push_back(MEDCalculatorBrowserStep(ts,tv));
240 // Select a specific component according to its id
241 void MEDCalculatorBrowserField::selectComponent(int id)
243 _selected_components[id]=true;
246 // Select all components
247 void MEDCalculatorBrowserField::selectAllComponents()
249 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
251 _selected_components[i] = true;
255 // Unselect a specific component according to its id
256 void MEDCalculatorBrowserField::unselectComponent(int id)
258 _selected_components[id]=false;
261 // Unselect all components
262 void MEDCalculatorBrowserField::unselectAllComponents()
264 for (unsigned int i = 0; i < _selected_components.size(); i += 1)
266 _selected_components[i] = false;
270 // Return a copy of the components vector
271 const std::vector<std::string>& MEDCalculatorBrowserField::getComponents() const
276 // Return a copy of the selected components vector
277 const std::vector<bool>& MEDCalculatorBrowserField::getSelectedComponents() const
279 return _selected_components;
282 // Return the number of components
283 unsigned int MEDCalculatorBrowserField::getComponentsSize() const
285 return _components.size();
288 // Return a std::vector of std::string which contains all the meshes name used by all the time steps as supporting meshes
289 const std::vector<std::string>& MEDCalculatorBrowserField::getCorrespondingMeshesFromField() const
291 return _corresponding_meshes;
294 // Return a std::string which contains all the meshes name used by the time steps (id) as supporting meshes
295 const std::string& MEDCalculatorBrowserField::getCorrespondingMeshFromStep(int i) const
297 return _steps[i].getCorrespondingMeshFromStep();
300 // Change the name of a component, if input is empty, the component name is -noname- (for print)
301 void MEDCalculatorBrowserField::setComponentName(int i,const std::string& name)
303 std::string name2(name);
304 if(name2 == std::string(""))
306 _components[i] = name2;
310 * Contrary to isSelected see all time steps.
312 bool MEDCalculatorBrowserField::isAnySelection() const
314 return std::find(_steps.begin(),_steps.end(),true)!=_steps.end();
317 void MEDCalculatorBrowserField::setMeshName(const std::string& m)
319 _corresponding_meshes.resize(1);
320 _corresponding_meshes[0]=m;
324 * This method returns a restriction of this containing only selected TimeSteps.
325 * This methods throws an exception if multiple meshes exists in selected time steps.
327 MEDCalculatorBrowserField MEDCalculatorBrowserField::getSelectedTimeSteps() const
329 int nbOfTs=std::count(_steps.begin(),_steps.end(),true);
330 std::vector<MEDCalculatorBrowserStep> ts(nbOfTs);
331 std::vector<MEDCalculatorBrowserStep>::const_iterator it=_steps.begin();
332 std::set<std::string> meshes;
333 for(int i=0;i<nbOfTs;i++)
335 it=std::find(it,_steps.end(),true);
337 meshes.insert((*it).getCorrespondingMeshFromStep());
339 throw INTERP_KERNEL::Exception("Not managed fields with variable meshes during time !");
341 MEDCalculatorBrowserField ret(*this);
343 ret.setMeshName(*(meshes.begin()));
347 void MEDCalculatorBrowserField::setSteps(const std::vector<MEDCalculatorBrowserStep>& steps)