2016-01-17 6 views
0

мой для цикла в функции «setEase» не увеличится «я»Для контура в Adobe ExtendScript

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

Я просто не могу понять, почему. Я что-то упускаю?

ответ

1

Я пробовал ваш код и действительно «я» не увеличивается, но для меня причина в том, что произошла ошибка.

Основной причиной ошибки является то, что 2-й и 3-й аргументы setTemporalEaseAtKey() должны быть массивы из KeyframeEase, а не только KeyframeEase (смотрите руководство сценариев). Другая причина в том, что activeProperty не обязательно является фактическим свойством, поэтому запрос 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(); 
+0

Thak вам очень нравится, устанавливая легкость, как массив действительно сделал работу! свойства [i] могут быть только экземпляром Object, поскольку я выбираю свойства в самой верхней части для моей переменной свойств («app.project.activeItem.selectedProperties») –

+0

Имейте в виду, что selectedProperties может содержать некоторые свойстваGroups и иногда выбирать свойства keyframable также выбирает родителя (ов) изначально выбранных свойств (например, в масках или эффектах). Следовательно, вам нужно немного отфильтровать. –

+0

ну ладно, спасибо за подсказку! –

0

Это работает для меня. Взгляните на консоль 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(); 
+0

Спасибо за ответ! Я дам ему попробовать, когда я нахожусь дома –