B
    ¶‰\¶"  ã               @   s   d dl mZ ddlmZ ddlmZ dgZG dd„ deeƒZedkrŒddlm	Z	 dd	l
mZ e	e ¡ ƒZeeƒZe ¡  ed
ƒ e ej¡ dS )é    )ÚRectangleSelectoré   )ÚCanvasToolBase)ÚToolHandlesÚRectangleToolc               @   s„   e Zd ZdZddd„Zedd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZ	e	j
dd„ ƒZ	dd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdS )r   a  Widget for selecting a rectangular region in a plot.

    After making the desired selection, press "Enter" to accept the selection
    and call the `on_enter` callback function.

    Parameters
    ----------
    manager : Viewer or PlotPlugin.
        Skimage viewer or plot plugin object.
    on_move : function
        Function called whenever a control handle is moved.
        This function must accept the rectangle extents 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.
    maxdist : float
        Maximum pixel distance allowed when selecting control handle.
    rect_props : dict
        Properties for :class:`matplotlib.patches.Rectangle`. This class
        redefines defaults in :class:`matplotlib.widgets.RectangleSelector`.

    Attributes
    ----------
    extents : tuple
        Rectangle extents: (xmin, xmax, ymin, ymax).

    Examples
    ----------
    >>> from skimage import data
    >>> from skimage.viewer import ImageViewer
    >>> from skimage.viewer.canvastools import RectangleTool
    >>> from skimage.draw import line
    >>> from skimage.draw import set_color

    >>> viewer = ImageViewer(data.coffee())  # doctest: +SKIP

    >>> def print_the_rect(extents):
    ...     global viewer
    ...     im = viewer.image
    ...     coord = np.int64(extents)
    ...     [rr1, cc1] = line(coord[2],coord[0],coord[2],coord[1])
    ...     [rr2, cc2] = line(coord[2],coord[1],coord[3],coord[1])
    ...     [rr3, cc3] = line(coord[3],coord[1],coord[3],coord[0])
    ...     [rr4, cc4] = line(coord[3],coord[0],coord[2],coord[0])
    ...     set_color(im, (rr1, cc1), [255, 255, 0])
    ...     set_color(im, (rr2, cc2), [0, 255, 255])
    ...     set_color(im, (rr3, cc3), [255, 0, 255])
    ...     set_color(im, (rr4, cc4), [0, 0, 0])
    ...     viewer.image=im

    >>> rect_tool = RectangleTool(viewer, on_enter=print_the_rect) # doctest: +SKIP
    >>> viewer.show() # doctest: +SKIP
    Né
   c                sp  d ˆ _ td ddd}| |d k	r$|ni ¡ |d d krB|d |d< tjˆ |jdd„ |d tjˆ ||||d	 yˆ  ¡  W n* tk
r¤   ‡ fd
d„t	dƒD ƒ Y nX ˆ j
ˆ _ ˆ j  d¡ |ˆ _d ˆ _d ˆ _|d krÜdd„ }|ˆ _t|d d}ddddgˆ _ˆ j\}}	tˆ j||	|dˆ _ddddgˆ _ˆ j\}
}tˆ j|
|d|dˆ _ˆ j ˆ jjˆ jjgˆ _ˆ j ˆ ¡ d S )NÚrg333333Ã?)Ú	edgecolorÚ	facecolorZalphar	   r
   c              W   s   d S )N© )Úargsr   r   úBlib/python3.7/site-packages/skimage/viewer/canvastools/recttool.pyÚ<lambda>H   s    z(RectangleTool.__init__.<locals>.<lambda>)Z	rectprops)Úon_moveÚon_enterÚ
on_releasec                s   g | ]}ˆ j  |¡‘qS r   )ZcanvasZmpl_disconnect)Ú.0Úi)Úselfr   r   ú
<listcomp>R   s    z*RectangleTool.__init__.<locals>.<listcomp>r   Tc             S   s   t d|  ƒ d S )Nz,(xmin=%.3g, xmax=%.3g, ymin=%.3g, ymax=%.3g))Úprint)Úextentsr   r   r   r   ]   s    z(RectangleTool.__init__.<locals>.on_enter)ZmecÚNWÚNEZSEÚSW)Úmarker_propsÚWÚNÚEÚSÚs)Zmarkerr   )Ú_rectÚdictÚupdater   Ú__init__Úaxr   Zdisconnect_eventsÚAttributeErrorÚrangeZto_drawZset_animatedÚmaxdistÚactive_handleÚ_extents_on_pressÚcallback_on_enterÚ_corner_orderÚcornersr   Ú_corner_handlesÚ_edge_orderÚedge_centersÚ_edge_handlesZartistZartistsÚmanagerZadd_tool)r   r2   r   r   r   r(   Z
rect_propsZpropsÚxcÚycÚxeÚyer   )r   r   r$   A   sB    




zRectangleTool.__init__c             C   s>   | j s
dS | j  ¡ }| j  ¡ }| j  ¡ }| j  ¡ }||||fS )N)r   r   r   r   )r!   Zget_xZget_yZ	get_widthZ
get_height)r   Úx0Úy0ÚwidthÚheightr   r   r   Ú
_rect_bboxp   s    



zRectangleTool._rect_bboxc             C   s>   | j \}}}}||| || |f}|||| || f}||fS )z7Corners of rectangle from lower left, moving clockwise.)r;   )r   r7   r8   r9   r:   r3   r4   r   r   r   r-   z   s    zRectangleTool.cornersc       	      C   sV   | j \}}}}|d }|d }||| || || f}|| ||| || f}||fS )z8Midpoint of rectangle edges from left, moving clockwise.g       @)r;   )	r   r7   r8   r9   r:   ÚwÚhr5   r6   r   r   r   r0   ‚   s    zRectangleTool.edge_centersc       	      C   sB   | j \}}}}t||| gƒ\}}t||| gƒ\}}||||fS )z Return (xmin, xmax, ymin, ymax).)r;   Úsorted)	r   r7   r8   r9   r:   ÚxminÚxmaxÚyminÚymaxr   r   r   r   Œ   s    zRectangleTool.extentsc       
      C   s–   |\}}}}t ||gƒ\}}t ||gƒ\}}	| j |¡ | j |¡ | j || ¡ | j |	| ¡ | jj| jŽ  | j	j| j
Ž  |  d¡ |  ¡  d S )NT)r>   r!   Zset_xZset_yZ	set_widthZ
set_heightr.   Úset_datar-   r1   r0   Úset_visibleÚredraw)
r   r   Úx1Úx2Úy1Úy2r?   r@   rA   rB   r   r   r   r   ”   s    
c             C   sX   |j dkrd S | j |¡s$d | _d S t | |¡ d | _|  d¡ |  ¡  |  	| j
¡ d S )Né   T)Úbuttonr%   Úin_axesÚ
eventpressr   Úreleaser*   rD   rE   Zcallback_on_releaseÚgeometry)r   Úeventr   r   r   Úon_mouse_release¥   s    

zRectangleTool.on_mouse_releasec             C   sZ   |j dks| j |¡sd S |  |¡ | jd kr@|  d¡ |  ¡  |  d¡ t | |¡ d S )NrJ   FT)	rK   r%   rL   Ú_set_active_handler)   rD   rE   r   Zpress)r   rP   r   r   r   Úon_mouse_press²   s    



zRectangleTool.on_mouse_pressc       
      C   s¸   | j  |j|j¡\}}| j |j|j¡\}}|| jkrJ|| jkrJd| _dS ||k r`| j| | _n| j| | _| j	\}}}}	| jdkr||j
 }}| jdkr¦|	|j }}	||||	f| _dS )z:Set active handle based on the location of the mouse eventN)r   r   r   )r   r   r   )r.   ZclosestÚxÚyr1   r(   r)   r,   r/   r   ÚxdataÚydatar*   )
r   rP   Zc_idxZc_distZe_idxZe_distrF   rG   rH   rI   r   r   r   rR   ½   s    

z RectangleTool._set_active_handlec             C   s¤   | j d ks| j |¡sd S | jd krD| j j}| j j}|j|j }}nB| j\}}}}| jddg| j krl|j}| jddg| j kr†|j}||||f| _|  	| j
¡ d S )Nr   r   r   r   )rM   r%   rL   r)   rV   rW   r*   r,   r   Zcallback_on_moverO   )r   rP   rF   rH   rG   rI   r   r   r   r   Õ   s    
zRectangleTool.on_movec             C   s   | j S )N)r   )r   r   r   r   rO   ç   s    zRectangleTool.geometry)NNNr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   Úpropertyr;   r-   r0   r   ÚsetterrQ   rS   rR   r   rO   r   r   r   r   r   	   s   6 
.

Ú__main__)ÚImageViewer)ÚdatazFinal selection:N)Zmatplotlib.widgetsr   Zviewer.canvastools.baser   r   Ú__all__r   rX   Zviewerr_   Ú r`   ZcameraZ	rect_toolZshowr   r+   r   r   r   r   r   Ú<module>   s    d