【问题标题】:Keeping object selected in the Outliner after deselecting it in 3D View在 3D 视图中取消选择对象后,在大纲视图中保持选定对象
【发布时间】:2017-06-22 03:57:45
【问题描述】:

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

我想要获得的效果是您从 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()

问题是,当我取消选择对象时,大纲视图突出显示会关闭对象并且图形编辑器变为空白。我希望它忽略新的选择并保持当前对象被选中,但仍然能够单独选择属性。

我希望这是有道理的。

【问题讨论】:

    标签: python maya


    【解决方案1】:

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

    1. 创建selectionConnectionSee the docs

    编辑:这个选择连接不需要被锁定。 为此:

    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 对象,其名称需要唯一才能重新创建,就像窗口一样。因此,我们执行如上所示的存在检查。

    编辑: 这将是您的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 上选择的对象作为其主要来源,因此我们使用outlinerEditorselectionConnection 持有人。

    1. selectionConnection 提供给您各自的outlinerEditoranimCurveEditor。这可以通过将我们的sel_conn_name 传递给outlinerEditoranimCurveEditorselectionConnection 标志来完成。

    2. 编辑:锁定outlinerEditor 的选择连接ONLY,因此它不会受到活动列表更改的影响。您可以通过为它设置lockMainConnection=True 来做到这一点。 Check the docs。然后将outlinerEditor's selectionConnection(即sel_conn_name)提供给animCurveEditormainListConnection。你给 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()
    

    希望有用。

    【讨论】:

    • 太好了,唯一的问题是我无法让大纲中的任何属性在图表上变得孤立。它只会显示它打开的对象。你将如何解决这个问题?
    【解决方案2】:

    更新

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

    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 有任何提示,我仍然很想听听 :)

    【讨论】:

    • 请在上面找到我完整的答案。让我知道它是否有用。
    • 嘿 Kartikg3,虽然您的解决方案有效,但我发现以上更符合我想要的效果。非常感谢您的帮助!
    • 没问题。从一般的角度来看,我的目标是减少对用户体验的破坏。
    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多