代码不适用于启动和 connectAttr 文本字段问题
Code wont work on startup and connectAttr textfield question
好的,所以我正在做一个类似于我的其他问题之一的简单演示,它很简单 uite 简单,只需 运行 脚本,将对象加载到 A 节点,将一个对象加载到 B 节点,点击 "connect nodes" 然后你的 2 个项目的 t运行slate 将被连接。
至少,这就是我希望发生的事情。相反,我不断收到“# Error: name 'SetSource' is not defined”或我的任何其他命令说 "Not defined" st运行gely 足够我可以暂时解决这个问题,如果我只是去 "c = SetSource" 或任何其他命令,从代码中删除它们,重新 运行 和 window,然后将它们粘贴回原位,它们将起作用:但这很麻烦,我只是想要它在启动时正常工作。
第二个问题是当我将内容加载到文本字段并尝试使用“连接节点”按钮连接它们时,我收到错误提示“#错误:找不到源属性 'Object you loaded into the A Node textField'。”
有几件事我已经尝试过了,例如:启动问题我尝试将按钮和文本字段包装在它们自己的小 "def" 类别中,我将其命名为 ui():并在代码末尾发布 ui() ,这使得它 运行 在启动时很好,除非我 运行 脚本拒绝将任何内容加载到文本字段中
为了连接 t运行slates 的连接命令,我尝试使用 def connect(attr, *args) 而不是 def_connect() 但如果我尝试将 attr 作为 *args 命令它只是被忽略了,我被告知 "attr not defined"
我有点束手无策了。我正在编译我在其他脚本中所做的一切,以制作一个主脚本,用于在索具中添加辅助关节,这个双文本字段是我的最后一件事。
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 "undefined" 并且只让连接节点连接 t运行slates
您收到错误 Error: name 'SetSource' is not defined
的原因是您在创建按钮 之后定义了它。它需要在您设置按钮的命令功能之前进行评估,否则它无法找到它。这里的解决方法很简单,就是把你的3个函数移到最上面。
至于您的 connect
函数,您正在使用变量 source
和 target
,但这些变量未在该函数范围内的任何地方初始化,因此它失败了。相反,您需要查询 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)
好的,所以我正在做一个类似于我的其他问题之一的简单演示,它很简单 uite 简单,只需 运行 脚本,将对象加载到 A 节点,将一个对象加载到 B 节点,点击 "connect nodes" 然后你的 2 个项目的 t运行slate 将被连接。
至少,这就是我希望发生的事情。相反,我不断收到“# Error: name 'SetSource' is not defined”或我的任何其他命令说 "Not defined" st运行gely 足够我可以暂时解决这个问题,如果我只是去 "c = SetSource" 或任何其他命令,从代码中删除它们,重新 运行 和 window,然后将它们粘贴回原位,它们将起作用:但这很麻烦,我只是想要它在启动时正常工作。
第二个问题是当我将内容加载到文本字段并尝试使用“连接节点”按钮连接它们时,我收到错误提示“#错误:找不到源属性 'Object you loaded into the A Node textField'。”
有几件事我已经尝试过了,例如:启动问题我尝试将按钮和文本字段包装在它们自己的小 "def" 类别中,我将其命名为 ui():并在代码末尾发布 ui() ,这使得它 运行 在启动时很好,除非我 运行 脚本拒绝将任何内容加载到文本字段中
为了连接 t运行slates 的连接命令,我尝试使用 def connect(attr, *args) 而不是 def_connect() 但如果我尝试将 attr 作为 *args 命令它只是被忽略了,我被告知 "attr not defined"
我有点束手无策了。我正在编译我在其他脚本中所做的一切,以制作一个主脚本,用于在索具中添加辅助关节,这个双文本字段是我的最后一件事。
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 "undefined" 并且只让连接节点连接 t运行slates
您收到错误 Error: name 'SetSource' is not defined
的原因是您在创建按钮 之后定义了它。它需要在您设置按钮的命令功能之前进行评估,否则它无法找到它。这里的解决方法很简单,就是把你的3个函数移到最上面。
至于您的 connect
函数,您正在使用变量 source
和 target
,但这些变量未在该函数范围内的任何地方初始化,因此它失败了。相反,您需要查询 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)