maya python textField + object name 求助
maya python textField + object name Assistance Please
这是我的计划。首先创建一个关节并打开你的节点编辑器。创建关节后,将其命名为 "A_Joint" 在脚本 运行 之后点击 "load joint",然后在点击测试时点击 "test",您应该会创建一个名称为 "A_Joint_firstGuy"
此脚本的 objective 是根据您加载到文本字段中的任何内容的名称创建一个节点。它会把选中的对象的名字加到节点的名字前面
至少那是应该发生的事情,但事实上我缺乏解决这个问题的知识,而且迄今为止每次 google 搜索都没有结果。脚本在下面供任何愿意尝试的人使用,感谢您的宝贵时间,我希望收到您的回音:
https://drive.google.com/file/d/1NvL0MZCDJcKAnVu6voVNYbaW0HurZ6Rh/view?usp=sharing
或者在这里,采用 SO 格式:
import maya.cmds as cmds
if cmds.window(window, exists =True):
cmds.deleteUI(window)
window = cmds.window(title = "DS Selection Loader Demo", widthHeight=(300, 200) )
cmds.columnLayout(adjustableColumn=True)
def sld_loadHelperJoint():
sel = cmds.ls(selection=True)
selString = " ".join(sel)
add = cmds.textField('sld_surfaceTextHJ', edit=True, text=selString)
#def sld_loadParentJoint():
# sel = cmds.ls(selection=True)
# selString = " ".join(sel)
# add = cmds.textField('sld_surfaceTextPJ', edit=True, text=selString)
def createNode():
testNode = cmds.createNode( 'transform', selString = "sld_surfaceTextHJ", name = '_firstGuy' )
cmds.columnLayout(adjustableColumn=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
cmds.button( label='Load Helper Joint', command = "sld_loadHelperJoint()")
cmds.setParent('..')
#cmds.columnLayout(adjustableColumn=True)
#name = cmds.textField('sld_surfaceTextPJ', width =240)
#cmds.button( label="Load Parent Joint", command = "sld_loadParentJoint()")
#cmds.setParent('..')
testNode = cmds.createNode( 'transform', name = textField +'_firstGuy' )
# you must first create "def" group for the attributes you
# want to be created via button, "testNode" is our example
# Connect the translation of two nodes together
#cmds.connectAttr( 'firstGuy.t', 'secondGuy.translate' )
# Connect the rotation of one node to the override colour
# of a second node.
#cmds.connectAttr( 'firstGuy.rotate', 'secondGuy.overrideColor' )
cmds.showWindow (window)
好的,这里有一些事情需要考虑。
首先,Maya gui 小部件看起来像字符串 -- 就像您制作一个 polyCube 并且它以字符串 'pCube1' 的形式返回给您一样,小部件将以类似于 'myWindow' 的字符串返回或 'textField72'。就像处理场景对象一样,您始终需要捕获命令的结果,以便了解它的真正名称——您不能保证会得到您要求的名称,因此请始终捕获结果。
所以你想做这样的事情,只是为了让图形运行:
window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
load_button = cmds.button( label='Load Helper Joint')
cmds.show_window(window)
例如,如果您需要询问文本字段中的内容,您可以这样做:
text_contents = cmds.textField(sld_textFld, q=True, text=True)
你注意到那是 变量,而不是字符串,所以我们确定我们有任何工作。
不过,要使按钮使用该信息,按钮脚本需要能够访问该变量。有几种方法可以做到这一点——这是一个常见的堆栈溢出问题——但最简单的方法就是在已有该变量的地方定义按钮命令。所以上面的例子变成了:
window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
def set_textfield(_):
sel = cmds.ls(selection=True)
add = cmds.textField(sld_textFld, edit=True, text=sel[0])
load_button = cmds.button( label='Load Helper Joint', c = set_textfield)
cmds.showWindow(window)
这里有两位。
一个是函数定义中的_
; Maya 按钮始终使用一个参数调用它们的函数。下划线没有什么神奇之处,它只是 Python "ignore me" 的俚语——但如果你在函数 def 中没有参数,它将失败。
更重要的一点是按钮直接给出了函数定义,没有引号。您说的是单击时调用此函数。如果您使用字符串版本——MEL 的遗留版本——稍后您将 运行 遇到问题。详细解释了原因 here 但 TLDR 是不使用字符串形式。曾经。
现在结构部分已经到位,您应该能够将节点创建到我调用的函数 set_textfield()
或创建第二个 button\function 组合来执行实际的节点创建,类似于:
window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
def set_textfield(_):
sel = cmds.ls(selection=True)
cmds.textField(sld_textFld, edit=True, text=sel[0])
load_button = cmds.button( label='Load Helper Joint', c = set_textfield)
def make_node(_):
text_value = cmds.textField(sld_textFld, q = True, text=True)
if text_value:
print "created:", cmds.createNode('transform', n=text_value +'_firstGuy')
else:
cmds.warning("select an object and add it to the window first!")
node_button = cmds.button( label='Make Node', c = make_node)
cmds.showWindow(window)
这是我的计划。首先创建一个关节并打开你的节点编辑器。创建关节后,将其命名为 "A_Joint" 在脚本 运行 之后点击 "load joint",然后在点击测试时点击 "test",您应该会创建一个名称为 "A_Joint_firstGuy"
此脚本的 objective 是根据您加载到文本字段中的任何内容的名称创建一个节点。它会把选中的对象的名字加到节点的名字前面
至少那是应该发生的事情,但事实上我缺乏解决这个问题的知识,而且迄今为止每次 google 搜索都没有结果。脚本在下面供任何愿意尝试的人使用,感谢您的宝贵时间,我希望收到您的回音:
https://drive.google.com/file/d/1NvL0MZCDJcKAnVu6voVNYbaW0HurZ6Rh/view?usp=sharing
或者在这里,采用 SO 格式:
import maya.cmds as cmds
if cmds.window(window, exists =True):
cmds.deleteUI(window)
window = cmds.window(title = "DS Selection Loader Demo", widthHeight=(300, 200) )
cmds.columnLayout(adjustableColumn=True)
def sld_loadHelperJoint():
sel = cmds.ls(selection=True)
selString = " ".join(sel)
add = cmds.textField('sld_surfaceTextHJ', edit=True, text=selString)
#def sld_loadParentJoint():
# sel = cmds.ls(selection=True)
# selString = " ".join(sel)
# add = cmds.textField('sld_surfaceTextPJ', edit=True, text=selString)
def createNode():
testNode = cmds.createNode( 'transform', selString = "sld_surfaceTextHJ", name = '_firstGuy' )
cmds.columnLayout(adjustableColumn=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
cmds.button( label='Load Helper Joint', command = "sld_loadHelperJoint()")
cmds.setParent('..')
#cmds.columnLayout(adjustableColumn=True)
#name = cmds.textField('sld_surfaceTextPJ', width =240)
#cmds.button( label="Load Parent Joint", command = "sld_loadParentJoint()")
#cmds.setParent('..')
testNode = cmds.createNode( 'transform', name = textField +'_firstGuy' )
# you must first create "def" group for the attributes you
# want to be created via button, "testNode" is our example
# Connect the translation of two nodes together
#cmds.connectAttr( 'firstGuy.t', 'secondGuy.translate' )
# Connect the rotation of one node to the override colour
# of a second node.
#cmds.connectAttr( 'firstGuy.rotate', 'secondGuy.overrideColor' )
cmds.showWindow (window)
好的,这里有一些事情需要考虑。
首先,Maya gui 小部件看起来像字符串 -- 就像您制作一个 polyCube 并且它以字符串 'pCube1' 的形式返回给您一样,小部件将以类似于 'myWindow' 的字符串返回或 'textField72'。就像处理场景对象一样,您始终需要捕获命令的结果,以便了解它的真正名称——您不能保证会得到您要求的名称,因此请始终捕获结果。
所以你想做这样的事情,只是为了让图形运行:
window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
load_button = cmds.button( label='Load Helper Joint')
cmds.show_window(window)
例如,如果您需要询问文本字段中的内容,您可以这样做:
text_contents = cmds.textField(sld_textFld, q=True, text=True)
你注意到那是 变量,而不是字符串,所以我们确定我们有任何工作。
不过,要使按钮使用该信息,按钮脚本需要能够访问该变量。有几种方法可以做到这一点——这是一个常见的堆栈溢出问题——但最简单的方法就是在已有该变量的地方定义按钮命令。所以上面的例子变成了:
window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
def set_textfield(_):
sel = cmds.ls(selection=True)
add = cmds.textField(sld_textFld, edit=True, text=sel[0])
load_button = cmds.button( label='Load Helper Joint', c = set_textfield)
cmds.showWindow(window)
这里有两位。
一个是函数定义中的_
; Maya 按钮始终使用一个参数调用它们的函数。下划线没有什么神奇之处,它只是 Python "ignore me" 的俚语——但如果你在函数 def 中没有参数,它将失败。
更重要的一点是按钮直接给出了函数定义,没有引号。您说的是单击时调用此函数。如果您使用字符串版本——MEL 的遗留版本——稍后您将 运行 遇到问题。详细解释了原因 here 但 TLDR 是不使用字符串形式。曾经。
现在结构部分已经到位,您应该能够将节点创建到我调用的函数 set_textfield()
或创建第二个 button\function 组合来执行实际的节点创建,类似于:
window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
def set_textfield(_):
sel = cmds.ls(selection=True)
cmds.textField(sld_textFld, edit=True, text=sel[0])
load_button = cmds.button( label='Load Helper Joint', c = set_textfield)
def make_node(_):
text_value = cmds.textField(sld_textFld, q = True, text=True)
if text_value:
print "created:", cmds.createNode('transform', n=text_value +'_firstGuy')
else:
cmds.warning("select an object and add it to the window first!")
node_button = cmds.button( label='Make Node', c = make_node)
cmds.showWindow(window)