scripting effects properties

Find out why the . goes before the /

Moderator: Paul Tuersley

w_m0zart
Posts: 20
Joined: June 6th, 2005, 1:52 pm
Location: Hengelo, Netherlands
Contact:

I am trying to write a script that adds an (external) effect and set certain properties of that effect automatically. In particular I'd like to know exactly which naming conventions exist (if there is at all?) with effects and their parameter values.

I'll split this into 3 parts: Effect naming convention, Effect method naming convention and parameter values conventions:

Effect naming convention
-What should I write in my script to apply a certain effect to that layer?
I see in the pdf scripting guide on p. 179 the following part of a code:

Code: Select all

// Always best to check if it's safe before adding:
if (the_layer("Effects").canAddProperty("Fast Blur")) {
// add a new Fast Blur effect to the effects group of the layer
the_layer("Effects").addProperty("Fast Blur");
Which naming conventions are there exactly for the effect? Is it just the name which appears on the screen if you select an effect, which you want to add? In my case this would be something like:

Code: Select all

the_layer("Effects").addProperty("FieldsKit Deinterlacer");
I tested this and it works indeed. But will this work for all effects? Is there a standard?

Effect method naming convention
-What should I write in my script to access certain methods from that effect?
(from the pdf scripting guide on p. 179 the following code:)

Code: Select all

// set the parameter values
the_layer("Effects")("Fast Blur").blurriness.setValue(10);
Again, what naming conventions are there exactly for the specific method (In the code snippet blurriness)? I guess spaces are omitted, and replaced by first character capitalized words except for the first word.
For example for the Fieldskit Deinterlacer, Field Order will be resolved to fieldOrder. In the example:

Code: Select all

the_layer("Effects")("FieldsKit Deinterlacer").fieldOrder.setValue(LowerFirst);
I tested this (with assigning: var LowerFirst=2), and this works as well

parameter values conventions
For all kinds of parameter values I found:
-Tick Box. This is either true or false.
For example:

Code: Select all

the_layer("Effects")("FieldsKit Deinterlacer").viewMotionMask.setValue(true);
-Numerical values. A number.
For example:

Code: Select all

the_layer("Effects")("FieldsKit Deinterlacer").motionTolerance.setValue(0.80);
-Combo Box. An integer, starting from 1. The integer 1 will represent the topmost item.
For example:

Code: Select all

var UpperFirst=1;
var LowerFirst=2;
the_layer("Effects")("FieldsKit Deinterlacer").fieldOrder.setValue(UpperFirst);
Can someone confirm my observations, and lead me to a source of more information?
Last edited by w_m0zart on June 8th, 2005, 2:07 pm, edited 2 times in total.
davestewart
Posts: 114
Joined: March 10th, 2005, 5:50 am
Location: London, UK
Contact:

I'm not sure if there's a "standard" as such... but you may want to look at

- "PropertyBase matchName attribute" on page 153
- "Property propertyValueType attribute" on page 142

Don't forget you can also access properties by index as well as by name.

str=app.project.activeItem.layers[1].Effects.property(1).name
alert(str)

It's a shame that properties are not available via array access in the same way that layers are though...

Cheers,
Dave
vidpat
Posts: 86
Joined: October 21st, 2004, 12:36 am
Location: Phoenix, AZ
Contact:

I would suggest using match names for effects and their parameters in most cases. Use the property() method of the parent PropertyGroup passing it the match name string to receive a reference to the effect or parameter you want.

Using the display name of an effect or parameter (the name as it appears to the user in menus and in the ECW) can make a script unportable to systems running under other languages. Internationalized effects can change their display names to conform to the system's language. Match names, on the other hand, can be used consistently.

The match names for effects parameters typically begin with the effect's match name and end with a four digit number. This uniquely identifies the parameter. The number is often the index of the parameter in the effect, but not necessarily. The number is assigned to the parameter by the effect developer. Future versions of the effect may add or replace parameters with new controls and thus different numbers. Unfortunately, this means effects parameters are not descriptive. To overcome this, you can assign the parameter match names that you will be using to constants with descriptive names.

Example:

Code: Select all

layer.property("ADBE Effect Parade").property("ADBE Gaussian Blur").property("ADBE Gaussian Blur-0001").setValue(20);
Hope this helps some.
w_m0zart
Posts: 20
Joined: June 6th, 2005, 1:52 pm
Location: Hengelo, Netherlands
Contact:

You mean constants like #define in good old c.

Wouldn't it be a good idea to start a new thread in which we collect all our knowledge about these constants from each effect?

Cheers!

Wolfgang
vidpat
Posts: 86
Joined: October 21st, 2004, 12:36 am
Location: Phoenix, AZ
Contact:

I wish there was #define or that ECMAScript had const or final declarations. I typically just define a bunch of regular vars at the beginning of the script with their names in all caps so that I remember not to modify them elsewhere.

I had written a little property inspector script which would give me info on the names and match names and types for properties of the current layer. I suppose this could be generalized to compile the information in to a resource for all effects and their parameters. The only drawback is that each effect would have to be applied by hand.
w_m0zart
Posts: 20
Joined: June 6th, 2005, 1:52 pm
Location: Hengelo, Netherlands
Contact:

(Although off-topic) The ECMA script does support the const type.

This is what I found here: http://xmelegance.org/devel/qsa-x11-fre ... e-2-1.html

Constants are declared using the const keyword:

Code: Select all

     const _LOWERFIRST = 1;
     const           x = "Willow";
---> const  y : String = "Oak";<--- NOT Supported in After Effects
Further it says: Constants must be defined at the point of declaration, because they cannot be changed later. If an attempt is made to assign to a constant, the Qt Script for Applications interpreter will issue an error message and stop.

Constants are public globals if they are declared outside of any enclosing braces. When declared within the scope of some braces, e.g. within an if statment, their scope is local to the enclosing block.


I could not yet verify last statement, but what does work is assigning with the const identifier.

Cheers,

Wolfgang
davestewart
Posts: 114
Joined: March 10th, 2005, 5:50 am
Location: London, UK
Contact:

Great find Wolfgang, I didn't know about that either.
vidpat
Posts: 86
Joined: October 21st, 2004, 12:36 am
Location: Phoenix, AZ
Contact:

ECMA-262 actually doesn't specify a const declaration. It only states that const is a future reserved keyword.

The AE interpreter does implement const but, unfortunately, it isn't that useful. Typically, constants are defined at a global scope. Doing so in a script poses a problem, though. The global space persists across all scripts/executions in an AE session. Thus, when a script with const declarations is run after the first time, the interpreter complains about redeclarations of the constants. A script with global const declarations can only be run once and namespace collisions among disparate scripts become fatal.

There are a few work arounds which are less than ideal:
∙ Test whether the const you are about to declare has already been defined (again, problems across scripts)
∙ Wrap the entire script in a function declaration in order introduce a new scope
∙ Similarly, make everything an object

It is a shame that there isn't a better way to scope the declarations. If AE provided a clean global context for each script execution, it would work. However, startup scripts and scripts that do intend to set session-wide globals would have to explicitly export into app (add-on properties, a hash, or the like). This would likely break many existing scripts.
w_m0zart
Posts: 20
Joined: June 6th, 2005, 1:52 pm
Location: Hengelo, Netherlands
Contact:

Back On topic:

I am trying to write a script that writes values and properties from an effects template file to a certain effect.
In order to write the values, I need to find a uniform way to address the values from a certain effect-property. Depending on the type of the value, it can be a single value or values in an array. (e.g. values for coordinates have 2 elements, RGB-color has 3 or 4 values)

I wrote a short example code, which adds the Remove Grain effect to a selected layer, and sets the color of the Preview box.

Code: Select all

//********************************************************
// writing effect values at a certain property from an effect
var the_layer	= app.project.activeItem.selectedLayers[0];
var ename	= "Remove Grain";
var effectsGroup = the_layer("Effects");
var data=new Array();

if (effectsGroup != null ) // Always best to check if it's safe before adding:
{
	if (effectsGroup.canAddProperty(ename))
	{
		var effectBase = effectsGroup.addProperty(ename);
		if (effectBase != null)				// Effect was applied, now set parameter values
		{

			var prpty         = 7; // Remove Grain, Box Color
			var numElmnts = 3; // array has 3 elements
			data[1]	           = .4; // R
			data[2]	           = .5; // G
			data[3]            = .6; // B

			switch (numElmnts)
			{
				case 1: // noArray
				{
					the_layer("Effects")(ename).property(prpty).setValue( data[1] );
					break;
				}

				case 2: // array with two elements
				{
					the_layer("Effects")(ename).property(prpty).setValue([ data[1],data[2] ]);
					break;
				}

				case 3: // array with three elements
				{
					the_layer("Effects")(ename).property(prpty).setValue([ data[1],data[2],data[3] ]);
					break;
				}

				case 4: // array with four elements
				{
					the_layer("Effects")(ename).property(prpty).setValue([ data[1],data[2],data[3],data[4] ]);
					break;
				}

				default:;
			}
		}
	}
}
//********************************************************
As one may see, I used a switch-case statement to differentiate between single elements, and arrays with 2 till 4 elements.

Instead of using a case statement, I prefer using a method, in which I may directly address the n-th element of a certain effects property from an array. To find this out, I tried the opposite: reading the values from an effect. In this way I also have to differentiate between non-array and array values. But at least for array values, it's size doesn't matter. This uniform way looks like:

For the first effect (1) on the selected layer, in
case of an array, if the effect is e.g. "Remove Grain";
then prpty is the property type.
  • 1:Viewing Mode
    2:Preview Region
    3:Center
    etc.
If property prpty is not an array, we retrieve the value data of the first effect on the first layer with:

Code: Select all

data=app.project.activeItem.selectedLayers[0]("Effects")(1)(prpty).value;
If property prpty is an array, we retrieve the number of elements numElmnts of the array with:

Code: Select all

numElmnts=app.project.activeItem.selectedLayers[0]("Effects")(1)(prpty).value.length;
Each single element can be easily read out. Asume property prpty is an effects property which holds an array. Since we know the number of elements of this array, we get the value by iterating with j from 1 to numElmnts with:

Code: Select all

data=app.project.activeItem.selectedLayers[0]("Effects")(1)(prpty).value[j];
In contrast to reading a value, I would like to have for writing a value something like:

Code: Select all

app.project.activeItem.selectedLayers[0]("Effects")(1)(prpty).value[j]=data;
This method doesn't work, but everyone could understand that I want to write the value of the j-th element. The script guide suggests to use the method .setValue for this.
While experimenting, I tried all folowing methods:

Code: Select all

the_layer("Effects")(ename)(prpty)(j).setValue([data])
the_layer("Effects")(ename)(prpty).property(j).setValue([data]);
the_layer("Effects")(ename)(prpty).setValue(j,[data]);
Al these methods failed. The only way the official script guide provides is:

Code: Select all

// two dimensional array
the_layer("Effects")(ename)(prpty).setValue([ data[1],data[2] ]);
// three dimensional array
the_layer("Effects")(ename)(prpty).setValue([ data[1],data[2],data[3] ]);
// four dimensional array
the_layer("Effects")(ename)(prpty).setValue([ data[1],data[2],data[3],data[4] ]);
Making an extra case statement necessarry, which diferentiates between the number of elements in the array, which I do not find very elegant.

So does someone know a way with methods to address the j-th element of an array...
Last edited by w_m0zart on July 18th, 2005, 1:50 am, edited 6 times in total.
vidpat
Posts: 86
Joined: October 21st, 2004, 12:36 am
Location: Phoenix, AZ
Contact:

Are you trying to modify just one element in the current value array for a property or are you just trying to assign an array as a value? The former requires that you copy the value array to a variable, manipulate it there, and then reassign it to the property using setValue().

If you are reading the property values in from a file that is hand-created by the user, then you would likely want to have some sort of conditional that makes certain that the array read in is of the same dimension (and type?) as the property expects (using the PropertyValueType constants). If there is a mismatch, throw an error or alert the user.

However, if you are certain that the number of elements in the array will correspond to the dimension of the property, you can forego the checking. It would just be a matter of "assigning" the array to the property with setValue().

As in your Remove Grain - Color example:

Code: Select all

// Several possible declarations and definitions of data
var data = new Array(); // since we know the size, could also be Array(4)
data[0] = 0.4;
data[1] = 0.5;
data[2] = 0.6;
data[3] = 1.0; // setting alpha where not needed
// or
var data = new Array(0.4, 0.5, 0.6, 1.0);
// or
var data = [0.4, 0.5, 0.6, 1.0];


// Assuming prpty is a reference to the effect's color property
prpty.setValue(data);


// or
// To change a single element...
var data = prpty.value;
data[1] = 0.9;
prpty.setValue(data);


// or
// To be pedantic and check the dimension before setting...
swicth (prpty.propertyValueType) {
    case PropertyValueType.TwoD:
    case PropertyValueType.TwoD_SPATIAL:
        if (data.lenth != 2) {
            throw "Data dimension mismatch for property.";
        }
        break;
    case PropertyValueType.COLOR:
        if (data.length != 4) {
            throw "Data dimension mismatch for property.";
        }
        break;
    // et cetera for the other PropertyValueTypes
}
prpty.setValue(data);
I hope this helps some.
w_m0zart
Posts: 20
Joined: June 6th, 2005, 1:52 pm
Location: Hengelo, Netherlands
Contact:

I have found a solution!

After trying to clearify my previous post, I kept thinking, when I came up with the idea of just performing a read, modify, write-cycle, avoiding having to create arrays with a variable sizes for each property:

Code: Select all

var data=new Array();
var the_layer	= app.project.activeItem.selectedLayers[0];
var ename	= "Remove Grain";
var effectsGroup = the_layer("Effects");
..
// perform a "read, modify, write"-cycle
var prpty	= 7;	// Remove Grain, Box Color
var numElmnts	= 3;

data=the_layer("Effects")(1)(prpty).value;

data[0]		= 0;
data[1]		= 0;
data[2]		= 1;
the_layer("Effects")(ename)(prpty).setValue(data);
A wrong size of the array will cause troubles:

Code: Select all

// perform a "read, modify, write"-cycle
var prpty	= 7;	// Remove Grain, Box Color

data[0]		= 0;
data[1]		= 0;
data[2]		= 1;
data[3]		= 0; // data[3] may be omitted
data[4]		= 0; // data[4] will cause an error at setValue
data[5]		= 0; // data[5] will cause an error at setValue

the_layer("Effects")(ename)(prpty).setValue(data);
One might think, why seeking troubles when there aren't any. The real problem will exist, if we use the array both for writing a color (3 or 4 elements r,g,b,a) and size (2 elements x,y). I don't know how I can delete an array once it is being created. But instead of deleting an array, it's possible to set the size of an array, which seem to work fine:

Code: Select all

// perform a "modify, write"-cycle
var prpty	= 7;	// Remove Grain, Box Color

data[0]		= 0;
data[1]		= 0;
data[2]		= 1;
data[3]		= 0;
data[4]		= 0;
data[5]		= 0;
data.length=3; // <-------------- changing size of array

the_layer("Effects")(ename)(prpty).setValue(data);
There are probably a lot more ways to solve this. Please let me know if there are more easier ways.
w_m0zart
Posts: 20
Joined: June 6th, 2005, 1:52 pm
Location: Hengelo, Netherlands
Contact:

The following script extracts from a layer which has (only) one effect applied it's properties and values. The result will be written to a file;

Code: Select all

//###############################################################################
//# Generate EffectTemplateFile script; GenerateTFX.jsx
//# What it does basically:
//# Just creates a .tfx (effect template file; text file) from a certain selected
//# effect. The file helps finding out which property x and value y belongs to 
//# effect z.
//# 
//# Another purpose for a .tfx file is it can be read in directly with the Apply.tfx
//# script. Once read in adding this effect to a layer is very easy.
//###############################################################################
//# _The structure of an .tfx file is:_
//#
//# -Each line is seperated with cr/lf
//# -everything following a semicolon (;) is regarded as comment
//# -comment should be on a seperate line
//# -before all properties and data, there should be ADOBE_EffectName=
//#    for example: ADOBE_EffectName=Grain Surgery
//# -Effectproperties must start with "ADOBE_Property_" continued by a number and "="
//#    for example: ADOBE_Property_4=Width
//# -single values are written without brackets, just plain numbers
//#    for example: 1.523
//# -arrays are in the format [x,y,..,z]
//#    for example: [0.5,1.0,0.8]
//#
//# To have more insight, just produce one with the GenerateTFX script, and analyze it
//###############################################################################
//# Written in July 2005, by Marc Nijdam. Though probably lot's of useful code
//# from others can be found in here as well.
//###############################################################################
//# For reading out the following applies:
//# number of applied effects on this layer:
//# app.project.activeItem.selectedLayers[0]("Effects").numProperties;
//# name of first effect:
//# app.project.activeItem.selectedLayers[0]("Effects")(1).name;
//# number of properties from the (first) effect:
//# app.project.activeItem.selectedLayers[0]("Effects")(1).numProperties;
//# name of the i-th property from the (first) effect
//# app.project.activeItem.selectedLayers[0]("Effects")(1)(i).name;
//# query which kind of property from the i-th property this is
//# app.project.activeItem.selectedLayers[0]("Effects")(1)(i).propertyValueType;
//# possible values: PropertyValueType.NO_VALUE
//#                  PropertyValueType.TwoD_SPATIAL
//#                  PropertyValueType.TwoD
//#                  PropertyValueType.OneD
//#                  PropertyValueType.COLOR
//#                  PropertyValueType.CUSTOM_VALUE
//# number of elements in array from the i-th element (if it's an array)
//# app.project.activeItem.selectedLayers[0]("Effects")(1)(i).value.length;
//# Value from the i-th property; (if it ain't an array)
//# app.project.activeItem.selectedLayers[0]("Effects")(1)(i).value;
//# Value from the j-th array element from the i-th property (if an array it is)
//# app.project.activeItem.selectedLayers[0]("Effects")(1)(i).value[j];
//###############################################################################
{
// some kind of constants
     var _EFFSTR   = "ADOBE_Property_";
     var _EFFNAME  = "ADOBE_EffectName";
// variables
     var proj     = app.project;          // set project
     var projClt  = proj.items;           // list of items in project
     var projAi;
     var fileName;                        // output filename
     var thisLayer;
     var thisEffectsLayer;
     var thisEffect;
     var i;
     var j;
     if (proj)
     {
          if (proj.numItems != 0) // select the active item in the project window, make sure it's footage
          {
               projAi=proj.activeItem;
               if ( (projAi != null) && (projAi instanceof CompItem) && (projAi.selectedLayers.length == 1) )
               {
                    thisLayer=projAi.selectedLayers[0];
                    thisEffectsLayer=thisLayer("Effects");
                    if (thisEffectsLayer != null) // this layer might have effects...
                    {
                              if (thisEffectsLayer.numProperties == 1)
                         {
                              thisEffect=thisEffectsLayer(1); // Only one effect available, so it's safe to take the first

                              var fileName=Dialog1();
                              if (fileName != -1)
                              {
                                   var Fstr = new File(fileName);
                                   if (Fstr != null)
                                   {
                                        Fstr.open("w","TEXT","????");
                                        Fstr.writeln(_EFFNAME + "=" + thisEffect.name);

                                        for (i = 1; i <= thisEffect.numProperties; i++) // iterate through all properties
                                        {
                                             if (thisEffect.property(i).name != "")
                                             {
                                                  switch (thisEffect(i).propertyValueType)
                                                  {
                                                       case PropertyValueType.NO_VALUE: // property without a value
                                                       {
                                                            Fstr.writeln(";*** " + thisEffect.property(i).name + " ***");
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect.property(i).name);
                                                            break;
                                                       }
                                                       case PropertyValueType.OneD: // property with a single value
                                                       {
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect(i).name);
                                                            Fstr.writeln(thisEffect.property(i).value);
                                                            break;
                                                       }
                                                       case PropertyValueType.TwoD: // property with an array
                                                       {
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect.property(i).name);
                                                            str="[";
                                                            for (j = 1; j < thisEffect.property(i).value.length ; j++)
                                                            {
                                                                 str+=thisEffect.property(i).value[j-1] + ",";
                                                            }
                                                            str+=thisEffect.property(i).value[thisEffect.property(i).value.length-1] + "]";
                                                            Fstr.writeln(str);
                                                            break;
                                                       }
                                                       case PropertyValueType.TwoD_SPATIAL:
                                                       {
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect.property(i).name);
                                                            str="[";
                                                            for (j = 1; j < thisEffect.property(i).value.length ; j++)
                                                            {
                                                                 str+=thisEffect.property(i).value[j-1] + ",";
                                                            }
                                                            str+=thisEffect.property(i).value[thisEffect.property(i).value.length-1] + "]";
                                                            Fstr.writeln(str);
                                                            break;
                                                       }
                                                       case PropertyValueType.ThreeD:
                                                       {
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect.property(i).name);
                                                            str="[";
                                                            for (j = 1; j < thisEffect.property(i).value.length ; j++)
                                                            {
                                                                 str+=thisEffect.property(i).value[j-1] + ",";
                                                            }
                                                            str+=thisEffect.property(i).value[thisEffect.property(i).value.length-1] + "]";
                                                            Fstr.writeln(str);
                                                            break;
                                                       }
                                                       case PropertyValueType.ThreeD_SPATIAL:
                                                       {
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect.property(i).name);
                                                            str="[";
                                                            for (j = 1; j < thisEffect.property(i).value.length ; j++)
                                                            {
                                                                 str+=thisEffect.property(i).value[j-1] + ",";
                                                            }
                                                            str+=thisEffect.property(i).value[thisEffect.property(i).value.length-1] + "]";
                                                            Fstr.writeln(str);
                                                            break;
                                                       }
                                                       case PropertyValueType.COLOR: // property with a color
                                                       {
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect.property(i).name);
                                                            str="[";
                                                            for (j = 1; j < thisEffect.property(i).value.length ; j++)
                                                            {
                                                                 str+=thisEffect.property(i).value[j-1] + ",";
                                                            }
                                                            str+=thisEffect.property(i).value[thisEffect.property(i).value.length-1] + "]";
                                                            Fstr.writeln(str);
                                                            break;
                                                       }
                                                       case PropertyValueType.CUSTOM_VALUE: // property with a custom value
                                                       {
                                                            Fstr.writeln(_EFFSTR + i + "=" + thisEffect(i).name);
                                                            break;
                                                       }
                                                       default:;
                                                  }
                                             }
                                        }
                                        Fstr.close();
                                   }
                                   else 
                                   {
                                        alert("Sorry, there had been a problem writing the file");
                                   }
                              }
                         }
                         else
                         {
                              alert("Sorry, this layer should have (only) one effect applied");
                         }
                    }
                    else
                    {
                         alert("Sorry, this layer has no effect applied...");
                    }
               }
               else
               {
                    alert("select (only) one layer in a composition please...");
               }
          }
          else
          {
               alert("Can't process an empty project, please put some footage into it");
          }
     }
     else
     {
          alert("In order to use this script, Please create a project (with some footage)");
     }

//###############################################################################
//#
//# Asks user for filename for effect template
//# --> nothing
//# <-- Array or -1 (User pressed cancel)
//#
//###############################################################################
     function Dialog1()
     {
          var _ffx1;
          _ffx1 = filePutDialog("Please select a Filename for the Effect Template, or cancel to quit", "", "TEXT tfx");
          if (_ffx1 != null) return _ffx1;
          else return [-1];
     }
}
Last edited by w_m0zart on July 24th, 2005, 11:48 pm, edited 5 times in total.
Mylenium
Posts: 139
Joined: July 20th, 2005, 12:07 am

No offence, but I keep wondering what's the point of all this? Why not just work with presets and go thru such lengths just to apply a few effects?

Mylenium
[Pour Mylène, ange sur terre]
User avatar
Disciple
Posts: 137
Joined: June 5th, 2004, 8:05 am
Location: Los Angeles, CA
Contact:

Allow me to try to reply to this :
Scripting is about automation. One of the things it allows you to do is work on large batches (layers/Comps/Projects) in a repetitve manner, letting AE do the work, and making sure it does it in exactly the same way for each item.
Another thing is that some people on this forum work in groups, as in VFX houses, or production teams. Sometimes you need to make sure the same process is done in exactly the same way to keep consistency in a team.

These are two good reasons I can think of to try to automate even the most simple operation as adding an effect to a layer.
Of course if you are a freelance working at home, such a method would definitely be overkill.

I hope this makes things clearer
Alex
Mylenium
Posts: 139
Joined: July 20th, 2005, 12:07 am

Disciple wrote:Allow me to try to reply to this :
Scripting is about automation. One of the things it allows you to do is work on large batches (layers/Comps/Projects) in a repetitve manner, letting AE do the work, and making sure it does it in exactly the same way for each item.
Another thing is that some people on this forum work in groups, as in VFX houses, or production teams. Sometimes you need to make sure the same process is done in exactly the same way to keep consistency in a team.

These are two good reasons I can think of to try to automate even the most simple operation as adding an effect to a layer.
Of course if you are a freelance working at home, such a method would definitely be overkill.

I hope this makes things clearer
Alex
Not really. It still seems odd. You know, I can drag and drop presets on multi-selected layers and they include all effects, masks, keyframes, text properties, expressions and whatnot and even include variations by using some expressions. I really wonder if scripting would yield such massive benefits for working with effects even in an environment where 20 artist are working. I definitely see the advantages with other tasks such as setting items on the render queue, syncing timing etc. but not in this case.

Mylenium
[Pour Mylène, ange sur terre]
Post Reply