
    ljIC                       U d Z ddlmZ g dZddlmZmZ ddlZddl	m
Z
 ddlT ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddlmZ ddlmZ i Zded<    G d dee          Z G d de          Z G d dee          ZdS )zMobjects representing numbers.    )annotations)DecimalNumberIntegerVariable)AnySelfN)config)*)ConvertToOpenGL)MathTexSingleStringMathTexTex)Text)VMobject)ValueTracker)Vector3DLikezdict[str, SingleStringMathTex]string_to_mob_mapc                       e Zd ZdZddedddddddeeddfd5 fdZed6d!            Z	e	j
        d7d$            Z	d8d%Zd9d(Z	 d:d;d,Zd<d-Zd=d.Zd>d0Zd6d1Zd?d@d4Z xZS )Ar   a  An mobject representing a decimal number.

    Parameters
    ----------
    number
        The numeric value to be displayed. It can later be modified using :meth:`.set_value`.
    num_decimal_places
        The number of decimal places after the decimal separator. Values are automatically rounded.
    mob_class
        The class for rendering digits and units, by default :class:`.MathTex`.
    include_sign
        Set to ``True`` to include a sign for positive numbers and zero.
    group_with_commas
        When ``True`` thousands groups are separated by commas for readability.
    digit_buff_per_font_unit
        Additional spacing between digits. Scales with font size.
    show_ellipsis
        When a number has been truncated by rounding, indicate with an ellipsis (``...``).
    unit
        A unit string which can be placed to the right of the numerical values.
    unit_buff_per_font_unit
        An additional spacing between the numerical values and the unit. A value
        of ``unit_buff_per_font_unit=0.003`` gives a decent spacing. Scales with font size.
    include_background_rectangle
        Adds a background rectangle to increase contrast on busy scenes.
    edge_to_fix
        Assuring right- or left-alignment of the full object.
    font_size
        Size of the font.

    Examples
    --------

    .. manim:: MovingSquareWithUpdaters

        class MovingSquareWithUpdaters(Scene):
            def construct(self):
                decimal = DecimalNumber(
                    0,
                    show_ellipsis=True,
                    num_decimal_places=3,
                    include_sign=True,
                    unit=r"\text{M-Units}",
                    unit_buff_per_font_unit=0.003
                )
                square = Square().to_edge(UP)

                decimal.add_updater(lambda d: d.next_to(square, RIGHT))
                decimal.add_updater(lambda d: d.set_value(square.get_center()[1]))
                self.add(square, decimal)
                self.play(
                    square.animate.to_edge(DOWN),
                    rate_func=there_and_back,
                    run_time=5,
                )
                self.wait()

    r      FTgMbP?Ng      ?numberfloatnum_decimal_placesint	mob_classtype[SingleStringMathTex]include_signboolgroup_with_commasdigit_buff_per_font_unitshow_ellipsisunit
str | Noneunit_buff_per_font_unitinclude_background_rectangleedge_to_fixr   	font_sizestroke_widthfill_opacitykwargsr   c                    t                      j        di |||d || _        || _        || _        || _        || _        || _        || _        || _	        |	| _
        |
| _        || _        || _        || _        |                                | _        | j                            |||||||	|
||||d           |                     |           |                                  d S )N)r(   r'   )r   r   r   r   r    r!   r#   r$   r%   r&   r'   r(    )super__init__r   r   r   r   r   r   r    r!   r#   r$   r%   
_font_sizer(   copyinitial_configupdate_set_submobjects_from_numberinit_colors)selfr   r   r   r   r   r   r    r!   r#   r$   r%   r&   r'   r(   r)   	__class__s                   U/home/agentuser/manim-venv/lib/python3.11/site-packages/manim/mobject/text/numbers.pyr-   zDecimalNumber.__init__S   s   $ 	XX6X<XXXXX"4("!2(@%*	'>$,H)&#($kkmm""&8 ,%6,D!.+B0L*& , , 	
 	
 	
" 	))&111    returnc                4    | j         | j        z  | j        z  }|S )z!The font size of the tex mobject.)heightinitial_heightr.   )r4   return_values     r6   r&   zDecimalNumber.font_size   s      #kD,??$/Qr7   font_valNonec                    |dk    rt          d          | j        dk    r|                     || j        z             d S d S )Nr   z!font_size must be greater than 0.)
ValueErrorr:   scaler&   )r4   r=   s     r6   r&   zDecimalNumber.font_size   sM    q==@AAA[1__ JJx$.011111 _r7   c                   || _         g | _        |                     |          } | j        t	          | j        |            | j        r5|                     |                     dt          | j                             | 	                    | j
        | j        z  t                     | j        u|                     | j        t                    | _        |                     | j                            | t           | j        | j
        z   | j        z  t                               |                     t&                     t)          |          D ]\  }}|dk    rut+          |          |dz   k    r_| |                             | |dz            t.                     | |                             | |dz            j        t          z  dz             |dk    r1| |                             | |         j        t          z  dz             | j        r:| j                            d	          r | j                            | t.                     | j        | _        | j        r|                                  d S d S )
Nz\dots)color)buffaligned_edge)	directionrD   rE   -   r   ,^)r   submobjects_get_num_stringaddmap_string_to_mobr    r   rC   arranger   r.   DOWNr!   	unit_signnext_toRIGHTr#   move_toORIGIN	enumeratelenalign_toUPshiftr:   
startswithr;   r$   add_background_rectangle)r4   r   
num_stringics        r6   r2   z*DecimalNumber._set_submobjects_from_number   s`   ))&11
3t*J7799  	HH##H.A#TT   	.@ 	 	
 	
 	

 9 !00<OPPDNHH&&#69VVo&!% '     	V j)) 	9 	9DAqCxxC
OOa!e33Q  a!eb111Qd1q5k047!;<<<<cQd1gnt3a78889 	.--c22 	.N##D"--- &*[, 	,))+++++	, 	,r7   float | complexstrc                R   t          |t                    r|                                 }n|                                 }|                    |          }t          j        || j                  }|                    d          r$|dk    r| j	        rd|dd          z   n	|dd          }|S )NrG   r   +rH   )

isinstancecomplex_get_complex_formatter_get_formatterformatnproundr   r\   r   )r4   r   	formatterr^   rounded_nums        r6   rL   zDecimalNumber._get_num_string   s    fg&& 	.3355II++--I%%f--
hvt'>??  %% 	W+*:*:151BVz!""~--
STSUSUJr7   string type[SingleStringMathTex] | Noner   c                    || j         }|t          vr ||fi |t          |<   t          |                                         }| j        |_        |S N)r   r   r/   r.   r&   )r4   rn   r   r)   mobs        r6   rO   zDecimalNumber._string_to_mob   s^     I***(1	&(C(CF(C(Cf%',,..
r7   c                      fddD             } |j         |           d                    d |j        dd          d|d         rdnd|d	         rd
nddt          |d                   ddg	          S )a  
        Configuration is based first off instance attributes,
        but overwritten by any kew word argument.  Relevant
        key words:
        - include_sign
        - group_with_commas
        - num_decimal_places
        - field_name (e.g. 0 or 0.real)
        c                2    i | ]}|t          |          S r+   )getattr).0attrr4   s     r6   
<dictcomp>z0DecimalNumber._get_formatter.<locals>.<dictcomp>   s5     
 
 
 '$%%
 
 
r7   )r   r   r    {
field_name:r   rd   r   rI   .r   f})r1   joingetrb   )r4   r)   r	   s   `  r6   rh   zDecimalNumber._get_formatter   s    
 
 
 

 
 
 	fww
<,,n-5212:F/011

 
 	
r7   c                    d                     |                     d          |                     dd          dg          S )Nry   z0.real)r{   z0.imagT)r{   r   r_   )r   rh   r4   s    r6   rg   z$DecimalNumber._get_complex_formatter	  sJ    ww##x#88##xd#KK
 
 	
r7   r   c                   |                                  }| j        }|                     | j                  }| j        }|                     |           || _        |                     || j                   t          | j        |d          D ]\  }}|                    |           t          j
        t          j        k    r|D ]}d|j        dd<   |                                  | S )zSet the value of the :class:`~.DecimalNumber` to a new number.

        Parameters
        ----------
        number
            The value that will overwrite the current number of the :class:`~.DecimalNumber`.

        F)strictr   N)
get_familyr&   get_edge_centerr%   rK   r2   rU   zipmatch_styler	   rendererRendererTypeCAIROpointsr3   )	r4   r   
old_familyold_font_sizemove_to_pointold_submobjectssm1sm2rr   s	            r6   	set_valuezDecimalNumber.set_value  s     __&&
,,T-=>>*))&111&]D$4555D,oeLLL 	! 	!HCOOC    ?l000! " "
 !"
111r7   c                    | j         S rq   )r   r   s    r6   	get_valuezDecimalNumber.get_value7  s
    {r7   rH   delta_tc                Z    |                      |                                 |z              d S rq   )r   r   )r4   r   s     r6   increment_valuezDecimalNumber.increment_value:  s)    t~~'''122222r7   )r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r"   r#   r   r$   r   r%   r   r&   r   r'   r   r(   r   r)   r   )r8   r   )r=   r   r8   r>   )r   r   r8   r>   )r   ra   r8   rb   rq   )rn   rb   r   ro   r)   r   r8   r   )r)   r   r8   rb   )r8   rb   )r   r   r8   r   )rH   )r   r   r8   r>   )__name__
__module____qualname____doc__r   LEFTDEFAULT_FONT_SIZEr-   propertyr&   setterr2   rL   rO   rh   rg   r   r   r   __classcell__r5   s   @r6   r   r      sp       9 9z "#/6""&*/#)*-2$(,!4 4 4 4 4 4 4l    X
 	2 	2 	2 	2/, /, /, /,b     7;    
 
 
 
B
 
 
 
# # # #J   3 3 3 3 3 3 3 3 3r7   r   )	metaclassc                  4     e Zd ZdZ	 dd fdZd fdZ xZS )r   a^  A class for displaying Integers.

    Examples
    --------

    .. manim:: IntegerExample
        :save_last_frame:

        class IntegerExample(Scene):
            def construct(self):
                self.add(Integer(number=2.5).set_color(ORANGE).scale(2.5).set_x(-0.5).set_y(0.8))
                self.add(Integer(number=3.14159, show_ellipsis=True).set_x(3).set_y(3.3).scale(3.14159))
                self.add(Integer(number=42).set_x(2.5).set_y(-2.3).set_color_by_gradient(BLUE, TEAL).scale(1.7))
                self.add(Integer(number=6.28).set_x(-1.5).set_y(-2).set_color(YELLOW).scale(1.4))
    r   r   r   r   r   r)   r   r8   r>   c                @     t                      j        d||d| d S )N)r   r   r+   )r,   r-   )r4   r   r   r)   r5   s       r6   r-   zInteger.__init__O  s1     	X;MXXQWXXXXXr7   c                    t          t          j        t                                                                          S rq   )r   rj   rk   r,   r   )r4   r5   s    r6   r   zInteger.get_valueT  s+    28EGG--//00111r7   )r   r   )r   r   r   r   r)   r   r8   r>   )r8   r   )r   r   r   r   r-   r   r   r   s   @r6   r   r   >  sv         " <=Y Y Y Y Y Y Y
2 2 2 2 2 2 2 2 2 2r7   r   c                  *     e Zd ZdZedfd fdZ xZS )r   a  A class for displaying text that shows "label = value" with
    the value continuously updated from a :class:`~.ValueTracker`.

    Parameters
    ----------
    var
        The initial value you need to keep track of and display.
    label
        The label for your variable. Raw strings are convertex to :class:`~.MathTex` objects.
    var_type
        The class used for displaying the number. Defaults to :class:`DecimalNumber`.
    num_decimal_places
        The number of decimal places to display in your variable. Defaults to 2.
        If `var_type` is an :class:`Integer`, this parameter is ignored.
    kwargs
            Other arguments to be passed to `~.Mobject`.

    Attributes
    ----------
    label : Union[:class:`str`, :class:`~.Tex`, :class:`~.MathTex`, :class:`~.Text`, :class:`~.SingleStringMathTex`]
        The label for your variable, for example ``x = ...``.
    tracker : :class:`~.ValueTracker`
        Useful in updating the value of your variable on-screen.
    value : Union[:class:`DecimalNumber`, :class:`Integer`]
        The tex for the value of your variable.

    Examples
    --------
    Normal usage::

        # DecimalNumber type
        var = 0.5
        on_screen_var = Variable(var, Text("var"), num_decimal_places=3)
        # Integer type
        int_var = 0
        on_screen_int_var = Variable(int_var, Text("int_var"), var_type=Integer)
        # Using math mode for the label
        on_screen_int_var = Variable(int_var, "{a}_{i}", var_type=Integer)

    .. manim:: VariablesWithValueTracker

        class VariablesWithValueTracker(Scene):
            def construct(self):
                var = 0.5
                on_screen_var = Variable(var, Text("var"), num_decimal_places=3)

                # You can also change the colours for the label and value
                on_screen_var.label.set_color(RED)
                on_screen_var.value.set_color(GREEN)

                self.play(Write(on_screen_var))
                # The above line will just display the variable with
                # its initial value on the screen. If you also wish to
                # update it, you can do so by accessing the `tracker` attribute
                self.wait()
                var_tracker = on_screen_var.tracker
                var = 10.5
                self.play(var_tracker.animate.set_value(var))
                self.wait()

                int_var = 0
                on_screen_int_var = Variable(
                    int_var, Text("int_var"), var_type=Integer
                ).next_to(on_screen_var, DOWN)
                on_screen_int_var.label.set_color(RED)
                on_screen_int_var.value.set_color(GREEN)

                self.play(Write(on_screen_int_var))
                self.wait()
                var_tracker = on_screen_int_var.tracker
                var = 10.5
                self.play(var_tracker.animate.set_value(var))
                self.wait()

                # If you wish to have a somewhat more complicated label for your
                # variable with subscripts, superscripts, etc. the default class
                # for the label is MathTex
                subscript_label_var = 10
                on_screen_subscript_var = Variable(subscript_label_var, "{a}_{i}").next_to(
                    on_screen_int_var, DOWN
                )
                self.play(Write(on_screen_subscript_var))
                self.wait()

    .. manim:: VariableExample

        class VariableExample(Scene):
            def construct(self):
                start = 2.0

                x_var = Variable(start, 'x', num_decimal_places=3)
                sqr_var = Variable(start**2, 'x^2', num_decimal_places=3)
                Group(x_var, sqr_var).arrange(DOWN)

                sqr_var.add_updater(lambda v: v.tracker.set_value(x_var.tracker.get_value()**2))

                self.add(x_var, sqr_var)
                self.play(x_var.tracker.animate.set_value(5), run_time=2, rate_func=linear)
                self.wait(0.1)

    r   varr   label0str | Tex | MathTex | Text | SingleStringMathTexvar_typetype[DecimalNumber | Integer]r   r   r)   r   c                    t          |t                    rt          |          n| _        t          d                               j        t
                    } j                            |           t          |           _        |t          k    r.t           j        
                                |           _        n6|t          k    r+t           j        
                                           _         j                             fd                               j        t
                      t                      j        di |                       j         j                   d S )N=)r   c                \    |                      j                                                  S rq   )r   trackerr   )vr4   s    r6   <lambda>z#Variable.__init__.<locals>.<lambda>  s!    T\5K5K5M5M)N)N r7   r+   )re   rb   r   r   rS   rT   rM   r   r   r   r   valuer   add_updaterr,   r-   )r4   r   r   r   r   r)   equalsr5   s   `      r6   r-   zVariable.__init__  s>    (2%'='=HWU^^^5
%%dj%88
v#C((}$$&&&((#5  DJJ    !7!7!9!9::DJ
NNNNOOWWJ	
 	
 	

 	""6"""TZ(((((r7   )
r   r   r   r   r   r   r   r   r)   r   )r   r   r   r   r   r-   r   r   s   @r6   r   r   X  sX        d dT 3@"#) ) ) ) ) ) ) ) ) ) )r7   r   )r   
__future__r   __all__typingr   r   numpyrj   manimr	   manim.constants)manim.mobject.opengl.opengl_compatibilityr   manim.mobject.text.tex_mobjectr   r   r   manim.mobject.text.text_mobjectr   &manim.mobject.types.vectorized_mobjectr   manim.mobject.value_trackerr   manim.typingr   r   __annotations__r   r   r   r+   r7   r6   <module>r      s   $ $ $ " " " " " "
2
2
2                       E E E E E E L L L L L L L L L L 0 0 0 0 0 0 ; ; ; ; ; ; 4 4 4 4 4 4 % % % % % %46  6 6 6 6d3 d3 d3 d3 d3H d3 d3 d3 d3N	2 2 2 2 2m 2 2 24C) C) C) C) C)x? C) C) C) C) C) C)r7   