【问题标题】:CreateRenderNode in maya and update the custom UIMaya 中的 CreateRenderNode 并更新自定义 UI
【发布时间】:2018-06-20 23:54:03
【问题描述】:

我是 Python 新手,所以这似乎微不足道。我到处搜索以找到问题的答案,但似乎找不到。

我有一个脚本,就像一个迷你 Hypeshade 窗口,它的主要功能是创建材质并一键加载用户选择的所有纹理文件。当用户想要将噪音或检查器连接到文件输入之一(如凹凸、正常等)时,我希望有一个选项。这是在 Maya 中通过调用“createRenderNode”窗口来完成的。

现在,我让它工作了,它连接到我想要的输入,但我也想在我的 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)

【问题讨论】:

    标签: python maya


    【解决方案1】:

    正如所写,明显的问题是

    cmds.iconTextButton('conna', edit = 1, i = "navButtonConnected.png", c = "cmds.select(fileName)")
    

    由于您已将命令指定为字符串,因此不会将“fileName”传递给 select 命令——如果您不小心将名为 fileName 的变量留在全局范围内,这可能会间歇性地工作;但它不会得到循环变量。

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

    所以,是这样的:

    def brwa():
    
         matName = cmds.textFieldGrp('mtNameTxt', q = True, text = True)## this gets the material name from the UI
         brwsa = matName + ".diffuse_color"                     
         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)
    

    您的 sn-p 不完整,因此我无法对其进行测试——但这是您提供的行中的基本问题。

    【讨论】:

    • 查看更长的代码,您必须能够 (1) 创建新材质并 (2) 在反照率贴图按钮中使用它。这是一个类的好案例,而不是单个函数,因为在代码实际运行之前您无法知道所需的所有信息
    • 我想你的意思是(1)创建文件纹理*而不是材质。所以我应该在我的主代码中创建一个这样做的类?再次抱歉问这种问题,我对这一切都很陌生。从主代码中按下按钮时我将如何调用它?
    • 另外,我设法通过使用scriptJob 命令使其工作,并将brwa() 函数一分为二。一点是创建窗口和纹理文件,只有当我实际单击以从窗口中选择我想要的文件时,第二个函数才会运行,给我名称和内容。但我认为这不是最好的方法,它每次都会给我带来奇怪的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多