Expressions/Scripts/Presets

Moderator: Paul Tuersley

 
manjunath7472
Topic Author
Posts: 3
Joined: Mon Jun 01, 2015 8:42 am

My first AE Script.Plz review and help with calc and notepad

Wed Jun 03, 2015 3:20 am

Plz review and also help me with calculator and notepad buttons.After effects freezes until i close opened item(calc or notepad).


//Creates a parented 2D or 3D null in the average positions of selected 2D or 3D layers.
// If u have small 2d or 3d layers scattered in one corner of comp, select those layers and click "Create Null".

//_____________________________________buildUI
function buildUI(thisObj) {
var myPanel = (thisObj instanceof Panel) ? thisObj:new Window('palette', 'ParenNull',undefined, {resizable: true});

myPanel.nullButton= myPanel.add('button', [0,0,100,30], 'Create Null'); //Create Null
myPanel.nullButton.onClick = function(){


mySelectedLayers=app.project.activeItem.selectedLayers;

var layerPos= new Array();
var totalPos=0;
var avgPosX
var avgPosY
var avgPosZ

app.beginUndoGroup("delete all");

//Assign 3D null to 3D layers and 2D null to 2D layers.
//IF 3D
if(mySelectedLayers[0].threeDLayer){

//Find Average Postion of selected layers

for(var i=0;i<mySelectedLayers.length;i++){

layerPos[layerPos.length]=mySelectedLayers[i].property("Transform").property("Position").value;
totalPos+=layerPos[i];
avgPosX=totalPos[0]/layerPos.length;
avgPosY=totalPos[1]/layerPos.length;
avgPosZ=totalPos[2]/layerPos.length;
}

// Create null using new avg positions.

var myNull=app.project.activeItem.layers.addNull();
myNull.threeDLayer=true;
myNull.name="Mom";
myNull.property("Transform").property("Anchor Point").setValue([50,50,0]);
myNull.property("Transform").property("Position").setValue([avgPosX,avgPosY,avgPosZ]);

//Parent selected layers to new null
for(var k=0;k<mySelectedLayers.length;k++){

mySelectedLayers[k].parent=myNull;

}

//IF 2D
}else if(!mySelectedLayers[0].threeDLayer){

//Find Average Postion of selected layers

for(var i=0;i<mySelectedLayers.length;i++){

layerPos[layerPos.length]=mySelectedLayers[i].property("Transform").property("Position").value;
totalPos+=layerPos[i];
avgPosX=totalPos[0]/layerPos.length;
avgPosY=totalPos[1]/layerPos.length;

}

// Create null using new avg positions.

var myNull=app.project.activeItem.layers.addNull();
myNull.name="Mom";
myNull.property("Transform").property("Anchor Point").setValue([50,50,0]);
myNull.property("Transform").property("Position").setValue([avgPosX,avgPosY]);

//Parent selected layers to new null
for(var k=0;k<mySelectedLayers.length;k++){

mySelectedLayers[k].parent=myNull;

}

}

app.endUndoGroup();



}
//--------------------- HelpButton
myPanel.helpButton= myPanel.add('button', [105,0,135,30], '?'); //helpButton
myPanel.helpButton.onClick = function(){

alert("This Script is Created By Manjunath"+"\r" + "\r" + "Select Any 2Dlayers or 3D layers \r and click create null button." + "\r" +"\r " + "This script creates Null on average position \r of selected 2D or 3D layers.");

}

//------------------------ Open Calc
myPanel.calc= myPanel.add('button', [70,40,100,80], 'calc'); //helpButton
myPanel.calc.onClick = function(){

var calc =system.callSystem("cmd.exe /c\"calc");

}

//-------------------------- Open notePad

myPanel.notePad= myPanel.add('button', [0,40,60,80], 'NotePad'); //helpButton
myPanel.notePad.onClick = function(){

var calc =system.callSystem("cmd.exe /c\"notepad");

}

//--------------------------- info

var info="This Script is Created by Manjunath";

myPanel.info= myPanel.add('statictext', [0,90,180,120], info.toString()); //info

//---------------


//---------------------------------------
return myPanel;


}

var myToolsPanel = buildUI(this);
 
stib
Posts: 15
Joined: Sun Dec 10, 2006 10:23 pm
Contact:

Re: My first AE Script.Plz review and help with calc and not

Thu Aug 27, 2015 10:34 pm

This script can be simplified a bit, in particular in the loop, which will speed it up
  • Firstly you don't need to treat 3D and 2D layers differently—2D layers have a Z coordinate, it's just always set to 0. So you can use the 3D code for both.
  • you don't need to calculate the average with each layer, that just wastes time. Add all the layer positions together and then calculate the average at the end.
  • You don't need to create an array of the layers just to get its length, you know how many layers there are at the beginning.
  • You don't need to unpack and repack the position array to divide it. Vectors (aka arrays) can be multiplied and divided by scalars (single values like integers and floats etc.). So to divide the position sum all you need to do is
    totalPos/mySelectedLayers.length
    .
  • Similarly, vectors (arrays) can be added and subtracted with other vectors. So to get the sum of all the positions
    totalPos+=layerPos[i]
  • I also fixed the name of the undo group and your spelling of mum. ;)

As far as the notepad and calc functions go I can't help you, I actually came here looking for system.callSystem documentation. Obviously the callSystem() method waits for the process you call to exit. There may be parameters to change this behaviour, but I can't find them.
Why wouldn't you just open these progs using the Start Menu / Spotlight / Dock / whatever you normally use on your OS to open programs?

So here's my version:
//Creates a parented 2D or 3D null in the average positions of selected 2D or 3D layers.
// If you have small 2d or 3d layers scattered in one corner of comp, select those layers and click "Create Null".

//_____________________________________buildUI
function buildUI(thisObj) {
   var myPanel = (thisObj instanceof Panel) ? thisObj:new Window('palette', 'ParenNull',undefined, {resizable: true});

   myPanel.nullButton= myPanel.add('button', [0,0,100,30], 'Create Null'); //Create Null
   
   myPanel.nullButton.onClick = function(){
      app.beginUndoGroup("create Null at Avg pos");
      mySelectedLayers=app.project.activeItem.selectedLayers;
      //check there are selected layers to avoid divide-by-zero error
      if (mySelectedLayers.length){
         var totalPos=[0,0,0];
         var avgPos;
         
         //Find Average Postion of selected layers
         for(var i=0;i<mySelectedLayers.length;i++){
            totalPos+=mySelectedLayers[i].property("Transform").property("Position").value;
         }
         avgPos=totalPos/mySelectedLayers.length;

         // Create null using new avg positions.
         var myNull=app.project.activeItem.layers.addNull();
         myNull.name="Mum";
         myNull.property("Transform").property("Anchor Point").setValue([50,50,0]);
         myNull.property("Transform").property("Position").setValue(avgPos);

         //Parent selected layers to new null
         for(var k=0;k<mySelectedLayers.length;k++){

            mySelectedLayers[k].parent=myNull;
         }
      } else {
         alert("select some layers to find the average position")
      }
      app.endUndoGroup();
   }

   //--------------------- HelpButton
   myPanel.helpButton= myPanel.add('button', [105,0,135,30], '?'); //helpButton
   myPanel.helpButton.onClick = function(){
      alert("This Script is Created By Manjunath"+"\r" + "\r" + "Select Any 2Dlayers or 3D layers \r and click create null button." + "\r" +"\r " + "This script creates Null on average position \r of selected 2D or 3D layers.");
   }

   //------------------------ Open Calc
   myPanel.calc= myPanel.add('button', [70,40,100,80], 'calc'); //helpButton
   myPanel.calc.onClick = function(){
      var calc =system.callSystem("cmd.exe /c\"calc");
   }

   //-------------------------- Open notePad
   myPanel.notePad= myPanel.add('button', [0,40,60,80], 'NotePad'); //helpButton
   myPanel.notePad.onClick = function(){
      var calc =system.callSystem("cmd.exe /c\"notepad");
   }

   //--------------------------- info
   var info="This Script is Created by Manjunath\rTweaked by stib";
   myPanel.info= myPanel.add('statictext', [0,90,180,120], info.toString()); //info
   //---------------
   return myPanel;
}

var myToolsPanel = buildUI(this);

Who is online

Users browsing this forum: No registered users and 2 guests