diff --git a/elementperso.cpp b/elementperso.cpp index 73478786c..905e02d19 100644 --- a/elementperso.cpp +++ b/elementperso.cpp @@ -1,5 +1,25 @@ #include "elementperso.h" +/** + Constructeur de la classe ElementPerso. Permet d'instancier un element + utilisable comme un element fixe a la difference que l'element perso lit + sa description (noms, dessin, comportement) dans un fichier XML a fournir + en parametre. + @param nom_fichier Le chemin du fichier XML decrivant l'element + @param qgi Le QGraphicsItem parent de cet element + @param s Le Schema affichant cet element + @param etat Un pointeur facultatif vers un entier. La valeur de cet entier + sera changee de maniere a refleter le deroulement de l'instanciation : + - 0 : L'instanciation a reussi + - 1 : Le fichier n'existe pas + - 2 : Le fichier n'a pu etre ouvert + - 3 : Le fichier n'est pas un document XML + - 4 : Le document XML n'a pas une "definition" comme racine + - 5 : Les attributs de la definition ne sont pas presents et / ou valides + - 6 : La definition est vide + - 7 : L'analyse d'un element XML decrivant une partie du dessin de l'element a echoue + - 8 : Aucune partie du dessin n'a pu etre chargee +*/ ElementPerso::ElementPerso(QString &nom_fichier, QGraphicsItem *qgi, Schema *s, int *etat) : ElementFixe(qgi, s) { nomfichier = nom_fichier; nb_bornes = 0; @@ -134,14 +154,35 @@ ElementPerso::ElementPerso(QString &nom_fichier, QGraphicsItem *qgi, Schema *s, elmt_etat = 0; } +/** + @return Le nombre de bornes que l'element possede +*/ int ElementPerso::nbBornes() const { return(nb_bornes); } +/** + Dessine le composant sur le Schema + @param qp Le QPainter a utiliser pour dessiner l'element + @param qsogi Les options graphiques +*/ void ElementPerso::paint(QPainter *qp, const QStyleOptionGraphicsItem *) { dessin.play(qp); } +/** + Analyse et prend en compte un element XML decrivant une partie du dessin + de l'element perso. Si l'analyse reussit, la partie est ajoutee au dessin. + Cette partie peut etre une borne, une ligne, une ellipse, un cercle, un arc + de cercle ou un polygone. Cette methode renvoie false si l'analyse + d'une de ces formes echoue. Si l'analyse reussit ou dans le cas d'une forme + inconnue, cette methode renvoie true. A l'exception des bornes, toutes les + formes peuvent avoir un attribut style. @see setPainterStyle + @param e L'element XML a analyser + @param qp Le QPainter a utiliser pour dessiner l'element perso + @param s Le schema sur lequel sera affiche l'element perso + @return true si l'analyse reussit, false sinon +*/ bool ElementPerso::parseElement(QDomElement &e, QPainter &qp, Schema *s) { if (e.tagName() == "borne") return(parseBorne(e, s)); else if (e.tagName() == "ligne") return(parseLigne(e, qp)); @@ -152,6 +193,17 @@ bool ElementPerso::parseElement(QDomElement &e, QPainter &qp, Schema *s) { else return(true); // on n'est pas chiant, on ignore l'element inconnu } +/** + Analyse un element XML suppose representer une ligne. Si l'analyse + reussit, la ligne est ajoutee au dessin. + La ligne est definie par les attributs suivants : + - x1, y1 : reels, coordonnees d'une extremite de la ligne + - x2, y2 : reels, coordonnees de l'autre extremite de la ligne + + @param e L'element XML a analyser + @param qp Le QPainter a utiliser pour dessiner l'element perso + @return true si l'analyse reussit, false sinon +*/ bool ElementPerso::parseLigne(QDomElement &e, QPainter &qp) { // verifie la presence et la validite des attributs obligatoires double x1, y1, x2, y2; @@ -166,6 +218,19 @@ bool ElementPerso::parseLigne(QDomElement &e, QPainter &qp) { return(true); } +/** + Analyse un element XML suppose representer un cercle. Si l'analyse + reussit, le cercle est ajoute au dessin. + Le cercle est defini par les attributs suivants : + - x : abscisse du coin superieur gauche de la quadrature du cercle + - y : ordonnee du coin superieur gauche de la quadrature du cercle + - rayon : diametre du cercle + + @param e L'element XML a analyser + @param qp Le QPainter a utiliser pour dessiner l'element perso + @return true si l'analyse reussit, false sinon + @todo utiliser des attributs plus coherents : x et y = centre, rayon = vrai rayon +*/ bool ElementPerso::parseCercle(QDomElement &e, QPainter &qp) { // verifie la presence des attributs obligatoires double cercle_x, cercle_y, cercle_r; @@ -179,6 +244,20 @@ bool ElementPerso::parseCercle(QDomElement &e, QPainter &qp) { return(true); } +/** + Analyse un element XML suppose representer une ellipse. Si l'analyse + reussit, l'ellipse est ajoutee au dessin. + L'ellipse est definie par les attributs suivants : + - x : abscisse du coin superieur gauche du rectangle dans lequel s'inscrit l'ellipse + - y : ordonnee du coin superieur gauche du rectangle dans lequel s'inscrit l'ellipse + - largeur : dimension de la diagonale horizontale de l'ellipse + - hauteur : dimension de la diagonale verticale de l'ellipse + + @param e L'element XML a analyser + @param qp Le QPainter a utiliser pour dessiner l'element perso + @return true si l'analyse reussit, false sinon + @todo utiliser des attributs plus coherents : x et y = centre +*/ bool ElementPerso::parseEllipse(QDomElement &e, QPainter &qp) { // verifie la presence des attributs obligatoires double ellipse_x, ellipse_y, ellipse_l, ellipse_h; @@ -193,6 +272,20 @@ bool ElementPerso::parseEllipse(QDomElement &e, QPainter &qp) { return(true); } +/** + Analyse un element XML suppose representer un arc de cercle. Si l'analyse + reussit, l'arc de cercle est ajoute au dessin. + L'arc de cercle est defini par les quatres parametres d'une ellipse (en fait + l'ellipse dans laquelle s'inscrit l'arc de cercle) auxquels s'ajoutent les + attributs suivants : + - start : angle de depart : l'angle "0 degre" est a trois heures + - angle : etendue (en degres) de l'arc de cercle ; une valeur positive + va dans le sens contraire des aiguilles d'une montre + + @param e L'element XML a analyser + @param qp Le QPainter a utiliser pour dessiner l'element perso + @return true si l'analyse reussit, false sinon +*/ bool ElementPerso::parseArc(QDomElement &e, QPainter &qp) { // verifie la presence des attributs obligatoires double arc_x, arc_y, arc_l, arc_h, arc_s, arc_a; @@ -210,6 +303,16 @@ bool ElementPerso::parseArc(QDomElement &e, QPainter &qp) { return(true); } +/** + Analyse un element XML suppose representer un polygone. Si l'analyse + reussit, le polygone est ajoute au dessin. + Le polygone est defini par une serie d'attributs x1, x2, ..., xn et autant + d'attributs y1, y2, ..., yn representant les coordonnees des differents + points du polygone. + @param e L'element XML a analyser + @param qp Le QPainter a utiliser pour dessiner l'element perso + @return true si l'analyse reussit, false sinon +*/ bool ElementPerso::parsePolygone(QDomElement &e, QPainter &qp) { int i = 1; while(true) { @@ -231,6 +334,17 @@ bool ElementPerso::parsePolygone(QDomElement &e, QPainter &qp) { return(true); } +/** + Analyse un element XML suppose representer une borne. Si l'analyse + reussit, la borne est ajoutee a l'element. + Une borne est definie par les attributs suivants : + - x, y : coordonnees de la borne + - orientation : orientation de la borne = Nord (n), Sud (s), Est (e) ou Ouest (w) + + @param e L'element XML a analyser + @param s Le schema sur lequel l'element perso sera affiche + @return true si l'analyse reussit, false sinon +*/ bool ElementPerso::parseBorne(QDomElement &e, Schema *s) { // verifie la presence et la validite des attributs obligatoires double bornex, borney; @@ -241,19 +355,32 @@ bool ElementPerso::parseBorne(QDomElement &e, Schema *s) { if (e.attribute("orientation") == "n") borneo = Borne::Nord; else if (e.attribute("orientation") == "s") borneo = Borne::Sud; else if (e.attribute("orientation") == "e") borneo = Borne::Est; - else if (e.attribute("orientation") == "o") borneo = Borne::Ouest; + else if (e.attribute("orientation") == "w") borneo = Borne::Ouest; else return(false); new Borne(bornex, borney, borneo, this, s); ++ nb_bornes; return(true); } +/** + Active / desactive l'antialiasing sur un QPainter + @param qp Le QPainter a modifier + @param aa Booleen a true pour activer l'antialiasing, a false pour le desactiver +*/ void ElementPerso::setQPainterAntiAliasing(QPainter &qp, bool aa) { qp.setRenderHint(QPainter::Antialiasing, aa); qp.setRenderHint(QPainter::TextAntialiasing, aa); qp.setRenderHint(QPainter::SmoothPixmapTransform, aa); } +/** + Permet de savoir si l'attribut nom_attribut d'un element XML e est bien un + entier. Si oui, sa valeur est copiee dans entier. + @param e Element XML + @param nom_attribut Nom de l'attribut a analyser + @param entier Pointeur facultatif vers un entier + @return true si l'attribut est bien un entier, false sinon +*/ bool ElementPerso::attributeIsAnInteger(QDomElement &e, QString nom_attribut, int *entier) { // verifie la presence de l'attribut if (!e.hasAttribute(nom_attribut)) return(false); @@ -265,6 +392,14 @@ bool ElementPerso::attributeIsAnInteger(QDomElement &e, QString nom_attribut, in return(true); } +/** + Permet de savoir si l'attribut nom_attribut d'un element XML e est bien un + reel. Si oui, sa valeur est copiee dans reel. + @param e Element XML + @param nom_attribut Nom de l'attribut a analyser + @param reel Pointeur facultatif vers un double + @return true si l'attribut est bien un reel, false sinon +*/ bool ElementPerso::attributeIsAReal(QDomElement &e, QString nom_attribut, double *reel) { // verifie la presence de l'attribut if (!e.hasAttribute(nom_attribut)) return(false); @@ -276,6 +411,25 @@ bool ElementPerso::attributeIsAReal(QDomElement &e, QString nom_attribut, double return(true); } +/** + Verifie si l'attribut "orientation" de l'element XML e correspond bien a la + syntaxe decrivant les orientations possibles pour un element. + Cette syntaxe comprend exactement 4 lettres : + - une pour le Nord + - une pour l'Est + - une pour le Sud + - une pour l'Ouest + + Pour chaque orientation, on indique si elle est : + - l'orientation par defaut : d + - une orientation autorisee : y + - une orientation interdire : n + + Exemple : "dnny" represente un element par defaut oriente vers le nord et qui + peut etre oriente vers l'ouest mais pas vers le sud ou vers l'est. + @param e Element XML + @return true si l'attribut "orientation" est valide, false sinon +*/ bool ElementPerso::validOrientationAttribute(QDomElement &e) { // verifie la presence de l'attribut orientation if (!e.hasAttribute("orientation")) return(false); @@ -317,6 +471,7 @@ bool ElementPerso::validOrientationAttribute(QDomElement &e) { - white : remplissage blanc - black : remplissage noir - none : pas de remplissage [par defaut] + Les autres valeurs ne sont pas prises en compte. @param e L'element XML a parser @param qp Le QPainter a modifier en fonction des styles diff --git a/elements/semi_conducteurs/thyristor.elmt b/elements/semi_conducteurs/thyristor.elmt index ae3ec4a15..a39d15054 100644 --- a/elements/semi_conducteurs/thyristor.elmt +++ b/elements/semi_conducteurs/thyristor.elmt @@ -16,6 +16,6 @@ - +