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

Reply via email to