Create a FeaturePython object part II/fr

App::FeaturePython vs. Part::FeaturePython
Jusqu'à présent, nous nous sommes concentrés sur les aspects internes d'une classe Python construite autour d'un objet FeaturePython - en particulier, un objet App::FeaturePython object. Nous avons créé l'objet, défini certaines propriétés et ajouté des rappels d'événements au niveau du document qui permettent à notre objet de répondre à un recalcul de document avec la méthode.

Adding a box
Mais nous n'avons toujours pas de boîte.

Then in delete the  statement and add the following line in its place:



Ces commandes exécutent des scripts python fournis avec FreeCAD par défaut.
 * La méthode génère une nouvelle forme de boîte.
 * L'appel englobant à ajoute la forme à l'arborescence du document et la rend visible.

Si FreeCAD est ouvert, rechargez le module boîte et créez un nouvel objet boîte en utilisant (supprimez tous les objets boîte existants, juste pour garder les choses propres).

Cela devrait être assez évident. La boîte elle-même est représentée par un objet entièrement différent de notre objet FeaturePython. La raison en est que crée un objet boîte séparé et l'ajoute au document. En fait, si vous accédez à votre objet FeaturePython et modifiez les dimensions, vous verrez une autre forme de boîte créée et l'ancienne laissée en place. Ce n'est pas bon! De plus, si la vue du rapport est ouverte, vous pouvez remarquer une erreur indiquant 'Les recalculs imbriqués d'un document ne sont pas autorisés'. Cela a à voir avec l'utilisation de la méthode Part.show dans un objet FeaturePython. Nous voulons éviter de faire cela.

top

Fixing the code
Alors, comment pouvons-nous résoudre ce problème?

pour lire:

Pour terminer les modifications dont nous avons besoin, la ligne suivante de la méthode doit être modifiée:

en:



Maintenant, enregistrez vos modifications et revenez à FreeCAD. Supprimez tous les objets existants, rechargez le module de boîte et créez un nouvel objet de boîte.

top

Écrire un ViewProvider
Un fournisseur de vues est le composant d'un objet qui lui permet d'avoir une représentation visuelle dans l'interface graphique - en particulier dans la vue 3D. FreeCAD utilise une structure d'application appelée 'vue du modèle' qui est conçue pour séparer les données (le 'modèle') de sa représentation visuelle (la «vue»). Si vous avez passé du temps à travailler avec FreeCAD en Python, vous en serez probablement déjà conscient grâce à l'utilisation de deux modules Python principaux: FreeCAD et FreeCADGui (souvent aliasés respectivement «App» et «Gui»).

Ainsi, notre implémentation de FeaturePython Box nécessite également ces éléments. Jusqu'à présent, nous nous sommes concentrés uniquement sur la partie «modèle», il est donc temps d'écrire la «vue». Heureusement, la plupart des implémentations de vues sont simples et nécessitent peu d'efforts pour écrire, au moins pour commencer. Voici un exemple de ViewProvider, emprunté et légèrement modifié de

Remarquez dans le code ci-dessus, nous définissons également une icône XMP pour cet objet. La conception d'icônes dépasse le cadre de ce didacticiel, mais les conceptions d'icônes de base peuvent être gérées à l'aide d'outils open source tels que GIMP, Krita et Inkscape. La méthode getIcon est également facultative. S'il n'est pas fourni, FreeCAD fournira une icône par défaut.

Sans un ViewProvider défini, nous devons maintenant l'utiliser pour donner à notre objet la possibilité de la visualisation.

Cette instance de la classe ViewProvider personnalisée lui transmet le ViewObject intégré de FeaturePython. Le ViewObject ne fera rien sans notre implémentation de la classe personnalisée donc, quand la classe ViewProvider s'initialise, elle enregistre une référence à elle-même dans l'attribut ViewObject.Proxy de FeaturePython. De cette façon, lorsque FreeCAD a besoin de rendre notre Box visuellement, il peut trouver la classe ViewProvider pour le faire.

Maintenant, enregistrez les modifications et revenez à FreeCAD. Importez ou rechargez le module Box et appelez.

top

Piégeage d'événements
Jusqu'à présent, nous n'avons pas abordé explicitement le piégeage d'événements. Presque toutes les méthodes d'une classe FeaturePython servent de rappel accessible à l'objet FeaturePython (qui obtient l'accès à notre instance de classe via l'attribut, si vous vous en souvenez).

Voici une liste des rappels pouvant être implémentés dans l'objet FeaturePython de base:

En outre, il existe deux rappels dans la classe ViewProvider qui peuvent parfois s'avérer utiles:


 * Il n'est pas rare de rencontrer une situation où les rappels Python ne sont pas déclenchés comme ils le devraient. Les débutants dans ce domaine doivent être assurés que le système de rappel FeaturePython n'est pas fragile ou cassé. Invariablement, lorsque les rappels ne s'exécutent pas, c'est parce qu'une référence est perdue ou indéfinie dans le code sous-jacent. Si, cependant, les rappels semblent rompre sans explication, la fourniture de références d'objet / proxy dans le rappel (comme indiqué dans le premier tableau ci-dessus) peut atténuer ces problèmes. Jusqu'à ce que vous soyez à l'aise avec le système de rappel, il peut être utile d'ajouter des instructions d'impression dans chaque rappel pour imprimer des messages sur la console comme diagnostic pendant le développement.
 * Il n'est pas rare de rencontrer une situation où les rappels Python ne sont pas déclenchés comme ils le devraient. Les débutants dans ce domaine doivent être assurés que le système de rappel FeaturePython n'est pas fragile ou cassé. Invariablement, lorsque les rappels ne s'exécutent pas, c'est parce qu'une référence est perdue ou indéfinie dans le code sous-jacent. Si, cependant, les rappels semblent rompre sans explication, la fourniture de références d'objet / proxy dans le rappel (comme indiqué dans le premier tableau ci-dessus) peut atténuer ces problèmes. Jusqu'à ce que vous soyez à l'aise avec le système de rappel, il peut être utile d'ajouter des instructions d'impression dans chaque rappel pour imprimer des messages sur la console comme diagnostic pendant le développement.

top

Le code
top