manim 0.17.0__py3-none-any.whl → 0.19.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- manim/__init__.py +11 -6
- manim/__main__.py +62 -19
- manim/_config/__init__.py +10 -9
- manim/_config/cli_colors.py +26 -9
- manim/_config/default.cfg +1 -3
- manim/_config/logger_utils.py +23 -13
- manim/_config/utils.py +662 -468
- manim/animation/animation.py +164 -18
- manim/animation/changing.py +34 -23
- manim/animation/composition.py +265 -67
- manim/animation/creation.py +208 -26
- manim/animation/fading.py +16 -18
- manim/animation/growing.py +35 -15
- manim/animation/indication.py +150 -76
- manim/animation/movement.py +56 -22
- manim/animation/numbers.py +64 -6
- manim/animation/rotation.py +78 -7
- manim/animation/specialized.py +6 -7
- manim/animation/speedmodifier.py +13 -10
- manim/animation/transform.py +14 -11
- manim/animation/transform_matching_parts.py +3 -4
- manim/animation/updaters/mobject_update_utils.py +152 -30
- manim/animation/updaters/update.py +10 -7
- manim/camera/camera.py +182 -118
- manim/camera/mapping_camera.py +34 -3
- manim/camera/moving_camera.py +95 -74
- manim/camera/multi_camera.py +23 -15
- manim/camera/three_d_camera.py +70 -52
- manim/cli/__init__.py +17 -0
- manim/cli/cfg/group.py +76 -44
- manim/cli/checkhealth/checks.py +192 -0
- manim/cli/checkhealth/commands.py +90 -0
- manim/cli/default_group.py +158 -25
- manim/cli/init/commands.py +33 -25
- manim/cli/plugins/commands.py +16 -3
- manim/cli/render/commands.py +72 -60
- manim/cli/render/ease_of_access_options.py +4 -3
- manim/cli/render/global_options.py +59 -17
- manim/cli/render/output_options.py +6 -5
- manim/cli/render/render_options.py +98 -33
- manim/constants.py +109 -59
- manim/data_structures.py +31 -0
- manim/mobject/frame.py +8 -5
- manim/mobject/geometry/__init__.py +1 -0
- manim/mobject/geometry/arc.py +277 -135
- manim/mobject/geometry/boolean_ops.py +32 -31
- manim/mobject/geometry/labeled.py +376 -0
- manim/mobject/geometry/line.py +192 -87
- manim/mobject/geometry/polygram.py +224 -58
- manim/mobject/geometry/shape_matchers.py +61 -25
- manim/mobject/geometry/tips.py +122 -48
- manim/mobject/graph.py +1027 -419
- manim/mobject/graphing/coordinate_systems.py +533 -278
- manim/mobject/graphing/functions.py +53 -32
- manim/mobject/graphing/number_line.py +123 -65
- manim/mobject/graphing/probability.py +88 -62
- manim/mobject/graphing/scale.py +33 -19
- manim/mobject/logo.py +118 -28
- manim/mobject/matrix.py +87 -83
- manim/mobject/mobject.py +912 -442
- manim/mobject/opengl/dot_cloud.py +16 -5
- manim/mobject/opengl/opengl_compatibility.py +4 -2
- manim/mobject/opengl/opengl_geometry.py +254 -153
- manim/mobject/opengl/opengl_image_mobject.py +3 -1
- manim/mobject/opengl/opengl_mobject.py +779 -482
- manim/mobject/opengl/opengl_point_cloud_mobject.py +41 -14
- manim/mobject/opengl/opengl_surface.py +14 -92
- manim/mobject/opengl/opengl_three_dimensions.py +12 -8
- manim/mobject/opengl/opengl_vectorized_mobject.py +98 -100
- manim/mobject/svg/brace.py +173 -41
- manim/mobject/svg/svg_mobject.py +139 -53
- manim/mobject/table.py +61 -68
- manim/mobject/text/code_mobject.py +193 -539
- manim/mobject/text/numbers.py +81 -34
- manim/mobject/text/tex_mobject.py +130 -78
- manim/mobject/text/text_mobject.py +288 -164
- manim/mobject/three_d/polyhedra.py +111 -13
- manim/mobject/three_d/three_d_utils.py +17 -8
- manim/mobject/three_d/three_dimensions.py +239 -106
- manim/mobject/types/image_mobject.py +50 -30
- manim/mobject/types/point_cloud_mobject.py +120 -75
- manim/mobject/types/vectorized_mobject.py +841 -408
- manim/mobject/value_tracker.py +105 -38
- manim/mobject/vector_field.py +50 -31
- manim/opengl/__init__.py +3 -3
- manim/plugins/__init__.py +14 -1
- manim/plugins/plugins_flags.py +10 -14
- manim/renderer/cairo_renderer.py +65 -50
- manim/renderer/opengl_renderer.py +89 -69
- manim/renderer/opengl_renderer_window.py +39 -18
- manim/renderer/shader.py +123 -87
- manim/renderer/shader_wrapper.py +44 -28
- manim/renderer/vectorized_mobject_rendering.py +38 -10
- manim/scene/moving_camera_scene.py +32 -3
- manim/scene/scene.py +507 -242
- manim/scene/scene_file_writer.py +371 -220
- manim/scene/section.py +20 -16
- manim/scene/three_d_scene.py +14 -22
- manim/scene/vector_space_scene.py +223 -129
- manim/scene/zoomed_scene.py +46 -41
- manim/typing.py +990 -0
- manim/utils/bezier.py +1823 -371
- manim/utils/caching.py +12 -5
- manim/utils/color/AS2700.py +236 -0
- manim/utils/color/BS381.py +318 -0
- manim/utils/color/DVIPSNAMES.py +96 -0
- manim/utils/color/SVGNAMES.py +179 -0
- manim/utils/color/X11.py +533 -0
- manim/utils/color/XKCD.py +952 -0
- manim/utils/color/__init__.py +61 -0
- manim/utils/color/core.py +1667 -0
- manim/utils/color/manim_colors.py +218 -0
- manim/utils/commands.py +48 -20
- manim/utils/config_ops.py +39 -19
- manim/utils/debug.py +8 -7
- manim/utils/deprecation.py +86 -39
- manim/utils/docbuild/__init__.py +17 -0
- manim/utils/docbuild/autoaliasattr_directive.py +236 -0
- manim/utils/docbuild/autocolor_directive.py +99 -0
- manim/utils/docbuild/manim_directive.py +94 -41
- manim/utils/docbuild/module_parsing.py +245 -0
- manim/utils/exceptions.py +6 -0
- manim/utils/family.py +5 -3
- manim/utils/family_ops.py +17 -4
- manim/utils/file_ops.py +27 -17
- manim/utils/hashing.py +55 -45
- manim/utils/images.py +13 -7
- manim/utils/ipython_magic.py +13 -7
- manim/utils/iterables.py +163 -120
- manim/utils/module_ops.py +66 -24
- manim/utils/opengl.py +77 -24
- manim/utils/parameter_parsing.py +32 -0
- manim/utils/paths.py +30 -33
- manim/utils/polylabel.py +235 -0
- manim/utils/qhull.py +218 -0
- manim/utils/rate_functions.py +98 -32
- manim/utils/simple_functions.py +25 -33
- manim/utils/sounds.py +7 -1
- manim/utils/space_ops.py +188 -115
- manim/utils/testing/__init__.py +17 -0
- manim/utils/testing/_frames_testers.py +13 -8
- manim/utils/testing/_show_diff.py +5 -3
- manim/utils/testing/_test_class_makers.py +34 -18
- manim/utils/testing/frames_comparison.py +37 -19
- manim/utils/tex.py +130 -198
- manim/utils/tex_file_writing.py +77 -47
- manim/utils/tex_templates.py +2 -1
- manim/utils/unit.py +6 -5
- {manim-0.17.0.dist-info → manim-0.19.1.dist-info}/METADATA +64 -65
- manim-0.19.1.dist-info/RECORD +220 -0
- {manim-0.17.0.dist-info → manim-0.19.1.dist-info}/WHEEL +1 -1
- manim-0.19.1.dist-info/entry_points.txt +3 -0
- {manim-0.17.0.dist-info → manim-0.19.1.dist-info/licenses}/LICENSE.community +1 -1
- manim/cli/new/group.py +0 -189
- manim/communitycolors.py +0 -9
- manim/gui/__init__.py +0 -0
- manim/gui/gui.py +0 -82
- manim/plugins/import_plugins.py +0 -43
- manim/utils/color.py +0 -552
- manim-0.17.0.dist-info/RECORD +0 -206
- manim-0.17.0.dist-info/entry_points.txt +0 -4
- /manim/cli/{new → checkhealth}/__init__.py +0 -0
- {manim-0.17.0.dist-info → manim-0.19.1.dist-info/licenses}/LICENSE +0 -0
manim/utils/tex_file_writing.py
CHANGED
|
@@ -9,17 +9,22 @@
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
11
|
import hashlib
|
|
12
|
-
import os
|
|
13
12
|
import re
|
|
13
|
+
import subprocess
|
|
14
14
|
import unicodedata
|
|
15
|
+
from collections.abc import Generator, Iterable, Sequence
|
|
15
16
|
from pathlib import Path
|
|
17
|
+
from re import Match
|
|
18
|
+
from typing import Any
|
|
16
19
|
|
|
17
20
|
from manim.utils.tex import TexTemplate
|
|
18
21
|
|
|
19
22
|
from .. import config, logger
|
|
20
23
|
|
|
24
|
+
__all__ = ["tex_to_svg_file"]
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
|
|
27
|
+
def tex_hash(expression: Any) -> str:
|
|
23
28
|
id_str = str(expression)
|
|
24
29
|
hasher = hashlib.sha256()
|
|
25
30
|
hasher.update(id_str.encode())
|
|
@@ -31,8 +36,8 @@ def tex_to_svg_file(
|
|
|
31
36
|
expression: str,
|
|
32
37
|
environment: str | None = None,
|
|
33
38
|
tex_template: TexTemplate | None = None,
|
|
34
|
-
):
|
|
35
|
-
"""Takes a tex expression and returns the svg version of the compiled tex
|
|
39
|
+
) -> Path:
|
|
40
|
+
r"""Takes a tex expression and returns the svg version of the compiled tex
|
|
36
41
|
|
|
37
42
|
Parameters
|
|
38
43
|
----------
|
|
@@ -51,20 +56,29 @@ def tex_to_svg_file(
|
|
|
51
56
|
if tex_template is None:
|
|
52
57
|
tex_template = config["tex_template"]
|
|
53
58
|
tex_file = generate_tex_file(expression, environment, tex_template)
|
|
59
|
+
|
|
60
|
+
# check if svg already exists
|
|
61
|
+
svg_file = tex_file.with_suffix(".svg")
|
|
62
|
+
if svg_file.exists():
|
|
63
|
+
return svg_file
|
|
64
|
+
|
|
54
65
|
dvi_file = compile_tex(
|
|
55
66
|
tex_file,
|
|
56
67
|
tex_template.tex_compiler,
|
|
57
68
|
tex_template.output_format,
|
|
58
69
|
)
|
|
59
|
-
|
|
70
|
+
svg_file = convert_to_svg(dvi_file, tex_template.output_format)
|
|
71
|
+
if not config["no_latex_cleanup"]:
|
|
72
|
+
delete_nonsvg_files()
|
|
73
|
+
return svg_file
|
|
60
74
|
|
|
61
75
|
|
|
62
76
|
def generate_tex_file(
|
|
63
77
|
expression: str,
|
|
64
78
|
environment: str | None = None,
|
|
65
79
|
tex_template: TexTemplate | None = None,
|
|
66
|
-
):
|
|
67
|
-
"""Takes a tex expression (and an optional tex environment),
|
|
80
|
+
) -> Path:
|
|
81
|
+
r"""Takes a tex expression (and an optional tex environment),
|
|
68
82
|
and returns a fully formed tex file ready for compilation.
|
|
69
83
|
|
|
70
84
|
Parameters
|
|
@@ -102,10 +116,11 @@ def generate_tex_file(
|
|
|
102
116
|
return result
|
|
103
117
|
|
|
104
118
|
|
|
105
|
-
def
|
|
119
|
+
def make_tex_compilation_command(
|
|
106
120
|
tex_compiler: str, output_format: str, tex_file: Path, tex_dir: Path
|
|
107
|
-
) -> str:
|
|
108
|
-
"""Prepares the
|
|
121
|
+
) -> list[str]:
|
|
122
|
+
"""Prepares the TeX compilation command, i.e. the TeX compiler name
|
|
123
|
+
and all necessary CLI flags.
|
|
109
124
|
|
|
110
125
|
Parameters
|
|
111
126
|
----------
|
|
@@ -120,50 +135,46 @@ def tex_compilation_command(
|
|
|
120
135
|
|
|
121
136
|
Returns
|
|
122
137
|
-------
|
|
123
|
-
:class:`str`
|
|
138
|
+
:class:`list[str]`
|
|
124
139
|
Compilation command according to given parameters
|
|
125
140
|
"""
|
|
126
141
|
if tex_compiler in {"latex", "pdflatex", "luatex", "lualatex"}:
|
|
127
|
-
|
|
142
|
+
command = [
|
|
128
143
|
tex_compiler,
|
|
129
144
|
"-interaction=batchmode",
|
|
130
|
-
f
|
|
145
|
+
f"-output-format={output_format[1:]}",
|
|
131
146
|
"-halt-on-error",
|
|
132
|
-
f
|
|
133
|
-
f
|
|
134
|
-
">",
|
|
135
|
-
os.devnull,
|
|
147
|
+
f"-output-directory={tex_dir.as_posix()}",
|
|
148
|
+
f"{tex_file.as_posix()}",
|
|
136
149
|
]
|
|
137
150
|
elif tex_compiler == "xelatex":
|
|
138
151
|
if output_format == ".xdv":
|
|
139
|
-
outflag = "-no-pdf"
|
|
152
|
+
outflag = ["-no-pdf"]
|
|
140
153
|
elif output_format == ".pdf":
|
|
141
|
-
outflag =
|
|
154
|
+
outflag = []
|
|
142
155
|
else:
|
|
143
156
|
raise ValueError("xelatex output is either pdf or xdv")
|
|
144
|
-
|
|
157
|
+
command = [
|
|
145
158
|
"xelatex",
|
|
146
|
-
outflag,
|
|
159
|
+
*outflag,
|
|
147
160
|
"-interaction=batchmode",
|
|
148
161
|
"-halt-on-error",
|
|
149
|
-
f
|
|
150
|
-
f
|
|
151
|
-
">",
|
|
152
|
-
os.devnull,
|
|
162
|
+
f"-output-directory={tex_dir.as_posix()}",
|
|
163
|
+
f"{tex_file.as_posix()}",
|
|
153
164
|
]
|
|
154
165
|
else:
|
|
155
166
|
raise ValueError(f"Tex compiler {tex_compiler} unknown.")
|
|
156
|
-
return
|
|
167
|
+
return command
|
|
157
168
|
|
|
158
169
|
|
|
159
|
-
def insight_inputenc_error(matching):
|
|
170
|
+
def insight_inputenc_error(matching: Match[str]) -> Generator[str]:
|
|
160
171
|
code_point = chr(int(matching[1], 16))
|
|
161
172
|
name = unicodedata.name(code_point)
|
|
162
173
|
yield f"TexTemplate does not support character '{name}' (U+{matching[1]})."
|
|
163
174
|
yield "See the documentation for manim.mobject.svg.tex_mobject for details on using a custom TexTemplate."
|
|
164
175
|
|
|
165
176
|
|
|
166
|
-
def insight_package_not_found_error(matching):
|
|
177
|
+
def insight_package_not_found_error(matching: Match[str]) -> Generator[str]:
|
|
167
178
|
yield f"You do not have package {matching[1]} installed."
|
|
168
179
|
yield f"Install {matching[1]} it using your LaTeX package manager, or check for typos."
|
|
169
180
|
|
|
@@ -188,14 +199,14 @@ def compile_tex(tex_file: Path, tex_compiler: str, output_format: str) -> Path:
|
|
|
188
199
|
result = tex_file.with_suffix(output_format)
|
|
189
200
|
tex_dir = config.get_dir("tex_dir")
|
|
190
201
|
if not result.exists():
|
|
191
|
-
command =
|
|
202
|
+
command = make_tex_compilation_command(
|
|
192
203
|
tex_compiler,
|
|
193
204
|
output_format,
|
|
194
205
|
tex_file,
|
|
195
206
|
tex_dir,
|
|
196
207
|
)
|
|
197
|
-
|
|
198
|
-
if
|
|
208
|
+
cp = subprocess.run(command, stdout=subprocess.DEVNULL)
|
|
209
|
+
if cp.returncode != 0:
|
|
199
210
|
log_file = tex_file.with_suffix(".log")
|
|
200
211
|
print_all_tex_errors(log_file, tex_compiler, tex_file)
|
|
201
212
|
raise ValueError(
|
|
@@ -206,7 +217,7 @@ def compile_tex(tex_file: Path, tex_compiler: str, output_format: str) -> Path:
|
|
|
206
217
|
return result
|
|
207
218
|
|
|
208
219
|
|
|
209
|
-
def convert_to_svg(dvi_file: Path, extension: str, page: int = 1):
|
|
220
|
+
def convert_to_svg(dvi_file: Path, extension: str, page: int = 1) -> Path:
|
|
210
221
|
"""Converts a .dvi, .xdv, or .pdf file into an svg using dvisvgm.
|
|
211
222
|
|
|
212
223
|
Parameters
|
|
@@ -225,18 +236,16 @@ def convert_to_svg(dvi_file: Path, extension: str, page: int = 1):
|
|
|
225
236
|
"""
|
|
226
237
|
result = dvi_file.with_suffix(".svg")
|
|
227
238
|
if not result.exists():
|
|
228
|
-
|
|
239
|
+
command = [
|
|
229
240
|
"dvisvgm",
|
|
230
|
-
"--pdf" if extension == ".pdf" else
|
|
231
|
-
"
|
|
232
|
-
|
|
233
|
-
"
|
|
234
|
-
"
|
|
235
|
-
|
|
236
|
-
">",
|
|
237
|
-
os.devnull,
|
|
241
|
+
*(["--pdf"] if extension == ".pdf" else []),
|
|
242
|
+
f"--page={page}",
|
|
243
|
+
"--no-fonts",
|
|
244
|
+
"--verbosity=0",
|
|
245
|
+
f"--output={result.as_posix()}",
|
|
246
|
+
f"{dvi_file.as_posix()}",
|
|
238
247
|
]
|
|
239
|
-
|
|
248
|
+
subprocess.run(command, stdout=subprocess.DEVNULL)
|
|
240
249
|
|
|
241
250
|
# if the file does not exist now, this means conversion failed
|
|
242
251
|
if not result.exists():
|
|
@@ -244,12 +253,29 @@ def convert_to_svg(dvi_file: Path, extension: str, page: int = 1):
|
|
|
244
253
|
f"Your installation does not support converting {dvi_file.suffix} files to SVG."
|
|
245
254
|
f" Consider updating dvisvgm to at least version 2.4."
|
|
246
255
|
f" If this does not solve the problem, please refer to our troubleshooting guide at:"
|
|
247
|
-
f" https://docs.manim.community/en/stable/
|
|
256
|
+
f" https://docs.manim.community/en/stable/faq/general.html#my-installation-"
|
|
257
|
+
f"does-not-support-converting-pdf-to-svg-help",
|
|
248
258
|
)
|
|
249
259
|
|
|
250
260
|
return result
|
|
251
261
|
|
|
252
262
|
|
|
263
|
+
def delete_nonsvg_files(additional_endings: Iterable[str] = ()) -> None:
|
|
264
|
+
"""Deletes every file that does not have a suffix in ``(".svg", ".tex", *additional_endings)``
|
|
265
|
+
|
|
266
|
+
Parameters
|
|
267
|
+
----------
|
|
268
|
+
additional_endings
|
|
269
|
+
Additional endings to whitelist
|
|
270
|
+
"""
|
|
271
|
+
tex_dir = config.get_dir("tex_dir")
|
|
272
|
+
file_suffix_whitelist = {".svg", ".tex", *additional_endings}
|
|
273
|
+
|
|
274
|
+
for f in tex_dir.iterdir():
|
|
275
|
+
if f.suffix not in file_suffix_whitelist:
|
|
276
|
+
f.unlink()
|
|
277
|
+
|
|
278
|
+
|
|
253
279
|
def print_all_tex_errors(log_file: Path, tex_compiler: str, tex_file: Path) -> None:
|
|
254
280
|
if not log_file.exists():
|
|
255
281
|
raise RuntimeError(
|
|
@@ -262,7 +288,7 @@ def print_all_tex_errors(log_file: Path, tex_compiler: str, tex_file: Path) -> N
|
|
|
262
288
|
index for index, line in enumerate(tex_compilation_log) if line.startswith("!")
|
|
263
289
|
]
|
|
264
290
|
if error_indices:
|
|
265
|
-
with tex_file.open() as f:
|
|
291
|
+
with tex_file.open(encoding="utf-8") as f:
|
|
266
292
|
tex = f.readlines()
|
|
267
293
|
for error_index in error_indices:
|
|
268
294
|
print_tex_error(tex_compilation_log, error_index, tex)
|
|
@@ -280,7 +306,11 @@ LATEX_ERROR_INSIGHTS = [
|
|
|
280
306
|
]
|
|
281
307
|
|
|
282
308
|
|
|
283
|
-
def print_tex_error(
|
|
309
|
+
def print_tex_error(
|
|
310
|
+
tex_compilation_log: Sequence[str],
|
|
311
|
+
error_start_index: int,
|
|
312
|
+
tex_source: Sequence[str],
|
|
313
|
+
) -> None:
|
|
284
314
|
logger.error(
|
|
285
315
|
f"LaTeX compilation error: {tex_compilation_log[error_start_index][2:]}",
|
|
286
316
|
)
|
|
@@ -314,8 +344,8 @@ def print_tex_error(tex_compilation_log, error_start_index, tex_source):
|
|
|
314
344
|
context += tex_source[line_of_tex_error - 3 : line_of_tex_error + 3]
|
|
315
345
|
context[-4] = "-> " + context[-4]
|
|
316
346
|
|
|
317
|
-
|
|
318
|
-
logger.error(
|
|
347
|
+
context_joined = "".join(context)
|
|
348
|
+
logger.error(context_joined)
|
|
319
349
|
|
|
320
350
|
for insights in LATEX_ERROR_INSIGHTS:
|
|
321
351
|
prob, get_insight = insights
|
manim/utils/tex_templates.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""A library of LaTeX templates."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
__all__ = [
|
|
@@ -11,7 +12,7 @@ from .tex import *
|
|
|
11
12
|
# This file makes TexTemplateLibrary and TexFontTemplates available for use in manim Tex and MathTex objects.
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
def _new_ams_template():
|
|
15
|
+
def _new_ams_template() -> TexTemplate:
|
|
15
16
|
"""Returns a simple Tex Template with only basic AMS packages"""
|
|
16
17
|
preamble = r"""
|
|
17
18
|
\usepackage[english]{babel}
|
manim/utils/unit.py
CHANGED
|
@@ -5,20 +5,21 @@ from __future__ import annotations
|
|
|
5
5
|
import numpy as np
|
|
6
6
|
|
|
7
7
|
from .. import config, constants
|
|
8
|
+
from ..typing import Vector3D
|
|
8
9
|
|
|
9
10
|
__all__ = ["Pixels", "Degrees", "Munits", "Percent"]
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class _PixelUnits:
|
|
13
|
-
def __mul__(self, val):
|
|
14
|
+
def __mul__(self, val: float) -> float:
|
|
14
15
|
return val * config.frame_width / config.pixel_width
|
|
15
16
|
|
|
16
|
-
def __rmul__(self, val):
|
|
17
|
+
def __rmul__(self, val: float) -> float:
|
|
17
18
|
return val * config.frame_width / config.pixel_width
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
class Percent:
|
|
21
|
-
def __init__(self, axis):
|
|
22
|
+
def __init__(self, axis: Vector3D) -> None:
|
|
22
23
|
if np.array_equal(axis, constants.X_AXIS):
|
|
23
24
|
self.length = config.frame_width
|
|
24
25
|
if np.array_equal(axis, constants.Y_AXIS):
|
|
@@ -26,10 +27,10 @@ class Percent:
|
|
|
26
27
|
if np.array_equal(axis, constants.Z_AXIS):
|
|
27
28
|
raise NotImplementedError("length of Z axis is undefined")
|
|
28
29
|
|
|
29
|
-
def __mul__(self, val):
|
|
30
|
+
def __mul__(self, val: float) -> float:
|
|
30
31
|
return val / 100 * self.length
|
|
31
32
|
|
|
32
|
-
def __rmul__(self, val):
|
|
33
|
+
def __rmul__(self, val: float) -> float:
|
|
33
34
|
return val / 100 * self.length
|
|
34
35
|
|
|
35
36
|
|
|
@@ -1,65 +1,63 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: manim
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.19.1
|
|
4
4
|
Summary: Animation engine for explanatory math videos.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
Project-URL: repository, https://github.com/manimcommunity/manim
|
|
6
|
+
Project-URL: documentation, https://docs.manim.community/
|
|
7
|
+
Project-URL: homepage, https://www.manim.community/
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/ManimCommunity/manim/issues
|
|
9
|
+
Project-URL: Changelog, https://docs.manim.community/en/stable/changelog.html
|
|
10
|
+
Project-URL: X / Twitter, https://x.com/manim_community
|
|
11
|
+
Project-URL: Bluesky, https://bsky.app/profile/manim.community
|
|
12
|
+
Project-URL: Discord, https://www.manim.community/discord/
|
|
13
|
+
Author-email: The Manim Community Developers <contact@manim.community>, Grant '3Blue1Brown' Sanderson <grant@3blue1brown.com>
|
|
14
|
+
License-Expression: MIT
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
License-File: LICENSE.community
|
|
10
17
|
Classifier: Development Status :: 4 - Beta
|
|
11
18
|
Classifier: License :: OSI Approved :: MIT License
|
|
12
19
|
Classifier: Natural Language :: English
|
|
13
|
-
Classifier: Programming Language :: Python :: 3
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
16
20
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
24
|
Classifier: Topic :: Multimedia :: Graphics
|
|
23
25
|
Classifier: Topic :: Multimedia :: Video
|
|
24
26
|
Classifier: Topic :: Scientific/Engineering
|
|
27
|
+
Requires-Python: >=3.10
|
|
28
|
+
Requires-Dist: audioop-lts>=0.2.1; python_full_version >= '3.13'
|
|
29
|
+
Requires-Dist: av<14.0.0,>=9.0.0
|
|
30
|
+
Requires-Dist: beautifulsoup4>=4.12
|
|
31
|
+
Requires-Dist: click>=8.0
|
|
32
|
+
Requires-Dist: cloup>=2.0.0
|
|
33
|
+
Requires-Dist: decorator>=4.3.2
|
|
34
|
+
Requires-Dist: isosurfaces>=0.1.0
|
|
35
|
+
Requires-Dist: manimpango<1.0.0,>=0.5.0
|
|
36
|
+
Requires-Dist: mapbox-earcut>=1.0.0
|
|
37
|
+
Requires-Dist: moderngl-window>=2.0.0
|
|
38
|
+
Requires-Dist: moderngl<6.0.0,>=5.0.0
|
|
39
|
+
Requires-Dist: networkx>=2.6
|
|
40
|
+
Requires-Dist: numpy>=2.0
|
|
41
|
+
Requires-Dist: numpy>=2.1; python_full_version >= '3.10'
|
|
42
|
+
Requires-Dist: pillow>=9.1
|
|
43
|
+
Requires-Dist: pycairo<2.0.0,>=1.13
|
|
44
|
+
Requires-Dist: pydub>=0.20.0
|
|
45
|
+
Requires-Dist: pygments>=2.0.0
|
|
46
|
+
Requires-Dist: rich>=12.0.0
|
|
47
|
+
Requires-Dist: scipy>=1.13.0
|
|
48
|
+
Requires-Dist: scipy>=1.14.0; python_full_version >= '3.13'
|
|
49
|
+
Requires-Dist: screeninfo>=0.7
|
|
50
|
+
Requires-Dist: skia-pathops>=0.7.0
|
|
51
|
+
Requires-Dist: srt>=3.0.0
|
|
52
|
+
Requires-Dist: svgelements>=1.8.0
|
|
53
|
+
Requires-Dist: tqdm>=4.0.0
|
|
54
|
+
Requires-Dist: typing-extensions>=4.12.0
|
|
55
|
+
Requires-Dist: watchdog>=2.0.0
|
|
25
56
|
Provides-Extra: gui
|
|
57
|
+
Requires-Dist: dearpygui>=1.0.0; extra == 'gui'
|
|
26
58
|
Provides-Extra: jupyterlab
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
29
|
-
Requires-Dist: backports.cached-property (>=1.0.1,<2.0.0); python_version < "3.8"
|
|
30
|
-
Requires-Dist: click (>=7.2,<=9.0)
|
|
31
|
-
Requires-Dist: click-default-group (>=1.2.2,<2.0.0)
|
|
32
|
-
Requires-Dist: cloup (>=0.13.0,<0.14.0)
|
|
33
|
-
Requires-Dist: colour (>=0.1.5,<0.2.0)
|
|
34
|
-
Requires-Dist: dearpygui (>=1.3.1,<2.0.0); extra == "gui"
|
|
35
|
-
Requires-Dist: decorator (>=5.0.7,<6.0.0)
|
|
36
|
-
Requires-Dist: importlib-metadata (>=4.10.0,<5.0.0); python_version < "3.8"
|
|
37
|
-
Requires-Dist: isosurfaces (==0.1.0)
|
|
38
|
-
Requires-Dist: jupyterlab (>=3.0,<4.0); extra == "jupyterlab"
|
|
39
|
-
Requires-Dist: manimpango (>=0.4.0.post0,<0.5.0)
|
|
40
|
-
Requires-Dist: mapbox-earcut (>=1.0.0,<2.0.0)
|
|
41
|
-
Requires-Dist: moderngl (>=5.6.3,<6.0.0)
|
|
42
|
-
Requires-Dist: moderngl-window (>=2.3.0,<3.0.0)
|
|
43
|
-
Requires-Dist: networkx (>=2.5,<3.0)
|
|
44
|
-
Requires-Dist: notebook (>=6.4,<7.0); extra == "jupyterlab"
|
|
45
|
-
Requires-Dist: numpy (>=1.19,<2.0)
|
|
46
|
-
Requires-Dist: pycairo (>=1.21,<2.0)
|
|
47
|
-
Requires-Dist: pydub (>=0.25.1,<0.26.0)
|
|
48
|
-
Requires-Dist: requests (>=2.26.0,<3.0.0)
|
|
49
|
-
Requires-Dist: rich (>=6.0,!=12.0.0)
|
|
50
|
-
Requires-Dist: scipy (>=1.7.3,<2.0.0)
|
|
51
|
-
Requires-Dist: screeninfo (>=0.8,<0.9)
|
|
52
|
-
Requires-Dist: skia-pathops (>=0.7.0,<0.8.0)
|
|
53
|
-
Requires-Dist: srt (>=3.5.0,<4.0.0)
|
|
54
|
-
Requires-Dist: svgelements (>=1.7.2,<2.0.0)
|
|
55
|
-
Requires-Dist: tqdm (>=4.62.3,<5.0.0)
|
|
56
|
-
Requires-Dist: watchdog (>=2.1.6,<3.0.0)
|
|
57
|
-
Project-URL: Bug Tracker, https://github.com/ManimCommunity/manim/issues
|
|
58
|
-
Project-URL: Changelog, https://docs.manim.community/en/stable/changelog.html
|
|
59
|
-
Project-URL: Documentation, https://docs.manim.community/
|
|
60
|
-
Project-URL: Discord, https://www.manim.community/discord/
|
|
61
|
-
Project-URL: Repository, https://github.com/manimcommunity/manim
|
|
62
|
-
Project-URL: Twitter, https://twitter.com/manim_community
|
|
59
|
+
Requires-Dist: jupyterlab>=4.3.4; extra == 'jupyterlab'
|
|
60
|
+
Requires-Dist: notebook>=7.3.2; extra == 'jupyterlab'
|
|
63
61
|
Description-Content-Type: text/markdown
|
|
64
62
|
|
|
65
63
|
<p align="center">
|
|
@@ -85,21 +83,23 @@ Description-Content-Type: text/markdown
|
|
|
85
83
|
|
|
86
84
|
Manim is an animation engine for explanatory math videos. It's used to create precise animations programmatically, as demonstrated in the videos of [3Blue1Brown](https://www.3blue1brown.com/).
|
|
87
85
|
|
|
88
|
-
> NOTE
|
|
86
|
+
> [!NOTE]
|
|
87
|
+
> The community edition of Manim (ManimCE) is a version maintained and developed by the community. It was forked from 3b1b/manim, a tool originally created and open-sourced by Grant Sanderson, also creator of the 3Blue1Brown educational math videos. While Grant Sanderson continues to maintain his own repository, we recommend this version for its continued development, improved features, enhanced documentation, and more active community-driven maintenance. If you would like to study how Grant makes his videos, head over to his repository ([3b1b/manim](https://github.com/3b1b/manim)).
|
|
89
88
|
|
|
90
89
|
## Table of Contents:
|
|
91
90
|
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
91
|
+
- [Installation](#installation)
|
|
92
|
+
- [Usage](#usage)
|
|
93
|
+
- [Documentation](#documentation)
|
|
94
|
+
- [Docker](#docker)
|
|
95
|
+
- [Help with Manim](#help-with-manim)
|
|
96
|
+
- [Contributing](#contributing)
|
|
97
|
+
- [License](#license)
|
|
99
98
|
|
|
100
99
|
## Installation
|
|
101
100
|
|
|
102
|
-
>
|
|
101
|
+
> [!CAUTION]
|
|
102
|
+
> These instructions are for the community version _only_. Trying to use these instructions to install [3b1b/manim](https://github.com/3b1b/manim) or instructions there to install this version will cause problems. Read [this](https://docs.manim.community/en/stable/faq/installation.html#why-are-there-different-versions-of-manim) and decide which version you wish to install, then only follow the instructions for your desired version.
|
|
103
103
|
|
|
104
104
|
Manim requires a few dependencies that must be installed prior to using it. If you
|
|
105
105
|
want to try it out first before installing it locally, you can do so
|
|
@@ -152,9 +152,9 @@ The `-p` flag in the command above is for previewing, meaning the video file wil
|
|
|
152
152
|
|
|
153
153
|
Some other useful flags include:
|
|
154
154
|
|
|
155
|
-
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
155
|
+
- `-s` to skip to the end and just show the final frame.
|
|
156
|
+
- `-n <number>` to skip ahead to the `n`'th animation of a scene.
|
|
157
|
+
- `-f` show the file in the file browser.
|
|
158
158
|
|
|
159
159
|
For a thorough list of command line arguments, visit the [documentation](https://docs.manim.community/en/stable/guides/configuration.html).
|
|
160
160
|
|
|
@@ -182,8 +182,8 @@ The contribution guide may become outdated quickly; we highly recommend joining
|
|
|
182
182
|
[Discord server](https://www.manim.community/discord/) to discuss any potential
|
|
183
183
|
contributions and keep up to date with the latest developments.
|
|
184
184
|
|
|
185
|
-
Most developers on the project use `
|
|
186
|
-
Learn more about `
|
|
185
|
+
Most developers on the project use `uv` for management. You'll want to have uv installed and available in your environment.
|
|
186
|
+
Learn more about `uv` at its [documentation](https://docs.astral.sh/uv/) and find out how to install manim with uv at the [manim dev-installation guide](https://docs.manim.community/en/latest/contributing/development.html) in the manim documentation.
|
|
187
187
|
|
|
188
188
|
## How to Cite Manim
|
|
189
189
|
|
|
@@ -202,4 +202,3 @@ Our full code of conduct, and how we enforce it, can be read on [our website](ht
|
|
|
202
202
|
## License
|
|
203
203
|
|
|
204
204
|
The software is double-licensed under the MIT license, with copyright by 3blue1brown LLC (see LICENSE), and copyright by Manim Community Developers (see LICENSE.community).
|
|
205
|
-
|