介绍
在使用alt拖拽关键帧时,你一定遇到过,拖时一时爽,拖完火葬场(拖后关键帧可能不是整数)这时候本脚本就派上用场啦 ### 修复前
修复后
更新
V1.0 @草哥 首发
源码V1.1
//将所有选择属性的关键帧对齐到整数帧 v1.0.10 2021-07-30
//Raymond Yan 2021 (RaymondClr@outlook.com / QQ: 1107677019)
('use strict');
var win = new Window(palette { A: Button {text: '对齐关键帧' } });
win.show();
win.A.onClick = function () {
var activeItem = getActiveItem();
if (!activeItem) return;
var selectedProperties = getSelectedProperties(activeItem);
if (!selectedProperties) return;
var valueProperties = getSelectedValueProperties(selectedProperties);
if (valueProperties.length === 0) return;
app.beginUndoGroup('Align Keyframes');
alignKeyframes(activeItem.frameRate, valueProperties);
app.endUndoGroup();
};
function getActiveItem() {
var activeItem = app.project.activeItem;
return activeItem instanceof CompItem ? activeItem : false;
}
function alignKeyframes(frameRate, valueProperties) {
for (var i = 0, l = valueProperties.length; i < l; i++) {
setNewKeyframes(frameRate, valueProperties[i]);
}
}
function getSelectedProperties(activeItem) {
return (
activeItem instanceof CompItem &&
activeItem.selectedLayers.length > 0 &&
activeItem.selectedProperties.length > 0 &&
activeItem.selectedProperties
);
}
function getSelectedValueProperties(selectedProperties) {
var valuePropertiesArr = [];
for (var i = 0, l = selectedProperties.length; i < l; i++) {
var property = selectedProperties[i];
if (!(property.propertyType === PropertyType.PROPERTY)) continue;
valuePropertiesArr.push(selectedProperties[i]);
}
return valuePropertiesArr;
}
function setNewKeyframes(frameRate, valueProperty) {
for (var i = valueProperty.numKeys; i > 0; i--) {
var keyValue = valueProperty.keyValue(i);
var newKeyTime = Math.round(valueProperty.keyTime(i) * frameRate) / frameRate;
valueProperty.removeKey(i);
valueProperty.setValueAtTime(newKeyTime, keyValue);
}
}
源码V1.2
//将所有选择属性的关键帧对齐到整数帧 v1.0.2 2021-07-31
//Raymond Yan 2021 (RaymondClr@outlook.com / QQ: 1107677019)
('use strict');
var win = new Window(palette { A: Button {text: '对齐关键帧' } });
win.show();
win.A.onClick = function () {
var activeItem = getActiveItem();
if (!activeItem) return;
var selectedProperties = getSelectedProperties(activeItem);
if (!selectedProperties) return;
var valueProperties = getSelectedValueProperties(selectedProperties);
if (valueProperties.length === 0) return;
app.beginUndoGroup('Align Keyframes');
alignKeyframes(activeItem.frameRate, valueProperties);
app.endUndoGroup();
};
function getActiveItem() {
var activeItem = app.project.activeItem;
return activeItem instanceof CompItem ? activeItem : false;
}
function alignKeyframes(frameRate, valueProperties) {
for (var i = 0, l = valueProperties.length; i < l; i++) {
setNewKeyframes(frameRate, valueProperties[i]);
}
}
function getSelectedProperties(activeItem) {
return (
activeItem instanceof CompItem &&
activeItem.selectedLayers.length > 0 &&
activeItem.selectedProperties.length > 0 &&
activeItem.selectedProperties
);
}
function getSelectedValueProperties(selectedProperties) {
var valuePropertiesArr = [];
for (var i = 0, l = selectedProperties.length; i < l; i++) {
var property = selectedProperties[i];
if (!(property.propertyType === PropertyType.PROPERTY)) continue;
valuePropertiesArr.push(selectedProperties[i]);
}
return valuePropertiesArr;
}
function getInitialKeyframeTimes(valueProperty) {
var keyframeTimesArr = [];
for (var i = valueProperty.numKeys; i > 0; i--) {
keyframeTimesArr.push(valueProperty.keyTime(i));
}
return keyframeTimesArr;
}
function setNewKeyframes(frameRate, valueProperty) {
var keyframeTimes = getInitialKeyframeTimes(valueProperty);
var frameBumberCache = {};
for (var i = 0, l = keyframeTimes.length; i < l; i++) {
var keyTime = keyframeTimes[i];
var keyIndex = valueProperty.nearestKeyIndex(keyTime);
var keyValue = valueProperty.keyValue(keyIndex);
var frameNumber = Math.round(keyTime * frameRate);
valueProperty.removeKey(keyIndex);
if (frameBumberCache.hasOwnProperty(frameNumber)) continue;
frameBumberCache[frameNumber] = keyIndex;
valueProperty.setValueAtTime(frameNumber / frameRate, keyValue);
}
}