Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import maya.OpenMayaUI as omui
- import maya.cmds as cmds
- import math
- import random
- from functools import partial
- from PySide import QtCore as qc
- from PySide import QtGui as qg
- from shiboken import *
- #-------------------------------------------------------#
- def maya_main_window():
- main_window_ptr = omui.MQtUtil.mainWindow()
- return wrapInstance(long(main_window_ptr), qg.QWidget)
- #-------------------------------------------------------#
- class RightClickMenuButton(qg.QPushButton):
- def __init__(self, name, parent=None):
- super(RightClickMenuButton, self).__init__(name)
- self.setContextMenuPolicy(qc.Qt.ActionsContextMenu)
- self.addMenuActions()
- self.buttonName = name
- def addMenuActions(self):
- delete = qg.QAction(self)
- delete.setText("remove")
- delete.triggered.connect(self.removeButton)
- self.addAction(delete)
- #
- shelf = qg.QAction(self)
- shelf.setText("send to shelf")
- shelf.triggered.connect(self.sendToShelf)
- self.addAction(shelf)
- def sendToShelf(self):
- print "send To Shelf -- tylko jeszcze nie dzialam."
- def removeButton(self):
- # classInstance = favoriteMaterial_UI()
- favoriteMaterial_UI.removeButton(self.buttonName)
- self.deleteLater()
- #-------------------------------------------------------#
- class favoriteMaterial_UI(qg.QDialog):
- __favList = []
- def __init__(self, parent=maya_main_window()):
- super(favoriteMaterial_UI, self).__init__()
- self.setWindowTitle("Favorite Materials")
- self.setWindowFlags(qc.Qt.Tool)
- self.setWindowFlags(qc.Qt.WindowStaysOnTopHint)
- self.setFixedWidth(220)
- self.setAttribute(qc.Qt.WA_DeleteOnClose) #!
- self.create_layout()
- def create_layout(self):
- main_layout = qg.QVBoxLayout()
- main_layout.setContentsMargins(5,5,5,5)
- main_layout.setSpacing(2)
- main_layout.setAlignment(qc.Qt.AlignTop)
- favWidget = qg.QWidget()
- favWidget.setLayout(qg.QVBoxLayout())
- favWidget.layout().setSpacing(0)
- favWidget.layout().setContentsMargins(2,2,2,2)
- favWidget.setSizePolicy(qg.QSizePolicy.Minimum, qg.QSizePolicy.Fixed)
- self.refreshButton = qg.QPushButton('Refresh')
- self.addButton = qg.QPushButton('Add')
- self.randomButton = qg.QPushButton('Random')
- func_layout = qg.QHBoxLayout()
- func_layout.setSpacing(2)
- func_layout.layout().addWidget(self.refreshButton)
- func_layout.layout().addWidget(self.addButton)
- func_layout.layout().addWidget(self.randomButton)
- self.shaders_layout = qg.QGridLayout()
- self.shaders_layout.setContentsMargins(2,2,2,15)
- favWidget.layout().addLayout(self.shaders_layout)
- favWidget.layout().addLayout(func_layout)
- self.refreshButton.clicked.connect(self.refreshSlot)
- self.addButton.clicked.connect(self.addSlot)
- self.randomButton.clicked.connect(self.generateRandomShader)
- main_layout.layout().addWidget(favWidget)
- self.setLayout(main_layout)
- self.createShaderList()
- def clearShaderList(self):
- while self.shaders_layout.count():
- child = self.shaders_layout.takeAt(0)
- if child.widget() is not None:
- child.widget().deleteLater()
- elif child.layout() is not None:
- clearLayout(child.layout())
- def createShaderList(self):
- #refreshList
- self.clearShaderList()
- buttons = {}
- shadersRange = len(self.__favList)
- #count rows/cols
- cols = math.ceil(float(shadersRange)/4)
- perRow = 4
- index = 0
- for i in range(int(cols)):
- if shadersRange < perRow:
- rowRange = shadersRange
- else:
- rowRange = 4
- shadersRange = shadersRange - perRow
- for j in range(int(rowRange)):
- # keep a reference to the buttons
- buttonName = str(self.__favList[index])
- buttons[(i, j)] = RightClickMenuButton(buttonName)
- # add to the layout
- self.shaders_layout.layout().addWidget(buttons[(i, j)], i, j)
- #connect signal
- buttons[(i, j)].clicked.connect(partial(self.assignSlot, index))
- index = index + 1
- def addSlot(self, shaderName=None):
- if shaderName:
- material = shaderName
- else:
- selection = cmds.ls(selection=True, materials=True)
- material = selection[0]
- if material not in self.__favList:
- self.__favList.append(material)
- else:
- print "Shader {0} already on the list. Skipping.".format(material)
- self.refreshSlot()
- @classmethod
- def removeButton(self, name):
- print self.__favList
- self.__favList.remove(name)
- print self.__favList
- print "Shader {0} deleted from list.".format(name)
- def refreshSlot(self):
- for index, slot in enumerate(self.__favList):
- #check if shader exist
- if not cmds.objExists(slot):
- self.__favList.pop(index)
- print "Shader {0} doesn't exist. Deleting from list.".format(slot)
- self.createShaderList()
- def checkShadingNode(self, shader, shaderSG):
- # a shading group
- if not cmds.objExists(shaderSG):
- shading_group= cmds.sets(renderable=True,noSurfaceShader=True,empty=True, name=shaderSG)
- else:
- shading_group=shaderSG
- slot1 = shader + ".outColor"
- slot2 = shading_group + ".surfaceShader"
- if not cmds.isConnected(slot1,slot2):
- #connect shader to sg surface shader
- cmds.connectAttr(slot1,slot2,force=1)
- def assignSlot(self, shader):
- sh = self.__favList[shader]
- shaderName = sh+"SG"
- if sh in self.__favList[shader]:
- self.checkShadingNode(sh, shaderName)
- cmds.sets(e=True, forceElement=shaderName)
- else:
- print "It seems that this shader '{0}' is not on your favourite list. Wtf? Almost impossible that you get there.".format(shaderName)
- def generateRandomShader(self):
- selection = cmds.ls(selection=True)
- for each in selection:
- self.randomShader(each)
- def randomShader(self, selection):
- shaderName = 'gS_'+selection
- shader=cmds.shadingNode('lambert',name=shaderName,asShader=1)
- # shader.color([random.random(),random.random(),random.random()])
- cmds.setAttr(shaderName + '.color', random.random(), random.random(), random.random())
- sg=cmds.sets(renderable=1,noSurfaceShader=1,empty=1,name=shaderName+'_SG')
- cmds.connectAttr( shaderName + ".outColor",sg + ".surfaceShader",force=1)
- cmds.sets(selection, e=True, forceElement=sg)
- self.addSlot(shaderName)
- ui = favoriteMaterial_UI()
- ui.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement