From 900439c00edf86240ea0e141e37b1aa694d46d46 Mon Sep 17 00:00:00 2001 From: xavierqet Date: Mon, 13 Aug 2007 23:01:48 +0000 Subject: [PATCH] Prise en compte d'un cas particulier pour les lignes dans l'editeur d'elements. Si une ligne equivalait a un point (= avait ses deux points egaux), la fonction pour calculer les quatre points delimitant la shape renvoyait un resultat stupide, ce qui genereait de nombreux avertissements en mode release et l'echec d'un assert en mode debug. De plus, l'enregistrement de ce genre de lignes est desormais evite dans la methode toXml(). git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@98 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- editor/partline.cpp | 63 +++++++++++++++++++++++++++++---------------- qelectrotech.pro | 1 + 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/editor/partline.cpp b/editor/partline.cpp index 5cf0db8b5..43fc55ba4 100644 --- a/editor/partline.cpp +++ b/editor/partline.cpp @@ -21,9 +21,17 @@ void PartLine::paint(QPainter *painter, const QStyleOptionGraphicsItem */*q*/, Q } const QDomElement PartLine::toXml(QDomDocument &xml_document) const { - QDomElement xml_element = xml_document.createElement("line"); + QPointF p1(sceneP1()); QPointF p2(sceneP2()); + + // cas particulier : on n'enregistre pas les lignes equivalentes a un point + if (p1 == p2) { + QDomElement *null_qdom_elmt = new QDomElement(); + return(*null_qdom_elmt); + } + + QDomElement xml_element = xml_document.createElement("line"); xml_element.setAttribute("x1", p1.x()); xml_element.setAttribute("y1", p1.y()); xml_element.setAttribute("x2", p2.x()); @@ -106,32 +114,43 @@ QRectF PartLine::boundingRect() const { @return une liste contenant les deux points de la droite + les 4 points entourant ces deux points */ QList PartLine::fourShapePoints() const { + const qreal marge = 2.0; // on a donc A(xa , ya) et B(xb, yb) QPointF a = line().p1(); QPointF b = line().p2(); - // on calcule le vecteur AB : (xb-xa, yb-ya) - QPointF v_ab = b - a; - - // et la distance AB : racine des coordonnees du vecteur au carre - qreal ab = sqrt(pow(v_ab.x(), 2) + pow(v_ab.y(), 2)); - - // ensuite on definit le vecteur u(a, b) qui est egal au vecteur AB divise - // par sa longueur et multiplie par la longueur de la marge que tu veux - // laisser - QPointF u = v_ab / ab * 2.0; - - // on définit le vecteur v(-b , a) qui est perpendiculaire à AB - QPointF v(-u.y(), u.x()); - QPointF m = -u + v; // on a le vecteur M = -u + v - QPointF n = -u - v; // et le vecteur N=-u-v - QPointF h = a + m; // H = A + M - QPointF k = a + n; // K = A + N - QPointF i = b - n; // I = B - N - QPointF j = b - m; // J = B - M - QList result; - result << h << i << j << k; + + // cas particulier : la droite se ramene a un point + if (a == b) { + result << QPointF(a.x() - marge, a.y() - marge); + result << QPointF(a.x() - marge, a.y() + marge); + result << QPointF(a.x() + marge, a.y() + marge); + result << QPointF(a.x() + marge, a.y() - marge); + } else { + + // on calcule le vecteur AB : (xb-xa, yb-ya) + QPointF v_ab = b - a; + + // et la distance AB : racine des coordonnees du vecteur au carre + qreal ab = sqrt(pow(v_ab.x(), 2) + pow(v_ab.y(), 2)); + + // ensuite on definit le vecteur u(a, b) qui est egal au vecteur AB divise + // par sa longueur et multiplie par la longueur de la marge que tu veux + // laisser + QPointF u = v_ab / ab * marge; + + // on définit le vecteur v(-b , a) qui est perpendiculaire à AB + QPointF v(-u.y(), u.x()); + QPointF m = -u + v; // on a le vecteur M = -u + v + QPointF n = -u - v; // et le vecteur N=-u-v + QPointF h = a + m; // H = A + M + QPointF k = a + n; // K = A + N + QPointF i = b - n; // I = B - N + QPointF j = b - m; // J = B - M + + result << h << i << j << k; + } return(result); } diff --git a/qelectrotech.pro b/qelectrotech.pro index 4e33e5079..3f5e45992 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -100,3 +100,4 @@ SOURCES += aboutqet.cpp \ RESOURCES += qelectrotech.qrc TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts QT += xml +CONFIG += release