[PYTHON] Comment créer un sous-menu avec le plug-in [Blender]

Dans le précédent Post, j'ai expliqué comment créer un plug-in Blender avec un simple exemple de code. Cette fois, je vais vous expliquer comment créer un sous-menu (sur l'arborescence). Il peut y avoir des erreurs car il y a peu d'informations pour créer un sous-menu et c'est le résultat d'essais et d'erreurs.

Menu normal

Du précédent Post, seule la partie qui crée le menu est extraite.

menu_1.py


#menu
class CHoge(bpy.types.Operator):
    
    bl_idname = "uv.hoge"               #Nom de l'ID
    bl_label = "Hoge Menu"              #Chaîne de caractères affichée dans le menu
    bl_description = "Hoge Piyo"        #Description affichée dans le menu
    bl_options = {'REGISTER', 'UNDO'}

    #Le processus que le plug-in exécute réellement le processus
    def execute(self, context):
        return {'FINISHED'}             #Renvoie FINISHED en cas de succès

#Fonction pour enregistrer un menu
def menu_func(self, context):
    self.layout.operator("uv.hoge")     #"Bl" de la classe à laquelle vous souhaitez vous inscrire_Spécifiez "idname"

#Que se passe-t-il lorsque vous installez le plug-in
def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.append(menu_func)

Menu secondaire (dans l'arborescence)

Voici un exemple de code simple pour créer un sous-menu. La structure du menu affiché est "Hoge Menu" - "Hoge Sub Menu".

submenu_1.py


#Sous-menu
class SubMenu(bpy.types.Operator):
    bl_idname = "uv.hoge_sub"
    bl_label = "Sub Hoge Menu"
    out_text = bpy.props.StringProperty()

    def execute(self, context):
        self.report({'INFO'}, self.out_text)
        return {'FINISHED'}

#Menu principal
class Menu(bpy.types.Menu):
    bl_idname = "uv.hoge"
    bl_label = "Hoge Menu"
    bl_description = "Hoge Piyo"

    def draw(self, context):
        layout = self.layout
        #Enregistrement du sous-menu + enregistrement de la chaîne de caractères de sortie
        layout.operator(SubMenu.bl_idname).out_text = "Sub Hoge Menu"

#Enregistrez-vous dans le menu affiché lorsque vous appuyez sur «U» en mode Édition (bpy).types.VIEW3D_MT_uv_map.append(menu_func)Appelé de)
def menu_func(self, context):
    self.layout.separator()            #Enregistrer le séparateur dans le menu
    self.layout.menu(Menu.bl_idname)

#enregistrement
def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.append(menu_func)

Commentaire

Classe de sous-menu

La classe submenu est fondamentalement la même que la classe utilisée pour créer un menu normal et hérite de la classe bpy.types.Operator. En guise de confirmation, ajoutons une variable appelée out_text dans le sous-menu afin que out_text soit affiché lorsque le menu est exécuté.

submenu_2.py


#Sous-menu
class SubMenu(bpy.types.Operator):
    bl_idname = "uv.hoge_sub"
    bl_label = "Sub Hoge Menu"
    out_text = bpy.props.StringProperty()

    def execute(self, context):
        self.report({'INFO'}, self.out_text)
        return {'FINISHED'}

Classe du menu principal

Puisque le menu principal doit créer un menu dans l'arborescence, il hérite de la classe bpy.types.Menu. De plus, le menu principal n'a pas besoin de réfléchir à ce qui se passe lorsqu'il est sélectionné et la méthode d'exécution n'est pas nécessaire. Au lieu de cela, vous devez ajouter une méthode de dessin pour afficher le menu. Dans la méthode draw, un sous-menu est enregistré en remplaçant bl_idname de la sous-classe de bpy.types.Operator par l'argument de layout.operator, et une chaîne de caractères est affectée à la variable membre out_text du sous-menu enregistré. Je suis.

submenu_3.py


#Menu principal
class Menu(bpy.types.Menu):
    bl_idname = "uv.hoge"
    bl_label = "Hoge Menu"
    bl_description = "Hoge Piyo"

    def draw(self, context):
        layout = self.layout
        #Enregistrement du sous-menu + enregistrement de la chaîne de caractères de sortie
        layout.operator(SubMenu.bl_idname).out_text = "Sub Hoge Menu"

enregistrement

La partie enregistrement est presque la même que la partie normale, mais le menu_func appelé depuis la fonction spécifiée dans l'argument de bpy.types.VIEW3D_MT_uv_map.append a été modifié. Cela n'a rien à voir avec la création d'un sous-menu, mais vous pouvez ajouter un menu séparé en exécutant la fonction self.layout.separator. Cela le distingue clairement des autres menus et facilite la compréhension des menus ajoutés en installant le plug-in. Vous pouvez enregistrer le menu dans l'arborescence en passant le bl_idname de la classe dérivée de bpy.types.Menu comme argument de la fonction self.layout.menu.

submenu_4.py


#Enregistrez-vous dans le menu affiché lorsque vous appuyez sur «U» en mode Édition (bpy).types.VIEW3D_MT_uv_map.append(menu_func)Appelé de)
def menu_func(self, context):
    self.layout.separator()            #Enregistrer le séparateur dans le menu
    self.layout.menu(Menu.bl_idname)

#enregistrement
def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.append(menu_func)

Exemple de plug-in

Voici le code de l'exemple de plug-in qui fonctionne réellement, résumant le contenu ci-dessus.

submenu.py


#Requis pour accéder à la structure de données dans Blender
import bpy

#Informations sur le plug-in
bl_info = {
    "name" : "Hoge Plugin",             #Nom du plugin
    "author" : "Piyo",                  #auteur
    "version" : (0,1),                  #Version du plugin
    "blender" : (2, 6, 5),              #Version Blender sur laquelle fonctionne le plug
    "location" : "UV Mapping > Hoge",   #Positionnement des plug-ins dans Blender
    "description" : "Hoge Fuga Piyo",   #Description du plugin
    "warning" : "",
    "wiki_url" : "",                    #URL de la page Wiki où se trouve la description du plugin
    "tracker_url" : "",                 #URL du fil de discussion de l'organisation du développeur Blender
    "category" : "UV"                   #Nom de la catégorie du plugin
}

#Sous-menu
class SubMenu(bpy.types.Operator):
    bl_idname = "uv.hoge_sub"
    bl_label = "Sub Hoge Menu"
    out_text = bpy.props.StringProperty()

    def execute(self, context):
        self.report({'INFO'}, self.out_text)
        return {'FINISHED'}

#Menu principal
class Menu(bpy.types.Menu):
    bl_idname = "uv.hoge"
    bl_label = "Hoge Menu"
    bl_description = "Hoge Piyo"

    def draw(self, context):
        layout = self.layout
        #Enregistrement du sous-menu + enregistrement de la chaîne de caractères de sortie
        layout.operator(SubMenu.bl_idname).out_text = "Sub Hoge Menu"

#Enregistrez-vous dans le menu affiché lorsque vous appuyez sur «U» en mode Édition (bpy).types.VIEW3D_MT_uv_map.append(menu_func)Appelé de)
def menu_func(self, context):
    self.layout.separator()            #Enregistrer le séparateur dans le menu
    self.layout.menu(Menu.bl_idname)

#enregistrement
def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.append(menu_func)

#Que se passe-t-il lorsque vous désinstallez le plug-in
def unregister():
    bpy.utils.unregister_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.remove(menu_func)

#Fonction principale
if __name__ == "__main__":
    register()

Comment exécuter l'exemple de plug-in

Exploitons en fait l'exemple de plug-in ci-dessus. Suivez les étapes ci-dessous pour installer le plug-in. La procédure d'installation est également décrite sur la page Blender Wiki. http://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Extensions/Python/Add-Ons

  1. Sélectionnez Préférences utilisateur de fichier
  2. Sélectionnez l'onglet Addons
  3. Appuyez sur le bouton "Installer à partir d'un fichier ..."
  4. Sélectionnez le plug-in que vous souhaitez installer
  5. Cochez la case en regard du plug-in installé
  6. Appuyez sur "U" dans "Mode d'édition"
  7. Confirmez que "Hoge Menu" est un menu arborescent.
  8. Cliquez sur "Hoge Menu" - "Sub Hoge Menu" pour exécuter le processus ("Sub Hoge Menu" est affiché dans le journal).

Résultat d'exécution

Affichage du menu en forme d'arbre

20141118230248.jpg

Résultat de l'exécution du "Sous-menu Hoge"

20141118230358.jpg

Les références

Recommended Posts

Comment créer un sous-menu avec le plug-in [Blender]
[Blender] Comment créer un plug-in Blender
Procédure de création d'application multi-plateforme avec kivy
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Comment créer un package Conda
Comment créer un pont virtuel
Comment créer un Dockerfile (basique)
Comment créer un fichier de configuration
Probablement le moyen le plus simple de créer un pdf avec Python 3
Comment créer un maillage de flux autour d'un cylindre avec SnappyHexMesh
Une histoire sur la façon de traiter le problème CORS
[Blender] Comment définir shape_key avec un script
Comment créer un clone depuis Github
Comment créer un dossier git clone
Comment ajouter un package avec PyCharm
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Comment créer une étiquette (masque) pour la segmentation avec labelme (masque de segmentation sémantique)
Créez un système stellaire avec le script Blender 2.80
Comment créer un référentiel à partir d'un média
Comment écrire une docstring pour créer un document tuple nommé avec sphinx
Créez une image diabolique avec le script de Blender
Comment envoyer une requête à l'API DMM (FANZA) avec python
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Comment créer une API de machine learning sans serveur avec AWS Lambda
Réfléchissez à la façon d'écrire un filtre avec les versions Shotgun API-Contact
[Python] Explique comment utiliser la fonction range avec un exemple concret
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
Comment réparer la population initiale avec un algorithme génétique utilisant DEAP
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
[Environnement de développement] Comment créer un ensemble de données proche de la base de données de production
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
3. Traitement du langage naturel avec Python 1-2. Comment créer un corpus: Aozora Bunko
Comment créer des exemples de données CSV avec hypothèse
Comment lire un fichier CSV avec Python 2/3
Comment envoyer un message à LINE avec curl
Comment dessiner un graphique à 2 axes avec pyplot
Comment créer un objet fonction à partir d'une chaîne
Comment développer une application de panier avec Django
Comment créer un fichier JSON en Python
Comment créer un dictionnaire avec une structure hiérarchique.
Comment essayer l'algorithme des amis d'amis avec pyfof
Comment créer un plug-in QGIS (génération de package)
Étapes pour créer un bot Twitter avec Python
Je souhaite créer un type d'implémentation pouvant être branché
Enregistrer l'objet dans un fichier avec pickle
[Note] Comment créer un environnement de développement Ruby
Comment créer une boîte de saisie Kivy 1 ligne
Comment créer une API Rest dans Django
Comment entraîner Kaldi avec JUST Corpus
Créez une commande pour obtenir le journal de travail
Créez un outil de traduction avec Translate Toolkit
[Note] Comment créer un environnement de développement Mac
Comment créer des nombres aléatoires avec le module aléatoire de NumPy