3b1b/manim · error · Exception
tip not found
Error message
tip not found
What it means
Raised by TipableVMobject.get_tip (manimlib/mobject/geometry.py:175) when get_tips() returns an empty list — the mobject has neither a 'tip' nor a 'start_tip' attribute. Tips are created by add_tip() (or automatically by Arrow), so a TipableVMobject that never gained a tip has nothing to return.
Source
Thrown at manimlib/mobject/geometry.py:175
def get_tips(self) -> VGroup:
"""
Returns a VGroup (collection of VMobjects) containing
the TipableVMObject instance's tips.
"""
result = VGroup()
if hasattr(self, "tip"):
result.add(self.tip)
if hasattr(self, "start_tip"):
result.add(self.start_tip)
return result
def get_tip(self) -> ArrowTip:
"""Returns the TipableVMobject instance's (first) tip,
otherwise throws an exception."""
tips = self.get_tips()
if len(tips) == 0:
raise Exception("tip not found")
else:
return tips[0]
def get_default_tip_length(self) -> float:
return self.tip_length
def get_first_handle(self) -> Vect3:
return self.get_points()[1]
def get_last_handle(self) -> Vect3:
return self.get_points()[-2]
def get_end(self) -> Vect3:
if self.has_tip():
return self.tip.get_start()
else:
return VMobject.get_end(self)
View on GitHub (pinned to dee01804d4)
Solutions
- Use an Arrow (which auto-creates a tip) or call mob.add_tip() before get_tip()
- Use get_tips() and check the result length instead of get_tip()
- Use hasattr(self, 'tip') / isinstance checks before tip-dependent logic
Example fix
# before
angle = line.get_tip() # raises: tip not found for plain Line
# after
angle = line.get_angle() # or:
tips = line.get_tips()
if tips:
angle = tips[0].get_angle() Defensive patterns
Strategy: validation
Validate before calling
tips = mob.get_tips()
if len(tips) == 0:
raise ValueError("no tip present; call add_tip() or use Arrow")
tip = tips[0] Type guard
def has_tip(mob) -> bool:
return len(mob.get_tips()) > 0 Try / catch
try:
tip = mob.get_tip()
except Exception as e:
if "tip not found" in str(e):
tip = None # handle tip-less vectors gracefully
else:
raise Prevention
- Prefer get_tips() over get_tip() in generic code
- Use Arrow instead of Line when tip-dependent logic follows
When it happens
Trigger: Calling get_tip() on a TipableVMobject subclass (e.g. Line used directly) without ever calling add_tip(); deleting/removing the tip from an Arrow then calling get_tip(); calling get_angle()/get_tip() helpers that internally rely on get_tip().
Common situations: Using Line instead of Arrow and then calling get_tip() for angle computation; writing generic code over vector-like mobjects where some have tips and some don't; removing tips after style changes.
Related errors
- Unsupported: {path_verb}
- Cannot position endpoints of closed loop
- Lines do not intersect
- At least 2 mobjects needed for Union.
- At least 2 mobjects needed for Intersection.
AI-assisted analysis of 3b1b/manim@dee01804d4 (2026-08-14).
Data as JSON: /api/errors/9ace5024b9078858.
Report an issue: GitHub.