Python 在三维视图中取消选择对象后,在大纲视图中保持该对象处于选中状态
我已经创建了自己的曲线图编辑器和大纲视图,我的问题是,我希望能够在大纲视图中选择以前选择的对象,以便它继续显示在曲线图编辑器上,但我仍然能够选择该对象的属性并更新曲线图编辑器 我尝试获得的效果是从Autodesk Maya的“曲线图编辑器”(Graph Editor)中的“自动加载选定对象”(Auto Load Selected Objects)功能中获得的效果 我已经尝试了一些关于selectionConnections的方法,但我还没有完全了解它。我可以使用lock=1代码防止大纲视图和曲线图编辑器发生更改,但曲线图编辑器不再使用选定对象的属性进行更新 以下是我目前掌握的情况:Python 在三维视图中取消选择对象后,在大纲视图中保持该对象处于选中状态,python,maya,Python,Maya,我已经创建了自己的曲线图编辑器和大纲视图,我的问题是,我希望能够在大纲视图中选择以前选择的对象,以便它继续显示在曲线图编辑器上,但我仍然能够选择该对象的属性并更新曲线图编辑器 我尝试获得的效果是从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,虽然你的解决方案有效,但我发现上面的方法更符合我想要的效果。非常感谢你的帮助!没问题。我的目标是从通用的角度减少对用户体验的破坏。