o
    :ήc8                     @   s   d dl Zd dlmZ d dlmZ eg dZ	ddl
mZ dgZG dd deZG dd deZed	krYej  dd
lmZ ddlmZ e ZeeZeeejZe  dS dS )    N)whitered
dodgerbluegoldgreenyellow
blueviolet   )CanvasToolBase	PaintToolc                       s   e Zd ZdZ			d! fdd	Zedd Zejd	d Zed
d Zejdd Zedd Z	e	jdd Z	edd Z
e
jdd Z
dd Zdd Zdd Zdd Zdd Zdd Zedd  Z  ZS )"r
   aF  Widget for painting on top of a plot.

    Parameters
    ----------
    manager : Viewer or PlotPlugin.
        Skimage viewer or plot plugin object.
    overlay_shape : shape tuple
        2D shape tuple used to initialize overlay image.
    radius : int
        The size of the paint cursor.
    alpha : float (between [0, 1])
        Opacity of overlay.
    on_move : function
        Function called whenever a control handle is moved.
        This function must accept the end points of line as the only argument.
    on_release : function
        Function called whenever the control handle is released.
    on_enter : function
        Function called whenever the "enter" key is pressed.
    rect_props : dict
        Properties for :class:`matplotlib.patches.Rectangle`. This class
        redefines defaults in :class:`matplotlib.widgets.RectangleSelector`.

    Attributes
    ----------
    overlay : array
        Overlay of painted labels displayed on top of image.
    label : int
        Current paint color.

    Examples
    ----------
    >>> from skimage.data import camera
    >>> import matplotlib.pyplot as plt
    >>> from skimage.viewer.canvastools import PaintTool
    >>> import numpy as np

    >>> img = camera() #doctest: +SKIP

    >>> ax = plt.subplot(111) #doctest: +SKIP 
    >>> plt.imshow(img, cmap=plt.cm.gray) #doctest: +SKIP
    >>> p = PaintTool(ax,np.shape(img[:-1]),10,0.2) #doctest: +SKIP
    >>> plt.show() #doctest: +SKIP

    >>> mask = p.overlay #doctest: +SKIP
    >>> plt.imshow(mask,cmap=plt.cm.gray) #doctest: +SKIP
    >>> plt.show() #doctest: +SKIP
       333333?Nc	           
         s   t t| j||||d tddddd}	|	|d ur|ni  || _t| _d | _|d d | _	t
jdi |	| _| jd	 | j| j d
| _|| _| j| jg| _| j|  d S )N)on_moveon_enter
on_releaserz0.7      ?T)	edgecolor	facecoloralphaanimated   ))r   r   r   r   F   )superr
   __init__dictupdater   LABELS_CMAPcmap_overlay_plotshapeplt	Rectangle_cursorset_visibleax	add_patchlabelradiusartistsmanageradd_tool)
selfr)   overlay_shaper'   r   r   r   r   
rect_propsprops	__class__ K/tmp/pip-target-vg8gfxp4/lib/python/skimage/viewer/canvastools/painttool.pyr   =   s"   zPaintTool.__init__c                 C      | j S N)_labelr+   r1   r1   r2   r&   X      zPaintTool.labelc                 C   s>   || j jkrtdt| j d  || _| j|  | d S )NzMaximum label value = %sr   )r   N
ValueErrorlenr5   r"   set_edgecolor)r+   valuer1   r1   r2   r&   \   s   c                 C   r3   r4   )_radiusr6   r1   r1   r2   r'   c   r7   zPaintTool.radiusc                 C   sB   || _ d| d | _| j| j | j| j t|| j| _d S )Nr   r   )r=   _widthr"   	set_width
set_heightCenteredWindow_shapewindow)r+   r   r1   r1   r2   r'   g   s
   c                 C   r3   r4   )_overlayr6   r1   r1   r2   overlayo   r7   zPaintTool.overlayc                 C   s   || _ |d u r| jj| j d | _n(| jd u r5t| j| jtj	d| jj
ddd}| jj|fi || _n| j| |   d S )Nr   )vminvmaxT)r   r   normr   )rD   r$   imagesremover   r   r   r   mcolorsNoNormr8   imshowset_dataredraw)r+   imager.   r1   r1   r2   rE   s   s   

c                 C   r3   r4   )rB   r6   r1   r1   r2   r      r7   zPaintTool.shapec                 C   sP   || _ | jd ur| jd|d d |d d df | j| _tj|dd| _d S )Ng      r   r   r   uint8)dtype)rB   r   
set_extentr=   r'   npzerosrE   )r+   r   r1   r1   r2   r      s   
c                 C   s&   |j dkr| | j |   d S d S )Nenter)keycallback_on_entergeometryrO   r+   eventr1   r1   r2   on_key_press   s   
zPaintTool.on_key_pressc                 C   s>   |j dks| j|sd S | |j|j | |j|j d S Nr   )buttonr$   in_axesupdate_cursorxdataydataupdate_overlayrZ   r1   r1   r2   on_mouse_press   s   zPaintTool.on_mouse_pressc                 C   s   |j dkrd S | | j d S r]   )r^   callback_on_releaserY   rZ   r1   r1   r2   on_mouse_release   s   
zPaintTool.on_mouse_releasec                 C   sv   | j |s| jd |   d S | jd | |j|j |jdkr+|   d S | 	|j|j | 
| j d S )NFTr   )r$   r_   r"   r#   rO   r`   ra   rb   r^   rc   callback_on_moverY   rZ   r1   r1   r2   r      s   
zPaintTool.on_movec                 C   s$   | j }| j|| j||< || _ d S r4   )rE   r&   rC   at)r+   xyrE   r1   r1   r2   rc      s   
zPaintTool.update_overlayc                 C   s0   || j  d }|| j  d }| j||f d S r]   )r'   r"   set_xy)r+   ri   rj   r1   r1   r2   r`      s   zPaintTool.update_cursorc                 C   r3   r4   )rE   r6   r1   r1   r2   rY      r7   zPaintTool.geometry)r   r   NNNN)__name__
__module____qualname____doc__r   propertyr&   setterr'   rE   r   r\   rd   rf   r   rc   r`   rY   __classcell__r1   r1   r/   r2   r
      s<    0







c                   @   s    e Zd ZdZdd Zdd ZdS )rA   aq  Window that create slices numpy arrays over 2D windows.

    Examples
    --------
    >>> a = np.arange(16).reshape(4, 4)
    >>> w = CenteredWindow(1, a.shape)
    >>> a[w.at(1, 1)]
    array([[ 0,  1,  2],
           [ 4,  5,  6],
           [ 8,  9, 10]])
    >>> a[w.at(0, 0)]
    array([[0, 1],
           [4, 5]])
    >>> a[w.at(4, 3)]
    array([[14, 15]])
    c                 C   s   || _ || _d S r4   )r'   array_shape)r+   r'   rs   r1   r1   r2   r      s   
zCenteredWindow.__init__c           
      C   s   | j \}}t| j}tt|tt|}}td|| }t||| d }td|| }t||| d }	t||	t||fS )Nr   r   )rs   roundr'   intmaxminslice)
r+   rowcolhwr   xminxmaxyminymaxr1   r1   r2   rh      s   

	zCenteredWindow.atN)rl   rm   rn   ro   r   rh   r1   r1   r1   r2   rA      s    rA   __main__)data)ImageViewer)numpyrT   matplotlib.pyplotpyplotr    matplotlib.colorscolorsrK   ListedColormapr   viewer.canvastools.baser	   __all__r
   objectrA   rl   testingrundocs r   viewerr   camerarP   r   
paint_toolshowr1   r1   r1   r2   <module>   s$     2(
