Make it so that simply typing 'python -m manim' will embed you in a blank scene to work with

This commit is contained in:
Grant Sanderson 2021-01-02 22:03:00 -08:00
parent 7b3f4d08f5
commit 93fe783b80
4 changed files with 31 additions and 15 deletions

View file

@ -25,6 +25,7 @@ tex:
# executable: "xelatex -no-pdf"
# template_file: "ctex_template.tex"
# intermediate_filetype: "xdv"
universal_import_line: "from manimlib.imports import *"
style:
background_color: "#333333"
quality:

View file

@ -143,15 +143,17 @@ def get_manim_dir():
def get_module(file_name):
if file_name == "-":
module = types.ModuleType("input_scenes")
code = "from manimlib.imports import *\n\n" + sys.stdin.read()
try:
exec(code, module.__dict__)
return module
except Exception as e:
print(f"Failed to render scene: {str(e)}")
sys.exit(2)
# if file_name == "-":
# module = types.ModuleType("input_scenes")
# code = "from manimlib.imports import *\n\n" + sys.stdin.read()
# try:
# exec(code, module.__dict__)
# return module
# except Exception as e:
# print(f"Failed to render scene: {str(e)}")
# sys.exit(2)
if file_name is None:
return None
else:
module_name = file_name.replace(os.sep, ".").replace(".py", "")
spec = importlib.util.spec_from_file_location(module_name, file_name)
@ -187,7 +189,7 @@ def get_configuration(args):
"mirror_module_path": custom_defaults["directories"]["mirror_module_path"],
"output_directory": args.video_dir or custom_defaults["directories"]["output"],
"file_name": args.file_name,
"input_file_path": args.file,
"input_file_path": args.file or "",
"open_file_upon_completion": args.open,
"show_file_location_upon_completion": args.finder,
"quiet": args.quiet,

View file

@ -1,8 +1,10 @@
import inspect
import itertools as it
import sys
import logging
from manimlib.scene.scene import Scene
from manimlib.scene.scene import BlankScene
import manimlib.constants
@ -43,10 +45,6 @@ def prompt_user_for_choice(scene_classes):
def get_scenes_to_render(scene_classes, config):
if len(scene_classes) == 0:
print(manimlib.constants.NO_SCENE_MESSAGE)
return []
scene_kwargs = dict([
(key, config[key])
for key in [
@ -61,6 +59,10 @@ def get_scenes_to_render(scene_classes, config):
]
])
if len(config["scene_names"]) == 0:
# If no module or scenes were passed in, just run the blank scene
return [BlankScene(**scene_kwargs)]
if config["write_all"]:
return [sc(**scene_kwargs) for sc in scene_classes]
@ -74,7 +76,8 @@ def get_scenes_to_render(scene_classes, config):
found = True
break
if not found and (scene_name != ""):
print(
logging.log(
logging.ERROR,
manimlib.constants.SCENE_NOT_FOUND_MESSAGE.format(
scene_name
),
@ -87,6 +90,9 @@ def get_scenes_to_render(scene_classes, config):
def get_scene_classes_from_module(module):
if module is None:
# If no module was passed in, just run the blank scene
return []
if hasattr(module, "SCENES_IN_ORDER"):
return module.SCENES_IN_ORDER
else:

View file

@ -13,6 +13,7 @@ from manimlib.animation.animation import Animation
from manimlib.animation.transform import MoveToTarget
from manimlib.mobject.mobject import Point
from manimlib.camera.camera import Camera
from manimlib.config import get_custom_defaults
from manimlib.constants import *
from manimlib.container.container import Container
from manimlib.mobject.mobject import Mobject
@ -574,3 +575,9 @@ class Scene(Container):
class EndSceneEarlyException(Exception):
pass
class BlankScene(Scene):
def construct(self):
exec(get_custom_defaults()["universal_import_line"])
self.embed()