import typing

from abaqusConstants import *


class Path:
    """The Path object defines a line through your model by specifying a series of nodes or
    points.

    Attributes
    ----------
    coordinates: list[tuple[float]]
        If **type=NODE_LIST**, **coordinates** is a sequence of tuples of three Floats. This can be
        used as the value for the **expression** argument when creating a :py:class:`~abaqus.PathAndProbe.Path.Path` object of **type** =
        POINT_LIST.

    Notes
    -----
    This object can be accessed by:

    .. code-block:: python

        import visualization
        session.paths[name]

    """

    # If *type*=NODE_LIST, *coordinates* is a sequence of tuples of three Floats. This can be
    # used as the value for the *expression* argument when creating a Path object of *type* =
    # POINT_LIST.
    coordinates: list[tuple[float]] = []

    def __init__(
        self,
        name: str,
        type: SymbolicConstant,
        expression: tuple,
        circleDefinition: SymbolicConstant,
        numSegments: int,
        startAngle: float,
        endAngle: float,
        radius: typing.Union[SymbolicConstant, float],
        radialAngle: float,
        startRadius: typing.Union[SymbolicConstant, float],
        endRadius: typing.Union[SymbolicConstant, float],
    ):
        """This method creates a Path object.

        Notes
        -----
        This function can be accessed by:

        .. code-block:: python

            session.Path

        Parameters
        ----------
        name
            A String specifying the repository key.
        type
            A SymbolicConstant specifying the type of path being created. Possible values are
            NODE_LIST, POINT_LIST, EDGE_LIST, CIRCUMFERENTIAL, and RADIAL.
        expression
            A sequence specifying the nodes or points that make up the path. The definition of the
            path expression depends on the *type* argument.
            - If *type*=NODE_LIST, *expression* must be a sequence of sequences. Each inner sequence
            contains two items, the first item is a String specifying the name of a part instance,
            and the second item can be either a sequence of Ints or a sequence of Strings, each
            specifying a range of Ints.
            - If *type*=POINT_LIST, *expression* must be a sequence of tuples of three Floats,
            specifying the coordinates of each point.
            - If *type*=EDGE_LIST, *expression* must be a sequence of sequences. Each inner sequence
            contains two items, the first item is a String specifying the name of the part instance,
            and the second item is a sequence of tuples of four Ints that uniquely identify an
            element edge. The four Ints are:
            1. The element label.
            2. The element face index (one-based).
            3. The face edge index (one-based).
            4. The edge direction. A positive number specifies that the edge direction runs from the
            edge start node to the edge end node. A negative number specifies the opposite.
            - When *type*=CIRCUMFERENTIAL or RADIAL, *expression* must be a sequence of three tuples
            of three Floats, specifying the coordinates of the points used to define a coordinate
            system.
        circleDefinition
            A SymbolicConstant specifying the method in which the circle is being defined. This
            argument is valid only when *type*=CIRCUMFERENTIAL or RADIAL. Possible values are
            ORIGIN_AXIS and POINT_ARC.When the value is ORIGIN_AXIS, the first two points in
            *expression* are points on the rotational axis and the third point lies on the x-axis.
            When the value is POINT_ARC, the three points in *expression* are points lying on the
            arc of the circle.
        numSegments
            An Int specifying the number of equal segments in the path. This argument is valid only
            when *type*=CIRCUMFERENTIAL or RADIAL.
        startAngle
            A Float specifying the start angle of the circumferential path. This argument is valid
            only when *type*=CIRCUMFERENTIAL.
        endAngle
            A Float specifying the end angle of the circumferential path. This argument is valid
            only when *type*=CIRCUMFERENTIAL.
        radius
            The SymbolicConstant CIRCLE_RADIUS or a Float specifying the radius of the
            circumferential path. This argument is valid only when *type*=CIRCUMFERENTIAL.
        radialAngle
            A Float specifying the angle between the radial path and the *X*-axis of the specified
            coordinate system. This argument is valid only when *type*=RADIAL.
        startRadius
            The SymbolicConstant CIRCLE_RADIUS or a Float specifying the start radius of the radial
            path. This argument is valid only when *type*=RADIAL.
        endRadius
            The SymbolicConstant CIRCLE_RADIUS or a Float specifying the end radius of the radial
            path. This argument is valid only when *type*=RADIAL.

        Returns
        -------
            A Path object.

        Raises
        ------
            ModelError, ErrorUnsupportedNodeData, ErrorUnsupportedPointData, ErrorIncorrectPathData,
            KeyError, ErrorEmptyPathName, ErrorPathNotFound, and ErrorNoOdbPathDisplay.
            ValueError: When *type*=CIRCUMFERENTIAL or RADIAL, the three points specified in
            *expression* are collinear.
        """
        pass
