Created a method `remove_all_except()` in scene.py and interactive_scene.py, and made default colors easily configurable. (#2346)

* created a method remove_all_except() in scene.py and interactive_scene.py

* Made it such that default mobject colors can be set through the yaml config file.

* * Default color initialisation wasn't working.
Changed conditional expression to `or` instead.

* Added default values to yaml file.

* added set_background_color() function to Scene class

* Changed default font back to Consolas
This commit is contained in:
Abdallah Soliman 2025-06-10 16:15:55 +01:00 committed by GitHub
parent 6fb1845f4a
commit fd2a6a69e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 68 additions and 39 deletions

1
.gitignore vendored
View file

@ -151,3 +151,4 @@ dmypy.json
# For manim
/videos
/custom_config.yml
test.py

View file

@ -148,3 +148,12 @@ PURPLE: ManimColor = PURPLE_C
GREY: ManimColor = GREY_C
COLORMAP_3B1B: List[ManimColor] = [BLUE_E, GREEN, YELLOW, RED]
# Default mobject colors should be configurable just like background color
# DEFAULT_MOBJECT_COLOR is mainly for text, tex, line, etc... mobjects. Default is WHITE
# DEFAULT_LIGHT_COLOR is mainly for things like axes, arrows, annulus and other lightly colored mobjects. Default is GREY_B
DEFAULT_MOBJECT_COLOR: ManimColor = manim_config.mobject.default_mobject_color or WHITE
DEFAULT_LIGHT_COLOR: ManimColor = manim_config.mobject.default_light_color or GREY_B
DEFAULT_VMOBJECT_STROKE_COLOR : ManimColor = manim_config.vmobject.default_stroke_color or GREY_A
DEFAULT_VMOBJECT_FILL_COLOR : ManimColor = manim_config.vmobject.default_fill_color or GREY_C

View file

@ -71,10 +71,16 @@ scene:
default_wait_time: 1.0
vmobject:
default_stroke_width: 4.0
default_stroke_color: "#DDDDDD" # Default is GREY_A
default_fill_color: "#888888" # Default is GREY_C
mobject:
default_mobject_color: "#FFFFFF" # Default is WHITE
default_light_color: "#BBBBBB" # Default is GREY_B
tex:
# See tex_templates.yml
template: "default"
text:
# font: "Cambria Math"
font: "Consolas"
alignment: "LEFT"
embed:

View file

@ -2,7 +2,7 @@ from __future__ import annotations
import numpy as np
from manimlib.constants import BLUE_B, BLUE_D, BLUE_E, GREY_BROWN, WHITE
from manimlib.constants import BLUE_B, BLUE_D, BLUE_E, GREY_BROWN, DEFAULT_MOBJECT_COLOR
from manimlib.mobject.mobject import Mobject
from manimlib.mobject.types.vectorized_mobject import VGroup
from manimlib.mobject.types.vectorized_mobject import VMobject
@ -102,7 +102,7 @@ class TracedPath(VMobject):
time_traced: float = np.inf,
time_per_anchor: float = 1.0 / 15,
stroke_width: float | Iterable[float] = 2.0,
stroke_color: ManimColor = WHITE,
stroke_color: ManimColor = DEFAULT_MOBJECT_COLOR,
**kwargs
):
super().__init__(**kwargs)
@ -147,7 +147,7 @@ class TracingTail(TracedPath):
time_traced: float = 1.0,
stroke_width: float | Iterable[float] = (0, 3),
stroke_opacity: float | Iterable[float] = (0, 1),
stroke_color: ManimColor = WHITE,
stroke_color: ManimColor = DEFAULT_MOBJECT_COLOR,
**kwargs
):
if isinstance(mobject_or_func, Mobject):

View file

@ -6,7 +6,7 @@ import numbers
import numpy as np
import itertools as it
from manimlib.constants import BLACK, BLUE, BLUE_D, BLUE_E, GREEN, GREY_A, WHITE, RED
from manimlib.constants import BLACK, BLUE, BLUE_D, BLUE_E, GREEN, GREY_A, RED, DEFAULT_MOBJECT_COLOR
from manimlib.constants import DEG, PI
from manimlib.constants import DL, UL, DOWN, DR, LEFT, ORIGIN, OUT, RIGHT, UP
from manimlib.constants import FRAME_X_RADIUS, FRAME_Y_RADIUS
@ -617,7 +617,7 @@ class ThreeDAxes(Axes):
class NumberPlane(Axes):
default_axis_config: dict = dict(
stroke_color=WHITE,
stroke_color=DEFAULT_MOBJECT_COLOR,
stroke_width=2,
include_ticks=False,
include_tip=False,

View file

@ -5,7 +5,7 @@ import math
import numpy as np
from manimlib.constants import DL, DOWN, DR, LEFT, ORIGIN, OUT, RIGHT, UL, UP, UR
from manimlib.constants import GREY_A, RED, WHITE, BLACK
from manimlib.constants import RED, BLACK, DEFAULT_MOBJECT_COLOR, DEFAULT_LIGHT_COLOR
from manimlib.constants import MED_SMALL_BUFF, SMALL_BUFF
from manimlib.constants import DEG, PI, TAU
from manimlib.mobject.mobject import Mobject
@ -330,7 +330,7 @@ class Dot(Circle):
stroke_color: ManimColor = BLACK,
stroke_width: float = 0.0,
fill_opacity: float = 1.0,
fill_color: ManimColor = WHITE,
fill_color: ManimColor = DEFAULT_MOBJECT_COLOR,
**kwargs
):
super().__init__(
@ -374,7 +374,7 @@ class AnnularSector(VMobject):
inner_radius: float = 1.0,
outer_radius: float = 2.0,
arc_center: Vect3 = ORIGIN,
fill_color: ManimColor = GREY_A,
fill_color: ManimColor = DEFAULT_LIGHT_COLOR,
fill_opacity: float = 1.0,
stroke_width: float = 0.0,
**kwargs,
@ -424,7 +424,7 @@ class Annulus(VMobject):
outer_radius: float = 2.0,
fill_opacity: float = 1.0,
stroke_width: float = 0.0,
fill_color: ManimColor = GREY_A,
fill_color: ManimColor = DEFAULT_LIGHT_COLOR,
center: Vect3 = ORIGIN,
**kwargs,
):
@ -644,7 +644,7 @@ class StrokeArrow(Line):
self,
start: Vect3 | Mobject,
end: Vect3 | Mobject,
stroke_color: ManimColor = GREY_A,
stroke_color: ManimColor = DEFAULT_LIGHT_COLOR,
stroke_width: float = 5,
buff: float = 0.25,
tip_width_ratio: float = 5,
@ -744,7 +744,7 @@ class Arrow(Line):
end: Vect3 | Mobject = LEFT,
buff: float = MED_SMALL_BUFF,
path_arc: float = 0,
fill_color: ManimColor = GREY_A,
fill_color: ManimColor = DEFAULT_LIGHT_COLOR,
fill_opacity: float = 1.0,
stroke_width: float = 0.0,
thickness: float = 3.0,
@ -1008,7 +1008,7 @@ class ArrowTip(Triangle):
width: float = DEFAULT_ARROW_TIP_WIDTH,
length: float = DEFAULT_ARROW_TIP_LENGTH,
fill_opacity: float = 1.0,
fill_color: ManimColor = WHITE,
fill_color: ManimColor = DEFAULT_MOBJECT_COLOR,
stroke_width: float = 0.0,
tip_style: int = 0, # triangle=0, inner_smooth=1, dot=2
**kwargs

View file

@ -6,7 +6,7 @@ from pyglet.window import key as PygletWindowKeys
from manimlib.constants import FRAME_HEIGHT, FRAME_WIDTH
from manimlib.constants import DOWN, LEFT, ORIGIN, RIGHT, UP
from manimlib.constants import MED_LARGE_BUFF, MED_SMALL_BUFF, SMALL_BUFF
from manimlib.constants import BLACK, BLUE, GREEN, GREY_A, GREY_C, RED, WHITE
from manimlib.constants import BLACK, BLUE, GREEN, GREY_A, GREY_C, RED, WHITE, DEFAULT_MOBJECT_COLOR
from manimlib.mobject.mobject import Group
from manimlib.mobject.mobject import Mobject
from manimlib.mobject.geometry import Circle
@ -387,7 +387,7 @@ class Textbox(ControlMobject):
box_kwargs: dict = {
"width": 2.0,
"height": 1.0,
"fill_color": WHITE,
"fill_color": DEFAULT_MOBJECT_COLOR,
"fill_opacity": 1.0,
},
text_kwargs: dict = {

View file

@ -18,7 +18,7 @@ from manimlib.constants import DOWN, IN, LEFT, ORIGIN, OUT, RIGHT, UP
from manimlib.constants import FRAME_X_RADIUS, FRAME_Y_RADIUS
from manimlib.constants import MED_SMALL_BUFF
from manimlib.constants import TAU
from manimlib.constants import WHITE
from manimlib.constants import DEFAULT_MOBJECT_COLOR
from manimlib.event_handler import EVENT_DISPATCHER
from manimlib.event_handler.event_listner import EventListener
from manimlib.event_handler.event_type import EventType
@ -78,7 +78,7 @@ class Mobject(object):
def __init__(
self,
color: ManimColor = WHITE,
color: ManimColor = DEFAULT_MOBJECT_COLOR,
opacity: float = 1.0,
shading: Tuple[float, float, float] = (0.0, 0.0, 0.0),
# For shaders

View file

@ -3,7 +3,7 @@ from __future__ import annotations
import numpy as np
from manimlib.constants import DOWN, LEFT, RIGHT, UP
from manimlib.constants import GREY_B
from manimlib.constants import DEFAULT_LIGHT_COLOR
from manimlib.constants import MED_SMALL_BUFF
from manimlib.mobject.geometry import Line
from manimlib.mobject.numbers import DecimalNumber
@ -24,7 +24,7 @@ class NumberLine(Line):
def __init__(
self,
x_range: RangeSpecifier = (-8, 8, 1),
color: ManimColor = GREY_B,
color: ManimColor = DEFAULT_LIGHT_COLOR,
stroke_width: float = 2.0,
# How big is one one unit of this number line in terms of absolute spacial distance
unit_size: float = 1.0,

View file

@ -4,7 +4,7 @@ from functools import lru_cache
import numpy as np
from manimlib.constants import DOWN, LEFT, RIGHT, UP
from manimlib.constants import WHITE
from manimlib.constants import DEFAULT_MOBJECT_COLOR
from manimlib.mobject.svg.tex_mobject import Tex
from manimlib.mobject.svg.text_mobject import Text
from manimlib.mobject.types.vectorized_mobject import VMobject
@ -35,7 +35,7 @@ class DecimalNumber(VMobject):
def __init__(
self,
number: float | complex = 0,
color: ManimColor = WHITE,
color: ManimColor = DEFAULT_MOBJECT_COLOR,
stroke_width: float = 0,
fill_opacity: float = 1.0,
fill_border_width: float = 0.5,

View file

@ -3,7 +3,7 @@ from __future__ import annotations
from colour import Color
from manimlib.config import manim_config
from manimlib.constants import BLACK, RED, YELLOW, WHITE
from manimlib.constants import BLACK, RED, YELLOW, DEFAULT_MOBJECT_COLOR
from manimlib.constants import DL, DOWN, DR, LEFT, RIGHT, UL, UR
from manimlib.constants import SMALL_BUFF
from manimlib.mobject.geometry import Line
@ -118,7 +118,7 @@ class Underline(Line):
self,
mobject: Mobject,
buff: float = SMALL_BUFF,
stroke_color=WHITE,
stroke_color=DEFAULT_MOBJECT_COLOR,
stroke_width: float | Sequence[float] = [0, 3, 3, 0],
stretch_factor=1.2,
**kwargs

View file

@ -4,7 +4,7 @@ from functools import reduce
import operator as op
import re
from manimlib.constants import BLACK, WHITE
from manimlib.constants import BLACK, DEFAULT_MOBJECT_COLOR
from manimlib.mobject.svg.svg_mobject import SVGMobject
from manimlib.mobject.types.vectorized_mobject import VGroup
from manimlib.utils.tex_file_writing import latex_to_svg
@ -26,10 +26,10 @@ class SingleStringTex(SVGMobject):
self,
tex_string: str,
height: float | None = None,
fill_color: ManimColor = WHITE,
fill_color: ManimColor = DEFAULT_MOBJECT_COLOR,
fill_opacity: float = 1.0,
stroke_width: float = 0,
svg_default: dict = dict(fill_color=WHITE),
svg_default: dict = dict(fill_color=DEFAULT_MOBJECT_COLOR),
path_string_config: dict = dict(),
font_size: int = 48,
alignment: str = R"\centering",

View file

@ -1,6 +1,6 @@
from __future__ import annotations
from manimlib.constants import MED_SMALL_BUFF, WHITE, GREY_C
from manimlib.constants import MED_SMALL_BUFF, DEFAULT_MOBJECT_COLOR, GREY_C
from manimlib.constants import DOWN, LEFT, RIGHT, UP
from manimlib.constants import FRAME_WIDTH
from manimlib.constants import MED_LARGE_BUFF, SMALL_BUFF
@ -46,7 +46,7 @@ class BulletedList(VGroup):
class TexTextFromPresetString(TexText):
tex: str = ""
default_color: ManimColor = WHITE
default_color: ManimColor = DEFAULT_MOBJECT_COLOR
def __init__(self, **kwargs):
super().__init__(

View file

@ -6,7 +6,7 @@ import re
from scipy.optimize import linear_sum_assignment
from scipy.spatial.distance import cdist
from manimlib.constants import WHITE
from manimlib.constants import DEFAULT_MOBJECT_COLOR
from manimlib.logger import log
from manimlib.mobject.svg.svg_mobject import SVGMobject
from manimlib.mobject.types.vectorized_mobject import VMobject
@ -46,11 +46,11 @@ class StringMobject(SVGMobject, ABC):
def __init__(
self,
string: str,
fill_color: ManimColor = WHITE,
fill_color: ManimColor = DEFAULT_MOBJECT_COLOR,
fill_border_width: float = 0.5,
stroke_color: ManimColor = WHITE,
stroke_color: ManimColor = DEFAULT_MOBJECT_COLOR,
stroke_width: float = 0,
base_color: ManimColor = WHITE,
base_color: ManimColor = DEFAULT_MOBJECT_COLOR,
isolate: Selector = (),
protect: Selector = (),
# When set to true, only the labelled svg is
@ -60,7 +60,7 @@ class StringMobject(SVGMobject, ABC):
**kwargs
):
self.string = string
self.base_color = base_color or WHITE
self.base_color = base_color or DEFAULT_MOBJECT_COLOR
self.isolate = isolate
self.protect = protect
self.use_labelled_svg = use_labelled_svg

View file

@ -5,6 +5,7 @@ from functools import wraps
import numpy as np
from manimlib.constants import GREY_A, GREY_C, GREY_E
from manimlib.constants import DEFAULT_VMOBJECT_FILL_COLOR, DEFAULT_VMOBJECT_STROKE_COLOR
from manimlib.constants import BLACK
from manimlib.constants import DEFAULT_STROKE_WIDTH
from manimlib.constants import DEG
@ -53,9 +54,6 @@ if TYPE_CHECKING:
from manimlib.typing import ManimColor, Vect3, Vect4, Vect3Array, Self
from moderngl.context import Context
DEFAULT_STROKE_COLOR = GREY_A
DEFAULT_FILL_COLOR = GREY_C
class VMobject(Mobject):
data_dtype: np.dtype = np.dtype([
@ -99,9 +97,9 @@ class VMobject(Mobject):
fill_border_width: float = 0.0,
**kwargs
):
self.fill_color = fill_color or color or DEFAULT_FILL_COLOR
self.fill_color = fill_color or color or DEFAULT_VMOBJECT_FILL_COLOR
self.fill_opacity = fill_opacity
self.stroke_color = stroke_color or color or DEFAULT_STROKE_COLOR
self.stroke_color = stroke_color or color or DEFAULT_VMOBJECT_STROKE_COLOR
self.stroke_opacity = stroke_opacity
self.stroke_width = stroke_width
self.stroke_behind = stroke_behind

View file

@ -6,7 +6,7 @@ import numpy as np
from scipy.integrate import solve_ivp
from manimlib.constants import FRAME_HEIGHT, FRAME_WIDTH
from manimlib.constants import WHITE
from manimlib.constants import DEFAULT_MOBJECT_COLOR
from manimlib.animation.indication import VShowPassingFlash
from manimlib.mobject.types.vectorized_mobject import VGroup
from manimlib.mobject.types.vectorized_mobject import VMobject
@ -351,7 +351,7 @@ class StreamLines(VGroup):
cutoff_norm: float = 15,
# Style info
stroke_width: float = 1.0,
stroke_color: ManimColor = WHITE,
stroke_color: ManimColor = DEFAULT_MOBJECT_COLOR,
stroke_opacity: float = 1,
color_by_magnitude: bool = True,
magnitude_range: Tuple[float, float] = (0, 2.0),

View file

@ -245,6 +245,10 @@ class InteractiveScene(Scene):
super().remove(*mobjects)
self.regenerate_selection_search_set()
def remove_all_except(self, *mobjects_to_keep : Mobject):
super().remove_all_except(*mobjects_to_keep)
self.regenerate_selection_search_set()
# Related to selection
def toggle_selection_mode(self):

View file

@ -33,6 +33,7 @@ from manimlib.utils.family_ops import extract_mobject_family_members
from manimlib.utils.family_ops import recursive_mobject_remove
from manimlib.utils.iterables import batch_by_property
from manimlib.utils.sounds import play_sound
from manimlib.utils.color import color_to_rgba
from manimlib.window import Window
from typing import TYPE_CHECKING
@ -380,6 +381,11 @@ class Scene(object):
new_mobjects, _ = recursive_mobject_remove(self.mobjects, to_remove)
self.mobjects = new_mobjects
@affects_mobject_list
def remove_all_except(self, *mobjects_to_keep : Mobject):
self.clear()
self.add(*mobjects_to_keep)
def bring_to_front(self, *mobjects: Mobject):
self.add(*mobjects)
return self
@ -867,6 +873,11 @@ class Scene(object):
return
self.window.focus()
def set_background_color(self, background_color, background_opacity=1) -> None:
self.camera.background_rgba = list(color_to_rgba(
background_color, background_opacity
))
class SceneState():
def __init__(self, scene: Scene, ignore: list[Mobject] | None = None):