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