3b1b-manim/manimlib/utils/init_config.py

155 lines
5.2 KiB
Python
Raw Normal View History

2022-04-02 22:00:02 +08:00
from __future__ import annotations
2022-04-12 19:19:59 +08:00
import importlib
import inspect
2021-02-07 17:45:18 +08:00
import os
2022-01-28 00:16:19 +08:00
import yaml
from rich import box
2022-04-12 19:19:59 +08:00
from rich.console import Console
from rich.prompt import Confirm
from rich.prompt import Prompt
from rich.rule import Rule
2022-01-28 00:16:19 +08:00
from rich.table import Table
2022-04-12 19:19:59 +08:00
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Any
2022-01-28 00:16:19 +08:00
def get_manim_dir() -> str:
2022-01-28 00:16:19 +08:00
manimlib_module = importlib.import_module("manimlib")
manimlib_dir = os.path.dirname(inspect.getabsfile(manimlib_module))
return os.path.abspath(os.path.join(manimlib_dir, ".."))
def remove_empty_value(dictionary: dict[str, Any]) -> None:
2022-01-28 00:16:19 +08:00
for key in list(dictionary.keys()):
if dictionary[key] == "":
dictionary.pop(key)
elif isinstance(dictionary[key], dict):
remove_empty_value(dictionary[key])
2021-02-07 17:45:18 +08:00
def init_customization() -> None:
2021-02-07 17:45:18 +08:00
configuration = {
"directories": {
"mirror_module_path": False,
"output": "",
"raster_images": "",
"vector_images": "",
"sounds": "",
"temporary_storage": "",
},
"universal_import_line": "from manimlib import *",
"style": {
2022-05-28 23:18:56 +08:00
"tex_template": "",
"font": "Consolas",
2021-02-07 17:45:18 +08:00
"background_color": "",
},
"window_position": "UR",
2021-06-26 17:45:21 +08:00
"window_monitor": 0,
2022-01-28 00:16:19 +08:00
"full_screen": False,
2021-02-07 17:45:18 +08:00
"break_into_partial_movies": False,
"camera_resolutions": {
"low": "854x480",
"medium": "1280x720",
"high": "1920x1080",
"4k": "3840x2160",
"default_resolution": "",
},
2022-05-14 17:47:31 -07:00
"fps": 30,
2021-02-07 17:45:18 +08:00
}
2022-01-28 00:16:19 +08:00
console = Console()
console.print(Rule("[bold]Configuration Guide[/bold]"))
# print("Initialize configuration")
try:
scope = Prompt.ask(
" Select the scope of the configuration",
2022-01-28 00:16:19 +08:00
choices=["global", "local"],
default="local"
)
2021-02-07 17:45:18 +08:00
2022-01-28 00:16:19 +08:00
console.print("[bold]Directories:[/bold]")
dir_config = configuration["directories"]
dir_config["output"] = Prompt.ask(
" Where should manim [bold]output[/bold] video and image files place [prompt.default](optional, default is none)",
default="",
show_default=False
)
dir_config["raster_images"] = Prompt.ask(
2022-12-17 22:14:43 -08:00
" Which folder should manim find [bold]raster images[/bold] (.jpg .png .gif) in " + \
2022-01-28 00:16:19 +08:00
"[prompt.default](optional, default is none)",
default="",
show_default=False
)
dir_config["vector_images"] = Prompt.ask(
2022-12-17 22:14:43 -08:00
" Which folder should manim find [bold]vector images[/bold] (.svg .xdv) in " + \
2022-01-28 00:16:19 +08:00
"[prompt.default](optional, default is none)",
default="",
show_default=False
)
dir_config["sounds"] = Prompt.ask(
2022-12-17 22:14:43 -08:00
" Which folder should manim find [bold]sound files[/bold] (.mp3 .wav) in " + \
2022-01-28 00:16:19 +08:00
"[prompt.default](optional, default is none)",
default="",
show_default=False
)
dir_config["temporary_storage"] = Prompt.ask(
2022-12-17 22:14:43 -08:00
" Which folder should manim storage [bold]temporary files[/bold] " + \
2022-01-28 00:16:19 +08:00
"[prompt.default](recommended, use system temporary folder by default)",
default="",
show_default=False
)
2021-02-07 17:45:18 +08:00
2022-01-28 00:16:19 +08:00
console.print("[bold]Styles:[/bold]")
2022-05-22 23:47:45 +08:00
style_config = configuration["style"]
2022-08-22 21:52:48 +08:00
tex_template = Prompt.ask(
" Select a TeX template to compile a LaTeX source file",
default="default"
2022-05-22 23:47:45 +08:00
)
2022-08-22 21:52:48 +08:00
style_config["tex_template"] = tex_template
2022-05-22 23:47:45 +08:00
style_config["background_color"] = Prompt.ask(
2022-01-28 00:16:19 +08:00
" Which [bold]background color[/bold] do you want [italic](hex code)",
default="#333333"
)
2021-02-07 17:45:18 +08:00
2022-01-28 00:16:19 +08:00
console.print("[bold]Camera qualities:[/bold]")
table = Table(
"low", "medium", "high", "ultra_high",
title="Four defined qualities",
box=box.ROUNDED
)
table.add_row("480p15", "720p30", "1080p60", "2160p60")
console.print(table)
configuration["camera_resolutions"]["default_resolution"] = Prompt.ask(
2022-01-28 00:16:19 +08:00
" Which one to choose as the default rendering quality",
choices=["low", "medium", "high", "ultra_high"],
default="high"
)
2021-02-07 17:45:18 +08:00
2022-01-28 00:16:19 +08:00
write_to_file = Confirm.ask(
"\n[bold]Are you sure to write these configs to file?[/bold]",
default=True
)
if not write_to_file:
raise KeyboardInterrupt
2021-02-07 17:45:18 +08:00
2022-01-28 00:16:19 +08:00
global_file_name = os.path.join(get_manim_dir(), "manimlib", "default_config.yml")
if scope == "global":
file_name = global_file_name
else:
if os.path.exists(global_file_name):
remove_empty_value(configuration)
file_name = os.path.join(os.getcwd(), "custom_config.yml")
with open(file_name, "w", encoding="utf-8") as f:
yaml.dump(configuration, f)
2022-01-28 00:16:19 +08:00
console.print(f"\n:rocket: You have successfully set up a {scope} configuration file!")
console.print(f"You can manually modify it in: [cyan]`{file_name}`[/cyan]")
2021-02-07 17:45:18 +08:00
2022-01-28 00:16:19 +08:00
except KeyboardInterrupt:
console.print("\n[green]Exit configuration guide[/green]")