Incrémenter une variable à chaque clic sur un bouton ?

Ici on parle des scripts

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

Incrémenter une variable à chaque clic sur un bouton ?

Message par ILYA » 12 Mars 2018, 12:07

Bonjour à vous !

J'essaie... en vain... de rédiger un script ayant pour but d'incrémenter une variable à chaque fois qu'on clique sur un bouton.
Ça paraît simple dit comme ça, mais en pratique je ne m'en sors pas !
Mon script ajoute un onglet dans le panneau "T", rubrique "Tools". Un bouton d'incrémentation permet d'augmenter de 1 la valeur d'une variable (globale, je suppose ?) nommée "mavariable", définie et initialisée à 0.

J'ai parsemé le script de "mouchards" print. Cela me permet de voir dans la console que l'incrémentation ne marche que la première fois, "mavariable" passe bien de 0 à 1.
Mais au prochain clic sur le bouton, la fonction d'incrémentation "oublie" sa valeur actuelle et réutilise la valeur initiale à mon grand dépit !

Comment corriger ce script pour enfin voir "mavariable" grandir de 1 à chaque clic sur le bouton ?

Voilà le script que j'ai défini :

Code : Tout sélectionner
bl_info = {
    "name": "Variable globale",
    "category": "Object",
    "author": "ILYA 2018",
    "version": (1, 0, 0),
    "blender": (2, 7, 9),
    "location": "Barre espace > Search > perso, onglet Tools du panneau T",
    "description": "créer et utiliser une variable partagée entre opérateurs",
}

import bpy

print ("------------------------------------------")
print ("le script VariableGlobale est actif")
print ("------------------------------------------")

mavariable = 0 # a priori, a le sens d'une variable GLOBALE

def increment():
    v1 = mavariable # affecte à la variable LOCALE v1 (car définie dans une fonction), la valeur de la variable GLOBALE mavariable
    # calcul avec la variable LOCALE v1
    print ("------------------------------------------")
    print ("utilisation de la fonction increment, mavariable vaut : ", mavariable)
    print ("------------------------------------------")
    return v1 + 1


class VariableGlobale(bpy.types.Operator):
    """Création et utilisation d'une variable globale"""      # Use this as a tool-tip for menu items and buttons.
    bl_idname = "operator.variable"        # Unique identifier for buttons and menu items to reference : libellé pour le paramètre "Name" d'un nouveau racccourci (onglet Input des préférences utilisateur)
    bl_label = "PERSO Utilisation d'une variable globale"         # Display name in the interface.
    bl_options = {'REGISTER', 'UNDO'}  # Enable undo for the operator.

    print ("------------------------------------------")
    print ("l'operator VariableGlobale est actif")
    print ("------------------------------------------")
   
    print ("*************************************************")   
    print ("valeur INITIALE de ma variable = ", mavariable)
    print ("*************************************************") 
   
    def execute(self, context):        # execute() is called when running the operator.

        mavariable = increment()
       
        print ("*************************************************")   
        print ("valeur de ma variable suite au passage par increment = ", mavariable)
        print ("*************************************************") 
       
        return {'FINISHED'}            # Lets Blender know the operator finished successfully.
      
class PartageVariable(bpy.types.Panel):
    """Partage de variable entre opérateurs"""
    bl_label = "Variable en partage"
    bl_idname = "PanneauPerso"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
    bl_category = 'TOOLS'

    def draw(self, context):
        layout = self.layout
        scn = context.scene

        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.label("Incrémentation de la valeur de ma variable :")
       
        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.operator("operator.variable", "Variable augmente de 1") # nom de l'opérateur nécessaire

       
      

def register():
    bpy.utils.register_class(VariableGlobale)
    bpy.utils.register_class(PartageVariable)

def unregister():
    bpy.utils.unregister_class(VariableGlobale)
    bpy.utils.unregister_class(PartageVariable)

# This allows you to run the script directly from blenders text editor
# to test the add-on without having to install it.
if __name__ == "__main__":
    register()
   


Merci de m'aider à "déverminer" ce script !

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

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par stilobique » 12 Mars 2018, 17:33

Hum, dans mes souvenir tu cherche a "allumer/eteindre" un bouton, pourquoi faire une incrementation et pas un boolean ?

J'ai regarde rapidement ton scrip mais je n'ai pas teste, je fait sa se soir.

Rapidement un peut de lecture pour t'aider.
* https://b3d.interplanety.org/en/variabl ... r-classes/
* https://b3d.interplanety.org/en/creatin ... er-add-on/
Avatar de l’utilisateur
stilobique
 
Message(s) : 1365
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par ILYA » 12 Mars 2018, 20:18

stilobique a écrit :Hum, dans mes souvenir tu cherche a "allumer/eteindre" un bouton...

Plus exactement, je cherchais comment allumer/éteindre, ou plutôt comment activer/désactiver un outil (en l'occurence Gpencil Align 1.0.8), à l'aide d'un bouton "on" et d'un bouton "off".
Ceci car cet outil était parasité par l'utilisation d'un autre outil, à savoir Bsurfaces... un peu bizarre tout ça...

Je m'en suis sorti, non pas en "tripotant" le script de Gpencil Align, mais en utilisant une version antérieure disponible, la 1.0.1, qui ne présente pas ce "bémol".
Donc en quelque sorte ce problème est résolu de façon "hard" : remplacement de version, plutôt que de façon "soft" : via une modif du script... qui m'a amené à chercher comment faire pour qu'un opérateur "A" utilise une variable modifiée par un autre opérateur (ou une fonction) "B", si je résume ce sujet précédent que tu as bien en mémoire !

Comme je n'y suis pas arrivé, et que j'ai le défaut/qualité (?) de ne pas me satisfaire d'un échec, je cherche comment écrire le script de "passage" de valeur entre opérateurs et fonctions.

Pour çà, au lieu de m'attaquer à la modif d'un script existant qui n'est pas mien et pas bien compréhensible, je cherche la réponse en partant de "0" : on efface tout et on recommence !
Je prends comme nouveau "sujet" de réflexion celui, différent sur sa finalité et surtout le plus simple possible, consistant à faire qu'à chaque clic sur un bouton cela déclenche un opérateur qui appelle une fonction ayant pour but d'incrémenter une variable. Tout simplement... en théorie !

Là où je bute, et c'est bien comme dans le cas du sujet précédent, c'est qu'entre l'opérateur ("VariableGlobale") et la fonction ("increment"), il n'y a pas de "communication" : ce que fait l'un n'est pas pris en compte par l'autre, comme tu le verras en "jouant" mon script (sans danger !).
Pourvu que mon propos soit clair !

stilobique a écrit :Rapidement un peut de lecture pour t'aider...

OK, merci, moi aussi je vais regarder ça ce soir !

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

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par stilobique » 12 Mars 2018, 22:38

A vi, autre point important ; tu dispose de quelque template basique directement dans l'editor de text de blender. Je regarde rapidement mais la soirée passe vite :) . Je doit resetup pas mal de chose sur ma machine.
Avatar de l’utilisateur
stilobique
 
Message(s) : 1365
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par ILYA » 13 Mars 2018, 08:37

stilobique a écrit :... Je doit resetup pas mal de chose sur ma machine.

Euh.... quand je vois l'heure à laquelle tu publies, j'ai honte de moi qui n'ai pas "tenu" autant que toi ! C'est franchement sympa de m'aider, car de mon coté j'ai cherché encore et encore, avec entre autres les pistes que tu m'as indiquées, mais c'est toujours sans réussite !
Effectivement, je connais la possibilité de créer des scripts à partir des templates depuis le Text Editor, mais je n'ai pas trouvé de quoi m'aider, ou bien j'ai mal cherché... j'y retourne !

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

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par stilobique » 13 Mars 2018, 09:03

Il faut proceder par etapes. Faire un bouton avec un boolean pour le On/Off, j'ai lacher l'affaire mais je reprend quand j'ai un peut de temps.
Avatar de l’utilisateur
stilobique
 
Message(s) : 1365
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par cedric » 13 Mars 2018, 09:50

ILYA, j'ai viré ta signature image, l'avatar est suffisant.
Cédric Lepiller, Freelance 3D Pitiwazou.com, Mes Addons, Asset Management, Speedflow
Avatar de l’utilisateur
cedric
Administrateur
 
Message(s) : 7019
Inscription : 03 Août 2013, 21:36

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par ILYA » 13 Mars 2018, 15:22

cedric a écrit :ILYA, j'ai viré ta signature image, l'avatar est suffisant.

OK Cédric, pas de souci ! Ce poulpe "made in Blender" n'avait de toute façon pas de ventouses, il collait mal aux messages !
Pour ce qui est de rester collé, moi par contre c'est le cas ! Je suis incapable de savoir comment rédiger un script pour faire un truc "tout bête" : incrémenter une variable à chaque fois que je clique sur un bouton...
En Javascript je sais faire, c'est simple, en Python ça a l'air d'être une galère sans nom !
Stilobique est sur le coup comme tu as vu, mais je ne croyais pas que ce genre de sujet allait être aussi "hard", j'en suis gêné !

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

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par stilobique » 13 Mars 2018, 15:56

En realite ce n'est pas tres complique, mais sa demade quelque lignes ; comme j'ai mon laptot depuis peut de temps j'ai pas resintaller et setup grand chose pour taffer dessus, et comme je passe deja de longue journee en ce moment, je ne suis pas hyper actif le soir.
Avatar de l’utilisateur
stilobique
 
Message(s) : 1365
Inscription : 07 Sep 2013, 09:26
Localisation : France

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par ILYA » 13 Mars 2018, 20:18

stilobique a écrit :... comme je passe deja de longue journee en ce moment, je ne suis pas hyper actif le soir.

Ne culpabilise surtout pas, dis ! Ce qui me rassure c'est que tu mentionnes que tu sais le faire ce script, c'est juste une question de dispo voilà tout ! Moi c'est l'inverse... et je ne suis pas "aux pièces" comme on dit !
Alors, c'est quand tu veux et ce sera très bien, je serai toujours content de ton aide !

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


Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par pistiwique » 06 Juil 2018, 20:20

si c'est pour incrémenter ta variable, tu n'as pas besoin de passer par une fonction, autant le faire directement via l'opérateur.
Code : Tout sélectionner
bl_info = {
    "name": "Variable globale",
    "category": "Object",
    "author": "ILYA 2018",
    "version": (1, 0, 0),
    "blender": (2, 7, 9),
    "location": "Barre espace > Search > perso, onglet Tools du panneau T",
    "description": "créer et utiliser une variable partagée entre opérateurs",
}

import bpy

print ("------------------------------------------")
print ("le script VariableGlobale est actif")
print ("------------------------------------------")

mavariable = 0 # a priori, a le sens d'une variable GLOBALE


class VariableGlobale(bpy.types.Operator):
    """Création et utilisation d'une variable globale"""      # Use this as a tool-tip for menu items and buttons.
    bl_idname = "operator.variable"        # Unique identifier for buttons and menu items to reference : libellé pour le paramètre "Name" d'un nouveau racccourci (onglet Input des préférences utilisateur)
    bl_label = "PERSO Utilisation d'une variable globale"         # Display name in the interface.
    bl_options = {'REGISTER', 'UNDO'}  # Enable undo for the operator.

    print ("------------------------------------------")
    print ("l'operator VariableGlobale est actif")
    print ("------------------------------------------")
   
    print ("*************************************************")   
    print ("valeur INITIALE de ma variable = ", mavariable)
    print ("*************************************************") 
   
    def execute(self, context):        # execute() is called when running the operator.
        global mavariable
        mavariable += 1
       
        print ("*************************************************")   
        print ("valeur de ma variable suite au passage par increment = ", mavariable)
        print ("*************************************************") 
       
        return {'FINISHED'}            # Lets Blender know the operator finished successfully.
     
class PartageVariable(bpy.types.Panel):
    """Partage de variable entre opérateurs"""
    bl_label = "Variable en partage"
    bl_idname = "PanneauPerso"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
    bl_category = 'TOOLS'

    def draw(self, context):
        layout = self.layout
        scn = context.scene

        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.label("Incrémentation de la valeur de ma variable :")
       
        row_fv = layout.row(align=True)
        row_fv.alignment = 'EXPAND'
        row_fv.operator("operator.variable", "Variable augmente de 1") # nom de l'opérateur nécessaire

       
     

def register():
    bpy.utils.register_class(VariableGlobale)
    bpy.utils.register_class(PartageVariable)

def unregister():
    bpy.utils.unregister_class(VariableGlobale)
    bpy.utils.unregister_class(PartageVariable)

# This allows you to run the script directly from blenders text editor
# to test the add-on without having to install it.
if __name__ == "__main__":
    register()

le problème de ta fonction, c'est que tu retourne mavariable + 1, mais tu n'incrémentes pas ta variable. Elle reste donc de base à 0.
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Incrémenter une variable à chaque clic sur un bouton ?

Message par ILYA » 07 Juil 2018, 08:51

pistiwique a écrit :si c'est pour incrémenter ta variable, tu n'as pas besoin de passer par une fonction, autant le faire directement via l'opérateur.
...
le problème de ta fonction, c'est que tu retourne mavariable + 1, mais tu n'incrémentes pas ta variable. Elle reste donc de base à 0.

Salut Pistiwique !

Merci beaucoup pour ton aide et ton explication qui me permet de comprendre pourquoi je ne parvenais pas au résultat !
Effectivement, avec ta correction ça fonctionne, c'est parfait !

Encore un "big" MERCI !

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


Retour vers Scripts - Python - OSL

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 4 invité(s)