2015-02-25 1 views
1

Je suis nouveau à Python et créer un programme dans Maya, qui crée un système solaire. Cela fait partie de mon code qui cause les problèmes (espérons-le assez pour comprendre). La première fonction définit le rayon de la planète, puis crée une sphère en conséquence. La deuxième fonction doit utiliser la variable planetRadiusStr pour déterminer le rayon du Torus (anneau). Cependant, planetRadiusStr n'est défini que dans la première fonction, donc je sais que je dois passer d'une façon ou d'une autre la variable entre les fonctions. Cependant, je n'arrive pas à faire fonctionner ça. Quelqu'un peut-il aider?Comment passer des variables entre des fonctions en utilisant python dans maya?

def planetRadius(): 

    planetRadiusStr = raw_input("Please enter the radius of the planet:") 
    if float(planetRadiusStr)<float(sunRadiusStr): 
     cmds.polySphere(radius=float(planetRadiusStr), n='planet1') 
    else: 
     print "Planet Radius must be less than Sun Radius" 
     planetRadius() 



def planetRings(): 

    ringsStr = raw_input("Would you like this planet to have a ring?").lower() 
    if str(ringsStr) == "yes": 

     cmds.polyTorus(r=float(planetRadiusStr)*2, sr=0.5, n='ring1') 
     cmds.scale(1,0.2,1) 

    elif str(ringsStr) == "no": 
     pass 

    else: 
     print "Please enter 'yes' or 'no'." 
     planetRings() 

(je peux télécharger une photo de mon code si ce sera plus facile à lire.) Merci!

Répondre

0
def planetRadius(): 
    planetRadiusStr = 42 
    #blas 
    planetRings(planetRadiusStr) 

def planetRings(planetRadiusStr): 
     #blas 
+0

Avez ceci et cela a semblé fonctionner, mais maintenant me demande raw_input ("Voulez-vous que cette planète ait un anneau") deux fois, même quand vous répondez "oui". Une idée pourquoi? –

+0

Je n'ai pas regardé vos fonctions.J'ai répondu à votre question sur la façon de passer une variable dans une autre fonction. – taesu

2

Un couple de choses à considérer ici. Tout d'abord, je travaillerais uniquement avec les fonctions standard et n'utiliserais pas raw_input(). Jusqu'à ce que vous ayez d'autres utilisateurs, vous pouvez simplement taper les valeurs que vous voulez dans l'écouteur; Lorsque vous avez des utilisateurs, vous pouvez créer une interface graphique appropriée qui ne fait que passer des arguments dans les fonctions.

Alors, je vous suggère de l'essayer en faisant juste des fonctions qui utilisent les informations dont vous avez besoin:

def create_planet(name, radius): 
    planet, shape = cmds.polySphere(n = name, r = radius) 
    return planet 

def create_sun (radius): 
    cmds.polySphere(name = "sun", r = radius) 

Dans ce cas, vous n'avez pas besoin de suivre le rayon de la planète: vous pouvez dériver de l'histoire de la planète elle-même si vous savez quelle planète à regarder

def create_ring (planet): 
    planet_history = cmds.listHistory(planet) or []  
    pSphere = cmds.ls(*planet_history , type = 'polySphere')[0] 
    planet_radius = cmds.getAttr(pSphere + ".radius") 
    ring, ring_shape = cmds.polyTorus(r = planet_radius * 2, sr = .5, n = planet + "_ring") 
    cmds.scale(1,0.2,1) 
    cmds.parent(ring, planet, r=True) 

Avec tout cela en place, vous pouvez gérer le passage des arguments d'une fonction à l'autre manuellement dans l'auditeur:

p = create_planet("saturn", 1) 
create_ring(p) 

ou, vous pouvez créer une autre fonction qui fait des passes multiples:

def add_planet (sun, planet, distance): 
    cmds.parent(planet, sun, r=True) 
    cmds.xform(planet, t= (distance, 0 ,0), r=True) 

def solar_system(): 
    sun = create_sun (10) 
    mercury = create_planet('mercury', .5) 
    add_planet(sun, mercury, 20) 
    venus = create_planet('venus', .7) 
    add_planet(sun, venus, 40) 
    earth = create_planet('earth', .8) 
    add_planet(sun, earth, 50) 
    mars = create_planet('mars', .75) 
    add_planet(sun, mars, 60) 
    jupiter = create_planet('jupiter', 2) 
    add_planet(sun, jupiter, 70) 
    saturn = create_planet('satun', 1.2) 
    add_planet(sun, saturn, 80) 
    create_ring(saturn) 

Comme vous pouvez le voir, aussi longtemps que vous êtes dans la fonction solar_system vous pouvez garder les variables en vie et de les transmettre autour - vous Notez également que create_planet() renvoie le nom de la planète créée (maya peut le renommer derrière vous, donc c'est une bonne idée de vérifier de cette façon) afin que vous puissiez passer ce nom à d'autres fonctions comme 'create_ring' ou 'add_planet' qui ont besoin de connaître d'autres objectifs.

0
def planetRadius(): 
    size = 4 
    return size 

def planetRings(inputSize): 

    "function placed here" 
    print('my planet size was ' + str(inputSize)) 

var01 = planetRadius() 
planetRings(var01) 
#result : 'my planet size was 4' 

Si vous envisagez de créer une interface utilisateur, gardez à l'esprit que vous devez définir votre def comme ceci:

def planetRadius(*args): 

En effet, la sortie UI MAYA par défaut variable booléenne et créera une erreur si vous ne mettez pas * args.

De plus, si vous essayez de passer une variable à travers une interface utilisateur que le vôtre:

def planetRings(inputSize, *args): 

     "function placed here" 
     print('my planet size was ' + str(inputSize)) 

Vous devrez chercher le module functools.partial pour spécifier la taille d'entrée:

from functools import partial 
import maya.cmds as cmds 

cmds.button(l='exec', c=partial(planetRings, inputSize))