【发布时间】:2020-10-23 00:40:38
【问题描述】:
我是编写脚本的新手。在 Maya 中,我想突出显示时间轴中的特定范围,而不用 shift+LMB 擦洗。我想输入开始/结束值并使脚本选择该范围。这甚至可能吗?我还没有找到任何解决方案。
提前致谢。
【问题讨论】:
标签: range highlight maya timeline mel
我是编写脚本的新手。在 Maya 中,我想突出显示时间轴中的特定范围,而不用 shift+LMB 擦洗。我想输入开始/结束值并使脚本选择该范围。这甚至可能吗?我还没有找到任何解决方案。
提前致谢。
【问题讨论】:
标签: range highlight maya timeline mel
这是最大的 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 设置为非托管并在最后启用它来避免代码期间的时间滑块抽动/更新再次。这样一来,您根本看不到时间滑块发生任何事情,而且它正在做所有这些黑客行为就不那么明显了。
在尝试让它工作然后四处挖掘之后,不,这里有一些支持这一点的链接:
http://ewertb.mayasound.com/mel/mel.027.php
Set highlighted range in Maya's Time Slider
你可以查询它,但你不能设置它,这有点令人惊讶。虽然您应该能够使用 cmds.keyframe 和 cmds.scaleKey 来模仿它的行为。
【讨论】: