class_docstr: Static class that resolves shape names to their corresponding
  shape drawer classes.
  
  Classes that are derived from L{ShapeDrawer} in this module are
  automatically registered by L{ShapeDrawerDirectory} when the module
  is loaded for the first time.
class_docstr_tok: ["Static","class","that","resolves","shape","names","to","their","corresponding","shape","drawer","classes",".","Classes","that","are","derived","from","L","{","ShapeDrawer","}","in","this","module","are","automatically","registered","by","L","{","ShapeDrawerDirectory","}","when","the","module","is","loaded","for","the","first","time","."]
docstr: Registers the given shape drawer class under the given names.
  
  @param drawer_class: the shape drawer class to be registered
docstr_tok: ["Registers","the","given","shape","drawer","class","under","the","given","names",".","@","param","drawer_class",":","the","shape","drawer","class","to","be","registered"]
code: def register(cls, drawer_class):
      """Registers the given shape drawer class under the given names.
  
      @param drawer_class: the shape drawer class to be registered
      """
      names = drawer_class.names
      if isinstance(names, str):
          names = names.split()
  
      for name in names:
          cls.known_shapes[name] = drawer_class
  
imports: from abc import ABCMeta, abstractmethod
  from math import atan2, copysign, cos, pi, sin
  import sys
  from igraph.drawing.matplotlib.utils import find_matplotlib
label_desc: Use image node_id 1 for calling the ShapeDrawerDirectory obj's underlying member method code with example usage: obj.register(cls, drawer_class) without return types