【问题标题】:maya python textField + object name Assistance Pleasemaya python textField +对象名称协助请
【发布时间】:2019-05-18 12:04:53
【问题描述】:

这是我的计划。首先创建一个关节并打开您的节点编辑器。创建关节后,运行脚本后将其命名为“A_Joint”并点击“加载关节”,然后在点击测试时点击“测试”,您应该会创建一个名为“A_Joint_firstGuy”的节点

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

至少这是应该发生的事情,但事实上我缺乏解决这个问题的知识,而且迄今为止每次谷歌搜索都没有结果。脚本在下面供任何愿意尝试的人使用,感谢您的宝贵时间,我希望收到您的回复:

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】:

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

    首先,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() 的函数中,或者创建第二个按钮\函数组合来执行实际的节点创建,例如:

    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)
    

    【讨论】:

    • 非常感谢您的回复@theodox,您让我解决了困扰我好几天的问题!不过,我确实有另一个问题,假设我想更进一步地使用这个脚本并使用文本字段创建 2 个节点然后通过说连接这两个属性,为了这个示例,A_Joints 的节点旋转到 B_Joint 的节点旋转:我将如何是否要修改脚本来做到这一点?
    • 很容易制作更多的字段和按钮来处理额外的输入。然后你会想要最后一个按钮来收集输入并进行连接,或者如果用户试图说“连接”但没有给你任何可以使用的东西,则会提供一个很好的警告
    • 有没有办法实现一键创建节点和连接属性?
    • 主要是因为我正在创建快捷方式的过程有 4 个不同的节点要创建,所以与其手动连接所有节点,只需加载一个关节会更容易,根据关节名称创建节点在文本字段中,然后在创建它们的同时将所有这些关节连接到它们的各种输出..
    • 嘿@theodox,如果你不介意我问:你认识任何maya python 导师吗?如果您不喜欢它,您不必回答,但是我自己查找信息似乎并不顺利:所以我宁愿为这些东西找一个导师,而不是用可能是新手的东西把 stackoverflow 的论坛弄得乱七八糟从专业的角度提出问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2016-05-30
    相关资源
    最近更新 更多