ó
 ‰\c           @   sÂ   d  d l  m Z d d l m Z d d l m Z d g Z d e e f d „  ƒ  YZ e d k r¾ d d l m	 Z	 d d	 l
 m Z e	 e j ƒ  ƒ Z e e ƒ Z e j ƒ  d
 GHe j e j ƒ n  d S(   iÿÿÿÿ(   t   RectangleSelectori   (   t   CanvasToolBase(   t   ToolHandlest   RectangleToolc           B   s§   e  Z d  Z d d d d d d „ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e	 j
 d „  ƒ Z	 d „  Z d	 „  Z d
 „  Z d „  Z e d „  ƒ Z RS(   s  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
    i
   c      	   C   s  d  |  _ t d d  d d d d ƒ } | j | d  k	 r< | n i  ƒ | d d  k rd | d | d <n  t j |  | j d „  d | ƒt j |  | d | d	 | d
 | ƒy |  j ƒ  Wn: t	 k
 rï g  t
 d ƒ D] } |  j j | ƒ ^ qÐ n X|  j |  _ |  j j t ƒ | |  _ d  |  _ d  |  _ | d  k r?d „  } n  | |  _ t d | d ƒ } d d d d g |  _ |  j \ }	 }
 t |  j |	 |
 d | ƒ|  _ d d d d g |  _ |  j \ } } t |  j | | d d d | ƒ|  _ |  j |  j j |  j j g |  _ |  j j |  ƒ d  S(   Nt	   edgecolort	   facecolort   rt   alphag333333Ã?c          W   s   d  S(   N(   t   None(   t   args(    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyt   <lambda>H   s    t	   rectpropst   on_movet   on_entert
   on_releasei
   c         S   s   d |  GHd  S(   Ns,   (xmin=%.3g, xmax=%.3g, ymin=%.3g, ymax=%.3g)(    (   t   extents(    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR   ]   s    t   mect   NWt   NEt   SEt   SWt   marker_propst   Wt   Nt   Et   St   markert   s(   R   t   _rectt   dictt   updateR    t   __init__t   axR   t   disconnect_eventst   AttributeErrort   ranget   canvast   mpl_disconnectt   to_drawt   set_animatedt   Truet   maxdistt   active_handlet   _extents_on_presst   callback_on_entert   _corner_ordert   cornersR   t   _corner_handlest   _edge_ordert   edge_centerst   _edge_handlest   artistt   artistst   managert   add_tool(   t   selfR5   R   R   R   R)   t
   rect_propst   propst   it   xct   yct   xet   ye(    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR   A   sB    	-					c         C   sY   |  j  s d S|  j  j ƒ  } |  j  j ƒ  } |  j  j ƒ  } |  j  j ƒ  } | | | | f S(   Ni    (   i    i    i    i    (   R   t   get_xt   get_yt	   get_widtht
   get_height(   R7   t   x0t   y0t   widtht   height(    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyt
   _rect_bboxp   s    	c         C   sS   |  j  \ } } } } | | | | | | f } | | | | | | f } | | f S(   s7   Corners of rectangle from lower left, moving clockwise.(   RG   (   R7   RC   RD   RE   RF   R;   R<   (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR.   z   s    c   	      C   so   |  j  \ } } } } | d } | d } | | | | | | | f } | | | | | | | f } | | f S(   s8   Midpoint of rectangle edges from left, moving clockwise.g       @(   RG   (	   R7   RC   RD   RE   RF   t   wt   hR=   R>   (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR1   ‚   s    

c   	      C   s]   |  j  \ } } } } t | | | g ƒ \ } } t | | | g ƒ \ } } | | | | f S(   s    Return (xmin, xmax, ymin, ymax).(   RG   t   sorted(	   R7   RC   RD   RE   RF   t   xmint   xmaxt   ymint   ymax(    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR   Œ   s    c   
      C   sË   | \ } } } } t  | | g ƒ \ } } t  | | g ƒ \ } }	 |  j j | ƒ |  j j | ƒ |  j j | | ƒ |  j j |	 | ƒ |  j j |  j Œ  |  j	 j |  j
 Œ  |  j t ƒ |  j ƒ  d  S(   N(   RJ   R   t   set_xt   set_yt	   set_widtht
   set_heightR/   t   set_dataR.   R2   R1   t   set_visibleR(   t   redraw(
   R7   R   t   x1t   x2t   y1t   y2RK   RL   RM   RN   (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR   ”   s    c         C   sv   | j  d k r d  S|  j j | ƒ s2 d  |  _ d  St j |  | ƒ d  |  _ |  j t	 ƒ |  j
 ƒ  |  j |  j ƒ d  S(   Ni   (   t   buttonR    t   in_axesR   t
   eventpressR    t   releaseR+   RT   R(   RU   t   callback_on_releaset   geometry(   R7   t   event(    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyt   on_mouse_release¥   s    		
c         C   s}   | j  d k s" |  j j | ƒ r& d  S|  j | ƒ |  j d  k r\ |  j t ƒ |  j ƒ  n  |  j t	 ƒ t
 j |  | ƒ d  S(   Ni   (   RZ   R    R[   t   _set_active_handleR*   R   RT   t   FalseRU   R(   R    t   press(   R7   R`   (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyt   on_mouse_press²   s    "c   
      C   s  |  j  j | j | j ƒ \ } } |  j j | j | j ƒ \ } } | |  j k rm | |  j k rm d |  _ d S| | k  rŒ |  j | |  _ n |  j	 | |  _ |  j
 \ } } } }	 |  j d k rÓ | | j } } n  |  j d k rõ |	 | j } }	 n  | | | |	 f |  _ d S(	   s:   Set active handle based on the location of the mouse eventNR   R   R   R   R   (   R   R   R   (   R   R   R   (   R/   t   closestt   xt   yR2   R)   R   R*   R-   R0   R   t   xdatat   ydataR+   (
   R7   R`   t   c_idxt   c_distt   e_idxt   e_distRV   RW   RX   RY   (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyRb   ½   s    !!	c         C   sñ   |  j  d  k s" |  j j | ƒ r& d  S|  j d  k rc |  j  j } |  j  j } | j | j } } ne |  j \ } } } } |  j d d g |  j k r  | j } n  |  j d d g |  j k rÈ | j } n  | | | | f |  _	 |  j
 |  j ƒ d  S(   NR   R   R   R   (   R\   R   R    R[   R*   Ri   Rj   R+   R-   R   t   callback_on_moveR_   (   R7   R`   RV   RX   RW   RY   (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR   Õ   s    "c         C   s   |  j  S(   N(   R   (   R7   (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR_   ç   s    N(   t   __name__t
   __module__t   __doc__R   R   t   propertyRG   R.   R1   R   t   setterRa   Re   Rb   R   R_   (    (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyR   	   s   6	.

				t   __main__(   t   ImageViewer(   t   datas   Final selection:N(   t   matplotlib.widgetsR    t   viewer.canvastools.baseR   R   t   __all__R   Rp   t   viewerRv   t    Rw   t   camerat	   rect_toolt   showR,   R   (    (    (    sB   lib/python2.7/site-packages/skimage/viewer/canvastools/recttool.pyt   <module>   s   	ã
