// 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) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 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 . // // For more information, please consult: . #include "CourbePolyLineaire1D_simpli.h" #include #include "ConstMath.h" #include "ParaGlob.h" // CONSTRUCTEURS : // de copie à partir d'une instance générale Cpl1D::Cpl1D(const Courbe1D& Coo) : CourbePolyLineaire1D(Coo) { if ((Coo.Type_courbe() != COURBEPOLYLINEAIRE_1_D) || (Coo.Type_courbe() != CPL1D)) { cout << "\n erreur dans le constructeur de copie pour une courbe poly linéaire " << " à partir d'une instance générale "; cout << "\n Cpl1D::Cpl1D(const Courbe1D& Co) "; Sortie(1); }; }; // METHODES PUBLIQUES : // --------- virtuelles --------- // Lecture des donnees de la classe sur fichier // le nom passé en paramètre est le nom de la courbe // s'il est vide c-a-d = "", la methode commence par lire le nom sinon // ce nom remplace le nom actuel void Cpl1D::LectDonnParticulieres_courbes(const string& nom,UtilLecture * entreePrinc) { if (nom == "") { *(entreePrinc->entree) >> nom_ref;} else {nom_ref=nom;}; // on définit une liste pour la lecture des coordonnées list pointlec; // un indicateur pour la fin de la lecture int fin_lecture = 0; // on lit l'entête string entete; *(entreePrinc->entree) >> entete; if (entete != "DdlP") // if(strstr(entreePrinc->tablcar,"DdlP")==0) { cout << "\n erreur en lecture des points pour une courbe poly lineaire " << " on attendait la chaine : DdlP "; cout << "\n Cpl1D::LectureDonneesParticulieres " << "(UtilLecture * entreePrinc) " << endl ; entreePrinc->MessageBuffer("** erreur **"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); } // la boucle de lecture des points string indic_fin; try { while (fin_lecture == 0) { // lecture double x,y; *(entreePrinc->entree) >> indic_fin; if (indic_fin == "") break; // erreur en lecture if (indic_fin != "FdlP") // cas ou ce n'est pas la fin de la lecture des coordonnées { // on récupère le x #ifndef ENLINUX_STREAM istringstream flot(indic_fin.c_str()); #else istrstream flot(indic_fin.c_str()); #endif flot >> x; indic_fin=""; // puis lecture du y *(entreePrinc->entree) >> y; Coordonnee2 M(x,y); pointlec.push_back(M); } else // on est à la fin de la lecture des coordonnées fin_lecture = 1; } } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie // on relance l'interuption pour le niveau supérieur { ErrSortieFinale toto; throw (toto); } catch ( ... ) { cout << "\n erreur en lecture des points de la courbe poly lineaire simplifie " << "\n Cpl1D::LectureDonneesParticulieres(.. "; entreePrinc->MessageBuffer("** erreur1 **"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); } if (fin_lecture != 1) { cout << "\n erreur en lecture des points de la courbe poly lineaire simplifie " << "\n Cpl1D::LectureDonneesParticulieres(.. "; entreePrinc->MessageBuffer("** erreur2 **"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); } // écriture dans le tableau points.Change_taille((int)pointlec.size()); list::iterator indice,indice_fin; indice_fin = pointlec.end(); int if1; for (indice = pointlec.begin(),if1=1; indice!= indice_fin; indice++,if1++) points(if1)= *indice; // On vérifie que la dérivée n'est pas infinie c'est-à-dire que // deux abscices ne sont pas identiques // on vérifie également par la même que les absisses sont croissantes int taille = points.Taille(); for (int i=1;iMessageBuffer("** erreur **"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); } // calcul de la dérivée initiale et de la dérivée finale der_init = (points(2)(2)-points(1)(2)) / (points(2)(1)-points(1)(1)); der_finale = (points(taille)(2)-points(taille-1)(2)) / (points(taille)(1)-points(taille-1)(1)); }; // def info fichier de commande void Cpl1D::Info_commande_Courbes1D(UtilLecture & entreePrinc) { ofstream & sort = *(entreePrinc.Commande_pointInfo()); // pour simplifier sort << "\n# ...................................................................................." << "\n# | exemple de definition d'une courbe polylineaire simplifiee |" << "\n# |cc1: nom de la courbe, CPL1D: type de la courbe, Ddcp: debut de lecture des points|" << "\n# |puis n couple de x et y, puis FdlP: fin de lecture des points, |" << "\n# |toutes les informations sur une seule ligne ! |" << "\n# ...................................................................................." << "\n cc1 CPL1D DdlP 0. 1. 1. 1. FdlP " << endl; }; // sortie du schemaXML: en fonction de enu void Cpl1D::SchemaXML_Courbes1D(ofstream& ,const Enum_IO_XML enu) { switch (enu) { case XML_TYPE_GLOBAUX : { break; } case XML_IO_POINT_INFO : { break; } case XML_IO_POINT_BI : { break; } case XML_IO_ELEMENT_FINI : { break; } }; };