[qet] [3367] minor change |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 3367
Author: blacksun
Date: 2014-10-09 11:02:41 +0200 (Thu, 09 Oct 2014)
Log Message:
-----------
minor change
Modified Paths:
--------------
trunk/qelectrotech.pro
trunk/sources/qetgraphicsitem/conductor.cpp
trunk/sources/qetgraphicsitem/conductor.h
Added Paths:
-----------
trunk/sources/qetgraphicsitem/terminal.cpp
trunk/sources/qetgraphicsitem/terminal.h
Removed Paths:
-------------
trunk/sources/terminal.cpp
trunk/sources/terminal.h
Modified: trunk/qelectrotech.pro
===================================================================
--- trunk/qelectrotech.pro 2014-10-08 06:42:30 UTC (rev 3366)
+++ trunk/qelectrotech.pro 2014-10-09 09:02:41 UTC (rev 3367)
@@ -66,7 +66,7 @@
INCLUDEPATH += sources sources/editor sources/titleblock sources/ui sources/qetgraphicsitem sources/richtext sources/factory sources/properties sources/dvevent
# Fichiers sources
-HEADERS += $$files(sources/*.h) $$files(sources/ui/*.h) $$files(sources/editor/*.h) $$files(sources/titleblock/*.h) $$files(sources/richtext/*.h) $$files(sources/qetgraphicsitem/*.h) $$files(sources/factory/*.cpp) \
+HEADERS += $$files(sources/*.h) $$files(sources/ui/*.h) $$files(sources/editor/*.h) $$files(sources/titleblock/*.h) $$files(sources/richtext/*.h) $$files(sources/qetgraphicsitem/*.h) $$files(sources/factory/*.h) \
$$files(sources/properties/*.h) \
$$files(sources/editor/ui/*.h) \
$$files(sources/dvevent/*.h)
Modified: trunk/sources/qetgraphicsitem/conductor.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/conductor.cpp 2014-10-08 06:42:30 UTC (rev 3366)
+++ trunk/sources/qetgraphicsitem/conductor.cpp 2014-10-09 09:02:41 UTC (rev 3367)
@@ -1442,36 +1442,6 @@
}
/**
- * @brief Conductor::relatedPotentialTerminal
- * Return terminal at the same potential from the same
- * parent element of @t.
- * For folio report, return the terminal of linked other report.
- * For Terminal element, return the other terminal of terminal element.
- * @param t terminal to start search
- * @param all_diagram :if true return all related terminal,
- * false return only terminal in the same diagram of @t
- * @return
- */
-Terminal * Conductor::relatedPotentialTerminal (Terminal *t, const bool all_diagram) {
- // If terminal parent element is a folio report.
- if (all_diagram && t->parentElement()->linkType() & Element::AllReport) {
- QList <Element *> elmt_list = t->parentElement()->linkedElements();
- if (!elmt_list.isEmpty()) {
- return (elmt_list.first()->terminals().first());
- }
- }
- // If terminal parent element is a Terminal element.
- if (t->parentElement() -> linkType() & Element::Terminale) {
- QList <Terminal *> terminals = t->parentElement()->terminals();
- terminals.removeAll(t);
- if (!terminals.isEmpty()) return terminals.first();
- else return nullptr;
- }
-
- return nullptr;
-}
-
-/**
* @return l'editeur de schemas parent ou 0
*/
QETDiagramEditor* Conductor::diagramEditor() const {
Modified: trunk/sources/qetgraphicsitem/conductor.h
===================================================================
--- trunk/sources/qetgraphicsitem/conductor.h 2014-10-08 06:42:30 UTC (rev 3366)
+++ trunk/sources/qetgraphicsitem/conductor.h 2014-10-09 09:02:41 UTC (rev 3367)
@@ -179,7 +179,6 @@
static qreal conductor_bound(qreal, qreal, bool);
static Qt::Corner movementType(const QPointF &, const QPointF &);
static QPointF movePointIntoPolygon(const QPointF &, const QPainterPath &);
- Terminal * relatedPotentialTerminal (Terminal *, const bool all_diagram = true);
};
Conductor * longuestConductorInPotential (Conductor *conductor, bool all_diagram = false);
Added: trunk/sources/qetgraphicsitem/terminal.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/terminal.cpp (rev 0)
+++ trunk/sources/qetgraphicsitem/terminal.cpp 2014-10-09 09:02:41 UTC (rev 3367)
@@ -0,0 +1,581 @@
+/*
+ Copyright 2006-2014 The QElectroTech Team
+ 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/>.
+*/
+#include "terminal.h"
+#include "diagram.h"
+#include "qetgraphicsitem/element.h"
+#include "qetgraphicsitem/conductor.h"
+#include "diagramcommands.h"
+#include "qetapp.h"
+
+QColor Terminal::neutralColor = QColor(Qt::blue);
+QColor Terminal::allowedColor = QColor(Qt::darkGreen);
+QColor Terminal::warningColor = QColor("#ff8000");
+QColor Terminal::forbiddenColor = QColor(Qt::red);
+const qreal Terminal::terminalSize = 4.0;
+
+/**
+ Methode privee pour initialiser la borne.
+ @param pf position du point d'amarrage pour un conducteur
+ @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
+ @param number of terminal
+ @param name of terminal
+*/
+void Terminal::init(QPointF pf, Qet::Orientation o, QString number, QString name, bool hiddenName) {
+ // definition du pount d'amarrage pour un conducteur
+ dock_conductor_ = pf;
+
+ // definition de l'orientation de la borne (par defaut : sud)
+ if (o < Qet::North || o > Qet::West) ori_ = Qet::South;
+ else ori_ = o;
+
+ // calcul de la position du point d'amarrage a l'element
+ dock_elmt_ = dock_conductor_;
+ switch(ori_) {
+ case Qet::North: dock_elmt_ += QPointF(0, Terminal::terminalSize); break;
+ case Qet::East : dock_elmt_ += QPointF(-Terminal::terminalSize, 0); break;
+ case Qet::West : dock_elmt_ += QPointF(Terminal::terminalSize, 0); break;
+ case Qet::South:
+ default : dock_elmt_ += QPointF(0, -Terminal::terminalSize);
+ }
+ // Number of terminal
+ number_terminal_ = number;
+ // Name of terminal
+ name_terminal_ = name;
+ name_terminal_hidden = hiddenName;
+ // par defaut : pas de conducteur
+
+ // QRectF null
+ br_ = new QRectF();
+ previous_terminal_ = 0;
+ // divers
+ setAcceptsHoverEvents(true);
+ setAcceptedMouseButtons(Qt::LeftButton);
+ hovered_ = false;
+ setToolTip(QObject::tr("Borne", "tooltip"));
+}
+
+/**
+ initialise une borne
+ @param pf position du point d'amarrage pour un conducteur
+ @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
+ @param e Element auquel cette borne appartient
+ @param s Scene sur laquelle figure cette borne
+*/
+Terminal::Terminal(QPointF pf, Qet::Orientation o, Element *e, Diagram *s) :
+ QGraphicsItem(e, s),
+ parent_element_(e),
+ hovered_color_(Terminal::neutralColor)
+{
+ init(pf, o, "_", "_", false);
+}
+
+/**
+ initialise une borne
+ @param pf_x Abscisse du point d'amarrage pour un conducteur
+ @param pf_y Ordonnee du point d'amarrage pour un conducteur
+ @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
+ @param e Element auquel cette borne appartient
+ @param s Scene sur laquelle figure cette borne
+*/
+Terminal::Terminal(qreal pf_x, qreal pf_y, Qet::Orientation o, Element *e, Diagram *s) :
+ QGraphicsItem(e, s),
+ parent_element_(e),
+ hovered_color_(Terminal::neutralColor)
+{
+ init(QPointF(pf_x, pf_y), o, "_", "_", false);
+}
+
+/**
+ initialise une borne
+ @param pf position du point d'amarrage pour un conducteur
+ @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
+ @param num number of terminal (ex 3 - 4 for NO)
+ @param name of terminal
+ @param hiddenName hide or show the name
+ @param e Element auquel cette borne appartient
+ @param s Scene sur laquelle figure cette borne
+*/
+Terminal::Terminal(QPointF pf, Qet::Orientation o, QString num, QString name, bool hiddenName, Element *e, Diagram *s) :
+ QGraphicsItem(e, s),
+ parent_element_(e),
+ hovered_color_(Terminal::neutralColor)
+{
+ init(pf, o, num, name, hiddenName);
+}
+
+/**
+ Destructeur
+ La destruction de la borne entraine la destruction des conducteurs
+ associes.
+*/
+Terminal::~Terminal() {
+ foreach(Conductor *c, conductors_) delete c;
+ delete br_;
+}
+
+/**
+ Permet de connaitre l'orientation de la borne. Si le parent de la borne
+ est bien un Element, cette fonction renvoie l'orientation par rapport a
+ la scene de la borne, en tenant compte du fait que l'element ait pu etre
+ pivote. Sinon elle renvoie son sens normal.
+ @return L'orientation actuelle de la Terminal.
+*/
+Qet::Orientation Terminal::orientation() const {
+ if (Element *elt = qgraphicsitem_cast<Element *>(parentItem())) {
+ // orientations actuelle et par defaut de l'element
+ int ori_cur = elt -> orientation();
+ if (ori_cur == 0) return(ori_);
+ else {
+ // calcul l'angle de rotation implique par l'orientation de l'element parent
+ // angle de rotation de la borne sur la scene, divise par 90
+ int angle = ori_cur + ori_;
+ while (angle >= 4) angle -= 4;
+ return((Qet::Orientation)angle);
+ }
+ } else return(ori_);
+}
+
+
+/**
+ * @brief Terminal::setNumber
+ * @param number
+ */
+void Terminal::setNumber(QString number) {
+ number_terminal_ = number;
+}
+
+/**
+ * @brief Terminal::setName
+ * @param name
+ */
+void Terminal::setName(QString name, bool hiddenName) {
+ name_terminal_ = name;
+ name_terminal_hidden = hiddenName;
+}
+
+/**
+ Attribue un conductor a la borne
+ @param f Le conducteur a rattacher a cette borne
+*/
+bool Terminal::addConductor(Conductor *f) {
+ // pointeur 0 refuse
+ if (!f) return(false);
+
+ // une seule des deux bornes du conducteur doit etre this
+ Q_ASSERT_X(((f -> terminal1 == this) ^ (f -> terminal2 == this)), "Terminal::addConductor", "Le conductor devrait etre relie exactement une fois a la terminal en cours");
+
+ // determine l'autre borne a laquelle cette borne va etre relie grace au conducteur
+ Terminal *autre_terminal = (f -> terminal1 == this) ? f -> terminal2 : f -> terminal1;
+
+ // verifie que la borne n'est pas deja reliee avec l'autre borne
+ bool deja_liees = false;
+ foreach (Conductor* conductor, conductors_) {
+ if (conductor -> terminal1 == autre_terminal || conductor -> terminal2 == autre_terminal) deja_liees = true;
+ }
+
+ // si les deux bornes sont deja reliees, on refuse d'ajouter le conducteur
+ if (deja_liees) return(false);
+
+ // sinon on ajoute le conducteur
+ conductors_.append(f);
+ return(true);
+}
+
+/**
+ Enleve un conducteur donne a la borne
+ @param f Conducteur a enlever
+*/
+void Terminal::removeConductor(Conductor *f) {
+ int index = conductors_.indexOf(f);
+ if (index == -1) return;
+ conductors_.removeAt(index);
+}
+
+/**
+ Fonction de dessin des bornes
+ @param p Le QPainter a utiliser
+ @param options Les options de dessin
+ @param widget Le widget sur lequel on dessine
+*/
+void Terminal::paint(QPainter *p, const QStyleOptionGraphicsItem *options, QWidget *widget) {
+ // en dessous d'un certain zoom, les bornes ne sont plus dessinees
+ if (options && options -> levelOfDetail < 0.5) return;
+
+ p -> save();
+
+#ifndef Q_WS_WIN
+ // 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 = QETApp::settings().value("correct-rendering", false).toBool();
+ 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 = 0.0;
+ if (Element *elt = qgraphicsitem_cast<Element *>(parentItem())) {
+ // orientations actuelle et par defaut de l'element
+ int ori_cur = elt -> orientation();
+ applied_rotation = QET::correctAngle(90.0 * ori_cur);
+ }
+ if (applied_rotation == 90.0) p -> translate(1.0, -1.0);
+ else if (applied_rotation == 180.0) p -> translate(-1.0, -1.0);
+ else if (applied_rotation == 270.0) p -> translate(-1.0, 1.0);
+ }
+ }
+#endif
+
+ //annulation des renderhints
+ p -> setRenderHint(QPainter::Antialiasing, false);
+ p -> setRenderHint(QPainter::TextAntialiasing, false);
+ p -> setRenderHint(QPainter::SmoothPixmapTransform, false);
+
+ // on travaille avec les coordonnees de l'element parent
+ QPointF c = mapFromParent(dock_conductor_);
+ QPointF e = mapFromParent(dock_elmt_);
+
+ QPen t;
+ t.setWidthF(1.0);
+
+ if (options && options -> levelOfDetail < 1.0) {
+ t.setCosmetic(true);
+ }
+
+ // dessin de la borne en rouge
+ t.setColor(Qt::red);
+ p -> setPen(t);
+ p -> drawLine(c, e);
+
+ // dessin du point d'amarrage au conducteur en bleu
+ t.setColor(hovered_color_);
+ p -> setPen(t);
+ p -> setBrush(hovered_color_);
+ if (hovered_) {
+ p -> setRenderHint(QPainter::Antialiasing, true);
+ p -> drawEllipse(QRectF(c.x() - 2.5, c.y() - 2.5, 5.0, 5.0));
+ } else p -> drawPoint(c);
+
+ p -> restore();
+}
+
+/**
+ @return Le rectangle (en precision flottante) delimitant la borne et ses alentours.
+*/
+QRectF Terminal::boundingRect() const {
+ if (br_ -> isNull()) {
+ qreal dcx = dock_conductor_.x();
+ qreal dcy = dock_conductor_.y();
+ qreal dex = dock_elmt_.x();
+ qreal dey = dock_elmt_.y();
+ QPointF origin = (dcx <= dex && dcy <= dey ? dock_conductor_ : dock_elmt_);
+ origin += QPointF(-3.0, -3.0);
+ qreal w = qAbs((int)(dcx - dex)) + 7;
+ qreal h = qAbs((int)(dcy - dey)) + 7;
+ *br_ = QRectF(origin, QSizeF(w, h));
+ }
+ return(*br_);
+}
+
+/**
+ Gere l'entree de la souris sur la zone de la Borne.
+*/
+void Terminal::hoverEnterEvent(QGraphicsSceneHoverEvent *) {
+ hovered_ = true;
+ update();
+}
+
+/**
+ Gere les mouvements de la souris sur la zone de la Borne.
+*/
+void Terminal::hoverMoveEvent(QGraphicsSceneHoverEvent *) {
+}
+
+/**
+ Gere le fait que la souris sorte de la zone de la Borne.
+*/
+void Terminal::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
+ hovered_ = false;
+ update();
+}
+
+/**
+ Gere le fait qu'on enfonce un bouton de la souris sur la Borne.
+ @param e L'evenement souris correspondant
+*/
+void Terminal::mousePressEvent(QGraphicsSceneMouseEvent *e) {
+ if (Diagram *d = diagram()) {
+ d -> setConductorStart(mapToScene(QPointF(dock_conductor_)));
+ d -> setConductorStop(e -> scenePos());
+ d -> setConductor(true);
+ //setCursor(Qt::CrossCursor);
+ }
+}
+
+/**
+ Gere le fait qu'on bouge la souris sur la Borne.
+ @param e L'evenement souris correspondant
+*/
+void Terminal::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
+ // pendant la pose d'un conducteur, on adopte un autre curseur
+ //setCursor(Qt::CrossCursor);
+
+ // d'un mouvement a l'autre, il faut retirer l'effet hover de la borne precedente
+ if (previous_terminal_) {
+ if (previous_terminal_ == this) hovered_ = true;
+ else previous_terminal_ -> hovered_ = false;
+ previous_terminal_ -> hovered_color_ = previous_terminal_ -> neutralColor;
+ previous_terminal_ -> update();
+ }
+
+
+ Diagram *d = diagram();
+ if (!d) return;
+ // si la scene est un Diagram, on actualise le poseur de conducteur
+ d -> setConductorStop(e -> scenePos());
+
+ // on recupere la liste des qgi sous le pointeur
+ QList<QGraphicsItem *> qgis = d -> items(e -> scenePos());
+
+ /* le qgi le plus haut
+ = le poseur de conductor
+ = le premier element de la liste
+ = la liste ne peut etre vide
+ = on prend le deuxieme element de la liste
+ */
+ Q_ASSERT_X(!(qgis.isEmpty()), "Terminal::mouseMoveEvent", "La liste d'items ne devrait pas etre vide");
+
+ // s'il n'y rien d'autre que le poseur de conducteur dans la liste, on arrete la
+ if (qgis.size() <= 1) return;
+
+ // sinon on prend le deuxieme element de la liste et on verifie s'il s'agit d'une borne
+ QGraphicsItem *qgi = qgis.at(1);
+ // si le qgi est une borne...
+ Terminal *other_terminal = qgraphicsitem_cast<Terminal *>(qgi);
+ if (!other_terminal) return;
+ previous_terminal_ = other_terminal;
+
+ // s'il s'agit d'une borne, on lui applique l'effet hover approprie
+ if (!canBeLinkedTo(other_terminal)) {
+ other_terminal -> hovered_color_ = forbiddenColor;
+ } else if (other_terminal -> conductorsCount()) {
+ other_terminal -> hovered_color_ = warningColor;
+ } else {
+ other_terminal -> hovered_color_ = allowedColor;
+ }
+
+ other_terminal -> hovered_ = true;
+ other_terminal -> update();
+}
+
+/**
+ Gere le fait qu'on relache la souris sur la Borne.
+ @param e L'evenement souris correspondant
+*/
+void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
+ //setCursor(Qt::ArrowCursor);
+ previous_terminal_ = 0;
+ hovered_color_ = neutralColor;
+ // verifie que la scene est bien un Diagram
+ if (Diagram *d = diagram()) {
+ // on arrete de dessiner l'apercu du conducteur
+ d -> setConductor(false);
+ // on recupere l'element sous le pointeur lors du MouseReleaseEvent
+ QGraphicsItem *qgi = d -> itemAt(e -> scenePos());
+ // s'il n'y a rien, on arrete la
+ if (!qgi) return;
+ // idem si l'element obtenu n'est pas une borne
+ Terminal *other_terminal = qgraphicsitem_cast<Terminal *>(qgi);
+ if (!other_terminal) return;
+ // on remet la couleur de hover a sa valeur par defaut
+ other_terminal -> hovered_color_ = neutralColor;
+ other_terminal -> hovered_ = false;
+ // on s'arrete la s'il n'est pas possible de relier les bornes
+ if (!canBeLinkedTo(other_terminal)) return;
+ // autrement, on pose un conducteur
+ Conductor *new_conductor = new Conductor(this, other_terminal);
+ new_conductor -> setProperties(d -> defaultConductorProperties);
+ d -> undoStack().push(new AddConductorCommand(d, new_conductor));
+ new_conductor -> autoText();
+ }
+}
+
+/**
+ Met a jour l'eventuel conducteur relie a la borne.
+ @param newpos Position de l'element parent a prendre en compte
+*/
+void Terminal::updateConductor() {
+ if (!scene() || !parentItem()) return;
+ foreach (Conductor *conductor, conductors_) {
+ if (conductor -> isDestroyed()) continue;
+ conductor -> updatePath();
+ }
+}
+
+/**
+ @param other_terminal Autre borne
+ @return true si cette borne est reliee a other_terminal, false sion
+*/
+bool Terminal::isLinkedTo(Terminal *other_terminal) {
+ if (other_terminal == this) return(false);
+
+ bool already_linked = false;
+ foreach (Conductor *c, conductors_) {
+ if (c -> terminal1 == other_terminal || c -> terminal2 == other_terminal) {
+ already_linked = true;
+ break;
+ }
+ }
+ return(already_linked);
+}
+
+/**
+ @param other_terminal Autre borne
+ @return true si cette borne peut etre reliee a other_terminal, false sion
+*/
+bool Terminal::canBeLinkedTo(Terminal *other_terminal) {
+ if (other_terminal == this) return(false);
+
+ // l'autre borne appartient-elle au meme element ?
+ bool same_element = other_terminal -> parentElement() == parentElement();
+ // les connexions internes sont-elles autorisees ?
+ bool internal_connections_allowed = parentElement() -> internalConnections();
+ // les deux bornes sont-elles deja liees ?
+ bool already_linked = isLinkedTo(other_terminal);
+ // la liaison des deux bornes est-elle interdite ?
+ bool link_forbidden = (same_element && !internal_connections_allowed) || already_linked;
+
+ return(!link_forbidden);
+}
+
+/**
+ @return La liste des conducteurs lies a cette borne
+*/
+QList<Conductor *> Terminal::conductors() const {
+ return(conductors_);
+}
+
+/**
+ Methode d'export en XML
+ @param doc Le Document XML a utiliser pour creer l'element XML
+ @return un QDomElement representant cette borne
+*/
+QDomElement Terminal::toXml(QDomDocument &doc) const {
+ QDomElement qdo = doc.createElement("terminal");
+ qdo.setAttribute("x", QString("%1").arg(dock_elmt_.x()));
+ qdo.setAttribute("y", QString("%1").arg(dock_elmt_.y()));
+ qdo.setAttribute("orientation", ori_);
+ qdo.setAttribute("number", number_terminal_);
+ qdo.setAttribute("name", name_terminal_);
+ qdo.setAttribute("nameHidden", name_terminal_hidden);
+ return(qdo);
+}
+
+/**
+ Permet de savoir si un element XML represente une borne
+ @param terminal Le QDomElement a analyser
+ @return true si le QDomElement passe en parametre est une borne, false sinon
+*/
+bool Terminal::valideXml(QDomElement &terminal) {
+ // verifie le nom du tag
+ if (terminal.tagName() != "terminal") return(false);
+
+ // verifie la presence des attributs minimaux
+ if (!terminal.hasAttribute("x")) return(false);
+ if (!terminal.hasAttribute("y")) return(false);
+ if (!terminal.hasAttribute("orientation")) return(false);
+
+ bool conv_ok;
+ // parse l'abscisse
+ terminal.attribute("x").toDouble(&conv_ok);
+ if (!conv_ok) return(false);
+
+ // parse l'ordonnee
+ terminal.attribute("y").toDouble(&conv_ok);
+ if (!conv_ok) return(false);
+
+ // parse l'id
+ terminal.attribute("id").toInt(&conv_ok);
+ if (!conv_ok) return(false);
+
+ // parse l'orientation
+ int terminal_or = terminal.attribute("orientation").toInt(&conv_ok);
+ if (!conv_ok) return(false);
+ if (terminal_or != Qet::North && terminal_or != Qet::South && terminal_or != Qet::East && terminal_or != Qet::West) return(false);
+
+ // a ce stade, la borne est syntaxiquement correcte
+ return(true);
+}
+
+/**
+ Permet de savoir si un element XML represente cette borne. Attention, l'element XML n'est pas verifie
+ @param terminal Le QDomElement a analyser
+ @return true si la borne "se reconnait" (memes coordonnes, meme orientation), false sinon
+*/
+bool Terminal::fromXml(QDomElement &terminal) {
+ number_terminal_ = terminal.attribute("number");
+ name_terminal_ = terminal.attribute("name");
+ name_terminal_hidden = terminal.attribute("nameHidden").toInt();
+ return (
+ qFuzzyCompare(terminal.attribute("x").toDouble(), dock_elmt_.x()) &&
+ qFuzzyCompare(terminal.attribute("y").toDouble(), dock_elmt_.y()) &&
+ (terminal.attribute("orientation").toInt() == ori_)
+ );
+}
+
+/**
+ @return le Diagram auquel cette borne appartient, ou 0 si cette borne est independant
+*/
+Diagram *Terminal::diagram() const {
+ return(qobject_cast<Diagram *>(scene()));
+}
+
+/**
+ @return L'element auquel cette borne est rattachee
+*/
+Element *Terminal::parentElement() const {
+ return(parent_element_);
+}
+
+/**
+ * @brief Conductor::relatedPotentialTerminal
+ * Return terminal at the same potential from the same
+ * parent element of @t.
+ * For folio report, return the terminal of linked other report.
+ * For Terminal element, return the other terminal of terminal element.
+ * @param t terminal to start search
+ * @param all_diagram :if true return all related terminal,
+ * false return only terminal in the same diagram of @t
+ * @return
+ */
+Terminal * relatedPotentialTerminal (const Terminal *terminal, const bool all_diagram) {
+ // If terminal parent element is a folio report.
+ if (all_diagram && terminal -> parentElement() -> linkType() & Element::AllReport) {
+ QList <Element *> elmt_list = terminal -> parentElement() -> linkedElements();
+ if (!elmt_list.isEmpty()) {
+ return (elmt_list.first() -> terminals().first());
+ }
+ }
+ // If terminal parent element is a Terminal element.
+ else if (terminal -> parentElement() -> linkType() & Element::Terminale) {
+ QList <Terminal *> terminals = terminal -> parentElement() -> terminals();
+ terminals.removeAll(const_cast<Terminal *> (terminal));
+ if (!terminals.isEmpty())
+ return terminals.first();
+ }
+
+ return nullptr;
+}
+
Added: trunk/sources/qetgraphicsitem/terminal.h
===================================================================
--- trunk/sources/qetgraphicsitem/terminal.h (rev 0)
+++ trunk/sources/qetgraphicsitem/terminal.h 2014-10-09 09:02:41 UTC (rev 3367)
@@ -0,0 +1,165 @@
+/*
+ Copyright 2006-2014 The QElectroTech Team
+ 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/>.
+*/
+#ifndef TERMINAL_H
+#define TERMINAL_H
+#include <QtGui>
+#include <QtXml>
+#include "qet.h"
+class Conductor;
+class Diagram;
+class Element;
+/**
+ This class represents a terminal of an electrical element, i.e. a possible
+ plug point for conductors.
+*/
+class Terminal : public QGraphicsItem {
+
+ // constructors, destructor
+ public:
+ Terminal(QPointF, Qet::Orientation, Element * = 0, Diagram * = 0);
+ Terminal(qreal, qreal, Qet::Orientation, Element * = 0, Diagram * = 0);
+ Terminal(QPointF, Qet::Orientation, QString number, QString name, bool hiddenName, Element * = 0, Diagram * = 0);
+ virtual ~Terminal();
+
+ private:
+ Terminal(const Terminal &);
+
+ // methods
+ public:
+ /**
+ Enable the use of qgraphicsitem_cast to safely cast a QGraphicsItem into a
+ Terminal
+ @return the QGraphicsItem type
+ */
+ virtual int type() const { return Type; }
+
+ // implementation of QGraphicsItem pure virtual methods
+ void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
+ QRectF boundingRect() const;
+
+ // methods to manage conductors attached to the terminal
+ bool addConductor(Conductor *);
+ void removeConductor(Conductor *);
+ int conductorsCount() const;
+ Diagram *diagram() const;
+ Element *parentElement() const;
+
+ QList<Conductor *> conductors() const;
+ Qet::Orientation orientation() const;
+ QPointF dockConductor() const;
+ QString number() const;
+ QString name() const;
+ void setNumber(QString number);
+ void setName(QString name, bool hiddenName);
+ void updateConductor();
+ bool isLinkedTo(Terminal *);
+ bool canBeLinkedTo(Terminal *);
+
+ // methods related to XML import/export
+ static bool valideXml(QDomElement &);
+ bool fromXml (QDomElement &);
+ QDomElement toXml (QDomDocument &) const;
+
+ protected:
+ // methods related to events management
+ void hoverEnterEvent (QGraphicsSceneHoverEvent *);
+ void hoverMoveEvent (QGraphicsSceneHoverEvent *);
+ void hoverLeaveEvent (QGraphicsSceneHoverEvent *);
+ void mousePressEvent (QGraphicsSceneMouseEvent *);
+ void mouseMoveEvent (QGraphicsSceneMouseEvent *);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
+
+ // attributes
+ public:
+ enum { Type = UserType + 1002 };
+ /// terminal length
+ static const qreal terminalSize;
+
+ // Various static colors used for hover effects
+ /// default color
+ static QColor neutralColor;
+ /// color for legal actions
+ static QColor allowedColor;
+ /// color for allowed but fuzzy or not recommended actions
+ static QColor warningColor;
+ /// color for forbidden actions
+ static QColor forbiddenColor;
+
+ private:
+ /// Parent electrical element
+ Element *parent_element_;
+ /// docking point for conductors
+ QPointF dock_conductor_;
+ /// docking point for parent element
+ QPointF dock_elmt_;
+ /// terminal orientation
+ Qet::Orientation ori_;
+ /// List of conductors attached to the terminal
+ QList<Conductor *> conductors_;
+ /// Pointer to a rectangle representing the terminal bounding rect;
+ /// used to calculate the bounding rect once only;
+ /// used a pointer because boundingRect() is supposed to be const.
+ QRectF *br_;
+ /// Last terminal seen through an attached conductor
+ Terminal *previous_terminal_;
+ /// Whether the mouse pointer is hovering the terminal
+ bool hovered_;
+ /// Color used for the hover effect
+ QColor hovered_color_;
+ /// Number of Terminal
+ QString number_terminal_;
+ /// Name of Terminal
+ QString name_terminal_;
+ bool name_terminal_hidden;
+
+ private:
+ void init(QPointF, Qet::Orientation, QString number, QString name, bool hiddenName);
+};
+
+/**
+ @return the number of conductors attached to the terminal.
+*/
+inline int Terminal::conductorsCount() const {
+ return(conductors_.size());
+}
+
+/**
+ @return the position, relative to the scene, of the docking point for
+ conductors.
+*/
+inline QPointF Terminal::dockConductor() const {
+ return(mapToScene(dock_conductor_));
+}
+
+/**
+ @return the number of terminal.
+*/
+inline QString Terminal::number() const {
+ return(number_terminal_);
+}
+
+/**
+ @return the name of terminal.
+*/
+inline QString Terminal::name() const {
+ return(name_terminal_);
+}
+
+Terminal * relatedPotentialTerminal (const Terminal *terminal, const bool all_diagram = true);
+
+#endif
Deleted: trunk/sources/terminal.cpp
===================================================================
--- trunk/sources/terminal.cpp 2014-10-08 06:42:30 UTC (rev 3366)
+++ trunk/sources/terminal.cpp 2014-10-09 09:02:41 UTC (rev 3367)
@@ -1,551 +0,0 @@
-/*
- Copyright 2006-2014 The QElectroTech Team
- 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/>.
-*/
-#include "terminal.h"
-#include "diagram.h"
-#include "qetgraphicsitem/element.h"
-#include "qetgraphicsitem/conductor.h"
-#include "diagramcommands.h"
-#include "qetapp.h"
-
-QColor Terminal::neutralColor = QColor(Qt::blue);
-QColor Terminal::allowedColor = QColor(Qt::darkGreen);
-QColor Terminal::warningColor = QColor("#ff8000");
-QColor Terminal::forbiddenColor = QColor(Qt::red);
-const qreal Terminal::terminalSize = 4.0;
-
-/**
- Methode privee pour initialiser la borne.
- @param pf position du point d'amarrage pour un conducteur
- @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
- @param number of terminal
- @param name of terminal
-*/
-void Terminal::init(QPointF pf, Qet::Orientation o, QString number, QString name, bool hiddenName) {
- // definition du pount d'amarrage pour un conducteur
- dock_conductor_ = pf;
-
- // definition de l'orientation de la borne (par defaut : sud)
- if (o < Qet::North || o > Qet::West) ori_ = Qet::South;
- else ori_ = o;
-
- // calcul de la position du point d'amarrage a l'element
- dock_elmt_ = dock_conductor_;
- switch(ori_) {
- case Qet::North: dock_elmt_ += QPointF(0, Terminal::terminalSize); break;
- case Qet::East : dock_elmt_ += QPointF(-Terminal::terminalSize, 0); break;
- case Qet::West : dock_elmt_ += QPointF(Terminal::terminalSize, 0); break;
- case Qet::South:
- default : dock_elmt_ += QPointF(0, -Terminal::terminalSize);
- }
- // Number of terminal
- number_terminal_ = number;
- // Name of terminal
- name_terminal_ = name;
- name_terminal_hidden = hiddenName;
- // par defaut : pas de conducteur
-
- // QRectF null
- br_ = new QRectF();
- previous_terminal_ = 0;
- // divers
- setAcceptsHoverEvents(true);
- setAcceptedMouseButtons(Qt::LeftButton);
- hovered_ = false;
- setToolTip(QObject::tr("Borne", "tooltip"));
-}
-
-/**
- initialise une borne
- @param pf position du point d'amarrage pour un conducteur
- @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
- @param e Element auquel cette borne appartient
- @param s Scene sur laquelle figure cette borne
-*/
-Terminal::Terminal(QPointF pf, Qet::Orientation o, Element *e, Diagram *s) :
- QGraphicsItem(e, s),
- parent_element_(e),
- hovered_color_(Terminal::neutralColor)
-{
- init(pf, o, "_", "_", false);
-}
-
-/**
- initialise une borne
- @param pf_x Abscisse du point d'amarrage pour un conducteur
- @param pf_y Ordonnee du point d'amarrage pour un conducteur
- @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
- @param e Element auquel cette borne appartient
- @param s Scene sur laquelle figure cette borne
-*/
-Terminal::Terminal(qreal pf_x, qreal pf_y, Qet::Orientation o, Element *e, Diagram *s) :
- QGraphicsItem(e, s),
- parent_element_(e),
- hovered_color_(Terminal::neutralColor)
-{
- init(QPointF(pf_x, pf_y), o, "_", "_", false);
-}
-
-/**
- initialise une borne
- @param pf position du point d'amarrage pour un conducteur
- @param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
- @param num number of terminal (ex 3 - 4 for NO)
- @param name of terminal
- @param hiddenName hide or show the name
- @param e Element auquel cette borne appartient
- @param s Scene sur laquelle figure cette borne
-*/
-Terminal::Terminal(QPointF pf, Qet::Orientation o, QString num, QString name, bool hiddenName, Element *e, Diagram *s) :
- QGraphicsItem(e, s),
- parent_element_(e),
- hovered_color_(Terminal::neutralColor)
-{
- init(pf, o, num, name, hiddenName);
-}
-
-/**
- Destructeur
- La destruction de la borne entraine la destruction des conducteurs
- associes.
-*/
-Terminal::~Terminal() {
- foreach(Conductor *c, conductors_) delete c;
- delete br_;
-}
-
-/**
- Permet de connaitre l'orientation de la borne. Si le parent de la borne
- est bien un Element, cette fonction renvoie l'orientation par rapport a
- la scene de la borne, en tenant compte du fait que l'element ait pu etre
- pivote. Sinon elle renvoie son sens normal.
- @return L'orientation actuelle de la Terminal.
-*/
-Qet::Orientation Terminal::orientation() const {
- if (Element *elt = qgraphicsitem_cast<Element *>(parentItem())) {
- // orientations actuelle et par defaut de l'element
- int ori_cur = elt -> orientation();
- if (ori_cur == 0) return(ori_);
- else {
- // calcul l'angle de rotation implique par l'orientation de l'element parent
- // angle de rotation de la borne sur la scene, divise par 90
- int angle = ori_cur + ori_;
- while (angle >= 4) angle -= 4;
- return((Qet::Orientation)angle);
- }
- } else return(ori_);
-}
-
-
-/**
- * @brief Terminal::setNumber
- * @param number
- */
-void Terminal::setNumber(QString number) {
- number_terminal_ = number;
-}
-
-/**
- * @brief Terminal::setName
- * @param name
- */
-void Terminal::setName(QString name, bool hiddenName) {
- name_terminal_ = name;
- name_terminal_hidden = hiddenName;
-}
-
-/**
- Attribue un conductor a la borne
- @param f Le conducteur a rattacher a cette borne
-*/
-bool Terminal::addConductor(Conductor *f) {
- // pointeur 0 refuse
- if (!f) return(false);
-
- // une seule des deux bornes du conducteur doit etre this
- Q_ASSERT_X(((f -> terminal1 == this) ^ (f -> terminal2 == this)), "Terminal::addConductor", "Le conductor devrait etre relie exactement une fois a la terminal en cours");
-
- // determine l'autre borne a laquelle cette borne va etre relie grace au conducteur
- Terminal *autre_terminal = (f -> terminal1 == this) ? f -> terminal2 : f -> terminal1;
-
- // verifie que la borne n'est pas deja reliee avec l'autre borne
- bool deja_liees = false;
- foreach (Conductor* conductor, conductors_) {
- if (conductor -> terminal1 == autre_terminal || conductor -> terminal2 == autre_terminal) deja_liees = true;
- }
-
- // si les deux bornes sont deja reliees, on refuse d'ajouter le conducteur
- if (deja_liees) return(false);
-
- // sinon on ajoute le conducteur
- conductors_.append(f);
- return(true);
-}
-
-/**
- Enleve un conducteur donne a la borne
- @param f Conducteur a enlever
-*/
-void Terminal::removeConductor(Conductor *f) {
- int index = conductors_.indexOf(f);
- if (index == -1) return;
- conductors_.removeAt(index);
-}
-
-/**
- Fonction de dessin des bornes
- @param p Le QPainter a utiliser
- @param options Les options de dessin
- @param widget Le widget sur lequel on dessine
-*/
-void Terminal::paint(QPainter *p, const QStyleOptionGraphicsItem *options, QWidget *widget) {
- // en dessous d'un certain zoom, les bornes ne sont plus dessinees
- if (options && options -> levelOfDetail < 0.5) return;
-
- p -> save();
-
-#ifndef Q_WS_WIN
- // 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 = QETApp::settings().value("correct-rendering", false).toBool();
- 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 = 0.0;
- if (Element *elt = qgraphicsitem_cast<Element *>(parentItem())) {
- // orientations actuelle et par defaut de l'element
- int ori_cur = elt -> orientation();
- applied_rotation = QET::correctAngle(90.0 * ori_cur);
- }
- if (applied_rotation == 90.0) p -> translate(1.0, -1.0);
- else if (applied_rotation == 180.0) p -> translate(-1.0, -1.0);
- else if (applied_rotation == 270.0) p -> translate(-1.0, 1.0);
- }
- }
-#endif
-
- //annulation des renderhints
- p -> setRenderHint(QPainter::Antialiasing, false);
- p -> setRenderHint(QPainter::TextAntialiasing, false);
- p -> setRenderHint(QPainter::SmoothPixmapTransform, false);
-
- // on travaille avec les coordonnees de l'element parent
- QPointF c = mapFromParent(dock_conductor_);
- QPointF e = mapFromParent(dock_elmt_);
-
- QPen t;
- t.setWidthF(1.0);
-
- if (options && options -> levelOfDetail < 1.0) {
- t.setCosmetic(true);
- }
-
- // dessin de la borne en rouge
- t.setColor(Qt::red);
- p -> setPen(t);
- p -> drawLine(c, e);
-
- // dessin du point d'amarrage au conducteur en bleu
- t.setColor(hovered_color_);
- p -> setPen(t);
- p -> setBrush(hovered_color_);
- if (hovered_) {
- p -> setRenderHint(QPainter::Antialiasing, true);
- p -> drawEllipse(QRectF(c.x() - 2.5, c.y() - 2.5, 5.0, 5.0));
- } else p -> drawPoint(c);
-
- p -> restore();
-}
-
-/**
- @return Le rectangle (en precision flottante) delimitant la borne et ses alentours.
-*/
-QRectF Terminal::boundingRect() const {
- if (br_ -> isNull()) {
- qreal dcx = dock_conductor_.x();
- qreal dcy = dock_conductor_.y();
- qreal dex = dock_elmt_.x();
- qreal dey = dock_elmt_.y();
- QPointF origin = (dcx <= dex && dcy <= dey ? dock_conductor_ : dock_elmt_);
- origin += QPointF(-3.0, -3.0);
- qreal w = qAbs((int)(dcx - dex)) + 7;
- qreal h = qAbs((int)(dcy - dey)) + 7;
- *br_ = QRectF(origin, QSizeF(w, h));
- }
- return(*br_);
-}
-
-/**
- Gere l'entree de la souris sur la zone de la Borne.
-*/
-void Terminal::hoverEnterEvent(QGraphicsSceneHoverEvent *) {
- hovered_ = true;
- update();
-}
-
-/**
- Gere les mouvements de la souris sur la zone de la Borne.
-*/
-void Terminal::hoverMoveEvent(QGraphicsSceneHoverEvent *) {
-}
-
-/**
- Gere le fait que la souris sorte de la zone de la Borne.
-*/
-void Terminal::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
- hovered_ = false;
- update();
-}
-
-/**
- Gere le fait qu'on enfonce un bouton de la souris sur la Borne.
- @param e L'evenement souris correspondant
-*/
-void Terminal::mousePressEvent(QGraphicsSceneMouseEvent *e) {
- if (Diagram *d = diagram()) {
- d -> setConductorStart(mapToScene(QPointF(dock_conductor_)));
- d -> setConductorStop(e -> scenePos());
- d -> setConductor(true);
- //setCursor(Qt::CrossCursor);
- }
-}
-
-/**
- Gere le fait qu'on bouge la souris sur la Borne.
- @param e L'evenement souris correspondant
-*/
-void Terminal::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
- // pendant la pose d'un conducteur, on adopte un autre curseur
- //setCursor(Qt::CrossCursor);
-
- // d'un mouvement a l'autre, il faut retirer l'effet hover de la borne precedente
- if (previous_terminal_) {
- if (previous_terminal_ == this) hovered_ = true;
- else previous_terminal_ -> hovered_ = false;
- previous_terminal_ -> hovered_color_ = previous_terminal_ -> neutralColor;
- previous_terminal_ -> update();
- }
-
-
- Diagram *d = diagram();
- if (!d) return;
- // si la scene est un Diagram, on actualise le poseur de conducteur
- d -> setConductorStop(e -> scenePos());
-
- // on recupere la liste des qgi sous le pointeur
- QList<QGraphicsItem *> qgis = d -> items(e -> scenePos());
-
- /* le qgi le plus haut
- = le poseur de conductor
- = le premier element de la liste
- = la liste ne peut etre vide
- = on prend le deuxieme element de la liste
- */
- Q_ASSERT_X(!(qgis.isEmpty()), "Terminal::mouseMoveEvent", "La liste d'items ne devrait pas etre vide");
-
- // s'il n'y rien d'autre que le poseur de conducteur dans la liste, on arrete la
- if (qgis.size() <= 1) return;
-
- // sinon on prend le deuxieme element de la liste et on verifie s'il s'agit d'une borne
- QGraphicsItem *qgi = qgis.at(1);
- // si le qgi est une borne...
- Terminal *other_terminal = qgraphicsitem_cast<Terminal *>(qgi);
- if (!other_terminal) return;
- previous_terminal_ = other_terminal;
-
- // s'il s'agit d'une borne, on lui applique l'effet hover approprie
- if (!canBeLinkedTo(other_terminal)) {
- other_terminal -> hovered_color_ = forbiddenColor;
- } else if (other_terminal -> conductorsCount()) {
- other_terminal -> hovered_color_ = warningColor;
- } else {
- other_terminal -> hovered_color_ = allowedColor;
- }
-
- other_terminal -> hovered_ = true;
- other_terminal -> update();
-}
-
-/**
- Gere le fait qu'on relache la souris sur la Borne.
- @param e L'evenement souris correspondant
-*/
-void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
- //setCursor(Qt::ArrowCursor);
- previous_terminal_ = 0;
- hovered_color_ = neutralColor;
- // verifie que la scene est bien un Diagram
- if (Diagram *d = diagram()) {
- // on arrete de dessiner l'apercu du conducteur
- d -> setConductor(false);
- // on recupere l'element sous le pointeur lors du MouseReleaseEvent
- QGraphicsItem *qgi = d -> itemAt(e -> scenePos());
- // s'il n'y a rien, on arrete la
- if (!qgi) return;
- // idem si l'element obtenu n'est pas une borne
- Terminal *other_terminal = qgraphicsitem_cast<Terminal *>(qgi);
- if (!other_terminal) return;
- // on remet la couleur de hover a sa valeur par defaut
- other_terminal -> hovered_color_ = neutralColor;
- other_terminal -> hovered_ = false;
- // on s'arrete la s'il n'est pas possible de relier les bornes
- if (!canBeLinkedTo(other_terminal)) return;
- // autrement, on pose un conducteur
- Conductor *new_conductor = new Conductor(this, other_terminal);
- new_conductor -> setProperties(d -> defaultConductorProperties);
- d -> undoStack().push(new AddConductorCommand(d, new_conductor));
- new_conductor -> autoText();
- }
-}
-
-/**
- Met a jour l'eventuel conducteur relie a la borne.
- @param newpos Position de l'element parent a prendre en compte
-*/
-void Terminal::updateConductor() {
- if (!scene() || !parentItem()) return;
- foreach (Conductor *conductor, conductors_) {
- if (conductor -> isDestroyed()) continue;
- conductor -> updatePath();
- }
-}
-
-/**
- @param other_terminal Autre borne
- @return true si cette borne est reliee a other_terminal, false sion
-*/
-bool Terminal::isLinkedTo(Terminal *other_terminal) {
- if (other_terminal == this) return(false);
-
- bool already_linked = false;
- foreach (Conductor *c, conductors_) {
- if (c -> terminal1 == other_terminal || c -> terminal2 == other_terminal) {
- already_linked = true;
- break;
- }
- }
- return(already_linked);
-}
-
-/**
- @param other_terminal Autre borne
- @return true si cette borne peut etre reliee a other_terminal, false sion
-*/
-bool Terminal::canBeLinkedTo(Terminal *other_terminal) {
- if (other_terminal == this) return(false);
-
- // l'autre borne appartient-elle au meme element ?
- bool same_element = other_terminal -> parentElement() == parentElement();
- // les connexions internes sont-elles autorisees ?
- bool internal_connections_allowed = parentElement() -> internalConnections();
- // les deux bornes sont-elles deja liees ?
- bool already_linked = isLinkedTo(other_terminal);
- // la liaison des deux bornes est-elle interdite ?
- bool link_forbidden = (same_element && !internal_connections_allowed) || already_linked;
-
- return(!link_forbidden);
-}
-
-/**
- @return La liste des conducteurs lies a cette borne
-*/
-QList<Conductor *> Terminal::conductors() const {
- return(conductors_);
-}
-
-/**
- Methode d'export en XML
- @param doc Le Document XML a utiliser pour creer l'element XML
- @return un QDomElement representant cette borne
-*/
-QDomElement Terminal::toXml(QDomDocument &doc) const {
- QDomElement qdo = doc.createElement("terminal");
- qdo.setAttribute("x", QString("%1").arg(dock_elmt_.x()));
- qdo.setAttribute("y", QString("%1").arg(dock_elmt_.y()));
- qdo.setAttribute("orientation", ori_);
- qdo.setAttribute("number", number_terminal_);
- qdo.setAttribute("name", name_terminal_);
- qdo.setAttribute("nameHidden", name_terminal_hidden);
- return(qdo);
-}
-
-/**
- Permet de savoir si un element XML represente une borne
- @param terminal Le QDomElement a analyser
- @return true si le QDomElement passe en parametre est une borne, false sinon
-*/
-bool Terminal::valideXml(QDomElement &terminal) {
- // verifie le nom du tag
- if (terminal.tagName() != "terminal") return(false);
-
- // verifie la presence des attributs minimaux
- if (!terminal.hasAttribute("x")) return(false);
- if (!terminal.hasAttribute("y")) return(false);
- if (!terminal.hasAttribute("orientation")) return(false);
-
- bool conv_ok;
- // parse l'abscisse
- terminal.attribute("x").toDouble(&conv_ok);
- if (!conv_ok) return(false);
-
- // parse l'ordonnee
- terminal.attribute("y").toDouble(&conv_ok);
- if (!conv_ok) return(false);
-
- // parse l'id
- terminal.attribute("id").toInt(&conv_ok);
- if (!conv_ok) return(false);
-
- // parse l'orientation
- int terminal_or = terminal.attribute("orientation").toInt(&conv_ok);
- if (!conv_ok) return(false);
- if (terminal_or != Qet::North && terminal_or != Qet::South && terminal_or != Qet::East && terminal_or != Qet::West) return(false);
-
- // a ce stade, la borne est syntaxiquement correcte
- return(true);
-}
-
-/**
- Permet de savoir si un element XML represente cette borne. Attention, l'element XML n'est pas verifie
- @param terminal Le QDomElement a analyser
- @return true si la borne "se reconnait" (memes coordonnes, meme orientation), false sinon
-*/
-bool Terminal::fromXml(QDomElement &terminal) {
- number_terminal_ = terminal.attribute("number");
- name_terminal_ = terminal.attribute("name");
- name_terminal_hidden = terminal.attribute("nameHidden").toInt();
- return (
- qFuzzyCompare(terminal.attribute("x").toDouble(), dock_elmt_.x()) &&
- qFuzzyCompare(terminal.attribute("y").toDouble(), dock_elmt_.y()) &&
- (terminal.attribute("orientation").toInt() == ori_)
- );
-}
-
-/**
- @return le Diagram auquel cette borne appartient, ou 0 si cette borne est independant
-*/
-Diagram *Terminal::diagram() const {
- return(qobject_cast<Diagram *>(scene()));
-}
-
-/**
- @return L'element auquel cette borne est rattachee
-*/
-Element *Terminal::parentElement() const {
- return(parent_element_);
-}
-
Deleted: trunk/sources/terminal.h
===================================================================
--- trunk/sources/terminal.h 2014-10-08 06:42:30 UTC (rev 3366)
+++ trunk/sources/terminal.h 2014-10-09 09:02:41 UTC (rev 3367)
@@ -1,163 +0,0 @@
-/*
- Copyright 2006-2014 The QElectroTech Team
- 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/>.
-*/
-#ifndef TERMINAL_H
-#define TERMINAL_H
-#include <QtGui>
-#include <QtXml>
-#include "qet.h"
-class Conductor;
-class Diagram;
-class Element;
-/**
- This class represents a terminal of an electrical element, i.e. a possible
- plug point for conductors.
-*/
-class Terminal : public QGraphicsItem {
-
- // constructors, destructor
- public:
- Terminal(QPointF, Qet::Orientation, Element * = 0, Diagram * = 0);
- Terminal(qreal, qreal, Qet::Orientation, Element * = 0, Diagram * = 0);
- Terminal(QPointF, Qet::Orientation, QString number, QString name, bool hiddenName, Element * = 0, Diagram * = 0);
- virtual ~Terminal();
-
- private:
- Terminal(const Terminal &);
-
- // methods
- public:
- /**
- Enable the use of qgraphicsitem_cast to safely cast a QGraphicsItem into a
- Terminal
- @return the QGraphicsItem type
- */
- virtual int type() const { return Type; }
-
- // implementation of QGraphicsItem pure virtual methods
- void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
- QRectF boundingRect() const;
-
- // methods to manage conductors attached to the terminal
- bool addConductor(Conductor *);
- void removeConductor(Conductor *);
- int conductorsCount() const;
- Diagram *diagram() const;
- Element *parentElement() const;
-
- QList<Conductor *> conductors() const;
- Qet::Orientation orientation() const;
- QPointF dockConductor() const;
- QString number() const;
- QString name() const;
- void setNumber(QString number);
- void setName(QString name, bool hiddenName);
- void updateConductor();
- bool isLinkedTo(Terminal *);
- bool canBeLinkedTo(Terminal *);
-
- // methods related to XML import/export
- static bool valideXml(QDomElement &);
- bool fromXml (QDomElement &);
- QDomElement toXml (QDomDocument &) const;
-
- protected:
- // methods related to events management
- void hoverEnterEvent (QGraphicsSceneHoverEvent *);
- void hoverMoveEvent (QGraphicsSceneHoverEvent *);
- void hoverLeaveEvent (QGraphicsSceneHoverEvent *);
- void mousePressEvent (QGraphicsSceneMouseEvent *);
- void mouseMoveEvent (QGraphicsSceneMouseEvent *);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
-
- // attributes
- public:
- enum { Type = UserType + 1002 };
- /// terminal length
- static const qreal terminalSize;
-
- // Various static colors used for hover effects
- /// default color
- static QColor neutralColor;
- /// color for legal actions
- static QColor allowedColor;
- /// color for allowed but fuzzy or not recommended actions
- static QColor warningColor;
- /// color for forbidden actions
- static QColor forbiddenColor;
-
- private:
- /// Parent electrical element
- Element *parent_element_;
- /// docking point for conductors
- QPointF dock_conductor_;
- /// docking point for parent element
- QPointF dock_elmt_;
- /// terminal orientation
- Qet::Orientation ori_;
- /// List of conductors attached to the terminal
- QList<Conductor *> conductors_;
- /// Pointer to a rectangle representing the terminal bounding rect;
- /// used to calculate the bounding rect once only;
- /// used a pointer because boundingRect() is supposed to be const.
- QRectF *br_;
- /// Last terminal seen through an attached conductor
- Terminal *previous_terminal_;
- /// Whether the mouse pointer is hovering the terminal
- bool hovered_;
- /// Color used for the hover effect
- QColor hovered_color_;
- /// Number of Terminal
- QString number_terminal_;
- /// Name of Terminal
- QString name_terminal_;
- bool name_terminal_hidden;
-
- private:
- void init(QPointF, Qet::Orientation, QString number, QString name, bool hiddenName);
-};
-
-/**
- @return the number of conductors attached to the terminal.
-*/
-inline int Terminal::conductorsCount() const {
- return(conductors_.size());
-}
-
-/**
- @return the position, relative to the scene, of the docking point for
- conductors.
-*/
-inline QPointF Terminal::dockConductor() const {
- return(mapToScene(dock_conductor_));
-}
-
-/**
- @return the number of terminal.
-*/
-inline QString Terminal::number() const {
- return(number_terminal_);
-}
-
-/**
- @return the name of terminal.
-*/
-inline QString Terminal::name() const {
- return(name_terminal_);
-}
-
-#endif