代码在启动和connectAttr文本字段问题上不起作用

时间:2018-12-27 01:13:31

标签: python maya autodesk

好,所以我正在研究一个与其他问题类似的简单演示,这很简单,只需运行脚本,将对象加载到A节点,将对象加载到B节点,点击“连接节点”然后您的2个项目的翻译将被连接。

好吧,这就是我希望发生的事情。相反,我总是收到“#错误:未定义名称'SetSource'”或我的其他任何命令说“未定义”,如果我只是转到“ c = SetSource”或任何其他命令,我可以暂时修复此问题,从代码中剪切它们,重新运行窗口,然后将它们粘贴回原位,它们将起作用:但这很麻烦,我只希望它在启动时就可以起作用。

第二个问题是,当我将内容加载到文本字段中并尝试使用“连接节点”按钮将它们连接时,出现错误,提示“#错误:找不到源属性'您加载到A节点textField中的对象'。 “

我已经尝试了一些方法,例如:启动问题,我尝试将按钮和文本字段包装在自己的小“ def”类别中,我将其命名为ui():并在末尾发布ui()的代码,这使它在启动时运行良好,除非我运行脚本时拒绝将任何内容加载到文本字段中

对于connect命令来连接翻译,我尝试放置def connect(attr,* args)而不是def_connect(),但是如果我尝试将attr作为* args命令,它将被忽略,并且被告知“ attr not定义”

我有点儿不高兴了。我正在编译用其他脚本制作的所有内容,以制作一个用于在索具中建立辅助关节的主脚本,而这个双重文本字段是我的最后选择。

import maya.cmds as cmds

if cmds.window("dumWin", exists =True):
    cmds.deleteUI("dumWin")

window = cmds.window("dumWin",title='DS selection connector demo')
column = cmds.columnLayout(adj=True)
cmds.showWindow(window)



sld_textFldA = cmds.textField('sld_surfaceText1', width =240)
load_button = cmds.button( label='Load A Node', c = SetSource)

sld_textFldB = cmds.textField('sld_surfaceText2', width =240)
load_button = cmds.button( label='Load B Node', c = SetTarget)

load_button = cmds.button( label='Connect Nodes', c = connect)


def SetSource(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldA, edit=True, text=sel[0])

def SetTarget(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldB, edit=True, text=sel[0])

def connect(_):
    cmds.connectAttr( source + '.', target + '.', f=True)

我的预期结果是使代码仅在启动时工作,而无需调用我的defs“未定义”,而仅使连接节点连接翻译

1 个答案:

答案 0 :(得分:0)

出现错误Error: name 'SetSource' is not defined的原因是因为您在创建按钮后 定义了该错误。在设置按钮的命令功能之前,需要先进行评估,否则无法找到它。这里的解决方案很简单,它是将3个功能移到最上面。

对于connect函数,您正在使用变量sourcetarget,但是这些变量未在该函数范围内的任何地方初始化,因此失败。相反,您需要查询textField的当前文本。由于用户也可以在其中自由键入内容,因此最好包括一个简单的检查以查看我们从两个textField获取的节点是否确实存在。

import maya.cmds as cmds


def SetSource(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldA, edit=True, text=sel[0])


def SetTarget(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldB, edit=True, text=sel[0])


def connect(_):
    obj_a = cmds.textField(sld_textFldA, q=True, text=True)
    obj_b = cmds.textField(sld_textFldB, q=True, text=True)

    if not cmds.objExists(obj_a) or not cmds.objExists(obj_b):
        raise RuntimeError("Unable to find objects in the scene.")

    cmds.connectAttr(obj_a + '.translate', obj_b + '.translate', f=True)


if cmds.window("dumWin", exists =True):
    cmds.deleteUI("dumWin")

window = cmds.window("dumWin",title='DS selection connector demo')
column = cmds.columnLayout(adj=True)
cmds.showWindow(window)

sld_textFldA = cmds.textField('sld_surfaceText1', width =240)
load_button = cmds.button( label='Load A Node', c = SetSource)

sld_textFldB = cmds.textField('sld_surfaceText2', width =240)
load_button = cmds.button( label='Load B Node', c = SetTarget)

load_button = cmds.button( label='Connect Nodes', c = connect)