Skip to main content
charlesbevan
Inspiring
July 8, 2017
Question

Update the Viewer under a dialog window

  • July 8, 2017
  • 0 replies
  • 371 views

Looking for some scripting tips: I'm currently working on a script to edit keyframes, very similar to After Effect's own 'Edit Value...' popup but I'm running into an issue with live-previewing changes in the Viewer.

If you edit a keyframe using AE's built in 'Edit Value...' dialog (with 'Preview' checked), the item in the viewer updates as well as the property values in the timeline.

When I build my own dialog however, only the timeline values update; the viewer remains static until I close the dialog (even though the values were being updated).  I assume this is an issue with the new AE split threading architecture ... any chance there's a scripting way to refresh the viewer? Any other suggestions?

If I change the script to a 'palette' instead,  the viewer updates correctly but that's less than ideal since keyframe selections and values can change while the palette is still open and I haven't figured out a way to track real-time changes to the active keyframe selection. Any ideas on that too?

Proof of concept script below, just select a position keyframe before running to see what I mean:

{

app.beginUndoGroup("Change XYZ Values");

// super NOT resilient, just for testing: set one position keyframe and just select that

var layer1 = app.project.activeItem.selectedLayers[0];  // first selected layer

var selprop1 = layer1.selectedProperties[0];            // first selected property

var firstKeyIndex = selprop1.selectedKeys[0];           // selected keyframe indicies

var firstKeyValue = selprop1.keyValue(firstKeyIndex);            // value of the first selected keyframe

// create dialog with groups

var res =

"""dialog

{

    text: 'Edit Values',

    inpts: Group

    {

        orientation: 'row',

        valuesGroup: Group

        {

            label: StaticText{text: 'Value'},

            orientation: 'column',

            editX: Group {_: StaticText{text:'X'}, valueX: EditText{characters: 8}},

            editY: Group {_: StaticText{text:'Y'}, valueY: EditText{characters: 8}},

            editZ: Group {_: StaticText{text:'Z'}, valueZ: EditText{characters: 8}},

        }

    },

    btns: Group

    {

        c: Button{text: 'Cancel'},

        o: Button{text: 'OK'},

    },

}""";

var dlg = new Window(res);

// add variables for edit fields

var valueX = dlg.inpts.valuesGroup.editX.valueX;

var valueY = dlg.inpts.valuesGroup.editY.valueY;

var valueZ = dlg.inpts.valuesGroup.editZ.valueZ;

// initilize the edittext values

valueX.text = firstKeyValue[0];

valueY.text = firstKeyValue[1];

valueZ.text = firstKeyValue[2];

// updates keyframe with edit-text values

function updateKeyValue () {

    selprop1.setValueAtKey(firstKeyIndex, [Number(valueX.text), Number(valueY.text), Number(valueZ.text)]);

}

// register onChange events

valueX.onChange = updateKeyValue;

valueY.onChange = updateKeyValue;

valueZ.onChange = updateKeyValue;

// dlg.show() runs only when window closes

if ( dlg.show() != 1)

{

    // if didn't click 'ok', reset back to the initial value  

    selprop1.setValueAtKey(firstKeyIndex, firstKeyValue);

}

app.endUndoGroup();

}

Thanks in advance!

This topic has been closed for replies.