Getting Started with Scripting
Pro features are only available with a Professional licence. To upgrade, visit cavalry.scenegroup.co.
Introduction
JavaScript in Cavalry provides access to layers and data within a Scene so that it's possible to write scripts that perform custom workflows. This includes creating Layers, setting Attributes, making Connections and much more.
The easiest way to get started is by taking a look at the examples in the Create > Demo Scenes > JavaScript
menu.
Here's an example script that will create a Text Shape and animate it. This script can be run in the JavaScript Editor by copy and pasting it into a tab and pressing the Run Script
button.
// Get the height of the composition (we're going to drop the text from the top)
let height = api.get(api.getActiveComp(), "resolution.y");
// The time difference between the first and last letters dropping
let timeOffset = 20;
// Make a text shape
let textShapeId = api.create("textShape", "Bouncy Text");
// Set some attributes on the text layer
// The attributes are set via a dictionary of (key, value) pairs
// This means many attributes can be set at once.
api.set(textShapeId, {"horizontalAlignment": 1,
"fontSize": 120,
"font.style": "Black",
"verticalAlignment": 1,
"material.materialColor": "#ff24e0",
"autoWidth": true,
"autoHeight": true});
// Get the bounding box of the text layer
let bbox = api.getBoundingBox(textShapeId, true);
// How far to we need to move the text shape to get it 'offscreen'
let distToEdge = bbox.y * -1 + height * .5;
// Get the start frame of the text shape (this could just be 0, but we're getting the in frame just to show off)
let startFrame = api.getInFrame(textShapeId);
// Set the end frame
let endFrame = startFrame+40;
// Create a Sub-Mesh layer which will power the 'per character' animation.
let subMeshId = api.create("subMesh", "Bounce In Animator");
// Set some keyframes, and set magic easing
api.keyframe(subMeshId, startFrame, {"shapePosition.y": distToEdge});
api.keyframe(subMeshId, endFrame, {"shapePosition.y": 0});
api.magicEasing(subMeshId, "shapePosition.y", startFrame, "BounceOut");
// Connect the Sub-Mesh to the Text layer's Deformers Attribute
api.connect(subMeshId, "id", textShapeId, "deformers");
// Parent the Sub-Mesh to the Text.
api.parent(subMeshId, textShapeId);
// Create a Stagger - this will be used to create the time offset
let staggerId = api.create("stagger", "Bounce In Stagger");
// Set the minimum/ maximum attributes on the Stagger
api.set(staggerId, {"minimum": -timeOffset, "maximum": 0});
// Flip the Graph on the Stagger so that the first letter bounces in first (by default the last letter would go first).
api.flipGraph(staggerId, "graph", "vertical");
// Connect the Stagger to the Sub-Mesh
api.connect(staggerId, "id", subMeshId, "shapeTimeOffset");
// Parent the Stagger to the Text
api.parent(staggerId, textShapeId);
// Start playback
api.play();
Installing UI Scripts
To install a UI Script, go to Help > Show Scripts Folder
then drag the Script file into this folder. Nested folders are allowed and will appear as sub-menus. Scripts saved to this folder will be immediately available from the Window > Scripts
menu without the need to restart Cavalry.
Cavalry Scenes
Every Cavalry Scene consists of several trees of layers. There is an Asset tree, which contains all of the Asset layers in a Scene, and beyond that, every Composition in Cavalry has its own tree of layers. JavaScript can be used to walk these trees to access (almost) every layer in Cavalry. Each tree can be made up of any number of layers, at any number of levels.
Accessing Layers and Attributes
To access Layers and Attributes in a Composition, their LayerId
and/or AttributeId
s are required.
Layer Ids
To get the layerId
, which can be used to access a Layer when scripting, right click on the Layer in the Attribute Editor, Scene Window or Viewport and choose Copy Layer Id
from the contextual menu.
Layer Type
The layerType
is part of the layerId
so can be accessed in the same way as above. layerType
is the part of the layerId
that comes before the #
. For example, if the layerId
is basicShape#1, then the layerType
is basicShape.
Attribute Ids
To get the attrId
which can be used to access an Attribute in scripting, right click on an Attribute in the Attribute Editor and choose Copy Scripting Path
from the contextual menu. For example:
- Create a Basic Shape.
- In the Attribute Editor, right click on the
Position
attribute. - Choose
Copy Scripting Path
from the contextual menu.
This will copy position
to the clipboard which can then be used as a argument within a script:
api.get("basicShape#1", "position");
Modules
JavaScript can be used in several places and Cavalry includes 4 modules providing access to data from the Scene. A number of convenience methods are also provided to make working with that data easier. Note that not all the JavaScript modules that Cavalry provides are available everywhere.
API Module
- This is only available in the JavaScript Editor.
- This provides editing access to the Scene and file system.
- The prefix for this module is
api
.
Context Module
- This is available in the JavaScript Layers.
- It provides access to methods related to the calculation of the JavaScript Utility's output.
- The prefix for this module is
ctx
.
Cavalry Module
- This is available in the JavaScript Layers and the JavaScript Editor.
- This provides utility methods and classes for working and creating data for use elsewhere.
- The prefix for this module is
cavalry
.
Deformer Module
- This is only available to the JavaScript Deformer.
- The prefix for this module is
def
.
Logging
Use console.<method>()
to write a message to Cavalry's JavaScript Console. The methods below can be used to print context specific messages which include different coloured accents for faster recognition.
console.log("This is a test."); // Typically used in testing (green).
console.info("Confirming this happened as expected."); // Confirm when something expected has happened (green).
console.warn("Just to let you know..."); // Warn a user when they've done something unexpected (yellow).
console.error("Something went wrong."); // Flag when something has gone wrong (red).
console.debug("I am a developer."); // Print a message to Terminal/Cmd Prompt.
Glossary
Many Member Functions can accept arguments as inputs and/or will return values of different types:
int
- An integer is a number without a decimal point. e.g.4
.number
- A number with decimal digits. e.g.4.153
. |string
- A String can contain alphanumeric characters and symbols and should be wrapped in double quotes. e.g."string"
.bool
- A boolean value can betrue
orfalse
.array
- An array is a list of items. e.g.["one", "two", "three"]
or[1, 2, 3]
.object
- An object is a collection of properties (a name (or key) and a value). e.g.{width:10, height:10}
.