Manual Render script

Here’s a MEL script to bypass Maya’s Batch Render, and Sequence Render – sometimes the Batch/Sequence render causes issues in certain situations. This script renders from the render preview screen and automatically saves the images, based on your render settings. Check out a video tutorial as well.

To use the script:

Copy and Paste the below code into the script editor. You can also save it in the script editor as a .mel file to use later. Alternatively, you can save it as a .mel file and drag it into the script editor.

// a manual render script with a timer and cancel button.
// Joel Benjamin, Jan 2015
// V3 May 2020
    // progress bar update

global string $gMainProgressBar;
int $maxPBar;
$maxPBar = 10000;

proc ManRenderUI() {    
    global string $startFrameField;
    global string $endFrameField;
    global string $camSelect;
    global string $renderDirectory;
    global string $fileNameField;    
    global string $renderDirectory;
    //check to see if window exists, kill it if so
    int $doesExist = `window -exists "ManualRender"`;
    if ($doesExist)
        deleteUI "ManualRender";


    // collect a list of cameras in the scene
    string $cams[]=` listCameras`;
    int $camsSize=`size $cams`;
    
    //collects some render settings
    int $currentStartFrame= `getAttr defaultRenderGlobals.startFrame`;
    int $currentEndFrame= `getAttr defaultRenderGlobals.endFrame`;
    string $currentFilename = `getAttr defaultRenderGlobals.imageFilePrefix`;
    
    
    /* to see other render settings.... 
        print `getAttr defaultRenderGlobals.multiCamNamingMode`;
        string $globals[] = `listAttr defaultRenderGlobals`;
        $globals = `sort $globals`;
        print $globals;
    */  
    
    
    // check to see if the script has been run already. If so, keep the previous settings
   // string $renderDirectory;
    if ($renderDirectory == ""){ //if nothing here, set the render directory based on the project
        string $renderDirectory = `workspace -q -rd`;
        $renderDirectory += "images/";
        string $dirResults[];
        $dirResults[0] = $renderDirectory;
        $renderDirectory = $dirResults[0];
        print "in the if\n";
        print ("render directory = " + $renderDirectory + "\n");
    }
   // $renderDirectory = $dirResults[0];
    print ("render directory = " + $renderDirectory + "\n");
    
    
    //filename checker
    string $renderFilename;
    if ($renderFilename == ""){ //if nothing here, set the file name based on render settings
        $renderFilename = $currentFilename;
            if ($renderFilename == ""){ //if nothing here, set the file name based on render settings
        $renderFilename = "renderFileName";
        }
    }
    
    //start and end frames
    
    int $theStartFrame;
    print $theStartFrame;
    if ($theStartFrame==0){
        $theStartFrame= `getAttr defaultRenderGlobals.startFrame`;
       
    }
    
    int $theEndFrame;
    if ($theEndFrame==0){
        $theEndFrame= `getAttr defaultRenderGlobals.endFrame`;
    }
    
    print ("The start frame = " + $theStartFrame);
    window -rtf 1 -t "Manual Render" "ManualRender";
    columnLayout -rowSpacing 10 "ManualColumn";
    text "\n\nHappy to help you render! Don't forget you can press ESC to cancel once it's going...\n\n";
        frameLayout -l "Start and End Frame" "startEndFrame";
        string $startFrameField = `intFieldGrp  -l  "Start Frame:" -v1 $theStartFrame "startField"`;
        string $endFrameField = `intFieldGrp  -l  "End Frame:" -v1 $theEndFrame "endField"`;
        setParent ..;
        
    frameLayout -l "Choose your Camera to Render From" "cameraFrame";
    // making a camera selector
    string $camSelect = `optionMenu -label "Render camera" -cc "print #1"`;
    // add cameras
    for ($c=0; $c<($camsSize); $c++){
            menuItem -label $cams[$c];
    }
    setParent ..;
    

    global string $fileFrame;
    
    string $fileFrame = `frameLayout -w 950 -l ("Render to: " + $renderDirectory) "myFileLocation"`;
    //choose file location

    //string $directText = `text -l ($renderDirectory)`;
    //print ("DirectText = " + $directText);    
    setParent ..;
    button -w 250 -l "Change Render Directory:" 
        -c "string $dirResults[] = `fileDialog2 -dir $renderDirectory -dialogStyle 2 -fm 3`; $renderDirectory = $dirResults[0]; frameLayout -e -l (\"Render file location = \" + $renderDirectory) $fileFrame;";
    
    //text -e -l ("Current " + $renderDirectory) $directText;
    string $fileNameField = `textFieldGrp -l "Filename" -tx $renderFilename`;
    text -l "An option to cancel the render will pop up after a couple of seconds. \nPress it to force cancel the render";
    setParent ..;
    
    rowLayout -nc 2;
    // buttons

    button -l "Render away" -c "infoCollect(); deleteUI \"ManualRender\" ";
    button -l "Cancel" -c "deleteUI \"ManualRender\"";
    

    
    showWindow "ManualRender";
    
}


proc infoCollect() {
    global string $startFrameField;
    global string $endFrameField;
    global string $camSelect;
    global string $renderDirectory;
    global string $fileNameField;
    global int $endFrame;
    
    int $startFrame = `intFieldGrp -q -v1 $startFrameField`;
    int $endFrame = `intFieldGrp -q -v1 $endFrameField`;
    
    string $camToRender = `optionMenu -q -v $camSelect`;
    string $fileName = `textFieldGrp -q -tx $fileNameField`;
    
    print ("Selected render directory = " + $renderDirectory);
    
    //do it
    renderGo($startFrame, $endFrame, $camToRender, $renderDirectory, $fileName);
}


proc renderGo(int $startFrame, int $endFrame, string $camToRender, string $renderDirectory, string $fileName){
    global string $gMainProgressBar;
    global int $x;
    global int $startFrame;
    global int $endFrame;
    global float $userPause;
    global int $buttonPressed;
    
    int $buttonPressed = 0;

    $userPause = 1.0;
    timer -s -n "WindowKiller";
    float $checkTime = `timer -lap -n "WindowKiller"`;
    $x=$startFrame;

    /* Here is the progressbar start */
    progressBar -e -bp -ii 1 -max $endFrame  -status "Rendering your ..uh.. renders... ..." $gMainProgressBar;

    //start the rendering
    for ($x=$startFrame; $x<=$endFrame+1; $x++){
    
        // update progress bar
        if(`progressBar -q -ic $gMainProgressBar`){
            break;
            warning "Breaking Progress Bar.";
        }
        progressBar -e -s 1 $gMainProgressBar; // increases the progress bar
        
        
    currentTime $x;
        print ("Rendering frame " + $x + "\n");
        refresh -f;

        //check the timer and cancel if user wishes
        float $checkTime = `timer -lap -n "WindowKiller"`;
        
        if ($checkTime > $userPause){
            timer -e -n "WindowKiller";
            timer -s -n "WindowKiller";
            int $doesExist = `window -exists "Checker"`;
            if (($doesExist)){
                //deleteUI "Checker";
                warning "Hit the cancel button to stop the render.";
            }else if ($buttonPressed==0){
                //showCancel;      //// this used to show the cancel button but it's not working anyway
            }
        }
           string $frameNumber="";
   
   //double-checking it wasn't canceled 
   if ($x<=$endFrame){
       // configure frame padding, up to 9999 frames at least
        if($x<10){
            $frameNumber = ("000" + $x);
        }else if ($x<100){
            $frameNumber = ("00" + $x);
        }else if ($x<1000){
            $frameNumber = ("0" + $x);
        } else {
            $frameNumber = $x;
        }
      
        
        // do the actual render
        print ("Rendering to " + $renderDirectory + "\n");
        renderWindowRenderCamera render renderView $camToRender;
    
        //saving the file
        $filename = ($renderDirectory + "/" + $fileName + "." + $frameNumber);
    //    $filename = ("U:/BetweenDoors/Maya/PartA/images/masterLayer/shot170/shot170." + $frameNumber + ".tif");
        renderWindowEditor -edit -writeImage $filename renderView;
            
            
        }
    }
    progressBar -e -ep $gMainProgressBar;
    //end the timer
    timer -e -n "WindowKiller";
    
    //kill cancel window if it's there
    int $doesExist = `window -exists "Checker"`;
    if (($doesExist)){
        deleteUI "Checker";
        refresh -f;
}
}

ManRenderUI();   
Share this on....
Facebooktwitterpinterestlinkedintumblrmail