
    ը	fV                        d Z ddlm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Z ddlmZmZ ddlmZ ddlmZ  e        dd	lm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mZmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddddZ(dZ) e*ejV                        Z,dZ- G d de      Z. G d de/      Z0 G d de/      Z1 G d de      Z2 G d de2      Z3 G d de#e!      Z4 G d  d!ejj                        Z6e7d"k(  ra e8ejr                        d#k7  r e:e         ejv                  d       ejr                  d$   Z)ejr                  d%   Z<ejz                  j}                  e<d&      ejz                  j}                  e<d'      ejz                  j}                  e<d(      d)Z( e?ejr                  d*          e?ejr                  d+         fZ, e@ e?ejr                  d,                Z- ej                   eBd-      e)z         ejz                  j}                  e<d.      ZC eDeCd/      ZEeEs ej                   eBd0      eCz         eEj                  d1 ej                         z         eEj                           ed2d3e)j                          ej                         fz  4        ej                         ZK e6d      ZLeLj                  e)e-      ZNeNj                           e%j                  d$d5 ej                         eKz
  z         eLj                           ej                   eBd6      e)z         	  ej                  e<        ed2d78        ejv                  d       yy# eS$ r Y %w xY w)9a  
@package mapdisp.main

@brief Start Map Display as standalone application

Classes:
 - mapdisp::DMonMap
 - mapdisp::Layer
 - mapdisp::LayerList
 - mapdisp::StandaloneMapDisplayGrassInterface
 - mapdisp::DMonGrassInterface
 - mapdisp::DMonDisplay
 - mapdisp::MapApp

Usage:
python mapdisp/main.py monitor-identifier /path/to/map/file /path/to/command/file /path/to/env/file

(C) 2006-2015 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 Jachym Cepicky
@author Martin Landa <landa.martin gmail.com>
@author Vaclav Petras <wenzeslaus gmail.com> (MapPanelBase)
@author Anna Kratochvilova <kratochanna gmail.com> (MapPanelBase)
    )print_functionN)
try_remove)core)cmdtuple_to_listcmdlist_to_tuple)Signal)set_gui_path)	globalvar)utils)StandaloneGrassInterface)
RunCommand)MapMapLayerRenderMapMgr)MapPanel)
FrameMixin)Debug)UserSettings)cmdmapenvFc                   &    e Zd ZddZd Zd Zd Zy)DMonMapNc                    t        j                  |        || _        t               | _        || _        g | _        g | _        |r1|| _        t        j                  j                  |      d   dz   | _        t        d   | _        t        j                  j                  | j                        d   dk7  r| xj                  dz  c_        t        d      | _        t        d      | _        t        d      | _        t'        |       | _        t+        t        d	   d
      5 }|j-                         }|D ]H  }d|v s|j/                  dd      d   j1                         }| j(                  j3                  d|i        n ddd       y# 1 sw Y   yxY w)zMap composition (stack of map layers and overlays)

        :param cmdline: full path to the cmd file (defined by d.mon)
        :param mapfile: full path to the map file (defined by d.mon)
        r   z.pgmr      z.ppmzDMonMap.saveToFilezDMonMap.dToRastzDMonMap.queryr   rGRASS_LEGEND_FILE=N)r   __init___gifacedictr   cmdfileownedLayersoldOverlays
mapfileCmdospathsplitextmaskfileCmdmonFilemapfiler   
saveToFiledToRastqueryr   	renderMgropen	readlinessplitstripUpdateRenderEnv)selfgifacer"   r+   flineslinelegfiles           -/usr/lib/grass83/gui/wxpython/mapdisp/main.pyr   zDMonMap.__init__I   sY    	T 6
 %DO!ww//8;fDD u~77DLL)!,6LLF"L !!56/0 O,
%d+ '%.#& 	!KKME &$."jja0399;GNN224G3QR		 	 	s   F 4AF  F	c                    | j                   syd}	 t        | j                   d      }|j                         }|j                          t	        |      dkD  r|d   j                  d      s|d   j                  d      r|d   j                         }t        | j                   d      }|j                  |dd        |j                          |d   j                  d      r0| j                  j                  t        j                  |             y| j                  j                  t        j                  |             y|d   j                  d	      r|d   j                         }t        | j                   d      }|j                  |dd        |j                          d
t        j                  |      d   v r:t        j                  |      d   j                  d
      d   j                  d      }n't        j                  |      d   j                  d      }| j                  j                  t        j                  |      d   j                  d      d   |       yg | _        t        | j                   j#                         j$                  j'                               }|D ]+  }| j                   j#                         j)                  |       - | j+                         }	dgt	        |	      z  }
d}d}t-               }|D ]Q  }|j                  d      rTd|v r#|j                  d
d      d   j                         }	 |dd j                         j                  d
d      \  }}|<   it        j                  |j                               }d}	 t        j.                  |d      }t        j8                  |d|      d   }i }|dv r|| j                  v r|dk(  r+| j                   j#                         j;                  |       n|dk(  r+| j                   j#                         j=                  |       n|dk(  r+| j                   j#                         j?                  |       n_|dk(  r+| j                   j#                         jA                  |       n/|dk(  r*| j                   j#                         jC                  |       | j                  jE                  |       tF        }||d<   d}tI        |	      D ]~  \  }}|jK                  d      t        jL                  tO        |            k(  s8d}|
|   dk(  r||
|<   |dz  }n1tI        |
      D ]  \  }}||
|   kD  s|
|xx   dz  cc<    |dz
  |
|<    n |r |d#||ddd|d|}|jQ                         jR                  jU                  | jQ                         jV                         |r)|jQ                         jY                  |       t-               }| j[                  |      }|	jE                  |       | j\                  jE                  |       |
jE                  |       |dz  }|dz  }T dg|z  }tI        |	      D ]x  \  }}|
|   dk(  r;|| j\                  v r-| j\                  j_                  |       | ja                  |       I|
|   dk(  r || j\                  vr|jE                  |       q|||
|   <   z | jc                  |       tg        jh                  dd!| j                   |fz         | j                   jj                  j                  d"       y#  Y xY w# t0        $ r( t3        j4                  t7        d      |d   z         Y vw xY w# td        $ r8}t3        j4                  t7        d      | j                   |d z         Y d}~yd}~ww xY w)$z#Get list of map layers from cmdfileNr   r   z
d.out.filez	d.to.rastw)r   zd.whatr   r   ,.ltypemaps#GRASS_RENDER_FILE   zUnsupported command %s.T)fullyQualified	layerType)barscalerastleg
northarrowtextvectlegrJ   rI   rK   rL   rM   rB   F)string)namer   r   hiddenrenderr+   z2Unable to read cmdfile '%(cmd)s'. Details: %(det)s)r   detz2Map.GetLayersFromCmdFile(): cmdfile=%s, nlayers=%d)rQ    )6r"   r0   r1   closelen
startswithr3   
writelinesr,   emitr   r2   r-   r.   r$   listr    GetMapDisplaydecorationskeysRemoveOverlayGetListOfLayersr!   command2ltypeKeyErrorgrasswarning_GetLayerNameFromCmdAddLegendRastAddBarscaleAddArrowAddDtextAddLegendVectappendr   	enumerateGetCmdGetCmdStringr   GetRenderMgrupdateProgressconnectReportProgressr4   	_addLayerr#   removeDeleteLayer	SetLayersIOErrorr   msg	updateMap)r5   nlayersfdr8   dCmddWhatCmdrC   overlayseachexistingLayerslayersOrder
next_layermapFile
render_envr9   kvr   rB   rO   args
classLayerexistsilayerjl_ordermapLayernewLayerreorderedLayerses                                  r;   GetLayersFromCmdFilezDMonMap.GetLayersFromCmdFilez   s;   ||f	dllC(BLLNEHHJ 5zA~9''5r9M9M: !9??,DdllC0BMM%*-HHJRy++L9,,T1B,C  ))ekk$.?)@9''1$Ry0HdllC0BMM%*-HHJekk(3A66${{84Q7==cB1EKKCP${{84Q7==cBJJOO#kk(3A6<<SA"ED $   $&  : : < H H M M OP$ EDLL..0>>tDE "113N $^!44K JGJ ]??3'*d2"&**S!"4Q"7"="="?#ABx~~/55c1=1 %&JqMkk$**,/!//A7E
 00 TT d... 	)224BBsBK*,224@@S@I,.224==#=F&224==#=F)+224BBsBK$$++C0%
 %W ). 9 HAu||4|0E4F4F(-5  "&&q>R/-7KN&!OJ /8.D 8
7#*[^#;$/Na$7N8 .8!^KN#$ %  #  %%'66>>%%'66 ))+;;JG!%J>>(3%%h/  ''1"":.a
1{]~  "dZ/O%n5 <5q>R'ET5E5E,E$$++E2$$U+ !^r)e4;K;K.K#**51
 7<OKN3< NN?+ 			@||W%&	
 	##5#1q   MM!$=">Q"GHB  	MMFG,,q12 	sv   C=]= /]= ?D"]= "C]=  &]&+]= ]	(F]= 5.]= $F]= ]]= 	-]:6]= 9]::]= =	^>.^99^>c                 4    t        j                  | g|i |S )zoRender layer to image.

        For input params and returned data see overridden method in Map class.
        )r   Render)r5   r   kwargss      r;   r   zDMonMap.Render0  s    
 zz$0000    c                     t        j                  ddd      }|dk(  rdt        j                  d<   ndt        j                  d<   t	        j
                  | g|i |}t        j                  d= |S )zAdds generic map layer to list of layers.

        For input params and returned data see overridden method in Map class.
        displaydrivertypegroupkeysubkeypngGRASS_RENDER_IMMEDIATEcairo)r   Getr&   environr   AddLayer)r5   r   r   r   r   s        r;   r   zDMonMap.AddLayer7  sg    
 !!	xOU?38BJJ/03:BJJ/0T3D3F3JJ/0r   )NN)__name__
__module____qualname__r   r   r   r   rS   r   r;   r   r   H   s    /bt2l1r   r   c                       e Zd ZdZd Zd Zy)Layerz@implements core::giface::Layerc                     || _         y N)	_maplayer)r5   maplayers     r;   r   zLayer.__init__M  s	    !r   c                 J   |dk(  r#t        | j                  j                               S t        | j                  |      rt	        | j                  |      S |dk(  r| j                  S |dk(  r| j                  j                         S |dk(  r| j                  j                         S y )Nr   r   r   label)r   r   rl   hasattrgetattrGetTypeGetName)r5   rO   s     r;   __getattr__zLayer.__getattr__P  s    5=#DNN$9$9$;<<T^^T*4>>400Z>>!V^>>))++W_>>))++ r   N)r   r   r   __doc__r   r   rS   r   r;   r   r   J  s    )",r   r   c                   R    e Zd ZdZd Zd Zd Zd Zd ZddZ	ddZ
dd
Zd Zd Zy	)	LayerListz#@implements core::giface::LayerListc                 .    || _         || _        d| _        y )Nr   )_mapr    _index)r5   r   r6   s      r;   r   zLayerList.__init__b  s    	r   c                 H    t        | j                  j                               S r   )rU   r   r^   r5   s    r;   __len__zLayerList.__len__g  s    499,,.//r   c                     | S r   rS   r   s    r;   __iter__zLayerList.__iter__j  s    r   c                     | j                   j                         }	 || j                     }| xj                  dz  c_        |S # t        $ r t        w xY w)Nr   )r   r^   r   
IndexErrorStopIteration)r5   itemsresults      r;   __next__zLayerList.__next__m  sS    		))+	 4;;'F 	q  	 	 s   A Ac                 "    | j                         S r   )r   r   s    r;   nextzLayerList.nextv  s    }}r   c                     | j                   j                         }g }|D ]  }t        |      }|j                  |         |S r   )r   r^   r   rj   )r5   checkedOnlyr   layersitemr   s         r;   GetSelectedLayerszLayerList.GetSelectedLayersy  sD    		))+ 	!D$KEMM% 	! r   c                 J    | j                         }t        |      dkD  r|d   S y)z?Returns selected layer or None when there is no selected layer.r   N)r   rU   )r5   r   r   s      r;   GetSelectedLayerzLayerList.GetSelectedLayer  s(    '')v;?!9r   Nc           	          | j                   j                  |||d|dd       | j                  j                  j	                  dd       y)a]  Adds a new layer to the layer list.

        Launches property dialog if needed (raster, vector, etc.)

        :param ltype: layer type (raster, vector, raster_3d, ...)
        :param name: layer name
        :param checked: if True layer is checked
        :param opacity: layer opacity level
        :param cmd: command (given as a list)
        Tr=   )rB   commandrO   activeopacityrQ   pos)rQ   renderVectorN)r   r   r    rx   rX   )r5   rB   rO   checkedr   r   s         r;   r   zLayerList.AddLayer  sO     			 	 	
 	##4d#Cr   c                     | j                   j                         }g }|D ]2  }|j                         |k(  st        |      }|j	                  |       4 |S r   )r   r^   r   r   rj   )r5   rO   r   r   r   r   s         r;   GetLayersByNamezLayerList.GetLayersByName  sR    		))+ 	%D||~%de$	% r   c                     | j                   j                         }|D ]!  }t        |      }	 t        ||      |k(  r|c S # y # t        $ r Y 0w xY wr   )r   r^   r   r   AttributeError)r5   r   valuer   r   r   s         r;   GetLayerByDatazLayerList.GetLayerByData  sc    		))+ 	D$KE5#&%/ L 0	  " s   A	AAT)F)NNg      ?N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   rS   r   r;   r   r   _  s8    -
0D2
r   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)"StandaloneMapDisplayGrassInterface@implements GrassInterfacec                 <    t        j                  |        || _        y r   )r   r   	_mapframer5   mapframes     r;   r   z+StandaloneMapDisplayGrassInterface.__init__  s     ))$/!r   c                 L    t        | j                  j                         |       S )N)r6   )r   r   GetMapr   s    r;   GetLayerListz/StandaloneMapDisplayGrassInterface.GetLayerList  s    ..0>>r   c                 6    | j                   j                         S r   )r   GetMapWindowr   s    r;   r   z/StandaloneMapDisplayGrassInterface.GetMapWindow  s    ~~**,,r   c                     | j                   S r   )r   r   s    r;   rZ   z0StandaloneMapDisplayGrassInterface.GetMapDisplay  s    ~~r   c                 6    | j                   j                         S r   )r   GetProgressBarr   s    r;   GetProgressz.StandaloneMapDisplayGrassInterface.GetProgress  s    ~~,,..r   N)	r   r   r   r   r   r   r   rZ   r   rS   r   r;   r   r     s    $"?-/r   r   c                       e Zd ZdZd Zy)DMonGrassInterfacer   c                 0    t         j                  | |       y r   )r   r   r   s     r;   r   zDMonGrassInterface.__init__  s    *33D(Cr   N)r   r   r   r   r   rS   r   r;   r   r     s    $Dr   r   c                       e Zd ZdZd Zd Zy)DMonDisplayzGMap display for wrapping map panel with d.mon mathods and frame methodsc           
         t        j                  | |||||||       |j                  t        j                  t
        j                  j                  t        j                  d      t        j                               |j                  t        j                  | j                         | j                  j                  | j                   t        j"                  t        j$                  f       | j'                          | j(                  j+                         \  }}	t-        j.                  t0        d   d      D ]Z  }
d|
v rt3        dj5                  |             "d|
v rt3        d	j5                  |	             At3        |
j7                  d
             \ t        j8                  t        j:                        }|j=                  | dt        j>                         |jA                  |       |jC                          y )Nparentidtitler   r6   toolbars	statusbarzgrass_map.icor   T)inplaceGRASS_RENDER_WIDTHzGRASS_RENDER_WIDTH={0}GRASS_RENDER_HEIGHTzGRASS_RENDER_HEIGHT={0}
r   )
proportionflag)"r   r   SetIconwxIconr&   r'   joinr
   ICONDIRBITMAP_TYPE_ICOBind	EVT_CLOSEOnCloseWindowshortcuts_tablerj   OnFullScreenACCEL_NORMALWXK_F11_initShortcuts	MapWindowGetClientSize	fileinputinputr*   printformatrstripBoxSizerVERTICALAddEXPANDSetSizerLayout)r5   r   r6   r   r   r   r   r   widthheightr9   sizers               r;   r   zDMonDisplay.__init__  sq   		
 	GGY..@"BTBT	
 	BLL$"4"45 	##T%6%6$TU 446vOOGENDA 	)D#t+.55e<=&$./66v>?dkk$'(	) BKK(		$1299	5r   c                     | j                   j                         j                         }| j                   j                  |       y )N)r   )r  r   r^   	ZoomToMap)r5   eventr   s      r;   OnZoomToMapzDMonDisplay.OnZoomToMap  s2    &&(88:   /r   N)r   r   r   r   r   r  rS   r   r;   r   r     s    Q(T0r   r   c                   ,    e Zd Zd ZddZd Zd Zd Zy)MapAppc                 N    t        j                  d       t        d       | _        y)NT)ra   set_raise_on_errorr   r    r   s    r;   OnInitzMapApp.OnInit  s!      & *$/r   c                     g }|r|j                  d       t        dk(  rxd _        t         j                  t
        d   t
        d          _        t        j                   j                         _
        da j                  j                  t               nd  _        t        j                  d t        j                  t        t        j                   |      }t#        |t        j                  | j                   j                  ||       _         j$                   j                  _         j$                  j)                         j+                  d	        j$                  j-                  t/        j0                  d
dd      t/        j0                  d
dd      t/        j0                  d
dd      t/        j0                  d
dd      t/        j0                  d
dd              j                  j2                  j5                   fd        j                  j6                  j5                   fd        j                  j8                  j5                   fd        j$                  S )Nr   __main__r   r   )r6   r"   r+   i  )r   sizestyler   r   Fr   autoRenderingenabledr   statusbarMode	selectionalignExtentcompResolutionshowCompExtent)rQ   moder-  constrainResr/  c                 :    j                   j                  |       S r   )
mapDisplayDOutFiler   r5   s    r;   <lambda>z)MapApp.CreateMapDisplay.<locals>.<lambda>H  s    0H0H0M r   c                 :    j                   j                  |       S r   )r3  DToRastr5  s    r;   r6  z)MapApp.CreateMapDisplay.<locals>.<lambda>I  s    T__-D-DS-I r   c                 >    j                   j                  | |      S )NrA   )r3  SetQueryLayersAndActivate)rB   rC   r5   s     r;   r6  z)MapApp.CreateMapDisplay.<locals>.<lambda>K  s!     I I$ !J ! r   )rj   r   cmdTimeStampr   r    r*   r   r   PyTimerwatchertimermtimeStartFrameID_ANYmonSizeDEFAULT_FRAME_STYLEr   r3  r   r   SetAlwaysRenderEnabledSetPropertiesr   r   r,   rp   r-   r.   )r5   rO   r[   r   r   s   `    r;   CreateMapDisplayzMapApp.CreateMapDisplay  s   OOE"z! !D||WU^WU^DH DLL1DJ EJJU#DH88RYYWB4J4JRV
 &yy<<!
 "&$$&==eD 	%%##_Y !!_[ %((]9 &))%5i (++%5i 	& 	
$ 	##$MN  !IJ	
 r   c                     t         dk(  rY| j                  j                  r| j                  j                          t	        j
                  t              D ]  }t        |        y)Nr&  T)r   r>  	IsRunningStopsix
itervaluesr*   r   )r5   r7   s     r;   OnExitzMapApp.OnExitR  sG    z!zz##

!^^G, 1r   c                    	 t         j                  j                  t        d         }|| j                  kD  ri| j
                  j                          || _        | j                  j                         j                          | j
                  j                  t               yy# t        $ r<}t        j                  d|z         | j
                  j                          Y d}~yd}~ww xY w)zLRedraw, if new layer appears (check's timestamp of
        cmdfile)
        r   z%sN)r&   r'   getmtimer*   r;  r>  rJ  r3  r   r   r@  r?  OSErrorra   rb   )r5   currentCmdFileTimer   s      r;   r=  zMapApp.watcher\  s    &		!#!1!1'%.!A!D$5$55

!$6!&&(==?

  '	 6
  	MM$(#JJOO	s   BB! !	C&*2C!!C&c                     | j                   S )zGet Map Display instance)r3  r   s    r;   rZ   zMapApp.GetMapDisplayz  s    r   Nr   )r   r   r   r$  rG  rM  r=  rZ   rS   r   r;   r!  r!    s    AF<r   r!  r&     r   rF   zmap.ppmr   r   )r   r   r            zStarting map display <%s>...pidr>   zUnable to create file <%s>z%s
zg.gisenvzMONITOR_%s_PID=%d)setzWxMonitor started in %.6f seczStopping map display <%s>...MONITOR)unset)Tr   
__future__r   r&   sysrK  timeshutilr  grass.script.utilsr   grass.scriptr   ra   grass.script.taskr   r   grass.pydispatch.signalr   grass.script.setupr	   r
   r   r   core.gifacer   	core.gcmdr   core.renderr   r   r   mapdisp.framer   gui_core.mapdispr   
core.debugr   core.settingsr   r*   monNamerY   MAP_WINDOW_SIZErC  monDecorr   objectr   r   r   r   r   Appr!  r   rU   argvr  exitmonPathr'   r  intboolverboserc   pidFiler0   rz   fatalwritegetpidrT   upperstartgmMaprG  r3  Showrw   MainLooprmtreerP  rS   r   r;   <module>r     s  : & 	 
 
    ) & @ * +   	  0   3 3 " '  & 
 
y((
)c D,F ,*W Wt/)A /(D; D/0*h /0dvRVV vr z
388}g hhqkGhhqkGww||GY/ww||GU+ww||GU+G 388A;SXXa[!12GCHHQK())HEMM!23w?@ ggll7E*G	gs	BA23g=>HHVibiik!"HHJz2gmmoyryy{5SSTDIIKE1IE'':JOOEIIa0IDIIK%4GHI	NNEMM!23w?@g z+CHHQKa V  s   2M" "M*)M*