3b1b-manim/script_wrapper.py

122 lines
3.3 KiB
Python
Raw Normal View History

import sys
import getopt
import imp
import itertools as it
2015-06-10 22:00:35 -07:00
import inspect
2015-05-07 21:28:02 -07:00
from helpers import cammel_case_initials
2015-06-10 22:00:35 -07:00
from scene import Scene
2015-05-07 21:28:02 -07:00
from constants import *
2015-05-07 21:28:02 -07:00
HELP_MESSAGE = """
2015-06-10 22:00:35 -07:00
<script name> [<scene name or initials>] [<arg_string>]
2015-05-07 21:28:02 -07:00
"""
SCENE_NOT_FOUND_MESSAGE = """
No scene name or ititials \"%s\" and arg string \"%s\"
"""
MULTIPE_SCENES_FOUND_MESSAGE = """
Multiple Scene/arg pairs satisfying this
description, choose from the following list:
"""
CHOOSE_NUMBER_MESSAGE = "Choose a number from above: "
INVALID_NUMBER_MESSAGE = "Invalid number!"
def find_scene_class_and_args(scene_string, args_extension,
scene_classes):
possible_results = []
for SceneClass in scene_classes:
possible_names = map(str.lower, (
"",
SceneClass.__name__,
cammel_case_initials(SceneClass.__name__)
))
if scene_string.lower() in possible_names:
if len(SceneClass.args_list) == 0:
possible_results.append((SceneClass, ()))
for args in SceneClass.args_list:
assert(isinstance(args, tuple))
this_args_extension = SceneClass.args_to_string(*args)
if args_extension.lower() in ("", this_args_extension.lower()):
possible_results.append((SceneClass, args))
num_matches = len(possible_results)
if num_matches == 0:
print SCENE_NOT_FOUND_MESSAGE%(scene_string, args_extension)
sys.exit(0)
2015-05-07 21:28:02 -07:00
elif num_matches == 1:
index = 0
else:
2015-05-07 21:28:02 -07:00
print MULTIPE_SCENES_FOUND_MESSAGE
count = 0
2015-05-07 21:28:02 -07:00
for SceneClass, args in possible_results:
print "%d: %s%s"%(
count,
2015-05-07 21:28:02 -07:00
SceneClass.__name__,
SceneClass.args_to_string(*args),
)
count += 1
2015-05-07 21:28:02 -07:00
try:
index = input(CHOOSE_NUMBER_MESSAGE)
assert(type(index) == int)
assert(index in range(num_matches))
except:
print INVALID_NUMBER_MESSAGE
sys.exit(0)
return possible_results[index]
2015-06-10 22:00:35 -07:00
def command_line_create_scene(sys_argv, movie_prefix = ""):
scene_classes = [
pair[1]
for pair in inspect.getmembers(
sys.modules["__main__"],
lambda obj : inspect.isclass(obj) and \
issubclass(obj, Scene) and \
obj != Scene
)
]
try:
2015-06-10 22:00:35 -07:00
opts, args = getopt.getopt(sys_argv, "h:l:p")
except getopt.GetoptError as err:
print str(err)
sys.exit(2)
2015-06-10 22:00:35 -07:00
2015-05-07 21:28:02 -07:00
scene_string = ""
args_extension = ""
2015-05-07 21:28:02 -07:00
display_config = PRODUCTION_QUALITY_DISPLAY_CONFIG
preview = False
2015-06-10 22:00:35 -07:00
for opt, arg in opts:
if opt == '-h':
2015-05-07 21:28:02 -07:00
print HELP_MESSAGE
return
2015-05-07 21:28:02 -07:00
elif opt == '-l':
display_config = LOW_QUALITY_DISPLAY_CONFIG
elif opt == '-p':
display_config = LOW_QUALITY_DISPLAY_CONFIG
preview = True
2015-05-17 15:08:51 -07:00
if len(args) > 0:
scene_string = args[0]
if len(args) > 1:
args_extension = args[1]
2015-05-07 21:28:02 -07:00
SceneClass, args = find_scene_class_and_args(
scene_string,
args_extension,
2015-05-07 21:28:02 -07:00
scene_classes
)
2015-05-07 21:28:02 -07:00
name = SceneClass.__name__ + SceneClass.args_to_string(*args)
2015-05-12 14:51:21 -07:00
print "Constructing %s..."%name
2015-05-07 21:28:02 -07:00
scene = SceneClass(*args, display_config = display_config)
if preview:
scene.preview()
else:
scene.write_to_movie(movie_prefix + name)
2015-05-07 21:28:02 -07:00