将旗帜传递给另一个功能?

时间:2017-02-11 22:17:41

标签: python maya

这里的Python新手,请原谅我,如果我的术语有点不合适(并且请纠正我:)但是有可能将标志和值传递给第二个函数并且该函数依次传递它们到第三个功能?

这样的事情:



def changeLayers(var1, var2, layers, flag, value):
  # do lots of stuff with var1 and var2...
  # finally: 
  for layer in layers:
    changeLayerState(layer, flag = value)


changeLayers('foo', 'bar', someLayers, 'visible', True)
changeLayers('foo', 'bar', otherLayers, 'layerState', 'normal')




所以想要的效果是运行像changeLayers(' foo',' bar',someLayers,' visible',True)并最终拥有changeLayerState(图层) ,visible = True)进行评估。

如果我运行类似的东西,我会得到一个语法错误,我假设因为我传递了字符串'可见'作为旗帜。

这简化了一点,但这是我尝试做的事情的本质。有没有办法做到这一点?

希望有道理..

编辑:所以我使用伪代码来投射网络并且不会吓到任何不熟悉Maya Python的人,但我想这更令人困惑。所以这是一个片段,它可以查看场景中的所有显示层,将所有结束的内容转换为" Control"隐藏并设置所有结束于" Geometry"到一个普通的layerState(也就是说,没有引用或模板化,以便可以在视口中轻松选择它们):

import maya.cmds as cmds
layers = cmds.ls(type='displayLayer')
controlLayers = []
geomLayers = []

for layer in layers:
    if layer.endswith('Control'):
        conLayers.append(layer)
    elif layer.endswith('Geometry'):
        geomLayers.append(layer)   

for layer in controlLayers:
    cmds.layerButton(layer, edit = True, layerVisible = False)
    cmds.setAttr(layer + '.visiblity' , False)

for layer in geomLayers:
    cmds.layerButton(layer, edit = True, layerState = 'normal')            
    cmds.setAttr(layer + '.displayType', 0)

这很有效。但是,如果我尝试功能化那些改变层状态的行,如下所示:

import maya.cmds as cmds
layers = cmds.ls(type='displayLayer')
controlLayers = []
geomLayers = []

def changeLayerState(layers, flag, value, attr, attrValue):
    for layer in layers:
        cmds.layerButton(layer, edit = True, flag = value)            
        cmds.setAttr(layer + '.' + attr, attrValue)

for layer in layers:
    if layer.endswith('Controls'):
        controlLayers.append(layer)
    elif layer.endswith('Geometry'):
        geomLayers.append(layer)   

changeLayerState(geomLayers, 'layerState', 'normal', 'displayType', 0)
changeLayerState(controlLayers, 'layerVisible', False, 'visibility', False)

我错了:

// Error: Invalid flag 'flag'
# Traceback (most recent call last):
#   File "<maya console>", line 17, in <module>
#   File "<maya console>", line 8, in changeLayerState
# TypeError: Invalid flag 'flag' //

这会让我更加了解我想要做什么吗?我试图传递一个标志用于另一个函数的函数。

1 个答案:

答案 0 :(得分:0)

如果您尝试拨打changeLayerState并且希望使用changeLayerState(something, someflag=somevalue)这样的标记,则使用introduce some CancellationToken

传递带有标记和值的字典
def changeLayers(var1, var2, layers, flag, value):
    # etc
    keyword_args = {flag: value}
    for layer in layers:
       changeLayerState(layer, **keyword_args)