a
    5gh#                     @  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rpd dlmZ ddd	d
dZddddddZdddddZdddddZdddddZdddddZd d!d"d#d$Zd%dd&d'd(Zd)d*d+d,d-Zd)d*d+d.d/Zd%dd&d0d1Z dddd2d3d4Z!ddd5d6d7Z"d%dd&d8d9Z#dddd:d;Z$dddd<d=Z%dd>dd?d@Z&ddddAdBdCZ'ddd%d2dDdEZ(dd%ddFdGZ)dS )H    )annotations)chain)TYPE_CHECKINGN)check_code_arraycheck_offset_arraycheck_point_array)	CLOSEPOLYLINETOMOVETO
code_dtypeoffset_dtypepoint_dtypezcpy.OffsetArrayzcpy.CodeArray)offsetsreturnc                 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   _/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/contourpy/array.pycodes_from_offsets   s    r   zcpy.PointArray)r   pointsr   c                 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   )r   r   c                 C  sJ   t |  t| }tj|ttd}t|d< t| d | d krFt|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    zlist[cpy.CodeArray])list_of_codesr   c                 C  s   | 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=   s    r%   zlist[cpy.CodeArray | None]zcpy.CodeArray | None)list_of_codes_or_noner   c                 C  s"   dd | D }|rt |S dS dS )zQConcatenate a list of codes arrays or None into a single code array or None.
    c                 S  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    r,   zlist[cpy.OffsetArray])list_of_offsetsr   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   r)   r   r   r   r   r*   W   r+   z"concat_offsets.<locals>.<listcomp>r   r   c                 3  s*   | ]"}|d   d d  |  V  qdS )r   Nr   )r)   iZ
cumulativer-   r   r   	<genexpr>Y   r+   z!concat_offsets.<locals>.<genexpr>r   )r"   r   r   cumsumr   r#   range)r-   r   retr   r0   r   concat_offsetsP   s    &r5   zlist[cpy.OffsetArray | None]zcpy.OffsetArray | None)list_of_offsets_or_noner   c                 C  s"   dd | D }|rt |S dS dS )zUConcatenate a list of offsets arrays or None into a single offset array or None.
    c                 S  s   g | ]}|d ur|qS r'   r   r.   r   r   r   r*   d   r+   z*concat_offsets_or_none.<locals>.<listcomp>N)r5   )r6   r-   r   r   r   concat_offsets_or_none_   s    r7   zlist[cpy.PointArray])list_of_pointsr   c                 C  s   | st dtj| tdS )zBConcatenate a list of point arrays into a single point array.
    z"Empty list passed to concat_pointsr   )r"   r   r#   r   r8   r   r   r   concat_pointsk   s    r:   zlist[cpy.PointArray | None]zcpy.PointArray | None)list_of_points_or_noner   c                 C  s"   dd | D }|rt |S dS dS )zRConcatenate a list of point arrays or None into a single point array or None.
    c                 S  s   g | ]}|d ur|qS r'   r   r)   r   r   r   r   r*   y   r+   z)concat_points_or_none.<locals>.<listcomp>N)r:   r;   r8   r   r   r   concat_points_or_nonet   s    r>   c                 C  s"   dd | D }|rt |S dS dS )zvConcatenate a list of points or None into a single point array or None, with NaNs used to
    separate each line.
    c                 S  s   g | ]}|d ur|qS r'   r   r<   r   r   r   r*      r+   z2concat_points_or_none_with_nan.<locals>.<listcomp>N)concat_points_with_nanr=   r   r   r   concat_points_or_none_with_nan   s    r@   c                   sj   | 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 d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 r'   r   )r)   x
nan_spacerr   r   r1      r+   z)concat_points_with_nan.<locals>.<genexpr>N)	r"   r   r   r   nanr   listr   r:   r9   r   rC   r   r?      s     r?   )r   r   r   c                 C  s\   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 dS )zNInsert NaNs into a point array at locations specified by an offset array.
    rA   r   r   r   r   r   N)
r   r   r   r   arrayrE   r   insertastypeZint64)r   r   rD   r   r   r   insert_nan_at_offsets   s    rJ   )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   rI   r   )r   r   r   r   offsets_from_codes   s    rM   c                 C  s*   | 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   )r)   liner   r   r   r*      r+   z(offsets_from_lengths.<locals>.<listcomp>r   r"   r   r2   r   r9   r   r   r   offsets_from_lengths   s    rQ   c                 C  s*   | st dtjdgdd | D  tdS )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
   r(   r   r   r   r*      r+   z4outer_offsets_from_list_of_codes.<locals>.<listcomp>r   rP   r$   r   r   r    outer_offsets_from_list_of_codes   s
    rR   c                 C  s*   | st dtjdgdd | D  tdS )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   rN   r.   r   r   r   r*      r+   z6outer_offsets_from_list_of_offsets.<locals>.<listcomp>r   rP   )r-   r   r   r   "outer_offsets_from_list_of_offsets   s    rT   z&tuple[cpy.PointArray, cpy.OffsetArray]c                 C  s   t |  tt| dddf d }t|dkrN| 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 dS )z^Remove NaN from a points array, also return the offsets corresponding to the NaN removed.
    Nr   r   r   rA   r   r   )
r   r   rL   isnanr   rG   r   deleteZarangeempty)r   nan_offsetsr   r   r   r   
remove_nan   s     rY   )r   r   r   c                 C  s:   t |  t| t|dkr0t| |dd S | gS dS )z]Split a code array at locations specified by an offset array into a list of code arrays.
    rA   r   r   N)r   r   r   r   split)r   r   r   r   r   split_codes_by_offsets   s
    r[   c                 C  s:   t |  t| t|dkr0t| |dd S | gS dS )z_Split a point array at locations specified by an offset array into a list of point arrays.
    rA   r   r   N)r   r   r   r   rZ   )r   r   r   r   r   split_points_by_offsets   s
    r\   c                   s~   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 dS )z>Split a points array at NaNs into a list of point arrays.
    Nr   r   c                   s    g | ]\}} |d  | qS rS   r   )r)   ser   r   r   r*     r+   z'split_points_at_nan.<locals>.<listcomp>r   )r   r   rL   rU   r   r#   zip)r   rX   r   r_   r   split_points_at_nan   s     ra   )*
__future__r   	itertoolsr   typingr   numpyr   Zcontourpy.typecheckr   r   r   Zcontourpy.typesr   r	   r
   r   r   r   Zcontourpy._contourpyZ
_contourpyZcpyr   r   r    r%   r,   r5   r7   r:   r>   r@   r?   rJ   rM   rQ   rR   rT   rY   r[   r\   ra   r   r   r   r   <module>   s6    	
		
	