Skip to main content
Known Participant
August 7, 2024
Answered

Name pre-comp from selected layer names

  • August 7, 2024
  • 2 replies
  • 2098 views

i saw a plugin that would dynamically name a pre-comp, but couldn't handle more than one layer at a time. i need to group individual animated characters, which are on their own individual layer ...so i can have pre-comps of the words. i have way too many to handle and typing the name for each pre-comp would take forever.

Can you recommend code or a plugin to do this?

i eventually will be trying to use monkey layer or something match the words to markers.

This topic has been closed for replies.
Correct answer Airweb_AE

Create Precomps.jsx

(function(thisObj) {
  buildUI(thisObj);

  function buildUI(thisObj) {
    var palette = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Create Precomps", undefined, {
      resizeable: true
    });
    palette.alignChildren = ["left", "top"];
    palette.spacing = 7;
    palette.margins = 10;
    var button = palette.add("button", undefined, 'Create Precomp');
    if (palette instanceof Window) {
      palette.center();
      palette.show();
    } else {
      palette.layout.layout(true);
      palette.layout.resize();
    }
    button.onClick = function() {
      var proj = app.project;
      var thisComp = proj.activeItem;
      var selectedLayers = thisComp.selectedLayers;
      if (!selectedLayers.length) {
        alert('Select at least 1 layer');
        return false;
      }
      app.beginUndoGroup("Create Precomps");
      var precompName = '';
      var indexes = [];
      for (var i = 0; i < selectedLayers.length; i++) {
        precompName += selectedLayers[i].name;
        indexes.push(selectedLayers[i].index);
      }
      var precomp = thisComp.layers.precompose(indexes, precompName, true);
      app.endUndoGroup();
    };
  }
})(this);

2 replies

Legend
August 7, 2024

Or even faster.

Create Precomps - v2.0.jsx

(function(thisObj) {
    Array.prototype.indexOf = function(item) {
      var index = 0,
        length = this.length;
      for (; index < length; index++) {
        if (this[index] === item)
          return index;
      }
      return -1;
    }
  buildUI(thisObj);

  function buildUI(thisObj) {
    var palette = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Create Precomps", undefined, {
      resizeable: true
    });
    palette.alignChildren = ["left", "top"];
    palette.spacing = 7;
    palette.margins = 10;
    palette.add("statictext", undefined, 'Precomp Names Separated with Commas:');
    var precomps = palette.add('edittext {properties: {name: "edittext1"}}');
    precomps.text = "";
    var proj = app.project;
    var thisComp = proj.activeItem;
    if (thisComp) {
      for (var i = 1; i <= thisComp.numLayers; i++) {
        precomps.text += thisComp.layer(i).name
      }
    }
    precomps.preferredSize.width = 300;
    var button = palette.add("button", undefined, 'Create Precomp');
    button.preferredSize.width = 300;
    if (palette instanceof Window) {
      palette.center();
      palette.show();
    } else {
      palette.layout.layout(true);
      palette.layout.resize();
    }
    button.onClick = function() {
      var done = [];
      var arr = precomps.text.split(',');
      var proj = app.project;
      var thisComp = proj.activeItem;
      app.beginUndoGroup("Create Precomps");
      for (var i = 0; i < arr.length; i++) {
        // DeselectAll
        app.executeCommand(2004);
        var precompName = arr[i];
        var layerNames = arr[i].split('');
        var indexes = [];
        for (var j = 1; j <= thisComp.numLayers; j++) {
          if (done.indexOf(thisComp.layer(j)) == -1 && thisComp.layer(j).name == layerNames[0]) {
            thisComp.layer(j).selected = true;
            indexes.push(thisComp.layer(j).index);
            layerNames = layerNames.slice(1);
            if (!layerNames.length) {
              var precomp = thisComp.layers.precompose(indexes, precompName, true);
              done.push(precomp);
                break;
            }
          }
        }
      }
      app.endUndoGroup();
    };
  }
})(this);
Known Participant
August 7, 2024

i save it as a .jsx and then do a file/scripts/run ...but it doesn't work ...how do i get that console you are using?

Legend
August 7, 2024

I tried from file > Scripts -> Run.... it works

The CONSOLE I use is a custom extension.

But I recently saw one that looks even better.

ExtendScript Developer Tools 

 

Legend
August 7, 2024

Can you make a screen recording to show us the manual steps you take?
This will allow us to write a script or direct you to a script that performs these actions.

Known Participant
August 7, 2024

https://youtu.be/7HnoJDyGEbU

i would be naming them because i think you need a word to be a single layer to work in monkey layers with textsyncr. or maybe i could do something with textforce.

Airweb_AECorrect answer
Legend
August 7, 2024

Create Precomps.jsx

(function(thisObj) {
  buildUI(thisObj);

  function buildUI(thisObj) {
    var palette = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Create Precomps", undefined, {
      resizeable: true
    });
    palette.alignChildren = ["left", "top"];
    palette.spacing = 7;
    palette.margins = 10;
    var button = palette.add("button", undefined, 'Create Precomp');
    if (palette instanceof Window) {
      palette.center();
      palette.show();
    } else {
      palette.layout.layout(true);
      palette.layout.resize();
    }
    button.onClick = function() {
      var proj = app.project;
      var thisComp = proj.activeItem;
      var selectedLayers = thisComp.selectedLayers;
      if (!selectedLayers.length) {
        alert('Select at least 1 layer');
        return false;
      }
      app.beginUndoGroup("Create Precomps");
      var precompName = '';
      var indexes = [];
      for (var i = 0; i < selectedLayers.length; i++) {
        precompName += selectedLayers[i].name;
        indexes.push(selectedLayers[i].index);
      }
      var precomp = thisComp.layers.precompose(indexes, precompName, true);
      app.endUndoGroup();
    };
  }
})(this);