Python 在三维视图中取消选择对象后,在大纲视图中保持该对象处于选中状态

Python 在三维视图中取消选择对象后,在大纲视图中保持该对象处于选中状态,python,maya,Python,Maya,我已经创建了自己的曲线图编辑器和大纲视图,我的问题是,我希望能够在大纲视图中选择以前选择的对象,以便它继续显示在曲线图编辑器上,但我仍然能够选择该对象的属性并更新曲线图编辑器 我尝试获得的效果是从Autodesk Maya的“曲线图编辑器”(Graph Editor)中的“自动加载选定对象”(Auto Load Selected Objects)功能中获得的效果 我已经尝试了一些关于selectionConnections的方法,但我还没有完全了解它。我可以使用lock=1代码防止大纲视图和曲线

我已经创建了自己的曲线图编辑器和大纲视图,我的问题是,我希望能够在大纲视图中选择以前选择的对象,以便它继续显示在曲线图编辑器上,但我仍然能够选择该对象的属性并更新曲线图编辑器

我尝试获得的效果是从Autodesk Maya的“曲线图编辑器”(Graph Editor)中的“自动加载选定对象”(Auto Load Selected Objects)功能中获得的效果

我已经尝试了一些关于selectionConnections的方法,但我还没有完全了解它。我可以使用lock=1代码防止大纲视图和曲线图编辑器发生更改,但曲线图编辑器不再使用选定对象的属性进行更新

以下是我目前掌握的情况:

import maya.cmds as mc

mc.window( w = 500 )
mc.paneLayout( configuration = 'vertical2', swp = 1, ps = [ 2, 70, 0 ] )
mc.frameLayout( w = 150, h = 100, lv = 0 )

mc.outlinerEditor( mainListConnection = 'modelList', 
                   selectionConnection = 'modelList', 
                   showShapes = 1, 
                   showReferenceNodes = 0, 
                   showReferenceMembers = 0, 
                   showAttributes = 1, 
                   showSelected = 0,         
                   highlightActive = 1, 
                   showAnimCurvesOnly = 0, 
                   autoExpand = 1,
                   showConnected = 1, 
                   showDagOnly = 0, 
                   ignoreDagHierarchy = 1, 
                   expandConnections = 0, 
                   showCompounds = 0,     
                   showNumericAttrsOnly = 0,
                   autoSelectNewObjects = 0, 
                   doNotSelectNewObjects = 1, 
                   transmitFilters = 0, 
                   showSetMembers = 1,     
                   setFilter = 'defaultSetFilter',
                   lck = 1 )

mc.setParent( '..' )
mc.frameLayout( w = 1, h = 100, lv = 0 )
mc.animCurveEditor( mlc = 'modelList', dak = 1, di = 0, dat = 'off' )
mc.setParent( '..' )
mc.showWindow()
问题是,当我取消选择该对象时,“大纲视图”(Outliner)高亮显示将关闭该对象,“曲线图编辑器”(Graph Editor)将变为空白。我希望这样可以忽略新选择并保持当前对象处于选中状态,但仍然能够单独选择属性

我希望这是有意义的。

更新 好的,我想我已经得到了一个答案:

import maya.cmds as mc

Xsl = (mc.ls (sl=1, sn=1))[0]

def toastFUNC (arg=0):
    mc.animCurveEditor (curveEditor, e=1, lck=1)

mc.window(w=500)
mc.paneLayout( configuration='vertical2', swp=1, ps=[2, 70, 0] )    
mc.frameLayout(w=150, h=100, lv=0)

mc.outlinerEditor(mlc='modelList', slc='modelList', showReferenceNodes=0, showReferenceMembers=0,    showAttributes=1, showSelected=0, highlightActive=1, showAnimCurvesOnly=0, autoExpand=1,
showConnected=1, showDagOnly=0, ignoreDagHierarchy=1, expandConnections=0, showCompounds=0,   showNumericAttrsOnly=0,
autoSelectNewObjects=0, doNotSelectNewObjects=1, transmitFilters=0, showSetMembers=1,    setFilter='defaultSetFilter', lck=1, sec=toastFUNC)

mc.setParent('..')

mc.frameLayout(w=1, h=100, lv=0)
curveEditor = mc.animCurveEditor(mlc='modelList', slc='modelList', dak=1, di=0, dat='off', lck=1)
mc.setParent('..')
mc.showWindow()
如果有人对使用selectionConnection有什么建议,我还是想听听:

@Adam,你提出的技术可行,但也会干扰活动选择,这并不理想。理想情况下,您的窗口和打开窗口后选择的内容必须解耦。您可以通过以下方式实现:

正在创建selectionConnection。 编辑:不需要锁定此选择连接。 为此:

sel_conn_name = "graphSelConn"
if cmds.selectionConnection(sel_conn_name, q=True, exists=True):
    cmds.deleteUI(sel_conn_name)

cmds.selectionConnection(sel_conn_name, lock=False)
注意:selectionConnections是物理UI对象,其名称必须是唯一的才能重新创建,就像windows一样。因此,我们进行如上所示的exists检查

编辑: 这将是大纲视图编辑器将使用的选择连接

我们进行animCurveEditor将使用的另一个选择连接:

sel_conn_curves_name = "graphSelConnCurves"
if mc.selectionConnection(sel_conn_curves_name, q=True, exists=True):
    mc.deleteUI(sel_conn_curves_name)

mc.selectionConnection(sel_conn_curves_name)
为什么要使用2个选择连接,mainListConnection标志是什么

mainListConnection将是selectionConnection,它将用作此编辑器的主/初始源。 selectionConnection标志将保存selectionConnection对象,该对象将接收/保存在此编辑器上选择的对象

因此,在我们的示例中,outlinerEditor将“modelList”作为其mainListConnection,因为它需要开始显示选定/活动的对象。animCurveEditor需要在outlinerEditor上选择的对象作为其主要源,因此我们使用outlinerEditor的selectionConnection保持器

将selectionConnection提供给各自的大纲视图编辑器和动画编辑器。这可以通过将我们的sel_conn_名称传递给outlinerEditor和animCurveEditor的selectionConnection标志来实现

编辑:仅为大纲视图编辑器锁定选择连接,因此它不会受到对活动列表的更改的影响。为此,请将其设置为lockMainConnection=True。然后将大纲视图编辑器的selectionConnection(即sel_conn_名称)提供给animCurveEditor的mainListConnection。您为animCurveEditor提供了它自己的selectionConnection来处理,在本例中为sel_conn_curves_name。解锁animCurveEditor的主连接很重要,因为我们希望它反映选定的属性。我们通过设置lockMainConnection=False来实现这一点

以下是为您修改的脚本:

import maya.cmds as mc

mc.window(w=500)
mc.paneLayout(configuration='vertical2', swp=1, ps=[2, 70, 0])
mc.frameLayout(w=150, h=100, lv=0)

sel_conn_name = "graphSelConn"
if mc.selectionConnection(sel_conn_name, q=True, exists=True):
    mc.deleteUI(sel_conn_name)

mc.selectionConnection(sel_conn_name)


sel_conn_curves_name = "graphSelConnCurves"
if mc.selectionConnection(sel_conn_curves_name, q=True, exists=True):
    mc.deleteUI(sel_conn_curves_name)

mc.selectionConnection(sel_conn_curves_name)

mc.outlinerEditor(mainListConnection='modelList',
                  selectionConnection=sel_conn_name,
                  lockMainConnection=True,
                  showShapes=1, 
                  showReferenceNodes=0, 
                  showReferenceMembers=0, 
                  showAttributes=1, 
                  showSelected=0, 
                  highlightActive=1, 
                  showAnimCurvesOnly=0, 
                  autoExpand=1,
                  showConnected=1, 
                  showDagOnly=0, 
                  ignoreDagHierarchy=1, 
                  expandConnections=0, 
                  showCompounds=0, 
                  showNumericAttrsOnly=0,
                  autoSelectNewObjects=0,
                  doNotSelectNewObjects=1,
                  transmitFilters=0,
                  showSetMembers=1,
                  setFilter='defaultSetFilter'
                  )
mc.setParent('..')

mc.frameLayout(w=1, h=100, lv=0)

mc.animCurveEditor(mlc=sel_conn_name,
                   slc=sel_conn_curves_name,
                   lockMainConnection=False,
                   dak=0,
                   di=0,
                   dat='off')
mc.setParent('..')
mc.showWindow()

希望这是有用的。

太好了,唯一的问题是我无法让大纲视图中的任何属性在图形上孤立。它将只显示在其上打开的对象。你将如何解决这个问题?请在上面找到我完整的答案。让我知道它是否有用。嘿,Kartikg3,虽然你的解决方案有效,但我发现上面的方法更符合我想要的效果。非常感谢你的帮助!没问题。我的目标是从通用的角度减少对用户体验的破坏。