maya python textField +对象名称协助

时间:2018-12-18 05:18:26

标签: python textfield maya autodesk

这是我的计划。首先创建一个关节,然后打开您的节点编辑器。创建关节后,将其命名为“ A_Joint”,然后在运行脚本后单击“ load joint”,然后在单击test时单击“ test”,则应创建一个名称为“ A_Joint_firstGuy”的节点。

此脚本的目标是根据您加载到textField中的任何内容的名称创建一个节点。它将使用所选对象的名称,并将其添加到节点名称的前面

这就是应该发生的事情,但实际上我缺乏了解这一点的知识,到目前为止,每个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)

1 个答案:

答案 0 :(得分:0)

好的,这里有一些事情要考虑。

首先,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)

例如,如果您需要询问textField中的内容,则可以这样做:

text_contents = cmds.textField(sld_textFld, q=True, text=True)

您会注意到,它与变量一起使用,而不是字符串,因此我们确定可以进行任何操作。

但是,要使按钮使用该信息,按钮脚本需要有权访问变量。有几种方法可以做到这一点-这是一个常见的堆栈溢出问题-但最简单的方法是在已经具有该变量的位置定义button命令。因此,上面的示例变为:

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语“忽略我”-但是,如果函数def中没有参数,它将失败。

更重要的一点是,直接为按钮提供了功能定义,不带引号。您是说在点击时调用此功能。如果使用字符串版本-来自MEL的保留-稍后将遇到问题。原因here进行了详细说明,但TLDR不使用字符串形式。曾经。

现在结构已经就绪,您应该能够将节点创建到我称为set_textfield()的函数中,或者制作另一个按钮\函数组合来进行实际的节点创建,例如: / p>

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)