2007-12-01 10:47:15 +00:00
|
|
|
|
/*
|
|
|
|
|
Copyright 2006-2007 Xavier Guerrin
|
|
|
|
|
This file is part of QElectroTech.
|
|
|
|
|
|
|
|
|
|
QElectroTech 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 2 of the License, or
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
2006-10-27 15:47:22 +00:00
|
|
|
|
#include "element.h"
|
2007-09-21 13:22:18 +00:00
|
|
|
|
#include "qetapp.h"
|
2007-01-29 00:41:12 +00:00
|
|
|
|
#include "diagram.h"
|
2007-10-03 17:02:39 +00:00
|
|
|
|
#include "conductor.h"
|
2007-02-24 00:26:04 +00:00
|
|
|
|
#include "elementtextitem.h"
|
2007-09-26 17:14:09 +00:00
|
|
|
|
#include "diagramcommands.h"
|
2006-10-27 15:47:22 +00:00
|
|
|
|
#include <QtDebug>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Constructeur pour un element sans scene ni parent
|
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
|
Element::Element(QGraphicsItem *parent, Diagram *scene) : QGraphicsItem(parent, scene) {
|
2007-01-29 20:14:26 +00:00
|
|
|
|
peut_relier_ses_propres_terminals = false;
|
2006-12-03 12:48:33 +00:00
|
|
|
|
setZValue(10);
|
2006-10-27 15:47:22 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-04-12 03:13:13 +00:00
|
|
|
|
/**
|
|
|
|
|
Destructeur
|
|
|
|
|
*/
|
|
|
|
|
Element::~Element() {
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
Methode principale de dessin de l'element
|
|
|
|
|
@param painter Le QPainter utilise pour dessiner l'elment
|
|
|
|
|
@param options Les options de style a prendre en compte
|
|
|
|
|
@param widget Le widget sur lequel on dessine
|
|
|
|
|
*/
|
2007-10-11 12:34:53 +00:00
|
|
|
|
void Element::paint(QPainter *painter, const QStyleOptionGraphicsItem *options, QWidget *widget) {
|
|
|
|
|
|
|
|
|
|
#ifdef Q_WS_X11
|
|
|
|
|
// corrige un bug de rendu ne se produisant que lors du rendu sur QGraphicsScene sous X11 au zoom par defaut
|
|
|
|
|
static bool must_correct_rendering_bug = !QString(qVersion()).startsWith("4.4");
|
|
|
|
|
if (must_correct_rendering_bug) {
|
|
|
|
|
Diagram *dia = diagram();
|
|
|
|
|
if (dia && options -> levelOfDetail == 1.0 && widget) {
|
|
|
|
|
// calcule la rotation qu'a subi l'element
|
|
|
|
|
qreal applied_rotation = 90.0 * (ori.current() - ori.defaultOrientation());
|
|
|
|
|
while (applied_rotation < 360.0) applied_rotation += 360.0;
|
|
|
|
|
while (applied_rotation > 360.0) applied_rotation -= 360.0;
|
|
|
|
|
if (applied_rotation == 90.0) painter -> translate(1.0, -1.0);
|
|
|
|
|
else if (applied_rotation == 180.0) painter -> translate(-1.0, -1.0);
|
|
|
|
|
else if (applied_rotation == 270.0) painter -> translate(-1.0, 1.0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
2006-10-27 15:47:22 +00:00
|
|
|
|
// Dessin de l'element lui-meme
|
|
|
|
|
paint(painter, options);
|
|
|
|
|
|
|
|
|
|
// Dessin du cadre de selection si necessaire
|
|
|
|
|
if (isSelected()) drawSelection(painter, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@return Le rectangle delimitant le contour de l'element
|
|
|
|
|
*/
|
|
|
|
|
QRectF Element::boundingRect() const {
|
|
|
|
|
return(QRectF(QPointF(-hotspot_coord.x(), -hotspot_coord.y()), dimensions));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Definit la taille de l'element sur le schema. Les tailles doivent etre
|
|
|
|
|
des multiples de 10 ; si ce n'est pas le cas, les dimensions indiquees
|
|
|
|
|
seront arrrondies aux dizaines superieures.
|
|
|
|
|
@param wid Largeur de l'element
|
|
|
|
|
@param hei Hauteur de l'element
|
|
|
|
|
@return La taille finale de l'element
|
|
|
|
|
*/
|
|
|
|
|
QSize Element::setSize(int wid, int hei) {
|
|
|
|
|
prepareGeometryChange();
|
|
|
|
|
// chaque dimension indiquee est arrondie a la dizaine superieure
|
|
|
|
|
while (wid % 10) ++ wid;
|
|
|
|
|
while (hei % 10) ++ hei;
|
|
|
|
|
// les dimensions finales sont conservees et retournees
|
|
|
|
|
return(dimensions = QSize(wid, hei));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Definit le hotspot de l'element par rapport au coin superieur gauche de son rectangle delimitant.
|
|
|
|
|
Necessite que la taille ait deja ete definie
|
2007-10-21 16:10:21 +00:00
|
|
|
|
@param hs Coordonnees du hotspot
|
2006-10-27 15:47:22 +00:00
|
|
|
|
*/
|
|
|
|
|
QPoint Element::setHotspot(QPoint hs) {
|
|
|
|
|
// la taille doit avoir ete definie
|
|
|
|
|
prepareGeometryChange();
|
|
|
|
|
if (dimensions.isNull()) hotspot_coord = QPoint(0, 0);
|
|
|
|
|
else {
|
|
|
|
|
// les coordonnees indiquees ne doivent pas depasser les dimensions de l'element
|
2007-01-20 18:11:42 +00:00
|
|
|
|
int hsx = qMin(hs.x(), dimensions.width());
|
|
|
|
|
int hsy = qMin(hs.y(), dimensions.height());
|
2006-10-27 15:47:22 +00:00
|
|
|
|
hotspot_coord = QPoint(hsx, hsy);
|
|
|
|
|
}
|
|
|
|
|
return(hotspot_coord);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@return Le hotspot courant de l'element
|
|
|
|
|
*/
|
|
|
|
|
QPoint Element::hotspot() const {
|
|
|
|
|
return(hotspot_coord);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Selectionne l'element
|
|
|
|
|
*/
|
|
|
|
|
void Element::select() {
|
|
|
|
|
setSelected(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Deselectionne l'element
|
|
|
|
|
*/
|
|
|
|
|
void Element::deselect() {
|
|
|
|
|
setSelected(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@return La pixmap de l'element
|
|
|
|
|
*/
|
|
|
|
|
QPixmap Element::pixmap() {
|
|
|
|
|
if (apercu.isNull()) updatePixmap(); // on genere la pixmap si ce n'est deja fait
|
|
|
|
|
return(apercu);
|
|
|
|
|
}
|
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
|
/**
|
|
|
|
|
Permet de specifier l'orientation de l'element
|
|
|
|
|
@param o la nouvelle orientation de l'objet
|
|
|
|
|
@return true si l'orientation a pu etre appliquee, false sinon
|
|
|
|
|
*/
|
2007-06-30 17:41:07 +00:00
|
|
|
|
bool Element::setOrientation(QET::Orientation o) {
|
2006-11-09 19:19:51 +00:00
|
|
|
|
// verifie que l'orientation demandee est acceptee
|
2007-06-30 17:41:07 +00:00
|
|
|
|
if (!ori.accept(o)) return(false);
|
2006-11-10 21:31:18 +00:00
|
|
|
|
prepareGeometryChange();
|
2006-10-27 15:47:22 +00:00
|
|
|
|
// rotation en consequence et rafraichissement de l'element graphique
|
2007-06-30 17:41:07 +00:00
|
|
|
|
qreal rotation_value = 90.0 * (o - ori.current());
|
2007-02-24 00:26:04 +00:00
|
|
|
|
rotate(rotation_value);
|
2007-06-30 17:41:07 +00:00
|
|
|
|
ori.setCurrent(o);
|
2006-12-02 23:42:59 +00:00
|
|
|
|
update();
|
|
|
|
|
foreach(QGraphicsItem *qgi, children()) {
|
2007-10-03 17:02:39 +00:00
|
|
|
|
if (Terminal *p = qgraphicsitem_cast<Terminal *>(qgi)) p -> updateConductor();
|
2007-02-24 00:26:04 +00:00
|
|
|
|
else if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(qgi)) {
|
|
|
|
|
// applique une rotation contraire si besoin
|
|
|
|
|
if (!eti -> followParentRotations()) {
|
|
|
|
|
QMatrix new_matrix = eti -> matrix();
|
|
|
|
|
qreal dx = eti -> boundingRect().width() / 2.0;
|
|
|
|
|
qreal dy = eti -> boundingRect().height() / 2.0;
|
|
|
|
|
new_matrix.translate(dx, dy);
|
|
|
|
|
new_matrix.rotate(-rotation_value);
|
|
|
|
|
new_matrix.translate(-dx, -dy);
|
|
|
|
|
eti -> setMatrix(new_matrix);
|
|
|
|
|
}
|
|
|
|
|
}
|
2006-12-02 23:42:59 +00:00
|
|
|
|
}
|
2006-11-09 19:19:51 +00:00
|
|
|
|
return(true);
|
2006-10-27 15:47:22 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*** Methodes protegees ***/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Dessine un petit repere (axes x et y) relatif a l'element
|
|
|
|
|
@param painter Le QPainter a utiliser pour dessiner les axes
|
|
|
|
|
@param options Les options de style a prendre en compte
|
|
|
|
|
*/
|
|
|
|
|
void Element::drawAxes(QPainter *painter, const QStyleOptionGraphicsItem *) {
|
|
|
|
|
painter -> setPen(Qt::blue);
|
|
|
|
|
painter -> drawLine(0, 0, 10, 0);
|
|
|
|
|
painter -> drawLine(7,-3, 10, 0);
|
|
|
|
|
painter -> drawLine(7, 3, 10, 0);
|
|
|
|
|
painter -> setPen(Qt::red);
|
|
|
|
|
painter -> drawLine(0, 0, 0, 10);
|
|
|
|
|
painter -> drawLine(0, 10,-3, 7);
|
|
|
|
|
painter -> drawLine(0, 10, 3, 7);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*** Methodes privees ***/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Dessine le cadre de selection de l'element de maniere systematiquement non antialiasee.
|
|
|
|
|
@param qp Le QPainter a utiliser pour dessiner les bornes.
|
|
|
|
|
@param options Les options de style a prendre en compte
|
|
|
|
|
*/
|
|
|
|
|
void Element::drawSelection(QPainter *painter, const QStyleOptionGraphicsItem *) {
|
|
|
|
|
painter -> save();
|
|
|
|
|
// Annulation des renderhints
|
|
|
|
|
painter -> setRenderHint(QPainter::Antialiasing, false);
|
|
|
|
|
painter -> setRenderHint(QPainter::TextAntialiasing, false);
|
|
|
|
|
painter -> setRenderHint(QPainter::SmoothPixmapTransform, false);
|
|
|
|
|
// Dessin du cadre de selection en gris
|
|
|
|
|
QPen t;
|
|
|
|
|
t.setColor(Qt::gray);
|
|
|
|
|
t.setStyle(Qt::DashDotLine);
|
|
|
|
|
painter -> setPen(t);
|
|
|
|
|
// Le dessin se fait a partir du rectangle delimitant
|
2007-09-15 22:14:23 +00:00
|
|
|
|
painter -> drawRoundRect(boundingRect().adjusted(1, 1, -1, -1), 10, 10);
|
2006-10-27 15:47:22 +00:00
|
|
|
|
painter -> restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Fonction initialisant et dessinant la pixmap de l'element.
|
|
|
|
|
*/
|
|
|
|
|
void Element::updatePixmap() {
|
|
|
|
|
// Pixmap transparente faisant la taille de base de l'element
|
|
|
|
|
apercu = QPixmap(dimensions);
|
|
|
|
|
apercu.fill(QColor(255, 255, 255, 0));
|
|
|
|
|
// QPainter sur la pixmap, avec antialiasing
|
|
|
|
|
QPainter p(&apercu);
|
|
|
|
|
p.setRenderHint(QPainter::Antialiasing, true);
|
|
|
|
|
p.setRenderHint(QPainter::SmoothPixmapTransform, true);
|
|
|
|
|
// Translation de l'origine du repere de la pixmap
|
|
|
|
|
p.translate(hotspot_coord);
|
|
|
|
|
// L'element se dessine sur la pixmap
|
|
|
|
|
paint(&p, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Change la position de l'element en veillant a ce que l'element
|
2007-01-29 00:41:12 +00:00
|
|
|
|
reste sur la grille du Diagram auquel il appartient.
|
2006-10-27 15:47:22 +00:00
|
|
|
|
@param p Nouvelles coordonnees de l'element
|
|
|
|
|
*/
|
|
|
|
|
void Element::setPos(const QPointF &p) {
|
|
|
|
|
if (p == pos()) return;
|
2007-01-29 00:41:12 +00:00
|
|
|
|
// pas la peine de positionner sur la grille si l'element n'est pas sur un Diagram
|
2006-10-27 15:47:22 +00:00
|
|
|
|
if (scene()) {
|
|
|
|
|
// arrondit l'abscisse a 10 px pres
|
2007-10-10 22:35:32 +00:00
|
|
|
|
int p_x = qRound(p.x() / (Diagram::xGrid * 1.0)) * Diagram::xGrid;
|
2006-10-27 15:47:22 +00:00
|
|
|
|
// arrondit l'ordonnee a 10 px pres
|
2007-10-10 22:35:32 +00:00
|
|
|
|
int p_y = qRound(p.y() / (Diagram::yGrid * 1.0)) * Diagram::yGrid;
|
2006-10-27 15:47:22 +00:00
|
|
|
|
QGraphicsItem::setPos(p_x, p_y);
|
|
|
|
|
} else QGraphicsItem::setPos(p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Change la position de l'element en veillant a ce que l'element
|
2007-01-29 00:41:12 +00:00
|
|
|
|
reste sur la grille du Diagram auquel il appartient.
|
2006-10-27 15:47:22 +00:00
|
|
|
|
@param x Nouvelle abscisse de l'element
|
|
|
|
|
@param y Nouvelle ordonnee de l'element
|
|
|
|
|
*/
|
|
|
|
|
void Element::setPos(qreal x, qreal y) {
|
|
|
|
|
setPos(QPointF(x, y));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2007-09-15 22:14:23 +00:00
|
|
|
|
Gere les mouvements de souris lies a l'element
|
2006-10-27 15:47:22 +00:00
|
|
|
|
*/
|
|
|
|
|
void Element::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
|
|
|
|
if (e -> buttons() & Qt::LeftButton) {
|
|
|
|
|
QPointF oldPos = pos();
|
2006-11-30 18:05:02 +00:00
|
|
|
|
setPos(mapToParent(e -> pos()) - matrix().map(e -> buttonDownPos(Qt::LeftButton)));
|
2007-10-27 13:18:17 +00:00
|
|
|
|
if (Diagram *diagram_ptr = diagram()) {
|
|
|
|
|
diagram_ptr -> moveElements(pos() - oldPos, this);
|
|
|
|
|
}
|
2006-10-27 15:47:22 +00:00
|
|
|
|
} else e -> ignore();
|
|
|
|
|
}
|
|
|
|
|
|
2007-10-10 17:50:26 +00:00
|
|
|
|
/**
|
|
|
|
|
Gere le relachement de souris
|
|
|
|
|
Cette methode a ete reimplementee pour tenir a jour la liste des elements
|
|
|
|
|
et conducteurs a deplacer au niveau du schema.
|
|
|
|
|
*/
|
2007-09-15 22:14:23 +00:00
|
|
|
|
void Element::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
|
2007-09-26 17:14:09 +00:00
|
|
|
|
Diagram *diagram_ptr = diagram();
|
2007-09-30 14:20:38 +00:00
|
|
|
|
if (diagram_ptr) {
|
|
|
|
|
if (!diagram_ptr -> current_movement.isNull()) {
|
|
|
|
|
diagram_ptr -> undoStack().push(
|
|
|
|
|
new MoveElementsCommand(
|
|
|
|
|
diagram_ptr,
|
2007-11-09 13:06:51 +00:00
|
|
|
|
diagram_ptr -> selectedContent(),
|
2007-09-30 14:20:38 +00:00
|
|
|
|
diagram_ptr -> current_movement
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
diagram_ptr -> current_movement = QPointF();
|
|
|
|
|
}
|
2007-09-26 17:14:09 +00:00
|
|
|
|
diagram_ptr -> invalidateMovedElements();
|
2007-09-15 22:14:23 +00:00
|
|
|
|
}
|
|
|
|
|
QGraphicsItem::mouseReleaseEvent(e);
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
Permet de savoir si un element XML (QDomElement) represente bien un element
|
|
|
|
|
@param e Le QDomElement a valide
|
|
|
|
|
@return true si l'element XML est un Element, false sinon
|
|
|
|
|
*/
|
|
|
|
|
bool Element::valideXml(QDomElement &e) {
|
|
|
|
|
// verifie le nom du tag
|
|
|
|
|
if (e.tagName() != "element") return(false);
|
|
|
|
|
|
|
|
|
|
// verifie la presence des attributs minimaux
|
|
|
|
|
if (!e.hasAttribute("type")) return(false);
|
|
|
|
|
if (!e.hasAttribute("x")) return(false);
|
|
|
|
|
if (!e.hasAttribute("y")) return(false);
|
|
|
|
|
|
|
|
|
|
bool conv_ok;
|
|
|
|
|
// parse l'abscisse
|
|
|
|
|
e.attribute("x").toDouble(&conv_ok);
|
|
|
|
|
if (!conv_ok) return(false);
|
|
|
|
|
|
|
|
|
|
// parse l'ordonnee
|
|
|
|
|
e.attribute("y").toDouble(&conv_ok);
|
|
|
|
|
if (!conv_ok) return(false);
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
2007-02-24 18:37:07 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Methode d'import XML. Cette methode est appelee lors de l'import de contenu
|
|
|
|
|
XML (coller, import, ouverture de fichier...) afin que l'element puisse
|
|
|
|
|
gerer lui-meme l'importation de ses bornes. Ici, comme cette classe est
|
|
|
|
|
caracterisee par un nombre fixe de bornes, l'implementation exige de
|
|
|
|
|
retrouver exactement ses bornes dans le fichier XML.
|
|
|
|
|
@param e L'element XML a analyser.
|
|
|
|
|
@param table_id_adr Reference vers la table de correspondance entre les IDs
|
|
|
|
|
du fichier XML et les adresses en memoire. Si l'import reussit, il faut y
|
|
|
|
|
ajouter les bons couples (id, adresse).
|
|
|
|
|
@return true si l'import a reussi, false sinon
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
bool Element::fromXml(QDomElement &e, QHash<int, Terminal *> &table_id_adr) {
|
|
|
|
|
/*
|
|
|
|
|
les bornes vont maintenant etre recensees pour associer leurs id <EFBFBD> leur adresse reelle
|
|
|
|
|
ce recensement servira lors de la mise en place des fils
|
|
|
|
|
*/
|
|
|
|
|
QList<QDomElement> liste_terminals;
|
2007-10-27 13:18:17 +00:00
|
|
|
|
foreach(QDomElement qde, QET::findInDomElement(e, "terminals", "terminal")) {
|
2007-02-24 19:56:29 +00:00
|
|
|
|
if (Terminal::valideXml(qde)) liste_terminals << qde;
|
2007-02-24 18:37:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QHash<int, Terminal *> priv_id_adr;
|
|
|
|
|
int terminals_non_trouvees = 0;
|
|
|
|
|
foreach(QGraphicsItem *qgi, children()) {
|
|
|
|
|
if (Terminal *p = qgraphicsitem_cast<Terminal *>(qgi)) {
|
|
|
|
|
bool terminal_trouvee = false;
|
|
|
|
|
foreach(QDomElement qde, liste_terminals) {
|
|
|
|
|
if (p -> fromXml(qde)) {
|
|
|
|
|
priv_id_adr.insert(qde.attribute("id").toInt(), p);
|
|
|
|
|
terminal_trouvee = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!terminal_trouvee) ++ terminals_non_trouvees;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (terminals_non_trouvees > 0) {
|
|
|
|
|
return(false);
|
|
|
|
|
} else {
|
|
|
|
|
// verifie que les associations id / adr n'entrent pas en conflit avec table_id_adr
|
|
|
|
|
foreach(int id_trouve, priv_id_adr.keys()) {
|
|
|
|
|
if (table_id_adr.contains(id_trouve)) {
|
|
|
|
|
// cet element possede un id qui est deja reference (= conflit)
|
|
|
|
|
return(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// copie des associations id / adr
|
|
|
|
|
foreach(int id_trouve, priv_id_adr.keys()) {
|
|
|
|
|
table_id_adr.insert(id_trouve, priv_id_adr.value(id_trouve));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-24 19:56:29 +00:00
|
|
|
|
// importe les valeurs des champs de texte
|
2007-10-27 13:18:17 +00:00
|
|
|
|
QList<QDomElement> inputs = QET::findInDomElement(e, "inputs", "input");
|
2007-02-24 19:56:29 +00:00
|
|
|
|
foreach(QGraphicsItem *qgi, children()) {
|
|
|
|
|
if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(qgi)) {
|
|
|
|
|
foreach(QDomElement input, inputs) eti -> fromXml(input);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-24 18:37:07 +00:00
|
|
|
|
// position, selection et orientation
|
|
|
|
|
setPos(e.attribute("x").toDouble(), e.attribute("y").toDouble());
|
|
|
|
|
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
|
|
|
|
|
bool conv_ok;
|
2007-03-09 19:18:55 +00:00
|
|
|
|
int read_ori = e.attribute("orientation").toInt(&conv_ok);
|
2007-06-30 17:41:07 +00:00
|
|
|
|
if (!conv_ok || read_ori < 0 || read_ori > 3) read_ori = ori.defaultOrientation();
|
|
|
|
|
setOrientation((QET::Orientation)read_ori);
|
2007-02-24 18:37:07 +00:00
|
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet d'exporter l'element en XML
|
|
|
|
|
@param document Document XML a utiliser
|
|
|
|
|
@param table_adr_id Table de correspondance entre les adresses des bornes
|
|
|
|
|
et leur id dans la representation XML ; cette table completee par cette
|
|
|
|
|
methode
|
|
|
|
|
@return L'element XML representant cet element electrique
|
|
|
|
|
*/
|
|
|
|
|
QDomElement Element::toXml(QDomDocument &document, QHash<Terminal *, int> &table_adr_id) const {
|
|
|
|
|
QDomElement element = document.createElement("element");
|
|
|
|
|
|
|
|
|
|
// type
|
|
|
|
|
QString chemin_elmt = typeId();
|
2007-09-21 13:22:18 +00:00
|
|
|
|
QString type_elmt = QETApp::symbolicPath(chemin_elmt);
|
2007-02-24 18:37:07 +00:00
|
|
|
|
element.setAttribute("type", type_elmt);
|
|
|
|
|
|
|
|
|
|
// position, selection et orientation
|
|
|
|
|
element.setAttribute("x", pos().x());
|
|
|
|
|
element.setAttribute("y", pos().y());
|
2007-06-30 17:41:07 +00:00
|
|
|
|
element.setAttribute("orientation", QString("%1").arg(ori.current()));
|
2007-02-24 18:37:07 +00:00
|
|
|
|
|
|
|
|
|
/* recupere le premier id a utiliser pour les bornes de cet element */
|
|
|
|
|
int id_terminal = 0;
|
|
|
|
|
if (!table_adr_id.isEmpty()) {
|
|
|
|
|
// trouve le plus grand id
|
|
|
|
|
int max_id_t = -1;
|
|
|
|
|
foreach (int id_t, table_adr_id.values()) {
|
|
|
|
|
if (id_t > max_id_t) max_id_t = id_t;
|
|
|
|
|
}
|
|
|
|
|
id_terminal = max_id_t + 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// enregistrement des bornes de l'appareil
|
2007-03-09 19:18:55 +00:00
|
|
|
|
QDomElement terminals = document.createElement("terminals");
|
2007-02-24 18:37:07 +00:00
|
|
|
|
// pour chaque enfant de l'element
|
|
|
|
|
foreach(QGraphicsItem *child, children()) {
|
|
|
|
|
// si cet enfant est une borne
|
|
|
|
|
if (Terminal *t = qgraphicsitem_cast<Terminal *>(child)) {
|
|
|
|
|
// alors on enregistre la borne
|
|
|
|
|
QDomElement terminal = t -> toXml(document);
|
|
|
|
|
terminal.setAttribute("id", id_terminal);
|
|
|
|
|
table_adr_id.insert(t, id_terminal ++);
|
|
|
|
|
terminals.appendChild(terminal);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
element.appendChild(terminals);
|
2007-02-24 19:56:29 +00:00
|
|
|
|
|
|
|
|
|
// enregistrement des champ de texte de l'appareil
|
|
|
|
|
QDomElement inputs = document.createElement("inputs");
|
|
|
|
|
// pour chaque enfant de l'element
|
|
|
|
|
foreach(QGraphicsItem *child, children()) {
|
|
|
|
|
// si cet enfant est un champ de texte
|
|
|
|
|
if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(child)) {
|
|
|
|
|
// alors on enregistre le champ de texte
|
|
|
|
|
inputs.appendChild(eti -> toXml(document));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
element.appendChild(inputs);
|
|
|
|
|
|
2007-02-24 18:37:07 +00:00
|
|
|
|
return(element);
|
|
|
|
|
}
|
2007-02-24 19:56:29 +00:00
|
|
|
|
|
2007-09-25 23:24:36 +00:00
|
|
|
|
/// @return le Diagram auquel cet element appartient, ou 0 si cet element est independant
|
|
|
|
|
Diagram *Element::diagram() const {
|
|
|
|
|
return(qobject_cast<Diagram *>(scene()));
|
|
|
|
|
}
|