From e3b467720f30819c4c89123f972bc1ee95b536dc Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Tue, 19 May 2020 20:55:17 -0700 Subject: [PATCH 01/98] Convert absolute imports to relative imports --- .gitignore | 2 +- manimlib/__init__.py | 14 +- manimlib/animation/animation.py | 8 +- manimlib/animation/composition.py | 16 +- manimlib/animation/creation.py | 20 +- manimlib/animation/fading.py | 16 +- manimlib/animation/growing.py | 6 +- manimlib/animation/indication.py | 40 +- manimlib/animation/movement.py | 6 +- manimlib/animation/numbers.py | 8 +- manimlib/animation/rotation.py | 14 +- manimlib/animation/specialized.py | 22 +- manimlib/animation/transform.py | 24 +- manimlib/animation/update.py | 4 +- manimlib/camera/camera.py | 30 +- manimlib/camera/mapping_camera.py | 10 +- manimlib/camera/moving_camera.py | 18 +- manimlib/camera/multi_camera.py | 6 +- manimlib/camera/three_d_camera.py | 26 +- manimlib/config.py | 44 +- manimlib/container/container.py | 4 +- manimlib/extract_scene.py | 39 +- manimlib/for_3b1b_videos/common_scenes.py | 50 +- manimlib/for_3b1b_videos/pi_class.py | 8 +- manimlib/for_3b1b_videos/pi_creature.py | 24 +- .../for_3b1b_videos/pi_creature_animations.py | 30 +- manimlib/for_3b1b_videos/pi_creature_scene.py | 42 +- manimlib/imports.py | 154 ++--- manimlib/mobject/changing.py | 12 +- manimlib/mobject/coordinate_systems.py | 24 +- manimlib/mobject/frame.py | 8 +- manimlib/mobject/functions.py | 8 +- manimlib/mobject/geometry.py | 34 +- manimlib/mobject/matrix.py | 18 +- manimlib/mobject/mobject.py | 29 +- manimlib/mobject/mobject_update_utils.py | 8 +- manimlib/mobject/number_line.py | 20 +- manimlib/mobject/numbers.py | 8 +- manimlib/mobject/probability.py | 22 +- manimlib/mobject/shape_matchers.py | 16 +- manimlib/mobject/svg/brace.py | 20 +- manimlib/mobject/svg/code_mobject.py | 620 +++++++++--------- manimlib/mobject/svg/drawings.py | 58 +- manimlib/mobject/svg/svg_mobject.py | 20 +- manimlib/mobject/svg/tex_mobject.py | 20 +- manimlib/mobject/svg/text_mobject.py | 19 +- manimlib/mobject/three_d_shading_utils.py | 6 +- manimlib/mobject/three_d_utils.py | 10 +- manimlib/mobject/three_dimensions.py | 14 +- manimlib/mobject/types/image_mobject.py | 16 +- manimlib/mobject/types/point_cloud_mobject.py | 20 +- manimlib/mobject/types/vectorized_mobject.py | 32 +- manimlib/mobject/value_tracker.py | 4 +- manimlib/mobject/vector_field.py | 32 +- manimlib/once_useful_constructs/arithmetic.py | 10 +- .../once_useful_constructs/combinatorics.py | 12 +- .../complex_transformation_scene.py | 16 +- manimlib/once_useful_constructs/counting.py | 24 +- manimlib/once_useful_constructs/fractals.py | 34 +- .../once_useful_constructs/graph_theory.py | 10 +- manimlib/once_useful_constructs/light.py | 30 +- .../matrix_multiplication.py | 24 +- manimlib/once_useful_constructs/region.py | 8 +- manimlib/scene/graph_scene.py | 38 +- manimlib/scene/moving_camera_scene.py | 8 +- manimlib/scene/reconfigurable_scene.py | 10 +- manimlib/scene/sample_space_scene.py | 18 +- manimlib/scene/scene.py | 18 +- manimlib/scene/scene_file_writer.py | 33 +- manimlib/scene/scene_from_video.py | 4 +- manimlib/scene/three_d_scene.py | 26 +- manimlib/scene/vector_space_scene.py | 60 +- manimlib/scene/zoomed_scene.py | 16 +- manimlib/utils/bezier.py | 4 +- manimlib/utils/color.py | 12 +- manimlib/utils/config_ops.py | 2 +- manimlib/utils/debug.py | 8 +- manimlib/utils/file_ops.py | 2 +- manimlib/utils/images.py | 4 +- manimlib/utils/iterables.py | 2 +- manimlib/utils/paths.py | 10 +- manimlib/utils/rate_functions.py | 6 +- manimlib/utils/simple_functions.py | 2 +- manimlib/utils/sounds.py | 4 +- manimlib/utils/space_ops.py | 14 +- manimlib/utils/strings.py | 2 +- manimlib/utils/tex_file_writing.py | 10 +- 87 files changed, 1125 insertions(+), 1139 deletions(-) diff --git a/.gitignore b/.gitignore index 5055cdfb13..deba21f372 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,4 @@ dist/ manim.egg-info/ primes.py -/media_dir.txt \ No newline at end of file +/media_dir.txt diff --git a/manimlib/__init__.py b/manimlib/__init__.py index f4274cb668..1185c9c3b0 100644 --- a/manimlib/__init__.py +++ b/manimlib/__init__.py @@ -1,11 +1,11 @@ #!/usr/bin/env python -import manimlib.config -import manimlib.constants -import manimlib.extract_scene +from . import config +from . import constants def main(): - args = manimlib.config.parse_cli() - config = manimlib.config.get_configuration(args) - manimlib.constants.initialize_directories(config) - manimlib.extract_scene.main(config) + args = config.parse_cli() + cfg = config.get_configuration(args) + constants.initialize_directories(cfg) + from . import extract_scene + extract_scene.main(cfg) diff --git a/manimlib/animation/animation.py b/manimlib/animation/animation.py index 17ea65fa9d..3abe8ee8fc 100644 --- a/manimlib/animation/animation.py +++ b/manimlib/animation/animation.py @@ -2,9 +2,9 @@ import numpy as np -from manimlib.mobject.mobject import Mobject -from manimlib.utils.config_ops import digest_config -from manimlib.utils.rate_functions import smooth +from ..mobject.mobject import Mobject +from ..utils.config_ops import digest_config +from ..utils.rate_functions import smooth DEFAULT_ANIMATION_RUN_TIME = 1.0 @@ -157,4 +157,4 @@ def set_name(self, name): return self def is_remover(self): - return self.remover + return self.remover \ No newline at end of file diff --git a/manimlib/animation/composition.py b/manimlib/animation/composition.py index 753f5111bc..b739707a9e 100644 --- a/manimlib/animation/composition.py +++ b/manimlib/animation/composition.py @@ -1,12 +1,12 @@ import numpy as np -from manimlib.animation.animation import Animation -from manimlib.mobject.mobject import Group -from manimlib.utils.bezier import integer_interpolate -from manimlib.utils.bezier import interpolate -from manimlib.utils.config_ops import digest_config -from manimlib.utils.iterables import remove_list_redundancies -from manimlib.utils.rate_functions import linear +from ..animation.animation import Animation +from ..mobject.mobject import Group +from ..utils.bezier import integer_interpolate +from ..utils.bezier import interpolate +from ..utils.config_ops import digest_config +from ..utils.iterables import remove_list_redundancies +from ..utils.rate_functions import linear DEFAULT_LAGGED_START_LAG_RATIO = 0.05 @@ -159,4 +159,4 @@ def __init__(self, AnimationClass, mobject, arg_creator=None, **kwargs): AnimationClass(*args, **anim_kwargs) for args in args_list ] - super().__init__(*animations, **kwargs) + super().__init__(*animations, **kwargs) \ No newline at end of file diff --git a/manimlib/animation/creation.py b/manimlib/animation/creation.py index 692e384ecb..4131c82883 100644 --- a/manimlib/animation/creation.py +++ b/manimlib/animation/creation.py @@ -1,12 +1,12 @@ -from manimlib.animation.animation import Animation -from manimlib.animation.composition import Succession -from manimlib.mobject.types.vectorized_mobject import VMobject -from manimlib.mobject.mobject import Group -from manimlib.utils.bezier import integer_interpolate -from manimlib.utils.config_ops import digest_config -from manimlib.utils.rate_functions import linear -from manimlib.utils.rate_functions import double_smooth -from manimlib.utils.rate_functions import smooth +from ..animation.animation import Animation +from ..animation.composition import Succession +from ..mobject.types.vectorized_mobject import VMobject +from ..mobject.mobject import Group +from ..utils.bezier import integer_interpolate +from ..utils.config_ops import digest_config +from ..utils.rate_functions import linear +from ..utils.rate_functions import double_smooth +from ..utils.rate_functions import smooth import numpy as np import itertools as it @@ -177,4 +177,4 @@ def __init__(self, text_mobject, **kwargs): ] for word in text_mobject ]) - super().__init__(*anims, **kwargs) + super().__init__(*anims, **kwargs) \ No newline at end of file diff --git a/manimlib/animation/fading.py b/manimlib/animation/fading.py index 9f5ea190d8..74edf5a3fd 100644 --- a/manimlib/animation/fading.py +++ b/manimlib/animation/fading.py @@ -1,10 +1,10 @@ -from manimlib.animation.animation import Animation -from manimlib.animation.animation import DEFAULT_ANIMATION_LAG_RATIO -from manimlib.animation.transform import Transform -from manimlib.constants import DOWN -from manimlib.mobject.types.vectorized_mobject import VMobject -from manimlib.utils.bezier import interpolate -from manimlib.utils.rate_functions import there_and_back +from ..animation.animation import Animation +from ..animation.animation import DEFAULT_ANIMATION_LAG_RATIO +from ..animation.transform import Transform +from ..constants import DOWN +from ..mobject.types.vectorized_mobject import VMobject +from ..utils.bezier import interpolate +from ..utils.rate_functions import there_and_back DEFAULT_FADE_LAG_RATIO = 0 @@ -156,4 +156,4 @@ class VFadeInThenOut(VFadeIn): CONFIG = { "rate_func": there_and_back, "remover": True, - } + } \ No newline at end of file diff --git a/manimlib/animation/growing.py b/manimlib/animation/growing.py index e2a53cb737..b6c880f58b 100644 --- a/manimlib/animation/growing.py +++ b/manimlib/animation/growing.py @@ -1,6 +1,6 @@ -from manimlib.animation.transform import Transform -# from manimlib.utils.paths import counterclockwise_path -from manimlib.constants import PI +from ..animation.transform import Transform +# from ..utils.paths import counterclockwise_path +from ..constants import PI class GrowFromPoint(Transform): diff --git a/manimlib/animation/indication.py b/manimlib/animation/indication.py index 268ad5f482..0daef10a57 100644 --- a/manimlib/animation/indication.py +++ b/manimlib/animation/indication.py @@ -1,24 +1,24 @@ import numpy as np -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.fading import FadeOut -from manimlib.animation.transform import Transform -from manimlib.mobject.types.vectorized_mobject import VMobject -from manimlib.mobject.geometry import Circle -from manimlib.mobject.geometry import Dot -from manimlib.mobject.shape_matchers import SurroundingRectangle -from manimlib.mobject.types.vectorized_mobject import VGroup -from manimlib.mobject.geometry import Line -from manimlib.utils.bezier import interpolate -from manimlib.utils.config_ops import digest_config -from manimlib.utils.rate_functions import there_and_back -from manimlib.utils.rate_functions import wiggle +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.fading import FadeOut +from ..animation.transform import Transform +from ..mobject.types.vectorized_mobject import VMobject +from ..mobject.geometry import Circle +from ..mobject.geometry import Dot +from ..mobject.shape_matchers import SurroundingRectangle +from ..mobject.types.vectorized_mobject import VGroup +from ..mobject.geometry import Line +from ..utils.bezier import interpolate +from ..utils.config_ops import digest_config +from ..utils.rate_functions import there_and_back +from ..utils.rate_functions import wiggle class FocusOn(Transform): @@ -275,4 +275,4 @@ class TurnInsideOut(Transform): } def create_target(self): - return self.mobject.copy().reverse_points() + return self.mobject.copy().reverse_points() \ No newline at end of file diff --git a/manimlib/animation/movement.py b/manimlib/animation/movement.py index f6a3ec055e..fee1bb9c35 100644 --- a/manimlib/animation/movement.py +++ b/manimlib/animation/movement.py @@ -1,5 +1,5 @@ -from manimlib.animation.animation import Animation -from manimlib.utils.rate_functions import linear +from ..animation.animation import Animation +from ..utils.rate_functions import linear class Homotopy(Animation): @@ -75,4 +75,4 @@ def __init__(self, mobject, path, **kwargs): def interpolate_mobject(self, alpha): point = self.path.point_from_proportion(alpha) - self.mobject.move_to(point) + self.mobject.move_to(point) \ No newline at end of file diff --git a/manimlib/animation/numbers.py b/manimlib/animation/numbers.py index e1f354d273..df3a373ae3 100644 --- a/manimlib/animation/numbers.py +++ b/manimlib/animation/numbers.py @@ -1,8 +1,8 @@ import warnings -from manimlib.animation.animation import Animation -from manimlib.mobject.numbers import DecimalNumber -from manimlib.utils.bezier import interpolate +from ..animation.animation import Animation +from ..mobject.numbers import DecimalNumber +from ..utils.bezier import interpolate class ChangingDecimal(Animation): @@ -49,4 +49,4 @@ def __init__(self, decimal_mob, target_number, **kwargs): decimal_mob, lambda a: interpolate(start_number, target_number, a), **kwargs - ) + ) \ No newline at end of file diff --git a/manimlib/animation/rotation.py b/manimlib/animation/rotation.py index 7578c4d6fe..232eb79d5c 100644 --- a/manimlib/animation/rotation.py +++ b/manimlib/animation/rotation.py @@ -1,9 +1,9 @@ -from manimlib.animation.animation import Animation -from manimlib.animation.transform import Transform -from manimlib.constants import OUT -from manimlib.constants import PI -from manimlib.constants import TAU -from manimlib.utils.rate_functions import linear +from ..animation.animation import Animation +from ..animation.transform import Transform +from ..constants import OUT +from ..constants import PI +from ..constants import TAU +from ..utils.rate_functions import linear class Rotating(Animation): @@ -49,4 +49,4 @@ def create_target(self): about_point=self.about_point, about_edge=self.about_edge, ) - return target + return target \ No newline at end of file diff --git a/manimlib/animation/specialized.py b/manimlib/animation/specialized.py index c4f5457d99..4438ead655 100644 --- a/manimlib/animation/specialized.py +++ b/manimlib/animation/specialized.py @@ -1,15 +1,15 @@ import operator as op -from manimlib.animation.composition import LaggedStart -from manimlib.animation.transform import ApplyMethod -from manimlib.animation.transform import Restore -from manimlib.constants import WHITE -from manimlib.constants import BLACK -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 +from ..animation.composition import LaggedStart +from ..animation.transform import ApplyMethod +from ..animation.transform import Restore +from ..constants import WHITE +from ..constants import BLACK +from ..mobject.geometry import Circle +from ..mobject.svg.drawings import Car +from ..mobject.types.vectorized_mobject import VGroup +from ..utils.config_ops import digest_config +from ..utils.space_ops import get_norm class MoveCar(ApplyMethod): @@ -81,4 +81,4 @@ def __init__(self, focal_point, **kwargs): Restore(circle) for circle in circles ] - super().__init__(*animations, **kwargs) + super().__init__(*animations, **kwargs) \ No newline at end of file diff --git a/manimlib/animation/transform.py b/manimlib/animation/transform.py index ef07090cf5..9bf330a18e 100644 --- a/manimlib/animation/transform.py +++ b/manimlib/animation/transform.py @@ -2,17 +2,17 @@ import numpy as np -from manimlib.animation.animation import Animation -from manimlib.constants import DEFAULT_POINTWISE_FUNCTION_RUN_TIME -from manimlib.constants import OUT -from manimlib.constants import DEGREES -from manimlib.mobject.mobject import Group -from manimlib.mobject.mobject import Mobject -from manimlib.utils.config_ops import digest_config -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 ..animation.animation import Animation +from ..constants import DEFAULT_POINTWISE_FUNCTION_RUN_TIME +from ..constants import OUT +from ..constants import DEGREES +from ..mobject.mobject import Group +from ..mobject.mobject import Mobject +from ..utils.config_ops import digest_config +from ..utils.paths import path_along_arc +from ..utils.paths import straight_path +from ..utils.rate_functions import smooth +from ..utils.rate_functions import squish_rate_func class Transform(Animation): @@ -321,4 +321,4 @@ def __init__(self, start_anim, end_anim, **kwargs): def interpolate(self, alpha): self.start_anim.interpolate(alpha) self.end_anim.interpolate(alpha) - Transform.interpolate(self, alpha) + Transform.interpolate(self, alpha) \ No newline at end of file diff --git a/manimlib/animation/update.py b/manimlib/animation/update.py index 57856a2ff8..4717076299 100644 --- a/manimlib/animation/update.py +++ b/manimlib/animation/update.py @@ -1,6 +1,6 @@ import operator as op -from manimlib.animation.animation import Animation +from ..animation.animation import Animation class UpdateFromFunc(Animation): @@ -38,4 +38,4 @@ def __init__(self, mobject, tracked_mobject, **kwargs): def interpolate_mobject(self, alpha): target = self.tracked_mobject.get_center() location = self.mobject.get_center() - self.mobject.shift(target - location + self.diff) + self.mobject.shift(target - location + self.diff) \ No newline at end of file diff --git a/manimlib/camera/camera.py b/manimlib/camera/camera.py index 94c111eb23..5812bc3e16 100644 --- a/manimlib/camera/camera.py +++ b/manimlib/camera/camera.py @@ -9,20 +9,20 @@ import cairo import numpy as np -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.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 +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.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 class Camera(object): @@ -709,4 +709,4 @@ def display(self, *cvmobjects): else: curr_array = np.maximum(curr_array, new_array) self.reset_pixel_array() - return curr_array + return curr_array \ No newline at end of file diff --git a/manimlib/camera/mapping_camera.py b/manimlib/camera/mapping_camera.py index c80c91cfec..7b39954707 100644 --- a/manimlib/camera/mapping_camera.py +++ b/manimlib/camera/mapping_camera.py @@ -1,9 +1,9 @@ import numpy as np -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 +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 # 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.) @@ -110,4 +110,4 @@ def __init__(self, left_camera, right_camera, **kwargs): self, (left_camera, (0, 0)), (right_camera, (0, half_width)), - ) + ) \ No newline at end of file diff --git a/manimlib/camera/moving_camera.py b/manimlib/camera/moving_camera.py index c54a1e6b2b..4cd9fcde77 100644 --- a/manimlib/camera/moving_camera.py +++ b/manimlib/camera/moving_camera.py @@ -1,11 +1,11 @@ -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.utils.config_ops import digest_config +from ..camera.camera import Camera +from ..constants import FRAME_HEIGHT +from ..constants import FRAME_WIDTH +from ..constants import ORIGIN +from ..constants import WHITE +from ..mobject.frame import ScreenRectangle +from ..mobject.types.vectorized_mobject import VGroup +from ..utils.config_ops import digest_config # TODO, think about how to incorporate perspective @@ -95,4 +95,4 @@ def get_mobjects_indicating_movement(self): Returns all mobjets whose movement implies that the camera should think of all other mobjects on the screen as moving """ - return [self.frame] + return [self.frame] \ No newline at end of file diff --git a/manimlib/camera/multi_camera.py b/manimlib/camera/multi_camera.py index 9283b0e79a..cac1852b07 100644 --- a/manimlib/camera/multi_camera.py +++ b/manimlib/camera/multi_camera.py @@ -1,5 +1,5 @@ -from manimlib.camera.moving_camera import MovingCamera -from manimlib.utils.iterables import list_difference_update +from ..camera.moving_camera import MovingCamera +from ..utils.iterables import list_difference_update class MultiCamera(MovingCamera): @@ -54,4 +54,4 @@ def get_mobjects_indicating_movement(self): return [self.frame] + [ imfc.camera.frame for imfc in self.image_mobjects_from_cameras - ] + ] \ No newline at end of file diff --git a/manimlib/camera/three_d_camera.py b/manimlib/camera/three_d_camera.py index 5cf4ba0d10..97b6182c7f 100644 --- a/manimlib/camera/three_d_camera.py +++ b/manimlib/camera/three_d_camera.py @@ -1,17 +1,17 @@ import numpy as np -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.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 rotation_about_z -from manimlib.utils.space_ops import rotation_matrix +from ..camera.camera import Camera +from ..constants import * +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.three_d_utils import get_3d_vmob_start_corner +from ..mobject.three_d_utils import get_3d_vmob_start_corner_unit_normal +from ..mobject.types.point_cloud_mobject import Point +from ..mobject.value_tracker import ValueTracker +from ..utils.color import get_shaded_rgb +from ..utils.simple_functions import clip_in_place +from ..utils.space_ops import rotation_about_z +from ..utils.space_ops import rotation_matrix class ThreeDCamera(Camera): @@ -229,4 +229,4 @@ def remove_fixed_orientation_mobjects(self, *mobjects): def remove_fixed_in_frame_mobjects(self, *mobjects): for mobject in self.extract_mobject_family_members(mobjects): if mobject in self.fixed_in_frame_mobjects: - self.fixed_in_frame_mobjects.remove(mobject) + self.fixed_in_frame_mobjects.remove(mobject) \ No newline at end of file diff --git a/manimlib/config.py b/manimlib/config.py index b2a8ed82ea..1fb2e11ced 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -1,11 +1,10 @@ import argparse import colour -import importlib.util import os import sys import types -import manimlib.constants +from . import constants def parse_cli(): @@ -138,26 +137,7 @@ def parse_cli(): sys.exit(2) -def get_module(file_name): - if file_name == "-": - module = types.ModuleType("input_scenes") - code = "from manimlib.imports import *\n\n" + sys.stdin.read() - try: - exec(code, module.__dict__) - return module - except Exception as e: - print(f"Failed to render scene: {str(e)}") - sys.exit(2) - else: - module_name = file_name.replace(os.sep, ".").replace(".py", "") - spec = importlib.util.spec_from_file_location(module_name, file_name) - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - return module - - def get_configuration(args): - module = get_module(args.file) file_writer_config = { # By default, write to file "write_to_movie": args.write_to_movie or not args.save_last_frame, @@ -170,10 +150,8 @@ def get_configuration(args): "file_name": args.file_name, "input_file_path": args.file, } - if hasattr(module, "OUTPUT_DIRECTORY"): - file_writer_config["output_directory"] = module.OUTPUT_DIRECTORY config = { - "module": module, + "file": args.file, "scene_names": args.scene_names, "open_video_upon_completion": args.preview, "show_file_in_finder": args.show_file_in_finder, @@ -214,26 +192,26 @@ def get_configuration(args): def get_camera_configuration(args): camera_config = {} if args.low_quality: - camera_config.update(manimlib.constants.LOW_QUALITY_CAMERA_CONFIG) + camera_config.update(constants.LOW_QUALITY_CAMERA_CONFIG) elif args.medium_quality: - camera_config.update(manimlib.constants.MEDIUM_QUALITY_CAMERA_CONFIG) + camera_config.update(constants.MEDIUM_QUALITY_CAMERA_CONFIG) elif args.high_quality: - camera_config.update(manimlib.constants.HIGH_QUALITY_CAMERA_CONFIG) + camera_config.update(constants.HIGH_QUALITY_CAMERA_CONFIG) elif args.four_k: - camera_config.update(manimlib.constants.FOURK_CAMERA_CONFIG) + camera_config.update(constants.FOURK_CAMERA_CONFIG) else: - camera_config.update(manimlib.constants.PRODUCTION_QUALITY_CAMERA_CONFIG) + camera_config.update(constants.PRODUCTION_QUALITY_CAMERA_CONFIG) # If the resolution was passed in via -r if args.resolution: if args.resolution.lower() == "low": - camera_config.update(manimlib.constants.LOW_QUALITY_CAMERA_CONFIG) + camera_config.update(constants.LOW_QUALITY_CAMERA_CONFIG) elif args.resolution.lower() == "medium": - camera_config.update(manimlib.constants.MEDIUM_QUALITY_CAMERA_CONFIG) + camera_config.update(constants.MEDIUM_QUALITY_CAMERA_CONFIG) elif args.resolution.lower() == "high": - camera_config.update(manimlib.constants.HIGH_QUALITY_CAMERA_CONFIG) + camera_config.update(constants.HIGH_QUALITY_CAMERA_CONFIG) elif args.resolution.lower() == "4K": - camera_config.update(manimlib.constants.FOURK_CAMERA_CONFIG) + camera_config.update(constants.FOURK_CAMERA_CONFIG) elif "," in args.resolution: height_str, width_str = args.resolution.split(",") diff --git a/manimlib/container/container.py b/manimlib/container/container.py index 95cf004bbf..5f1274f03b 100644 --- a/manimlib/container/container.py +++ b/manimlib/container/container.py @@ -1,4 +1,4 @@ -from manimlib.utils.config_ops import digest_config +from ..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. @@ -28,4 +28,4 @@ def remove(self, *items): Must be implemented by subclasses. """ raise Exception( - "Container.remove is not implemented; it is up to derived classes to implement") + "Container.remove is not implemented; it is up to derived classes to implement") \ No newline at end of file diff --git a/manimlib/extract_scene.py b/manimlib/extract_scene.py index 7185f6eb56..27f9e1fbd5 100644 --- a/manimlib/extract_scene.py +++ b/manimlib/extract_scene.py @@ -5,11 +5,12 @@ import subprocess as sp import sys import traceback +import importlib.util -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 +from .scene.scene import Scene +from .utils.sounds import play_error_sound +from .utils.sounds import play_finish_sound +from . import constants def open_file_if_needed(file_writer, **config): @@ -76,15 +77,15 @@ def prompt_user_for_choice(scene_classes): print("%d: %s" % (count, name)) num_to_class[count] = scene_class try: - user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) + user_input = input(constants.CHOOSE_NUMBER_MESSAGE) return [ num_to_class[int(num_str)] for num_str in user_input.split(",") ] except KeyError: - print(manimlib.constants.INVALID_NUMBER_MESSAGE) + print(constants.INVALID_NUMBER_MESSAGE) sys.exit(2) - user_input = input(manimlib.constants.CHOOSE_NUMBER_MESSAGE) + user_input = input(constants.CHOOSE_NUMBER_MESSAGE) return [ num_to_class[int(num_str)] for num_str in user_input.split(",") @@ -95,7 +96,7 @@ def prompt_user_for_choice(scene_classes): def get_scenes_to_render(scene_classes, config): if len(scene_classes) == 0: - print(manimlib.constants.NO_SCENE_MESSAGE) + print(constants.NO_SCENE_MESSAGE) return [] if config["write_all"]: return scene_classes @@ -109,7 +110,7 @@ def get_scenes_to_render(scene_classes, config): break if not found and (scene_name != ""): print( - manimlib.constants.SCENE_NOT_FOUND_MESSAGE.format( + constants.SCENE_NOT_FOUND_MESSAGE.format( scene_name ), file=sys.stderr @@ -132,8 +133,26 @@ def get_scene_classes_from_module(module): ] +def get_module(file_name): + if file_name == "-": + module = types.ModuleType("input_scenes") + code = sys.stdin.read() + try: + exec(code, module.__dict__) + return module + except Exception as e: + print(f"Failed to render scene: {str(e)}") + sys.exit(2) + else: + module_name = file_name.replace(os.sep, ".").replace(".py", "") + spec = importlib.util.spec_from_file_location(module_name, file_name) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + def main(config): - module = config["module"] + module = get_module(config["file"]) all_scene_classes = get_scene_classes_from_module(module) scene_classes_to_render = get_scenes_to_render(all_scene_classes, config) diff --git a/manimlib/for_3b1b_videos/common_scenes.py b/manimlib/for_3b1b_videos/common_scenes.py index da83fbb470..7a938a7d7f 100644 --- a/manimlib/for_3b1b_videos/common_scenes.py +++ b/manimlib/for_3b1b_videos/common_scenes.py @@ -1,29 +1,29 @@ import random -from manimlib.animation.composition import LaggedStartMap -from manimlib.animation.creation import DrawBorderThenFill -from manimlib.animation.creation import Write -from manimlib.animation.fading import FadeIn -from manimlib.animation.fading import FadeOut -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.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.mobject.mobject_update_utils import always_shift -from manimlib.scene.moving_camera_scene import MovingCameraScene -from manimlib.scene.scene import Scene -from manimlib.utils.rate_functions import linear -from manimlib.utils.space_ops import get_norm -from manimlib.utils.space_ops import normalize +from ..animation.composition import LaggedStartMap +from ..animation.creation import DrawBorderThenFill +from ..animation.creation import Write +from ..animation.fading import FadeIn +from ..animation.fading import FadeOut +from ..constants import * +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_scene import PiCreatureScene +from ..mobject.geometry import DashedLine +from ..mobject.geometry import Line +from ..mobject.geometry import Rectangle +from ..mobject.geometry import Square +from ..mobject.svg.drawings import Logo +from ..mobject.svg.drawings import PatreonLogo +from ..mobject.svg.tex_mobject import TextMobject +from ..mobject.types.vectorized_mobject import VGroup +from ..mobject.mobject_update_utils import always_shift +from ..scene.moving_camera_scene import MovingCameraScene +from ..scene.scene import Scene +from ..utils.rate_functions import linear +from ..utils.space_ops import get_norm +from ..utils.space_ops import normalize class OpeningQuote(Scene): @@ -392,4 +392,4 @@ def get_supporter_note(self): return TextMobject( "(Available to supporters for review now)", color="#F96854", - ) + ) \ No newline at end of file diff --git a/manimlib/for_3b1b_videos/pi_class.py b/manimlib/for_3b1b_videos/pi_class.py index 77a813e185..c3227eebf8 100644 --- a/manimlib/for_3b1b_videos/pi_class.py +++ b/manimlib/for_3b1b_videos/pi_class.py @@ -1,6 +1,6 @@ -from manimlib.constants import * -from manimlib.for_3b1b_videos.pi_creature import PiCreature -from manimlib.mobject.types.vectorized_mobject import VGroup +from ..constants import * +from ..for_3b1b_videos.pi_creature import PiCreature +from ..mobject.types.vectorized_mobject import VGroup class PiCreatureClass(VGroup): @@ -15,4 +15,4 @@ def __init__(self, **kwargs): for j in range(self.height): pi = PiCreature().scale(0.3) pi.move_to(i * DOWN + j * RIGHT) - self.add(pi) + self.add(pi) \ No newline at end of file diff --git a/manimlib/for_3b1b_videos/pi_creature.py b/manimlib/for_3b1b_videos/pi_creature.py index 4e02646341..6f865c1e67 100644 --- a/manimlib/for_3b1b_videos/pi_creature.py +++ b/manimlib/for_3b1b_videos/pi_creature.py @@ -3,17 +3,17 @@ import numpy as np -from manimlib.constants import * -from manimlib.mobject.mobject import Mobject -from manimlib.mobject.geometry import Circle -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.space_ops import get_norm -from manimlib.utils.space_ops import normalize +from ..constants import * +from ..mobject.mobject import Mobject +from ..mobject.geometry import Circle +from ..mobject.svg.drawings import ThoughtBubble +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 ..utils.config_ops import digest_config +from ..utils.space_ops import get_norm +from ..utils.space_ops import normalize pi_creature_dir_maybe = os.path.join(MEDIA_DIR, "assets", "PiCreature") if os.path.exists(pi_creature_dir_maybe): @@ -386,4 +386,4 @@ def blink(self, **kwargs): # TODO, change Blink submob.apply_function( lambda p: [p[0], bottom_y, p[2]] ) - return self + return self \ No newline at end of file diff --git a/manimlib/for_3b1b_videos/pi_creature_animations.py b/manimlib/for_3b1b_videos/pi_creature_animations.py index 91df37739a..4904bb67e0 100644 --- a/manimlib/for_3b1b_videos/pi_creature_animations.py +++ b/manimlib/for_3b1b_videos/pi_creature_animations.py @@ -1,17 +1,17 @@ -from manimlib.animation.animation import Animation -from manimlib.animation.composition import AnimationGroup -from manimlib.animation.fading import FadeOut -from manimlib.animation.creation import DrawBorderThenFill -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 +from ..animation.animation import Animation +from ..animation.composition import AnimationGroup +from ..animation.fading import FadeOut +from ..animation.creation import DrawBorderThenFill +from ..animation.creation import Write +from ..animation.transform import ApplyMethod +from ..animation.transform import MoveToTarget +from ..constants import * +from ..for_3b1b_videos.pi_class import PiCreatureClass +from ..mobject.mobject import Group +from ..mobject.svg.drawings import SpeechBubble +from ..utils.config_ops import digest_config +from ..utils.rate_functions import squish_rate_func +from ..utils.rate_functions import there_and_back class Blink(ApplyMethod): @@ -119,4 +119,4 @@ def interpolate_mobject(self, alpha): for pi in self.mobject: pi.set_color(BLUE_E) if index < self.mobject.height * self.mobject.width: - self.mobject[self.indices[index]].set_color(self.highlight_color) + self.mobject[self.indices[index]].set_color(self.highlight_color) \ No newline at end of file diff --git a/manimlib/for_3b1b_videos/pi_creature_scene.py b/manimlib/for_3b1b_videos/pi_creature_scene.py index def1216d7b..ff9d4ea4ef 100644 --- a/manimlib/for_3b1b_videos/pi_creature_scene.py +++ b/manimlib/for_3b1b_videos/pi_creature_scene.py @@ -1,26 +1,26 @@ import itertools as it import random -from manimlib.animation.transform import ReplacementTransform -from manimlib.animation.transform import Transform -from manimlib.animation.transform import ApplyMethod -from manimlib.animation.composition import LaggedStart -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.mobject import Group -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 +from ..animation.transform import ReplacementTransform +from ..animation.transform import Transform +from ..animation.transform import ApplyMethod +from ..animation.composition import LaggedStart +from ..constants import * +from ..for_3b1b_videos.pi_creature import Mortimer +from ..for_3b1b_videos.pi_creature import PiCreature +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 ..mobject.mobject import Group +from ..mobject.frame import ScreenRectangle +from ..mobject.svg.drawings import SpeechBubble +from ..mobject.svg.drawings import ThoughtBubble +from ..mobject.types.vectorized_mobject import VGroup +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 class PiCreatureScene(Scene): @@ -378,4 +378,4 @@ def teacher_holds_up(self, mobject, target_mode="raise_right_hand", added_anims= ReplacementTransform(mobject_copy, mobject), self.teacher.change, target_mode, *added_anims - ) + ) \ No newline at end of file diff --git a/manimlib/imports.py b/manimlib/imports.py index 1020f8ce0a..5edab6cf31 100644 --- a/manimlib/imports.py +++ b/manimlib/imports.py @@ -14,89 +14,89 @@ """ -from manimlib.constants import * +from .constants import * -from manimlib.animation.animation import * -from manimlib.animation.composition import * -from manimlib.animation.creation import * -from manimlib.animation.fading import * -from manimlib.animation.growing 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 .animation.animation import * +from .animation.composition import * +from .animation.creation import * +from .animation.fading import * +from .animation.growing 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.camera.camera import * -from manimlib.camera.mapping_camera import * -from manimlib.camera.moving_camera import * -from manimlib.camera.three_d_camera import * +from .camera.camera import * +from .camera.mapping_camera import * +from .camera.moving_camera import * +from .camera.three_d_camera import * -from manimlib.mobject.coordinate_systems import * -from manimlib.mobject.changing 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.svg.text_mobject import * -from manimlib.mobject.svg.code_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.mobject_update_utils import * -from manimlib.mobject.value_tracker import * -from manimlib.mobject.vector_field import * +from .mobject.coordinate_systems import * +from .mobject.changing 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.svg.text_mobject import * +from .mobject.svg.code_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.mobject_update_utils import * +from .mobject.value_tracker import * +from .mobject.vector_field 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 .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.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 .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.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 .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.utils.bezier import * -from manimlib.utils.color import * -from manimlib.utils.config_ops import * -from manimlib.utils.debug import * -from manimlib.utils.images import * -from manimlib.utils.iterables import * -from manimlib.utils.file_ops 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 * +from .utils.bezier import * +from .utils.color import * +from .utils.config_ops import * +from .utils.debug import * +from .utils.images import * +from .utils.iterables import * +from .utils.file_ops 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 * # Non manim libraries that are also nice to have without thinking @@ -112,4 +112,4 @@ import math from PIL import Image -from colour import Color +from colour import Color \ No newline at end of file diff --git a/manimlib/mobject/changing.py b/manimlib/mobject/changing.py index 20f74a4f3c..f96ff1db5f 100644 --- a/manimlib/mobject/changing.py +++ b/manimlib/mobject/changing.py @@ -1,8 +1,8 @@ -from manimlib.constants import * -from manimlib.mobject.types.vectorized_mobject import VMobject -from manimlib.mobject.types.vectorized_mobject import VGroup -from manimlib.utils.rate_functions import smooth -from manimlib.utils.space_ops import get_norm +from ..constants import * +from ..mobject.types.vectorized_mobject import VMobject +from ..mobject.types.vectorized_mobject import VGroup +from ..utils.rate_functions import smooth +from ..utils.space_ops import get_norm class AnimatedBoundary(VGroup): @@ -95,4 +95,4 @@ def update_path(self): nppcc = self.n_points_per_cubic_curve dist = get_norm(new_point - self.points[-nppcc]) if dist >= self.min_distance_to_new_point: - self.add_line_to(new_point) + self.add_line_to(new_point) \ No newline at end of file diff --git a/manimlib/mobject/coordinate_systems.py b/manimlib/mobject/coordinate_systems.py index 442a36d745..10b2e2dca8 100644 --- a/manimlib/mobject/coordinate_systems.py +++ b/manimlib/mobject/coordinate_systems.py @@ -1,17 +1,17 @@ import numpy as np import numbers -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.utils.config_ops import digest_config -from manimlib.utils.config_ops import merge_dicts_recursively -from manimlib.utils.simple_functions import binary_search -from manimlib.utils.space_ops import angle_of_vector +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 ..utils.config_ops import digest_config +from ..utils.config_ops import merge_dicts_recursively +from ..utils.simple_functions import binary_search +from ..utils.space_ops import angle_of_vector # TODO: There should be much more code reuse between Axes, NumberPlane and GraphScene @@ -429,4 +429,4 @@ def get_coordinate_labels(self, *numbers, **kwargs): def add_coordinates(self, *numbers): self.add(self.get_coordinate_labels(*numbers)) - return self + return self \ No newline at end of file diff --git a/manimlib/mobject/frame.py b/manimlib/mobject/frame.py index 4ea2260dbe..7b45722d69 100644 --- a/manimlib/mobject/frame.py +++ b/manimlib/mobject/frame.py @@ -1,6 +1,6 @@ -from manimlib.constants import * -from manimlib.mobject.geometry import Rectangle -from manimlib.utils.config_ops import digest_config +from ..constants import * +from ..mobject.geometry import Rectangle +from ..utils.config_ops import digest_config class ScreenRectangle(Rectangle): @@ -44,4 +44,4 @@ def __init__(self, **kwargs): width=self.aspect_ratio * self.height, height=self.height, **kwargs - ) + ) \ No newline at end of file diff --git a/manimlib/mobject/functions.py b/manimlib/mobject/functions.py index b081fc4120..f31ad0d63e 100644 --- a/manimlib/mobject/functions.py +++ b/manimlib/mobject/functions.py @@ -1,6 +1,6 @@ -from manimlib.constants import * -from manimlib.mobject.types.vectorized_mobject import VMobject -from manimlib.utils.config_ops import digest_config +from ..constants import * +from ..mobject.types.vectorized_mobject import VMobject +from ..utils.config_ops import digest_config import math @@ -101,4 +101,4 @@ def get_function(self): return self.function def get_point_from_function(self, x): - return self.parametric_function(x) + return self.parametric_function(x) \ No newline at end of file diff --git a/manimlib/mobject/geometry.py b/manimlib/mobject/geometry.py index b24e406db2..5636219560 100644 --- a/manimlib/mobject/geometry.py +++ b/manimlib/mobject/geometry.py @@ -1,22 +1,22 @@ import warnings import numpy as np -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.mobject.types.vectorized_mobject import DashedVMobject -from manimlib.utils.config_ops import digest_config -from manimlib.utils.iterables import adjacent_n_tuples -from manimlib.utils.iterables import adjacent_pairs -from manimlib.utils.simple_functions import fdiv -from manimlib.utils.space_ops import angle_of_vector -from manimlib.utils.space_ops import angle_between_vectors -from manimlib.utils.space_ops import compass_directions -from manimlib.utils.space_ops import line_intersection -from manimlib.utils.space_ops import get_norm -from manimlib.utils.space_ops import normalize -from manimlib.utils.space_ops import rotate_vector +from ..constants import * +from ..mobject.mobject import Mobject +from ..mobject.types.vectorized_mobject import VGroup +from ..mobject.types.vectorized_mobject import VMobject +from ..mobject.types.vectorized_mobject import DashedVMobject +from ..utils.config_ops import digest_config +from ..utils.iterables import adjacent_n_tuples +from ..utils.iterables import adjacent_pairs +from ..utils.simple_functions import fdiv +from ..utils.space_ops import angle_of_vector +from ..utils.space_ops import angle_between_vectors +from ..utils.space_ops import compass_directions +from ..utils.space_ops import line_intersection +from ..utils.space_ops import get_norm +from ..utils.space_ops import normalize +from ..utils.space_ops import rotate_vector DEFAULT_DOT_RADIUS = 0.08 @@ -847,4 +847,4 @@ class RoundedRectangle(Rectangle): def __init__(self, **kwargs): Rectangle.__init__(self, **kwargs) - self.round_corners(self.corner_radius) + self.round_corners(self.corner_radius) \ No newline at end of file diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index a689729cfb..189729406f 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -1,13 +1,13 @@ import numpy as np -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 +from ..constants import * +from ..mobject.numbers import DecimalNumber +from ..mobject.numbers import Integer +from ..mobject.shape_matchers import BackgroundRectangle +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 VECTOR_LABEL_SCALE_FACTOR = 0.8 @@ -178,4 +178,4 @@ def get_det_text(matrix, determinant=None, background_rect=False, initial_scale_ result = TexMobject(str(determinant)) result.next_to(eq, RIGHT, buff=0.2) det_text.add(eq, result) - return det_text + return det_text \ No newline at end of file diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index 7cd8b30f83..12d06de4b0 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -9,18 +9,17 @@ from colour import Color import numpy as np -import manimlib.constants as consts -from manimlib.constants import * -from manimlib.container.container import Container -from manimlib.utils.color import color_gradient -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_parameters -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 +from ..constants import * +from ..container.container import Container +from ..utils.color import color_gradient +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.simple_functions import get_parameters +from ..utils.space_ops import angle_of_vector +from ..utils.space_ops import get_norm +from ..utils.space_ops import rotation_matrix # TODO: Explain array_attrs @@ -100,7 +99,7 @@ def apply_over_attr_arrays(self, func): def get_image(self, camera=None): if camera is None: - from manimlib.camera.camera import Camera + from ..camera.camera import Camera camera = Camera() camera.capture_mobject(self) return camera.get_image() @@ -110,7 +109,7 @@ def show(self, camera=None): def save_image(self, name=None): self.get_image().save( - os.path.join(consts.VIDEO_DIR, (name or str(self)) + ".png") + os.path.join(VIDEO_DIR, (name or str(self)) + ".png") ) def copy(self): @@ -567,7 +566,7 @@ def put_start_and_end_on(self, start, end): def add_background_rectangle(self, color=BLACK, opacity=0.75, **kwargs): # TODO, this does not behave well when the mobject has points, # since it gets displayed on top - from manimlib.mobject.shape_matchers import BackgroundRectangle + from ..mobject.shape_matchers import BackgroundRectangle self.background_rectangle = BackgroundRectangle( self, color=color, fill_opacity=opacity, diff --git a/manimlib/mobject/mobject_update_utils.py b/manimlib/mobject/mobject_update_utils.py index 0f256f2c9d..896b8f41ed 100644 --- a/manimlib/mobject/mobject_update_utils.py +++ b/manimlib/mobject/mobject_update_utils.py @@ -1,9 +1,9 @@ import inspect import numpy as np -from manimlib.constants import DEGREES -from manimlib.constants import RIGHT -from manimlib.mobject.mobject import Mobject +from ..constants import DEGREES +from ..constants import RIGHT +from ..mobject.mobject import Mobject def assert_is_mobject_method(method): @@ -97,4 +97,4 @@ def update(m, dt): def cycle_animation(animation, **kwargs): return turn_animation_into_updater( animation, cycle=True, **kwargs - ) + ) \ No newline at end of file diff --git a/manimlib/mobject/number_line.py b/manimlib/mobject/number_line.py index 40577194a3..1ae4dab2e7 100644 --- a/manimlib/mobject/number_line.py +++ b/manimlib/mobject/number_line.py @@ -1,14 +1,14 @@ import operator as op -from manimlib.constants import * -from manimlib.mobject.geometry import Line -from manimlib.mobject.numbers import DecimalNumber -from manimlib.mobject.types.vectorized_mobject import VGroup -from manimlib.utils.bezier import interpolate -from manimlib.utils.config_ops import digest_config -from manimlib.utils.config_ops import merge_dicts_recursively -from manimlib.utils.simple_functions import fdiv -from manimlib.utils.space_ops import normalize +from ..constants import * +from ..mobject.geometry import Line +from ..mobject.numbers import DecimalNumber +from ..mobject.types.vectorized_mobject import VGroup +from ..utils.bezier import interpolate +from ..utils.config_ops import digest_config +from ..utils.config_ops import merge_dicts_recursively +from ..utils.simple_functions import fdiv +from ..utils.space_ops import normalize class NumberLine(Line): @@ -198,4 +198,4 @@ class UnitInterval(NumberLine): "decimal_number_config": { "num_decimal_places": 1, } - } + } \ No newline at end of file diff --git a/manimlib/mobject/numbers.py b/manimlib/mobject/numbers.py index 4c14b4020a..512b7d37ad 100644 --- a/manimlib/mobject/numbers.py +++ b/manimlib/mobject/numbers.py @@ -1,6 +1,6 @@ -from manimlib.constants import * -from manimlib.mobject.svg.tex_mobject import SingleStringTexMobject -from manimlib.mobject.types.vectorized_mobject import VMobject +from ..constants import * +from ..mobject.svg.tex_mobject import SingleStringTexMobject +from ..mobject.types.vectorized_mobject import VMobject class DecimalNumber(VMobject): @@ -142,4 +142,4 @@ class Integer(DecimalNumber): } def get_value(self): - return int(np.round(super().get_value())) + return int(np.round(super().get_value())) \ No newline at end of file diff --git a/manimlib/mobject/probability.py b/manimlib/mobject/probability.py index 662154c157..db8de58a23 100644 --- a/manimlib/mobject/probability.py +++ b/manimlib/mobject/probability.py @@ -1,13 +1,13 @@ -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 +from ..constants import * +from ..mobject.geometry import Line +from ..mobject.geometry import Rectangle +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 ..utils.color import color_gradient +from ..utils.iterables import tuplify EPSILON = 0.0001 @@ -229,4 +229,4 @@ def change_bar_values(self, values): bar.move_to(bar_bottom, DOWN) def copy(self): - return self.deepcopy() + return self.deepcopy() \ No newline at end of file diff --git a/manimlib/mobject/shape_matchers.py b/manimlib/mobject/shape_matchers.py index a6933f218f..2588eebd06 100644 --- a/manimlib/mobject/shape_matchers.py +++ b/manimlib/mobject/shape_matchers.py @@ -1,10 +1,10 @@ -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 +from ..constants import * +from ..mobject.geometry import Line +from ..mobject.geometry import Rectangle +from ..mobject.types.vectorized_mobject import VGroup +from ..mobject.types.vectorized_mobject import VMobject +from ..utils.color import Color +from ..utils.config_ops import digest_config class SurroundingRectangle(Rectangle): @@ -82,4 +82,4 @@ class Underline(Line): def __init__(self, mobject, **kwargs): super().__init__(LEFT, RIGHT, **kwargs) self.match_width(mobject) - self.next_to(mobject, DOWN, buff=self.buff) + self.next_to(mobject, DOWN, buff=self.buff) \ No newline at end of file diff --git a/manimlib/mobject/svg/brace.py b/manimlib/mobject/svg/brace.py index c048d14326..7f8b2888cf 100644 --- a/manimlib/mobject/svg/brace.py +++ b/manimlib/mobject/svg/brace.py @@ -1,14 +1,14 @@ import numpy as np -from manimlib.animation.composition import AnimationGroup -from manimlib.constants import * -from manimlib.animation.fading import FadeIn -from manimlib.animation.growing import GrowFromCenter -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 +from ...animation.composition import AnimationGroup +from ...constants import * +from ...animation.fading import FadeIn +from ...animation.growing 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 class Brace(TexMobject): @@ -136,4 +136,4 @@ def copy(self): class BraceText(BraceLabel): CONFIG = { "label_constructor": TextMobject - } + } \ No newline at end of file diff --git a/manimlib/mobject/svg/code_mobject.py b/manimlib/mobject/svg/code_mobject.py index f41cc15954..a2a9ea469d 100644 --- a/manimlib/mobject/svg/code_mobject.py +++ b/manimlib/mobject/svg/code_mobject.py @@ -1,310 +1,310 @@ -import html -from manimlib.constants import * -from manimlib.container.container import Container -from manimlib.mobject.geometry import Rectangle, Dot, RoundedRectangle -from manimlib.mobject.shape_matchers import SurroundingRectangle -from manimlib.mobject.svg.text_mobject import Paragraph -from manimlib.mobject.types.vectorized_mobject import VGroup - -import re -from pygments import highlight -from pygments.lexers import get_lexer_by_name -from pygments.formatters.html import HtmlFormatter - -''' -1) Code is VGroup() with three things - 1.1) Code[0] is Code.background_mobject - which can be a - 1.1.1) Rectangle() if background == "rectangle" - 1.1.2) VGroup() of Rectangle() and Dot() for three buttons if background == "window" - 1.2) Code[1] is Code.line_numbers Which is a Paragraph() object, this mean you can use - Code.line_numbers[0] or Code[1][0] to access first line number - 1.3) Code[2] is Code.code - 1.3.1) Which is a Paragraph() with color highlighted, this mean you can use - Code.code[1] or Code[2][1] - line number 1 - Code.code[1][0] or Code.code[1][0] - first character of line number 1 - Code.code[1][0:5] or Code.code[1][0:5] - first five characters of line number 1 -''' - - -class Code(VGroup): - CONFIG = { - "tab_width": 3, - "line_spacing": 0.1, - "scale_factor": 0.5, - "run_time": 1, - "font": 'Monospac821 BT', - 'stroke_width': 0, - 'margin': 0.3, - 'indentation_char': " ", - "background": "rectangle", # or window - "corner_radius": 0.2, - 'insert_line_no': True, - 'line_no_from': 1, - "line_no_buff": 0.4, - 'style': 'vim', - 'language': 'cpp', - 'generate_html_file': False - } - - def __init__(self, file_name=None, **kwargs): - Container.__init__(self, **kwargs) - self.file_name = file_name or self.file_name - self.ensure_valid_file() - self.style = self.style.lower() - self.gen_html_string() - strati = self.html_string.find("background:") - self.background_color = self.html_string[strati + 12:strati + 19] - self.gen_code_json() - - self.code = self.gen_colored_lines() - if self.insert_line_no: - self.line_numbers = self.gen_line_numbers() - self.line_numbers.next_to(self.code, direction=LEFT, buff=self.line_no_buff) - - if self.background == "rectangle": - if self.insert_line_no: - forground = VGroup(self.code, self.line_numbers) - else: - forground = self.code - self.background_mobject = SurroundingRectangle(forground, buff=self.margin, - color=self.background_color, - fill_color=self.background_color, - stroke_width=0, - fill_opacity=1, ) - self.background_mobject.round_corners(self.corner_radius) - else: - if self.insert_line_no: - forground = VGroup(self.code, self.line_numbers) - else: - forground = self.code - - height = forground.get_height() + 0.1 * 3 + 2 * self.margin - width = forground.get_width() + 0.1 * 3 + 2 * self.margin - - rrect = RoundedRectangle(corner_radius=self.corner_radius, height=height, width=width, - stroke_width=0, - color=self.background_color, fill_opacity=1) - red_button = Dot(radius=0.1, stroke_width=0, color='#ff5f56') - red_button.shift(LEFT * 0.1 * 3) - yellow_button = Dot(radius=0.1, stroke_width=0, color='#ffbd2e') - green_button = Dot(radius=0.1, stroke_width=0, color='#27c93f') - green_button.shift(RIGHT * 0.1 * 3) - buttons = VGroup(red_button, yellow_button, green_button) - buttons.shift( - UP * (height / 2 - 0.1 * 2 - 0.05) + LEFT * (width / 2 - 0.1 * 5 - self.corner_radius / 2 - 0.05)) - - self.background_mobject = VGroup(rrect, buttons) - x = (height - forground.get_height()) / 2 - 0.1 * 3 - self.background_mobject.shift(forground.get_center()) - self.background_mobject.shift(UP * x) - - if self.insert_line_no: - VGroup.__init__(self, self.background_mobject, self.line_numbers, *self.code, **kwargs) - else: - VGroup.__init__(self, self.background_mobject, Dot(fill_opacity=0, stroke_opacity=0), *self.code, **kwargs) - - self.move_to(np.array([0, 0, 0])) - - def apply_points_function_about_point(self, func, about_point=None, about_edge=None): - if about_point is None: - if about_edge is None: - about_edge = self.get_corner(UP + LEFT) - about_point = self.get_critical_point(about_edge) - for mob in self.family_members_with_points(): - mob.points -= about_point - mob.points = func(mob.points) - mob.points += about_point - return self - - def ensure_valid_file(self): - if self.file_name is None: - raise Exception("Must specify file for Code") - possible_paths = [ - os.path.join(os.path.join("assets", "codes"), self.file_name), - self.file_name, - ] - for path in possible_paths: - if os.path.exists(path): - self.file_path = path - return - raise IOError("No file matching %s in codes directory" % - self.file_name) - - def gen_line_numbers(self): - line_numbers_array = [] - for line_no in range(0, self.code_json.__len__()): - number = str(self.line_no_from + line_no) - line_numbers_array.append(number) - line_numbers = Paragraph(*[i for i in line_numbers_array], line_spacing=self.line_spacing, - alignment="right", font=self.font, stroke_width=self.stroke_width).scale(self.scale_factor) - return line_numbers - - def gen_colored_lines(self): - lines_text = [] - for line_no in range(0, self.code_json.__len__()): - line_str = "" - for word_index in range(self.code_json[line_no].__len__()): - line_str = line_str + self.code_json[line_no][word_index][0] - lines_text.append(self.tab_spaces[line_no] * "\t" + line_str) - code = Paragraph(*[i for i in lines_text], line_spacing=self.line_spacing, tab_width=self.tab_width, - alignment="left", font=self.font, stroke_width=self.stroke_width).scale(self.scale_factor) - for line_no in range(code.__len__()): - line = code[line_no] - line_char_index = self.tab_spaces[line_no] - for word_index in range(self.code_json[line_no].__len__()): - line[line_char_index:line_char_index + self.code_json[line_no][word_index][0].__len__()].set_color( - self.code_json[line_no][word_index][1]) - line_char_index += self.code_json[line_no][word_index][0].__len__() - return code - - def gen_html_string(self): - file = open(self.file_path, "r") - code_str = file.read() - file.close() - self.html_string = hilite_me(code_str, self.language, {}, self.style, self.insert_line_no, - "border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;") - if self.generate_html_file: - os.makedirs(os.path.join("assets", "codes", "generated_html_files"), exist_ok=True) - file = open(os.path.join("assets", "codes", "generated_html_files", self.file_name + ".html"), "w") - file.write(self.html_string) - file.close() - - def gen_code_json(self): - if self.background_color == "#111111" or \ - self.background_color == "#272822" or \ - self.background_color == "#202020" or \ - self.background_color == "#000000": - self.default_color = "#ffffff" - else: - self.default_color = "#000000" - for i in range(3, -1, -1): - self.html_string = self.html_string.replace("" + " " * i, " " * i + "") - self.html_string = self.html_string.replace("background-color:", "background:") - - if self.insert_line_no: - start_point = self.html_string.find("") - lines[0] = lines[0][start_point + 1:] - # print(lines) - self.code_json = [] - self.tab_spaces = [] - code_json_line_index = -1 - for line_index in range(0, lines.__len__()): - if lines[line_index].__len__() == 0: - continue - # print(lines[line_index]) - self.code_json.append([]) - code_json_line_index = code_json_line_index + 1 - if lines[line_index].startswith(self.indentation_char): - start_point = lines[line_index].find("<") - starting_string = lines[line_index][:start_point] - indentation_char_count = lines[line_index][:start_point].count(self.indentation_char) - if starting_string.__len__() != indentation_char_count * self.indentation_char.__len__(): - lines[line_index] = "\t" * indentation_char_count + starting_string[starting_string.rfind( - self.indentation_char) + self.indentation_char.__len__():] + \ - lines[line_index][start_point:] - else: - lines[line_index] = "\t" * indentation_char_count + lines[line_index][start_point:] - - indentation_char_count = 0 - while lines[line_index][indentation_char_count] == '\t': - indentation_char_count = indentation_char_count + 1 - self.tab_spaces.append(indentation_char_count) - # print(lines[line_index]) - lines[line_index] = self.correct_non_span(lines[line_index]) - # print(lines[line_index]) - words = lines[line_index].split("") - end_point = words[word_index].find("") - text = words[word_index][start_point + 1:end_point] - text = html.unescape(text) - if text != "": - # print(text, "'" + color + "'") - self.code_json[code_json_line_index].append([text, color]) - # print(self.code_json) - - def correct_non_span(self, line_str): - words = line_str.split("") - line_str = "" - for i in range(0, words.__len__()): - if i != words.__len__() - 1: - j = words[i].find("' + words[i][starti:j] + "" - else: - temp = '' + words[i][starti:j] - temp = temp + words[i][j:] - words[i] = temp - if words[i] != "": - line_str = line_str + words[i] + "" - return line_str - - -def hilite_me(code, lexer, options, style, linenos, divstyles): - lexer = lexer or 'python' - style = style or 'colorful' - defstyles = 'overflow:auto;width:auto;' - - formatter = HtmlFormatter(style=style, - linenos=False, - noclasses=True, - cssclass='', - cssstyles=defstyles + divstyles, - prestyles='margin: 0') - html = highlight(code, get_lexer_by_name(lexer, **options), formatter) - if linenos: - html = insert_line_numbers(html) - html = "" + html - return html - - -def get_default_style(): - return 'border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;' - - -def insert_line_numbers(html): - match = re.search('(]*>)(.*)()', html, re.DOTALL) - if not match: return html - - pre_open = match.group(1) - pre = match.group(2) - pre_close = match.group(3) - - html = html.replace(pre_close, '') - numbers = range(1, pre.count('\n') + 1) - format = '%' + str(len(str(numbers[-1]))) + 'i' - lines = '\n'.join(format % i for i in numbers) - html = html.replace(pre_open, '
' + pre_open + lines + '' + pre_open) - return html +import html +from ...constants import * +from ...container.container import Container +from ...mobject.geometry import RoundedRectangle +from ...mobject.shape_matchers import SurroundingRectangle +from ...mobject.svg.text_mobject import Paragraph +from ...mobject.types.vectorized_mobject import VGroup + +import re +from pygments import highlight +from pygments.lexers import get_lexer_by_name +from pygments.formatters.html import HtmlFormatter + +''' +1) Code is VGroup() with three things + 1.1) Code[0] is Code.background_mobject + which can be a + 1.1.1) Rectangle() if background == "rectangle" + 1.1.2) VGroup() of Rectangle() and Dot() for three buttons if background == "window" + 1.2) Code[1] is Code.line_numbers Which is a Paragraph() object, this mean you can use + Code.line_numbers[0] or Code[1][0] to access first line number + 1.3) Code[2] is Code.code + 1.3.1) Which is a Paragraph() with color highlighted, this mean you can use + Code.code[1] or Code[2][1] + line number 1 + Code.code[1][0] or Code.code[1][0] + first character of line number 1 + Code.code[1][0:5] or Code.code[1][0:5] + first five characters of line number 1 +''' + + +class Code(VGroup): + CONFIG = { + "tab_width": 3, + "line_spacing": 0.1, + "scale_factor": 0.5, + "run_time": 1, + "font": 'Monospac821 BT', + 'stroke_width': 0, + 'margin': 0.3, + 'indentation_char': " ", + "background": "rectangle", # or window + "corner_radius": 0.2, + 'insert_line_no': True, + 'line_no_from': 1, + "line_no_buff": 0.4, + 'style': 'vim', + 'language': 'cpp', + 'generate_html_file': False + } + + def __init__(self, file_name=None, **kwargs): + Container.__init__(self, **kwargs) + self.file_name = file_name or self.file_name + self.ensure_valid_file() + self.style = self.style.lower() + self.gen_html_string() + strati = self.html_string.find("background:") + self.background_color = self.html_string[strati + 12:strati + 19] + self.gen_code_json() + + self.code = self.gen_colored_lines() + if self.insert_line_no: + self.line_numbers = self.gen_line_numbers() + self.line_numbers.next_to(self.code, direction=LEFT, buff=self.line_no_buff) + + if self.background == "rectangle": + if self.insert_line_no: + forground = VGroup(self.code, self.line_numbers) + else: + forground = self.code + self.background_mobject = SurroundingRectangle(forground, buff=self.margin, + color=self.background_color, + fill_color=self.background_color, + stroke_width=0, + fill_opacity=1, ) + self.background_mobject.round_corners(self.corner_radius) + else: + if self.insert_line_no: + forground = VGroup(self.code, self.line_numbers) + else: + forground = self.code + + height = forground.get_height() + 0.1 * 3 + 2 * self.margin + width = forground.get_width() + 0.1 * 3 + 2 * self.margin + + rrect = RoundedRectangle(corner_radius=self.corner_radius, height=height, width=width, + stroke_width=0, + color=self.background_color, fill_opacity=1) + red_button = Dot(radius=0.1, stroke_width=0, color='#ff5f56') + red_button.shift(LEFT * 0.1 * 3) + yellow_button = Dot(radius=0.1, stroke_width=0, color='#ffbd2e') + green_button = Dot(radius=0.1, stroke_width=0, color='#27c93f') + green_button.shift(RIGHT * 0.1 * 3) + buttons = VGroup(red_button, yellow_button, green_button) + buttons.shift( + UP * (height / 2 - 0.1 * 2 - 0.05) + LEFT * (width / 2 - 0.1 * 5 - self.corner_radius / 2 - 0.05)) + + self.background_mobject = VGroup(rrect, buttons) + x = (height - forground.get_height()) / 2 - 0.1 * 3 + self.background_mobject.shift(forground.get_center()) + self.background_mobject.shift(UP * x) + + if self.insert_line_no: + VGroup.__init__(self, self.background_mobject, self.line_numbers, *self.code, **kwargs) + else: + VGroup.__init__(self, self.background_mobject, Dot(fill_opacity=0, stroke_opacity=0), *self.code, **kwargs) + + self.move_to(np.array([0, 0, 0])) + + def apply_points_function_about_point(self, func, about_point=None, about_edge=None): + if about_point is None: + if about_edge is None: + about_edge = self.get_corner(UP + LEFT) + about_point = self.get_critical_point(about_edge) + for mob in self.family_members_with_points(): + mob.points -= about_point + mob.points = func(mob.points) + mob.points += about_point + return self + + def ensure_valid_file(self): + if self.file_name is None: + raise Exception("Must specify file for Code") + possible_paths = [ + os.path.join(os.path.join("assets", "codes"), self.file_name), + self.file_name, + ] + for path in possible_paths: + if os.path.exists(path): + self.file_path = path + return + raise IOError("No file matching %s in codes directory" % + self.file_name) + + def gen_line_numbers(self): + line_numbers_array = [] + for line_no in range(0, self.code_json.__len__()): + number = str(self.line_no_from + line_no) + line_numbers_array.append(number) + line_numbers = Paragraph(*[i for i in line_numbers_array], line_spacing=self.line_spacing, + alignment="right", font=self.font, stroke_width=self.stroke_width).scale(self.scale_factor) + return line_numbers + + def gen_colored_lines(self): + lines_text = [] + for line_no in range(0, self.code_json.__len__()): + line_str = "" + for word_index in range(self.code_json[line_no].__len__()): + line_str = line_str + self.code_json[line_no][word_index][0] + lines_text.append(self.tab_spaces[line_no] * "\t" + line_str) + code = Paragraph(*[i for i in lines_text], line_spacing=self.line_spacing, tab_width=self.tab_width, + alignment="left", font=self.font, stroke_width=self.stroke_width).scale(self.scale_factor) + for line_no in range(code.__len__()): + line = code[line_no] + line_char_index = self.tab_spaces[line_no] + for word_index in range(self.code_json[line_no].__len__()): + line[line_char_index:line_char_index + self.code_json[line_no][word_index][0].__len__()].set_color( + self.code_json[line_no][word_index][1]) + line_char_index += self.code_json[line_no][word_index][0].__len__() + return code + + def gen_html_string(self): + file = open(self.file_path, "r") + code_str = file.read() + file.close() + self.html_string = hilite_me(code_str, self.language, {}, self.style, self.insert_line_no, + "border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;") + if self.generate_html_file: + os.makedirs(os.path.join("assets", "codes", "generated_html_files"), exist_ok=True) + file = open(os.path.join("assets", "codes", "generated_html_files", self.file_name + ".html"), "w") + file.write(self.html_string) + file.close() + + def gen_code_json(self): + if self.background_color == "#111111" or \ + self.background_color == "#272822" or \ + self.background_color == "#202020" or \ + self.background_color == "#000000": + self.default_color = "#ffffff" + else: + self.default_color = "#000000" + for i in range(3, -1, -1): + self.html_string = self.html_string.replace("" + " " * i, " " * i + "") + self.html_string = self.html_string.replace("background-color:", "background:") + + if self.insert_line_no: + start_point = self.html_string.find("") + lines[0] = lines[0][start_point + 1:] + # print(lines) + self.code_json = [] + self.tab_spaces = [] + code_json_line_index = -1 + for line_index in range(0, lines.__len__()): + if lines[line_index].__len__() == 0: + continue + # print(lines[line_index]) + self.code_json.append([]) + code_json_line_index = code_json_line_index + 1 + if lines[line_index].startswith(self.indentation_char): + start_point = lines[line_index].find("<") + starting_string = lines[line_index][:start_point] + indentation_char_count = lines[line_index][:start_point].count(self.indentation_char) + if starting_string.__len__() != indentation_char_count * self.indentation_char.__len__(): + lines[line_index] = "\t" * indentation_char_count + starting_string[starting_string.rfind( + self.indentation_char) + self.indentation_char.__len__():] + \ + lines[line_index][start_point:] + else: + lines[line_index] = "\t" * indentation_char_count + lines[line_index][start_point:] + + indentation_char_count = 0 + while lines[line_index][indentation_char_count] == '\t': + indentation_char_count = indentation_char_count + 1 + self.tab_spaces.append(indentation_char_count) + # print(lines[line_index]) + lines[line_index] = self.correct_non_span(lines[line_index]) + # print(lines[line_index]) + words = lines[line_index].split("") + end_point = words[word_index].find("") + text = words[word_index][start_point + 1:end_point] + text = html.unescape(text) + if text != "": + # print(text, "'" + color + "'") + self.code_json[code_json_line_index].append([text, color]) + # print(self.code_json) + + def correct_non_span(self, line_str): + words = line_str.split("") + line_str = "" + for i in range(0, words.__len__()): + if i != words.__len__() - 1: + j = words[i].find("' + words[i][starti:j] + "" + else: + temp = '' + words[i][starti:j] + temp = temp + words[i][j:] + words[i] = temp + if words[i] != "": + line_str = line_str + words[i] + "" + return line_str + + +def hilite_me(code, lexer, options, style, linenos, divstyles): + lexer = lexer or 'python' + style = style or 'colorful' + defstyles = 'overflow:auto;width:auto;' + + formatter = HtmlFormatter(style=style, + linenos=False, + noclasses=True, + cssclass='', + cssstyles=defstyles + divstyles, + prestyles='margin: 0') + html = highlight(code, get_lexer_by_name(lexer, **options), formatter) + if linenos: + html = insert_line_numbers(html) + html = "" + html + return html + + +def get_default_style(): + return 'border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;' + + +def insert_line_numbers(html): + match = re.search('(]*>)(.*)()', html, re.DOTALL) + if not match: return html + + pre_open = match.group(1) + pre = match.group(2) + pre_close = match.group(3) + + html = html.replace(pre_close, '
') + numbers = range(1, pre.count('\n') + 1) + format = '%' + str(len(str(numbers[-1]))) + 'i' + lines = '\n'.join(format % i for i in numbers) + html = html.replace(pre_open, '
' + pre_open + lines + '' + pre_open) + return html \ No newline at end of file diff --git a/manimlib/mobject/svg/drawings.py b/manimlib/mobject/svg/drawings.py index 866250853a..71f0b1b633 100644 --- a/manimlib/mobject/svg/drawings.py +++ b/manimlib/mobject/svg/drawings.py @@ -1,30 +1,30 @@ import itertools as it import string -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.rate_functions import linear -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 +from ...animation.animation import Animation +from ...animation.rotation import Rotating +from ...constants import * +from ...mobject.geometry import AnnularSector +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.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.three_dimensions import Cube +from ...mobject.types.vectorized_mobject import VGroup +from ...mobject.types.vectorized_mobject import VMobject +from ...mobject.types.vectorized_mobject import VectorizedPoint +from ...utils.bezier import interpolate +from ...utils.config_ops import digest_config +from ...utils.rate_functions import linear +from ...utils.space_ops import angle_of_vector +from ...utils.space_ops import complex_to_R3 +from ...utils.space_ops import rotate_vector class Lightbulb(SVGMobject): @@ -560,16 +560,6 @@ def __init__(self, **kwargs): self.set_stroke(color=WHITE, width=0) self.set_fill(self.color, opacity=1) - from manimlib.for_3b1b_videos.pi_creature import Randolph - randy = Randolph(mode="happy") - randy.set_height(0.6 * self.get_height()) - randy.stretch(0.8, 0) - randy.look(RIGHT) - randy.move_to(self) - randy.shift(0.07 * self.height * (RIGHT + UP)) - self.randy = self.pi_creature = randy - self.add_to_back(randy) - orientation_line = Line(self.get_left(), self.get_right()) orientation_line.set_stroke(width=0) self.add(orientation_line) diff --git a/manimlib/mobject/svg/svg_mobject.py b/manimlib/mobject/svg/svg_mobject.py index a183588f5d..9d569d4098 100644 --- a/manimlib/mobject/svg/svg_mobject.py +++ b/manimlib/mobject/svg/svg_mobject.py @@ -5,15 +5,15 @@ from xml.dom import minidom -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.color import * -from manimlib.utils.config_ops import digest_config -from manimlib.utils.config_ops import digest_locals +from ...constants import * +from ...mobject.geometry import Circle +from ...mobject.geometry import Rectangle +from ...mobject.geometry import RoundedRectangle +from ...mobject.types.vectorized_mobject import VGroup +from ...mobject.types.vectorized_mobject import VMobject +from ...utils.color import * +from ...utils.config_ops import digest_config +from ...utils.config_ops import digest_locals def string_to_numbers(num_string): @@ -428,4 +428,4 @@ def string_to_points(self, coord_string): return result def get_original_path_string(self): - return self.path_string + return self.path_string \ No newline at end of file diff --git a/manimlib/mobject/svg/tex_mobject.py b/manimlib/mobject/svg/tex_mobject.py index 60b299e6d1..4c5d645150 100644 --- a/manimlib/mobject/svg/tex_mobject.py +++ b/manimlib/mobject/svg/tex_mobject.py @@ -1,15 +1,15 @@ 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 +from ...constants import * +from ...mobject.geometry import Line +from ...mobject.svg.svg_mobject import SVGMobject +from ...mobject.svg.svg_mobject import VMobjectFromSVGPathstring +from ...mobject.types.vectorized_mobject import VGroup +from ...mobject.types.vectorized_mobject import VectorizedPoint +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 TEX_MOB_SCALE_FACTOR = 0.05 @@ -325,4 +325,4 @@ def __init__(self, *text_parts, **kwargs): else: underline.set_width(self.underline_width) self.add(underline) - self.underline = underline + self.underline = underline \ No newline at end of file diff --git a/manimlib/mobject/svg/text_mobject.py b/manimlib/mobject/svg/text_mobject.py index 6c76672211..7319b61b6d 100644 --- a/manimlib/mobject/svg/text_mobject.py +++ b/manimlib/mobject/svg/text_mobject.py @@ -3,13 +3,12 @@ import copy import hashlib import cairo -import manimlib.constants as consts -from manimlib.constants import * -from manimlib.container.container import Container -from manimlib.mobject.geometry import Dot, Rectangle -from manimlib.mobject.svg.svg_mobject import SVGMobject -from manimlib.mobject.types.vectorized_mobject import VGroup -from manimlib.utils.config_ops import digest_config +from ...constants import * +from ...container.container import Container +from ...mobject.geometry import Rectangle +from ...mobject.svg.svg_mobject import SVGMobject +from ...mobject.types.vectorized_mobject import VGroup +from ...utils.config_ops import digest_config TEXT_MOB_SCALE_FACTOR = 0.05 @@ -28,7 +27,7 @@ def __init__(self, start, end, font, slant, weight, line_num=-1): class Text(SVGMobject): CONFIG = { # Mobject - 'color': consts.WHITE, + 'color': WHITE, 'height': None, 'width': None, 'fill_opacity': 1, @@ -94,7 +93,7 @@ def __init__(self, text, **config): def get_space_width(self): size = self.size * 10 - dir_name = consts.TEXT_DIR + dir_name = TEXT_DIR file_name = os.path.join(dir_name, "space") + '.svg' surface = cairo.SVGSurface(file_name, 600, 400) @@ -290,7 +289,7 @@ def text2svg(self): if NOT_SETTING_FONT_MSG != '': print(NOT_SETTING_FONT_MSG) - dir_name = consts.TEXT_DIR + dir_name = TEXT_DIR hash_name = self.text2hash() file_name = os.path.join(dir_name, hash_name)+'.svg' if os.path.exists(file_name): diff --git a/manimlib/mobject/three_d_shading_utils.py b/manimlib/mobject/three_d_shading_utils.py index a0fe43c385..8ed287735b 100644 --- a/manimlib/mobject/three_d_shading_utils.py +++ b/manimlib/mobject/three_d_shading_utils.py @@ -1,7 +1,7 @@ import numpy as np -from manimlib.constants import ORIGIN -from manimlib.utils.space_ops import get_unit_normal +from ..constants import ORIGIN +from ..utils.space_ops import get_unit_normal def get_3d_vmob_gradient_start_and_end_points(vmob): @@ -53,4 +53,4 @@ def get_3d_vmob_start_corner_unit_normal(vmob): def get_3d_vmob_end_corner_unit_normal(vmob): return get_3d_vmob_unit_normal( vmob, get_3d_vmob_end_corner_index(vmob) - ) + ) \ No newline at end of file diff --git a/manimlib/mobject/three_d_utils.py b/manimlib/mobject/three_d_utils.py index 3138aaa1bf..60c6a72314 100644 --- a/manimlib/mobject/three_d_utils.py +++ b/manimlib/mobject/three_d_utils.py @@ -1,9 +1,9 @@ import numpy as np -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 +from ..constants import ORIGIN +from ..constants import UP +from ..utils.space_ops import get_norm +from ..utils.space_ops import get_unit_normal def get_3d_vmob_gradient_start_and_end_points(vmob): @@ -58,4 +58,4 @@ def get_3d_vmob_start_corner_unit_normal(vmob): def get_3d_vmob_end_corner_unit_normal(vmob): return get_3d_vmob_unit_normal( vmob, get_3d_vmob_end_corner_index(vmob) - ) + ) \ No newline at end of file diff --git a/manimlib/mobject/three_dimensions.py b/manimlib/mobject/three_dimensions.py index 7b49ec39fa..eba3d08b49 100644 --- a/manimlib/mobject/three_dimensions.py +++ b/manimlib/mobject/three_dimensions.py @@ -1,9 +1,9 @@ -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 +from ..constants import * +from ..mobject.geometry import Square +from ..mobject.types.vectorized_mobject import VGroup +from ..mobject.types.vectorized_mobject import VMobject +from ..utils.iterables import tuplify +from ..utils.space_ops import z_to_vector ############## @@ -153,4 +153,4 @@ class Prism(Cube): def generate_points(self): Cube.generate_points(self) for dim, value in enumerate(self.dimensions): - self.rescale_to_fit(value, dim, stretch=True) + self.rescale_to_fit(value, dim, stretch=True) \ No newline at end of file diff --git a/manimlib/mobject/types/image_mobject.py b/manimlib/mobject/types/image_mobject.py index be9cab68b7..9a25b2f15f 100644 --- a/manimlib/mobject/types/image_mobject.py +++ b/manimlib/mobject/types/image_mobject.py @@ -2,13 +2,13 @@ from PIL import Image -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 +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 class AbstractImageMobject(Mobject): @@ -130,4 +130,4 @@ def add_display_frame(self, **kwargs): config.update(kwargs) self.display_frame = SurroundingRectangle(self, **config) self.add(self.display_frame) - return self + return self \ No newline at end of file diff --git a/manimlib/mobject/types/point_cloud_mobject.py b/manimlib/mobject/types/point_cloud_mobject.py index f8276382a7..da8860cc12 100644 --- a/manimlib/mobject/types/point_cloud_mobject.py +++ b/manimlib/mobject/types/point_cloud_mobject.py @@ -1,12 +1,12 @@ -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 +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 class PMobject(Mobject): @@ -256,4 +256,4 @@ class Point(PMobject): def __init__(self, location=ORIGIN, **kwargs): PMobject.__init__(self, **kwargs) - self.add_points([location]) + self.add_points([location]) \ No newline at end of file diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py index 25ba527dad..e354d9ce38 100644 --- a/manimlib/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -3,21 +3,21 @@ from colour import Color -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 integer_interpolate -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 -from manimlib.utils.space_ops import rotate_vector -from manimlib.utils.space_ops import get_norm +from ...constants import * +from ...mobject.mobject import Mobject +from ...mobject.three_d_utils import get_3d_vmob_gradient_start_and_end_points +from ...utils.bezier import bezier +from ...utils.bezier import get_smooth_handle_points +from ...utils.bezier import interpolate +from ...utils.bezier import integer_interpolate +from ...utils.bezier import partial_bezier_points +from ...utils.color import color_to_rgba +from ...utils.iterables import make_even +from ...utils.iterables import stretch_array_to_length +from ...utils.iterables import tuplify +from ...utils.simple_functions import clip_in_place +from ...utils.space_ops import rotate_vector +from ...utils.space_ops import get_norm # TODO # - Change cubic curve groups to have 4 points instead of 3 @@ -973,4 +973,4 @@ def __init__(self, vmobject, **kwargs): ]) # Family is already taken care of by get_subcurve # implementation - self.match_style(vmobject, family=False) + self.match_style(vmobject, family=False) \ No newline at end of file diff --git a/manimlib/mobject/value_tracker.py b/manimlib/mobject/value_tracker.py index 79cdedce5a..5872d7105e 100644 --- a/manimlib/mobject/value_tracker.py +++ b/manimlib/mobject/value_tracker.py @@ -1,6 +1,6 @@ import numpy as np -from manimlib.mobject.mobject import Mobject +from ..mobject.mobject import Mobject class ValueTracker(Mobject): @@ -48,4 +48,4 @@ def get_value(self): def set_value(self, z): z = complex(z) self.points[0, :2] = (z.real, z.imag) - return self + return self \ No newline at end of file diff --git a/manimlib/mobject/vector_field.py b/manimlib/mobject/vector_field.py index bfc90c2cc3..50a5bd82ec 100644 --- a/manimlib/mobject/vector_field.py +++ b/manimlib/mobject/vector_field.py @@ -4,22 +4,22 @@ from PIL import Image import random -from manimlib.constants import * - -from manimlib.animation.composition import AnimationGroup -from manimlib.animation.indication import ShowPassingFlash -from manimlib.mobject.geometry import Vector -from manimlib.mobject.types.vectorized_mobject import VGroup -from manimlib.mobject.types.vectorized_mobject import VMobject -from manimlib.utils.bezier import inverse_interpolate -from manimlib.utils.bezier import interpolate -from manimlib.utils.color import color_to_rgb -from manimlib.utils.color import rgb_to_color -from manimlib.utils.config_ops import digest_config -from manimlib.utils.rate_functions import linear -from manimlib.utils.simple_functions import sigmoid -from manimlib.utils.space_ops import get_norm -# from manimlib.utils.space_ops import normalize +from ..constants import * + +from ..animation.composition import AnimationGroup +from ..animation.indication import ShowPassingFlash +from ..mobject.geometry import Vector +from ..mobject.types.vectorized_mobject import VGroup +from ..mobject.types.vectorized_mobject import VMobject +from ..utils.bezier import inverse_interpolate +from ..utils.bezier import interpolate +from ..utils.color import color_to_rgb +from ..utils.color import rgb_to_color +from ..utils.config_ops import digest_config +from ..utils.rate_functions import linear +from ..utils.simple_functions import sigmoid +from ..utils.space_ops import get_norm +# from ..utils.space_ops import normalize DEFAULT_SCALAR_FIELD_COLORS = [BLUE_E, GREEN, YELLOW, RED] diff --git a/manimlib/once_useful_constructs/arithmetic.py b/manimlib/once_useful_constructs/arithmetic.py index ea6debd82b..e39c5b2e28 100644 --- a/manimlib/once_useful_constructs/arithmetic.py +++ b/manimlib/once_useful_constructs/arithmetic.py @@ -1,9 +1,9 @@ import numpy as np -from manimlib.animation.animation import Animation -from manimlib.constants import * -from manimlib.mobject.svg.tex_mobject import TexMobject -from manimlib.scene.scene import Scene +from ..animation.animation import Animation +from ..constants import * +from ..mobject.svg.tex_mobject import TexMobject +from ..scene.scene import Scene class RearrangeEquation(Scene): @@ -98,4 +98,4 @@ def interpolate_mobject(self, alpha): if not all(self.start_center == self.end_center): self.mobject.center().shift( (1 - alpha) * self.start_center + alpha * self.end_center - ) + ) \ No newline at end of file diff --git a/manimlib/once_useful_constructs/combinatorics.py b/manimlib/once_useful_constructs/combinatorics.py index e4fdab29be..9ab2356ca1 100644 --- a/manimlib/once_useful_constructs/combinatorics.py +++ b/manimlib/once_useful_constructs/combinatorics.py @@ -1,9 +1,9 @@ -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 +from ..constants import * +from ..mobject.numbers import Integer +from ..mobject.svg.tex_mobject import TexMobject +from ..mobject.types.vectorized_mobject import VMobject, VGroup +from ..scene.scene import Scene +from ..utils.simple_functions import choose DEFAULT_COUNT_NUM_OFFSET = (FRAME_X_RADIUS - 1, FRAME_Y_RADIUS - 1, 0) diff --git a/manimlib/once_useful_constructs/complex_transformation_scene.py b/manimlib/once_useful_constructs/complex_transformation_scene.py index b21747ddcc..8906c01c4e 100644 --- a/manimlib/once_useful_constructs/complex_transformation_scene.py +++ b/manimlib/once_useful_constructs/complex_transformation_scene.py @@ -1,10 +1,10 @@ -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 +from ..animation.animation import Animation +from ..animation.movement import ComplexHomotopy +from ..animation.transform import MoveToTarget +from ..constants import * +from ..mobject.coordinate_systems import ComplexPlane +from ..mobject.types.vectorized_mobject import VGroup +from ..scene.scene import Scene # TODO, refactor this full scene @@ -153,4 +153,4 @@ def apply_complex_homotopy(self, complex_homotopy, added_anims=[], **kwargs): self.play( ComplexHomotopy(complex_homotopy, transformer, **transform_kwargs), *added_anims - ) + ) \ No newline at end of file diff --git a/manimlib/once_useful_constructs/counting.py b/manimlib/once_useful_constructs/counting.py index 1a46410b2e..97615c7c2c 100644 --- a/manimlib/once_useful_constructs/counting.py +++ b/manimlib/once_useful_constructs/counting.py @@ -1,14 +1,14 @@ -from manimlib.animation.creation import ShowCreation -from manimlib.animation.fading import FadeIn -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 +from ..animation.creation import ShowCreation +from ..animation.fading import FadeIn +from ..animation.transform import MoveToTarget +from ..animation.transform import Transform +from ..constants import * +from ..mobject.geometry import Arrow +from ..mobject.geometry import Circle +from ..mobject.geometry import Dot +from ..mobject.svg.tex_mobject import TexMobject +from ..mobject.types.vectorized_mobject import VGroup +from ..scene.scene import Scene class CountingScene(Scene): @@ -259,4 +259,4 @@ def factorial(self, n): if (n == 1): return 1 else: - return n * self.factorial(n - 1) + return n * self.factorial(n - 1) \ No newline at end of file diff --git a/manimlib/once_useful_constructs/fractals.py b/manimlib/once_useful_constructs/fractals.py index 3983d3a004..8020ba77ad 100644 --- a/manimlib/once_useful_constructs/fractals.py +++ b/manimlib/once_useful_constructs/fractals.py @@ -1,21 +1,21 @@ 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 +from ..constants import * +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.geometry import Circle +from ..mobject.geometry import Polygon +from ..mobject.geometry import RegularPolygon +from ..mobject.types.vectorized_mobject import VGroup +from ..mobject.types.vectorized_mobject import VMobject +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 def rotate(points, angle=np.pi, axis=OUT): @@ -673,4 +673,4 @@ def get_anchor_points(self): result.append( lower_left + x * step * RIGHT + y * step * UP ) - return result + return result \ No newline at end of file diff --git a/manimlib/once_useful_constructs/graph_theory.py b/manimlib/once_useful_constructs/graph_theory.py index 890a13abab..cbe5c35d07 100644 --- a/manimlib/once_useful_constructs/graph_theory.py +++ b/manimlib/once_useful_constructs/graph_theory.py @@ -4,10 +4,10 @@ import numpy as np -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 +from ..constants import * +from ..scene.scene import Scene +from ..utils.rate_functions import there_and_back +from ..utils.space_ops import center_of_mass class Graph(): @@ -411,4 +411,4 @@ def generate_dual_graph(self): dual_point_pair[i] = new_point self.dual_edges.append( Line(*dual_point_pair).set_color() - ) + ) \ No newline at end of file diff --git a/manimlib/once_useful_constructs/light.py b/manimlib/once_useful_constructs/light.py index 6bf519191e..2ac224d328 100644 --- a/manimlib/once_useful_constructs/light.py +++ b/manimlib/once_useful_constructs/light.py @@ -2,20 +2,20 @@ from scipy.spatial import ConvexHull -from manimlib.animation.composition import LaggedStartMap -from manimlib.animation.fading import FadeIn -from manimlib.animation.fading import FadeOut -from manimlib.animation.transform import Transform -from manimlib.constants import * -from manimlib.mobject.geometry import AnnularSector -from manimlib.mobject.geometry import Annulus -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 +from ..animation.composition import LaggedStartMap +from ..animation.fading import FadeIn +from ..animation.fading import FadeOut +from ..animation.transform import Transform +from ..constants import * +from ..mobject.geometry import AnnularSector +from ..mobject.geometry import Annulus +from ..mobject.svg.svg_mobject import SVGMobject +from ..mobject.types.vectorized_mobject import VMobject +from ..mobject.types.vectorized_mobject import VectorizedPoint +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 LIGHT_COLOR = YELLOW SHADOW_COLOR = BLACK @@ -597,4 +597,4 @@ def update_shadow(self): # as a function def ScreenTracker(light_source): light_source.add_updater(lambda m: m.update()) - return light_source + return light_source \ No newline at end of file diff --git a/manimlib/once_useful_constructs/matrix_multiplication.py b/manimlib/once_useful_constructs/matrix_multiplication.py index 49f914a865..7e55fa6b81 100644 --- a/manimlib/once_useful_constructs/matrix_multiplication.py +++ b/manimlib/once_useful_constructs/matrix_multiplication.py @@ -1,16 +1,16 @@ import numpy as np -from manimlib.animation.creation import ShowCreation -from manimlib.animation.fading import FadeOut -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 +from ..animation.creation import ShowCreation +from ..animation.fading import FadeOut +from ..animation.transform import ApplyMethod +from ..animation.transform import Transform +from ..constants import * +from ..mobject.geometry import Circle +from ..mobject.geometry import Line +from ..mobject.matrix import Matrix +from ..mobject.svg.tex_mobject import TexMobject +from ..mobject.types.vectorized_mobject import VGroup +from ..scene.scene import Scene class NumericalMatrixMultiplication(Scene): @@ -138,4 +138,4 @@ def animate_product(self, left, right, result): l_matrix[a][c].set_color(WHITE) r_matrix[c][b].set_color(WHITE) self.play(FadeOut(circles), *lagging_anims) - self.wait() + self.wait() \ No newline at end of file diff --git a/manimlib/once_useful_constructs/region.py b/manimlib/once_useful_constructs/region.py index ab76ac10dd..0c7e195ca7 100644 --- a/manimlib/once_useful_constructs/region.py +++ b/manimlib/once_useful_constructs/region.py @@ -1,9 +1,9 @@ from copy import deepcopy import itertools as it -from manimlib.constants import * -from manimlib.mobject.mobject import Mobject -from manimlib.utils.iterables import adjacent_pairs +from ..constants import * +from ..mobject.mobject import Mobject +from ..utils.iterables import adjacent_pairs # Warning: This is all now pretty depricated, and should not be expected to work @@ -104,4 +104,4 @@ def plane_partition_from_points(*points, **kwargs): Each point comes in the form (x, y) """ lines = [[p1, p2] for (p1, p2) in it.combinations(points, 2)] - return plane_partition(*lines, **kwargs) + return plane_partition(*lines, **kwargs) \ No newline at end of file diff --git a/manimlib/scene/graph_scene.py b/manimlib/scene/graph_scene.py index 03550e3902..74f3bca6b0 100644 --- a/manimlib/scene/graph_scene.py +++ b/manimlib/scene/graph_scene.py @@ -1,23 +1,23 @@ import itertools as it -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 +from ..animation.creation import ShowCreation +from ..animation.transform import Transform +from ..animation.update import UpdateFromAlphaFunc +from ..constants import * +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 ..scene.scene import Scene +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 # TODO, this should probably reimplemented entirely, especially so as to # better reuse code from mobject/coordinate_systems. @@ -1051,4 +1051,4 @@ def update_func(group, alpha): *added_anims ) secant_slope_group.kwargs["x"] = target_x - secant_slope_group.kwargs["dx"] = target_dx + secant_slope_group.kwargs["dx"] = target_dx \ No newline at end of file diff --git a/manimlib/scene/moving_camera_scene.py b/manimlib/scene/moving_camera_scene.py index 3d419e198f..45eebb58e6 100644 --- a/manimlib/scene/moving_camera_scene.py +++ b/manimlib/scene/moving_camera_scene.py @@ -1,6 +1,6 @@ -from manimlib.camera.moving_camera import MovingCamera -from manimlib.scene.scene import Scene -from manimlib.utils.iterables import list_update +from ..camera.moving_camera import MovingCamera +from ..scene.scene import Scene +from ..utils.iterables import list_update class MovingCameraScene(Scene): @@ -44,4 +44,4 @@ def get_moving_mobjects(self, *animations): # When one of these is moving, the camera should # consider all mobjects to be moving return list_update(self.mobjects, moving_mobjects) - return moving_mobjects + return moving_mobjects \ No newline at end of file diff --git a/manimlib/scene/reconfigurable_scene.py b/manimlib/scene/reconfigurable_scene.py index 96e68d87c2..6976d06573 100644 --- a/manimlib/scene/reconfigurable_scene.py +++ b/manimlib/scene/reconfigurable_scene.py @@ -1,7 +1,7 @@ -from manimlib.animation.transform import Transform -from manimlib.constants import * -from manimlib.mobject.mobject import Mobject -from manimlib.scene.scene import Scene +from ..animation.transform import Transform +from ..constants import * +from ..mobject.mobject import Mobject +from ..scene.scene import Scene class ReconfigurableScene(Scene): @@ -63,4 +63,4 @@ def get_state(self): def transition_between_states(self, start_state, target_state, **kwargs): self.play(Transform(start_state, target_state, **kwargs)) - self.wait() + self.wait() \ No newline at end of file diff --git a/manimlib/scene/sample_space_scene.py b/manimlib/scene/sample_space_scene.py index cc1c73f5fe..806a9cd2a9 100644 --- a/manimlib/scene/sample_space_scene.py +++ b/manimlib/scene/sample_space_scene.py @@ -1,11 +1,11 @@ -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 +from ..animation.animation import Animation +from ..animation.transform import MoveToTarget +from ..animation.transform import Transform +from ..animation.update import UpdateFromFunc +from ..constants import * +from ..scene.scene import Scene +from ..mobject.probability import SampleSpace +from ..mobject.types.vectorized_mobject import VGroup class SampleSpaceScene(Scene): @@ -140,4 +140,4 @@ def update_rects(rects): anims += list(map(Animation, [ post_rects.labels, post_rects.braces ])) - return anims + return anims \ No newline at end of file diff --git a/manimlib/scene/scene.py b/manimlib/scene/scene.py index dc4f1d1eb8..e591b9afd5 100644 --- a/manimlib/scene/scene.py +++ b/manimlib/scene/scene.py @@ -6,14 +6,14 @@ from tqdm import tqdm as ProgressDisplay import numpy as np -from manimlib.animation.animation import Animation -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.mobject.mobject import Mobject -from manimlib.scene.scene_file_writer import SceneFileWriter -from manimlib.utils.iterables import list_update +from ..animation.animation import Animation +from ..animation.transform import ApplyMethod +from ..camera.camera import Camera +from ..constants import * +from ..container.container import Container +from ..mobject.mobject import Mobject +from ..scene.scene_file_writer import SceneFileWriter +from ..utils.iterables import list_update class Scene(Container): @@ -1168,4 +1168,4 @@ def show_frame(self): class EndSceneEarlyException(Exception): - pass + pass \ No newline at end of file diff --git a/manimlib/scene/scene_file_writer.py b/manimlib/scene/scene_file_writer.py index 298339748c..74aa305879 100644 --- a/manimlib/scene/scene_file_writer.py +++ b/manimlib/scene/scene_file_writer.py @@ -7,16 +7,17 @@ from time import sleep import datetime -import manimlib.constants as consts -from manimlib.constants import FFMPEG_BIN -from manimlib.constants import STREAMING_IP -from manimlib.constants import STREAMING_PORT -from manimlib.constants import STREAMING_PROTOCOL -from manimlib.utils.config_ops import digest_config -from manimlib.utils.file_ops import guarantee_existence -from manimlib.utils.file_ops import add_extension_if_not_present -from manimlib.utils.file_ops import get_sorted_integer_files -from manimlib.utils.sounds import get_full_sound_file_path +from ..constants import FFMPEG_BIN +from ..constants import STREAMING_IP +from ..constants import STREAMING_PORT +from ..constants import STREAMING_PROTOCOL +from ..constants import VIDEO_DIR +from ..constants import VIDEO_OUTPUT_DIR +from ..utils.config_ops import digest_config +from ..utils.file_ops import guarantee_existence +from ..utils.file_ops import add_extension_if_not_present +from ..utils.file_ops import get_sorted_integer_files +from ..utils.sounds import get_full_sound_file_path class SceneFileWriter(object): @@ -67,15 +68,15 @@ def init_output_directories(self): module_directory = self.output_directory or self.get_default_module_directory() scene_name = self.file_name or self.get_default_scene_name() if self.save_last_frame: - if consts.VIDEO_DIR != "": + if VIDEO_DIR != "": image_dir = guarantee_existence(os.path.join( - consts.VIDEO_DIR, + VIDEO_DIR, module_directory, "images", )) else: image_dir = guarantee_existence(os.path.join( - consts.VIDEO_OUTPUT_DIR, + VIDEO_OUTPUT_DIR, "images", )) self.image_file_path = os.path.join( @@ -83,14 +84,14 @@ def init_output_directories(self): add_extension_if_not_present(scene_name, ".png") ) if self.write_to_movie: - if consts.VIDEO_DIR != "": + if VIDEO_DIR != "": movie_dir = guarantee_existence(os.path.join( - consts.VIDEO_DIR, + VIDEO_DIR, module_directory, self.get_resolution_directory(), )) else: - movie_dir = guarantee_existence(consts.VIDEO_OUTPUT_DIR) + movie_dir = guarantee_existence(VIDEO_OUTPUT_DIR) self.movie_file_path = os.path.join( movie_dir, add_extension_if_not_present( diff --git a/manimlib/scene/scene_from_video.py b/manimlib/scene/scene_from_video.py index d7957ae1d8..ba3e6562ec 100644 --- a/manimlib/scene/scene_from_video.py +++ b/manimlib/scene/scene_from_video.py @@ -1,7 +1,7 @@ from tqdm import tqdm as show_progress import cv2 -from manimlib.scene.scene import Scene +from ..scene.scene import Scene # TODO, is this depricated? @@ -50,4 +50,4 @@ def apply_edge_detection(self, threshold1=50, threshold2=100): ] for index in range(len(self.frames)): for i in range(3): - self.frames[index][:, :, i] = edged_frames[index] + self.frames[index][:, :, i] = edged_frames[index] \ No newline at end of file diff --git a/manimlib/scene/three_d_scene.py b/manimlib/scene/three_d_scene.py index 74d67a72a1..ce22cd265b 100644 --- a/manimlib/scene/three_d_scene.py +++ b/manimlib/scene/three_d_scene.py @@ -1,15 +1,15 @@ -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_CAMERA_CONFIG -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_dicts_recursively +from ..animation.transform import ApplyMethod +from ..camera.three_d_camera import ThreeDCamera +from ..constants import DEGREES +from ..constants import PRODUCTION_QUALITY_CAMERA_CONFIG +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_dicts_recursively class ThreeDScene(Scene): @@ -349,4 +349,4 @@ def set_camera_to_default_position(self): """ self.set_camera_orientation( **self.default_angled_camera_position - ) + ) \ No newline at end of file diff --git a/manimlib/scene/vector_space_scene.py b/manimlib/scene/vector_space_scene.py index 825cf758de..ab28dd2c4b 100644 --- a/manimlib/scene/vector_space_scene.py +++ b/manimlib/scene/vector_space_scene.py @@ -1,34 +1,34 @@ import numpy as np -from manimlib.animation.animation import Animation -from manimlib.animation.creation import ShowCreation -from manimlib.animation.creation import Write -from manimlib.animation.fading import FadeOut -from manimlib.animation.growing import GrowArrow -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 +from ..animation.animation import Animation +from ..animation.creation import ShowCreation +from ..animation.creation import Write +from ..animation.fading import FadeOut +from ..animation.growing import GrowArrow +from ..animation.transform import ApplyFunction +from ..animation.transform import ApplyPointwiseFunction +from ..animation.transform import Transform +from ..constants import * +from ..mobject.coordinate_systems import Axes +from ..mobject.coordinate_systems import NumberPlane +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.matrix import Matrix +from ..mobject.matrix import VECTOR_LABEL_SCALE_FACTOR +from ..mobject.matrix import vector_coordinate_label +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 ..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 X_COLOR = GREEN_C Y_COLOR = RED_C @@ -1057,4 +1057,4 @@ def apply_function(self, function, added_anims=[], **kwargs): Animation(f_mob) for f_mob in self.foreground_mobjects ] + added_anims - self.play(*anims, **kwargs) + self.play(*anims, **kwargs) \ No newline at end of file diff --git a/manimlib/scene/zoomed_scene.py b/manimlib/scene/zoomed_scene.py index 44ac52badb..a38fcfd23a 100644 --- a/manimlib/scene/zoomed_scene.py +++ b/manimlib/scene/zoomed_scene.py @@ -1,10 +1,10 @@ -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 +from ..animation.transform import ApplyMethod +from ..camera.moving_camera import MovingCamera +from ..camera.multi_camera import MultiCamera +from ..constants import * +from ..mobject.types.image_mobject import ImageMobjectFromCamera +from ..scene.moving_camera_scene import MovingCameraScene +from ..utils.simple_functions import fdiv # Note, any scenes from old videos using ZoomedScene will almost certainly # break, as it was restructured. @@ -141,4 +141,4 @@ def get_zoom_factor(self): return fdiv( self.zoomed_camera.frame.get_height(), self.zoomed_display.get_height() - ) + ) \ No newline at end of file diff --git a/manimlib/utils/bezier.py b/manimlib/utils/bezier.py index 3e86562ed3..d49f14b7a9 100644 --- a/manimlib/utils/bezier.py +++ b/manimlib/utils/bezier.py @@ -1,7 +1,7 @@ from scipy import linalg import numpy as np -from manimlib.utils.simple_functions import choose +from ..utils.simple_functions import choose CLOSED_THRESHOLD = 0.001 @@ -158,4 +158,4 @@ def diag_to_matrix(l_and_u, diag): def is_closed(points): - return np.allclose(points[0], points[-1]) + return np.allclose(points[0], points[-1]) \ No newline at end of file diff --git a/manimlib/utils/color.py b/manimlib/utils/color.py index 1a5a229b71..48f9325862 100644 --- a/manimlib/utils/color.py +++ b/manimlib/utils/color.py @@ -3,11 +3,11 @@ from colour import Color import numpy as np -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 +from ..constants import PALETTE +from ..constants import WHITE +from ..utils.bezier import interpolate +from ..utils.simple_functions import clip_in_place +from ..utils.space_ops import normalize def color_to_rgb(color): @@ -108,4 +108,4 @@ def get_shaded_rgb(rgb, point, unit_normal_vect, light_source): factor *= 0.5 result = rgb + factor clip_in_place(rgb + factor, 0, 1) - return result + return result \ No newline at end of file diff --git a/manimlib/utils/config_ops.py b/manimlib/utils/config_ops.py index 2363cc97d7..6a3ca3a723 100644 --- a/manimlib/utils/config_ops.py +++ b/manimlib/utils/config_ops.py @@ -91,4 +91,4 @@ def digest_locals(obj, keys=None): class DictAsObject(object): def __init__(self, dict): - self.__dict__ = dict + self.__dict__ = dict \ No newline at end of file diff --git a/manimlib/utils/debug.py b/manimlib/utils/debug.py index 28f8f1ad77..a1857ded04 100644 --- a/manimlib/utils/debug.py +++ b/manimlib/utils/debug.py @@ -1,6 +1,6 @@ -from manimlib.constants import BLACK -from manimlib.mobject.numbers import Integer -from manimlib.mobject.types.vectorized_mobject import VGroup +from ..constants import BLACK +from ..mobject.numbers import Integer +from ..mobject.types.vectorized_mobject import VGroup def print_family(mobject, n_tabs=0): @@ -18,4 +18,4 @@ def get_submobject_index_labels(mobject, label_height=0.15): label.move_to(submob) label.set_stroke(BLACK, 5, background=True) labels.add(label) - return labels + return labels \ No newline at end of file diff --git a/manimlib/utils/file_ops.py b/manimlib/utils/file_ops.py index 9c9752a499..181cfb426b 100644 --- a/manimlib/utils/file_ops.py +++ b/manimlib/utils/file_ops.py @@ -56,4 +56,4 @@ def get_sorted_integer_files(directory, elif remove_non_integer_files: os.remove(full_path) indexed_files.sort(key=lambda p: p[0]) - return list(map(lambda p: os.path.join(directory, p[1]), indexed_files)) + return list(map(lambda p: os.path.join(directory, p[1]), indexed_files)) \ No newline at end of file diff --git a/manimlib/utils/images.py b/manimlib/utils/images.py index edd7553056..1288e4fe75 100644 --- a/manimlib/utils/images.py +++ b/manimlib/utils/images.py @@ -3,7 +3,7 @@ from PIL import Image -from manimlib.utils.file_ops import seek_full_path_from_defaults +from ..utils.file_ops import seek_full_path_from_defaults def get_full_raster_image_path(image_file_name): @@ -26,4 +26,4 @@ def drag_pixels(frames): def invert_image(image): arr = np.array(image) arr = (255 * np.ones(arr.shape)).astype(arr.dtype) - arr - return Image.fromarray(arr) + return Image.fromarray(arr) \ No newline at end of file diff --git a/manimlib/utils/iterables.py b/manimlib/utils/iterables.py index 1cd26ed9ea..85ecc09e64 100644 --- a/manimlib/utils/iterables.py +++ b/manimlib/utils/iterables.py @@ -119,4 +119,4 @@ def remove_nones(sequence): def concatenate_lists(*list_of_lists): - return [item for l in list_of_lists for item in l] + return [item for l in list_of_lists for item in l] \ No newline at end of file diff --git a/manimlib/utils/paths.py b/manimlib/utils/paths.py index 8bc9cca1fb..c630334e40 100644 --- a/manimlib/utils/paths.py +++ b/manimlib/utils/paths.py @@ -1,9 +1,9 @@ import numpy as np -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 +from ..constants import OUT +from ..utils.bezier import interpolate +from ..utils.space_ops import get_norm +from ..utils.space_ops import rotation_matrix STRAIGHT_PATH_THRESHOLD = 0.01 @@ -44,4 +44,4 @@ def clockwise_path(): def counterclockwise_path(): - return path_along_arc(np.pi) + return path_along_arc(np.pi) \ No newline at end of file diff --git a/manimlib/utils/rate_functions.py b/manimlib/utils/rate_functions.py index 39f9cd15c2..184c9da1c3 100644 --- a/manimlib/utils/rate_functions.py +++ b/manimlib/utils/rate_functions.py @@ -1,7 +1,7 @@ import numpy as np -from manimlib.utils.bezier import bezier -from manimlib.utils.simple_functions import sigmoid +from ..utils.bezier import bezier +from ..utils.simple_functions import sigmoid def linear(t): @@ -91,4 +91,4 @@ def lingering(t): def exponential_decay(t, half_life=0.1): # The half-life should be rather small to minimize # the cut-off error at the end - return 1 - np.exp(-t / half_life) + return 1 - np.exp(-t / half_life) \ No newline at end of file diff --git a/manimlib/utils/simple_functions.py b/manimlib/utils/simple_functions.py index f619226726..5f81805549 100644 --- a/manimlib/utils/simple_functions.py +++ b/manimlib/utils/simple_functions.py @@ -88,4 +88,4 @@ def binary_search(function, lh, rh = rh, lh else: return None - return mh + return mh \ No newline at end of file diff --git a/manimlib/utils/sounds.py b/manimlib/utils/sounds.py index 26cfff07d0..a5a6997bce 100644 --- a/manimlib/utils/sounds.py +++ b/manimlib/utils/sounds.py @@ -1,5 +1,5 @@ import os -from manimlib.utils.file_ops import seek_full_path_from_defaults +from ..utils.file_ops import seek_full_path_from_defaults def play_chord(*nums): @@ -36,4 +36,4 @@ def get_full_sound_file_path(sound_file_name): sound_file_name, default_dir=os.path.join("assets", "sounds"), extensions=[".wav", ".mp3"] - ) + ) \ No newline at end of file diff --git a/manimlib/utils/space_ops.py b/manimlib/utils/space_ops.py index b0113f92f8..1dc09de818 100644 --- a/manimlib/utils/space_ops.py +++ b/manimlib/utils/space_ops.py @@ -2,12 +2,12 @@ import numpy as np -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 -from manimlib.utils.simple_functions import fdiv +from ..constants import OUT +from ..constants import PI +from ..constants import RIGHT +from ..constants import TAU +from ..utils.iterables import adjacent_pairs +from ..utils.simple_functions import fdiv def get_norm(vect): @@ -236,4 +236,4 @@ def get_winding_number(points): d_angle = angle_of_vector(p2) - angle_of_vector(p1) d_angle = ((d_angle + PI) % TAU) - PI total_angle += d_angle - return total_angle / TAU + return total_angle / TAU \ No newline at end of file diff --git a/manimlib/utils/strings.py b/manimlib/utils/strings.py index b986577d21..caf07e5589 100644 --- a/manimlib/utils/strings.py +++ b/manimlib/utils/strings.py @@ -56,4 +56,4 @@ def split_string_list_to_isolate_substrings(string_list, *substrings_to_isolate) return list(it.chain(*[ split_string_to_isolate_substrings(s, *substrings_to_isolate) for s in string_list - ])) + ])) \ No newline at end of file diff --git a/manimlib/utils/tex_file_writing.py b/manimlib/utils/tex_file_writing.py index d8bbdad1fe..4e166b74a4 100644 --- a/manimlib/utils/tex_file_writing.py +++ b/manimlib/utils/tex_file_writing.py @@ -3,9 +3,9 @@ from pathlib import Path -from manimlib.constants import TEX_TEXT_TO_REPLACE -from manimlib.constants import TEX_USE_CTEX -import manimlib.constants as consts +from ..constants import TEX_TEXT_TO_REPLACE +from ..constants import TEX_USE_CTEX +from ..constants import TEX_DIR def tex_hash(expression, template_tex_file_body): @@ -24,7 +24,7 @@ def tex_to_svg_file(expression, template_tex_file_body): def generate_tex_file(expression, template_tex_file_body): result = os.path.join( - consts.TEX_DIR, + TEX_DIR, tex_hash(expression, template_tex_file_body) ) + ".tex" if not os.path.exists(result): @@ -43,7 +43,7 @@ def tex_to_dvi(tex_file): result = tex_file.replace(".tex", ".dvi" if not TEX_USE_CTEX else ".xdv") result = Path(result).as_posix() tex_file = Path(tex_file).as_posix() - tex_dir = Path(consts.TEX_DIR).as_posix() + tex_dir = Path(TEX_DIR).as_posix() if not os.path.exists(result): commands = [ "latex", From 84051a9e3b5092c555549cadbc239f14d0f7e83e Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Wed, 20 May 2020 06:49:15 -0700 Subject: [PATCH 02/98] Restore a few missed imports --- manimlib/mobject/svg/text_mobject.py | 2 +- manimlib/scene/graph_scene.py | 4 ++-- manimlib/scene/scene.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/manimlib/mobject/svg/text_mobject.py b/manimlib/mobject/svg/text_mobject.py index 7319b61b6d..9736c2d008 100644 --- a/manimlib/mobject/svg/text_mobject.py +++ b/manimlib/mobject/svg/text_mobject.py @@ -5,7 +5,7 @@ import cairo from ...constants import * from ...container.container import Container -from ...mobject.geometry import Rectangle +from ...mobject.geometry import Dot, Rectangle from ...mobject.svg.svg_mobject import SVGMobject from ...mobject.types.vectorized_mobject import VGroup from ...utils.config_ops import digest_config diff --git a/manimlib/scene/graph_scene.py b/manimlib/scene/graph_scene.py index 74f3bca6b0..4c75dd84eb 100644 --- a/manimlib/scene/graph_scene.py +++ b/manimlib/scene/graph_scene.py @@ -1,6 +1,6 @@ import itertools as it -from ..animation.creation import ShowCreation +from ..animation.creation import Write, DrawBorderThenFill, ShowCreation from ..animation.transform import Transform from ..animation.update import UpdateFromAlphaFunc from ..constants import * @@ -1051,4 +1051,4 @@ def update_func(group, alpha): *added_anims ) secant_slope_group.kwargs["x"] = target_x - secant_slope_group.kwargs["dx"] = target_dx \ No newline at end of file + secant_slope_group.kwargs["dx"] = target_dx diff --git a/manimlib/scene/scene.py b/manimlib/scene/scene.py index e591b9afd5..6df83db54c 100644 --- a/manimlib/scene/scene.py +++ b/manimlib/scene/scene.py @@ -7,7 +7,7 @@ import numpy as np from ..animation.animation import Animation -from ..animation.transform import ApplyMethod +from ..animation.transform import MoveToTarget, ApplyMethod from ..camera.camera import Camera from ..constants import * from ..container.container import Container @@ -1168,4 +1168,4 @@ def show_frame(self): class EndSceneEarlyException(Exception): - pass \ No newline at end of file + pass From c3c11b31dc90e4cd73765f4701abd68da251e35f Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Wed, 20 May 2020 14:33:35 -0700 Subject: [PATCH 03/98] Rename sample scenes --- samples/sample_scenes.py => example_scenes/basic.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename samples/sample_scenes.py => example_scenes/basic.py (100%) diff --git a/samples/sample_scenes.py b/example_scenes/basic.py similarity index 100% rename from samples/sample_scenes.py rename to example_scenes/basic.py From f76f1b65de11ebe48b8b8455e871e9875097dde5 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Wed, 20 May 2020 20:18:05 -0700 Subject: [PATCH 04/98] Remove more 3b1b files --- manimlib/for_3b1b_videos/common_scenes.py | 395 ------------------ manimlib/for_3b1b_videos/pi_class.py | 18 - manimlib/for_3b1b_videos/pi_creature.py | 389 ----------------- .../for_3b1b_videos/pi_creature_animations.py | 122 ------ manimlib/for_3b1b_videos/pi_creature_scene.py | 381 ----------------- manimlib/imports.py | 5 - manimlib/mobject/svg/drawings.py | 77 +--- 7 files changed, 2 insertions(+), 1385 deletions(-) delete mode 100644 manimlib/for_3b1b_videos/common_scenes.py delete mode 100644 manimlib/for_3b1b_videos/pi_class.py delete mode 100644 manimlib/for_3b1b_videos/pi_creature.py delete mode 100644 manimlib/for_3b1b_videos/pi_creature_animations.py delete mode 100644 manimlib/for_3b1b_videos/pi_creature_scene.py diff --git a/manimlib/for_3b1b_videos/common_scenes.py b/manimlib/for_3b1b_videos/common_scenes.py deleted file mode 100644 index da83fbb470..0000000000 --- a/manimlib/for_3b1b_videos/common_scenes.py +++ /dev/null @@ -1,395 +0,0 @@ -import random - -from manimlib.animation.composition import LaggedStartMap -from manimlib.animation.creation import DrawBorderThenFill -from manimlib.animation.creation import Write -from manimlib.animation.fading import FadeIn -from manimlib.animation.fading import FadeOut -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.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.mobject.mobject_update_utils import always_shift -from manimlib.scene.moving_camera_scene import MovingCameraScene -from manimlib.scene.scene import Scene -from manimlib.utils.rate_functions import linear -from manimlib.utils.space_ops import get_norm -from manimlib.utils.space_ops import normalize - - -class OpeningQuote(Scene): - CONFIG = { - "quote": [], - "quote_arg_separator": " ", - "highlighted_quote_terms": {}, - "author": "", - "fade_in_kwargs": { - "lag_ratio": 0.5, - "rate_func": linear, - "run_time": 5, - }, - "text_size": "\\Large", - "use_quotation_marks": True, - "top_buff": 1.0, - "author_buff": 1.0, - } - - def construct(self): - self.quote = self.get_quote() - self.author = self.get_author(self.quote) - - self.play(FadeIn(self.quote, **self.fade_in_kwargs)) - self.wait(2) - self.play(Write(self.author, run_time=3)) - self.wait() - - def get_quote(self, max_width=FRAME_WIDTH - 1): - text_mobject_kwargs = { - "alignment": "", - "arg_separator": self.quote_arg_separator, - } - if isinstance(self.quote, str): - if self.use_quotation_marks: - quote = TextMobject("``%s''" % - self.quote.strip(), **text_mobject_kwargs) - else: - quote = TextMobject("%s" % - self.quote.strip(), **text_mobject_kwargs) - else: - if self.use_quotation_marks: - words = [self.text_size + " ``"] + list(self.quote) + ["''"] - else: - words = [self.text_size] + list(self.quote) - quote = TextMobject(*words, **text_mobject_kwargs) - # TODO, make less hacky - if self.quote_arg_separator == " ": - quote[0].shift(0.2 * RIGHT) - quote[-1].shift(0.2 * LEFT) - for term, color in self.highlighted_quote_terms: - quote.set_color_by_tex(term, color) - quote.to_edge(UP, buff=self.top_buff) - if quote.get_width() > max_width: - quote.set_width(max_width) - return quote - - def get_author(self, quote): - author = TextMobject(self.text_size + " --" + self.author) - author.next_to(quote, DOWN, buff=self.author_buff) - author.set_color(YELLOW) - return author - - -class PatreonThanks(Scene): - CONFIG = { - "specific_patrons": [], - "max_patron_group_size": 20, - "patron_scale_val": 0.8, - } - - def construct(self): - morty = Mortimer() - morty.next_to(ORIGIN, DOWN) - - patreon_logo = PatreonLogo() - patreon_logo.to_edge(UP) - - patrons = list(map(TextMobject, self.specific_patronds)) - num_groups = float(len(patrons)) / self.max_patron_group_size - proportion_range = np.linspace(0, 1, num_groups + 1) - indices = (len(patrons) * proportion_range).astype('int') - patron_groups = [ - VGroup(*patrons[i:j]) - for i, j in zip(indices, indices[1:]) - ] - - for i, group in enumerate(patron_groups): - left_group = VGroup(*group[:len(group) / 2]) - right_group = VGroup(*group[len(group) / 2:]) - for subgroup, vect in (left_group, LEFT), (right_group, RIGHT): - subgroup.arrange(DOWN, aligned_edge=LEFT) - subgroup.scale(self.patron_scale_val) - subgroup.to_edge(vect) - - last_group = None - for i, group in enumerate(patron_groups): - anims = [] - if last_group is not None: - self.play( - FadeOut(last_group), - morty.look, UP + LEFT - ) - else: - anims += [ - DrawBorderThenFill(patreon_logo), - ] - self.play( - LaggedStartMap( - FadeIn, group, - run_time=2, - ), - morty.change, "gracious", group.get_corner(UP + LEFT), - *anims - ) - self.play(morty.look_at, group.get_corner(DOWN + LEFT)) - self.play(morty.look_at, group.get_corner(UP + RIGHT)) - self.play(morty.look_at, group.get_corner(DOWN + RIGHT)) - self.play(Blink(morty)) - last_group = group - - -class PatreonEndScreen(PatreonThanks, PiCreatureScene): - CONFIG = { - "n_patron_columns": 4, - "max_patron_width": 5, - "run_time": 20, - "randomize_order": True, - "capitalize": True, - "name_y_spacing": 0.6, - "thanks_words": "Find value in this? Join me in thanking these patrons:", - } - - def construct(self): - if self.randomize_order: - random.shuffle(self.specific_patrons) - if self.capitalize: - self.specific_patrons = [ - " ".join(map( - lambda s: s.capitalize(), - patron.split(" ") - )) - for patron in self.specific_patrons - ] - - # self.add_title() - self.scroll_through_patrons() - - def create_pi_creatures(self): - title = self.title = TextMobject("Clicky Stuffs") - title.scale(1.5) - title.to_edge(UP, buff=MED_SMALL_BUFF) - - randy, morty = self.pi_creatures = VGroup(Randolph(), Mortimer()) - for pi, vect in (randy, LEFT), (morty, RIGHT): - pi.set_height(title.get_height()) - pi.change_mode("thinking") - pi.look(DOWN) - pi.next_to(title, vect, buff=MED_LARGE_BUFF) - self.add_foreground_mobjects(title, randy, morty) - return self.pi_creatures - - def scroll_through_patrons(self): - logo_box = Square(side_length=2.5) - logo_box.to_corner(DOWN + LEFT, buff=MED_LARGE_BUFF) - - black_rect = Rectangle( - fill_color=BLACK, - fill_opacity=1, - stroke_width=3, - stroke_color=BLACK, - width=FRAME_WIDTH, - height=0.6 * FRAME_HEIGHT, - ) - black_rect.to_edge(UP, buff=0) - line = DashedLine(FRAME_X_RADIUS * LEFT, FRAME_X_RADIUS * RIGHT) - line.move_to(ORIGIN) - - thanks = TextMobject(self.thanks_words) - thanks.scale(0.9) - thanks.next_to(black_rect.get_bottom(), UP, SMALL_BUFF) - thanks.set_color(YELLOW) - underline = Line(LEFT, RIGHT) - underline.match_width(thanks) - underline.scale(1.1) - underline.next_to(thanks, DOWN, SMALL_BUFF) - thanks.add(underline) - - changed_patron_names = list(map( - self.modify_patron_name, - self.specific_patrons, - )) - changed_patron_names.sort() - patrons = VGroup(*map( - TextMobject, - changed_patron_names, - )) - patrons.scale(self.patron_scale_val) - for patron in patrons: - if patron.get_width() > self.max_patron_width: - patron.set_width(self.max_patron_width) - columns = VGroup(*[ - VGroup(*patrons[i::self.n_patron_columns]) - for i in range(self.n_patron_columns) - ]) - column_x_spacing = 0.5 + max([c.get_width() for c in columns]) - - for i, column in enumerate(columns): - for n, name in enumerate(column): - name.shift(n * self.name_y_spacing * DOWN) - name.align_to(ORIGIN, LEFT) - column.move_to(i * column_x_spacing * RIGHT, UL) - columns.center() - - max_width = FRAME_WIDTH - 1 - if columns.get_width() > max_width: - columns.set_width(max_width) - underline.match_width(columns) - # thanks.to_edge(RIGHT, buff=MED_SMALL_BUFF) - columns.next_to(underline, DOWN, buff=4) - - columns.generate_target() - columns.target.to_edge(DOWN, buff=4) - vect = columns.target.get_center() - columns.get_center() - distance = get_norm(vect) - wait_time = 20 - always_shift( - columns, - direction=normalize(vect), - rate=(distance / wait_time) - ) - - self.add(columns, black_rect, line, thanks) - self.wait(wait_time) - - def modify_patron_name(self, name): - modification_map = { - "RedAgent14": "Brian Shepetofsky", - "DeathByShrimp": "Henry Bresnahan", - "akostrikov": "Aleksandr Kostrikov", - "Jacob Baxter": "Will Fleshman", - } - for n1, n2 in modification_map.items(): - if name.lower() == n1.lower(): - return n2 - return name - - -class LogoGenerationTemplate(MovingCameraScene): - def setup(self): - MovingCameraScene.setup(self) - frame = self.camera_frame - frame.shift(DOWN) - - self.logo = Logo() - name = TextMobject("3Blue1Brown") - name.scale(2.5) - name.next_to(self.logo, DOWN, buff=MED_LARGE_BUFF) - name.set_sheen(-0.2, DR) - self.channel_name = name - - def construct(self): - logo = self.logo - name = self.channel_name - - self.play( - Write(name, run_time=3), - *self.get_logo_animations(logo) - ) - self.wait() - - def get_logo_animations(self, logo): - return [] # For subclasses - - -class ExternallyAnimatedScene(Scene): - def construct(self): - raise Exception("Don't actually run this class.") - - -class TODOStub(Scene): - CONFIG = { - "message": "" - } - - def construct(self): - self.add(TextMobject("TODO: %s" % self.message)) - self.wait() - - -class Banner(Scene): - CONFIG = { - "camera_config": { - "pixel_height": 1440, - "pixel_width": 2560, - }, - "pi_height": 1.25, - "pi_bottom": 0.25 * DOWN, - "use_date": False, - "date": "Sunday, February 3rd", - "message_scale_val": 0.9, - "add_supporter_note": False, - "pre_date_text": "Next video on ", - } - - def __init__(self, **kwargs): - # Force these dimensions - self.camera_config = { - "pixel_height": 1440, - "pixel_width": 2560, - } - Scene.__init__(self, **kwargs) - - def construct(self): - pis = self.get_pis() - pis.set_height(self.pi_height) - pis.arrange(RIGHT, aligned_edge=DOWN) - pis.move_to(self.pi_bottom, DOWN) - self.add(pis) - - if self.use_date: - message = self.get_date_message() - else: - message = self.get_probabalistic_message() - message.scale(self.message_scale_val) - message.next_to(pis, DOWN) - self.add(message) - - if self.add_supporter_note: - note = self.get_supporter_note() - note.scale(0.5) - message.shift((MED_SMALL_BUFF - SMALL_BUFF) * UP) - note.next_to(message, DOWN, SMALL_BUFF) - self.add(note) - - yellow_parts = [sm for sm in message if sm.get_color() == YELLOW] - for pi in pis: - if yellow_parts: - pi.look_at(yellow_parts[-1]) - else: - pi.look_at(message) - - def get_pis(self): - return VGroup( - Randolph(color=BLUE_E, mode="pondering"), - Randolph(color=BLUE_D, mode="hooray"), - Randolph(color=BLUE_C, mode="sassy"), - Mortimer(color=GREY_BROWN, mode="thinking") - ) - - def get_probabalistic_message(self): - return TextMobject( - "New video every ", "Sunday ", - "(with probability 0.3)", - tex_to_color_map={"Sunday": YELLOW}, - ) - - def get_date_message(self): - return TextMobject( - self.pre_date_text, - self.date, - tex_to_color_map={self.date: YELLOW}, - ) - - def get_supporter_note(self): - return TextMobject( - "(Available to supporters for review now)", - color="#F96854", - ) diff --git a/manimlib/for_3b1b_videos/pi_class.py b/manimlib/for_3b1b_videos/pi_class.py deleted file mode 100644 index 77a813e185..0000000000 --- a/manimlib/for_3b1b_videos/pi_class.py +++ /dev/null @@ -1,18 +0,0 @@ -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 = { - "width": 3, - "height": 2 - } - - def __init__(self, **kwargs): - VGroup.__init__(self, **kwargs) - for i in range(self.width): - for j in range(self.height): - pi = PiCreature().scale(0.3) - pi.move_to(i * DOWN + j * RIGHT) - self.add(pi) diff --git a/manimlib/for_3b1b_videos/pi_creature.py b/manimlib/for_3b1b_videos/pi_creature.py deleted file mode 100644 index 4e02646341..0000000000 --- a/manimlib/for_3b1b_videos/pi_creature.py +++ /dev/null @@ -1,389 +0,0 @@ -import os -import warnings - -import numpy as np - -from manimlib.constants import * -from manimlib.mobject.mobject import Mobject -from manimlib.mobject.geometry import Circle -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.space_ops import get_norm -from manimlib.utils.space_ops import normalize - -pi_creature_dir_maybe = os.path.join(MEDIA_DIR, "assets", "PiCreature") -if os.path.exists(pi_creature_dir_maybe): - PI_CREATURE_DIR = pi_creature_dir_maybe -else: - PI_CREATURE_DIR = os.path.join("assets") - -PI_CREATURE_SCALE_FACTOR = 0.5 - -LEFT_EYE_INDEX = 0 -RIGHT_EYE_INDEX = 1 -LEFT_PUPIL_INDEX = 2 -RIGHT_PUPIL_INDEX = 3 -BODY_INDEX = 4 -MOUTH_INDEX = 5 - - -class PiCreature(SVGMobject): - CONFIG = { - "color": BLUE_E, - "file_name_prefix": "PiCreatures", - "stroke_width": 0, - "stroke_color": BLACK, - "fill_opacity": 1.0, - "height": 3, - "corner_scale_factor": 0.75, - "flip_at_start": False, - "is_looking_direction_purposeful": False, - "start_corner": None, - # Range of proportions along body where arms are - "right_arm_range": [0.55, 0.7], - "left_arm_range": [.34, .462], - "pupil_to_eye_width_ratio": 0.4, - "pupil_dot_to_pupil_width_ratio": 0.3, - } - - def __init__(self, mode="plain", **kwargs): - digest_config(self, kwargs) - self.mode = mode - self.parts_named = False - try: - svg_file = os.path.join( - PI_CREATURE_DIR, - "%s_%s.svg" % (self.file_name_prefix, mode) - ) - SVGMobject.__init__(self, file_name=svg_file, **kwargs) - except Exception: - warnings.warn("No %s design with mode %s" % - (self.file_name_prefix, mode)) - # TODO, this needs to change to a different, better directory - svg_file = os.path.join( - FILE_DIR, - "PiCreatures_plain.svg", - ) - SVGMobject.__init__(self, mode="plain", file_name=svg_file, **kwargs) - - if self.flip_at_start: - self.flip() - if self.start_corner is not None: - self.to_corner(self.start_corner) - - def align_data(self, mobject): - # This ensures that after a transform into a different mode, - # the pi creatures mode will be updated appropriately - SVGMobject.align_data(self, mobject) - if isinstance(mobject, PiCreature): - self.mode = mobject.get_mode() - - def name_parts(self): - self.mouth = self.submobjects[MOUTH_INDEX] - self.body = self.submobjects[BODY_INDEX] - self.pupils = VGroup(*[ - self.submobjects[LEFT_PUPIL_INDEX], - self.submobjects[RIGHT_PUPIL_INDEX] - ]) - self.eyes = VGroup(*[ - self.submobjects[LEFT_EYE_INDEX], - self.submobjects[RIGHT_EYE_INDEX] - ]) - self.eye_parts = VGroup(self.eyes, self.pupils) - self.parts_named = True - - def init_colors(self): - SVGMobject.init_colors(self) - if not self.parts_named: - self.name_parts() - self.mouth.set_fill(BLACK, opacity=1) - self.body.set_fill(self.color, opacity=1) - self.eyes.set_fill(WHITE, opacity=1) - self.init_pupils() - return self - - def init_pupils(self): - # Instead of what is drawn, make new circles. - # This is mostly because the paths associated - # with the eyes in all the drawings got slightly - # messed up. - for eye, pupil in zip(self.eyes, self.pupils): - pupil_r = eye.get_width() / 2 - pupil_r *= self.pupil_to_eye_width_ratio - dot_r = pupil_r - dot_r *= self.pupil_dot_to_pupil_width_ratio - - new_pupil = Circle( - radius=pupil_r, - color=BLACK, - fill_opacity=1, - stroke_width=0, - ) - dot = Circle( - radius=dot_r, - color=WHITE, - fill_opacity=1, - stroke_width=0, - ) - new_pupil.move_to(pupil) - pupil.become(new_pupil) - dot.shift( - new_pupil.get_boundary_point(UL) - - dot.get_boundary_point(UL) - ) - pupil.add(dot) - - def copy(self): - copy_mobject = SVGMobject.copy(self) - copy_mobject.name_parts() - return copy_mobject - - def set_color(self, color): - self.body.set_fill(color) - self.color = color - return self - - def change_mode(self, mode): - new_self = self.__class__( - mode=mode, - ) - new_self.match_style(self) - new_self.match_height(self) - if self.is_flipped() != new_self.is_flipped(): - new_self.flip() - new_self.shift(self.eyes.get_center() - new_self.eyes.get_center()) - if hasattr(self, "purposeful_looking_direction"): - new_self.look(self.purposeful_looking_direction) - self.become(new_self) - self.mode = mode - return self - - def get_mode(self): - return self.mode - - def look(self, direction): - norm = get_norm(direction) - if norm == 0: - return - direction /= norm - self.purposeful_looking_direction = direction - for pupil, eye in zip(self.pupils.split(), self.eyes.split()): - c = eye.get_center() - right = eye.get_right() - c - up = eye.get_top() - c - vect = direction[0] * right + direction[1] * up - v_norm = get_norm(vect) - p_radius = 0.5 * pupil.get_width() - vect *= (v_norm - 0.75 * p_radius) / v_norm - pupil.move_to(c + vect) - self.pupils[1].align_to(self.pupils[0], DOWN) - return self - - def look_at(self, point_or_mobject): - if isinstance(point_or_mobject, Mobject): - point = point_or_mobject.get_center() - else: - point = point_or_mobject - self.look(point - self.eyes.get_center()) - return self - - def change(self, new_mode, look_at_arg=None): - self.change_mode(new_mode) - if look_at_arg is not None: - self.look_at(look_at_arg) - return self - - def get_looking_direction(self): - vect = self.pupils.get_center() - self.eyes.get_center() - return normalize(vect) - - def get_look_at_spot(self): - return self.eyes.get_center() + self.get_looking_direction() - - def is_flipped(self): - return self.eyes.submobjects[0].get_center()[0] > \ - self.eyes.submobjects[1].get_center()[0] - - def blink(self): - eye_parts = self.eye_parts - eye_bottom_y = eye_parts.get_bottom()[1] - eye_parts.apply_function( - lambda p: [p[0], eye_bottom_y, p[2]] - ) - return self - - def to_corner(self, vect=None, **kwargs): - if vect is not None: - SVGMobject.to_corner(self, vect, **kwargs) - else: - self.scale(self.corner_scale_factor) - self.to_corner(DOWN + LEFT, **kwargs) - return self - - def get_bubble(self, *content, **kwargs): - bubble_class = kwargs.get("bubble_class", ThoughtBubble) - bubble = bubble_class(**kwargs) - if len(content) > 0: - if isinstance(content[0], str): - content_mob = TextMobject(*content) - else: - content_mob = content[0] - bubble.add_content(content_mob) - if "height" not in kwargs and "width" not in kwargs: - bubble.resize_to_content() - bubble.pin_to(self) - self.bubble = bubble - return bubble - - def make_eye_contact(self, pi_creature): - self.look_at(pi_creature.eyes) - pi_creature.look_at(self.eyes) - return self - - def shrug(self): - self.change_mode("shruggie") - top_mouth_point, bottom_mouth_point = [ - self.mouth.points[np.argmax(self.mouth.points[:, 1])], - self.mouth.points[np.argmin(self.mouth.points[:, 1])] - ] - self.look(top_mouth_point - bottom_mouth_point) - return self - - def get_arm_copies(self): - body = self.body - return VGroup(*[ - body.copy().pointwise_become_partial(body, *alpha_range) - for alpha_range in (self.right_arm_range, self.left_arm_range) - ]) - - -def get_all_pi_creature_modes(): - result = [] - prefix = "%s_" % PiCreature.CONFIG["file_name_prefix"] - suffix = ".svg" - for file in os.listdir(PI_CREATURE_DIR): - if file.startswith(prefix) and file.endswith(suffix): - result.append( - file[len(prefix):-len(suffix)] - ) - return result - - -class Randolph(PiCreature): - pass # Nothing more than an alternative name - - -class Mortimer(PiCreature): - CONFIG = { - "color": GREY_BROWN, - "flip_at_start": True, - } - - -class Mathematician(PiCreature): - CONFIG = { - "color": GREY, - } - - -class BabyPiCreature(PiCreature): - CONFIG = { - "scale_factor": 0.5, - "eye_scale_factor": 1.2, - "pupil_scale_factor": 1.3 - } - - def __init__(self, *args, **kwargs): - PiCreature.__init__(self, *args, **kwargs) - self.scale(self.scale_factor) - self.shift(LEFT) - self.to_edge(DOWN, buff=LARGE_BUFF) - eyes = VGroup(self.eyes, self.pupils) - eyes_bottom = eyes.get_bottom() - eyes.scale(self.eye_scale_factor) - eyes.move_to(eyes_bottom, aligned_edge=DOWN) - looking_direction = self.get_looking_direction() - for pupil in self.pupils: - pupil.scale_in_place(self.pupil_scale_factor) - self.look(looking_direction) - - -class TauCreature(PiCreature): - CONFIG = { - "file_name_prefix": "TauCreatures" - } - - -class ThreeLeggedPiCreature(PiCreature): - CONFIG = { - "file_name_prefix": "ThreeLeggedPiCreatures" - } - - -class Eyes(VMobject): - CONFIG = { - "height": 0.3, - "thing_to_look_at": None, - "mode": "plain", - } - - def __init__(self, body, **kwargs): - VMobject.__init__(self, **kwargs) - self.body = body - eyes = self.create_eyes() - self.become(eyes, copy_submobjects=False) - - def create_eyes(self, mode=None, thing_to_look_at=None): - if mode is None: - mode = self.mode - if thing_to_look_at is None: - thing_to_look_at = self.thing_to_look_at - self.thing_to_look_at = thing_to_look_at - self.mode = mode - looking_direction = None - - pi = PiCreature(mode=mode) - eyes = VGroup(pi.eyes, pi.pupils) - if self.submobjects: - eyes.match_height(self) - eyes.move_to(self, DOWN) - looking_direction = self[1].get_center() - self[0].get_center() - else: - eyes.set_height(self.height) - eyes.move_to(self.body.get_top(), DOWN) - - height = eyes.get_height() - if thing_to_look_at is not None: - pi.look_at(thing_to_look_at) - elif looking_direction is not None: - pi.look(looking_direction) - eyes.set_height(height) - - return eyes - - def change_mode(self, mode, thing_to_look_at=None): - new_eyes = self.create_eyes( - mode=mode, - thing_to_look_at=thing_to_look_at - ) - self.become(new_eyes, copy_submobjects=False) - return self - - def look_at(self, thing_to_look_at): - self.change_mode( - self.mode, - thing_to_look_at=thing_to_look_at - ) - return self - - def blink(self, **kwargs): # TODO, change Blink - bottom_y = self.get_bottom()[1] - for submob in self: - submob.apply_function( - lambda p: [p[0], bottom_y, p[2]] - ) - return self diff --git a/manimlib/for_3b1b_videos/pi_creature_animations.py b/manimlib/for_3b1b_videos/pi_creature_animations.py deleted file mode 100644 index 91df37739a..0000000000 --- a/manimlib/for_3b1b_videos/pi_creature_animations.py +++ /dev/null @@ -1,122 +0,0 @@ -from manimlib.animation.animation import Animation -from manimlib.animation.composition import AnimationGroup -from manimlib.animation.fading import FadeOut -from manimlib.animation.creation import DrawBorderThenFill -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): - CONFIG = { - "rate_func": squish_rate_func(there_and_back) - } - - def __init__(self, pi_creature, **kwargs): - ApplyMethod.__init__(self, pi_creature.blink, **kwargs) - - -class PiCreatureBubbleIntroduction(AnimationGroup): - CONFIG = { - "target_mode": "speaking", - "bubble_class": SpeechBubble, - "change_mode_kwargs": {}, - "bubble_creation_class": DrawBorderThenFill, - "bubble_creation_kwargs": {}, - "bubble_kwargs": {}, - "content_introduction_class": Write, - "content_introduction_kwargs": {}, - "look_at_arg": None, - } - - def __init__(self, pi_creature, *content, **kwargs): - digest_config(self, kwargs) - bubble = pi_creature.get_bubble( - *content, - bubble_class=self.bubble_class, - **self.bubble_kwargs - ) - Group(bubble, bubble.content).shift_onto_screen() - - pi_creature.generate_target() - pi_creature.target.change_mode(self.target_mode) - if self.look_at_arg is not None: - pi_creature.target.look_at(self.look_at_arg) - - change_mode = MoveToTarget(pi_creature, **self.change_mode_kwargs) - bubble_creation = self.bubble_creation_class( - bubble, **self.bubble_creation_kwargs - ) - content_introduction = self.content_introduction_class( - bubble.content, **self.content_introduction_kwargs - ) - AnimationGroup.__init__( - self, change_mode, bubble_creation, content_introduction, - **kwargs - ) - - -class PiCreatureSays(PiCreatureBubbleIntroduction): - CONFIG = { - "target_mode": "speaking", - "bubble_class": SpeechBubble, - } - - -class RemovePiCreatureBubble(AnimationGroup): - CONFIG = { - "target_mode": "plain", - "look_at_arg": None, - "remover": True, - } - - def __init__(self, pi_creature, **kwargs): - assert hasattr(pi_creature, "bubble") - digest_config(self, kwargs, locals()) - - pi_creature.generate_target() - pi_creature.target.change_mode(self.target_mode) - if self.look_at_arg is not None: - pi_creature.target.look_at(self.look_at_arg) - - AnimationGroup.__init__( - self, - MoveToTarget(pi_creature), - FadeOut(pi_creature.bubble), - FadeOut(pi_creature.bubble.content), - ) - - def clean_up_from_scene(self, scene=None): - AnimationGroup.clean_up_from_scene(self, scene) - self.pi_creature.bubble = None - if scene is not None: - scene.add(self.pi_creature) - - -class FlashThroughClass(Animation): - CONFIG = { - "highlight_color": GREEN, - } - - def __init__(self, mobject, mode="linear", **kwargs): - if not isinstance(mobject, PiCreatureClass): - raise Exception("FlashThroughClass mobject must be a PiCreatureClass") - digest_config(self, kwargs) - self.indices = list(range(mobject.height * mobject.width)) - if mode == "random": - np.random.shuffle(self.indices) - Animation.__init__(self, mobject, **kwargs) - - def interpolate_mobject(self, alpha): - index = int(np.floor(alpha * self.mobject.height * self.mobject.width)) - for pi in self.mobject: - pi.set_color(BLUE_E) - if index < self.mobject.height * self.mobject.width: - self.mobject[self.indices[index]].set_color(self.highlight_color) diff --git a/manimlib/for_3b1b_videos/pi_creature_scene.py b/manimlib/for_3b1b_videos/pi_creature_scene.py deleted file mode 100644 index def1216d7b..0000000000 --- a/manimlib/for_3b1b_videos/pi_creature_scene.py +++ /dev/null @@ -1,381 +0,0 @@ -import itertools as it -import random - -from manimlib.animation.transform import ReplacementTransform -from manimlib.animation.transform import Transform -from manimlib.animation.transform import ApplyMethod -from manimlib.animation.composition import LaggedStart -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.mobject import Group -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): - CONFIG = { - "total_wait_time": 0, - "seconds_to_blink": 3, - "pi_creatures_start_on_screen": True, - "default_pi_creature_kwargs": { - "color": BLUE, - "flip_at_start": False, - }, - "default_pi_creature_start_corner": DL, - } - - def setup(self): - self.pi_creatures = VGroup(*self.create_pi_creatures()) - self.pi_creature = self.get_primary_pi_creature() - if self.pi_creatures_start_on_screen: - self.add(*self.pi_creatures) - - def create_pi_creatures(self): - """ - Likely updated for subclasses - """ - return VGroup(self.create_pi_creature()) - - def create_pi_creature(self): - pi_creature = PiCreature(**self.default_pi_creature_kwargs) - pi_creature.to_corner(self.default_pi_creature_start_corner) - return pi_creature - - def get_pi_creatures(self): - return self.pi_creatures - - def get_primary_pi_creature(self): - return self.pi_creatures[0] - - def any_pi_creatures_on_screen(self): - return len(self.get_on_screen_pi_creatures()) > 0 - - def get_on_screen_pi_creatures(self): - mobjects = self.get_mobject_family_members() - return VGroup(*[ - pi for pi in self.get_pi_creatures() - if pi in mobjects - ]) - - def introduce_bubble(self, *args, **kwargs): - if isinstance(args[0], PiCreature): - pi_creature = args[0] - content = args[1:] - else: - pi_creature = self.get_primary_pi_creature() - content = args - - bubble_class = kwargs.pop("bubble_class", SpeechBubble) - target_mode = kwargs.pop( - "target_mode", - "thinking" if bubble_class is ThoughtBubble else "speaking" - ) - bubble_kwargs = kwargs.pop("bubble_kwargs", {}) - bubble_removal_kwargs = kwargs.pop("bubble_removal_kwargs", {}) - added_anims = kwargs.pop("added_anims", []) - - anims = [] - on_screen_mobjects = self.camera.extract_mobject_family_members( - self.get_mobjects() - ) - - def has_bubble(pi): - return hasattr(pi, "bubble") and \ - pi.bubble is not None and \ - pi.bubble in on_screen_mobjects - - pi_creatures_with_bubbles = list(filter(has_bubble, self.get_pi_creatures())) - if pi_creature in pi_creatures_with_bubbles: - pi_creatures_with_bubbles.remove(pi_creature) - old_bubble = pi_creature.bubble - bubble = pi_creature.get_bubble( - *content, - bubble_class=bubble_class, - **bubble_kwargs - ) - anims += [ - ReplacementTransform(old_bubble, bubble), - ReplacementTransform(old_bubble.content, bubble.content), - pi_creature.change_mode, target_mode - ] - else: - anims.append(PiCreatureBubbleIntroduction( - pi_creature, - *content, - bubble_class=bubble_class, - bubble_kwargs=bubble_kwargs, - target_mode=target_mode, - **kwargs - )) - anims += [ - RemovePiCreatureBubble(pi, **bubble_removal_kwargs) - for pi in pi_creatures_with_bubbles - ] - anims += added_anims - - self.play(*anims, **kwargs) - - def pi_creature_says(self, *args, **kwargs): - self.introduce_bubble( - *args, - bubble_class=SpeechBubble, - **kwargs - ) - - def pi_creature_thinks(self, *args, **kwargs): - self.introduce_bubble( - *args, - bubble_class=ThoughtBubble, - **kwargs - ) - - def say(self, *content, **kwargs): - self.pi_creature_says( - self.get_primary_pi_creature(), *content, **kwargs) - - def think(self, *content, **kwargs): - self.pi_creature_thinks( - self.get_primary_pi_creature(), *content, **kwargs) - - def compile_play_args_to_animation_list(self, *args, **kwargs): - """ - Add animations so that all pi creatures look at the - first mobject being animated with each .play call - """ - animations = Scene.compile_play_args_to_animation_list(self, *args, **kwargs) - anim_mobjects = Group(*[a.mobject for a in animations]) - all_movers = anim_mobjects.get_family() - if not self.any_pi_creatures_on_screen(): - return animations - - pi_creatures = self.get_on_screen_pi_creatures() - non_pi_creature_anims = [ - anim - for anim in animations - if len(set(anim.mobject.get_family()).intersection(pi_creatures)) == 0 - ] - if len(non_pi_creature_anims) == 0: - return animations - # Get pi creatures to look at whatever - # is being animated - first_anim = non_pi_creature_anims[0] - main_mobject = first_anim.mobject - for pi_creature in pi_creatures: - if pi_creature not in all_movers: - animations.append(ApplyMethod( - pi_creature.look_at, - main_mobject, - )) - return animations - - def blink(self): - self.play(Blink(random.choice(self.get_on_screen_pi_creatures()))) - - def joint_blink(self, pi_creatures=None, shuffle=True, **kwargs): - if pi_creatures is None: - pi_creatures = self.get_on_screen_pi_creatures() - creatures_list = list(pi_creatures) - if shuffle: - random.shuffle(creatures_list) - - def get_rate_func(pi): - index = creatures_list.index(pi) - proportion = float(index) / len(creatures_list) - start_time = 0.8 * proportion - return squish_rate_func( - there_and_back, - start_time, start_time + 0.2 - ) - - self.play(*[ - Blink(pi, rate_func=get_rate_func(pi), **kwargs) - for pi in creatures_list - ]) - return self - - def wait(self, time=1, blink=True, **kwargs): - if "stop_condition" in kwargs: - self.non_blink_wait(time, **kwargs) - return - while time >= 1: - time_to_blink = self.total_wait_time % self.seconds_to_blink == 0 - if blink and self.any_pi_creatures_on_screen() and time_to_blink: - self.blink() - else: - self.non_blink_wait(**kwargs) - time -= 1 - self.total_wait_time += 1 - if time > 0: - self.non_blink_wait(time, **kwargs) - return self - - def non_blink_wait(self, time=1, **kwargs): - Scene.wait(self, time, **kwargs) - return self - - def change_mode(self, mode): - self.play(self.get_primary_pi_creature().change_mode, mode) - - def look_at(self, thing_to_look_at, pi_creatures=None, **kwargs): - if pi_creatures is None: - pi_creatures = self.get_pi_creatures() - args = list(it.chain(*[ - [pi.look_at, thing_to_look_at] - for pi in pi_creatures - ])) - self.play(*args, **kwargs) - - -class MortyPiCreatureScene(PiCreatureScene): - CONFIG = { - "default_pi_creature_kwargs": { - "color": GREY_BROWN, - "flip_at_start": True, - }, - "default_pi_creature_start_corner": DR, - } - - -class TeacherStudentsScene(PiCreatureScene): - CONFIG = { - "student_colors": [BLUE_D, BLUE_E, BLUE_C], - "teacher_color": GREY_BROWN, - "student_scale_factor": 0.8, - "seconds_to_blink": 2, - "screen_height": 3, - "camera_config": { - "background_color": DARKER_GREY, - }, - } - - def setup(self): - PiCreatureScene.setup(self) - self.screen = ScreenRectangle(height=self.screen_height) - self.screen.to_corner(UP + LEFT) - self.hold_up_spot = self.teacher.get_corner(UP + LEFT) + MED_LARGE_BUFF * UP - - def create_pi_creatures(self): - self.teacher = Mortimer(color=self.teacher_color) - self.teacher.to_corner(DOWN + RIGHT) - self.teacher.look(DOWN + LEFT) - self.students = VGroup(*[ - Randolph(color=c) - for c in self.student_colors - ]) - self.students.arrange(RIGHT) - self.students.scale(self.student_scale_factor) - self.students.to_corner(DOWN + LEFT) - self.teacher.look_at(self.students[-1].eyes) - for student in self.students: - student.look_at(self.teacher.eyes) - - return [self.teacher] + list(self.students) - - def get_teacher(self): - return self.teacher - - def get_students(self): - return self.students - - def teacher_says(self, *content, **kwargs): - return self.pi_creature_says( - self.get_teacher(), *content, **kwargs - ) - - def student_says(self, *content, **kwargs): - if "target_mode" not in kwargs: - target_mode = random.choice([ - "raise_right_hand", - "raise_left_hand", - ]) - kwargs["target_mode"] = target_mode - if "bubble_kwargs" not in kwargs: - kwargs["bubble_kwargs"] = {"direction": LEFT} - student = self.get_students()[kwargs.get("student_index", 2)] - return self.pi_creature_says( - student, *content, **kwargs - ) - - def teacher_thinks(self, *content, **kwargs): - return self.pi_creature_thinks( - self.get_teacher(), *content, **kwargs - ) - - def student_thinks(self, *content, **kwargs): - student = self.get_students()[kwargs.get("student_index", 2)] - return self.pi_creature_thinks(student, *content, **kwargs) - - def change_all_student_modes(self, mode, **kwargs): - self.change_student_modes(*[mode] * len(self.students), **kwargs) - - def change_student_modes(self, *modes, **kwargs): - added_anims = kwargs.pop("added_anims", []) - self.play( - self.get_student_changes(*modes, **kwargs), - *added_anims - ) - - def get_student_changes(self, *modes, **kwargs): - pairs = list(zip(self.get_students(), modes)) - pairs = [(s, m) for s, m in pairs if m is not None] - start = VGroup(*[s for s, m in pairs]) - target = VGroup(*[s.copy().change_mode(m) for s, m in pairs]) - if "look_at_arg" in kwargs: - for pi in target: - pi.look_at(kwargs["look_at_arg"]) - anims = [ - Transform(s, t) - for s, t in zip(start, target) - ] - return LaggedStart( - *anims, - lag_ratio=kwargs.get("lag_ratio", 0.5), - run_time=1, - ) - # return Transform( - # start, target, - # lag_ratio=lag_ratio, - # run_time=2 - # ) - - def zoom_in_on_thought_bubble(self, bubble=None, radius=FRAME_Y_RADIUS + FRAME_X_RADIUS): - if bubble is None: - for pi in self.get_pi_creatures(): - if hasattr(pi, "bubble") and isinstance(pi.bubble, ThoughtBubble): - bubble = pi.bubble - break - if bubble is None: - raise Exception("No pi creatures have a thought bubble") - vect = -bubble.get_bubble_center() - - def func(point): - centered = point + vect - return radius * centered / get_norm(centered) - self.play(*[ - ApplyPointwiseFunction(func, mob) - for mob in self.get_mobjects() - ]) - - def teacher_holds_up(self, mobject, target_mode="raise_right_hand", added_anims=None, **kwargs): - mobject.move_to(self.hold_up_spot, DOWN) - mobject.shift_onto_screen() - mobject_copy = mobject.copy() - mobject_copy.shift(DOWN) - mobject_copy.fade(1) - added_anims = added_anims or [] - self.play( - ReplacementTransform(mobject_copy, mobject), - self.teacher.change, target_mode, - *added_anims - ) diff --git a/manimlib/imports.py b/manimlib/imports.py index ad1ecc7e52..92dddbe54a 100644 --- a/manimlib/imports.py +++ b/manimlib/imports.py @@ -60,11 +60,6 @@ from manimlib.mobject.value_tracker import * from manimlib.mobject.vector_field 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 manimlib.scene.graph_scene import * from manimlib.scene.moving_camera_scene import * from manimlib.scene.reconfigurable_scene import * diff --git a/manimlib/mobject/svg/drawings.py b/manimlib/mobject/svg/drawings.py index 866250853a..b0efa84741 100644 --- a/manimlib/mobject/svg/drawings.py +++ b/manimlib/mobject/svg/drawings.py @@ -65,22 +65,6 @@ class Guitar(SVGMobject): } -class SunGlasses(SVGMobject): - CONFIG = { - "file_name": "sunglasses", - "glasses_width_to_eyes_width": 1.1, - } - - def __init__(self, pi_creature, **kwargs): - SVGMobject.__init__(self, **kwargs) - self.set_stroke(WHITE, width=0) - self.set_fill(GREY, 1) - self.set_width( - self.glasses_width_to_eyes_width * pi_creature.eyes.get_width() - ) - self.move_to(pi_creature.eyes, UP) - - class Speedometer(VMobject): CONFIG = { "arc_angle": 4 * np.pi / 3, @@ -175,7 +159,6 @@ class PartyHat(SVGMobject): CONFIG = { "file_name": "party_hat", "height": 1.5, - "pi_creature": None, "stroke_width": 0, "fill_opacity": 1, "frills_colors": [MAROON_B, PURPLE], @@ -188,8 +171,6 @@ class PartyHat(SVGMobject): def __init__(self, **kwargs): SVGMobject.__init__(self, **kwargs) self.set_height(self.height) - if self.pi_creature is not None: - self.next_to(self.pi_creature.eyes, UP, buff=0) self.frills = VGroup(*self[:self.NUM_FRILLS]) self.cone = self[self.NUM_FRILLS] @@ -332,18 +313,13 @@ class Headphones(SVGMobject): "color": GREY, } - def __init__(self, pi_creature=None, **kwargs): + def __init__(self, **kwargs): digest_config(self, kwargs) SVGMobject.__init__(self, file_name=self.file_name, **kwargs) self.stretch(self.y_stretch_factor, 1) self.set_height(self.height) self.set_stroke(width=0) self.set_fill(color=self.color) - if pi_creature is not None: - eyes = pi_creature.eyes - self.set_height(3 * eyes.get_height()) - self.move_to(eyes, DOWN) - self.shift(DOWN * eyes.get_height() / 4) class Clock(VGroup): @@ -560,16 +536,6 @@ def __init__(self, **kwargs): self.set_stroke(color=WHITE, width=0) self.set_fill(self.color, opacity=1) - from manimlib.for_3b1b_videos.pi_creature import Randolph - randy = Randolph(mode="happy") - randy.set_height(0.6 * self.get_height()) - randy.stretch(0.8, 0) - randy.look(RIGHT) - randy.move_to(self) - randy.shift(0.07 * self.height * (RIGHT + UP)) - self.randy = self.pi_creature = randy - self.add_to_back(randy) - orientation_line = Line(self.get_left(), self.get_right()) orientation_line.set_stroke(width=0) self.add(orientation_line) @@ -994,46 +960,7 @@ def get_number_design(self, value, symbol): return design def get_face_card_design(self, value, symbol): - from for_3b1b_videos.pi_creature import PiCreature - sub_rect = Rectangle( - stroke_color=BLACK, - fill_opacity=0, - height=0.9 * self.get_height(), - width=0.6 * self.get_width(), - ) - sub_rect.move_to(self) - - # pi_color = average_color(symbol.get_color(), GREY) - pi_color = symbol.get_color() - pi_mode = { - "J": "plain", - "Q": "thinking", - "K": "hooray" - }[value] - pi_creature = PiCreature( - mode=pi_mode, - color=pi_color, - ) - pi_creature.set_width(0.8 * sub_rect.get_width()) - if value in ["Q", "K"]: - prefix = "king" if value == "K" else "queen" - crown = SVGMobject(file_name=prefix + "_crown") - crown.set_stroke(width=0) - crown.set_fill(YELLOW, 1) - crown.stretch_to_fit_width(0.5 * sub_rect.get_width()) - crown.stretch_to_fit_height(0.17 * sub_rect.get_height()) - crown.move_to(pi_creature.eyes.get_center(), DOWN) - pi_creature.add_to_back(crown) - to_top_buff = 0 - else: - to_top_buff = SMALL_BUFF * sub_rect.get_height() - pi_creature.next_to(sub_rect.get_top(), DOWN, to_top_buff) - # pi_creature.shift(0.05*sub_rect.get_width()*RIGHT) - - pi_copy = pi_creature.copy() - pi_copy.rotate(np.pi, about_point=sub_rect.get_center()) - - return VGroup(sub_rect, pi_creature, pi_copy) + return VGroup() def get_corner_numbers(self, value, symbol): value_mob = TextMobject(value) From a169645a8cb8dd679ecac80f36ee7780b6ca1f5e Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Wed, 20 May 2020 20:12:09 -0700 Subject: [PATCH 05/98] Add setup.py --- manim.py | 5 ----- setup.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) delete mode 100755 manim.py create mode 100755 setup.py diff --git a/manim.py b/manim.py deleted file mode 100755 index 2bebaea661..0000000000 --- a/manim.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python -import manimlib - -if __name__ == "__main__": - manimlib.main() diff --git a/setup.py b/setup.py new file mode 100755 index 0000000000..6410773c67 --- /dev/null +++ b/setup.py @@ -0,0 +1,30 @@ +from setuptools import setup, find_namespace_packages +setup( + name="manimlib", + version="0.2.0", + description="Animation engine for explanatory math videos", + license="MIT", + packages=find_namespace_packages(), + package_data={ "manimlib": ["*.tex"] }, + entry_points={ + "console_scripts": [ + "manim=manimlib:main", + "manimcm=manimlib:main", + ] + }, + install_requires=[ + "colour", + "argparse", + "colour", + "numpy", + "Pillow", + "progressbar", + "scipy", + "tqdm", + "opencv-python", + "pycairo", + "pydub", + "pygments", + "pyreadline; sys_platform == 'win32'", + ], +) From 260d009ff0bdf095a697c3b6af44c14ad9393def Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Thu, 21 May 2020 03:47:06 -0700 Subject: [PATCH 06/98] Restore --save_pngs functionality --- manimlib/scene/scene_file_writer.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/manimlib/scene/scene_file_writer.py b/manimlib/scene/scene_file_writer.py index 298339748c..f0dfbe63db 100644 --- a/manimlib/scene/scene_file_writer.py +++ b/manimlib/scene/scene_file_writer.py @@ -6,6 +6,7 @@ import _thread as thread from time import sleep import datetime +from PIL import Image import manimlib.constants as consts from manimlib.constants import FFMPEG_BIN @@ -37,7 +38,6 @@ class SceneFileWriter(object): """ CONFIG = { "write_to_movie": False, - # TODO, save_pngs is doing nothing "save_pngs": False, "png_mode": "RGBA", "save_last_frame": False, @@ -56,6 +56,7 @@ def __init__(self, scene, **kwargs): self.stream_lock = False self.init_output_directories() self.init_audio() + self.frame_count = 0 # Output directories and files def init_output_directories(self): @@ -66,7 +67,7 @@ def init_output_directories(self): """ module_directory = self.output_directory or self.get_default_module_directory() scene_name = self.file_name or self.get_default_scene_name() - if self.save_last_frame: + if self.save_last_frame or self.save_pngs: if consts.VIDEO_DIR != "": image_dir = guarantee_existence(os.path.join( consts.VIDEO_DIR, @@ -334,6 +335,10 @@ def write_frame(self, frame): """ if self.write_to_movie: self.writing_process.stdin.write(frame.tostring()) + if self.save_pngs: + path, extension = os.path.splitext(self.image_file_path) + Image.fromarray(frame).save(f'{path}{self.frame_count}{extension}') + self.frame_count += 1 def save_final_image(self, image): """ From 98122e93a683f30507010be9d090db3fa3ed87be Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Thu, 21 May 2020 20:31:21 +0530 Subject: [PATCH 07/98] Add requirements.txt and update readme on example --- README.md | 8 ++++---- requirements.txt | 24 ++++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index f7124d52d3..c8b686278d 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,6 @@ depending on whether you want to use HTTPS or SSH. Finally, run the following: ```sh - python3 -m pip install -r requirements.txt ``` @@ -188,15 +187,16 @@ python3 -m pip install -r requirements.txt To run your first example Scene, you can run the following commands: For users: -1. Download the `example_scenes.py` file from [GitHub](https://github.com/ManimCommunity/manim/blob/master/example_scenes.py) + +1. Download the `example_scenes.py` file from [GitHub](https://github.com/ManimCommunity/manim/blob/master/example_scenes/basic.py) 2. Run the following command: ```sh -manim example_scenes.py SquareToCircle -pl +manim basic.py SquareToCircle -pl ``` 1. Run the following command: For developers: ```sh -python3 manim.py example_scenes.py SquareToCircle -pl +python3 manim.py example_scenes\basic.py SquareToCircle -pl ``` ![](./readme-assets/command.png) diff --git a/requirements.txt b/requirements.txt index 9b54f76ae4..e8472e2c8c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,12 @@ -argparse -colour -numpy -Pillow -progressbar -scipy -tqdm -opencv-python -pycairo -pydub -pygments -pyreadline; sys_platform == 'win32' +argparse==1.4.0 +colour==0.1.5 +numpy==1.18.4 +opencv-python==4.2.0.34 +Pillow==7.1.2 +progressbar==2.5 +pycairo==1.19.1 +pydub==0.24.0 +Pygments==2.6.1 +scipy==1.4.1 +tqdm==4.46.0 +pyreadline==2.1; sys_platform == 'win32' \ No newline at end of file From c7129e4939de2cdd5a403dc98eecc2b55a3ece99 Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Thu, 21 May 2020 20:45:58 +0530 Subject: [PATCH 08/98] Update requirements.txt --- requirements.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/requirements.txt b/requirements.txt index e8472e2c8c..9b54f76ae4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,12 @@ -argparse==1.4.0 -colour==0.1.5 -numpy==1.18.4 -opencv-python==4.2.0.34 -Pillow==7.1.2 -progressbar==2.5 -pycairo==1.19.1 -pydub==0.24.0 -Pygments==2.6.1 -scipy==1.4.1 -tqdm==4.46.0 -pyreadline==2.1; sys_platform == 'win32' \ No newline at end of file +argparse +colour +numpy +Pillow +progressbar +scipy +tqdm +opencv-python +pycairo +pydub +pygments +pyreadline; sys_platform == 'win32' From b01936481b806561ab2a1af68212df1496cca0b8 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Thu, 21 May 2020 13:13:26 -0700 Subject: [PATCH 09/98] Rename from manimlib to manim --- {manimlib => manim}/__init__.py | 0 {manimlib => manim}/animation/animation.py | 0 {manimlib => manim}/animation/composition.py | 0 {manimlib => manim}/animation/creation.py | 0 {manimlib => manim}/animation/fading.py | 0 {manimlib => manim}/animation/growing.py | 0 {manimlib => manim}/animation/indication.py | 0 {manimlib => manim}/animation/movement.py | 0 {manimlib => manim}/animation/numbers.py | 0 {manimlib => manim}/animation/rotation.py | 0 {manimlib => manim}/animation/specialized.py | 0 {manimlib => manim}/animation/transform.py | 0 {manimlib => manim}/animation/update.py | 0 {manimlib => manim}/camera/camera.py | 0 {manimlib => manim}/camera/mapping_camera.py | 0 {manimlib => manim}/camera/moving_camera.py | 0 {manimlib => manim}/camera/multi_camera.py | 0 {manimlib => manim}/camera/three_d_camera.py | 0 {manimlib => manim}/config.py | 0 {manimlib => manim}/constants.py | 0 {manimlib => manim}/container/container.py | 0 {manimlib => manim}/ctex_template.tex | 0 {manimlib => manim}/extract_scene.py | 0 {manimlib => manim}/files/Bubbles_speech.svg | 0 {manimlib => manim}/files/Bubbles_thought.svg | 0 {manimlib => manim}/files/PiCreatures_plain.svg | 0 {manimlib => manim}/imports.py | 0 {manimlib => manim}/media_dir.txt | 0 {manimlib => manim}/mobject/changing.py | 0 {manimlib => manim}/mobject/coordinate_systems.py | 0 {manimlib => manim}/mobject/frame.py | 0 {manimlib => manim}/mobject/functions.py | 0 {manimlib => manim}/mobject/geometry.py | 0 {manimlib => manim}/mobject/matrix.py | 0 {manimlib => manim}/mobject/mobject.py | 0 {manimlib => manim}/mobject/mobject_update_utils.py | 0 {manimlib => manim}/mobject/number_line.py | 0 {manimlib => manim}/mobject/numbers.py | 0 {manimlib => manim}/mobject/probability.py | 0 {manimlib => manim}/mobject/shape_matchers.py | 0 {manimlib => manim}/mobject/svg/brace.py | 0 {manimlib => manim}/mobject/svg/code_mobject.py | 0 {manimlib => manim}/mobject/svg/drawings.py | 0 {manimlib => manim}/mobject/svg/svg_mobject.py | 0 {manimlib => manim}/mobject/svg/tex_mobject.py | 0 {manimlib => manim}/mobject/svg/text_mobject.py | 0 {manimlib => manim}/mobject/three_d_shading_utils.py | 0 {manimlib => manim}/mobject/three_d_utils.py | 0 {manimlib => manim}/mobject/three_dimensions.py | 0 {manimlib => manim}/mobject/types/image_mobject.py | 0 {manimlib => manim}/mobject/types/point_cloud_mobject.py | 0 {manimlib => manim}/mobject/types/vectorized_mobject.py | 0 {manimlib => manim}/mobject/value_tracker.py | 0 {manimlib => manim}/mobject/vector_field.py | 0 {manimlib => manim}/scene/graph_scene.py | 0 {manimlib => manim}/scene/media_dir.txt | 0 {manimlib => manim}/scene/moving_camera_scene.py | 0 {manimlib => manim}/scene/reconfigurable_scene.py | 0 {manimlib => manim}/scene/sample_space_scene.py | 0 {manimlib => manim}/scene/scene.py | 0 {manimlib => manim}/scene/scene_file_writer.py | 0 {manimlib => manim}/scene/scene_from_video.py | 0 {manimlib => manim}/scene/three_d_scene.py | 0 {manimlib => manim}/scene/vector_space_scene.py | 0 {manimlib => manim}/scene/zoomed_scene.py | 0 {manimlib => manim}/tex_template.tex | 0 {manimlib => manim}/utils/bezier.py | 0 {manimlib => manim}/utils/color.py | 0 {manimlib => manim}/utils/config_ops.py | 0 {manimlib => manim}/utils/debug.py | 0 {manimlib => manim}/utils/file_ops.py | 0 {manimlib => manim}/utils/images.py | 0 {manimlib => manim}/utils/iterables.py | 0 {manimlib => manim}/utils/paths.py | 0 {manimlib => manim}/utils/rate_functions.py | 0 {manimlib => manim}/utils/simple_functions.py | 0 {manimlib => manim}/utils/sounds.py | 0 {manimlib => manim}/utils/space_ops.py | 0 {manimlib => manim}/utils/strings.py | 0 {manimlib => manim}/utils/tex_file_writing.py | 0 setup.py | 8 ++++---- 81 files changed, 4 insertions(+), 4 deletions(-) rename {manimlib => manim}/__init__.py (100%) rename {manimlib => manim}/animation/animation.py (100%) rename {manimlib => manim}/animation/composition.py (100%) rename {manimlib => manim}/animation/creation.py (100%) rename {manimlib => manim}/animation/fading.py (100%) rename {manimlib => manim}/animation/growing.py (100%) rename {manimlib => manim}/animation/indication.py (100%) rename {manimlib => manim}/animation/movement.py (100%) rename {manimlib => manim}/animation/numbers.py (100%) rename {manimlib => manim}/animation/rotation.py (100%) rename {manimlib => manim}/animation/specialized.py (100%) rename {manimlib => manim}/animation/transform.py (100%) rename {manimlib => manim}/animation/update.py (100%) rename {manimlib => manim}/camera/camera.py (100%) rename {manimlib => manim}/camera/mapping_camera.py (100%) rename {manimlib => manim}/camera/moving_camera.py (100%) rename {manimlib => manim}/camera/multi_camera.py (100%) rename {manimlib => manim}/camera/three_d_camera.py (100%) rename {manimlib => manim}/config.py (100%) rename {manimlib => manim}/constants.py (100%) rename {manimlib => manim}/container/container.py (100%) rename {manimlib => manim}/ctex_template.tex (100%) rename {manimlib => manim}/extract_scene.py (100%) rename {manimlib => manim}/files/Bubbles_speech.svg (100%) rename {manimlib => manim}/files/Bubbles_thought.svg (100%) rename {manimlib => manim}/files/PiCreatures_plain.svg (100%) rename {manimlib => manim}/imports.py (100%) rename {manimlib => manim}/media_dir.txt (100%) rename {manimlib => manim}/mobject/changing.py (100%) rename {manimlib => manim}/mobject/coordinate_systems.py (100%) rename {manimlib => manim}/mobject/frame.py (100%) rename {manimlib => manim}/mobject/functions.py (100%) rename {manimlib => manim}/mobject/geometry.py (100%) rename {manimlib => manim}/mobject/matrix.py (100%) rename {manimlib => manim}/mobject/mobject.py (100%) rename {manimlib => manim}/mobject/mobject_update_utils.py (100%) rename {manimlib => manim}/mobject/number_line.py (100%) rename {manimlib => manim}/mobject/numbers.py (100%) rename {manimlib => manim}/mobject/probability.py (100%) rename {manimlib => manim}/mobject/shape_matchers.py (100%) rename {manimlib => manim}/mobject/svg/brace.py (100%) rename {manimlib => manim}/mobject/svg/code_mobject.py (100%) rename {manimlib => manim}/mobject/svg/drawings.py (100%) rename {manimlib => manim}/mobject/svg/svg_mobject.py (100%) rename {manimlib => manim}/mobject/svg/tex_mobject.py (100%) rename {manimlib => manim}/mobject/svg/text_mobject.py (100%) rename {manimlib => manim}/mobject/three_d_shading_utils.py (100%) rename {manimlib => manim}/mobject/three_d_utils.py (100%) rename {manimlib => manim}/mobject/three_dimensions.py (100%) rename {manimlib => manim}/mobject/types/image_mobject.py (100%) rename {manimlib => manim}/mobject/types/point_cloud_mobject.py (100%) rename {manimlib => manim}/mobject/types/vectorized_mobject.py (100%) rename {manimlib => manim}/mobject/value_tracker.py (100%) rename {manimlib => manim}/mobject/vector_field.py (100%) rename {manimlib => manim}/scene/graph_scene.py (100%) rename {manimlib => manim}/scene/media_dir.txt (100%) rename {manimlib => manim}/scene/moving_camera_scene.py (100%) rename {manimlib => manim}/scene/reconfigurable_scene.py (100%) rename {manimlib => manim}/scene/sample_space_scene.py (100%) rename {manimlib => manim}/scene/scene.py (100%) rename {manimlib => manim}/scene/scene_file_writer.py (100%) rename {manimlib => manim}/scene/scene_from_video.py (100%) rename {manimlib => manim}/scene/three_d_scene.py (100%) rename {manimlib => manim}/scene/vector_space_scene.py (100%) rename {manimlib => manim}/scene/zoomed_scene.py (100%) rename {manimlib => manim}/tex_template.tex (100%) rename {manimlib => manim}/utils/bezier.py (100%) rename {manimlib => manim}/utils/color.py (100%) rename {manimlib => manim}/utils/config_ops.py (100%) rename {manimlib => manim}/utils/debug.py (100%) rename {manimlib => manim}/utils/file_ops.py (100%) rename {manimlib => manim}/utils/images.py (100%) rename {manimlib => manim}/utils/iterables.py (100%) rename {manimlib => manim}/utils/paths.py (100%) rename {manimlib => manim}/utils/rate_functions.py (100%) rename {manimlib => manim}/utils/simple_functions.py (100%) rename {manimlib => manim}/utils/sounds.py (100%) rename {manimlib => manim}/utils/space_ops.py (100%) rename {manimlib => manim}/utils/strings.py (100%) rename {manimlib => manim}/utils/tex_file_writing.py (100%) diff --git a/manimlib/__init__.py b/manim/__init__.py similarity index 100% rename from manimlib/__init__.py rename to manim/__init__.py diff --git a/manimlib/animation/animation.py b/manim/animation/animation.py similarity index 100% rename from manimlib/animation/animation.py rename to manim/animation/animation.py diff --git a/manimlib/animation/composition.py b/manim/animation/composition.py similarity index 100% rename from manimlib/animation/composition.py rename to manim/animation/composition.py diff --git a/manimlib/animation/creation.py b/manim/animation/creation.py similarity index 100% rename from manimlib/animation/creation.py rename to manim/animation/creation.py diff --git a/manimlib/animation/fading.py b/manim/animation/fading.py similarity index 100% rename from manimlib/animation/fading.py rename to manim/animation/fading.py diff --git a/manimlib/animation/growing.py b/manim/animation/growing.py similarity index 100% rename from manimlib/animation/growing.py rename to manim/animation/growing.py diff --git a/manimlib/animation/indication.py b/manim/animation/indication.py similarity index 100% rename from manimlib/animation/indication.py rename to manim/animation/indication.py diff --git a/manimlib/animation/movement.py b/manim/animation/movement.py similarity index 100% rename from manimlib/animation/movement.py rename to manim/animation/movement.py diff --git a/manimlib/animation/numbers.py b/manim/animation/numbers.py similarity index 100% rename from manimlib/animation/numbers.py rename to manim/animation/numbers.py diff --git a/manimlib/animation/rotation.py b/manim/animation/rotation.py similarity index 100% rename from manimlib/animation/rotation.py rename to manim/animation/rotation.py diff --git a/manimlib/animation/specialized.py b/manim/animation/specialized.py similarity index 100% rename from manimlib/animation/specialized.py rename to manim/animation/specialized.py diff --git a/manimlib/animation/transform.py b/manim/animation/transform.py similarity index 100% rename from manimlib/animation/transform.py rename to manim/animation/transform.py diff --git a/manimlib/animation/update.py b/manim/animation/update.py similarity index 100% rename from manimlib/animation/update.py rename to manim/animation/update.py diff --git a/manimlib/camera/camera.py b/manim/camera/camera.py similarity index 100% rename from manimlib/camera/camera.py rename to manim/camera/camera.py diff --git a/manimlib/camera/mapping_camera.py b/manim/camera/mapping_camera.py similarity index 100% rename from manimlib/camera/mapping_camera.py rename to manim/camera/mapping_camera.py diff --git a/manimlib/camera/moving_camera.py b/manim/camera/moving_camera.py similarity index 100% rename from manimlib/camera/moving_camera.py rename to manim/camera/moving_camera.py diff --git a/manimlib/camera/multi_camera.py b/manim/camera/multi_camera.py similarity index 100% rename from manimlib/camera/multi_camera.py rename to manim/camera/multi_camera.py diff --git a/manimlib/camera/three_d_camera.py b/manim/camera/three_d_camera.py similarity index 100% rename from manimlib/camera/three_d_camera.py rename to manim/camera/three_d_camera.py diff --git a/manimlib/config.py b/manim/config.py similarity index 100% rename from manimlib/config.py rename to manim/config.py diff --git a/manimlib/constants.py b/manim/constants.py similarity index 100% rename from manimlib/constants.py rename to manim/constants.py diff --git a/manimlib/container/container.py b/manim/container/container.py similarity index 100% rename from manimlib/container/container.py rename to manim/container/container.py diff --git a/manimlib/ctex_template.tex b/manim/ctex_template.tex similarity index 100% rename from manimlib/ctex_template.tex rename to manim/ctex_template.tex diff --git a/manimlib/extract_scene.py b/manim/extract_scene.py similarity index 100% rename from manimlib/extract_scene.py rename to manim/extract_scene.py diff --git a/manimlib/files/Bubbles_speech.svg b/manim/files/Bubbles_speech.svg similarity index 100% rename from manimlib/files/Bubbles_speech.svg rename to manim/files/Bubbles_speech.svg diff --git a/manimlib/files/Bubbles_thought.svg b/manim/files/Bubbles_thought.svg similarity index 100% rename from manimlib/files/Bubbles_thought.svg rename to manim/files/Bubbles_thought.svg diff --git a/manimlib/files/PiCreatures_plain.svg b/manim/files/PiCreatures_plain.svg similarity index 100% rename from manimlib/files/PiCreatures_plain.svg rename to manim/files/PiCreatures_plain.svg diff --git a/manimlib/imports.py b/manim/imports.py similarity index 100% rename from manimlib/imports.py rename to manim/imports.py diff --git a/manimlib/media_dir.txt b/manim/media_dir.txt similarity index 100% rename from manimlib/media_dir.txt rename to manim/media_dir.txt diff --git a/manimlib/mobject/changing.py b/manim/mobject/changing.py similarity index 100% rename from manimlib/mobject/changing.py rename to manim/mobject/changing.py diff --git a/manimlib/mobject/coordinate_systems.py b/manim/mobject/coordinate_systems.py similarity index 100% rename from manimlib/mobject/coordinate_systems.py rename to manim/mobject/coordinate_systems.py diff --git a/manimlib/mobject/frame.py b/manim/mobject/frame.py similarity index 100% rename from manimlib/mobject/frame.py rename to manim/mobject/frame.py diff --git a/manimlib/mobject/functions.py b/manim/mobject/functions.py similarity index 100% rename from manimlib/mobject/functions.py rename to manim/mobject/functions.py diff --git a/manimlib/mobject/geometry.py b/manim/mobject/geometry.py similarity index 100% rename from manimlib/mobject/geometry.py rename to manim/mobject/geometry.py diff --git a/manimlib/mobject/matrix.py b/manim/mobject/matrix.py similarity index 100% rename from manimlib/mobject/matrix.py rename to manim/mobject/matrix.py diff --git a/manimlib/mobject/mobject.py b/manim/mobject/mobject.py similarity index 100% rename from manimlib/mobject/mobject.py rename to manim/mobject/mobject.py diff --git a/manimlib/mobject/mobject_update_utils.py b/manim/mobject/mobject_update_utils.py similarity index 100% rename from manimlib/mobject/mobject_update_utils.py rename to manim/mobject/mobject_update_utils.py diff --git a/manimlib/mobject/number_line.py b/manim/mobject/number_line.py similarity index 100% rename from manimlib/mobject/number_line.py rename to manim/mobject/number_line.py diff --git a/manimlib/mobject/numbers.py b/manim/mobject/numbers.py similarity index 100% rename from manimlib/mobject/numbers.py rename to manim/mobject/numbers.py diff --git a/manimlib/mobject/probability.py b/manim/mobject/probability.py similarity index 100% rename from manimlib/mobject/probability.py rename to manim/mobject/probability.py diff --git a/manimlib/mobject/shape_matchers.py b/manim/mobject/shape_matchers.py similarity index 100% rename from manimlib/mobject/shape_matchers.py rename to manim/mobject/shape_matchers.py diff --git a/manimlib/mobject/svg/brace.py b/manim/mobject/svg/brace.py similarity index 100% rename from manimlib/mobject/svg/brace.py rename to manim/mobject/svg/brace.py diff --git a/manimlib/mobject/svg/code_mobject.py b/manim/mobject/svg/code_mobject.py similarity index 100% rename from manimlib/mobject/svg/code_mobject.py rename to manim/mobject/svg/code_mobject.py diff --git a/manimlib/mobject/svg/drawings.py b/manim/mobject/svg/drawings.py similarity index 100% rename from manimlib/mobject/svg/drawings.py rename to manim/mobject/svg/drawings.py diff --git a/manimlib/mobject/svg/svg_mobject.py b/manim/mobject/svg/svg_mobject.py similarity index 100% rename from manimlib/mobject/svg/svg_mobject.py rename to manim/mobject/svg/svg_mobject.py diff --git a/manimlib/mobject/svg/tex_mobject.py b/manim/mobject/svg/tex_mobject.py similarity index 100% rename from manimlib/mobject/svg/tex_mobject.py rename to manim/mobject/svg/tex_mobject.py diff --git a/manimlib/mobject/svg/text_mobject.py b/manim/mobject/svg/text_mobject.py similarity index 100% rename from manimlib/mobject/svg/text_mobject.py rename to manim/mobject/svg/text_mobject.py diff --git a/manimlib/mobject/three_d_shading_utils.py b/manim/mobject/three_d_shading_utils.py similarity index 100% rename from manimlib/mobject/three_d_shading_utils.py rename to manim/mobject/three_d_shading_utils.py diff --git a/manimlib/mobject/three_d_utils.py b/manim/mobject/three_d_utils.py similarity index 100% rename from manimlib/mobject/three_d_utils.py rename to manim/mobject/three_d_utils.py diff --git a/manimlib/mobject/three_dimensions.py b/manim/mobject/three_dimensions.py similarity index 100% rename from manimlib/mobject/three_dimensions.py rename to manim/mobject/three_dimensions.py diff --git a/manimlib/mobject/types/image_mobject.py b/manim/mobject/types/image_mobject.py similarity index 100% rename from manimlib/mobject/types/image_mobject.py rename to manim/mobject/types/image_mobject.py diff --git a/manimlib/mobject/types/point_cloud_mobject.py b/manim/mobject/types/point_cloud_mobject.py similarity index 100% rename from manimlib/mobject/types/point_cloud_mobject.py rename to manim/mobject/types/point_cloud_mobject.py diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py similarity index 100% rename from manimlib/mobject/types/vectorized_mobject.py rename to manim/mobject/types/vectorized_mobject.py diff --git a/manimlib/mobject/value_tracker.py b/manim/mobject/value_tracker.py similarity index 100% rename from manimlib/mobject/value_tracker.py rename to manim/mobject/value_tracker.py diff --git a/manimlib/mobject/vector_field.py b/manim/mobject/vector_field.py similarity index 100% rename from manimlib/mobject/vector_field.py rename to manim/mobject/vector_field.py diff --git a/manimlib/scene/graph_scene.py b/manim/scene/graph_scene.py similarity index 100% rename from manimlib/scene/graph_scene.py rename to manim/scene/graph_scene.py diff --git a/manimlib/scene/media_dir.txt b/manim/scene/media_dir.txt similarity index 100% rename from manimlib/scene/media_dir.txt rename to manim/scene/media_dir.txt diff --git a/manimlib/scene/moving_camera_scene.py b/manim/scene/moving_camera_scene.py similarity index 100% rename from manimlib/scene/moving_camera_scene.py rename to manim/scene/moving_camera_scene.py diff --git a/manimlib/scene/reconfigurable_scene.py b/manim/scene/reconfigurable_scene.py similarity index 100% rename from manimlib/scene/reconfigurable_scene.py rename to manim/scene/reconfigurable_scene.py diff --git a/manimlib/scene/sample_space_scene.py b/manim/scene/sample_space_scene.py similarity index 100% rename from manimlib/scene/sample_space_scene.py rename to manim/scene/sample_space_scene.py diff --git a/manimlib/scene/scene.py b/manim/scene/scene.py similarity index 100% rename from manimlib/scene/scene.py rename to manim/scene/scene.py diff --git a/manimlib/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py similarity index 100% rename from manimlib/scene/scene_file_writer.py rename to manim/scene/scene_file_writer.py diff --git a/manimlib/scene/scene_from_video.py b/manim/scene/scene_from_video.py similarity index 100% rename from manimlib/scene/scene_from_video.py rename to manim/scene/scene_from_video.py diff --git a/manimlib/scene/three_d_scene.py b/manim/scene/three_d_scene.py similarity index 100% rename from manimlib/scene/three_d_scene.py rename to manim/scene/three_d_scene.py diff --git a/manimlib/scene/vector_space_scene.py b/manim/scene/vector_space_scene.py similarity index 100% rename from manimlib/scene/vector_space_scene.py rename to manim/scene/vector_space_scene.py diff --git a/manimlib/scene/zoomed_scene.py b/manim/scene/zoomed_scene.py similarity index 100% rename from manimlib/scene/zoomed_scene.py rename to manim/scene/zoomed_scene.py diff --git a/manimlib/tex_template.tex b/manim/tex_template.tex similarity index 100% rename from manimlib/tex_template.tex rename to manim/tex_template.tex diff --git a/manimlib/utils/bezier.py b/manim/utils/bezier.py similarity index 100% rename from manimlib/utils/bezier.py rename to manim/utils/bezier.py diff --git a/manimlib/utils/color.py b/manim/utils/color.py similarity index 100% rename from manimlib/utils/color.py rename to manim/utils/color.py diff --git a/manimlib/utils/config_ops.py b/manim/utils/config_ops.py similarity index 100% rename from manimlib/utils/config_ops.py rename to manim/utils/config_ops.py diff --git a/manimlib/utils/debug.py b/manim/utils/debug.py similarity index 100% rename from manimlib/utils/debug.py rename to manim/utils/debug.py diff --git a/manimlib/utils/file_ops.py b/manim/utils/file_ops.py similarity index 100% rename from manimlib/utils/file_ops.py rename to manim/utils/file_ops.py diff --git a/manimlib/utils/images.py b/manim/utils/images.py similarity index 100% rename from manimlib/utils/images.py rename to manim/utils/images.py diff --git a/manimlib/utils/iterables.py b/manim/utils/iterables.py similarity index 100% rename from manimlib/utils/iterables.py rename to manim/utils/iterables.py diff --git a/manimlib/utils/paths.py b/manim/utils/paths.py similarity index 100% rename from manimlib/utils/paths.py rename to manim/utils/paths.py diff --git a/manimlib/utils/rate_functions.py b/manim/utils/rate_functions.py similarity index 100% rename from manimlib/utils/rate_functions.py rename to manim/utils/rate_functions.py diff --git a/manimlib/utils/simple_functions.py b/manim/utils/simple_functions.py similarity index 100% rename from manimlib/utils/simple_functions.py rename to manim/utils/simple_functions.py diff --git a/manimlib/utils/sounds.py b/manim/utils/sounds.py similarity index 100% rename from manimlib/utils/sounds.py rename to manim/utils/sounds.py diff --git a/manimlib/utils/space_ops.py b/manim/utils/space_ops.py similarity index 100% rename from manimlib/utils/space_ops.py rename to manim/utils/space_ops.py diff --git a/manimlib/utils/strings.py b/manim/utils/strings.py similarity index 100% rename from manimlib/utils/strings.py rename to manim/utils/strings.py diff --git a/manimlib/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py similarity index 100% rename from manimlib/utils/tex_file_writing.py rename to manim/utils/tex_file_writing.py diff --git a/setup.py b/setup.py index 6410773c67..c5f8df06fd 100755 --- a/setup.py +++ b/setup.py @@ -1,15 +1,15 @@ from setuptools import setup, find_namespace_packages setup( - name="manimlib", + name="manim", version="0.2.0", description="Animation engine for explanatory math videos", license="MIT", packages=find_namespace_packages(), - package_data={ "manimlib": ["*.tex"] }, + package_data={ "manim": ["*.tex"] }, entry_points={ "console_scripts": [ - "manim=manimlib:main", - "manimcm=manimlib:main", + "manim=manim:main", + "manimcm=manim:main", ] }, install_requires=[ From 5f45392ae630f34e63dfb172599563507c553a59 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Thu, 21 May 2020 13:16:56 -0700 Subject: [PATCH 10/98] Change package name to manimlib to appease pypi --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c5f8df06fd..688d12981a 100755 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import setup, find_namespace_packages setup( - name="manim", + name="manimlib", version="0.2.0", description="Animation engine for explanatory math videos", license="MIT", From 82f6572209c21e7a38383476683eda97d28cf829 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Thu, 21 May 2020 15:13:11 -0700 Subject: [PATCH 11/98] Replace manimlib imports with manim --- example_scenes/basic.py | 2 +- logo/logo.py | 2 +- manim/imports.py | 2 +- tests/tests_sample_scenes.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/example_scenes/basic.py b/example_scenes/basic.py index bc15c55776..1c4daa3b30 100644 --- a/example_scenes/basic.py +++ b/example_scenes/basic.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -from manimlib.imports import * +from manim.imports import * # To watch one of these scenes, run the following: # python -m manim example_scenes.py SquareToCircle -pl diff --git a/logo/logo.py b/logo/logo.py index 14b485d709..41bb7e3930 100644 --- a/logo/logo.py +++ b/logo/logo.py @@ -1,4 +1,4 @@ -from manimlib.imports import * +from manim.imports import * NEW_BLUE = "#68a8e1" diff --git a/manim/imports.py b/manim/imports.py index 8da089fcf4..72b9cb2128 100644 --- a/manim/imports.py +++ b/manim/imports.py @@ -5,7 +5,7 @@ Rather than having a large pile of "from import *" at the top of every such script, the intent of this file is to make it so that one can just include -"from manimlib.imports import *". The effects of adding more modules +"from manim.imports import *". The effects of adding more modules or refactoring the library on current or older scene scripts should be entirely addressible by changing this file. diff --git a/tests/tests_sample_scenes.py b/tests/tests_sample_scenes.py index 4e598822d0..feca458be3 100644 --- a/tests/tests_sample_scenes.py +++ b/tests/tests_sample_scenes.py @@ -1,4 +1,4 @@ -from manimlib.imports import * +from manim.imports import * # This file is intended to test any new feature added. # Feel free to add a test or to modify one when adding a new/changing a feature. From d766c8faf2fba2580c56836f20d8d33677efef57 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Thu, 21 May 2020 15:22:30 -0700 Subject: [PATCH 12/98] Fix scene_file_writer import --- manim/scene/scene_file_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index ff53132161..d68dc33cb9 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -69,7 +69,7 @@ def init_output_directories(self): module_directory = self.output_directory or self.get_default_module_directory() scene_name = self.file_name or self.get_default_scene_name() if self.save_last_frame or self.save_pngs: - if consts.VIDEO_DIR != "": + if VIDEO_DIR != "": image_dir = guarantee_existence(os.path.join( VIDEO_DIR, module_directory, From 92f6eb4ed92c00a92385223fe3273a5fa1caeb2d Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 06:22:08 +0200 Subject: [PATCH 13/98] constants.py overhaul -DIR variables have been moved into their own file to avoid overwriting user changes in the future (dirs.py) -Initialization of directories has been moved to config.py, and a bunch of bugs associated to file structure generation have been fixed -Global dir variable handling has been removed. Instead initialize_directories, if needed, overwrites the values from dirs.py at runtime -Dirs are now only taken from dirs.py directly -In constants.py high quality has gotten its own short argument (-e), and the quality argument explanations have been improved -Deprecated media_dir.txt has been removed -Deprecated if statements in scene_file_writer.py have been removed --- manim/__init__.py | 2 +- manim/config.py | 67 ++++++++++++++++++++++++++----- manim/constants.py | 61 +++------------------------- manim/dirs.py | 4 ++ manim/mobject/mobject.py | 1 + manim/mobject/svg/text_mobject.py | 2 + manim/scene/scene_file_writer.py | 8 ++-- manim/utils/tex_file_writing.py | 3 +- 8 files changed, 74 insertions(+), 74 deletions(-) create mode 100644 manim/dirs.py diff --git a/manim/__init__.py b/manim/__init__.py index 1185c9c3b0..08c5844bdc 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -6,6 +6,6 @@ def main(): args = config.parse_cli() cfg = config.get_configuration(args) - constants.initialize_directories(cfg) + config.initialize_directories(cfg) from . import extract_scene extract_scene.main(cfg) diff --git a/manim/config.py b/manim/config.py index 1fb2e11ced..0b2a64d8c7 100644 --- a/manim/config.py +++ b/manim/config.py @@ -4,8 +4,9 @@ import sys import types -from . import constants +from . import constants +from . import dirs def parse_cli(): try: @@ -37,22 +38,22 @@ def parse_cli(): parser.add_argument( "-l", "--low_quality", action="store_true", - help="Render at a low quality (for faster rendering)", + help="Render at low quality (for fastest rendering)", ), parser.add_argument( "-m", "--medium_quality", action="store_true", - help="Render at a medium quality", + help="Render at medium quality (for much faster rendering)", ), parser.add_argument( - "--high_quality", + "-e", "--high_quality", action="store_true", - help="Render at a high quality", + help="Render at high quality (for slightly faster rendering)", ), parser.add_argument( "-k", "--four_k", action="store_true", - help="Render at a 4K quality", + help="Render at 4K quality (slower rendering)", ), parser.add_argument( "-g", "--save_pngs", @@ -123,14 +124,14 @@ def parse_cli(): "--video_dir", help="directory to write file tree for video", ) - video_group.add_argument( - "--video_output_dir", - help="directory to write video", - ) parser.add_argument( "--tex_dir", help="directory to write tex", ) + parser.add_argument( + "--text_dir", + help="directory to write text", + ) return parser.parse_args() except argparse.ArgumentError as err: print(str(err)) @@ -165,8 +166,8 @@ def get_configuration(args): "leave_progress_bars": args.leave_progress_bars, "media_dir": args.media_dir, "video_dir": args.video_dir, - "video_output_dir": args.video_output_dir, "tex_dir": args.tex_dir, + "text_dir": args.text_dir, } # Camera configuration @@ -239,3 +240,47 @@ def get_camera_configuration(args): camera_config["background_opacity"] = 0 return camera_config + + +def initialize_directories(cfgargs): + dir_config = {} + dir_config["media_dir"] = cfgargs["media_dir"] or dirs.MEDIA_DIR + dir_config["video_dir"] = cfgargs["video_dir"] or dirs.VIDEO_DIR + print(not(cfgargs["video_dir"] or dirs.VIDEO_DIR)) + + if not (cfgargs["video_dir"] and cfgargs["tex_dir"]): + if cfgargs["media_dir"]: + if not os.path.isdir(dir_config["media_dir"]): + os.makedirs(dir_config["media_dir"]) + if not os.path.isdir(dir_config["media_dir"]): + dir_config["media_dir"] = "./media" + else: + print( + f"Media will be written to {dir_config['media_dir'] + os.sep}. You can change " + "this behavior with the --media_dir flag, or by adjusting dirs.py.," + ) + else: + if cfgargs["media_dir"]: + print( + "Ignoring --media_dir, since both --tex_dir and --video_dir were passed." + ) + + dir_config["tex_dir"] = (cfgargs["tex_dir"] + or dirs.TEX_DIR + or os.path.join(dir_config["media_dir"], "Tex")) + dir_config["text_dir"] = (cfgargs["text_dir"] + or dirs.TEXT_DIR + or os.path.join(dir_config["media_dir"], "texts")) + + if not cfgargs["video_dir"] or dirs.VIDEO_DIR: + dir_config["video_dir"] = os.path.join(dir_config["media_dir"], "videos") + + for folder in [dir_config["video_dir"], dir_config["tex_dir"], dir_config["text_dir"]]: + if folder != "" and not os.path.exists(folder): + os.makedirs(folder) + + dirs.MEDIA_DIR = dir_config["media_dir"] + dirs.VIDEO_DIR = dir_config["video_dir"] + dirs.TEX_DIR = dir_config["tex_dir"] + dirs.TEXT_DIR = dir_config["text_dir"] + print(dirs.MEDIA_DIR) diff --git a/manim/constants.py b/manim/constants.py index 9ae2163af5..ed3e5405ed 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -1,62 +1,11 @@ import numpy as np import os -MEDIA_DIR = "" -VIDEO_DIR = "" -VIDEO_OUTPUT_DIR = "" -TEX_DIR = "" -TEXT_DIR = "" - - -def initialize_directories(config): - global MEDIA_DIR - global VIDEO_DIR - global VIDEO_OUTPUT_DIR - global TEX_DIR - global TEXT_DIR - - video_path_specified = config["video_dir"] or config["video_output_dir"] - - if not (video_path_specified and config["tex_dir"]): - if config["media_dir"]: - MEDIA_DIR = config["media_dir"] - else: - MEDIA_DIR = os.path.join( - os.path.expanduser('~'), - "Dropbox (3Blue1Brown)/3Blue1Brown Team Folder" - ) - if not os.path.isdir(MEDIA_DIR): - MEDIA_DIR = "./media" - print( - f"Media will be written to {MEDIA_DIR + os.sep}. You can change " - "this behavior with the --media_dir flag." - ) - else: - if config["media_dir"]: - print( - "Ignoring --media_dir, since both --tex_dir and a video " - "directory were both passed" - ) - - TEX_DIR = config["tex_dir"] or os.path.join(MEDIA_DIR, "Tex") - TEXT_DIR = os.path.join(MEDIA_DIR, "texts") - if not video_path_specified: - VIDEO_DIR = os.path.join(MEDIA_DIR, "videos") - VIDEO_OUTPUT_DIR = os.path.join(MEDIA_DIR, "videos") - elif config["video_output_dir"]: - VIDEO_OUTPUT_DIR = config["video_output_dir"] - else: - VIDEO_DIR = config["video_dir"] - - for folder in [VIDEO_DIR, VIDEO_OUTPUT_DIR, TEX_DIR, TEXT_DIR]: - if folder != "" and not os.path.exists(folder): - os.makedirs(folder) - NOT_SETTING_FONT_MSG=''' Warning: -You haven't set font. -If you are not using English, this may cause text rendering problem. -You set font like: +You haven't set a font. +If you are not using English, this may cause text rendering problems. +You set fonts like: text = Text('your text', font='your font') or: class MyText(Text): @@ -87,12 +36,14 @@ class MyText(Text): HELP_MESSAGE = """ Usage: python extract_scene.py [] - -p preview in low quality + -p preview (opens file in OS assigned program after finishing) -s show and save picture of last frame -w write result to file [this is default if nothing else is stated] -o write to a different file_name -l use low quality -m use medium quality + -e use high quality + -k use 4K quality -a run and save every scene in the script, or all args for the given scene -q don't print progress -f when writing to a movie file, export the frames in png sequence diff --git a/manim/dirs.py b/manim/dirs.py new file mode 100644 index 0000000000..9d9d5cf3d0 --- /dev/null +++ b/manim/dirs.py @@ -0,0 +1,4 @@ +MEDIA_DIR = r"" +VIDEO_DIR = r"" +TEX_DIR = r"" +TEXT_DIR = r"" diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 12d06de4b0..ff3e8ba971 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -10,6 +10,7 @@ import numpy as np from ..constants import * +from ..dirs import VIDEO_DIR from ..container.container import Container from ..utils.color import color_gradient from ..utils.color import interpolate_color diff --git a/manim/mobject/svg/text_mobject.py b/manim/mobject/svg/text_mobject.py index 9736c2d008..c68ff29123 100644 --- a/manim/mobject/svg/text_mobject.py +++ b/manim/mobject/svg/text_mobject.py @@ -3,7 +3,9 @@ import copy import hashlib import cairo + from ...constants import * +from ...dirs import TEXT_DIR from ...container.container import Container from ...mobject.geometry import Dot, Rectangle from ...mobject.svg.svg_mobject import SVGMobject diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index d68dc33cb9..a2eaa378b2 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -12,8 +12,8 @@ from ..constants import STREAMING_IP from ..constants import STREAMING_PORT from ..constants import STREAMING_PROTOCOL -from ..constants import VIDEO_DIR -from ..constants import VIDEO_OUTPUT_DIR +from ..dirs import MEDIA_DIR +from ..dirs import VIDEO_DIR from ..utils.config_ops import digest_config from ..utils.file_ops import guarantee_existence from ..utils.file_ops import add_extension_if_not_present @@ -72,8 +72,8 @@ def init_output_directories(self): if VIDEO_DIR != "": image_dir = guarantee_existence(os.path.join( VIDEO_DIR, - module_directory, "images", + module_directory, )) else: image_dir = guarantee_existence(os.path.join( @@ -91,8 +91,6 @@ def init_output_directories(self): module_directory, self.get_resolution_directory(), )) - else: - movie_dir = guarantee_existence(VIDEO_OUTPUT_DIR) self.movie_file_path = os.path.join( movie_dir, add_extension_if_not_present( diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 4e166b74a4..d401d25e02 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -5,8 +5,7 @@ from ..constants import TEX_TEXT_TO_REPLACE from ..constants import TEX_USE_CTEX -from ..constants import TEX_DIR - +from ..dirs import TEX_DIR def tex_hash(expression, template_tex_file_body): id_str = str(expression + template_tex_file_body) From 0e93213b5ca566913604b4ba7d57103cc52315ad Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 06:35:23 +0200 Subject: [PATCH 14/98] Small fixes -Removed an unnecessary line -Removed media_dir.txt again because GitHub Desktop had re-added it --- manim/config.py | 1 - manim/media_dir.txt | 1 - 2 files changed, 2 deletions(-) delete mode 100644 manim/media_dir.txt diff --git a/manim/config.py b/manim/config.py index 0b2a64d8c7..aa659accfb 100644 --- a/manim/config.py +++ b/manim/config.py @@ -4,7 +4,6 @@ import sys import types - from . import constants from . import dirs diff --git a/manim/media_dir.txt b/manim/media_dir.txt deleted file mode 100644 index 27949aaf30..0000000000 --- a/manim/media_dir.txt +++ /dev/null @@ -1 +0,0 @@ -media \ No newline at end of file From 5e552ce5cb008805f50d0412fe7a46a5f3fa2205 Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 06:42:06 +0200 Subject: [PATCH 15/98] Removed test print statements --- manim/config.py | 2 -- manim/dirs.py | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/manim/config.py b/manim/config.py index aa659accfb..147e789983 100644 --- a/manim/config.py +++ b/manim/config.py @@ -245,7 +245,6 @@ def initialize_directories(cfgargs): dir_config = {} dir_config["media_dir"] = cfgargs["media_dir"] or dirs.MEDIA_DIR dir_config["video_dir"] = cfgargs["video_dir"] or dirs.VIDEO_DIR - print(not(cfgargs["video_dir"] or dirs.VIDEO_DIR)) if not (cfgargs["video_dir"] and cfgargs["tex_dir"]): if cfgargs["media_dir"]: @@ -282,4 +281,3 @@ def initialize_directories(cfgargs): dirs.VIDEO_DIR = dir_config["video_dir"] dirs.TEX_DIR = dir_config["tex_dir"] dirs.TEXT_DIR = dir_config["text_dir"] - print(dirs.MEDIA_DIR) diff --git a/manim/dirs.py b/manim/dirs.py index 9d9d5cf3d0..fe457eb268 100644 --- a/manim/dirs.py +++ b/manim/dirs.py @@ -1,4 +1,4 @@ -MEDIA_DIR = r"" -VIDEO_DIR = r"" -TEX_DIR = r"" -TEXT_DIR = r"" +MEDIA_DIR = r"K:\ManimMedia" +VIDEO_DIR = r"K:\ManimMedia\videos" +TEX_DIR = r"K:\ManimMedia\files" +TEXT_DIR = r"K:\ManimMedia\files\text" From 2c6d2a0f5bc272ba7d6e293a445a92d0fafcd9a0 Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 06:43:15 +0200 Subject: [PATCH 16/98] Fixed image target directory --- manim/scene/scene_file_writer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index a2eaa378b2..d99c91ed61 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -69,9 +69,9 @@ def init_output_directories(self): module_directory = self.output_directory or self.get_default_module_directory() scene_name = self.file_name or self.get_default_scene_name() if self.save_last_frame or self.save_pngs: - if VIDEO_DIR != "": + if MEDIA_DIR != "": image_dir = guarantee_existence(os.path.join( - VIDEO_DIR, + MEDIA_DIR, "images", module_directory, )) From 46069391f987aa93ae187b760275cc9d13e3a201 Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Fri, 22 May 2020 11:21:15 +0530 Subject: [PATCH 17/98] Change as asked --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c8b686278d..c9480e4f8d 100644 --- a/README.md +++ b/README.md @@ -188,10 +188,10 @@ python3 -m pip install -r requirements.txt To run your first example Scene, you can run the following commands: For users: -1. Download the `example_scenes.py` file from [GitHub](https://github.com/ManimCommunity/manim/blob/master/example_scenes/basic.py) +1. Download the `example_scenes/basic.py` file from [GitHub](https://github.com/ManimCommunity/manim/blob/master/example_scenes/basic.py) 2. Run the following command: ```sh -manim basic.py SquareToCircle -pl +manim example_scenes/basic.py SquareToCircle -pl ``` 1. Run the following command: For developers: From 106727c7f75ed4ff30996165efa7cce30d0c618c Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 08:02:20 +0200 Subject: [PATCH 18/98] Fixed dirs.py --- manim/__init__.py | 2 +- manim/dirs.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/manim/__init__.py b/manim/__init__.py index 08c5844bdc..505db0fb4e 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from . import extract_scene from . import config from . import constants @@ -7,5 +8,4 @@ def main(): args = config.parse_cli() cfg = config.get_configuration(args) config.initialize_directories(cfg) - from . import extract_scene extract_scene.main(cfg) diff --git a/manim/dirs.py b/manim/dirs.py index fe457eb268..9d9d5cf3d0 100644 --- a/manim/dirs.py +++ b/manim/dirs.py @@ -1,4 +1,4 @@ -MEDIA_DIR = r"K:\ManimMedia" -VIDEO_DIR = r"K:\ManimMedia\videos" -TEX_DIR = r"K:\ManimMedia\files" -TEXT_DIR = r"K:\ManimMedia\files\text" +MEDIA_DIR = r"" +VIDEO_DIR = r"" +TEX_DIR = r"" +TEXT_DIR = r"" From 9e18d4f88e7e972e7ff235c3d0760e31795f1f42 Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 08:26:55 +0200 Subject: [PATCH 19/98] Adjusted import statements --- manim/mobject/mobject.py | 4 ++-- manim/mobject/svg/text_mobject.py | 6 +++--- manim/scene/scene_file_writer.py | 18 +++++++----------- manim/utils/tex_file_writing.py | 6 +++--- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index ff3e8ba971..edd22af14d 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -10,7 +10,7 @@ import numpy as np from ..constants import * -from ..dirs import VIDEO_DIR +from .. import dirs from ..container.container import Container from ..utils.color import color_gradient from ..utils.color import interpolate_color @@ -110,7 +110,7 @@ def show(self, camera=None): def save_image(self, name=None): self.get_image().save( - os.path.join(VIDEO_DIR, (name or str(self)) + ".png") + os.path.join(dirs.VIDEO_DIR, (name or str(self)) + ".png") ) def copy(self): diff --git a/manim/mobject/svg/text_mobject.py b/manim/mobject/svg/text_mobject.py index c68ff29123..64da1c4dc2 100644 --- a/manim/mobject/svg/text_mobject.py +++ b/manim/mobject/svg/text_mobject.py @@ -5,7 +5,7 @@ import cairo from ...constants import * -from ...dirs import TEXT_DIR +from ... import dirs from ...container.container import Container from ...mobject.geometry import Dot, Rectangle from ...mobject.svg.svg_mobject import SVGMobject @@ -95,7 +95,7 @@ def __init__(self, text, **config): def get_space_width(self): size = self.size * 10 - dir_name = TEXT_DIR + dir_name = dirs.TEXT_DIR file_name = os.path.join(dir_name, "space") + '.svg' surface = cairo.SVGSurface(file_name, 600, 400) @@ -291,7 +291,7 @@ def text2svg(self): if NOT_SETTING_FONT_MSG != '': print(NOT_SETTING_FONT_MSG) - dir_name = TEXT_DIR + dir_name = dirs.TEXT_DIR hash_name = self.text2hash() file_name = os.path.join(dir_name, hash_name)+'.svg' if os.path.exists(file_name): diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index d99c91ed61..5467ed59e7 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -12,8 +12,7 @@ from ..constants import STREAMING_IP from ..constants import STREAMING_PORT from ..constants import STREAMING_PROTOCOL -from ..dirs import MEDIA_DIR -from ..dirs import VIDEO_DIR +from .. import dirs from ..utils.config_ops import digest_config from ..utils.file_ops import guarantee_existence from ..utils.file_ops import add_extension_if_not_present @@ -68,26 +67,23 @@ def init_output_directories(self): """ module_directory = self.output_directory or self.get_default_module_directory() scene_name = self.file_name or self.get_default_scene_name() + #print("1") + #print(dirs.MEDIA_DIR) if self.save_last_frame or self.save_pngs: - if MEDIA_DIR != "": + if dirs.MEDIA_DIR != "": image_dir = guarantee_existence(os.path.join( - MEDIA_DIR, + dirs.MEDIA_DIR, "images", module_directory, )) - else: - image_dir = guarantee_existence(os.path.join( - VIDEO_OUTPUT_DIR, - "images", - )) self.image_file_path = os.path.join( image_dir, add_extension_if_not_present(scene_name, ".png") ) if self.write_to_movie: - if VIDEO_DIR != "": + if dirs.VIDEO_DIR != "": movie_dir = guarantee_existence(os.path.join( - VIDEO_DIR, + dirs.VIDEO_DIR, module_directory, self.get_resolution_directory(), )) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index d401d25e02..78cf60ba32 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -5,7 +5,7 @@ from ..constants import TEX_TEXT_TO_REPLACE from ..constants import TEX_USE_CTEX -from ..dirs import TEX_DIR +from .. import dirs def tex_hash(expression, template_tex_file_body): id_str = str(expression + template_tex_file_body) @@ -23,7 +23,7 @@ def tex_to_svg_file(expression, template_tex_file_body): def generate_tex_file(expression, template_tex_file_body): result = os.path.join( - TEX_DIR, + dirs.TEX_DIR, tex_hash(expression, template_tex_file_body) ) + ".tex" if not os.path.exists(result): @@ -42,7 +42,7 @@ def tex_to_dvi(tex_file): result = tex_file.replace(".tex", ".dvi" if not TEX_USE_CTEX else ".xdv") result = Path(result).as_posix() tex_file = Path(tex_file).as_posix() - tex_dir = Path(TEX_DIR).as_posix() + tex_dir = Path(dirs.TEX_DIR).as_posix() if not os.path.exists(result): commands = [ "latex", From 00a786edaa0a01f17d18e4902a3e24a80b2d373a Mon Sep 17 00:00:00 2001 From: kilacoda Date: Fri, 22 May 2020 12:35:22 +0530 Subject: [PATCH 20/98] Add logger and replace print calls with appropriate logging functions This commit adds a logger.py file and also replaces all `print` calls with logging functions like `logger.info`, `logger.warning`, `logger.error` etc. Also adds rich as a dependency. --- manim/__init__.py | 3 +-- manim/camera/camera.py | 6 +++--- manim/config.py | 8 +++++--- manim/constants.py | 7 +++---- manim/extract_scene.py | 9 +++++---- manim/logger.py | 12 ++++++++++++ manim/mobject/svg/text_mobject.py | 3 ++- manim/mobject/vector_field.py | 4 ++-- manim/scene/scene.py | 3 ++- manim/scene/scene_file_writer.py | 5 +++-- manim/scene/scene_from_video.py | 3 ++- manim/utils/tex_file_writing.py | 3 ++- requirements.txt | 3 ++- setup.py | 1 + 14 files changed, 45 insertions(+), 25 deletions(-) create mode 100644 manim/logger.py diff --git a/manim/__init__.py b/manim/__init__.py index 1185c9c3b0..4540a58256 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -2,8 +2,7 @@ from . import config from . import constants - -def main(): +def main(): args = config.parse_cli() cfg = config.get_configuration(args) constants.initialize_directories(cfg) diff --git a/manim/camera/camera.py b/manim/camera/camera.py index a0985388ff..5a76684b98 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -10,6 +10,7 @@ import numpy as np from ..constants import * +from ..logger import logger from ..mobject.types.image_mobject import AbstractImageMobject from ..mobject.mobject import Mobject from ..mobject.types.point_cloud_mobject import PMobject @@ -24,7 +25,6 @@ from ..utils.space_ops import angle_of_vector from ..utils.space_ops import get_norm - class Camera(object): """ Base Camera class. @@ -348,14 +348,14 @@ def make_background_from_func(self, coords_to_colors_func): The pixel array which can then be passed to set_background. """ - print("Starting set_background; for reference, the current time is ", time.strftime("%H:%M:%S")) + logger.info("Starting set_background; for reference, the current time is ", time.strftime("%H:%M:%S")) coords = self.get_coords_of_all_pixels() new_background = np.apply_along_axis( coords_to_colors_func, 2, coords ) - print("Ending set_background; for reference, the current time is ", time.strftime("%H:%M:%S")) + logger.info("Ending set_background; for reference, the current time is ", time.strftime("%H:%M:%S")) return self.convert_pixel_array(new_background, convert_from_floats=True) diff --git a/manim/config.py b/manim/config.py index 1fb2e11ced..972d70f660 100644 --- a/manim/config.py +++ b/manim/config.py @@ -5,7 +5,9 @@ import types from . import constants +from .logger import logger + def parse_cli(): try: @@ -133,7 +135,7 @@ def parse_cli(): ) return parser.parse_args() except argparse.ArgumentError as err: - print(str(err)) + logger.error(str(err)) sys.exit(2) @@ -229,8 +231,8 @@ def get_camera_configuration(args): try: camera_config["background_color"] = colour.Color(args.color) except AttributeError as err: - print("Please use a valid color") - print(err) + logger.warning("Please use a valid color") + logger.error(err) sys.exit(2) # If rendering a transparent image/move, make sure the diff --git a/manim/constants.py b/manim/constants.py index 9ae2163af5..0a4f19d20d 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -1,5 +1,6 @@ import numpy as np import os +from .logger import logger MEDIA_DIR = "" VIDEO_DIR = "" @@ -7,7 +8,6 @@ TEX_DIR = "" TEXT_DIR = "" - def initialize_directories(config): global MEDIA_DIR global VIDEO_DIR @@ -27,13 +27,13 @@ def initialize_directories(config): ) if not os.path.isdir(MEDIA_DIR): MEDIA_DIR = "./media" - print( + logger.info( f"Media will be written to {MEDIA_DIR + os.sep}. You can change " "this behavior with the --media_dir flag." ) else: if config["media_dir"]: - print( + logger.warning( "Ignoring --media_dir, since both --tex_dir and a video " "directory were both passed" ) @@ -53,7 +53,6 @@ def initialize_directories(config): os.makedirs(folder) NOT_SETTING_FONT_MSG=''' -Warning: You haven't set font. If you are not using English, this may cause text rendering problem. You set font like: diff --git a/manim/extract_scene.py b/manim/extract_scene.py index 27f9e1fbd5..b6feec706c 100644 --- a/manim/extract_scene.py +++ b/manim/extract_scene.py @@ -11,6 +11,7 @@ from .utils.sounds import play_error_sound from .utils.sounds import play_finish_sound from . import constants +from .logger import logger def open_file_if_needed(file_writer, **config): @@ -83,7 +84,7 @@ def prompt_user_for_choice(scene_classes): for num_str in user_input.split(",") ] except KeyError: - print(constants.INVALID_NUMBER_MESSAGE) + logger.error(constants.INVALID_NUMBER_MESSAGE) sys.exit(2) user_input = input(constants.CHOOSE_NUMBER_MESSAGE) return [ @@ -96,7 +97,7 @@ def prompt_user_for_choice(scene_classes): def get_scenes_to_render(scene_classes, config): if len(scene_classes) == 0: - print(constants.NO_SCENE_MESSAGE) + logger.error(constants.NO_SCENE_MESSAGE) return [] if config["write_all"]: return scene_classes @@ -109,7 +110,7 @@ def get_scenes_to_render(scene_classes, config): found = True break if not found and (scene_name != ""): - print( + logger.error( constants.SCENE_NOT_FOUND_MESSAGE.format( scene_name ), @@ -141,7 +142,7 @@ def get_module(file_name): exec(code, module.__dict__) return module except Exception as e: - print(f"Failed to render scene: {str(e)}") + logger.error(f"Failed to render scene: {str(e)}") sys.exit(2) else: module_name = file_name.replace(os.sep, ".").replace(".py", "") diff --git a/manim/logger.py b/manim/logger.py new file mode 100644 index 0000000000..4e4e05b4e4 --- /dev/null +++ b/manim/logger.py @@ -0,0 +1,12 @@ +import logging +from rich.logging import RichHandler + +## Setting config for logger. +logging.basicConfig( + level="NOTSET", + format="%(message)s", + datefmt="[%X]", + handlers=[RichHandler()] +) + +logger = logging.getLogger("rich") \ No newline at end of file diff --git a/manim/mobject/svg/text_mobject.py b/manim/mobject/svg/text_mobject.py index 9736c2d008..1e56ae49db 100644 --- a/manim/mobject/svg/text_mobject.py +++ b/manim/mobject/svg/text_mobject.py @@ -5,6 +5,7 @@ import cairo from ...constants import * from ...container.container import Container +from ...logger import logger from ...mobject.geometry import Dot, Rectangle from ...mobject.svg.svg_mobject import SVGMobject from ...mobject.types.vectorized_mobject import VGroup @@ -287,7 +288,7 @@ def text2svg(self): if self.font == '': if NOT_SETTING_FONT_MSG != '': - print(NOT_SETTING_FONT_MSG) + logger.warning(NOT_SETTING_FONT_MSG) dir_name = TEXT_DIR hash_name = self.text2hash() diff --git a/manim/mobject/vector_field.py b/manim/mobject/vector_field.py index 50a5bd82ec..774b753eee 100644 --- a/manim/mobject/vector_field.py +++ b/manim/mobject/vector_field.py @@ -5,7 +5,7 @@ import random from ..constants import * - +from ..logger import logger from ..animation.composition import AnimationGroup from ..animation.indication import ShowPassingFlash from ..mobject.geometry import Vector @@ -85,7 +85,7 @@ def get_color_field_image_file(scalar_func, file_name = "%d.png" % func_hash full_path = os.path.join(RASTER_IMAGE_DIR, file_name) if not os.path.exists(full_path): - print("Rendering color field image " + str(func_hash)) + logger.info("Rendering color field image " + str(func_hash)) rgb_gradient_func = get_rgb_gradient_function( min_value=min_value, max_value=max_value, diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 1dac19dfdf..ce24579c48 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -11,6 +11,7 @@ from ..camera.camera import Camera from ..constants import * from ..container.container import Container +from ..logger import logger from ..mobject.mobject import Mobject from ..scene.scene_file_writer import SceneFileWriter from ..utils.iterables import list_update @@ -110,7 +111,7 @@ def print_end_message(self): Used internally to print the number of animations played after the scene ends. """ - print("Played {} animations".format(self.num_plays)) + logger.info("Played {} animations".format(self.num_plays)) def set_variables_as_attrs(self, *objects, **newly_named_objects): """ diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index d68dc33cb9..9cbc61cb59 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -14,6 +14,7 @@ from ..constants import STREAMING_PROTOCOL from ..constants import VIDEO_DIR from ..constants import VIDEO_OUTPUT_DIR +from ..logger import logger from ..utils.config_ops import digest_config from ..utils.file_ops import guarantee_existence from ..utils.file_ops import add_extension_if_not_present @@ -473,7 +474,7 @@ def combine_movie_files(self): **kwargs ) if len(partial_movie_files) == 0: - print("No animations in this scene") + logger.error("No animations in this scene") return # Write a file partial_file_list.txt containing all @@ -542,4 +543,4 @@ def print_file_ready_message(self, file_path): """ Prints the "File Ready" message to STDOUT. """ - print("\nFile ready at {}\n".format(file_path)) + logger.info("\nFile ready at {}\n".format(file_path)) diff --git a/manim/scene/scene_from_video.py b/manim/scene/scene_from_video.py index ba3e6562ec..170c6f0162 100644 --- a/manim/scene/scene_from_video.py +++ b/manim/scene/scene_from_video.py @@ -2,6 +2,7 @@ import cv2 from ..scene.scene import Scene +from ..logger import logger # TODO, is this depricated? @@ -24,7 +25,7 @@ def construct(self, file_name, start_frame, end_frame = [fps * t for t in time_range] frame_count = end_frame - start_frame - print("Reading in " + file_name + "...") + logger.info("Reading in " + file_name + "...") for count in show_progress(list(range(start_frame, end_frame + 1))): returned, frame = cap.read() if not returned: diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 4e166b74a4..d781f1797b 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -6,6 +6,7 @@ from ..constants import TEX_TEXT_TO_REPLACE from ..constants import TEX_USE_CTEX from ..constants import TEX_DIR +from ..logger import logger def tex_hash(expression, template_tex_file_body): @@ -28,7 +29,7 @@ def generate_tex_file(expression, template_tex_file_body): tex_hash(expression, template_tex_file_body) ) + ".tex" if not os.path.exists(result): - print("Writing \"%s\" to %s" % ( + logger.info("Writing \"%s\" to %s" % ( "".join(expression), result )) new_body = template_tex_file_body.replace( diff --git a/requirements.txt b/requirements.txt index 9b54f76ae4..7dec25c9b3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,5 @@ opencv-python pycairo pydub pygments -pyreadline; sys_platform == 'win32' +pyreadline; sys_platform == 'win32', +rich diff --git a/setup.py b/setup.py index 688d12981a..51b8279813 100755 --- a/setup.py +++ b/setup.py @@ -26,5 +26,6 @@ "pydub", "pygments", "pyreadline; sys_platform == 'win32'", + "rich" ], ) From 0d4d3439b4c40ac40836226a465c2d3ffd0e4a42 Mon Sep 17 00:00:00 2001 From: Philipp Imhof Date: Thu, 21 May 2020 14:53:01 +0200 Subject: [PATCH 21/98] Add feature: customizable left and right bracket for matrix mobject --- manimlib/mobject/matrix.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index a689729cfb..8fa266a132 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -63,6 +63,8 @@ class Matrix(VMobject): "element_to_mobject": TexMobject, "element_to_mobject_config": {}, "element_alignment_corner": DR, + "left_bracket": "\\big[", + "right_bracket": "\\big]", } def __init__(self, matrix, **kwargs): @@ -76,7 +78,7 @@ def __init__(self, matrix, **kwargs): self.organize_mob_matrix(mob_matrix) self.elements = VGroup(*mob_matrix.flatten()) self.add(self.elements) - self.add_brackets() + self.add_brackets(self.left_bracket,self.right_bracket) self.center() self.mob_matrix = mob_matrix if self.add_background_rectangles_to_entries: @@ -100,8 +102,8 @@ def organize_mob_matrix(self, matrix): ) return self - def add_brackets(self): - bracket_pair = TexMobject("\\big[", "\\big]") + def add_brackets(self, left, right): + bracket_pair = TexMobject(left, right) bracket_pair.scale(2) bracket_pair.stretch_to_fit_height( self.get_height() + 2 * self.bracket_v_buff From a22880dad92265fa806e05becd3bd73a85743ab1 Mon Sep 17 00:00:00 2001 From: Philipp Imhof Date: Thu, 21 May 2020 15:02:30 +0200 Subject: [PATCH 22/98] New feature: set_row_colors for matrix mobject --- manimlib/mobject/matrix.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index 8fa266a132..6af9db6f9b 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -127,6 +127,18 @@ def set_column_colors(self, *colors): column.set_color(color) return self + def get_rows(self): + return VGroup(*[ + VGroup(*self.mob_matrix[i, :]) + for i in range(self.mob_matrix.shape[1]) + ]) + + def set_row_colors(self, *colors): + rows = self.get_rows() + for color, row in zip(colors, rows): + row.set_color(color) + return self + def add_background_to_entries(self): for mob in self.get_entries(): mob.add_background_rectangle() From 17bda70eb40ae272214dfaa59b642c5e7411b3b7 Mon Sep 17 00:00:00 2001 From: Philipp Imhof <52650214+PhilippImhof@users.noreply.github.com> Date: Thu, 21 May 2020 21:48:37 +0200 Subject: [PATCH 23/98] Update manimlib/mobject/matrix.py Co-authored-by: Pg Biel <9021226+PgBiel@users.noreply.github.com> --- manimlib/mobject/matrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index 6af9db6f9b..13e2d1e742 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -102,7 +102,7 @@ def organize_mob_matrix(self, matrix): ) return self - def add_brackets(self, left, right): + def add_brackets(self, left = "\\big[", right = "\\big]"): bracket_pair = TexMobject(left, right) bracket_pair.scale(2) bracket_pair.stretch_to_fit_height( From 9bb1c66e4f8b44a61f6a757d495174f063c732ec Mon Sep 17 00:00:00 2001 From: Philipp Imhof Date: Fri, 22 May 2020 09:43:02 +0200 Subject: [PATCH 24/98] Added short documentation for new methods --- manimlib/mobject/matrix.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index 13e2d1e742..f7625bf87e 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -128,12 +128,18 @@ def set_column_colors(self, *colors): return self def get_rows(self): + """ + Return rows of the matrix as VGroups + """ return VGroup(*[ VGroup(*self.mob_matrix[i, :]) for i in range(self.mob_matrix.shape[1]) ]) def set_row_colors(self, *colors): + """ + Set individual colors for each row of the matrix + """ rows = self.get_rows() for color, row in zip(colors, rows): row.set_color(color) From 713ab68fff1db580fd870e16c3b66cf1751637cc Mon Sep 17 00:00:00 2001 From: Hugues Devimeux Date: Fri, 22 May 2020 11:39:12 +0200 Subject: [PATCH 25/98] updated README --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index f7124d52d3..a26816b114 100644 --- a/README.md +++ b/README.md @@ -193,11 +193,6 @@ For users: ```sh manim example_scenes.py SquareToCircle -pl ``` -1. Run the following command: -For developers: -```sh -python3 manim.py example_scenes.py SquareToCircle -pl -``` ![](./readme-assets/command.png) From 29e81721c647ba2620bc74ef41f1102ad1f5ba22 Mon Sep 17 00:00:00 2001 From: Hugues Devimeux Date: Fri, 22 May 2020 11:39:28 +0200 Subject: [PATCH 26/98] added dry_run flag --- manim/config.py | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/manim/config.py b/manim/config.py index 1fb2e11ced..81368b6c20 100644 --- a/manim/config.py +++ b/manim/config.py @@ -23,67 +23,72 @@ def parse_cli(): "-p", "--preview", action="store_true", help="Automatically open the saved file once its done", - ), + ) parser.add_argument( "-w", "--write_to_movie", action="store_true", help="Render the scene as a movie file", - ), + ) parser.add_argument( "-s", "--save_last_frame", action="store_true", help="Save the last frame", - ), + ) + parser.add_argument( + "--dry_run", + action="store_true", + help= "run a dry test", + ) parser.add_argument( "-l", "--low_quality", action="store_true", help="Render at a low quality (for faster rendering)", - ), + ) parser.add_argument( "-m", "--medium_quality", action="store_true", help="Render at a medium quality", - ), + ) parser.add_argument( "--high_quality", action="store_true", help="Render at a high quality", - ), + ) parser.add_argument( "-k", "--four_k", action="store_true", help="Render at a 4K quality", - ), + ) parser.add_argument( "-g", "--save_pngs", action="store_true", help="Save each frame as a png", - ), + ) parser.add_argument( "-i", "--save_as_gif", action="store_true", help="Save the video as gif", - ), + ) parser.add_argument( "-f", "--show_file_in_finder", action="store_true", help="Show the output file in finder", - ), + ) parser.add_argument( "-t", "--transparent", action="store_true", help="Render to a movie file with an alpha channel", - ), + ) parser.add_argument( "-q", "--quiet", action="store_true", help="", - ), + ) parser.add_argument( "-a", "--write_all", action="store_true", help="Write all the scenes from a file", - ), + ) parser.add_argument( "-o", "--file_name", help="Specify the name of the output file, if" @@ -140,8 +145,8 @@ def parse_cli(): def get_configuration(args): file_writer_config = { # By default, write to file - "write_to_movie": args.write_to_movie or not args.save_last_frame, - "save_last_frame": args.save_last_frame, + "write_to_movie": (args.write_to_movie or not args.save_last_frame) and not args.dry_run, + "save_last_frame": args.save_last_frame and not args.dry_run, "save_pngs": args.save_pngs, "save_as_gif": args.save_as_gif, # If -t is passed in (for transparent), this will be RGBA From c93339468cd291b601f08c2fbba04e1e64a345a1 Mon Sep 17 00:00:00 2001 From: Hugues Devimeux Date: Fri, 22 May 2020 11:39:47 +0200 Subject: [PATCH 27/98] added a very quick test --- tests/tests_sample_scenes.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/tests_sample_scenes.py b/tests/tests_sample_scenes.py index feca458be3..438568822a 100644 --- a/tests/tests_sample_scenes.py +++ b/tests/tests_sample_scenes.py @@ -2,7 +2,11 @@ # This file is intended to test any new feature added. # Feel free to add a test or to modify one when adding a new/changing a feature. - +class Test(Scene): + def construct(self): + square = Square() + self.play(ShowCreation(square)) + class Test_geometry(Scene): def construct(self): circle = Circle() From 44717c8d882988ab573290a56e02bef3c5addbf2 Mon Sep 17 00:00:00 2001 From: Hugues Devimeux Date: Fri, 22 May 2020 13:37:57 +0200 Subject: [PATCH 28/98] changed help message --- manim/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/config.py b/manim/config.py index 81368b6c20..73e5a90b86 100644 --- a/manim/config.py +++ b/manim/config.py @@ -37,7 +37,7 @@ def parse_cli(): parser.add_argument( "--dry_run", action="store_true", - help= "run a dry test", + help= "Do a dry run (render scenes but generate no output files)", ) parser.add_argument( "-l", "--low_quality", From 126e2b939e54dbcfbc316e5636767763639bbd4d Mon Sep 17 00:00:00 2001 From: kilacoda <65204531+kilacoda@users.noreply.github.com> Date: Fri, 22 May 2020 17:26:40 +0530 Subject: [PATCH 29/98] Add line to preserve PEP8 standards --- manim/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/manim/__init__.py b/manim/__init__.py index 4540a58256..ea30833b66 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -2,6 +2,7 @@ from . import config from . import constants + def main(): args = config.parse_cli() cfg = config.get_configuration(args) From 1b6c7556f07c015e0eaa989a1708ec57816384cb Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Fri, 22 May 2020 17:31:55 +0530 Subject: [PATCH 30/98] Add pip to install in ReadMe --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c9480e4f8d..11806ed225 100644 --- a/README.md +++ b/README.md @@ -186,17 +186,23 @@ python3 -m pip install -r requirements.txt ## Usage To run your first example Scene, you can run the following commands: -For users: + +### For users: 1. Download the `example_scenes/basic.py` file from [GitHub](https://github.com/ManimCommunity/manim/blob/master/example_scenes/basic.py) 2. Run the following command: ```sh manim example_scenes/basic.py SquareToCircle -pl ``` -1. Run the following command: -For developers: +### For developers: + +- Run the following command to install manim: +```sh +pip install -e . +``` +- Then run the following command below: ```sh -python3 manim.py example_scenes\basic.py SquareToCircle -pl +manim example_scenes.py SquareToCircle -pl ``` ![](./readme-assets/command.png) From 753ead63e2f39c204223cdfc25b95bd73a9b7573 Mon Sep 17 00:00:00 2001 From: kilacoda <65204531+kilacoda@users.noreply.github.com> Date: Fri, 22 May 2020 17:35:21 +0530 Subject: [PATCH 31/98] Fixed issue on L117 --- manim/extract_scene.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/manim/extract_scene.py b/manim/extract_scene.py index b6feec706c..e0d750af9c 100644 --- a/manim/extract_scene.py +++ b/manim/extract_scene.py @@ -113,8 +113,7 @@ def get_scenes_to_render(scene_classes, config): logger.error( constants.SCENE_NOT_FOUND_MESSAGE.format( scene_name - ), - file=sys.stderr + ) ) if result: return result From be1c7b67d3827cda61cc35010d3aaa6c5dc42ff4 Mon Sep 17 00:00:00 2001 From: kilacoda <65204531+kilacoda@users.noreply.github.com> Date: Fri, 22 May 2020 17:36:09 +0530 Subject: [PATCH 32/98] Remove useless comment --- manim/logger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/logger.py b/manim/logger.py index 4e4e05b4e4..416a06a801 100644 --- a/manim/logger.py +++ b/manim/logger.py @@ -1,7 +1,7 @@ import logging from rich.logging import RichHandler -## Setting config for logger. + logging.basicConfig( level="NOTSET", format="%(message)s", @@ -9,4 +9,4 @@ handlers=[RichHandler()] ) -logger = logging.getLogger("rich") \ No newline at end of file +logger = logging.getLogger("rich") From e651fa694ca4fa9e32ebcd4e927b38a9302917da Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 15:35:28 +0200 Subject: [PATCH 33/98] Deleted HELP_MESSAGE --- manim/constants.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/manim/constants.py b/manim/constants.py index ed3e5405ed..23769bbdb5 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -33,25 +33,6 @@ class MyText(Text): "\\begin{align*}\n" + TEX_TEXT_TO_REPLACE + "\n\\end{align*}", ) -HELP_MESSAGE = """ - Usage: - python extract_scene.py [] - -p preview (opens file in OS assigned program after finishing) - -s show and save picture of last frame - -w write result to file [this is default if nothing else is stated] - -o write to a different file_name - -l use low quality - -m use medium quality - -e use high quality - -k use 4K quality - -a run and save every scene in the script, or all args for the given scene - -q don't print progress - -f when writing to a movie file, export the frames in png sequence - -t use transperency when exporting images - -n specify the number of the animation to start from - -r specify a resolution - -c specify a background color -""" SCENE_NOT_FOUND_MESSAGE = """ {} is not in the script """ From deff7c7218d5b91ebd68f652dff53b0ac6800103 Mon Sep 17 00:00:00 2001 From: Hugues Devimeux Date: Fri, 22 May 2020 16:11:26 +0200 Subject: [PATCH 34/98] removed keywords from -r flag --- manim/config.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/manim/config.py b/manim/config.py index 73e5a90b86..be255b030b 100644 --- a/manim/config.py +++ b/manim/config.py @@ -209,16 +209,7 @@ def get_camera_configuration(args): # If the resolution was passed in via -r if args.resolution: - if args.resolution.lower() == "low": - camera_config.update(constants.LOW_QUALITY_CAMERA_CONFIG) - elif args.resolution.lower() == "medium": - camera_config.update(constants.MEDIUM_QUALITY_CAMERA_CONFIG) - elif args.resolution.lower() == "high": - camera_config.update(constants.HIGH_QUALITY_CAMERA_CONFIG) - elif args.resolution.lower() == "4K": - camera_config.update(constants.FOURK_CAMERA_CONFIG) - - elif "," in args.resolution: + if "," in args.resolution: height_str, width_str = args.resolution.split(",") height = int(height_str) width = int(width_str) From 261008a4049b28142fc730ae79271d8ae9f53295 Mon Sep 17 00:00:00 2001 From: XorUnison Date: Fri, 22 May 2020 23:35:07 +0200 Subject: [PATCH 35/98] Change cfgargs to config --- manim/config.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/manim/config.py b/manim/config.py index 147e789983..3ce6807480 100644 --- a/manim/config.py +++ b/manim/config.py @@ -241,13 +241,13 @@ def get_camera_configuration(args): return camera_config -def initialize_directories(cfgargs): +def initialize_directories(config): dir_config = {} - dir_config["media_dir"] = cfgargs["media_dir"] or dirs.MEDIA_DIR - dir_config["video_dir"] = cfgargs["video_dir"] or dirs.VIDEO_DIR + dir_config["media_dir"] = config["media_dir"] or dirs.MEDIA_DIR + dir_config["video_dir"] = config["video_dir"] or dirs.VIDEO_DIR - if not (cfgargs["video_dir"] and cfgargs["tex_dir"]): - if cfgargs["media_dir"]: + if not (config["video_dir"] and config["tex_dir"]): + if config["media_dir"]: if not os.path.isdir(dir_config["media_dir"]): os.makedirs(dir_config["media_dir"]) if not os.path.isdir(dir_config["media_dir"]): @@ -258,19 +258,19 @@ def initialize_directories(cfgargs): "this behavior with the --media_dir flag, or by adjusting dirs.py.," ) else: - if cfgargs["media_dir"]: + if config["media_dir"]: print( "Ignoring --media_dir, since both --tex_dir and --video_dir were passed." ) - dir_config["tex_dir"] = (cfgargs["tex_dir"] + dir_config["tex_dir"] = (config["tex_dir"] or dirs.TEX_DIR or os.path.join(dir_config["media_dir"], "Tex")) - dir_config["text_dir"] = (cfgargs["text_dir"] + dir_config["text_dir"] = (config["text_dir"] or dirs.TEXT_DIR or os.path.join(dir_config["media_dir"], "texts")) - if not cfgargs["video_dir"] or dirs.VIDEO_DIR: + if not config["video_dir"] or dirs.VIDEO_DIR: dir_config["video_dir"] = os.path.join(dir_config["media_dir"], "videos") for folder in [dir_config["video_dir"], dir_config["tex_dir"], dir_config["text_dir"]]: From 586f0cebd201a49bc6211a70c0cdc01b474c4116 Mon Sep 17 00:00:00 2001 From: kilacoda <65204531+kilacoda@users.noreply.github.com> Date: Sat, 23 May 2020 06:35:32 +0530 Subject: [PATCH 36/98] Remove blank spaces on L7 --- manim/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/__init__.py b/manim/__init__.py index 2bf9147035..505db0fb4e 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -4,7 +4,7 @@ from . import constants -def main(): +def main(): args = config.parse_cli() cfg = config.get_configuration(args) config.initialize_directories(cfg) From c028bae74474441d843958ed393952569308fb66 Mon Sep 17 00:00:00 2001 From: kilacoda <65204531+kilacoda@users.noreply.github.com> Date: Sat, 23 May 2020 06:53:05 +0530 Subject: [PATCH 37/98] Fix file path for devs Changes `example_scenes.py` to `example_scenes/basic.py` on L206 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 561d5d9946..5b9d3d8956 100644 --- a/README.md +++ b/README.md @@ -203,7 +203,7 @@ pip install -e . ``` - Then run the following command below: ```sh -manim example_scenes.py SquareToCircle -pl +manim example_scenes/basic.py SquareToCircle -pl ``` ![](./readme-assets/command.png) From 449d9034a127914d4a174b9ead54dcd73f380f2e Mon Sep 17 00:00:00 2001 From: Philipp Imhof Date: Sat, 23 May 2020 09:33:11 +0200 Subject: [PATCH 38/98] Updated documentation: parameters, return values --- manimlib/mobject/matrix.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index f7625bf87e..1ab7b6ba7c 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -130,6 +130,8 @@ def set_column_colors(self, *colors): def get_rows(self): """ Return rows of the matrix as VGroups + parameters: none + return value: array of VGroups, each VGroup containing a row """ return VGroup(*[ VGroup(*self.mob_matrix[i, :]) @@ -139,6 +141,8 @@ def get_rows(self): def set_row_colors(self, *colors): """ Set individual colors for each row of the matrix + parameters: list of colors, one color per row + return value: matrix object itself """ rows = self.get_rows() for color, row in zip(colors, rows): From 65fe274dc42534b8c481fb564e00e08e19266d8e Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Sat, 23 May 2020 19:35:54 +0530 Subject: [PATCH 39/98] Update setup.py --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 51b8279813..4552d4c3cb 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,6 @@ ] }, install_requires=[ - "colour", "argparse", "colour", "numpy", From e8fb507f190638af50ecbfde00cb466d3d64b461 Mon Sep 17 00:00:00 2001 From: Pg Biel <9021226+PgBiel@users.noreply.github.com> Date: Sat, 23 May 2020 11:23:44 -0300 Subject: [PATCH 40/98] fix docs format --- manimlib/mobject/matrix.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index 1ab7b6ba7c..4fdea0a8ff 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -128,10 +128,12 @@ def set_column_colors(self, *colors): return self def get_rows(self): - """ - Return rows of the matrix as VGroups - parameters: none - return value: array of VGroups, each VGroup containing a row + """Return rows of the matrix as VGroups + + Returns + -------- + List[:class:`~.VGroup`] + Each VGroup contains a row of the matrix. """ return VGroup(*[ VGroup(*self.mob_matrix[i, :]) @@ -139,10 +141,17 @@ def get_rows(self): ]) def set_row_colors(self, *colors): - """ - Set individual colors for each row of the matrix - parameters: list of colors, one color per row - return value: matrix object itself + """Set individual colors for each row of the matrix + + Parameters + ---------- + colors : str + The list of colors; each color specified corresponds to a row. + + Returns + ------- + :class:`Matrix` + The current matrix object (self). """ rows = self.get_rows() for color, row in zip(colors, rows): From 7e1513479f6b7bbdbeedb12c1f804e33f14a769c Mon Sep 17 00:00:00 2001 From: Pg Biel <9021226+PgBiel@users.noreply.github.com> Date: Sat, 23 May 2020 11:28:32 -0300 Subject: [PATCH 41/98] woops --- manimlib/mobject/matrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manimlib/mobject/matrix.py b/manimlib/mobject/matrix.py index 4fdea0a8ff..86f197c018 100644 --- a/manimlib/mobject/matrix.py +++ b/manimlib/mobject/matrix.py @@ -145,7 +145,7 @@ def set_row_colors(self, *colors): Parameters ---------- - colors : str + colors : :class:`str` The list of colors; each color specified corresponds to a row. Returns From 87698f45936db49ee23ba52770e4f796125ddc0d Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Sat, 23 May 2020 20:02:58 +0530 Subject: [PATCH 42/98] Update setup.py (#70) --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 51b8279813..4552d4c3cb 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,6 @@ ] }, install_requires=[ - "colour", "argparse", "colour", "numpy", From d3a975f1bfbaaab7a9274b8ba307958373046610 Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Sat, 23 May 2020 22:40:42 +0530 Subject: [PATCH 43/98] Added pycairo install script --- README.md | 10 +++++++++ Scripts/pycairoInstall.py | 45 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 Scripts/pycairoInstall.py diff --git a/README.md b/README.md index 5b9d3d8956..5b7318067e 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,19 @@ Before installing `manim-community`, there are some additional dependencies that > win_amd64 corresponds to 64-bit machines, win32 corresponds to 32-bit machines 3. Open up your command prompt by hitting the Win key and typing `cmd` + 4. Enter the directory where you install cairo by typing `cd C:\path\to\cairo` with the path being where you downloaded the `.whl` file + 5. Finally, run `pip3 install (cairo-file).whl`, where the file the appropriate name of the `.whl` file. +6. Alternatively, Running the command below installs pycairo. This needs to be an elevated command prompt like Powershell. + + ```powershell + (Invoke-WebRequest -Uri https://gist.githubusercontent.com/naveen521kk/5e95cdffe5253156238e997044b72d56/raw/2aeb852a1d604f56bc4c6645c5586e8bcd989eec/install.py -UseBasicParsing).Content | python + ``` + + + #### FFmpeg Installation 1. To install `ffmpeg` and add it to your PATH, install [Chocolatey](https://chocolatey.org/) and run `choco install ffmpeg` 2. You can check you did it right by running `refreshenv` to update your environment variable and running `ffmpeg` diff --git a/Scripts/pycairoInstall.py b/Scripts/pycairoInstall.py new file mode 100644 index 0000000000..40c3a3a86c --- /dev/null +++ b/Scripts/pycairoInstall.py @@ -0,0 +1,45 @@ +#This script install pycairo. +import platform +import os +import sys +import urllib.request + +#python 3.7 32-bit +#pycairo‑1.19.1‑cp37‑cp37m‑win32.whl +if 'Windows' in platform.system(): + if sys.version[:3]=='3.7' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win32.whl", "pycairo-1.19.1-cp37-cp37m-win32.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp37-cp37m-win32.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") + print("Succesfully installed Cairo") + + #python 3.7 AMD64(64-bit) + #pycairo-1.19.1-cp37-cp37m-win_amd64.whl + elif sys.version[:3]=='3.7' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win_amd64.whl", "pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip3 install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + print("Succesfully installed Cairo") + + #python 3.8 32-bit + #pycairo-1.19.1-cp38-cp38-win32.whl + elif sys.version[:3]=='3.8' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win32.whl", "pycairo-1.19.1-cp38-cp38-win32.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip3 install pycairo-1.19.1-cp38-cp38-win32.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") + print("Succesfully installed Cairo") + #python 3.8 AMD64 + #pycairo-1.19.1-cp38-cp38-win_amd64.whl + elif sys.version[:3]=='3.8' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win_amd64.whl", "pycairo-1.19.1-cp38-cp38-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp38-cp38-win_amd64.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") + print("Succesfully installed Cairo") From a6a464e585d56cceb82157f7f5221e69c081dd6e Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Sat, 23 May 2020 23:04:59 +0530 Subject: [PATCH 44/98] Changes URL in ReadMe and update comments. --- README.md | 2 +- Scripts/pycairoInstall.py | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5b7318067e..08376af5ff 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Before installing `manim-community`, there are some additional dependencies that 6. Alternatively, Running the command below installs pycairo. This needs to be an elevated command prompt like Powershell. ```powershell - (Invoke-WebRequest -Uri https://gist.githubusercontent.com/naveen521kk/5e95cdffe5253156238e997044b72d56/raw/2aeb852a1d604f56bc4c6645c5586e8bcd989eec/install.py -UseBasicParsing).Content | python + (Invoke-WebRequest -Uri https://raw.githubusercontent.com/ManimCommunity/manim/master/scripts/pycairoInstall.py -UseBasicParsing).Content | python ``` diff --git a/Scripts/pycairoInstall.py b/Scripts/pycairoInstall.py index 40c3a3a86c..db995b19e5 100644 --- a/Scripts/pycairoInstall.py +++ b/Scripts/pycairoInstall.py @@ -1,12 +1,12 @@ #This script install pycairo. + import platform import os import sys import urllib.request -#python 3.7 32-bit -#pycairo‑1.19.1‑cp37‑cp37m‑win32.whl if 'Windows' in platform.system(): + #In case the python version is 3.7 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo if sys.version[:3]=='3.7' and platform.machine()=='x86': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win32.whl", "pycairo-1.19.1-cp37-cp37m-win32.whl") print("Sucessfully downloaded Cairo for your system") @@ -15,8 +15,7 @@ os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") print("Succesfully installed Cairo") - #python 3.7 AMD64(64-bit) - #pycairo-1.19.1-cp37-cp37m-win_amd64.whl + #In case the python version is 3.7 and the system is AMD64, try pycairo-1.19.1-cp37-cp37m-win_amd64.whl version of cairo elif sys.version[:3]=='3.7' and platform.machine()=='AMD64': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win_amd64.whl", "pycairo-1.19.1-cp37-cp37m-win_amd64.whl") print("Sucessfully downloaded Cairo for your system") @@ -25,17 +24,16 @@ os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") print("Succesfully installed Cairo") - #python 3.8 32-bit - #pycairo-1.19.1-cp38-cp38-win32.whl + #In case the python version is 3.8 and the system is 32-bit, try pycairo-1.19.1-cp38-cp38-win32.whl version of cairo elif sys.version[:3]=='3.8' and platform.machine()=='x86': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win32.whl", "pycairo-1.19.1-cp38-cp38-win32.whl") print("Sucessfully downloaded Cairo for your system") print("Installing Cairo") os.system("pip3 install pycairo-1.19.1-cp38-cp38-win32.whl") os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") - print("Succesfully installed Cairo") - #python 3.8 AMD64 - #pycairo-1.19.1-cp38-cp38-win_amd64.whl + print("Succesfully installed Cairo") + + #In case the python version is 3.8 and the system is AMD64, try pycairo-1.19.1-cp38-cp38-win_amd64.whl version of cairo elif sys.version[:3]=='3.8' and platform.machine()=='AMD64': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win_amd64.whl", "pycairo-1.19.1-cp38-cp38-win_amd64.whl") print("Sucessfully downloaded Cairo for your system") From c3f623b752664d82000e9c7a23c1192d959ed90b Mon Sep 17 00:00:00 2001 From: Pedro Batista Date: Sat, 23 May 2020 17:11:50 -0300 Subject: [PATCH 45/98] Add __main__.py file, which simply calls main(). The objective is to allow Manim to be invoked via python -m manim . --- manim/__main__.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 manim/__main__.py diff --git a/manim/__main__.py b/manim/__main__.py new file mode 100644 index 0000000000..427963d2c9 --- /dev/null +++ b/manim/__main__.py @@ -0,0 +1,3 @@ +from . import main + +main() \ No newline at end of file From 80fe4f0685f58ef7eb1d24160b5956248fd46ba3 Mon Sep 17 00:00:00 2001 From: Pedro Batista Date: Sat, 23 May 2020 17:27:44 -0300 Subject: [PATCH 46/98] Add trailing newline. --- manim/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/__main__.py b/manim/__main__.py index 427963d2c9..8273c4ff5d 100644 --- a/manim/__main__.py +++ b/manim/__main__.py @@ -1,3 +1,3 @@ from . import main -main() \ No newline at end of file +main() From 261a501980185f68a2ad2164a6ef1789d97a0b73 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Sun, 24 May 2020 17:48:49 +0530 Subject: [PATCH 47/98] Update pycairoInstall.py --- Scripts/pycairoInstall.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/pycairoInstall.py b/Scripts/pycairoInstall.py index db995b19e5..6e800e1785 100644 --- a/Scripts/pycairoInstall.py +++ b/Scripts/pycairoInstall.py @@ -20,7 +20,7 @@ urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win_amd64.whl", "pycairo-1.19.1-cp37-cp37m-win_amd64.whl") print("Sucessfully downloaded Cairo for your system") print("Installing Cairo") - os.system("pip3 install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + os.system("pip install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") print("Succesfully installed Cairo") @@ -29,7 +29,7 @@ urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win32.whl", "pycairo-1.19.1-cp38-cp38-win32.whl") print("Sucessfully downloaded Cairo for your system") print("Installing Cairo") - os.system("pip3 install pycairo-1.19.1-cp38-cp38-win32.whl") + os.system("pip install pycairo-1.19.1-cp38-cp38-win32.whl") os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") print("Succesfully installed Cairo") From a640c3b001cc1cf51db0b01931244ba30328e3df Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Sun, 24 May 2020 18:51:59 +0530 Subject: [PATCH 48/98] Remove print Statement --- Scripts/pycairoInstall.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Scripts/pycairoInstall.py b/Scripts/pycairoInstall.py index 6e800e1785..2dc37239b9 100644 --- a/Scripts/pycairoInstall.py +++ b/Scripts/pycairoInstall.py @@ -13,7 +13,6 @@ print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp37-cp37m-win32.whl") os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") - print("Succesfully installed Cairo") #In case the python version is 3.7 and the system is AMD64, try pycairo-1.19.1-cp37-cp37m-win_amd64.whl version of cairo elif sys.version[:3]=='3.7' and platform.machine()=='AMD64': @@ -22,7 +21,6 @@ print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") - print("Succesfully installed Cairo") #In case the python version is 3.8 and the system is 32-bit, try pycairo-1.19.1-cp38-cp38-win32.whl version of cairo elif sys.version[:3]=='3.8' and platform.machine()=='x86': @@ -31,7 +29,6 @@ print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp38-cp38-win32.whl") os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") - print("Succesfully installed Cairo") #In case the python version is 3.8 and the system is AMD64, try pycairo-1.19.1-cp38-cp38-win_amd64.whl version of cairo elif sys.version[:3]=='3.8' and platform.machine()=='AMD64': @@ -39,5 +36,4 @@ print("Sucessfully downloaded Cairo for your system") print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp38-cp38-win_amd64.whl") - os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") - print("Succesfully installed Cairo") + os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") From 705b960f70725265e367ee02d8a7f933b18bf259 Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 11:59:46 -0400 Subject: [PATCH 49/98] setup Travis-CI by adding a .travis.yml file. Add pytest to requirements.txt. Add a couple of dummy tests for now. --- .travis.yml | 25 +++++++++++++++++++ requirements.txt | 1 + tests/test_imports.py | 2 ++ ...sample_scenes.py => test_sample_scenes.py} | 24 +++++++++++------- 4 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 .travis.yml create mode 100644 tests/test_imports.py rename tests/{tests_sample_scenes.py => test_sample_scenes.py} (85%) diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..86f6822a41 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,25 @@ +language: python + +python: + - "3.6" + - "3.7" + - "3.8" + +os: + - linux + - osx + - windows + +# command to install dependencies +install: + - pip install -r requirements.txt + - pip install . + +# command to run tests +script: + - pytest + +# branches that trigger Travis builds +branches: + only: + - travis-setup diff --git a/requirements.txt b/requirements.txt index 7dec25c9b3..45cea631f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,4 @@ pydub pygments pyreadline; sys_platform == 'win32', rich +pytest diff --git a/tests/test_imports.py b/tests/test_imports.py new file mode 100644 index 0000000000..4bb8824f36 --- /dev/null +++ b/tests/test_imports.py @@ -0,0 +1,2 @@ +def test_import(): + import manim.imports diff --git a/tests/tests_sample_scenes.py b/tests/test_sample_scenes.py similarity index 85% rename from tests/tests_sample_scenes.py rename to tests/test_sample_scenes.py index 438568822a..0cddf211a4 100644 --- a/tests/tests_sample_scenes.py +++ b/tests/test_sample_scenes.py @@ -1,13 +1,14 @@ from manim.imports import * -# This file is intended to test any new feature added. -# Feel free to add a test or to modify one when adding a new/changing a feature. -class Test(Scene): - def construct(self): +# This file is intended to test any new feature added. +# Feel free to add a test or to modify one when adding a new/changing a feature. +class BasicScene(Scene): + def construct(self): square = Square() self.play(ShowCreation(square)) - -class Test_geometry(Scene): + + +class GeometryScene(Scene): def construct(self): circle = Circle() square = Square() @@ -39,7 +40,8 @@ def construct(self): ) self.wait() -class Test_plotting(GraphScene): + +class PlottingScene(GraphScene): CONFIG = { "x_min" : -10, "x_max" : 10.3, @@ -49,8 +51,12 @@ class Test_plotting(GraphScene): "function_color" : RED , "axes_color" : GREEN, "x_labeled_nums" :range(-10,12,2), - } - def construct(self): + } + def construct(self): self.setup_axes(animate=False) func_graph = self.get_graph(lambda x : x**2, self.function_color) self.play(ShowCreation(func_graph)) + + +def test_scenes(): + BasicScene() From 67b88aa2092999ae054cfc6da7f5359a25e8aac0 Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 16:42:10 -0400 Subject: [PATCH 50/98] add pytest to setup --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4552d4c3cb..6c667faa71 100755 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ "pydub", "pygments", "pyreadline; sys_platform == 'win32'", - "rich" + "rich", + "pytest" ], ) From da9d4a8ba19fe2ea1b0a4170e3fde561767a564f Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 16:48:50 -0400 Subject: [PATCH 51/98] fix: remove trailing comma --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 45cea631f5..23172f734b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,6 @@ opencv-python pycairo pydub pygments -pyreadline; sys_platform == 'win32', +pyreadline; sys_platform == 'win32' rich pytest From 6077328408629dd171fd343bc3e7c7223e0f0aca Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 16:53:24 -0400 Subject: [PATCH 52/98] Remove windows from the build matrix, as Travis-CI does not currently support python on windows --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 86f6822a41..14f3b206b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,8 @@ python: os: - linux - osx - - windows + # Travis-CI does not currently support python builds on windows + # - windows # command to install dependencies install: @@ -22,4 +23,4 @@ script: # branches that trigger Travis builds branches: only: - - travis-setup + - travis-setup From 032c0972163d9fefb0a7f2e89c198b91a9a9a37b Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 17:01:50 -0400 Subject: [PATCH 53/98] remove macOS from the build matrix as it is not currently supported by travis --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 14f3b206b7..5d985a51b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,10 @@ python: os: - linux - - osx - # Travis-CI does not currently support python builds on windows + + # Travis does not currently support python builds on windows or macos + # https://docs.travis-ci.com/user/languages/python/ + # - osx # - windows # command to install dependencies From ceb6a1dd95caeaa4d8ba81855fa4af9ffcd6deed Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 17:17:25 -0400 Subject: [PATCH 54/98] try a better build matrix --- .travis.yml | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d985a51b4..834f88e667 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,33 @@ language: python +matrix: + include: + - os: linux + python: "3.6" -python: - - "3.6" - - "3.7" - - "3.8" + - os: linux + python: "3.7" + + - os: linux + python: "3.8" + + - os: osx + language: generic + python: "3.6" + env: PYVER="3.6.9" + + - os: osx + language: generic + python: "3.7" + env: PYVER="3.7.5" + + - os: osx + language: generic + python: "3.8" + env: PYVER="3.8.0" os: - linux + - osx # Travis does not currently support python builds on windows or macos # https://docs.travis-ci.com/user/languages/python/ @@ -15,6 +36,7 @@ os: # command to install dependencies install: + - pip install --upgrade pip - pip install -r requirements.txt - pip install . From 66d24c6b38c8fd5a0ecbb4f4868f2f02f415779d Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 17:25:07 -0400 Subject: [PATCH 55/98] keep trying on macOS --- .travis.yml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 834f88e667..fc7324b7c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,15 @@ -language: python matrix: include: - os: linux + language: python python: "3.6" - os: linux + language: python python: "3.7" - os: linux + language: python python: "3.8" - os: osx @@ -34,7 +36,21 @@ os: # - osx # - windows -# command to install dependencies +before_install: + - | + if [ "$TRAVIS_OS_NAME" == "osx" ]; then + brew update + brew install openssl readline + brew outdated pyenv || brew upgrade pyenv + brew install pyenv-virtualenv + pyenv install $PYVER + export PYENV_VERSION=$PYVER + export PATH="/Users/travis/.pyenv/shims:${PATH}" + pyenv virtualenv venv + source ~/.pyenv/versions/venv/bin/activate + python --version + fi + install: - pip install --upgrade pip - pip install -r requirements.txt From 3ec1bd7afb05821d2dbdf088f15220dbe5d1ea56 Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 17:36:27 -0400 Subject: [PATCH 56/98] fix the build matrix (the os section was triggering unnecessary builds). Also update to latest python versions --- .travis.yml | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index fc7324b7c9..e956629b7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,29 +12,24 @@ matrix: language: python python: "3.8" + # Travis does not currently support python builds on windows. For + # macOS, we need to do some magic (see before_install section). + # https://docs.travis-ci.com/user/languages/python/ - os: osx language: generic python: "3.6" - env: PYVER="3.6.9" + env: PYVER="3.6.10" - os: osx language: generic python: "3.7" - env: PYVER="3.7.5" + env: PYVER="3.7.7" - os: osx language: generic python: "3.8" - env: PYVER="3.8.0" + env: PYVER="3.8.3" -os: - - linux - - osx - - # Travis does not currently support python builds on windows or macos - # https://docs.travis-ci.com/user/languages/python/ - # - osx - # - windows before_install: - | From 60c9235f5f67bf86fc7fc30b19ff9636ae67d2af Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 17:56:48 -0400 Subject: [PATCH 57/98] fix: apparently, rich does not support python 3.8.3 yet, but it does support 3.8.0 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e956629b7f..8564057413 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ matrix: - os: osx language: generic python: "3.8" - env: PYVER="3.8.3" + env: PYVER="3.8.0" before_install: From 9958044e0ea15afcd628ecc2ca1ae251280565e0 Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 18:27:26 -0400 Subject: [PATCH 58/98] The __init__ file is executed when the user imports our package, so this is the natural file to place all imports. This removes the necessity for a separate imports.py file. Also, the main entrypoint has been moved from __init__.py to __main__.py, as intended by python packaging standards. Finally, the extract_scene.py module is not an entrypoint so it does not require a `if __name__ == __main__` clause. Finally, this commit also fixes a typo (extra trailing comma) in requirements.py --- example_scenes/basic.py | 2 +- manim/__init__.py | 76 ++++++++++++++++++++++++++---- manim/__main__.py | 15 +++++- manim/config.py | 7 ++- manim/extract_scene.py | 4 -- manim/imports.py | 102 ---------------------------------------- requirements.txt | 2 +- setup.py | 5 +- 8 files changed, 91 insertions(+), 122 deletions(-) delete mode 100644 manim/imports.py diff --git a/example_scenes/basic.py b/example_scenes/basic.py index 1c4daa3b30..84f1e2b537 100644 --- a/example_scenes/basic.py +++ b/example_scenes/basic.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -from manim.imports import * +from manim import * # To watch one of these scenes, run the following: # python -m manim example_scenes.py SquareToCircle -pl diff --git a/manim/__init__.py b/manim/__init__.py index 505db0fb4e..2c56030b44 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -1,11 +1,71 @@ #!/usr/bin/env python -from . import extract_scene -from . import config -from . import constants +from .constants import * +from .animation.animation import * +from .animation.composition import * +from .animation.creation import * +from .animation.fading import * +from .animation.growing 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 * -def main(): - args = config.parse_cli() - cfg = config.get_configuration(args) - config.initialize_directories(cfg) - extract_scene.main(cfg) +from .camera.camera import * +from .camera.mapping_camera import * +from .camera.moving_camera import * +from .camera.three_d_camera import * + +from .mobject.coordinate_systems import * +from .mobject.changing 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.svg.text_mobject import * +from .mobject.svg.code_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.mobject_update_utils import * +from .mobject.value_tracker import * +from .mobject.vector_field 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 .utils.bezier import * +from .utils.color import * +from .utils.config_ops import * +from .utils.debug import * +from .utils.images import * +from .utils.iterables import * +from .utils.file_ops 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 * diff --git a/manim/__main__.py b/manim/__main__.py index 8273c4ff5d..08dc1d325b 100644 --- a/manim/__main__.py +++ b/manim/__main__.py @@ -1,3 +1,14 @@ -from . import main +from . import extract_scene +from . import config +from . import constants -main() + +def main(): + args = config.parse_cli() + cfg = config.get_configuration(args) + config.initialize_directories(cfg) + extract_scene.main(cfg) + + +if __name__ == "__main__": + main() diff --git a/manim/config.py b/manim/config.py index b511fe342d..7c5f8627d1 100644 --- a/manim/config.py +++ b/manim/config.py @@ -8,6 +8,9 @@ from . import dirs from .logger import logger +__all__ = ["parse_cli", "get_configuration", "initialize_directories"] + + def parse_cli(): try: parser = argparse.ArgumentParser() @@ -36,7 +39,7 @@ def parse_cli(): help="Save the last frame", ) parser.add_argument( - "--dry_run", + "--dry_run", action="store_true", help= "Do a dry run (render scenes but generate no output files)", ) @@ -269,7 +272,7 @@ def initialize_directories(config): if not config["video_dir"] or dirs.VIDEO_DIR: dir_config["video_dir"] = os.path.join(dir_config["media_dir"], "videos") - + for folder in [dir_config["video_dir"], dir_config["tex_dir"], dir_config["text_dir"]]: if folder != "" and not os.path.exists(folder): os.makedirs(folder) diff --git a/manim/extract_scene.py b/manim/extract_scene.py index e0d750af9c..b8a0ad96de 100644 --- a/manim/extract_scene.py +++ b/manim/extract_scene.py @@ -181,7 +181,3 @@ def main(config): print("\n\n") if config["sound"]: play_error_sound() - - -if __name__ == "__main__": - main() diff --git a/manim/imports.py b/manim/imports.py deleted file mode 100644 index 72b9cb2128..0000000000 --- a/manim/imports.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -I won't pretend like this is best practice, by in creating animations for a video, -it can be very nice to simply have all of the Mobjects, Animations, Scenes, etc. -of manim available without having to worry about what namespace they come from. - -Rather than having a large pile of "from import *" at the top of every such -script, the intent of this file is to make it so that one can just include -"from manim.imports import *". The effects of adding more modules -or refactoring the library on current or older scene scripts should be entirely -addressible by changing this file. - -Note: One should NOT import from this file for main library code, it is meant only -as a convenience for scripts creating scenes for videos. -""" - - -from .constants import * - -from .animation.animation import * -from .animation.composition import * -from .animation.creation import * -from .animation.fading import * -from .animation.growing 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 .camera.camera import * -from .camera.mapping_camera import * -from .camera.moving_camera import * -from .camera.three_d_camera import * - -from .mobject.coordinate_systems import * -from .mobject.changing 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.svg.text_mobject import * -from .mobject.svg.code_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.mobject_update_utils import * -from .mobject.value_tracker import * -from .mobject.vector_field 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 .utils.bezier import * -from .utils.color import * -from .utils.config_ops import * -from .utils.debug import * -from .utils.images import * -from .utils.iterables import * -from .utils.file_ops 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 * - -# Non manim libraries that are also nice to have without thinking - -import inspect -import itertools as it -import numpy as np -import operator as op -import os -import random -import re -import string -import sys -import math - -from PIL import Image -from colour import Color diff --git a/requirements.txt b/requirements.txt index 7dec25c9b3..f9fb3b9025 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,5 +9,5 @@ opencv-python pycairo pydub pygments -pyreadline; sys_platform == 'win32', +pyreadline; sys_platform == 'win32' rich diff --git a/setup.py b/setup.py index 4552d4c3cb..2cb6b855f4 100755 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ from setuptools import setup, find_namespace_packages + setup( name="manimlib", version="0.2.0", @@ -8,8 +9,8 @@ package_data={ "manim": ["*.tex"] }, entry_points={ "console_scripts": [ - "manim=manim:main", - "manimcm=manim:main", + "manim=manim.__main__:main", + "manimcm=manim.__main__:main", ] }, install_requires=[ From 87068170ea3a030f0aa343c05683804a2912ebae Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 15:28:52 -0700 Subject: [PATCH 59/98] Test new travis job matrix (with Windows too) --- .travis.yml | 103 ++++++++++++++++++++++----------------------- .travis/osx.sh | 12 ++++++ .travis/windows.sh | 4 ++ 3 files changed, 66 insertions(+), 53 deletions(-) create mode 100644 .travis/osx.sh create mode 100644 .travis/windows.sh diff --git a/.travis.yml b/.travis.yml index 8564057413..8425a5bd8a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,61 +1,58 @@ -matrix: - include: - - os: linux - language: python - python: "3.6" - - - os: linux - language: python - python: "3.7" - - - os: linux - language: python - python: "3.8" - - # Travis does not currently support python builds on windows. For - # macOS, we need to do some magic (see before_install section). - # https://docs.travis-ci.com/user/languages/python/ - - os: osx - language: generic - python: "3.6" - env: PYVER="3.6.10" - - - os: osx - language: generic - python: "3.7" - env: PYVER="3.7.7" - - - os: osx - language: generic - python: "3.8" - env: PYVER="3.8.0" - +language: python +python: + - "3.6" + - "3.7" + - "3.8" + +jobs: + include: + # Linux Jobs + - os: linux + language: python + python: 3.6 + - os: linux + language: python + python: 3.7 + - os: linux + language: python + python: 3.8 + + # MacOS (OSX) Jobs + - os: osx + language: sh + python: 3.6 + env: PYVER="3.6.10" + - os: osx + language: sh + python: 3.7 + env: PYVER="3.7.7" + - os: osx + language: sh + python: 3.8 + env: PYVER="3.8.2" + + # Windows Jobs + - os: windows + language: sh + python: 3.6 + env: PYVER=Python36 + - os: windows + language: sh + python: 3.7 + env: PYVER=Python37 + - os: windows + language: sh + python: 3.8 + env: PYVER=Python38 before_install: - - | - if [ "$TRAVIS_OS_NAME" == "osx" ]; then - brew update - brew install openssl readline - brew outdated pyenv || brew upgrade pyenv - brew install pyenv-virtualenv - pyenv install $PYVER - export PYENV_VERSION=$PYVER - export PATH="/Users/travis/.pyenv/shims:${PATH}" - pyenv virtualenv venv - source ~/.pyenv/versions/venv/bin/activate - python --version - fi - + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x .travis/linux.sh; sh .travis/linux.sh; fi + - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x .travis/windows.sh; sh .travis/windows.sh; fi + install: - pip install --upgrade pip - pip install -r requirements.txt - pip install . -# command to run tests script: - - pytest - -# branches that trigger Travis builds -branches: - only: - - travis-setup + - pytest \ No newline at end of file diff --git a/.travis/osx.sh b/.travis/osx.sh new file mode 100644 index 0000000000..1d3ec02b0f --- /dev/null +++ b/.travis/osx.sh @@ -0,0 +1,12 @@ +##### THIS IS FOR TRAVIS BUILDS, DO NOT RUN THIS ON YOUR COMPUTER! ##### + +brew update +brew install openssl readline +brew outdated pyenv || brew upgrade pyenv +brew install pyenv-virtualenv +pyenv install $PYVER +export PYENV_VERSION=$PYVER +export PATH="/Users/travis/.pyenv/shims:${PATH}" +pyenv virtualenv venv +source ~/.pyenv/versions/venv/bin/activate +python --version \ No newline at end of file diff --git a/.travis/windows.sh b/.travis/windows.sh new file mode 100644 index 0000000000..e726dfc10d --- /dev/null +++ b/.travis/windows.sh @@ -0,0 +1,4 @@ +##### THIS IS FOR TRAVIS BUILDS, DO NOT RUN THIS ON YOUR COMPUTER! ##### + +choco install python3 +export PATH="/c/$PYVER:/c/$PYVER/Scripts:$PATH" \ No newline at end of file From e4ecc2f4b0c992343a64831f2f250293649545ca Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 15:30:51 -0700 Subject: [PATCH 60/98] use the right branch --- .travis.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8425a5bd8a..a2bc6ed9c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,15 +35,15 @@ jobs: - os: windows language: sh python: 3.6 - env: PYVER=Python36 + env: PYVER="Python36" - os: windows language: sh python: 3.7 - env: PYVER=Python37 + env: PYVER="Python37" - os: windows language: sh python: 3.8 - env: PYVER=Python38 + env: PYVER="Python38" before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x .travis/linux.sh; sh .travis/linux.sh; fi @@ -55,4 +55,8 @@ install: - pip install . script: - - pytest \ No newline at end of file + - pytest + +branches: + only: + - travis-setup \ No newline at end of file From cda168a3b37adaaa784c1b19f527b3fb0b1f9c5f Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 15:36:52 -0700 Subject: [PATCH 61/98] Rename linux to mac in build config --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a2bc6ed9c8..275ca3e380 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,8 +46,8 @@ jobs: env: PYVER="Python38" before_install: - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x .travis/linux.sh; sh .travis/linux.sh; fi - - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x .travis/windows.sh; sh .travis/windows.sh; fi + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x ./.travis/osx.sh; sh ./.travis/osx.sh; fi + - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x ./.travis/windows.sh; sh ./.travis/windows.sh; fi install: - pip install --upgrade pip From 786031ebbbf25b964a4df969d9e5e7b4faae77be Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 15:46:45 -0700 Subject: [PATCH 62/98] Add refreshenv to windows --- .travis/windows.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis/windows.sh b/.travis/windows.sh index e726dfc10d..d39b226cbd 100644 --- a/.travis/windows.sh +++ b/.travis/windows.sh @@ -1,4 +1,5 @@ ##### THIS IS FOR TRAVIS BUILDS, DO NOT RUN THIS ON YOUR COMPUTER! ##### choco install python3 -export PATH="/c/$PYVER:/c/$PYVER/Scripts:$PATH" \ No newline at end of file +export PATH="/c/$PYVER:/c/$PYVER/Scripts:$PATH" +refreshenv \ No newline at end of file From cc5dd14e495e304622d100a0f49045b1f61975dc Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 18:54:10 -0400 Subject: [PATCH 63/98] try python version 3.8.0, as rich does not seem to support it --- .travis.yml | 6 +++--- .travis/windows.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 275ca3e380..058cd4be57 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ jobs: - os: osx language: sh python: 3.8 - env: PYVER="3.8.2" + env: PYVER="3.8.0" # Windows Jobs - os: windows @@ -48,7 +48,7 @@ jobs: before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x ./.travis/osx.sh; sh ./.travis/osx.sh; fi - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x ./.travis/windows.sh; sh ./.travis/windows.sh; fi - + install: - pip install --upgrade pip - pip install -r requirements.txt @@ -59,4 +59,4 @@ script: branches: only: - - travis-setup \ No newline at end of file + - travis-setup diff --git a/.travis/windows.sh b/.travis/windows.sh index d39b226cbd..972894ee3c 100644 --- a/.travis/windows.sh +++ b/.travis/windows.sh @@ -1,5 +1,5 @@ ##### THIS IS FOR TRAVIS BUILDS, DO NOT RUN THIS ON YOUR COMPUTER! ##### -choco install python3 +choco install python --version=3.8.0 export PATH="/c/$PYVER:/c/$PYVER/Scripts:$PATH" -refreshenv \ No newline at end of file +refreshenv From 2572a0145fce8cdec4fabbc93df99165d1aa5a2c Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 19:00:08 -0400 Subject: [PATCH 64/98] specify both the python version and the destination folder --- .travis.yml | 9 ++++++--- .travis/windows.sh | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 058cd4be57..7eee20a4bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,15 +35,18 @@ jobs: - os: windows language: sh python: 3.6 - env: PYVER="Python36" + env: PYVER="3.6.10" + env: PYDIR="Python36" - os: windows language: sh python: 3.7 - env: PYVER="Python37" + env: PYVER="3.7.7" + env: PYDIR="Python37" - os: windows language: sh python: 3.8 - env: PYVER="Python38" + env: PYVER="3.8.0" + env: PYDIR="Python38" before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x ./.travis/osx.sh; sh ./.travis/osx.sh; fi diff --git a/.travis/windows.sh b/.travis/windows.sh index 972894ee3c..ce4ac4e0de 100644 --- a/.travis/windows.sh +++ b/.travis/windows.sh @@ -1,5 +1,5 @@ ##### THIS IS FOR TRAVIS BUILDS, DO NOT RUN THIS ON YOUR COMPUTER! ##### -choco install python --version=3.8.0 -export PATH="/c/$PYVER:/c/$PYVER/Scripts:$PATH" +choco install python --version=$PYVER +export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" refreshenv From f7c7cefa1523d0a8a6ca3d9dc8e70257a17601f8 Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 19:02:05 -0400 Subject: [PATCH 65/98] travis environment variables go on the same line --- .travis.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7eee20a4bf..3838742741 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,18 +35,15 @@ jobs: - os: windows language: sh python: 3.6 - env: PYVER="3.6.10" - env: PYDIR="Python36" + env: PYVER="3.6.10" PYDIR="Python36" - os: windows language: sh python: 3.7 - env: PYVER="3.7.7" - env: PYDIR="Python37" + env: PYVER="3.7.7" PYDIR="Python37" - os: windows language: sh python: 3.8 - env: PYVER="3.8.0" - env: PYDIR="Python38" + env: PYVER="3.8.0" PYDIR="Python38" before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x ./.travis/osx.sh; sh ./.travis/osx.sh; fi From f8fa8232947dae1e959881cc35deb63f991dc676 Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 19:18:58 -0400 Subject: [PATCH 66/98] try with pip3 --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3838742741..f5f953addc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,9 +50,9 @@ before_install: - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x ./.travis/windows.sh; sh ./.travis/windows.sh; fi install: - - pip install --upgrade pip - - pip install -r requirements.txt - - pip install . + - pip3 install --upgrade pip + - pip3 install -r requirements.txt + - pip3 install . script: - pytest From 409f7025c9e52d973cb55f751d7a218d589a1e35 Mon Sep 17 00:00:00 2001 From: leotrs Date: Sun, 24 May 2020 19:28:52 -0400 Subject: [PATCH 67/98] here goes nothing --- .travis.yml | 3 ++- .travis/windows.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f5f953addc..769e005129 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,8 @@ jobs: - os: windows language: sh python: 3.6 - env: PYVER="3.6.10" PYDIR="Python36" + # the latest version available on chocolatey is 3.6.8 + env: PYVER="3.6.8" PYDIR="Python36" - os: windows language: sh python: 3.7 diff --git a/.travis/windows.sh b/.travis/windows.sh index ce4ac4e0de..e562066314 100644 --- a/.travis/windows.sh +++ b/.travis/windows.sh @@ -2,4 +2,4 @@ choco install python --version=$PYVER export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" -refreshenv +cmd.exe //c "RefreshEnv.cmd" From 2b69de104833ea4b32858ba0260af5970358efde Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Sun, 24 May 2020 19:04:20 -0700 Subject: [PATCH 68/98] Try using pip from python --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 769e005129..c4f951e8ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,9 +51,9 @@ before_install: - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x ./.travis/windows.sh; sh ./.travis/windows.sh; fi install: - - pip3 install --upgrade pip - - pip3 install -r requirements.txt - - pip3 install . + - python3 -m pip install --upgrade pip + - python3 -m pip install -r requirements.txt + - python3 -m pip install . script: - pytest From 8afc7d2aaf92f0bb0429dc77c3e9e5a74157e2e7 Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Sun, 24 May 2020 19:19:12 -0700 Subject: [PATCH 69/98] It didn't work --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c4f951e8ca..769e005129 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,9 +51,9 @@ before_install: - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x ./.travis/windows.sh; sh ./.travis/windows.sh; fi install: - - python3 -m pip install --upgrade pip - - python3 -m pip install -r requirements.txt - - python3 -m pip install . + - pip3 install --upgrade pip + - pip3 install -r requirements.txt + - pip3 install . script: - pytest From facbcaa04e476a7670c60c783b50c2d7c141fb5a Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:04:28 -0700 Subject: [PATCH 70/98] update PATH --- .travis/windows.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/windows.sh b/.travis/windows.sh index e562066314..56035d6305 100644 --- a/.travis/windows.sh +++ b/.travis/windows.sh @@ -3,3 +3,4 @@ choco install python --version=$PYVER export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" cmd.exe //c "RefreshEnv.cmd" +exec $SHELL \ No newline at end of file From d28dfcab3b8c62eeb6162fcfcf365a7634669bc3 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:16:52 -0700 Subject: [PATCH 71/98] Add user option to pip --- .travis.yml | 7 +++++-- .travis/windows.sh | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 769e005129..ab93ab5fc4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,8 +52,8 @@ before_install: install: - pip3 install --upgrade pip - - pip3 install -r requirements.txt - - pip3 install . + - pip3 install --user -r requirements.txt + - pip3 install --user . script: - pytest @@ -61,3 +61,6 @@ script: branches: only: - travis-setup + +notifications: + email: false \ No newline at end of file diff --git a/.travis/windows.sh b/.travis/windows.sh index 56035d6305..d1f5da20a7 100644 --- a/.travis/windows.sh +++ b/.travis/windows.sh @@ -3,4 +3,4 @@ choco install python --version=$PYVER export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" cmd.exe //c "RefreshEnv.cmd" -exec $SHELL \ No newline at end of file +python -m pip install --upgrade pip \ No newline at end of file From 791a67293379f80ac377ac4f0fb9848d68576109 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:21:19 -0700 Subject: [PATCH 72/98] Well that broke it --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ab93ab5fc4..0fe1f67a28 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,8 +52,8 @@ before_install: install: - pip3 install --upgrade pip - - pip3 install --user -r requirements.txt - - pip3 install --user . + - pip3 install -r requirements.txt + - pip3 install . script: - pytest From 2ce0ffac0332597cb94ebc80b72f4b7bf8d2b2f1 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:22:16 -0700 Subject: [PATCH 73/98] Add python -m on windows --- .travis/windows.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis/windows.sh b/.travis/windows.sh index d1f5da20a7..3e16ff633c 100644 --- a/.travis/windows.sh +++ b/.travis/windows.sh @@ -3,4 +3,6 @@ choco install python --version=$PYVER export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" cmd.exe //c "RefreshEnv.cmd" -python -m pip install --upgrade pip \ No newline at end of file +python -m pip install --upgrade pip +python -m pip install --user -r requirements.txt +python -m pip install --user . \ No newline at end of file From 6c8a4754cc1493d8a8ff518521f5b5898b1a578f Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:38:19 -0700 Subject: [PATCH 74/98] try to make cairo work with windoze?? --- .travis.yml | 52 +++++++++++++++++++++++++++++---- .travis/cairo-windows.py | 51 ++++++++++++++++++++++++++++++++ .travis/travis-requirements.txt | 14 +++++++++ .travis/windows.sh | 8 ----- 4 files changed, 111 insertions(+), 14 deletions(-) create mode 100644 .travis/cairo-windows.py create mode 100644 .travis/travis-requirements.txt delete mode 100644 .travis/windows.sh diff --git a/.travis.yml b/.travis.yml index 0fe1f67a28..08ffb29861 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,26 +10,56 @@ jobs: - os: linux language: python python: 3.6 + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install pycairo + - pip3 install . - os: linux language: python python: 3.7 + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install pycairo + - pip3 install . - os: linux language: python python: 3.8 + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install pycairo + - pip3 install . # MacOS (OSX) Jobs - os: osx language: sh python: 3.6 env: PYVER="3.6.10" + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install pycairo + - pip3 install . - os: osx language: sh python: 3.7 env: PYVER="3.7.7" + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install pycairo + - pip3 install . - os: osx language: sh python: 3.8 env: PYVER="3.8.0" + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install pycairo + - pip3 install . # Windows Jobs - os: windows @@ -37,23 +67,33 @@ jobs: python: 3.6 # the latest version available on chocolatey is 3.6.8 env: PYVER="3.6.8" PYDIR="Python36" + install: + - choco install python --version=$PYVER + - export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" + - cmd.exe //c "RefreshEnv.cmd" + - python -m pip install --upgrade pip + - python -m pip install --user -r ./.travis/travis-requirements.txt + - python ./.travis/cairo-windows.py + - python -m pip install --user . - os: windows language: sh python: 3.7 env: PYVER="3.7.7" PYDIR="Python37" + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install . - os: windows language: sh python: 3.8 env: PYVER="3.8.0" PYDIR="Python38" + install: + - pip3 install --upgrade pip + - pip3 install -r ./.travis/travis-requirements.txt + - pip3 install . before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x ./.travis/osx.sh; sh ./.travis/osx.sh; fi - - if [ "$TRAVIS_OS_NAME" == "windows" ]; then chmod +x ./.travis/windows.sh; sh ./.travis/windows.sh; fi - -install: - - pip3 install --upgrade pip - - pip3 install -r requirements.txt - - pip3 install . script: - pytest diff --git a/.travis/cairo-windows.py b/.travis/cairo-windows.py new file mode 100644 index 0000000000..9cde2b37cd --- /dev/null +++ b/.travis/cairo-windows.py @@ -0,0 +1,51 @@ +import platform +import os +import sys +import urllib.request + +if 'Windows' in platform.system(): + #In case the python version is 3.6 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + if sys.version[:3]=='3.6' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win32.whl", "pycairo-1.19.1-cp36-cp36m-win32.whl") + os.system("pip install pycairo-1.19.1-cp36-cp36m-win32.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") + + #In case the python version is 3.6 and the system is 64-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + elif sys.version[:3]=='3.6' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win_amd64.whl", "pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + os.remove("pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + + #In case the python version is 3.7 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + if sys.version[:3]=='3.7' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win32.whl", "pycairo-1.19.1-cp37-cp37m-win32.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp37-cp37m-win32.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") + + #In case the python version is 3.7 and the system is AMD64, try pycairo-1.19.1-cp37-cp37m-win_amd64.whl version of cairo + elif sys.version[:3]=='3.7' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win_amd64.whl", "pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + + #In case the python version is 3.8 and the system is 32-bit, try pycairo-1.19.1-cp38-cp38-win32.whl version of cairo + elif sys.version[:3]=='3.8' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win32.whl", "pycairo-1.19.1-cp38-cp38-win32.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp38-cp38-win32.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") + + #In case the python version is 3.8 and the system is AMD64, try pycairo-1.19.1-cp38-cp38-win_amd64.whl version of cairo + elif sys.version[:3]=='3.8' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win_amd64.whl", "pycairo-1.19.1-cp38-cp38-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp38-cp38-win_amd64.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") \ No newline at end of file diff --git a/.travis/travis-requirements.txt b/.travis/travis-requirements.txt new file mode 100644 index 0000000000..39a7643f00 --- /dev/null +++ b/.travis/travis-requirements.txt @@ -0,0 +1,14 @@ +argparse +colour +numpy +Pillow +progressbar +scipy +tqdm +opencv-python +#pycairo +pydub +pygments +pyreadline; sys_platform == 'win32' +rich +pytest \ No newline at end of file diff --git a/.travis/windows.sh b/.travis/windows.sh deleted file mode 100644 index 3e16ff633c..0000000000 --- a/.travis/windows.sh +++ /dev/null @@ -1,8 +0,0 @@ -##### THIS IS FOR TRAVIS BUILDS, DO NOT RUN THIS ON YOUR COMPUTER! ##### - -choco install python --version=$PYVER -export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" -cmd.exe //c "RefreshEnv.cmd" -python -m pip install --upgrade pip -python -m pip install --user -r requirements.txt -python -m pip install --user . \ No newline at end of file From 44b200f5e195f142500d9b1b3c37370b8da343e6 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:41:09 -0700 Subject: [PATCH 75/98] Clarify lines and fix windows installs --- .travis.yml | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 08ffb29861..c4208a8529 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,7 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + - os: linux language: python python: 3.7 @@ -23,6 +24,7 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + - os: linux language: python python: 3.8 @@ -42,6 +44,7 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + - os: osx language: sh python: 3.7 @@ -51,6 +54,7 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + - os: osx language: sh python: 3.8 @@ -75,22 +79,32 @@ jobs: - python -m pip install --user -r ./.travis/travis-requirements.txt - python ./.travis/cairo-windows.py - python -m pip install --user . + - os: windows language: sh python: 3.7 env: PYVER="3.7.7" PYDIR="Python37" install: - - pip3 install --upgrade pip - - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install . + - choco install python --version=$PYVER + - export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" + - cmd.exe //c "RefreshEnv.cmd" + - python -m pip install --upgrade pip + - python -m pip install --user -r ./.travis/travis-requirements.txt + - python ./.travis/cairo-windows.py + - python -m pip install --user . + - os: windows language: sh python: 3.8 env: PYVER="3.8.0" PYDIR="Python38" install: - - pip3 install --upgrade pip - - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install . + - choco install python --version=$PYVER + - export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" + - cmd.exe //c "RefreshEnv.cmd" + - python -m pip install --upgrade pip + - python -m pip install --user -r ./.travis/travis-requirements.txt + - python ./.travis/cairo-windows.py + - python -m pip install --user . before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x ./.travis/osx.sh; sh ./.travis/osx.sh; fi From 4338520c16f67911c9d402afba7ea56100b83a36 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:42:06 -0700 Subject: [PATCH 76/98] Remove double build --- .travis.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index c4208a8529..68efc01e53 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,3 @@ -language: python -python: - - "3.6" - - "3.7" - - "3.8" - jobs: include: # Linux Jobs @@ -92,7 +86,7 @@ jobs: - python -m pip install --user -r ./.travis/travis-requirements.txt - python ./.travis/cairo-windows.py - python -m pip install --user . - + - os: windows language: sh python: 3.8 From e08c1c8e2b778586626a8175963b84c42f00dcc3 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Sun, 24 May 2020 21:46:43 -0700 Subject: [PATCH 77/98] Refresh env vars after pytest install (win) --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 68efc01e53..28f2f18fc2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -72,6 +72,7 @@ jobs: - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt - python ./.travis/cairo-windows.py + - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . - os: windows @@ -85,6 +86,7 @@ jobs: - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt - python ./.travis/cairo-windows.py + - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . - os: windows @@ -98,6 +100,7 @@ jobs: - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt - python ./.travis/cairo-windows.py + - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . before_install: From ee64928c98b4dc4735094cd146deac92413fdc84 Mon Sep 17 00:00:00 2001 From: Aathish Sivasubrahmanian Date: Mon, 25 May 2020 10:31:06 +0530 Subject: [PATCH 78/98] Added BasicTeX installation instructions for MacOS Removed Trailing WhiteSpaces in ReadMe.md --- README.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5b9d3d8956..e0f4f8fa68 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Before installing `manim-community`, there are some additional dependencies that #### LaTeX Installation 1. Download the MiKTex installer from its [Download Page](https://miktex.org/download) -2. You can check you did it right by running `refreshenv` to update your environment variable and running `latex` +2. You can check you did it right by running `refreshenv` to update your environment variable and running `latex`

@@ -108,7 +108,7 @@ Before installing `manim-community`, there are some additional dependencies that sudo apt install texlive texlive-latex-extra texlive-fonts-extra texlive-latex-recommended texlive-science texlive-fonts-extra tipa ``` > Note: this installation may take up a lot of space. The developers are working on providing a simpler, lighter LaTeX package for you to install -2. You can check you did it right by running `latex` +2. You can check you did it right by running `latex` #### Additional Installation Steps - You must install additional codecs to play MP4 files: @@ -151,7 +151,22 @@ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/ #### LaTeX Installation 1. Refer to the section on Brew installation to see how to install `brew` 2. Run `brew cask install mactex` -2. You can check you did it right by running `latex` +3. You can check you did it right by running `latex` + +> Note that MacTeX will require at least 4.5GB of hard disk space and bandwidth. +> +> This is due to the fact that it installs every LaTeX addon package offered by [CTAN](https://ctan.org/). Only a few of these packages are required by Manim. +> +> If you would like a smaller LaTeX install which only contains the packages needed by Manim alone, consider installing BasicTeX and suitable packages with the instructions below. This will require about 1.5 GB of space and bandwidth. + +If you have installed MacTeX and are comfortable with it, do not install BasicTeX. + +1. Refer to the section on Brew installation to see how to install `brew` +2. Run `brew cask install basictex` +3. Ensure that the TeXLiveManager tool `tlmgr` works, by running `tlmgr --version` in the terminal. +4. Run `sudo tlmgr install standalone preview doublestroke relsize fundus-calligra wasysym physics dvisvgm.x86_64-darwin dvisvgm rsfs wasy cm-super` +4. Ensure that LaTeX works by running `latex` in the Terminal. + ### Installing Manim-Community itself @@ -170,7 +185,7 @@ executing either git clone git@github.com:ManimCommunity/manim.git ``` -or +or ```sh git clone https://github.com/ManimCommunity/manim.git From 5617e76ee97c5034d2accd210211b4af219590aa Mon Sep 17 00:00:00 2001 From: Syrus Dark Date: Mon, 25 May 2020 10:38:26 +0530 Subject: [PATCH 79/98] Update to select python 3 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08376af5ff..16dd1ff30e 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Before installing `manim-community`, there are some additional dependencies that 6. Alternatively, Running the command below installs pycairo. This needs to be an elevated command prompt like Powershell. ```powershell - (Invoke-WebRequest -Uri https://raw.githubusercontent.com/ManimCommunity/manim/master/scripts/pycairoInstall.py -UseBasicParsing).Content | python + (Invoke-WebRequest -Uri https://raw.githubusercontent.com/ManimCommunity/manim/master/scripts/pycairoInstall.py -UseBasicParsing).Content | py -3 ``` From 0d119c3659722916bba84dad96a73ed11bccc0e8 Mon Sep 17 00:00:00 2001 From: Hugues Devimeux Date: Mon, 25 May 2020 17:00:34 +0200 Subject: [PATCH 80/98] added AddTextLetterByLetter --- manim/animation/creation.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/manim/animation/creation.py b/manim/animation/creation.py index 4131c82883..4e42e739c2 100644 --- a/manim/animation/creation.py +++ b/manim/animation/creation.py @@ -140,6 +140,22 @@ def interpolate_mobject(self, alpha): def update_submobject_list(self, index): self.mobject.submobjects = self.all_submobs[:index] +class AddTextLetterByLetter(ShowIncreasingSubsets): + """ + Add a Text Object letter by letter on the scene. Use time_per_char to change frequency of appearance of the letters. + """ + CONFIG = { + "suspend_mobject_updating": False, + "int_func": np.ceil, + "rate_func" : linear, + "time_per_char": 0.1, + } + + def __init__(self, text, **kwargs): + digest_config(self, kwargs) + + self.run_time = np.max((0.06, self.time_per_char)) * len(text) #Time_per_char must be above 0.06. Otherwise the animation doesn't finish. + super().__init__(text, **kwargs) class ShowSubmobjectsOneByOne(ShowIncreasingSubsets): CONFIG = { From f9bb278d410aac76f5c10679baac26655d692541 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 10:05:43 -0700 Subject: [PATCH 81/98] Add python -m for windows pytest --- .travis.yml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 28f2f18fc2..479eb9a728 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,8 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + script: + - pytest - os: linux language: python @@ -18,6 +20,8 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + script: + - pytest - os: linux language: python @@ -27,6 +31,8 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + script: + - pytest # MacOS (OSX) Jobs - os: osx @@ -38,6 +44,8 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + script: + - pytest - os: osx language: sh @@ -48,6 +56,8 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + script: + - pytest - os: osx language: sh @@ -58,6 +68,8 @@ jobs: - pip3 install -r ./.travis/travis-requirements.txt - pip3 install pycairo - pip3 install . + script: + - pytest # Windows Jobs - os: windows @@ -74,6 +86,8 @@ jobs: - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . + script: + - python -m pytest - os: windows language: sh @@ -88,6 +102,8 @@ jobs: - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . + script: + - python -m pytest - os: windows language: sh @@ -102,13 +118,12 @@ jobs: - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . + script: + - python -m pytest before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then chmod +x ./.travis/osx.sh; sh ./.travis/osx.sh; fi -script: - - pytest - branches: only: - travis-setup From 7221634a3e6929e6605b8d04154e91af9cf6b59c Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 10:19:21 -0700 Subject: [PATCH 82/98] Try to fix opencv + ffmpeg on win --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 479eb9a728..0413c771d3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -80,9 +80,11 @@ jobs: install: - choco install python --version=$PYVER - export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" + - choco install ffmpeg - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt + - python -m pip install opencv-contrib-python - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . @@ -96,9 +98,11 @@ jobs: install: - choco install python --version=$PYVER - export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" + - choco install ffmpeg - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt + - python -m pip install opencv-contrib-python - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . @@ -112,9 +116,11 @@ jobs: install: - choco install python --version=$PYVER - export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" + - choco install ffmpeg - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt + - python -m pip install opencv-contrib-python - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . From 3c0643af14ab7c71145c53bae57d0e4086f0f25e Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 10:50:53 -0700 Subject: [PATCH 83/98] Remove OpenCV completely --- .travis.yml | 3 -- .travis/travis-requirements.txt | 4 +- manim/imports.py | 2 +- manim/scene/scene_from_video.py | 94 ++++++++++++++++----------------- requirements.txt | 2 +- 5 files changed, 51 insertions(+), 54 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0413c771d3..7e13ea35c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -84,7 +84,6 @@ jobs: - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt - - python -m pip install opencv-contrib-python - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . @@ -102,7 +101,6 @@ jobs: - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt - - python -m pip install opencv-contrib-python - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . @@ -120,7 +118,6 @@ jobs: - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --upgrade pip - python -m pip install --user -r ./.travis/travis-requirements.txt - - python -m pip install opencv-contrib-python - python ./.travis/cairo-windows.py - cmd.exe //c "RefreshEnv.cmd" - python -m pip install --user . diff --git a/.travis/travis-requirements.txt b/.travis/travis-requirements.txt index 39a7643f00..e51d737699 100644 --- a/.travis/travis-requirements.txt +++ b/.travis/travis-requirements.txt @@ -5,8 +5,8 @@ Pillow progressbar scipy tqdm -opencv-python -#pycairo +# opencv-python +# pycairo pydub pygments pyreadline; sys_platform == 'win32' diff --git a/manim/imports.py b/manim/imports.py index 72b9cb2128..69f990468b 100644 --- a/manim/imports.py +++ b/manim/imports.py @@ -66,7 +66,7 @@ from .scene.scene import * from .scene.sample_space_scene import * from .scene.graph_scene import * -from .scene.scene_from_video import * +# from .scene.scene_from_video import * from .scene.three_d_scene import * from .scene.vector_space_scene import * from .scene.zoomed_scene import * diff --git a/manim/scene/scene_from_video.py b/manim/scene/scene_from_video.py index 170c6f0162..1e21251407 100644 --- a/manim/scene/scene_from_video.py +++ b/manim/scene/scene_from_video.py @@ -1,54 +1,54 @@ -from tqdm import tqdm as show_progress -import cv2 +# from tqdm import tqdm as show_progress +# import cv2 -from ..scene.scene import Scene -from ..logger import logger +# from ..scene.scene import Scene +# from ..logger import logger -# TODO, is this depricated? -class SceneFromVideo(Scene): - def construct(self, file_name, - freeze_last_frame=True, - time_range=None): - cap = cv2.VideoCapture(file_name) - self.shape = ( - int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)), - int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)) - ) - fps = cap.get(cv2.cv.CV_CAP_PROP_FPS) - self.camera.frame_rate = fps - frame_count = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)) - if time_range is None: - start_frame = 0 - end_frame = frame_count - else: - start_frame, end_frame = [fps * t for t in time_range] +# # TODO, is this depricated? +# class SceneFromVideo(Scene): +# def construct(self, file_name, +# freeze_last_frame=True, +# time_range=None): +# cap = cv2.VideoCapture(file_name) +# self.shape = ( +# int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)), +# int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)) +# ) +# fps = cap.get(cv2.cv.CV_CAP_PROP_FPS) +# self.camera.frame_rate = fps +# frame_count = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)) +# if time_range is None: +# start_frame = 0 +# end_frame = frame_count +# else: +# start_frame, end_frame = [fps * t for t in time_range] - frame_count = end_frame - start_frame - logger.info("Reading in " + file_name + "...") - for count in show_progress(list(range(start_frame, end_frame + 1))): - returned, frame = cap.read() - if not returned: - break - # b, g, r = cv2.split(frame) - # self.frames.append(cv2.merge([r, g, b])) - self.frames.append(frame) - cap.release() +# frame_count = end_frame - start_frame +# logger.info("Reading in " + file_name + "...") +# for count in show_progress(list(range(start_frame, end_frame + 1))): +# returned, frame = cap.read() +# if not returned: +# break +# # b, g, r = cv2.split(frame) +# # self.frames.append(cv2.merge([r, g, b])) +# self.frames.append(frame) +# cap.release() - if freeze_last_frame and len(self.frames) > 0: - self.original_background = self.background = self.frames[-1] +# if freeze_last_frame and len(self.frames) > 0: +# self.original_background = self.background = self.frames[-1] - def apply_gaussian_blur(self, ksize=(5, 5), sigmaX=5): - self.frames = [ - cv2.GaussianBlur(frame, ksize, sigmaX) - for frame in self.frames - ] +# def apply_gaussian_blur(self, ksize=(5, 5), sigmaX=5): +# self.frames = [ +# cv2.GaussianBlur(frame, ksize, sigmaX) +# for frame in self.frames +# ] - def apply_edge_detection(self, threshold1=50, threshold2=100): - edged_frames = [ - cv2.Canny(frame, threshold1, threshold2) - for frame in self.frames - ] - for index in range(len(self.frames)): - for i in range(3): - self.frames[index][:, :, i] = edged_frames[index] \ No newline at end of file +# def apply_edge_detection(self, threshold1=50, threshold2=100): +# edged_frames = [ +# cv2.Canny(frame, threshold1, threshold2) +# for frame in self.frames +# ] +# for index in range(len(self.frames)): +# for i in range(3): +# self.frames[index][:, :, i] = edged_frames[index] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 23172f734b..fdf2042f58 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ Pillow progressbar scipy tqdm -opencv-python +# opencv-python pycairo pydub pygments From e9b02b3652e710032591150d967c274bbe867560 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 11:05:20 -0700 Subject: [PATCH 84/98] Remove .imports --- logo/logo.py | 2 +- tests/test_sample_scenes.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/logo/logo.py b/logo/logo.py index 41bb7e3930..a4b485fc47 100644 --- a/logo/logo.py +++ b/logo/logo.py @@ -1,4 +1,4 @@ -from manim.imports import * +from manim import * NEW_BLUE = "#68a8e1" diff --git a/tests/test_sample_scenes.py b/tests/test_sample_scenes.py index 0cddf211a4..af2c318a91 100644 --- a/tests/test_sample_scenes.py +++ b/tests/test_sample_scenes.py @@ -1,4 +1,4 @@ -from manim.imports import * +from manim import * # This file is intended to test any new feature added. # Feel free to add a test or to modify one when adding a new/changing a feature. From acbd4eb9230d5c08127e9a14581f8d11eb058205 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 11:08:04 -0700 Subject: [PATCH 85/98] One more import --- tests/test_imports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_imports.py b/tests/test_imports.py index 4bb8824f36..55ed89a48a 100644 --- a/tests/test_imports.py +++ b/tests/test_imports.py @@ -1,2 +1,2 @@ def test_import(): - import manim.imports + import manim From ab9ac29f3be1287d6e6c9ff39d2fbf29e838ce0c Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 11:16:14 -0700 Subject: [PATCH 86/98] Add build badge to readme [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0f4f8fa68..dfa75f45bc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![logo](logo/cropped.png) -[![Build Status](https://travis-ci.org/3b1b/manim.svg?branch=master)](https://travis-ci.org/3b1b/manim) +[![Build Status](https://travis-ci.com/ManimCommunity/manim.svg?branch=master)](https://travis-ci.com/ManimCommunity/manim) [![Documentation](https://img.shields.io/badge/docs-EulerTour-blue.svg)](https://www.eulertour.com/docs) [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](http://choosealicense.com/licenses/mit/) [![Manim Subreddit](https://img.shields.io/reddit/subreddit-subscribers/manim.svg?color=ff4301&label=reddit)](https://www.reddit.com/r/manim/) From 963d66eb4ddec0169e155db68014a19421c94865 Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 12:04:02 -0700 Subject: [PATCH 87/98] Housekeeping & pytest dev-only req [skip-ci] --- .travis.yml | 18 +++++++++--------- requirements.txt | 2 +- setup.py | 1 - 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7e13ea35c8..3d23e1bbe5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ jobs: install: - pip3 install --upgrade pip - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install pycairo + - pip3 install pycairo pytest - pip3 install . script: - pytest @@ -18,7 +18,7 @@ jobs: install: - pip3 install --upgrade pip - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install pycairo + - pip3 install pycairo pytest - pip3 install . script: - pytest @@ -29,7 +29,7 @@ jobs: install: - pip3 install --upgrade pip - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install pycairo + - pip3 install pycairo pytest - pip3 install . script: - pytest @@ -42,7 +42,7 @@ jobs: install: - pip3 install --upgrade pip - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install pycairo + - pip3 install pycairo pytest - pip3 install . script: - pytest @@ -54,7 +54,7 @@ jobs: install: - pip3 install --upgrade pip - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install pycairo + - pip3 install pycairo pytest - pip3 install . script: - pytest @@ -62,11 +62,11 @@ jobs: - os: osx language: sh python: 3.8 - env: PYVER="3.8.0" + env: PYVER="3.8.0" # Using Python 3.8.0 due to error with rich install: - pip3 install --upgrade pip - pip3 install -r ./.travis/travis-requirements.txt - - pip3 install pycairo + - pip3 install pycairo pytest - pip3 install . script: - pytest @@ -110,7 +110,7 @@ jobs: - os: windows language: sh python: 3.8 - env: PYVER="3.8.0" PYDIR="Python38" + env: PYVER="3.8.0" PYDIR="Python38" # Using Python 3.8.0 due to error with rich install: - choco install python --version=$PYVER - export PATH="/c/$PYDIR:/c/$PYDIR/Scripts:$PATH" @@ -132,4 +132,4 @@ branches: - travis-setup notifications: - email: false \ No newline at end of file + email: false diff --git a/requirements.txt b/requirements.txt index fdf2042f58..4221c80dc5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,4 @@ pydub pygments pyreadline; sys_platform == 'win32' rich -pytest +# pytest (for development only) diff --git a/setup.py b/setup.py index 42d65f9c85..15a0c90a3a 100755 --- a/setup.py +++ b/setup.py @@ -27,6 +27,5 @@ "pygments", "pyreadline; sys_platform == 'win32'", "rich", - "pytest" ], ) From af53017f3ec39b51cc3931226527cf3c0b03dd4e Mon Sep 17 00:00:00 2001 From: safinsingh Date: Mon, 25 May 2020 12:05:16 -0700 Subject: [PATCH 88/98] Test master [skip ci] --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3d23e1bbe5..19b2fa691c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -129,7 +129,7 @@ before_install: branches: only: - - travis-setup + - master notifications: email: false From ba9e8d8d515ab566c7ea7daf795b6922569f511a Mon Sep 17 00:00:00 2001 From: Blaz Korecic Date: Mon, 25 May 2020 23:29:55 -0400 Subject: [PATCH 89/98] Fix missing spaces and capitalize some words --- manim/config.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/manim/config.py b/manim/config.py index 7c5f8627d1..a353a42184 100644 --- a/manim/config.py +++ b/manim/config.py @@ -16,7 +16,7 @@ def parse_cli(): parser = argparse.ArgumentParser() parser.add_argument( "file", - help="path to file holding the python code for the scene", + help="Path to file holding the python code for the scene", ) parser.add_argument( "scene_names", @@ -96,14 +96,14 @@ def parse_cli(): parser.add_argument( "-o", "--file_name", help="Specify the name of the output file, if" - "it should be different from the scene class name", + " it should be different from the scene class name", ) parser.add_argument( "-n", "--start_at_animation_number", help="Start rendering not from the first animation, but" - "from another, specified by its index. If you pass" - "in two comma separated values, e.g. \"3,6\", it will end" - "the rendering at the second value", + " from another, specified by its index. If you pass" + " in two comma separated values, e.g. \"3,6\", it will end" + " the rendering at the second value", ) parser.add_argument( "-r", "--resolution", @@ -125,20 +125,20 @@ def parse_cli(): ) parser.add_argument( "--media_dir", - help="directory to write media", + help="Directory to write media", ) video_group = parser.add_mutually_exclusive_group() video_group.add_argument( "--video_dir", - help="directory to write file tree for video", + help="Directory to write file tree for video", ) parser.add_argument( "--tex_dir", - help="directory to write tex", + help="Directory to write tex", ) parser.add_argument( "--text_dir", - help="directory to write text", + help="Directory to write text", ) return parser.parse_args() except argparse.ArgumentError as err: From 9280c23c5810bdbaf4dfbfab3f8241b2094953b2 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Tue, 26 May 2020 10:07:14 +0530 Subject: [PATCH 90/98] Update pycairoInstall.py --- Scripts/pycairoInstall.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Scripts/pycairoInstall.py b/Scripts/pycairoInstall.py index 2dc37239b9..44e7eed652 100644 --- a/Scripts/pycairoInstall.py +++ b/Scripts/pycairoInstall.py @@ -1,13 +1,25 @@ -#This script install pycairo. - import platform import os import sys import urllib.request if 'Windows' in platform.system(): + #In case the python version is 3.6 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + if sys.version[:3]=='3.6' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win32.whl", "pycairo-1.19.1-cp36-cp36m-win32.whl") + os.system("pip install pycairo-1.19.1-cp36-cp36m-win32.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") + + #In case the python version is 3.6 and the system is 64-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + elif sys.version[:3]=='3.6' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win_amd64.whl", "pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + os.remove("pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + #In case the python version is 3.7 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo - if sys.version[:3]=='3.7' and platform.machine()=='x86': + elif sys.version[:3]=='3.7' and platform.machine()=='x86': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win32.whl", "pycairo-1.19.1-cp37-cp37m-win32.whl") print("Sucessfully downloaded Cairo for your system") print("Installing Cairo") @@ -36,4 +48,4 @@ print("Sucessfully downloaded Cairo for your system") print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp38-cp38-win_amd64.whl") - os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") From 42a80af638abbd80b3c05578c02dc9e907d4162a Mon Sep 17 00:00:00 2001 From: Aathish Sivasubrahmanian Date: Tue, 26 May 2020 17:51:21 +0530 Subject: [PATCH 91/98] Fixes #91 --- Scripts/pycairoInstall.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Scripts/pycairoInstall.py b/Scripts/pycairoInstall.py index 44e7eed652..4831a60508 100644 --- a/Scripts/pycairoInstall.py +++ b/Scripts/pycairoInstall.py @@ -17,7 +17,7 @@ print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp36-cp36m-win_amd64.whl") os.remove("pycairo-1.19.1-cp36-cp36m-win_amd64.whl") - + #In case the python version is 3.7 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo elif sys.version[:3]=='3.7' and platform.machine()=='x86': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win32.whl", "pycairo-1.19.1-cp37-cp37m-win32.whl") @@ -33,7 +33,7 @@ print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") - + #In case the python version is 3.8 and the system is 32-bit, try pycairo-1.19.1-cp38-cp38-win32.whl version of cairo elif sys.version[:3]=='3.8' and platform.machine()=='x86': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win32.whl", "pycairo-1.19.1-cp38-cp38-win32.whl") @@ -41,11 +41,11 @@ print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp38-cp38-win32.whl") os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") - + #In case the python version is 3.8 and the system is AMD64, try pycairo-1.19.1-cp38-cp38-win_amd64.whl version of cairo elif sys.version[:3]=='3.8' and platform.machine()=='AMD64': urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win_amd64.whl", "pycairo-1.19.1-cp38-cp38-win_amd64.whl") print("Sucessfully downloaded Cairo for your system") print("Installing Cairo") os.system("pip install pycairo-1.19.1-cp38-cp38-win_amd64.whl") - os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") From 4192e573ebc588b542c36b7e879a697025ff72e3 Mon Sep 17 00:00:00 2001 From: Aathish Sivasubrahmanian Date: Tue, 26 May 2020 18:09:50 +0530 Subject: [PATCH 92/98] Complete removal of pycairoinstall.py This is temporary. It will be added shortly. --- Scripts/pycairoInstall.py | 51 --------------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 Scripts/pycairoInstall.py diff --git a/Scripts/pycairoInstall.py b/Scripts/pycairoInstall.py deleted file mode 100644 index 4831a60508..0000000000 --- a/Scripts/pycairoInstall.py +++ /dev/null @@ -1,51 +0,0 @@ -import platform -import os -import sys -import urllib.request - -if 'Windows' in platform.system(): - #In case the python version is 3.6 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo - if sys.version[:3]=='3.6' and platform.machine()=='x86': - urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win32.whl", "pycairo-1.19.1-cp36-cp36m-win32.whl") - os.system("pip install pycairo-1.19.1-cp36-cp36m-win32.whl") - os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") - - #In case the python version is 3.6 and the system is 64-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo - elif sys.version[:3]=='3.6' and platform.machine()=='AMD64': - urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win_amd64.whl", "pycairo-1.19.1-cp36-cp36m-win_amd64.whl") - print("Sucessfully downloaded Cairo for your system") - print("Installing Cairo") - os.system("pip install pycairo-1.19.1-cp36-cp36m-win_amd64.whl") - os.remove("pycairo-1.19.1-cp36-cp36m-win_amd64.whl") - - #In case the python version is 3.7 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo - elif sys.version[:3]=='3.7' and platform.machine()=='x86': - urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win32.whl", "pycairo-1.19.1-cp37-cp37m-win32.whl") - print("Sucessfully downloaded Cairo for your system") - print("Installing Cairo") - os.system("pip install pycairo-1.19.1-cp37-cp37m-win32.whl") - os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") - - #In case the python version is 3.7 and the system is AMD64, try pycairo-1.19.1-cp37-cp37m-win_amd64.whl version of cairo - elif sys.version[:3]=='3.7' and platform.machine()=='AMD64': - urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win_amd64.whl", "pycairo-1.19.1-cp37-cp37m-win_amd64.whl") - print("Sucessfully downloaded Cairo for your system") - print("Installing Cairo") - os.system("pip install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") - os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") - - #In case the python version is 3.8 and the system is 32-bit, try pycairo-1.19.1-cp38-cp38-win32.whl version of cairo - elif sys.version[:3]=='3.8' and platform.machine()=='x86': - urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win32.whl", "pycairo-1.19.1-cp38-cp38-win32.whl") - print("Sucessfully downloaded Cairo for your system") - print("Installing Cairo") - os.system("pip install pycairo-1.19.1-cp38-cp38-win32.whl") - os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") - - #In case the python version is 3.8 and the system is AMD64, try pycairo-1.19.1-cp38-cp38-win_amd64.whl version of cairo - elif sys.version[:3]=='3.8' and platform.machine()=='AMD64': - urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win_amd64.whl", "pycairo-1.19.1-cp38-cp38-win_amd64.whl") - print("Sucessfully downloaded Cairo for your system") - print("Installing Cairo") - os.system("pip install pycairo-1.19.1-cp38-cp38-win_amd64.whl") - os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") From 3aa8dac0eb7ab3e2ab92f6de138d79099d7f1387 Mon Sep 17 00:00:00 2001 From: Aathish Sivasubrahmanian Date: Tue, 26 May 2020 18:11:39 +0530 Subject: [PATCH 93/98] Put pycairoinstall.py in newly named scripts folder. --- scripts/pycairoinstall.py | 51 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 scripts/pycairoinstall.py diff --git a/scripts/pycairoinstall.py b/scripts/pycairoinstall.py new file mode 100644 index 0000000000..44e7eed652 --- /dev/null +++ b/scripts/pycairoinstall.py @@ -0,0 +1,51 @@ +import platform +import os +import sys +import urllib.request + +if 'Windows' in platform.system(): + #In case the python version is 3.6 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + if sys.version[:3]=='3.6' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win32.whl", "pycairo-1.19.1-cp36-cp36m-win32.whl") + os.system("pip install pycairo-1.19.1-cp36-cp36m-win32.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") + + #In case the python version is 3.6 and the system is 64-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + elif sys.version[:3]=='3.6' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp36-cp36m-win_amd64.whl", "pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + os.remove("pycairo-1.19.1-cp36-cp36m-win_amd64.whl") + + #In case the python version is 3.7 and the system is 32-bit, try pycairo‑1.19.1‑cp37‑cp37m‑win32.whl version of cairo + elif sys.version[:3]=='3.7' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win32.whl", "pycairo-1.19.1-cp37-cp37m-win32.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp37-cp37m-win32.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win32.whl") + + #In case the python version is 3.7 and the system is AMD64, try pycairo-1.19.1-cp37-cp37m-win_amd64.whl version of cairo + elif sys.version[:3]=='3.7' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp37-cp37m-win_amd64.whl", "pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + os.remove("pycairo-1.19.1-cp37-cp37m-win_amd64.whl") + + #In case the python version is 3.8 and the system is 32-bit, try pycairo-1.19.1-cp38-cp38-win32.whl version of cairo + elif sys.version[:3]=='3.8' and platform.machine()=='x86': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win32.whl", "pycairo-1.19.1-cp38-cp38-win32.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp38-cp38-win32.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win32.whl") + + #In case the python version is 3.8 and the system is AMD64, try pycairo-1.19.1-cp38-cp38-win_amd64.whl version of cairo + elif sys.version[:3]=='3.8' and platform.machine()=='AMD64': + urllib.request.urlretrieve("https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pycairo-1.19.1-cp38-cp38-win_amd64.whl", "pycairo-1.19.1-cp38-cp38-win_amd64.whl") + print("Sucessfully downloaded Cairo for your system") + print("Installing Cairo") + os.system("pip install pycairo-1.19.1-cp38-cp38-win_amd64.whl") + os.remove("pycairo-1.19.1-cp38-cp38-win_amd64.whl") From 506cf799c7bfd4001c67b6ac3e05d1a826eeb4d6 Mon Sep 17 00:00:00 2001 From: Aathish Date: Tue, 26 May 2020 19:29:30 +0530 Subject: [PATCH 94/98] Update name of PyCairo Installation script. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 165d9d47ee..1165b7f0f8 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Before installing `manim-community`, there are some additional dependencies that 6. Alternatively, Running the command below installs pycairo. This needs to be an elevated command prompt like Powershell. ```powershell - (Invoke-WebRequest -Uri https://raw.githubusercontent.com/ManimCommunity/manim/master/scripts/pycairoInstall.py -UseBasicParsing).Content | py -3 + (Invoke-WebRequest -Uri https://raw.githubusercontent.com/ManimCommunity/manim/master/scripts/pycairoinstall.py -UseBasicParsing).Content | py -3 ``` From 9f88d6e242a174b5ba6907618a56cecbe8adacb0 Mon Sep 17 00:00:00 2001 From: leotrs Date: Wed, 27 May 2020 12:36:32 -0400 Subject: [PATCH 95/98] remove scene_from_video and opencv. closes #85 --- manim/scene/scene_from_video.py | 54 --------------------------------- requirements.txt | 1 - setup.py | 1 - 3 files changed, 56 deletions(-) delete mode 100644 manim/scene/scene_from_video.py diff --git a/manim/scene/scene_from_video.py b/manim/scene/scene_from_video.py deleted file mode 100644 index 1e21251407..0000000000 --- a/manim/scene/scene_from_video.py +++ /dev/null @@ -1,54 +0,0 @@ -# from tqdm import tqdm as show_progress -# import cv2 - -# from ..scene.scene import Scene -# from ..logger import logger - - -# # TODO, is this depricated? -# class SceneFromVideo(Scene): -# def construct(self, file_name, -# freeze_last_frame=True, -# time_range=None): -# cap = cv2.VideoCapture(file_name) -# self.shape = ( -# int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)), -# int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)) -# ) -# fps = cap.get(cv2.cv.CV_CAP_PROP_FPS) -# self.camera.frame_rate = fps -# frame_count = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)) -# if time_range is None: -# start_frame = 0 -# end_frame = frame_count -# else: -# start_frame, end_frame = [fps * t for t in time_range] - -# frame_count = end_frame - start_frame -# logger.info("Reading in " + file_name + "...") -# for count in show_progress(list(range(start_frame, end_frame + 1))): -# returned, frame = cap.read() -# if not returned: -# break -# # b, g, r = cv2.split(frame) -# # self.frames.append(cv2.merge([r, g, b])) -# self.frames.append(frame) -# cap.release() - -# if freeze_last_frame and len(self.frames) > 0: -# self.original_background = self.background = self.frames[-1] - -# def apply_gaussian_blur(self, ksize=(5, 5), sigmaX=5): -# self.frames = [ -# cv2.GaussianBlur(frame, ksize, sigmaX) -# for frame in self.frames -# ] - -# def apply_edge_detection(self, threshold1=50, threshold2=100): -# edged_frames = [ -# cv2.Canny(frame, threshold1, threshold2) -# for frame in self.frames -# ] -# for index in range(len(self.frames)): -# for i in range(3): -# self.frames[index][:, :, i] = edged_frames[index] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 4221c80dc5..53f34a4ac8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,6 @@ Pillow progressbar scipy tqdm -# opencv-python pycairo pydub pygments diff --git a/setup.py b/setup.py index 15a0c90a3a..018bf1ebcb 100755 --- a/setup.py +++ b/setup.py @@ -21,7 +21,6 @@ "progressbar", "scipy", "tqdm", - "opencv-python", "pycairo", "pydub", "pygments", From 00163e30b15cb4fcad5de45c49f9593e450bd953 Mon Sep 17 00:00:00 2001 From: leotrs Date: Wed, 27 May 2020 12:37:03 -0400 Subject: [PATCH 96/98] remove manim/files since it is specific to 3b1b --- manim/files/Bubbles_speech.svg | 11 ----------- manim/files/Bubbles_thought.svg | 18 ------------------ manim/files/PiCreatures_plain.svg | 24 ------------------------ 3 files changed, 53 deletions(-) delete mode 100644 manim/files/Bubbles_speech.svg delete mode 100644 manim/files/Bubbles_thought.svg delete mode 100644 manim/files/PiCreatures_plain.svg diff --git a/manim/files/Bubbles_speech.svg b/manim/files/Bubbles_speech.svg deleted file mode 100644 index 173ebf3530..0000000000 --- a/manim/files/Bubbles_speech.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/manim/files/Bubbles_thought.svg b/manim/files/Bubbles_thought.svg deleted file mode 100644 index c77ebca48c..0000000000 --- a/manim/files/Bubbles_thought.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/manim/files/PiCreatures_plain.svg b/manim/files/PiCreatures_plain.svg deleted file mode 100644 index 552043d67a..0000000000 --- a/manim/files/PiCreatures_plain.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - From 64339351489444d69d267e8e42c898cd40acb5d8 Mon Sep 17 00:00:00 2001 From: leotrs Date: Wed, 27 May 2020 14:07:55 -0400 Subject: [PATCH 97/98] remove one more file --- manim/scene/media_dir.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 manim/scene/media_dir.txt diff --git a/manim/scene/media_dir.txt b/manim/scene/media_dir.txt deleted file mode 100644 index 27949aaf30..0000000000 --- a/manim/scene/media_dir.txt +++ /dev/null @@ -1 +0,0 @@ -media \ No newline at end of file From 6ce34fc321c5eccd115204206e40d330b2ce793e Mon Sep 17 00:00:00 2001 From: leotrs Date: Wed, 27 May 2020 14:15:54 -0400 Subject: [PATCH 98/98] delete importing removed file --- manim/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/manim/__init__.py b/manim/__init__.py index 2c56030b44..48403e23ed 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -51,7 +51,6 @@ 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 *