**This is an old revision of the document!** ----
====== Documentation de l'Opener pour développeur ====== Cet article s'adresse à toute personne souhaitant étendre les possibilités de l'Opener. Pour votre bonne compréhension, il est nécessaire d'avoir des connaissances basique en python. ===== Introduction ===== L'opener est un outil ouvert à tous ce qui signifie que vous pouvez l'étendre ou l'adapter selon vos besoins. Le code est structuré de manière à ce que vous puissiez vous repérer à l'aide de cet article. ---- ===== Librairie nécessaire ===== L'addon utilise la librairie Naming qui est chargé de réaliser la nomenclature des différents fichiers/dossiers. Dans notre cas, l'addon l'implémente sous sa forme la plus simple possible. Cette dernière est disponible en téléchargement au lien suivant: [[https://github.com/LesFeesSpeciales/lib.git|{{ :download.png?150 }}]] Dans le cas où vous souhaiteriez développer vos propres outils avec, un guide existe sur le wiki à l'adresse suivante: [[kabaret.naming|Guide naming]]. ---- ===== Structure des fichiers ===== Les fonctions et différentes parties de l'addon sont regroupées dans différents fichiers par catégories. Les différents modules sont les suivants: * **init** : Gère l'initialisation de l'addon, c'est lui qui créer les variables de scène (stockant les chemins,séquences...). * **files** : Gère l'interaction entre l'addon et les fichiers(Listage des dossiers,fichiers avec vérifications...). * **gui** : Ce module est chargé de dessiner la GUI de l'addon dans les tools de blender, si vous souhaitez modifier l'interface de l'addon, cela se passe dans la fonction **naming_panel** de ce module. * **interface** : interface.py fait le pont entre blender, le système de fichier et la librairie naming. C'est ses fonctions qui, avec Naming, génère les chemins. * **operators** : Operator contient tout les opérateur nécessaires à l'addon, parmis eux, certaint on pour fonction d'ouvrir simplement un explorateur de fichier(OBJECT_OT_custompath), etc... (Voir section opérateurs) * **persistence** : Comme son nom l'indique, persistence permet de rendre certains champs de l'interface persistents, c'est-à-dire qu'il va stocker certaines valeur dans des fichers localement. * **ressources** : ressources permet la mise en place de variable globale à tout les module. ---- ===== Fonctions clefs ===== Dans cette partie, nous allons éclaircir le fonctionnement de certaines fonctions clef de l'addon. === a. initSceneProperties === C'est ici que ce déroule l'enregistrement des variables de scènes, nécessaires à toutes sortes de choses. On retrouve par exemple tous les champs, que ce soit la séquence, l'asset ou autre sous forme de variable de scène ici. Cette fonction de divise en deux parties, l'instentiations de variables déstinées à être **dynamiques** ou **statiques**.\\ Ici nous suivrons le code séquentiellement, et donc commencerons par la partie dynamique.\\ Dans Blender, l'actualisation des propriétés de scènes EnumProperty pose toujours problème: il est impossible de les mettres à jour sans les supprimer et les recréer. Ainsi, pour mettre en place les Enum dynamique, j'ai simplement crée une fonction(UpdateEnum) donc l'unique utilité est de supprimer et de recréer les Enum passé en paramètre.\\ Dans le cas de l'Opener, les propriétés dynamique servent à mémoriser les assets,séquences,shots,stores,... ajoutés par l'utilisateur. \\ L'exemple qui suit est juste une partie succinte du code de la fonction initSceneProperties concernant la création de la propriété stockant le(s) répertoires choisi par l'utilisateur.\\ <code python> #DYNAMIC ATTIBS-------------------------------------------------> #Liste contennant toutes les propriétés dynamiques properties = [] #Valeurs par défaut pour la propriété Store(le repertroire racine) drives = (('Store',"Store directory",''),('/u/Project/',"/u/Project/",''),('test2_1',"test2_2",''),('',"",'')) #Création de la sceneProperty vide bpy.types.Scene.drives = EnumProperty(name="none",description="none",items=(('')),update=interface.update_naming) s = len(properties) #Ajout de la propriété pour l'enregistrement ressources.Items.append(('none',"none","")) #Pour chaque propriétés for i in range(s): #Setup store dir if properties[i][0][0] == 'Store': #Dans le cas du store #Si il n'y a pas de fichier persistent déjà existant, on rempli avec les valeurs par défaut if not persistence.load_config(): for line in range(1,len(properties[i])): essources.Items.append((str(properties[i][line][0]),str(properties[i][line][1]),str(properties[i][line][2]))) #On met à jour la variable grâce à la fonction UpdateEnum interface.UpdateEnum(bpy.types.Scene,ressources.Items,properties[i][0][0],properties[i][0][1],ressources.Items[0][0]) </code> <code python> #STATICS ATTIBS-------------------------------------------------> #ROOT-----------------------------> bpy.types.Scene.roots = EnumProperty( name="Root", description="root", items=(('LIB', "LIB", ""), ('MOVIE', "MOVIE", ""), ('', "", "")), default='LIB', update = interface.update_naming) </code> ---- <WRAP center round important 60%> En construction </WRAP>