2017-05-31 21 views
1

我有一段python代码可以在Maya中使用,该代码应该通过UI colorSliderGrp从用户处获取颜色,并使用它来设置材质并将颜色设置为某些柱面。colourSliderGrp和setAttr之间的链接

这是我的颜色滑块,在createUI中函数中使用,我有:

colourControl=cmds.colorSliderGrp(label='Blue', rgb=(0, 0, 1)) 

然后,我有我的setMaterial功能:

def setMaterial(objName, colour, materialType='lambert'): 
    setName=cmds.sets(name='_MaterialGroup_', renderable=True, empty=True) 
    shaderName = cmds.shadingNode(materialType, asShader=True) 

    cmds.setAttr(shaderName+'.color', colour[0], colour[1], colour[2], type='double3') 

    cmds.surfaceShaderList(shaderName, add=setName) 
    cmds.sets(objName, edit=True, forceElement=setName) 

我访问setMaterial既OBJNAME和颜色参数在第三个函数中,我收到colourControl所在行的错误:

'NoneType' object has no attribute '__getitem__' 

我有以下的默认颜色的例子后尝试这样做:

def setMaterial(objName, materialType='lambert', colour=(0, 0, 1)): 
    setName=cmds.sets(name='_MaterialGroup_', renderable=True, empty=True) 
    shaderName = cmds.shadingNode(materialType, asShader=True) 

    cmds.setAttr(shaderName+'.color', colour[0], colour[1], colour[2], type='double3') 

    cmds.surfaceShaderList(shaderName, add=setName) 
    cmds.sets(objName, edit=True, forceElement=setName) 

我试过其他滑块以及和试图打印colourControl,看看我的工作,但我得到了

a|columnLayout73|colorSliderGrp58 

其中a是我的UI窗口的名称,columnLayout和colorSlider后面的数字在我的代码的每次运行时都会保持不变。

祝您有美好的一天!

回答

1

我有一个简单的工作版本的代码,应该按照您的预期工作。除非重用浮动滑块组,否则需要使用partial。如果是这样,您将看到如何使用滑块并查询颜色值。

import maya.cmds as cmds 
from functools import partial 

def setMaterial(objName, myColorSlider, matType, *args): 
    colorValue = cmds.colorSliderGrp(myColorSlider, q=True, rgb=True) 
    setName=cmds.sets(name='_MaterialGroup_', renderable=True, empty=True) 
    shaderName = cmds.shadingNode(matType, asShader=True) 
    cmds.setAttr(shaderName+'.color', colorValue[0], colorValue[1], colorValue[2], type='double3') 
    cmds.surfaceShaderList(shaderName, add=setName) 
    cmds.sets(objName, edit=True, forceElement=setName) 

cmds.window() 
cmds.columnLayout() 
myColorSlider = cmds.colorSliderGrp(label='Blue', rgb=(0, 0, 1)) 
cmds.colorSliderGrp(myColorSlider, edit=True, cc=partial(setMaterial, "pSphere1", myColorSlider, "lambert")) 
cmds.showWindow() 
+0

谢谢!我已经能够在我的代码中实现这个功能,即使没有这个部分,它现在也可以工作。如果我理解正确,部分应该改变球体的属性,因为我会改变滑块的位置?我不是在寻找,只是为了将颜色值传递给另一个函数中的setAttr。 –