o
    ff[                     @  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r@d dlmZ d:ddZd;ddZd<ddZd=ddZd>ddZd?ddZd@d!d"ZdAd(d)ZdBd+d,Z dCd.d/Z!dDd1d2Z"dEd4d5Z#dFd8d9Z$dS )G    )annotations)TYPE_CHECKINGcastN)FillTypeLineType)as_fill_typeas_line_type)check_filledcheck_lines)MOVETOoffset_dtypefilledcpy.FillReturn_OuterCodefill_type_tor   returncpy.FillReturnc                 C  sB  |t jkr| S |t jkr| d dd | d D fS t| d dkr0t| d }t| d }nd }d }|t jkr?|g|gfS |t jkrU|g|d u rNd gfS t	|gfS |t j
krq|d u r`d nt| d }|g|g|gf}|S |t jkr|d u rd gd gd gf}|S t	|}t| d }|g|g|gf}|S td| )Nr   c                 S     g | ]}t |qS  arroffsets_from_codes.0codesr   r   1lib/python3.10/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   s4   



"


r/   cpy.FillReturn_OuterOffsetc           	      C  sV  |t jkrdd | d D }| d |fS |t jkr| S t| d dkr2t| d }t| d }nd }d }|t jkrL|g|d u rEd gfS t|gfS |t j	krW|g|gfS |t j
kr|d u rjd gd gd gf}|S t|}t| d }|g|g|gf}|S |t jkr|d u rd gd gd gf}|S t| d }|g|g|gf}|S td| )Nc                 S  r   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$   r1   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   s<   


"



r3    cpy.FillReturn_ChunkCombinedCodec                 C  sN   |t jkr| S |t jkrdd | d D }| d |fS tdt j d| d)Nc                 S  "   g | ]}|d u r
d nt |qS Nr   r   r   r   r   r   d      " 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   

r;   "cpy.FillReturn_ChunkCombinedOffsetc                 C  s   |t jkr1g }t|  D ]\}}|d u r|d  qtr!|d us!J |t|| q| d |fS |t jkr8| S tdt j d| d)Nr   r8   r9   r:   )	r   r$   zipappendr   r   codes_from_offsets_and_pointsr%   r)   )r   r   chunk_codesr*   r.   r   r   r   (_convert_filled_from_ChunkCombinedOffsetk   s   

rA   &cpy.FillReturn_ChunkCombinedCodeOffsetc                   s  |t jkr9g }g }t|  D ]'\}}}|d ur4tr$|d usJ |d us$J |t||7 }|t||7 }q||fS |t jkryg }g }t|  D ].\}}}|d urttr]|d usWJ |d us]J |t||7 }t||}|dd |D 7 }qF||fS |t jkr| d | d f}|S |t j	krdd | d D }	| d |	f}
|
S |t j
kr| S |t jkrg }g }t| dd   D ]8\}}|d u r|d  |d  qtr|d usJ t| tj fdd|D td}|  || q| d ||f}|S td| )	Nc                 S  r   r   r   r   r   r   r   r      r   z@_convert_filled_from_ChunkCombinedCodeOffset.<locals>.<listcomp>r   r   c                 S  r5   r6   r   r   r   r   r   r          c                   s"   g | ]}t  |kd  d  qS )r   )npnonzero)r   Zoor.   r   r   r      r7   )Zdtyper   )r   r   r=   r   r   split_points_by_offsetssplit_codes_by_offsetsr    r$   r%   r&   r(   r>   r   rD   arrayr   r)   )r   r   separate_pointsr2   r*   r   r+   separate_offsetsr,   Zall_offsetsr-   chunk_offsetschunk_outer_offsetsret3r   rF   r   ,_convert_filled_from_ChunkCombinedCodeOffset   sn   









rO   (cpy.FillReturn_ChunkCombinedOffsetOffsetc                   sx  |t jkrCg }g }t|  D ]1\} }|d ur>tr$ d usJ |d us$J t |} | }|t||7 }|t||7 }q||fS |t jkrg }g }t|  D ]C\} }|d urtrg d usaJ |d usgJ t	|dkr| fddt|d d |dd  D 7 }n|
  |t| | 7 }qP||fS |t jkrg }t|  D ]&\} }|d u r|
d  qtr d usJ |d usJ |
t | q| d |f}	|	S |t jkr| d | d fS |t jkr-g }g }
t|  D ]6\} }|d u r|
d  |

d  qtr d usJ |d usJ |
t | |

 |  q| d ||
f}|S |t jkr5| S td| )N   c                   s(   g | ]\}} ||d    |  qS )r   r   )r   serF   r   r   r      s   ( zB_convert_filled_from_ChunkCombinedOffsetOffset.<locals>.<listcomp>r   r   r   )r   r   r=   r   r   r?   rG   rH   r    r!   r>   r$   r%   r&   r(   r)   )r   r   rJ   r2   r*   r+   r   rK   r@   r,   rM   r-   r   rF   r   ._convert_filled_from_ChunkCombinedOffsetOffset   sx   







rU   fill_type_fromFillType | strc                 C  s   t |}t |}t| | |tjkrtrttj| } t| |S |tj	kr1tr,ttj
| } t| |S |tjkrCtr>ttj| } t| |S |tjkrUtrPttj| } t| |S |tjkrgtrbttj| } t| |S |tjkrytrtttj| } t| |S td| )a  Return the specified filled contours converted to a different :class:`~contourpy.FillType`.

    Args:
        filled (sequence of arrays): Filled contour polygons to convert.
        fill_type_from (FillType or str): :class:`~contourpy.FillType` to convert from as enum or
            string equivalent.
        fill_type_to (FillType or str): :class:`~contourpy.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   )r   r	   r   r   r   r   cpyZFillReturn_OuterCoder/   r    ZFillReturn_OuterOffsetr3   r$   ZFillReturn_ChunkCombinedCoder;   r%   ZFillReturn_ChunkCombinedOffsetrA   r&   Z"FillReturn_ChunkCombinedCodeOffsetrO   r(   Z$FillReturn_ChunkCombinedOffsetOffsetrU   r)   )r   rV   r   r   r   r   convert_filled   s8   












rY   linescpy.LineReturn_Separateline_type_tor   cpy.LineReturnc           	      C  s   |t jkr| S |t jkrdd | D }| |fS |t jkr>| s&d gd gf}|S t| }t| }t||}|g|gf}|S |t jkr[| sMd gd gf}|S t| gt| gf}|S |t j	krq| shd gf}|S t
| gf}|S td| )Nc                 S  r   r   r   Zcodes_from_pointsr   liner   r   r   r   @  r   z0_convert_lines_from_Separate.<locals>.<listcomp>Invalid LineType )r   SeparateSeparateCoder$   r   r"   r'   r?   r%   ChunkCombinedNanconcat_points_with_nanr)   )	rZ   r\   r2   r,   r*   r.   r   r-   rN   r   r   r   _convert_lines_from_Separate9  s6   






rf   cpy.LineReturn_SeparateCodec                 C  s   |t jkr	| d S |t jkr| S |t jkr3| d s!d gd gf}|S t| d gt| d gf}|S |t jkrV| d sDd gd gf}|S t| d gt| d gf}|S |t j	krp| d sed gf}|S t
| d gf}|S td| )Nr   r   ra   )r   rb   rc   r$   r   r"   r#   r%   r'   rd   re   r)   )rZ   r\   r,   r-   rN   r   r   r    _convert_lines_from_SeparateCode[  s.   


 
 
rh    cpy.LineReturn_ChunkCombinedCodec           
      C  sN  |t jt jfv rRg }t|  D ]1\}}|d ur?tr|d usJ t|tkd }t|dkr:|t	||dd  7 }q|
| q|t jkrG|S dd |D }||fS |t jkrY| S |t jkrmdd | d D }| d |fS |t jkrg }t|  D ]$\}}|d u r|
d  qxtr|d usJ t|}	|
t||	 qx|fS td| )Nr   r   c                 S  r   r   r^   r_   r   r   r   r     r   z9_convert_lines_from_ChunkCombinedCode.<locals>.<listcomp>c                 S  r5   r6   r   r   r   r   r   r     rC   ra   )r   rb   rc   r=   r   rD   rE   r   r!   splitr>   r$   r%   rd   r   r   insert_nan_at_offsetsr)   )
rZ   r\   separate_linesr*   r   Zsplit_atr2   rL   
points_nanr.   r   r   r   %_convert_lines_from_ChunkCombinedCodez  sB   





rn   "cpy.LineReturn_ChunkCombinedOffsetc                 C  sL  |t jt jfv r9g }t|  D ]\}}|d ur&tr|d usJ |t||7 }q|t jkr.|S dd |D }||fS |t jkrjg }t|  D ]\}}|d u rR|d  qDtrZ|d usZJ |t	|| qD| d |fS |t j
krq| S |t jkrg }t|  D ]\}}|d u r|d  q|tr|d usJ |t|| q||fS td| )Nc                 S  r   r   r^   r_   r   r   r   r     r   z;_convert_lines_from_ChunkCombinedOffset.<locals>.<listcomp>r   ra   )r   rb   rc   r=   r   r   rG   r$   r>   r?   r%   rd   rk   r)   )rZ   r\   rl   r*   r.   r2   r@   rm   r   r   r   '_convert_lines_from_ChunkCombinedOffset  sB   



rp   cpy.LineReturn_ChunkCombinedNanc           	      C  sP  |t jt jfv r.g }| d D ]}|d ur|t|7 }q|t jkr#|S dd |D }||fS |t jkrfg }g }| d D ]&}|d u rL|d  |d  q;t|\}}|| |t|| q;||fS |t j	krg }g }| d D ]"}|d u r|d  |d  qst|\}}|| || qs||fS |t j
kr| S td| )Nr   c                 S  r   r   r^   )r   r*   r   r   r   r     r   z8_convert_lines_from_ChunkCombinedNan.<locals>.<listcomp>ra   )r   rb   rc   r   Zsplit_points_at_nanr$   r>   Z
remove_nanr?   r%   rd   r)   )	rZ   r\   rl   r*   r2   Zchunk_pointsr@   r.   rL   r   r   r   $_convert_lines_from_ChunkCombinedNan  sF   







rr   line_type_fromLineType | strc                 C  s   t |}t |}t| | |tjkrtrttj| } t| |S |tj	kr1tr,ttj
| } t| |S |tjkrCtr>ttj| } t| |S |tjkrUtrPttj| } t| |S |tjkrgtrbttj| } t| |S td| )aG  Return the specified contour lines converted to a different :class:`~contourpy.LineType`.

    Args:
        lines (sequence of arrays): Contour lines to convert.
        line_type_from (LineType or str): :class:`~contourpy.LineType` to convert from as enum or
            string equivalent.
        line_type_to (LineType or str): :class:`~contourpy.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
    ra   )r   r
   r   rb   r   r   rX   ZLineReturn_Separaterf   rc   ZLineReturn_SeparateCoderh   r$   ZLineReturn_ChunkCombinedCodern   r%   ZLineReturn_ChunkCombinedOffsetrp   rd   ZLineReturn_ChunkCombinedNanrr   r)   )rZ   rs   r\   r   r   r   convert_lines  s0   










ru   )r   r   r   r   r   r   )r   r0   r   r   r   r   )r   r4   r   r   r   r   )r   r<   r   r   r   r   )r   rB   r   r   r   r   )r   rP   r   r   r   r   )r   r   rV   rW   r   rW   r   r   )rZ   r[   r\   r   r   r]   )rZ   rg   r\   r   r   r]   )rZ   ri   r\   r   r   r]   )rZ   ro   r\   r   r   r]   )rZ   rq   r\   r   r   r]   )rZ   r]   rs   rt   r\   rt   r   r]   )%Z
__future__r   typingr   r   ZnumpyrD   Zcontourpy._contourpyr   r   Zcontourpy.arrayrI   r   Zcontourpy.enum_utilr   r   Zcontourpy.typecheckr	   r
   Zcontourpy.typesr   r   Z
_contourpyrX   r/   r3   r;   rA   rO   rU   rY   rf   rh   rn   rp   rr   ru   r   r   r   r   <module>   s.    

$
(


<
C
:
"

)
*,