o
    :ήc"                     @   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rHddlm	Z	 dd	l
mZ e	e ZeeZe  ed
 eej dS 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                    sf  d  _ td ddd}||d ur|ni  |d d u r!|d |d< tj |jdd |d tj ||||d	 z   W n tyQ    fd
dt	dD  Y nw  j
 _  j d | _d  _d  _|d u rmdd }| _t|d d}g d _ j\}}	t j||	|d _g d _ j\}
}t j|
|d|d _ j  jj jjg _ j  d S )Nrg333333?)	edgecolor	facecoloralphar	   r
   c                  W   s   d S N )argsr   r   J/tmp/pip-target-vg8gfxp4/lib/python/skimage/viewer/canvastools/recttool.py<lambda>H   s    z(RectangleTool.__init__.<locals>.<lambda>)	rectprops)on_moveon_enter
on_releasec                    s   g | ]} j |qS r   )canvas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)mec)NWNESESW)marker_props)WNESs)markerr$   )_rectdictupdater   __init__axr   disconnect_eventsAttributeErrorrangeto_drawset_animatedmaxdistactive_handle_extents_on_presscallback_on_enter_corner_ordercornersr   _corner_handles_edge_orderedge_centers_edge_handlesartistartistsmanageradd_tool)r   rA   r   r   r   r5   
rect_propspropsxcycxeyer   r   r   r.   A   sL   




zRectangleTool.__init__c                 C   s>   | j sdS | j  }| j  }| j  }| j  }||||fS )N)r   r   r   r   )r+   get_xget_y	get_width
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.rQ   )r   rM   rN   rO   rP   rE   rF   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       @rR   )	r   rM   rN   rO   rP   whrG   rH   r   r   r   r=      s   zRectangleTool.edge_centersc           	      C   sB   | j \}}}}t||| g\}}t||| g\}}||||fS )z Return (xmin, xmax, ymin, ymax).)rQ   sorted)	r   rM   rN   rO   rP   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)rU   r+   set_xset_y	set_width
set_heightr;   set_datar:   r>   r=   set_visibleredraw)
r   r   x1x2y1y2rV   rW   rX   rY   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   releaser7   r_   r`   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 u r | d |   | d t| | d S )Nre   FT)	rf   r/   rg   _set_active_handler6   r_   r`   r   pressrl   r   r   r   on_mouse_press   s   



zRectangleTool.on_mouse_pressc           
      C   s   | j |j|j\}}| j|j|j\}}|| jkr%|| jkr%d| _dS ||k r0| j| | _n| j| | _| j	\}}}}	| jdv rH||j
}}| jdv rS|	|j}}	||||	f| _dS )z:Set active handle based on the location of the mouse eventN)r%   r#   r    )r&   r    r!   )r;   closestxyr>   r5   r6   r9   r<   r   xdataydatar7   )
r   rm   c_idxc_diste_idxe_distra   rb   rc   rd   r   r   r   ro      s   

z RectangleTool._set_active_handlec                 C   s   | j d u s| j|sd S | jd u r"| j j}| j j}|j|j}}n!| j\}}}}| jddg| j v r6|j}| jddg| j v rC|j}||||f| _| 	| j
 d S )Nr'   r%   r&   r(   )rh   r/   rg   r6   ru   rv   r7   r9   r   callback_on_moverk   )r   rm   ra   rc   rb   rd   r   r   r   r      s   
zRectangleTool.on_movec                 C   s   | j S r   r   r   r   r   r   rk      s   zRectangleTool.geometry)NNNr   N)__name__
__module____qualname____doc__r.   propertyrQ   r:   r=   r   setterrn   rq   ro   r   rk   r   r   r   r   r   	   s*    7
/
	

	

__main__)ImageViewer)datazFinal selection:N)matplotlib.widgetsr   viewer.canvastools.baser   r   __all__r   r|   viewerr    r   camera	rect_toolshowr   r8   r   r   r   r   r   <module>   s     d