我是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()
(如果更容易阅读,我可以上传我的代码照片。) 谢谢!
答案 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))