123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- # This script is an example of how you can run blender from the command line
- # (in background mode with no interface) to automate tasks, in this example it
- # creates a text object, camera and light, then renders and/or saves it.
- # This example also shows how you can parse command line options to scripts.
- #
- # Example usage for this test.
- # blender --background --factory-startup --python $HOME/background_job.py -- \
- # --text="Hello World" \
- # --render="/tmp/hello" \
- # --save="/tmp/hello.blend"
- #
- # Notice:
- # '--factory-startup' is used to avoid the user default settings from
- # interfering with automated scene generation.
- #
- # '--' causes blender to ignore all following arguments so python can use them.
- #
- # See blender --help for details.
- import bpy
- def example_function(text, save_path, render_path):
- # Clear existing objects.
- bpy.ops.wm.read_factory_settings(use_empty=True)
- scene = bpy.context.scene
- txt_data = bpy.data.curves.new(name="MyText", type='FONT')
- # Text Object
- txt_ob = bpy.data.objects.new(name="MyText", object_data=txt_data)
- scene.collection.objects.link(txt_ob) # add the data to the scene as an object
- txt_data.body = text # the body text to the command line arg given
- txt_data.align_x = 'CENTER' # center text
- # Camera
- cam_data = bpy.data.cameras.new("MyCam")
- cam_ob = bpy.data.objects.new(name="MyCam", object_data=cam_data)
- scene.collection.objects.link(cam_ob) # instance the camera object in the scene
- scene.camera = cam_ob # set the active camera
- cam_ob.location = 0.0, 0.0, 10.0
- # Light
- light_data = bpy.data.lights.new("MyLight", 'POINT')
- light_ob = bpy.data.objects.new(name="MyLight", object_data=light_data)
- scene.collection.objects.link(light_ob)
- light_ob.location = 2.0, 2.0, 5.0
- bpy.context.view_layer.update()
- if save_path:
- bpy.ops.wm.save_as_mainfile(filepath=save_path)
- if render_path:
- render = scene.render
- render.use_file_extension = True
- render.filepath = render_path
- bpy.ops.render.render(write_still=True)
- def main():
- import sys # to get command line args
- import argparse # to parse options for us and print a nice help message
- # get the args passed to blender after "--", all of which are ignored by
- # blender so scripts may receive their own arguments
- argv = sys.argv
- if "--" not in argv:
- argv = [] # as if no args are passed
- else:
- argv = argv[argv.index("--") + 1:] # get all args after "--"
- # When --help or no args are given, print this help
- usage_text = (
- "Run blender in background mode with this script:"
- " blender --background --python " + __file__ + " -- [options]"
- )
- parser = argparse.ArgumentParser(description=usage_text)
- # Example utility, add some text and renders or saves it (with options)
- # Possible types are: string, int, long, choice, float and complex.
- parser.add_argument(
- "-t", "--text", dest="text", type=str, required=True,
- help="This text will be used to render an image",
- )
- parser.add_argument(
- "-s", "--save", dest="save_path", metavar='FILE',
- help="Save the generated file to the specified path",
- )
- parser.add_argument(
- "-r", "--render", dest="render_path", metavar='FILE',
- help="Render an image to the specified path",
- )
- args = parser.parse_args(argv) # In this example we won't use the args
- if not argv:
- parser.print_help()
- return
- if not args.text:
- print("Error: --text=\"some string\" argument not given, aborting.")
- parser.print_help()
- return
- # Run the example function
- example_function(args.text, args.save_path, args.render_path)
- print("batch job finished, exiting")
- if __name__ == "__main__":
- main()
|