Opérateur non reconnu --> bouton invisible !

Ici on parle des scripts

Modérateurs : frez, Yadoob, stilobique, Matpi, ModSquad

Opérateur non reconnu --> bouton invisible !

Message par ILYA » 04 Mars 2018, 19:01

Bonjour à vous !

Je modifie un script existant (Gpencil Align 1.0.8), pour ajouter dans le menu deux boutons servant à affecter à une variable la valeur 1 pour l'un des boutons , 0 pour l'autre.
J'y suis pratiquement arrivé. Pour cela j'ai créé un opérateur "perso" dont voici le code :

Code : Tout sélectionner
class ActivationOutil(bpy.types.Operator):
    """Utilité de ce choix:
    - Activer l'outil
    """
   
    bl_idname = "activation"
    bl_label = "Activation"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
       
        mavariable=1

        return {'FINISHED'} 


Cet opérateur dont l'idname est "activation", est appelé à partir d'un ajout que j'ai fait dans le script définissant le panneau. Voici ce que devient le script :

Code : Tout sélectionner
class AlignSelectionToGpencilBUTTON(bpy.types.Panel):
    bl_category = "Retopology"
    bl_label = "Gpencil Align"
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"

    def draw(self, context):
        layout = self.layout
        scn = context.scene
       
        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.label("Activation de l'outil :")
       
        row_sw = layout.row(align=True)
        row_sw.alignment = 'EXPAND'
        row_sw.operator("activation", "variable = 1")     
       
        row_sw = layout.row(align=True)
        row_sw.alignment = 'EXPAND'
        row_sw.operator("mesh.flip_normals", "variable = 0")     
       
        layout.operator("bear.align_to_gpencil")


L'ajout commence avec la ligne " scn = context.scene", et finit avec la ligne "row_sw.operator("mesh.flip_normals", "variable = 0")".

Pour tester mon script, j'ai affecté au bouton "variable = 0" une commande quelconque, et ça marche.

Par contre, pas moyen d'obtenir l'affichage du bouton "variable = 1", mon opérateur "activation" est manifestement ignoré !
Voilà en effet ce que j’obtiens comme affichage :

Image

Je sèche piteusement... Sauriez-vous me corriger ce que j'ai rédigé ?

Merci !

ILYA
D'un monde 3D à un autre...
ILYA
Avatar de l’utilisateur
ILYA
 
Message(s) : 69
Inscription : 18 Oct 2017, 09:39

Re: Opérateur non reconnu --> bouton invisible !

Message par stilobique » 06 Mars 2018, 09:14

Si ton operator fonctionne tu peut l'apeller dans la bar de recherche via son ID Name. Si tu le trouve l'erreur est donc dans ton UI.
Avatar de l’utilisateur
stilobique
 
Message(s) : 1367
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Opérateur non reconnu --> bouton invisible !

Message par ILYA » 06 Mars 2018, 15:35

stilobique a écrit :Si ton operator fonctionne tu peut l'apeller dans la bar de recherche via son ID Name. Si tu le trouve l'erreur est donc dans ton UI.

Bonjour stilobique !

Merci de me venir en aide ! Entre temps, j'ai résolu en partie ma difficulté, qui tenait à un "bête" défaut de syntaxe... C'est sans doute connu de tous, mais pour ma part j'ignorais que l'idname d'un opérateur doit être de la forme "truc.machin", alors que dans l'extrait que j'ai posté c'était par exemple "activation".
J'ai donc modifié mes deux opérateurs qui ont maintenant cette syntaxe :

Code : Tout sélectionner
# =============================================================================================
# ============= Ajout pour activer/désactiver Gpencil Align ===================================

class InitialisationOutil(bpy.types.Operator):
    """Utilité de ce choix:
    - activation de l'outil
    """
   
    bl_idname = "gpencilalign.lancement"
    bl_label = "Initialisation Gpencil Align"
    bl_options = {'REGISTER', 'UNDO'}

    @classmethod
    def poll(cls, context):
        return True
   
    def execute(self, context):
        MaVariableGpencilAlign = 1
        return {'FINISHED'}

class InhibitionOutil(bpy.types.Operator):
    """Utilité de ce choix:
    - désactivation de l'outil
    """
   
    bl_idname = "gpencilalign.fermeture"
    bl_label = "Inhibition Gpencil Align"
    bl_options = {'REGISTER', 'UNDO'}

    @classmethod
    def poll(cls, context):
        return True
   
    def execute(self, context):
        MaVariableGpencilAlign = 0
        return {'FINISHED'}
# ==============   Fin de l'ajout ===================================

... et du coup, ça marche, les deux boutons s'affichent :

Image

Ça marche... enfin, presque !

il me reste un "ultime" obstacle à lever : cliquer sur les deux boutons, ce qui devrait donner à une variable nommée "MaVariableGpencilAlign" la valeur 1 ou 0, n'affecte pas le résultat du test que j'ai ajouté à la fin du script de cette définition de class :

Code : Tout sélectionner
class AlignSelectionToGpencilBUTTON(bpy.types.Panel):
    bl_category = "Retopology"
    bl_label = "Gpencil Align"
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"

    def draw(self, context):
        layout = self.layout
        scn = context.scene
 
        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.label("Activation de l'outil :")

        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.operator("gpencilalign.lancement", "Gpencil Align actif")
       
        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.operator("gpencilalign.fermeture", "Gpencil Align inactif")       
     
        if(MaVariableGpencilAlign == 1):
            layout.operator("bear.align_to_gpencil")

Ce qui me le fait penser, c'est qu'en tout début de script de l'outil Gpencil Align, j'ai ajouté une définition de la variable "MaVariableGpencilAlign", comme ceci :

Code : Tout sélectionner
bl_info = {
    "name": "Align Selection To Gpencil Stroke",
    "description": "Align selection to a grease pencil stroke. Hold SHIFT and double-click LEFT MOUSE to execute.",
    "author": "Bjørnar Frøyse",
    "version": (1, 0, 8),
    "blender": (2, 7, 6),
    "location": "3D View > Tool Shelf > Retopology",
    "warning": "",  # used for warning icon and text in addons panel
    "wiki_url": "",
    "tracker_url": "",
    "category": "Mesh"}


import bpy
from bpy_extras import view3d_utils
import bmesh
import mathutils
from bpy.props import FloatProperty, BoolProperty
import math

MaVariableGpencilAlign = 1

... et quel que soit l'usage des deux boutons (et par exemple le 2ème !), le test :

if(MaVariableGpencilAlign == 1):
layout.operator("bear.align_to_gpencil")

... est toujours positif, l'opérateur "bear.align_to_gpencil" est exécuté...

Pour tout dire, je me demande si vraiment le clic sur l'un ou l'autre des deux boutons modifie la valeur de "MaVariableGpencilAlign", faute de savoir comment faire pour afficher sa valeur à titre de contrôle... Saurais-tu comment faire ? Ça me serait grandement utile pour vérifier que mes boutons ont un effet réel !

C'est mal dit ce qui suit, mais j'ai l'impression que la valeur de la variable "MaVariableGpencilAlign" n'est pas "reconnue", elle n'est pas prise en compte malgré l'utilisation des deux boutons... et je ne sais pas comment faire pour que ce soit le cas !

Merci de ton aide, et excuse ce message copieux, je ne sais pas comment expliquer la difficulté plus succinctement...

ILYA
D'un monde 3D à un autre...
ILYA
Avatar de l’utilisateur
ILYA
 
Message(s) : 69
Inscription : 18 Oct 2017, 09:39

Re: Opérateur non reconnu --> bouton invisible !

Message par stilobique » 06 Mars 2018, 16:57

Lance Blender avec la console (cherche sur le net tu trouvera des tonnes de solution pour windows), ajoute des prints dans ton code tu verra le resultat des variables.
Avatar de l’utilisateur
stilobique
 
Message(s) : 1367
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Opérateur non reconnu --> bouton invisible !

Message par ILYA » 06 Mars 2018, 19:17

stilobique a écrit :... ajoute des prints dans ton code tu verra le resultat des variables.

OK stilobique !

Avec des "print" là où c'est utile, je vérifie que mes boutons ont bien fonctionné, donnant à la variable "MaVariableGpencilAlign" la valeur 1 ou 0 selon le bouton :

Image

... mais comme le montre la console, cela n'a pas d'impact sur le class qui déclenche le fonctionnement de Gpencil Align (class AlignSelectionToGpencilBUTTON). Le test que j'y ai ajouté est toujours validé comme le montre aussi la console !
Je sais pourquoi, c'est logique mais je ne sais pas comment contourner l'obstacle. En effet, le script de l'outil Gpencil Align est lancé à chaque action quelconque effectuée dans la vue 3D.
Or, comme je le disais dans le message précédent, j'ai ajouté une ligne au début du script, pour déclarer la variable "MaVariableGpencilAlign" :

Code : Tout sélectionner
bl_info = {
    "name": "Align Selection To Gpencil Stroke",
    "description": "Align selection to a grease pencil stroke. Hold SHIFT and double-click LEFT MOUSE to execute.",
    "author": "Bjørnar Frøyse",
    "version": (1, 0, 8),
    "blender": (2, 7, 6),
    "location": "3D View > Tool Shelf > Retopology",
    "warning": "",  # used for warning icon and text in addons panel
    "wiki_url": "",
    "tracker_url": "",
    "category": "Mesh"}


import bpy
from bpy_extras import view3d_utils
import bmesh
import mathutils
from bpy.props import FloatProperty, BoolProperty
import math

MaVariableGpencilAlign = 1

... donc, fatalement, à chaque exécution du script ma variable vaut 1, et donc l'action des boutons est sans effet !

D'un autre coté, supprimer la ligne "MaVariableGpencilAlign = 1" en début de script génère une erreur, cette variable est non déclarée :

Image

Ce que je ne sais pas faire, c'est "déclarer" une variable pour qu'elle soit utilisable dans le script, mais SANS lui affecter de valeur "d'office", les instructions de script s'en chargeant avec mes deux boutons...
Comment peut-on faire ça ?

Je crois que ça résume ce que j'ai (trop... ?) longuement développé ci-dessus ?

Merci !

ILYA
D'un monde 3D à un autre...
ILYA
Avatar de l’utilisateur
ILYA
 
Message(s) : 69
Inscription : 18 Oct 2017, 09:39

Re: Opérateur non reconnu --> bouton invisible !

Message par stilobique » 07 Mars 2018, 09:20

Il faut simplement que ton operator contienne une value par default. Enfin, dans l'appel de ton operator -au niveau de ton UI- tu aura soit un boutton type boolean pour donner une value 0/1 ou un boutton avec texte mais une data en plus.
Avatar de l’utilisateur
stilobique
 
Message(s) : 1367
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Opérateur non reconnu --> bouton invisible !

Message par ILYA » 07 Mars 2018, 09:51

stilobique a écrit :...tu aura soit un boutton type boolean pour donner une value 0/1 ou un boutton avec texte mais une data en plus.

Bonjour stilobique,

Je pense que j'applique bien ton topo ? C'est ce que je suppose correspondre à ton propos, puisque dans le panneau T, je dispose bien des 2 boutons avec texte (cf copies écran précédentes), dont l'usage modifie ma variable pour lui donner la valeur 1 ou 0 comme je l'ai vérifié.

Mais, et pour "triturer" sans cesse le script, j'ai l'intuition que l'affectation d'une valeur à ma variable, effectuée au sein d'un opérateur class, tel que "class AlignSelectionToGPencil(bpy.types.Operator)" par exemple, n'est pas prise en compte par les autres opérateurs. Cette modification reste en quelque sorte "ponctuelle", locale, elle n'est pas "propagée", partagée par les autres opérateurs...
C'est ce que je vérifie en "pistant" la valeur de ma variable grâce aux "print" qui m'aident bien grâce à toi !

Si je peux "visualiser" ce que je crois intuiter, il faudrait que si j'affecte une valeur changeante à ma variable dans un opérateur "A", tout autre opérateur "X" dont l'exécution est conditionnée par cette valeur de variable, via un test, en tienne compte en "connaissant" la valeur actualisée de la variable. En quelque sorte, il faudrait que la variable ait une influence globale et pas "locale"... j'espère que je m'explique à peu près clairement !
Comment peut-on "globaliser" l'effet d'un choix de valeur d'une variable, c'est peut-être ça qui résume mon propos ?

Merci !

ILYA
D'un monde 3D à un autre...
ILYA
Avatar de l’utilisateur
ILYA
 
Message(s) : 69
Inscription : 18 Oct 2017, 09:39

Re: Opérateur non reconnu --> bouton invisible !

Message par stilobique » 07 Mars 2018, 14:04

Je suis au travail et je ne fait pas de python en ce moment donc j'ai pas de reponse technnique precise -dsl je suis aussi avec un clavier anglais :) .
J'ai deja fait des bouttons pour mettre un operator dans certaine situation -c'est le cas dans mon addons Substance Bridge.

Un rapide exemple :
Code : Tout sélectionner
name = "Export New Project" # Nom a affiche sur mon UI
ops = "substance.painter_export" # ID Name de mon operator
layout.operator(ops, name).project = False # Call de mon operator avec le parametre project


Du cote de l'operator :
Code : Tout sélectionner
class SendToPainter(bpy.types.Operator):
    """Export your mesh to Substance Painter"""
    bl_idname = "substance.painter_export"
    bl_label = "Send mesh to painter export"

    project = BoolProperty(name="It's a new project.") # Ma variable generer dans l'operator avec un type, ici boolean
    painter = StringProperty(name="Path Substance Painter")
    update = BoolProperty(
        default=False,
        name="Variable de test, update or not"
        )

    path_project = StringProperty(name="Path Substance project")

def execute(self, context):
    [...]
                    if self.project is True: # Test sur ma variable si le resultat est par defaut ou change
                        self.path_project = path_sppfile

Voila, j'ai pas le temps d'etre plus explicite, mon code n'est en plus pas tres propre :/ .
Avatar de l’utilisateur
stilobique
 
Message(s) : 1367
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Opérateur non reconnu --> bouton invisible !

Message par ILYA » 07 Mars 2018, 16:41

stilobique a écrit :Je suis au travail....

Merci beaucoup à toi pour ton aide, ta disponibilité (désolé patron !)... et ta patience !
OK, je regarde attentivement ton code pour m'en inspirer, merci !

ILYA
D'un monde 3D à un autre...
ILYA
Avatar de l’utilisateur
ILYA
 
Message(s) : 69
Inscription : 18 Oct 2017, 09:39

Re: Opérateur non reconnu --> bouton invisible !

Message par ILYA » 12 Mars 2018, 11:48

ILYA a écrit :... OK, je regarde attentivement ton code pour m'en inspirer, merci !

Bonjour stilobique,

Je me suis penché sur ton script, ce qui m'a incité à créer un script à mon tour, de toute pièce, plutôt que "bidouiller" un script existant en essayant d'y ajouter une "verrue" perso.
Ce que j'ai construit a le but "simple" d'incrémenter une variable à chaque fois qu'on clique sur un bouton.
Je n'ai plus le pb du bouton invisible, plus d'erreur de script, mais l'incrémentation ne marche qu'une fois.
Vu que le pb est tout autre, je vais l'évoquer dans un autre fil de discussion. Cela me semble plus organisé, du moins je l'espère !

Encore merci !

ILYA
D'un monde 3D à un autre...
ILYA
Avatar de l’utilisateur
ILYA
 
Message(s) : 69
Inscription : 18 Oct 2017, 09:39


Retour vers Scripts - Python - OSL

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Bing [Bot] et 2 invité(s)