Creative Communities of the World Forums

The peer to peer support community for media production professionals.

Activity Forums Adobe After Effects Expressions Script to show/hide some layers

  • Script to show/hide some layers

    Posted by Herby Herve on November 23, 2016 at 8:10 am

    Hi,

    I’m working on a big multilingual AE project.
    So far, I’ve managed the different language thanks to expression: I’ve created a controller layer in my top composition with 3 checkboxes (one per language) to control layers opacity. For instance here’s the expression I have on a typical English title:
    if(comp(“Final”).layer(“Language”).effect(“English”)(“Checkbox”) == 1) 100 else 0

    It works as expected but now this project becomes too big for this method. I’m not sure what’s going on in the background but now the render time for the whole project goes beyond 5 hours. If I manually disable the layers using the eyeball button in the timeline (instead of turning opacity to 0 with the expressions), my render time falls down to 1 hour.

    So I’m wondering if a script could do the job.
    Basically, I could rename the layers that need to be shown or hidden by adding the language code at the end of their names (EN for English, FR for French…). So the script will have to scan all the layers in the project and disable/enable the layers based on the last 2 characters of their names.

    First big question: does a script can do that?

    I have basic knowledge of javascript but never did any scripting in AE.
    The first main problem I have is to find a way to get the script scanning through all the layers in all comps.

    Herby Herve replied 9 years, 5 months ago 2 Members · 3 Replies
  • 3 Replies
  • Xavier Gomez

    November 23, 2016 at 9:50 am

    Yes it’s possible, scripts are designed exactly for this kind of things.
    You need to loop throw all project items, identify those that are compositions, then for each comp loop again over all layers, and do your stuff with each layer.
    You can try this (on a test project…):

    var LANG_KEYS = "_EN,_DE,_FR,_IT";
    //
    function handleLayer(layer, lang_identifier){
    var str = layer.name.slice(-3);
    if (LANG_KEYS.indexOf(str)<=0){
    // layer is localized: switch on or off
    layer.enabled = (str===lang_identifier);
    }
    else{
    // layer not localized: do nothing
    };
    };
    function handleProject(lang_identifier){
    var M = app.project.numItems, m, comp;
    var N, n, layer;

    for (m=1; m<=M; m++){
    comp = app.project.item(m);
    if (comp.typeName!=="Composition") continue;
    N = comp.numLayers;
    for (n=1; n<=N; n++){
    layer = comp.layer(n);
    handleLayer(layer, lang_identifier);
    };
    };
    };
    // UI
    var win = new Window("palette", "script name");
    win.alignChildren = ['fill', 'top'];
    win.spacing = 5;
    var keyMENU = win.add("dropdownlist", undefined, LANG_KEYS.split(","));
    var runBTN = win.add("button", undefined, "go");
    keyMENU.selection = 0;
    runBTN.onClick = function(){handleProject(keyMENU.selection.text);};
    win.show()
    ;

    Xavier

  • Herby Herve

    November 23, 2016 at 11:20 am

    Thanks Xavier. This helps a lot.
    In the meantime, I’ve found this page where I found a lot of help as well: https://leemscripts.tumblr.com/
    The last script on the page (enable 3d switches for an entire hierarchy) is quite similar to what I want to do.

    More than enough to start this script. I’ll post news here…

  • Herby Herve

    November 24, 2016 at 12:10 pm

    Got it!!
    I paste the script below.
    I’m pretty sure that this script can be improved but it already does the job…

    function hideLayer (layer, selectedLanguage){
    // Hide/Show layers according to the last 2 digits of layer's name
    if (layer.hasVideo && selectedLanguage == "All" || layer.name.slice(-2) == selectedLanguage){layer.enabled = true};
    else {layer.enabled = false};
    if (layer.hasAudio && selectedLanguage == "All" || layer.name.slice(-2) == selectedLanguage){layer.audioEnabled = true};
    else {layer.audioEnabled = false};
    // For layers used both in EN & FR version
    if (layer.name.slice(-5) == "EN/FR" && selectedLanguage == "EN" && layer.hasVideo){layer.enabled = true};
    if (layer.name.slice(-5) == "EN/FR" && selectedLanguage == "EN" && layer.hasAudio){layer.audioEnabled = true};
    if (layer.name.slice(-5) == "EN/FR" && selectedLanguage == "CH" && layer.hasVideo){layer.enabled = false};
    if (layer.name.slice(-5) == "EN/FR" && selectedLanguage == "CH" && layer.hasAudio){layer.audioEnabled = false};
    };
    // Scan all layers
    function goThroughLayers (Comp, selectedLanguage){
    for (var p = 1; p &lt;= Comp.numLayers; p++){
    // Check if layer needs to be modified
    if(Comp.layer(p).name.slice(-2) == "EN" || Comp.layer(p).name.slice(-2) == "FR" || Comp.layer(p).name.slice(-2) == "CH"){
    hideLayer(Comp.layer(p), selectedLanguage);
    };
    };
    };

    //UI
    var w =new Window ("dialog","Select language");
    w.orientation="column";
    var radio_group = w.add ("panel");
    radio_group.orientation="row";
    radio_group.alignChildren ="center";
    radio_group.add ("radiobutton", undefined, "EN");
    radio_group.add ("radiobutton", undefined, "FR");
    radio_group.add ("radiobutton", undefined, "CH");
    radio_group.add ("radiobutton", undefined, "All");
    var button_group = w.add ("group");
    button_group.orientation="row";
    button_group.alignChildren ="center";
    button_group.add ("button", undefined, "Cancel");
    button_group.add ("button", undefined, "OK");

    // set dialog defaults
    radio_group.children[0].value =true;

    if(w.show ()== 1){
    // Get selected language
    for(var x = 0; x &lt; radio_group.children.length; x++){
    if(radio_group.children[x].value ==true){var selectedLanguage = (radio_group.children[x].text)};
    };

    app.beginUndoGroup("Language selection");

    // Search for all Compositions in the project
    for (var i = 1; i &lt;= app.project.numItems; i++) {
    if (app.project.item(i) instanceof CompItem) {
    var Comp = app.project.item(i);
    goThroughLayers(Comp, selectedLanguage);
    }
    }
    app.endUndoGroup();
    };

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