Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYUserSourcePonctuelle.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 #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
16 
19 #if TY_USE_IHM
21 #endif
22 #include "TYUserSourcePonctuelle.h"
23 
25 
27 {
29 
31  _useAtt = false;
32  _isRayonnant = true;
33  _pAttenuateur = NULL;
34  _nextRegime = 0;
36 }
37 
39 {
40  *this = other;
41 }
42 
44 {
45  // On recopie les elements de l'objet source
47 
49 
50  // Enfin on construit la "TYUserSourcePonctuelle
51  _useAtt = false;
52  _isRayonnant = true;
53  _pAttenuateur = NULL;
54 
55  // Construction d'un premier regime qui devient le regime courant
56  _nextRegime = 0;
58 }
60 
62 {
63  if (this != &other)
64  {
66  _hauteur = other._hauteur;
67  _curRegime = other._curRegime;
68  _nextRegime = other._nextRegime;
69 
70  _useAtt = other._useAtt;
71 
72  if ((other._useAtt) && (other._pAttenuateur != NULL))
73  {
74  if (!_pAttenuateur)
75  {
77  }
79  }
80  else
81  {
82  _pAttenuateur = NULL;
83  _useAtt = false;
84  }
85 
86  _tabRegimes = other._tabRegimes;
87  }
88  return *this;
89 }
90 
92 {
93  if (this != &other)
94  {
95  if (TYSourcePonctuelle::operator!=(other))
96  {
97  return false;
98  }
99  if (_hauteur != other._hauteur)
100  {
101  return false;
102  }
103  if (_pAttenuateur != other._pAttenuateur)
104  {
105  return false;
106  }
107  if (_curRegime != other._curRegime)
108  {
109  return false;
110  }
111  if (_nextRegime != other._nextRegime)
112  {
113  return false;
114  }
115  if (_tabRegimes != other._tabRegimes)
116  {
117  return false;
118  }
119  }
120  return true;
121 }
122 
124 {
125  return !operator==(other);
126 }
127 
128 bool TYUserSourcePonctuelle::deepCopy(const TYElement* pOther, bool copyId /*=true*/,
129  bool pUseCopyTag /*=false*/)
130 {
131  if (!TYSourcePonctuelle::deepCopy(pOther, copyId, pUseCopyTag))
132  {
133  return false;
134  }
135 
136  TYUserSourcePonctuelle* pOtherSrc = (TYUserSourcePonctuelle*)pOther;
137 
138  _hauteur = pOtherSrc->_hauteur;
139  _curRegime = pOtherSrc->_curRegime;
140  _nextRegime = pOtherSrc->_nextRegime;
141 
142  if ((pOtherSrc->getUseAtt()) && (pOtherSrc->_pAttenuateur != NULL))
143  {
144  if (!_pAttenuateur)
145  {
147  }
148  _pAttenuateur->deepCopy(pOtherSrc->_pAttenuateur, copyId);
149  }
150 
151  // Copie du tableau des regimes
152  _tabRegimes.clear();
153  for (unsigned int i = 0; i < pOtherSrc->_tabRegimes.size(); i++)
154  {
155  TYUserSrcRegime regime;
156  regime.deepCopy(&pOtherSrc->_tabRegimes[i], copyId);
157  _tabRegimes.push_back(regime);
158  }
159 
160  return true;
161 }
162 
164 {
165  return "TYUserSourcePonctuelle";
166 }
167 
169 {
170  // On sauve l'etat courant
171  DOM_Element domNewElem = TYSourcePonctuelle::toXML(domElement);
172 
173  TYXMLTools::addElementIntValue(domNewElem, "curRegime", _curRegime);
174  TYXMLTools::addElementIntValue(domNewElem, "nextRegime", _nextRegime);
175 
176  // Ensuite on sauve tous les regimes
177  for (unsigned int i = 0; i < _tabRegimes.size(); i++)
178  {
179  _tabRegimes[i].toXML(domNewElem);
180  }
181 
182  return domNewElem;
183 }
184 
186 {
187  TYSourcePonctuelle::fromXML(domElement);
188 
189  // On vide le tableau des regimes
190  _tabRegimes.clear();
191  _nextRegime = 0;
192  _curRegime = 0;
193 
194  // bool hauteurOk = false;
195  bool curRegimeOk = false;
196  bool regimeFound = false;
197  bool useAttOk = false;
198  bool isRayonnantOk = false;
199  bool nextRegimeFound = false;
200  // int regime = 0;
201 
202  LPTYAttenuateur pAtt = new TYAttenuateur();
203 
204  DOM_Element elemCur;
205 
206  QDomNodeList childs = domElement.childNodes();
207 
208  for (unsigned int i = 0; i < childs.length(); i++)
209  {
210  elemCur = childs.item(i).toElement();
211 
212  TYXMLTools::getElementIntValue(elemCur, "curRegime", _curRegime, curRegimeOk);
213  TYXMLTools::getElementBoolValue(elemCur, "isRayonnant", _isRayonnant, isRayonnantOk);
214  TYXMLTools::getElementBoolValue(elemCur, "useAtt", _useAtt, useAttOk);
215  TYXMLTools::getElementIntValue(elemCur, "nextRegime", _nextRegime, nextRegimeFound);
216 
217  if (pAtt->callFromXMLIfEqual(elemCur))
218  {
219  _pAttenuateur = pAtt;
220  }
221 
222  TYUserSrcRegime regime;
223  if (regime.callFromXMLIfEqual(elemCur))
224  {
225  regimeFound = true;
226  _tabRegimes.push_back(regime);
227  }
228  }
229 
230  if (regimeFound) // Si au moins un regime a ete trouve, on recharge le regime courant
231  {
233  }
234  else // Sinon on construit un "regime 0"
235  {
237  nextRegimeFound = true;
238  }
239 
240  if (!nextRegimeFound)
241  {
242  _nextRegime = static_cast<int>(_tabRegimes.size()) + 2;
243  }
244 
245  return 1;
246 }
247 
249 {
250  _tabRegimes.push_back(regime);
251 
252  return static_cast<int>(_tabRegimes.size());
253 }
254 
255 bool TYUserSourcePonctuelle::remRegime(int regimeNumber)
256 {
257  // Il doit exister au moins un regime
258  if (_tabRegimes.size() == 1)
259  {
260  return false;
261  }
262 
263  if (regimeNumber > (int)_tabRegimes.size() - 1)
264  {
265  return false;
266  }
267 
268  TYTabUserSrcRegimes::iterator it; // Iterateur sur le tableau
269  it = _tabRegimes.begin() + regimeNumber; // On le fait pointer sur l'element a supprimer
270 
271  _tabRegimes.erase(it); // On efface l'element pointe
272 
273  // On charge le premier regime
274  if (_curRegime == regimeNumber)
275  {
276  _curRegime = 0;
277  loadRegime();
278  }
279 
280  return true; // Tout s'est bien passe du moins on l'espere
281 }
282 
284 {
285  char buf[3];
286  sprintf(buf, "%d", _nextRegime);
287 
288  QString temp = buf;
289 
290  TYUserSrcRegime regime;
291  regime.setName(OLocalizator::getString("DisplayName", "TYUserSrcRegime") + " " +
292  temp); // Incrementation du numero de regime
293  regime._isRayonnant = true;
294  regime._useAtt = _useAtt;
295  regime._typeDistribution = 1; // TY_PUISSANCE_IMPOSEE;
296  regime._spectre = *_pSpectre;
297  regime._pAtt = _pAttenuateur;
298  regime._pDirectivite = Directivity;
299 
300  // Pour eviter de depasser 999 regimes dans ce cas on revient a 0
301  if (_nextRegime == 999)
302  {
303  _nextRegime = 0;
304  }
305  else
306  {
307  _nextRegime++; // Incremente le numero d'ordre pour le prochain regime
308  }
309 
310  return regime;
311 }
312 
314 {
316 
317  regime._isRayonnant = _isRayonnant;
318  regime._useAtt = _useAtt;
319  regime._typeDistribution = 1; // TY_PUISSANCE_IMPOSEE;
320  regime._spectre = *_pSpectre;
321 
322  if (_useAtt)
323  {
324  regime._pAtt = new TYAttenuateur();
325  regime._pAtt->deepCopy(_pAttenuateur, false);
326  }
327 
328  regime._pDirectivite = Directivity;
329 }
330 
332 {
334  reg.setRegimeName(name);
335 }
336 
338 {
339  if (nb >= _tabRegimes.size())
340  {
341  return _tabRegimes[0];
342  }
343 
344  return _tabRegimes[nb];
345 }
346 
348 {
349  if (nb >= _tabRegimes.size())
350  {
351  return _tabRegimes[0];
352  }
353 
354  return _tabRegimes[nb];
355 }
356 
357 void TYUserSourcePonctuelle::setCurrentRegime(const int& regimeNumber)
358 {
359  int currentRegime = regimeNumber;
360  if (regimeNumber > (int)_tabRegimes.size() - 1)
361  {
362  return;
363  }
364  if (regimeNumber < 0)
365  {
366  currentRegime = (int)_tabRegimes.size() - 1;
367  } // on bascule sur le dernier regime
368 
369  TYUserSrcRegime& regime = _tabRegimes[currentRegime];
370 
371  regime._isRayonnant = _isRayonnant;
372  _useAtt = regime._useAtt;
373  // _typeDistribution = regime._typeDistribution;
374  *_pSpectre = regime._spectre;
375  _pAttenuateur = regime._pAtt;
376  Directivity = regime._pDirectivite;
377 
378  _curRegime = currentRegime;
379 }
380 
382 {
383  if (regimeNb == -1)
384  {
385  regimeNb = _curRegime;
386  }
387 
388  if ((regimeNb < 0) || (regimeNb > (int)_tabRegimes.size() - 1))
389  {
390  regimeNb = 0;
391  }
392 
393  TYUserSrcRegime& regime = _tabRegimes[regimeNb];
394 
395  _isRayonnant = regime._isRayonnant;
396  _useAtt = regime._useAtt;
397  *_pSpectre = regime._spectre;
398 
399  if (_useAtt && (regime._pAtt != NULL))
400  {
402  _pAttenuateur->deepCopy(regime._pAtt, false);
403  }
404 
405  if (regime._pDirectivite != NULL)
406  {
407  Directivity = regime._pDirectivite;
408  }
409 }
410 
412 {
413  return _pSpectre;
414 }
415 
417 {
418  // on prend en compte l'eventuel attenuateur
419  if (_useAtt && (_pAttenuateur != NULL))
420  {
422  return new TYSpectre(temp);
423  }
424 
425  return new TYSpectre(_pSpectre->toGPhy());
426 }
427 
429 {
430  return new TYSpectre(getSpectre()->toDB());
431 }
432 
433 void TYUserSourcePonctuelle::exportCSV(std::ofstream& ofs)
434 {
435  // Export du nom de l'objet
436  ofs << getName().toLatin1().data() << '\n';
437 
438  // Export du type de l'objet
439  ofs << toString() << '\n';
440  // Export des proprietes acoustiques
442  ofs << getRegimeName().toLatin1().data() << '\n';
443 
444  if (_useAtt)
445  {
446  ofs << "Attenuateur : OUI\n";
447  if (_pAttenuateur)
448  {
450  }
451  else
452  {
453  ofs << "ATTENUATEUR NON DEFINI !!!\n";
454  }
455  }
456  else
457  {
458  ofs << "Attenuateur : NON\n";
459  }
460 
461  _pSpectre->exportCSV(ofs);
462 
463  ofs << '\n';
464 }
All base classes related to 3D manipulation.
QDomElement DOM_Element
Definition: QT2DOM.h:30
const char * name
outil IHM pour une source ponctuelle (fichier header)
TY_EXTENSION_INST(TYUserSourcePonctuelle)
static QString getString(const QString &classname, const QString &stringId)
virtual const char * getClassName() const
Definition: TYElement.h:248
OSpectreAbstract & toGPhy() const
Converts to physical quantity.
Definition: spectre.cpp:642
OSpectreAbstract & div(const OSpectreAbstract &spectre) const
Division of two spectrums.
Definition: spectre.cpp:278
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
QString _name
Nom courant de l'element.
Definition: TYElement.h:965
bool callFromXMLIfEqual(DOM_Element &domElement, int *pRetVal=NULL)
Definition: TYElement.cpp:542
virtual QString getName() const
Definition: TYElement.h:691
QString generateName(const char *classname)
Retourne le nom de la classe associe a un nombre.
static TYNameManager * get()
Retourne l'instance singleton.
bool _useAtt
Definition: TYRegime.h:197
bool _isRayonnant
Definition: TYRegime.h:196
TYSpectre _spectre
Definition: TYRegime.h:199
int _typeDistribution
Definition: TYRegime.h:198
void setRegimeName(const QString &nom)
Definition: TYRegime.h:78
LPTYAttenuateur _pAtt
Definition: TYRegime.h:200
int _type
Type de cette source.
virtual int fromXML(DOM_Element domElement)
double _hauteur
La hauteur de la source par rapport a l'altitude (dans le cas de source utilisateur).
virtual DOM_Element toXML(DOM_Element &domElement)
TYSourcePonctuelle & operator=(const TYSourcePonctuelle &other)
Operateur =.
TYDirectivity * Directivity
virtual bool deepCopy(const TYElement *pOther, bool copyId=true, bool pUseCopyTag=false)
LPTYSpectre _pSpectre
Definition: TYSource.h:96
virtual void exportCSV(const std::string &filename)
Export du spectre au format csv en creant le fichier.
Definition: TYSpectre.cpp:385
TYUserSrcRegime & getRegimeNb(const int &nb)
virtual void loadRegime(int regimeNb=-1)
virtual int fromXML(DOM_Element domElement)
virtual int addRegime(TYUserSrcRegime regime)
TYTabUserSrcRegimes _tabRegimes
Tableau de regimes de fonctionnement.
virtual bool remRegime(int regimeNumber)
int _curRegime
Numero du regime de fonctionnement courant.
virtual std::string toString() const
virtual DOM_Element toXML(DOM_Element &domElement)
virtual bool deepCopy(const TYElement *pOther, bool copyId=true, bool pUseCopyTag=false)
void exportCSV(std::ofstream &ofs)
Export au format csv sur un flux transmis.
TYUserSourcePonctuelle & operator=(const TYUserSourcePonctuelle &other)
Operateur =.
virtual TYSpectre * getSpectre(int regime=-1) const
int _nextRegime
Numero d'ordre du regime suivant.
virtual TYUserSrcRegime buildRegime()
void setCurrentRegime(const int &regimeNumber)
bool operator==(const TYUserSourcePonctuelle &other) const
Operateur ==.
bool operator!=(const TYUserSourcePonctuelle &other) const
Operateur !=.
bool _isRayonnant
Source rayonnante.
void setRegimeName(const QString &name)
bool _useAtt
Utilisation d'un attenuateur.
LPTYAttenuateur _pAttenuateur
Attenuateur lie a cette source.
virtual TYSpectre * getCurrentSpectre() const
LPTYDirectivity _pDirectivite
virtual bool deepCopy(const TYElement *pOther, bool copyId=true, bool pUseCopyTag=false)
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