47 lines
1.4 KiB
React
47 lines
1.4 KiB
React
/*
|
|||
|
|
* sequential-offset.jsx
|
||
|
|
* Staggers the selected layers in time so each starts OFFSET_FRAMES after
|
||
|
|
* the previous one (a "domino" / cascade start), based on the first
|
||
|
|
* selected layer's start time.
|
||
|
|
*
|
||
|
|
* Usage: select layers in a comp, then File > Scripts > Run Script File...
|
||
|
|
* Edit OFFSET_FRAMES and ORDER below.
|
||
|
|
*/
|
||
|
|
|
||
|
|
(function sequentialOffset() {
|
||
|
|
var OFFSET_FRAMES = 2; // frames between each layer's start
|
||
|
|
var ORDER_BY_SELECTION = true; // true = order of selection; false = by current startTime
|
||
|
|
|
||
|
|
var comp = app.project.activeItem;
|
||
|
|
if (!(comp && comp instanceof CompItem)) {
|
||
|
|
alert("Open a composition and select two or more layers first.");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var sel = comp.selectedLayers;
|
||
|
|
if (sel.length < 2) {
|
||
|
|
alert("Select at least two layers.");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var frameDur = comp.frameDuration; // seconds per frame
|
||
|
|
var offsetSec = OFFSET_FRAMES * frameDur;
|
||
|
|
|
||
|
|
// Build the working order.
|
||
|
|
var layers = [];
|
||
|
|
for (var i = 0; i < sel.length; i++) layers.push(sel[i]);
|
||
|
|
if (!ORDER_BY_SELECTION) {
|
||
|
|
layers.sort(function (a, b) { return a.startTime - b.startTime; });
|
||
|
|
}
|
||
|
|
|
||
|
|
var base = layers[0].startTime;
|
||
|
|
|
||
|
|
app.beginUndoGroup("Sequential Offset");
|
||
|
|
try {
|
||
|
|
for (var j = 0; j < layers.length; j++) {
|
||
|
|
layers[j].startTime = base + (j * offsetSec);
|
||
|
|
}
|
||
|
|
} finally {
|
||
|
|
app.endUndoGroup();
|
||
|
|
}
|
||
|
|
})();
|