User Scripts

how to write user scripts for Batch Processor plugin

Batch Processor plugin allows you to run a custom script for each document in the queue. with the standard plugin package you can find several scripts that serve as a demonstration of how you can expand plugin functionality with Cinema 4D Python API!

Below is an example of a simple script, all the details of its writing are indicated in the comments.

Example User Script Output
import c4d
from c4d import gui
Batch processor User Script Basic Example
Please follow the code comments
To add User Scipt dialog make sure:
1. Your dialog is based on gui.Subdialog class
2. Class must have a name 'UserScriptDialog'
3. Class must have a class variable 'user_script_container' to store all data on it
4. Script must have 'main' function that will be executed by Batch Processor
5. 'user_script_container' from dialog will be used as input argument for 'main' function
6. Forbidden Functions: Perform any GUI functionality. (E.g. displaying messages, opening dialogs etc.)
class UserScriptDialog(gui.SubDialog):
A SubDialog to display the passed string, its used as example for the actual content of a Tab
INT_FIELD = 2001
# define user_script_container as dictionary
user_script_container = dict()
def CreateLayout(self):
# Add your dialog gui elements as descibed on Cinema 4D Python API
# Please use methods which is compatible with Cinema 4D R19+ Python API
bc = c4d.BaseContainer()
bc.SetBool(c4d.QUICKTAB_BAR, True)
bc.SetString(c4d.QUICKTAB_BARTITLE, 'Script Options')
self.AddCustomGui(1000, c4d.CUSTOMGUI_QUICKTAB, '', c4d.BFH_SCALEFIT, 0, 0, bc)
if self.GroupBegin(1001,flags=c4d.BFH_SCALEFIT | c4d.BFV_TOP,cols=2,rows=1,title='Script Options'):
self.GroupSpace(15, 6)
self.AddStaticText(1002, c4d.BFH_LEFT, name='My String Data')
self.AddEditText(self.STRING_FIELD, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, 0, 10)
self.AddStaticText(1003, c4d.BFH_LEFT, name='My Integer Data')
self.AddEditNumberArrows(self.INT_FIELD, c4d.BFH_LEFT | c4d.BFV_SCALEFIT, 80, 10)
return True
def Command(self,id,msg):
# Assign data to 'user_script_container' variable on any user gui interaction
if id in {self.STRING_FIELD,self.INT_FIELD}:
self.user_script_container['int'] = self.GetInt32(self.INT_FIELD)
self.user_script_container['string'] = self.GetString(self.STRING_FIELD)
return True
# On execution 'user_script_container' will be used as input argument for 'main' function.
# if User Scipt do not contains dialog, 'main' function will be executed without arguments.
def main(data):
Batch Processor adds some global variables to User Script:
doc - referenced to a processed document, type: c4d.BaseDocument
doc_index - referenced to an document index in Jobs Queue, type: int
docs_total - total number of documents in a Jobs Queue, type:int
op - Active Object of processed document, type: c4d.BaseObject
mat - Active Material of processed document, type: c4d.Material
tp - Particle System of processed document, type: c4d.modules.thinkingparticles.TP_MasterSystem
# All data that needed to be printed will be passed to plugin Log tab
print 'Processed Document Index {0} from {1}'.format(doc_index,docs_total)
print 'Document name: ', doc.GetDocumentName()
print 'Document path: ', doc.GetDocumentPath()
print 'Document Active Object is ', op
print 'My String data', data['string']
print 'My Integer data', data['int']
if 3 < doc_index < 7:
# If index of processed document have a number 4,5,6
# in this case User Scipt will return error
raise Exception('Error!')