Guest User

Untitled

a guest
Apr 12th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.01 KB | None | 0 0
  1. import os
  2. import math
  3. import random
  4. from functools import partial
  5.  
  6. import maya.cmds as cmds
  7. import maya.OpenMayaUI as omui
  8. import pymel.core as pm
  9.  
  10. from PySide import QtCore as qc
  11. from PySide import QtGui as qg
  12. import System.QTutils as qu
  13. reload(qu)
  14.  
  15. uiFile = "C:/kTools/__favoriteMaterial/ui/main.ui"
  16. uiSettings = "C:/kTools/__favoriteMaterial/ui/settings.ui"
  17. favList = []
  18. ports = {}
  19. # favList = ['blinn1', 'lambert1', 'anisotropic2', 'anisotropic1']
  20. # favList = ['blinn1', 'lambert1', 'anisotropic2', 'anisotropic1']
  21. form_class, base_class = qu.loadUiType(uiFile)
  22.  
  23. def maya_main_window():
  24.     main_window_ptr = omui.MQtUtil.mainWindow()
  25.     return qu.wrapinstance(long(main_window_ptr), qg.QMainWindow)
  26.  
  27. class favoriteMaterial_UI(form_class, base_class):
  28.     def __init__(self, parent=maya_main_window()):
  29.         super(favoriteMaterial_UI, self).__init__(parent)
  30.         self.setupUi(self)
  31.        
  32.         #assign functions to ui
  33.         self.addSlotButton.clicked.connect(self.addSlot)
  34.         self.refreshSlotButton.clicked.connect(self.refreshSlot)
  35.         self.importLibraryAction.triggered.connect(self.importLibrary) 
  36.         self.exportLibraryAction.triggered.connect(self.exportLibrary) 
  37.         # self.settingsAction.triggered.connect(self.openSettings) 
  38.         self.randomShaderButton.clicked.connect(self.newMaterial)
  39.  
  40.         self.displayLibrary()
  41.  
  42.     def displayLibrary(self):
  43.         #this is creating layout from favList[], like adding it to grid 4xN, creating swatches and context menus.
  44.        
  45.         #before runing this function, make sure you do not have any swatches (ports[]), cause maya would just make new ones over the old ones.
  46.         self.clearAllSwatches()
  47.         if favList:
  48.             # Create the port using cmds first. I couldn't get the displayPort to work unless I created a window first
  49.             tempwin = cmds.window()
  50.             cmds.columnLayout()
  51.             buttons = {}
  52.             shadersRange = len(favList)
  53.             cols = math.ceil(float(shadersRange)/4)
  54.             perRow = 4
  55.             index = 0
  56.             labels = {}
  57.             vLayouts = {}
  58.             qPorts = {}
  59.  
  60.             for i in range(int(cols)):
  61.                 if shadersRange < perRow:
  62.                     rowRange = shadersRange
  63.                 else:
  64.                     rowRange = 4
  65.                 shadersRange = shadersRange - perRow
  66.                 for j in range(int(rowRange)):
  67.                     labelName = str(favList[index])
  68.                     labels[(i, j)] = qg.QPushButton(labelName)
  69.                     labels[(i, j)].setObjectName(labelName)
  70.                     labels[(i,j)].setFixedSize(qc.QSize(50,20))
  71.                     labels[(i, j)].clicked.connect(partial(self.assignSlot, index))
  72.                     ports[index] = cmds.swatchDisplayPort(labelName, rs=50, wh=(50, 50), sn=labelName)
  73.                     qPorts[(i,j)] = qu.toQtObject(ports[index])
  74.                     qPorts[(i,j)].setContextMenuPolicy(qc.Qt.ActionsContextMenu)
  75.  
  76.                     edit = qg.QAction(self)
  77.                     edit.setText("edit")
  78.                     edit.triggered.connect(partial(self.editSlot, index))
  79.  
  80.                     delete = qg.QAction(self)
  81.                     delete.setText("remove from library")
  82.                     delete.triggered.connect(partial(self.deleteSlot, index))
  83.                     # delete.triggered.connect(self.deleteSlot)
  84.  
  85.                     deleteNet = qg.QAction(self)
  86.                     deleteNet.setText("delete network")
  87.                     deleteNet.triggered.connect(partial(self.deleteNetwork, index))
  88.  
  89.                     duplicateNet = qg.QAction(self)
  90.                     duplicateNet.setText("duplicate network")
  91.                     duplicateNet.triggered.connect(partial(self.duplicateNetwork, index))      
  92.  
  93.                     qPorts[(i,j)].addAction(edit)
  94.                     qPorts[(i,j)].addAction(delete)
  95.                     qPorts[(i,j)].addAction(deleteNet)
  96.                     qPorts[(i,j)].addAction(duplicateNet)
  97.                     vLayouts[(i,j)] = qg.QVBoxLayout()
  98.                     vLayouts[(i,j)].addWidget(qPorts[(i,j)])
  99.                     vLayouts[(i,j)].addWidget(labels[(i,j)])
  100.  
  101.                     self.shadersGrid.layout().addLayout(vLayouts[(i,j)], i, j)
  102.                     index = index + 1
  103.             cmds.deleteUI(tempwin)
  104.  
  105.     def addSlot(self, shaderName=None):
  106.         #Add selected material to FavList[] after few checks
  107.         if shaderName:
  108.             if cmds.objExists(shaderName):
  109.                 material = shaderName
  110.             else:
  111.                 print "Material doesn't exist."
  112.                 material = None
  113.         elif cmds.ls(selection=True):
  114.             selection = cmds.ls(selection=True, materials=True)
  115.             if selection:
  116.                 material = selection[0]
  117.             else: material = None
  118.         else:
  119.             print "Something went wrong. Maybe your material doesn't exists?"
  120.             material = None
  121.  
  122.         if material:
  123.             if material not in favList:
  124.                 favList.append(material)
  125.             else:  
  126.                 print "Shader {0} already on the list. Skipping.".format(material)
  127.             self.refreshSlot()
  128.     def clearAllSwatches(self):
  129.         #this should delete all shader swatches
  130.         if ports:
  131.             for index, port in enumerate(ports):
  132.                 if (cmds.swatchDisplayPort(ports[index], exists=True)):
  133.                     print "DelUI to {0}".format(ports[index])
  134.                     cmds.deleteUI(ports[index])
  135.  
  136.     def clearSwatch(self, slot):
  137.         #this should delete selected swatch
  138.         if (cmds.swatchDisplayPort(ports[slot], exists=True)):
  139.             cmds.deleteUI(ports[slot])
  140.  
  141.     def refreshSlot(self):
  142.         #check if shader exists in maya, if not pop from a list
  143.         # after that just displayList again.
  144.         for index, slot in enumerate(favList):
  145.             if not cmds.objExists(slot):
  146.                 favList.pop(index)
  147.                 print "Shader {0} doesn't exist. Deleting from list.".format(slot)
  148.         self.displayLibrary()
  149.  
  150.     def editSlot(self, material):
  151.         #just select material
  152.         materialName = str(favList[material])
  153.         cmds.select(materialName, r=True )
  154.  
  155.     def deleteSlot(self, material=None):
  156.         #delete Slot / this is context menu option
  157.         #
  158.         self.clearSwatch(material)
  159.         favList.pop(0)
  160.         # print "Shader {0} deleted from list.".format(name)
  161.         self.refreshSlot()
  162.  
  163.     def deleteNetwork(self, material):
  164.         # / this is context menu option
  165.         pass
  166.     def duplicateNetwork(self, material):
  167.         # / this is context menu option
  168.         pass
  169.  
  170.     def assignSlot(self, material):
  171.         # / this is context menu option
  172.         print "I'm working!"
  173.  
  174.     def checkShadingNode(self):
  175.         pass
  176.     def newMaterial(self):
  177.         # create new random material
  178.  
  179.         #right now its just used for testing.
  180.  
  181.         # line below seems to work well?
  182.         # self.clearSwatch(0)
  183.  
  184.         #line below is hell
  185.         self.clearAllSwatches()
  186.  
  187.     def importLibrary(self):
  188.         # / this is context menu option
  189.         pass
  190.     def exportLibrary(self):
  191.         # / this is context menu option
  192.         pass
Add Comment
Please, Sign In to add comment