gsee

AM_GolaemLayout py2.7

Aug 12th, 2020 (edited)
709
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.10 KB | None | 0 0
  1. import maya.cmds as mc
  2. import os
  3. from maya import OpenMayaUI as omui
  4. from shiboken2 import wrapInstance
  5. from PySide2 import QtCore, QtWidgets
  6. from glm.Qtpy.Qt import QtWidgets
  7. from glm.layout.layout import *
  8.  
  9. try:
  10.    app = QtWidgets.QApplication([])
  11. except:
  12.    app = None
  13.  
  14. mayaMainWindowPtr = omui.MQtUtil.mainWindow()
  15. mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QtWidgets.QWidget)
  16.  
  17. class GoalemLayoutUtils(QtWidgets.QWidget):
  18.     def __init__(self, parent=None):
  19.         super(GoalemLayoutUtils, self).__init__(parent)
  20.  
  21.         self.setWindowTitle('Gaolem Id Layout')
  22.         self.setParent(mayaMainWindow)
  23.         self.setWindowFlags(QtCore.Qt.Window)
  24.         self.golaem_link_proxy_to_fileHandle()
  25.         self.setup_ui()
  26.  
  27.     def setup_ui(self):
  28.         self.create_widgets()
  29.         self.create_layouts()
  30.         self.modify_widgets()
  31.         self.add_widgets_to_layouts()
  32.         self.setup_connections()
  33.         self.refresh()
  34.  
  35.     def create_widgets(self):
  36.         self.title_lbl = QtWidgets.QLabel('Crowd Id Delete')
  37.         self.crowdId_tw = QtWidgets.QTreeWidget()
  38.         self.add_btn = QtWidgets.QPushButton('Add')
  39.         self.del_btn = QtWidgets.QPushButton('Del')
  40.  
  41.     def create_layouts(self):
  42.         self.main_layout = QtWidgets.QVBoxLayout(self)
  43.         self.main_guId = QtWidgets.QVBoxLayout()
  44.         self.button_layout = QtWidgets.QHBoxLayout()
  45.  
  46.     def modify_widgets(self):
  47.         self.crowdId_tw.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
  48.  
  49.     def add_widgets_to_layouts(self):
  50.         [self.main_guId.addWidget(w) for w in (self.title_lbl, self.crowdId_tw)]
  51.         [self.button_layout.addWidget(w) for w in (self.add_btn, self.del_btn)]
  52.         [self.main_layout.addLayout(l) for l in (self.main_guId, self.button_layout)]
  53.  
  54.     def setup_connections(self):
  55.         self.add_btn.clicked.connect(self.addId)
  56.         self.del_btn.clicked.connect(self.delId)
  57.  
  58. #cree un dictionnaire pour savoir sur quelle crowd le script va marcher
  59. #On part du principe qu'on utilisera qu'un selector pour kill la crowd, on le cherche grace a son nom: Selector_lay_to_kill
  60. #le dictionnaire est de la sorte: le nom du proxy en clef, et une liste en value: le fileHandle qui est ce qu'a besoin golaem dans maya,
  61. #un true/false pour savoir si le selector existe, et l'id d'un node(le dernier, ou celui du selector si il existe)
  62.  
  63.     def golaem_link_proxy_to_fileHandle(self):
  64.         self.link_proxy_fileHandle = {}
  65.        
  66.         ls_proxy = mc.ls(type='SimulationCacheProxy')
  67.  
  68.         if not ls_proxy:
  69.             mc.error('No crowd file found')
  70.  
  71.         for proxy in ls_proxy:
  72.             golaem_path = mc.getAttr(proxy + '.layoutFile')
  73.             fileHandle = openLayoutFile(golaem_path)        
  74.  
  75.             if fileHandle is None:
  76.                 continue
  77.  
  78.             check_selector = False
  79.             rootId = getRootId(fileHandle)
  80.             nodeId = rootId
  81.  
  82.             for i in range(rootId):
  83.                 if not getNodeName(getNodeById(fileHandle, i)) == 'Selector_lay_to_kill':
  84.                     continue
  85.  
  86.                 check_selector = True
  87.                 nodeId = i
  88.  
  89.             self.link_proxy_fileHandle[proxy] = [fileHandle, check_selector, nodeId]
  90.  
  91. #Quand on ajoutera / supprimera / lancera le script, le refresh va se lancer.
  92. #Il regarde si le selector exist grave au True/False
  93. #Si True, il recupere la liste des Id de crowd dans le selector et les mets dans un listWidget qui aura pour nom son proxy
  94.  
  95.     def refresh(self):
  96.         self.crowdId_tw.clear()
  97.  
  98.         for key in self.link_proxy_fileHandle:
  99.             if not self.link_proxy_fileHandle[key][1]:
  100.                 continue
  101.  
  102.             lw_item = getNodeEntities(getNodeById(self.link_proxy_fileHandle[key][0], self.link_proxy_fileHandle[key][2]))
  103.             lw_item = list(lw_item.split(','))
  104.  
  105.             crowd_item = QtWidgets.QTreeWidgetItem(self.crowdId_tw, [key])
  106.             self.crowdId_tw.expandItem(crowd_item)
  107.  
  108.             for item in lw_item:
  109.                 QtWidgets.QTreeWidgetItem(crowd_item, [item])
  110.  
  111. #Quand on ajoute de la crowd, on check si la selection correspond bien a de la crowd grace son parent qui a pour nom un proxy(une des clefs du dictionnaire)
  112. #On check si le selector exist, le cree si non avec son node kill
  113. #On ajoute la crowd directement dans le selector, la fonction refresh va mettre a jour les listWidgets
  114.  
  115.     def addId(self):
  116.         sel = mc.ls(selection=True)        
  117.         if sel:
  118.             for s in sel:
  119.                 proxy = mc.listRelatives(s, parent=True)[0]
  120.  
  121.                 if not proxy in self.link_proxy_fileHandle.keys():
  122.                     continue
  123.  
  124.                 mc.select(s, r=True)
  125.                 character_id = mc.glmLayoutTool(cacheProxy=proxy, getSelectedEntities=True)
  126.  
  127.                 if not self.link_proxy_fileHandle[proxy][1]:
  128.                     fileHandle = self.link_proxy_fileHandle[proxy][0]
  129.                     previousNode = getNodeById(fileHandle, self.link_proxy_fileHandle[proxy][2])
  130.  
  131.                     lay_selector = createSelector(fileHandle, character_id, previousNode)
  132.                     setNodeName(lay_selector, 'Selector_lay_to_kill')
  133.                     createOperator(fileHandle, "Kill", lay_selector)
  134.  
  135.                     self.link_proxy_fileHandle[proxy][1] = True
  136.                     self.link_proxy_fileHandle[proxy][2] = getRootId(fileHandle)-1
  137.  
  138.                     continue
  139.  
  140.                 entities = getNodeEntities(getNodeById(self.link_proxy_fileHandle[proxy][0], self.link_proxy_fileHandle[proxy][2]))
  141.  
  142.                 if entities:
  143.                     str_entites = entities + ',' + character_id
  144.  
  145.                 else:
  146.                     str_entites = character_id
  147.  
  148.                 setNodeEntities(getNodeById(self.link_proxy_fileHandle[proxy][0], self.link_proxy_fileHandle[proxy][2]), str_entites)
  149.  
  150.             self.refresh()
  151.  
  152. #On recupere les crowd ID des index selectionner dans l'interface
  153. #On suprimme la crowd directement dans le selector, la fonction refresh va mettre a jour les listWidgets
  154.  
  155.     def delId(self):
  156.         item = []
  157.         selected_index = self.crowdId_tw.selectedIndexes()
  158.  
  159.         if selected_index:
  160.             for s in selected_index:
  161.                 id_select = QtCore.QModelIndex.data(s)
  162.                 id_proxy = QtCore.QModelIndex.parent(s)
  163.                 name_proxy = QtCore.QModelIndex.data(id_proxy)
  164.                 item.append([id_select, name_proxy])            
  165.  
  166.             for i in item:
  167.                 if i[1] not in self.link_proxy_fileHandle.keys():
  168.                     continue
  169.                
  170.                 entities = getNodeEntities(getNodeById(self.link_proxy_fileHandle[i[1]][0], self.link_proxy_fileHandle[i[1]][2]))
  171.                 entities = list(entities.split(','))
  172.                 entities.remove(i[0])
  173.                 str_entites = ','.join(entities)
  174.                 setNodeEntities(getNodeById(self.link_proxy_fileHandle[i[1]][0], self.link_proxy_fileHandle[i[1]][2]), str_entites)
  175.  
  176.             self.refresh()
  177.  
  178. try:
  179.     gu.close()
  180.  
  181. except:
  182.     pass
  183.  
  184. gu = GoalemLayoutUtils()
  185. gu.show()
Add Comment
Please, Sign In to add comment