【问题标题】:Item 'layer 7' already exists in the treeview : in Maya树视图中已存在项目“第 7 层”:在 Maya 中
【发布时间】:2019-10-07 13:09:56
【问题描述】:

我想将两个具有相同名称但具有不同父项的不同项目添加到 TreeView。但我得到了错误:

Item 'layer 7' already exists in the TreeView

我应该怎么做才能避免这种情况。

我的代码:

import maya.cmds as cmds
import os

window = cmds.window()
layout = cmds.formLayout()

control = cmds.treeView( parent = layout, numberOfButtons = 0, abr = False )

cmds.formLayout(layout,e=True, attachForm=(control,'top', 2))
cmds.formLayout(layout,e=True, attachForm=(control,'left', 2))
cmds.formLayout(layout,e=True, attachForm=(control,'bottom', 2))
cmds.formLayout(layout,e=True, attachForm=(control,'right', 2))

cmds.showWindow( window )
startpath="C:/MyFolder/"    

cmds.treeView( control, e=True, addItem = ("layer 1", ""))
cmds.treeView( control, e=True, addItem = ("layer 2", ""))
cmds.treeView( control, e=True, addItem = ("layer 3", ""))
cmds.treeView( control, e=True, addItem = ("layer 4", ""))
cmds.treeView( control, e=True, addItem = ("layer 5", ""))
cmds.treeView( control, e=True, addItem = ("layer 6", ""))
cmds.treeView( control, e=True, addItem = ("layer 7", "layer 2"))
cmds.treeView( control, e=True, addItem = ("layer 7", "layer 3"))
cmds.treeView( control, e=True, addItem = ("layer 9", "layer 2"))
cmds.treeView( control, e=True, addItem = ("layer 10", "layer 8"))
cmds.treeView( control, e=True, addItem = ("layer 11", "layer 2"))
cmds.treeView( control, e=True, addItem = ("layer 12", ""))
cmds.treeView( control, e=True, addItem = ("layer 13", "layer 10"))

N。 B:我试图在这里找到解决方案,但没有成功。

【问题讨论】:

    标签: python treeview maya


    【解决方案1】:

    你正试图将你的“第 7 层”放入两个不同的父母,这就是为什么

    cmds.treeView( control, e=True, addItem = ("layer 7", "layer 2"))
    cmds.treeView( control, e=True, addItem = ("layer 7", "layer 3"))
    

    === 编辑 ===

    我错过了阅读您的问题。所以这是对 maya.cmds 如何包装 Qt QTreeView 的限制。 如果你想在你的图中有两次第 7 层,我会在 cmds 中这样做:

    import maya.cmds as cmds
    from collections import defaultdict
    
    treepop = defaultdict(list)
    treepop[""]=['layer_1_0',
                 'layer_2_0',
                 'layer_3_0',
                 'layer_4_0',
                 'layer_5_0',
                 'layer_6_0',
                 'layer_12_0']
    treepop["layer_2_0"] = ['layer_7_1',
                            'layer_9_1',
                            'layer_11_1']
    treepop["layer_3_0"] = ['layer_7_2']
    treepop["layer_8_0"] = ['layer_10_1']
    treepop["layer_10_0"] = ['layer_13_1']
    
    
    window = cmds.window()
    layout = cmds.formLayout()
    
    control = cmds.treeView( parent = layout, numberOfButtons = 0, abr = False )
    
    cmds.formLayout(layout,e=True, attachForm=(control,'top', 2))
    cmds.formLayout(layout,e=True, attachForm=(control,'left', 2))
    cmds.formLayout(layout,e=True, attachForm=(control,'bottom', 2))
    cmds.formLayout(layout,e=True, attachForm=(control,'right', 2))
    
    cmds.showWindow( window )
    
    for k in treepop[""]:
        cmds.treeView( control, e=True, addItem=(k, ""))
    for k in treepop:
        if k == "":
            continue
        for v in treepop[k]:
            cmds.treeView( control, e=True, addItem=(v, k))
    

    这样您就可以去掉最后一个“_”来获取图层的名称。

    否则,自己封装 QtWidgets.QTreeView 或 QTreeWidget,可能会更容易

    === 编辑 2 ===

    我有一个关于如何使用 qtreewidget 扩展 maya.cmds 的示例:

    from PySide2 import QtWidgets
    from maya import OpenMayaUI, cmds
    from collections import defaultdict
    import shiboken2
    
    treepop = defaultdict(list)
    treepop[""]=['layer_1',
                 'layer_2',
                 'layer_3',
                 'layer_4',
                 'layer_5',
                 'layer_6',
                 'layer_12']
    treepop["layer_2"] = ['layer_7',
                            'layer_9',
                            'layer_11']
    treepop["layer_3"] = ['layer_7']
    treepop["layer_8"] = ['layer_10']
    treepop["layer_10"] = ['layer_13']
    
    def mayaToQT(name):
        # Maya -> QWidget
        ptr = OpenMayaUI.MQtUtil.findControl(name)
        if ptr is None:         ptr = OpenMayaUI.MQtUtil.findLayout(name)
        if ptr is None:         ptr = OpenMayaUI.MQtUtil.findMenuItem(name)
        if ptr is not None:     return shiboken2.wrapInstance(long(ptr),
                                                              QtWidgets.QWidget)
    
    
    cmds.window()
    layout = cmds.columnLayout(rowSpacing=10, columnWidth=250)
    qwidget= mayaToQT(layout)
    qlayout = qwidget.children()[0]
    treeview = QtWidgets.QTreeWidget()
    treeview.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
    treeview.setColumnCount(1)
    treeview.setAlternatingRowColors(True)
    treeview.clear()
    qlayout.addWidget(treeview)
    
    items = []
    for k in treepop[""]:
        root_item = QtWidgets.QTreeWidgetItem()
        root_item.setText(0,k)
        print(k)
    
        if k in treepop:
            for v in treepop[k]:
                child_item = QtWidgets.QTreeWidgetItem()
                child_item.setText(0,v)
                root_item.addChild(child_item)
    
        items.append(root_item)
    treeview.addTopLevelItems(items)
    
    cmds.showWindow()
    
    def getSelected():
        items = treeview.selectedItems()
        for i in items:
            print(i.text(0))
    

    【讨论】:

    • 如果您阅读我的问题,您会发现这就是我想要做的
    • 这是maya树视图的限制。如果你想进一步推动,你必须使用 PyQt。否则给它另一个名字并将他的真实数据嵌入字典中
    • 我通过将 maya cmds 扩展到 qt 添加了另一个示例
    • 你可以添加第三个循环并添加一个孩子到“child_item”:child_item.addChild(subChild)
    • 我真的不能告诉你如何获取你的数据。如果您必须使用while进行递归循环,您可以在树中添加任意数量的子子/级别
    猜你喜欢
    • 2021-01-28
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多