PyMaxExplorer/explorer.py

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