From 86bb2110d6d95446517f5f80350c2dfa77aee5d8 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Mon, 24 Dec 2018 12:37:51 -0800 Subject: [PATCH 01/10] move library code into manimlib, replace relative imports with absolute imports --- big_ol_pile_of_manim_imports.py | 146 +++++++++--------- example.png | Bin 35767 -> 0 bytes files/Bubbles_speech.svg | 11 -- files/Bubbles_thought.svg | 18 --- files/PiCreatures_plain.svg | 24 --- manim.py | 14 +- __init__.py => manimlib/animation/__init__.py | 0 .../animation}/animation.py | 13 +- .../animation}/composition.py | 22 ++- {animation => manimlib/animation}/creation.py | 25 ++- .../animation}/indication.py | 40 +++-- {animation => manimlib/animation}/movement.py | 7 +- {animation => manimlib/animation}/numbers.py | 7 +- {animation => manimlib/animation}/rotation.py | 11 +- .../animation}/specialized.py | 19 +-- .../animation}/transform.py | 28 ++-- {animation => manimlib/animation}/update.py | 9 +- {animation => manimlib/camera}/__init__.py | 0 {camera => manimlib/camera}/camera.py | 35 ++--- {camera => manimlib/camera}/mapping_camera.py | 10 +- {camera => manimlib/camera}/moving_camera.py | 21 ++- {camera => manimlib/camera}/multi_camera.py | 6 +- {camera => manimlib/camera}/three_d_camera.py | 33 ++-- config.py => manimlib/config.py | 16 +- constants.py => manimlib/constants.py | 2 +- {container => manimlib/container}/__init__.py | 0 .../container}/container.py | 2 +- .../continual_animation}/__init__.py | 0 .../continual_animation.py | 10 +- .../continual_animation}/from_animation.py | 2 +- .../continual_animation}/numbers.py | 4 +- .../continual_animation}/update.py | 6 +- .../ctex_template.tex | 0 extract_scene.py => manimlib/extract_scene.py | 20 ++- .../for_3b1b_videos}/common_scenes.py | 43 +++--- .../for_3b1b_videos}/pi_class.py | 8 +- .../for_3b1b_videos}/pi_creature.py | 30 ++-- .../pi_creature_animations.py | 34 ++-- .../for_3b1b_videos}/pi_creature_scene.py | 42 +++-- manimlib/media_dir.txt | 1 + .../mobject}/__init__.py | 0 .../mobject}/coordinate_systems.py | 23 ++- {mobject => manimlib/mobject}/frame.py | 8 +- {mobject => manimlib/mobject}/functions.py | 9 +- {mobject => manimlib/mobject}/geometry.py | 30 ++-- {mobject => manimlib/mobject}/matrix.py | 19 +-- {mobject => manimlib/mobject}/mobject.py | 33 ++-- {mobject => manimlib/mobject}/number_line.py | 25 ++- {mobject => manimlib/mobject}/numbers.py | 7 +- {mobject => manimlib/mobject}/probability.py | 24 ++- .../mobject}/shape_matchers.py | 17 +- .../mobject/svg}/__init__.py | 0 {mobject => manimlib/mobject}/svg/brace.py | 21 ++- {mobject => manimlib/mobject}/svg/drawings.py | 50 +++--- .../mobject}/svg/svg_mobject.py | 20 +-- .../mobject}/svg/tex_mobject.py | 25 ++- .../mobject}/three_d_shading_utils.py | 4 +- .../mobject}/three_d_utils.py | 8 +- .../mobject}/three_dimensions.py | 16 +- .../mobject/types}/__init__.py | 0 .../mobject}/types/image_mobject.py | 17 +- .../mobject}/types/point_cloud_mobject.py | 21 ++- .../mobject}/types/vectorized_mobject.py | 28 ++-- {mobject => manimlib/mobject}/updater.py | 0 .../mobject}/value_tracker.py | 5 +- .../once_useful_constructs}/NOTE.md | 0 .../once_useful_constructs}/arithmetic.py | 8 +- .../once_useful_constructs}/combinatorics.py | 14 +- .../complex_transformation_scene.py | 16 +- .../once_useful_constructs}/counting.py | 24 ++- .../once_useful_constructs}/fractals.py | 34 ++-- .../once_useful_constructs}/graph_theory.py | 12 +- .../once_useful_constructs}/light.py | 39 +++-- .../matrix_multiplication.py | 23 ++- .../once_useful_constructs}/region.py | 9 +- {scene => manimlib/scene}/__init__.py | 0 {scene => manimlib/scene}/graph_scene.py | 38 +++-- manimlib/scene/media_dir.txt | 1 + .../scene}/moving_camera_scene.py | 8 +- .../scene}/reconfigurable_scene.py | 11 +- .../scene}/sample_space_scene.py | 20 +-- {scene => manimlib/scene}/scene.py | 41 ++--- {scene => manimlib/scene}/scene_from_video.py | 8 +- {scene => manimlib/scene}/three_d_scene.py | 11 +- .../scene}/vector_space_scene.py | 62 ++++---- {scene => manimlib/scene}/zoomed_scene.py | 17 +- stage_scenes.py => manimlib/stage_scenes.py | 12 +- .../stream_starter.py | 17 +- tex_template.tex => manimlib/tex_template.tex | 0 {mobject/svg => manimlib/utils}/__init__.py | 0 {utils => manimlib/utils}/bezier.py | 6 +- {utils => manimlib/utils}/color.py | 12 +- {utils => manimlib/utils}/config_ops.py | 2 +- {utils => manimlib/utils}/images.py | 3 +- {utils => manimlib/utils}/iterables.py | 0 .../utils}/output_directory_getters.py | 4 +- {utils => manimlib/utils}/paths.py | 8 +- {utils => manimlib/utils}/rate_functions.py | 4 +- {utils => manimlib/utils}/simple_functions.py | 4 +- {utils => manimlib/utils}/sounds.py | 0 {utils => manimlib/utils}/space_ops.py | 13 +- {utils => manimlib/utils}/strings.py | 2 +- {utils => manimlib/utils}/tex_file_writing.py | 7 +- mobject/types/__init__.py | 0 once_useful_constructs/__init__.py | 28 ---- utils/__init__.py | 0 106 files changed, 716 insertions(+), 931 deletions(-) delete mode 100644 example.png delete mode 100644 files/Bubbles_speech.svg delete mode 100644 files/Bubbles_thought.svg delete mode 100644 files/PiCreatures_plain.svg rename __init__.py => manimlib/animation/__init__.py (100%) rename {animation => manimlib/animation}/animation.py (94%) rename {animation => manimlib/animation}/composition.py (96%) rename {animation => manimlib/animation}/creation.py (92%) rename {animation => manimlib/animation}/indication.py (87%) rename {animation => manimlib/animation}/movement.py (93%) rename {animation => manimlib/animation}/numbers.py (91%) rename {animation => manimlib/animation}/rotation.py (88%) rename {animation => manimlib/animation}/specialized.py (82%) rename {animation => manimlib/animation}/transform.py (93%) rename {animation => manimlib/animation}/update.py (90%) rename {animation => manimlib/camera}/__init__.py (100%) rename {camera => manimlib/camera}/camera.py (96%) rename {camera => manimlib/camera}/mapping_camera.py (95%) rename {camera => manimlib/camera}/moving_camera.py (86%) rename {camera => manimlib/camera}/multi_camera.py (94%) rename {camera => manimlib/camera}/three_d_camera.py (90%) rename config.py => manimlib/config.py (90%) rename constants.py => manimlib/constants.py (100%) rename {container => manimlib/container}/__init__.py (100%) rename {container => manimlib/container}/container.py (95%) rename {camera => manimlib/continual_animation}/__init__.py (100%) rename {continual_animation => manimlib/continual_animation}/continual_animation.py (92%) rename {continual_animation => manimlib/continual_animation}/from_animation.py (91%) rename {continual_animation => manimlib/continual_animation}/numbers.py (60%) rename {continual_animation => manimlib/continual_animation}/update.py (88%) rename ctex_template.tex => manimlib/ctex_template.tex (100%) rename extract_scene.py => manimlib/extract_scene.py (88%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/common_scenes.py (89%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_class.py (72%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_creature.py (94%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_creature_animations.py (83%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_creature_scene.py (92%) create mode 100644 manimlib/media_dir.txt rename {continual_animation => manimlib/mobject}/__init__.py (100%) rename {mobject => manimlib/mobject}/coordinate_systems.py (96%) rename {mobject => manimlib/mobject}/frame.py (88%) rename {mobject => manimlib/mobject}/functions.py (89%) rename {mobject => manimlib/mobject}/geometry.py (97%) rename {mobject => manimlib/mobject}/matrix.py (92%) rename {mobject => manimlib/mobject}/mobject.py (97%) rename {mobject => manimlib/mobject}/number_line.py (90%) rename {mobject => manimlib/mobject}/numbers.py (96%) rename {mobject => manimlib/mobject}/probability.py (93%) rename {mobject => manimlib/mobject}/shape_matchers.py (84%) rename {for_3b1b_videos => manimlib/mobject/svg}/__init__.py (100%) rename {mobject => manimlib/mobject}/svg/brace.py (90%) rename {mobject => manimlib/mobject}/svg/drawings.py (96%) rename {mobject => manimlib/mobject}/svg/svg_mobject.py (96%) rename {mobject => manimlib/mobject}/svg/tex_mobject.py (95%) rename {mobject => manimlib/mobject}/three_d_shading_utils.py (93%) rename {mobject => manimlib/mobject}/three_d_utils.py (89%) rename {mobject => manimlib/mobject}/three_dimensions.py (92%) rename {mobject => manimlib/mobject/types}/__init__.py (100%) rename {mobject => manimlib/mobject}/types/image_mobject.py (91%) rename {mobject => manimlib/mobject}/types/point_cloud_mobject.py (94%) rename {mobject => manimlib/mobject}/types/vectorized_mobject.py (97%) rename {mobject => manimlib/mobject}/updater.py (100%) rename {mobject => manimlib/mobject}/value_tracker.py (92%) rename {once_useful_constructs => manimlib/once_useful_constructs}/NOTE.md (100%) rename {once_useful_constructs => manimlib/once_useful_constructs}/arithmetic.py (94%) rename {once_useful_constructs => manimlib/once_useful_constructs}/combinatorics.py (95%) rename {once_useful_constructs => manimlib/once_useful_constructs}/complex_transformation_scene.py (93%) rename {once_useful_constructs => manimlib/once_useful_constructs}/counting.py (93%) rename {once_useful_constructs => manimlib/once_useful_constructs}/fractals.py (95%) rename {once_useful_constructs => manimlib/once_useful_constructs}/graph_theory.py (98%) rename {once_useful_constructs => manimlib/once_useful_constructs}/light.py (95%) rename {once_useful_constructs => manimlib/once_useful_constructs}/matrix_multiplication.py (89%) rename {once_useful_constructs => manimlib/once_useful_constructs}/region.py (96%) rename {scene => manimlib/scene}/__init__.py (100%) rename {scene => manimlib/scene}/graph_scene.py (95%) create mode 100644 manimlib/scene/media_dir.txt rename {scene => manimlib/scene}/moving_camera_scene.py (87%) rename {scene => manimlib/scene}/reconfigurable_scene.py (91%) rename {scene => manimlib/scene}/sample_space_scene.py (92%) rename {scene => manimlib/scene}/scene.py (96%) rename {scene => manimlib/scene}/scene_from_video.py (97%) rename {scene => manimlib/scene}/three_d_scene.py (92%) rename {scene => manimlib/scene}/vector_space_scene.py (91%) rename {scene => manimlib/scene}/zoomed_scene.py (89%) rename stage_scenes.py => manimlib/stage_scenes.py (86%) rename stream_starter.py => manimlib/stream_starter.py (73%) rename tex_template.tex => manimlib/tex_template.tex (100%) rename {mobject/svg => manimlib/utils}/__init__.py (100%) rename {utils => manimlib/utils}/bezier.py (97%) rename {utils => manimlib/utils}/color.py (91%) rename {utils => manimlib/utils}/config_ops.py (100%) rename {utils => manimlib/utils}/images.py (94%) rename {utils => manimlib/utils}/iterables.py (100%) rename {utils => manimlib/utils}/output_directory_getters.py (93%) rename {utils => manimlib/utils}/paths.py (87%) rename {utils => manimlib/utils}/rate_functions.py (95%) rename {utils => manimlib/utils}/simple_functions.py (100%) rename {utils => manimlib/utils}/sounds.py (100%) rename {utils => manimlib/utils}/space_ops.py (96%) rename {utils => manimlib/utils}/strings.py (100%) rename {utils => manimlib/utils}/tex_file_writing.py (95%) delete mode 100644 mobject/types/__init__.py delete mode 100644 once_useful_constructs/__init__.py delete mode 100644 utils/__init__.py diff --git a/big_ol_pile_of_manim_imports.py b/big_ol_pile_of_manim_imports.py index ba8ee046..a4c43f3d 100644 --- a/big_ol_pile_of_manim_imports.py +++ b/big_ol_pile_of_manim_imports.py @@ -14,87 +14,87 @@ as a convenience for scripts creating scenes for videos. """ -from constants import * +from manimlib.constants import * -from animation.animation import * -from animation.composition import * -from animation.creation import * -from animation.indication import * -from animation.movement import * -from animation.numbers import * -from animation.rotation import * -from animation.specialized import * -from animation.transform import * -from animation.update import * +from manimlib.animation.animation import * +from manimlib.animation.composition import * +from manimlib.animation.creation import * +from manimlib.animation.indication import * +from manimlib.animation.movement import * +from manimlib.animation.numbers import * +from manimlib.animation.rotation import * +from manimlib.animation.specialized import * +from manimlib.animation.transform import * +from manimlib.animation.update import * -from camera.camera import * -from camera.mapping_camera import * -from camera.moving_camera import * -from camera.three_d_camera import * +from manimlib.camera.camera import * +from manimlib.camera.mapping_camera import * +from manimlib.camera.moving_camera import * +from manimlib.camera.three_d_camera import * -from continual_animation.continual_animation import * -from continual_animation.from_animation import * -from continual_animation.numbers import * -from continual_animation.update import * +from manimlib.continual_animation.continual_animation import * +from manimlib.continual_animation.from_animation import * +from manimlib.continual_animation.numbers import * +from manimlib.continual_animation.update import * -from mobject.coordinate_systems import * -from mobject.frame import * -from mobject.functions import * -from mobject.geometry import * -from mobject.matrix import * -from mobject.mobject import * -from mobject.number_line import * -from mobject.numbers import * -from mobject.probability import * -from mobject.shape_matchers import * -from mobject.svg.brace import * -from mobject.svg.drawings import * -from mobject.svg.svg_mobject import * -from mobject.svg.tex_mobject import * -from mobject.three_d_utils import * -from mobject.three_dimensions import * -from mobject.types.image_mobject import * -from mobject.types.point_cloud_mobject import * -from mobject.types.vectorized_mobject import * -from mobject.updater import * -from mobject.value_tracker import * +from manimlib.mobject.coordinate_systems import * +from manimlib.mobject.frame import * +from manimlib.mobject.functions import * +from manimlib.mobject.geometry import * +from manimlib.mobject.matrix import * +from manimlib.mobject.mobject import * +from manimlib.mobject.number_line import * +from manimlib.mobject.numbers import * +from manimlib.mobject.probability import * +from manimlib.mobject.shape_matchers import * +from manimlib.mobject.svg.brace import * +from manimlib.mobject.svg.drawings import * +from manimlib.mobject.svg.svg_mobject import * +from manimlib.mobject.svg.tex_mobject import * +from manimlib.mobject.three_d_utils import * +from manimlib.mobject.three_dimensions import * +from manimlib.mobject.types.image_mobject import * +from manimlib.mobject.types.point_cloud_mobject import * +from manimlib.mobject.types.vectorized_mobject import * +from manimlib.mobject.updater import * +from manimlib.mobject.value_tracker import * -from for_3b1b_videos.common_scenes import * -from for_3b1b_videos.pi_creature import * -from for_3b1b_videos.pi_creature_animations import * -from for_3b1b_videos.pi_creature_scene import * +from manimlib.for_3b1b_videos.common_scenes import * +from manimlib.for_3b1b_videos.pi_creature import * +from manimlib.for_3b1b_videos.pi_creature_animations import * +from manimlib.for_3b1b_videos.pi_creature_scene import * -from once_useful_constructs.arithmetic import * -from once_useful_constructs.combinatorics import * -from once_useful_constructs.complex_transformation_scene import * -from once_useful_constructs.counting import * -from once_useful_constructs.fractals import * -from once_useful_constructs.graph_theory import * -from once_useful_constructs.light import * +from manimlib.once_useful_constructs.arithmetic import * +from manimlib.once_useful_constructs.combinatorics import * +from manimlib.once_useful_constructs.complex_transformation_scene import * +from manimlib.once_useful_constructs.counting import * +from manimlib.once_useful_constructs.fractals import * +from manimlib.once_useful_constructs.graph_theory import * +from manimlib.once_useful_constructs.light import * -from scene.graph_scene import * -from scene.moving_camera_scene import * -from scene.reconfigurable_scene import * -from scene.scene import * -from scene.sample_space_scene import * -from scene.graph_scene import * -from scene.scene_from_video import * -from scene.three_d_scene import * -from scene.vector_space_scene import * -from scene.zoomed_scene import * +from manimlib.scene.graph_scene import * +from manimlib.scene.moving_camera_scene import * +from manimlib.scene.reconfigurable_scene import * +from manimlib.scene.scene import * +from manimlib.scene.sample_space_scene import * +from manimlib.scene.graph_scene import * +from manimlib.scene.scene_from_video import * +from manimlib.scene.three_d_scene import * +from manimlib.scene.vector_space_scene import * +from manimlib.scene.zoomed_scene import * -from utils.bezier import * -from utils.color import * -from utils.config_ops import * -from utils.images import * -from utils.iterables import * -from utils.output_directory_getters import * -from utils.paths import * -from utils.rate_functions import * -from utils.simple_functions import * -from utils.sounds import * -from utils.space_ops import * -from utils.strings import * +from manimlib.utils.bezier import * +from manimlib.utils.color import * +from manimlib.utils.config_ops import * +from manimlib.utils.images import * +from manimlib.utils.iterables import * +from manimlib.utils.output_directory_getters import * +from manimlib.utils.paths import * +from manimlib.utils.rate_functions import * +from manimlib.utils.simple_functions import * +from manimlib.utils.sounds import * +from manimlib.utils.space_ops import * +from manimlib.utils.strings import * # Non manim libraries that are also nice to have without thinking diff --git a/example.png b/example.png deleted file mode 100644 index f5887cd890d772364cd0ab01a48c0994466e0839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35767 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 - - - - - diff --git a/files/Bubbles_thought.svg b/files/Bubbles_thought.svg deleted file mode 100644 index c77ebca4..00000000 --- a/files/Bubbles_thought.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/files/PiCreatures_plain.svg b/files/PiCreatures_plain.svg deleted file mode 100644 index 552043d6..00000000 --- a/files/PiCreatures_plain.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/manim.py b/manim.py index c5c814d3..45831bb3 100644 --- a/manim.py +++ b/manim.py @@ -1,14 +1,14 @@ #!/usr/bin/env python -import config -import extract_scene -import stream_starter +import manimlib.config +import manimlib.extract_scene +import manimlib.stream_starter -args = config.parse_cli() +args = manimlib.config.parse_cli() if not args.livestream: - config = config.get_configuration(args) - extract_scene.main(config) + config = manimlib.config.get_configuration(args) + manimlib.extract_scene.main(config) else: - stream_starter.start_livestream( + manimlib.stream_starter.start_livestream( to_twitch=args.to_twitch, twitch_key=args.twitch_key, ) diff --git a/__init__.py b/manimlib/animation/__init__.py similarity index 100% rename from __init__.py rename to manimlib/animation/__init__.py diff --git a/animation/animation.py b/manimlib/animation/animation.py similarity index 94% rename from animation/animation.py rename to manimlib/animation/animation.py index 5797cacb..58625bca 100644 --- a/animation/animation.py +++ b/manimlib/animation/animation.py @@ -1,11 +1,12 @@ -import numpy as np from copy import deepcopy -from constants import * -from mobject.mobject import Mobject -from utils.rate_functions import smooth -from utils.config_ops import instantiate -from utils.config_ops import digest_config +import numpy as np + +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import instantiate +from manimlib.utils.rate_functions import smooth class Animation(object): diff --git a/animation/composition.py b/manimlib/animation/composition.py similarity index 96% rename from animation/composition.py rename to manimlib/animation/composition.py index d13d31f3..b5398e5a 100644 --- a/animation/composition.py +++ b/manimlib/animation/composition.py @@ -1,19 +1,15 @@ - - - import itertools as it -import numpy as np - -from constants import * - import warnings -from animation.animation import Animation -from mobject.mobject import Group -from mobject.mobject import Mobject -from utils.bezier import inverse_interpolate -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func +import numpy as np + +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.mobject.mobject import Group +from manimlib.mobject.mobject import Mobject +from manimlib.utils.bezier import inverse_interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func class EmptyAnimation(Animation): diff --git a/animation/creation.py b/manimlib/animation/creation.py similarity index 92% rename from animation/creation.py rename to manimlib/animation/creation.py index 23530d71..54ed21aa 100644 --- a/animation/creation.py +++ b/manimlib/animation/creation.py @@ -1,19 +1,16 @@ - - import numpy as np -from constants import * - -from animation.animation import Animation -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VectorizedPoint -from animation.transform import Transform -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.paths import counterclockwise_path -from utils.rate_functions import double_smooth -from utils.rate_functions import smooth +from manimlib.animation.animation import Animation +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.paths import counterclockwise_path +from manimlib.utils.rate_functions import double_smooth +from manimlib.utils.rate_functions import smooth # Drawing diff --git a/animation/indication.py b/manimlib/animation/indication.py similarity index 87% rename from animation/indication.py rename to manimlib/animation/indication.py index a97e5f13..adbe7f36 100644 --- a/animation/indication.py +++ b/manimlib/animation/indication.py @@ -1,27 +1,25 @@ - +from functools import reduce import numpy as np -from constants import * - -from animation.animation import Animation -from animation.movement import Homotopy -from animation.composition import AnimationGroup -from animation.composition import Succession -from animation.creation import ShowCreation -from animation.creation import ShowPartial -from animation.creation import FadeOut -from animation.transform import Transform -from mobject.mobject import Mobject -from mobject.geometry import Circle -from mobject.geometry import Dot -from mobject.shape_matchers import SurroundingRectangle -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back -from utils.rate_functions import wiggle -from functools import reduce +from manimlib.constants import * +from manimlib.animation.animation import Animation +from manimlib.animation.movement import Homotopy +from manimlib.animation.composition import AnimationGroup +from manimlib.animation.composition import Succession +from manimlib.animation.creation import ShowCreation +from manimlib.animation.creation import ShowPartial +from manimlib.animation.creation import FadeOut +from manimlib.animation.transform import Transform +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Dot +from manimlib.mobject.shape_matchers import SurroundingRectangle +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.rate_functions import wiggle class FocusOn(Transform): diff --git a/animation/movement.py b/manimlib/animation/movement.py similarity index 93% rename from animation/movement.py rename to manimlib/animation/movement.py index 097af71a..645ac603 100644 --- a/animation/movement.py +++ b/manimlib/animation/movement.py @@ -1,7 +1,6 @@ -from constants import * - -from animation.animation import Animation -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.utils.config_ops import digest_config class Homotopy(Animation): diff --git a/animation/numbers.py b/manimlib/animation/numbers.py similarity index 91% rename from animation/numbers.py rename to manimlib/animation/numbers.py index 44773d7b..3c6c2b5d 100644 --- a/animation/numbers.py +++ b/manimlib/animation/numbers.py @@ -1,7 +1,6 @@ - -from animation.animation import Animation -from utils.bezier import interpolate -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config class ChangingDecimal(Animation): diff --git a/animation/rotation.py b/manimlib/animation/rotation.py similarity index 88% rename from animation/rotation.py rename to manimlib/animation/rotation.py index 21b2898e..46b9921f 100644 --- a/animation/rotation.py +++ b/manimlib/animation/rotation.py @@ -1,12 +1,9 @@ - - import numpy as np -from constants import * - -from animation.animation import Animation -from animation.transform import Transform -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.utils.config_ops import digest_config class Rotating(Animation): diff --git a/animation/specialized.py b/manimlib/animation/specialized.py similarity index 82% rename from animation/specialized.py rename to manimlib/animation/specialized.py index 162f9df3..57f110e0 100644 --- a/animation/specialized.py +++ b/manimlib/animation/specialized.py @@ -1,16 +1,13 @@ - - import numpy as np -from constants import * - -from animation.transform import ApplyMethod -from animation.composition import LaggedStart -from mobject.svg.drawings import Car -from mobject.types.vectorized_mobject import VGroup -from mobject.geometry import Circle -from utils.config_ops import digest_config -from utils.space_ops import get_norm +from manimlib.animation.composition import LaggedStart +from manimlib.animation.transform import ApplyMethod +from manimlib.constants import * +from manimlib.mobject.geometry import Circle +from manimlib.mobject.svg.drawings import Car +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import get_norm class MoveCar(ApplyMethod): diff --git a/animation/transform.py b/manimlib/animation/transform.py similarity index 93% rename from animation/transform.py rename to manimlib/animation/transform.py index dff9bf8a..76c2f27c 100644 --- a/animation/transform.py +++ b/manimlib/animation/transform.py @@ -1,21 +1,19 @@ - - import inspect + import numpy as np -from constants import * - -from animation.animation import Animation -from mobject.mobject import Group -from mobject.mobject import Mobject -from utils.config_ops import digest_config -from utils.iterables import adjacent_pairs -from utils.paths import path_along_arc -from utils.paths import straight_path -from utils.config_ops import instantiate -from utils.rate_functions import smooth -from utils.rate_functions import squish_rate_func -from utils.space_ops import complex_to_R3 +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.mobject.mobject import Group +from manimlib.mobject.mobject import Mobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import instantiate +from manimlib.utils.iterables import adjacent_pairs +from manimlib.utils.paths import path_along_arc +from manimlib.utils.paths import straight_path +from manimlib.utils.rate_functions import smooth +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.space_ops import complex_to_R3 class Transform(Animation): diff --git a/animation/update.py b/manimlib/animation/update.py similarity index 90% rename from animation/update.py rename to manimlib/animation/update.py index ec5dfbd0..45b26f39 100644 --- a/animation/update.py +++ b/manimlib/animation/update.py @@ -1,9 +1,6 @@ - - -from constants import * - -from animation.animation import Animation -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.utils.config_ops import digest_config class UpdateFromFunc(Animation): diff --git a/animation/__init__.py b/manimlib/camera/__init__.py similarity index 100% rename from animation/__init__.py rename to manimlib/camera/__init__.py diff --git a/camera/camera.py b/manimlib/camera/camera.py similarity index 96% rename from camera/camera.py rename to manimlib/camera/camera.py index a06791a3..3238f9e1 100644 --- a/camera/camera.py +++ b/manimlib/camera/camera.py @@ -1,30 +1,29 @@ +from functools import reduce import itertools as it -import numpy as np import operator as op - import time from PIL import Image from scipy.spatial.distance import pdist import cairo +import numpy as np -from constants import * -from mobject.types.image_mobject import AbstractImageMobject -from mobject.mobject import Mobject -from mobject.types.point_cloud_mobject import PMobject -from mobject.types.vectorized_mobject import VMobject -from utils.color import color_to_int_rgba -from utils.color import rgb_to_hex -from utils.config_ops import digest_config -from utils.images import get_full_raster_image_path -from utils.iterables import batch_by_property -from utils.iterables import list_difference_update -from utils.iterables import remove_list_redundancies -from utils.simple_functions import fdiv -from utils.space_ops import angle_of_vector -from utils.space_ops import get_norm -from functools import reduce +from manimlib.constants import * +from manimlib.mobject.types.image_mobject import AbstractImageMobject +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.types.point_cloud_mobject import PMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.color import color_to_int_rgba +from manimlib.utils.color import rgb_to_hex +from manimlib.utils.config_ops import digest_config +from manimlib.utils.images import get_full_raster_image_path +from manimlib.utils.iterables import batch_by_property +from manimlib.utils.iterables import list_difference_update +from manimlib.utils.iterables import remove_list_redundancies +from manimlib.utils.simple_functions import fdiv +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import get_norm class Camera(object): diff --git a/camera/mapping_camera.py b/manimlib/camera/mapping_camera.py similarity index 95% rename from camera/mapping_camera.py rename to manimlib/camera/mapping_camera.py index 8fec02ac..d7347d0c 100644 --- a/camera/mapping_camera.py +++ b/manimlib/camera/mapping_camera.py @@ -1,11 +1,9 @@ - - import numpy as np -from camera.camera import Camera -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import DictAsObject -from utils.config_ops import digest_config +from manimlib.camera.camera import Camera +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import DictAsObject +from manimlib.utils.config_ops import digest_config # TODO: Add an attribute to mobjects under which they can specify that they should just # map their centers but remain otherwise undistorted (useful for labels, etc.) diff --git a/camera/moving_camera.py b/manimlib/camera/moving_camera.py similarity index 86% rename from camera/moving_camera.py rename to manimlib/camera/moving_camera.py index 6b986d7a..4bf0fe64 100644 --- a/camera/moving_camera.py +++ b/manimlib/camera/moving_camera.py @@ -1,15 +1,12 @@ - - -from constants import FRAME_HEIGHT -from constants import FRAME_WIDTH -from constants import ORIGIN -from constants import WHITE - -from camera.camera import Camera -from mobject.frame import ScreenRectangle -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VectorizedPoint -from utils.config_ops import digest_config +from manimlib.camera.camera import Camera +from manimlib.constants import FRAME_HEIGHT +from manimlib.constants import FRAME_WIDTH +from manimlib.constants import ORIGIN +from manimlib.constants import WHITE +from manimlib.mobject.frame import ScreenRectangle +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.config_ops import digest_config # TODO, think about how to incorporate perspective diff --git a/camera/multi_camera.py b/manimlib/camera/multi_camera.py similarity index 94% rename from camera/multi_camera.py rename to manimlib/camera/multi_camera.py index 65780934..9283b0e7 100644 --- a/camera/multi_camera.py +++ b/manimlib/camera/multi_camera.py @@ -1,7 +1,5 @@ - - -from camera.moving_camera import MovingCamera -from utils.iterables import list_difference_update +from manimlib.camera.moving_camera import MovingCamera +from manimlib.utils.iterables import list_difference_update class MultiCamera(MovingCamera): diff --git a/camera/three_d_camera.py b/manimlib/camera/three_d_camera.py similarity index 90% rename from camera/three_d_camera.py rename to manimlib/camera/three_d_camera.py index 48b3d28f..cf6a1be2 100644 --- a/camera/three_d_camera.py +++ b/manimlib/camera/three_d_camera.py @@ -1,24 +1,19 @@ - - import numpy as np -from constants import * - -from camera.camera import Camera -from mobject.types.point_cloud_mobject import Point -from mobject.types.vectorized_mobject import VMobject -from mobject.three_d_utils import get_3d_vmob_start_corner -from mobject.three_d_utils import get_3d_vmob_start_corner_unit_normal -from mobject.three_d_utils import get_3d_vmob_end_corner -from mobject.three_d_utils import get_3d_vmob_end_corner_unit_normal -from mobject.value_tracker import ValueTracker - -from utils.color import get_shaded_rgb -# from utils.config_ops import digest_config -from utils.space_ops import rotation_about_z -from utils.space_ops import rotation_matrix -from utils.space_ops import center_of_mass -from utils.simple_functions import clip_in_place +from manimlib.camera.camera import Camera +from manimlib.constants import * +from manimlib.mobject.three_d_utils import get_3d_vmob_end_corner +from manimlib.mobject.three_d_utils import get_3d_vmob_end_corner_unit_normal +from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner +from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner_unit_normal +from manimlib.mobject.types.point_cloud_mobject import Point +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.value_tracker import ValueTracker +from manimlib.utils.color import get_shaded_rgb +from manimlib.utils.simple_functions import clip_in_place +from manimlib.utils.space_ops import center_of_mass +from manimlib.utils.space_ops import rotation_about_z +from manimlib.utils.space_ops import rotation_matrix class ThreeDCamera(Camera): diff --git a/config.py b/manimlib/config.py similarity index 90% rename from config.py rename to manimlib/config.py index bec4870e..a53e2f59 100644 --- a/config.py +++ b/manimlib/config.py @@ -1,10 +1,10 @@ -#!/usr/bin/env python import argparse import colour -import constants import os import sys +import manimlib.constants + def parse_cli(): try: @@ -108,14 +108,14 @@ def get_configuration(args): # Camera configuration config["camera_config"] = {} if args.low_quality: - config["camera_config"].update(constants.LOW_QUALITY_CAMERA_CONFIG) - config["frame_duration"] = constants.LOW_QUALITY_FRAME_DURATION + config["camera_config"].update(manimlib.constants.LOW_QUALITY_CAMERA_CONFIG) + config["frame_duration"] = manimlib.constants.LOW_QUALITY_FRAME_DURATION elif args.medium_quality: - config["camera_config"].update(constants.MEDIUM_QUALITY_CAMERA_CONFIG) - config["frame_duration"] = constants.MEDIUM_QUALITY_FRAME_DURATION + config["camera_config"].update(manimlib.constants.MEDIUM_QUALITY_CAMERA_CONFIG) + config["frame_duration"] = manimlib.constants.MEDIUM_QUALITY_FRAME_DURATION else: - config["camera_config"].update(constants.PRODUCTION_QUALITY_CAMERA_CONFIG) - config["frame_duration"] = constants.PRODUCTION_QUALITY_FRAME_DURATION + config["camera_config"].update(manimlib.constants.PRODUCTION_QUALITY_CAMERA_CONFIG) + config["frame_duration"] = manimlib.constants.PRODUCTION_QUALITY_FRAME_DURATION # If the resolution was passed in via -r if args.resolution: diff --git a/constants.py b/manimlib/constants.py similarity index 100% rename from constants.py rename to manimlib/constants.py index 431ddfd7..30c115e5 100644 --- a/constants.py +++ b/manimlib/constants.py @@ -1,5 +1,5 @@ -import os import numpy as np +import os # Initialize directories env_MEDIA_DIR = os.getenv("MEDIA_DIR") diff --git a/container/__init__.py b/manimlib/container/__init__.py similarity index 100% rename from container/__init__.py rename to manimlib/container/__init__.py diff --git a/container/container.py b/manimlib/container/container.py similarity index 95% rename from container/container.py rename to manimlib/container/container.py index 6ead1bdd..d84ff2a0 100644 --- a/container/container.py +++ b/manimlib/container/container.py @@ -1,4 +1,4 @@ -from utils.config_ops import digest_config +from manimlib.utils.config_ops import digest_config # Currently, this is only used by both Scene and Mobject. # Still, we abstract its functionality here, albeit purely nominally. diff --git a/camera/__init__.py b/manimlib/continual_animation/__init__.py similarity index 100% rename from camera/__init__.py rename to manimlib/continual_animation/__init__.py diff --git a/continual_animation/continual_animation.py b/manimlib/continual_animation/continual_animation.py similarity index 92% rename from continual_animation/continual_animation.py rename to manimlib/continual_animation/continual_animation.py index 5ecee74c..e75f81b6 100644 --- a/continual_animation/continual_animation.py +++ b/manimlib/continual_animation/continual_animation.py @@ -1,10 +1,10 @@ import copy -from constants import * -from mobject.mobject import Group -from mobject.mobject import Mobject -from utils.config_ops import digest_config -from utils.config_ops import instantiate +from manimlib.constants import * +from manimlib.mobject.mobject import Group +from manimlib.mobject.mobject import Mobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import instantiate class ContinualAnimation(object): diff --git a/continual_animation/from_animation.py b/manimlib/continual_animation/from_animation.py similarity index 91% rename from continual_animation/from_animation.py rename to manimlib/continual_animation/from_animation.py index 61314b85..b49263dc 100644 --- a/continual_animation/from_animation.py +++ b/manimlib/continual_animation/from_animation.py @@ -1,6 +1,6 @@ -from continual_animation.continual_animation import ContinualAnimation +from manimlib.continual_animation.continual_animation import ContinualAnimation class NormalAnimationAsContinualAnimation(ContinualAnimation): diff --git a/continual_animation/numbers.py b/manimlib/continual_animation/numbers.py similarity index 60% rename from continual_animation/numbers.py rename to manimlib/continual_animation/numbers.py index 2cc81523..50faa18e 100644 --- a/continual_animation/numbers.py +++ b/manimlib/continual_animation/numbers.py @@ -1,7 +1,7 @@ -from continual_animation.from_animation import NormalAnimationAsContinualAnimation -from animation.numbers import ChangingDecimal +from manimlib.animation.numbers import ChangingDecimal +from manimlib.continual_animation.from_animation import NormalAnimationAsContinualAnimation class ContinualChangingDecimal(NormalAnimationAsContinualAnimation): diff --git a/continual_animation/update.py b/manimlib/continual_animation/update.py similarity index 88% rename from continual_animation/update.py rename to manimlib/continual_animation/update.py index 8db3f871..7e97ff96 100644 --- a/continual_animation/update.py +++ b/manimlib/continual_animation/update.py @@ -1,8 +1,8 @@ -from continual_animation.continual_animation import ContinualAnimation -from animation.update import MaintainPositionRelativeTo -from mobject.value_tracker import ValueTracker +from manimlib.animation.update import MaintainPositionRelativeTo +from manimlib.continual_animation.continual_animation import ContinualAnimation +from manimlib.mobject.value_tracker import ValueTracker class ContinualUpdate(ContinualAnimation): diff --git a/ctex_template.tex b/manimlib/ctex_template.tex similarity index 100% rename from ctex_template.tex rename to manimlib/ctex_template.tex diff --git a/extract_scene.py b/manimlib/extract_scene.py similarity index 88% rename from extract_scene.py rename to manimlib/extract_scene.py index 9ce0a68d..e85eaa78 100644 --- a/extract_scene.py +++ b/manimlib/extract_scene.py @@ -1,6 +1,3 @@ -# !/usr/bin/env python - -import constants import importlib import inspect import itertools as it @@ -9,9 +6,10 @@ import subprocess as sp import sys import traceback -from scene.scene import Scene -from utils.sounds import play_error_sound -from utils.sounds import play_finish_sound +from manimlib.scene.scene import Scene +from manimlib.utils.sounds import play_error_sound +from manimlib.utils.sounds import play_finish_sound +import manimlib.constants def handle_scene(scene, **config): @@ -68,15 +66,15 @@ def prompt_user_for_choice(name_to_obj): print("%d: %s" % (count, name)) num_to_name[count] = name try: - user_input = input(constants.CHOOSE_NUMBER_MESSAGE) + user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) return [ name_to_obj[num_to_name[int(num_str)]] for num_str in user_input.split(",") ] except KeyError: - print(constants.INVALID_NUMBER_MESSAGE) + print(manimlib.constants.INVALID_NUMBER_MESSAGE) sys.exit() - user_input = input(constants.CHOOSE_NUMBER_MESSAGE) + user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) return [ name_to_obj[num_to_name[int(num_str)]] for num_str in user_input.split(",") @@ -85,14 +83,14 @@ def prompt_user_for_choice(name_to_obj): def get_scene_classes(scene_names_to_classes, config): if len(scene_names_to_classes) == 0: - print(constants.NO_SCENE_MESSAGE) + print(manimlib.constants.NO_SCENE_MESSAGE) return [] if len(scene_names_to_classes) == 1: return list(scene_names_to_classes.values()) if config["scene_name"] in scene_names_to_classes: return [scene_names_to_classes[config["scene_name"]]] if config["scene_name"] != "": - print(constants.SCENE_NOT_FOUND_MESSAGE) + print(manimlib.constants.SCENE_NOT_FOUND_MESSAGE) return [] if config["write_all"]: return list(scene_names_to_classes.values()) diff --git a/for_3b1b_videos/common_scenes.py b/manimlib/for_3b1b_videos/common_scenes.py similarity index 89% rename from for_3b1b_videos/common_scenes.py rename to manimlib/for_3b1b_videos/common_scenes.py index 820b7d2d..53bf9647 100644 --- a/for_3b1b_videos/common_scenes.py +++ b/manimlib/for_3b1b_videos/common_scenes.py @@ -1,29 +1,26 @@ - - import random import string -from constants import * - -from animation.animation import Animation -from animation.composition import LaggedStart -from animation.creation import DrawBorderThenFill -from animation.creation import Write -from animation.creation import FadeIn -from animation.creation import FadeOut -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from scene.scene import Scene -from scene.moving_camera_scene import MovingCameraScene -from for_3b1b_videos.pi_creature_animations import Blink -from for_3b1b_videos.pi_creature import Mortimer -from for_3b1b_videos.pi_creature import Randolph -from mobject.geometry import Line -from mobject.geometry import DashedLine -from mobject.geometry import Rectangle -from mobject.geometry import Square -from mobject.svg.drawings import PatreonLogo -from mobject.svg.drawings import Logo +from manimlib.animation.animation import Animation +from manimlib.animation.composition import LaggedStart +from manimlib.animation.creation import DrawBorderThenFill +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import Write +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_creature import Mortimer +from manimlib.for_3b1b_videos.pi_creature import Randolph +from manimlib.for_3b1b_videos.pi_creature_animations import Blink +from manimlib.mobject.geometry import DashedLine +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import Square +from manimlib.mobject.svg.drawings import Logo +from manimlib.mobject.svg.drawings import PatreonLogo +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.moving_camera_scene import MovingCameraScene +from manimlib.scene.scene import Scene class OpeningQuote(Scene): diff --git a/for_3b1b_videos/pi_class.py b/manimlib/for_3b1b_videos/pi_class.py similarity index 72% rename from for_3b1b_videos/pi_class.py rename to manimlib/for_3b1b_videos/pi_class.py index 2c0479d7..fb453af0 100644 --- a/for_3b1b_videos/pi_class.py +++ b/manimlib/for_3b1b_videos/pi_class.py @@ -1,10 +1,10 @@ -import numpy as np import warnings -from constants import * +import numpy as np -from mobject.types.vectorized_mobject import VGroup -from for_3b1b_videos.pi_creature import PiCreature +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_creature import PiCreature +from manimlib.mobject.types.vectorized_mobject import VGroup class PiCreatureClass(VGroup): CONFIG = { diff --git a/for_3b1b_videos/pi_creature.py b/manimlib/for_3b1b_videos/pi_creature.py similarity index 94% rename from for_3b1b_videos/pi_creature.py rename to manimlib/for_3b1b_videos/pi_creature.py index 3bd8f293..088960ab 100644 --- a/for_3b1b_videos/pi_creature.py +++ b/manimlib/for_3b1b_videos/pi_creature.py @@ -1,22 +1,20 @@ -import numpy as np -import warnings import os +import warnings -from constants import * +import numpy as np -from mobject.mobject import Mobject -from mobject.svg.svg_mobject import SVGMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject - -from mobject.svg.drawings import ThoughtBubble - -from animation.transform import Transform -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back -from utils.space_ops import get_norm +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.drawings import ThoughtBubble +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.space_ops import get_norm pi_creature_dir_maybe = os.path.join(MEDIA_DIR, "designs", "PiCreature") if os.path.exists(pi_creature_dir_maybe): diff --git a/for_3b1b_videos/pi_creature_animations.py b/manimlib/for_3b1b_videos/pi_creature_animations.py similarity index 83% rename from for_3b1b_videos/pi_creature_animations.py rename to manimlib/for_3b1b_videos/pi_creature_animations.py index d0561236..6f02ca9b 100644 --- a/for_3b1b_videos/pi_creature_animations.py +++ b/manimlib/for_3b1b_videos/pi_creature_animations.py @@ -1,23 +1,17 @@ - - -from constants import * - -from mobject.mobject import Group - -from mobject.svg.drawings import SpeechBubble - -from animation.animation import Animation -from animation.creation import ShowCreation -from animation.creation import Write -from animation.composition import AnimationGroup -from animation.transform import ApplyMethod -from animation.creation import FadeOut -from animation.transform import MoveToTarget -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back - -from for_3b1b_videos.pi_class import PiCreatureClass +from manimlib.animation.animation import Animation +from manimlib.animation.composition import AnimationGroup +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import ShowCreation +from manimlib.animation.creation import Write +from manimlib.animation.transform import ApplyMethod +from manimlib.animation.transform import MoveToTarget +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_class import PiCreatureClass +from manimlib.mobject.mobject import Group +from manimlib.mobject.svg.drawings import SpeechBubble +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back class Blink(ApplyMethod): diff --git a/for_3b1b_videos/pi_creature_scene.py b/manimlib/for_3b1b_videos/pi_creature_scene.py similarity index 92% rename from for_3b1b_videos/pi_creature_scene.py rename to manimlib/for_3b1b_videos/pi_creature_scene.py index b9cb8e26..1b70bb9f 100644 --- a/for_3b1b_videos/pi_creature_scene.py +++ b/manimlib/for_3b1b_videos/pi_creature_scene.py @@ -1,30 +1,26 @@ - - import itertools as it -import numpy as np import random -from constants import * +import numpy as np -from mobject.types.vectorized_mobject import VGroup - -from mobject.frame import ScreenRectangle -from mobject.svg.drawings import SpeechBubble -from mobject.svg.drawings import ThoughtBubble - -from animation.transform import ApplyMethod -from animation.transform import ReplacementTransform -from animation.transform import Transform -from for_3b1b_videos.pi_creature import PiCreature -from for_3b1b_videos.pi_creature import Mortimer -from for_3b1b_videos.pi_creature import Randolph -from for_3b1b_videos.pi_creature_animations import Blink -from for_3b1b_videos.pi_creature_animations import PiCreatureBubbleIntroduction -from for_3b1b_videos.pi_creature_animations import RemovePiCreatureBubble -from scene.scene import Scene -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back -from utils.space_ops import get_norm +from manimlib.animation.transform import ApplyMethod +from manimlib.animation.transform import ReplacementTransform +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_creature import Mortimer +from manimlib.for_3b1b_videos.pi_creature import PiCreature +from manimlib.for_3b1b_videos.pi_creature import Randolph +from manimlib.for_3b1b_videos.pi_creature_animations import Blink +from manimlib.for_3b1b_videos.pi_creature_animations import PiCreatureBubbleIntroduction +from manimlib.for_3b1b_videos.pi_creature_animations import RemovePiCreatureBubble +from manimlib.mobject.frame import ScreenRectangle +from manimlib.mobject.svg.drawings import SpeechBubble +from manimlib.mobject.svg.drawings import ThoughtBubble +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.space_ops import get_norm class PiCreatureScene(Scene): diff --git a/manimlib/media_dir.txt b/manimlib/media_dir.txt new file mode 100644 index 00000000..27949aaf --- /dev/null +++ b/manimlib/media_dir.txt @@ -0,0 +1 @@ +media \ No newline at end of file diff --git a/continual_animation/__init__.py b/manimlib/mobject/__init__.py similarity index 100% rename from continual_animation/__init__.py rename to manimlib/mobject/__init__.py diff --git a/mobject/coordinate_systems.py b/manimlib/mobject/coordinate_systems.py similarity index 96% rename from mobject/coordinate_systems.py rename to manimlib/mobject/coordinate_systems.py index cf469716..fe6f1f53 100644 --- a/mobject/coordinate_systems.py +++ b/manimlib/mobject/coordinate_systems.py @@ -1,18 +1,15 @@ - - import numpy as np -from constants import * - -from mobject.functions import ParametricFunction -from mobject.geometry import Arrow -from mobject.geometry import Line -from mobject.number_line import NumberLine -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import digest_config -from utils.space_ops import angle_of_vector +from manimlib.constants import * +from manimlib.mobject.functions import ParametricFunction +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Line +from manimlib.mobject.number_line import NumberLine +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import angle_of_vector # TODO: There should be much more code reuse between Axes, NumberPlane and GraphScene diff --git a/mobject/frame.py b/manimlib/mobject/frame.py similarity index 88% rename from mobject/frame.py rename to manimlib/mobject/frame.py index 68bef518..6d354edb 100644 --- a/mobject/frame.py +++ b/manimlib/mobject/frame.py @@ -1,8 +1,6 @@ - - -from constants import * -from mobject.geometry import Rectangle -from utils.config_ops import digest_config +from manimlib.constants import * +from manimlib.mobject.geometry import Rectangle +from manimlib.utils.config_ops import digest_config class ScreenRectangle(Rectangle): diff --git a/mobject/functions.py b/manimlib/mobject/functions.py similarity index 89% rename from mobject/functions.py rename to manimlib/mobject/functions.py index e6ab5772..c5e78695 100644 --- a/mobject/functions.py +++ b/manimlib/mobject/functions.py @@ -1,9 +1,6 @@ - - -from constants import * - -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import digest_config +from manimlib.constants import * +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config class ParametricFunction(VMobject): diff --git a/mobject/geometry.py b/manimlib/mobject/geometry.py similarity index 97% rename from mobject/geometry.py rename to manimlib/mobject/geometry.py index cdc920e7..c50fa79b 100644 --- a/mobject/geometry.py +++ b/manimlib/mobject/geometry.py @@ -1,22 +1,20 @@ - - -from constants import * - import itertools as it + import numpy as np -from mobject.mobject import Mobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.config_ops import digest_locals -from utils.paths import path_along_arc -from utils.space_ops import angle_of_vector -from utils.space_ops import center_of_mass -from utils.space_ops import compass_directions -from utils.space_ops import rotate_vector -from utils.space_ops import get_norm +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import digest_locals +from manimlib.utils.paths import path_along_arc +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import center_of_mass +from manimlib.utils.space_ops import compass_directions +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import rotate_vector class Arc(VMobject): diff --git a/mobject/matrix.py b/manimlib/mobject/matrix.py similarity index 92% rename from mobject/matrix.py rename to manimlib/mobject/matrix.py index 75d3f3c0..b5a2e283 100644 --- a/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -1,16 +1,13 @@ - - import numpy as np -from mobject.numbers import DecimalNumber -from mobject.numbers import Integer -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.shape_matchers import BackgroundRectangle - -from constants import * +from manimlib.constants import * +from manimlib.mobject.numbers import DecimalNumber +from manimlib.mobject.numbers import Integer +from manimlib.mobject.shape_matchers import BackgroundRectangle +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject VECTOR_LABEL_SCALE_FACTOR = 0.8 diff --git a/mobject/mobject.py b/manimlib/mobject/mobject.py similarity index 97% rename from mobject/mobject.py rename to manimlib/mobject/mobject.py index 1ef46e9e..c67990ae 100644 --- a/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -1,28 +1,27 @@ - +from functools import reduce import copy import itertools as it -import numpy as np import operator as op import os import random from colour import Color +import numpy as np -from constants import * -from container.container import Container -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.color import color_to_rgb -from utils.color import interpolate_color -from utils.iterables import list_update -from utils.iterables import remove_list_redundancies -from utils.paths import straight_path -from utils.space_ops import angle_of_vector -from utils.space_ops import complex_to_R3 -from utils.space_ops import rotation_matrix -from utils.simple_functions import get_num_args -from utils.space_ops import get_norm -from functools import reduce +from manimlib.constants import * +from manimlib.container.container import Container +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.color import color_to_rgb +from manimlib.utils.color import interpolate_color +from manimlib.utils.iterables import list_update +from manimlib.utils.iterables import remove_list_redundancies +from manimlib.utils.paths import straight_path +from manimlib.utils.simple_functions import get_num_args +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import complex_to_R3 +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import rotation_matrix # TODO: Explain array_attrs diff --git a/mobject/number_line.py b/manimlib/mobject/number_line.py similarity index 90% rename from mobject/number_line.py rename to manimlib/mobject/number_line.py index 0b1e83aa..40dd5c1c 100644 --- a/mobject/number_line.py +++ b/manimlib/mobject/number_line.py @@ -1,17 +1,14 @@ - - -from constants import * - -from mobject.numbers import DecimalNumber -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.geometry import Arrow -from mobject.geometry import Line -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.space_ops import get_norm -from utils.space_ops import normalize -from utils.simple_functions import fdiv +from manimlib.constants import * +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Line +from manimlib.mobject.numbers import DecimalNumber +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.simple_functions import fdiv +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import normalize class NumberLine(VMobject): diff --git a/mobject/numbers.py b/manimlib/mobject/numbers.py similarity index 96% rename from mobject/numbers.py rename to manimlib/mobject/numbers.py index e7724f45..89f7c393 100644 --- a/mobject/numbers.py +++ b/manimlib/mobject/numbers.py @@ -1,7 +1,6 @@ -from constants import * - -from mobject.svg.tex_mobject import SingleStringTexMobject -from mobject.types.vectorized_mobject import VMobject +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import SingleStringTexMobject +from manimlib.mobject.types.vectorized_mobject import VMobject class DecimalNumber(VMobject): diff --git a/mobject/probability.py b/manimlib/mobject/probability.py similarity index 93% rename from mobject/probability.py rename to manimlib/mobject/probability.py index 49c8f9bb..662154c1 100644 --- a/mobject/probability.py +++ b/manimlib/mobject/probability.py @@ -1,17 +1,13 @@ - - -from constants import * - -from mobject.mobject import Mobject -from mobject.svg.brace import Brace -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.geometry import Line -from mobject.geometry import Rectangle - -from utils.color import color_gradient -from utils.iterables import tuplify +from manimlib.constants import * +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.brace import Brace +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.utils.color import color_gradient +from manimlib.utils.iterables import tuplify EPSILON = 0.0001 diff --git a/mobject/shape_matchers.py b/manimlib/mobject/shape_matchers.py similarity index 84% rename from mobject/shape_matchers.py rename to manimlib/mobject/shape_matchers.py index c0f8e394..d3e1e089 100644 --- a/mobject/shape_matchers.py +++ b/manimlib/mobject/shape_matchers.py @@ -1,13 +1,10 @@ - - -from constants import * - -from mobject.types.vectorized_mobject import VMobject -from mobject.geometry import Rectangle -from mobject.geometry import Line -from mobject.types.vectorized_mobject import VGroup -from utils.config_ops import digest_config -from utils.color import Color +from manimlib.constants import * +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.color import Color +from manimlib.utils.config_ops import digest_config class SurroundingRectangle(Rectangle): diff --git a/for_3b1b_videos/__init__.py b/manimlib/mobject/svg/__init__.py similarity index 100% rename from for_3b1b_videos/__init__.py rename to manimlib/mobject/svg/__init__.py diff --git a/mobject/svg/brace.py b/manimlib/mobject/svg/brace.py similarity index 90% rename from mobject/svg/brace.py rename to manimlib/mobject/svg/brace.py index 2c2a4551..f9af8272 100644 --- a/mobject/svg/brace.py +++ b/manimlib/mobject/svg/brace.py @@ -1,17 +1,14 @@ - - import numpy as np -from constants import * - -from animation.composition import AnimationGroup -from animation.creation import FadeIn -from animation.creation import GrowFromCenter -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import digest_config -from utils.space_ops import get_norm +from manimlib.animation.composition import AnimationGroup +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import GrowFromCenter +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import get_norm class Brace(TexMobject): diff --git a/mobject/svg/drawings.py b/manimlib/mobject/svg/drawings.py similarity index 96% rename from mobject/svg/drawings.py rename to manimlib/mobject/svg/drawings.py index bd8f5a94..62e11d8d 100644 --- a/mobject/svg/drawings.py +++ b/manimlib/mobject/svg/drawings.py @@ -1,32 +1,28 @@ - import itertools as it -from constants import * - -from mobject.mobject import Mobject -from mobject.svg.svg_mobject import SVGMobject -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VectorizedPoint - -from animation.animation import Animation -from animation.rotation import Rotating - -from mobject.geometry import Arc -from mobject.geometry import Circle -from mobject.geometry import Line -from mobject.geometry import Polygon -from mobject.geometry import Rectangle -from mobject.geometry import Square -from mobject.geometry import AnnularSector -from mobject.three_dimensions import Cube -from utils.config_ops import digest_config -from utils.space_ops import angle_of_vector -from utils.space_ops import complex_to_R3 -from utils.space_ops import rotate_vector -from utils.bezier import interpolate +from manimlib.animation.animation import Animation +from manimlib.animation.rotation import Rotating +from manimlib.constants import * +from manimlib.mobject.geometry import AnnularSector +from manimlib.mobject.geometry import Arc +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Polygon +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import Square +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.three_dimensions import Cube +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import complex_to_R3 +from manimlib.utils.space_ops import rotate_vector class Lightbulb(SVGMobject): diff --git a/mobject/svg/svg_mobject.py b/manimlib/mobject/svg/svg_mobject.py similarity index 96% rename from mobject/svg/svg_mobject.py rename to manimlib/mobject/svg/svg_mobject.py index b91ab49b..ea38891d 100644 --- a/mobject/svg/svg_mobject.py +++ b/manimlib/mobject/svg/svg_mobject.py @@ -4,17 +4,17 @@ import string import warnings from xml.dom import minidom -from utils.color import * -from constants import * -from mobject.geometry import Circle -from mobject.geometry import Rectangle -from mobject.geometry import RoundedRectangle -from utils.bezier import is_closed -from utils.config_ops import digest_config -from utils.config_ops import digest_locals -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject +from manimlib.constants import * +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import RoundedRectangle +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import is_closed +from manimlib.utils.color import * +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import digest_locals def string_to_numbers(num_string): diff --git a/mobject/svg/tex_mobject.py b/manimlib/mobject/svg/tex_mobject.py similarity index 95% rename from mobject/svg/tex_mobject.py rename to manimlib/mobject/svg/tex_mobject.py index 97a81784..80378ebf 100644 --- a/mobject/svg/tex_mobject.py +++ b/manimlib/mobject/svg/tex_mobject.py @@ -1,17 +1,16 @@ - -from constants import * - -from .svg_mobject import SVGMobject -from .svg_mobject import VMobjectFromSVGPathstring -from utils.config_ops import digest_config -from utils.strings import split_string_list_to_isolate_substrings -from utils.tex_file_writing import tex_to_svg_file -from mobject.geometry import Line -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VectorizedPoint - -import operator as op from functools import reduce +import operator as op + +from manimlib.constants import * +from manimlib.mobject.geometry import Line +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.svg.svg_mobject import VMobjectFromSVGPathstring +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.config_ops import digest_config +from manimlib.utils.strings import split_string_list_to_isolate_substrings +from manimlib.utils.tex_file_writing import tex_to_svg_file + TEX_MOB_SCALE_FACTOR = 0.05 diff --git a/mobject/three_d_shading_utils.py b/manimlib/mobject/three_d_shading_utils.py similarity index 93% rename from mobject/three_d_shading_utils.py rename to manimlib/mobject/three_d_shading_utils.py index 2d9ef4b0..a0fe43c3 100644 --- a/mobject/three_d_shading_utils.py +++ b/manimlib/mobject/three_d_shading_utils.py @@ -1,7 +1,7 @@ import numpy as np -from constants import ORIGIN -from utils.space_ops import get_unit_normal +from manimlib.constants import ORIGIN +from manimlib.utils.space_ops import get_unit_normal def get_3d_vmob_gradient_start_and_end_points(vmob): diff --git a/mobject/three_d_utils.py b/manimlib/mobject/three_d_utils.py similarity index 89% rename from mobject/three_d_utils.py rename to manimlib/mobject/three_d_utils.py index 187aad27..3138aaa1 100644 --- a/mobject/three_d_utils.py +++ b/manimlib/mobject/three_d_utils.py @@ -1,9 +1,9 @@ import numpy as np -from constants import ORIGIN -from constants import UP -from utils.space_ops import get_unit_normal -from utils.space_ops import get_norm +from manimlib.constants import ORIGIN +from manimlib.constants import UP +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import get_unit_normal def get_3d_vmob_gradient_start_and_end_points(vmob): diff --git a/mobject/three_dimensions.py b/manimlib/mobject/three_dimensions.py similarity index 92% rename from mobject/three_dimensions.py rename to manimlib/mobject/three_dimensions.py index c49405a0..650df680 100644 --- a/mobject/three_dimensions.py +++ b/manimlib/mobject/three_dimensions.py @@ -1,13 +1,9 @@ - - -from constants import * - -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.geometry import Square - -from utils.iterables import tuplify -from utils.space_ops import z_to_vector +from manimlib.constants import * +from manimlib.mobject.geometry import Square +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.iterables import tuplify +from manimlib.utils.space_ops import z_to_vector ############## diff --git a/mobject/__init__.py b/manimlib/mobject/types/__init__.py similarity index 100% rename from mobject/__init__.py rename to manimlib/mobject/types/__init__.py diff --git a/mobject/types/image_mobject.py b/manimlib/mobject/types/image_mobject.py similarity index 91% rename from mobject/types/image_mobject.py rename to manimlib/mobject/types/image_mobject.py index 5607d908..606c8ac4 100644 --- a/mobject/types/image_mobject.py +++ b/manimlib/mobject/types/image_mobject.py @@ -1,17 +1,14 @@ - - import numpy as np from PIL import Image -from constants import * - -from mobject.mobject import Mobject -from mobject.shape_matchers import SurroundingRectangle -from utils.bezier import interpolate -from utils.color import color_to_int_rgb -from utils.config_ops import digest_config -from utils.images import get_full_raster_image_path +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.shape_matchers import SurroundingRectangle +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_to_int_rgb +from manimlib.utils.config_ops import digest_config +from manimlib.utils.images import get_full_raster_image_path class AbstractImageMobject(Mobject): diff --git a/mobject/types/point_cloud_mobject.py b/manimlib/mobject/types/point_cloud_mobject.py similarity index 94% rename from mobject/types/point_cloud_mobject.py rename to manimlib/mobject/types/point_cloud_mobject.py index 1a413ba9..f7b087ab 100644 --- a/mobject/types/point_cloud_mobject.py +++ b/manimlib/mobject/types/point_cloud_mobject.py @@ -1,15 +1,12 @@ - - -from constants import * - -from mobject.mobject import Mobject -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.color import color_to_rgba -from utils.color import rgba_to_color -from utils.config_ops import digest_config -from utils.iterables import stretch_array_to_length -from utils.space_ops import get_norm +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.color import color_to_rgba +from manimlib.utils.color import rgba_to_color +from manimlib.utils.config_ops import digest_config +from manimlib.utils.iterables import stretch_array_to_length +from manimlib.utils.space_ops import get_norm class PMobject(Mobject): diff --git a/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py similarity index 97% rename from mobject/types/vectorized_mobject.py rename to manimlib/mobject/types/vectorized_mobject.py index e22d559d..efefd65b 100644 --- a/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -1,20 +1,20 @@ - import itertools as it + from colour import Color -from mobject.mobject import Mobject -from mobject.three_d_utils import get_3d_vmob_gradient_start_and_end_points -from constants import * -from utils.bezier import bezier -from utils.bezier import get_smooth_handle_points -from utils.bezier import interpolate -from utils.bezier import is_closed -from utils.bezier import partial_bezier_points -from utils.color import color_to_rgba -from utils.iterables import make_even -from utils.iterables import tuplify -from utils.iterables import stretch_array_to_length -from utils.simple_functions import clip_in_place +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.three_d_utils import get_3d_vmob_gradient_start_and_end_points +from manimlib.utils.bezier import bezier +from manimlib.utils.bezier import get_smooth_handle_points +from manimlib.utils.bezier import interpolate +from manimlib.utils.bezier import is_closed +from manimlib.utils.bezier import partial_bezier_points +from manimlib.utils.color import color_to_rgba +from manimlib.utils.iterables import make_even +from manimlib.utils.iterables import stretch_array_to_length +from manimlib.utils.iterables import tuplify +from manimlib.utils.simple_functions import clip_in_place class VMobject(Mobject): diff --git a/mobject/updater.py b/manimlib/mobject/updater.py similarity index 100% rename from mobject/updater.py rename to manimlib/mobject/updater.py diff --git a/mobject/value_tracker.py b/manimlib/mobject/value_tracker.py similarity index 92% rename from mobject/value_tracker.py rename to manimlib/mobject/value_tracker.py index 18450868..f6afe5bf 100644 --- a/mobject/value_tracker.py +++ b/manimlib/mobject/value_tracker.py @@ -1,8 +1,7 @@ - import numpy as np -from mobject.mobject import Mobject -from utils.bezier import interpolate +from manimlib.mobject.mobject import Mobject +from manimlib.utils.bezier import interpolate class ValueTracker(Mobject): diff --git a/once_useful_constructs/NOTE.md b/manimlib/once_useful_constructs/NOTE.md similarity index 100% rename from once_useful_constructs/NOTE.md rename to manimlib/once_useful_constructs/NOTE.md diff --git a/once_useful_constructs/arithmetic.py b/manimlib/once_useful_constructs/arithmetic.py similarity index 94% rename from once_useful_constructs/arithmetic.py rename to manimlib/once_useful_constructs/arithmetic.py index 1f85b582..dac1f428 100644 --- a/once_useful_constructs/arithmetic.py +++ b/manimlib/once_useful_constructs/arithmetic.py @@ -1,9 +1,9 @@ import numpy as np -from animation.animation import Animation -from constants import * -from mobject.svg.tex_mobject import TexMobject -from scene.scene import Scene +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.scene.scene import Scene class RearrangeEquation(Scene): diff --git a/once_useful_constructs/combinatorics.py b/manimlib/once_useful_constructs/combinatorics.py similarity index 95% rename from once_useful_constructs/combinatorics.py rename to manimlib/once_useful_constructs/combinatorics.py index 88a300b3..2e56f667 100644 --- a/once_useful_constructs/combinatorics.py +++ b/manimlib/once_useful_constructs/combinatorics.py @@ -1,11 +1,9 @@ -from constants import * - -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VMobject, VGroup -from mobject.numbers import Integer - -from scene.scene import Scene -from utils.simple_functions import choose +from manimlib.constants import * +from manimlib.mobject.numbers import Integer +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VMobject, VGroup +from manimlib.scene.scene import Scene +from manimlib.utils.simple_functions import choose DEFAULT_COUNT_NUM_OFFSET = (FRAME_X_RADIUS - 1, FRAME_Y_RADIUS - 1, 0) diff --git a/once_useful_constructs/complex_transformation_scene.py b/manimlib/once_useful_constructs/complex_transformation_scene.py similarity index 93% rename from once_useful_constructs/complex_transformation_scene.py rename to manimlib/once_useful_constructs/complex_transformation_scene.py index e738e429..b6b88208 100644 --- a/once_useful_constructs/complex_transformation_scene.py +++ b/manimlib/once_useful_constructs/complex_transformation_scene.py @@ -1,12 +1,10 @@ -from constants import * - -from animation.animation import Animation -# from animation.movement import SmoothedVectorizedHomotopy -from animation.movement import ComplexHomotopy -from animation.transform import MoveToTarget -from mobject.coordinate_systems import ComplexPlane -from mobject.types.vectorized_mobject import VGroup -from scene.scene import Scene +from manimlib.animation.animation import Animation +from manimlib.animation.movement import ComplexHomotopy +from manimlib.animation.transform import MoveToTarget +from manimlib.constants import * +from manimlib.mobject.coordinate_systems import ComplexPlane +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene # TODO, refactor this full scene diff --git a/once_useful_constructs/counting.py b/manimlib/once_useful_constructs/counting.py similarity index 93% rename from once_useful_constructs/counting.py rename to manimlib/once_useful_constructs/counting.py index ac008085..ecc36254 100644 --- a/once_useful_constructs/counting.py +++ b/manimlib/once_useful_constructs/counting.py @@ -1,16 +1,14 @@ -from constants import * - -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VGroup - -from animation.creation import ShowCreation -from animation.creation import FadeIn -from animation.transform import MoveToTarget -from animation.transform import Transform -from mobject.geometry import Arrow -from mobject.geometry import Circle -from mobject.geometry import Dot -from scene.scene import Scene +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import ShowCreation +from manimlib.animation.transform import MoveToTarget +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Dot +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene class CountingScene(Scene): diff --git a/once_useful_constructs/fractals.py b/manimlib/once_useful_constructs/fractals.py similarity index 95% rename from once_useful_constructs/fractals.py rename to manimlib/once_useful_constructs/fractals.py index a4e33851..8b71fad8 100644 --- a/once_useful_constructs/fractals.py +++ b/manimlib/once_useful_constructs/fractals.py @@ -1,22 +1,22 @@ -from for_3b1b_videos.pi_creature import PiCreature -from for_3b1b_videos.pi_creature import Randolph -from for_3b1b_videos.pi_creature import get_all_pi_creature_modes -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.geometry import Circle -from mobject.geometry import Polygon -from mobject.geometry import RegularPolygon -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.config_ops import digest_config -from utils.space_ops import center_of_mass -from utils.space_ops import compass_directions -from utils.space_ops import rotate_vector -from utils.space_ops import rotation_matrix - -from constants import * from functools import reduce +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_creature import PiCreature +from manimlib.for_3b1b_videos.pi_creature import Randolph +from manimlib.for_3b1b_videos.pi_creature import get_all_pi_creature_modes +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Polygon +from manimlib.mobject.geometry import RegularPolygon +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import center_of_mass +from manimlib.utils.space_ops import compass_directions +from manimlib.utils.space_ops import rotate_vector +from manimlib.utils.space_ops import rotation_matrix + def rotate(points, angle=np.pi, axis=OUT): if axis is None: diff --git a/once_useful_constructs/graph_theory.py b/manimlib/once_useful_constructs/graph_theory.py similarity index 98% rename from once_useful_constructs/graph_theory.py rename to manimlib/once_useful_constructs/graph_theory.py index 0fb9650f..775b2286 100644 --- a/once_useful_constructs/graph_theory.py +++ b/manimlib/once_useful_constructs/graph_theory.py @@ -1,13 +1,13 @@ +from functools import reduce import itertools as it -import numpy as np import operator as op -from constants import * +import numpy as np -from scene.scene import Scene -from utils.rate_functions import there_and_back -from utils.space_ops import center_of_mass -from functools import reduce +from manimlib.constants import * +from manimlib.scene.scene import Scene +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.space_ops import center_of_mass class Graph(): diff --git a/once_useful_constructs/light.py b/manimlib/once_useful_constructs/light.py similarity index 95% rename from once_useful_constructs/light.py rename to manimlib/once_useful_constructs/light.py index f3694613..7294f097 100644 --- a/once_useful_constructs/light.py +++ b/manimlib/once_useful_constructs/light.py @@ -1,26 +1,23 @@ -from constants import * - -from mobject.geometry import AnnularSector -from mobject.geometry import Annulus -from mobject.mobject import Mobject -from mobject.svg.svg_mobject import SVGMobject -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VectorizedPoint - -from continual_animation.continual_animation import ContinualAnimation - -from animation.composition import LaggedStart -from animation.transform import Transform -from animation.creation import FadeIn -from animation.creation import FadeOut - -from utils.space_ops import angle_between_vectors -from utils.space_ops import project_along_vector -from utils.space_ops import rotate_vector -from utils.space_ops import z_to_vector +from traceback import * from scipy.spatial import ConvexHull -from traceback import * + +from manimlib.animation.composition import LaggedStart +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import FadeOut +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.continual_animation.continual_animation import ContinualAnimation +from manimlib.mobject.geometry import AnnularSector +from manimlib.mobject.geometry import Annulus +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.space_ops import angle_between_vectors +from manimlib.utils.space_ops import project_along_vector +from manimlib.utils.space_ops import rotate_vector +from manimlib.utils.space_ops import z_to_vector LIGHT_COLOR = YELLOW SHADOW_COLOR = BLACK diff --git a/once_useful_constructs/matrix_multiplication.py b/manimlib/once_useful_constructs/matrix_multiplication.py similarity index 89% rename from once_useful_constructs/matrix_multiplication.py rename to manimlib/once_useful_constructs/matrix_multiplication.py index 367f7bb8..26534951 100644 --- a/once_useful_constructs/matrix_multiplication.py +++ b/manimlib/once_useful_constructs/matrix_multiplication.py @@ -1,17 +1,16 @@ import numpy as np -from constants import * - -from animation.creation import ShowCreation -from animation.transform import ApplyMethod -from animation.creation import FadeOut -from animation.transform import Transform -from mobject.matrix import Matrix -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VGroup -from scene.scene import Scene -from mobject.geometry import Circle -from mobject.geometry import Line +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import ShowCreation +from manimlib.animation.transform import ApplyMethod +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Line +from manimlib.mobject.matrix import Matrix +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene class NumericalMatrixMultiplication(Scene): diff --git a/once_useful_constructs/region.py b/manimlib/once_useful_constructs/region.py similarity index 96% rename from once_useful_constructs/region.py rename to manimlib/once_useful_constructs/region.py index 2507f449..f2f8ae87 100644 --- a/once_useful_constructs/region.py +++ b/manimlib/once_useful_constructs/region.py @@ -1,10 +1,9 @@ -import itertools as it from copy import deepcopy +import itertools as it -from mobject.mobject import Mobject -from utils.iterables import adjacent_pairs - -from constants import * +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.utils.iterables import adjacent_pairs # Warning: This is all now pretty depricated, and should not be expected to work diff --git a/scene/__init__.py b/manimlib/scene/__init__.py similarity index 100% rename from scene/__init__.py rename to manimlib/scene/__init__.py diff --git a/scene/graph_scene.py b/manimlib/scene/graph_scene.py similarity index 95% rename from scene/graph_scene.py rename to manimlib/scene/graph_scene.py index dae98e83..5bdf93c1 100644 --- a/scene/graph_scene.py +++ b/manimlib/scene/graph_scene.py @@ -1,25 +1,23 @@ - - -from constants import * import itertools as it -from scene.scene import Scene -from animation.creation import Write, DrawBorderThenFill, ShowCreation -from animation.transform import Transform -from animation.update import UpdateFromAlphaFunc -from mobject.functions import ParametricFunction -from mobject.geometry import Line -from mobject.geometry import Rectangle -from mobject.geometry import RegularPolygon -from mobject.number_line import NumberLine -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VectorizedPoint -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.color import invert_color -from utils.space_ops import angle_of_vector +from manimlib.animation.creation import Write, DrawBorderThenFill, ShowCreation +from manimlib.animation.transform import Transform +from manimlib.animation.update import UpdateFromAlphaFunc +from manimlib.constants import * +from manimlib.mobject.functions import ParametricFunction +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import RegularPolygon +from manimlib.mobject.number_line import NumberLine +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.scene.scene import Scene +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.color import invert_color +from manimlib.utils.space_ops import angle_of_vector # TODO, this should probably reimplemented entirely, especially so as to # better reuse code from mobject/coordinate_systems diff --git a/manimlib/scene/media_dir.txt b/manimlib/scene/media_dir.txt new file mode 100644 index 00000000..27949aaf --- /dev/null +++ b/manimlib/scene/media_dir.txt @@ -0,0 +1 @@ +media \ No newline at end of file diff --git a/scene/moving_camera_scene.py b/manimlib/scene/moving_camera_scene.py similarity index 87% rename from scene/moving_camera_scene.py rename to manimlib/scene/moving_camera_scene.py index a0986d74..4fa23268 100644 --- a/scene/moving_camera_scene.py +++ b/manimlib/scene/moving_camera_scene.py @@ -1,8 +1,6 @@ - - -from scene.scene import Scene -from camera.moving_camera import MovingCamera -from utils.iterables import list_update +from manimlib.camera.moving_camera import MovingCamera +from manimlib.scene.scene import Scene +from manimlib.utils.iterables import list_update class MovingCameraScene(Scene): diff --git a/scene/reconfigurable_scene.py b/manimlib/scene/reconfigurable_scene.py similarity index 91% rename from scene/reconfigurable_scene.py rename to manimlib/scene/reconfigurable_scene.py index b12670fc..96e68d87 100644 --- a/scene/reconfigurable_scene.py +++ b/manimlib/scene/reconfigurable_scene.py @@ -1,10 +1,7 @@ - - -from scene.scene import Scene -from animation.transform import Transform -from mobject.mobject import Mobject - -from constants import * +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.scene.scene import Scene class ReconfigurableScene(Scene): diff --git a/scene/sample_space_scene.py b/manimlib/scene/sample_space_scene.py similarity index 92% rename from scene/sample_space_scene.py rename to manimlib/scene/sample_space_scene.py index b7479f7e..77161834 100644 --- a/scene/sample_space_scene.py +++ b/manimlib/scene/sample_space_scene.py @@ -1,15 +1,11 @@ - -from constants import * - -from .scene import Scene - -from animation.animation import Animation -from animation.transform import MoveToTarget -from animation.transform import Transform -from animation.update import UpdateFromFunc - -from mobject.types.vectorized_mobject import VGroup -from mobject.probability import SampleSpace +from manimlib.animation.animation import Animation +from manimlib.animation.transform import MoveToTarget +from manimlib.animation.transform import Transform +from manimlib.animation.update import UpdateFromFunc +from manimlib.constants import * +from manimlib.scene.scene import Scene +from manimlib.mobject.probability import SampleSpace +from manimlib.mobject.types.vectorized_mobject import VGroup class SampleSpaceScene(Scene): diff --git a/scene/scene.py b/manimlib/scene/scene.py similarity index 96% rename from scene/scene.py rename to manimlib/scene/scene.py index cff2df29..53b611b7 100644 --- a/scene/scene.py +++ b/manimlib/scene/scene.py @@ -1,37 +1,30 @@ - +from time import sleep +import _thread as thread +import datetime import inspect import itertools as it -import numpy as np import os import random import shutil import subprocess as sp import warnings -from time import sleep -try: - import thread # Low-level threading API (Python 2.7) -except ImportError: - import _thread as thread # Low-level threading API (Python 3.x) from tqdm import tqdm as ProgressDisplay +import numpy as np -from constants import * - -from animation.animation import Animation -from animation.transform import MoveToTarget, ApplyMethod -from camera.camera import Camera -from continual_animation.continual_animation import ContinualAnimation -from mobject.mobject import Mobject -from utils.iterables import list_update -from utils.output_directory_getters import add_extension_if_not_present -from utils.output_directory_getters import get_movie_output_directory -from utils.output_directory_getters import get_image_output_directory - -from container.container import Container - -from mobject.svg.tex_mobject import TextMobject -from animation.creation import Write -import datetime +from manimlib.animation.animation import Animation +from manimlib.animation.creation import Write +from manimlib.animation.transform import MoveToTarget, ApplyMethod +from manimlib.camera.camera import Camera +from manimlib.constants import * +from manimlib.container.container import Container +from manimlib.continual_animation.continual_animation import ContinualAnimation +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.utils.iterables import list_update +from manimlib.utils.output_directory_getters import add_extension_if_not_present +from manimlib.utils.output_directory_getters import get_image_output_directory +from manimlib.utils.output_directory_getters import get_movie_output_directory class Scene(Container): CONFIG = { diff --git a/scene/scene_from_video.py b/manimlib/scene/scene_from_video.py similarity index 97% rename from scene/scene_from_video.py rename to manimlib/scene/scene_from_video.py index 64334def..72a78ec5 100644 --- a/scene/scene_from_video.py +++ b/manimlib/scene/scene_from_video.py @@ -1,11 +1,7 @@ - - - +from tqdm import tqdm as show_progress import cv2 -from tqdm import tqdm as show_progress - -from scene.scene import Scene +from manimlib.scene.scene import Scene class SceneFromVideo(Scene): diff --git a/scene/three_d_scene.py b/manimlib/scene/three_d_scene.py similarity index 92% rename from scene/three_d_scene.py rename to manimlib/scene/three_d_scene.py index 430de9fa..b0ba826f 100644 --- a/scene/three_d_scene.py +++ b/manimlib/scene/three_d_scene.py @@ -1,9 +1,8 @@ -from constants import * - -from continual_animation.update import ContinualGrowValue -from animation.transform import ApplyMethod -from camera.three_d_camera import ThreeDCamera -from scene.scene import Scene +from manimlib.animation.transform import ApplyMethod +from manimlib.camera.three_d_camera import ThreeDCamera +from manimlib.constants import * +from manimlib.continual_animation.update import ContinualGrowValue +from manimlib.scene.scene import Scene class ThreeDScene(Scene): diff --git a/scene/vector_space_scene.py b/manimlib/scene/vector_space_scene.py similarity index 91% rename from scene/vector_space_scene.py rename to manimlib/scene/vector_space_scene.py index 6b210e39..bba83f15 100644 --- a/scene/vector_space_scene.py +++ b/manimlib/scene/vector_space_scene.py @@ -1,38 +1,34 @@ - - import numpy as np -from constants import * - -from animation.animation import Animation -from animation.creation import ShowCreation -from animation.creation import Write -from animation.transform import ApplyFunction -from animation.transform import ApplyPointwiseFunction -from animation.creation import FadeOut -from animation.creation import GrowArrow -from animation.transform import Transform -from mobject.mobject import Mobject -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from scene.scene import Scene -from mobject.geometry import Arrow -from mobject.geometry import Dot -from mobject.geometry import Line -from mobject.geometry import Rectangle -from mobject.geometry import Vector -from mobject.coordinate_systems import Axes -from mobject.coordinate_systems import NumberPlane - -from mobject.matrix import Matrix -from mobject.matrix import VECTOR_LABEL_SCALE_FACTOR -from mobject.matrix import vector_coordinate_label -from utils.rate_functions import rush_from -from utils.rate_functions import rush_into -from utils.space_ops import angle_of_vector -from utils.space_ops import get_norm +from manimlib.animation.animation import Animation +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import GrowArrow +from manimlib.animation.creation import ShowCreation +from manimlib.animation.creation import Write +from manimlib.animation.transform import ApplyFunction +from manimlib.animation.transform import ApplyPointwiseFunction +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.coordinate_systems import Axes +from manimlib.mobject.coordinate_systems import NumberPlane +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Dot +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import Vector +from manimlib.mobject.matrix import Matrix +from manimlib.mobject.matrix import VECTOR_LABEL_SCALE_FACTOR +from manimlib.mobject.matrix import vector_coordinate_label +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.scene.scene import Scene +from manimlib.utils.rate_functions import rush_from +from manimlib.utils.rate_functions import rush_into +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import get_norm X_COLOR = GREEN_C Y_COLOR = RED_C diff --git a/scene/zoomed_scene.py b/manimlib/scene/zoomed_scene.py similarity index 89% rename from scene/zoomed_scene.py rename to manimlib/scene/zoomed_scene.py index 3bc763b6..b0065dd5 100644 --- a/scene/zoomed_scene.py +++ b/manimlib/scene/zoomed_scene.py @@ -1,13 +1,10 @@ - - -from scene.moving_camera_scene import MovingCameraScene -from camera.moving_camera import MovingCamera -from camera.multi_camera import MultiCamera -from mobject.types.image_mobject import ImageMobjectFromCamera -from utils.simple_functions import fdiv - -from constants import * -from animation.transform import ApplyMethod +from manimlib.animation.transform import ApplyMethod +from manimlib.camera.moving_camera import MovingCamera +from manimlib.camera.multi_camera import MultiCamera +from manimlib.constants import * +from manimlib.mobject.types.image_mobject import ImageMobjectFromCamera +from manimlib.scene.moving_camera_scene import MovingCameraScene +from manimlib.utils.simple_functions import fdiv # Note, any scenes from old videos using ZoomedScene will almost certainly # break, as it was restructured. diff --git a/stage_scenes.py b/manimlib/stage_scenes.py similarity index 86% rename from stage_scenes.py rename to manimlib/stage_scenes.py index d47f1b27..23e0283f 100644 --- a/stage_scenes.py +++ b/manimlib/stage_scenes.py @@ -1,14 +1,12 @@ - - import inspect import os import sys -from constants import PRODUCTION_QUALITY_CAMERA_CONFIG -from constants import PRODUCTION_QUALITY_FRAME_DURATION -from extract_scene import get_module -from extract_scene import is_scene -from utils.output_directory_getters import get_movie_output_directory +from manimlib.constants import PRODUCTION_QUALITY_CAMERA_CONFIG +from manimlib.constants import PRODUCTION_QUALITY_FRAME_DURATION +from manimlib.extract_scene import get_module +from manimlib.extract_scene import is_scene +from manimlib.utils.output_directory_getters import get_movie_output_directory def get_sorted_scene_classes(module_name): diff --git a/stream_starter.py b/manimlib/stream_starter.py similarity index 73% rename from stream_starter.py rename to manimlib/stream_starter.py index 709faf88..f3477baa 100644 --- a/stream_starter.py +++ b/manimlib/stream_starter.py @@ -1,18 +1,19 @@ -from scene.scene import Scene from time import sleep import code -import constants import os import readline import subprocess +from manimlib.scene.scene import Scene +import manimlib.constants + def start_livestream(to_twitch=False, twitch_key=None): class Manim(): def __new__(cls): kwargs = { - "scene_name": constants.LIVE_STREAM_NAME, + "scene_name": manimlib.constants.LIVE_STREAM_NAME, "open_video_upon_completion": False, "show_file_in_finder": False, # By default, write to file @@ -25,12 +26,12 @@ def start_livestream(to_twitch=False, twitch_key=None): "quiet": True, "ignore_waits": False, "write_all": False, - "name": constants.LIVE_STREAM_NAME, + "name": manimlib.constants.LIVE_STREAM_NAME, "start_at_animation_number": 0, "end_at_animation_number": None, "skip_animations": False, - "camera_config": constants.HIGH_QUALITY_CAMERA_CONFIG, - "frame_duration": constants.MEDIUM_QUALITY_FRAME_DURATION, + "camera_config": manimlib.constants.HIGH_QUALITY_CAMERA_CONFIG, + "frame_duration": manimlib.constants.MEDIUM_QUALITY_FRAME_DURATION, "livestreaming": True, "to_twitch": to_twitch, "twitch_key": twitch_key, @@ -40,7 +41,7 @@ def start_livestream(to_twitch=False, twitch_key=None): if not to_twitch: FNULL = open(os.devnull, 'w') subprocess.Popen( - [constants.STREAMING_CLIENT, constants.STREAMING_URL], + [manimlib.constants.STREAMING_CLIENT, manimlib.constants.STREAMING_URL], stdout=FNULL, stderr=FNULL) sleep(3) @@ -50,4 +51,4 @@ def start_livestream(to_twitch=False, twitch_key=None): shell = code.InteractiveConsole(variables) shell.push("manim = Manim()") shell.push("from big_ol_pile_of_manim_imports import *") - shell.interact(banner=constants.STREAMING_CONSOLE_BANNER) + shell.interact(banner=manimlib.constants.STREAMING_CONSOLE_BANNER) diff --git a/tex_template.tex b/manimlib/tex_template.tex similarity index 100% rename from tex_template.tex rename to manimlib/tex_template.tex diff --git a/mobject/svg/__init__.py b/manimlib/utils/__init__.py similarity index 100% rename from mobject/svg/__init__.py rename to manimlib/utils/__init__.py diff --git a/utils/bezier.py b/manimlib/utils/bezier.py similarity index 97% rename from utils/bezier.py rename to manimlib/utils/bezier.py index f61c47e5..197f5606 100644 --- a/utils/bezier.py +++ b/manimlib/utils/bezier.py @@ -1,8 +1,8 @@ +from scipy import linalg import numpy as np -from scipy import linalg -from utils.simple_functions import choose_using_cache -from utils.space_ops import get_norm +from manimlib.utils.simple_functions import choose_using_cache +from manimlib.utils.space_ops import get_norm CLOSED_THRESHOLD = 0.001 diff --git a/utils/color.py b/manimlib/utils/color.py similarity index 91% rename from utils/color.py rename to manimlib/utils/color.py index 4625fa45..1a5a229b 100644 --- a/utils/color.py +++ b/manimlib/utils/color.py @@ -1,13 +1,13 @@ -import numpy as np import random from colour import Color -from constants import WHITE -from constants import PALETTE +import numpy as np -from utils.bezier import interpolate -from utils.space_ops import normalize -from utils.simple_functions import clip_in_place +from manimlib.constants import PALETTE +from manimlib.constants import WHITE +from manimlib.utils.bezier import interpolate +from manimlib.utils.simple_functions import clip_in_place +from manimlib.utils.space_ops import normalize def color_to_rgb(color): diff --git a/utils/config_ops.py b/manimlib/utils/config_ops.py similarity index 100% rename from utils/config_ops.py rename to manimlib/utils/config_ops.py index 0648fe7c..e58eb66b 100644 --- a/utils/config_ops.py +++ b/manimlib/utils/config_ops.py @@ -1,6 +1,6 @@ +from functools import reduce import inspect import operator as op -from functools import reduce def instantiate(obj): diff --git a/utils/images.py b/manimlib/utils/images.py similarity index 94% rename from utils/images.py rename to manimlib/utils/images.py index 38caf245..57d089b4 100644 --- a/utils/images.py +++ b/manimlib/utils/images.py @@ -2,7 +2,8 @@ import numpy as np import os from PIL import Image -from constants import RASTER_IMAGE_DIR + +from manimlib.constants import RASTER_IMAGE_DIR def get_full_raster_image_path(image_file_name): diff --git a/utils/iterables.py b/manimlib/utils/iterables.py similarity index 100% rename from utils/iterables.py rename to manimlib/utils/iterables.py diff --git a/utils/output_directory_getters.py b/manimlib/utils/output_directory_getters.py similarity index 93% rename from utils/output_directory_getters.py rename to manimlib/utils/output_directory_getters.py index bd05def9..8e8b46dd 100644 --- a/utils/output_directory_getters.py +++ b/manimlib/utils/output_directory_getters.py @@ -1,8 +1,8 @@ import inspect import os -from constants import THIS_DIR -from constants import VIDEO_DIR +from manimlib.constants import THIS_DIR +from manimlib.constants import VIDEO_DIR def add_extension_if_not_present(file_name, extension): diff --git a/utils/paths.py b/manimlib/utils/paths.py similarity index 87% rename from utils/paths.py rename to manimlib/utils/paths.py index b45faa9a..8bc9cca1 100644 --- a/utils/paths.py +++ b/manimlib/utils/paths.py @@ -1,9 +1,9 @@ import numpy as np -from constants import OUT -from utils.bezier import interpolate -from utils.space_ops import rotation_matrix -from utils.space_ops import get_norm +from manimlib.constants import OUT +from manimlib.utils.bezier import interpolate +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import rotation_matrix STRAIGHT_PATH_THRESHOLD = 0.01 diff --git a/utils/rate_functions.py b/manimlib/utils/rate_functions.py similarity index 95% rename from utils/rate_functions.py rename to manimlib/utils/rate_functions.py index 5610319d..a5646f30 100644 --- a/utils/rate_functions.py +++ b/manimlib/utils/rate_functions.py @@ -1,7 +1,7 @@ import numpy as np -from utils.bezier import bezier -from utils.simple_functions import sigmoid +from manimlib.utils.bezier import bezier +from manimlib.utils.simple_functions import sigmoid def linear(t): diff --git a/utils/simple_functions.py b/manimlib/utils/simple_functions.py similarity index 100% rename from utils/simple_functions.py rename to manimlib/utils/simple_functions.py index 35ad2c97..2cd048f9 100644 --- a/utils/simple_functions.py +++ b/manimlib/utils/simple_functions.py @@ -1,7 +1,7 @@ +from functools import reduce +import inspect import numpy as np import operator as op -import inspect -from functools import reduce def sigmoid(x): diff --git a/utils/sounds.py b/manimlib/utils/sounds.py similarity index 100% rename from utils/sounds.py rename to manimlib/utils/sounds.py diff --git a/utils/space_ops.py b/manimlib/utils/space_ops.py similarity index 96% rename from utils/space_ops.py rename to manimlib/utils/space_ops.py index 2a1b604a..9b5af5bb 100644 --- a/utils/space_ops.py +++ b/manimlib/utils/space_ops.py @@ -1,11 +1,12 @@ +from functools import reduce + import numpy as np -from constants import OUT -from constants import RIGHT -from constants import PI -from constants import TAU -from functools import reduce -from utils.iterables import adjacent_pairs +from manimlib.constants import OUT +from manimlib.constants import PI +from manimlib.constants import RIGHT +from manimlib.constants import TAU +from manimlib.utils.iterables import adjacent_pairs def get_norm(vect): diff --git a/utils/strings.py b/manimlib/utils/strings.py similarity index 100% rename from utils/strings.py rename to manimlib/utils/strings.py index 6f1cb881..b986577d 100644 --- a/utils/strings.py +++ b/manimlib/utils/strings.py @@ -1,6 +1,6 @@ +import itertools as it import re import string -import itertools as it def to_camel_case(name): diff --git a/utils/tex_file_writing.py b/manimlib/utils/tex_file_writing.py similarity index 95% rename from utils/tex_file_writing.py rename to manimlib/utils/tex_file_writing.py index 81a9d42d..061f1957 100644 --- a/utils/tex_file_writing.py +++ b/manimlib/utils/tex_file_writing.py @@ -1,10 +1,9 @@ - import os import hashlib -from constants import TEX_DIR -from constants import TEX_TEXT_TO_REPLACE -from constants import TEX_USE_CTEX +from manimlib.constants import TEX_DIR +from manimlib.constants import TEX_TEXT_TO_REPLACE +from manimlib.constants import TEX_USE_CTEX def tex_hash(expression, template_tex_file_body): diff --git a/mobject/types/__init__.py b/mobject/types/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/once_useful_constructs/__init__.py b/once_useful_constructs/__init__.py deleted file mode 100644 index 6af61901..00000000 --- a/once_useful_constructs/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -import constants -import os -import importlib - -modules = filter( - lambda x: x.endswith(".py"), - os.listdir(constants.THIS_DIR + os.sep + "once_useful_constructs"), -) -modules = list(map( - lambda x: x[:x.find(".py")], - modules -)) -for m in modules: - if m == "__init__": - continue - else: - importlib.import_module("once_useful_constructs." + m, package="once_useful_constructs") - -for m in modules: - if m == "__init__": - continue - m = globals()[m] - module_dict = m.__dict__ - try: - to_import = m.__all__ - except AttributeError: - to_import = [name for name in module_dict if not name.startswith('_')] - globals().update({name: module_dict[name] for name in to_import}) diff --git a/utils/__init__.py b/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 From dca5c50fd6b4ca5834e9ce923a18a9eb3318250a Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Mon, 24 Dec 2018 12:49:10 -0800 Subject: [PATCH 02/10] support for inline scenes --- manimlib/config.py | 14 +++++++++++++- manimlib/extract_scene.py | 7 +------ manimlib/utils/output_directory_getters.py | 14 ++++++++------ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/manimlib/config.py b/manimlib/config.py index a53e2f59..7cef66f1 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -2,6 +2,7 @@ import argparse import colour import os import sys +import types import manimlib.constants @@ -70,6 +71,17 @@ def parse_cli(): sys.exit(2) +def get_module(file_name): + if file_name == "-": + module = types.ModuleType("InputModule") + code = "from big_ol_pile_of_manim_imports import *\n\n" + sys.stdin.read() + exec(code, module.__dict__) + return module + else: + module_name = file_name.replace(".py", "").replace(os.sep, ".") + return importlib.import_module(module_name) + + def get_configuration(args): if args.output_name is not None: output_name_root, output_name_ext = os.path.splitext( @@ -86,7 +98,7 @@ def get_configuration(args): output_name = args.output_name config = { - "file": args.file, + "module": get_module(args.file), "scene_name": args.scene_name, "open_video_upon_completion": args.preview, "show_file_in_finder": args.show_file_in_finder, diff --git a/manimlib/extract_scene.py b/manimlib/extract_scene.py index e85eaa78..428dea17 100644 --- a/manimlib/extract_scene.py +++ b/manimlib/extract_scene.py @@ -97,13 +97,8 @@ def get_scene_classes(scene_names_to_classes, config): return prompt_user_for_choice(scene_names_to_classes) -def get_module(file_name): - module_name = file_name.replace(".py", "").replace(os.sep, ".") - return importlib.import_module(module_name) - - def main(config): - module = get_module(config["file"]) + module = config["module"] scene_names_to_classes = dict(inspect.getmembers(module, is_scene)) scene_kwargs = dict([ diff --git a/manimlib/utils/output_directory_getters.py b/manimlib/utils/output_directory_getters.py index 8e8b46dd..972bc2cd 100644 --- a/manimlib/utils/output_directory_getters.py +++ b/manimlib/utils/output_directory_getters.py @@ -20,12 +20,14 @@ def guarantee_existance(path): def get_scene_output_directory(scene_class): - file_path = os.path.abspath(inspect.getfile(scene_class)) - - file_path = os.path.relpath(file_path, THIS_DIR) - file_path = file_path.replace(".pyc", "") - file_path = file_path.replace(".py", "") - return guarantee_existance(os.path.join(VIDEO_DIR, file_path)) + try: + file_path = os.path.abspath(inspect.getfile(scene_class)) + file_path = os.path.relpath(file_path, THIS_DIR) + file_path = file_path.replace(".pyc", "") + file_path = file_path.replace(".py", "") + return guarantee_existance(os.path.join(VIDEO_DIR, file_path)) + except TypeError: + return guarantee_existance(os.path.join(VIDEO_DIR, "input_scenes")) def get_movie_output_directory(scene_class, camera_config, frame_duration): From e7aff666bd235426c05765549352abde43bc61d7 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Mon, 24 Dec 2018 13:28:43 -0800 Subject: [PATCH 03/10] import importlib, start streaming mode upon import --- manim.py | 19 +++++++++++-------- manimlib/config.py | 1 + 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manim.py b/manim.py index 45831bb3..dfcc45ff 100644 --- a/manim.py +++ b/manim.py @@ -3,12 +3,15 @@ import manimlib.config import manimlib.extract_scene import manimlib.stream_starter -args = manimlib.config.parse_cli() -if not args.livestream: - config = manimlib.config.get_configuration(args) - manimlib.extract_scene.main(config) +if __name__ == "__main__": + args = manimlib.config.parse_cli() + if not args.livestream: + config = manimlib.config.get_configuration(args) + manimlib.extract_scene.main(config) + else: + manimlib.stream_starter.start_livestream( + to_twitch=args.to_twitch, + twitch_key=args.twitch_key, + ) else: - manimlib.stream_starter.start_livestream( - to_twitch=args.to_twitch, - twitch_key=args.twitch_key, - ) + manimlib.stream_starter.start_livestream() diff --git a/manimlib/config.py b/manimlib/config.py index 7cef66f1..ee5857c4 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -1,5 +1,6 @@ import argparse import colour +import importlib import os import sys import types From 2942485e4c8711201a329f10e73655482d16bc4b Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Tue, 25 Dec 2018 19:51:03 -0800 Subject: [PATCH 04/10] add error codes to exits --- manimlib/config.py | 8 ++++++-- manimlib/extract_scene.py | 15 ++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/manimlib/config.py b/manimlib/config.py index ee5857c4..a95ca9ff 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -76,8 +76,12 @@ def get_module(file_name): if file_name == "-": module = types.ModuleType("InputModule") code = "from big_ol_pile_of_manim_imports import *\n\n" + sys.stdin.read() - exec(code, module.__dict__) - return module + try: + exec(code, module.__dict__) + return module + except Exception as e: + print(f"Failed to render scene: {str(e)}") + sys.exit(2) else: module_name = file_name.replace(".py", "").replace(os.sep, ".") return importlib.import_module(module_name) diff --git a/manimlib/extract_scene.py b/manimlib/extract_scene.py index 428dea17..8fc0d281 100644 --- a/manimlib/extract_scene.py +++ b/manimlib/extract_scene.py @@ -49,13 +49,15 @@ def handle_scene(scene, **config): sys.stdout = curr_stdout -def is_scene(obj): +def is_child_scene(obj, module): if not inspect.isclass(obj): return False if not issubclass(obj, Scene): return False if obj == Scene: return False + if not obj.__module__.startswith(module.__name__): + return False return True @@ -73,20 +75,20 @@ def prompt_user_for_choice(name_to_obj): ] except KeyError: print(manimlib.constants.INVALID_NUMBER_MESSAGE) - sys.exit() + sys.exit(2) user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) return [ name_to_obj[num_to_name[int(num_str)]] for num_str in user_input.split(",") ] + except EOFError: + sys.exit(1) def get_scene_classes(scene_names_to_classes, config): if len(scene_names_to_classes) == 0: print(manimlib.constants.NO_SCENE_MESSAGE) return [] - if len(scene_names_to_classes) == 1: - return list(scene_names_to_classes.values()) if config["scene_name"] in scene_names_to_classes: return [scene_names_to_classes[config["scene_name"]]] if config["scene_name"] != "": @@ -99,7 +101,8 @@ def get_scene_classes(scene_names_to_classes, config): def main(config): module = config["module"] - scene_names_to_classes = dict(inspect.getmembers(module, is_scene)) + scene_names_to_classes = dict( + inspect.getmembers(module, lambda x: is_child_scene(x, module))) scene_kwargs = dict([ (key, config[key]) @@ -125,11 +128,13 @@ def main(config): try: handle_scene(SceneClass(**scene_kwargs), **config) play_finish_sound() + sys.exit(0) except Exception: print("\n\n") traceback.print_exc() print("\n\n") play_error_sound() + sys.exit(2) if __name__ == "__main__": From 3543a750bae39a76384859b06e67f17521a4abc7 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Mon, 24 Dec 2018 12:37:51 -0800 Subject: [PATCH 05/10] move library code into manimlib, replace relative imports with absolute imports --- big_ol_pile_of_manim_imports.py | 146 +++++++++--------- example.png | Bin 35767 -> 0 bytes files/Bubbles_speech.svg | 11 -- files/Bubbles_thought.svg | 18 --- files/PiCreatures_plain.svg | 24 --- manim.py | 14 +- __init__.py => manimlib/animation/__init__.py | 0 .../animation}/animation.py | 13 +- .../animation}/composition.py | 22 ++- {animation => manimlib/animation}/creation.py | 25 ++- .../animation}/indication.py | 40 +++-- {animation => manimlib/animation}/movement.py | 7 +- {animation => manimlib/animation}/numbers.py | 7 +- {animation => manimlib/animation}/rotation.py | 11 +- .../animation}/specialized.py | 19 +-- .../animation}/transform.py | 28 ++-- {animation => manimlib/animation}/update.py | 9 +- {animation => manimlib/camera}/__init__.py | 0 {camera => manimlib/camera}/camera.py | 35 ++--- {camera => manimlib/camera}/mapping_camera.py | 10 +- {camera => manimlib/camera}/moving_camera.py | 21 ++- {camera => manimlib/camera}/multi_camera.py | 6 +- {camera => manimlib/camera}/three_d_camera.py | 33 ++-- config.py => manimlib/config.py | 16 +- constants.py => manimlib/constants.py | 2 +- {container => manimlib/container}/__init__.py | 0 .../container}/container.py | 2 +- .../continual_animation}/__init__.py | 0 .../continual_animation.py | 10 +- .../continual_animation}/from_animation.py | 2 +- .../continual_animation}/numbers.py | 4 +- .../continual_animation}/update.py | 6 +- .../ctex_template.tex | 0 extract_scene.py => manimlib/extract_scene.py | 20 ++- .../for_3b1b_videos}/common_scenes.py | 51 +++--- .../for_3b1b_videos}/pi_class.py | 8 +- .../for_3b1b_videos}/pi_creature.py | 30 ++-- .../pi_creature_animations.py | 34 ++-- .../for_3b1b_videos}/pi_creature_scene.py | 42 +++-- manimlib/media_dir.txt | 1 + .../mobject}/__init__.py | 0 .../mobject}/coordinate_systems.py | 23 ++- {mobject => manimlib/mobject}/frame.py | 8 +- {mobject => manimlib/mobject}/functions.py | 9 +- {mobject => manimlib/mobject}/geometry.py | 30 ++-- {mobject => manimlib/mobject}/matrix.py | 19 +-- {mobject => manimlib/mobject}/mobject.py | 32 ++-- {mobject => manimlib/mobject}/number_line.py | 25 ++- {mobject => manimlib/mobject}/numbers.py | 7 +- {mobject => manimlib/mobject}/probability.py | 24 ++- .../mobject}/shape_matchers.py | 17 +- .../mobject/svg}/__init__.py | 0 {mobject => manimlib/mobject}/svg/brace.py | 21 ++- {mobject => manimlib/mobject}/svg/drawings.py | 50 +++--- .../mobject}/svg/svg_mobject.py | 20 +-- .../mobject}/svg/tex_mobject.py | 25 ++- .../mobject}/three_d_shading_utils.py | 4 +- .../mobject}/three_d_utils.py | 8 +- .../mobject}/three_dimensions.py | 16 +- .../mobject/types}/__init__.py | 0 .../mobject}/types/image_mobject.py | 17 +- .../mobject}/types/point_cloud_mobject.py | 21 ++- .../mobject}/types/vectorized_mobject.py | 28 ++-- {mobject => manimlib/mobject}/updater.py | 0 .../mobject}/value_tracker.py | 5 +- .../once_useful_constructs}/NOTE.md | 0 .../once_useful_constructs}/arithmetic.py | 8 +- .../once_useful_constructs}/combinatorics.py | 14 +- .../complex_transformation_scene.py | 16 +- .../once_useful_constructs}/counting.py | 24 ++- .../once_useful_constructs}/fractals.py | 34 ++-- .../once_useful_constructs}/graph_theory.py | 12 +- .../once_useful_constructs}/light.py | 39 +++-- .../matrix_multiplication.py | 23 ++- .../once_useful_constructs}/region.py | 9 +- {scene => manimlib/scene}/__init__.py | 0 {scene => manimlib/scene}/graph_scene.py | 38 +++-- manimlib/scene/media_dir.txt | 1 + .../scene}/moving_camera_scene.py | 8 +- .../scene}/reconfigurable_scene.py | 11 +- .../scene}/sample_space_scene.py | 20 +-- {scene => manimlib/scene}/scene.py | 41 ++--- {scene => manimlib/scene}/scene_from_video.py | 8 +- {scene => manimlib/scene}/three_d_scene.py | 26 ++-- .../scene}/vector_space_scene.py | 62 ++++---- {scene => manimlib/scene}/zoomed_scene.py | 17 +- stage_scenes.py => manimlib/stage_scenes.py | 12 +- .../stream_starter.py | 17 +- tex_template.tex => manimlib/tex_template.tex | 0 {mobject/svg => manimlib/utils}/__init__.py | 0 {utils => manimlib/utils}/bezier.py | 6 +- {utils => manimlib/utils}/color.py | 12 +- {utils => manimlib/utils}/config_ops.py | 2 +- {utils => manimlib/utils}/images.py | 3 +- {utils => manimlib/utils}/iterables.py | 0 .../utils}/output_directory_getters.py | 4 +- {utils => manimlib/utils}/paths.py | 8 +- {utils => manimlib/utils}/rate_functions.py | 4 +- {utils => manimlib/utils}/simple_functions.py | 4 +- {utils => manimlib/utils}/sounds.py | 0 {utils => manimlib/utils}/space_ops.py | 13 +- {utils => manimlib/utils}/strings.py | 2 +- {utils => manimlib/utils}/tex_file_writing.py | 7 +- mobject/types/__init__.py | 0 once_useful_constructs/__init__.py | 28 ---- utils/__init__.py | 0 106 files changed, 728 insertions(+), 941 deletions(-) delete mode 100644 example.png delete mode 100644 files/Bubbles_speech.svg delete mode 100644 files/Bubbles_thought.svg delete mode 100644 files/PiCreatures_plain.svg rename __init__.py => manimlib/animation/__init__.py (100%) rename {animation => manimlib/animation}/animation.py (94%) rename {animation => manimlib/animation}/composition.py (96%) rename {animation => manimlib/animation}/creation.py (92%) rename {animation => manimlib/animation}/indication.py (87%) rename {animation => manimlib/animation}/movement.py (93%) rename {animation => manimlib/animation}/numbers.py (91%) rename {animation => manimlib/animation}/rotation.py (88%) rename {animation => manimlib/animation}/specialized.py (82%) rename {animation => manimlib/animation}/transform.py (93%) rename {animation => manimlib/animation}/update.py (90%) rename {animation => manimlib/camera}/__init__.py (100%) rename {camera => manimlib/camera}/camera.py (96%) rename {camera => manimlib/camera}/mapping_camera.py (95%) rename {camera => manimlib/camera}/moving_camera.py (86%) rename {camera => manimlib/camera}/multi_camera.py (94%) rename {camera => manimlib/camera}/three_d_camera.py (90%) rename config.py => manimlib/config.py (90%) rename constants.py => manimlib/constants.py (100%) rename {container => manimlib/container}/__init__.py (100%) rename {container => manimlib/container}/container.py (95%) rename {camera => manimlib/continual_animation}/__init__.py (100%) rename {continual_animation => manimlib/continual_animation}/continual_animation.py (92%) rename {continual_animation => manimlib/continual_animation}/from_animation.py (91%) rename {continual_animation => manimlib/continual_animation}/numbers.py (60%) rename {continual_animation => manimlib/continual_animation}/update.py (88%) rename ctex_template.tex => manimlib/ctex_template.tex (100%) rename extract_scene.py => manimlib/extract_scene.py (88%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/common_scenes.py (87%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_class.py (72%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_creature.py (94%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_creature_animations.py (83%) rename {for_3b1b_videos => manimlib/for_3b1b_videos}/pi_creature_scene.py (92%) create mode 100644 manimlib/media_dir.txt rename {continual_animation => manimlib/mobject}/__init__.py (100%) rename {mobject => manimlib/mobject}/coordinate_systems.py (96%) rename {mobject => manimlib/mobject}/frame.py (88%) rename {mobject => manimlib/mobject}/functions.py (89%) rename {mobject => manimlib/mobject}/geometry.py (97%) rename {mobject => manimlib/mobject}/matrix.py (92%) rename {mobject => manimlib/mobject}/mobject.py (97%) rename {mobject => manimlib/mobject}/number_line.py (90%) rename {mobject => manimlib/mobject}/numbers.py (96%) rename {mobject => manimlib/mobject}/probability.py (93%) rename {mobject => manimlib/mobject}/shape_matchers.py (84%) rename {for_3b1b_videos => manimlib/mobject/svg}/__init__.py (100%) rename {mobject => manimlib/mobject}/svg/brace.py (90%) rename {mobject => manimlib/mobject}/svg/drawings.py (96%) rename {mobject => manimlib/mobject}/svg/svg_mobject.py (96%) rename {mobject => manimlib/mobject}/svg/tex_mobject.py (95%) rename {mobject => manimlib/mobject}/three_d_shading_utils.py (93%) rename {mobject => manimlib/mobject}/three_d_utils.py (89%) rename {mobject => manimlib/mobject}/three_dimensions.py (93%) rename {mobject => manimlib/mobject/types}/__init__.py (100%) rename {mobject => manimlib/mobject}/types/image_mobject.py (91%) rename {mobject => manimlib/mobject}/types/point_cloud_mobject.py (94%) rename {mobject => manimlib/mobject}/types/vectorized_mobject.py (97%) rename {mobject => manimlib/mobject}/updater.py (100%) rename {mobject => manimlib/mobject}/value_tracker.py (93%) rename {once_useful_constructs => manimlib/once_useful_constructs}/NOTE.md (100%) rename {once_useful_constructs => manimlib/once_useful_constructs}/arithmetic.py (94%) rename {once_useful_constructs => manimlib/once_useful_constructs}/combinatorics.py (95%) rename {once_useful_constructs => manimlib/once_useful_constructs}/complex_transformation_scene.py (93%) rename {once_useful_constructs => manimlib/once_useful_constructs}/counting.py (93%) rename {once_useful_constructs => manimlib/once_useful_constructs}/fractals.py (95%) rename {once_useful_constructs => manimlib/once_useful_constructs}/graph_theory.py (98%) rename {once_useful_constructs => manimlib/once_useful_constructs}/light.py (95%) rename {once_useful_constructs => manimlib/once_useful_constructs}/matrix_multiplication.py (89%) rename {once_useful_constructs => manimlib/once_useful_constructs}/region.py (96%) rename {scene => manimlib/scene}/__init__.py (100%) rename {scene => manimlib/scene}/graph_scene.py (95%) create mode 100644 manimlib/scene/media_dir.txt rename {scene => manimlib/scene}/moving_camera_scene.py (87%) rename {scene => manimlib/scene}/reconfigurable_scene.py (91%) rename {scene => manimlib/scene}/sample_space_scene.py (92%) rename {scene => manimlib/scene}/scene.py (96%) rename {scene => manimlib/scene}/scene_from_video.py (97%) rename {scene => manimlib/scene}/three_d_scene.py (89%) rename {scene => manimlib/scene}/vector_space_scene.py (91%) rename {scene => manimlib/scene}/zoomed_scene.py (89%) rename stage_scenes.py => manimlib/stage_scenes.py (86%) rename stream_starter.py => manimlib/stream_starter.py (73%) rename tex_template.tex => manimlib/tex_template.tex (100%) rename {mobject/svg => manimlib/utils}/__init__.py (100%) rename {utils => manimlib/utils}/bezier.py (97%) rename {utils => manimlib/utils}/color.py (91%) rename {utils => manimlib/utils}/config_ops.py (100%) rename {utils => manimlib/utils}/images.py (94%) rename {utils => manimlib/utils}/iterables.py (100%) rename {utils => manimlib/utils}/output_directory_getters.py (93%) rename {utils => manimlib/utils}/paths.py (87%) rename {utils => manimlib/utils}/rate_functions.py (95%) rename {utils => manimlib/utils}/simple_functions.py (100%) rename {utils => manimlib/utils}/sounds.py (100%) rename {utils => manimlib/utils}/space_ops.py (96%) rename {utils => manimlib/utils}/strings.py (100%) rename {utils => manimlib/utils}/tex_file_writing.py (95%) delete mode 100644 mobject/types/__init__.py delete mode 100644 once_useful_constructs/__init__.py delete mode 100644 utils/__init__.py diff --git a/big_ol_pile_of_manim_imports.py b/big_ol_pile_of_manim_imports.py index ba8ee046..a4c43f3d 100644 --- a/big_ol_pile_of_manim_imports.py +++ b/big_ol_pile_of_manim_imports.py @@ -14,87 +14,87 @@ as a convenience for scripts creating scenes for videos. """ -from constants import * +from manimlib.constants import * -from animation.animation import * -from animation.composition import * -from animation.creation import * -from animation.indication import * -from animation.movement import * -from animation.numbers import * -from animation.rotation import * -from animation.specialized import * -from animation.transform import * -from animation.update import * +from manimlib.animation.animation import * +from manimlib.animation.composition import * +from manimlib.animation.creation import * +from manimlib.animation.indication import * +from manimlib.animation.movement import * +from manimlib.animation.numbers import * +from manimlib.animation.rotation import * +from manimlib.animation.specialized import * +from manimlib.animation.transform import * +from manimlib.animation.update import * -from camera.camera import * -from camera.mapping_camera import * -from camera.moving_camera import * -from camera.three_d_camera import * +from manimlib.camera.camera import * +from manimlib.camera.mapping_camera import * +from manimlib.camera.moving_camera import * +from manimlib.camera.three_d_camera import * -from continual_animation.continual_animation import * -from continual_animation.from_animation import * -from continual_animation.numbers import * -from continual_animation.update import * +from manimlib.continual_animation.continual_animation import * +from manimlib.continual_animation.from_animation import * +from manimlib.continual_animation.numbers import * +from manimlib.continual_animation.update import * -from mobject.coordinate_systems import * -from mobject.frame import * -from mobject.functions import * -from mobject.geometry import * -from mobject.matrix import * -from mobject.mobject import * -from mobject.number_line import * -from mobject.numbers import * -from mobject.probability import * -from mobject.shape_matchers import * -from mobject.svg.brace import * -from mobject.svg.drawings import * -from mobject.svg.svg_mobject import * -from mobject.svg.tex_mobject import * -from mobject.three_d_utils import * -from mobject.three_dimensions import * -from mobject.types.image_mobject import * -from mobject.types.point_cloud_mobject import * -from mobject.types.vectorized_mobject import * -from mobject.updater import * -from mobject.value_tracker import * +from manimlib.mobject.coordinate_systems import * +from manimlib.mobject.frame import * +from manimlib.mobject.functions import * +from manimlib.mobject.geometry import * +from manimlib.mobject.matrix import * +from manimlib.mobject.mobject import * +from manimlib.mobject.number_line import * +from manimlib.mobject.numbers import * +from manimlib.mobject.probability import * +from manimlib.mobject.shape_matchers import * +from manimlib.mobject.svg.brace import * +from manimlib.mobject.svg.drawings import * +from manimlib.mobject.svg.svg_mobject import * +from manimlib.mobject.svg.tex_mobject import * +from manimlib.mobject.three_d_utils import * +from manimlib.mobject.three_dimensions import * +from manimlib.mobject.types.image_mobject import * +from manimlib.mobject.types.point_cloud_mobject import * +from manimlib.mobject.types.vectorized_mobject import * +from manimlib.mobject.updater import * +from manimlib.mobject.value_tracker import * -from for_3b1b_videos.common_scenes import * -from for_3b1b_videos.pi_creature import * -from for_3b1b_videos.pi_creature_animations import * -from for_3b1b_videos.pi_creature_scene import * +from manimlib.for_3b1b_videos.common_scenes import * +from manimlib.for_3b1b_videos.pi_creature import * +from manimlib.for_3b1b_videos.pi_creature_animations import * +from manimlib.for_3b1b_videos.pi_creature_scene import * -from once_useful_constructs.arithmetic import * -from once_useful_constructs.combinatorics import * -from once_useful_constructs.complex_transformation_scene import * -from once_useful_constructs.counting import * -from once_useful_constructs.fractals import * -from once_useful_constructs.graph_theory import * -from once_useful_constructs.light import * +from manimlib.once_useful_constructs.arithmetic import * +from manimlib.once_useful_constructs.combinatorics import * +from manimlib.once_useful_constructs.complex_transformation_scene import * +from manimlib.once_useful_constructs.counting import * +from manimlib.once_useful_constructs.fractals import * +from manimlib.once_useful_constructs.graph_theory import * +from manimlib.once_useful_constructs.light import * -from scene.graph_scene import * -from scene.moving_camera_scene import * -from scene.reconfigurable_scene import * -from scene.scene import * -from scene.sample_space_scene import * -from scene.graph_scene import * -from scene.scene_from_video import * -from scene.three_d_scene import * -from scene.vector_space_scene import * -from scene.zoomed_scene import * +from manimlib.scene.graph_scene import * +from manimlib.scene.moving_camera_scene import * +from manimlib.scene.reconfigurable_scene import * +from manimlib.scene.scene import * +from manimlib.scene.sample_space_scene import * +from manimlib.scene.graph_scene import * +from manimlib.scene.scene_from_video import * +from manimlib.scene.three_d_scene import * +from manimlib.scene.vector_space_scene import * +from manimlib.scene.zoomed_scene import * -from utils.bezier import * -from utils.color import * -from utils.config_ops import * -from utils.images import * -from utils.iterables import * -from utils.output_directory_getters import * -from utils.paths import * -from utils.rate_functions import * -from utils.simple_functions import * -from utils.sounds import * -from utils.space_ops import * -from utils.strings import * +from manimlib.utils.bezier import * +from manimlib.utils.color import * +from manimlib.utils.config_ops import * +from manimlib.utils.images import * +from manimlib.utils.iterables import * +from manimlib.utils.output_directory_getters import * +from manimlib.utils.paths import * +from manimlib.utils.rate_functions import * +from manimlib.utils.simple_functions import * +from manimlib.utils.sounds import * +from manimlib.utils.space_ops import * +from manimlib.utils.strings import * # Non manim libraries that are also nice to have without thinking diff --git a/example.png b/example.png deleted file mode 100644 index f5887cd890d772364cd0ab01a48c0994466e0839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35767 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 - - - - - diff --git a/files/Bubbles_thought.svg b/files/Bubbles_thought.svg deleted file mode 100644 index c77ebca4..00000000 --- a/files/Bubbles_thought.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/files/PiCreatures_plain.svg b/files/PiCreatures_plain.svg deleted file mode 100644 index 552043d6..00000000 --- a/files/PiCreatures_plain.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/manim.py b/manim.py index c5c814d3..45831bb3 100644 --- a/manim.py +++ b/manim.py @@ -1,14 +1,14 @@ #!/usr/bin/env python -import config -import extract_scene -import stream_starter +import manimlib.config +import manimlib.extract_scene +import manimlib.stream_starter -args = config.parse_cli() +args = manimlib.config.parse_cli() if not args.livestream: - config = config.get_configuration(args) - extract_scene.main(config) + config = manimlib.config.get_configuration(args) + manimlib.extract_scene.main(config) else: - stream_starter.start_livestream( + manimlib.stream_starter.start_livestream( to_twitch=args.to_twitch, twitch_key=args.twitch_key, ) diff --git a/__init__.py b/manimlib/animation/__init__.py similarity index 100% rename from __init__.py rename to manimlib/animation/__init__.py diff --git a/animation/animation.py b/manimlib/animation/animation.py similarity index 94% rename from animation/animation.py rename to manimlib/animation/animation.py index 5797cacb..58625bca 100644 --- a/animation/animation.py +++ b/manimlib/animation/animation.py @@ -1,11 +1,12 @@ -import numpy as np from copy import deepcopy -from constants import * -from mobject.mobject import Mobject -from utils.rate_functions import smooth -from utils.config_ops import instantiate -from utils.config_ops import digest_config +import numpy as np + +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import instantiate +from manimlib.utils.rate_functions import smooth class Animation(object): diff --git a/animation/composition.py b/manimlib/animation/composition.py similarity index 96% rename from animation/composition.py rename to manimlib/animation/composition.py index d13d31f3..b5398e5a 100644 --- a/animation/composition.py +++ b/manimlib/animation/composition.py @@ -1,19 +1,15 @@ - - - import itertools as it -import numpy as np - -from constants import * - import warnings -from animation.animation import Animation -from mobject.mobject import Group -from mobject.mobject import Mobject -from utils.bezier import inverse_interpolate -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func +import numpy as np + +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.mobject.mobject import Group +from manimlib.mobject.mobject import Mobject +from manimlib.utils.bezier import inverse_interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func class EmptyAnimation(Animation): diff --git a/animation/creation.py b/manimlib/animation/creation.py similarity index 92% rename from animation/creation.py rename to manimlib/animation/creation.py index 23530d71..54ed21aa 100644 --- a/animation/creation.py +++ b/manimlib/animation/creation.py @@ -1,19 +1,16 @@ - - import numpy as np -from constants import * - -from animation.animation import Animation -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VectorizedPoint -from animation.transform import Transform -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.paths import counterclockwise_path -from utils.rate_functions import double_smooth -from utils.rate_functions import smooth +from manimlib.animation.animation import Animation +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.paths import counterclockwise_path +from manimlib.utils.rate_functions import double_smooth +from manimlib.utils.rate_functions import smooth # Drawing diff --git a/animation/indication.py b/manimlib/animation/indication.py similarity index 87% rename from animation/indication.py rename to manimlib/animation/indication.py index a97e5f13..adbe7f36 100644 --- a/animation/indication.py +++ b/manimlib/animation/indication.py @@ -1,27 +1,25 @@ - +from functools import reduce import numpy as np -from constants import * - -from animation.animation import Animation -from animation.movement import Homotopy -from animation.composition import AnimationGroup -from animation.composition import Succession -from animation.creation import ShowCreation -from animation.creation import ShowPartial -from animation.creation import FadeOut -from animation.transform import Transform -from mobject.mobject import Mobject -from mobject.geometry import Circle -from mobject.geometry import Dot -from mobject.shape_matchers import SurroundingRectangle -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back -from utils.rate_functions import wiggle -from functools import reduce +from manimlib.constants import * +from manimlib.animation.animation import Animation +from manimlib.animation.movement import Homotopy +from manimlib.animation.composition import AnimationGroup +from manimlib.animation.composition import Succession +from manimlib.animation.creation import ShowCreation +from manimlib.animation.creation import ShowPartial +from manimlib.animation.creation import FadeOut +from manimlib.animation.transform import Transform +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Dot +from manimlib.mobject.shape_matchers import SurroundingRectangle +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.rate_functions import wiggle class FocusOn(Transform): diff --git a/animation/movement.py b/manimlib/animation/movement.py similarity index 93% rename from animation/movement.py rename to manimlib/animation/movement.py index 097af71a..645ac603 100644 --- a/animation/movement.py +++ b/manimlib/animation/movement.py @@ -1,7 +1,6 @@ -from constants import * - -from animation.animation import Animation -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.utils.config_ops import digest_config class Homotopy(Animation): diff --git a/animation/numbers.py b/manimlib/animation/numbers.py similarity index 91% rename from animation/numbers.py rename to manimlib/animation/numbers.py index 44773d7b..3c6c2b5d 100644 --- a/animation/numbers.py +++ b/manimlib/animation/numbers.py @@ -1,7 +1,6 @@ - -from animation.animation import Animation -from utils.bezier import interpolate -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config class ChangingDecimal(Animation): diff --git a/animation/rotation.py b/manimlib/animation/rotation.py similarity index 88% rename from animation/rotation.py rename to manimlib/animation/rotation.py index 21b2898e..46b9921f 100644 --- a/animation/rotation.py +++ b/manimlib/animation/rotation.py @@ -1,12 +1,9 @@ - - import numpy as np -from constants import * - -from animation.animation import Animation -from animation.transform import Transform -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.utils.config_ops import digest_config class Rotating(Animation): diff --git a/animation/specialized.py b/manimlib/animation/specialized.py similarity index 82% rename from animation/specialized.py rename to manimlib/animation/specialized.py index 162f9df3..57f110e0 100644 --- a/animation/specialized.py +++ b/manimlib/animation/specialized.py @@ -1,16 +1,13 @@ - - import numpy as np -from constants import * - -from animation.transform import ApplyMethod -from animation.composition import LaggedStart -from mobject.svg.drawings import Car -from mobject.types.vectorized_mobject import VGroup -from mobject.geometry import Circle -from utils.config_ops import digest_config -from utils.space_ops import get_norm +from manimlib.animation.composition import LaggedStart +from manimlib.animation.transform import ApplyMethod +from manimlib.constants import * +from manimlib.mobject.geometry import Circle +from manimlib.mobject.svg.drawings import Car +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import get_norm class MoveCar(ApplyMethod): diff --git a/animation/transform.py b/manimlib/animation/transform.py similarity index 93% rename from animation/transform.py rename to manimlib/animation/transform.py index dff9bf8a..76c2f27c 100644 --- a/animation/transform.py +++ b/manimlib/animation/transform.py @@ -1,21 +1,19 @@ - - import inspect + import numpy as np -from constants import * - -from animation.animation import Animation -from mobject.mobject import Group -from mobject.mobject import Mobject -from utils.config_ops import digest_config -from utils.iterables import adjacent_pairs -from utils.paths import path_along_arc -from utils.paths import straight_path -from utils.config_ops import instantiate -from utils.rate_functions import smooth -from utils.rate_functions import squish_rate_func -from utils.space_ops import complex_to_R3 +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.mobject.mobject import Group +from manimlib.mobject.mobject import Mobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import instantiate +from manimlib.utils.iterables import adjacent_pairs +from manimlib.utils.paths import path_along_arc +from manimlib.utils.paths import straight_path +from manimlib.utils.rate_functions import smooth +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.space_ops import complex_to_R3 class Transform(Animation): diff --git a/animation/update.py b/manimlib/animation/update.py similarity index 90% rename from animation/update.py rename to manimlib/animation/update.py index ec5dfbd0..45b26f39 100644 --- a/animation/update.py +++ b/manimlib/animation/update.py @@ -1,9 +1,6 @@ - - -from constants import * - -from animation.animation import Animation -from utils.config_ops import digest_config +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.utils.config_ops import digest_config class UpdateFromFunc(Animation): diff --git a/animation/__init__.py b/manimlib/camera/__init__.py similarity index 100% rename from animation/__init__.py rename to manimlib/camera/__init__.py diff --git a/camera/camera.py b/manimlib/camera/camera.py similarity index 96% rename from camera/camera.py rename to manimlib/camera/camera.py index 37198bf0..519cea64 100644 --- a/camera/camera.py +++ b/manimlib/camera/camera.py @@ -1,30 +1,29 @@ +from functools import reduce import itertools as it -import numpy as np import operator as op - import time from PIL import Image from scipy.spatial.distance import pdist import cairo +import numpy as np -from constants import * -from mobject.types.image_mobject import AbstractImageMobject -from mobject.mobject import Mobject -from mobject.types.point_cloud_mobject import PMobject -from mobject.types.vectorized_mobject import VMobject -from utils.color import color_to_int_rgba -from utils.color import rgb_to_hex -from utils.config_ops import digest_config -from utils.images import get_full_raster_image_path -from utils.iterables import batch_by_property -from utils.iterables import list_difference_update -from utils.iterables import remove_list_redundancies -from utils.simple_functions import fdiv -from utils.space_ops import angle_of_vector -from utils.space_ops import get_norm -from functools import reduce +from manimlib.constants import * +from manimlib.mobject.types.image_mobject import AbstractImageMobject +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.types.point_cloud_mobject import PMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.color import color_to_int_rgba +from manimlib.utils.color import rgb_to_hex +from manimlib.utils.config_ops import digest_config +from manimlib.utils.images import get_full_raster_image_path +from manimlib.utils.iterables import batch_by_property +from manimlib.utils.iterables import list_difference_update +from manimlib.utils.iterables import remove_list_redundancies +from manimlib.utils.simple_functions import fdiv +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import get_norm class Camera(object): diff --git a/camera/mapping_camera.py b/manimlib/camera/mapping_camera.py similarity index 95% rename from camera/mapping_camera.py rename to manimlib/camera/mapping_camera.py index 8fec02ac..d7347d0c 100644 --- a/camera/mapping_camera.py +++ b/manimlib/camera/mapping_camera.py @@ -1,11 +1,9 @@ - - import numpy as np -from camera.camera import Camera -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import DictAsObject -from utils.config_ops import digest_config +from manimlib.camera.camera import Camera +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import DictAsObject +from manimlib.utils.config_ops import digest_config # TODO: Add an attribute to mobjects under which they can specify that they should just # map their centers but remain otherwise undistorted (useful for labels, etc.) diff --git a/camera/moving_camera.py b/manimlib/camera/moving_camera.py similarity index 86% rename from camera/moving_camera.py rename to manimlib/camera/moving_camera.py index 6b986d7a..4bf0fe64 100644 --- a/camera/moving_camera.py +++ b/manimlib/camera/moving_camera.py @@ -1,15 +1,12 @@ - - -from constants import FRAME_HEIGHT -from constants import FRAME_WIDTH -from constants import ORIGIN -from constants import WHITE - -from camera.camera import Camera -from mobject.frame import ScreenRectangle -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VectorizedPoint -from utils.config_ops import digest_config +from manimlib.camera.camera import Camera +from manimlib.constants import FRAME_HEIGHT +from manimlib.constants import FRAME_WIDTH +from manimlib.constants import ORIGIN +from manimlib.constants import WHITE +from manimlib.mobject.frame import ScreenRectangle +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.config_ops import digest_config # TODO, think about how to incorporate perspective diff --git a/camera/multi_camera.py b/manimlib/camera/multi_camera.py similarity index 94% rename from camera/multi_camera.py rename to manimlib/camera/multi_camera.py index 65780934..9283b0e7 100644 --- a/camera/multi_camera.py +++ b/manimlib/camera/multi_camera.py @@ -1,7 +1,5 @@ - - -from camera.moving_camera import MovingCamera -from utils.iterables import list_difference_update +from manimlib.camera.moving_camera import MovingCamera +from manimlib.utils.iterables import list_difference_update class MultiCamera(MovingCamera): diff --git a/camera/three_d_camera.py b/manimlib/camera/three_d_camera.py similarity index 90% rename from camera/three_d_camera.py rename to manimlib/camera/three_d_camera.py index 48b3d28f..cf6a1be2 100644 --- a/camera/three_d_camera.py +++ b/manimlib/camera/three_d_camera.py @@ -1,24 +1,19 @@ - - import numpy as np -from constants import * - -from camera.camera import Camera -from mobject.types.point_cloud_mobject import Point -from mobject.types.vectorized_mobject import VMobject -from mobject.three_d_utils import get_3d_vmob_start_corner -from mobject.three_d_utils import get_3d_vmob_start_corner_unit_normal -from mobject.three_d_utils import get_3d_vmob_end_corner -from mobject.three_d_utils import get_3d_vmob_end_corner_unit_normal -from mobject.value_tracker import ValueTracker - -from utils.color import get_shaded_rgb -# from utils.config_ops import digest_config -from utils.space_ops import rotation_about_z -from utils.space_ops import rotation_matrix -from utils.space_ops import center_of_mass -from utils.simple_functions import clip_in_place +from manimlib.camera.camera import Camera +from manimlib.constants import * +from manimlib.mobject.three_d_utils import get_3d_vmob_end_corner +from manimlib.mobject.three_d_utils import get_3d_vmob_end_corner_unit_normal +from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner +from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner_unit_normal +from manimlib.mobject.types.point_cloud_mobject import Point +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.value_tracker import ValueTracker +from manimlib.utils.color import get_shaded_rgb +from manimlib.utils.simple_functions import clip_in_place +from manimlib.utils.space_ops import center_of_mass +from manimlib.utils.space_ops import rotation_about_z +from manimlib.utils.space_ops import rotation_matrix class ThreeDCamera(Camera): diff --git a/config.py b/manimlib/config.py similarity index 90% rename from config.py rename to manimlib/config.py index bec4870e..a53e2f59 100644 --- a/config.py +++ b/manimlib/config.py @@ -1,10 +1,10 @@ -#!/usr/bin/env python import argparse import colour -import constants import os import sys +import manimlib.constants + def parse_cli(): try: @@ -108,14 +108,14 @@ def get_configuration(args): # Camera configuration config["camera_config"] = {} if args.low_quality: - config["camera_config"].update(constants.LOW_QUALITY_CAMERA_CONFIG) - config["frame_duration"] = constants.LOW_QUALITY_FRAME_DURATION + config["camera_config"].update(manimlib.constants.LOW_QUALITY_CAMERA_CONFIG) + config["frame_duration"] = manimlib.constants.LOW_QUALITY_FRAME_DURATION elif args.medium_quality: - config["camera_config"].update(constants.MEDIUM_QUALITY_CAMERA_CONFIG) - config["frame_duration"] = constants.MEDIUM_QUALITY_FRAME_DURATION + config["camera_config"].update(manimlib.constants.MEDIUM_QUALITY_CAMERA_CONFIG) + config["frame_duration"] = manimlib.constants.MEDIUM_QUALITY_FRAME_DURATION else: - config["camera_config"].update(constants.PRODUCTION_QUALITY_CAMERA_CONFIG) - config["frame_duration"] = constants.PRODUCTION_QUALITY_FRAME_DURATION + config["camera_config"].update(manimlib.constants.PRODUCTION_QUALITY_CAMERA_CONFIG) + config["frame_duration"] = manimlib.constants.PRODUCTION_QUALITY_FRAME_DURATION # If the resolution was passed in via -r if args.resolution: diff --git a/constants.py b/manimlib/constants.py similarity index 100% rename from constants.py rename to manimlib/constants.py index 431ddfd7..30c115e5 100644 --- a/constants.py +++ b/manimlib/constants.py @@ -1,5 +1,5 @@ -import os import numpy as np +import os # Initialize directories env_MEDIA_DIR = os.getenv("MEDIA_DIR") diff --git a/container/__init__.py b/manimlib/container/__init__.py similarity index 100% rename from container/__init__.py rename to manimlib/container/__init__.py diff --git a/container/container.py b/manimlib/container/container.py similarity index 95% rename from container/container.py rename to manimlib/container/container.py index 6ead1bdd..d84ff2a0 100644 --- a/container/container.py +++ b/manimlib/container/container.py @@ -1,4 +1,4 @@ -from utils.config_ops import digest_config +from manimlib.utils.config_ops import digest_config # Currently, this is only used by both Scene and Mobject. # Still, we abstract its functionality here, albeit purely nominally. diff --git a/camera/__init__.py b/manimlib/continual_animation/__init__.py similarity index 100% rename from camera/__init__.py rename to manimlib/continual_animation/__init__.py diff --git a/continual_animation/continual_animation.py b/manimlib/continual_animation/continual_animation.py similarity index 92% rename from continual_animation/continual_animation.py rename to manimlib/continual_animation/continual_animation.py index 5ecee74c..e75f81b6 100644 --- a/continual_animation/continual_animation.py +++ b/manimlib/continual_animation/continual_animation.py @@ -1,10 +1,10 @@ import copy -from constants import * -from mobject.mobject import Group -from mobject.mobject import Mobject -from utils.config_ops import digest_config -from utils.config_ops import instantiate +from manimlib.constants import * +from manimlib.mobject.mobject import Group +from manimlib.mobject.mobject import Mobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import instantiate class ContinualAnimation(object): diff --git a/continual_animation/from_animation.py b/manimlib/continual_animation/from_animation.py similarity index 91% rename from continual_animation/from_animation.py rename to manimlib/continual_animation/from_animation.py index 61314b85..b49263dc 100644 --- a/continual_animation/from_animation.py +++ b/manimlib/continual_animation/from_animation.py @@ -1,6 +1,6 @@ -from continual_animation.continual_animation import ContinualAnimation +from manimlib.continual_animation.continual_animation import ContinualAnimation class NormalAnimationAsContinualAnimation(ContinualAnimation): diff --git a/continual_animation/numbers.py b/manimlib/continual_animation/numbers.py similarity index 60% rename from continual_animation/numbers.py rename to manimlib/continual_animation/numbers.py index 2cc81523..50faa18e 100644 --- a/continual_animation/numbers.py +++ b/manimlib/continual_animation/numbers.py @@ -1,7 +1,7 @@ -from continual_animation.from_animation import NormalAnimationAsContinualAnimation -from animation.numbers import ChangingDecimal +from manimlib.animation.numbers import ChangingDecimal +from manimlib.continual_animation.from_animation import NormalAnimationAsContinualAnimation class ContinualChangingDecimal(NormalAnimationAsContinualAnimation): diff --git a/continual_animation/update.py b/manimlib/continual_animation/update.py similarity index 88% rename from continual_animation/update.py rename to manimlib/continual_animation/update.py index 8db3f871..7e97ff96 100644 --- a/continual_animation/update.py +++ b/manimlib/continual_animation/update.py @@ -1,8 +1,8 @@ -from continual_animation.continual_animation import ContinualAnimation -from animation.update import MaintainPositionRelativeTo -from mobject.value_tracker import ValueTracker +from manimlib.animation.update import MaintainPositionRelativeTo +from manimlib.continual_animation.continual_animation import ContinualAnimation +from manimlib.mobject.value_tracker import ValueTracker class ContinualUpdate(ContinualAnimation): diff --git a/ctex_template.tex b/manimlib/ctex_template.tex similarity index 100% rename from ctex_template.tex rename to manimlib/ctex_template.tex diff --git a/extract_scene.py b/manimlib/extract_scene.py similarity index 88% rename from extract_scene.py rename to manimlib/extract_scene.py index 9ce0a68d..e85eaa78 100644 --- a/extract_scene.py +++ b/manimlib/extract_scene.py @@ -1,6 +1,3 @@ -# !/usr/bin/env python - -import constants import importlib import inspect import itertools as it @@ -9,9 +6,10 @@ import subprocess as sp import sys import traceback -from scene.scene import Scene -from utils.sounds import play_error_sound -from utils.sounds import play_finish_sound +from manimlib.scene.scene import Scene +from manimlib.utils.sounds import play_error_sound +from manimlib.utils.sounds import play_finish_sound +import manimlib.constants def handle_scene(scene, **config): @@ -68,15 +66,15 @@ def prompt_user_for_choice(name_to_obj): print("%d: %s" % (count, name)) num_to_name[count] = name try: - user_input = input(constants.CHOOSE_NUMBER_MESSAGE) + user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) return [ name_to_obj[num_to_name[int(num_str)]] for num_str in user_input.split(",") ] except KeyError: - print(constants.INVALID_NUMBER_MESSAGE) + print(manimlib.constants.INVALID_NUMBER_MESSAGE) sys.exit() - user_input = input(constants.CHOOSE_NUMBER_MESSAGE) + user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) return [ name_to_obj[num_to_name[int(num_str)]] for num_str in user_input.split(",") @@ -85,14 +83,14 @@ def prompt_user_for_choice(name_to_obj): def get_scene_classes(scene_names_to_classes, config): if len(scene_names_to_classes) == 0: - print(constants.NO_SCENE_MESSAGE) + print(manimlib.constants.NO_SCENE_MESSAGE) return [] if len(scene_names_to_classes) == 1: return list(scene_names_to_classes.values()) if config["scene_name"] in scene_names_to_classes: return [scene_names_to_classes[config["scene_name"]]] if config["scene_name"] != "": - print(constants.SCENE_NOT_FOUND_MESSAGE) + print(manimlib.constants.SCENE_NOT_FOUND_MESSAGE) return [] if config["write_all"]: return list(scene_names_to_classes.values()) diff --git a/for_3b1b_videos/common_scenes.py b/manimlib/for_3b1b_videos/common_scenes.py similarity index 87% rename from for_3b1b_videos/common_scenes.py rename to manimlib/for_3b1b_videos/common_scenes.py index 7b4c51d8..6b7dcfaa 100644 --- a/for_3b1b_videos/common_scenes.py +++ b/manimlib/for_3b1b_videos/common_scenes.py @@ -1,33 +1,30 @@ - - import random import string -from constants import * - -from animation.animation import Animation -from animation.composition import LaggedStart -from animation.creation import DrawBorderThenFill -from animation.creation import Write -from animation.creation import FadeIn -from animation.creation import FadeOut -from continual_animation.continual_animation import ContinualMovement -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from scene.scene import Scene -from scene.moving_camera_scene import MovingCameraScene -from for_3b1b_videos.pi_creature_animations import Blink -from for_3b1b_videos.pi_creature import Mortimer -from for_3b1b_videos.pi_creature import Randolph -from for_3b1b_videos.pi_creature_scene import PiCreatureScene -from mobject.geometry import Line -from mobject.geometry import DashedLine -from mobject.geometry import Rectangle -from mobject.geometry import Square -from mobject.svg.drawings import PatreonLogo -from mobject.svg.drawings import Logo -from utils.space_ops import get_norm -from utils.space_ops import normalize +from manimlib.animation.animation import Animation +from manimlib.animation.composition import LaggedStart +from manimlib.animation.creation import DrawBorderThenFill +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import Write +from manimlib.constants import * +from manimlib.continual_animation.continual_animation import ContinualMovement +from manimlib.for_3b1b_videos.pi_creature import Mortimer +from manimlib.for_3b1b_videos.pi_creature import Randolph +from manimlib.for_3b1b_videos.pi_creature_animations import Blink +from manimlib.for_3b1b_videos.pi_creature_scene import PiCreatureScene +from manimlib.mobject.geometry import DashedLine +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import Square +from manimlib.mobject.svg.drawings import Logo +from manimlib.mobject.svg.drawings import PatreonLogo +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.moving_camera_scene import MovingCameraScene +from manimlib.scene.scene import Scene +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import normalize class OpeningQuote(Scene): diff --git a/for_3b1b_videos/pi_class.py b/manimlib/for_3b1b_videos/pi_class.py similarity index 72% rename from for_3b1b_videos/pi_class.py rename to manimlib/for_3b1b_videos/pi_class.py index 2c0479d7..fb453af0 100644 --- a/for_3b1b_videos/pi_class.py +++ b/manimlib/for_3b1b_videos/pi_class.py @@ -1,10 +1,10 @@ -import numpy as np import warnings -from constants import * +import numpy as np -from mobject.types.vectorized_mobject import VGroup -from for_3b1b_videos.pi_creature import PiCreature +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_creature import PiCreature +from manimlib.mobject.types.vectorized_mobject import VGroup class PiCreatureClass(VGroup): CONFIG = { diff --git a/for_3b1b_videos/pi_creature.py b/manimlib/for_3b1b_videos/pi_creature.py similarity index 94% rename from for_3b1b_videos/pi_creature.py rename to manimlib/for_3b1b_videos/pi_creature.py index 3bd8f293..088960ab 100644 --- a/for_3b1b_videos/pi_creature.py +++ b/manimlib/for_3b1b_videos/pi_creature.py @@ -1,22 +1,20 @@ -import numpy as np -import warnings import os +import warnings -from constants import * +import numpy as np -from mobject.mobject import Mobject -from mobject.svg.svg_mobject import SVGMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject - -from mobject.svg.drawings import ThoughtBubble - -from animation.transform import Transform -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back -from utils.space_ops import get_norm +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.drawings import ThoughtBubble +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.space_ops import get_norm pi_creature_dir_maybe = os.path.join(MEDIA_DIR, "designs", "PiCreature") if os.path.exists(pi_creature_dir_maybe): diff --git a/for_3b1b_videos/pi_creature_animations.py b/manimlib/for_3b1b_videos/pi_creature_animations.py similarity index 83% rename from for_3b1b_videos/pi_creature_animations.py rename to manimlib/for_3b1b_videos/pi_creature_animations.py index d0561236..6f02ca9b 100644 --- a/for_3b1b_videos/pi_creature_animations.py +++ b/manimlib/for_3b1b_videos/pi_creature_animations.py @@ -1,23 +1,17 @@ - - -from constants import * - -from mobject.mobject import Group - -from mobject.svg.drawings import SpeechBubble - -from animation.animation import Animation -from animation.creation import ShowCreation -from animation.creation import Write -from animation.composition import AnimationGroup -from animation.transform import ApplyMethod -from animation.creation import FadeOut -from animation.transform import MoveToTarget -from utils.config_ops import digest_config -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back - -from for_3b1b_videos.pi_class import PiCreatureClass +from manimlib.animation.animation import Animation +from manimlib.animation.composition import AnimationGroup +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import ShowCreation +from manimlib.animation.creation import Write +from manimlib.animation.transform import ApplyMethod +from manimlib.animation.transform import MoveToTarget +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_class import PiCreatureClass +from manimlib.mobject.mobject import Group +from manimlib.mobject.svg.drawings import SpeechBubble +from manimlib.utils.config_ops import digest_config +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back class Blink(ApplyMethod): diff --git a/for_3b1b_videos/pi_creature_scene.py b/manimlib/for_3b1b_videos/pi_creature_scene.py similarity index 92% rename from for_3b1b_videos/pi_creature_scene.py rename to manimlib/for_3b1b_videos/pi_creature_scene.py index b9cb8e26..1b70bb9f 100644 --- a/for_3b1b_videos/pi_creature_scene.py +++ b/manimlib/for_3b1b_videos/pi_creature_scene.py @@ -1,30 +1,26 @@ - - import itertools as it -import numpy as np import random -from constants import * +import numpy as np -from mobject.types.vectorized_mobject import VGroup - -from mobject.frame import ScreenRectangle -from mobject.svg.drawings import SpeechBubble -from mobject.svg.drawings import ThoughtBubble - -from animation.transform import ApplyMethod -from animation.transform import ReplacementTransform -from animation.transform import Transform -from for_3b1b_videos.pi_creature import PiCreature -from for_3b1b_videos.pi_creature import Mortimer -from for_3b1b_videos.pi_creature import Randolph -from for_3b1b_videos.pi_creature_animations import Blink -from for_3b1b_videos.pi_creature_animations import PiCreatureBubbleIntroduction -from for_3b1b_videos.pi_creature_animations import RemovePiCreatureBubble -from scene.scene import Scene -from utils.rate_functions import squish_rate_func -from utils.rate_functions import there_and_back -from utils.space_ops import get_norm +from manimlib.animation.transform import ApplyMethod +from manimlib.animation.transform import ReplacementTransform +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_creature import Mortimer +from manimlib.for_3b1b_videos.pi_creature import PiCreature +from manimlib.for_3b1b_videos.pi_creature import Randolph +from manimlib.for_3b1b_videos.pi_creature_animations import Blink +from manimlib.for_3b1b_videos.pi_creature_animations import PiCreatureBubbleIntroduction +from manimlib.for_3b1b_videos.pi_creature_animations import RemovePiCreatureBubble +from manimlib.mobject.frame import ScreenRectangle +from manimlib.mobject.svg.drawings import SpeechBubble +from manimlib.mobject.svg.drawings import ThoughtBubble +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene +from manimlib.utils.rate_functions import squish_rate_func +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.space_ops import get_norm class PiCreatureScene(Scene): diff --git a/manimlib/media_dir.txt b/manimlib/media_dir.txt new file mode 100644 index 00000000..27949aaf --- /dev/null +++ b/manimlib/media_dir.txt @@ -0,0 +1 @@ +media \ No newline at end of file diff --git a/continual_animation/__init__.py b/manimlib/mobject/__init__.py similarity index 100% rename from continual_animation/__init__.py rename to manimlib/mobject/__init__.py diff --git a/mobject/coordinate_systems.py b/manimlib/mobject/coordinate_systems.py similarity index 96% rename from mobject/coordinate_systems.py rename to manimlib/mobject/coordinate_systems.py index cf469716..fe6f1f53 100644 --- a/mobject/coordinate_systems.py +++ b/manimlib/mobject/coordinate_systems.py @@ -1,18 +1,15 @@ - - import numpy as np -from constants import * - -from mobject.functions import ParametricFunction -from mobject.geometry import Arrow -from mobject.geometry import Line -from mobject.number_line import NumberLine -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import digest_config -from utils.space_ops import angle_of_vector +from manimlib.constants import * +from manimlib.mobject.functions import ParametricFunction +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Line +from manimlib.mobject.number_line import NumberLine +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import angle_of_vector # TODO: There should be much more code reuse between Axes, NumberPlane and GraphScene diff --git a/mobject/frame.py b/manimlib/mobject/frame.py similarity index 88% rename from mobject/frame.py rename to manimlib/mobject/frame.py index 68bef518..6d354edb 100644 --- a/mobject/frame.py +++ b/manimlib/mobject/frame.py @@ -1,8 +1,6 @@ - - -from constants import * -from mobject.geometry import Rectangle -from utils.config_ops import digest_config +from manimlib.constants import * +from manimlib.mobject.geometry import Rectangle +from manimlib.utils.config_ops import digest_config class ScreenRectangle(Rectangle): diff --git a/mobject/functions.py b/manimlib/mobject/functions.py similarity index 89% rename from mobject/functions.py rename to manimlib/mobject/functions.py index e6ab5772..c5e78695 100644 --- a/mobject/functions.py +++ b/manimlib/mobject/functions.py @@ -1,9 +1,6 @@ - - -from constants import * - -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import digest_config +from manimlib.constants import * +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config class ParametricFunction(VMobject): diff --git a/mobject/geometry.py b/manimlib/mobject/geometry.py similarity index 97% rename from mobject/geometry.py rename to manimlib/mobject/geometry.py index ed05d3d7..d838930d 100644 --- a/mobject/geometry.py +++ b/manimlib/mobject/geometry.py @@ -1,22 +1,20 @@ - - -from constants import * - import itertools as it + import numpy as np -from mobject.mobject import Mobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.config_ops import digest_locals -from utils.paths import path_along_arc -from utils.space_ops import angle_of_vector -from utils.space_ops import center_of_mass -from utils.space_ops import compass_directions -from utils.space_ops import rotate_vector -from utils.space_ops import get_norm +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import digest_locals +from manimlib.utils.paths import path_along_arc +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import center_of_mass +from manimlib.utils.space_ops import compass_directions +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import rotate_vector class Arc(VMobject): diff --git a/mobject/matrix.py b/manimlib/mobject/matrix.py similarity index 92% rename from mobject/matrix.py rename to manimlib/mobject/matrix.py index 75d3f3c0..b5a2e283 100644 --- a/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -1,16 +1,13 @@ - - import numpy as np -from mobject.numbers import DecimalNumber -from mobject.numbers import Integer -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.shape_matchers import BackgroundRectangle - -from constants import * +from manimlib.constants import * +from manimlib.mobject.numbers import DecimalNumber +from manimlib.mobject.numbers import Integer +from manimlib.mobject.shape_matchers import BackgroundRectangle +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject VECTOR_LABEL_SCALE_FACTOR = 0.8 diff --git a/mobject/mobject.py b/manimlib/mobject/mobject.py similarity index 97% rename from mobject/mobject.py rename to manimlib/mobject/mobject.py index 0f92d95c..57a6e018 100644 --- a/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -1,27 +1,27 @@ - +from functools import reduce import copy import itertools as it -import numpy as np import operator as op import os import random from colour import Color +import numpy as np -from constants import * -from container.container import Container -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.color import color_to_rgb -from utils.color import interpolate_color -from utils.iterables import list_update -from utils.iterables import remove_list_redundancies -from utils.paths import straight_path -from utils.space_ops import angle_of_vector -from utils.space_ops import rotation_matrix -from utils.simple_functions import get_num_args -from utils.space_ops import get_norm -from functools import reduce +from manimlib.constants import * +from manimlib.container.container import Container +from manimlib.functools import reduce +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.color import color_to_rgb +from manimlib.utils.color import interpolate_color +from manimlib.utils.iterables import list_update +from manimlib.utils.iterables import remove_list_redundancies +from manimlib.utils.paths import straight_path +from manimlib.utils.simple_functions import get_num_args +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import rotation_matrix # TODO: Explain array_attrs diff --git a/mobject/number_line.py b/manimlib/mobject/number_line.py similarity index 90% rename from mobject/number_line.py rename to manimlib/mobject/number_line.py index 0b1e83aa..40dd5c1c 100644 --- a/mobject/number_line.py +++ b/manimlib/mobject/number_line.py @@ -1,17 +1,14 @@ - - -from constants import * - -from mobject.numbers import DecimalNumber -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.geometry import Arrow -from mobject.geometry import Line -from utils.bezier import interpolate -from utils.config_ops import digest_config -from utils.space_ops import get_norm -from utils.space_ops import normalize -from utils.simple_functions import fdiv +from manimlib.constants import * +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Line +from manimlib.mobject.numbers import DecimalNumber +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.simple_functions import fdiv +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import normalize class NumberLine(VMobject): diff --git a/mobject/numbers.py b/manimlib/mobject/numbers.py similarity index 96% rename from mobject/numbers.py rename to manimlib/mobject/numbers.py index e7724f45..89f7c393 100644 --- a/mobject/numbers.py +++ b/manimlib/mobject/numbers.py @@ -1,7 +1,6 @@ -from constants import * - -from mobject.svg.tex_mobject import SingleStringTexMobject -from mobject.types.vectorized_mobject import VMobject +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import SingleStringTexMobject +from manimlib.mobject.types.vectorized_mobject import VMobject class DecimalNumber(VMobject): diff --git a/mobject/probability.py b/manimlib/mobject/probability.py similarity index 93% rename from mobject/probability.py rename to manimlib/mobject/probability.py index 49c8f9bb..662154c1 100644 --- a/mobject/probability.py +++ b/manimlib/mobject/probability.py @@ -1,17 +1,13 @@ - - -from constants import * - -from mobject.mobject import Mobject -from mobject.svg.brace import Brace -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.geometry import Line -from mobject.geometry import Rectangle - -from utils.color import color_gradient -from utils.iterables import tuplify +from manimlib.constants import * +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.brace import Brace +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.utils.color import color_gradient +from manimlib.utils.iterables import tuplify EPSILON = 0.0001 diff --git a/mobject/shape_matchers.py b/manimlib/mobject/shape_matchers.py similarity index 84% rename from mobject/shape_matchers.py rename to manimlib/mobject/shape_matchers.py index c0f8e394..d3e1e089 100644 --- a/mobject/shape_matchers.py +++ b/manimlib/mobject/shape_matchers.py @@ -1,13 +1,10 @@ - - -from constants import * - -from mobject.types.vectorized_mobject import VMobject -from mobject.geometry import Rectangle -from mobject.geometry import Line -from mobject.types.vectorized_mobject import VGroup -from utils.config_ops import digest_config -from utils.color import Color +from manimlib.constants import * +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.color import Color +from manimlib.utils.config_ops import digest_config class SurroundingRectangle(Rectangle): diff --git a/for_3b1b_videos/__init__.py b/manimlib/mobject/svg/__init__.py similarity index 100% rename from for_3b1b_videos/__init__.py rename to manimlib/mobject/svg/__init__.py diff --git a/mobject/svg/brace.py b/manimlib/mobject/svg/brace.py similarity index 90% rename from mobject/svg/brace.py rename to manimlib/mobject/svg/brace.py index 2c2a4551..f9af8272 100644 --- a/mobject/svg/brace.py +++ b/manimlib/mobject/svg/brace.py @@ -1,17 +1,14 @@ - - import numpy as np -from constants import * - -from animation.composition import AnimationGroup -from animation.creation import FadeIn -from animation.creation import GrowFromCenter -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VMobject -from utils.config_ops import digest_config -from utils.space_ops import get_norm +from manimlib.animation.composition import AnimationGroup +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import GrowFromCenter +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import get_norm class Brace(TexMobject): diff --git a/mobject/svg/drawings.py b/manimlib/mobject/svg/drawings.py similarity index 96% rename from mobject/svg/drawings.py rename to manimlib/mobject/svg/drawings.py index bd8f5a94..62e11d8d 100644 --- a/mobject/svg/drawings.py +++ b/manimlib/mobject/svg/drawings.py @@ -1,32 +1,28 @@ - import itertools as it -from constants import * - -from mobject.mobject import Mobject -from mobject.svg.svg_mobject import SVGMobject -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VectorizedPoint - -from animation.animation import Animation -from animation.rotation import Rotating - -from mobject.geometry import Arc -from mobject.geometry import Circle -from mobject.geometry import Line -from mobject.geometry import Polygon -from mobject.geometry import Rectangle -from mobject.geometry import Square -from mobject.geometry import AnnularSector -from mobject.three_dimensions import Cube -from utils.config_ops import digest_config -from utils.space_ops import angle_of_vector -from utils.space_ops import complex_to_R3 -from utils.space_ops import rotate_vector -from utils.bezier import interpolate +from manimlib.animation.animation import Animation +from manimlib.animation.rotation import Rotating +from manimlib.constants import * +from manimlib.mobject.geometry import AnnularSector +from manimlib.mobject.geometry import Arc +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Polygon +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import Square +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.three_dimensions import Cube +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.bezier import interpolate +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import complex_to_R3 +from manimlib.utils.space_ops import rotate_vector class Lightbulb(SVGMobject): diff --git a/mobject/svg/svg_mobject.py b/manimlib/mobject/svg/svg_mobject.py similarity index 96% rename from mobject/svg/svg_mobject.py rename to manimlib/mobject/svg/svg_mobject.py index b91ab49b..ea38891d 100644 --- a/mobject/svg/svg_mobject.py +++ b/manimlib/mobject/svg/svg_mobject.py @@ -4,17 +4,17 @@ import string import warnings from xml.dom import minidom -from utils.color import * -from constants import * -from mobject.geometry import Circle -from mobject.geometry import Rectangle -from mobject.geometry import RoundedRectangle -from utils.bezier import is_closed -from utils.config_ops import digest_config -from utils.config_ops import digest_locals -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject +from manimlib.constants import * +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import RoundedRectangle +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import is_closed +from manimlib.utils.color import * +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import digest_locals def string_to_numbers(num_string): diff --git a/mobject/svg/tex_mobject.py b/manimlib/mobject/svg/tex_mobject.py similarity index 95% rename from mobject/svg/tex_mobject.py rename to manimlib/mobject/svg/tex_mobject.py index 97a81784..80378ebf 100644 --- a/mobject/svg/tex_mobject.py +++ b/manimlib/mobject/svg/tex_mobject.py @@ -1,17 +1,16 @@ - -from constants import * - -from .svg_mobject import SVGMobject -from .svg_mobject import VMobjectFromSVGPathstring -from utils.config_ops import digest_config -from utils.strings import split_string_list_to_isolate_substrings -from utils.tex_file_writing import tex_to_svg_file -from mobject.geometry import Line -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VectorizedPoint - -import operator as op from functools import reduce +import operator as op + +from manimlib.constants import * +from manimlib.mobject.geometry import Line +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.svg.svg_mobject import VMobjectFromSVGPathstring +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.config_ops import digest_config +from manimlib.utils.strings import split_string_list_to_isolate_substrings +from manimlib.utils.tex_file_writing import tex_to_svg_file + TEX_MOB_SCALE_FACTOR = 0.05 diff --git a/mobject/three_d_shading_utils.py b/manimlib/mobject/three_d_shading_utils.py similarity index 93% rename from mobject/three_d_shading_utils.py rename to manimlib/mobject/three_d_shading_utils.py index 2d9ef4b0..a0fe43c3 100644 --- a/mobject/three_d_shading_utils.py +++ b/manimlib/mobject/three_d_shading_utils.py @@ -1,7 +1,7 @@ import numpy as np -from constants import ORIGIN -from utils.space_ops import get_unit_normal +from manimlib.constants import ORIGIN +from manimlib.utils.space_ops import get_unit_normal def get_3d_vmob_gradient_start_and_end_points(vmob): diff --git a/mobject/three_d_utils.py b/manimlib/mobject/three_d_utils.py similarity index 89% rename from mobject/three_d_utils.py rename to manimlib/mobject/three_d_utils.py index 187aad27..3138aaa1 100644 --- a/mobject/three_d_utils.py +++ b/manimlib/mobject/three_d_utils.py @@ -1,9 +1,9 @@ import numpy as np -from constants import ORIGIN -from constants import UP -from utils.space_ops import get_unit_normal -from utils.space_ops import get_norm +from manimlib.constants import ORIGIN +from manimlib.constants import UP +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import get_unit_normal def get_3d_vmob_gradient_start_and_end_points(vmob): diff --git a/mobject/three_dimensions.py b/manimlib/mobject/three_dimensions.py similarity index 93% rename from mobject/three_dimensions.py rename to manimlib/mobject/three_dimensions.py index 1077992e..ef95c3ec 100644 --- a/mobject/three_dimensions.py +++ b/manimlib/mobject/three_dimensions.py @@ -1,13 +1,9 @@ - - -from constants import * - -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.geometry import Square - -from utils.iterables import tuplify -from utils.space_ops import z_to_vector +from manimlib.constants import * +from manimlib.mobject.geometry import Square +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.iterables import tuplify +from manimlib.utils.space_ops import z_to_vector ############## diff --git a/mobject/__init__.py b/manimlib/mobject/types/__init__.py similarity index 100% rename from mobject/__init__.py rename to manimlib/mobject/types/__init__.py diff --git a/mobject/types/image_mobject.py b/manimlib/mobject/types/image_mobject.py similarity index 91% rename from mobject/types/image_mobject.py rename to manimlib/mobject/types/image_mobject.py index 5607d908..606c8ac4 100644 --- a/mobject/types/image_mobject.py +++ b/manimlib/mobject/types/image_mobject.py @@ -1,17 +1,14 @@ - - import numpy as np from PIL import Image -from constants import * - -from mobject.mobject import Mobject -from mobject.shape_matchers import SurroundingRectangle -from utils.bezier import interpolate -from utils.color import color_to_int_rgb -from utils.config_ops import digest_config -from utils.images import get_full_raster_image_path +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.shape_matchers import SurroundingRectangle +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_to_int_rgb +from manimlib.utils.config_ops import digest_config +from manimlib.utils.images import get_full_raster_image_path class AbstractImageMobject(Mobject): diff --git a/mobject/types/point_cloud_mobject.py b/manimlib/mobject/types/point_cloud_mobject.py similarity index 94% rename from mobject/types/point_cloud_mobject.py rename to manimlib/mobject/types/point_cloud_mobject.py index 1a413ba9..f7b087ab 100644 --- a/mobject/types/point_cloud_mobject.py +++ b/manimlib/mobject/types/point_cloud_mobject.py @@ -1,15 +1,12 @@ - - -from constants import * - -from mobject.mobject import Mobject -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.color import color_to_rgba -from utils.color import rgba_to_color -from utils.config_ops import digest_config -from utils.iterables import stretch_array_to_length -from utils.space_ops import get_norm +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.color import color_to_rgba +from manimlib.utils.color import rgba_to_color +from manimlib.utils.config_ops import digest_config +from manimlib.utils.iterables import stretch_array_to_length +from manimlib.utils.space_ops import get_norm class PMobject(Mobject): diff --git a/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py similarity index 97% rename from mobject/types/vectorized_mobject.py rename to manimlib/mobject/types/vectorized_mobject.py index e22d559d..efefd65b 100644 --- a/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -1,20 +1,20 @@ - import itertools as it + from colour import Color -from mobject.mobject import Mobject -from mobject.three_d_utils import get_3d_vmob_gradient_start_and_end_points -from constants import * -from utils.bezier import bezier -from utils.bezier import get_smooth_handle_points -from utils.bezier import interpolate -from utils.bezier import is_closed -from utils.bezier import partial_bezier_points -from utils.color import color_to_rgba -from utils.iterables import make_even -from utils.iterables import tuplify -from utils.iterables import stretch_array_to_length -from utils.simple_functions import clip_in_place +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.three_d_utils import get_3d_vmob_gradient_start_and_end_points +from manimlib.utils.bezier import bezier +from manimlib.utils.bezier import get_smooth_handle_points +from manimlib.utils.bezier import interpolate +from manimlib.utils.bezier import is_closed +from manimlib.utils.bezier import partial_bezier_points +from manimlib.utils.color import color_to_rgba +from manimlib.utils.iterables import make_even +from manimlib.utils.iterables import stretch_array_to_length +from manimlib.utils.iterables import tuplify +from manimlib.utils.simple_functions import clip_in_place class VMobject(Mobject): diff --git a/mobject/updater.py b/manimlib/mobject/updater.py similarity index 100% rename from mobject/updater.py rename to manimlib/mobject/updater.py diff --git a/mobject/value_tracker.py b/manimlib/mobject/value_tracker.py similarity index 93% rename from mobject/value_tracker.py rename to manimlib/mobject/value_tracker.py index 463f95de..9daddeaf 100644 --- a/mobject/value_tracker.py +++ b/manimlib/mobject/value_tracker.py @@ -1,8 +1,7 @@ - import numpy as np -from mobject.mobject import Mobject -from utils.bezier import interpolate +from manimlib.mobject.mobject import Mobject +from manimlib.utils.bezier import interpolate class ValueTracker(Mobject): diff --git a/once_useful_constructs/NOTE.md b/manimlib/once_useful_constructs/NOTE.md similarity index 100% rename from once_useful_constructs/NOTE.md rename to manimlib/once_useful_constructs/NOTE.md diff --git a/once_useful_constructs/arithmetic.py b/manimlib/once_useful_constructs/arithmetic.py similarity index 94% rename from once_useful_constructs/arithmetic.py rename to manimlib/once_useful_constructs/arithmetic.py index 1f85b582..dac1f428 100644 --- a/once_useful_constructs/arithmetic.py +++ b/manimlib/once_useful_constructs/arithmetic.py @@ -1,9 +1,9 @@ import numpy as np -from animation.animation import Animation -from constants import * -from mobject.svg.tex_mobject import TexMobject -from scene.scene import Scene +from manimlib.animation.animation import Animation +from manimlib.constants import * +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.scene.scene import Scene class RearrangeEquation(Scene): diff --git a/once_useful_constructs/combinatorics.py b/manimlib/once_useful_constructs/combinatorics.py similarity index 95% rename from once_useful_constructs/combinatorics.py rename to manimlib/once_useful_constructs/combinatorics.py index 88a300b3..2e56f667 100644 --- a/once_useful_constructs/combinatorics.py +++ b/manimlib/once_useful_constructs/combinatorics.py @@ -1,11 +1,9 @@ -from constants import * - -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VMobject, VGroup -from mobject.numbers import Integer - -from scene.scene import Scene -from utils.simple_functions import choose +from manimlib.constants import * +from manimlib.mobject.numbers import Integer +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VMobject, VGroup +from manimlib.scene.scene import Scene +from manimlib.utils.simple_functions import choose DEFAULT_COUNT_NUM_OFFSET = (FRAME_X_RADIUS - 1, FRAME_Y_RADIUS - 1, 0) diff --git a/once_useful_constructs/complex_transformation_scene.py b/manimlib/once_useful_constructs/complex_transformation_scene.py similarity index 93% rename from once_useful_constructs/complex_transformation_scene.py rename to manimlib/once_useful_constructs/complex_transformation_scene.py index e738e429..b6b88208 100644 --- a/once_useful_constructs/complex_transformation_scene.py +++ b/manimlib/once_useful_constructs/complex_transformation_scene.py @@ -1,12 +1,10 @@ -from constants import * - -from animation.animation import Animation -# from animation.movement import SmoothedVectorizedHomotopy -from animation.movement import ComplexHomotopy -from animation.transform import MoveToTarget -from mobject.coordinate_systems import ComplexPlane -from mobject.types.vectorized_mobject import VGroup -from scene.scene import Scene +from manimlib.animation.animation import Animation +from manimlib.animation.movement import ComplexHomotopy +from manimlib.animation.transform import MoveToTarget +from manimlib.constants import * +from manimlib.mobject.coordinate_systems import ComplexPlane +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene # TODO, refactor this full scene diff --git a/once_useful_constructs/counting.py b/manimlib/once_useful_constructs/counting.py similarity index 93% rename from once_useful_constructs/counting.py rename to manimlib/once_useful_constructs/counting.py index ac008085..ecc36254 100644 --- a/once_useful_constructs/counting.py +++ b/manimlib/once_useful_constructs/counting.py @@ -1,16 +1,14 @@ -from constants import * - -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VGroup - -from animation.creation import ShowCreation -from animation.creation import FadeIn -from animation.transform import MoveToTarget -from animation.transform import Transform -from mobject.geometry import Arrow -from mobject.geometry import Circle -from mobject.geometry import Dot -from scene.scene import Scene +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import ShowCreation +from manimlib.animation.transform import MoveToTarget +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Dot +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene class CountingScene(Scene): diff --git a/once_useful_constructs/fractals.py b/manimlib/once_useful_constructs/fractals.py similarity index 95% rename from once_useful_constructs/fractals.py rename to manimlib/once_useful_constructs/fractals.py index a4e33851..8b71fad8 100644 --- a/once_useful_constructs/fractals.py +++ b/manimlib/once_useful_constructs/fractals.py @@ -1,22 +1,22 @@ -from for_3b1b_videos.pi_creature import PiCreature -from for_3b1b_videos.pi_creature import Randolph -from for_3b1b_videos.pi_creature import get_all_pi_creature_modes -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from mobject.geometry import Circle -from mobject.geometry import Polygon -from mobject.geometry import RegularPolygon -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.config_ops import digest_config -from utils.space_ops import center_of_mass -from utils.space_ops import compass_directions -from utils.space_ops import rotate_vector -from utils.space_ops import rotation_matrix - -from constants import * from functools import reduce +from manimlib.constants import * +from manimlib.for_3b1b_videos.pi_creature import PiCreature +from manimlib.for_3b1b_videos.pi_creature import Randolph +from manimlib.for_3b1b_videos.pi_creature import get_all_pi_creature_modes +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Polygon +from manimlib.mobject.geometry import RegularPolygon +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.config_ops import digest_config +from manimlib.utils.space_ops import center_of_mass +from manimlib.utils.space_ops import compass_directions +from manimlib.utils.space_ops import rotate_vector +from manimlib.utils.space_ops import rotation_matrix + def rotate(points, angle=np.pi, axis=OUT): if axis is None: diff --git a/once_useful_constructs/graph_theory.py b/manimlib/once_useful_constructs/graph_theory.py similarity index 98% rename from once_useful_constructs/graph_theory.py rename to manimlib/once_useful_constructs/graph_theory.py index 0fb9650f..775b2286 100644 --- a/once_useful_constructs/graph_theory.py +++ b/manimlib/once_useful_constructs/graph_theory.py @@ -1,13 +1,13 @@ +from functools import reduce import itertools as it -import numpy as np import operator as op -from constants import * +import numpy as np -from scene.scene import Scene -from utils.rate_functions import there_and_back -from utils.space_ops import center_of_mass -from functools import reduce +from manimlib.constants import * +from manimlib.scene.scene import Scene +from manimlib.utils.rate_functions import there_and_back +from manimlib.utils.space_ops import center_of_mass class Graph(): diff --git a/once_useful_constructs/light.py b/manimlib/once_useful_constructs/light.py similarity index 95% rename from once_useful_constructs/light.py rename to manimlib/once_useful_constructs/light.py index f3694613..7294f097 100644 --- a/once_useful_constructs/light.py +++ b/manimlib/once_useful_constructs/light.py @@ -1,26 +1,23 @@ -from constants import * - -from mobject.geometry import AnnularSector -from mobject.geometry import Annulus -from mobject.mobject import Mobject -from mobject.svg.svg_mobject import SVGMobject -from mobject.types.vectorized_mobject import VMobject -from mobject.types.vectorized_mobject import VectorizedPoint - -from continual_animation.continual_animation import ContinualAnimation - -from animation.composition import LaggedStart -from animation.transform import Transform -from animation.creation import FadeIn -from animation.creation import FadeOut - -from utils.space_ops import angle_between_vectors -from utils.space_ops import project_along_vector -from utils.space_ops import rotate_vector -from utils.space_ops import z_to_vector +from traceback import * from scipy.spatial import ConvexHull -from traceback import * + +from manimlib.animation.composition import LaggedStart +from manimlib.animation.creation import FadeIn +from manimlib.animation.creation import FadeOut +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.continual_animation.continual_animation import ContinualAnimation +from manimlib.mobject.geometry import AnnularSector +from manimlib.mobject.geometry import Annulus +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.svg_mobject import SVGMobject +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.utils.space_ops import angle_between_vectors +from manimlib.utils.space_ops import project_along_vector +from manimlib.utils.space_ops import rotate_vector +from manimlib.utils.space_ops import z_to_vector LIGHT_COLOR = YELLOW SHADOW_COLOR = BLACK diff --git a/once_useful_constructs/matrix_multiplication.py b/manimlib/once_useful_constructs/matrix_multiplication.py similarity index 89% rename from once_useful_constructs/matrix_multiplication.py rename to manimlib/once_useful_constructs/matrix_multiplication.py index 367f7bb8..26534951 100644 --- a/once_useful_constructs/matrix_multiplication.py +++ b/manimlib/once_useful_constructs/matrix_multiplication.py @@ -1,17 +1,16 @@ import numpy as np -from constants import * - -from animation.creation import ShowCreation -from animation.transform import ApplyMethod -from animation.creation import FadeOut -from animation.transform import Transform -from mobject.matrix import Matrix -from mobject.svg.tex_mobject import TexMobject -from mobject.types.vectorized_mobject import VGroup -from scene.scene import Scene -from mobject.geometry import Circle -from mobject.geometry import Line +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import ShowCreation +from manimlib.animation.transform import ApplyMethod +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.geometry import Circle +from manimlib.mobject.geometry import Line +from manimlib.mobject.matrix import Matrix +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.scene.scene import Scene class NumericalMatrixMultiplication(Scene): diff --git a/once_useful_constructs/region.py b/manimlib/once_useful_constructs/region.py similarity index 96% rename from once_useful_constructs/region.py rename to manimlib/once_useful_constructs/region.py index 2507f449..f2f8ae87 100644 --- a/once_useful_constructs/region.py +++ b/manimlib/once_useful_constructs/region.py @@ -1,10 +1,9 @@ -import itertools as it from copy import deepcopy +import itertools as it -from mobject.mobject import Mobject -from utils.iterables import adjacent_pairs - -from constants import * +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.utils.iterables import adjacent_pairs # Warning: This is all now pretty depricated, and should not be expected to work diff --git a/scene/__init__.py b/manimlib/scene/__init__.py similarity index 100% rename from scene/__init__.py rename to manimlib/scene/__init__.py diff --git a/scene/graph_scene.py b/manimlib/scene/graph_scene.py similarity index 95% rename from scene/graph_scene.py rename to manimlib/scene/graph_scene.py index dae98e83..5bdf93c1 100644 --- a/scene/graph_scene.py +++ b/manimlib/scene/graph_scene.py @@ -1,25 +1,23 @@ - - -from constants import * import itertools as it -from scene.scene import Scene -from animation.creation import Write, DrawBorderThenFill, ShowCreation -from animation.transform import Transform -from animation.update import UpdateFromAlphaFunc -from mobject.functions import ParametricFunction -from mobject.geometry import Line -from mobject.geometry import Rectangle -from mobject.geometry import RegularPolygon -from mobject.number_line import NumberLine -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VectorizedPoint -from utils.bezier import interpolate -from utils.color import color_gradient -from utils.color import invert_color -from utils.space_ops import angle_of_vector +from manimlib.animation.creation import Write, DrawBorderThenFill, ShowCreation +from manimlib.animation.transform import Transform +from manimlib.animation.update import UpdateFromAlphaFunc +from manimlib.constants import * +from manimlib.mobject.functions import ParametricFunction +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import RegularPolygon +from manimlib.mobject.number_line import NumberLine +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.scene.scene import Scene +from manimlib.utils.bezier import interpolate +from manimlib.utils.color import color_gradient +from manimlib.utils.color import invert_color +from manimlib.utils.space_ops import angle_of_vector # TODO, this should probably reimplemented entirely, especially so as to # better reuse code from mobject/coordinate_systems diff --git a/manimlib/scene/media_dir.txt b/manimlib/scene/media_dir.txt new file mode 100644 index 00000000..27949aaf --- /dev/null +++ b/manimlib/scene/media_dir.txt @@ -0,0 +1 @@ +media \ No newline at end of file diff --git a/scene/moving_camera_scene.py b/manimlib/scene/moving_camera_scene.py similarity index 87% rename from scene/moving_camera_scene.py rename to manimlib/scene/moving_camera_scene.py index a0986d74..4fa23268 100644 --- a/scene/moving_camera_scene.py +++ b/manimlib/scene/moving_camera_scene.py @@ -1,8 +1,6 @@ - - -from scene.scene import Scene -from camera.moving_camera import MovingCamera -from utils.iterables import list_update +from manimlib.camera.moving_camera import MovingCamera +from manimlib.scene.scene import Scene +from manimlib.utils.iterables import list_update class MovingCameraScene(Scene): diff --git a/scene/reconfigurable_scene.py b/manimlib/scene/reconfigurable_scene.py similarity index 91% rename from scene/reconfigurable_scene.py rename to manimlib/scene/reconfigurable_scene.py index b12670fc..96e68d87 100644 --- a/scene/reconfigurable_scene.py +++ b/manimlib/scene/reconfigurable_scene.py @@ -1,10 +1,7 @@ - - -from scene.scene import Scene -from animation.transform import Transform -from mobject.mobject import Mobject - -from constants import * +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.mobject import Mobject +from manimlib.scene.scene import Scene class ReconfigurableScene(Scene): diff --git a/scene/sample_space_scene.py b/manimlib/scene/sample_space_scene.py similarity index 92% rename from scene/sample_space_scene.py rename to manimlib/scene/sample_space_scene.py index b7479f7e..77161834 100644 --- a/scene/sample_space_scene.py +++ b/manimlib/scene/sample_space_scene.py @@ -1,15 +1,11 @@ - -from constants import * - -from .scene import Scene - -from animation.animation import Animation -from animation.transform import MoveToTarget -from animation.transform import Transform -from animation.update import UpdateFromFunc - -from mobject.types.vectorized_mobject import VGroup -from mobject.probability import SampleSpace +from manimlib.animation.animation import Animation +from manimlib.animation.transform import MoveToTarget +from manimlib.animation.transform import Transform +from manimlib.animation.update import UpdateFromFunc +from manimlib.constants import * +from manimlib.scene.scene import Scene +from manimlib.mobject.probability import SampleSpace +from manimlib.mobject.types.vectorized_mobject import VGroup class SampleSpaceScene(Scene): diff --git a/scene/scene.py b/manimlib/scene/scene.py similarity index 96% rename from scene/scene.py rename to manimlib/scene/scene.py index cff2df29..53b611b7 100644 --- a/scene/scene.py +++ b/manimlib/scene/scene.py @@ -1,37 +1,30 @@ - +from time import sleep +import _thread as thread +import datetime import inspect import itertools as it -import numpy as np import os import random import shutil import subprocess as sp import warnings -from time import sleep -try: - import thread # Low-level threading API (Python 2.7) -except ImportError: - import _thread as thread # Low-level threading API (Python 3.x) from tqdm import tqdm as ProgressDisplay +import numpy as np -from constants import * - -from animation.animation import Animation -from animation.transform import MoveToTarget, ApplyMethod -from camera.camera import Camera -from continual_animation.continual_animation import ContinualAnimation -from mobject.mobject import Mobject -from utils.iterables import list_update -from utils.output_directory_getters import add_extension_if_not_present -from utils.output_directory_getters import get_movie_output_directory -from utils.output_directory_getters import get_image_output_directory - -from container.container import Container - -from mobject.svg.tex_mobject import TextMobject -from animation.creation import Write -import datetime +from manimlib.animation.animation import Animation +from manimlib.animation.creation import Write +from manimlib.animation.transform import MoveToTarget, ApplyMethod +from manimlib.camera.camera import Camera +from manimlib.constants import * +from manimlib.container.container import Container +from manimlib.continual_animation.continual_animation import ContinualAnimation +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.utils.iterables import list_update +from manimlib.utils.output_directory_getters import add_extension_if_not_present +from manimlib.utils.output_directory_getters import get_image_output_directory +from manimlib.utils.output_directory_getters import get_movie_output_directory class Scene(Container): CONFIG = { diff --git a/scene/scene_from_video.py b/manimlib/scene/scene_from_video.py similarity index 97% rename from scene/scene_from_video.py rename to manimlib/scene/scene_from_video.py index 64334def..72a78ec5 100644 --- a/scene/scene_from_video.py +++ b/manimlib/scene/scene_from_video.py @@ -1,11 +1,7 @@ - - - +from tqdm import tqdm as show_progress import cv2 -from tqdm import tqdm as show_progress - -from scene.scene import Scene +from manimlib.scene.scene import Scene class SceneFromVideo(Scene): diff --git a/scene/three_d_scene.py b/manimlib/scene/three_d_scene.py similarity index 89% rename from scene/three_d_scene.py rename to manimlib/scene/three_d_scene.py index e0525f00..1abe82c0 100644 --- a/scene/three_d_scene.py +++ b/manimlib/scene/three_d_scene.py @@ -1,16 +1,16 @@ -from constants import DEGREES -from constants import PRODUCTION_QUALITY_FRAME_DURATION -from continual_animation.update import ContinualGrowValue -from animation.transform import ApplyMethod -from camera.three_d_camera import ThreeDCamera -from mobject.coordinate_systems import ThreeDAxes -from mobject.geometry import Line -from mobject.three_dimensions import Sphere -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VectorizedPoint -from scene.scene import Scene -from utils.config_ops import digest_config -from utils.config_ops import merge_config +from manimlib.animation.transform import ApplyMethod +from manimlib.camera.three_d_camera import ThreeDCamera +from manimlib.constants import DEGREES +from manimlib.constants import PRODUCTION_QUALITY_FRAME_DURATION +from manimlib.continual_animation.update import ContinualGrowValue +from manimlib.mobject.coordinate_systems import ThreeDAxes +from manimlib.mobject.geometry import Line +from manimlib.mobject.three_dimensions import Sphere +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint +from manimlib.scene.scene import Scene +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import merge_config class ThreeDScene(Scene): diff --git a/scene/vector_space_scene.py b/manimlib/scene/vector_space_scene.py similarity index 91% rename from scene/vector_space_scene.py rename to manimlib/scene/vector_space_scene.py index 6b210e39..bba83f15 100644 --- a/scene/vector_space_scene.py +++ b/manimlib/scene/vector_space_scene.py @@ -1,38 +1,34 @@ - - import numpy as np -from constants import * - -from animation.animation import Animation -from animation.creation import ShowCreation -from animation.creation import Write -from animation.transform import ApplyFunction -from animation.transform import ApplyPointwiseFunction -from animation.creation import FadeOut -from animation.creation import GrowArrow -from animation.transform import Transform -from mobject.mobject import Mobject -from mobject.svg.tex_mobject import TexMobject -from mobject.svg.tex_mobject import TextMobject -from mobject.types.vectorized_mobject import VGroup -from mobject.types.vectorized_mobject import VMobject -from scene.scene import Scene -from mobject.geometry import Arrow -from mobject.geometry import Dot -from mobject.geometry import Line -from mobject.geometry import Rectangle -from mobject.geometry import Vector -from mobject.coordinate_systems import Axes -from mobject.coordinate_systems import NumberPlane - -from mobject.matrix import Matrix -from mobject.matrix import VECTOR_LABEL_SCALE_FACTOR -from mobject.matrix import vector_coordinate_label -from utils.rate_functions import rush_from -from utils.rate_functions import rush_into -from utils.space_ops import angle_of_vector -from utils.space_ops import get_norm +from manimlib.animation.animation import Animation +from manimlib.animation.creation import FadeOut +from manimlib.animation.creation import GrowArrow +from manimlib.animation.creation import ShowCreation +from manimlib.animation.creation import Write +from manimlib.animation.transform import ApplyFunction +from manimlib.animation.transform import ApplyPointwiseFunction +from manimlib.animation.transform import Transform +from manimlib.constants import * +from manimlib.mobject.coordinate_systems import Axes +from manimlib.mobject.coordinate_systems import NumberPlane +from manimlib.mobject.geometry import Arrow +from manimlib.mobject.geometry import Dot +from manimlib.mobject.geometry import Line +from manimlib.mobject.geometry import Rectangle +from manimlib.mobject.geometry import Vector +from manimlib.mobject.matrix import Matrix +from manimlib.mobject.matrix import VECTOR_LABEL_SCALE_FACTOR +from manimlib.mobject.matrix import vector_coordinate_label +from manimlib.mobject.mobject import Mobject +from manimlib.mobject.svg.tex_mobject import TexMobject +from manimlib.mobject.svg.tex_mobject import TextMobject +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VMobject +from manimlib.scene.scene import Scene +from manimlib.utils.rate_functions import rush_from +from manimlib.utils.rate_functions import rush_into +from manimlib.utils.space_ops import angle_of_vector +from manimlib.utils.space_ops import get_norm X_COLOR = GREEN_C Y_COLOR = RED_C diff --git a/scene/zoomed_scene.py b/manimlib/scene/zoomed_scene.py similarity index 89% rename from scene/zoomed_scene.py rename to manimlib/scene/zoomed_scene.py index 3bc763b6..b0065dd5 100644 --- a/scene/zoomed_scene.py +++ b/manimlib/scene/zoomed_scene.py @@ -1,13 +1,10 @@ - - -from scene.moving_camera_scene import MovingCameraScene -from camera.moving_camera import MovingCamera -from camera.multi_camera import MultiCamera -from mobject.types.image_mobject import ImageMobjectFromCamera -from utils.simple_functions import fdiv - -from constants import * -from animation.transform import ApplyMethod +from manimlib.animation.transform import ApplyMethod +from manimlib.camera.moving_camera import MovingCamera +from manimlib.camera.multi_camera import MultiCamera +from manimlib.constants import * +from manimlib.mobject.types.image_mobject import ImageMobjectFromCamera +from manimlib.scene.moving_camera_scene import MovingCameraScene +from manimlib.utils.simple_functions import fdiv # Note, any scenes from old videos using ZoomedScene will almost certainly # break, as it was restructured. diff --git a/stage_scenes.py b/manimlib/stage_scenes.py similarity index 86% rename from stage_scenes.py rename to manimlib/stage_scenes.py index d47f1b27..23e0283f 100644 --- a/stage_scenes.py +++ b/manimlib/stage_scenes.py @@ -1,14 +1,12 @@ - - import inspect import os import sys -from constants import PRODUCTION_QUALITY_CAMERA_CONFIG -from constants import PRODUCTION_QUALITY_FRAME_DURATION -from extract_scene import get_module -from extract_scene import is_scene -from utils.output_directory_getters import get_movie_output_directory +from manimlib.constants import PRODUCTION_QUALITY_CAMERA_CONFIG +from manimlib.constants import PRODUCTION_QUALITY_FRAME_DURATION +from manimlib.extract_scene import get_module +from manimlib.extract_scene import is_scene +from manimlib.utils.output_directory_getters import get_movie_output_directory def get_sorted_scene_classes(module_name): diff --git a/stream_starter.py b/manimlib/stream_starter.py similarity index 73% rename from stream_starter.py rename to manimlib/stream_starter.py index 709faf88..f3477baa 100644 --- a/stream_starter.py +++ b/manimlib/stream_starter.py @@ -1,18 +1,19 @@ -from scene.scene import Scene from time import sleep import code -import constants import os import readline import subprocess +from manimlib.scene.scene import Scene +import manimlib.constants + def start_livestream(to_twitch=False, twitch_key=None): class Manim(): def __new__(cls): kwargs = { - "scene_name": constants.LIVE_STREAM_NAME, + "scene_name": manimlib.constants.LIVE_STREAM_NAME, "open_video_upon_completion": False, "show_file_in_finder": False, # By default, write to file @@ -25,12 +26,12 @@ def start_livestream(to_twitch=False, twitch_key=None): "quiet": True, "ignore_waits": False, "write_all": False, - "name": constants.LIVE_STREAM_NAME, + "name": manimlib.constants.LIVE_STREAM_NAME, "start_at_animation_number": 0, "end_at_animation_number": None, "skip_animations": False, - "camera_config": constants.HIGH_QUALITY_CAMERA_CONFIG, - "frame_duration": constants.MEDIUM_QUALITY_FRAME_DURATION, + "camera_config": manimlib.constants.HIGH_QUALITY_CAMERA_CONFIG, + "frame_duration": manimlib.constants.MEDIUM_QUALITY_FRAME_DURATION, "livestreaming": True, "to_twitch": to_twitch, "twitch_key": twitch_key, @@ -40,7 +41,7 @@ def start_livestream(to_twitch=False, twitch_key=None): if not to_twitch: FNULL = open(os.devnull, 'w') subprocess.Popen( - [constants.STREAMING_CLIENT, constants.STREAMING_URL], + [manimlib.constants.STREAMING_CLIENT, manimlib.constants.STREAMING_URL], stdout=FNULL, stderr=FNULL) sleep(3) @@ -50,4 +51,4 @@ def start_livestream(to_twitch=False, twitch_key=None): shell = code.InteractiveConsole(variables) shell.push("manim = Manim()") shell.push("from big_ol_pile_of_manim_imports import *") - shell.interact(banner=constants.STREAMING_CONSOLE_BANNER) + shell.interact(banner=manimlib.constants.STREAMING_CONSOLE_BANNER) diff --git a/tex_template.tex b/manimlib/tex_template.tex similarity index 100% rename from tex_template.tex rename to manimlib/tex_template.tex diff --git a/mobject/svg/__init__.py b/manimlib/utils/__init__.py similarity index 100% rename from mobject/svg/__init__.py rename to manimlib/utils/__init__.py diff --git a/utils/bezier.py b/manimlib/utils/bezier.py similarity index 97% rename from utils/bezier.py rename to manimlib/utils/bezier.py index f61c47e5..197f5606 100644 --- a/utils/bezier.py +++ b/manimlib/utils/bezier.py @@ -1,8 +1,8 @@ +from scipy import linalg import numpy as np -from scipy import linalg -from utils.simple_functions import choose_using_cache -from utils.space_ops import get_norm +from manimlib.utils.simple_functions import choose_using_cache +from manimlib.utils.space_ops import get_norm CLOSED_THRESHOLD = 0.001 diff --git a/utils/color.py b/manimlib/utils/color.py similarity index 91% rename from utils/color.py rename to manimlib/utils/color.py index 4625fa45..1a5a229b 100644 --- a/utils/color.py +++ b/manimlib/utils/color.py @@ -1,13 +1,13 @@ -import numpy as np import random from colour import Color -from constants import WHITE -from constants import PALETTE +import numpy as np -from utils.bezier import interpolate -from utils.space_ops import normalize -from utils.simple_functions import clip_in_place +from manimlib.constants import PALETTE +from manimlib.constants import WHITE +from manimlib.utils.bezier import interpolate +from manimlib.utils.simple_functions import clip_in_place +from manimlib.utils.space_ops import normalize def color_to_rgb(color): diff --git a/utils/config_ops.py b/manimlib/utils/config_ops.py similarity index 100% rename from utils/config_ops.py rename to manimlib/utils/config_ops.py index dfdd5558..e21ba1ac 100644 --- a/utils/config_ops.py +++ b/manimlib/utils/config_ops.py @@ -1,6 +1,6 @@ +from functools import reduce import inspect import operator as op -from functools import reduce def instantiate(obj): diff --git a/utils/images.py b/manimlib/utils/images.py similarity index 94% rename from utils/images.py rename to manimlib/utils/images.py index 38caf245..57d089b4 100644 --- a/utils/images.py +++ b/manimlib/utils/images.py @@ -2,7 +2,8 @@ import numpy as np import os from PIL import Image -from constants import RASTER_IMAGE_DIR + +from manimlib.constants import RASTER_IMAGE_DIR def get_full_raster_image_path(image_file_name): diff --git a/utils/iterables.py b/manimlib/utils/iterables.py similarity index 100% rename from utils/iterables.py rename to manimlib/utils/iterables.py diff --git a/utils/output_directory_getters.py b/manimlib/utils/output_directory_getters.py similarity index 93% rename from utils/output_directory_getters.py rename to manimlib/utils/output_directory_getters.py index bd05def9..8e8b46dd 100644 --- a/utils/output_directory_getters.py +++ b/manimlib/utils/output_directory_getters.py @@ -1,8 +1,8 @@ import inspect import os -from constants import THIS_DIR -from constants import VIDEO_DIR +from manimlib.constants import THIS_DIR +from manimlib.constants import VIDEO_DIR def add_extension_if_not_present(file_name, extension): diff --git a/utils/paths.py b/manimlib/utils/paths.py similarity index 87% rename from utils/paths.py rename to manimlib/utils/paths.py index b45faa9a..8bc9cca1 100644 --- a/utils/paths.py +++ b/manimlib/utils/paths.py @@ -1,9 +1,9 @@ import numpy as np -from constants import OUT -from utils.bezier import interpolate -from utils.space_ops import rotation_matrix -from utils.space_ops import get_norm +from manimlib.constants import OUT +from manimlib.utils.bezier import interpolate +from manimlib.utils.space_ops import get_norm +from manimlib.utils.space_ops import rotation_matrix STRAIGHT_PATH_THRESHOLD = 0.01 diff --git a/utils/rate_functions.py b/manimlib/utils/rate_functions.py similarity index 95% rename from utils/rate_functions.py rename to manimlib/utils/rate_functions.py index 5610319d..a5646f30 100644 --- a/utils/rate_functions.py +++ b/manimlib/utils/rate_functions.py @@ -1,7 +1,7 @@ import numpy as np -from utils.bezier import bezier -from utils.simple_functions import sigmoid +from manimlib.utils.bezier import bezier +from manimlib.utils.simple_functions import sigmoid def linear(t): diff --git a/utils/simple_functions.py b/manimlib/utils/simple_functions.py similarity index 100% rename from utils/simple_functions.py rename to manimlib/utils/simple_functions.py index 35ad2c97..2cd048f9 100644 --- a/utils/simple_functions.py +++ b/manimlib/utils/simple_functions.py @@ -1,7 +1,7 @@ +from functools import reduce +import inspect import numpy as np import operator as op -import inspect -from functools import reduce def sigmoid(x): diff --git a/utils/sounds.py b/manimlib/utils/sounds.py similarity index 100% rename from utils/sounds.py rename to manimlib/utils/sounds.py diff --git a/utils/space_ops.py b/manimlib/utils/space_ops.py similarity index 96% rename from utils/space_ops.py rename to manimlib/utils/space_ops.py index 2a1b604a..9b5af5bb 100644 --- a/utils/space_ops.py +++ b/manimlib/utils/space_ops.py @@ -1,11 +1,12 @@ +from functools import reduce + import numpy as np -from constants import OUT -from constants import RIGHT -from constants import PI -from constants import TAU -from functools import reduce -from utils.iterables import adjacent_pairs +from manimlib.constants import OUT +from manimlib.constants import PI +from manimlib.constants import RIGHT +from manimlib.constants import TAU +from manimlib.utils.iterables import adjacent_pairs def get_norm(vect): diff --git a/utils/strings.py b/manimlib/utils/strings.py similarity index 100% rename from utils/strings.py rename to manimlib/utils/strings.py index 6f1cb881..b986577d 100644 --- a/utils/strings.py +++ b/manimlib/utils/strings.py @@ -1,6 +1,6 @@ +import itertools as it import re import string -import itertools as it def to_camel_case(name): diff --git a/utils/tex_file_writing.py b/manimlib/utils/tex_file_writing.py similarity index 95% rename from utils/tex_file_writing.py rename to manimlib/utils/tex_file_writing.py index 81a9d42d..061f1957 100644 --- a/utils/tex_file_writing.py +++ b/manimlib/utils/tex_file_writing.py @@ -1,10 +1,9 @@ - import os import hashlib -from constants import TEX_DIR -from constants import TEX_TEXT_TO_REPLACE -from constants import TEX_USE_CTEX +from manimlib.constants import TEX_DIR +from manimlib.constants import TEX_TEXT_TO_REPLACE +from manimlib.constants import TEX_USE_CTEX def tex_hash(expression, template_tex_file_body): diff --git a/mobject/types/__init__.py b/mobject/types/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/once_useful_constructs/__init__.py b/once_useful_constructs/__init__.py deleted file mode 100644 index 6af61901..00000000 --- a/once_useful_constructs/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -import constants -import os -import importlib - -modules = filter( - lambda x: x.endswith(".py"), - os.listdir(constants.THIS_DIR + os.sep + "once_useful_constructs"), -) -modules = list(map( - lambda x: x[:x.find(".py")], - modules -)) -for m in modules: - if m == "__init__": - continue - else: - importlib.import_module("once_useful_constructs." + m, package="once_useful_constructs") - -for m in modules: - if m == "__init__": - continue - m = globals()[m] - module_dict = m.__dict__ - try: - to_import = m.__all__ - except AttributeError: - to_import = [name for name in module_dict if not name.startswith('_')] - globals().update({name: module_dict[name] for name in to_import}) diff --git a/utils/__init__.py b/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 From 9366accf593fa1c569c27e57d249a4830298f2d6 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Mon, 24 Dec 2018 12:49:10 -0800 Subject: [PATCH 06/10] support for inline scenes --- manimlib/config.py | 14 +++++++++++++- manimlib/extract_scene.py | 7 +------ manimlib/utils/output_directory_getters.py | 14 ++++++++------ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/manimlib/config.py b/manimlib/config.py index a53e2f59..7cef66f1 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -2,6 +2,7 @@ import argparse import colour import os import sys +import types import manimlib.constants @@ -70,6 +71,17 @@ def parse_cli(): sys.exit(2) +def get_module(file_name): + if file_name == "-": + module = types.ModuleType("InputModule") + code = "from big_ol_pile_of_manim_imports import *\n\n" + sys.stdin.read() + exec(code, module.__dict__) + return module + else: + module_name = file_name.replace(".py", "").replace(os.sep, ".") + return importlib.import_module(module_name) + + def get_configuration(args): if args.output_name is not None: output_name_root, output_name_ext = os.path.splitext( @@ -86,7 +98,7 @@ def get_configuration(args): output_name = args.output_name config = { - "file": args.file, + "module": get_module(args.file), "scene_name": args.scene_name, "open_video_upon_completion": args.preview, "show_file_in_finder": args.show_file_in_finder, diff --git a/manimlib/extract_scene.py b/manimlib/extract_scene.py index e85eaa78..428dea17 100644 --- a/manimlib/extract_scene.py +++ b/manimlib/extract_scene.py @@ -97,13 +97,8 @@ def get_scene_classes(scene_names_to_classes, config): return prompt_user_for_choice(scene_names_to_classes) -def get_module(file_name): - module_name = file_name.replace(".py", "").replace(os.sep, ".") - return importlib.import_module(module_name) - - def main(config): - module = get_module(config["file"]) + module = config["module"] scene_names_to_classes = dict(inspect.getmembers(module, is_scene)) scene_kwargs = dict([ diff --git a/manimlib/utils/output_directory_getters.py b/manimlib/utils/output_directory_getters.py index 8e8b46dd..972bc2cd 100644 --- a/manimlib/utils/output_directory_getters.py +++ b/manimlib/utils/output_directory_getters.py @@ -20,12 +20,14 @@ def guarantee_existance(path): def get_scene_output_directory(scene_class): - file_path = os.path.abspath(inspect.getfile(scene_class)) - - file_path = os.path.relpath(file_path, THIS_DIR) - file_path = file_path.replace(".pyc", "") - file_path = file_path.replace(".py", "") - return guarantee_existance(os.path.join(VIDEO_DIR, file_path)) + try: + file_path = os.path.abspath(inspect.getfile(scene_class)) + file_path = os.path.relpath(file_path, THIS_DIR) + file_path = file_path.replace(".pyc", "") + file_path = file_path.replace(".py", "") + return guarantee_existance(os.path.join(VIDEO_DIR, file_path)) + except TypeError: + return guarantee_existance(os.path.join(VIDEO_DIR, "input_scenes")) def get_movie_output_directory(scene_class, camera_config, frame_duration): From 54b8d0f8ed190230fdd97195366ddfc3e6910c12 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Mon, 24 Dec 2018 13:28:43 -0800 Subject: [PATCH 07/10] import importlib, start streaming mode upon import --- manim.py | 19 +++++++++++-------- manimlib/config.py | 1 + 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manim.py b/manim.py index 45831bb3..dfcc45ff 100644 --- a/manim.py +++ b/manim.py @@ -3,12 +3,15 @@ import manimlib.config import manimlib.extract_scene import manimlib.stream_starter -args = manimlib.config.parse_cli() -if not args.livestream: - config = manimlib.config.get_configuration(args) - manimlib.extract_scene.main(config) +if __name__ == "__main__": + args = manimlib.config.parse_cli() + if not args.livestream: + config = manimlib.config.get_configuration(args) + manimlib.extract_scene.main(config) + else: + manimlib.stream_starter.start_livestream( + to_twitch=args.to_twitch, + twitch_key=args.twitch_key, + ) else: - manimlib.stream_starter.start_livestream( - to_twitch=args.to_twitch, - twitch_key=args.twitch_key, - ) + manimlib.stream_starter.start_livestream() diff --git a/manimlib/config.py b/manimlib/config.py index 7cef66f1..ee5857c4 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -1,5 +1,6 @@ import argparse import colour +import importlib import os import sys import types From e294c6780135d8744953f085abac1ad269d3e965 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Tue, 25 Dec 2018 19:51:03 -0800 Subject: [PATCH 08/10] add error codes to exits --- manimlib/config.py | 8 ++++++-- manimlib/extract_scene.py | 15 ++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/manimlib/config.py b/manimlib/config.py index ee5857c4..a95ca9ff 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -76,8 +76,12 @@ def get_module(file_name): if file_name == "-": module = types.ModuleType("InputModule") code = "from big_ol_pile_of_manim_imports import *\n\n" + sys.stdin.read() - exec(code, module.__dict__) - return module + try: + exec(code, module.__dict__) + return module + except Exception as e: + print(f"Failed to render scene: {str(e)}") + sys.exit(2) else: module_name = file_name.replace(".py", "").replace(os.sep, ".") return importlib.import_module(module_name) diff --git a/manimlib/extract_scene.py b/manimlib/extract_scene.py index 428dea17..8fc0d281 100644 --- a/manimlib/extract_scene.py +++ b/manimlib/extract_scene.py @@ -49,13 +49,15 @@ def handle_scene(scene, **config): sys.stdout = curr_stdout -def is_scene(obj): +def is_child_scene(obj, module): if not inspect.isclass(obj): return False if not issubclass(obj, Scene): return False if obj == Scene: return False + if not obj.__module__.startswith(module.__name__): + return False return True @@ -73,20 +75,20 @@ def prompt_user_for_choice(name_to_obj): ] except KeyError: print(manimlib.constants.INVALID_NUMBER_MESSAGE) - sys.exit() + sys.exit(2) user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) return [ name_to_obj[num_to_name[int(num_str)]] for num_str in user_input.split(",") ] + except EOFError: + sys.exit(1) def get_scene_classes(scene_names_to_classes, config): if len(scene_names_to_classes) == 0: print(manimlib.constants.NO_SCENE_MESSAGE) return [] - if len(scene_names_to_classes) == 1: - return list(scene_names_to_classes.values()) if config["scene_name"] in scene_names_to_classes: return [scene_names_to_classes[config["scene_name"]]] if config["scene_name"] != "": @@ -99,7 +101,8 @@ def get_scene_classes(scene_names_to_classes, config): def main(config): module = config["module"] - scene_names_to_classes = dict(inspect.getmembers(module, is_scene)) + scene_names_to_classes = dict( + inspect.getmembers(module, lambda x: is_child_scene(x, module))) scene_kwargs = dict([ (key, config[key]) @@ -125,11 +128,13 @@ def main(config): try: handle_scene(SceneClass(**scene_kwargs), **config) play_finish_sound() + sys.exit(0) except Exception: print("\n\n") traceback.print_exc() print("\n\n") play_error_sound() + sys.exit(2) if __name__ == "__main__": From 06f45861407358cb30235c6d9833f87481a61455 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Wed, 26 Dec 2018 21:29:04 -0800 Subject: [PATCH 09/10] remove bad import --- manimlib/mobject/mobject.py | 1 - 1 file changed, 1 deletion(-) diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index 57a6e018..d03539e6 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -10,7 +10,6 @@ import numpy as np from manimlib.constants import * from manimlib.container.container import Container -from manimlib.functools import reduce from manimlib.utils.bezier import interpolate from manimlib.utils.color import color_gradient from manimlib.utils.color import color_to_rgb From 7e3c30d8f99a79968e2c5fed318a6acfb9bdb1a4 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Wed, 26 Dec 2018 22:27:11 -0800 Subject: [PATCH 10/10] restore three_d_scene and svgs --- manimlib/files/Bubbles_speech.svg | 11 +++ manimlib/files/Bubbles_thought.svg | 18 +++++ manimlib/files/PiCreatures_plain.svg | 24 +++++++ manimlib/scene/three_d_scene.py | 103 ++++++++++++++++++++++++++- 4 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 manimlib/files/Bubbles_speech.svg create mode 100644 manimlib/files/Bubbles_thought.svg create mode 100644 manimlib/files/PiCreatures_plain.svg diff --git a/manimlib/files/Bubbles_speech.svg b/manimlib/files/Bubbles_speech.svg new file mode 100644 index 00000000..173ebf35 --- /dev/null +++ b/manimlib/files/Bubbles_speech.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/manimlib/files/Bubbles_thought.svg b/manimlib/files/Bubbles_thought.svg new file mode 100644 index 00000000..c77ebca4 --- /dev/null +++ b/manimlib/files/Bubbles_thought.svg @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/manimlib/files/PiCreatures_plain.svg b/manimlib/files/PiCreatures_plain.svg new file mode 100644 index 00000000..552043d6 --- /dev/null +++ b/manimlib/files/PiCreatures_plain.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/manimlib/scene/three_d_scene.py b/manimlib/scene/three_d_scene.py index b0ba826f..1abe82c0 100644 --- a/manimlib/scene/three_d_scene.py +++ b/manimlib/scene/three_d_scene.py @@ -1,14 +1,26 @@ from manimlib.animation.transform import ApplyMethod from manimlib.camera.three_d_camera import ThreeDCamera -from manimlib.constants import * +from manimlib.constants import DEGREES +from manimlib.constants import PRODUCTION_QUALITY_FRAME_DURATION from manimlib.continual_animation.update import ContinualGrowValue +from manimlib.mobject.coordinate_systems import ThreeDAxes +from manimlib.mobject.geometry import Line +from manimlib.mobject.three_dimensions import Sphere +from manimlib.mobject.types.vectorized_mobject import VGroup +from manimlib.mobject.types.vectorized_mobject import VectorizedPoint from manimlib.scene.scene import Scene +from manimlib.utils.config_ops import digest_config +from manimlib.utils.config_ops import merge_config class ThreeDScene(Scene): CONFIG = { "camera_class": ThreeDCamera, "ambient_camera_rotation": None, + "default_angled_camera_orientation_kwargs": { + "phi": 70 * DEGREES, + "theta": -135 * DEGREES, + } } def set_camera_orientation(self, phi=None, theta=None, distance=None, gamma=None): @@ -21,7 +33,7 @@ class ThreeDScene(Scene): if gamma is not None: self.camera.set_gamma(gamma) - def begin_ambient_camera_rotation(self, rate=0.05): + def begin_ambient_camera_rotation(self, rate=0.02): self.ambient_camera_rotation = ContinualGrowValue( self.camera.theta_tracker, rate=rate @@ -85,3 +97,90 @@ class ThreeDScene(Scene): def remove_fixed_in_frame_mobjects(self, *mobjects): self.camera.remove_fixed_in_frame_mobjects(*mobjects) + + ## + def set_to_default_angled_camera_orientation(self, **kwargs): + config = dict(self.default_camera_orientation_kwargs) + config.update(kwargs) + self.set_camera_orientation(**config) + + +class SpecialThreeDScene(ThreeDScene): + CONFIG = { + "cut_axes_at_radius": True, + "camera_config": { + "should_apply_shading": True, + "exponential_projection": True, + }, + "three_d_axes_config": { + "num_axis_pieces": 1, + "number_line_config": { + "unit_size": 2, + "tick_frequency": 1, + "numbers_with_elongated_ticks": [0, 1, 2], + "stroke_width": 2, + } + }, + "sphere_config": { + "radius": 2, + "resolution": (24, 48), + }, + "default_angled_camera_position": { + "phi": 70 * DEGREES, + "theta": -110 * DEGREES, + }, + # When scene is extracted with -l flag, this + # configuration will override the above configuration. + "low_quality_config": { + "camera_config": { + "should_apply_shading": False, + }, + "three_d_axes_config": { + "num_axis_pieces": 1, + }, + "sphere_config": { + "resolution": (12, 24), + } + } + } + + def __init__(self, **kwargs): + digest_config(self, kwargs) + if self.frame_duration == PRODUCTION_QUALITY_FRAME_DURATION: + config = {} + else: + config = self.low_quality_config + ThreeDScene.__init__(self, **merge_config([kwargs, config])) + + def get_axes(self): + axes = ThreeDAxes(**self.three_d_axes_config) + for axis in axes: + if self.cut_axes_at_radius: + p0 = axis.main_line.get_start() + p1 = axis.number_to_point(-1) + p2 = axis.number_to_point(1) + p3 = axis.main_line.get_end() + new_pieces = VGroup( + Line(p0, p1), Line(p1, p2), Line(p2, p3), + ) + for piece in new_pieces: + piece.shade_in_3d = True + new_pieces.match_style(axis.pieces) + axis.pieces.submobjects = new_pieces.submobjects + for tick in axis.tick_marks: + tick.add(VectorizedPoint( + 1.5 * tick.get_center(), + )) + return axes + + def get_sphere(self, **kwargs): + config = merge_config([kwargs, self.sphere_config]) + return Sphere(**config) + + def get_default_camera_position(self): + return self.default_angled_camera_position + + def set_camera_to_default_position(self): + self.set_camera_orientation( + **self.default_angled_camera_position + )