Hi Justin,
thank you so much for your explanation.
The conflict right now that I'm getting is while I could use
a QTreeWidget's invisible root item and set it up as my "World", I seemed
to be unable to add child items to my model and lost access to my Node
class that processed the information from my Model.
Getting errors such as this:
# TypeError: QTreeWidgetItem.insertChild(int, QTreeWidgetItem): argument 2
has unexpected type 'Node'
The tutorial I'm following is this :
http://www.youtube.com/watch?v=VcN94yMOkyU&list=PLJewNuO700GfElihmE9R8zManDym4S13m
What I'm trying to make is a more interactive selection set menu where I
can add/remove/rename objects from the menu. Attached are my files if that
would help.
Again thank you for the assistance.
--
You received this message because you are subscribed to the Google Groups
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/python_inside_maya/b86c63c2-543e-4cf8-8c02-4d1868d9e2a4%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
from PyQt4 import QtCore, QtGui
import cPickle
import maya.OpenMayaUI
import maya.OpenMaya as api
import maya.cmds as cmds
import testtree
import sip
def mayaMainWindow():
'''Returns the Maya window as a QMainWindow instance.'''
ptr = maya.OpenMayaUI.MQtUtil.mainWindow()
if ptr is not None:
return sip.wrapinstance( long(ptr), QtCore.QObject )
class Selector( QtGui.QMainWindow ):
def __init__( self, parent=mayaMainWindow() ):
super( Selector, self ).__init__( parent )
self.setWindowTitle("SelectionUI")
self.resize(250,600)
self.create_layout()
self.treeWidget = QtGui.QTreeWidget()
self.rootNode = self.treeWidget.invisibleRootItem()
#############Test Input.##########################
'''
sel=cmds.ls(sl=True)[0]
nodes=[]
nodes = cmds.listRelatives(sel, allDescendents=True)
nodes.append(sel)
nodes.reverse()
self.rootNode = testtree.getNodeType('time1')
childNodea = testtree.getNodeType(nodes[0], self.rootNode)
childNode0 = testtree.getNodeType(nodes[1], self.rootNode)
childNode1 = testtree.getNodeType(nodes[2], self.rootNode)
childNode2 = testtree.getNodeType(nodes[3], self.rootNode)
childNode3 = testtree.getNodeType(nodes[4], self.rootNode)
lightNode1 = testtree.getNodeType('pointLight1', self.rootNode)
'''
#self.rootNode ='time1'
#######################################################
self._proxyModel=QtGui.QSortFilterProxyModel()
self._proxyModel.setDynamicSortFilter(True)
self._proxyModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
self._model=testtree.SceneGraphModel(self.rootNode)
#self._model.insertLights(0,50)
self._proxyModel.setSourceModel(self._model)
self.tree.setModel(self._proxyModel)
self.tree.setSortingEnabled
self.create_connections()
self.show()
def create_layout(self):
self.main_widget = QtGui.QWidget()
self.setCentralWidget(self.main_widget)
self.main_layout = QtGui.QVBoxLayout(self.main_widget)
self.main_layout.setContentsMargins(10,10,10,10)
self.uifilter = QtGui.QLineEdit()
self.tree=QtGui.QTreeView()
self.tree.setAlternatingRowColors(True)
self.tree.setSizePolicy(QtGui.QSizePolicy.Preferred,
QtGui.QSizePolicy.Expanding)
#self.topnode=QtGui.QTreeWidget.invisibleRootItem()
self.main_layout.addWidget(self.uifilter)
self.main_layout.addWidget(self.tree)
label=QtGui.QLabel("SelectionButton")
self.main_layout.addWidget(label)
button_layout = QtGui.QHBoxLayout()
self.main_layout.addLayout(button_layout)
self.add_button = QtGui.QPushButton("Add")
self.remove_button = QtGui.QPushButton("Remove")
self.quit_button = QtGui.QPushButton("Quit")
button_layout.addWidget(self.add_button)
button_layout.addWidget(self.remove_button)
button_layout.addWidget(self.quit_button)
def create_connections(self):
# Connect the buttons
self.connect(self.add_button, QtCore.SIGNAL("clicked()"), self.add_Object)
self.connect(self.remove_button, QtCore.SIGNAL("clicked()"), self.remove_Object)
self.connect(self.quit_button, QtCore.SIGNAL("clicked()"), self.close_Dialog)
QtCore.QObject.connect(self.uifilter, QtCore.SIGNAL('textChanged(QString'),self._proxyModel.setFilterRegExp)
def add_Object(self):
selection=cmds.ls(sl=True)
print selection
for sel in selection:
testtree.getNodeType(sel, self.rootNode)
def remove_Object(self):
rows=self.tree.selectedIndexes()
print rows
def close_Dialog(self):
self.close()from PyQt4 import QtCore, QtGui
import sip
import maya.cmds as cmds
import maya.OpenMaya as api
import maya.OpenMayaUI as apiUI
import icons_rc
def mayaMainWindow():
ptr = apiUI.MQtUtil.mainWindow()
mainWin= sip.wrapinstance(long(ptr),QtCore.QObject)
return mainWin
class Node(object):
def __init__(self, name, parent=None):
self._name=name
self._children=[]
self._parent=parent
if parent is not None:
parent.addChild(self)
def typeInfo(self):
return 'NODE'
def addChild(self, child):
self._children.append(child)
def insertChild(self, position,child):
if position < 0 or position > len(self._children):
return False
self._children.insert(position, child)
child._parent = self
return True
def removeChild(self, position):
if position < 0 or position > len(self._children):
return False
child = self._children.pop(position)
child._parent=None
return True
def name(self):
return self._name
def setName(self, name,newName):
self._name=name
cmds.rename(name, str(newName))
self._name=str(newName)
def child(self, row):
return self._children[row]
def childCount(self):
return len(self._children)
def parent(self):
return self._parent
def row(self):
if self._parent is not None:
return self._parent._children.index(self)
def log(self, tabLevel=-1):
output = ''
tabLevel +=1
for i in range(tabLevel):
output+='\t'
output += '|---------'+ self._name+'\n'
for child in self._children:
output +=child.log(tabLevel)
tablevel -=1
output +='\n'
return output
def __repr__(self):
return self.log()
class getNodeType(Node):
def __init__(self, name, parent=None):
super(getNodeType, self).__init__(name, parent)
self._name= name
def typeInfo(self):
typeinfo = cmds.nodeType(self._name, apiType=True )
return typeinfo
class SceneGraphModel(QtCore.QAbstractItemModel):
'''INPUTS: Node, QOject'''
def __init__(self, root, parent=None):
super(SceneGraphModel,self).__init__(parent)
self._rootNode = root
'''INPUTS:QModelIndex'''
'''OUTPUT: init'''
def rowCount(self, parent):
if not parent.isValid():
parentNode = self._rootNode
else:
parentNode = parent.internalPointer()
return parentNode.childCount()
'''INPUTS:QModelIndex'''
'''OUTPUT: init'''
def columnCount(self, parent):
return 2
'''INPUTS:QModelIndex, int'''
'''OUTPUT: QVariant, strings are cast to QString which is a QVariant'''
def data(self, index, role):
if not index.isValid():
return None
node=index.internalPointer()
if role==QtCore.Qt.DisplayRole or role==QtCore.Qt.EditRole:
if index.column()==0:
return node.name()
else:
return node.typeInfo()
if role==QtCore.Qt.DecorationRole:
if index.column()==0:
typeInfo=node.typeInfo()
if typeInfo == 'kJoint':
return QtGui.QIcon(QtGui.QPixmap(':/Transform.png'))
if typeInfo =='kTransform':
return QtGui.QIcon(QtGui.QPixmap(':/Light.png'))
if typeInfo =='Camera':
return QtGui.QIcon(QtGui.QPixmap(':/Camera.png'))
#INPUTS: QModelIndex, QVariant, int(flag)'''
def setData(self, index, value, role=QtCore.Qt.EditRole):
if index.isValid():
if role ==QtCore.Qt.EditRole:
node = index.internalPointer()
oldName =node.name()
newname=value.toString()
cmds.rename(oldName, newname)
return True
return False
'''INPUTS: int, Qt::QModelIndex, int'''
'''OUTPUT: QVariant, strings are cast to QString which is a QVariant'''
def headerData(self, section, orientation, role):
if role==QtCore.Qt.DisplayRole:
if section==0:
return 'Scenegraph'
else:
return 'TypeInfo'
'''INPUTS:QModelIndex'''
'''OUTPUT: int(flag)'''
def flags(self, index):
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEditable
'''INPUTS: QModelIndex'''
'''OUTPUT: QModelIndex'''
'''Should return the parent of the node with the given QModelIndex'''
def parent(self, index):
node= self.getNode(index)
parentNode = node.parent()
if parentNode == self._rootNode:
return QtCore.QModelIndex()
return self.createIndex(parentNode.row(), 0,parentNode)
'''INPUTS: int, int, QMOdelIndex'''
'''OUTPUT: QModelIndex'''
'''Should return the QModelIndex that corresponds to the given row, column and parent node'''
def index(self, row, column, parent):
parentNode = self.getNode(parent)
childItem=parentNode.child(row)
if childItem:
return self.createIndex(row, column, childItem)
else:
return QtCore.QModelIndex()
'''CUSTOM'''
'''INPUTS: QModel.Index'''
def getNode(self, index):
if index.isValid():
node = index.internalPointer()
if node:
return node
return self._rootNode
"""INPUTS: int, int, QModelIndex"""
def insertRows(self, position, rows, name, parent=QtCore.QModelIndex()):
parentNode = self.getNode(parent)
self.beginInsertRows(parent, position, position+rows-1)
for row in range(rows):
childCount = parentNode.childCount()
childNode = Node(name+str(childCount))
success = parentNode.insertChild(position,childNode)
self.endInsertRows()
return success
def insertLights(self, position, rows, parent=QtCore.QModelIndex()):
parentNode = self.getNode(parent)
self.beginInsertRows(parent, position, position+rows-1)
for row in range(rows):
childCount = parentNode.childCount()
childNode = LightNode('Light'+str(childCount))
success = parentNode.insertChild(position,childNode)
self.endInsertRows()
return success
"""INPUTS: int, int, QModelIndex"""
def removeRows(self, position, rows, parent=QtCore.QModelIndex()):
parentNode = self.getNode(parent)
self.beginRemoveRows(parent, position, position+rows-1)
for row in range(rows):
success= parentNode.removeChild(position)
self.endRemoveRows()
return success