在3D视图中取消选择后,在“大纲视图”(Outliner)中选择对象

时间:2014-11-24 14:23:14

标签: python maya

graph

我已经创建了自己的Graph Editor和Outliner,我的问题是我希望能够在我的大纲视图中保留先前选择的对象,以便它继续在Graph Editor上显示,但我&#39 ; m还可以选择该对象的属性并更新图表编辑器。

我试图获得的效果是您从Autodesk Maya的图表编辑器中的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()

问题在于,当我取消选择对象时,“大纲视图”高亮显示将关闭对象,“曲线图编辑器”将变为空白。我希望这会忽略新的选择并保持当前对象的选择,但仍然可以单独选择属性。

我希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

@Adam,你提出的技术有效但干扰了主动选择,这并不理想。理想情况下,您的窗口以及窗口打开后选择的内容必须是分离的。你可以这样做的方式是:

  1. 制作selectionConnectionSee the docs
  2. 编辑:无需锁定此选择连接。 要做到这一点:

    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一样。因此,我们进行了如上所示的存在检查。

    修改 这将是您outlinerEditor将使用的选择连接。

    我们建立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持有者。

    1. selectionConnection提供给相应的outlinerEditoranimCurveEditor。这可以通过将sel_conn_name传递到selectionConnectionoutlinerEditor的{​​{1}}标记来完成。

    2. 编辑:锁定animCurveEditor的选择连接,因此不会受到活动列表更改的影响。您可以通过为outlinerEditor设置它来执行此操作。 Check the docs。然后,您将lockMainConnection=True outlinerEditor'sselectionConnection提供给sel_conn_name的{​​{1}}。您可以使用mainListConnection自己的animCurveEditor来处理,在这种情况下animCurveEditor。解锁selectionConnection的主要连接非常重要,因为我们希望它反映所选属性。我们通过设置sel_conn_curves_name

    3. 来完成此操作

      以下是修改过的脚本:

      animCurveEditor

      希望这很有用。

答案 1 :(得分:-1)

更新

好的,我想我已经得到了答案:

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的提示,我仍然希望听到一些:)