| [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/ |