Herezh_dev/Resultats/OrdreVisu.cc
2023-05-03 17:23:49 +02:00

237 lines
9.6 KiB
C++
Executable file

// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2022 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.
#include "OrdreVisu.h"
#include "CharUtil.h"
#include <iomanip>
// définition des données statiques
list <string> OrdreVisu::list_nom_coordinate;
list < list <Coordonnee > > OrdreVisu::list_coordinate;
string OrdreVisu::nom_base_couleur= "base_couleur"; // utilisé dans déformée
// ----------- definition du type énuméré -------------
// Retourne le nom d'un type d'incrément a partir de son identificateur de
// type enumere id_TypeIncre correspondant
string OrdreVisu::Nom_TypeIncre (const OrdreVisu::EnumTypeIncre id_nom)
{string result="";
switch (id_nom)
{ case PREMIER_INCRE : result="PREMIER_INCRE";break;
case INCRE_COURANT : result="INCRE_COURANT";break;
case DERNIER_INCRE : result="DERNIER_INCRE";break;
default :
{cout << "\nErreur : valeur incorrecte du type EnumTypeIncre !\n";
cout << "OrdreVisu::Nom_TypeIncre (const OrdreVisu::EnumTypeIncre id_nom) \n";
Sortie(1);}
};
return result;
};
// Retourne l'identificateur de type enumere associe au nom du type d'incrément
OrdreVisu::EnumTypeIncre OrdreVisu::Id_nom_TypeIncre (const string nom)
{EnumTypeIncre result;
if ( nom == "PREMIER_INCRE")result=PREMIER_INCRE;
else if ( nom == "INCRE_COURANT" )result=INCRE_COURANT;
else if ( nom == "DERNIER_INCRE" )result=DERNIER_INCRE;
else
{ cout << "\nErreur : nom du degre de type d'increment inconnu ! ("
<< nom << ") \n";
cout << "EnumTypeIncre OrdreVisu::Id_nom_TypeIncre (const string nom_TypeIncre) \n";
Sortie(1);
};
return result;
};
// ----------- fin definition du type énuméré -------------
// CONSTRUCTEURS :
// par defaut
OrdreVisu::OrdreVisu () :
commentaire_sommaire(),explication_detail()
,ordre(),actif(false)
{};
// permettant la définition de l'affichage
OrdreVisu::OrdreVisu
(const string& comment_som, const string& explication, const string& ordre):
commentaire_sommaire(comment_som),explication_detail(explication)
,ordre(ordre),actif(false)
{}
// constructeur de copie
OrdreVisu::OrdreVisu (const OrdreVisu& ord) :
commentaire_sommaire(ord.commentaire_sommaire),explication_detail(ord.explication_detail)
,ordre(ord.ordre),actif(ord.actif)
{};
// DESTRUCTEUR :
OrdreVisu::~OrdreVisu ()
{};
// METHODES PUBLIQUES :
// affichage de l'ordre
void OrdreVisu::Affiche_ordre()
{ // affichage de l'ordre s'il n'est pas vide
if (commentaire_sommaire.size() != 0)
cout << "\n" << setiosflags (ios::right) << commentaire_sommaire << ": "
<< setiosflags (ios::right) << setw(10) << ordre ;
// cout << "\n" << setw(50) << setiosflags (ios::right) << commentaire_sommaire << ": "
// << setiosflags (ios::right) << setw(10) << ordre ;
};
// affichage de l'explication détaillée
void OrdreVisu::Explication_detaillee()
{ cout << "\n" << explication_detail;};
// initialisation : permet d'initialiser les différents paramètres de l'ordre
// lors d'un premier passage des différents incréments
// en virtuelle, a priori est défini si nécessaire dans les classes dérivées
void OrdreVisu::Initialisation(ParaGlob * ,LesMaillages *,LesReferences*
,LesLoisDeComp* ,DiversStockage*,Charge*,LesCondLim*,LesContacts*
,Resultats*,EnumTypeIncre ,int
,const map < string, const double * , std::less <string> >&
,const List_io < TypeQuelconque >& listeVecGlob
,bool)
{ OrdreVisu::Mise_zero_coordo();
// faire attention, car tous les incréments ne sont pas passé systématiquement en revue
// donc l'initialisation se fait sur un choix d'incréments choisit par l'utilisateur
};
// execution de l'ordre
// en virtuelle, a priori est défini dans les classes dérivées
// unseul_incre : indique si oui ou non il y a un seul increment à visualiser
void OrdreVisu::ExeOrdre(ParaGlob * ,const Tableau <int>& ,LesMaillages *,bool,LesReferences*
,LesLoisDeComp* ,DiversStockage*
,Charge*,LesCondLim*,LesContacts*,Resultats*,UtilLecture & ,OrdreVisu::EnumTypeIncre
,int , bool,const map < string, const double * , std::less <string> >&
,const List_io < TypeQuelconque >& listeVecGlob)
{ // pour éviter l'affichage suivant il faut que la fonction soit surchargée
cout << "\n actuellement aucune action n'est implantee pour cet ordre "
<< "\n OrdreVisu::ExeOrdre( ";
Affiche_ordre();
};
// retour vrai si l'ordre proposée est celui de l'instance
bool OrdreVisu::OrdreVrai(const string& reponse)
{ // tout d'abord s'il n'y a rien dans la réponse, retour faux
if (reponse.length () == 0) return false;
// si il n'y a pas d'ordre possible, réponse faux également
if (ordre.length() == 0) return false;
// transformation des caractères en minuscule
string rep = Minuscules(reponse);
// test si l'on trouve l'ordre en question
if (rep.find(ordre) == string::npos)
return false;
else
return true;
};
// choix de l'ordre, cet méthode peut entraîner la demande d'informations
// supplémentaires si nécessaire. qui sont ensuite gérer par la classe elle même
void OrdreVisu::ChoixOrdre()
{ actif = true;
};
// lecture des paramètres de l'ordre dans un flux
void OrdreVisu::Lecture_parametres_OrdreVisu(UtilLecture & )
{ // pour éviter l'affichage suivant il faut que la fonction soit surchargée
cout << "\n " << commentaire_sommaire
<< " actuellement aucune lecture de parametre n'est implantee pour cet ordre "
<< "\n OrdreVisu::Lecture_parametres_OrdreVisu( ";
Affiche_ordre();
};
// écriture des paramètres de l'ordre dans un flux
void OrdreVisu::Ecriture_parametres_OrdreVisu(UtilLecture & )
{ // pour éviter l'affichage suivant il faut que la fonction soit surchargée
cout << "\n " << commentaire_sommaire
<< " actuellement aucune ecriture de parametre n'est implantee pour cet ordre "
<< "\n OrdreVisu::Ecriture_parametres_OrdreVisu( ";
Affiche_ordre();
};
//============================== méthodes protégées ============================
// ordonne une liste, supprime les doublons et finalement l'affiche à l'écran
void OrdreVisu::Propre_liste(list<int>& lis_sor)
{ // on ordonne la liste puis on supprime les doublons enfin on l'afficher
list<int>::iterator ik,ikfin;
lis_sor.sort(); // on ordonne la liste
lis_sor.unique(); // suppression des doublons
// affichage
cout << "\n liste finale : ";
ikfin = lis_sor.end();
for (ik=lis_sor.begin();ik!=ikfin;ik++)
cout << *ik << " ";
cout << "\n";
};
// mise a zéro des lists de coordonnées
void OrdreVisu::Mise_zero_coordo()
{ if (list_nom_coordinate.size() != 0)
{ list_nom_coordinate.erase(list_nom_coordinate.begin(),list_nom_coordinate.end());
list_coordinate.erase(list_coordinate.begin(),list_coordinate.end());
};
};
// lecture des paramètres de l'ordre général dans un flux
void OrdreVisu::Lect_para_OrdreVisu_general(UtilLecture & entreePrinc)
{ entreePrinc.NouvelleDonneeCVisu(); // on passe un enregistrement
string nom;
// essaie de lecture
try
{ (*entreePrinc.entCVisu) >> nom; // lecture de l'identificateur
if (nom != "actif")
{ cout << "\n ERREUR dans la lecture de l'activite de l'ordre, on le met inactif par defaut";
actif = false;
}
else
{ (*entreePrinc.entCVisu) >> actif;
entreePrinc.NouvelleDonneeCVisu(); // on passe un enregistrement
};
}
catch (ErrSortieFinale)
// cas d'une direction voulue vers la sortie
// on relance l'interuption pour le niveau supérieur
{ ErrSortieFinale toto;
throw (toto);
}
catch (...)// erreur de lecture
{ cout << "\n Erreur en lecture de l'activite de l'ordre a partir d'un fichier .CVisu,"
<< " , on le met inactif par defaut !! ";
actif = false;
};
};
// écriture des paramètres de l'ordre dans un flux
void OrdreVisu::Ecrit_para_OrdreVisu_general(UtilLecture & entreePrinc)
{ // écriture de l'activité de l'ordre
ostream & sort = (*(entreePrinc.Sort_CommandeVisu()));
sort << "\n actif " << actif << " # <0 ou 1> indique si l'ordre est actif ou non ";
};