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.
Files changed (163) hide show
  1. manim/__init__.py +11 -6
  2. manim/__main__.py +62 -19
  3. manim/_config/__init__.py +10 -9
  4. manim/_config/cli_colors.py +26 -9
  5. manim/_config/default.cfg +1 -3
  6. manim/_config/logger_utils.py +23 -13
  7. manim/_config/utils.py +662 -468
  8. manim/animation/animation.py +164 -18
  9. manim/animation/changing.py +34 -23
  10. manim/animation/composition.py +265 -67
  11. manim/animation/creation.py +208 -26
  12. manim/animation/fading.py +16 -18
  13. manim/animation/growing.py +35 -15
  14. manim/animation/indication.py +150 -76
  15. manim/animation/movement.py +56 -22
  16. manim/animation/numbers.py +64 -6
  17. manim/animation/rotation.py +78 -7
  18. manim/animation/specialized.py +6 -7
  19. manim/animation/speedmodifier.py +13 -10
  20. manim/animation/transform.py +14 -11
  21. manim/animation/transform_matching_parts.py +3 -4
  22. manim/animation/updaters/mobject_update_utils.py +152 -30
  23. manim/animation/updaters/update.py +10 -7
  24. manim/camera/camera.py +182 -118
  25. manim/camera/mapping_camera.py +34 -3
  26. manim/camera/moving_camera.py +95 -74
  27. manim/camera/multi_camera.py +23 -15
  28. manim/camera/three_d_camera.py +70 -52
  29. manim/cli/__init__.py +17 -0
  30. manim/cli/cfg/group.py +76 -44
  31. manim/cli/checkhealth/checks.py +192 -0
  32. manim/cli/checkhealth/commands.py +90 -0
  33. manim/cli/default_group.py +158 -25
  34. manim/cli/init/commands.py +33 -25
  35. manim/cli/plugins/commands.py +16 -3
  36. manim/cli/render/commands.py +72 -60
  37. manim/cli/render/ease_of_access_options.py +4 -3
  38. manim/cli/render/global_options.py +59 -17
  39. manim/cli/render/output_options.py +6 -5
  40. manim/cli/render/render_options.py +98 -33
  41. manim/constants.py +109 -59
  42. manim/data_structures.py +31 -0
  43. manim/mobject/frame.py +8 -5
  44. manim/mobject/geometry/__init__.py +1 -0
  45. manim/mobject/geometry/arc.py +277 -135
  46. manim/mobject/geometry/boolean_ops.py +32 -31
  47. manim/mobject/geometry/labeled.py +376 -0
  48. manim/mobject/geometry/line.py +192 -87
  49. manim/mobject/geometry/polygram.py +224 -58
  50. manim/mobject/geometry/shape_matchers.py +61 -25
  51. manim/mobject/geometry/tips.py +122 -48
  52. manim/mobject/graph.py +1027 -419
  53. manim/mobject/graphing/coordinate_systems.py +533 -278
  54. manim/mobject/graphing/functions.py +53 -32
  55. manim/mobject/graphing/number_line.py +123 -65
  56. manim/mobject/graphing/probability.py +88 -62
  57. manim/mobject/graphing/scale.py +33 -19
  58. manim/mobject/logo.py +118 -28
  59. manim/mobject/matrix.py +87 -83
  60. manim/mobject/mobject.py +912 -442
  61. manim/mobject/opengl/dot_cloud.py +16 -5
  62. manim/mobject/opengl/opengl_compatibility.py +4 -2
  63. manim/mobject/opengl/opengl_geometry.py +254 -153
  64. manim/mobject/opengl/opengl_image_mobject.py +3 -1
  65. manim/mobject/opengl/opengl_mobject.py +779 -482
  66. manim/mobject/opengl/opengl_point_cloud_mobject.py +41 -14
  67. manim/mobject/opengl/opengl_surface.py +14 -92
  68. manim/mobject/opengl/opengl_three_dimensions.py +12 -8
  69. manim/mobject/opengl/opengl_vectorized_mobject.py +98 -100
  70. manim/mobject/svg/brace.py +173 -41
  71. manim/mobject/svg/svg_mobject.py +139 -53
  72. manim/mobject/table.py +61 -68
  73. manim/mobject/text/code_mobject.py +193 -539
  74. manim/mobject/text/numbers.py +81 -34
  75. manim/mobject/text/tex_mobject.py +130 -78
  76. manim/mobject/text/text_mobject.py +288 -164
  77. manim/mobject/three_d/polyhedra.py +111 -13
  78. manim/mobject/three_d/three_d_utils.py +17 -8
  79. manim/mobject/three_d/three_dimensions.py +239 -106
  80. manim/mobject/types/image_mobject.py +50 -30
  81. manim/mobject/types/point_cloud_mobject.py +120 -75
  82. manim/mobject/types/vectorized_mobject.py +841 -408
  83. manim/mobject/value_tracker.py +105 -38
  84. manim/mobject/vector_field.py +50 -31
  85. manim/opengl/__init__.py +3 -3
  86. manim/plugins/__init__.py +14 -1
  87. manim/plugins/plugins_flags.py +10 -14
  88. manim/renderer/cairo_renderer.py +65 -50
  89. manim/renderer/opengl_renderer.py +89 -69
  90. manim/renderer/opengl_renderer_window.py +39 -18
  91. manim/renderer/shader.py +123 -87
  92. manim/renderer/shader_wrapper.py +44 -28
  93. manim/renderer/vectorized_mobject_rendering.py +38 -10
  94. manim/scene/moving_camera_scene.py +32 -3
  95. manim/scene/scene.py +507 -242
  96. manim/scene/scene_file_writer.py +371 -220
  97. manim/scene/section.py +20 -16
  98. manim/scene/three_d_scene.py +14 -22
  99. manim/scene/vector_space_scene.py +223 -129
  100. manim/scene/zoomed_scene.py +46 -41
  101. manim/typing.py +990 -0
  102. manim/utils/bezier.py +1823 -371
  103. manim/utils/caching.py +12 -5
  104. manim/utils/color/AS2700.py +236 -0
  105. manim/utils/color/BS381.py +318 -0
  106. manim/utils/color/DVIPSNAMES.py +96 -0
  107. manim/utils/color/SVGNAMES.py +179 -0
  108. manim/utils/color/X11.py +533 -0
  109. manim/utils/color/XKCD.py +952 -0
  110. manim/utils/color/__init__.py +61 -0
  111. manim/utils/color/core.py +1667 -0
  112. manim/utils/color/manim_colors.py +218 -0
  113. manim/utils/commands.py +48 -20
  114. manim/utils/config_ops.py +39 -19
  115. manim/utils/debug.py +8 -7
  116. manim/utils/deprecation.py +86 -39
  117. manim/utils/docbuild/__init__.py +17 -0
  118. manim/utils/docbuild/autoaliasattr_directive.py +236 -0
  119. manim/utils/docbuild/autocolor_directive.py +99 -0
  120. manim/utils/docbuild/manim_directive.py +94 -41
  121. manim/utils/docbuild/module_parsing.py +245 -0
  122. manim/utils/exceptions.py +6 -0
  123. manim/utils/family.py +5 -3
  124. manim/utils/family_ops.py +17 -4
  125. manim/utils/file_ops.py +27 -17
  126. manim/utils/hashing.py +55 -45
  127. manim/utils/images.py +13 -7
  128. manim/utils/ipython_magic.py +13 -7
  129. manim/utils/iterables.py +163 -120
  130. manim/utils/module_ops.py +66 -24
  131. manim/utils/opengl.py +77 -24
  132. manim/utils/parameter_parsing.py +32 -0
  133. manim/utils/paths.py +30 -33
  134. manim/utils/polylabel.py +235 -0
  135. manim/utils/qhull.py +218 -0
  136. manim/utils/rate_functions.py +98 -32
  137. manim/utils/simple_functions.py +25 -33
  138. manim/utils/sounds.py +7 -1
  139. manim/utils/space_ops.py +188 -115
  140. manim/utils/testing/__init__.py +17 -0
  141. manim/utils/testing/_frames_testers.py +13 -8
  142. manim/utils/testing/_show_diff.py +5 -3
  143. manim/utils/testing/_test_class_makers.py +34 -18
  144. manim/utils/testing/frames_comparison.py +37 -19
  145. manim/utils/tex.py +130 -198
  146. manim/utils/tex_file_writing.py +77 -47
  147. manim/utils/tex_templates.py +2 -1
  148. manim/utils/unit.py +6 -5
  149. {manim-0.17.0.dist-info → manim-0.19.1.dist-info}/METADATA +64 -65
  150. manim-0.19.1.dist-info/RECORD +220 -0
  151. {manim-0.17.0.dist-info → manim-0.19.1.dist-info}/WHEEL +1 -1
  152. manim-0.19.1.dist-info/entry_points.txt +3 -0
  153. {manim-0.17.0.dist-info → manim-0.19.1.dist-info/licenses}/LICENSE.community +1 -1
  154. manim/cli/new/group.py +0 -189
  155. manim/communitycolors.py +0 -9
  156. manim/gui/__init__.py +0 -0
  157. manim/gui/gui.py +0 -82
  158. manim/plugins/import_plugins.py +0 -43
  159. manim/utils/color.py +0 -552
  160. manim-0.17.0.dist-info/RECORD +0 -206
  161. manim-0.17.0.dist-info/entry_points.txt +0 -4
  162. /manim/cli/{new → checkhealth}/__init__.py +0 -0
  163. {manim-0.17.0.dist-info → manim-0.19.1.dist-info/licenses}/LICENSE +0 -0
@@ -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
- def tex_hash(expression):
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
- return convert_to_svg(dvi_file, tex_template.output_format)
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 tex_compilation_command(
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 tex compilation command with all necessary cli flags
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
- commands = [
142
+ command = [
128
143
  tex_compiler,
129
144
  "-interaction=batchmode",
130
- f'-output-format="{output_format[1:]}"',
145
+ f"-output-format={output_format[1:]}",
131
146
  "-halt-on-error",
132
- f'-output-directory="{tex_dir}"',
133
- f'"{tex_file}"',
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
- commands = [
157
+ command = [
145
158
  "xelatex",
146
- outflag,
159
+ *outflag,
147
160
  "-interaction=batchmode",
148
161
  "-halt-on-error",
149
- f'-output-directory="{tex_dir}"',
150
- f'"{tex_file}"',
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 " ".join(commands)
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 = tex_compilation_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
- exit_code = os.system(command)
198
- if exit_code != 0:
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
- commands = [
239
+ command = [
229
240
  "dvisvgm",
230
- "--pdf" if extension == ".pdf" else "",
231
- "-p " + str(page),
232
- f'"{dvi_file}"',
233
- "-n",
234
- "-v 0",
235
- "-o " + f'"{result}"',
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
- os.system(" ".join(commands))
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/installation/troubleshooting.html",
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(tex_compilation_log, error_start_index, tex_source):
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
- context = "".join(context)
318
- logger.error(context)
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
@@ -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
1
+ Metadata-Version: 2.4
2
2
  Name: manim
3
- Version: 0.17.0
3
+ Version: 0.19.1
4
4
  Summary: Animation engine for explanatory math videos.
5
- Home-page: https://www.manim.community/
6
- License: MIT
7
- Author: The Manim Community Developers
8
- Author-email: contact@manim.community
9
- Requires-Python: >=3.8,<3.12
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.10
19
- Classifier: Programming Language :: Python :: 3.7
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: Pillow (>=9.1,<10.0)
28
- Requires-Dist: Pygments (>=2.10.0,<3.0.0)
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: This repository is maintained by the Manim Community and is not associated with Grant Sanderson or 3Blue1Brown in any way (although we are definitely indebted to him for providing his work to the world). If you would like to study how Grant makes his videos, head over to his repository ([3b1b/manim](https://github.com/3b1b/manim)). This fork is updated more frequently than his, and it's recommended to use this fork if you'd like to use Manim for your own projects.
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
- - [Installation](#installation)
93
- - [Usage](#usage)
94
- - [Documentation](#documentation)
95
- - [Docker](#docker)
96
- - [Help with Manim](#help-with-manim)
97
- - [Contributing](#contributing)
98
- - [License](#license)
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
- > **WARNING:** 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.
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
- - `-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.
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 `poetry` for management. You'll want to have poetry installed and available in your environment.
186
- Learn more about `poetry` at its [documentation](https://python-poetry.org/docs/) and find out how to install manim with poetry at the [manim dev-installation guide](https://docs.manim.community/en/stable/contributing/development.html) in the manim documentation.
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
-