Il est desormais possible d'enregistrer les conducteurs modifies dans les fichiers

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@60 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2007-02-18 19:33:15 +00:00
parent c1f9d430b6
commit b59040234a
3 changed files with 93 additions and 1 deletions

View File

@@ -669,3 +669,89 @@ bool Conducer::hasClickedOn(QPointF press_point, QPointF point) {
press_point.y() < point.y() + 5.0
);
}
bool Conducer::fromXml(QDomElement &e) {
// parcourt les elements XML "segment" et en extrait deux listes de longueurs
// les segments non valides sont ignores
QList<qreal> segments_x, segments_y;
for (QDomNode node = e.firstChild() ; !node.isNull() ; node = node.nextSibling()) {
// on s'interesse aux elements XML "segment"
QDomElement current_segment = node.toElement();
if (current_segment.isNull() || current_segment.tagName() != "segment") continue;
// le segment doit avoir une longueur
if (!current_segment.hasAttribute("length")) continue;
// cette longueur doit etre un reel
bool ok;
qreal segment_length = current_segment.attribute("length").toDouble(&ok);
if (!ok) continue;
if (current_segment.attribute("orientation") == "horizontal") {
segments_x << segment_length;
segments_y << 0.0;
} else {
segments_x << 0.0;
segments_y << segment_length;
}
}
// s'il n'y a pas de segments, on renvoie true
if (!segments_x.size()) return(true);
// les longueurs recueillies doivent etre coherentes avec les positions des bornes
qreal width = 0.0, height= 0.0;
foreach (qreal t, segments_x) width += t;
foreach (qreal t, segments_y) height += t;
QPointF t1 = terminal1 -> amarrageConducer();
QPointF t2 = terminal2 -> amarrageConducer();
qreal expected_width = qAbs(t2.x() - t1.x());
qreal expected_height = qAbs(t2.y() - t1.y());
if (expected_width != width || expected_height != height) return(false);
/* on recree les segments a partir des donnes XML */
// cree la liste de points
QList<QPointF> points_list;
points_list << t1;
for (int i = 0 ; i < segments_x.size() ; ++ i) {
points_list << QPointF(
points_list.last().x() + segments_x.at(i),
points_list.last().y() + segments_y.at(i)
);
}
qDebug() << points_list;
pointsToSegments(points_list);
// initialise divers parametres lies a la modification des conducteurs
modified_path = true;
moves_x = segments_x;
moves_y = segments_y;
type_trajet_x = points_list.at(0).x() < points_list.at(points_list.size() - 1).x();
orig_dist_2_terms_x = points_list.at(points_list.size() - 1).x() - points_list.at(0).x();
orig_dist_2_terms_y = points_list.at(points_list.size() - 1).y() - points_list.at(0).y();
segmentsToPath();
return(true);
}
void Conducer::toXml(QDomDocument &d, QDomElement &e) {
// on n'exporte les segments du conducteur que si ceux-ci ont
// ete modifies par l'utilisateur
if (!modified_path) return;
// parcours et export des segments
ConducerSegment *segment = segments;
QDomElement current_segment;
while (segment -> hasNextSegment()) {
current_segment = d.createElement("segment");
current_segment.setAttribute("orientation", segment -> isHorizontal() ? "horizontal" : "vertical");
current_segment.setAttribute("length", segment -> length());
e.appendChild(current_segment);
segment = segment -> nextSegment();
}
current_segment = d.createElement("segment");
current_segment.setAttribute("orientation", segment -> isHorizontal() ? "horizontal" : "vertical");
current_segment.setAttribute("length", segment -> length());
e.appendChild(current_segment);
}

View File

@@ -22,6 +22,8 @@
QRectF boundingRect() const;
virtual QPainterPath shape() const;
static bool valideXml(QDomElement &);
bool fromXml(QDomElement &);
void toXml(QDomDocument &, QDomElement &);
///Premiere borne a laquelle le fil est rattache
Terminal *terminal1;

View File

@@ -233,6 +233,7 @@ QDomDocument Diagram::toXml(bool diagram) {
QDomElement conducer = document.createElement("conducteur");
conducer.setAttribute("borne1", table_adr_id.value(f -> terminal1));
conducer.setAttribute("borne2", table_adr_id.value(f -> terminal2));
f -> toXml(document, conducer);
conducers.appendChild(conducer);
}
racine.appendChild(conducers);
@@ -338,7 +339,10 @@ bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_in
bool peut_poser_conducer = true;
bool cia = ((Element *)p2 -> parentItem()) -> connexionsInternesAcceptees();
if (!cia) foreach(QGraphicsItem *item, p2 -> parentItem() -> children()) if (item == p1) peut_poser_conducer = false;
if (peut_poser_conducer) new Conducer(table_adr_id.value(id_p1), table_adr_id.value(id_p2), 0, this);
if (peut_poser_conducer) {
Conducer *c = new Conducer(table_adr_id.value(id_p1), table_adr_id.value(id_p2), 0, this);
c -> fromXml(f);
}
}
} else qDebug() << "Le chargement du conducer" << id_p1 << id_p2 << "a echoue";
}