Topic: Add attribut "uuid" for .elmt file.

Bonjour,


Ces derniers jours les travaux ont portés:

  • Amélioration du code sur le switch du fond blanc en gris et vice versa des folios, les bordures et cartouches passent maintenant en gris comme le reste du schéma.

  • Les basic shapes, images une fois leur positions verrouillés ne sont plus déplaçables même avec le clavier.

https://download.qelectrotech.org/qet/forum_img/grey_background.png
Depuis quelques temps et plus tard suivant les OS, il est apparu que Qt n'enregistrait jamais dans le même ordre les attributs définitions des Eléments dans le XML à chaque lancement de Qet.

Une classe compare les attributs pour identifier si l’élément qui vient d’être posé sur le schéma existe déjà dans le projet, et s'il l'est, compare l'ensemble des attributs.

Pour des questions de rapidité cette méthode compare l'ensemble de la chaîne, si un attribut change de place l’élément est vu comme différent.


On à réfléchi avec Joshua à plusieurs solutions, dont le fait de passer de QDomdocument, à QXmlStreamReader , ou Sax mais il fallait revoir en profondeur une grosse partie du code et ça aurai pu prendre des mois....


La solution qui nous est apparue la plus facile : générer un identifiant unique (UUID) sur chaque élément de la collection par l'intermédiaire de l'éditeur d’élément (qui maintenant rajoute automatiquement ce champ à la sauvegarde).


Du code vient d’être ajouté pour comparer les éléments par ce seul attribut UUID, et non plus comme avant sur la chaîne entière d'attributs XML.


En principe sur de gros projets on devrait y voir une différence sur l'ajout d'un nouvel élément.

La collection  officielle à été patchée pour rajouter ce nouveau attribut. 

Je vous passe mon script bash, pour ceux sous gnu/linux qui veulent tagger leur collection personnelle (c'est pas parfait, mais ça a le mérite de fonctionner, je vais encore me faire tirer les oreilles par des plus barbus...).nomicons/grin  sed, uuidgen(paquet  uuid-runtime) et find doivent d'abord être installés.

#!/bin/bash
# Add attribut "uuid" in all .elmt files.


find . -type f -name "*.elmt" -exec sh -c 'UUID="$(uuidgen | awk '"'"'{print toupper($0)}'"'"')" ; sed -i '"'"'s#\(\).*\(<names>\)#\1'"'"'"<uuid uuid=\"{$UUID}\"/>"'"'"'\2#'"'"' "{}"' \;
 

elmt_gen_uuid.sh

Il faut le mettre dans le répertoire élément et le rendre exécutable:

chmod +x elmt_gen_uuid.sh

puis le lancer en simple user par 

./elmt_gen_uuid.sh

Voila c'est tout, faut laisser travailler la machine, ça m'a pris quelques minutes sur les 2500 éléments de la collection.


Ceux sous Windows, faudra vous débrouiller seul, je ne sais pas faire.(si mais avec  Cygwin)nomicons/tongue 



Enjoy!

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

2 (edited by scorpio810 2015-07-01 17:47:38)

Re: Add attribut "uuid" for .elmt file.

scorpio810 wrote:

En principe sur de gros projets on devrait y voir une différence sur l'ajout d'un nouvel élément.

Je confirme, c'est bien plus fluide et même instantané sur le fait de rajouter des nouveaux éléments (s'ils sont déjà intégrés dans le projet), sur de très gros projets de 150 folios, une fois écrasé les éléments sans UUID.
Qet ne devrait pas avoir de limitation de folios,  seul la puissance machine CPU, SSD et quantités de ram installées jouera sur de très gros projets.
Je le remarque déjà au taff sur un petit dual core Intel et ses 2 G de RAM avec vieux dd de 160Go..

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

Re: Add attribut "uuid" for .elmt file.

SI je comprends bien, pas d'impact sur les projet existant .
En revanche, faut-il absolument convertir sa collection ?

Re: Add attribut "uuid" for .elmt file.

Clair, oui.nomicons/smile

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

Re: Add attribut "uuid" for .elmt file.

galexis wrote:

SI je comprends bien, pas d'impact sur les projet existant .
En revanche, faut-il absolument convertir sa collection ?

Aucun impact sur les projets existants, et une fluidité accru sur l'insertion d'un élément déjà existant dans le projet.
C'est visible passer les 100 folios : le temps de parcourir le XML root voir si l’élément en question existe déjà, et plutot que de comparer sur leurs chaînes d'attributs, comparer que leur identifiant UUID symbole est un gain de temps CPU énorme..

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

6 (edited by galexis 2015-07-01 20:23:22)

Re: Add attribut "uuid" for .elmt file.

scorpio810 wrote:
#!/bin/bash
# Add attribut "uuid" in all .elmt files.


find . -type f -name "*.elmt" -exec sh -c 'UUID="$(uuidgen | awk '"'"'{print toupper($0)}'"'"')" ; sed -i '"'"'s#\(\).*\(<names>\)#\1'"'"'"<uuid uuid=\"{$UUID}\"/>"'"'"'\2#'"'"' "{}"' \;
 

C'est le paquet findutils qu'il faut ?
ça cherche dans les dossiers aussi ?

Re: Add attribut "uuid" for .elmt file.

findutils
Utilitaires de recherche de fichiers -- find, xargs
Clair!
Oui c'est récursif et cherche dans tous les sous dossiers: RTFM find
http://linux.die.net/man/1/find
http://www.grymoire.com/Unix/Sed.html
http://how-to.linuxcareer.com/learning- … mmands-awk

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

8 (edited by Nuri 2015-07-01 22:35:13)

Re: Add attribut "uuid" for .elmt file.

Merci pour le patch Laurent, cela a fonctionné sans embûche.

Je suis bien content que ce système avec les UUID règle les problèmes d'ordre avec les éléments. Avant les UUID, j'avais des problèmes sur ma mise en armoire :

selon les ouvertures de QET, un coup les vignettes étaient en avant-plan des rails de montage, un coup en arrière plan.

Puis aussi des problèmes avec mes apercus d'E/S API puisque je superpose plusieurs éléments les uns sur les autres.

Le seul inconvénient, c'est qu'il n'est maintenant plus recommandé du tout de créer des éléments avec un éditeur de texte (ce qui se révèle parfois plus rapide quand on veut faire des vignettes à partir de copier/coller). Il faut obligatoirement passer par l'éditeur d'élément.

Sinon, pour écraser les anciens éléments sans UUID de mon projet en cours, est-ce que je peux faire comme ca :

drag/drop de ma collec utilisateur sur la collection embarquée puis "nettoyer le projet" avec les 3 options activées ?

9 (edited by Joshua 2015-07-01 23:30:08)

Re: Add attribut "uuid" for .elmt file.

Tu as juste à poser un élément de la collection officiel (collection patché avec les uuid) déjà existant dans ton projet (par ex une bobine) normalement tu devrais avoir le dialogue signalant que l'élément est déjà intégré, mais semble différent.
A cette question tu coche "écraser", ce qui aura pour effet de remplacer l'ancien élément par le nouveau (donc avec les uuid).
Fait une copie de ton projet avant quand même nomicons/smile .

Développeur QElectroTech

Re: Add attribut "uuid" for .elmt file.

Nuri wrote:

Le seul inconvénient, c'est qu'il n'est maintenant plus recommandé du tout de créer des éléments avec un éditeur de texte (ce qui se révèle parfois plus rapide quand on veut faire des vignettes à partir de copier/coller). Il faut obligatoirement passer par l'éditeur d'élément.

Tu le peux toujours, suffit ensuite de passer par le script, évite de le faire dans le même dossier que tes éléments personnel déjà patchés, sinon les UUID seront à nouveau changés, ce qui sera moins drôle pour toi, uhuhu.


--- -    2015-07-02 09:27:58.733634903 +0200
+++ "/home/laurent/Qet_scripts/Nouveau dossier 2/pneuride.elmt"    2015-07-02 09:27:53.996643627 +0200
@@ -1,5 +1,5 @@
 <definition width="70" version="0.3" hotspot_x="15" hotspot_y="30" height="60" type="element" orientation="dyyy">
-<uuid uuid="{223D8E45-F711-48D3-A7A0-D77A4FCA6260}"/><names>
+<uuid uuid="{075D5559-4DA4-416A-AC40-223C475CF5C3}"/><names>
         <name lang="en">Cylinder bellows</name>
         <name lang="fr">Pneuride</name>
         <name lang="pl">Siłownik mieszkowy</name>

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

Re: Add attribut "uuid" for .elmt file.

Vous pouvez m'expliquer un truc avec les uuid ?

Alors voilà, si j'ai bien compris, chaque élément de la collection (et les personnels patchés par le script de Laurent) se voient attribuer un uuid, par définition unique.
J'ai fait l'expérience suivante :
Si je prends un projet complètement vierge et que j'insère 2 reports de folio partants et 2 folios arrivants et que je lie les 2 partants respectivement avec les 2 arrivants, je peux observer dans le xml du projet que les 2 folios partants se voient attribuer des uuid différents alors que c'est le même élément. Ensuite, l'attribut xml <links> montre l'uuid des reports arrivants, eux aussi différents l'un de l'autre alors que ce sont les mêmes éléments.
Donc les éléments recoivent un nouvel uuid lorsqu'ils sont insérés dans le projet, juste ?!?

Et ma question pour d'éventuels développements futurs :
est-ce qu'il suffit d'écrire l'uuid d'un élément lié dans l'attribut xml <links> de l'autre élément pour que la référence croisée s'établisse automatiquement ?

Re: Add attribut "uuid" for .elmt file.

Chaque élément posé sur le schéma à son UUID propre, ça ne change pas et permet de les différencier. Sur leur définition en fin du XML on a ajouté dans leur description un UUID.
Qt peux maintenant enregistrer les chaines d attributs dans l'ordre qu'il veut, ça nous permet de savoir si cet élément existe déjà ou pas dans les schémas lors de l'insertion d'un élément.

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

Re: Add attribut "uuid" for .elmt file.

Revision: 4039
Author:   blacksun
Date:     2015-07-09 20:33:14 +0200 (Thu, 09 Jul 2015)
Log Message:
-----------
QetShapeItem : add handler for modified the geometry of shapes in the diagram

Des poignées permettent de modifier chaque segment d'une basic shape, et non ce n'est pas fait pour dessiner des symboles directement sur les schémas, ni des sapins de noël avant l'heure, après on peux pas vous l'interdire. nomicons/grin

400x303

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."

Re: Add attribut "uuid" for .elmt file.

Revision: 4050
Author:   blacksun
Date:     2015-07-15 18:54:30 +0200 (Wed, 15 Jul 2015)
Log Message:
-----------
QetShapeItem -> handler : handler is draw at the same size at screen, no matter the curent zoom

"Le jour où tu découvres le Libre, tu sais que tu ne pourras jamais plus revenir en arrière..."