【问题标题】:Maya MEL - Highlighting Specific Range in TimelineMaya MEL - 在时间轴中突出显示特定范围
【发布时间】:2020-10-23 00:40:38
【问题描述】:

我是编写脚本的新手。在 Maya 中,我想突出显示时间轴中的特定范围,而不用 shift+LMB 擦洗。我想输入开始/结束值并使脚本选择该范围。这甚至可能吗?我还没有找到任何解决方案。

提前致谢。

【问题讨论】:

    标签: range highlight maya timeline mel


    【解决方案1】:

    这是最大的 hacky 解决方法 - 但是在 Python 中。使用 Qt 鼠标按下、移动和释放事件来模拟时间滑块小部件上的鼠标行为以使其选择。我不会向初学者推荐它,但至少它有效。

    在代码中,我暂时更改时间滑块范围,以最大化我想要点击的帧的屏幕空间。

    from maya import mel
    from maya import OpenMayaUI as omui 
    
    from shiboken2 import wrapInstance 
    from PySide2 import QtCore, QtGui, QtWidgets
    
    
    def select_time_slider_range(start, end):
        
        app = QtWidgets.QApplication.instance()
        
        widgetStr = mel.eval('$gPlayBackSlider=$gPlayBackSlider')
        ptr = omui.MQtUtil.findControl(widgetStr)
        slider = wrapInstance(long(ptr), QtWidgets.QWidget)
        
        slider_width = slider.size().width()
        slider_height = slider.size().height()
        
        # Store time slider settings
        min_time = cmds.playbackOptions(query=True, minTime=True)
        max_time = cmds.playbackOptions(query=True, maxTime=True)
        animation_start_time = cmds.playbackOptions(query=True, animationStartTime=True)
        animation_end_time = cmds.playbackOptions(query=True, animationEndTime=True)
        t = cmds.currentTime(query=True)
        
        # Set the time slider to the range we want so we have
        # perfect precision to click at the start and end of the
        # time slider.
        cmds.playbackOptions(minTime=start)
        cmds.playbackOptions(maxTime=end)
        
        a_pos = QtCore.QPoint(0, slider_height / 2.0)         
        b_pos = QtCore.QPoint(slider_width, slider_height / 2.0)
        
        # Trigger some mouse events on the Time Control
        # Somehow we need to have some move events around
        # it so the UI correctly understands it stopped
        # clicking, etc.
        event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove, 
                                  a_pos, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.NoModifier)
        app.sendEvent(slider, event)
        
        event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonPress, 
                                  a_pos, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.ShiftModifier)
        app.sendEvent(slider, event)
       
        event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove, 
                                  b_pos, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.ShiftModifier)
        app.sendEvent(slider, event)
    
        event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, 
                                  b_pos, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.ShiftModifier)
        app.sendEvent(slider, event)
        
        event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove, 
                                  b_pos, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.MouseButton.LeftButton, 
                                  QtCore.Qt.NoModifier)
        app.sendEvent(slider, event)
        app.processEvents()
        
        # Reset time slider settings
        cmds.playbackOptions(minTime=min_time)
        cmds.playbackOptions(maxTime=max_time)
        cmds.playbackOptions(animationStartTime=animation_start_time)
        cmds.playbackOptions(animationEndTime=animation_end_time)
        cmds.currentTime(t)
    
    select_time_slider_range(-200, 500000)
    

    【讨论】:

    • 天才!我不知道这段代码发生了什么,但它工作得很好!谢谢大佬!
    • 对于它的价值,您可以通过在脚本期间使用 cmds.timeControl(widgetStr, edit=True, manage=False) 将时间滑块的 timeControl 设置为非托管并在最后启用它来避免代码期间的时间滑块抽动/更新再次。这样一来,您根本看不到时间滑块发生任何事情,而且它正在做所有这些黑客行为就不那么明显了。
    【解决方案2】:

    在尝试让它工作然后四处挖掘之后,不,这里有一些支持这一点的链接:

    http://ewertb.mayasound.com/mel/mel.027.php

    Set highlighted range in Maya's Time Slider

    你可以查询它,但你不能设置它,这有点令人惊讶。虽然您应该能够使用 cmds.keyframecmds.scaleKey 来模仿它的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 2010-12-27
      • 2015-09-08
      • 2022-06-14
      • 1970-01-01
      • 2014-08-08
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多