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