Announcements

Between mid-October and November, the content on AREA will be relocated to the Autodesk Community M&E Hub and the Autodesk Community Gallery. Learn more HERE.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

maya pydsie2 bug

maya pydsie2 bug

I do hair and cloth. Sometimes because the Maya scene is too complicated, Maya has many objects in the default Outliner, but sometimes I only want to list the dynamics nodes of hairSystem, nCloth, and nucleus, so I want to have a custom dynamics Outliner. The dynamics Outliner only stores the dynamics node, which is very convenient for me to choose, but there is a problem. For example, when I select the dynamics node in the dynamics Outliner, when I select an object other than the dynamics Outliner, Maya will select the object and cancel it immediately select

List item

Please help me, thank you

Please reply me 176314841@qq.com

Problem demo video

1 Comment
176314841
Explorer

Sorry, add the code

# -*- coding: utf-8 -*-
from PySide2 import QtCore
from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2.QtCore import Qt, QTimer
from PySide2.QtWidgets import QApplication, QProgressBar, QPushButton
from shiboken2 import wrapInstance

from functools import partial

import maya.OpenMaya as om
import maya.OpenMayaUI as omui
import maya.cmds as cmds

def maya_main_window():
main_window_ptr = omui.MQtUtil.mainWindow()

return wrapInstance(long(main_window_ptr), QtWidgets.QWidget)

class OutLiner(QtWidgets.QDialog):

def __init__(self, parent = maya_main_window()):

super(OutLiner, self).__init__(parent)
self.setWindowTitle(" Simple OutLiner")
self.setWindowIcon(QtGui.QIcon(":nCloth.svg"))
#self.setWindowFlags(Qt.WindowMinMaxButtonsHint)
#self.setMinimumSize(360,530)
self.setWindowFlags(Qt.Dialog | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint) # Maximize and minimize window display

if cmds.about(ntOS=True):
self.setWindowFlags(self.windowFlags() ^ QtCore.Qt.WindowContextHelpButtonHint)
#self.setGeometry(73, 215, 300, 150)

else:
self.setWindowFlags(QtCore.Qt.Tool)

self.setMinimumWidth(300)

self.nurbsCurve_icon = QtGui.QIcon(":nurbsCurve.svg")
self.transform_icon = QtGui.QIcon(":transform.svg")
self.camera_icon = QtGui.QIcon(":Camera.png")
self.mesh_icon = QtGui.QIcon(":mesh.svg")
self.nCloth_icon = QtGui.QIcon(":nCloth.svg")
self.hairSystem_icon = QtGui.QIcon(":hairSystem.svg")
self.nucleus_icon = QtGui.QIcon(":nucleus.svg")

self.script_job_number = -1

self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.show_context_menu)

self.create_action()
self.create_widgets()
self.create_layout()
self.create_connections()
self.refresh_tree_widget()

def create_action(self):
self.about_action = QtWidgets.QAction("About", self)

self.display_shape_action = QtWidgets.QAction("Shapes", self)
self.display_shape_action.setCheckable(True)
self.display_shape_action.setChecked(True)
self.display_shape_action.setShortcut(QtGui.QKeySequence("Ctrl+Shift+H"))

def create_widgets(self):

self.menu_bar = QtWidgets.QMenuBar()
display_menu = self.menu_bar.addMenu("Display")
display_menu.addAction(self.display_shape_action)
help_menu = self.menu_bar.addMenu("Help")
help_menu.addAction(self.about_action)

self.tree_widget = QtWidgets.QTreeWidget()
# header = self.tree_widget.headerItem()
# header.setText(0, 'Column 0 Text')
self.tree_widget.setHeaderHidden(1)
self.tree_widget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.refresh_btn = QtWidgets.QPushButton('Refresh')

def create_layout(self):

btn_layout = QtWidgets.QHBoxLayout()
btn_layout.addStretch()
btn_layout.addWidget(self.refresh_btn)

main_layout = QtWidgets.QVBoxLayout(self)
main_layout.setContentsMargins(2, 2, 2, 2)
main_layout.setSpacing(2)
main_layout.setMenuBar(self.menu_bar)
main_layout.addWidget(self.tree_widget)
main_layout.addLayout(btn_layout)

def create_connections(self):

self.about_action.triggered.connect(self.about)
self.display_shape_action.toggled.connect(self.set_shape_nodes_visible)
self.tree_widget.itemCollapsed.connect(self.update_icon)
self.tree_widget.itemExpanded.connect(self.update_icon)
self.tree_widget.itemSelectionChanged.connect(self.select_items)

self.refresh_btn.clicked.connect(self.refresh_tree_widget)

def refresh_tree_widget(self):

self.shape_nodes = cmds.ls(shapes = 1)

self.tree_widget.clear()

top_level_object_names = cmds.ls(assemblies = 1)

for name in top_level_object_names:

item = self.create_item(name)

self.tree_widget.addTopLevelItem(item)

self.update_selection()

def create_item(self,name):

item = QtWidgets.QTreeWidgetItem([name])
self.add_children(item)
self.update_icon(item)

is_shape = name in self.shape_nodes
item.setData(0, QtCore.Qt.UserRole, is_shape)

return item

def add_children(self, item):

children = cmds.listRelatives(item.text(0), children = 1)
if children:
for child in children:
child_item = self.create_item(child)
item.addChild(child_item)

def update_icon(self, item):

object_type = ""

if item.isExpanded():
object_type = "transform"
else:
child_count = item.childCount()
if child_count == 0:
object_type = cmds.objectType(item.text(0))
elif child_count == 1:
child_item = item.child(0)
object_type = cmds.objectType(child_item.text(0))
else:
object_type = "transform"

if object_type == "transform":
item.setIcon(0 ,self.transform_icon)
elif object_type == "nCloth":
item.setIcon(0 ,self.nCloth_icon)
elif object_type == "camera":
item.setIcon(0 ,self.camera_icon)
elif object_type == "hairSystem":
item.setIcon(0 ,self.hairSystem_icon)
elif object_type == "nucleus":
item.setIcon(0 ,self.nucleus_icon)
elif object_type == "nurbsCurve":
item.setIcon(0 ,self.nurbsCurve_icon)
elif object_type == "mesh":
item.setIcon(0 ,self.mesh_icon)

def select_items(self):

items = self.tree_widget.selectedItems()
names = []
for item in items:
names.append(item.text(0))
cmds.select(names, replace = 1 )

def about(self):

QtWidgets.QMessageBox.about(self, 'About outLiner','Add About Text Here')

def set_shape_nodes_visible(self, visible):

iterator = QtWidgets.QTreeWidgetItemIterator(self.tree_widget)
while iterator.value():
item = iterator.value()
is_shape = item.data(0, QtCore.Qt.UserRole)
if is_shape:
item.setHidden(not visible)
iterator += 1

def show_context_menu(self, point):

context_menu = QtWidgets.QMenu()
context_menu.addAction(self.display_shape_action)
context_menu.addSeparator()
context_menu.addAction(self.about_action)

context_menu.exec_(self.mapToGlobal(point))

def update_selection(self):

selection = cmds.ls(sl=1)
iterator = QtWidgets.QTreeWidgetItemIterator(self.tree_widget)
while iterator.value():
item = iterator.value()
is_selected = item.text(0) in selection
item.setSelected(is_selected)

iterator += 1

def set_script_job_enabled(self, enabled):

if enabled and self.script_job_number < 0:

self.script_job_number = cmds.scriptJob(event = ['SelectionChanged', partial(self.update_selection)], protected = 1)

elif not enabled and self.script_job_number >= 0:

cmds.scriptJob(kill = self.script_job_number, force = 1)
self.script_job_number = -1

def showEvent(self,e):

super(OutLiner,self).showEvent(e)
self.set_script_job_enabled(True)

def closeEvent(self, e):

if isinstance(self, OutLiner):
super(OutLiner,self).closeEvent(e)
self.set_script_job_enabled(False)

if __name__ == "__main__":
try:
out_liner.set_script_job_enabled(False)
out_liner.close()
out_liner.deleteLater()
except:
pass

out_liner = OutLiner()
out_liner.show()

Can't find what you're looking for? Ask the community or share your knowledge.

Submit Idea