【问题标题】:For loop in Adobe ExtendScriptAdobe ExtendScript 中的 For 循环
【发布时间】:2016-01-17 23:04:25
【问题描述】:

我在“setEase”函数中的for循环不会增加“i”

function storeKeyframes(){
            var properties      = app.project.activeItem.selectedProperties;
            var activeProperty  = null;
            var keySelection    = null;
            var curKey          = null;
            var curKeyTime      = null;
            var curKeyIndex     = null;

            var theEase         = new KeyframeEase(0 , slider_1_slider.value);

            for (var i = 0; i < properties.length; i++){
                activeProperty = properties[i];
                setEase();
            }

            function setEase(){
                for (var i = 0; i < activeProperty.selectedKeys.length ; i++){
                    keySelection    = activeProperty.selectedKeys;
                    curKey          = keySelection[i];
                    curKeyTime      = activeProperty.keyTime(curKey);
                    curKeyIndex     = activeProperty.nearestKeyIndex(curKeyTime);

                    activeProperty.setInterpolationTypeAtKey(curKeyIndex, KeyframeInterpolationType.BEZIER, KeyframeInterpolationType.BEZIER);
                    activeProperty.setTemporalEaseAtKey(curKeyIndex,theEase, theEase);
                }
            }
        }

我就是不知道为什么。我错过了什么吗?

【问题讨论】:

    标签: javascript loops adobe extendscript after-effects


    【解决方案1】:

    我试过你的代码,确实“i”没有增加,但对我来说原因是有一个错误。

    出错的主要原因是 setTemporalEaseAtKey() 的第二个和第三个参数应该是 KeyframeEase 的 数组,而不仅仅是 KeyframeEase(请参阅脚本指南)。 另一个原因是 activeProperty 不需要是实际的 Property,因此查询 activeProperty.selectedKeys.length 会引发错误。

    顺便说一句,您所说的 curKeyIndex 实际上与 curKey 相同,因此您不需要最近的KeyIndex 的东西。以下代码适用于我:

    function storeKeyframes(){
        var comp = app.project.activeItem;
        if (!comp || comp.typeName !== "Composition") return;
        var properties = comp.selectedProperties;
        var i, I=properties.length;
        var ease1 = new KeyframeEase(0,100);
    
        for (i=0; i<I; i++){
            if (properties[i] instanceof Property) setEase(properties[i], ease1);
            };
        };
    function setEase(property, ease1){
        var ease = property.propertyValueType===PropertyValueType.Two_D ? [ease1, ease1] : (property.propertyValueType===PropertyValueType.Three_D ? [ease1, ease1, ease1] : [ease1]);
        var keySelection = property.selectedKeys;
        var i, I=keySelection.length;
        for (i=0; i<I; i++){
            property.setInterpolationTypeAtKey(keySelection[i], KeyframeInterpolationType.BEZIER, KeyframeInterpolationType.BEZIER);
            property.setTemporalEaseAtKey(keySelection[i], ease, ease);
            };
        };
    storeKeyframes();
    

    【讨论】:

    • 非常感谢您,将轻松设置为数组实际上完成了工作! properties[i] 只能是 instanceOf 属性,因为我只为我的属性变量(“app.project.activeItem.selectedProperties”)选择最顶部的属性
    • 请注意 selectedProperties 可以包含一些 propertyGroups,有时选择关键帧属性也会选择最初选择的属性的父级(例如,在遮罩或效果中)。因此你必须过滤一下。
    【解决方案2】:

    这对我有用。查看 ESTK 的控制台。我建议将您的 activeProperty 传递给您的 setEase 函数。因此,您可以保持示波器清洁。
    此外,最好不要使用相同的迭代器。

    function main() {
      storeKeyframes();
    
    }
    function storeKeyframes() {
      var properties = app.project.activeItem.selectedProperties;
      for (var i = 0; i < properties.length; i++) {
        activeProperty = properties[i];
        $.writeln(i + " in storeKeyframes");
        setEase(activeProperty);
      }
      function setEase(ap) {
        for (var j = 0; j < ap.selectedKeys.length; j++) {
          $.writeln(j + " in setEase");
        }
      }
    }
    main();
    

    【讨论】:

    • 感谢您的回复!我回家后试试看
    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 2013-03-15
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2021-07-30
    相关资源
    最近更新 更多