Cleaned up ChangingDecimal

This commit is contained in:
Grant Sanderson 2019-02-09 15:35:44 -08:00
parent 2b64656f35
commit 73c20d726a

View file

@ -1,47 +1,52 @@
import warnings
from manimlib.animation.animation import Animation from manimlib.animation.animation import Animation
from manimlib.mobject.numbers import DecimalNumber
from manimlib.utils.bezier import interpolate from manimlib.utils.bezier import interpolate
from manimlib.utils.config_ops import digest_config
class ChangingDecimal(Animation): class ChangingDecimal(Animation):
CONFIG = { CONFIG = {
"num_decimal_places": None, "suspend_mobject_updating": False,
"show_ellipsis": None,
"position_update_func": None,
"include_sign": None,
"tracked_mobject": None,
} }
def __init__(self, decimal_number_mobject, number_update_func, **kwargs): def __init__(self, decimal_mob, number_update_func, **kwargs):
digest_config(self, kwargs, locals()) self.check_validity_of_input(decimal_mob)
if self.tracked_mobject: self.yell_about_depricated_configuration(**kwargs)
dmc = decimal_number_mobject.get_center() self.number_update_func = number_update_func
tmc = self.tracked_mobject.get_center() super().__init__(decimal_mob, **kwargs)
self.diff_from_tracked_mobject = dmc - tmc
self.diff_from_tracked_mobject = dmc - tmc def check_validity_of_input(self, decimal_mob):
Animation.__init__(self, decimal_number_mobject, **kwargs) if not isinstance(decimal_mob, DecimalNumber):
raise Exception(
"ChangingDecimal can only take "
"in a DecimalNumber"
)
def yell_about_depricated_configuration(self, **kwargs):
# Obviously this would optimally be removed at
# some point.
for attr in ["tracked_mobject", "position_update_func"]:
if attr in kwargs:
warnings.warn("""
Don't use {} for ChangingDecimal,
that functionality has been depricated
and you should use a mobject updater
instead
""".format(attr)
)
def interpolate_mobject(self, alpha): def interpolate_mobject(self, alpha):
self.update_number(alpha) self.mobject.set_value(
self.update_position()
def update_number(self, alpha):
self.decimal_number_mobject.set_value(
self.number_update_func(alpha) self.number_update_func(alpha)
) )
def update_position(self):
if self.position_update_func is not None:
self.position_update_func(self.decimal_number_mobject)
elif self.tracked_mobject is not None:
self.decimal_number_mobject.move_to(
self.tracked_mobject.get_center() + self.diff_from_tracked_mobject)
class ChangeDecimalToValue(ChangingDecimal): class ChangeDecimalToValue(ChangingDecimal):
def __init__(self, decimal_number_mobject, target_number, **kwargs): def __init__(self, decimal_mob, target_number, **kwargs):
start_number = decimal_number_mobject.number start_number = decimal_mob.number
super().__init__(
def func(alpha): decimal_mob,
return interpolate(start_number, target_number, alpha) lambda a: interpolate(start_number, target_number, a),
ChangingDecimal.__init__(self, decimal_number_mobject, func, **kwargs) **kwargs
)