B
    \f                 @   s   d dl Zd dlmZ d dlmZ eddddddgZ	dd	l
mZ d
gZG dd
 d
eZG dd deZedkrej  ddlmZ ddlmZ e ZeeZeeejZe  dS )    NZwhiteZredZ
dodgerblueZgoldZgreenyellowZ
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   a  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.
    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 k	r8|ni  || _t| _d | _|| _	t
jd|	| _| jd	 | j| j d
| _|| _| j| jg| _| j|  d S )N)on_moveon_enter
on_releaserz0.7g      ?T)Z	edgecolorZ	facecoloralphaanimatedr   r   r   F   )r   r   r   )superr   __init__dictupdater   LABELS_CMAPcmap_overlay_plotshapepltZ	Rectangle_cursorset_visibleaxZ	add_patchlabelradiusZartistsmanagerZadd_tool)
selfr   Zoverlay_shaper   r   r   r	   r   Z
rect_propsprops)	__class__ Clib/python3.7/site-packages/skimage/viewer/canvastools/painttool.pyr   ;   s     zPaintTool.__init__c             C   s   | j S )N)_label)r   r!   r!   r"   r   V   s    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lenr#   r   Zset_edgecolor)r   valuer!   r!   r"   r   Z   s    c             C   s   | j S )N)_radius)r   r!   r!   r"   r   a   s    zPaintTool.radiusc             C   sB   || _ d| d | _| j| j | j| j t|| j| _d S )N   r   )r(   Z_widthr   Z	set_widthZ
set_heightCenteredWindow_shapewindow)r   r
   r!   r!   r"   r   e   s
    c             C   s   | j S )N)_overlay)r   r!   r!   r"   overlaym   s    zPaintTool.overlayc             C   st   || _ |d kr&| jj| j d | _nB| jd kr\t| j| jt	 dd}| jj
|f|| _n| j| |   d S )NT)r   r   Znormr   )r-   r   Zimagesremover   r   r   r   mcolorsZNoNormZimshowset_dataredraw)r   imager   r!   r!   r"   r.   q   s    

c             C   s   | j S )N)r+   )r   r!   r!   r"   r      s    zPaintTool.shapec             C   sP   || _ | jd k	r<| jd|d d |d d df | j| _tj|dd| _d S )Ng      r   g      ?r   Zuint8)Zdtype)r+   r   Z
set_extentr(   r   npZzerosr.   )r   r   r!   r!   r"   r      s    
c             C   s"   |j dkr| | j |   d S )NZenter)keyZcallback_on_entergeometryr2   )r   eventr!   r!   r"   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_overlay)r   r7   r!   r!   r"   on_mouse_press   s    zPaintTool.on_mouse_pressc             C   s   |j dkrd S | | j d S )Nr   )r9   Zcallback_on_releaser6   )r   r7   r!   r!   r"   on_mouse_release   s    
zPaintTool.on_mouse_releasec             C   sv   | j |s$| jd |   d S | jd | |j|j |jdkrV|   d S | 	|j|j | 
| j d S )NFTr   )r   r:   r   r   r2   r;   r<   r=   r9   r>   Zcallback_on_mover6   )r   r7   r!   r!   r"   r      s    
zPaintTool.on_movec             C   s$   | j }| j|| j||< || _ d S )N)r.   r   r,   at)r   xyr.   r!   r!   r"   r>      s    zPaintTool.update_overlayc             C   s0   || j  d }|| j  d }| j||f d S )Nr   )r   r   Zset_xy)r   rB   rC   r!   r!   r"   r;      s    zPaintTool.update_cursorc             C   s   | j S )N)r.   )r   r!   r!   r"   r6      s    zPaintTool.geometry)r   r   NNNN)__name__
__module____qualname____doc__r   propertyr   setterr   r.   r   r8   r?   r@   r   r>   r;   r6   __classcell__r!   r!   )r    r"   r      s&   .  	c               @   s    e Zd ZdZdd Zdd ZdS )r*   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 )N)r   array_shape)r   r   rK   r!   r!   r"   r      s    zCenteredWindow.__init__c       
      C   sd   | j \}}| j}td|| }t||| d }td|| }t||| d }	t||	t||gS )Nr   r   )rK   r   maxminslice)
r   rowcolhwr
   ZxminZxmaxZyminZymaxr!   r!   r"   rA      s    
zCenteredWindow.atN)rD   rE   rF   rG   r   rA   r!   r!   r!   r"   r*      s   r*   __main__)data)ImageViewer)Znumpyr4   Zmatplotlib.pyplotZpyplotr   Zmatplotlib.colorsZcolorsr0   ZListedColormapr   Zviewer.canvastools.baser   __all__r   objectr*   rD   ZtestingZrundocs rT   ZviewerrU   Zcamerar3   r   Z
paint_toolZshowr!   r!   r!   r"   <module>   s"   
 /
