Source code for ptr.axis

"""PTR axis module."""

from .element import Element


AXIS = {
    'X': [1, 0, 0],
    'Y': [0, 1, 0],
    'Z': [0, 0, 1],
}


def invert(vec):
    """Invert vector values."""
    return [-1 * v for v in vec]


def parse_vector(*axis):
    """Parse axis vector.

    Parameters
    ----------
    *axis: tuple or str
        Axis vector tuple or name (eg. ``(1, 0, 0)`` or '-Y').

    Returns
    -------
    list
        X, Y, Z vector components.

    """
    if len(axis) == 1 and isinstance(axis[0], str):
        name = axis[0]
        vec = name.upper()[-1]

        if vec not in ['X', 'Y', 'Z']:
            raise ValueError('Only (+/-) X, Y, Z are considered as valid.')

        vec = AXIS[vec]

        if name.startswith('-'):
            vec = invert(vec)

    elif len(axis) == 3:
        vec = list(axis)

    else:
        raise ValueError('This axis vector must have 3 components (x, y, z).')

    return vec


[docs]class ElementAxis(Element): """PTR axis element. Parameters ---------- frame: str Element reference frame. *axis: tuple or str Axis vector tuple or axis name (eg. '-Y'). description: str or list, optional Axis description, put as a xml-comment on top of the element. """ def __init__(self, frame, *axis, description=None): self.vec = parse_vector(*axis) super().__init__( f'{frame}Axis', {'x': self.x, 'y': self.y, 'z': self.z}, frame=frame, description=description, ) @property def frame(self): """Axis frame attribute.""" return self.attrs['frame'] def __neg__(self): return ElementAxis(self.frame, *invert(self.vec)) def __pos__(self): return ElementAxis(self.frame, *self.vec) @property def x(self): """X-axis value.""" return self.vec[0] @property def y(self): """Y-axis value.""" return self.vec[1] @property def z(self): """Z-axis value.""" return self.vec[2]
[docs]class ScAxis(ElementAxis): """PTR spacecraft axis element. Parameters ---------- *xyz: tuple or str Spacecraft vector tuple or axis name (eg. ``(1, 0, 0)`` or '-Y'). description: str or list, optional Axis description, put as a xml-comment on top of the element. """ def __init__(self, *axis, description=None): super().__init__('SC', *axis, description=description)
# Spacecraft axis shortcuts xScAxis = ScAxis('X') yScAxis = ScAxis('Y') zScAxis = ScAxis('Z')