
    ը	fH                         d Z ddlZddlZddlZddlZddlZddlZddlmc m	Z	 ddl
mZ ddlmZ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mZmZmZ  G d d	e      Z G d
 de      Zy)aZ  
@package wxplot.profile

@brief Profiling using PyPlot

Classes:
 - profile::ProfileFrame
 - profile::ProfileToolbar

(C) 2011-2014 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, Arizona State University
    N)BasePlotFrame	PlotIcons)BaseToolbar	BaseIcons)StockCursor)ProfileRasterDialogPlotStatsFrame)
RunCommandGWarningGErrorGMessagec                       e Zd ZdZ ej
                  dd      d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y)ProfileFramezNMainframe for displaying profile of one or more raster maps. Uses wx.lib.plot.i  i  Nc                    t        j                  | f|||d| || _        | j                  j                  j	                  | j
                         g | _        t        |       | _        t        j                  dk7  r| j                  | j                         | j                  t        d             d|vr|nd| _        |g | _        n|| _        d| _        d| _        g | _        d| _        d	| _        t        d
      | _        g d| _        | j/                          t1        | j                        dkD  r,| j3                  | j                  | j                         | _        ni | _        | j                  -| j                  dk7  rt        d      | j                  z  | _        nt        d      | _        t        d      | _        | j;                  t<        j>                  | j@                         | jC                          y )N)parentgifacesizer   darwinzGRASS Profile Analysis Tooldegreemetersprofile g        
Profile of)blueredgreenyellowmagentacyanaquablackgreyorangebrownpurplevioletindigor   zDistance (%s)zDistance along transectzCell values)"r   __init__
controllertransectChangedconnectSetTransecttransectProfileToolbartoolbarsysplatform
SetToolBarSetTitle__units
rasterListplottypecoordstrseglistppointstransect_lengthptitle	colorList	_initOptslenInitRasterOptsrasterxlabelylabelBindwx	EVT_CLOSEOnCloseWindowSetGraphStyle)selfr   r   r*   unitsr   r7   kwargss           //usr/lib/grass83/gui/wxpython/wxplot/profile.pyr)   zProfileFrame.__init__&   s    	tWF6WPVW$''//0@0@A%T2<<8#OODLL)a567'u4e(
  DO(DO!"o
" 	  1$--doot}}MDKDK
 ;;"t{{b'8O,t{{:DK56DK& 			",, 2 23    c                 &    | j                  d       y)zInitialize plot optionsr   N)InitPlotOptsrJ   s    rM   r?   zProfileFrame._initOptsr   s    )$rN   c                 \    || _         |r| j                  d        y | j                  d        y N)r.   OnCreateProfileOnErase)rJ   coordss     rM   r-   zProfileFrame.SetTransectv   s&      &LLrN   c                    | j                   j                         r| j                   j                          | j                   j                          | j                  j                          | j                  j                          y)z(Draws transect to profile in map displayN)r*   IsActiveStopStartr   SetFocusRaiserJ   events     rM   OnDrawTransectzProfileFrame.OnDrawTransect}   sR    ??##%OO  "rN   c                    t        |       }|j                          |j                         t        j                  k(  r~|j
                  | _        | j                  | j
                  | j                        | _        t        | j                        dkD  r*t        | j
                        dkD  r| j                  d       |j                          y)zSelect raster map(s) to profiler   r   N)r^   )r   CenterOnParent	ShowModalrF   ID_OKr7   rA   r8   rB   r@   r.   rT   Destroy)rJ   r^   dlgs      rM   OnSelectRasterzProfileFrame.OnSelectRaster   s    !.==?bhh&!nnDO--doot}}MDK 4==!A%#doo*>*B$$4$0rN   c                    d}d}d| _         dx}}t        j                         }d}t        | j                        dkD  r| j                  D ]p  }|d   |d   cxk  r|d   k  rn n|d   |d   cxk  r|d	   k  sn d
}| j                   dk(  rd|d   |d   fz  | _         Td| j                   |d   |d   fz  | _         r |st        t        d      |        t        | j                        dk(  ryt        d      | _        t        | j                        dkD  rg | _	        | j                  D ]  }t        d| d| j                  d   d|d   |d   fz        }|j                         d   j                  d      d   }	|	|	dk(  rXt        |	      }	|rN|rLt        j                  t        j                   ||d   z
  d      t        j                   ||d   z
  d      z         }||z  }|| _        | j                  j%                  ||	f       |d   }|d   } 	 | j                  j'                  d       d| _        d}
t+        j,                  | j.                        D ]  }g | j.                  |   d<   | j1                  || j                         }t        |      dkD  s@|| j.                  |   d<   | j.                  |   d   dk7  r*| xj(                  d| j.                  |   d   |
fz  z  c_        |
dz  }
| xj                  d|j                  d      d   z  z  c_         | j                  j3                  d      | _        | j(                  dk(  rt        d      | _        y| j(                  j3                  d      | _        y#  Y PxY w)zjCreate coordinate string for profiling. Create segment
        list for transect segment markers.
        r   r   NTwes   nFz%f,%fz%s,%f,%fz:Not all points of profile lie inside computational region.)messager   r   zr.what)r   readmapcoordinates|   *   datalistrK   z%s (%d),z %s ,@,zRaster values)r9   grassregionr@   r.   r   r5   r7   r=   r:   r
   
splitlinessplitfloatmathsqrtpowr<   appendpoprD   sixiterkeysrB   CreateDatalistrstrip)rJ   distcumdistlasteast	lastnorthry   insideRegionpointretvalirru   s                rM   SetupProfilezProfileFrame.SetupProfile   sm   
 ##9t}}! 
U3K58:vc{:suQx>6#;>#(L==B&$+uQxq.B$BDM$.$--q5QR81T$TDM
U VW
 t1$ o t}}!DL % * '58U1X*> > nn&q)//4Q7;#*Cj 	99(U1X"5:((Ia$81=>D 4 (/$ ##WcN3 8!!H	=%B  # dkk* 	9A)+DKKN:&**1dmm<H8}q -5Az* ;;q>'*b0KK:Q1H!0L#LLKQ wa88	9 kk((-;;"O,DK++,,S1DK9s   M9 9M>c           
         g }t        j                         }t        t        |d         t        |d               }d}| j                  |z  dkD  r| j                  dz  }n|}t        d| |||ddd      }|sg S |j                         D ]f  }	|	j                         j                  d	      \  }
}|
|
d
k(  s|
dk(  s|
|d
k(  s|dk(  r>t        |
      }
t        |      }|j                  |
|f       h |S )ztBuild a list of distance, value pairs for points along transect

        Uses r.profile to obtain the data.
        nsresewresr   i  z	r.profilenanT)r   inputrp   
resolutionnullquietrn    r   )
rx   ry   minr|   r<   r
   rz   stripr{   r   )rJ   rB   rV   ru   ry   curr_restransect_rectransect_resr   liner   elevs               rM   r   zProfileFrame.CreateDatalist   s   
  uVG_-uVG_/EF(*S0//#5L#L#	
 INN$ 	*D++C0JD$2:5=<2:5=;D;DOOT4L)	* rN   c                    t        | j                        dk(  st        | j                        dk(  r|t        j                  | t        d      t        d      t        j                  t        j                  z  t        j                  z        }|j                          |j                          y| j                  t        t        j                               | j                          | j                         }| j!                  |       y)aL  Main routine for creating a profile. Uses r.profile to
        create a list of distance,cell value pairs. This is passed to
        plot to create a line graph of the profile. If the profile
        transect is in multiple segments, these are drawn as
        points. Profile transect is drawn, using methods in mapdisp.py
        r   z>You must draw a transect to profile in the map display window.zNothing to profile)r   rm   captionstyleN)r@   r.   r7   rF   MessageDialogr5   OKICON_INFORMATIONCENTRErb   rd   	SetCursorr   CURSOR_ARROWr   CreatePlotListDrawPlot)rJ   r^   re   ps       rM   rT   zProfileFrame.OnCreateProfile-  s     t}}"c$//&:a&?""T ./eeb111BII=C MMOKKM{2??34!arN   c           
      n   g | _         t        | j                        dkD  rt        j                  | j                  d| j
                  d   d   z   t        j                  | j
                  d   d   d   | j
                  d   d   d   | j
                  d   d   d   d      | j
                  d   d	   | j                  | j
                  d   d
      | j
                  d   d         | _	        | j                   j                  | j                         | j                  D ]  }t        j                  | j                  |   d   d   | j                  |   d   d   | j                  |   d   d   d      }t        j                  | j                  |   d   || j                  |   d   | j                  | j                  |   d      | j                  |   d         | j                  |   d<   | j                   j                  | j                  |   d           t        | j                         dkD  r| j                   S y)zjCreate a plot data list from transect datalist and
        transect segment endpoint coordinates.
        r   r   markerlegendcolorrk   rt      r   filltype)r   colourr   	fillstyler   pcolorru   pwidthpstyleplegend)r   widthr   r   plineN)plotlistr@   r:   plot
PolyMarker
propertiesrF   Colour
ptfilldictr;   r   r7   rB   PolyLinelinestyledict)rJ   r   cols      rM   r   zProfileFrame.CreatePlotListH  s   
  t||q ??T__X6x@@yyOOH-g6q9OOH-g6q9OOH-g6q9	 __X.v6//$//(*CF*KLx08DL MM  .  	:A))Ax(+Ax(+Ax(+	C '+mmAz*kk!nX.((Q)AB{{1~i0'DKKN7# MM  Q!89	:" t}}!== rN   c                 f    | j                          | j                         }| j                  |       y)z%Update profile after changing optionsN)rI   r   r   )rJ   r   s     rM   UpdatezProfileFrame.Updatex  s(    !arN   c           
         t        j                  | t        d      t        j                         t        d      t         j
                        }g }|j                         t         j                  k(  r|j                         }| j                  D ]`  }|j                  |dz   t        |j                  dd            z   dz          t        j                  j                  |d         rt        j                  | t        d      |d   z  t        d	      t         j                   t         j"                  z  t         j$                  z  
      }|j                         t         j&                  k7  r!|j)                          |j+                          	 t-        |d   d      }| j2                  |   d   D ]0  }	|j5                  dt7        |	d         t7        |	d         fz         2 |j9                          c |j+                          |r)t        d      t;        |      dj=                  |      fz  }
nt        d      }
t?        | |
       y# t.        $ r9}t1        | t        d      |d   |fz         |j+                          Y d}~ yd}~ww xY w)z!Save r.profile data to a csv filez9Choose prefix for file(s) where to save profile values...z#Comma separated value (*.csv)|*.csv)r   rm   
defaultDirwildcardr   r5   rv   z.csvz=File <%s> already exists. Do you want to overwrite this file?zOverwrite file?)rm   r   r   rh   z0Unable to open file <%s> for writing.
Reason: %s)r   rm   Nru   z
%.6f,%.6f
r   rk   z%d files created:
%s
zNo files generated.) rF   
FileDialogr5   osgetcwdFD_SAVErb   rc   GetPathr7   r   strreplacepathexistsr   YES_NOYES_DEFAULTICON_QUESTIONID_YESr   rd   openIOErrorr   rB   writer|   closer@   joinr   )rJ   r^   re   pfiler   r   dlgOvfdri   datapairrm   s              rM   SaveProfileToFilezProfileFrame.SaveProfileToFile~  s!   mmQRyy{<=**
 ==?bhh&;;=D__ "TCZ#aiiS.A*BBVKL77>>%),,, !B!  )	!$
 !""3 4 ii"..82;K;KK	E (BII5		 eBi-B !%Az : WHHH]eHQK.@%QRBT-UUVW 
E"H 	/0CJ		%@P3QQG-.Gg.-  	# !R! !9a.!) KKM	s   
I	J.JJc                 F   g }t        d      }t        j                  | j                        D ]  }	 |j	                  d      d   }d|z  }d | j                  |   d   D        }t        j                  |t
        j                        }|d|j                  z  z  }|dt        j                  |      z  z  }|d	t        j                  |      z  z  }|d
t        j                  |      z  z  }|dt        j                  |      z  z  }|dt        j                  |      z  z  }|dt        j                  |      z  z  }t        j                  |      t        j                  |      z  }	|d|	z  z  }|dt        j                  |      z  z  }|dt        j                   |      z  z  }|d| j"                  z  z  }|j%                  |        t'        | t(        j*                  ||      }
|
j-                         t(        j.                  k(  r|
j1                          yy#  Y xY w)z-Displays regression information in messageboxzStatistics for Profile(s)rv   r   zProfile of %s

c              3   &   K   | ]	  }|d      yw)rk   N ).0r   s     rM   	<genexpr>z'ProfileFrame.OnStats.<locals>.<genexpr>  s     EQAaDEs   ru   zn: %f
zminimum: %f
zmaximum: %f
z
range: %f
z	mean: %f
zstandard deviation: %f
zvariance: %f
zcoefficient of variation: %f
zsum: %f
zmedian: %f
zdistance along transect: %f

)idrm   titleN)r5   r   r   rB   r{   numpyfromiterr|   r   aminamaxptpmeanstdvarsummedianr<   r   r	   rF   ID_ANYShowID_CLOSErd   )rJ   r^   rm   r   r   raststatstriterableacvstatss              rM   OnStatszProfileFrame.OnStats  s   -.dkk* 	Awws|A-4E$++a.*DENN8U[[99qvv--?UZZ]::?UZZ]::=599Q<77<%**Q-775		!DD+eiil::YYq\EJJqM1;b@@;155>ELLO;;<t?S?SSSw')	0 t		7%P::<2;;&MMO 's   FHH c                     | j                   j                         r| j                   j                          | j                          y rS   )r*   rX   rY   rd   r]   s     rM   rH   zProfileFrame.OnCloseWindow  s+    ??##%OO  "rN   )__name__
__module____qualname____doc__rF   Sizer)   r?   r-   r_   rf   r   r   rT   r   r   r   r   rH   r   rN   rM   r   r   #   sc    X RWWS#JX%g2R.`6.`6/p DrN   r   c                       e Zd ZdZd Zd Zy)r/   z Toolbar for profiling raster mapc                     t        j                  | |       t        j                  dk(  r|j	                  |        | j                  | j                                | j                          y )Nr   )r   r)   r1   r2   r3   InitToolbar_toolbarDataRealize)rJ   r   s     rM   r)   zProfileToolbar.__init__  sP    T6* <<8#d#**,- 	rN   c                 >   | j                  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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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f      S )zToolbar data	addrasteraddRastr.   rS   drawerasedragpanzoomzoomInunzoomzoomBack
statisticsdatasavesaveimagesaveFileprintsettingsoptionsquit)_getToolbarDatar   labelr   rf   r   r_   rT   rU   OnDragOnZoomOnRedrawr   r   
SaveToFile	PrintMenuPlotOptionsMenuOnQuitrQ   s    rM   r  zProfileToolbar._toolbarData  s   ## !)I"6"<"<=i(KK..  :!6!<!<=j)KK..
 Yv.445f%KK// i0667g&KK'' Yu-334e$KK&& Yx0667h'KK&& y4::;j)KK((
 !9\#:#@#@Al+KK''  6!2!8!89f%KK11 i
399:j)KK** i0667g&KK))
 9!5!;!;<i(KK// Yv.445f%KK&&AEG
 G	
rN   N)r   r   r  r  r)   r  r   rN   rM   r/   r/     s    *
I
rN   r/   )r  r   r1   r   r}   r   rF   wx.lib.plotlibr   grass.scriptscriptrx   wxplot.baser   r   gui_core.toolbarsr   r   gui_core.wrapr   wxplot.dialogsr   r	   	core.gcmdr
   r   r   r   r   r/   r   rN   rM   <module>r/     sV   " 
 
 
   	    0 4 % > < <x= xvX
[ X
rN   