【问题标题】:How to pass variables between functions using python in maya?如何在maya中使用python在函数之间传递变量?
【发布时间】:2015-04-27 22:00:01
【问题描述】:

我是 Python 新手,我在 Maya 中创建了一个程序,用于创建一个太阳系。这是导致问题的代码的一部分(希望足以理解)。第一个函数定义了行星的半径,然后相应地创建了一个球体。第二个函数需要使用变量 planetRadiusStr 来确定 Torus(ring) 的半径。但是,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()

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

【问题讨论】:

    标签: python variables argument-passing maya


    【解决方案1】:

    这里有几点需要考虑。

    首先,我将只使用标准函数而不是使用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 可能在你身后重命名它,所以最好用这种方式检查),这样你就可以将该名称传递给其他需要了解其他对象的函数,如“create_ring”或“add_planet”。

    【讨论】:

      【解决方案2】:
      def planetRadius():
          planetRadiusStr = 42
          #blas
          planetRings(planetRadiusStr)
      
      def planetRings(planetRadiusStr):
              #blas
      

      【讨论】:

      • 这样做了,它似乎有效,但现在我两次询问 raw_input("Would you like this planet to have a ring"),即使您回答“是”也是如此。知道为什么吗?
      • 我没有看过你的函数。我回答了您关于如何将变量传递给另一个函数的问题。
      【解决方案3】:
      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'
      

      如果您打算创建一个 UI,请记住您应该将您的 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))
      

      【讨论】:

        猜你喜欢
        • 2019-06-04
        • 2013-04-09
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        相关资源
        最近更新 更多