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 ?
[PYTHON] suspendre la prise en compte des modifications
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Be nice to others! Read the FreeCAD code of conduct!
-
- Posts: 10
- Joined: Wed Nov 14, 2012 10:59 am
[PYTHON] suspendre la prise en compte des modifications
Last edited by tarassboulba on Thu Apr 11, 2013 9:39 pm, edited 1 time in total.
Re: [PYTHON] suspendre la prise en compte des modifications
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()
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()
-
- Posts: 10
- Joined: Wed Nov 14, 2012 10:59 am
Re: [PYTHON] suspendre la prise en compte des modifications
[ 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 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
Traduction de la réponse en anglais de wmayer » Thu Apr 11, 2013 7:04 pm
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 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]....
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