Creative Communities of the World Forums

The peer to peer support community for media production professionals.

Activity Forums Adobe After Effects Expressions ExtendScript – Call function() from parameter .expression

  • ExtendScript – Call function() from parameter .expression

    Posted by Ronan De lacy on February 11, 2021 at 12:38 pm

    Hello forum,

    I’m hoping someone can point me in the right direction here. I have a script that generates keyframes and a number of control layers with sliders applied based on a dropdown list selection (Dropdown range 1-10)—All working.

    However, I am trying to apply an expression to a parameter of the selected layer via .expression, that is generated by a for() loop within a function—Not working.

    I do not know if what I’m trying to do is possible or not.

    Here’s what I have for the function keyFrameExpression();

    pal.grp.groupFive.generateKeyFrameButton.onClick = function() {

    app.beginUndoGroup("Generate Keyframes");

    var frameOffset = 30; //30FPS

    var activeComp = app.project.activeItem;

    var offsetInSecs = frameOffset * activeComp.frameDuration;

    var myLayers = activeComp.selectedLayers;

    if (myLayers.length > 0) {

    function keyFrameExpression(){

    var key = [];

    for(i = 1; i <=pal.grp.groupFive.keyDrop.selection.index; i++){

    key[i] = "thisComp.layer('" +myLayers[0].name+ '_key_'+i + "').effect('Slider Control')('Slider').value;\n" +

    "if(numKeys > 2){\n" +

    "if (time < key(2).time){\n" +

    "key1;\n" +

    "} else if (time < key('" +[i+2]+ "').time){\n" +

    " '" +key[i+1]+ "';\n" +

    "}\n" +

    "}else{\n" +

    "key1;\n" +

    "};\n"

    }

    }

    And later on in the script, where the Range Selector is added and where the keyFrameExpression function is called;

    //Range Selector 1

    var animator1 = myLayers[0].Text.Animators.addProperty("ADBE Text Animator");

    animator1.name = ("Keyframe Control '"+pal.grp.groupFive.keyParameterType.selection.text+"'")

    var selector1 = animator1.property("ADBE Text Selectors").addProperty("ADBE Text Selector"); //range selector

    //selector1.name = ("'"+pal.grp.groupFive.keyBasedOnDrop.selection.text+"'");

    var baseUnit = selector1.property("Advanced").property("Units").setValue(2); //Change Range Selector Units to "Index"

    var baseBasedOn = selector1.property("Advanced").property("Based On").setValue(pal.grp.groupFive.keyBasedOnDrop.selection.index); // Change Range Selector Based On

    selector1.property("ADBE Text Index Start").expression = keyFrameExpression();

    selector1.property("ADBE Text Index End").setValue(200); // change Out range to 200

    My desired result of selector1.property(“ADBE Text Index Start”).expression = keyFrameExpression(); is that it applies an expression to the (“ADBE Text Index Start”) property that looks like this;

    "key1 = thisComp.layer('control-layer-name-1').effect('Slider Control')('Slider)).value;\n" +

    "key2 = thisComp.layer('control-layer-name-2').effect('Slider Control')('Slider)).value;\n" +

    "key3 = thisComp.layer('control-layer-name-3').effect('Slider Control')('Slider)).value;\n" +

    "key4 = thisComp.layer('control-layer-name-4').effect('Slider Control')('Slider)).value;\n" +

    "key5 = thisComp.layer('control-layer-name-5').effect('Slider Control')('Slider)).value;\n" +

    "if(numKeys > 2){\n" +

    "if (time < key(2).time){\n" +

    "key1;\n" +

    "} else if (time < key(3).time){\n" +

    "key2;\n" +

    "} else if (time < key(4).time){\n" +

    "key3;\n" +

    "} else if (time < key(5).time){\n" +

    "key4;\n" +

    "} else {\n" +

    "key5;\n" +

    "}\n" +

    "}else{\n" +

    "key1;\n" +

    "};\n"

    If I change how the .expression is called to the above desired example, everything in the script works.

    Anyone out there know if what I’m attempting is possible, and if not, any suggestions how I should change my approach?

    Thanks in advance,

    Ronan

    Ronan De lacy replied 5 years, 6 months ago 1 Member · 0 Replies
  • 0 Replies

Sorry, there were no replies found.

We use anonymous cookies to give you the best experience we can.
Our Privacy policy | GDPR Policy