Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import maya.cmds as mc
- import os
- from maya import OpenMayaUI as omui
- from shiboken2 import wrapInstance
- from PySide2 import QtCore, QtWidgets
- from glm.Qtpy.Qt import QtWidgets
- from glm.layout.layout import *
- try:
- app = QtWidgets.QApplication([])
- except:
- app = None
- mayaMainWindowPtr = omui.MQtUtil.mainWindow()
- mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QtWidgets.QWidget)
- class GoalemLayoutUtils(QtWidgets.QWidget):
- def __init__(self, parent=None):
- super(GoalemLayoutUtils, self).__init__(parent)
- self.setWindowTitle('Gaolem Id Layout')
- self.setParent(mayaMainWindow)
- self.setWindowFlags(QtCore.Qt.Window)
- self.golaem_link_proxy_to_fileHandle()
- self.setup_ui()
- def setup_ui(self):
- self.create_widgets()
- self.create_layouts()
- self.modify_widgets()
- self.add_widgets_to_layouts()
- self.setup_connections()
- self.refresh()
- def create_widgets(self):
- self.title_lbl = QtWidgets.QLabel('Crowd Id Delete')
- self.crowdId_tw = QtWidgets.QTreeWidget()
- self.add_btn = QtWidgets.QPushButton('Add')
- self.del_btn = QtWidgets.QPushButton('Del')
- def create_layouts(self):
- self.main_layout = QtWidgets.QVBoxLayout(self)
- self.main_guId = QtWidgets.QVBoxLayout()
- self.button_layout = QtWidgets.QHBoxLayout()
- def modify_widgets(self):
- self.crowdId_tw.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
- def add_widgets_to_layouts(self):
- [self.main_guId.addWidget(w) for w in (self.title_lbl, self.crowdId_tw)]
- [self.button_layout.addWidget(w) for w in (self.add_btn, self.del_btn)]
- [self.main_layout.addLayout(l) for l in (self.main_guId, self.button_layout)]
- def setup_connections(self):
- self.add_btn.clicked.connect(self.addId)
- self.del_btn.clicked.connect(self.delId)
- #cree un dictionnaire pour savoir sur quelle crowd le script va marcher
- #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
- #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,
- #un true/false pour savoir si le selector existe, et l'id d'un node(le dernier, ou celui du selector si il existe)
- def golaem_link_proxy_to_fileHandle(self):
- self.link_proxy_fileHandle = {}
- ls_proxy = mc.ls(type='SimulationCacheProxy')
- if not ls_proxy:
- mc.error('No crowd file found')
- for proxy in ls_proxy:
- golaem_path = mc.getAttr(proxy + '.layoutFile')
- fileHandle = openLayoutFile(golaem_path)
- if fileHandle is None:
- continue
- check_selector = False
- rootId = getRootId(fileHandle)
- nodeId = rootId
- for i in range(rootId):
- if not getNodeName(getNodeById(fileHandle, i)) == 'Selector_lay_to_kill':
- continue
- check_selector = True
- nodeId = i
- self.link_proxy_fileHandle[proxy] = [fileHandle, check_selector, nodeId]
- #Quand on ajoutera / supprimera / lancera le script, le refresh va se lancer.
- #Il regarde si le selector exist grave au True/False
- #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
- def refresh(self):
- self.crowdId_tw.clear()
- for key in self.link_proxy_fileHandle:
- if not self.link_proxy_fileHandle[key][1]:
- continue
- lw_item = getNodeEntities(getNodeById(self.link_proxy_fileHandle[key][0], self.link_proxy_fileHandle[key][2]))
- lw_item = list(lw_item.split(','))
- crowd_item = QtWidgets.QTreeWidgetItem(self.crowdId_tw, [key])
- self.crowdId_tw.expandItem(crowd_item)
- for item in lw_item:
- QtWidgets.QTreeWidgetItem(crowd_item, [item])
- #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)
- #On check si le selector exist, le cree si non avec son node kill
- #On ajoute la crowd directement dans le selector, la fonction refresh va mettre a jour les listWidgets
- def addId(self):
- sel = mc.ls(selection=True)
- if sel:
- for s in sel:
- proxy = mc.listRelatives(s, parent=True)[0]
- if not proxy in self.link_proxy_fileHandle.keys():
- continue
- mc.select(s, r=True)
- character_id = mc.glmLayoutTool(cacheProxy=proxy, getSelectedEntities=True)
- if not self.link_proxy_fileHandle[proxy][1]:
- fileHandle = self.link_proxy_fileHandle[proxy][0]
- previousNode = getNodeById(fileHandle, self.link_proxy_fileHandle[proxy][2])
- lay_selector = createSelector(fileHandle, character_id, previousNode)
- setNodeName(lay_selector, 'Selector_lay_to_kill')
- createOperator(fileHandle, "Kill", lay_selector)
- self.link_proxy_fileHandle[proxy][1] = True
- self.link_proxy_fileHandle[proxy][2] = getRootId(fileHandle)-1
- continue
- entities = getNodeEntities(getNodeById(self.link_proxy_fileHandle[proxy][0], self.link_proxy_fileHandle[proxy][2]))
- if entities:
- str_entites = entities + ',' + character_id
- else:
- str_entites = character_id
- setNodeEntities(getNodeById(self.link_proxy_fileHandle[proxy][0], self.link_proxy_fileHandle[proxy][2]), str_entites)
- self.refresh()
- #On recupere les crowd ID des index selectionner dans l'interface
- #On suprimme la crowd directement dans le selector, la fonction refresh va mettre a jour les listWidgets
- def delId(self):
- item = []
- selected_index = self.crowdId_tw.selectedIndexes()
- if selected_index:
- for s in selected_index:
- id_select = QtCore.QModelIndex.data(s)
- id_proxy = QtCore.QModelIndex.parent(s)
- name_proxy = QtCore.QModelIndex.data(id_proxy)
- item.append([id_select, name_proxy])
- for i in item:
- if i[1] not in self.link_proxy_fileHandle.keys():
- continue
- entities = getNodeEntities(getNodeById(self.link_proxy_fileHandle[i[1]][0], self.link_proxy_fileHandle[i[1]][2]))
- entities = list(entities.split(','))
- entities.remove(i[0])
- str_entites = ','.join(entities)
- setNodeEntities(getNodeById(self.link_proxy_fileHandle[i[1]][0], self.link_proxy_fileHandle[i[1]][2]), str_entites)
- self.refresh()
- try:
- gu.close()
- except:
- pass
- gu = GoalemLayoutUtils()
- gu.show()
Add Comment
Please, Sign In to add comment