Advertisement
Guest User

favMaterial

a guest
Mar 20th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.09 KB | None | 0 0
  1. import maya.OpenMayaUI as omui
  2. import maya.cmds as cmds
  3. import math
  4. import random
  5. from functools import partial
  6. from PySide import QtCore as qc
  7. from PySide import QtGui as qg
  8. from shiboken import *
  9.  
  10. #-------------------------------------------------------#
  11. def maya_main_window():
  12.     main_window_ptr = omui.MQtUtil.mainWindow()
  13.     return wrapInstance(long(main_window_ptr), qg.QWidget)
  14. #-------------------------------------------------------#
  15. class RightClickMenuButton(qg.QPushButton):
  16.     def __init__(self, name, parent=None):
  17.         super(RightClickMenuButton, self).__init__(name)
  18.         self.setContextMenuPolicy(qc.Qt.ActionsContextMenu)
  19.         self.addMenuActions()
  20.         self.buttonName = name
  21.     def addMenuActions(self):
  22.         delete = qg.QAction(self)
  23.         delete.setText("remove")
  24.         delete.triggered.connect(self.removeButton)
  25.         self.addAction(delete)
  26.         #
  27.         shelf = qg.QAction(self)
  28.         shelf.setText("send to shelf")
  29.         shelf.triggered.connect(self.sendToShelf)
  30.         self.addAction(shelf)
  31.     def sendToShelf(self):
  32.         print "send To Shelf -- tylko jeszcze nie dzialam."
  33.     def removeButton(self):
  34.         # classInstance = favoriteMaterial_UI()
  35.         favoriteMaterial_UI.removeButton(self.buttonName)
  36.         self.deleteLater()
  37. #-------------------------------------------------------#
  38. class favoriteMaterial_UI(qg.QDialog):
  39.     __favList = []
  40.     def __init__(self, parent=maya_main_window()):
  41.         super(favoriteMaterial_UI, self).__init__()
  42.         self.setWindowTitle("Favorite Materials")
  43.         self.setWindowFlags(qc.Qt.Tool)
  44.         self.setWindowFlags(qc.Qt.WindowStaysOnTopHint)
  45.         self.setFixedWidth(220)
  46.         self.setAttribute(qc.Qt.WA_DeleteOnClose) #!
  47.         self.create_layout()
  48.     def create_layout(self):
  49.         main_layout = qg.QVBoxLayout()
  50.         main_layout.setContentsMargins(5,5,5,5)
  51.         main_layout.setSpacing(2)
  52.         main_layout.setAlignment(qc.Qt.AlignTop)
  53.  
  54.         favWidget = qg.QWidget()
  55.         favWidget.setLayout(qg.QVBoxLayout())
  56.         favWidget.layout().setSpacing(0)
  57.         favWidget.layout().setContentsMargins(2,2,2,2)
  58.         favWidget.setSizePolicy(qg.QSizePolicy.Minimum, qg.QSizePolicy.Fixed)
  59.  
  60.         self.refreshButton = qg.QPushButton('Refresh')
  61.         self.addButton = qg.QPushButton('Add')
  62.         self.randomButton = qg.QPushButton('Random')
  63.         func_layout = qg.QHBoxLayout()
  64.         func_layout.setSpacing(2)
  65.         func_layout.layout().addWidget(self.refreshButton)
  66.         func_layout.layout().addWidget(self.addButton)
  67.         func_layout.layout().addWidget(self.randomButton)
  68.      
  69.         self.shaders_layout = qg.QGridLayout()
  70.         self.shaders_layout.setContentsMargins(2,2,2,15)
  71.      
  72.         favWidget.layout().addLayout(self.shaders_layout)
  73.         favWidget.layout().addLayout(func_layout)
  74.  
  75.         self.refreshButton.clicked.connect(self.refreshSlot)
  76.         self.addButton.clicked.connect(self.addSlot)
  77.         self.randomButton.clicked.connect(self.generateRandomShader)
  78.  
  79.         main_layout.layout().addWidget(favWidget)
  80.         self.setLayout(main_layout)
  81.         self.createShaderList()
  82.  
  83.     def clearShaderList(self):
  84.         while self.shaders_layout.count():
  85.             child = self.shaders_layout.takeAt(0)
  86.             if child.widget() is not None:
  87.                 child.widget().deleteLater()
  88.             elif child.layout() is not None:
  89.                 clearLayout(child.layout())
  90.  
  91.     def createShaderList(self):
  92.         #refreshList
  93.         self.clearShaderList()
  94.  
  95.         buttons = {}
  96.         shadersRange = len(self.__favList)
  97.         #count rows/cols
  98.         cols = math.ceil(float(shadersRange)/4)
  99.         perRow = 4
  100.         index = 0
  101.         for i in range(int(cols)):
  102.             if shadersRange < perRow:
  103.                 rowRange = shadersRange
  104.             else:
  105.                 rowRange = 4
  106.             shadersRange = shadersRange - perRow
  107.  
  108.             for j in range(int(rowRange)):
  109.                 # keep a reference to the buttons
  110.                 buttonName = str(self.__favList[index])
  111.                 buttons[(i, j)] = RightClickMenuButton(buttonName)
  112.                 # add to the layout
  113.                 self.shaders_layout.layout().addWidget(buttons[(i, j)], i, j)
  114.                 #connect signal
  115.                 buttons[(i, j)].clicked.connect(partial(self.assignSlot, index))
  116.                 index = index + 1
  117.  
  118.     def addSlot(self, shaderName=None):
  119.         if shaderName:
  120.             material = shaderName
  121.         else:
  122.             selection = cmds.ls(selection=True, materials=True)
  123.             material = selection[0]
  124.         if material not in self.__favList:
  125.             self.__favList.append(material)
  126.         else:  
  127.             print "Shader {0} already on the list. Skipping.".format(material)
  128.         self.refreshSlot()
  129.  
  130.     @classmethod
  131.     def removeButton(self, name):
  132.         print self.__favList
  133.         self.__favList.remove(name)
  134.         print self.__favList
  135.         print "Shader {0} deleted from list.".format(name)
  136.    
  137.     def refreshSlot(self):
  138.         for index, slot in enumerate(self.__favList):
  139.             #check if shader exist
  140.             if not cmds.objExists(slot):
  141.                 self.__favList.pop(index)
  142.                 print "Shader {0} doesn't exist. Deleting from list.".format(slot)
  143.         self.createShaderList()
  144.    
  145.     def checkShadingNode(self, shader, shaderSG):  
  146.         # a shading group
  147.         if not cmds.objExists(shaderSG):
  148.             shading_group= cmds.sets(renderable=True,noSurfaceShader=True,empty=True, name=shaderSG)
  149.         else:
  150.             shading_group=shaderSG
  151.         slot1 = shader + ".outColor"
  152.         slot2 = shading_group + ".surfaceShader"
  153.         if not cmds.isConnected(slot1,slot2):
  154.             #connect shader to sg surface shader
  155.             cmds.connectAttr(slot1,slot2,force=1)
  156.    
  157.     def assignSlot(self, shader):
  158.         sh = self.__favList[shader]
  159.         shaderName = sh+"SG"
  160.         if sh in self.__favList[shader]:
  161.             self.checkShadingNode(sh, shaderName)
  162.             cmds.sets(e=True, forceElement=shaderName)
  163.         else:
  164.             print "It seems that this shader '{0}' is not on your favourite list. Wtf? Almost impossible that you get there.".format(shaderName)
  165.  
  166.     def generateRandomShader(self):
  167.         selection = cmds.ls(selection=True)
  168.         for each in selection:
  169.             self.randomShader(each)
  170.  
  171.    
  172.     def randomShader(self, selection):
  173.         shaderName = 'gS_'+selection
  174.         shader=cmds.shadingNode('lambert',name=shaderName,asShader=1)
  175.         # shader.color([random.random(),random.random(),random.random()])
  176.         cmds.setAttr(shaderName + '.color', random.random(), random.random(), random.random())
  177.  
  178.         sg=cmds.sets(renderable=1,noSurfaceShader=1,empty=1,name=shaderName+'_SG')
  179.         cmds.connectAttr( shaderName + ".outColor",sg + ".surfaceShader",force=1)
  180.         cmds.sets(selection, e=True, forceElement=sg)
  181.  
  182.         self.addSlot(shaderName)
  183.        
  184.  
  185. ui = favoriteMaterial_UI()
  186. ui.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement