
    Vf4#                    D   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rd dlmZ ddZ	 	 	 	 	 	 ddZdd	Zdd
ZddZd dZ	 	 	 	 d!dZd"dZ	 	 	 	 d#dZ	 	 	 	 d#dZd"dZ d$dZ!d%dZ"d&dZ#d'dZ$d dZ%d(dZ&d)dZ'	 	 	 	 	 	 d*dZ(d+dZ)y),    )annotations)chain)TYPE_CHECKINGN)check_code_arraycheck_offset_arraycheck_point_array)	CLOSEPOLYLINETOMOVETO
code_dtypeoffset_dtypepoint_dtypec                    t        |        | d   }t        j                  |t        t              }t
        || dd <   t        || dd dz
  <   |S )zSDetermine codes from offsets, assuming they all correspond to closed polygons.
    dtypeN   )r   npfullr
   r   r   r	   )offsetsncodess      X/var/www/html/software/conda/envs/catlas/lib/python3.12/site-packages/contourpy/array.pycodes_from_offsetsr      sP     wAGGAvZ0E E'#2,&E'!"+/L    c                
   t        |        t        |       t        j                  t	        |      t
        t              }t        || dd <   | dd dz
  }t        j                  || dd    ||   k(  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   axis)
r   r   r   r   lenr
   r   r   allr	   )r   pointsr   end_offsetscloseds        r   codes_from_offsets_and_pointsr$      s     wfGGCKz:E E'#2,!"+/KVVF73B<(F;,??aHF!*E+f
Lr   c                    t        |        t        |       }t        j                  |t        t
              }t        |d<   t        j                  | 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   s      r   codes_from_pointsr&   /   sW     fFAGGAvZ0EE!H	vvfQi6":%&b	Lr   c                R    | st        d      t        j                  | t              S )zAConcatenate a list of codes arrays into a single code array.
    z!Empty list passed to concat_codesr   )
ValueErrorr   concatenater   )list_of_codess    r   concat_codesr+   =   s$     <==>>-z::r   c                L    | D cg c]  }||	 }}|rt        |      S yc c}w )zQConcatenate a list of codes arrays or None into a single code array or None.
    N)r+   )list_of_codes_or_noner   r*   s      r   concat_codes_or_noner.   F   s3     )>SuARUSMSM**	 T   !!c                     st        d      t               }t        j                   D cg c]  }|d   	 c}t              t        j
                   d   g fdt        |dz
        D        t              }|S c c}w )zEConcatenate a list of offsets arrays into a single offset array.
    z#Empty list passed to concat_offsetsr   r   r   c              3  @   K   | ]  }|d z      d d |   z     yw)r   N ).0i
cumulativelist_of_offsetss     r   	<genexpr>z!concat_offsets.<locals>.<genexpr>Y   s*     \Aqs3AB7*Q-G\s   r   )r(   r   r   cumsumr   r)   range)r6   r   r   retr5   s   `   @r   concat_offsetsr;   P   s~     >??OAGGGBKG|\J>>		]\QVWXYZWZQ[\]C J Hs   Bc                L    | D cg c]  }||	 }}|rt        |      S yc c}w )zUConcatenate a list of offsets arrays or None into a single offset array or None.
    N)r;   )list_of_offsets_or_noner   r6   s      r   concat_offsets_or_noner>   _   s4    
 /F]7I\w]O]o..	 ^r/   c                R    | st        d      t        j                  | t              S )zBConcatenate a list of point arrays into a single point array.
    z"Empty list passed to concat_pointsr   )r(   r   r)   r   )list_of_pointss    r   concat_pointsrA   k   s$     =>>>>.<<r   c                L    | D cg c]  }||	 }}|rt        |      S yc c}w )zRConcatenate a list of point arrays or None into a single point array or None.
    N)rA   list_of_points_or_noner!   r@   s      r   concat_points_or_nonerE   t   s4    
 ,BXVEWfXNX^,,	 Yr/   c                L    | D cg c]  }||	 }}|rt        |      S yc c}w )zvConcatenate a list of points or None into a single point array or None, with NaNs used to
    separate each line.
    N)concat_points_with_nanrC   s      r   concat_points_or_none_with_nanrH      s4     ,BXVEWfXNX%n55	 Yr/   c           	         | st        d      t        |       dk(  r| d   S t        j                  dt        j                  t
              | d   gt        t        f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  &   K   | ]  }|f 
 y w)Nr2   )r3   x
nan_spacers     r   r7   z)concat_points_with_nan.<locals>.<genexpr>   s     'TAQ'Ts   N)	r(   r   r   r   nanr   listr   rA   )r@   rM   s    @r   rG   rG      s     FGG
>aa  WWVRVV;?
(+ X'TPQPRAS'T UVX^,,r   c                2   t        |        t        |       t        |      dk  r| S t        j                  t        j
                  t        j
                  gt              }t        j                  | |dd j                  t        j                        |d      S )zNInsert NaNs into a point array at locations specified by an offset array.
    rJ   r   r   r   r   r   )
r   r   r   r   arrayrN   r   insertastypeint64)r!   r   rM   s      r   insert_nan_at_offsetsrU      sm     fw
7|qXXrvvrvv.kB
yy2!5!5bhh!?RSTTr   c                    t        |        t        j                  t        j                  | t        k(        d   t        |             j                  t              S )zBDetermine offsets from codes using locations of MOVETO codes.
    r   )r   r   appendnonzeror   r   rS   r   )r   s    r   offsets_from_codesrY      s>     U99RZZ03SZ@GGUUr   c           	         | st        d      t        j                  dg| D cg c]  }t        |       c}z   t              S c c}w )z4Determine offsets from lengths of point arrays.
    z)Empty list passed to offsets_from_lengthsr   r   r(   r   r8   r   r   )r@   lines     r   offsets_from_lengthsr]      s=     DEE99aS.A$CIAAVVAs   A
c           
         | st        d      t        j                  dg| D cg c]  }t        j                  |t        k(          c}z   t
              S c c}w )zHDetermine outer offsets from codes using locations of MOVETO codes.
    z5Empty list passed to outer_offsets_from_list_of_codesr   r   )r(   r   r8   count_nonzeror   r   )r*   r   s     r    outer_offsets_from_list_of_codesr`      sM     PQQ99aS=Y%B,,Uf_=YY') )Ys   #A
c           	         | st        d      t        j                  dg| D cg c]  }t        |      dz
   c}z   t              S c c}w )z4Determine outer offsets from a list of offsets.
    z7Empty list passed to outer_offsets_from_list_of_offsetsr   r   r   r[   )r6   r   s     r   "outer_offsets_from_list_of_offsetsrb      sB     RSS99aS/JwCLNJJR^__Js   A
c                   t        |        t        j                  t        j                  | dddf               d   }t	        |      dk(  r(| t        j
                  dt	        |       gt              fS t        j                  | |d      } |t        j                  t	        |            z  }t        j                  t	        |      dz   t              }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   rJ   r   r   )
r   r   rX   isnanr   rQ   r   deletearangeempty)r!   nan_offsetsr   s      r   
remove_nanri      s     f**RXXfQTl34Q7K
;1rxxCK 0EEE6;Q7ryy[!122#%88C,<Q,>l#S
#"&kwr   c                    t        |        t        |       t        |      dkD  rt        j                  | |dd       S | gS )z]Split a code array at locations specified by an offset array into a list of code arrays.
    rJ   r   r   )r   r   r   r   split)r   r   s     r   split_codes_by_offsetsrl      s>     Uw
7|axxwq}--wr   c                    t        |        t        |       t        |      dkD  rt        j                  | |dd       S | gS )z_Split a point array at locations specified by an offset array into a list of point arrays.
    rJ   r   r   )r   r   r   r   rk   )r!   r   s     r   split_points_by_offsetsrn      s>     fw
7|axx"..xr   c                F   t        |        t        j                  t        j                  | dddf               d   }t	        |      dk(  r| gS t        j
                  dg|t	        |       gf      }t        |dd |dd       D cg c]  \  }}| |dz   |  c}}S c c}}w )z>Split a points array at NaNs into a list of point arrays.
    Nr   r   r   )r   r   rX   rd   r   r)   zip)r!   rh   ses       r   split_points_at_nanrs      s     f**RXXfQTl34Q7K
;1xnnrdK#f+%GH*-k#2.>AB*PQ$!Qqs1QQQs   B)r   cpy.OffsetArrayreturncpy.CodeArray)r   rt   r!   cpy.PointArrayru   rv   )r!   rw   ru   rv   )r*   list[cpy.CodeArray]ru   rv   )r-   zlist[cpy.CodeArray | None]ru   zcpy.CodeArray | None)r6   zlist[cpy.OffsetArray]ru   rt   )r=   zlist[cpy.OffsetArray | None]ru   zcpy.OffsetArray | None)r@   list[cpy.PointArray]ru   rw   )rD   zlist[cpy.PointArray | None]ru   zcpy.PointArray | None)r!   rw   r   rt   ru   rw   )r   rv   ru   rt   )r@   ry   ru   rt   )r*   rx   ru   rt   )r!   rw   ru   z&tuple[cpy.PointArray, cpy.OffsetArray])r   rv   r   rt   ru   rx   )r!   rw   r   rt   ru   ry   )r!   rw   ru   ry   )*
__future__r   	itertoolsr   typingr   numpyr   contourpy.typecheckr   r   r   contourpy.typesr	   r
   r   r   r   r   contourpy._contourpy
_contourpycpyr   r$   r&   r+   r.   r;   r>   rA   rE   rH   rG   rU   rY   r]   r`   rb   ri   rl   rn   rs   r2   r   r   <module>r      s    "     W W \ \&	 (;	9		=	7		
7

-UVW)`$	 
Rr   