IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Débutant]Comment stocker une variable d'une fonction vers une autre sans recalculer la fonction ? [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut [Débutant]Comment stocker une variable d'une fonction vers une autre sans recalculer la fonction ?
    Bonjour à tous,

    Tout d'abord je suis désolé si ma question va sembler bête, mais je débute avec Python et je bloque sur un problème.

    Je suis en train de développer un petit script pour Maya (logiciel modélisation 3D), qui a pour but de stocker des sélection, afin de s'en resservir plus tard.

    En résumé, l'utilisateur devra :
    1. Sélectionner un objet, appuyer sur un bouton pour stocker cette sélection
    2. Sélectionner un deuxième objet, appuyer sur un autre bouton pour le stocker
    3. Appuyer sur un troisième bouton, qui va accomplir tout le processus du script, en se servant des résultats précédemment enregistrer


    Tout d'abord j'étais partit bêtement sur un code de ce type (c'est une version schématisé de ce que j'ai fais)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import pymel.core as pmc #J'importe la library de Maya
     
    def fonction1():
       selection1 = pmc.ls(sl=1) #je stock la selection active dans une variable
     
    def fonction2():
       selection2 = pmc.ls(sl=1)
     
    def fonctionGlobal():
       print selection1
       print selection2
    Finalement, selection1 et selection2 n'étant pas déclarer dans fonctionGlobal, j'ai modifier mon script en appelant les autres fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import pymel.core as pmc
     
    def fonction1():
       selection1 = pmc.ls(sl=1)
       result selection1
     
    def fonction2():
       selection2 = pmc.ls(sl=1)
       result selection2
     
    def fonctionGlobal():
       print fonction1()
       print fonction2()
    Bien entendu, en fouillant sur internet je me suis très vite rendu compte que je faisais n'importe quoi, car j'appelais la fonction, qui était du coup recalculé, la sélection active changeant entre la sélection 1 et 2, je me retrouvait avec deux fois la même sélection car j'exécute les deux fonction sans changer de sélection.

    Sauf que là je bloque, j'ai bien regardé un peu le système des classes, mais je ne vois pas comment résoudre mon problème.
    J'ai aussi tenter de déclarer mes variables hors fonction, pour ensuite les modifier dans mes fonction1 et 2, sauf que la fonctionGlobal prend les variables par défaut.

    J'espère m'être fait un minimum comprendre, et je vous remercie d'avance pour votre aide !

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Bonjour,

    Tu es devant ce qu'on appelle un problème de portée de variables. Autrement dit, tes variables déclarées dans tes fonctions ne sont "visibles" que dans ces fonctions.
    Même si tu les déclares hors fonction, elles sont redéclarées dans tes fonctions: ce sont alors de nouvelles variables locales à ta fonction qui ont le même nom que les variables hors fonction (globales) et les masquent.
    Il te faut indiquer que tu veux utiliser les variables globales avec l'instruction 'global'. Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    selection1='a'
    selection2='b'
     
    def fonction1():
       global selection1
       selection1 = 'val1'
     
    def fonction2():
       selection2 = 'val2'
     
    def fonctionGlobal():
       print selection1
       print selection2
     
    fonction1()
    fonction2()
    fonctionGlobal()

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par Cuissedemouche Voir le message
    Sauf que là je bloque, j'ai bien regardé un peu le système des classes, mais je ne vois pas comment résoudre mon problème.
    J'ai aussi tenter de déclarer mes variables hors fonction, pour ensuite les modifier dans mes fonction1 et 2, sauf que la fonctionGlobal prend les variables par défaut.
    Appeler une fonction, lui faire retourner un résultat, le stocker dans une variable, comprendre la portée des variables, .... sont des notions expliquées dans tout bon tuto. Sûr que sans avoir pris le temps d'apprendre ces notions là, vous pouvez toujours chercher sur Internet: soit vous poserez mal vos questions, soit vous ne comprenez pas les solutions.

    C'est sur qu'entre lire un tuto. et comprendre les notions qu'il expose pour s'en servir correctement demande du temps pour "apprendre" car derrière, il y a quand même un processus chimique qui transforme notre réseau de neurones: on va le solliciter de façon particulière.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut
    J'utilise les fonctions plus en tant que procédures justement, c'est afin de "ranger" des bouts de codes (c'est comme ça que mon prof m'a apprit). Et oui, j'en ai lu des tutos, mais c'est plus de l'incompréhension, et ça fait quelques jours que je bloque d'où ma demande sur le forum.

    Sinon, j'ai juste exécuter le code donné par Fifan31 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    selection1='a'
    selection2='b'
     
    def fonction1():
       global selection1
       selection1 = 'val1'
     
    def fonction2():
       selection2 = 'val2'
     
    def fonctionGlobal():
       print selection1
       print selection2
     
    fonction1()
    fonction2()
    fonctionGlobal()
    Et étrangement, il m'a retourné ça :
    Je devrais bien avoir val1 et val2 normalement non ?

    Après je pense m'être mal fait comprendre aussi. le problème c'est que dans cette fonction, on réexécute les fonctions 1 et 2 à la suite, or je ne peux pas me le permettre, car il vont être généré à partir d'une sélection, qui changera entre la fonction 1 et 2.

    Je poste mon script original ce sera peut-être plus simple (je ne l'avais pas posté car il se base sur une library propre à Maya)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    import pymel.core as pmc
     
    #On attribut les fonctions aux variables
    curveShape = str()
    joints = []
     
    def CS_UI():
     
        #On supprime la fenetre si elle existe
        if pmc.window("Connect_Stretch", exists = True):
            pmc.deleteUI("Connect_Stretch")
     
        #Creation de la fenetre
        window = pmc.window("Connect_Stretch", title = "Connect Stretch", w = 100, h = 120, mnb = False, mxb = False, sizeable = False)
     
        #On cree l'interface principale
        mainLayout = pmc.columnLayout(w = 120, h = 120)
     
     
        #Boutons
        gridOne = pmc.gridLayout( nc = 2, cwh = (120,30), parent = mainLayout )
        gridTwo = pmc.gridLayout( nc = 2, cwh = (120,30), parent = mainLayout )
        gridThird = pmc.gridLayout( nc = 2, cwh = (120,30), parent = mainLayout )
        gridFour = pmc.gridLayout( nc = 2, cwh = (120,30), parent = mainLayout )
     
        b1 = pmc.button(label = "Select Curve", w = 205, h = 30, c = 'ConnectStretch.CS_Curve()', parent = gridOne )
     
        b2 = pmc.button(label = "Select Joints", w = 205, h = 30, c = 'ConnectStretch.CS_Joint()', parent = gridTwo )
     
        b3 = pmc.button(label = "Let's stretch !", w = 205, h = 30, c = 'ConnectStretch.CS_Process()', parent = gridThird )
     
        b4 = pmc.button(label = "Cancel", w = 205, h = 30, c = 'ConnectStretch.CS_CloseUI()', parent = gridFour )
     
        #Affichage de la fenetre
        pmc.showWindow(window)
     
     
    def CS_CloseUI():
        pmc.deleteUI("Connect_Stretch")
     
     
    def CS_Curve():
        global curveShape
        Selected = pmc.ls(sl=1)
     
        if not len(Selected) > 1:
                if not len(Selected) == 0:
                    curveShape = Selected[0].getShape()
        else:
            print("Merci de ne selectionner qu'une seule curve")
     
     
    def CS_Joint():
        global joints
        joints = pmc.ls(sl=1)
     
     
    def CS_Process():
        Name=curveShape.split("_")[0]
     
        curveInfo=pmc.createNode("curveInfo", n=Name+"_Info")
        curveStretch=pmc.createNode("multiplyDivide", n=Name+"_Stretch")
        curveStretchPow=pmc.createNode("multiplyDivide", n=Name+"_StretchPow")
        curveSquash=pmc.createNode("multiplyDivide", n=Name+"_Squash")
        VolumeConservation_Blend=pmc.createNode("blendColors", n=Name+"_VolumeConservation_Blend")
     
        pmc.connectAttr( curveShape+'.worldSpace', curveInfo.inputCurve, force=1)
        pmc.connectAttr( curveInfo+'.arcLength', curveStretch.input1.input1X, force=1)
        pmc.connectAttr( curveStretch+'.output.outputX', curveStretchPow.input1.input1X, force=1)
        pmc.connectAttr( curveStretchPow+'.output.outputX', curveSquash.input2.input2X, force=1)
        pmc.connectAttr( curveSquash+'.output.outputX', VolumeConservation_Blend.color1.color1R, force=1)
     
        pmc.setAttr(curveStretch.input2.input2X, pmc.getAttr(curveInfo+'.arcLength') )
        pmc.setAttr(curveStretch.operation, 2)
        pmc.setAttr(curveStretchPow.operation, 3)
        pmc.setAttr(curveStretchPow.input2.input2X, 0.5)
        pmc.setAttr(curveSquash.operation, 2)
        pmc.setAttr(curveSquash.input1.input1X, 1)
        pmc.setAttr(VolumeConservation_Blend.color2.color2R, 1)
        #On connecte les joints au multiply
     
        for joint in joints:
            pmc.connectAttr (curveStretch.outputX, joint.scaleX, force=1)
            pmc.connectAttr (VolumeConservation_Blend.outputR, joint.scaleY, force=1)
            pmc.connectAttr (VolumeConservation_Blend.outputR, joint.scaleZ, force=1)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par Cuissedemouche Voir le message
    Je devrais bien avoir val1 et val2 normalement non ?
    Si vous ne voyez pas de différences entre fonction1 et fonction2, c'est que la portée des variables, variables locales et globales vous sont encore étrangers. Et vu que c'est bien mieux expliqué dans les tutos que ce que je ne pourrais le faire en quelques lignes...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut
    J'avais fais le test rapidement pendant ma pause déjeuner. Du coup, j'avais pas fais attention au fait le la seconde fonction n'avait pas le global.
    Enfin, pour Maya j'ai réinitialisé le logiciel par défaut et ça à fonctionner (c'est un soft hyper bugué malheureusement).
    Du coup merci beaucoup pour l'aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/11/2008, 09h37
  2. valeur d une variable d'un form vers un autre
    Par barhili04 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/05/2007, 12h51
  3. Réponses: 1
    Dernier message: 17/01/2007, 21h52
  4. Réponses: 11
    Dernier message: 18/07/2006, 13h53
  5. Réponses: 7
    Dernier message: 13/03/2006, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo