Python for Maya标志“c”的参数无效。应为字符串或函数,但未获得类型

2024-09-22 14:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试转换Maya中选择网格所有硬边的简单工具。基本上,我正在尝试将此Mel脚本转换为Python,并为其提供一个UI,以便对Maya的Python脚本进行一点练习。我遇到了一个问题,我正在将一个函数输入到UI按钮中,但当我运行代码时,它会返回:

Error: TypeError: file line 18: Invalid arguments for flag 'c'. Expected string or function, got NoneType #

代码如下:

import pymel.core as pm

def createWindow():
    
    title = 'Hard Edge Selection'
    
    if cmds.window(title, exists=True):
            cmds.deleteUI(title, window=True)
    else:
            cmds.window(t = title)
            cmds.rowColumnLayout(nc=2)
            lowAngle = cmds.intSliderGrp( field=True, label='Low Angle', minValue=0, maxValue=30, value=30 )
            highAngle = cmds.intSliderGrp( field=True, label='High Angle', minValue=90, maxValue=150, value=150 )
            lowAngleSel = cmds.intSliderGrp( lowAngle, q=True, value=True)
            highAngleSel = cmds.intSliderGrp( highAngle, q=True, value=True)
            #_findEdges = findEdges("{0},{1}").format(lowAngleSel, highAngleSel)
            cmds.button(l='Find Edges', c=findEdges(lowAngleSel, highAngleSel))
            cmds.showWindow()
            cmds.selectMode(o=True)

def findEdges(x, y):
    currentSelection = cmds.ls(sl=True)
    pm.mel.doMenuComponentSelectionExt(currentSelection[0], "edge", 0)
    #edgecount = pm.polyEvaluate(currentSelection[0], e=1)
    #pm.select(currentSelection[0] + ".e [0:" + str((edgecount[0] - 1)) + "]")

    #Constrain that selection to only edges of a certain Angle
    pm.polySelectConstraint(a=True, ab=(x, y), m=3, t=0x8000)
    #Remove the selection constraint so everything back to normal
    pm.polySelectConstraint(m=0)
    print ("Hard edges between " + str(x) + " and " + str(y) + " degrees have been selected")

createWindow()

Tags: 脚本truetitlevaluewindowcmdsmayastr
1条回答
网友
1楼 · 发布于 2024-09-22 14:35:43

您的问题在于这一行:

cmds.button(l='Find Edges', c=findEdges(lowAngleSel, highAngleSel))

findEdges(...)返回None,然后尝试将其绑定到按钮的命令回调

您需要做的是将回调绑定到实际函数,如下所示:

cmds.button(l='Find Edges', c=findEdges)

然而,这就提出了如何发送函数参数的问题。就个人而言,我建议为此使用一个类并将滑块组存储在类实例上,但是如果您想沿着当前路径继续,您应该查看lambdapartial实现

PS:我相信按钮回调会将按钮名称作为参数发送到回调函数,您需要捕获(可能会忽略)该函数:

cmds.button(l='Find Edges', c=lambda x: findEdges(lowAngleSel, highAngleSel))

PPS:我不完全确定上面的lambda参数的范围,可能是它们在回调时未定义。在这种情况下,您可以回到partial(它充当工厂,而不是匿名方法)

有关Maya按钮回调的详细信息:https://riptutorial.com/maya/example/25096/callback-functions

相关问题 更多 >