[qet] Optimisation de l'éditeur d'élément |
[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]
Salut Cyril, Tout d'abord, un petit résumé de la dernière guignolerie^Wbidouille de scorpio : Pour tester le script Python de conversion DXF -> ELMT envoyé par Thierry Vicat, scorpio a été chercher un fichier DXF sur http://flashanims.awardspace.com/mach3.htm , ce qui lui a donné le gigantesque élément (1870x880 px) que voici : http://qelectrotech.org/svgelement.php?elmt=elements/moderation/slr5000.elmt Problème : cet élément, dont la pertinence est certes discutable sur pas mal de schémas électriques, est composé de 2125 lignes et est de ce fait long à ouvrir et consommateur de mémoire. Exemple avec la branche 0.3, révision 848 : * Commande : misc/launch_qet.sh /home/xavier/.qet/elements/slr5000.elmt * Avec les widgets d'édition : * Éditeur visible après 2 minutes et 57 secondes * VSZ = 659412 * RSS = 496620 * Sans les widgets d'édition (patch no-part-editors.diff ci-joint) * Éditeur visible après 1 seconde * VSZ = 190488 * RSS = 29852 On comprend vite que le problème se situe dans l'implémentation actuelle de l'éditeur d'éléments : chaque partie/primitive (ligne, cercle, ellipse, rectangle, polygone, arc elliptique, texte, champ de texte, et borne) instancie son propre éditeur. On se retrouve donc à prendre le temps d'allouer en mémoire 2125 widgets composés, alors que : * un seul est visible à la fois * un de chaque suffirait : cela ferait 9 widgets au lieu de 2125 Il y a là un travail d'optimisation à effectuer. Cela me paraît tout à fait réalisable à court terme. Concrètement : Avant : * si la sélection ne comporte qu'une seule primitive : * on va chercher le widget d'édition de cette primitive * et on l'affiche. Après : * si la sélection ne comporte qu'une seule primitive : * on regarde son type * on choisit le widget adéquat parmi ceux déjà instanciés (avec une initialisation paresseuse tant qu'à faire) * on lui affecte les valeurs adéquates * on l'affiche * on prévoit un petit mécanisme pour que toute modification faite via [cet éditeur soit répercutée sur la bonne primitive. Ça ouvre également la porte à la gestion de ces mêmes widgets lorsque plusieurs primitives sont sélectionnées... Bref, la question : est-ce que tu veux te charger de cette optimisation ? À faire dans le trunk à priori, sauf si tu ne le sens pas, auquel cas on te fait une branche à part dans le SVN. @+ -- Xavier G. Développeur du projet QElectroTech
Index: sources/editor/partterminal.cpp =================================================================== --- sources/editor/partterminal.cpp (révision 848) +++ sources/editor/partterminal.cpp (copie de travail) @@ -30,8 +30,8 @@ QGraphicsItem(parent, scene), _orientation(QET::North) { - informations = new TerminalEditor(elementEditor(), this); - informations -> setElementTypeName(name()); +// informations = new TerminalEditor(elementEditor(), this); +// informations -> setElementTypeName(name()); updateSecondPoint(); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); #if QT_VERSION >= 0x040600 @@ -42,8 +42,8 @@ /// Destructeur PartTerminal::~PartTerminal() { - if (informations -> parentWidget()) return; // le widget sera supprime par son parent - delete informations; +// if (informations -> parentWidget()) return; // le widget sera supprime par son parent +// delete informations; }; /** @@ -84,7 +84,7 @@ @return Le widget permettant d'editer cette borne */ QWidget *PartTerminal::elementInformations() { - return(informations); + return(0/*informations*/); } /** @@ -152,7 +152,7 @@ prepareGeometryChange(); _orientation = ori; updateSecondPoint(); - informations -> updateForm(); +// informations -> updateForm(); } /** @@ -203,7 +203,7 @@ QVariant PartTerminal::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); +// informations -> updateForm(); } } return(QGraphicsItem::itemChange(change, value)); Index: sources/editor/partline.cpp =================================================================== --- sources/editor/partline.cpp (révision 848) +++ sources/editor/partline.cpp (copie de travail) @@ -38,10 +38,10 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new LineEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); +// informations = new LineEditor(elementEditor(), this); +// informations -> setElementTypeName(name()); +// style_editor -> appendWidget(informations); +// style_editor -> setElementTypeName(name()); } /// Destructeur @@ -288,7 +288,7 @@ QVariant PartLine::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); +// informations -> updateForm(); } } return(QGraphicsLineItem::itemChange(change, value)); Index: sources/editor/customelementgraphicpart.h =================================================================== --- sources/editor/customelementgraphicpart.h (révision 848) +++ sources/editor/customelementgraphicpart.h (copie de travail) @@ -69,13 +69,13 @@ _color(BlackColor), _antialiased(false) { - style_editor = new StyleEditor(elementEditor(), this); +// style_editor = new StyleEditor(elementEditor(), this); }; /// Destructeur virtual ~CustomElementGraphicPart() { - if (style_editor -> parentWidget()) return; // l'editeur de style sera supprime par son parent - delete style_editor; +// if (style_editor -> parentWidget()) return; // l'editeur de style sera supprime par son parent +// delete style_editor; }; // attributs Index: sources/editor/parttextfield.cpp =================================================================== --- sources/editor/parttextfield.cpp (révision 848) +++ sources/editor/parttextfield.cpp (copie de travail) @@ -39,8 +39,8 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setPlainText(QObject::tr("_", "default text when adding a textfield in the element editor")); - infos = new TextFieldEditor(elementEditor(), this); - infos -> setElementTypeName(name()); +// infos = new TextFieldEditor(elementEditor(), this); +// infos -> setElementTypeName(name()); // ajuste la position du champ de texte lorsqu'on lui ajoute/retire des lignes connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(adjustItemPosition(int))); @@ -48,8 +48,8 @@ /// Destructeur PartTextField::~PartTextField() { - if (infos -> parentWidget()) return; // le widget sera supprime par son parent - delete infos; +// if (infos -> parentWidget()) return; // le widget sera supprime par son parent +// delete infos; } /** @@ -104,7 +104,7 @@ @return Le widget permettant d'editer ce champ de texte */ QWidget *PartTextField::elementInformations() { - return(infos); + return(0/*infos*/); } /** @@ -293,10 +293,10 @@ // memorise la nouvelle position "officielle" du champ de texte // cette information servira a le recentrer en cas d'ajout / retrait de lignes known_position_ = pos(); - infos -> updateForm(); +// infos -> updateForm(); } else if (change == QGraphicsItem::ItemSelectedHasChanged) { if (value.toBool() == true) { - infos -> updateForm(); +// infos -> updateForm(); } } return(QGraphicsTextItem::itemChange(change, value)); Index: sources/editor/partrectangle.cpp =================================================================== --- sources/editor/partrectangle.cpp (révision 848) +++ sources/editor/partrectangle.cpp (copie de travail) @@ -30,10 +30,10 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new RectangleEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); +// informations = new RectangleEditor(elementEditor(), this); +// informations -> setElementTypeName(name()); +// style_editor -> appendWidget(informations); +// style_editor -> setElementTypeName(name()); } /// Destructeur @@ -178,7 +178,7 @@ QVariant PartRectangle::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); +// informations -> updateForm(); } } return(QGraphicsRectItem::itemChange(change, value)); Index: sources/editor/customelementgraphicpart.cpp =================================================================== --- sources/editor/customelementgraphicpart.cpp (révision 848) +++ sources/editor/customelementgraphicpart.cpp (copie de travail) @@ -85,7 +85,7 @@ _antialiased = qde.attribute("antialias") == "true"; // met a jour l'editeur de style - style_editor -> updateForm(); +// style_editor -> updateForm(); } /** @@ -146,7 +146,7 @@ @return Le widget permettant d'editer les styles */ QWidget *CustomElementGraphicPart::elementInformations() { - return(style_editor); + return(0); } /** @@ -178,7 +178,7 @@ change_made = true; } if (change_made) { - style_editor -> updateForm(); +// style_editor -> updateForm(); } } Index: sources/editor/parttext.cpp =================================================================== --- sources/editor/parttext.cpp (révision 848) +++ sources/editor/parttext.cpp (copie de travail) @@ -41,14 +41,14 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setPlainText(QObject::tr("T", "default text when adding a text in the element editor")); - infos = new TextEditor(elementEditor(), this); - infos -> setElementTypeName(name()); +// infos = new TextEditor(elementEditor(), this); +// infos -> setElementTypeName(name()); } /// Destructeur PartText::~PartText() { - if (infos -> parentWidget()) return; // le widget sera supprime par son parent - delete infos; +// if (infos -> parentWidget()) return; // le widget sera supprime par son parent +// delete infos; } /** @@ -87,7 +87,7 @@ @return Le widget permettant d'editer ce texte statique */ QWidget *PartText::elementInformations() { - return(infos); + return(0/*infos*/); } /** @@ -238,10 +238,10 @@ // memorise la nouvelle position "officielle" du champ de texte // cette information servira a le recentrer en cas d'ajout / retrait de lignes known_position_ = pos(); - infos -> updateForm(); +// infos -> updateForm(); } else if (change == QGraphicsItem::ItemSelectedHasChanged) { if (value.toBool() == true) { - infos -> updateForm(); +// infos -> updateForm(); } } return(QGraphicsTextItem::itemChange(change, value)); Index: sources/editor/partpolygon.cpp =================================================================== --- sources/editor/partpolygon.cpp (révision 848) +++ sources/editor/partpolygon.cpp (copie de travail) @@ -35,10 +35,10 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new PolygonEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); +// informations = new PolygonEditor(elementEditor(), this); +// informations -> setElementTypeName(name()); +// style_editor -> appendWidget(informations); +// style_editor -> setElementTypeName(name()); } /// Destructeur @@ -143,7 +143,7 @@ QVariant PartPolygon::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); +// informations -> updateForm(); } } return(QGraphicsPolygonItem::itemChange(change, value)); Index: sources/editor/partellipse.cpp =================================================================== --- sources/editor/partellipse.cpp (révision 848) +++ sources/editor/partellipse.cpp (copie de travail) @@ -30,10 +30,10 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new EllipseEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); +// informations = new EllipseEditor(elementEditor(), this); +// informations -> setElementTypeName(name()); +// style_editor -> appendWidget(informations); +// style_editor -> setElementTypeName(name()); } /// Destructeur @@ -171,7 +171,7 @@ QVariant PartEllipse::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); +// informations -> updateForm(); } } return(QGraphicsEllipseItem::itemChange(change, value)); Index: sources/editor/partcircle.cpp =================================================================== --- sources/editor/partcircle.cpp (révision 848) +++ sources/editor/partcircle.cpp (copie de travail) @@ -30,10 +30,10 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new CircleEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); +// informations = new CircleEditor(elementEditor(), this); +// informations -> setElementTypeName(name()); +// style_editor -> appendWidget(informations); +// style_editor -> setElementTypeName(name()); } /// Destructeur @@ -164,7 +164,7 @@ QVariant PartCircle::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); +// informations -> updateForm(); } } return(QGraphicsEllipseItem::itemChange(change, value)); Index: sources/editor/partarc.cpp =================================================================== --- sources/editor/partarc.cpp (révision 848) +++ sources/editor/partarc.cpp (copie de travail) @@ -35,10 +35,10 @@ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new ArcEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); +// informations = new ArcEditor(elementEditor(), this); +// informations -> setElementTypeName(name()); +// style_editor -> appendWidget(informations); +// style_editor -> setElementTypeName(name()); } /// Destructeur @@ -210,7 +210,7 @@ QVariant PartArc::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); +// informations -> updateForm(); } } return(QGraphicsEllipseItem::itemChange(change, value));
Attachment:
signature.asc
Description: This is a digitally signed message part.
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |