如何在maya中使用python在函数之间传递变量?

时间:2015-02-25 18:36:44

标签: python variables argument-passing maya

我是Python的新手,在Maya中创建了一个创建太阳系的程序。这是导致问题的代码的一部分(希望足以理解)。第一个函数定义行星的半径,然后相应地创建一个球体。第二个函数需要使用变量planetRadiusStr来确定Torus(环)的半径。但是,planetRadiusStr只在第一个函数中定义,所以我知道我需要以某种方式在函数之间传递变量。但是,我似乎无法让这个工作。有人可以帮忙吗?

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()

(如果更容易阅读,我可以上传我的代码照片。) 谢谢!

3 个答案:

答案 0 :(得分:2)

这里要考虑几件事。

首先,我只使用标准功能而不使用raw_input()来实现此功能。在拥有其他用户之前,您只需在侦听器中键入所需的值即可;当你有用户时,你可以创建一个恰当的GUI,只需将参数传递给函数。

所以,我建议您通过制作能够获取所需信息的功能来尝试:

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()返回创建的星球的名称(maya可能会将它重命名在你后面,所以检查这种方式是个好主意)所以你可以将这个名字传递给其他函数,例如&#39; create_ring&#39;或者&#39; add_planet&#39;需要了解其他对象。

答案 1 :(得分:0)

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

def planetRings(planetRadiusStr):
        #blas

答案 2 :(得分: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设置为:

def planetRadius(*args):

实际上,maya 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))