From b58489fdf37374d725429aee9cebb07b45cba17b Mon Sep 17 00:00:00 2001 From: xavierqet Date: Sun, 16 Dec 2007 12:19:04 +0000 Subject: [PATCH] Amelioration de la gestion des points de jonction : les bifurcations d'un conducteur sont desormais bien detectees. Le chemin par defaut d'un element colle desormais mieux a la grille. git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@234 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- conductor.cpp | 32 +++++++++++++++++++++++--------- conductor.h | 2 +- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/conductor.cpp b/conductor.cpp index 9b84c4283..22098ba7c 100644 --- a/conductor.cpp +++ b/conductor.cpp @@ -30,10 +30,10 @@ QBrush Conductor::conductor_brush = QBrush(); QBrush Conductor::square_brush = QBrush(Qt::darkGreen); /** Constructeur - @param p1 Premiere Borne auquel le conducteur est lie - @param p2 Seconde Borne auquel le conducteur est lie + @param p1 Premiere Borne a laquelle le conducteur est lie + @param p2 Seconde Borne a laquelle le conducteur est lie @param parent Element parent du conducteur (0 par defaut) - @param scene QGraphicsScene auquelle appartient le conducteur + @param scene QGraphicsScene a laquelle appartient le conducteur */ Conductor::Conductor(Terminal *p1, Terminal* p2, Element *parent, QGraphicsScene *scene) : QGraphicsPathItem(parent, scene), @@ -351,12 +351,14 @@ void Conductor::priv_calculeConductor(const QPointF &p1, QET::Orientation o1, co // trajet descendant if ((ori_depart == QET::North && (ori_arrivee == QET::South || ori_arrivee == QET::West)) || (ori_depart == QET::East && ori_arrivee == QET::West)) { // cas « 3 » - qreal ligne_inter_x = (depart.x() + arrivee.x()) / 2.0; + int ligne_inter_x = qRound(depart.x() + arrivee.x()) / 2; + while (ligne_inter_x % Diagram::xGrid) -- ligne_inter_x; points << QPointF(ligne_inter_x, depart.y()); points << QPointF(ligne_inter_x, arrivee.y()); } else if ((ori_depart == QET::South && (ori_arrivee == QET::North || ori_arrivee == QET::East)) || (ori_depart == QET::West && ori_arrivee == QET::East)) { // cas « 4 » - qreal ligne_inter_y = (depart.y() + arrivee.y()) / 2.0; + int ligne_inter_y = qRound(depart.y() + arrivee.y()) / 2; + while (ligne_inter_y % Diagram::yGrid) -- ligne_inter_y; points << QPointF(depart.x(), ligne_inter_y); points << QPointF(arrivee.x(), ligne_inter_y); } else if ((ori_depart == QET::North || ori_depart == QET::East) && (ori_arrivee == QET::North || ori_arrivee == QET::East)) { @@ -368,12 +370,14 @@ void Conductor::priv_calculeConductor(const QPointF &p1, QET::Orientation o1, co // trajet montant if ((ori_depart == QET::West && (ori_arrivee == QET::East || ori_arrivee == QET::South)) || (ori_depart == QET::North && ori_arrivee == QET::South)) { // cas « 3 » - qreal ligne_inter_y = (depart.y() + arrivee.y()) / 2.0; + int ligne_inter_y = qRound(depart.y() + arrivee.y()) / 2; + while (ligne_inter_y % Diagram::yGrid) -- ligne_inter_y; points << QPointF(depart.x(), ligne_inter_y); points << QPointF(arrivee.x(), ligne_inter_y); } else if ((ori_depart == QET::East && (ori_arrivee == QET::West || ori_arrivee == QET::North)) || (ori_depart == QET::South && ori_arrivee == QET::North)) { // cas « 4 » - qreal ligne_inter_x = (depart.x() + arrivee.x()) / 2.0; + int ligne_inter_x = qRound(depart.x() + arrivee.x()) / 2; + while (ligne_inter_x % Diagram::xGrid) -- ligne_inter_x; points << QPointF(ligne_inter_x, depart.y()); points << QPointF(ligne_inter_x, arrivee.y()); } else if ((ori_depart == QET::West || ori_depart == QET::North) && (ori_arrivee == QET::West || ori_arrivee == QET::North)) { @@ -1157,9 +1161,20 @@ QList Conductor::junctions() const { QList Conductor::bends() const { QList points; if (!segments) return(points); + + // recupere la liste des segments de taille non nulle + QList visible_segments; ConductorSegment *segment = segments; while (segment -> hasNextSegment()) { - ConductorSegment *next_segment = segment -> nextSegment(); + if (!segment -> isPoint()) visible_segments << segment; + segment = segment -> nextSegment(); + } + if (!segment -> isPoint()) visible_segments << segment; + + ConductorSegment *next_segment; + for (int i = 0 ; i < visible_segments.count() -1 ; ++ i) { + segment = visible_segments[i]; + next_segment = visible_segments[i + 1]; if (!segment -> isPoint() && !next_segment -> isPoint()) { // si les deux segments ne sont pas dans le meme sens, on a une bifurcation if (next_segment -> type() != segment -> type()) { @@ -1191,7 +1206,6 @@ QList Conductor::bends() const { points << qMakePair(segment -> secondPoint(), bend_type); } } - segment = next_segment; } return(points); } diff --git a/conductor.h b/conductor.h index 55136786d..49bc2cf2c 100644 --- a/conductor.h +++ b/conductor.h @@ -129,7 +129,7 @@ class Conductor : public QGraphicsPathItem { static int getCoeff(const qreal &, const qreal &); static int getSign(const qreal &); QHash shareOffsetBetweenSegments(const qreal &offset, const QList &, const qreal & = 0.01) const; - static QPointF extendTerminal(const QPointF &, QET::Orientation, qreal = 12.0); + static QPointF extendTerminal(const QPointF &, QET::Orientation, qreal = 9.0); static qreal conductor_bound(qreal, qreal, qreal, qreal = 0.0); static qreal conductor_bound(qreal, qreal, bool); static Qt::Corner movementType(const QPointF &, const QPointF &);