a
    5ghf                     @  s  d dl mZ d dlmZmZ d dlZd dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZmZ d dlmZmZ erd dlmZ dd	d
dddZdd	d
dddZdd	d
dddZdd	d
dddZdd	d
dddZdd	d
dddZd
ddd
ddd Zd!d"d#d$d%d&Zd'd"d#d$d(d)Z d*d"d#d$d+d,Z!d-d"d#d$d.d/Z"d0d"d#d$d1d2Z#d#d3d3d#d4d5d6Z$d7ddd7d8d9d:Z%d;d3d3d;d<d=d>Z&dS )?    )annotations)TYPE_CHECKINGcastN)FillTypeLineType)as_fill_typeas_line_type)check_filledcheck_lines)MOVETOoffset_dtypezcpy.FillReturn_OuterCoder   zcpy.FillReturn)filledfill_type_toreturnc                 C  sD  |t jkr| S |t jkr2| d dd | d D fS t| d dkr`t| d }t| d }nd }d }|t jkr~|g|gfS |t jkr|g|d u rd nt	|gfS |t j
kr|d u rd nt| d }|g|g|gf}|S |t jkr2|d u rd gd gd gf}n(t	|}t| d }|g|g|gf}|S td| d S )Nr   c                 S  s   g | ]}t |qS  arroffsets_from_codes.0codesr   r   a/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/contourpy/convert.py
<listcomp>       z2_convert_filled_from_OuterCode.<locals>.<listcomp>   Invalid FillType )r   	OuterCodeOuterOffsetlenr   concat_pointsconcat_codesChunkCombinedCodeChunkCombinedOffsetr   ChunkCombinedCodeOffsetoffsets_from_lengthsChunkCombinedOffsetOffsetZ outer_offsets_from_list_of_codes
ValueError)r   r   pointsr   outer_offsetsret1ret2offsetsr   r   r   _convert_filled_from_OuterCode   s2    






r,   zcpy.FillReturn_OuterOffsetc           	      C  sX  |t jkr(dd | d D }| d |fS |t jkr6| S t| d dkrdt| d }t| d }nd }d }|t jkr|g|d u rd nt|gfS |t j	kr|g|gfS |t j
k r|d u rd gd gd gf}n(t|}t| d }|g|g|gf}|S |t jkrF|d u r$d gd gd gf}nt| d }|g|g|gf}|S td| d S )Nc                 S  s   g | ]}t |qS r   )r   codes_from_offsets)r   r+   r   r   r   r   :   r   z4_convert_filled_from_OuterOffset.<locals>.<listcomp>r   r   r   )r   r   r   r   r   r   Zconcat_offsetsr!   r-   r"   r#   r$   r%   Z"outer_offsets_from_list_of_offsetsr&   )	r   r   separate_codesr'   r+   r)   r   r(   r*   r   r   r    _convert_filled_from_OuterOffset5   s8    





r/   z cpy.FillReturn_ChunkCombinedCodec                 C  sR   |t jkr| S |t jkr6dd | d D }| d |fS tdt j d| dd S )Nc                 S  s"   g | ]}|d u rd nt |qS Nr   r   r   r   r   r   d   r   z:_convert_filled_from_ChunkCombinedCode.<locals>.<listcomp>r   r   Conversion from  to  not supported)r   r!   r"   r&   )r   r   r   r   r   r   &_convert_filled_from_ChunkCombinedCode]   s    

r4   z"cpy.FillReturn_ChunkCombinedOffsetc                 C  s   |t jkrbg }t|  D ]>\}}|d u r2|d  qtrB|d usBJ |t|| q| d |fS |t jkrp| S tdt j d| dd S )Nr   r1   r2   r3   )	r   r!   zipappendr   r   codes_from_offsets_and_pointsr"   r&   )r   r   chunk_codesr'   r+   r   r   r   (_convert_filled_from_ChunkCombinedOffsetk   s    

r9   z&cpy.FillReturn_ChunkCombinedCodeOffsetc                   s  |t jkrrg }g }t|  D ]N\}}}|d urtrH|d us<J |d usHJ |t||7 }|t||7 }q||fS |t jkrg }g }t|  D ]\\}}}|d urtr|d usJ |d usJ |t||7 }t||}|dd |D 7 }q||fS |t jkr| d | d f}|S |t j	kr@dd | d D }	| d |	f}
|
S |t j
krP| S |t jkr g }g }t| dd   D ]x\}}|d u r|d  |d  nNtr|d usJ t| tj fdd|D td}|  || qt| d ||f}|S td| d S )	Nc                 S  s   g | ]}t |qS r   r   r   r   r   r   r      r   z@_convert_filled_from_ChunkCombinedCodeOffset.<locals>.<listcomp>r   r   c                 S  s"   g | ]}|d u rd nt |qS r0   r   r   r   r   r   r      s   c                   s"   g | ]}t  |kd  d  qS )r   )npnonzero)r   Zoor+   r   r   r      r   )Zdtyper   )r   r   r5   r   r   split_points_by_offsetssplit_codes_by_offsetsr   r!   r"   r#   r%   r6   r   r:   arrayr   r&   )r   r   separate_pointsr.   r'   r   r(   separate_offsetsr)   Zall_offsetsr*   chunk_offsetschunk_outer_offsetsret3r   r<   r   ,_convert_filled_from_ChunkCombinedCodeOffset   sj    






rE   z(cpy.FillReturn_ChunkCombinedOffsetOffsetc                   s  |t jkrg }g }t|  D ]b\} }|d urtrH d us<J |d usHJ t |} | }|t||7 }|t||7 }q||fS |t jkr4g }g }t|  D ]\} }|d urtrЈ d usJ |d usJ t	|dkr| fddt|d d |dd  D 7 }n
|
  |t| | 7 }q||fS |t jkrg }t|  D ]V\} }|d u rl|
d  n4tr d usJ |d usJ |
t | qL| d |f}	|	S |t jkr| d | d fS |t jkrng }g }
t|  D ]n\} }|d u r|
d  |

d  nBtr8 d us*J |d us8J |
t | |

 |  q| d ||
f}|S |t jkr~| S td| d S )N   c                   s(   g | ] \}} ||d    |  qS )r   r   )r   ser<   r   r   r      r   zB_convert_filled_from_ChunkCombinedOffsetOffset.<locals>.<listcomp>r   r   r   )r   r   r5   r   r   r7   r=   r>   r   r   r6   r!   r"   r#   r%   r&   )r   r   r@   r.   r'   r(   r   rA   r8   r)   rC   r*   r   r<   r   ._convert_filled_from_ChunkCombinedOffsetOffset   st    





rJ   zFillType | str)r   fill_type_fromr   r   c                 C  s  t |}t |}t| | |tjkr>tr4ttj| } t| |S |tj	krbtrXttj
| } t| |S |tjkrtr|ttj| } t| |S |tjkrtrttj| } t| |S |tjkrtrttj| } t| |S |tjkrtrttj| } t| |S td| dS )a  Convert filled contours from one :class:`~.FillType` to another.

    Args:
        filled (sequence of arrays): Filled contour polygons to convert, such as those returned by
            :meth:`.ContourGenerator.filled`.
        fill_type_from (FillType or str): :class:`~.FillType` to convert from as enum or
            string equivalent.
        fill_type_to (FillType or str): :class:`~.FillType` to convert to as enum or string
            equivalent.

    Return:
        Converted filled contour polygons.

    When converting non-chunked fill types (``FillType.OuterCode`` or ``FillType.OuterOffset``) to
    chunked ones, all polygons are placed in the first chunk. When converting in the other
    direction, all chunk information is discarded. Converting a fill type that is not aware of the
    relationship between outer boundaries and contained holes (``FillType.ChunkCombinedCode`` or
    ``FillType.ChunkCombinedOffset``) to one that is will raise a ``ValueError``.

    .. versionadded:: 1.2.0
    r   N)r   r	   r   r   r   r   cpyZFillReturn_OuterCoder,   r   ZFillReturn_OuterOffsetr/   r!   ZFillReturn_ChunkCombinedCoder4   r"   ZFillReturn_ChunkCombinedOffsetr9   r#   Z"FillReturn_ChunkCombinedCodeOffsetrE   r%   Z$FillReturn_ChunkCombinedOffsetOffsetrJ   r&   )r   rK   r   r   r   r   convert_filled   s8    












rM   zcpy.LineReturn_Separater   zcpy.LineReturn)linesline_type_tor   c           	      C  s   |t jkr| S |t jkr.dd | D }| |fS |t jkrz| sJd gd gf}n,t| }t| }t||}|g|gf}|S |t jkr| sd gd gf}nt| gt| gf}|S |t j	kr| sd gf}nt
| gf}|S td| d S )Nc                 S  s   g | ]}t |qS r   r   Zcodes_from_pointsr   liner   r   r   r   A  r   z0_convert_lines_from_Separate.<locals>.<listcomp>Invalid LineType )r   SeparateSeparateCoder!   r   r   r$   r7   r"   ChunkCombinedNanconcat_points_with_nanr&   )	rN   rO   r.   r)   r'   r+   r   r*   rD   r   r   r   _convert_lines_from_Separate:  s0    







rX   zcpy.LineReturn_SeparateCodec                 C  s   |t jkr| d S |t jkr | S |t jkrd| d s@d gd gf}n t| d gt| d gf}|S |t jkr| d sd gd gf}n t| d gt| d gf}|S |t j	kr| d sd gf}nt
| d gf}|S td| d S )Nr   r   rS   )r   rT   rU   r!   r   r   r    r"   r$   rV   rW   r&   )rN   rO   r)   r*   rD   r   r   r    _convert_lines_from_SeparateCode\  s(    


 
 

rY   z cpy.LineReturn_ChunkCombinedCodec           
      C  s\  |t jt jfv rg }t|  D ]b\}}|d urtr<|d us<J t|tkd }t|dkrt|t	||dd  7 }q|
| q|t jkr|S dd |D }||fS n|t jkr| S |t jkrdd | d D }| d |fS |t jkrJg }t|  D ]N\}}|d u r|
d  qtr&|d us&J t|}	|
t||	 q|fS td| d S )Nr   r   c                 S  s   g | ]}t |qS r   rP   rQ   r   r   r   r     r   z9_convert_lines_from_ChunkCombinedCode.<locals>.<listcomp>c                 S  s"   g | ]}|d u rd nt |qS r0   r   r   r   r   r   r     s   rS   )r   rT   rU   r5   r   r:   r;   r   r   splitr6   r!   r"   rV   r   r   insert_nan_at_offsetsr&   )
rN   rO   separate_linesr'   r   Zsplit_atr.   rB   
points_nanr+   r   r   r   %_convert_lines_from_ChunkCombinedCode{  s@    





r^   z"cpy.LineReturn_ChunkCombinedOffsetc                 C  s\  |t jt jfv rtg }t|  D ]0\}}|d urtr<|d us<J |t||7 }q|t jkr\|S dd |D }||fS n|t jkrg }t|  D ]>\}}|d u r|d  qtr|d usJ |t	|| q| d |fS |t j
kr| S |t jkrJg }t|  D ]F\}}|d u r|d  n&tr.|d us.J |t||  q|fS td| d S )Nc                 S  s   g | ]}t |qS r   rP   rQ   r   r   r   r     r   z;_convert_lines_from_ChunkCombinedOffset.<locals>.<listcomp>r   rS   )r   rT   rU   r5   r   r   r=   r!   r6   r7   r"   rV   r[   r&   )rN   rO   r\   r'   r+   r.   r8   r]   r   r   r   '_convert_lines_from_ChunkCombinedOffset  s@    




r_   zcpy.LineReturn_ChunkCombinedNanc           	      C  s^  |t jt jfv r`g }| d D ]}|d ur|t|7 }q|t jkrF|S dd |D }||fS  n|t jkrg }g }| d D ]L}|d u r|d  |d  qzt|\}}|| |t|| qz||fS |t j	kr<g }g }| d D ]F}|d u r|d  |d  qt|\}}|| || q||fS |t j
krL| S td| d S )Nr   c                 S  s   g | ]}t |qS r   rP   )r   r'   r   r   r   r     r   z8_convert_lines_from_ChunkCombinedNan.<locals>.<listcomp>rS   )r   rT   rU   r   Zsplit_points_at_nanr!   r6   Z
remove_nanr7   r"   rV   r&   )	rN   rO   r\   r'   r.   Zchunk_pointsr8   r+   rB   r   r   r   $_convert_lines_from_ChunkCombinedNan  sD    






r`   zLineType | str)rN   line_type_fromrO   r   c                 C  s   t |}t |}t| | |tjkr>tr4ttj| } t| |S |tj	krbtrXttj
| } t| |S |tjkrtr|ttj| } t| |S |tjkrtrttj| } t| |S |tjkrtrttj| } t| |S td| dS )aa  Convert contour lines from one :class:`~.LineType` to another.

    Args:
        lines (sequence of arrays): Contour lines to convert, such as those returned by
            :meth:`.ContourGenerator.lines`.
        line_type_from (LineType or str): :class:`~.LineType` to convert from as enum or
            string equivalent.
        line_type_to (LineType or str): :class:`~.LineType` to convert to as enum or string
            equivalent.

    Return:
        Converted contour lines.

    When converting non-chunked line types (``LineType.Separate`` or ``LineType.SeparateCode``) to
    chunked ones (``LineType.ChunkCombinedCode``, ``LineType.ChunkCombinedOffset`` or
    ``LineType.ChunkCombinedNan``), all lines are placed in the first chunk. When converting in the
    other direction, all chunk information is discarded.

    .. versionadded:: 1.2.0
    rS   N)r   r
   r   rT   r   r   rL   ZLineReturn_SeparaterX   rU   ZLineReturn_SeparateCoderY   r!   ZLineReturn_ChunkCombinedCoder^   r"   ZLineReturn_ChunkCombinedOffsetr_   rV   ZLineReturn_ChunkCombinedNanr`   r&   )rN   ra   rO   r   r   r   convert_lines  s0    










rb   zlist[cpy.FillReturn])multi_filledrK   r   r   c                   s$   t   t  fdd| D S )a   Convert multiple sets of filled contours from one :class:`~.FillType` to another.

    Args:
        multi_filled (nested sequence of arrays): Filled contour polygons to convert, such as those
            returned by :meth:`.ContourGenerator.multi_filled`.
        fill_type_from (FillType or str): :class:`~.FillType` to convert from as enum or
            string equivalent.
        fill_type_to (FillType or str): :class:`~.FillType` to convert to as enum or string
            equivalent.

    Return:
        Converted sets filled contour polygons.

    When converting non-chunked fill types (``FillType.OuterCode`` or ``FillType.OuterOffset``) to
    chunked ones, all polygons are placed in the first chunk. When converting in the other
    direction, all chunk information is discarded. Converting a fill type that is not aware of the
    relationship between outer boundaries and contained holes (``FillType.ChunkCombinedCode`` or
    ``FillType.ChunkCombinedOffset``) to one that is will raise a ``ValueError``.

    .. versionadded:: 1.3.0
    c                   s   g | ]}t | qS r   )rM   )r   r   rK   r   r   r   r   M  r   z(convert_multi_filled.<locals>.<listcomp>)r   )rc   rK   r   r   rd   r   convert_multi_filled0  s    re   zlist[cpy.LineReturn])multi_linesra   rO   r   c                   s$   t   t  fdd| D S )a  Convert multiple sets of contour lines from one :class:`~.LineType` to another.

    Args:
        multi_lines (nested sequence of arrays): Contour lines to convert, such as those returned by
            :meth:`.ContourGenerator.multi_lines`.
        line_type_from (LineType or str): :class:`~.LineType` to convert from as enum or
            string equivalent.
        line_type_to (LineType or str): :class:`~.LineType` to convert to as enum or string
            equivalent.

    Return:
        Converted set of contour lines.

    When converting non-chunked line types (``LineType.Separate`` or ``LineType.SeparateCode``) to
    chunked ones (``LineType.ChunkCombinedCode``, ``LineType.ChunkCombinedOffset`` or
    ``LineType.ChunkCombinedNan``), all lines are placed in the first chunk. When converting in the
    other direction, all chunk information is discarded.

    .. versionadded:: 1.3.0
    c                   s   g | ]}t | qS r   )rb   )r   rN   ra   rO   r   r   r   l  r   z'convert_multi_lines.<locals>.<listcomp>)r   )rf   ra   rO   r   rg   r   convert_multi_linesP  s    rh   )'
__future__r   typingr   r   numpyr:   Zcontourpy._contourpyr   r   Zcontourpy.arrayr?   r   Zcontourpy.enum_utilr   r   Zcontourpy.typecheckr	   r
   Zcontourpy.typesr   r   Z
_contourpyrL   r,   r/   r4   r9   rE   rJ   rM   rX   rY   r^   r_   r`   rb   re   rh   r   r   r   r   <module>   s0   $(<C;")*,6 