
    ը	fJ                     2   d Z ddlZddlZddlZ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 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mZmZmZm Z m!Z!  G d dejD                        Z# G d dejH                        Z% G d de      Z&y)a  
@package modules.histogram

Plotting histogram based on d.histogram

Classes:
 - histogram::BufferedWindow
 - histogram::HistogramFrame
 - histogram::HistogramToolbar

(C) 2007, 2010-2011 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 Michael Barton
@author Various updates by Martin Landa <landa.martin gmail.com>
    N)	globalvar)Map)UserSettings)GUI)PrintOptions)GetLayerNameFromCmd)GetImageHandlersImageSizeDialog)DefaultFontDialog)Debug)GError)BaseToolbar	BaseIcons)PseudoDCMenuEmptyBitmapNewIdBitmapFromImagec                       e Zd ZdZej
                  ej                  dfdZdddg dfdZd Z	d Z
d	 Zd
 Zd Zd ZddZd Zd Zy)BufferedWindowa
  A Buffered window class.

    When the drawing needs to change, you app needs to call the
    UpdateHist() method. Since the drawing is stored in a bitmap, you
    can also save the drawing to file by calling the
    SaveToFile(self,file_name,file_type) method.
    Nc                    t        j                  j                  | |f||d| || _        || _        | j                  j
                  | _        d| _        d| _        d | _        d | _	        d x| _
        | _        | j                  t         j                  | j                         | j                  t         j                  | j                          | j                  t         j"                  | j$                         d | _        d | _        i | _        t-               | _        t1        t3        d| j                  j4                        t3        d| j                  j6                              | _        | j                  j;                         | j                  _        | j                  j?                          d | _         | j                  t         jB                  d        y )N)idstyleTF   c                      y N )xs    2/usr/lib/grass83/gui/wxpython/modules/histogram.py<lambda>z)BufferedWindow.__init__.<locals>.<lambda>`   s        )"wxWindow__init__parentr   mapnamerenderresizedragimgpen_oldfont_oldencodingBind	EVT_PAINTOnPaintEVT_SIZEOnSizeEVT_IDLEOnIdlemapfileimg	imagedictr   pdcr   maxwidthheight_buffer	GetRegionregion	SetRegion_finishRenderingInfoEVT_ERASE_BACKGROUND)selfr%   r   r   r   kwargss         r   r$   zBufferedWindow.__init__0   sF    			4FBeFvF{{**
 ,00)
 			",,-		"++t{{+		"++t{{+
 :"3q$((..#93q$((//;RS ((,,.$(!		"))>:r!   image)r   r   r   r   c           	         |*|dk(  r| j                   |   }n&|dk(  r|du  nt               }n|j                  |       |j                          t	        j
                  dd|d|d|       |dk(  rRt        j                  }|j                  |       |j                          | j                          |j                          y|dk(  rut        j                  }|j                  |       t        |      }|j                         \  }}	|j                  ||d   |d	   d
       |j!                  ||d   |d	   ||	f       |j                          | j                          y)z Draws histogram or clears windowNrC   clear   zBufferedWindow.Draw(): id=z
, pdctype=z, coord=r   r   T)r6   r   SetIdBeginDrawingr   msgr"   WHITE_BRUSHSetBackgroundClearRefresh
EndDrawingTRANSPARENT_BRUSHr   GetSize
DrawBitmapSetIdBounds)
rA   r7   r5   drawidpdctypecoordsbgbitmapwhs
             r   DrawzBufferedWindow.Drawb   s-   >'!,G#$IIf		w(	
 gBb!IIKLLNNNg%%Bb!$S)F>>#DAqNN66!9fQi>OOFVAYq	1a$@Ar!   c                 D   t        j                  | | j                        }t        j                  | j	                               }|j                  |       |j                          | j                         }|j                         }| j                  j                  ||       y)zDraw pseudo DC to bufferN)r"   BufferedPaintDCr;   BrushGetBackgroundColourrK   rL   GetUpdateRegionGetBoxr7   DrawToDCClipped)rA   eventdcrV   rgnrs         r   r/   zBufferedWindow.OnPaint   sw    dll3 XXd..01


 ""$JJL  Q'r!   c                 H   | j                         \  | j                  _        | j                  _        t	        | j                  j                  | j                  j                        | _        | j                         | _        | j                  r| j                  j                  | j                  j                  z   dkD  r`| j                  j                  | j                  j                  | j                  j                        | _        d| _	        | j                          d| _        y)z$Init image size to match window sizer   FTN)GetClientSizer   r9   r:   r   r;   GetImager5   Scaler'   
UpdateHistr(   rA   rb   s     r   r1   zBufferedWindow.OnSize   s     +/*<*<*>'
 #488>>488??C ==? HH$((//9A=xx~~dhhnndhhooFDHDKOO r!   c                 j    | j                   rd| _        | j                          |j                          y)zxOnly re-render a histogram image from GRASS during idle
        time instead of multiple times during resizing.
        TN)r(   r'   rj   Skiprk   s     r   r3   zBufferedWindow.OnIdle   s%     ;;DKOO

r!   c                 L   t        j                         j                          ||||f| _        | j                  j                         j                  j                  | j                         | j                  j                  ||f       | j                  j                  dd       y)zThis will save the contents of the buffer to the specified
        file. See the wx.Windows docs for wx.Bitmap::SaveFile for the
        details
        T)forcewindresN)r"   GetAppYieldr?   r   GetRenderMgr	updateMapconnect_finishSaveToFileChangeMapSizeRender)rA   FileNameFileTyper9   r:   s        r   
SaveToFilezBufferedWindow.SaveToFile   sx    
 			%-x$G!))11$2H2HIv/dD1r!   c                    | j                         }| j                  | j                  |d       | j                  \  }}}}t	        t        d|      t        d|            }t        j                  d |      }|j                          | j                  j                  |       |j                  ||       | j                  j                         j                  j                  | j                         d | _        y )Nc   rS   r   )rh   rZ   r7   r?   r   r8   r"   
BufferedDCrL   DrawToDCSaveFiler   rs   rt   
disconnectrv   )rA   r5   ry   rz   r9   r:   ibufferrc   s           r   rv   z BufferedWindow._finishSaveToFile   s    mmo		$((C	+,0,E,E)(E6c!UmSF^<]]4)

"8,))44T5K5KL$(!r!   c                    | j                   j                  rt        j                  j	                  | j                   j                        rlt        j                  j                  | j                   j                        r9t        j                  | j                   j                  t        j                        }nd}d| j                  |<   |S )zConverts files to wx.ImageNr}   )
r   r4   ospathisfilegetsizer"   ImageBITMAP_TYPE_ANYr6   rA   r5   s     r   rh   zBufferedWindow.GetImage   s}     HHtxx//0 0 01((488++R-?-?@CC s
r!   c                    t        j                  dd|d| j                         | j                  sydt        j                  v rt        j                  d   | _        | j                  j                  r'| j                  j                  t        j                  d<   dt        j                  v rt        j                  d   | _        | j                  j                  @| j                  j                  dk7  r'| j                  j                  t        j                  d<   | j                  j                  d	       | j                         \  | j                  _        | j                  _        | j                  j                  | j                  
      | _        | j                  j#                         j$                  j'                  | j(                         y)zVUpdate canvas if histogram options changes or window
        changes geometry
           zBufferedWindow.UpdateHist(z
): render=N
GRASS_FONTGRASS_ENCODING
ISO-8859-1T)update)ro   )r   rI   r'   r   environr+   r%   fontr,   encodingr   r<   rg   r9   r:   rx   r4   rs   
renderDoneru   UpdateHistDoner   s     r   rj   zBufferedWindow.UpdateHist   s7    			!3TU{{ 2::%JJ|4DM;;'+{{'7'7BJJ|$rzz) "

+; <D;;+0D0D0T+/;;+?+?BJJ'( 	$'*.*<*<*>'xxT[[9**2243F3FGr!   c                    | j                         | _        d| _        | j                  sy	 | j                  | j                     }| j                  j                          | j                  j                          | j                  | j                  | j                  |       d| _        | j                  j                          | j                  j                  j                  d| j                  j                  z         | j                  r| j                  t        j                   d<   | j"                  r| j"                  t        j                   d<   yy#  Y yxY w)z,Histogram image generated, finish rendering.FNr~   zImage/Raster map <%s>r   r   )rh   r5   r(   r6   r7   rL   	RemoveAllrZ   r   r>   r%   	statusbarSetStatusTextr&   r+   r   r   r,   )rA   r   s     r   r   zBufferedWindow.UpdateHistDone   s    ==?xx	)B
 			$((DHHR	0 	++#dkk&9&99	

 =='+}}BJJ|$+/+<+<BJJ'( '	s   E Ec                 >    | j                  | j                  d       y)zErase the map displayrE   rT   N)rZ   r7   rA   s    r   EraseMapzBufferedWindow.EraseMap  s    		$((G	,r!   r   )__name__
__module____qualname____doc__r"   ID_ANYNO_FULL_REPAINT_ON_RESIZEr$   rZ   r/   r1   r3   r{   rv   rh   rj   r   r   r   r!   r   r   r   '   sa     99**0;d !w| %N($0	2
)H6=>-r!   r   c                       e Zd ZdZej
                   ed       ej                  dd      ej                  fdZ	d Z
d Zd Zdd
Zd Zd Zd Zd Zd Zd Zd Zd Zy	)HistogramFramezUMain frame for hisgram display window. Uses d.histogram
    rendered onto canvas
    zHistogram Tool  [d.histogram]i  i^  c           	      *   t        j                  j                  | |||f||d| | j                  t        j                  t
        j                  j                  t        j                  d      t         j                               || _        t               | _        d | _        i | _        d| _        t!        j"                  ddd      }t        j$                  |d   |d	   |d
   |d         j'                         j)                         | _        d| _        t/        |       | _        t2        j4                  dk7  r| j7                  | j0                         d | _        | j                  j;                         j=                  d      }	t?        |	      dkD  r|	d   j@                  jB                  | _        | jE                  dd      | _#        d| j8                  z  g}
tI        t?        |
            D ]!  }| jF                  jK                  |
|   |       # | jM                          tO        | t         jP                  | j                        | _)        | jU                  t         jV                  | jX                         t[        | | jR                        | _.        | j                  j_                  dddggdddd      | _        | j8                  r| ja                  | j8                  d        y | jc                  d        t        jd                  | jf                  d        y )N)sizer   z	grass.ico 	histogramr   default)groupkeysettings_typedefaultSizefamilyr   weightr   r%   darwinF)checkedOnlyr   r   )numberr   zHistogramming %s)r   r   commandd.histogram)ltypenamer   activehiddenopacityr'   )4r"   Framer$   SetIconIconr   r   joinr   ICONDIRBITMAP_TYPE_ICO_gifacer   layerparamspropwinr   GetFontGetFaceNamelowerr   r   HistogramToolbartoolbarsysplatform
SetToolBarr&   GetLayerListGetSelectedLayerslenmaplayerr   CreateStatusBarr   ranger   InitDisplayr   r   
HistWindowr-   	EVT_CLOSEOnCloseWindowr   printoptAddLayerSetHistLayerOnErase	CallAfter	OnOptions)rA   r%   gifacer   titler   r   rB   font_propertieslayershist_frame_statusbar_fieldsis               r   r$   zHistogramFrame.__init__%  s    	$ETETVTGGBGGLL!2!2K@"BTBTU	
 5
  '**6
 GG.)()	 []UW 		 %'t4<<8#OODLL) **,>>5>Qv;?!!9--22DL --Qa-@'9DLL'H&I#s678 	LANN(()DQ)GK	L 	 )RYYDHH

 			",, 2 23 %T4??; XX&&#_% ' 

 <<dllD1LLLL.r!   c                     | j                         \  | _        | _        | j                  | j                  f| j                  _        y)z7Initialize histogram display, set dimensions and regionN)rg   r9   r:   r   geomr   s    r   r   zHistogramFrame.InitDisplay  s1    "&"4"4"6
DK

DKK/r!   c                     dg}| j                   dk7  r|j                  d| j                   z         t        |       }|j                  || j                  d| j
                  f       y)zChange histogram settingsr   r   map=%sr   N)	completed)r&   appendr   ParseCommand
GetOptDatar   )rA   rb   cmdmodules       r   r   zHistogramFrame.OnOptions  sV    o<<2JJx$,,./D!CDOOT4;;+OPr!   c                     |r?t        |dd      \  }}|st        |t        d      |z         y| j                  ||       || _        || _        | j                  j                          y)zaCallback method for histogram command generated by dialog
        created in menuform.py
        Traster)fullyQualified	layerTypezRaster map <%s> not found)r%   messageN)r   r   _r   r   r   r   rj   )rA   dcmdr   r   r   r   founds          r   r   zHistogramFrame.GetOptData  sh     -TXKD% gq1L/MPT/TUdD)""$r!   Nc                     || _         |sdd| j                   z  g}| j                  j                  | j                  |gd      | _        | j                  S )zSet histogram layerr   r   T)r   r   r   )r&   r   ChangeLayerr   )rA   r   r   s      r   r   zHistogramFrame.SetHistLayer  sM     8dll#:<CXX))

SERV)W
zzr!   c                    t        | t        j                  t        d            }|j                  j                  | j                  d       |j                         t        j                  k(  r|j                          y|j                  |j                  | _        |j                  |j                  | _
        |j                          | j                  j                          y)zWSet font for histogram. If not set, font will be default
        display font.
        zSelect font for histogram text)r%   r   r   TN)r   r"   r   r   fontlbSetStringSelectionr   	ShowModal	ID_CANCELDestroyr   r   rj   )rA   rb   dlgs      r   SetHistFontzHistogramFrame.SetHistFont  s      BIIQ/O-P
 	

%%dii6==?bll*KKM 88DI<<#LLDM""$r!   c                 f    | j                   j                  | j                   j                  d       y)zErase the histogram displayrE   r   N)r   rZ   r7   rk   s     r   r   zHistogramFrame.OnErase  s#    T__00'Br!   c                 8    | j                   j                          y)zRe-render histogramN)r   rj   rk   s     r   OnRenderzHistogramFrame.OnRender  s    ""$r!   c                     | j                   S )zGet buffered window)r   r   s    r   	GetWindowzHistogramFrame.GetWindow  s    r!   c                 x   t        | j                  j                        \  }}t        |       }|j	                          |j                         t        j                  k7  r|j                          y|j                         \  }}|j                          t        j                  | t        d      |t        j                  t        j                  z        }|j                         t        j                  k(  r|j                         }|s|j                          yt        j                   j#                  |      \  }}	||j%                            d   }
||j%                            d   }|	|k7  r|dz   |z   }| j                  j'                  ||
||       | j                  j)                          |j                          y)zSave to fileNz?Choose a file name to save the image (no need to add extension))r%   r   wildcardr   typeext.)r	   r   r5   r
   CentreOnParentr   r"   ID_OKr   	GetValues
FileDialogr   FD_SAVEFD_OVERWRITE_PROMPTGetPathr   r   splitextGetFilterIndexr{   rj   )rA   rb   filetyper   r   r9   r:   r   baser
  fileTypeextTypes               r   r{   zHistogramFrame.SaveToFile  sY   *4??+>+>?% d#==?bhh&KKMv mmT **r555
 ==?bhh&;;=D((.ID#S//126:HC..01%8Gg~czG+OO&&tXufE""$r!   c                 @   t        j                         }t               }t        j                  |t         j                  t        d            }|j                  |       | j                  t         j                  | j                  j                  |       t        j                  |t         j                  t        d            }|j                  |       | j                  t         j                  | j                  j                  |       t        j                  |t         j                  t        d            }|j                  |       | j                  t         j                  | j                  j                  |       | j                  |       |j                          y)zPrint options and output menuz
Page setup)r   textzPrint previewzPrint displayN)r"   GetMousePositionr   MenuItemr   r   
AppendItemr-   EVT_MENUr   OnPageSetupOnPrintPreview	OnDoPrint	PopupMenur   )rA   rb   point	printmenusetuppreviewdoprints          r   	PrintMenuzHistogramFrame.PrintMenu  s   ##%F	I"))!L/JU#		"++t}}88%@++iBIIAo<NOW%		"++t}};;WE++iBIIAo<NOW%		"++t}}66@ 	y!r!   c                 &    | j                  d       y )NT)Closerk   s     r   OnQuitzHistogramFrame.OnQuit  s    

4r!   c                     	 | j                   j                  d       | j                  j                          | j	                          y#  Y /xY w)zEWindow closed
        Also remove associated rendered images
        TN)r   r*  r   Cleanr   rk   s     r   r   zHistogramFrame.OnCloseWindow
  s<    	LLt$ 		s   A Ar   )r   r   r   r   r"   r   r   SizeDEFAULT_FRAME_STYLEr$   r   r   r   r   r  r   r  r  r{   r(  r+  r   r   r!   r   r   r      sx     99/0RWWS#$$X/t0
Q%"%.C%&P,	r!   r   c                       e Zd ZdZd Zd Zy)r   z$Histogram toolbar (see histogram.py)c                     t        j                  | |       t        j                  dk(  r|j	                  |        | j                  | j                                | j                          y )Nr   )r   r$   r   r   r   InitToolbar_toolbarDataRealize)rA   r%   s     r   r$   zHistogramToolbar.__init__  sP    T6* <<8#d#**,- 	r!   c                    | j                  dt        d   j                  ft        d   | j                  j                  fdt        d   j                  ft        d   | j                  j
                  fdt        d   j                  ft        d   | j                  j                  fdt        d   j                  ft        d   | j                  j                  fddt        d   j                  ft        d   | j                  j                  fd	t        d
   j                  ft        d
   | j                  j                  fddt        d   j                  ft        d   | j                  j                  ff	      S )zToolbar datar   r'   displayeraser   r   savesaveFilehprintprintquit)_getToolbarDatar   labelr%   r   r  r   r  r{   r(  r+  r   s    r   r3  zHistogramToolbar._toolbarData%  sj   ## !)K"8">">?k*KK)) y399:i(KK(( i0667g&KK'' Yv.445f%KK++
 Yz2889j)KK** y1778g&KK))
 Yv.445f%KK&&C&(
 (	
r!   N)r   r   r   r   r$   r3  r   r!   r   r   r     s    .
*
r!   r   )'r   r   r   r"   corer   core.renderr   core.settingsr   gui_core.formsr   mapdisp.gprintr   
core.utilsr   gui_core.dialogsr	   r
   gui_core.preferencesr   
core.debugr   	core.gcmdr   gui_core.toolbarsr   r   gui_core.wrapr   r   r   r   r   r#   r   r   r   r   r   r!   r   <module>rK     sn   & 
 
 	   &  ' * > 2   4 M Mv-RYY v-rsRXX sl9
{ 9
r!   