Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYAcousticInterface.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) <2012> <EDF-R&D> <FRANCE>
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10  * See the GNU General Public License for more details.
11  * You should have received a copy of the GNU General Public License along
12  * with this program; if not, write to the Free Software Foundation, Inc.,
13  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
14  */
15 
16 #include <stdio.h>
17 
19 #include "TYAcousticInterface.h"
20 
22  : _densiteSrcsH(25.0), _densiteSrcsV(25.0), _offsetSources(0.01), _isRayonnant(true),
23  _regimeChangeAble(false), _typeDistribution(TY_PUISSANCE_CALCULEE), _useAtt(false)
24 {
25  _pAtt = NULL;
26 
27  _curRegime = 0;
28 
29  _nextRegime = 0;
30 
32 
33  addRegime(buildRegime()); // Construction d'un regime a partir du regime par defaut
34 }
35 
37 {
38  *this = other;
39 }
40 
42 
44 {
45  if (this != &other)
46  {
51  _curRegime = other._curRegime;
52  _nextRegime = other._nextRegime;
54  _useAtt = other._useAtt;
55  _pAtt = other._pAtt;
56  _isRayonnant = other._isRayonnant;
57  _tabRegimes = other._tabRegimes;
58  }
59  return *this;
60 }
61 
63 {
64  if (this != &other)
65  {
66  if (_densiteSrcsH != other._densiteSrcsH)
67  {
68  return false;
69  }
70  if (_densiteSrcsV != other._densiteSrcsV)
71  {
72  return false;
73  }
75  {
76  return false;
77  }
79  {
80  return false;
81  }
82  if (_curRegime != other._curRegime)
83  {
84  return false;
85  }
86  if (_nextRegime != other._nextRegime)
87  {
88  return false;
89  }
91  {
92  return false;
93  }
94  if (_useAtt != other._useAtt)
95  {
96  return false;
97  }
98  if (_pAtt != other._pAtt)
99  {
100  return false;
101  }
102  if (_isRayonnant != other._isRayonnant)
103  {
104  return false;
105  }
106  if (_tabRegimes != other._tabRegimes)
107  {
108  return false;
109  }
110  }
111  return true;
112 }
113 
115 {
116  return !operator==(other);
117 }
118 
119 void TYAcousticInterface::deepCopy(const TYAcousticInterface* pOther, bool copyId /*=true*/,
120  bool pUseCopyTag /*=false*/)
121 {
122  *this = *pOther;
123 
124  _tabRegimes.clear();
125  for (unsigned short i = 0; i < pOther->_tabRegimes.size(); i++)
126  {
127  TYRegime regime;
128  regime.deepCopy(&pOther->_tabRegimes[i], copyId);
129  _tabRegimes.push_back(regime);
130  }
131 
132  if ((pOther->getUseAtt()) && (pOther->_pAtt != NULL))
133  {
134  if (!_pAtt)
135  {
136  _pAtt = new TYAttenuateur();
137  }
138  _pAtt->deepCopy(pOther->_pAtt, copyId);
139  }
140 }
141 
143 {
144  TYXMLTools::addElementDoubleValue(domElement, "densiteSrcsH", _densiteSrcsH);
145  TYXMLTools::addElementDoubleValue(domElement, "densiteSrcsV", _densiteSrcsV);
146  TYXMLTools::addElementIntValue(domElement, "curRegime", _curRegime);
147  TYXMLTools::addElementUIntValue(domElement, "nbRegimes", getNbRegimes());
148  // Sauvegarde du numero d'ordre du prochain regime
149  TYXMLTools::addElementIntValue(domElement, "nextRegime", _nextRegime);
150 
151  // Ensuite on sauve tous les regimes
152  for (unsigned int i = 0; i < _tabRegimes.size(); i++)
153  {
154  _tabRegimes[i].toXML(domElement);
155  }
156 
157  return domElement;
158 }
159 
161 {
162  bool densiteHOk = false;
163  bool densiteVOk = false;
164  bool curRegimeOk = false;
165  bool typeDistributionOk = false;
166  bool useAttOk = false;
167  bool isRayonnantOk = false;
168  bool regimeFound = false;
169  bool nextRegimeFound = false;
170 
171  double densite = 0.0;
172  LPTYSpectre spectre = new TYSpectre();
173  LPTYAttenuateur pTempAtt = new TYAttenuateur();
174 
175  // On efface le tableau des regimes car au moins un a ete cree a la construction de l'objet
176  _tabRegimes.clear();
177  _curRegime = 0;
178  _nextRegime = 0;
179  DOM_Element elemCur;
180 
181  QDomNodeList childs = domElement.childNodes();
182  for (unsigned int i = 0; i < childs.length(); i++)
183  {
184  elemCur = childs.item(i).toElement();
185 
186  if (!densiteHOk)
187  {
188  TYXMLTools::getElementDoubleValue(elemCur, "densiteSrcsH", densite, densiteHOk);
189  setDensiteSrcsH(densite, false); // La densite relue ne se propage pas aux sous-elements
190  }
191  if (!densiteVOk)
192  {
193  TYXMLTools::getElementDoubleValue(elemCur, "densiteSrcsV", densite, densiteVOk);
194  setDensiteSrcsV(densite, false); // La densite relue ne se propage pas aux sous-elements
195  }
196 
197  TYXMLTools::getElementBoolValue(elemCur, "isRayonnant", _isRayonnant, isRayonnantOk);
198  TYXMLTools::getElementBoolValue(elemCur, "useAtt", _useAtt, useAttOk);
199  TYXMLTools::getElementIntValue(elemCur, "typeDistribution", _typeDistribution, typeDistributionOk);
200  TYXMLTools::getElementIntValue(elemCur, "curRegime", _curRegime, curRegimeOk);
201  TYXMLTools::getElementIntValue(elemCur, "nextRegime", _nextRegime, nextRegimeFound);
202 
203  if (spectre->callFromXMLIfEqual(elemCur))
204  {
205  _pCurrentSpectre = *spectre;
206  }
207 
208  if (pTempAtt->callFromXMLIfEqual(elemCur))
209  {
210  _pAtt = pTempAtt;
211  }
212 
213  // Ensuite il devrait y avoir la liste des regimes de la machine
214  TYRegime regime;
215  if (regime.callFromXMLIfEqual(elemCur))
216  {
217  regimeFound = true; // On a trouve au moins un regime
218  _tabRegimes.push_back(regime);
219  }
220  }
221 
222  if (regimeFound) // Si au moins un regime a ete trouve, on recharge le regime courant
223  {
225  }
226  else // Sinon on construit un "regime 0"
227  {
229  nextRegimeFound = true;
230  }
231 
232  if (!nextRegimeFound)
233  {
234  _nextRegime = static_cast<int>(_tabRegimes.size()) + 2;
235  }
236 
237  return 1;
238 }
239 
241 {
242  return (_densiteSrcsH * _densiteSrcsV);
243 }
244 
245 void TYAcousticInterface::setDensiteSrcs(double densite, bool recursif /*= true */)
246 {
247  densite = sqrt(densite);
248  setDensiteSrcsH(densite, recursif);
249  setDensiteSrcsV(densite, recursif);
250 }
251 
252 void TYAcousticInterface::setDensiteSrcsH(double densite, bool recursif /*= true */)
253 {
254  _densiteSrcsH = densite;
255 }
256 
257 void TYAcousticInterface::setDensiteSrcsV(double densite, bool recursif /*= true */)
258 {
259  _densiteSrcsV = densite;
260 }
261 
262 void TYAcousticInterface::setIsRayonnant(bool rayonnant, bool recursif)
263 {
264  _isRayonnant = rayonnant;
265  _tabRegimes[_curRegime]._isRayonnant = rayonnant;
266 }
267 
269 {
270  _typeDistribution = typeDistri;
271  _tabRegimes[_curRegime]._typeDistribution = typeDistri;
272 }
273 
275 {
276  _useAtt = state;
277  if (!_useAtt)
278  {
279  // On conserve _pAtt pour propager la suppression des atténuateurs aux sous-éléments dans
280  // TYAcousticInterfaceWidget::apply
281  }
282  else
283  {
284  if (!_pAtt)
285  {
286  _pAtt = new TYAttenuateur();
287  }
288  }
289 
290  _tabRegimes[_curRegime]._useAtt = _useAtt;
291  _tabRegimes[_curRegime]._pAtt = _pAtt;
292 }
293 
295 {
296  _pAtt = pAtt;
297 
298  _tabRegimes[_curRegime]._pAtt = pAtt;
299 
300  if (_pAtt)
301  {
302  setUseAtt(true);
303  } // En associant un atténuateur on dit qu'on va utiliser celui-ci
304  else
305  {
306  setUseAtt(false);
307  } // Sinon on n'utilise pas d'atténuateur
308 }
309 
311 {
312  _useAtt = true;
313 
314  if (!pAtt)
315  {
316  _pAtt = NULL;
317  _useAtt = false;
318  }
319  else if (!_pAtt)
320  {
321  _pAtt = new TYAttenuateur();
322  }
323 
324  if (_pAtt)
325  {
326  _pAtt->deepCopy(pAtt, false);
327  }
328 
329  updateCurrentRegime(); // On met a jour le regime courant
330 }
331 
332 /*virtual*/ TYSpectre TYAcousticInterface::setGlobalLW(const TYSpectre& spectre, const double& surfGlobale,
333  const int& regime /*=-1*/)
334 {
335  return TYSpectre();
336 }
337 
338 void TYAcousticInterface::setRegime(TYSpectre& Spectre, int regime /*=-1*/, bool recursif /*=false*/)
339 {
340  // Type Puissance
341  Spectre.setType(SPECTRE_TYPE_LW);
342 
344  // updateCurrentRegime();
345 }
346 
348 {
349  return addRegime(buildRegime());
350 }
351 
353 {
354  _tabRegimes.push_back(regime);
355 
356  return static_cast<int>(_tabRegimes.size());
357 }
358 
359 bool TYAcousticInterface::remRegime(int regimeNumber)
360 {
361  // Il doit exister au moins un regime
362  if (_tabRegimes.size() == 1)
363  {
364  return false;
365  }
366 
367  if (regimeNumber > (int)_tabRegimes.size() - 1)
368  {
369  return false;
370  }
371 
372  TYTabRegimes::iterator it; // Iterateur sur le tableau
373  it = _tabRegimes.begin() + regimeNumber; // On le fait pointer sur l'element a supprimer
374 
375  _tabRegimes.erase(it); // On efface l'element pointe
376 
377  // On charge le premier regime
378  if (_curRegime == regimeNumber)
379  {
380  _curRegime = 0;
381  loadRegime();
382  }
383 
384  return true; // Tout s'est bien passe du moins on l'espere
385 }
386 
388 {
390 }
391 
393 {
394  char buf[4];
395  sprintf_s(buf, "%d", _nextRegime);
396 
397  QString temp = buf;
398 
399  TYRegime regime;
400  regime.setName(OLocalizator::getString("DisplayName", "TYRegime") + " " + temp);
401  regime._isRayonnant = _isRayonnant;
402  regime._useAtt = _useAtt;
404  regime._spectre = _pCurrentSpectre;
405  regime._pAtt = _pAtt;
406 
407  // Pour eviter de depasser 999 regimes dans ce cas on revient a 0 et l'utilisateur se demerde !
408  if (_nextRegime == 999)
409  {
410  _nextRegime = 0;
411  }
412  else
413  {
414  _nextRegime++; // Incremente le numero d'ordre pour le prochain regime
415  }
416 
417  return regime;
418 }
419 
420 void TYAcousticInterface::setCurRegime(int regimeNumber)
421 {
422  if (regimeNumber > (int)_tabRegimes.size() - 1)
423  {
424  return;
425  }
426  if (regimeNumber < 0)
427  {
428  regimeNumber = (int)_tabRegimes.size() - 1;
429  }
430 
431  TYRegime& regime = _tabRegimes[regimeNumber];
432 
433  _isRayonnant = regime._isRayonnant;
434  _useAtt = regime._useAtt;
436  _pCurrentSpectre = regime._spectre;
437  _pAtt = regime._pAtt;
438 
439  _curRegime = regimeNumber;
440 
441  // ((TYElement*)this)->setIsAcousticModified(true);
442 }
443 
445 {
446  TYRegime& regime = _tabRegimes[_curRegime];
447 
448  regime._isRayonnant = _isRayonnant;
449  regime._useAtt = _useAtt;
451  regime._spectre = _pCurrentSpectre;
452 
453  if (_useAtt && _pAtt)
454  {
455  regime._pAtt = new TYAttenuateur();
456  regime._pAtt->deepCopy(_pAtt, false);
457  }
458  else if (!_pAtt)
459  {
460  _useAtt = false;
461  }
462 }
463 
465 {
466  if (regimeNb == -1)
467  {
468  regimeNb = _curRegime;
469  }
470  else if ((regimeNb < 0) || (regimeNb > (int)_tabRegimes.size() - 1))
471  {
472  regimeNb = 0;
473  }
474 
475  TYRegime& regime = _tabRegimes[regimeNb];
476 
477  _isRayonnant = regime._isRayonnant;
478  _useAtt = regime._useAtt;
480  _pCurrentSpectre = regime._spectre;
481 
482  if (_useAtt && (regime._pAtt != NULL))
483  {
484  _pAtt = new TYAttenuateur();
485  _pAtt->deepCopy(regime._pAtt, false);
486  }
487 }
488 
489 TYRegime& TYAcousticInterface::getRegimeNb(const int& nb, bool& status)
490 {
491  status = true;
492  if (nb >= _tabRegimes.size())
493  {
494  status = false;
495  return _tabRegimes[0];
496  }
497 
498  return _tabRegimes[nb];
499 }
500 
501 const TYRegime& TYAcousticInterface::getRegimeNb(const int& nb, bool& status) const
502 {
503  status = true;
504  if (nb >= _tabRegimes.size())
505  {
506  status = false;
507  return _tabRegimes[0];
508  }
509 
510  return _tabRegimes[nb];
511 }
512 
514 {
515  bool status = true;
516  QString name = getRegimeNb(_curRegime, status).getRegimeName();
517  if (!status)
518  {
519  name = "";
520  }
521  return name;
522 }
523 
525 {
526  bool status = true;
527  QString name = getRegimeNb(_curRegime, status).getRegimeName();
528  if (!status)
529  {
530  name = "";
531  }
532  return name;
533 }
534 
536 {
537  bool status = true;
538  TYRegime& reg = getRegimeNb(_curRegime, status);
539  if (status)
540  {
541  reg.setRegimeName(name);
542  }
543 }
544 
546 void TYAcousticInterface::exportCSV(std::ofstream& ofs)
547 {
548  std::string textTypeDistrib;
549 
551  {
552  textTypeDistrib = "Puissance calculee";
553  }
554  else
555  {
556  textTypeDistrib = "Puissance imposee";
557  }
558 
559  ofs << getRegimeName().toLatin1().data() << '\n';
560  if (_isRayonnant)
561  {
562  ofs << "Rayonnant : OUI\n";
563  ofs << "Type distribution : " << textTypeDistrib.c_str() << '\n';
564 
565  // Densite de sources
566  ofs << "Densite de sources horizontale: " << _densiteSrcsH << " source(s)/metre\n";
567  ofs << "Densite de sources verticale: " << _densiteSrcsV << " source(s)/metre\n";
568 
569  if (_useAtt)
570  {
571  ofs << "Attenuateur : OUI\n";
572  if (_pAtt)
573  {
574  _pAtt->getSpectreAtt().exportCSV(ofs);
575  }
576  else
577  {
578  ofs << "ATTENUATEUR NON DEFINI !!!\n";
579  }
580  }
581  else
582  {
583  ofs << "Attenuateur : NON\n";
584  }
585 
587  }
588  else
589  {
590  ofs << "Rayonnant : NON\n";
591  }
592 
593  ofs << '\n';
594 }
QDomElement DOM_Element
Definition: QT2DOM.h:30
const char * name
static QString getString(const QString &classname, const QString &stringId)
void setType(TYSpectreType type)
Set the spectrum type.
Definition: spectre.h:152
Spectrum class.
Definition: Spectre.h:25
bool _useAtt
Indique l'utilisation d'un attenuateur pour l'etat courant.
double _densiteSrcsV
Densite verticale de sources.
virtual void updateCurrentRegime()
virtual void setDensiteSrcsH(double densite, bool recursif=true)
TYRegime & getRegimeNb(const int &nb, bool &status)
size_t getNbRegimes() const
LPTYAttenuateur _pAtt
Attenuateur de l'etat courant.
int _curRegime
Numero du regime de fonctionnement courant.
int _typeDistribution
Indique le type de distribution a utiliser. pour l'etat courant.
virtual void loadRegime(int regimeNb=-1)
void setAtt(LPTYAttenuateur pAtt)
bool operator!=(const TYAcousticInterface &other) const
void setTypeDistribution(int typeDistri)
virtual void setUseAtt(bool state)
TYTabRegimes _tabRegimes
Tableau des regimes de fonctionnement.
virtual void setDensiteSrcsV(double densite, bool recursif=true)
DOM_Element toXML(DOM_Element &domElement)
virtual void exportCSV(std::ofstream &ofs)
Export au format csv sur un flux transmis.
virtual TYSpectre setGlobalLW(const TYSpectre &spectre, const double &surfGlobale, const int &regime=-1)
TYAcousticInterface & operator=(const TYAcousticInterface &other)
virtual QString getRegimeName()
virtual TYRegime buildRegime()
virtual void setRegime(TYSpectre &Spectre, int regime=-1, bool recursif=false)
virtual void setIsRayonnant(bool rayonnant=true, bool recursif=true)
virtual void setCurRegime(int regimeNumber)
int _nextRegime
Numero d'ordre du regime suivant.
int fromXML(DOM_Element domElement)
virtual void setDensiteSrcs(double densite, bool recursif=true)
bool _regimeChangeAble
Indique si un element peux changer de regime de lui meme.
void deepCopy(const TYAcousticInterface *pOther, bool copyId=true, bool pUseCopyTag=false)
bool operator==(const TYAcousticInterface &other) const
virtual void propagateRegime()
virtual void propagateAtt(LPTYAttenuateur pAtt)
double _densiteSrcsH
Densite horizontale de sources.
virtual bool remRegime(int regime)
virtual void setRegimeName(const QString &name)
bool _isRayonnant
Etat courant de l'element (rayonnant ou non rayonnant)
virtual bool deepCopy(const TYElement *pOther, bool copyId=true, bool pUseCopyTag=false)
TYSpectre & getSpectreAtt()
Definition: TYAttenuateur.h:99
void setName(QString name)
Definition: TYElement.h:671
bool callFromXMLIfEqual(DOM_Element &domElement, int *pRetVal=NULL)
Definition: TYElement.cpp:544
bool _useAtt
Definition: TYRegime.h:197
bool _isRayonnant
Definition: TYRegime.h:196
virtual bool deepCopy(const TYElement *pOther, bool copyId=true, bool pUseCopyTag=false)
Definition: TYRegime.cpp:99
TYSpectre _spectre
Definition: TYRegime.h:199
QString getRegimeName()
Definition: TYRegime.h:86
int _typeDistribution
Definition: TYRegime.h:198
void setRegimeName(const QString &nom)
Definition: TYRegime.h:78
LPTYAttenuateur _pAtt
Definition: TYRegime.h:200
virtual void exportCSV(const std::string &filename)
Export du spectre au format csv en creant le fichier.
Definition: TYSpectre.cpp:385
static void addElementDoubleValue(DOM_Element &parentElem, DOMString nodeName, double nodeValue)
Definition: TYXMLTools.cpp:87
static bool getElementBoolValue(DOM_Element parentElem, DOMString nodeName, bool &nodeValue)
Definition: TYXMLTools.cpp:179
static void addElementIntValue(DOM_Element &parentElem, DOMString nodeName, int nodeValue)
Definition: TYXMLTools.cpp:72
static bool getElementIntValue(DOM_Element parentElem, DOMString nodeName, int &nodeValue)
Definition: TYXMLTools.cpp:129
static bool getElementDoubleValue(DOM_Element parentElem, DOMString nodeName, double &nodeValue)
Definition: TYXMLTools.cpp:243
static void addElementUIntValue(DOM_Element &parentElem, DOMString nodeName, unsigned int nodeValue)
Definition: TYXMLTools.cpp:42
@ SPECTRE_TYPE_LW
Definition: spectre.h:30