o
    f4#                     @  s<  d dl mZ d dlmZ d dlmZ d dlZd dlm	Z	m
Z
mZ d dlmZmZmZmZmZmZ er8d dlmZ dFddZdGddZdHddZdIddZdJddZdKddZdLd#d$ZdMd'd(ZdNd,d-ZdNd.d/ZdMd0d1Z dOd2d3Z!dPd5d6Z"dQd7d8Z#dRd9d:Z$dKd;d<Z%dSd>d?Z&dTd@dAZ'dUdBdCZ(dVdDdEZ)dS )W    )annotations)chain)TYPE_CHECKINGN)check_code_arraycheck_offset_arraycheck_point_array)	CLOSEPOLYLINETOMOVETO
code_dtypeoffset_dtypepoint_dtypeoffsetscpy.OffsetArrayreturncpy.CodeArrayc                 C  sH   t |  | d }tj|ttd}t|| dd < t|| dd d < |S )zSDetermine codes from offsets, assuming they all correspond to closed polygons.
    ZdtypeN   )r   npfullr	   r   r
   r   )r   ncodes r   /lib/python3.10/site-packages/contourpy/array.pycodes_from_offsets   s   r   pointscpy.PointArrayc                 C  sv   t |  t| tjt|ttd}t|| dd < | dd d }tj|| dd  || kdd}t	||| < |S )zDetermine codes from offsets and points, using the equality of the start and end points of
    each line to determine if lines are closed or not.
    r   Nr   r   Zaxis)
r   r   r   r   lenr	   r   r
   allr   )r   r   r   Zend_offsetsclosedr   r   r   codes_from_offsets_and_points   s   "r"   c                 C  sJ   t |  t| }tj|ttd}t|d< t| d | d kr#t|d< |S )zDetermine codes for a single line, using the equality of the start and end points to
    determine if the line is closed or not.
    r   r   r   )	r   r   r   r   r	   r   r
   r    r   )r   r   r   r   r   r   codes_from_points/   s   r#   list_of_codeslist[cpy.CodeArray]c                 C     | st dtj| tdS )zAConcatenate a list of codes arrays into a single code array.
    z!Empty list passed to concat_codesr   )
ValueErrorr   concatenater   r$   r   r   r   concat_codes=      r*   list_of_codes_or_nonelist[cpy.CodeArray | None]cpy.CodeArray | Nonec                 C     dd | D }|rt |S dS )zQConcatenate a list of codes arrays or None into a single code array or None.
    c                 S     g | ]}|d ur|qS Nr   .0r   r   r   r   
<listcomp>I       z(concat_codes_or_none.<locals>.<listcomp>N)r*   )r,   r$   r   r   r   concat_codes_or_noneF   s   r6   list_of_offsetslist[cpy.OffsetArray]c                   sb   st dt}tjdd D td tjd g fddt|d D R td}|S )	zEConcatenate a list of offsets arrays into a single offset array.
    z#Empty list passed to concat_offsetsc                 S  s   g | ]}|d  qS )r   r   r3   r   r   r   r   r4   W       z"concat_offsets.<locals>.<listcomp>r   r   c                 3  s,    | ]}|d   d d  |  V  qdS )r   Nr   )r3   iZ
cumulativer7   r   r   	<genexpr>Y   s   * z!concat_offsets.<locals>.<genexpr>r   )r'   r   r   cumsumr   r(   range)r7   r   retr   r<   r   concat_offsetsP   s   &rA   list_of_offsets_or_nonelist[cpy.OffsetArray | None]cpy.OffsetArray | Nonec                 C  r/   )zUConcatenate a list of offsets arrays or None into a single offset array or None.
    c                 S  r0   r1   r   r9   r   r   r   r4   d   r5   z*concat_offsets_or_none.<locals>.<listcomp>N)rA   )rB   r7   r   r   r   concat_offsets_or_none_      rE   list_of_pointslist[cpy.PointArray]c                 C  r&   )zBConcatenate a list of point arrays into a single point array.
    z"Empty list passed to concat_pointsr   )r'   r   r(   r   rG   r   r   r   concat_pointsk   r+   rJ   list_of_points_or_nonelist[cpy.PointArray | None]cpy.PointArray | Nonec                 C  r/   )zRConcatenate a list of point arrays or None into a single point array or None.
    c                 S  r0   r1   r   r3   r   r   r   r   r4   y   r5   z)concat_points_or_none.<locals>.<listcomp>N)rJ   rK   rG   r   r   r   concat_points_or_nonet   rF   rP   c                 C  r/   )zvConcatenate a list of points or None into a single point array or None, with NaNs used to
    separate each line.
    c                 S  r0   r1   r   rN   r   r   r   r4      r5   z2concat_points_or_none_with_nan.<locals>.<listcomp>N)concat_points_with_nanrO   r   r   r   concat_points_or_none_with_nan   s   rR   c                   sf   | st dt| dkr| d S tjdtjtd | d gtt fdd| dd D  } t| S )	zaConcatenate a list of points into a single point array with NaNs used to separate each line.
    z+Empty list passed to concat_points_with_nanr   r   )r      r   c                 3  s    | ]} |fV  qd S r1   r   )r3   x
nan_spacerr   r   r=      s    z)concat_points_with_nan.<locals>.<genexpr>N)	r'   r   r   r   nanr   listr   rJ   rI   r   rU   r   rQ      s    rQ   c                 C  sX   t |  t| t|dkr| S tjtjtjgtd}tj| |dd tj	|ddS )zNInsert NaNs into a point array at locations specified by an offset array.
    rS   r   r   r   r   r   )
r   r   r   r   arrayrW   r   insertastypeZint64)r   r   rV   r   r   r   insert_nan_at_offsets   s   "r\   r   c                 C  s,   t |  tt| tkd t| tS )zBDetermine offsets from codes using locations of MOVETO codes.
    r   )r   r   appendnonzeror
   r   r[   r   )r   r   r   r   offsets_from_codes   s   $r_   c                 C  *   | st dtjdgdd | D  tdS )z4Determine offsets from lengths of point arrays.
    z)Empty list passed to offsets_from_lengthsr   c                 S  s   g | ]}t |qS r   r   )r3   liner   r   r   r4      r:   z(offsets_from_lengths.<locals>.<listcomp>r   r'   r   r>   r   rI   r   r   r   offsets_from_lengths      rd   c                 C  r`   )zHDetermine outer offsets from codes using locations of MOVETO codes.
    z5Empty list passed to outer_offsets_from_list_of_codesr   c                 S  s   g | ]	}t |tkqS r   )r   Zcount_nonzeror
   r2   r   r   r   r4      s    z4outer_offsets_from_list_of_codes.<locals>.<listcomp>r   rc   r)   r   r   r    outer_offsets_from_list_of_codes   s
   rf   c                 C  r`   )z4Determine outer offsets from a list of offsets.
    z7Empty list passed to outer_offsets_from_list_of_offsetsr   c                 S  s   g | ]}t |d  qS r   ra   r9   r   r   r   r4      r5   z6outer_offsets_from_list_of_offsets.<locals>.<listcomp>r   rc   )r7   r   r   r   "outer_offsets_from_list_of_offsets   re   rh   &tuple[cpy.PointArray, cpy.OffsetArray]c                 C  s   t |  tt| dddf d }t|dkr'| tjdt| gtdfS tj| |dd} |tt|8 }tj	t|d td}d|d< ||dd< t| |d< | |fS )z^Remove NaN from a points array, also return the offsets corresponding to the NaN removed.
    Nr   r   r   rS   r   r   )
r   r   r^   isnanr   rY   r   deleteZarangeempty)r   nan_offsetsr   r   r   r   
remove_nan   s    rn   c                 C  6   t |  t| t|dkrt| |dd S | gS )z]Split a code array at locations specified by an offset array into a list of code arrays.
    rS   r   r   )r   r   r   r   split)r   r   r   r   r   split_codes_by_offsets   s
   rq   c                 C  ro   )z_Split a point array at locations specified by an offset array into a list of point arrays.
    rS   r   r   )r   r   r   r   rp   )r   r   r   r   r   split_points_by_offsets   s
   rr   c                   sz   t   tt dddf d }t|dkr gS tdg|t gf} fddt|dd |dd D S )z>Split a points array at NaNs into a list of point arrays.
    Nr   r   c                   s    g | ]\}} |d  | qS rg   r   )r3   ser   r   r   r4     s     z'split_points_at_nan.<locals>.<listcomp>r   )r   r   r^   rj   r   r(   zip)r   rm   r   ru   r   split_points_at_nan   s    (rw   )r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   )r$   r%   r   r   )r,   r-   r   r.   )r7   r8   r   r   )rB   rC   r   rD   )rG   rH   r   r   )rK   rL   r   rM   )r   r   r   r   r   r   )r   r   r   r   )rG   rH   r   r   )r$   r%   r   r   )r   r   r   ri   )r   r   r   r   r   r%   )r   r   r   r   r   rH   )r   r   r   rH   )*Z
__future__r   	itertoolsr   typingr   Znumpyr   Zcontourpy.typecheckr   r   r   Zcontourpy.typesr   r	   r
   r   r   r   Zcontourpy._contourpyZ
_contourpyZcpyr   r"   r#   r*   r6   rA   rE   rJ   rP   rR   rQ   r\   r_   rd   rf   rh   rn   rq   rr   rw   r   r   r   r   <module>   s8     




	




	





	


	

