PyMaxExplorer/explorer.py

PyMaxExplorer/explorer.py
1 '''
2  UI platform which demostrate the PySide2 ui loading and
3  display object tree on explorer.
4  -Feng Du
5 '''
6 import os, sys
7 from PySide2 import QtCore, QtWidgets
8 import MaxPlus
9 import pymxs
10 sys.path.append(os.path.dirname(os.path.abspath(__file__)))
11 from maxDataModels import mxTreeNode
12 from qtViewModels import vmodelMaxObjects
13 
14 rt = pymxs.runtime
15 uitype, basetype = MaxPlus.LoadUiType(os.path.join(os.path.dirname(__file__),'mainUI.ui'))
16 
17 class PyMaxExplorer(basetype,uitype):
18  def __init__(self, parent=None):
19  super(PyMaxExplorer,self).__init__(parent)
20  self.setupUi(self)
21  self.buildViewModel()
22  self.connectActions()
23  self.setupMaxCallbacks()
24 
25  def setupMaxCallbacks(self):
26  self._callbackItem = rt.NodeEventCallback(all=self.cbNodeEvent)
27 
28  def teardownMaxCallbacks(self):
29  self._callbackItem = None
30 
31  def buildViewModel(self):
32  self._rootNode = self.buildTree(rt.rootNode)
33  self._proxyModel = QtCore.QSortFilterProxyModel()
34  self._model = vmodelMaxObjects(self._rootNode)
35  self._proxyModel.setSourceModel(self._model)
36  self._proxyModel.setDynamicSortFilter(True)
37  self._proxyModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
38  self.treeView_objects.setModel(self._proxyModel)
39  self.treeView_objects.setSortingEnabled(True)
40  QtCore.QObject.connect(self.uiGraphFilter, QtCore.SIGNAL("textChanged(QString)"), self._proxyModel.setFilterRegExp)
41 
42  def connectActions(self):
43  self.connect(self.actionWatch, QtCore.SIGNAL('triggered()'),self.actWatch)
44  self.connect(self.actionAbout, QtCore.SIGNAL('triggered()'),self.actAbout)
45  self.connect(self.actionRefresh, QtCore.SIGNAL('triggered()'),self.actRefresh)
46  self.connect(self.actionExit, QtCore.SIGNAL('triggered()'),self.actExit)
47  self.connect(self.actionUndo, QtCore.SIGNAL('triggered()'),self.actUndo)
48  self.connect(self.actionRedo, QtCore.SIGNAL('triggered()'),self.actRedo)
49 
50  def actWatch(self):
51  self.Watcher.show()
52 
53  def actAbout(self):
54  QtWidgets.QMessageBox.about(self, "PyMaxExplorer 1.0", "PyMaxExplorer is a demo for pymxs and PySide usage on 3ds Max")
55 
56  def actRefresh(self):
57  self.buildViewModel()
58 
59  def actExit(self):
60  self.close()
61 
62  def actUndo(self):
63  pymxs.run_undo()
64 
65  def actRedo(self):
66  pymxs.run_redo()
67 
68  def cbNodeEvent(self, event, node):
69  self.buildViewModel()
70 
71  def buildTree(self, mxObj, parent = None, userName = ''):
72  nodeName = mxObj.name
73  if userName:
74  nodeName = userName
75  newNode = mxTreeNode(nodeName, parent)
76  for c in mxObj.children:
77  self.buildTree(c, newNode)
78  return newNode