colourSliderGrp和setAttr之间的链接

时间:2017-05-31 19:13:08

标签: python maya

我有一段在Maya中使用的python代码,它应该通过UI colorSliderGrp从用户那里获取颜色,然后使用它来设置一种材料,并将所述颜色设置为某些圆柱体。

这是我的颜色滑块,在我拥有的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)

我在第三个函数中使用objName和color参数访问setMaterial,并且在我定义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 个答案:

答案 0 :(得分: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()