From 5e689286fe923876fba8481e05c802975b68ff6d Mon Sep 17 00:00:00 2001 From: Irvanal Haq Date: Fri, 9 May 2025 19:15:37 +0700 Subject: [PATCH 1/2] Avoid duplicate references to the same object in self.mobjects --- manim/scene/scene.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index fc3d3ede54..c45fd04a73 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -553,6 +553,10 @@ def replace(self, old_mobject: Mobject, new_mobject: Mobject) -> None: def replace_in_list( mobj_list: list[Mobject], old_m: Mobject, new_m: Mobject ) -> bool: + # Avoid duplicate references to the same object in self.mobjects + if new_m in mobj_list: + mobj_list.remove(new_m) + # We use breadth-first search because some Mobjects get very deep and # we expect top-level elements to be the most common targets for replace. for i in range(0, len(mobj_list)): From 5fb819dc1e3cd99b18f60f49a0fbf4fe0069a92c Mon Sep 17 00:00:00 2001 From: Irvanal Haq Date: Fri, 9 May 2025 19:58:31 +0700 Subject: [PATCH 2/2] add unit test for ReplacementTransform --- tests/module/animation/test_transform.py | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/module/animation/test_transform.py diff --git a/tests/module/animation/test_transform.py b/tests/module/animation/test_transform.py new file mode 100644 index 0000000000..d1b9c43aef --- /dev/null +++ b/tests/module/animation/test_transform.py @@ -0,0 +1,27 @@ +from __future__ import annotations + +from manim import Circle, ReplacementTransform, Scene, Square, VGroup + + +def test_no_duplicate_references(): + scene = Scene() + c = Circle() + sq = Square() + scene.add(c, sq) + + scene.play(ReplacementTransform(c, sq)) + assert len(scene.mobjects) == 1 + assert scene.mobjects[0] is sq + + +def test_duplicate_references_in_group(): + scene = Scene() + c = Circle() + sq = Square() + vg = VGroup(c, sq) + scene.add(vg) + + scene.play(ReplacementTransform(c, sq)) + submobs = vg.submobjects + assert len(submobs) == 1 + assert submobs[0] is sq