60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
from .. import axes, docstring
|
|
from .geo import AitoffAxes, HammerAxes, LambertAxes, MollweideAxes
|
|
from .polar import PolarAxes
|
|
from mpl_toolkits.mplot3d import Axes3D
|
|
|
|
|
|
class ProjectionRegistry:
|
|
"""A mapping of registered projection names to projection classes."""
|
|
|
|
def __init__(self):
|
|
self._all_projection_types = {}
|
|
|
|
def register(self, *projections):
|
|
"""Register a new set of projections."""
|
|
for projection in projections:
|
|
name = projection.name
|
|
self._all_projection_types[name] = projection
|
|
|
|
def get_projection_class(self, name):
|
|
"""Get a projection class from its *name*."""
|
|
return self._all_projection_types[name]
|
|
|
|
def get_projection_names(self):
|
|
"""Return the names of all projections currently registered."""
|
|
return sorted(self._all_projection_types)
|
|
|
|
|
|
projection_registry = ProjectionRegistry()
|
|
projection_registry.register(
|
|
axes.Axes,
|
|
PolarAxes,
|
|
AitoffAxes,
|
|
HammerAxes,
|
|
LambertAxes,
|
|
MollweideAxes,
|
|
Axes3D,
|
|
)
|
|
|
|
|
|
def register_projection(cls):
|
|
projection_registry.register(cls)
|
|
|
|
|
|
def get_projection_class(projection=None):
|
|
"""
|
|
Get a projection class from its name.
|
|
|
|
If *projection* is None, a standard rectilinear projection is returned.
|
|
"""
|
|
if projection is None:
|
|
projection = 'rectilinear'
|
|
|
|
try:
|
|
return projection_registry.get_projection_class(projection)
|
|
except KeyError as err:
|
|
raise ValueError("Unknown projection %r" % projection) from err
|
|
|
|
|
|
get_projection_names = projection_registry.get_projection_names
|
|
docstring.interpd.update(projection_names=get_projection_names())
|