Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

Modelml Class Reference

#include <modelml.h>

List of all members.

Public Member Functions

 Modelml ()
void save (const string &output, const vector< Primitive * > &primProfile, const vector< Primitive * > &primSection, const vector< Primitive * > &primAxis)
vector< vector< Primitive * > > load (const string input)

Private Member Functions

void appendElem (const vector< Primitive * > &ens_prim, QDomElement &elem)
void loadElem (QDomElement &e, vector< Primitive * > &ens_res)
PrimitiveloadAttribut (const QDomElement &att)


Detailed Description

La classe Modelml regroupe l'ensemble des fonctionnalités nécéssaires au chargement et à la sauvegarde de fichier aux format xml. Ce parsing XML utilise la Class QT QXML et l'approche DOM (Document Object Model).

Author:
Guitteny Fabrice

Idiart Baptiste

Le Goff Erwan


Constructor & Destructor Documentation

Modelml::Modelml  ) 
 

Constructeur de Modelml L'entete du document sera de type <!DOCTYPE ModelMG>

00007 : QDomDocument("ModelMG"){}


Member Function Documentation

void Modelml::appendElem const vector< Primitive * > &  ens_prim,
QDomElement &  elem
[private]
 

ajout d'une balise

Parameters:
ens_prim ensemble de primtives d'une de la fenetre concernée
elem balise étudiée

00039 { 00040 00041 QDomElement sselem;//sous élément de la balise elem 00042 for(unsigned int i = 0 ; i<primitivesList.size() ; i++) 00043 { 00044 switch(primitivesList[i]->type){ 00045 00046 case SEGMENT : 00047 sselem = createElement( "segment" ); 00048 primitivesList[i]->toXML(sselem);//mise en forme des données de la primitive au format Xml 00049 elem.appendChild(sselem);//ajout du sous élément à la balise elem 00050 break; 00051 00052 case CIRCLE : 00053 sselem = createElement( "cercle" ); 00054 primitivesList[i]->toXML(sselem);//mise en forme des données de la primitive au format Xml 00055 elem.appendChild(sselem);//ajout du sous élément à la balise elem 00056 break; 00057 00058 case BEZIER : 00059 sselem = createElement( "bezier" ); 00060 00061 primitivesList[i]->toXML(sselem);//mise en forme des données de la primitive au format Xml 00062 elem.appendChild(sselem);//ajout du sous élément à la balise elem 00063 break; 00064 case BSPLINE : 00065 sselem = createElement( "bspline" ); 00066 primitivesList[i]->toXML(sselem);//mise en forme des données de la primitive au format Xml 00067 elem.appendChild(sselem);//ajout du sous élément à la balise elem 00068 break; 00069 default : cout<<"non implementé\n";exit(-1);break; 00070 00071 } 00072 } 00073 }

vector< vector< Primitive * > > Modelml::load const string  input  ) 
 

chargement d'un fichier Xml

Parameters:
input fichier en lecture
Returns:
vecteur de dimmension 3 contenant la liste des primitives pour chacune des fenêtres

00077 { 00078 //verification de la validité du fichier input 00079 QFile file(input); 00080 if( !file.open( IO_ReadOnly ) ) 00081 exit(-1);//le fichier doit être au moins en lecture seule 00082 //chargement des informations dans l'arbre Dom 00083 if( !setContent( &file ) ) 00084 {//le fichier Xml doit être un fichier de type <!DOCTYPE ModelMG> 00085 file.close(); 00086 exit(-2); 00087 } 00088 file.close(); 00089 00090 // A ce stade le fichier est fermé puisque toutes les données ont été extraites 00091 // dans l'arbre Dom de l'objet Modelml 00092 00093 vector<Primitive*> primProfile; //primitives de la balise profil 00094 vector<Primitive*> primSection;//primitives de la balise section 00095 vector<Primitive*> primAxis;//primitives de la balise axe 00096 00097 vector<vector<Primitive*> > primitivesList; //vecteur des 3 balises 00098 00099 QDomElement root = documentElement(); 00100 if( root.tagName() != "model" ) 00101 exit(-3); 00102 QDomNode model = root.firstChild();//la premiere balise est "model" 00103 while( !model.isNull() ) 00104 { 00105 //parcours des fils de "model" 00106 //3 fils possibles : profile, section, axe 00107 //on crée ensuite l'ensemble des primitives dans le vecteur concerné 00108 QDomElement e = model.toElement(); 00109 if( !e.isNull() ){ 00110 if( e.tagName() == "profil" ){ 00111 loadElem(e,primProfile);primitivesList.push_back(primProfile);} 00112 if( e.tagName() == "section" ){ 00113 loadElem(e,primSection); primitivesList.push_back(primSection);} 00114 if( e.tagName() == "axe" ){ 00115 loadElem(e,primAxis);primitivesList.push_back(primAxis);} 00116 } 00117 model = model.nextSibling();//passage au fils suivant 00118 } 00119 return primitivesList; 00120 }

Primitive * Modelml::loadAttribut const QDomElement &  att  )  [private]
 

chargement d'un attribut

Parameters:
att élément étudié
Returns:
création d'un objet Primitive
See also:
primitive.h

00137 { 00138 Primitive *p = NULL; 00139 if( !attr.isNull() ) 00140 { 00141 if(attr.tagName() == "segment" ) 00142 {//création d'un segment à partir de deux points extrémités 00143 Point3D *a =new Point3D( atof(attr.attribute( "Ax", "" )),atof(attr.attribute( "Ay", "" ))); 00144 Point3D *b =new Point3D( atof(attr.attribute( "Bx", "" )),atof(attr.attribute( "By", "" ))); 00145 p= new Segment(a,b); 00146 } 00147 00148 if(attr.tagName() == "cercle" ) 00149 {//création d'un cercle à partir du Point centre et du rayon 00150 Point3D *a =new Point3D( atof(attr.attribute( "Ax", "" )),atof(attr.attribute( "Ay", "" ))); 00151 // double ray = atof(attr.attribute( "rayon", "" )); 00152 Point3D *b =new Point3D( atof(attr.attribute( "Bx", "" )),atof(attr.attribute( "By", "" ))); 00153 p = new Circle(a,b); 00154 } 00155 00156 if(attr.tagName() == "bezier" ) 00157 {//création d'une courbe de Bezier chargement des points de controles 00158 Bezier *courbeB = new Bezier(); 00159 string attrName="P0x"; 00160 double Px; 00161 double Py; 00162 Point3D *ctrlPoint; 00163 int numPoint = 0; 00164 while(attr.hasAttribute(attrName)) 00165 { 00166 Px = atof(attr.attribute( attrName, "" )); 00167 char snumPoint[256]=""; 00168 sprintf(snumPoint,"%d",numPoint); 00169 string temp = (string)snumPoint; 00170 attrName= "P"+temp+"y"; 00171 Py = atof(attr.attribute( attrName, "" )); 00172 ctrlPoint = new Point3D(Px, Py, 0.0); 00173 courbeB->addPoint(ctrlPoint); 00174 numPoint++; 00175 char snumPoint2[256]=""; 00176 sprintf(snumPoint2,"%d",numPoint); 00177 string temp2 = (string)snumPoint2; 00178 attrName="P"+temp2+"x"; 00179 } 00180 00181 p=courbeB; 00182 } 00183 00184 if(attr.tagName() == "bspline" ) 00185 {//création d'une courbe de Bspline chargement des points de controles 00186 Bspline *courbeB = new Bspline(); 00187 string attrName="P0x"; 00188 double Px; 00189 double Py; 00190 Point3D *ctrlPoint; 00191 int numPoint = 0; 00192 while(attr.hasAttribute(attrName)) 00193 { 00194 Px = atof(attr.attribute( attrName, "" )); 00195 char snumPoint[256]=""; 00196 sprintf(snumPoint,"%d",numPoint); 00197 string temp = (string)snumPoint; 00198 attrName= "P"+temp+"y"; 00199 Py = atof(attr.attribute( attrName, "" )); 00200 ctrlPoint = new Point3D(Px, Py, 0.0); 00201 courbeB->addPoint(ctrlPoint); 00202 numPoint++; 00203 char snumPoint2[256]=""; 00204 sprintf(snumPoint2,"%d",numPoint); 00205 string temp2 = (string)snumPoint2; 00206 attrName="P"+temp2+"x"; 00207 } 00208 00209 p=courbeB; 00210 } 00211 00212 } 00213 return p; 00214 }

void Modelml::loadElem QDomElement &  e,
vector< Primitive * > &  ens_res
[private]
 

chargement d'une balise

Parameters:
e balise étudiée
ens_res ensemble de primtives d'une de la fenetre concernée

00124 { 00125 QDomNode node = e.firstChild(); 00126 Primitive *p; 00127 while(!node.isNull()) 00128 { 00129 QDomElement attr = node.toElement(); 00130 p = loadAttribut(attr);//création d'une primitive à partir des données de l'arbre Dom 00131 primitivesList.push_back(p);//ajout à l'ensemble primitivesList de la primitive p 00132 node = node.nextSibling();//passage au fils suivant 00133 } 00134 }

void Modelml::save const string &  output,
const vector< Primitive * > &  primProfile,
const vector< Primitive * > &  primSection,
const vector< Primitive * > &  primAxis
 

sauvegarde au format Xml

Parameters:
output nom du ficher de sortie
primProfile ensemble des primitves de la fenêtre profil
primSection ensemble des primitves de la fenêtre section
primAxis ensemble des primitves de la fenêtre axe

00012 { 00013 00014 QFile file(output); 00015 if( !file.open( IO_WriteOnly ) ) 00016 exit(-1); // quitte si pas en accéssible en écriture 00017 QTextStream ts( &file ); 00018 //balise principale 00019 QDomElement root = createElement( "model" ); 00020 //balises secondaires (une pour chaque fenetre) 00021 QDomElement profile = createElement( "profil" ); 00022 QDomElement section = createElement( "section" ); 00023 QDomElement axis = createElement( "axe" ); 00024 00025 appendChild( root );//ajout de la racine au doctype ModelMG 00026 root.appendChild(profile);//puis création d'une balise vide pour profil 00027 root.appendChild(section);//pour section 00028 root.appendChild(axis);//pour axe 00029 00030 appendElem(primProfile,profile);//remplissage de la balise profil avec l'ensemble de primitives de la fenêtre 00031 appendElem(primSection,section);//remplissage de la balise section avec l'ensemble de primitives de la fenêtre 00032 appendElem(primAxis,axis);//remplissage de la balise axe avec l'ensemble de primitives de la fenêtre 00033 00034 //Ecriture dans le fichier output 00035 ts << toString(); 00036 file.close();//fermeture du fichier 00037 }


The documentation for this class was generated from the following files:
Generated on Tue Nov 29 21:58:59 2005 for CylinderGenerator by doxygen 1.3.7