batch render modification

TalbotGrad wrote on 2/6/2008, 11:28 AM
I would like to change the batch render .cs script so that it
names the file by the REGION TEXT NAME not the numeric name.

right now it takes the default project name or a new name for the first part then it adds the render format and ends with the second digit from the number of the region. (10) = (0), (11) - (1) etc.
I want to name the regions so that it shows up in the filename.
I'd prefer that it put the region name at the beginning of the file is possible.
My question is: what is the name for the region name? The script as it stands uses regionIndex.ToString(),....

Comments

jetdv wrote on 2/6/2008, 12:24 PM
Here's a great big discussion about this:

Here's the basics:

If you're rendering regions, you should see a line of code like this:

String regionFilename = String.Format("{0}[{1}]{2}",
filename,
regionIndex.ToString(),
renderItem.Extension);



At this point, you should get a filename which begins with a base filename plus the region number. Instead, you want to combine the PATH of the filename plus the NAME of the region which could be done like this:


String regionFilename = String.Format("{0}\{1}{2}",
Path.GetDirectory(filename),
region.Label,
renderItem.Extension);



The above will take the path of the base filename, add the necessary backslash, and then add the label of the region name. See if this works for you.

johnmeyer wrote on 2/6/2008, 1:02 PM
I did this years ago in my modification of this script posted over at VASST. I still kept the numbering, by added the region name. You can easily modify the script by deleting the lines for the numbering, and just keep the region name. However, the advantage of keeping the numbering is that is 100% ensures that you end up with unique file names. If you don't add the numbering, and you name two regions with the same name, you'll end up with a problem.

This script was modified to work with Vegas 7. Don't know how it works (or doesn't) with V8.

Here's the section of the script you'll want to modify:

                // Pad index number with leading zeros
regionIndex = ( regionIndex < 10 ) ? "0" + regionIndex : regionIndex;
regionFilename.Append(regionIndex);
regionFilename.Append("_");
regionFilename.Append(region.Label);


And here is the entire script:

/**
* Sample script that performs batch renders with GUI for selecting
* render templates.
*
* Creation Date: Mar. 25, 2003.
* Reivsed by JHM November 23, 2003

**/
import System;
import System.Collections;
import System.Text;
import System.IO;
import System.Drawing;
import System.Windows.Forms;
import Sony.Vegas;

// set this to true if you want to allow files to be overwritten
var overwriteExistingFiles = true;

try {

// here are some default variables for the GUI.
var defaultBasePath : String = Vegas.Project.FilePath;
if ((null == defaultBasePath) || (0 == defaultBasePath.length)) {
defaultBasePath = "E:\\JHM_";
} else {
var dir = Path.GetDirectoryName(defaultBasePath);
var fileName = Path.GetFileNameWithoutExtension(defaultBasePath);
defaultBasePath = dir + Path.DirectorySeparatorChar + fileName + "_";
}

var dlog = new BatchRenderDialog();
if (DialogResult.OK == dlog.ShowDialog()) {
var selectedTemplates = dlog.GetCheckedTemplates();
// inform the user of some special failure cases
if (0 == selectedTemplates.Count)
throw "no render templates selected";
var outputFilePath = dlog.fileNameBox.Text;
var renderMode = RenderMode.Project;
if (dlog.renderRegions.Checked) {
renderMode = RenderMode.Regions;
} else if (dlog.renderSelection.Checked) {
renderMode = RenderMode.Selection;
}
var renderSelection = dlog.renderSelection.Checked;
DoBatchRender(selectedTemplates, outputFilePath, renderMode);
}
} catch (e) {
if (!e.skipMessageBox)
MessageBox.Show(e);
}

enum RenderMode {
Project = 0,
Selection,
Regions,
}

function DoBatchRender(selectedTemplates : ArrayList,
basePath : String,
renderMode : RenderMode)
{
var outputDirectory = Path.GetDirectoryName(basePath);
var baseFileName = Path.GetFileName(basePath);

// make sure the output directory exists
if (!Directory.Exists(outputDirectory))
{
var msg = new StringBuilder("The output directory (");
msg.Append(outputDirectory);
msg.Append(") does not exist.\n");
msg.Append("Please specify directory and base file name using the Browse button.");
throw msg;
}

var zero : int = 0;
var zeroTime = new Timecode();
var renderStart, renderLength;

var templateFound = false;

// enumerate through each selected render template
var selections = new Enumerator(selectedTemplates);
while (!selections.atEnd()) {
var tag = selections.item();
var renderer = tag.renderer;
var renderTemplate = tag.template;

// construct the file name (most of it)
var filename = new StringBuilder(outputDirectory);
filename.Append(Path.DirectorySeparatorChar);
filename.Append(FixFileName(baseFileName));

if (renderMode == RenderMode.Regions) {
var regions = new Enumerator(Vegas.Project.Regions);
var regionIndex = zero;
while (!regions.atEnd()) {
var region = regions.item();
var regionFilename = new StringBuilder(filename);

// Pad index number with leading zeros
regionIndex = ( regionIndex < 10 ) ? "0" + regionIndex : regionIndex;
regionFilename.Append(regionIndex);
regionFilename.Append("_");
regionFilename.Append(region.Label);

// need to strip off the extension's leading "*"
regionFilename.Append(renderer.FileExtension.substring(1));

// Render the region
renderStart = region.Position;
renderLength = region.Length
DoRender(regionFilename.ToString(), renderer, renderTemplate, renderStart, renderLength);
regionIndex++;
regions.moveNext();
}
} else {
// need to strip off the extension's leading "*"
filename.Append(renderer.FileExtension.substring(1));

if (renderMode == RenderMode.Selection) {
renderStart = Vegas.SelectionStart;
renderLength = Vegas.SelectionLength;
} else {
renderStart = new Timecode();
renderLength = Vegas.Project.Length;
}

DoRender(filename.ToString(), renderer, renderTemplate, renderStart, renderLength);
}
selections.moveNext();
}
}

/**
* Perform the render. The Render method returns a member of the
* RenderStatus enumeration. If it is anything other than OK, exit
* the loops. This will throw an error message string if the render
* does not complete successfully.
**/

function DoRender(fileName, rndr, rndrTemplate, start, length) {
ValidateFileName(fileName);

// make sure the file does not already exist
if (!overwriteExistingFiles && File.Exists(fileName)) {
throw "File already exists: " + fileName;
}

// perform the render. The Render method returns
// a member of the RenderStatus enumeration. If
// it is anything other than OK, exit the loops.

var status = Vegas.Render(fileName, rndrTemplate, start, length);

// if the render completed successfully, just return
if (status == RenderStatus.Complete)
return;

// if the user canceled, throw out a special message that won't be
// displayed.
if (status == RenderStatus.Canceled) {
var cancelMsg = new String("User canceled");
cancelMsg.skipMessageBox = true;
throw cancelMsg;
}

// if the render failed, throw out a detailed error message.
var msg : StringBuilder = new StringBuilder("Render failed:\n");
msg.Append("\n file name: ");
msg.Append(fileName);
msg.Append("\n Renderer: ");
msg.Append(rndr.FileTypeName);
msg.Append("\n Template: ");
msg.Append(rndrTemplate.Name);
msg.Append("\n Start Time: ");
msg.Append(start.ToString());
msg.Append("\n Length: ");
msg.Append(length.ToString());
throw msg;
}

function FixFileName(name : System.String) : System.String
{
var replacementChar : System.Char = '-';
var colon : System.Char = ':';
name = name.Replace(Path.DirectorySeparatorChar, replacementChar);
name = name.Replace(colon, replacementChar);
// var illegalCharCount = Path.InvalidPathChars.Length;
var illegalCharCount = Path.GetInvalidPathChars().Length;
var i = 0;
while (i < illegalCharCount) {
// name = name.Replace(Path.InvalidPathChars[i], replacementChar);
name = name.Replace(Path.GetInvalidPathChars()[i], replacementChar);
i++;
}
return name;
}

function ValidateFileName(fileName : System.String) {
if (fileName.length > 260)
throw "file name too long: " + fileName;
// var illegalCharCount = Path.InvalidPathChars.Length;
var illegalCharCount = Path.GetInvalidPathChars().Length;
var i = 0;
while (i < illegalCharCount) {
// if (0 <= fileName.IndexOf(Path.InvalidPathChars[i])) {
if (0 <= fileName.IndexOf(Path.GetInvalidPathChars()[i])) {
throw "invalid file name: " + fileName;
}
i++;
}
}

class BatchRenderDialog extends Form {
var browseButton : BrowseButton;
var fileNameBox : TextBox;
var templateTree : TemplateTreeView;
var renderProject : RadioButton;
var renderRegions : RadioButton;
var renderSelection : RadioButton;

function BatchRenderDialog() {
this.Text = "Batch Render";
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.StartPosition = FormStartPosition.CenterScreen;
this.Width = 600;

var titleBarHeight = this.Height - this.ClientSize.Height;
var buttonWidth = 80;

fileNameBox = addTextControl("Base File Name", titleBarHeight + 6, 460, 10, defaultBasePath);

browseButton = new BrowseButton(fileNameBox);
browseButton.Left = fileNameBox.Right + 4;
browseButton.Top = fileNameBox.Top - 2;
browseButton.Width = buttonWidth;
browseButton.Height = browseButton.Font.Height + 12;
browseButton.Text = "Browse...";
Controls.Add(browseButton);

templateTree = new TemplateTreeView();
templateTree.Left = 10;
templateTree.Width = this.Width - 20;
templateTree.Top = browseButton.Bottom + 10;
templateTree.Height = 300;
templateTree.CheckBoxes = true;
Controls.Add(templateTree);
FillTemplateTree();

var buttonTop = templateTree.Bottom + 16;
var buttonsLeft = this.Width - (2*(buttonWidth+10));

renderProject = addRadioControl("Render Project", 6, buttonTop);
renderSelection = addRadioControl("Render Selection", renderProject.Right, buttonTop);
renderRegions = addRadioControl("Render Regions", renderSelection.Right, buttonTop);

// New code added here to correctly identify whether to render selection, project, or region
var dSelStart = Vegas.SelectionStart.ToMilliseconds();
var dSelEnd = Vegas.SelectionStart.ToMilliseconds() + Vegas.SelectionLength.ToMilliseconds();
var dCursor = Vegas.Cursor.ToMilliseconds();

if (dSelStart == dCursor || dSelEnd == dCursor) {
renderSelection.Checked = true;
} else {
renderProject.Checked = true;
}

var okButton = new Button();
okButton.Text = "OK";
okButton.Left = this.Width - (2*(buttonWidth+10));
okButton.Top = buttonTop;
okButton.Width = buttonWidth;
okButton.Height = okButton.Font.Height + 12;
okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
AcceptButton = okButton;
Controls.Add(okButton);

var cancelButton = new Button();
cancelButton.Text = "Cancel";
cancelButton.Left = this.Width - (1*(buttonWidth+10));
cancelButton.Top = buttonTop;
cancelButton.Height = cancelButton.Font.Height + 12;
cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
CancelButton = cancelButton;
Controls.Add(cancelButton);

this.Height = titleBarHeight + okButton.Bottom + 8;

}

function addTextControl(labelName, left, width, top, defaultValue) {
var label = new Label();
label.AutoSize = true;
label.Text = labelName + ":";
label.Left = left;
label.Top = top + 4;
Controls.Add(label);

var textbox = new TextBox();
textbox.Multiline = false;
textbox.Left = label.Right;
textbox.Top = top;
textbox.Width = width - (label.Width);
textbox.Text = defaultValue;
Controls.Add(textbox);

return textbox;
}

function addRadioControl(labelName, left, top) {
var label = new Label();
label.AutoSize = true;
label.Text = labelName;
label.Left = left;
label.Top = top + 4;
Controls.Add(label);

var radiobutton = new RadioButton();
radiobutton.Left = label.Right;
radiobutton.Width = 36;
radiobutton.Top = top;
Controls.Add(radiobutton);

return radiobutton;
}

function FillTemplateTree() {
var renderers = new Enumerator(Vegas.Renderers);
while (!renderers.atEnd()) {
var renderer = renderers.item();
var rendererNode = new TreeNode(renderer.FileTypeName);
rendererNode.Tag = renderer;
templateTree.Nodes.Add(rendererNode);
var templates = new Enumerator(renderer.Templates);
while (!templates.atEnd()) {
try {
var template = templates.item();
var templateNode = new TreeNode(template.Name);
var tag = new Object();
tag.renderer = renderer;
tag.template = template;
templateNode.Tag = tag;
rendererNode.Nodes.Add(templateNode);
templates.moveNext();
} catch (e) {
templates.moveNext();
}
}
renderers.moveNext();
}
}

function GetCheckedTemplates() {
var checkedTemplates = new ArrayList();
var rendererNodes = new Enumerator(templateTree.Nodes);
while (!rendererNodes.atEnd()) {
var rendererNode = rendererNodes.item();
GetCheckedTemplatesHelper(checkedTemplates, new Enumerator(rendererNode.Nodes));
rendererNodes.moveNext();
}
return checkedTemplates;
}

function GetCheckedTemplatesHelper(checkedTemplates, templateNodes) {
if (templateNodes.atEnd()) return;
var templateNode = templateNodes.item();

if (templateNode.Checked) {
checkedTemplates.Add(templateNode.Tag);
}
templateNodes.moveNext();
GetCheckedTemplatesHelper(checkedTemplates, templateNodes);
}
}

// Button subclass that shows a save file dialog when clicked
class BrowseButton extends Button {
var myResultBox = null;

function BrowseButton(resultBox) {
myResultBox = resultBox;
}

protected override function OnClick(e : EventArgs) {
var saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "All Files (*.*)|*.*";
saveFileDialog.CheckPathExists = true;
saveFileDialog.AddExtension = false;
if (null != myResultBox) {
var filename = myResultBox.Text;
var initialDir = Path.GetDirectoryName(filename);
if (Directory.Exists(initialDir)) {
saveFileDialog.InitialDirectory = initialDir;
}
saveFileDialog.DefaultExt = Path.GetExtension(filename);
saveFileDialog.FileName = Path.GetFileNameWithoutExtension(filename);
}
if (System.Windows.Forms.DialogResult.OK == saveFileDialog.ShowDialog()) {
if (null != myResultBox) {
myResultBox.Text = Path.GetFullPath(saveFileDialog.FileName);
}
}
}
}

class TemplateTreeView extends TreeView {

protected function OnAfterCheck(e : TreeViewEventArgs) {
super.OnAfterCheck(e);
if (e.Node.Checked) {
if (0 != e.Node.Nodes.Count) {
if ((e.Action == TreeViewAction.ByKeyboard) || (e.Action == TreeViewAction.ByMouse)) {
SetChildrenChecked(new Enumerator(e.Node.Nodes), true);
}
} else if (!e.Node.Parent.Checked) {
e.Node.Parent.Checked = true;
}
} else {
if (0 != e.Node.Nodes.Count) {
if ((e.Action == TreeViewAction.ByKeyboard) || (e.Action == TreeViewAction.ByMouse)) {
SetChildrenChecked(new Enumerator(e.Node.Nodes), false);
}
} else if (e.Node.Parent.Checked) {
if (!AnyChildrenChecked(new Enumerator(e.Node.Parent.Nodes))) {
e.Node.Parent.Checked = false;
}
}
}
}

protected function SetChildrenChecked(kidz, checked) {
if (kidz.atEnd()) return;
var kid = kidz.item();
if (kid.Checked != checked)
kid.Checked = checked;
kidz.moveNext();
SetChildrenChecked(kidz, checked);
}

protected function AnyChildrenChecked(kidz) : boolean {
if (kidz.atEnd()) return false;
var kid = kidz.item();
if (kid.Checked)
return true;
kidz.moveNext();
return AnyChildrenChecked(kidz);
}
}