a
    ò+caI  ã                   @   sh  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Zd dlmZ d dl	m
  mZ d dlZd dlmZmZ d dlmZ d dlmZ d dlZd dlmZ d dlZG dd„ dƒZG dd	„ d	ejƒZG d
d„ dejƒZG dd„ dejƒZG dd„ dejƒZd+dd„Zd,dd„ZG dd„ dƒZdd„ Z dd„ Z!dd„ Z"dd„ Z#d d!„ Z$d"d#„ Z%d$d%„ Z&d&d'„ Z'd-d)d*„Z(dS ).é    N)Ú	timedelta)ÚGMessageÚGError)Úcore)Údatetimec                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚStaticContextc                 C   s8   t  ¡ }tj |d |d |d ¡}tj |d¡| _d S )NZGISDBASEZLOCATION_NAMEZMAPSETZmwprecip_data)ÚgrassZgisenvÚosÚpathÚjoinÚtmp_mapset_path)ÚselfZ
gisenvDictZpathToMapset© r   úZC:/Users/landamar/grass_packager/grass786/addons/wx.mwprecip/etc/g.gui.mwprecip/mw_util.pyÚ__init__   s
    ÿzStaticContext.__init__c                 C   s   | j S ©N)r   ©r   r   r   r   Ú
getTmpPath   s    zStaticContext.getTmpPathN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )ÚSaveLoadc                 C   sj   t jj| |t jd t j| dd}t j| dd}t  t j¡}|j|t jd |j|t jd |  	|¡ d S )N©ÚparentÚidZSave)r   ÚlabelZLoad©Úflag)
ÚwxÚPanelr   ÚID_ANYÚButtonÚBoxSizerÚ
HORIZONTALÚAddÚEXPANDÚSetSizer)r   r   ÚsaveBttZloadBttÚsizerr   r   r   r   "   s    zSaveLoad.__init__N)r   r   r   r   r   r   r   r   r   !   s   r   c                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )Ú	BaseInputr   c                 C   sv   t jj| |t jd t j| t j|d}t j| t j|d| _t  t j¡}|j	|t j
d |j	| jt j
d |  |¡ d S )Nr   ©r   r   )r   Ústyler   )r   r   r   r    Ú
StaticTextÚTextCtrlÚtextr"   ÚVERTICALr$   r%   r&   )r   r   r   r+   ÚstatTextr(   r   r   r   r   /   s    zBaseInput.__init__c                 C   s   | j S r   )Úkeyr   r   r   r   ÚGetKey<   s    zBaseInput.GetKeyc                 C   s   | j  ¡ }|dkrd S |S d S ©NÚ )r.   ÚGetValue©r   Úvaluer   r   r   r5   ?   s    
zBaseInput.GetValuec                 C   s   | j  t|ƒ¡ d S r   )r.   ÚSetValueÚstrr6   r   r   r   r8   F   s    zBaseInput.SetValueN)r   )r   r   r   r   r2   r5   r8   r   r   r   r   r)   -   s   
r)   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )Ú	TextInputc                 C   s^  t jj| |t jd tƒ | _d | _t j| t j|d}t j| t jdd}t j| t jd| _	t j
| t jdd| _t j| t jdt jt jB d| _t j
| dd	| _t  t j¡}t  t j¡}|j| j	t jd
d |j| jt jd |j|t jd |j|t jd |j|t jd |j| jt jd | | j¡ |  |¡ | j t j| j¡ | j t j| j¡ d| _d S )Nr   r*   zor enter values interactively©r   ÚBrowse)r   éF   )r   Úsizer+   zSave to new file)r   é   ©r   Z
proportionr   F)r   r   r   r    r   ÚcontextÚtmpPathr,   r-   Ú	pathInputr!   Ú	browseBttZTE_MULTILINEZHSCROLLÚ	directInpr'   r"   r/   r#   r$   r%   r&   ÚBindÚ
EVT_BUTTONÚonBrowseÚ
setTmpPathÚfirstDirInp)r   r   r   r0   Z	statText2r(   Úsizer2r   r   r   r     s4    ÿÿ
zTextInput.__init__c                 C   sn   | j du rFd| _ | jd u rFtj | j ¡ dtdƒ ¡| _| j 	| j¡ t
| jdƒ}| | j ¡ ¡ | ¡  d S )NFTztmp%sé   Úw)rJ   rB   r	   r
   r   rA   r   Ú
randomWordrC   r8   ÚopenÚ
writelinesrE   r5   Úclose)r   ÚeventÚior   r   r   rI   .  s    

ÿzTextInput.setTmpPathc                 C   s`   t j| dt jt jB d}| ¡ t jkr*d S | ¡ }d| _| j 	|¡ |  	¡ dkr\| j 	d¡ d S )NzOpen text file©r+   Féÿÿÿÿr4   )
r   Ú
FileDialogÚFD_OPENÚFD_FILE_MUST_EXISTÚ	ShowModalÚ	ID_CANCELÚGetPathÚfirstDirInpActiverC   r8   ©r   rR   ZopenFileDialogr
   r   r   r   rH   ;  s    ÿzTextInput.onBrowsec                 C   s
   | j  ¡ S r   )rE   r5   r   r   r   r   r5   H  s    zTextInput.GetValuec              
   C   sÆ   t j | j ¡ ¡sdS t| j ¡ dƒ}| ¡ }z| j |¡ W dS  t	yz } z"t
d |j|j¡ƒ W Y d }~dS d }~0  ty”   t
dƒ Y dS    t
d t ¡ d ¡ƒ ‚ Y dS 0 | ¡  d S )NrU   Úrr?   úI/O error({}): {}zCould not decode textzUnexpected error: {}r   )r	   r
   ÚisfilerC   r5   rO   ÚreadrE   r8   ÚIOErrorÚprintÚformatÚerrnoÚstrerrorÚ
ValueErrorÚsysÚexc_inforQ   )r   rS   r9   Úer   r   r   r8   K  s$    zTextInput.SetValuec                 C   s   | j  ¡ }|dkrd S |S d S r3   )rC   r5   ©r   r
   r   r   r   r[   `  s    
zTextInput.GetPathc                 C   s:   |d u rd S d| _ | j |¡ |  ¡ dkr6| j d¡ d S )NTrU   r4   )r\   rC   r8   r6   r   r   r   ÚSetPathg  s    zTextInput.SetPathN)
r   r   r   r   rI   rH   r5   r8   r[   rl   r   r   r   r   r:     s   !r:   c                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ ZdS )Ú	FileInputFNc                 C   sÖ   t jj| |t jd || _|| _t j| t j|d}t j| t jd| _t j	| t jdd| _
t  t j¡}t  t j¡}|j| jt jdd |j| j
t jd |j|t jd |j|t jd |  |¡ | j
 t j| j¡ d S )Nr   r*   r;   r<   r?   r@   r   )r   r   r   r    ÚdirrB   r,   r-   rC   r!   rD   r"   r/   r#   r$   r%   r&   rF   rG   rH   )r   r   r   rn   rB   r0   r(   rK   r   r   r   r   r  s    
zFileInput.__init__c                 C   sŽ   | j rLtj| dtjtjB tjB d}| ¡ tjkr6d S | ¡ }| j	 
|¡ n>tj| dtjtjB d}| ¡ tjkrvd S | ¡ }| j	 
|¡ d S )NzChoose a directory:rT   zChoose a file:)rn   r   Z	DirDialogZDD_DEFAULT_STYLEZDD_DIR_MUST_EXISTZDD_CHANGE_DIRrY   rZ   r[   rC   r8   rV   rW   rX   r]   r   r   r   rH   †  s"    ýÿzFileInput.onBrowsec                 C   s"   | j  ¡ }t|ƒdkr|S d S d S )Nr   )rC   r5   Úlenrk   r   r   r   r[   š  s    
zFileInput.GetPathc                 C   s   | j  |¡ d S r   )rC   r8   r6   r   r   r   rl   ¡  s    zFileInput.SetPath)FN)r   r   r   r   rH   r[   rl   r   r   r   r   rm   q  s   
rm   ú
Yes or no?c                 C   s2   t  | ||t jt jB ¡}| ¡ t jk}| ¡  |S r   )r   ZMessageDialogZYES_NOZICON_QUESTIONrY   ZID_YESZDestroy)r   ZquestionZcaptionZdlgÚresultr   r   r   ÚYesNo¥  s    rr   Fc                 C   sb   zt  | ¡}W n   Y dS 0 g }|D ]6}| d¡dkr&|rR| t j | |¡¡ q&| |¡ q&|S )Nr   ú~rU   )r	   ÚlistdirÚfindÚappendr
   r   )ZfpathZfullZlisÚtmpr
   r   r   r   ÚgetFilesInFoldr¬  s    rx   c                   @   s    e Zd Zd	dd„Zd
dd„ZdS )ÚMeasureTimeé   c                 C   s.   d | _ || _d | _d | _t d¡| _d| _d S )Nzmwprecip.MeasureTimer   )Ú	startLastÚtotal_count_stepÚendÚstartÚloggingZ	getLoggerÚloggerÚset_counter)r   r|   r   r   r   r   ¿  s    zMeasureTime.__init__Fr?   c                 C   sö   |  j d7  _ | jd u rPt ¡ | _| j| _| j dtt ¡ ƒ ¡ | j |¡ n¢t ¡ | _	| j	| j }| j	| j }| j	| _t
 | j | jd¡ | j d||f ¡ | j d||f ¡ |ròt
 | j| jd¡ | j d| ¡ | j dtt ¡ ƒ ¡ d S )Nr?   zMeasuring time - START: %s zTOTAL TIME < %s > : %szLAST PART TIME< %s > : %szTOTAL TIME e: %szMeasuring time - END: %s )r   r~   Útimer{   r€   Úinfor9   r   Znowr}   r   Úpercentr|   )r   Úmsgr}   ÚstepZelapsedTotalZelapsedLastr   r   r   ÚtimeMsgÇ  s"    


zMeasureTime.timeMsgN)rz   )Fr?   )r   r   r   r   r‡   r   r   r   r   ry   ¾  s   
ry   c                 C   s$   d|||f }|   |dd¡d d S )Nz›SELECT EXISTS( SELECT * FROM information_schema.columns WHERE           table_schema = '%s' AND           table_name = '%s' AND          column_name='%s');Tr   ©Z
executeSql)Ú
connectionÚschemaÚtableÚcolumnsÚsqlr   r   r   ÚisAttributExistÞ  s
    üÿrŽ   c                 C   s"   d||f }|   |dd¡d d S )Nz†SELECT EXISTS( SELECT *           FROM information_schema.tables           WHERE table_schema = '%s' AND           table_name = '%s');Tr   rˆ   )r‰   rŠ   r‹   r   r   r   r   ÚisTableExisté  s
    üÿr   c                 C   sJ   t | dƒ ¡ }|d|… }||t|ƒ… |t|ƒd…< t |dƒ |¡ dS )zAremove lines between two lines by line number and create new filer^   r   Nzw+)rO   Ú	readlinesro   rP   )Zold_fileZnew_filer~   r}   Z	data_listZ	temp_listr   r   r   ÚremoveLinesô  s    r‘   c              	   C   s:   t  | ddddt jt jB ¡}| ¡ t jkr.d S | ¡ }|S )Nz	Save filer4   zfiles (*.*)|*.*)r   rV   ZFD_SAVEZFD_OVERWRITE_PROMPTrY   rZ   r[   )r   ZsaveFileDialogZoutput_streamr   r   r   ÚOnSaveAsü  s    
ú	r’   c                 C   sR   t | dƒ}t |¡}| ¡ D ](\}}|d u s|dkr6q| ||g¡ q| ¡  d S )NÚwbr4   )rO   ÚcsvÚwriterÚitemsZwriterowrQ   )ÚfnÚdict_rapÚfrM   r1   Úvalr   r   r   ÚsaveDict  s    

r›   c              
   C   s¤   t | dƒ}i }zXt |¡D ]>\}}zt|ƒ||< W q   d| d }t|ƒ||< Y q0 q| ¡  |W S  tyž } z td |j|j	¡ƒ W Y d }~n
d }~0 0 d S )Nr^   ú"r_   )
rO   r”   ÚreaderÚevalrQ   rb   rc   rd   re   rf   )r—   r™   r˜   r1   rš   rj   r   r   r   ÚreadDict  s    
rŸ   c                 C   s   d  dd„ t| ƒD ƒ¡S )Nr4   c                 s   s   | ]}t  tj¡V  qd S r   )ÚrandomZchoiceÚstringZascii_lowercase)Ú.0Úir   r   r   Ú	<genexpr>*  ó    zrandomWord.<locals>.<genexpr>)r   Úrange)Zlengthr   r   r   rN   )  s    rN   c                 C   s   t  d¡}t| | ¡ƒS )Nz(^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}$)ÚreÚcompileÚboolÚsearch)r‚   ZREr   r   r   ÚisTimeValid-  s    
r«   é<   c                 C   s8   | | j  j}||d  | | }| td|| | j ƒ S )zøRound a datetime object to any time laps in seconds
    dt : datetime.datetime object, default now.
    roundTo : Closest number of seconds to round to, default 1 minute.
    Author: Thierry Husson 2012 - Use it as you want but don't blame me.
    é   r   )ÚminÚsecondsr   Zmicrosecond)ZdtZroundTor¯   Zroundingr   r   r   Ú	roundTime2  s    r°   )rp   )F)r¬   ))r§   r	   rh   r    r¡   r   r”   r   r   Zwx.lib.filebrowsebuttonÚlibZfilebrowsebuttonZ
filebrowseÚcodecsZ	core.gcmdr   r   Zgrass.scriptr   r   Zscriptr‚   r   r   r   r   r)   r:   rm   rr   rx   ry   rŽ   r   r‘   r’   r›   rŸ   rN   r«   r°   r   r   r   r   Ú<module>   sB    `e4

 
