From 4745f20147b2bc04379bfc02ce845a9ff6c5c549 Mon Sep 17 00:00:00 2001 From: GoThrones Date: Sat, 30 May 2026 16:02:14 +0530 Subject: [PATCH 1/6] Refactored line.py file --- manim/mobject/geometry/line.py | 190 ++++++++++++++---- manim/scene/vector_space_scene.py | 2 +- .../vector_scene/vector_to_coords.npz | Bin 151213 -> 151468 bytes tests/test_graphical_units/test_geometry.py | 4 +- 4 files changed, 152 insertions(+), 44 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index 2cd7aff807..ea88799183 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -17,6 +17,7 @@ from typing import TYPE_CHECKING, Any, Literal, cast import numpy as np +import warnings from manim import config from manim.constants import * @@ -193,7 +194,10 @@ def _pointify( return mob.get_center() else: return mob.get_boundary_point(direction) - return np.array(mob_or_point) + point = np.array(mob_or_point) + if len(point) == 2: + point = np.hstack([point, 0]) + return point def set_path_arc(self, new_value: float) -> None: self.path_arc = new_value @@ -503,10 +507,16 @@ class Arrow(Line): ---------- args Arguments to be passed to :class:`Line`. + start + Start point of the Arrow. + end + End point of the Arrow. stroke_width The thickness of the arrow. Influenced by :attr:`max_stroke_width_to_length_ratio`. buff The distance of the arrow from its start and end points. + tip_shape + Shape of the tip at the end of the Arrow. max_tip_length_to_length_ratio :attr:`tip_length` scales with the length of the arrow. Increasing this ratio raises the max value of :attr:`tip_length`. max_stroke_width_to_length_ratio @@ -587,16 +597,25 @@ def construct(self): def __init__( self, *args: Any, + start: Point3DLike = ORIGIN, + end: Point3DLike = RIGHT, stroke_width: float = 6, buff: float = MED_SMALL_BUFF, + tip_shape: type[ArrowTip] = ArrowTriangleFilledTip, max_tip_length_to_length_ratio: float = 0.25, max_stroke_width_to_length_ratio: float = 5, **kwargs: Any, ) -> None: self.max_tip_length_to_length_ratio = max_tip_length_to_length_ratio self.max_stroke_width_to_length_ratio = max_stroke_width_to_length_ratio - tip_shape = kwargs.pop("tip_shape", ArrowTriangleFilledTip) - super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] + if len(args) == 0: + if len(start) == 2: + start = np.hstack([start, 0]) + if len(end) == 2: + end = np.hstack([end, 0]) + super().__init__(start=start, end=end, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] + else: + super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # TODO, should this be affected when # Arrow.set_stroke is called? self.initial_stroke_width = self.stroke_width @@ -706,8 +725,10 @@ def _set_stroke_width_from_length(self) -> Self: ) return self +_UNSET = object() -class Vector(Arrow): +class Vector(Arrow): + """A vector specialized for use in graphs. .. caution:: @@ -718,9 +739,15 @@ class Vector(Arrow): Parameters ---------- direction - The direction of the arrow. + The direction of the vector. + start + Starting point of the Vector. Default is ORIGIN. + end + End point of the vector. If it is 'None', then it is set to 'RIGHT'. buff - The distance of the vector from its endpoints. + The distance to shorten the vector from both ends. See buff parameter's docstring in :class:`~.Line`. + tip_shape + Shape of the tip. kwargs Additional arguments to be passed to :class:`Arrow` @@ -736,46 +763,90 @@ def construct(self): vector_2 = Vector([-5,-2]) self.add(plane, vector_1, vector_2) """ - def __init__( self, - direction: Vector2DLike | Vector3DLike = RIGHT, + direction: Vector2DLike | Vector3DLike | None = _UNSET, + start: Point3DLike | None = ORIGIN, + end: Point3DLike | None = None, buff: float = 0, + tip_shape: type[ArrowTip] = ArrowTriangleFilledTip, **kwargs: Any, ) -> None: self.buff = buff - if len(direction) == 2: - direction = np.hstack([direction, 0]) - - super().__init__(ORIGIN, direction, buff=buff, **kwargs) + if direction is not _UNSET and end is not None: + raise ValueError("You can specify either the 'end' or the 'direction' of the Vector at the same time, not both.") + if direction is not _UNSET: + if len(direction) == 2: + direction = np.hstack([direction, 0]) + end = start + direction + elif end is None: + end = RIGHT + super().__init__(start=start, end=end, buff=buff, tip_shape = tip_shape, **kwargs) def coordinate_label( self, - integer_labels: bool = True, + show_labels_as_integers: bool = False, n_dim: int = 2, color: ParsableManimColor | None = None, + show_start_label: bool = False, + show_end_label: bool = True, + decimals: int = 2, + buff: float = DEFAULT_MOBJECT_TO_MOBJECT_BUFFER, + buff_multiplier: float = 3.75, **kwargs: Any, - ) -> Matrix: - """Creates a label based on the coordinates of the vector. + ) -> Matrix | VGroup: + """Creates start_label and end_label based on the coordinate of start and end point of the vector. Parameters ---------- - integer_labels + show_labels_as_integers Whether or not to round the coordinates to integers. n_dim The number of dimensions of the vector. color - Sets the color of label, optional. + Sets the color of label. Default color is WHITE. + show_start_label + Shows the coordinate of starting point of the vector, if it is set to True. Default value is False. + show_end_label + Shows the coordinate of the end point of the vector, if it is set to True. Default value is True. + decimals + number of digits in decimal place, if 'show_labels_as_integers' is set to False. Default is 2. + buff + buffer distance along the vector's direction at which the coordinate is to be shown. + buff_multiplier + Stretches the buff. kwargs Additional arguments to be passed to :class:`~.Matrix`. Returns ------- - :class:`~.Matrix` + :class:`~.Matrix` | VGroup The label. + Return type is Matrix, when only 1 of the label out of start_label and end_label is to be shown. + Return type is VGroup, when both the labels are to be shown. Examples -------- + class VectorCoordinateLabel1(Scene): + def construct(self): + plane = NumberPlane() + vec = Vector(start = [-2,-2,0], direction = [3,2.6]) + label = vec.coordinate_label(color = RED, show_start_label=True) + self.add(plane, vec, label) + vec.add_updater(lambda x,dt: x.rotate(2*PI*dt*0.2, about_point= x.get_center())) + def upd_label(mob): + mob.become(vec.coordinate_label(color = RED, show_start_label=True)) + label.add_updater(upd_label) + self.wait(5) + + class VectorCoordinateLabel2(Scene): + def construct(self): + plane = NumberPlane() + vec_1 = Vector(color = ORANGE, tip_shape=StealthTip) + vec_2 = Vector(start = [-1,-2], end = [3,2], color = GREEN, tip_shape= StealthTip) + label_2 = vec_2.coordinate_label(color = RED, show_start_label= True) + self.add(plane,vec_1, vec_2, label_2) + .. manim:: VectorCoordinateLabel :save_last_frame: @@ -790,26 +861,41 @@ def construct(self): self.add(plane, vec_1, vec_2, label_1, label_2) """ + if not show_start_label and not show_end_label: + raise ValueError("Atleast one of show_start_label or show_end_label must be set to True") + # avoiding circular imports from ..matrix import Matrix + start_coordinate = np.array(self.get_start()) + end_coordinate = np.array(self.get_end()) + if show_labels_as_integers: + start_coordinate = np.round(start_coordinate).astype(int) + end_coordinate = np.round(end_coordinate).astype(int) + start_coordinate = start_coordinate[:n_dim] + end_coordinate = end_coordinate[:n_dim] + start_coordinate = np.round(start_coordinate, decimals=decimals).reshape((n_dim, 1)) + end_coordinate = np.round(end_coordinate, decimals=decimals).reshape((n_dim, 1)) + start_label = Matrix(start_coordinate, **kwargs) + end_label = Matrix(end_coordinate, **kwargs) + start_label.scale(LARGE_BUFF - 0.2) + end_label.scale(LARGE_BUFF - 0.2) + + vector_direction = self.get_unit_vector() + start_label_shift_dir = self.get_start() - vector_direction * buff_multiplier * buff - start_label.get_center() + end_label_shift_dir = self.get_end() + vector_direction * buff_multiplier * buff - end_label.get_center() + + start_label.shift(start_label_shift_dir) + end_label.shift(end_label_shift_dir) - vect = np.array(self.get_end()) - if integer_labels: - vect = np.round(vect).astype(int) - vect = vect[:n_dim] - vect = vect.reshape((n_dim, 1)) - label = Matrix(vect, **kwargs) - label.scale(LARGE_BUFF - 0.2) - - shift_dir = np.array(self.get_end()) - if shift_dir[0] >= 0: # Pointing right - shift_dir -= label.get_left() + DEFAULT_MOBJECT_TO_MOBJECT_BUFFER * LEFT - else: # Pointing left - shift_dir -= label.get_right() + DEFAULT_MOBJECT_TO_MOBJECT_BUFFER * RIGHT - label.shift(shift_dir) if color is not None: - label.set_color(color) - return label + start_label.set_color(color) + end_label.set_color(color) + + if show_start_label and show_end_label: + return VGroup(start_label, end_label) + elif show_end_label: + return end_label + return start_label class DoubleArrow(Arrow): @@ -818,9 +904,9 @@ class DoubleArrow(Arrow): Parameters ---------- args - Arguments to be passed to :class:`Arrow` + Positional arguments to be passed to :class:`Arrow` kwargs - Additional arguments to be passed to :class:`Arrow` + Keyword arguments to be passed to :class:`Arrow` .. seealso:: @@ -857,12 +943,34 @@ def construct(self): self.add(box, d1, d2, d3) """ - def __init__(self, *args: Any, **kwargs: Any) -> None: + def __init__( + self, + *args, + start: Point3DLike = LEFT, + end: Point3DLike = RIGHT, + tip_shape_at_start: type[ArrowTip] = ArrowTriangleFilledTip, + tip_shape_at_end: type[ArrowTip] = ArrowTriangleFilledTip, + **kwargs: Any + ) -> None: + if "tip_shape_start" in kwargs: + warnings.warn( + "tip_shape_start is deprecated. Use tip_shape_at_start instead.", + DeprecationWarning, + stacklevel=2, + ) + tip_shape_at_start = kwargs.pop("tip_shape_start") if "tip_shape_end" in kwargs: - kwargs["tip_shape"] = kwargs.pop("tip_shape_end") - tip_shape_start = kwargs.pop("tip_shape_start", ArrowTriangleFilledTip) - super().__init__(*args, **kwargs) - self.add_tip(at_start=True, tip_shape=tip_shape_start) + warnings.warn( + "tip_shape_end is deprecated. Use tip_shape_at_end instead.", + DeprecationWarning, + stacklevel=2, + ) + tip_shape_at_end = kwargs.pop("tip_shape_end") + if len(args) == 0: + super().__init__(start = start, end = end, tip_shape = tip_shape_at_end, **kwargs) + else: + super().__init__(*args, tip_shape = tip_shape_at_end, **kwargs) + self.add_tip(at_start=True, tip_shape=tip_shape_at_start) class Angle(VMobject, metaclass=ConvertToOpenGL): diff --git a/manim/scene/vector_space_scene.py b/manim/scene/vector_space_scene.py index 56afea2095..2b56655c07 100644 --- a/manim/scene/vector_space_scene.py +++ b/manim/scene/vector_space_scene.py @@ -516,7 +516,7 @@ def vector_to_coords( else: arrow = Vector(vector) show_creation = True - array = arrow.coordinate_label(integer_labels=integer_labels) + array = arrow.coordinate_label(show_labels_as_integers=integer_labels) x_line = Line(ORIGIN, vector[0] * RIGHT) y_line = Line(x_line.get_end(), arrow.get_end()) x_line.set_color(X_COLOR) diff --git a/tests/test_graphical_units/control_data/vector_scene/vector_to_coords.npz b/tests/test_graphical_units/control_data/vector_scene/vector_to_coords.npz index 8cec4d850a59db74723d676098fa6cac1435a7c6..bb8e09c813e1e4c1d7698c8b4b71abedffbb0025 100644 GIT binary patch delta 40639 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 delta 39453 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

sNP@}S<4CSuCbeHvGYU4Mb48imaKIq&R)3# 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 Date: Sat, 30 May 2026 10:34:55 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/mobject/geometry/line.py | 89 +++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index ea88799183..019921b151 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -14,10 +14,10 @@ "RightAngle", ] +import warnings from typing import TYPE_CHECKING, Any, Literal, cast import numpy as np -import warnings from manim import config from manim.constants import * @@ -613,7 +613,9 @@ def __init__( start = np.hstack([start, 0]) if len(end) == 2: end = np.hstack([end, 0]) - super().__init__(start=start, end=end, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] + super().__init__( + start=start, end=end, buff=buff, stroke_width=stroke_width, **kwargs + ) # type: ignore[misc] else: super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # TODO, should this be affected when @@ -725,10 +727,11 @@ def _set_stroke_width_from_length(self) -> Self: ) return self + _UNSET = object() -class Vector(Arrow): - + +class Vector(Arrow): """A vector specialized for use in graphs. .. caution:: @@ -763,25 +766,28 @@ def construct(self): vector_2 = Vector([-5,-2]) self.add(plane, vector_1, vector_2) """ + def __init__( self, direction: Vector2DLike | Vector3DLike | None = _UNSET, start: Point3DLike | None = ORIGIN, - end: Point3DLike | None = None, + end: Point3DLike | None = None, buff: float = 0, tip_shape: type[ArrowTip] = ArrowTriangleFilledTip, **kwargs: Any, ) -> None: self.buff = buff if direction is not _UNSET and end is not None: - raise ValueError("You can specify either the 'end' or the 'direction' of the Vector at the same time, not both.") + raise ValueError( + "You can specify either the 'end' or the 'direction' of the Vector at the same time, not both." + ) if direction is not _UNSET: if len(direction) == 2: - direction = np.hstack([direction, 0]) + direction = np.hstack([direction, 0]) end = start + direction elif end is None: - end = RIGHT - super().__init__(start=start, end=end, buff=buff, tip_shape = tip_shape, **kwargs) + end = RIGHT + super().__init__(start=start, end=end, buff=buff, tip_shape=tip_shape, **kwargs) def coordinate_label( self, @@ -808,13 +814,13 @@ def coordinate_label( show_start_label Shows the coordinate of starting point of the vector, if it is set to True. Default value is False. show_end_label - Shows the coordinate of the end point of the vector, if it is set to True. Default value is True. + Shows the coordinate of the end point of the vector, if it is set to True. Default value is True. decimals number of digits in decimal place, if 'show_labels_as_integers' is set to False. Default is 2. buff buffer distance along the vector's direction at which the coordinate is to be shown. buff_multiplier - Stretches the buff. + Stretches the buff. kwargs Additional arguments to be passed to :class:`~.Matrix`. @@ -829,21 +835,21 @@ def coordinate_label( -------- class VectorCoordinateLabel1(Scene): def construct(self): - plane = NumberPlane() - vec = Vector(start = [-2,-2,0], direction = [3,2.6]) + plane = NumberPlane() + vec = Vector(start = [-2,-2,0], direction = [3,2.6]) label = vec.coordinate_label(color = RED, show_start_label=True) self.add(plane, vec, label) vec.add_updater(lambda x,dt: x.rotate(2*PI*dt*0.2, about_point= x.get_center())) def upd_label(mob): - mob.become(vec.coordinate_label(color = RED, show_start_label=True)) - label.add_updater(upd_label) + mob.become(vec.coordinate_label(color = RED, show_start_label=True)) + label.add_updater(upd_label) self.wait(5) class VectorCoordinateLabel2(Scene): def construct(self): plane = NumberPlane() vec_1 = Vector(color = ORANGE, tip_shape=StealthTip) - vec_2 = Vector(start = [-1,-2], end = [3,2], color = GREEN, tip_shape= StealthTip) + vec_2 = Vector(start = [-1,-2], end = [3,2], color = GREEN, tip_shape= StealthTip) label_2 = vec_2.coordinate_label(color = RED, show_start_label= True) self.add(plane,vec_1, vec_2, label_2) @@ -862,10 +868,13 @@ def construct(self): self.add(plane, vec_1, vec_2, label_1, label_2) """ if not show_start_label and not show_end_label: - raise ValueError("Atleast one of show_start_label or show_end_label must be set to True") - + raise ValueError( + "Atleast one of show_start_label or show_end_label must be set to True" + ) + # avoiding circular imports from ..matrix import Matrix + start_coordinate = np.array(self.get_start()) end_coordinate = np.array(self.get_end()) if show_labels_as_integers: @@ -873,26 +882,36 @@ def construct(self): end_coordinate = np.round(end_coordinate).astype(int) start_coordinate = start_coordinate[:n_dim] end_coordinate = end_coordinate[:n_dim] - start_coordinate = np.round(start_coordinate, decimals=decimals).reshape((n_dim, 1)) + start_coordinate = np.round(start_coordinate, decimals=decimals).reshape( + (n_dim, 1) + ) end_coordinate = np.round(end_coordinate, decimals=decimals).reshape((n_dim, 1)) start_label = Matrix(start_coordinate, **kwargs) end_label = Matrix(end_coordinate, **kwargs) start_label.scale(LARGE_BUFF - 0.2) end_label.scale(LARGE_BUFF - 0.2) - + vector_direction = self.get_unit_vector() - start_label_shift_dir = self.get_start() - vector_direction * buff_multiplier * buff - start_label.get_center() - end_label_shift_dir = self.get_end() + vector_direction * buff_multiplier * buff - end_label.get_center() + start_label_shift_dir = ( + self.get_start() + - vector_direction * buff_multiplier * buff + - start_label.get_center() + ) + end_label_shift_dir = ( + self.get_end() + + vector_direction * buff_multiplier * buff + - end_label.get_center() + ) start_label.shift(start_label_shift_dir) end_label.shift(end_label_shift_dir) if color is not None: start_label.set_color(color) - end_label.set_color(color) - + end_label.set_color(color) + if show_start_label and show_end_label: - return VGroup(start_label, end_label) + return VGroup(start_label, end_label) elif show_end_label: return end_label return start_label @@ -944,14 +963,14 @@ def construct(self): """ def __init__( - self, - *args, - start: Point3DLike = LEFT, - end: Point3DLike = RIGHT, - tip_shape_at_start: type[ArrowTip] = ArrowTriangleFilledTip, - tip_shape_at_end: type[ArrowTip] = ArrowTriangleFilledTip, - **kwargs: Any - ) -> None: + self, + *args, + start: Point3DLike = LEFT, + end: Point3DLike = RIGHT, + tip_shape_at_start: type[ArrowTip] = ArrowTriangleFilledTip, + tip_shape_at_end: type[ArrowTip] = ArrowTriangleFilledTip, + **kwargs: Any, + ) -> None: if "tip_shape_start" in kwargs: warnings.warn( "tip_shape_start is deprecated. Use tip_shape_at_start instead.", @@ -967,9 +986,9 @@ def __init__( ) tip_shape_at_end = kwargs.pop("tip_shape_end") if len(args) == 0: - super().__init__(start = start, end = end, tip_shape = tip_shape_at_end, **kwargs) + super().__init__(start=start, end=end, tip_shape=tip_shape_at_end, **kwargs) else: - super().__init__(*args, tip_shape = tip_shape_at_end, **kwargs) + super().__init__(*args, tip_shape=tip_shape_at_end, **kwargs) self.add_tip(at_start=True, tip_shape=tip_shape_at_start) From 7c22d7222f1ccc2fbc96d8a32cb2a4ed91919208 Mon Sep 17 00:00:00 2001 From: GoThrones Date: Sat, 30 May 2026 17:01:17 +0530 Subject: [PATCH 3/6] fixed a few errors --- manim/mobject/geometry/line.py | 16 ++++++++-------- manim/scene/vector_space_scene.py | 7 ++++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index ea88799183..97180addfa 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -597,7 +597,7 @@ def construct(self): def __init__( self, *args: Any, - start: Point3DLike = ORIGIN, + start: Point3DLike = LEFT, end: Point3DLike = RIGHT, stroke_width: float = 6, buff: float = MED_SMALL_BUFF, @@ -613,9 +613,9 @@ def __init__( start = np.hstack([start, 0]) if len(end) == 2: end = np.hstack([end, 0]) - super().__init__(start=start, end=end, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] + super().__init__(start=start, end=end, buff=buff, stroke_width=stroke_width, **kwargs) else: - super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) + super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] # TODO, should this be affected when # Arrow.set_stroke is called? self.initial_stroke_width = self.stroke_width @@ -765,8 +765,8 @@ def construct(self): """ def __init__( self, - direction: Vector2DLike | Vector3DLike | None = _UNSET, - start: Point3DLike | None = ORIGIN, + direction: Vector2DLike | Vector3DLike = _UNSET, + start: Point3DLike = ORIGIN, end: Point3DLike | None = None, buff: float = 0, tip_shape: type[ArrowTip] = ArrowTriangleFilledTip, @@ -780,7 +780,7 @@ def __init__( direction = np.hstack([direction, 0]) end = start + direction elif end is None: - end = RIGHT + end = RIGHT super().__init__(start=start, end=end, buff=buff, tip_shape = tip_shape, **kwargs) def coordinate_label( @@ -862,7 +862,7 @@ def construct(self): self.add(plane, vec_1, vec_2, label_1, label_2) """ if not show_start_label and not show_end_label: - raise ValueError("Atleast one of show_start_label or show_end_label must be set to True") + raise ValueError("At least one of show_start_label or show_end_label must be set to True") # avoiding circular imports from ..matrix import Matrix @@ -945,7 +945,7 @@ def construct(self): def __init__( self, - *args, + *args: Any, start: Point3DLike = LEFT, end: Point3DLike = RIGHT, tip_shape_at_start: type[ArrowTip] = ArrowTriangleFilledTip, diff --git a/manim/scene/vector_space_scene.py b/manim/scene/vector_space_scene.py index 2b56655c07..b68f4519c0 100644 --- a/manim/scene/vector_space_scene.py +++ b/manim/scene/vector_space_scene.py @@ -516,7 +516,12 @@ def vector_to_coords( else: arrow = Vector(vector) show_creation = True - array = arrow.coordinate_label(show_labels_as_integers=integer_labels) + array = arrow.coordinate_label( + show_labels_as_integers=integer_labels, + show_start_label=False, + show_end_label=True, + ) + assert isinstance(array, Matrix) x_line = Line(ORIGIN, vector[0] * RIGHT) y_line = Line(x_line.get_end(), arrow.get_end()) x_line.set_color(X_COLOR) From be7f12bd8e42cbb1eae23973bd61caed5ee7452b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 30 May 2026 11:36:06 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/mobject/geometry/line.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index a7e7ad993f..97aa5362a9 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -617,7 +617,7 @@ def __init__( start=start, end=end, buff=buff, stroke_width=stroke_width, **kwargs ) # type: ignore[misc] else: - super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] + super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] # TODO, should this be affected when # Arrow.set_stroke is called? self.initial_stroke_width = self.stroke_width @@ -771,7 +771,7 @@ def __init__( self, direction: Vector2DLike | Vector3DLike = _UNSET, start: Point3DLike = ORIGIN, - end: Point3DLike | None = None, + end: Point3DLike | None = None, buff: float = 0, tip_shape: type[ArrowTip] = ArrowTriangleFilledTip, **kwargs: Any, From 6493fb845c3a754196282f82fa1087d30a3b5a7b Mon Sep 17 00:00:00 2001 From: GoThrones Date: Sat, 30 May 2026 18:46:58 +0530 Subject: [PATCH 5/6] fixed some more errors --- docs/source/conduct.md | 2 +- manim/mobject/geometry/line.py | 10 +++++----- manim/scene/vector_space_scene.py | 5 ++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/source/conduct.md b/docs/source/conduct.md index a3613c99f0..9c7b4f37b8 120000 --- a/docs/source/conduct.md +++ b/docs/source/conduct.md @@ -1 +1 @@ -../../CODE_OF_CONDUCT.md \ No newline at end of file +../../CODE_OF_CONDUCT.md diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index a7e7ad993f..b363892f68 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -615,9 +615,9 @@ def __init__( end = np.hstack([end, 0]) super().__init__( start=start, end=end, buff=buff, stroke_width=stroke_width, **kwargs - ) # type: ignore[misc] + ) else: - super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] + super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] # TODO, should this be affected when # Arrow.set_stroke is called? self.initial_stroke_width = self.stroke_width @@ -771,7 +771,7 @@ def __init__( self, direction: Vector2DLike | Vector3DLike = _UNSET, start: Point3DLike = ORIGIN, - end: Point3DLike | None = None, + end: Point3DLike | None = None, buff: float = 0, tip_shape: type[ArrowTip] = ArrowTriangleFilledTip, **kwargs: Any, @@ -869,7 +869,7 @@ def construct(self): """ if not show_start_label and not show_end_label: raise ValueError( - "Atleast one of show_start_label or show_end_label must be set to True" + "At least one of show_start_label or show_end_label must be set to True" ) # avoiding circular imports @@ -964,7 +964,7 @@ def construct(self): def __init__( self, - *args, + *args: Any, start: Point3DLike = LEFT, end: Point3DLike = RIGHT, tip_shape_at_start: type[ArrowTip] = ArrowTriangleFilledTip, diff --git a/manim/scene/vector_space_scene.py b/manim/scene/vector_space_scene.py index b68f4519c0..0f40615d63 100644 --- a/manim/scene/vector_space_scene.py +++ b/manim/scene/vector_space_scene.py @@ -229,7 +229,8 @@ def write_vector_coordinates(self, vector: Vector, **kwargs: Any) -> Matrix: :class:`.Matrix` The column matrix representing the vector. """ - coords: Matrix = vector.coordinate_label(**kwargs) + coords = vector.coordinate_label(**kwargs) + assert isinstance(coords, Matrix) self.play(Write(coords)) return coords @@ -528,7 +529,9 @@ def vector_to_coords( y_line.set_color(Y_COLOR) temp = array.get_entries() x_coord = temp.submobjects[0] + assert isinstance(x_coord, MathTex) y_coord = temp.submobjects[1] + assert isinstance(y_coord, MathTex) x_coord_start = self.position_x_coordinate(x_coord.copy(), x_line, vector) y_coord_start = self.position_y_coordinate(y_coord.copy(), y_line, vector) brackets = array.get_brackets() From 8a2215c2adfccdb7f8c086cd3923e24ed8b255a1 Mon Sep 17 00:00:00 2001 From: GoThrones Date: Sat, 30 May 2026 20:18:40 +0530 Subject: [PATCH 6/6] revert conduct.md to original state --- docs/source/conduct.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conduct.md b/docs/source/conduct.md index 9c7b4f37b8..a3613c99f0 120000 --- a/docs/source/conduct.md +++ b/docs/source/conduct.md @@ -1 +1 @@ -../../CODE_OF_CONDUCT.md +../../CODE_OF_CONDUCT.md \ No newline at end of file