2015-02-25 4 views
1

Я новичок в Python и создаю программу в Maya, которая создает солнечную систему. Это часть моего кода, который вызывает проблемы (надеюсь, достаточно, чтобы понять). Первая функция определяет радиус планеты, а затем создает сферу соответственно. Вторая функция должна использовать переменную planetRadiusStr для определения радиуса Torus (ring). Однако planetRadiusStr определяется только в первой функции, поэтому я знаю, что мне нужно каким-то образом передать переменную между функциями. Однако я не могу заставить это работать. Может ли кто-нибудь помочь?Как передать переменные между функциями, использующими python в 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() 

(я могу загрузить фотографию моего кода, если это будет легче читать.) Спасибо!

ответ

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

def planetRings(planetRadiusStr): 
     #blas 
+0

сделал это, казалось, сработало, но теперь просит меня raw_input («Хочешь, чтобы эта планета имела кольцо») дважды, даже когда ты отвечаешь «да». Любая идея почему? –

+0

Я не смотрел ваши функции. Я ответил на ваш вопрос о том, как передать переменную в другую функцию. – taesu

2

Несколько вещей, чтобы рассмотреть здесь.

Во-первых, я получил бы эту работу, используя только стандартные функции и не используя raw_input(). Пока у вас нет других пользователей, вы можете просто ввести нужные значения в слушатель; когда у вас есть пользователи, вы можете создать собственный графический интерфейс, который просто передает аргументы в функции.

Итак, я предлагаю вам попробовать это просто сделать функции, которые принимают информацию, вам нужно:

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) 

В этом случае вам не нужно отслеживать радиус планеты: вы можете получить его из истории самого, если вы знаете, какая планету смотреть на

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) 

со всем, что на месте планеты, вы можете управлять прохождением аргументов из одной функции в другую вручную слушатель:

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

или, вы можете создать еще одну функцию, которая делает несколько проходов:

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) 

Как вы можете видеть, до тех пор, пока вы внутри функции solar_system вы можете сохранить переменные в живых и передать их вокруг - вы Также заметим, что create_planet() возвращает имя созданной планеты (майя может переименовать ее за собой, так что это хорошая идея проверить этот путь), поэтому вы можете передать это имя вместе с другими функциями, такими как «create_ring» или «add_planet», которые должны знать о других объектах.

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' 

Если вы планируете создать пользовательский интерфейс, имейте в виду, что вы должны установить размораживание, как это:

def planetRadius(*args): 

Действительно, выход майа UI булева переменная по умолчанию и создаст ошибку, если вы не ставите * args.

Кроме того, если вы пытаетесь передать переменную через UI, как ваша:

def planetRings(inputSize, *args): 

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

Вам придется искать модуль functools.partial указать размер входа:

from functools import partial 
import maya.cmds as cmds 

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