在maya中创建RenderNode并更新自定义UI

2024-09-29 19:27:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python不熟悉,所以这可能看起来微不足道。我到处寻找问题的答案,但似乎找不到。在

我有一个脚本,就像一个迷你Hypeshade窗口,它的主要功能是创建材质并加载用户在一次单击中选择的所有纹理文件。我想有一个选项,但当用户想连接一个噪音或一个棋盘格,例如一个文件输入(如凹凸,正常等)。这是通过调用“createRenderNode”窗口在maya中完成的。在

现在,我让它工作了,它连接到我想要的输入,但是我也希望在我的UI中的相应文本字段中获得这个文件的名称,但它没有,因为,当我的函数运行时,它得到一个空字符串,因为还没有任何东西连接到它。在

下面是我的代码(我尝试了很多次迭代):

# Error: 'NoneType' object is not iterable
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
#   File "<maya console>", line 49, in brwa
# TypeError: 'NoneType' object is not iterable #


import maya.cmds as cmds
import pymel.core as pm

def UI():

    if cmds.window("MatWindow", exists = True):
        cmds.deleteUI("MatWindow")

    mainwindow = cmds.window("MatWindow", t="Dummy UI", bgc=(0.2,0.2,0.2), mnb = False, mxb = False) 
    cmds.columnLayout()
    cmds.rowColumnLayout(nr = 1)
    cmds.textFieldGrp('mtNameTxt', l = "Material Name")
    cmds.setParent ( '..' )
    cmds.columnLayout()
    cmds.button("createlamb", l = "Create Lambert", c = 'lamb()')
    cmds.setParent ( '..' )
    cmds.rowColumnLayout('albclm', nr = 1)   
    cmds.textFieldGrp('albtxt', l = "Albedo", pht = "Albedo Map")
    cmds.iconTextButton('conna', w = 25, h = 20, i = "navButtonUnconnected.png", c = 'brwa()')
    cmds.setParent( '..' )
    cmds.separator(h = 20)
    cmds.text("Insert a name first, then create the lambert, then try to load a texture")
    cmds.showWindow()
    cmds.window("MatWindow", e = 1, w=550, h=150, sizeable = 0)

UI()

#=========== Lambert ===========#    
def lamb():
    matName = cmds.textFieldGrp('mtNameTxt', q = True, text = True)
    if cmds.objExists(matName) :
        cmds.confirmDialog( t = "Error", m = "Material name already exists, please choose another name.", b = "OK") 
    else :
        lambert = cmds.shadingNode("lambert", asShader = True, n = matName)
        shading_group = cmds.sets(r = True, nss = True, em = True, n = '%s_SG' %matName)
        cmds.connectAttr('%s.outColor' %matName ,'%s.surfaceShader' %shading_group)


def brwa():

    matName = cmds.textFieldGrp('mtNameTxt', q = True, text = True)## this gets the material name from the UI
    brwsa = '%s.color' %matName
    pm.defaultNavigation(destination = brwsa, createNew = 1)
    pm.defaultNavigation(destination = brwsa, defaultTraversal = 1) ## this opens the createRenderNode window
    brwsafile = cmds.listConnections(brwsa) ## this gets the connected file

    for fileName in brwsafile:   

        def button_cmd(_):
            # _ is a dummy argument the button sends, but you can ignore it
            cmds.select(fileName)

        cmds.iconTextButton('conna', edit = 1, i = "navButtonConnected.png", c = button_cmd)
        cmds.textFieldGrp('albtxt', edit = 1, text = fileName)

Tags: 文件thetextnametrueuidefbutton
1条回答
网友
1楼 · 发布于 2024-09-29 19:27:11

正如所写的,显而易见的问题是

^{1}$

由于您已将命令指定为字符串,因此不会将“fileName”传递给select命令,如果您意外地将一个名为fileName的变量留在全局范围内,则可能会间歇性地执行此操作;但它不会获取循环变量。在

基本上,由于here的原因,您根本不想将命令作为字符串传递。相反,直接传递一个函数对象。如果您内联定义函数,那么您甚至可以在定义函数的地方获取相关变量,以简化传递信息(上面的链接将更详细地介绍)。在

所以,像这样:

^{pr2}$

您的代码片段不完整,因此我无法测试它,但这是您提供的代码行中的基本问题。在

相关问题 更多 >

    热门问题