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