【AE脚本】对齐整数帧V1.2

介绍

在使用alt拖拽关键帧时,你一定遇到过,拖时一时爽,拖完火葬场(拖后关键帧可能不是整数)这时候本脚本就派上用场啦 ### 修复前

【AE脚本】对齐整数帧V1.2

修复后

【AE脚本】对齐整数帧V1.2

更新

V1.0 @草哥 首发

V1.1 @RaymondClr 完善

源码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);
    }
}

给TA充电
共{{data.count}}人
人已充电
AE开发脚本开发

【AE脚本】对齐整数帧V1.0

2021-7-29 17:27:07

AE开发扩展 CEP

AE、PR解析剪映字幕扩展Q_Chameleon源码

2021-8-5 18:12:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
搜索