maya python textField +对象名称请求帮助

问题描述 投票:0回答:1

这是我的计划。首先创建一个联合并打开您的节点编辑器。当您创建了关节时,在运行脚本后将其命名为“A_Joint”命中“load joint”,然后在按下测试时点击“test”,您应该获得一个名为“A_Joint_firstGuy”的节点

此脚本的目标是基于您加载到textField中的任何名称创建节点。它将采用所选对象的名称并将其添加到节点名称的前面

至少应该发生什么,但实际上我缺乏了解这一点的知识,并且迄今为止每个谷歌搜索都没有结果。如果有人愿意接受破解,那么脚本就在下面了,感谢您的时间,我希望收到您的回复:

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)
python textfield maya autodesk
1个回答
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)

你注意到变量而不是字符串,所以我们确信我们有任何工作。

但是,要使按钮使用该信息,按钮脚本需要能够访问该变量。有几种方法可以做到这一点 - 这是一个常见的堆栈溢出问题 - 但最简单的方法就是定义已经拥有该变量的按钮命令。所以上面的例子变成:

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()的函数,或者创建第二个按钮\ 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)
© www.soinside.com 2019 - 2024. All rights reserved.