version 1 render helper
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
/**
|
||||
* @description a script wiyh a UI that will do something really cool in AE
|
||||
* @name km-scriptname
|
||||
* @author Kyle Harter <kylenmotion@gmail.com>
|
||||
* @version 1.0.0
|
||||
*
|
||||
* @license This script is provided "as is," without warranty of any kind, expressed or implied. In
|
||||
* no event shall the author be held liable for any damages arising in any way from the use of this
|
||||
* script.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
(function(thisObj){
|
||||
|
||||
//@include "../library/km_helperFunctions.jsx";
|
||||
//@include "../library/km_scriptUI_functions.jsx";
|
||||
//@include "../library/km_utilityFunctions.jsx";
|
||||
//@include "../library/km_textAnimators.jsx";
|
||||
//@include "../library/km_systemFunctions.jsx";
|
||||
|
||||
var scriptName = "Script Name";
|
||||
|
||||
createUI(thisObj)
|
||||
|
||||
function createUI(thisObj){
|
||||
var win = thisObj instanceof Panel
|
||||
? thisObj
|
||||
: new Window("window", scriptName, undefined, {
|
||||
resizeable: true
|
||||
})
|
||||
|
||||
win.orientation = 'column';
|
||||
win.alignChildren = ["left", "top"];
|
||||
|
||||
var mainGroup = win.add("group", undefined, "Main Group");
|
||||
mainGroup.orientation = 'column';
|
||||
|
||||
var applyGroup = mainGroup.add("group", undefined, "Apply Group");
|
||||
applyGroup.orientation = 'row';
|
||||
var applyButton = applyGroup.add("button", undefined, "Apply");
|
||||
applyButton.preferredSize = [-1,30];
|
||||
applyButton.helpTip = "Click: Apply markers to selected layers.\rShift+Click: Apply markers to beginning of a comp."
|
||||
|
||||
|
||||
applyButton.onClick = function(){
|
||||
try {
|
||||
app.beginUndoGroup("What script does");
|
||||
|
||||
var km = kmFunction;
|
||||
var kmScript = kmScriptUI;
|
||||
var kmUtils = kmUtilityFunctions;
|
||||
var kmTextAnims = KMTextAnimatorsLib;
|
||||
|
||||
var comp = km.getActiveComp(app.project);
|
||||
var selLayers = km.getSelectedLayers(comp);
|
||||
var selProp = km.getSelectedProperties(selLayers)[0];
|
||||
|
||||
alert(getPropertyPath(selLayers[0],selProp))
|
||||
|
||||
} catch(error) {
|
||||
alert("An error occured on line: " + error.line + "\nError message: " + error.message);
|
||||
} finally {
|
||||
// this always runs no matter what
|
||||
app.endUndoGroup()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
function getPropertyPath(layer,selProp){
|
||||
var propDepth = selProp.propertyDepth;
|
||||
var props = ['(\'' + selProp.name + '\')'];
|
||||
var containing_layer = selProp.propertyGroup(selProp.propertyDepth);
|
||||
for(var i = 1; i<propDepth; i++){
|
||||
var prop = selProp.propertyGroup(i);
|
||||
props.unshift('(\'' + prop.name + '\')')
|
||||
}
|
||||
|
||||
var finalPropPathString = 'thisComp.layer(\''+layer.name+ '\')'+ props.join('');
|
||||
|
||||
return finalPropPathString
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
win.onResizing = win.onResize = function (){
|
||||
this.layout.resize();
|
||||
};
|
||||
|
||||
if(win instanceof Window){
|
||||
win.center();
|
||||
win.show();
|
||||
} else {
|
||||
win.layout.layout(true);
|
||||
win.layout.resize();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}(this))
|
||||
@@ -0,0 +1,115 @@
|
||||
/**
|
||||
* @description a headless script to do something cool in AE
|
||||
* @name km-scriptname
|
||||
* @author Kyle Harter <kylenmotion@gmail.com>
|
||||
* @version 1.0.0
|
||||
*
|
||||
* @license This script is provided "as is," without warranty of any kind, expressed or implied. In
|
||||
* no event shall the author be held liable for any damages arising in any way from the use of this
|
||||
* script.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
(function () {
|
||||
//@include "../library/km_helperFunctions.jsx";
|
||||
//@include "../library/km_scriptUI_functions.jsx";
|
||||
//@include "../library/km_utilityFunctions.jsx";
|
||||
//@include "../library/km_textAnimators.jsx";
|
||||
//@include "../library/km_systemFunctions.jsx";
|
||||
try {
|
||||
app.beginUndoGroup("what does this script do?");
|
||||
var km = kmFunction;
|
||||
var kmScript = kmScriptUI;
|
||||
var kmUtils = kmUtilityFunctions;
|
||||
var kmTextAnims = KMTextAnimatorsLib;
|
||||
var kmSystems = kmSystemsLib;
|
||||
|
||||
var activeComp = km.getActiveComp(app.project);
|
||||
if(!activeComp) return
|
||||
var selLayers = km.getSelectedLayers(activeComp);
|
||||
if(!selLayers) return
|
||||
var selProps = km.getSelectedProperties(selLayers);
|
||||
if(!selProps) return
|
||||
var posProps = getPositionProps(selProps);
|
||||
|
||||
var alertMessage = 'Keyframe Stats\r';
|
||||
|
||||
for(var m = 0; m<posProps.length; m++){
|
||||
var posProp = posProps[m];
|
||||
var easeInfo = [];
|
||||
for(var e = 0; e<posProp.propEases.length; e++){
|
||||
var ease = posProp.propEases[e];
|
||||
for(var field in ease){
|
||||
easeInfo.push(field + ': ' + ease[field])
|
||||
}
|
||||
}
|
||||
alertMessage +=
|
||||
'Property Name: ' + posProp.propName +
|
||||
'\rProperty Num Keys: ' + posProp.propKeys +
|
||||
'\rProperty Eases:\r' + easeInfo.join('\r') + '\r\r'
|
||||
}
|
||||
|
||||
alert(alertMessage)
|
||||
|
||||
} catch (error) {
|
||||
alert(
|
||||
"An error occured on line: " +
|
||||
error.line +
|
||||
"\nError message: " +
|
||||
error.message,
|
||||
);
|
||||
} finally {
|
||||
// this always runs no matter what
|
||||
app.endUndoGroup();
|
||||
}
|
||||
|
||||
|
||||
/* function separateKeysEase(props){
|
||||
|
||||
|
||||
|
||||
} */
|
||||
|
||||
|
||||
function getPositionProps(selProps) {
|
||||
var positionProps = [];
|
||||
var found = false;
|
||||
|
||||
for(var i = 0; i<selProps.length; i++){
|
||||
var prop = selProps[i];
|
||||
var propEases = [];
|
||||
if(prop.matchName == 'ADBE Position'){
|
||||
found = true;
|
||||
if(prop.numKeys > 0){
|
||||
for(var k = 1; k<=prop.numKeys; k++){
|
||||
var key = k;
|
||||
propEases.push({
|
||||
keyVal: prop.keyValue(key),
|
||||
keyTime: prop.keyTime(key),
|
||||
keyInInterpType: prop.keyInInterpolationType(key).speed,
|
||||
keyInSpatialTan: prop.keyInSpatialTangent(key).speed,
|
||||
keyInTempEase: prop.keyInTemporalEase(key).speed,
|
||||
keyOutInterpType: prop.keyOutInterpolationType(key).speed,
|
||||
keyOutSpatialTan: prop.keyOutSpatialTangent(key).speed,
|
||||
keyOutTempEase: prop.keyOutTemporalEase(key).speed,
|
||||
}
|
||||
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
positionProps.push({
|
||||
propName: prop.name,
|
||||
propKeys: prop.numKeys,
|
||||
propEases: propEases
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return positionProps;
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,659 @@
|
||||
/**
|
||||
* @description a script with a UI that will automate rendering process for multiple screens
|
||||
* @name show-render-helper
|
||||
* @author Kyle Harter <kylenmotion@gmail.com>
|
||||
*
|
||||
* @license This script is provided "as is," without warranty of any kind, expressed or implied. In
|
||||
* no event shall the author be held liable for any damages arising in any way from the use of this
|
||||
* script.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
(function(thisObj){
|
||||
|
||||
//@include "../library/km_helperFunctions.jsx";
|
||||
//@include "../library/km_scriptUI_functions.jsx";
|
||||
//@include "../library/km_utilityFunctions.jsx";
|
||||
//@include "../library/km_textAnimators.jsx";
|
||||
//@include "../library/km_systemFunctions.jsx";
|
||||
//@include "../library/OS.jsx";
|
||||
//@include "../library/json2.js"
|
||||
|
||||
var versionNumber = '0.1.0';
|
||||
var scriptName = "Show Render Helper" + ' v' + versionNumber;
|
||||
|
||||
createUI(thisObj)
|
||||
|
||||
function createUI(thisObj){
|
||||
|
||||
var win = thisObj instanceof Panel
|
||||
? thisObj
|
||||
: new Window("window", scriptName, undefined, {
|
||||
resizeable: true
|
||||
})
|
||||
|
||||
win.orientation = 'column';
|
||||
win.alignChildren = ["fill", "top"];
|
||||
|
||||
var tabMargins = [16,15,16,0];
|
||||
var panelMargins = 16;
|
||||
|
||||
var proj = null;
|
||||
// if(!proj) return
|
||||
if(app.project){
|
||||
proj = app.project;
|
||||
}
|
||||
var DEFAULT_SETTINGS = {
|
||||
settings:{
|
||||
defaultOutputPath: proj && proj.file ? proj.file.parent.fsName + '/renders' : null,
|
||||
qcExports: true
|
||||
}
|
||||
}
|
||||
|
||||
var savedSettings = readSettingsFile();
|
||||
if(savedSettings.settings){
|
||||
for(var key in savedSettings.settings){
|
||||
if(savedSettings.settings.hasOwnProperty(key) && typeof savedSettings.settings !== 'undefined'){
|
||||
DEFAULT_SETTINGS.settings[key] = savedSettings.settings[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var mainTabbedPanel = win.add("tabbedpanel", undefined, undefined);
|
||||
mainTabbedPanel.orientation = 'column';
|
||||
mainTabbedPanel.alignChildren = ['fill', 'fill']
|
||||
// mainTabbedPanel.size = [350,450];
|
||||
|
||||
var renderTab = mainTabbedPanel.add('tab', undefined, 'Render');
|
||||
renderTab.orientation = 'column';
|
||||
renderTab.alignChildren = ['fill', 'top'];
|
||||
renderTab.margins = tabMargins;
|
||||
renderTab.spacing = 10;
|
||||
|
||||
|
||||
// WALLSELECTPANEL
|
||||
// ===============
|
||||
var wallSelectPanel = renderTab.add("panel", undefined, undefined, {name: "wallSelectPanel"});
|
||||
wallSelectPanel.text = "Select Walls";
|
||||
wallSelectPanel.orientation = "column";
|
||||
wallSelectPanel.alignChildren = ["fill","center"];
|
||||
wallSelectPanel.margins = panelMargins;
|
||||
|
||||
// WALLSGROUP
|
||||
// ==========
|
||||
var wallsGroup = wallSelectPanel.add("group", undefined, {name: "wallsGroup"});
|
||||
wallsGroup.orientation = "row";
|
||||
wallsGroup.alignChildren = ["fill","fill"];
|
||||
wallsGroup.spacing = 20;
|
||||
|
||||
// TOPROW
|
||||
// ======
|
||||
var leftColumn = wallsGroup.add("group", undefined, {name: "leftColumn"});
|
||||
leftColumn.orientation = "column";
|
||||
leftColumn.alignChildren = ["left","center"];
|
||||
leftColumn.spacing = 20;
|
||||
|
||||
|
||||
|
||||
var wallA = leftColumn.add("checkbox", undefined, undefined, {name: "wallA"});
|
||||
wallA.text = "Notch LC Wall A";
|
||||
wallA.value = true;
|
||||
|
||||
var wallC = leftColumn.add("checkbox", undefined, undefined, {name: "wallC"});
|
||||
wallC.text = "Notch LC Wall C";
|
||||
wallC.value = true;
|
||||
|
||||
// BOTTOMROW
|
||||
// =========
|
||||
var rightColumn = wallsGroup.add("group", undefined, {name: "rightColumn"});
|
||||
rightColumn.orientation = "column";
|
||||
rightColumn.alignChildren = ["right","center"];
|
||||
rightColumn.spacing = 20;
|
||||
|
||||
var wallB = rightColumn.add("checkbox", undefined, undefined, {name: "wallB"});
|
||||
wallB.text = "Notch LC Wall B";
|
||||
wallB.value = true;
|
||||
|
||||
var wallD = rightColumn.add("checkbox", undefined, undefined, {name: "wallD"});
|
||||
wallD.text = "Notch LC Wall D";
|
||||
wallD.value = true;
|
||||
var allWalls = wallSelectPanel.add("checkbox", undefined, undefined, {name: "selectAllWalls"});
|
||||
allWalls.alignment = ['center', 'top'];
|
||||
allWalls.text = "Deselect All Walls";
|
||||
allWalls.value = true;
|
||||
|
||||
// ALPHAROW
|
||||
// ========
|
||||
var utilityPanel = renderTab.add("panel", undefined, 'Utility', {name: "utlityPanel"});
|
||||
utilityPanel.orientation = "row";
|
||||
utilityPanel.alignChildren = ["fill","center"];
|
||||
utilityPanel.margins = panelMargins;
|
||||
|
||||
var wallAlpha = utilityPanel.add("checkbox", undefined, undefined, {name: "wallAlpha"});
|
||||
wallAlpha.text = "Walls on Alpha";
|
||||
var qcExports = utilityPanel.add("checkbox", undefined, undefined);
|
||||
qcExports.text = "QC Exports in AE";
|
||||
qcExports.alignment = ['right', 'center']
|
||||
qcExports.value = DEFAULT_SETTINGS.settings.qcExports;
|
||||
|
||||
// OUTPUTPANEL
|
||||
// ===========
|
||||
var locationPanel = renderTab.add("panel", undefined, 'Output Location', {name: "locationPanel"});
|
||||
locationPanel.orientation = "column";
|
||||
locationPanel.alignChildren = ["fill","center"];
|
||||
locationPanel.spacing = 10;
|
||||
locationPanel.margins = panelMargins;
|
||||
|
||||
var locationButton = locationPanel.add("button", undefined, undefined, {name: "locationButton"});
|
||||
locationButton.text = "Choose Location...";
|
||||
var renderLocationText = locationPanel.add("statictext", undefined, undefined, {name: "renderLocationText"});
|
||||
renderLocationText.text = truncateFilePath(DEFAULT_SETTINGS.settings.defaultOutputPath);
|
||||
renderLocationText.characters = 25;
|
||||
|
||||
|
||||
var renderPanel = renderTab.add('panel', undefined,'');
|
||||
renderPanel.orientation = 'row';
|
||||
renderPanel.alignChildren = ['fill', 'top'];
|
||||
renderPanel.margins = panelMargins;
|
||||
var renderButton = renderPanel.add("button", undefined, 'Render', {name: "renderButton"});
|
||||
// var testButton = renderPanel.add("button", undefined, 'Test', {name: "renderButton"});
|
||||
|
||||
|
||||
// HELP TAB
|
||||
// ==========
|
||||
var helpTab = mainTabbedPanel.add('tab', undefined, 'Help')
|
||||
helpTab.orientation = 'column';
|
||||
helpTab.alignChildren = ['fill', 'top'];
|
||||
helpTabspacing = 10;
|
||||
helpTab.margins = tabMargins;
|
||||
var helpGroup = helpTab.add('group', undefined, 'Help Group');
|
||||
helpGroup.alignChildren = ['fill', 'top']
|
||||
helpGroup.orientation = 'column';
|
||||
var helpEditText = helpGroup.add('edittext', undefined, undefined,{multiline: true, readonly: true ,scrollable: true});
|
||||
helpEditText.text = 'Help instructions loading';
|
||||
helpEditText.preferredSize.height = 325;
|
||||
// helpEditText.alignment = ['fill', 'fill'];
|
||||
var omButtonGroup = helpTab.add('group', undefined, 'Output Modules Source Button Group');
|
||||
omButtonGroup.orientation = 'row';
|
||||
omButtonGroup.alignChildren = ['fill', 'top'];
|
||||
var omSourceButton = omButtonGroup.add('button', undefined, 'Get Output Modules');
|
||||
// omSourceButton.alignment = ['fill', 'fill'];
|
||||
|
||||
// Settings TAB
|
||||
// ==========
|
||||
var settingsTab = mainTabbedPanel.add('tab', undefined, 'Settings')
|
||||
settingsTab.orientation = 'column';
|
||||
settingsTab.alignChildren = ['fill', 'fill'];
|
||||
settingsTab.margins = tabMargins;
|
||||
|
||||
var settingsGroup = settingsTab.add("group", undefined, undefined, {name: "settingsGroup"});
|
||||
settingsGroup.orientation = "column";
|
||||
settingsGroup.alignChildren = ["fill","top"];
|
||||
settingsGroup.spacing = 15;
|
||||
|
||||
var settingsLocationPanel = settingsGroup.add('panel', undefined, undefined);
|
||||
settingsLocationPanel.orientation = 'column'
|
||||
settingsLocationPanel.alignChildren = ['fill', 'fill'];
|
||||
settingsLocationPanel.margins = panelMargins;
|
||||
|
||||
var settingsLocationButton = settingsLocationPanel.add("button", undefined, undefined, {name: "settingsLocationButton"});
|
||||
settingsLocationButton.text = "Choose Default Location...";
|
||||
var settingsLocationText = settingsLocationPanel.add("statictext", undefined, undefined, {name: "settingsLocationText"});
|
||||
settingsLocationText.text = truncateFilePath(DEFAULT_SETTINGS.settings.defaultOutputPath);
|
||||
|
||||
var settingsQCPanel = settingsGroup.add('panel', undefined, undefined);
|
||||
settingsQCPanel.orientation = 'column'
|
||||
settingsQCPanel.alignChildren = ['fill', 'fill'];
|
||||
settingsQCPanel.margins = panelMargins;
|
||||
|
||||
var settingsQCCB = settingsQCPanel.add("checkbox", undefined, undefined);
|
||||
settingsQCCB.text = "Import Exports for QC";
|
||||
settingsQCCB.value = DEFAULT_SETTINGS.settings.qcExports;
|
||||
|
||||
var saveSettingsPanel = settingsGroup.add('panel', undefined, undefined);
|
||||
saveSettingsPanel.orientation = 'row';
|
||||
// saveSettingsPanel.alignment = ['fill', 'bottom'];
|
||||
saveSettingsPanel.alignChildren = ['fill', 'fill'];
|
||||
saveSettingsPanel.margins = panelMargins;
|
||||
var saveSettingsButton = saveSettingsPanel.add("button", undefined, undefined, {name: "saveSettingsButton"});
|
||||
saveSettingsButton.text = "Save Settings";
|
||||
|
||||
|
||||
settingsLocationButton.addEventListener('mousedown', function(){
|
||||
var updatedDefaultLocation = Folder.selectDialog('Select a default output location');
|
||||
if(updatedDefaultLocation !== null){
|
||||
var truncatedDisplayText = truncateFilePath(updatedDefaultLocation.fsName);
|
||||
settingsLocationText.text = truncatedDisplayText;
|
||||
renderLocationText.text = truncatedDisplayText;
|
||||
DEFAULT_SETTINGS.settings.defaultOutputPath = updatedDefaultLocation.fsName
|
||||
}
|
||||
return
|
||||
})
|
||||
|
||||
function syncQCExports(newVal){
|
||||
settingsQCCB.value = newVal;
|
||||
qcExports.value = newVal;
|
||||
DEFAULT_SETTINGS.settings.qcExports = newVal;
|
||||
}
|
||||
|
||||
|
||||
settingsQCCB.onClick = function(){
|
||||
qcExports.value = settingsQCCB.value;
|
||||
DEFAULT_SETTINGS.settings.qcExports = settingsQCCB.value;
|
||||
}
|
||||
|
||||
saveSettingsButton.addEventListener('mousedown', function(){
|
||||
saveSettingsButton.text = 'Saving...'
|
||||
if(writeSettingsFile(DEFAULT_SETTINGS)){
|
||||
alert('Settings saved.')
|
||||
}
|
||||
saveSettingsButton.text = "Save Settings"
|
||||
})
|
||||
|
||||
|
||||
// Opens URL in browser for AOM file
|
||||
|
||||
omSourceButton.addEventListener('mousedown', function(){
|
||||
var userOS = OS;
|
||||
var launchCode = userOS.openUrl("https://drive.google.com/file/d/1Ur8bSu7RD8pjf2dVTLmkqlXyIz6ehtnU/view")
|
||||
})
|
||||
|
||||
helpEditText.text = setHelpMessage(scriptName, versionNumber);
|
||||
|
||||
|
||||
var topWalls = leftColumn.children;
|
||||
var bottomWalls = rightColumn.children;
|
||||
var wallsArray = [topWalls[0], topWalls[1], bottomWalls[0], bottomWalls[1]];
|
||||
|
||||
|
||||
allWalls.onClick = function(){
|
||||
|
||||
if(allWalls.value == false){
|
||||
allWalls.text = 'Select all walls'
|
||||
} else {
|
||||
allWalls.text = 'Deselect all walls'
|
||||
}
|
||||
for(var c = 0; c<wallsArray.length; c++){
|
||||
wallsArray[c].value = allWalls.value
|
||||
}
|
||||
}
|
||||
|
||||
var renderFolderPath = DEFAULT_SETTINGS.settings.defaultOutputPath;
|
||||
|
||||
function truncateFilePath(filePathString){
|
||||
var pathArray = filePathString.split('/');
|
||||
var startString = pathArray.slice(0,4).join('/');
|
||||
var endString = pathArray.slice(-1).join('/');
|
||||
var outputString = startString + '...../' + endString + '/'
|
||||
|
||||
return outputString
|
||||
}
|
||||
|
||||
locationButton.addEventListener('mousedown', function(){
|
||||
var renderFolder = Folder.selectDialog('Select render destination');
|
||||
if(renderFolder !== null){
|
||||
renderFolderPath = renderFolder.fsName;
|
||||
var outputString = truncateFilePath(renderFolderPath)
|
||||
renderLocationText.text = outputString
|
||||
}
|
||||
})
|
||||
|
||||
renderButton.onClick = function(){
|
||||
try {
|
||||
app.beginUndoGroup("Renders Comps");
|
||||
var km = kmFunction;
|
||||
var proj = km.getProj();
|
||||
if(!proj) return
|
||||
var renderComps = [];
|
||||
|
||||
if(proj.selection.length < 1){
|
||||
var activeComp = proj.activeItem;
|
||||
if(activeComp instanceof CompItem){
|
||||
renderComps.push(activeComp);
|
||||
}
|
||||
|
||||
} else {
|
||||
var selection = proj.selection;
|
||||
for(var i = 0; i < selection.length; i++){
|
||||
if(selection[i] instanceof CompItem){
|
||||
renderComps.push(selection[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(renderComps.length < 1){
|
||||
alert("No valid comps found to render.");
|
||||
return;
|
||||
}
|
||||
var nlOMs = {
|
||||
base: [
|
||||
'AAC26_A_NL',
|
||||
'AAC26_B_NL',
|
||||
'AAC26_C_NL',
|
||||
'AAC26_D_NL',
|
||||
],
|
||||
alpha: [
|
||||
'AAC26_A_NL-A',
|
||||
'AAC26_B_NL-A',
|
||||
'AAC26_C_NL-A',
|
||||
'AAC26_D_NL-A',
|
||||
]
|
||||
}
|
||||
|
||||
if(renderFolderPath == '') {
|
||||
alert('Whoops!\rYou don\'t have a folder destination selcted. Select one and try again.');
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
var templateArray = [];
|
||||
var objKey = wallAlpha.value ? 'alpha' : 'base';
|
||||
var dataSelect = nlOMs[objKey]
|
||||
for(var t = 0; t<wallsArray.length; t++){
|
||||
var wall = wallsArray[t];
|
||||
if(wall.value){
|
||||
templateArray.push(dataSelect[[t]]);
|
||||
}
|
||||
}
|
||||
if(templateArray.length < 1){
|
||||
alert('Whoops!\rYou don\'t have any walls selected. Select atleast 1 wall to export and try again.');
|
||||
return
|
||||
}
|
||||
|
||||
var renderQueue = proj.renderQueue;
|
||||
if(renderQueue.numItems > 0){
|
||||
while(renderQueue.numItems > 0){
|
||||
renderQueue.item(renderQueue.numItems).remove()
|
||||
}
|
||||
}
|
||||
|
||||
var renderPipeline = buildRenderPipeline(renderComps,renderQueue,templateArray,renderFolderPath);
|
||||
// RENDERRRRR //
|
||||
app.endUndoGroup()
|
||||
|
||||
|
||||
if(proj.bitsPerChannel < 16){
|
||||
proj.bitsPerChannel = 16;
|
||||
}
|
||||
renderQueue.render();
|
||||
|
||||
|
||||
var completedComps = [];
|
||||
var completedNames = [];
|
||||
var failedComps = [];
|
||||
|
||||
for(var r = 0; r<renderPipeline.rqItems.length; r++){
|
||||
var item = renderPipeline.rqItems[r];
|
||||
if(item.status === RQItemStatus.DONE){
|
||||
completedComps.push(renderPipeline.rqComps[r]);
|
||||
} else {
|
||||
failedComps.push({
|
||||
comps: renderPipeline.rqComps[r],
|
||||
status: item.status
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if(completedComps.length > 0){
|
||||
if(qcExports.value){
|
||||
var aeFolders = createImportFolders('zz_QC', completedComps, km.getOrCreateFolder);
|
||||
alert('Renders complete!\rYour exports will be imported into AE inside the folder named zz_QC for quality control');
|
||||
importExportsIntoAE(proj, aeFolders, renderFolderPath, renderPipeline.outputFileNames)
|
||||
} else {
|
||||
alert('Success!\rYour files were exported to:\r\r' + renderFolderPath)
|
||||
var outputFolder = new Folder(renderFolderPath);
|
||||
outputFolder.execute()
|
||||
}
|
||||
}
|
||||
/*
|
||||
switch(renderPipeline.rqItems[0].status){
|
||||
case RQItemStatus.DONE:
|
||||
if(qcExports.value){
|
||||
var aeFolders = createImportFolders('zz_QC', renderPipeline.rqComps, km.getOrCreateFolder);
|
||||
alert('Renders complete!\rYour exports will imported into AE inside of the folder named z_QC for quality control');
|
||||
importExportsIntoAE(proj, aeFolders, renderFolderPath, renderPipeline.outputFileNames)
|
||||
} else {
|
||||
alert('Success!\rYou\'re files were exported to:\r\r' + renderFolderPath)
|
||||
var outputFolder = new Folder(renderFolderPath);
|
||||
outputFolder.execute()
|
||||
}
|
||||
break;
|
||||
case RQItemStatus.USER_STOPPED:
|
||||
alert('Render cancelled.\rNo files were exported');
|
||||
break;
|
||||
case RQItemStatus.ERR_STOPPED:
|
||||
alert('Render stopped due to an error.\rCheck the render queue for details');
|
||||
break;
|
||||
default:
|
||||
alert('Render did not complete.\rStatus: ' + renderPipeline.rqItems[0].status);
|
||||
break;
|
||||
}
|
||||
*/
|
||||
|
||||
} catch(error) {
|
||||
alert("An error occured on line: " + error.line + "\nError message: " + error.message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// HELPER FUNCTIONS
|
||||
|
||||
|
||||
function importExportsIntoAE(proj, folders, location, names){
|
||||
var exports = getExports(location, names);
|
||||
var compFolders = folders.compFolders;
|
||||
for(var e = 0; e<exports.length; e++){
|
||||
var renders = exports[e];
|
||||
var importedFootage = proj.importFile(new ImportOptions(File(renders)));
|
||||
for(var f = 0; f< compFolders.length; f++){
|
||||
var folder = compFolders[f];
|
||||
var parent;
|
||||
if(importedFootage.name.indexOf(folder.name) !== -1){
|
||||
importedFootage.parentFolder = folder;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
folders.parentFolder.selected = true
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
function createImportFolders(parentFolderName, exportedComps, getFolders){
|
||||
var parentFolder = getFolders(app.project,parentFolderName);
|
||||
var compFolders = [];
|
||||
for(var c = 0; c<exportedComps.length; c++){
|
||||
var exportedComp = exportedComps[c];
|
||||
var compFolder = getFolders(app.project, exportedComp.name);
|
||||
compFolder.parentFolder = parentFolder;
|
||||
compFolders.push(compFolder)
|
||||
}
|
||||
return {
|
||||
parentFolder: parentFolder,
|
||||
compFolders: compFolders
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getExports(location, names){
|
||||
var exports = [];
|
||||
var outputFolder = new Folder(location)
|
||||
var files = outputFolder.getFiles('*.mov');
|
||||
for(var f = 0; f<files.length; f++){
|
||||
var file = files[f];
|
||||
for(var d = 0; d<names.length; d++){
|
||||
var dataName = names[d];
|
||||
if(file.name.replace(/%20/g, ' ') === dataName){
|
||||
exports.push(file.fsName)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return exports
|
||||
|
||||
}
|
||||
|
||||
|
||||
function buildRenderPipeline(comps,rq,wallTemplates,folderOutput){
|
||||
var outputFileNames = [];
|
||||
var rqComps = [];
|
||||
var rqItems = [];
|
||||
for(var c = 0; c<comps.length; c++){
|
||||
var comp = comps[c];
|
||||
var rqComp = rq.items.add(comp);
|
||||
rqItems.push(rqComp)
|
||||
rqComps.push(rqComp.comp)
|
||||
var rqCompOMCollect = rqComp.outputModules;
|
||||
while(rqCompOMCollect.length < wallTemplates.length){
|
||||
rqCompOMCollect.add()
|
||||
}
|
||||
for(var i = 0; i<rqCompOMCollect.length; i++){
|
||||
var om = rqComp.outputModule(i+1);
|
||||
var templateName = wallTemplates[i];
|
||||
var templateNameWall = templateName.split('_').slice(1,2);
|
||||
om.applyTemplate(templateName);
|
||||
|
||||
|
||||
var file_name = File.decode(om.file.name);
|
||||
var folder_path = Folder.decode(folderOutput);
|
||||
var fileNameSplit = file_name.split('.');
|
||||
var fileNameBaseWall = fileNameSplit[0] + '_'+ templateNameWall.toString();
|
||||
var fileNameExtension = fileNameSplit.slice(-1);
|
||||
var outputFileName = fileNameBaseWall.toString() + '.' + fileNameExtension.toString();
|
||||
outputFileNames.push(outputFileName)
|
||||
// var token = '[dateYear][dateMonth][dateDay]';
|
||||
var new_data = {
|
||||
"Output File Info": {
|
||||
"Base Path": folder_path,
|
||||
"File Name": outputFileName
|
||||
}
|
||||
}
|
||||
|
||||
om.setSettings(new_data)
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
rqItems: rqItems,
|
||||
rqComps : rqComps,
|
||||
outputFileNames: outputFileNames
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getSettingsFolder(){
|
||||
var folder = new Folder(Folder.userData.fsName + '/km-tools/sparks-render-helper');
|
||||
|
||||
if(!folder.exists){
|
||||
folder.create()
|
||||
}
|
||||
|
||||
return folder
|
||||
}
|
||||
|
||||
function getSettingsFile(){
|
||||
var settingsFile = new File(getSettingsFolder().fsName + '/settings.json')
|
||||
return settingsFile
|
||||
}
|
||||
|
||||
function readSettingsFile(){
|
||||
var file = getSettingsFile();
|
||||
if(!file.exists){
|
||||
return {
|
||||
'settings': {}
|
||||
}
|
||||
}
|
||||
|
||||
file.open('r');
|
||||
var data = file.read();
|
||||
file.close();
|
||||
|
||||
try{
|
||||
return JSON.parse(data)
|
||||
} catch (e) {
|
||||
return {
|
||||
settings: []
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function writeSettingsFile(data){
|
||||
var file = getSettingsFile();
|
||||
|
||||
var json = JSON.stringify(data, null, 4);
|
||||
|
||||
if(!file.open('w')){
|
||||
alert('Could not open settings file:\n' + file.fsName)
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
// file.open('w');
|
||||
file.write(json);
|
||||
file.close()
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setHelpMessage(scriptName, versionNumber){
|
||||
var lines = [
|
||||
'ABOUT ' + scriptName.toUpperCase(),
|
||||
'',
|
||||
scriptName + ' automates the rendering process for all outputs that make up the pixel map for Amazon Accelerate 2026.',
|
||||
'',
|
||||
'------------------------',
|
||||
'HOW TO USE ' + scriptName.toUpperCase() + ':',
|
||||
'',
|
||||
'STEP 01: Import Output Modules from GDrive',
|
||||
'Import the preset output modules into your Render Queue. The output modules are stored on the team\'s GDrive in the form of a \'.aom\' file. This step is essential as the script\'s success is based on the output module names.',
|
||||
'',
|
||||
'-----------',
|
||||
'STEP 02: SELECT YOUR RENDER COMP',
|
||||
'Select or open the comp that will be rendered into the various wall deliverables.',
|
||||
'',
|
||||
'-----------',
|
||||
'STEP 03: SELECT WALLS, ALPHA ON/OFF, AND OUTPUT LOCATION',
|
||||
'Select the walls you\'d like to render. There is a checkbox to select all walls or deselect all walls. Select an option for with alpha channel or no alpha channel. Finally, select your desired render output location.',
|
||||
'',
|
||||
'-----------',
|
||||
'STEP 04: RENDER',
|
||||
'Once all of your walls, details, and output location are set, then click Render and your selected comp will be placed in the render queue with the correlating wall selection output modules. The chosen output location will also be updated in the render queue. Rendering will also begin at this time. Once rendering is complete, you will be notified with a success prompt and the location of your renders. Upon exiting the prompt, your render location folder window on your desktop will be revealed.',
|
||||
'',
|
||||
'-----------',
|
||||
'GOOD TO KNOW',
|
||||
'- This script assumes you have named your files correctly according to the media guide provided by Sparks. There will be a correlating wall identifier (A, B, C, or D) added to the end of your file name before the extension.',
|
||||
'- In the Settings tab, you may update your default output location for your renders. By default, the render location directs to \'[projectFolder]/renders/[output files].\'',
|
||||
'- Upon updating any settings in the Settings tab, be sure to click \'Save Settings\' to ensure your settings are updated.',
|
||||
'-----------',
|
||||
'Script: ' + scriptName.toUpperCase(),
|
||||
'Version: ' + versionNumber,
|
||||
'Contact: Kyle Harter kylenmotion@gmail.com'
|
||||
];
|
||||
|
||||
return lines.join('\r');
|
||||
}
|
||||
|
||||
win.onResizing = win.onResize = function (){
|
||||
this.layout.resize();
|
||||
};
|
||||
|
||||
if(win instanceof Window){
|
||||
win.center();
|
||||
win.show();
|
||||
} else {
|
||||
win.layout.layout(true);
|
||||
win.layout.resize();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}(this))
|
||||
Reference in New Issue
Block a user