Script to test import operators, so a single command can execute an operator on all...
[blender.git] / release / scripts / templates / background_job.py
1 # This script is an example of how you can run blender from the command line (in background mode with no interface)
2 # to automate tasks, in this example it creates a text object, camera and light, then renders and/or saves it.
3 # This example also shows how you can parse command line options to python scripts.
4 #
5 # Example usage for this test.
6 #  blender --background --factory-startup --python $HOME/background_job.py -- --text="Hello World" --render="/tmp/hello" --save="/tmp/hello.blend"
7 #
8 # Notice:
9 # '--factory-startup' is used to avoid the user default settings from interfearing with automated scene generation.
10 # '--' causes blender to ignore all following arguments so python can use them.
11 #
12 # See blender --help for details.
13
14 import bpy
15
16
17 def example_function(body_text, save_path, render_path):
18
19     scene = bpy.context.scene
20
21     # Clear existing objects.
22     scene.camera = None
23     for obj in scene.objects:
24         scene.objects.unlink(obj)
25
26     txt_data = bpy.data.curves.new(name="MyText", type='FONT')
27
28     # Text Object
29     txt_ob = bpy.data.objects.new(name="MyText", object_data=txt_data)
30     scene.objects.link(txt_ob)            # add the data to the scene as an object
31     txt_data.body = body_text                     # set the body text to the command line arg given
32     txt_data.align = 'CENTER'                    # center text
33
34     # Camera
35     cam_data = bpy.data.cameras.new("MyCam")        # create new camera data
36     cam_ob = bpy.data.objects.new(name="MyCam", object_data=cam_data)
37     scene.objects.link(cam_ob)            # add the camera data to the scene (creating a new object)
38     scene.camera = cam_ob                    # set the active camera
39     cam_ob.location = 0.0, 0.0, 10.0
40
41     # Lamp
42     lamp_data = bpy.data.lamps.new("MyLamp", 'POINT')
43     lamp_ob = bpy.data.objects.new(name="MyCam", object_data=lamp_data)
44     scene.objects.link(lamp_ob)
45     lamp_ob.location = 2.0, 2.0, 5.0
46
47     if save_path:
48         try:
49             f = open(save_path, 'w')
50             f.close()
51             ok = True
52         except:
53             print("Cannot save to path %r" % save_path)
54
55             import traceback
56             traceback.print_exc()
57
58         if ok:
59             bpy.ops.wm.save_as_mainfile(filepath=save_path)
60
61     if render_path:
62         render = scene.render
63         render.use_file_extension = True
64         render.filepath = render_path
65         bpy.ops.render.render(write_still=True)
66
67
68 import sys        # to get command line args
69 import optparse    # to parse options for us and print a nice help message
70
71
72 def main():
73
74     # get the args passed to blender after "--", all of which are ignored by blender specifically
75     # so python may receive its own arguments
76     argv = sys.argv
77
78     if "--" not in argv:
79         argv = []  # as if no args are passed
80     else:
81         argv = argv[argv.index("--") + 1:]  # get all args after "--"
82
83     # When --help or no args are given, print this help
84     usage_text = "Run blender in background mode with this script:"
85     usage_text += "  blender --background --python " + __file__ + " -- [options]"
86
87     parser = optparse.OptionParser(usage=usage_text)
88
89     # Example background utility, add some text and renders or saves it (with options)
90     # Possible types are: string, int, long, choice, float and complex.
91     parser.add_option("-t", "--text", dest="body_text", help="This text will be used to render an image", type="string")
92
93     parser.add_option("-s", "--save", dest="save_path", help="Save the generated file to the specified path", metavar='FILE')
94     parser.add_option("-r", "--render", dest="render_path", help="Render an image to the specified path", metavar='FILE')
95
96     options, args = parser.parse_args(argv)  # In this example we wont use the args
97
98     if not argv:
99         parser.print_help()
100         return
101
102     if not options.body_text:
103         print("Error: --text=\"some string\" argument not given, aborting.")
104         parser.print_help()
105         return
106
107     # Run the example function
108     example_function(options.body_text, options.save_path, options.render_path)
109
110     print("batch job finished, exiting")
111
112
113 if __name__ == "__main__":
114     main()