[PYTHON] suspendre la prise en compte des modifications

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
tarassboulba
Posts: 10
Joined: Wed Nov 14, 2012 10:59 am

[PYTHON] suspendre la prise en compte des modifications

Post by tarassboulba »

Bonjour,
Je suis nouveau dans l'usage de FreeCAD et de python.
Je cherche le moyen de court-circuiter la prise en compte des modifications pendant le traitement de onChanged.

Dans la méthode "def onChanged(self, fp, prop):"
Je veux suspendre toute prise en compte de modifications jusqu'à la fin du traitement du onChanged pour l'intégralité du document.

Le problème se pose lorsque une propriété est modifiée par l'utilisateur.
Dans la méthode onChanged je veux aller modifier quelques autres propriétés d'autres objets.
Puis et seulement à la toute fin de onChanged prendre en compte toutes les modifications.
Merci

Edit1 : Pour ceux qui comprendrait la langue de Dickens la demande a aussi été posté en anglais sur le fil /free-cad/viewtopic.php?f=3&t=3926 J'essairais autant que possible de mettre à jour les éléments dans les deux langues!
Edit2 : Quoi? il n'y a pas de section du forum en espéranto ?
Last edited by tarassboulba on Thu Apr 11, 2013 9:39 pm, edited 1 time in total.
User avatar
yorik
Founder
Posts: 13660
Joined: Tue Feb 17, 2009 9:16 pm
Location: Brussels
Contact:

Re: [PYTHON] suspendre la prise en compte des modifications

Post by yorik »

Je ne comprends pas très bien quel est ton problème... la méthode onChanged est lancée chaque fois qu'une propriété est modifiée. Dedans, tu fais ce que tu veux, rien du tout si tu veux... Si tu veux qu'elle attende que plusieurs modifications soient faites avant de faire quelque chose, tu dois organiser ça toi-même, par exemple stocke les propriétés modifiées dans une liste, avec leurs nouvelles valeurs, et processe toute la liste en une fois... Mais je ne sais pas comment tu vas pouvoir décider a quel moment exécuter la liste.

Une autre possibilité est de laisser l'utilisateur faire ça manuellement. Tu ne fais rien dans onChanged(), mais tu fais tout dans execute(). La méthode execute() est lancée seulement a la création de l'objet, quand l'utilisateur clique sur "Recompute", ou quand en python on fait ActiveDocument.recompute()
tarassboulba
Posts: 10
Joined: Wed Nov 14, 2012 10:59 am

Re: [PYTHON] suspendre la prise en compte des modifications

Post by tarassboulba »

[ Me voilà dans de beaux draps avec deux fils de discussions sur le même sujet mais dans deux langues différentes ! ]

Traduction de la réponse en anglais de wmayer » Thu Apr 11, 2013 7:04 pm
Le problème se pose lorsque une propriété est modifiée par l'utilisateur.[Dans l'interface]
Dans la méthode onChanged je veux aller modifier quelques autres propriétés d'autres objets.
[Le résultat est des boucles imbriquées et des performances déplorables]....
En général la méthode onChanged() ne touche à aucune autre propriété. Il y a peu de cas ou c'est le cas et alors seulement pour garder les valeurs synchronisées. Et la méthode onChanged() ne touche jamais à aucun autre objet.

Le comportement de la méthode onChanged() est la suivante:
Vous devez faire clairement la distinciton entre les objets data [App] et view [GUI]

I. Pour les objets du document [App]:
1. Une propriété informe "l'objet du document" son parent. La propriété est associé à la valeur "touched". [ie: is set to ]
2. L'objet du document ( pourrait se charger directement de la modification mais le fait seulement dans un petit nombre de cas et ) informe le document. L'objet du document est associé à la valeur "touched". [ie: is set to ]
3. Le document dans App informe the document dans GUI ( Graphic User Interface = L'interface graphique utilisateur )
4. Le document dans GUI se saisie de la vue=l'afficheur [view provider] de l'objet du document et lui applique les modifications de propriétés. La vue=l'afficheur [view provider] prend éventuellement en charge la modification.

II. Pour l'afficheur: [GUI]
Si une propriété de l'afficheur à été modifié alors seule la méthode onChanged() est appelé.

Actuellement aucun mécanisme n'est chargé de bloquer les notifications. La plus simple des solutions consisterait à bloquer le document App de façon à l'empécher d'informer le document GUI. C'est la que vous pourriez gagner le plus de temps.

Une autre amélioration de performance serait de désactiver [switch off] le mécanisme de annuler/rétablir [undo/redo] ce qui épargnerait beaucoup de mémoire ( et de temps).

[Mon Résumé de la réponse de wmayer]
I. Si APP.Le_document.L_objet_parent.LaPropriété est modifiée : cela déclenche la cascade
1. L_objet_parent -> LaPropriété - "Touched"
2. APP.Le_document -> L_objet_parent - "Touched"
3. APP.Le_document -> GUI.Le_document
4. GUI.Le_document -> Modifie la vue de L_objet_parent

II. Si GUI.LaPropriété est modifiée : cela déclenche la cascade
1. LaPropriété -> appel de onChanged
Post Reply