
    ը	f'|                     @   d Z ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ 	 ddlZ ej2                  d       ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z( ddl)m*Z+ ddl0m1Z2 ddl3m4Z4  G d dejj                  e      Z6d Z7d Z8d Z9d Z:d Z; G d d      Z< G d d      Z= G d de(j|                        Z?	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d!d Z@y# e,$ r"Z- e, e.d      j_                  e-            dZ-[-ww xY w)"a|  
@package iscatt.plots

@brief Plotting widgets

Classes:
 - plots::ScatterPlotWidget
 - plots::PolygonDrawer
 - plots::ModestImage

(C) 2013-2016 by the GRASS Development Team

This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.

@author Stepan Turek <stepan.turek seznam.cz> (mentor: Martin Landa)
    N)ceil)ProcessQueue)deepcopy)MergeArraysApplyColormap)ManageBusyCursorMixin)dist_point_to_segment)UserSettings)MenuNewIdWXAgg)Figure)FigureCanvasWxAgg)Line2D)Artist)PolygonEllipsez\The Scatterplot Tool needs the "matplotlib" (python-matplotlib) package to be installed. {0})Signalc                       e Zd Zej                  fdZd Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)ScatterPlotWidgetc                     t         j                  j                   ||       t        j                           | _        d  _        d  _         j                           j                          | _	        | _
        d  _        d  _        i  _        | _        d _         j!                  d        j#                          d _         j'                  t         j(                   fd       t+        d       _        t+        d       _        t1                _        d  _         j6                  j9                  d	 j:                          j6                  j9                  d
 j<                          j6                  j9                  d j>                          j6                  j9                  d j@                          j6                  j9                  d jB                         y )N)windowF)   d   g333333?c                 $    j                         S N)CleanUpeventselfs    -/usr/lib/grass83/gui/wxpython/iscatt/plots.py<lambda>z,ScatterPlotWidget.__init__.<locals>.<lambda>S   s    dlln     zScatterPlotWidget.plotClosedzScatterPlotWidget.cursorMove)plotmotion_notify_eventbutton_press_eventbutton_release_event
draw_eventfigure_leave_event)"wxPanel__init__r	   parentfull_extendmode_createWidgets	_doLayoutscatt_id	scatt_mgrcidpress
cidreleaserend_dt	transposeinverseSetSizeLayout
base_scaleBind	EVT_CLOSEr   
plotClosed
cursorMoveScatterPlotContextMenucontex_menu
ciddscrollcanvasmpl_connectMotionOnPress	OnReleaseDrawCallbackOnCanvasLeave)r!   r.   r3   r4   r8   ids   `     r"   r-   zScatterPlotWidget.__init__7   sc   
$+&&tD9	 ""Z 		",, <= !?@ !?@1t< 5t{{C 4dllC 6Gd.?.?@ 4d6H6HIr$   c                     | j                   j                  |       | j                  j                  | j                         y r   )polygon_drawerrI   axesdraw_artist	zoom_rectr!   r    s     r"   rI   zScatterPlotWidget.DrawCallbackb   s,    ((/		dnn-r$   c                    d| _         t        d| j                         | _        d| j                  _        t	        | d| j                        | _        | j                  j                  g d      | _        t        t        t        dgdg            d      }| j                  j                  |       t        | j                  |d	      | _        d | _        d | _        t        t        t        dgdg            d
      | _        | j                   j#                  d       | j                  j                  | j                          y )Nr   )      ?rS   )dpiT)        rV      rW   r   )animated)pol	empty_polnone)	facecolorF)rT   r   fig
autolayout	FigCanvasrD   add_axesrN   r   listzip	add_patchPolygonDrawerrM   zoom_wheel_coordszoom_rect_coordsrP   set_visible)r!   rY   s     r"   r1   z ScatterPlotWidget._createWidgetsf   s     *$((3"b$((3HH%%&67	d3sQC=)D9		C +DII3$O!% $ c1#sm!4G""5)		DNN+r$   c                     | j                   r@| j                  j                  | j                          | j                  j	                          y y r   )r/   rN   axisrD   drawr!   s    r"   ZoomToExtendzScatterPlotWidget.ZoomToExtend|   s6    IINN4++,KK r$   c                    | j                          |dk(  r3| j                  j                  d| j                        | _        d| _        y |dk(  rd| _        y |dk(  rd| _        y |r| j                  j                  |       y y )Nzoomscroll_eventzoom_extendpan)_deactivateModerD   rE   	ZoomWheelrC   r0   rM   SetModer!   r0   s     r"   rt   zScatterPlotWidget.SetMode   sq    6>"kk55ndnnUDODI]"%DIU]DI''- r$   c                 :    | j                   j                  |       y r   )rM   SetSelectionPolygonModer!   activates     r"   rw   z)ScatterPlotWidget.SetSelectionPolygonMode   s    33H=r$   c                     d | _         | j                  j                  d        | j                  r%| j                  j                  | j                         | j                  j                  d       | j                          y )NF)	r0   rM   rt   rC   rD   mpl_disconnectrP   rg   _stopCategoryEditrk   s    r"   rr   z!ScatterPlotWidget._deactivateMode   sX    	##D)??KK&&t7""5) r$   c                     | j                   j                         }|y | j                  r|D ]  }|d   }|d   |d<   ||d<    |S )Nr   rW   )rM   	GetCoordsr8   )r!   coordsctmps       r"   r~   zScatterPlotWidget.GetCoords   sZ    $$..0>>> dt!!
 r$   c                 6    | j                   j                         S r   )rM   SetEmptyrk   s    r"   r   zScatterPlotWidget.SetEmpty   s    ""++--r$   c                     | j                   dk(  sy | j                  j                  d       | j                  |       | j                  j                          y )Nrn   F)r0   rP   rg   ZoomRectanglerD   rj   rQ   s     r"   rH   zScatterPlotWidget.OnRelease   sA    yyF"""5)5!r$   c                 "   |j                   sy| j                  dk(  r| j                          |j                  rI|j                  r=|j                  |j                  d| _        |j                  |j                  d| _        yd| _        d| _        y)zGon button press we will see if the mouse is over us and store some dataNrp   )xy)inaxesr0   rl   xdataydatare   rf   rQ   s     r"   rG   zScatterPlotWidget.OnPress   sk    ||99%;;5;;+0;;U[[%ID"*/++EKK$HD!%)D"$(D!r$   c                     | j                   r%| j                  j                  | j                          | j                  r&| j                  j                  | j                         yy)z(disconnect all the stored connection idsN)r5   rD   r{   r6   rk   s    r"   r|   z#ScatterPlotWidget._stopCategoryEdit   sC     ==KK&&t}}5??KK&&t7 r$   c                 n   t        j                  t         j                        | _        | j                  j	                  | j
                  dt         j                  t         j                  z  t         j                  z         | j                  | j                         | j                  j                  |        y NrW   )r+   BoxSizerVERTICAL
main_sizerAddrD   LEFTTOPGROWSetSizerFitrk   s    r"   r2   zScatterPlotWidget._doLayout   sh    ++bkk2DKKBGGbff,<rww,FGdoo&D!r$   c                 `    g  j                   r: j                  j                         } j                  j                         }||z   }nd}t	               }t         j                         t        t        ||| j                  |f      }	|	j                          |j                         \  }
 _          _        |	j                          t         j                         t        j                  |
d   |
d         }
 j                  j                           j                  j!                  d        j"                  rt        j"                  |
d      }
t%         j                  |
 j                   D cg c]  }t'        t)        |             c}dd	d
      }j+                   j                  j,                  |gg       j+                  t.        j0                  |
j2                  gg       |D ]  }|dk(  r
||vr||   }|s||   d   j5                  d      } j"                  r=d|d   z
  dz   |d<   |d   dk\  rt7        d|d   z
        |d<   |d   d   |d   d   g|d<   t9        |d   |d   |d   |d   ddd      } j                  j;                  |       j+                   j                  j,                  |gg       ||   d   j5                  d      dd D cg c]  }t'        |      dz   }}t9        |d   |d   |d   |d   |dd      } j                  j;                  |       j+                   j                  j,                  |gg       t=        |d   d   g|d   d   gddd      } j                  j;                  |       j+                   j                  j,                  |gg        j+                   j>                  j@                  jB                  g g       |r j                  j!                  |       tE        jF                   fd       yc c}w c c}w )zRedraws the figureN)targetargsdtshfilenameshapeequal)rW   r      lowernearest)extentorigininterpolationaspectr   color:ih  thetaZ   posrW   widthheightwg      ?None)xyr   r   angle	edgecolor	linewidthr\           o@r   r   )markermarkeredgecolor
markersizec                  &    j                         S r   )	CallAfter)callafter_listr!   s   r"   r#   z(ScatterPlotWidget.Plot.<locals>.<lambda>3  s    T^^N; r$   )$r/   rN   get_xlimget_ylimr   _rendDtMemmapsToFilesr7   r   MergeImgstartgetjoin_rendDtFilesToMemmapsnpmemmapclearri   r8   imshowintr   appendrO   grass
try_remover   splitabsr   
add_artistr   r]   rD   blitr+   r   )r!   
cats_orderscattsellipsesstylescxcyr   qp
merged_imgr   imgcat_idecolorsellipvr   centerr   s   `                   @r"   PlotzScatterPlotWidget.Plot   s    ##%B##%BRAAGdll+8:vvt||UV*WX		56UUW2
D$dl	dll+YY
4(8
4@PQ
 					w>>j)<JII*.*:*:;QCQL;#
 	tyy44se<=u//*2E2E1FGH  6	EF{X% AF^G,2237F~~ 1W:-2'
W:$!$S1W:%5!6AgJeHQK5!5%U8j{j E II  '!!499#8#85'"BC-3F^G-D-J-J3-OPRQR-STSVe^TETU8j{j E II  '!!499#8#85'"BC5!5! #F II  (!!499#8#86("CDm6	Ep 	txx33R89IINN1
;<K <N Us   2P&"P+c                 t    |r|j                  d      \  }} ||  |r| j                  j                          y Nr   )poprD   rj   )r!   
funcs_listfcnr   s       r"   r   zScatterPlotWidget.CallAfter5  s5    "q)ICJ  	r$   c                 P    | j                   j                  | j                         y )N)r3   )r?   emitr3   rk   s    r"   r   zScatterPlotWidget.CleanUp<  s    dmm4r$   c                    |j                   sy | j                  j                         }| j                  j                         }|j                  }|j
                  }|j                  dk(  rd| j                  z  }n|j                  dk(  r| j                  }nd}|||d   z
  |z  z
  ||d   |z
  |z  z   |||d   z
  |z  z
  ||d   |z
  |z  z   f}| j                  j                  |       | j                  j                          y )NuprW   downr   )r   rN   r   r   r   r   buttonr<   ri   rD   rj   )r!   r    cur_xlimcur_ylimr   r   scale_factorextends           r"   rs   zScatterPlotWidget.ZoomWheel?  s    || 99%%'99%%'<<4t.L\\V#??LL UXa[(L88Xa[5(L88UXa[(L88Xa[5(L88	
 			vr$   c                 
   | j                   dk(  sy |j                  y |j                  dk7  ry | j                  j	                         }| j                  j                         }|j                  |j                  }}t        | j                  d         }t        | j                  d         }||k(  s||k(  ry ||kD  r|}|}|}||kD  r|}|}|}| j                  j                  ||||f       | j                  j                          y )Nrn   rW   r   r   )r0   r   r   rN   r   r   r   r   r   rf   ri   rD   rj   )	r!   r    r   r   x1y1x2y2r   s	            r"   r   zScatterPlotWidget.ZoomRectangle\  s    yyF"<<<<199%%'99%%'ekkBd++C01d++C018rRx7CBB7CBB		BB'( 	r$   c                     | j                  |       | j                  |       |j                  y | j                  j	                  |j
                  |j                  | j                         y N)r   r   r3   )	PanMotionZoomRectMotionr   r@   r   r   r   r3   rQ   s     r"   rF   zScatterPlotWidget.Motion~  sN    uE"<<u{{ekkDMMRr$   c                 T    | j                   j                  d d | j                         y r   )r@   r   r3   rQ   s     r"   rJ   zScatterPlotWidget.OnCanvasLeave  s    ttdmmDr$   c                 ,   | j                   dk(  sy|j                  y|j                  dk7  ry| j                  j	                         }| j                  j                         }|j                  |j                  }}|| j                  d   z
  dz  }|| j                  d   z
  dz  }|d   |z
  |d   |z
  |d   |z
  |d   |z
  f}|| j                  d<   || j                  d<   | j                  j                  |       | j                  j                          y)on mouse movementrq   NrW   r   g333333?r   r   )r0   r   r   rN   r   r   r   r   re   ri   rD   rj   )	r!   r    r   r   r   r   mxmyr   s	            r"   r   zScatterPlotWidget.PanMotion  s   yyE!<<<<199%%'99%%'{{EKK1$((--4$((--4 QK"QK"QK"QK"	
 '(s#&'s#		v 	r$   c                 t   | j                   dk(  sy |j                  y |j                  dk7  ry |j                  |j                  }}| j
                  j                  d       | j                  d   }| j                  d   }||f||f||f||f||ff| j
                  _        | j                  j                          y )Nrn   rW   Tr   r   )r0   r   r   r   r   rP   rg   rf   r   rD   rj   )r!   r    r   r   r   r   s         r"   r   z ScatterPlotWidget.ZoomRectMotion  s    yyF"<<<<1ekkB""4(""3'""3' "XBx"bB8b"XN 	r$   N)__name__
__module____qualname__r+   ID_ANYr-   rI   r1   rl   rt   rw   rr   r~   r   rH   rG   r|   r2   r   r   r   rs   r   rF   rJ   r   r    r$   r"   r   r   6   s    BD)) )JV.,,

.>!.)8"e=N5: DSEBr$   r   c           	      ~   t        |       d}d }t        j                         }| D ]  }||vr	||   }	|dk7  r ||   d   dk(  s||   d   s||v r||   s||= 3|r.|	d   d   }
|	d   d   }|d	   d
z
  |d   d
z   |
d	   d
z
  |
d   d
z   f}t        |||	|      s||   xt        j
                  j                  |	d   d      }t	        j                  |      }|dk(  rd ||<   t        ||      }t	        j                  |dt        |      z  z        }t	        j                  |j                  dz        }|j                  }i ||<   |dk7  r||   d   ||   d<   t	        j                  t        j                         dd|d   |d   df      ||   d<   t        ||j                  |||   d          ~~|r7t	        j                  |dd||   d   j                        }||   d   |d d  d}nt!        |||   d   ||   d           t#        |       |j$                  |j                  d}|j'                  ||f       y )NTr   opacityrV   show
bands_infob1b2min      ?maxnp_valsr      r   uint8zw+rW      )dtyper0   r   r   F)r   r   )r   r   tempfile
_renderCatr   mamasked_less_equalamax_getColorMapr  float_lutr   r   r   maskr   r   r   put)r   r   r   r7   output_queueinitr   	merge_tmpr   scattb2_ib1_ir/   
masked_catvmaxcmapr   s                    r"   r   r     s   '"DJ I Ov Q;6N9%,F6N64J FO&t,D&t,D Uc!Uc!Uc!Uc!	K &'5&9v&00y1A1EJ77:&Dqy"&/D*d0C"DEJ88DIIO,D!!B GFO{+1&>'+B($&II d2a5"Q%QRBS%GFOD!
 *jootWV_T=RS  t76?4;P;V;VJ $FOD1JqMD
GFOD$96&>);TU	GOb '""++:3C3CDJj+w78r$   c                     t        j                  |       D ]4  \  }}d|v s|d   j                  | |   d<   |d   j                  | |   d<   6 y )Nr   r   )six	iteritemsr   r   r7   kr   s      r"   r   r     sS    g& 0119 w}}GAJt w//GAJt0r$   c                     t        j                  |       D ]3  \  }}d|v st        j                  |d   |d         | |   d<   | |   d= 5 y )Nr   r   r   )r'  r(  r   r   r)  s      r"   r   r   &  sR    g& !119!yy!D'4IGAJt
4 !r$   c                      yNTr  )r   r7   r   r   s       r"   r  r  -  s    r$   c                 f   t         j                  j                  }| dk(  rK|j                  dd       |j	                          d|j
                  t        |j
                        dz
  df<   |S ||    d   j                  d      }|j                  dd       |j	                          d|j
                  t        |j
                        dz
  df<   t        |d         dz  |j
                  d d df<   t        |d         dz  |j
                  d d df<   t        |d	         dz  |j
                  d d d	f<   |S )
Nr   r   rS   rW   rU   r   r   r   r   )	
matplotlibcmjetset_bad_initr  lenr   r   )r   r   r%  r   s       r"   r  r  <  s   ==D{S#

,-		#dii.1$b() K (..s3S#

,-		#dii.1$b()fQi.50		!Q$fQi.50		!Q$fQi.50		!Q$Kr$   c                       e Zd Zd Zd Zd Zy)rA   c                     || _         |j                  | _        | j                  j                  d| j                        | _        y )Nr'   )r%   rD   rE   
ContexMenur5   )r!   r%   s     r"   r-   zScatterPlotContextMenu.__init__P  s1    	kk//0DdooVr$   c                 N    |j                   sy |j                  dk(  rt               }dt        d       fdgg}|D ]F  }t	               }|j                  ||d          |j                  t        j                  |d   |       H t        j                   j                  |       y y )Nr   zoom_to_extendzZoom to scatter plot extendc                 8    j                   j                         S r   )r%   rl   r   s    r"   r#   z3ScatterPlotContextMenu.ContexMenu.<locals>.<lambda>_  s    $))"8"8": r$   rW   r   )rK   )r   r   r   _r   Appendr=   r+   EVT_MENUr   ShowMenu)r!   r    menu
menu_itemsitemitem_ids   `     r"   r7  z!ScatterPlotContextMenu.ContexMenuU  s    ||<<16D %34:J # <'GT!W-		"++tAw7	;<
 LL- r$   c                     | j                   j                  |       |j                          | j                   j                         r| j                   j	                          y y r   )r%   	PopupMenuDestroy
HasCaptureReleaseMouse)r!   r?  s     r"   r>  zScatterPlotContextMenu.ShowMenuj  sB    		D!99!II""$ "r$   N)r   r  r  r-   r7  r>  r  r$   r"   rA   rA   O  s    W
.*%r$   rA   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)rd   z
    An polygon editor.
    c                    |j                   t        d      || _        |j                   j                  | _        d| _        || _        || _        t        | j
                  j                   \  }}| j                         }t        ||ddd      | _        | j                  j                  | j                         | j
                  j                  | j                        }d | _        d | _        | j                  r| j#                  d       | j                  j%                  d| j&                         | j                  j%                  d| j(                         | j                  j%                  d	| j*                         d
| _        y )NzSYou must first add the polygon to a figure or canvas before defining the interactorTor)r   markerfacecolorrX   Fr'   r(   r&   r   )figureRuntimeErroraxrD   	showvertsrY   rZ   rb   r   _getPolygonStyler   lineadd_lineadd_callbackpoly_changedmoving_ver_idxr0   _showrE   OnButtonPressedButtonReleaseCallbackmotion_notify_callbackit)r!   rO  rY   rZ   r   r   stylecids           r"   r-   zPolygonDrawer.__init__v  s1   ::e  jj''"DHHKK 1%%'1aS4P	# hh##D$5$56"	>>JJu 	 4d6J6JK 68R8RS 5t7R7RSr$   c                     i }t        j                  ddd      |d<   t        j                  ddd      |d<   |d   D cg c]  }|dz  	 c}|d<   |d   D cg c]  }|dz  	 c}|d<   |S c c}w c c}w )Nr   	selectionsel_polgroupkeysubkeysel_pol_vertexr   r   Get)r!   r\  is      r"   rQ  zPolygonDrawer._getPolygonStyle  s    '++{9
i #/"2"2{3C#
 05Y/?@!AI@i6;<L6M"N1u9"N A"Ns    A-A2c                 2    t        j                  ddd      S )Nr   r_  
snap_treshra  rf  rk   s    r"   _getSnapTreshzPolygonDrawer._getSnapTresh  s    g;|TTr$   c                     || _         y r   )r0   ru   s     r"   rt   zPolygonDrawer.SetMode  s	    	r$   c                 h    | j                  |       |s| j                  r| j                  d        y y y r   )Showr0   rt   rx   s     r"   rw   z%PolygonDrawer.SetSelectionPolygonMode  s*    		(DIILL &xr$   c                 h    |r| j                   s| j                  d       y y | j                  d       y )NTF)rZ   rW  r!   r  s     r"   rn  zPolygonDrawer.Show  s+    >>

4  " JJur$   c                 ^    | j                   ry t        | j                  j                        }|S r   )rZ   r   rY   r   )r!   r   s     r"   r~   zPolygonDrawer.GetCoords  s#    >>$((++&r$   c                 &    | j                  d       y r-  )_setEmptyPolrk   s    r"   r   zPolygonDrawer.SetEmpty  s    $r$   c                     || _         | j                   r't        j                  ddgg      | j                  _        | j                  |        y r   )rZ   r   arrayrY   r   rW  )r!   rZ   s     r"   rs  zPolygonDrawer._setEmptyPol  s8    ">>((QF8,DHHK

y=!r$   c                     || _         | j                  j                  | j                          | j                  j                  | j                          | j	                          y r   )r  rR  rg   rY   Redrawrp  s     r"   rW  zPolygonDrawer._show  s>    			dii(TYY'r$   c                 B   | j                   rJ| j                  j                  | j                         | j                  j                  | j                         | j
                  j                  | j                  j                         | j
                  j                          y r   )	r  rO  rO   rY   rR  rD   r   bboxrj   rk   s    r"   rw  zPolygonDrawer.Redraw  s_    99GG)GG		*&r$   c                    | j                         }| j                  j                  |d          | j                  j	                  |d          | j
                  j                  | j                  j                        | _	        | j                  j                  | j                         | j                  j                  | j                         y )Nr`  re  )rQ  rY   set_facecolorrR  set_markerfacecolorrD   copy_from_bboxrO  ry  
backgroundrO   )r!   r    r\  s      r"   rI   zPolygonDrawer.DrawCallback  s    %%'uY/0		%%e,<&=>++44TWW\\BDHH%DII&r$   c                     | j                   j                         }t        j                  | j                   |       | j                   j	                  |       y)z;this method is called whenever the polygon object is calledN)rR  get_visibler   update_fromrg   )r!   rY   viss      r"   rU  zPolygonDrawer.poly_changed  s<     ii##%499c*		c"r$   c                    t        j                  | j                  j                        }| j                  j	                         j                  |      }|dddf   |dddf   }}t        j                  ||j                  z
  dz  ||j                  z
  dz  z         }t        j                  t        j                  |t        j                  |                  d   }|d   }||   | j                         k\  rd}|S )z;get the index of the vertex under point if within thresholdNr   rW   r   )r   asarrayrY   r   get_transform	transformsqrtr   r   nonzeror   aminrk  )	r!   r    r   xytxtytdindseqinds	            r"   get_ind_under_pointz!PolygonDrawer.get_ind_under_point  s     ZZ$hh$$&004QTC1IBGGR%''\a'2<A*==>BHHQ
34Q7QiS6T''))C
r$   c                 l   |j                   sy |j                  dv ry | j                  dk(  r| j                  |       na| j                  dk(  r| j	                  |       n@| j                  dk(  r| j                  |       n| j                  dk(  r| j                          | j                  |      | _        y )Nr   r   delete_vertexadd_boundary_vertex
add_vertexremove_polygon)	r   r   r0   _deleteVertex_addVertexOnBoundary
_addVertexr   r  rV  rQ   s     r"   rX  zPolygonDrawer.OnButtonPressed  s    ||<<6!99'u%YY//%%e,YY,&OOE"YY**MMO"66u=r$   c                 L    | j                   sy|j                  dk7  ryd| _        y)z#whenever a mouse button is releasedNrW   )rP  r   rV  rQ   s     r"   rY  z#PolygonDrawer.ButtonReleaseCallback  s#    ~~<<1"r$   c                     || _         | j                  j                  | j                          | j                   sd | _        y y r   )rP  rR  rg   rV  rp  s     r"   ShowVerticeszPolygonDrawer.ShowVertices  s3    		dnn-~~"&D r$   c                    | j                  |      }|| j                  ry t        | j                  j                        dk  rd| _        | j                  d       y g }t        | j                  j                        D ]r  \  }}||k(  r|dk(  r&|t        | j                  j                        dz
  k(  r7|t        | j                  j                        dz
  k(  r|dk(  rb|j                  |       t || j                  _        | j                  j                  t        t        | j                  j                                | j                          y )Nr   TFr   rW   )r  rZ   r4  rY   r   rW  	enumerater   rR  set_datara   rb   rw  )r!   r    r  r   rh  tups         r"   r  zPolygonDrawer._deleteVertex  s   &&u-;$..txx{{q !DNJJu, 	FAsCxaC3txx{{#3a#77c$((++&**saxMM#	 		4TXX[[ 123r$   c           	         | j                   ry | j                  j                         j                  | j                  j                        }|j
                  |j                  f}t        t        |      dz
        D ]  }||   }||dz      }t        |||      }|| j                         k  s1t        j                  t        | j                  j                  d |dz          |j                  |j                  fgz   t        | j                  j                  |dz   d        z         | j                  _        | j                   j#                  t        t%        | j                  j                                 n | j'                          y r   )rZ   rY   r  r  r   r   r   ranger4  r
   rk  r   ru  ra   r   r   rR  r  rb   rw  )r!   r    xysr   rh  s0s1r  s           r"   r  z"PolygonDrawer._addVertexOnBoundary4  s/   >>hh$$&00=GGUWWs3x!|$ 	AQBQUB%aR0AD&&(( hhWq1u-.U[[123488;;q1uw/01
 		""4TXX[[(9#:;	 	r$   c                 V   | j                   rW|j                  |j                  f}t        j                  ||g      | j
                  _        | j                  d       d| _         nxt        j                  |j                  |j                  fgt        | j
                  j                  dd        z   |j                  |j                  fgz         | j
                  _        | j                  j                  t        t        | j
                  j                                | j                          y )NTFrW   )rZ   r   r   r   ru  rY   r   rW  ra   rR  r  rb   rw  )r!   r    pts      r"   r  zPolygonDrawer._addVertexJ  s    >>++u{{+B((B8,DHHKJJt"DN((++u{{+,txx{{12'(KK-./DHHK 			4TXX[[ 123r$   c                 `   | j                   dk(  sy| j                  sy| j                  ry| j                  y|j                  y|j
                  dk7  ry| xj                  dz  c_        |j                  |j                  }}||f| j                  j                  | j                  <   | j                  dk(  r<||f| j                  j                  t        | j                  j                        dz
  <   nJ| j                  t        | j                  j                        dz
  k(  r||f| j                  j                  d<   | j                  j                  t        t        | j                  j                                | j                   j#                  | j$                         | j'                          y)r   move_vertexNrW   r   )r0   rP  rZ   rV  r   r   r[  r   r   rY   r   r4  rR  r  ra   rb   rD   restore_regionr~  rw  )r!   r    r   r   s       r"   rZ  z$PolygonDrawer.motion_notify_callback[  s8   yyM)~~>>&<<<<11{{EKK1+,a4D''(!#011DHHKKDHHKK(1,-  C$4q$88TDHHKKN		4TXX[[ 123""4??3r$   N)r   r  r  __doc__r-   rQ  rk  rt   rw   rn  r~   r   rs  rW  rw  rI   rU  r  rX  rY  r  r  r  r  rZ  r  r$   r"   rd   rd   q  sr    "HU
 "'# >"#'6,"r$   rd   c                   @     e Zd ZdZd fd	Zd Zd Zd Z fdZ xZ	S )ModestImagea  
    Computationally modest image class.

    ModestImage is an extension of the Matplotlib AxesImage class
    better suited for the interactive display of larger images. Before
    drawing, ModestImage resamples the data array based on the screen
    resolution and view window. This has very little affect on the
    appearance of the image, but can substantially cut down on
    computation since calculations of unresolved or clipped pixels
    are skipped.

    The interface of ModestImage is the same as AxesImage. However, it
    does not currently support setting the 'extent' property. There
    may also be weird coordinate warping operations for images that
    I'm not aware of. Don't expect those to work either.

    Author: Chris Beaumont <beaumont@hawaii.edu>
    c                     d|v r|d   t        d      d | _        d\  | _        | _        d| _        || _        || _        t        t        | &  |i | y )Nr   z$ModestImage does not support extentsNN)NNNN)
NotImplementedError	_full_res_sx_sy_boundsminxminysuperr  r-   )r!   r  r  r   kwargs	__class__s        r"   r-   zModestImage.__init__  s_    v&"2">%&LMM'$(/		k4)4:6:r$   c                    || _         || _        | j                  j                  t        j                  k7  r9t        j
                  | j                  j                  t              st        d      | j                  j                  dvs4| j                  j                  dk(  r&| j                  j                  d   dvrt        d      d| _
        d| _        d| _        d| _        d\  | _        | _        y)	zI
        Set the image array

        ACCEPTS: numpy/PIL Image A
        z#Image data can not convert to floatr  r   rU   )r   r  z!Invalid dimensions for image dataNr  )r  _Ar  r   r  can_castr  	TypeErrorndimr   _imcache
_rgbacache
_oldxslice
_oldyslicer  r  )r!   As     r"   r  zModestImage.set_data  s     77==BHH$R[[-NABB77<<v%GGLLA$''--"36"A?@@'$(r$   c                     | j                   S )z,Override to return the full-resolution array)r  rk   s    r"   	get_arrayzModestImage.get_array  s    ~~r$   c                    | j                   }|j                  j                  ddg      |j                  j                  ddg      z
  }|j                         |j	                         }}|d   |d   z
  |d   |d   z
  }}t        | j                  |d   dz
        }t        | j                  j                  d   | j                  z   |d   dz         }t        | j                  |d   dz
        }	t        | j                  j                  d   | j                  z   |d   dz         }
t        t        |||	|
g      \  }}}	}
t        t        dt        ||z
  dz  t        j                  ||d   z                          }t        t        dt        |
|	z
  dz  t        j                  ||d   z                          }|| j                  k(  rX|| j                   k(  rI|	| j"                  d   k(  r7|
| j"                  d   k(  r%|| j"                  d   k(  r|| j"                  d   k(  ry| j                  || j                  z
  || j                  z
  ||	| j                  z
  |
| j                  z
  |f   | _        |	| j$                  j                  d   |z  z   }
|| j$                  j                  d   |z  z   }| j'                  |	dz
  |
dz
  |dz
  |dz
  g       || _        || _        |	|
||f| _        | j)                          y)	zlChange self._A and _extent to render an image whose
        resolution is matched to the eventual rendering.rW   r      g      @r   r   Nr  )rN   	transAxesr  r   r   r  r  r  r  r   r  mapr   r   r   r  r  r  r  
set_extentchanged)r!   rO  extxlimylimdxdyy0r   x0r   sysxs                r"   _scale_to_reszModestImage._scale_to_res  s    YYll$$aV,r||/E/Eq!f/MM[[]BKKMda47"DGd1g$5BDGaK(%%a(4994d1gkBDGaK(%%a(4994d1gkBS2r2r"23BBQR"WORWWR#a&[-ABCDQR"WORWWR#a&[-ABCD $((Ndhhdll1o%dll1o%dll1o%dll1o%..NR$))^b0"tyy.2		>TV2VV
 $''--"R''$''--"R''c28R#XrCx@ABB'r$   c                 T    | j                          t        t        |   |g|i | y r   )r  r  r  rj   )r!   rendererr   r  r  s       r"   rj   zModestImage.draw  s(    k4%h@@@r$   )rV   rV   )
r   r  r  r  r-   r  r  r  rj   __classcell__)r  s   @r"   r  r  {  s)    &
;(.(TA Ar$   r  c           
           j                          |t        |t        j                        sJ |t        j
                  d   } j                  |       |
r|
d   }|
d   }nd}d}t        || ||||	|
f|||d|}|j                  |       |j                  |        j                  |       |j                         |j                   j                         |||j                  ||       n|j                          |j!                  |       |j#                  |j%                                 j'                  |        fd|_        |S )zSimilar to matplotlib's imshow command, but produces a ModestImage

    Unlike matplotlib version, must explicitly specify axes
    @author: Chris Beaumont <beaumont@hawaii.edu>
    zimage.aspectr   r   rV   )
filternorm	filterradresamplec                 :    j                   j                  |       S r   )imagesremove)hrN   s    r"   r#   zimshow.<locals>.<lambda>1  s    $++"4"4Q"7 r$   )cla
isinstancemcolors	Normalizer/  rcParams
set_aspectr  r  	set_alpha_set_artist_propsget_clip_pathset_clip_pathpatchset_climautoscale_Noneset_urlr  
get_extent	add_image_remove_method)rN   Xr%  normr   r   alphavminr$  r   r   r   r  r  imlimr  urlr  r  r  ims   `                    r"   r   r     sM   4 	HHJ$ 1 1222~$$^4OOFayay	
 
 
B KKNLL2	!
$ 4+
D$
JJsO MM"--/"NN27BIr$   )NNNNNNNNNNrW   g      @NNN)Ar  r+   r'  numpyr   mathr   multiprocessingr   r   copyr   iscatt.core_cr   r   iscatt.dialogsr	   iscatt.utilsr
   core.settingsr   gui_core.wrapr   r   r/  usematplotlib.figurer   !matplotlib.backends.backend_wxaggr   r_   matplotlib.linesr   matplotlib.artistr   matplotlib.patchesr   r   matplotlib.imageimagemimatplotlib.colorsr   r  ImportErrorr   r;  formatgrass.scriptscriptr   grass.pydispatch.signalr   r,   r   r   r   r   r  r  rA   rd   	AxesImager  r   r  r$   r"   <module>r     s+  " 
 
   *  4 0 . & %JNN7(P'(3!'  *E"7 EPZ9B0!&% %DG GTgA",, gAZ 
	
		

#Nw  
	?	
 &)	 s   AC6 6D;DD