Logo Search packages:      
Sourcecode: qelectrotech version File versions  Download package

bool Diagram::fromXml ( QDomElement &  document,
QPointF  position = QPointF(),
bool  consider_informations = true,
DiagramContent content_ptr = 0 
)

Importe le schema decrit dans un element XML. Si une position est precisee, les elements importes sont positionnes de maniere a ce que le coin superieur gauche du plus petit rectangle pouvant les entourant tous (le bounding rect) soit a cette position.

Parameters:
document Le document XML a analyser
position La position du schema importe
consider_informations Si vrai, les informations complementaires (auteur, titre, ...) seront prises en compte
content_ptr si ce pointeur vers un DiagramContent est different de 0, il sera rempli avec le contenu ajoute au schema par le fromXml
Returns:
true si l'import a reussi, false sinon

Definition at line 398 of file diagram.cpp.

References addDiagramTextItem(), addElement(), BorderInset::adjustInsetToColumns(), border_and_inset, conductorsToMove(), defaultConductorProperties, BorderInset::displayColumns(), BorderInset::displayRows(), QET::findInDomElement(), fromXml(), ConductorProperties::fromXml(), ElementsLocation::path(), BorderInset::setAuthor(), BorderInset::setColumnsWidth(), BorderInset::setDate(), BorderInset::setDiagramHeight(), BorderInset::setFileName(), BorderInset::setFolio(), BorderInset::setNbColumns(), BorderInset::setNbRows(), ElementsLocation::setProject(), BorderInset::setRowsHeight(), BorderInset::setTitle(), Conductor::valideXml(), Element::valideXml(), and write().

                                                                                                                      {
      QDomElement root = document;
      // le premier element doit etre un schema
      if (root.tagName() != "diagram") return(false);
      
      // lecture des attributs de ce schema
      if (consider_informations) {
            border_and_inset.setAuthor(root.attribute("author"));
            border_and_inset.setTitle(root.attribute("title"));
            border_and_inset.setDate(QDate::fromString(root.attribute("date"), "yyyyMMdd"));
            border_and_inset.setFileName(root.attribute("filename"));
            border_and_inset.setFolio(root.attribute("folio"));
            
            bool ok;
            // nombre de colonnes
            int nb_cols = root.attribute("cols").toInt(&ok);
            if (ok) border_and_inset.setNbColumns(nb_cols);
            
            // taille des colonnes
            double col_size = root.attribute("colsize").toDouble(&ok);
            if (ok) border_and_inset.setColumnsWidth(col_size);
            
            // retrocompatibilite : les schemas enregistres avec la 0.1 ont un attribut "height"
            if (root.hasAttribute("rows") && root.hasAttribute("rowsize")) {
                  // nombre de lignes
                  int nb_rows = root.attribute("rows").toInt(&ok);
                  if (ok) border_and_inset.setNbRows(nb_rows);
                  
                  // taille des lignes
                  double row_size = root.attribute("rowsize").toDouble(&ok);
                  if (ok) border_and_inset.setRowsHeight(row_size);
            } else {
                  // hauteur du schema
                  double height = root.attribute("height").toDouble(&ok);
                  if (ok) border_and_inset.setDiagramHeight(height);
            }
            
            // affichage des lignes et colonnes
            border_and_inset.displayColumns(root.attribute("displaycols") != "false");
            border_and_inset.displayRows(root.attribute("displayrows") != "false");
            
            border_and_inset.adjustInsetToColumns();
            
            // repere le permier element "defaultconductor"
            for (QDomNode node = root.firstChild() ; !node.isNull() ; node = node.nextSibling()) {
                  QDomElement elmts = node.toElement();
                  if(elmts.isNull() || elmts.tagName() != "defaultconductor") continue;
                  defaultConductorProperties.fromXml(elmts);
                  break;
            }
            
      }
      
      // si la racine n'a pas d'enfant : le chargement est fini (schema vide)
      if (root.firstChild().isNull()) {
            write(document);
            return(true);
      }
      
      // chargement de tous les elements du fichier XML
      QList<Element *> added_elements;
      QHash<int, Terminal *> table_adr_id;
      foreach (QDomElement e, QET::findInDomElement(root, "elements", "element")) {
            if (!Element::valideXml(e)) continue;
            
            // cree un element dont le type correspond a l'id type
            QString type_id = e.attribute("type");
            ElementsLocation element_location = ElementsLocation(type_id);
            if (type_id.startsWith("embed://")) element_location.setProject(project_);
            
            CustomElement *nvel_elmt = new CustomElement(element_location);
            if (nvel_elmt -> isNull()) {
                  QString debug_message = QString("Diagram::fromXml() : Le chargement de la description de l'element %1 a echoue avec le code d'erreur %2").arg(element_location.path()).arg(nvel_elmt -> state());
                  qDebug() << qPrintable(debug_message);
                  delete nvel_elmt;
                  
                  qDebug() << "Diagram::fromXml() : Utilisation d'un GhostElement en lieu et place de cet element.";
                  nvel_elmt = new GhostElement(element_location);
            }
            
            // charge les caracteristiques de l'element
            if (nvel_elmt -> fromXml(e, table_adr_id)) {
                  // ajout de l'element au schema et a la liste des elements ajoutes
                  addElement(nvel_elmt);
                  added_elements << nvel_elmt;
            } else {
                  delete nvel_elmt;
                  qDebug() << "Diagram::fromXml() : Le chargement des parametres d'un element a echoue";
            }
      }
      
      // chargement de tous les textes du fichiers XML
      QList<DiagramTextItem *> added_texts;
      foreach (QDomElement f, QET::findInDomElement(root, "inputs", "input")) {
            DiagramTextItem *dti = new DiagramTextItem(0, this);
            dti -> fromXml(f);
            addDiagramTextItem(dti);
            added_texts << dti;
      }
      
      // gere la translation des nouveaux elements et texte si celle-ci est demandee
      if (position != QPointF()) {
            // determine quel est le coin superieur gauche du rectangle entourant les elements ajoutes
            qreal minimum_x = 0, minimum_y = 0;
            bool init = false;
            QList<QGraphicsItem *> added_items;
            foreach (Element *added_element, added_elements) added_items << added_element;
            foreach (DiagramTextItem *added_text, added_texts) added_items << added_text;
            foreach (QGraphicsItem *item, added_items) {
                  QPointF csg = item -> mapToScene(item -> boundingRect()).boundingRect().topLeft();
                  qreal px = csg.x();
                  qreal py = csg.y();
                  if (!init) {
                        minimum_x = px;
                        minimum_y = py;
                        init = true;
                  } else {
                        if (px < minimum_x) minimum_x = px;
                        if (py < minimum_y) minimum_y = py;
                  }
            }
            qreal diff_x = position.x() - minimum_x;
            qreal diff_y = position.y() - minimum_y;
            foreach (Element *added_element, added_elements) {
                  added_element -> setPos(added_element -> pos().x() + diff_x, added_element -> pos().y() + diff_y);
            }
            foreach (DiagramTextItem *added_text, added_texts) {
                  added_text -> setPos(added_text -> pos().x() + diff_x, added_text -> pos().y() + diff_y);
            }
      }
      
      // chargement de tous les Conducteurs du fichier XML
      QList<Conductor *> added_conductors;
      foreach (QDomElement f, QET::findInDomElement(root, "conductors", "conductor")) {
            if (!Conductor::valideXml(f)) continue;
            // verifie que les bornes que le conducteur relie sont connues
            int id_p1 = f.attribute("terminal1").toInt();
            int id_p2 = f.attribute("terminal2").toInt();
            if (table_adr_id.contains(id_p1) && table_adr_id.contains(id_p2)) {
                  // pose le conducteur... si c'est possible
                  Terminal *p1 = table_adr_id.value(id_p1);
                  Terminal *p2 = table_adr_id.value(id_p2);
                  if (p1 != p2) {
                        bool can_add_conductor = true;
                        bool cia = ((Element *)p2 -> parentItem()) -> internalConnections();
                        if (!cia) {
                              foreach(QGraphicsItem *item, p2 -> parentItem() -> children()) {
                                    if (item == p1) can_add_conductor = false;
                              }
                        }
                        if (can_add_conductor) {
                              Conductor *c = new Conductor(table_adr_id.value(id_p1), table_adr_id.value(id_p2), 0, this);
                              c -> fromXml(f);
                              added_conductors << c;
                        }
                  }
            } else qDebug() << "Diagram::fromXml() : Le chargement du conducteur" << id_p1 << id_p2 << "a echoue";
      }
      
      // remplissage des listes facultatives
      if (content_ptr) {
            content_ptr -> elements         = added_elements;
            content_ptr -> conductorsToMove = added_conductors;
            content_ptr -> textFields       = added_texts;
      }
      
      return(true);
}


Generated by  Doxygen 1.6.0   Back to index