
    ը	f                       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Z ddl	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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l"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+  e       \  Z,Z- e       \  Z.Z/ e       \  Z0Z1 e       \  Z2Z3 G d de      Z4 G d deejj                        Z6y)a  
@package nviz.mapwindow

@brief wxGUI 3D view mode (map canvas)

This module implements 3D visualization mode for map display.

List of classes:
 - mapwindow::NvizThread
 - mapwindow::GLWindow

(C) 2008-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 Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
@author Anna Kratochvilova <kratochanna gmail.com> (Google SoC 2011)
    N)Thread)NewEvent)glcanvas)
WX_GL_RGBAWX_GL_DOUBLEBUFFERWX_GL_DEPTH_SIZE)Signal)GMessage
GExceptionGError)Debug)MapWindowBase)UserSettings)NvizSettings)	Animation)wxnviz)CheckWxVersion)str2rgb)Notificationc                       e Zd Zd Zd Zd Zy)
NvizThreadc                     t        j                  |        t        j                  dd       || _        || _        || _        d | _        d| _        y )N   zNvizThread.__init__():T)	r   __init__r   msglogprogressbarwindow_displaydaemon)selfr   r   r   s       //usr/lib/grass83/gui/wxpython/nviz/mapwindow.pyr   zNvizThread.__init__8   sA    		!-.&    c                 b    t        j                  | j                  | j                        | _        y N)r   Nvizr   r   r   r!   s    r"   runzNvizThread.runC   s    DHHd.>.>?r#   c                     | j                   S zGet display instancer   r'   s    r"   
GetDisplayzNvizThread.GetDisplayF       }}r#   N)__name__
__module____qualname__r   r(   r,    r#   r"   r   r   7   s    	@r#   r   c                       e Zd ZdZej
                  fdZd Z 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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, Z0d- Z1d. Z2d/ Z3dbd0Z4d1 Z5d2 Z6d3 Z7dbd4Z8d5 Z9dcd6Z:d7 Z;d8 Z<d9 Z=d: Z>d; Z?d< Z@d= ZAdbd>ZBd? ZCd@ ZDdA ZEdB ZFdC ZGdD ZHdE ZIdF ZJdG ZKdH ZLdI ZMdJ ZNdK ZOdL ZPdM ZQdddNZRdddOZSdP ZTdQ ZUdR ZVdS ZWdedTZXdU ZYdV ZZdW Z[dX Z\dedYZ]dZ Z^d[ Z_d\ Z`d] Zad^ Zbd_ Zcd` Zdda Ze xZfS )fGLWindowz$OpenGL canvas for Map Display Windowc                 ^   || _         || _        || _        || _        t	        g d      rjt
        j                  dvrXt        t        j                  ddd            }t        t        t        |dg}	t        j                  j                  | |||		       n!t        j                  j                  | ||       t!        j                  | |||
       | j#                          t%        d      | _        t%        d      | _        t%        d      | _        t%        d      | _        d| _        d| _        d| _        t	        ddg      rt        j4                  |       | _        ddddd| _        ddi| _        t;               | _        t;               | _        d| _         t;               | _!        t;               | _"        g | _#        d| _$        d| _%        i | _&        g | _'        tQ        jR                         | _*        d| _+        d| _,        d| _-        | j                  rf| j                  j\                  | _/        | j                  j\                  ja                  d      }
| j                  j\                  ja                         }n't
        jb                  x| _/        }t
        jd                  }
| jf                  ji                  dd      tj        jl                  d<   to        |
| j                   jq                         |      | _9        | jr                  ju                          tw        jx                  d       | jr                  j{                         | _>        tj        jl                  d= tQ        j~                  | jf                  j                  tP        j                        | _B        d| _C        t               | _E        t        j                  t        j                  dd             | _H        t        j                  ddd!"      | _I        t        j                  t        j                  dd#             | _J        | j                  j                  d$%      | _L        g | j                  d&<   | j                         | j                  d$   d'<   | j                         | _O        tQ        j                  |       | _Q        tQ        j                  |       | _R        t        | | j                  (      | _T        | j                  tP        j                  | j                         | j                  tP        j                  | j                         | j                  tP        j                  | j                         | j                          | j                  t        | j                         | j                  t        | j                         | j                  t        | j                         | j                  t        | j                         | j                  tP        j                  | j                  | j                         | j                  tP        j                  | j                  | j                         | j                  tP        j                  | j                         | j                  tP        j                  | j                         | j                  tP        j                  | j                         t	        g d      r2t
        j                  dvr tQ        j                  d)| j                         tQ        j                  d*| j                         y)+zZAll parameters except for id are mandatory. The todo is to remove
        them completely.)         version)win32darwindisplaynvizDepthBuffervaluegroupkeysubkeyr   )
attribList)parentgifaceMapzGLWindow.mouseMovingzGLWindow.zoomHistoryUnavailablezGLWindow.zoomHistoryAvailablezGLWindow.mapQueriedFNr5   	   )quickvlinesvpointsoverlaysusepointerr   T)err)windreswindres3GRASS_REGION皙?)r   r   nvizviewr@   rA   internal)r@   rA   settings_typelightarrowtypescalebarsize)	mapWindowtimeri  i  )qrD   treelmgrframer   sysplatformintr   Getr   r   r   r   GLCanvasr   r   Hider	   mouseMovingzoomHistoryUnavailablezoomHistoryAvailable
mapQueriedinitinitViewcontext	GLContextrendermouselistlayers	constantsbaseIdcplanesqpointsviewhistorysaveHistorydialogOffsetrK   	imagelistwxOverlayoverlaydragid	hitradiustoolWin	_gconsoler   GetLogstdoutstderrrF   	SetRegionosenvironr   GetProgressBar
nvizThreadstarttimesleepr,   r   ImagemapfileBITMAP_TYPE_ANYimgr^   r   nvizDefaultcopydeepcopyrU   iviewrY   SetDecorDefaultProp
decoration_getDecorationSizeInitFlyflyTimertimerFly	timerAnimr   	animationBindEVT_ERASE_BACKGROUNDOnEraseBackgroundEVT_SIZEOnSize	EVT_PAINTOnPaint_bindMouseEventsEVT_UPDATE_PROPUpdateMapObjPropertiesEVT_UPDATE_VIEWOnUpdateViewEVT_UPDATE_LIGHTUpdateLightEVT_UPDATE_CPLANEOnUpdateCPlane	EVT_TIMEROnTimerAnim
OnTimerFlyEVT_KEY_DOWN	OnKeyDown
EVT_KEY_UPOnKeyUp	EVT_CLOSEOnClose	CallLater_warningDepthBufferInitCPlanes)r!   rD   rE   rc   rF   ra   rb   iddepthBufferattribslogerrlogmsgs               r"   r   zGLWindow.__init__N   s%    		

 *-#,, G
 3
   y6GPWXK "#57GVWXG&&tVRG&L&&tVR8tF6sK		 ""89 '--N&O#$*+J$K! !!67	1a&)#--d3DL 
 Y'
 fvv zz|99yy**DHYY((//D/9FYY((//1F #

*DHvZZF &*XX%7%7t%7%T

>"$VT[[-G-G-I6R

3224 JJ~&88DHH,,b.@.@A 	 (>MM,"2"2V"LM	!%%fJ

 ]]<#3#3&g#NO
**>>G>L&(
#+/+B+B+D (<<> $"TH		"))4+A+AB		"++t{{+		",,-		/4#>#>?		/4#4#45		"D$4$45		#T%8%89		",, 0 0$..A		",,?		"//4>>2		"--.		",,-*-#,, G
 3
 LLt778 	T4++,r#   c                 J    | j                   st        d      }t        |       y y )NzOpening 3D view was not successful. Please try to change the value of depth buffer in GUI Settings dialog > tab Map Display > Advanced and restart GUI.)ro   _r
   )r!   messages     r"   r   zGLWindow._warningDepthBuffer   s'    }}#G W r#   c                 d    t         j                  dk(  rt        g d      syt        |          S )Nr;   )      r   r8   r   )rd   re   r   superGetContentScaleFactor)r!   	__class__s    r"   r   zGLWindow.GetContentScaleFactor   s'    <<8#N9,Mw,..r#   c                     dg ddt        j                  ddddg      t        j                  dddd	g      d
ddddddddd
}|S )z!Initialize fly through dictionary
   r   r   r   r   rT   r   exagmover?   turn)r   r      r   Nxy2   r5   )
intervalr>   moder   exagMultiplierflySpeedmouseControlpos	arrowStepflySpeedStep)r   rg   )r!   r   s     r"   r   zGLWindow.InitFly   so     $(( eVV4D %(( eVV4D	   #%
* 
r#   c                    | j                   d   dk7  ry| j                  d   r  | j                  | j                   d    \  }}n5| j                  | j                  d   d   | j                  d   d         \  }}| j                  ||	       | j                  j                  | j                  d
   | j                  d   | j                  d          | j                          d| j                  d<   | j                  d       y)z%Fly event was emitted, move the scenerL   r   Nr   tmpr   r   r   )mxmyr>   r   r   )flyInfor   exagInfoTrH   F)	rs   r   ComputeMxMyComputeFlyValuesr   
FlyThroughChangeInnerViewrr   Refresh)r!   eventr   r   s       r"   r   zGLWindow.OnTimerFly  s    ::e%88N#%T%%tzz%'89FB%%dhhuoc&:DHHUOC<PQFB+  HHW%DHHV,<txxPVGW 	! 	
 	#GUr#   c                 D   | j                         \  }}dx}}dt        |      |z  z  dz
  }dt        |      |z  z  dz
  }|| k  r||z  }n||kD  r||z  }nd}|| k  r||z  }n||kD  r||z  }nd}|d|z
  z  }|d|z
  z  }|t        |      z  }|t        |      z  }||fS )zCompute values for flythrough navigation
        (ComputeFlyValues should follow).

        Based on visualization/nviz/src/togl_flythrough.c.
        :param x,y: screen coordinates
        {Gz?r5   r   g        g      ?)GetClientSizefloatabs)	r!   r   r   sxsydxdyr   r   s	            r"   r   zGLWindow.ComputeMxMy   s     ##%BR%(R- 1$%(R- 1$8"HB"W"HBB8"HB"W"HBB38_38_ 	c"g
c"g2vr#   c                    g d| j                   d<   | j                   d   dk(  r| j                   d   | j                   d   z  dz  | j                   d   d<   |dz  | j                   d   z  dz  | j                   d   d	<   |dz  | j                   d   z  dz  | j                   d   d
<   y|dz  | j                   d   z  dz  | j                   d   d<   | dz  | j                   d   z  dz  | j                   d   d
<   y)zmCompute parameters for fly-through navigation

        :param mx,my: results from ComputeMxMy method
        r   r>   r   r   r   r   g     @@rS   r   r5         Y@Nr   )r!   r   r   s      r"   r   zGLWindow.ComputeFlyValuesC  s   
 &88Fq $txx
';;fD HHWa  $&8dhhz.B#BV#KDHHWa #%8dhhz.B#BV#KDHHWa #%:0D#Dv#MDHHWa $&3;*1E#E#NDHHWa r#   c                     |r%| j                   dxx   | j                   d   z  cc<   y| j                   dxx   | j                   d   z  cc<   y)zIncrease/decrease flight sppedr   r   Nr   )r!   increases     r"   ChangeFlySpeedzGLWindow.ChangeFlySpeedT  s?    HHZ DHH^$<< HHZ DHH^$<< r#   c                     | j                  | j                         | j                  | j                         | j                  d       y)z#Stop timers if running, unload dataTforceN	StopTimerr   r   UnloadDataLayersr'   s    r"   __del__zGLWindow.__del__[  s3    t~~&t}}%D)r#   c                 F    |j                         r|j                          yy)zStop timer if runningN)	IsRunningStop)r!   r`   s     r"   r   zGLWindow.StopTimera  s    ??JJL r#   c                     | j                  t        j                  | j                         | j                  t        j                  | j
                         y r%   )r   r~   EVT_MOUSE_EVENTSOnMouseAction
EVT_MOTIONOnMotionr'   s    r"   r   zGLWindow._bindMouseEventsf  s2    		"%%t'9'9:		"--/r#   c                     t        | j                  j                               D ]L  }t        j                  t        j                  dd            }d|d<   | j                  j                  |       N y)zInitialize cutting planes listrT   cplanerV   FonN)	ranger   GetCPlanesCountr   r   r   rg   rx   append)r!   ir	  s      r"   r   zGLWindow.InitCPlanesj  sY    t}}4467 	(A]]<#3#3&h#OPF F4LLL'	(r#   c                     || _         y)z2Sets reference to nviz toolwindow in layer managerNr   )r!   r   s     r"   
SetToolWinzGLWindow.SetToolWinq  s	    r#   c                     | j                   S )z5Returns reference to nviz toolwindow in layer managerr  r'   s    r"   
GetToolWinzGLWindow.GetToolWinu  s    ||r#   c                     | j                  | j                         | j                  | j                         | j                  d       y )NTr   r   r!   r   s     r"   r   zGLWindow.OnClosey  s3    t~~&t}}%D)r#   c                      y r%   r1   r  s     r"   r   zGLWindow.OnEraseBackground  s    r#   c                    | j                         }t        ddg      r| j                  }n| j                         }| j                  |k7  r|rt        j                  dd|j                  |j                  fz         t        ddg      r| j                  | j                         n| j                          | j                  j                  |j                  |j                  | j                                | j                  j                          | j                  j                          || _        |j!                          y )Nr5   rG   r8   r   z!GLCanvas.OnSize(): w = %d, h = %d)r   r   rp   
GetContextr^   r   r   widthheight
SetCurrentr   ResizeWindowr   rD   StatusbarRepositionStatusbarUpdateSkip)r!   r   r^   rp   s       r"   r   zGLWindow.OnSize  s    !!#1a&)llGoo'G99II6$**dkk9RR q!f--!MM&&

DKK)C)C)E
 KK++- KK'')	

r#   c                     t        j                  dd       d| j                  d<   t        j                  |       }| j                          y )Nr   zGLCanvas.OnPaint()TrK   )r   r   rr   r~   PaintDCDoPaint)r!   r   dcs      r"   r   zGLWindow.OnPaint  s6    		!)*"&JZZr#   c                    t        ddg      r| j                  | j                         n| j                          | j                  s!| j                  j                          d| _        | j                          | j                          | j                  sA| j                          t        | j                  d      r| j                  j                  j                  d       | j                  j                  j                  d       | j                  j                  j                  d       | j                  j                  j                  d	       | j                  j                  j                  d
       | j                  j                  dd      }|r| j                  j!                  |d      }|j"                  dk(  rK| j                  j                  j                  d       | j                  j                  j                  d       n4|j"                  dk(  r%| j                  j                  j                  d       | j                  j                  j%                          | j                  j                  j'                  | j                  j                  j(                  d   d   d         }|j+                  | j-                  d             d| _        | j/                          y )Nr5   rG   r8   TrT   rU   rY   r	  r   r   FmulticheckedOnlymaplayerrA   rastersurfacefringevectorlines)r   r  rp   ro   r   InitViewLoadDataLayersr   rn   	ResetViewhasattrrb   rT   
UpdatePagera   GetSelectedLayerGetLayerInfor\   UpdateSettingsFindWindowByIdwinSetItemsGetLayerNames	UpdateMap)r!   layerr8  s      r"   r"  zGLWindow.DoPaint  s   1a&)OODLL)OO}}MM""$ DMyyNNtyy&)		))&1		))'2		))(3		)),7		))+6		22D2Q II225j2IEzzX-		11)<		11(;x/		11(;		--/ iinn33IINN&&x09)D T//9:DIr#   c                 h    | j                   D ]#  }|j                         s|j                          % y)zDraw overlay imageN)r}   IsActiveDraw)r!   textures     r"   
DrawImageszGLWindow.DrawImages  s*    ~~ 	G!	r#   c                     | j                   j                  | j                                | j                   j                  d       y)zVRenders overlays (legend, text).
        Once this is done _onUpdateOverlays is calledTr   N)rF   ChangeMapSizer   RenderOverlaysr'   s    r"   UpdateOverlayszGLWindow.UpdateOverlays  s4     	t1134d+r#   c                    t        j                  | j                        D ]  \  }}|j                         r|j                  dv r%|| j
                  D cg c]  }|j                          c}vr| j                  |       b| j
                  D ]U  }|j                         |k(  s|j                  |      r)| j
                  j                  |       | j                  |      }W  | j                          yc c}w )zConverts rendered overlay files and text labels to wx.Image
        and then to textures so that they can be rendered by OpenGL.
        Updates self.imagelist)barscale
northarrow)r   N)six	iteritemsrK   IsShownnamer}   GetIdCreateTextureCorrespondsremover   )r!   oidr   ts       r"   _onUpdateOverlayszGLWindow._onUpdateOverlays  s    
  MM$--8 
	DLC??$8R(Rdnn=1779==""7"3 DAwwyC' }}W5 NN11!4 $ 2 27 2 CA	D
	D 	 >s   C9c                 N   t        j                  |j                  j                  |j                  t        |j                        |j                               }|j                  s%t        | t        d      |j                  z         |S | j                  j                  |       |S )z!Create texture from overlay image)filepath	overlayIdcoordscmdzSImage is too large, your OpenGL implementation supports maximum texture size %d px.rD   r   )r   ImageTexturer<  r   r   rt   rW  GetCmd	textureIdr
   r   maxSizer}   r  )r!   r   r@  s      r"   rN  zGLWindow.CreateTexture  s    %%]]**jj' 	
   ; //	" Ng&r#   c                     g | _         y r%   )r}   r'   s    r"   ClearTextureszGLWindow.ClearTextures  s	    r#   c                 h    | j                   D ]#  }|j                  |||      s|j                  c S  y)z Find object which was clicked onrN   )r}   HitTestr   )r!   mouseXmouseYradiusr@  s        r"   FindObjectszGLWindow.FindObjects
  s4    ~~ 	"Gvvv6zz!	" r#   c                 8    | j                   j                          y r%   )r   Updater  s     r"   r   zGLWindow.OnTimerAnim  s    r#   c                     | j                   S r%   )r   r'   s    r"   GetAnimationzGLWindow.GetAnimation  s    ~~r#   c                 :   | j                   d   dk(  sy|j                         }|t        j                  k(  rd| j                  d<   n|t        j
                  k(  rP| j                  d   dxx   | j                  d   z  cc<   | j                  d   d	xx   | j                  d   z  cc<   na|t        j                  k(  ru| j                  j                         r[| j                  d
   sL| j                  | j                         d| j                  d
<   d| j                  d<   | j                  d       n|t        j                  t        j                  t        j                  t        j                  fv r| j                  d
   s| j                  j                         st| j!                         \  }}|dz  | j                  d   d<   |dz  | j                  d   d<   d| j                  d
<   | j                  j#                  | j                  d          | j%                  |       n|t        j                  k(  r| j'                  d       n|t        j                  k(  r| j'                  d       n|t        j(                  t        j*                  fv r-| j                  j                         r| j'                  d       nN|t        j,                  t        j.                  fv r,| j                  j                         r| j'                  d       |j1                          y)z=Key was pressed.

        Used for fly-through mode.
        rL   r   Nr   r   r   r   r   r   r   FrH   r5   r   r   r   r   )keyCodeTr   )rs   
GetKeyCoder~   WXK_CONTROLr   	WXK_SHIFT
WXK_ESCAPEr   r  r   rr   r   WXK_UPWXK_DOWNWXK_LEFT	WXK_RIGHTr   StartProcessFlyByArrowsr   WXK_HOME
WXK_PAGEUPWXK_ENDWXK_PAGEDOWNr  )r!   r   rA   r   r   s        r"   r   zGLWindow.OnKeyDown  sX   
 zz% E) "..  DHHVBLL HHVV$1A(BB$HHVV$1A(BB$ 2== '')HH^,NN4==)'+DHH^$#(DKK LLRYYR[[",,GG88N+}}..0!//1FB+-6DHHUOC(+-6DHHUOC(/4DHH^,MM''(<='''4 "))#'''6BKK''''7R[["--00T]]5L5L5N.RZZ11dmm6M6M6O/

r#   c                    | j                   d   }|t        j                  k(  r| j                   d   dxx   |z  cc<   y|t        j                  k(  r| j                   d   dxx   |z  cc<   y|t        j                  k(  r| j                   d   dxx   |z  cc<   y|t        j
                  k(  r| j                   d   dxx   |z  cc<   yy)z$Process arrow key during fly-throughr   r   r   r   N)r   r~   rq  rr  rs  rt  )r!   rk  steps      r"   rv  zGLWindow.ProcessFlyByArrowsJ  s    xx$biiHHUOC D( #HHUOC D( #HHUOC D( $HHUOC D(  %r#   c                    | j                   d   dk(  sy|j                         }|t        j                  k(  rd| j                  d<   n|t        j
                  k(  rt        j                  | j                  d   d   | j                  d   z        | j                  d   d<   t        j                  | j                  d   d	   | j                  d   z        | j                  d   d	<   |j                          y)
z>Key was released.

        Used for fly-through mode.
        rL   r   Nr   r   r   r   r   r   )	rs   rm  r~   rn  r   ro  mathfloorr  )r!   r   rA   s      r"   r   zGLWindow.OnKeyUpV  s    
 zz% E) "..  DHHVBLL '+zz (4884D+EE(DHHVV$ (,zz (4884D+EE(DHHVV$ 	

r#   c                 *   |j                         dk7  r| j                  |       n|j                         r| j                  |       n|j	                         r| j                  |       n|j                         r| j                  |       nx|j                         r| j                  |       nV|j                         rF|j                         }| j                  |      }|#| j                  j                  |d   |d          |j                          y)zHandle mouse eventsr   Nr   r   )GetWheelRotationOnMouseWheelLeftDown
OnLeftDownLeftUpOnLeftUpDragging
OnDraggingButtonDClickOnDClickMovingGetPosition
Pixel2Cellrj   emitr  )r!   r   pixelCoordinatescoordinatess       r"   r  zGLWindow.OnMouseActionk  s     !!#q(e$ ^^OOE" \\^MM%  ^^OOE" !MM% \\^$002//*:;K &  %%A+a.%I

r#   c                    t        j                  ddd      dk(  r|j                          y|j                         }t	        j
                  dd|z         | j                  j                         r:| j                  d	   r+|d
kD  r| j                  d       y| j                  d       yt        j                  ddd      r|dz  }| j                  ||j                                y)zChange perspectiver<   mouseWheelZoom	selectionr?   r5   Nr   z#GLWindow.OnMouseWheel(): wheel = %dr   r   Trl  FscrollDirectionrN   zoomtyper   )r   rg   r  r  r   r   r   r  r   r   DoZoomr  )r!   r   wheels      r"   r  zGLWindow.OnMouseWheel  s     92B;W JJL&&(		!:UBC==""$.)Aqy##T#2##U#3%6{ KKE,=,=,?K@r#   c                    |j                         | j                  d<   |j                         | j                  d<   | j                  d   dk(  r| j                         }| j                  j	                  | j                  d   d   |d   | j                  d   d   z
  | j                                | j                  j                         }t        d      D ]  \  }}||   | j                  d   |<    d	| _	        | j                  d
       | j                  j                  j                  d      }|j                  d
       d| j                  d<   | j                  d       | j                  d   dk(  r?|j                         }| j                         }| j!                  |d   |d   |d   z
  f       | j                  d   dk(  r?|j                         }| j                         }| j#                  |d   |d   |d   z
  f       | j                  d   dk(  rB| j%                  | j                  d   d   | j                  d   d   | j&                        | _        | j                  d   dk(  rQ| j*                  j-                         s7| j*                  j/                  | j0                  d          d	| j0                  d<   |j3                          y)zOn left mouse downbeginr   rL   lookHerer   r   r   r   zfocusTFhererM   defaultrZ   r]   r   r   r   N)r  rs   r   r   LookHerer   GetFocus	enumerater   r{   r   rb   rT   FindWindowByNameSetValueSetNamedCursorSetDrawArrowSetDrawScalebarre  r   r   r   r  ru  r   r  )r!   r   r^   r  r  coordtoggler   s           r"   r  zGLWindow.OnLeftDown  sp   #//1

7!--/

5::e
*%%'DMM""

7#A&Q$**W-a00**,
 MM**,E%o6 65-21X

7#E*6#DLLYY^^44V<FOOE" )DJJu	*::e'##%C%%'Ds1vtAwQ'789::e
*##%C%%'D  #a&$q'CF*:!;<::e	)**

5!!$djj&7&:DNNDK ::e%==**,##DHHZ$89+/(

r#   c                    | j                   d   dk(  r9| j                  dk\  r*| j                  | j                  |j                                | j                   d   dk(  r|j	                         | j                   d   d   z
  |j                         | j                   d   d   z
  }}| j                  j                  ||      \  }}}}| j                  j                  ||||       d| j                  d<   | j                  d	       | j                   d   d
k(  r| j                  |       |j                         | j                   d<   |j                          y )NrL   rM   r   rotater   r   TrH   Fpan)rs   r   DragItemr  GetXGetYr   GetRotationParametersRotaterr   r   FocusPanningr  )r!   r   r   r   angler   r   r  s           r"   r  zGLWindow.OnDragging  s   ::e	){{adkk5+<+<+>?::e(

tzz%033

tzz%033 B
 "]]@@RHNE1aMM  1a0#'DKK LL::e%e$!--/

5

r#   c                     | j                         }|\  }}| j                  j                  ||d   |z
  | j                               \  }}}}|sy||fS )zConvert image coordinates to real word coordinates

        :param xyCoords: image coordinates

        :return: easting, northing
        :return: None on error
        r   N)r   r   GetPointOnSurfacer   )r!   xyCoordsr^   r   r   sidr  s          r"   r  zGLWindow.Pixel2Cell  s`     !!#1}}66tAw{D668
Q1 1vr#   c                 z   | j                   d   d   }|dkD  rd| j                   d   d   z  }n| j                   d   d   }| j                   d   dxx   |z  cc<   | j                   d   d   dk  rd| j                   d   d<   n'| j                   d   d   dkD  rd| j                   d   d<   || j                   d   d   k7  r}t        | j                  d      rU| j                  j                  j	                          |d   | j                         d   |d   z
  }}| j                  j                  ||| j                               }|d   rm| j                  j                  ||| j                                | j                  j                         }t        d	      D ]  \  }	}
||	   | j                  d
   |
<    | j                  j                  | j                   d   d   | j                   d   d   | j                  d   d   | j                   d   d   | j                   d   d          d| _        | j                          yy)zChange perspective and focusperspr>   r   rN   r|  r      rT   r  r  positionr   r   r  twistTN)rU   r2  rb   rT   r6  r   r   r  r   r  r  r  r   SetViewr{   r"  )r!   r  r   
prev_valuer>   r   r   resultr  r  r  s              r"   r  zGLWindow.DoZoom  s    YYw'0
a<7+F33EIIg&v.E		'7#u,#99Wg&**+DIIgw'YYw(3.*-DIIgw'7+G44tyy&)		--/1vt113A6Q?188q$446 !9MM**1a1K1K1MN MM224E$-o$> >55:1X

7+E2>%%IIj)#.IIj)#.JJx(1IIg&w/IIg&w/ $( LLN+ 5r#   c                    |j                         | j                  d<   | j                  d   dk(  r?| j                  j                  | j                  d   d   | j                  d   d          nl| j                  d   dv r| j                  j
                  j                  | j                  j
                  j                  d   | j                  d      d	         j                  d
       | j                  d   dk(  rAt        | j                  d         }| j                  j
                  j                  |dz
         n$| j                  j
                  j                          d| j                  d<   | j                  d       nY| j                  d   dk(  r| j                  dk\  r7| j                  d   d   | j                  d   d   z
  }| j                  d   d   | j                  d   d   z
  }| j                  | j                  v rO| j                  | j                     j                   }|d   |z   |d   |z   g| j                  | j                     _        d| _        d
| j"                  d<   | j%                  d
       n]| j                  d   dk(  ri| j&                  j)                          | j&                  j+                         | j,                  d<   d| _        d
| j"                  d<   | j%                  d
       n| j                  d   dk(  r(d| _        d
| j"                  d<   | j%                  d
       n| j                  d   dk(  rZ| j0                  d   r| j3                  | j4                         d | j0                  d<   d
| j"                  d<   | j%                  d
       n<| j                  d   dk(  r*| j7                  | j8                  | j                  d          |j;                          y )NendrL   queryr   r   r   )rZ   r]   r   placeFr]   rM   r  r  rN   rH   r  rotationTr  r   r   zoomr  )r  rs   rm   r  rb   rT   r7  r8  r  lenr   AddScalebarAddArrowr  r   rK   rW  rr   r   r   UnsetRotationGetRotationMatrixr   r{   r   r   r   r  r  r  )r!   r   scalebarNumr   r   rW  s         r"   r  zGLWindow.OnLeftUp"  s$   !--/

5::e' OO  4::e#4Q#74::e;LQ;O PZZ"77IINN))		""<0E1BCGLhuozz% J.!$//*"=>		**;?;		'') )DJJu	*ZZ)+{{aZZ&q)DJJw,?,BBZZ&q)DJJw,?,BB;;$--/!]]4;;7>>F9?RPQUW8XDMM$++.5 ',G$U#ZZ(*MM'')%)]]%D%D%FDJJz"#D#(DKK LLZZ%'#D#(DKK LLZZ%'xx't}}-+/( (-G$U#ZZ&(KKDJJu4EKF

r#   c                     | j                   d   dk7  ry|j                         }| j                  |d   |d   | j                        | _        | j
                  j                  | j                         y)zOn mouse double clickrL   rM   Nr   r   )rV  )rs   r  re  r   r   overlayActivatedr  )r!   r   r   s      r"   r  zGLWindow.OnDClick^  sa    ::e	)!&&s1vs1vt~~F""T[["9r#   c                    | j                         }| j                  j                  | j                  d   d   |d   | j                  d   d   z
  | j	                               \  }}}}| j                  j                  |j                         |d   |j                         z
  | j	                               \  }}}	}
|r||k(  r||z
  |	|z
  |
|z
  }}}| j                  d   }| j                  j                         \  |d<   |d<   |d<   |dxx   |z  cc<   |dxx   |z  cc<   |dxx   |z  cc<   | j                          |j                         | j                  d<   d| j                  d	<   | j                  d
       yyy)z!Simulation of panning using focusr   r   r   r  r   r   r  TrH   FN)r   r   r  rs   r   r  r  r   r  PostViewEventr  rr   r   )r!   r   r^   id1x1y1z1id2x2y2z2r   r   dzr  s                  r"   r  zGLWindow.FocusPanningf  sm   !!#--99JJua Gdjj'**&&(
RR
 --99JJL$q'EJJL0$2L2L2N
RR 3#:b"r'27BBJJw'E151G1G1I.E#Jc
E#J#J"J#J"J#J"J   % 1 1 3DJJu#'DKK LL 3r#   c                    | j                         }| j                  j                  | j                  d   d   |d   | j                  d   d   z
  | j	                               \  }}}}| j                  j                  |j                         |d   |j                         z
  | j	                               \  }}}	}
|r||k(  r||z
  |	|z
  }}| j                  D ]W  }| j                  j                  |d      }| j                  j                  |d      }|j                         dk(  ru|d   d	   d
xx   |z  cc<   |d   d	   dxx   |z  cc<   d|d   d	   d<   t        |      }t        j                  | |       |j                         s||d   d   d   k(  s n|j                         dk(  sd
|d   d	   vr!d|d   d	   d
<   d|d   d	   d<   d|d   d	   d<   |d   d	   d
xx   |z  cc<   |d   d	   dxx   |z  cc<   d|d   d	   d<   t        |      }t        j                  | |       Z |j                         | j                  d<   d| j                   d<   | j#                  d       yyy)zTMove all layers in horizontal (x, y) direction.
        Currently not used.
        r   r   r   r(  r)  rT   r*  r+  r  r   r   Nupdatedataobjectr   	raster_3dvolumer  TrH   F)r   r   r  rs   r   r  r  ru   ra   r5  GetTypewxUpdatePropertiesr~   	PostEventCmdDownr  rr   r   )r!   r   r^   r  r  r  r  r  r  r  r  r   r   itemmapLayerr  evts                    r"   HorizontalPanningzGLWindow.HorizontalPanning  s    !!#--99JJua Gdjj'**&&(
RR
 --99JJL$q'EJJL0$2L2L2N
RR 3#:"Wb2gB ,9911$J1Gyy--d-?##%1OJ/4:4OJ/4:4<@DOJ/9 -$7CLLs+}}3$y/(2KD2Q+Q%%';6$x."<<:;Xz237:;Xz237:;Xz237N:.s3r93N:.s3r93;?DN:.x8 -$7CLLs+7,: !& 1 1 3DJJu#'DKK LLE 3r#   c                 D   |yt        j                  dd|z         | j                  d   \  }}|d   |z
  }|d   |z
  }| j                  D ]$  }|j                  |k(  s|j                  ||       & d| j                  d<   | j                  d	       || j                  d<   y)
zDrag an overlay decoration itemNr   zGLWindow.DragItem(): id=%dr   r   r   TrH   F)r   r   rs   r}   r   MoveTexturerr   r   )r!   r   rW  r   r   r   r   r@  s           r"   r  zGLWindow.DragItem  s    :		!1B67zz% 1AY]AY]~~ 	,GzzR##B+	,  $GU"

5r#   c                    i }t        | j                        dkD  r<| j                  j                          t        j                  | j                  d         }t        | j                        dk  r| j
                  j                          | j                  j                  j                  |d   |d          | j                  j                  j                  d       | j                  d       y)	z!Set previous view in history listr   rN   r5   r   rU   r   rU   FN)r  rz   popr   r   rk   r  rb   rT   UpdateStater3  r   )r!   rU   s     r"   ZoomBackzGLWindow.ZoomBack  s    t 1$  "==!1!1"!56D t 1$'',,. 			""QtAw"?		!!&)Ur#   c                 r   d}t        j                  |      }t        j                  |      }| j                  r| j                  d   ||fk(  s| j                  j                  ||f       t	        | j                        dkD  r| j                  j                  d      }|r't        j                  dd| j                  d|       n#t        j                  dd| j                  z         t	        | j                        d	kD  r| j                  j                          |S | j                  j                          |S )
zManages a list of last 10 views

        :param view: view dictionary
        :param iview: view dictionary (internal)

        :return: removed history item if exists (or None)
        NrN   r   r   r   zGLWindow.ViewHistory(): hist=z
, removed=zGLWindow.ViewHistory(): hist=%sr   )r   r   rz   r  r  r  r   r   rl   r  rk   )r!   rU   r   removedhviewhiviews         r"   ViewHistoryzGLWindow.ViewHistory  s
    d#u%  T%5%5b%9eV_%L##UFO4t 2%&&**1-GII##W. IIa:d>N>NOP t 1$%%**,  '',,.r#   c                 "    t               | _        y)zReset view historyN)rt   rz   r'   s    r"   ResetViewHistoryzGLWindow.ResetViewHistory  s    6r#   c                    | j                   j                  d   }| j                   j                  d   }||z  }||z  }| j                  d   }||c|d<   |d<   d| _        | j	                          d| j
                  d<   | j                  d       y	)
zFocus on given pointwsr  r   r   TFrH   N)rF   regionr   r{   r  rr   r   )r!   enr  r  r  s         r"   GoTozGLWindow.GoTo  s    HHOOC HHOOC 	Q	Q

7#!"Ac
E#J$GUr#   c                 ^   | j                         }| j                  j                  ||d   |z
  | j                               }|r| j                  j                  |d   |d   |d   f       | j                  j                  dt        d      |d   fz         | j                  j                  dt        d      |d   fz         | j                  j                  dt        d      |d   fz         d	}| j                  D ]  }| j                  j                  |d
      j                  dk(  s.| j                  j                  |d      d   d   d   |d   k(  s[| j                  j                  |d
      j                  } | j                  j                  t        d      dd|       | j                  j                  t        d      dd|d          | j                  j                  t        d      dd|d          t        | j                        dkD  r| j                  d   }| j                  d   }t        j                   t#        |d   |d   z
  d      t#        |d   |d   z
  d      z         }	t        j                   t#        |d   |d   z
  d      t#        |d   |d   z
  d      z   t#        |d   |d   z
  d      z         }
| j                  j                  dt        d      |	fz         | j                  j                  dt        d      |
fz         | j                  j                  dt        d      | j                  j%                  |d   |d   |d   f|d   |d   fd       fz         | j                  j                  dt        d!      | j                  j%                  |d   |d   |d   f|d   |d   fd"       fz         | j                  j'                  d#       y%| j                  j                  t        d$             | j                  j'                  d#       y%)&zQuery surface on given positionr   r   r   r  z%-30s: %.3fEastingNorthing	Elevation r(  r)  r*  rT   r+  r  r   zSurface map name30z: zSurface map elevation	elevationzSurface map colorcolorrN   r   r5   zXY distance from previouszXYZ distance from previouszDistance along surfaceF)useExagzDistance along exag. surfaceTzP--------------------------------------------------------------------------------zNo point on surfaceN)r   r   QueryMapr   ry   r  r   WriteLogr   ru   ra   r5  r\   rL  r  r~  sqrtpowGetDistanceAlongSurfaceWriteCmdLog)r!   r   r   r^   r  rL  r  prevcurrdxydxyzs              r"   QuerySurfacezGLWindow.QuerySurface
  s   !!#''47Q;8R8R8TULLfSk6#; GHHHmq|VC[.IIJHHmq}fSk.JJKHHmq~vc{.KKLD MII**4Z*@EEQ		..t.@KHU d|$
  9911$J1GLLDM HHQ/A-BDIJHH !896+;NO HHQ/B-CVG_UV4<< 1$||B'||B'iiDGd1g$5q 9CQ$q'@QST<U UVyyQ$q')1-$q'DG+Q/0$q'DG+Q/0
 !!-15P3QSV2W"WX!!!Q'C%Dd$KK !!!23=="4L!!Wd1g.!!Wd1g.$)	 > 	 !!!89=="4L!!Wd1g.!!Wd1g.$(	 > 	 HH  *HHa 567HH  *r#   c                 H    t        |      }t        j                  | |       y)Change view settings)zExagN)wxUpdateViewr~   r  )r!   r  r   s      r"   r  zGLWindow.PostViewEventL  s    5)
T5!r#   c                 R     | j                   j                  |j                           y)zQuery vector on given positionN)rD   QueryVectorr  r  s     r"   OnQueryVectorzGLWindow.OnQueryVectorQ  s    !2!2!45r#   c                    | j                   }| j                  }| j                  j                         \  |d   d<   |d   d<   |d   d<   t	        d| j                  j                               D ]  \  }}||d   |<    d|d   d	<   y
)z.Get current viewdir and viewpoint and set viewr  r   r   r  r>   r  dirTrL   N)rU   r   r   GetViewpointPositionzip
GetViewdir)r!   rU   r   rA   vals        r"   r   zGLWindow.ChangeInnerViewU  s    yy


 MM..0		
S!S!(OG$OT]]-E-E-GH 	$HC #E%L	$ #eUr#   c                 t    |r| j                  |j                         d| _        |r|j                          yy)r  )zexagTN)
UpdateViewr  r{   r  r  s     r"   r   zGLWindow.OnUpdateViewc  s0    OO%++O.JJL r#   c                    | j                   }| j                  }|r1d|d   v r*| j                  j                  |d   d   |d   d   z         | j                  j	                  |d   d   |d   d   |d   d   |d   d   |d	   d          |d
   d   r0| j                  j                  |d
   d   |d
   d   |d
   d          nX|d   d   dk7  rM| j                  j                  | j                  d   d   | j                  d   d   | j                  d   d          d|v r?|d   r| j                  j                  |d          y| j                  j                          yy)r  r>   z-exagllRatior  r   r   r  r  r  r  rL   r  r  rN   r  N)	rU   r   r   SetZExagr  
SetViewdirSetFocusSetRotationMatrixResetRotation)r!   r!  rU   r   s       r"   r"  zGLWindow.UpdateViewl  ss   yy

WX.MM""4>'#:U8_Y=W#WXS!S!(OG$M'"M'"	
 <MM$$eS!5<#4eEl36G 7^C B&MM""

7#C(

7#C(

7#C( Z //j0AB++-	 r#   c           	         | j                   }| j                  j                  |d   d   |d   d   |d   d   dz  |d   |d   dz  |d   dz  	       | j                  j                          |j                  r| j                  d
       yy)zChange light settingsr  r   r   r  r   r  brightambient)r   r   r  r  r,  r-  FN)rY   r   SetLightDrawLightingModelrefreshr   )r!   r   r  s      r"   r   zGLWindow.UpdateLight  s    zz:s#:s#:s#e+w->E)Oe+ 	 	
 	'')==LL r#   c                 R   t        j                         }d| _        | j                  d   du rt        j
                  dk7  rz| j                  j                         j                          | j                  j                         j                  d       | j                  j                         j                  d       | j                  d   du rt        j
                  dk7  r)| j                  j                         j                  d       | j                  j                  dd       | j                  r| j                  | j                  | j                          d| _        n| j                  d   d	u rt"        j$                  t"        j&                  z  }| j                  d
   r|t"        j(                  z  }| j                  d   r|t"        j*                  z  }| j                  j                  d	|       n	 | j-                          | j                  d   du ro| j                  j/                          | j0                  d   d   r| j                  j3                          | j0                  d   r| j                  j5                          | j6                  rf| j                  d   r| j8                  dkD  s| j                  d   s9| j8                  dk  r*| j                  j;                          | j=                          t        j                         }| j                  d   du rdt        j
                  dk7  rQ| j                  j                         j                  d       | j                  j                         j?                          tA        jB                  dd| j                  d   ||z
  fz         y)zUpdates the canvas anytime there is a change to the
        underlying images or to the geometry of the canvas.

        :param render: re-render map composition
        :type render: bool
        FrH   r;   r5   r   r   rN   r  TrI   rJ   rZ   showr]   r   z.GLWindow.UpdateMap(): quick = %d, -> time = %gN)"grassclockresizerr   rd   re   rD   r   ShowSetRanger  r   r?  r{   r  rU   r   r   DRAW_QUICK_SURFACEDRAW_QUICK_VOLUMEDRAW_QUICK_VLINESDRAW_QUICK_VPOINTSSwapBuffers
DrawFringer   	DrawArrowDrawScalebarr}   r   Start2DrA  ri   r   r   )r!   rr   r   r   stops        r"   r;  zGLWindow.UpdateMap  s    ;;w5(||x'**,113**,55a8**,55a8;;w5(||x'**,55a8MMub)  diitzz B#( [[!T),,v/G/GGD{{8$000{{9%111MMtT* ;;w5(MM$$&w'/'')z***,>>G$r)9KK(T[[1_%%'!{{};;w5(||x'**,55a8**,113		<{{7#dUl45	
r#   c                 X    | j                   j                          | j                          y)zErase the canvasN)r   EraseMapr<  r'   s    r"   rC  zGLWindow.EraseMap  s     r#   c                 p    | j                   j                         dz  }d}|dk  rd}t        ||z        |z  S )z(Get initial size of north arrow/scalebarg       @r   r   r   )r   
GetLongDimrf   )r!   r^   coefs      r"   r   zGLWindow._getDecorationSize  s>    }}'')C/!8D4$;$&&r#   c                    | j                   j                  |d   |d   | j                  d   d   | j                  d   d         rm| j                   j                          d| j                  d   d<   |d   | j                  d   d   d	<   |d   | j                  d   d   d
<   | j	                  d       | j
                  j                  j                  d       y)zhNorth arrow drawing.

        Also, opens Appearance page of nviz notebook (needs refactoring).
        r   r   rZ   r^   r  Tr2  r  r   r   Fr   N)r   SetArrowr   r>  r   rb   rT   SetPage)r!   r   s     r"   r  zGLWindow.SetDrawArrow  s    
 ==!!FFOOG$V,OOG$W-	
 MM##%/3DOOG$V,8;ADOOG$Z058;ADOOG$Z05LL 			|,r#   c                    t        | j                  d         dk(  r_| j                  d   j                  | j                  j	                  d      d          | j                         | j                  d   d   d<   n^| j                  d   j                  t        j                  | j                  d   d                | j                  d   d   dxx   dz  cc<   | j                  j                  | j                  d   d   d   |d   |d   | j                  d   d   d   | j                  d   d   d         }|ra| j                  j                          |d   | j                  d   d   d	   d
<   |d   | j                  d   d   d	   d<   | j                  d       | j                  j                  j                  d       y)z'Add scale bar, sets properties and drawr]   r   r[   r^   rN   r   r   r  r  r   r   Fr   N)r  r   r  r   r   r   r   r   r   SetScalebarr?  r   rb   rT   rI  )r!   r   rets      r"   r  zGLWindow.SetDrawScalebar   s   tz*+q0OOJ'..  44*4EjQ 6:5L5L5NDOOJ'*62OOJ'..dooj9"=> OOJ'+D1Q61mm''OOJ'+D1FFOOJ'+F3OOJ'+G4
 MM&&(?B1vDOOJ'+J7<?B1vDOOJ'+J7<LL		|,r#   c                     | j                   j                  |d      }| j                   j                  |d      }|sy|j                  dk(  r	d|d   vryy|j                  dk(  rd|d   d	   vrd|d   d
   vryy)zQCheck if layer (item) is already loaded

        :param item: layer item
        r(  r)  rT   r   r*  r  r+  r-  r.  pointsr   )ra   r5  r\   )r!   r  r<  r  s       r"   IsLoadedzGLWindow.IsLoaded  s    
 		&&t&<yy%%d%7::!tI.  ZZ8#Xw 77DN8$<<r#   c                    |r|j                         r| j                  j                  |d      }|dk(  r| j                  j                  |      }P|j	                         r|dvr| j                  j                  |      }|j                  |       | j                  j                  |      }|r|j                         ryyyy)z%Return get list of enabled map layersr\   r)  r@   )r*  r-  r  N)IsOkra   r5  GetNextItem	IsCheckedr  )r!   r  litemsr\   s       r"   _GetDataLayerszGLWindow._GetDataLayers3  s     tyy{99))$F);Dwyy,,T2>>#t3T'Tyy,,T2MM$99((.D tyy{d{dr#   c                 F   | j                   syg }| j                   j                  | j                   j                        d   }| j                  ||       t	        j
                         }t        |      dkD  rL|j                         }| j                   j                  |d      }|| j                  v rKd| j                   j                  |d      j                  v ry	 |dk(  r| j                  |       n|dk(  r| j                  |       n|d	k(  r| j                   j                  |d      }t	        j                  |j                               }|d
   dkD  r| j                  |d       |d   |d   z   dkD  r| j                  |d       |d   r!|d   |d   z   dkD  r| j                  |d       t        |      dkD  rLt	        j
                         }t'        j(                  dd||z
  z         y# t         $ r!}t#        | |j$                         Y d}~fd}~w Y mxY w)zZLoad raster/vector from current layer tree

        .. todo::
            volumes
        Nr   r\   r)   r(  r*  r  r-  rN  TrN  r.  
boundariesFmap3dkernelsfacesrY  r   z$GLWindow.LoadDataLayers(): time = %f)ra   GetFirstChildrootrU  r3  r4  r  r  r5  ru   rL  
LoadRasterLoadRaster3dvector_info_topoGetName
LoadVectorr   r   r>   r   r   )	r!   listOfItemsr  r   r\   r<  vInfor  rA  s	            r"   r0  zGLWindow.LoadDataLayersD  s    yyyy&&tyy~~6q9D+.+"??$D99))$F);Dt{{" dii,,Tz,BGGG8#OOD)[(%%d+X% II224Z2HE!225==?CEh1, T:g|)<<AU;W~5+;eGn+LPQ*QT:1 +"B {{}		!;te|LM  5dAGG44s   CG4 4	H =HH c                 d   | j                   syg }|sD| j                   j                  | j                   j                        d   }| j                  ||       t	        j
                         }d}| j                  dd }|D ]  }||v r| j                   j                  |d      }	 |dk(  r| j                  |       n|dk(  r| j                  |       n|dk(  r| j                   j                  |d	      }	t	        j                  |	j                               }
|
d
   |
d   z   dkD  r| j                  |d       |
d   |
d   z   dkD  s|
d   r| j                  |d        |r;| j                   dkD  r,| j"                  j%                  | j                         }d| _        |r5| j&                  j(                  j+                          | j-                  d       t	        j
                         }t/        j0                  dd||z
  z         y# t        $ r"}t        | |j                         Y d}~d}~ww xY w)z|Unload any layers that have been deleted from layer tree

        :param bool force: True to unload all data layers
        Nr   Fr\   r)  r*  r  r-  r(  rN  	centroidsTrX  r.  rY  rZ  rY  rN   r   z&GLWindow.UnloadDataLayers(): time = %f)ra   r]  r^  rU  r3  r4  ru   r5  UnloadRasterUnloadRaster3dra  rb  UnloadVectorr   r   r>   rw   r   UnloadSurfacerb   rT   r6  r"  r   r   )r!   r   rd  r  r   r  	layersTmpr<  ltyper(  re  r  rL  rA  s                 r"   r   zGLWindow.UnloadDataLayersx  s   
 yy99**499>>:1=Dk2KKN	 	5E#II**5f*=E5H$%%e,k)''.h&#yy55e5LH!2283C3C3EFEh%*<<A))%)=g|)<<AU7^))%)>	5( T[[1_----dkk:CDKIINN))+OOD!{{}		!=NO  5dAGG445s   #B:H	H/H**H/c                     i |d   d<   t               |d   d   d<   t               |d   d   d<   | j                  d      D ]6  }|d   d   d   j                  |       |d   d   d   j                  d       8 y)z Set reference surfaces of vectorr   r+  r>   r2  r*  TN)rt   r:  r  )r!   r  rL  s      r"   SetVectorSurfacezGLWindow.SetVectorSurface  s    "$VY+/6VY(*.&VY'&&x0 	9DL#G,33D9L#F+2248	9r#   c                 8   | j                   j                  |d      }|d   dk7  ry|dd D ]]  }	 |j                  d      \  }}|dk(  sd	|vr&d	j	                  t        t        t        |               }||d
   d   d<   ||d   d   d<   _ y# t        $ r Y lw xY w)zqSet 3D view properties from cmd (d.vect)

        :param item: Layer Tree item
        :param nviz: data
        rX  r)  r   zd.vectNr   =r  :r.  r>   rN  )ra   r5  split
ValueErrorjoinmapstrr   )r!   r  r  rX  optrA   r>   s          r"   SetVectorFromCmdzGLWindow.SetVectorFromCmd  s     ii$$Tu$5q6Xqr7 		9C YYs^
U g~e#HHSgen%=>E27Wg&w/38Xw'0		9  s   B	BBc                    |dk7  rE| j                   j                  |d      j                  }| j                   j                  |d      }n|}| j                  |   }|s.|dk7  r;| j                   j	                  |di        | j                   j                  |d      }|dk(  r| j
                  j                         ||<   nk|dk(  r|| j
                  j                  | j                  j                               |d<   | j                  ||d          | j                  |d   d	          | j                  |d   d
          n|dk(  r| j
                  j                         ||<   n|dk(  r| j
                  j                         |d<   n|dk(  r"|d   s| j
                  j                         |d<   |dk(  rk|d   d
   s!| j
                  j                  |d   d
          |d   d	   s:| j
                  j                  |d   d	   | j                  j                                |j!                         D ]  }||   j!                         D ]  }|dk(  rd||   |   d<   t#        ||   |   t$              r/||   |   j!                         D ]  }|dvsd||   |   |   d<    Yt#        ||   |   t&              spt)        t+        ||   |               D ]1  }	||   |   |	   j!                         D ]  }d||   |   |	   |   d<    3   t-        |      }
t/        j0                  | |
       |dkD  r6|dv r|dd||   d<   |S |dk(  r|dd|d   |   d<   |S |dk(  r|dd||   d<   |S )a  Set map object properties

        Properties must be afterwards updated by
        UpdateMapObjProperties().

        :param item: layer item
        :param id: nviz layer id (or -1)
        :param nvizType: nviz data type (surface, points, vector)
        constantr(  r)  rT   )rA   r>   r*  r-  )longDimrN  r.  r  r+  r  Nr  )allrn   r   r  r   r*  r  F)r   rn   r  )ra   r5  r\   rv   SetLayerInfor   SetSurfaceDefaultPropSetVectorDefaultPropr   rE  ry  ro  SetVolumeDefaultPropSetConstantDefaultPropSetVectorLinesDefaultPropSetVectorPointsDefaultPropkeys
isinstancedictrt   r  r  r  r~   r  )r!   r  r   nvizTypemapTyper  secsec1sec2r  r   s              r"   SetMapObjPropertieszGLWindow.SetMapObjProperties  s    z!ii,,Tz,BGGG99))$F);DG>>$'D:%		&&tr&Byy--d-?("!%!1!1!G!G!IXH$!%!1!1!F!F MM446 "G "X %%dDN;%%d8nX&>?%%d8nW&=>K'!%!1!1!F!F!HXJ&#'#3#3#J#J#LZ  ("I&*&6&6&L&L&NDO("H~g.$$>>tH~g?VWH~h/$$??Xx0$--2J2J2L yy{ J INN, JDz)48S	$1 !$s)D/48$(IdO$8$8$: GD#+@@BFS	$ 5h ?G $DIdOT:!&s49T?';!< JA(,S	$(:(?(?(A JEIS	$ 24 8 BJJJJ 'D1ELLu% 61124e+DXx(  H$<>5NXx(2  J&24e+DXx(r#   c                 $    | j                  |      S )zRLoad 2d raster map and set surface attributes

        :param layer: item
        _loadRasterr!   r  s     r"   r_  zGLWindow.LoadRaster      
 %%r#   c                 $    | j                  |      S )zRLoad 3d raster map and set surface attributes

        :param layer: item
        r  r  s     r"   r`  zGLWindow.LoadRaster3d   r  r#   c           	      ~   | j                   j                  |d      }|j                  dvry|j                  dk(  r>| j                  j	                  t        |j                        dd      }d}t        d      }nO|j                  dk(  r>| j                  j                  t        |j                        dd      }d	}t        d
      }nd}|dk  rv|j                  dv r7| j                  j                  d|j                  dt        d             n1| j                  j                  t        d      |j                  z         | j                  j                  |       | j                  ||      }t        |      }t        j                   | |       t#        | j$                  d      r|| j                   j'                  dd      k(  rs| j$                  j(                  }|j                  dk(  rN|j+                  |j,                  d   d   d         }	|	j/                  | j1                  |j                               |S )zQLoad 2d/3d raster map and set its attributes

        :param layer: item
        r(  r)  r~  Nr*  r+  zLoading raster mapr  r  zLoading 3d raster maprN   r    <> failedzUnsupported layer type '%s'r  rT   FTr%  r-  r.  )ra   r5  r\   r   LoadSurfacerw  rL  r   
LoadVolumer   
WriteErrorru   r  r  r  r~   r  r2  rb   r4  rT   r7  r8  r9  r:  )
r!   r  r<  r   r  errorMsgr  r   r   r8  s
             r"   r  zGLWindow._loadRaster'  s   
 		&&t&<::44::!**3uzz?D$GB H-.HZZ;&))#ejj/4FBH01HB6zz44##Hejj!H+$VW##A&C$Duzz$QR4  ''b(; #-
T5! 499f%$$))2L2LT 3M 3
 +
 iinnGzzX%,,W[[-B7-KI-VWT//

;<
 	r#   c                     t        | j                        }	 | j                  d   d   d   d   dz   }t               }| j                  j	                  |       | j                  |dd      }| j                  ||       |S # t        $ r d}Y Zw xY w)zCreate new constantrN   r{  r  rL  r   )r  r   r  )r  rv   
IndexErrorr  r  r  AddConstant)r!   indexrL  r  s       r"   NewConstantzGLWindow.NewConstantY  s    DNN#	>>"%j1(;FCaGD vd#''UrJ'Ot$  	D	s   A? ?BBc                     | j                   j                  |d   d   |d   d         }| j                   j                  ||d   d   |d   d          ||dd|d   d<   y	)
zAdd new constantr{  r>   r  )r>   r  
resolutionF)r   rL  rn   r  N)r   r  SetSurfaceRes)r!   r  rL  r   s       r"   r  zGLWindow.AddConstantf  s{    ]]&&z"7+4
3CG3L ' 
 	##Z .Z0@0N	
 -/e%LZ"r#   c                     | j                   |   d   d   d   }| j                  j                  |       | j                   |= y)zDelete constant layerr{  r  r   N)rv   r   rk  )r!   r  r   s      r"   DeleteConstantzGLWindow.DeleteConstantp  s=    ^^E":.x8>##B'NN5!r#   c                    t        | j                  j                               D ]  }||k(  rY| j                  j                  |       d| j                  |   d<   | j                  j                  | j                  |   d          a| j                  j                  |       	 d| j                  |   d<    y# t        $ r Y w xY w)zSelect cutting planeTr
  shadingFN)r  r   r  SelectCPlanerx   SetFenceColorUnselectCPlaner  )r!   r  planes      r"   r  zGLWindow.SelectCPlanev  s    4==88:; 
	E~**51,0U#D)++DLL,?	,JK,,U305DLL'-
	 " s   !B66	CCc                 P    | j                  |j                  |j                         y)Change cutting plane settingsN)UpdateCPlanecurrentr  r  s     r"   r   zGLWindow.OnUpdateCPlane  s    %--6r#   c                    |D ]  }|dk(  rC| j                   j                  d| j                  |   d   d   | j                  |   d   d          |dk(  rV| j                   j                  | j                  |   d   d   | j                  |   d   d   | j                  |   d   d          |d	k(  s| j                   j	                  | j                  |   d	           y
)r  r  r   tiltrotr  r   r   r  r  N)r   SetCPlaneRotationrx   SetCPlaneTranslationr  )r!   r  changeseachs       r"   r  zGLWindow.UpdateCPlane  s     	LDz!//LL'
3F;LL'
3E:
 z!22LL'
3C8LL'
3C8LL'
3C8
 y ++DLL,?	,JK	Lr#   c                 $    | j                  |      S )z9Unload 2d raster map

        :param layer: item
        _unloadRasterr  s     r"   rh  zGLWindow.UnloadRaster      
 !!$''r#   c                 $    | j                  |      S )z9Unload 3d raster map

        :param layer: item
        r  r  s     r"   ri  zGLWindow.UnloadRaster3d  r  r#   c           	      \   | j                   j                  |d      }|j                  dvry| j                   j                  |d      }|j                  dk(  r/d}| j                  j                  }t        d      }t        d	      }n.d
}| j                  j                  }t        d      }t        d      }	 ||   d   d   } ||      dk(  r,| j                  j                  |d|j                  d       n6| j                  j                  |d|j                  dt        d             ||   j                  d       | j                  j                  |       t        | j                   d      r)| j                   j"                  }	|j                  dk(  r|	j%                  |	j&                  d   d   d         }
|
j)                  | j+                  |j                               |	j%                  |	j&                  d   d         }
|
j-                  d       |j                  dk(  r2|	j%                  |	j&                  d
   d         }
|
j-                  d       |j                  dk(  r3|	j%                  |	j&                  d   d         }
|
j-                  d       yyy# t        $ r Y yw xY w)zAUnload 2d/3d raster map

        :param item: layer item
        r(  r)  r~  NrT   r*  r+  zUnable to unload raster mapz
Raster mapr  zUnable to unload 3d raster mapz3d raster mapr  r   r   r  >r  zunloaded successfullyr-  r.  rv  r  r  )ra   r5  r\   r   rk  r   UnloadVolumeKeyErrorr   r  rL  r	  r  ru   rP  r2  rb   rT   r7  r8  r9  r:  r  )r!   r  r<  r  r  unloadFnr  
successMsgr   r   r8  s              r"   r  zGLWindow._unloadRaster  sK   
 		&&t&<::44yy%%d%7::! H}}22H67H<JH}}11H9:H?+J	h)$/B B<1HHXuzz BCHH *EJJ:Q8RS 	X8$4  499f%iinnGzzX%,,W[[-B7-KI-VWT//

;<,,W[[-CE-JKR zz[(,,W[[-B5-IJR zzX%,,W[[-B5-IJR  & &  		s   7J 	J+*J+c                 (   | j                   j                  |d      }|j                  dk7  ry|)| j                  |dd       | j                  |dd       d}n-|r| j                  |dd       d	}n| j                  |dd       d
}d}|D ]  }|dk(  r7| j                  j                  t        |j                               d      \  }}n6| j                  j                  t        |j                               d      \  }}|dk  r4| j                  j                  t        d      |j                  |dz         | j                  |||        dkD  r|| _        |r| j                  j                  |       | j                   j                  |d      }	t        |	      }
t!        j"                  | |
       t%        | j&                  d      rG|| j                   j)                  dd      k(  r'| j&                  j*                  }|j-                  d       |S )zLoad 2D or 3D vector map overlay

        :param item: layer item
        :param points: True to load points, False to load lines, None
                       to load both
        :param bool append: append vector to layer list
        r(  r)  r-  NrN   r.  rN  rN  r.  rX  r.  FTr   z/Loading vector map <%(name)s> (%(type)s) failedrL  r\   rT   r  r%  )ra   r5  r\   r  r   rc  rw  rb  r   r  r   rL  rw   ru   r  r  r~   r  r2  rb   r4  rT   r3  )r!   r  rN  r  r<  vecTypesr   vecTyperw   r  r   r   s               r"   rc  zGLWindow.LoadVector  s    		&&t&<::! >$$T2w7$$T2x8*H$$T2x8"H$$T2w7!H 	8G'!!]]55c%--/6JER
F!]]55c%--/6JDQ
FAv##GH$zz7;<
 $$T2w7	8 A: DKKKt$ yy%%d%7"-
T5! 499f%$$))2L2LT 3M 3
 +
 iinnGx( 	r#   c                    | j                   j                  |d      }| j                   j                  |d      d   }|d}n|rd}nd}|D ]  }d	||   vr||   d	   d
   }|dk(  r| j                  j                  |d      }	n| j                  j                  |d      }	|	dk(  r5| j                  j                  t        d      |j                  |dz         n4| j                  j                  t        d      |j                  |dz         ||   j                  d	        |r+|| j                  v r| j                  j                  |       yyy)zUnload vector map overlay

        :param item: layer item
        :param points, lines: True to unload given feature type
        :param remove: remove layer from list
        :type remove: bool
        r(  r)  rT   r-  Nr  rX  r  r  r   r.  FTr   z1Unable to unload vector map <%(name)s> (%(type)s)r  z6Vector map <%(name)s> (%(type)s) unloaded successfully)ra   r5  r   rj  r   r  r   rL  r	  r  ru   rP  )
r!   r  rN  rP  r<  r  r  r  r   rL  s
             r"   rj  zGLWindow.UnloadVector  sW    		&&t&<yy%%d%7A >*H"H!H 	(GtG},gx(.B'!mm00U;mm00T:ax##IJ$zz7;<
 !!NO$zz7;<
 Mh'+	(. ddkk)KKt$ *6r#   c                 R   | j                   j                         \  }| j                  d   d<   | j                  d   d<   | j                  d   d<   d| j                  d   d<   t        j                         rlt
        j                  dz  d	z  t        j                  t        j                         d
   t        j                         d   z   dz        z  | j                  d   d<   t        || j                  d   d   z        | j                  d   d<   t        j                  ddd      | j                  d   d<   t        j                  ddd      }|| j                  d   d   k  r&| j                  d   d   dz  | j                  d   d<   nt| j                  d   d   dk  rM| j                  d   d   dk(  rd| j                  d   d<   d| j                  d   d   z  | j                  d   d<   n|| j                  d   d<   t        j                  ddd      | j                  d   d<   t        j                  ddd      | j                  d   d<   t        j                  ddd      | j                  d   d<   t        j                  ddd      | j                  d   d<   | j                   j                          d| j                  d<   | j                   j                          | j                  d   }| j                   j                         \  |d<   |d<   |d <   | j!                          y)!zReset to default viewr  r>   minmaxr   r$  r%  r  i6a r  r  r5   rT   rU   )r$  r  r?   )r$  r  r   r   )r  r   r  r   )r  r   r   )r  r>   r  )r  r>   r  Nr  r  r  )r   SetViewDefaultr   r3  locn_is_latlongr~  picosr  roundrU   r   rg   r*  LookAtCenterr  r  )r!   zexagOriginalzexagMaxr  s       r"   r1  zGLWindow.ResetViewL  s    MM((*	
JJx )JJx 'JJx '
 +,

8Y'  " ((ELLN3/%,,.2EEJKL JJx + (-DJJx0;;(
		(G$ &2%5%5f->&
		(E"  ##&fEVWtyy*733)-8)<W)E)IDIIh&YYx )A-yy"7+q0/0		(#G,)+dii.A'.J)JDIIh&)1DIIh&%1%5%5f->&
		*c" &2%5%5f->&
		*c" '3&6&6f-?'
		'7# '3&6&6f-?'
		'7# 	##%!%

:""$

7#-1]]-C-C-E*c
E#Jc
r#   c                    |j                   }d|v r-	 |d   d   d   }| j                  ||d          d|d   d   d<   yd|v r,|d   d   d   }| j                  ||d          d|d   d   d<   yd|v r,|d   d   d   }| j	                  ||d          d|d   d   d<   yd	|v rEd
D ]?  }d|d	   |   v s|d	   |   d   d   }| j                  ||d	   |       d|d	   |   d   d<   A yy# t        $ r Y yw xY w)z.Generic method to update data layer propertiesr+  r  r   NTrn   r{  r  r-  )r.  rN  )r  r  UpdateSurfacePropertiesUpdateConstantPropertiesUpdateVolumePropertiesUpdateVectorProperties)r!   r   r  r   r\   s        r"   r   zGLWindow.UpdateMapObjProperties  sd   zz)_X.t4 ((T)_=04DOH%f-4j!(+D1B))"d:.>?15DX&v.h)$/B''DN;/3DN8$V,+ BtH~d33h-h7=B//DNDI=ADN4(26:B %  s   C( (	C43C4c                 X   | j                   j                  |d|d          | j                   j                  |d|d          | j                   j                  ||d   |d          |d   dk(  r| j                   j	                  |       y	| j                   j                  |d|d          y	)
$Update surface map object propertiesFr  )r   rv  r>   r>   r  transpr   )rv  r>   N)r   SetSurfaceColorSetSurfaceTopor  UnsetSurfaceTranspSetSurfaceTransp)r!   r   r  s      r"   r  z!GLWindow.UpdateConstantProperties  s    %%d7m%L$$T']$K##B\(:D<NO>QMM,,R0MM**25X*Or#   c                 (   dD ]s  }||d   vs
d|d   |   vr|d   |   d   }|d   |   d   }|D|dk(  r| j                   j                  |       n|dk(  r| j                   j                  |       nt        |t              r,t        |      d	k(  r|rt        j                  |d
      d   s|dk(  r'| j                   j                  ||t	        |             n|dk(  r'| j                   j                  |dt	        |             nW|dk(  r'| j                   j                  ||t	        |             n+|dk(  r&| j                   j                  ||t	        |             |d   |   j                  d       v d|d   d   v rp|d   d   d   }|d   d   d   }|d   d   r| j                   j                  d||       n| j                   j                  |||       |d   d   j                  d       d|d   d   v r|d   d   d   d	k  rL| j                  j                  |d   d   d   d   |d   d   d   d   |d   d   d   d   d      |d   d   d<   |d   d   d   }|d   d   r| j                   j!                  d|       n| j                   j!                  ||       |d   d   j                  d       d|d   d   v ru|d   d   d   }	|d   d   r&| j                   j#                  dt	        |	             n%| j                   j#                  |t	        |	             |d   d   j                  d       d|d   v rJ|d   d   }
|d   d   }|d   d    }| j                   j%                  ||
||       |d   j                  d       d|d   d<   y)!r  )r  maskr  shine	attributer  rv  r>   Nr  r  r   cellelementfullnamer  Fr  drawr  coarsefiner}  rN   r   descstyler  T)r   r  shadestring
wire-colorr  r   r   r  )r   UnsetSurfaceMaskr  r  rw  r  r3  	find_filer  SetSurfaceMaskr  SetSurfaceShiner  r  r   GetDrawModeSetSurfaceStyleSetWireColorSetSurfacePosition)r!   r   r  attrbrv  r>   r  r  r  r  r   r   r  s                r"   r  z GLWindow.UpdateSurfaceProperties  s    : "	3ET+..4#4U#;;{#E*51C%e,W5E{F? MM2226h&MM44R8eS)5zQ 5??5&#I*#U G#MM11"c3u:Ff_ MM00UCJGh&MM222sCJGg%MM11"c3u:Fe$((2E"	3J tF|L11&\,/9F<-f5DF|E"++Bf=++Bf=L&**84 tF|F++F|F#G,q0040@0@0L0Lff-f5f=v,v.v6w?v,v.v6yA	 1M 1VV$W- L(1EF|E"--b%8--b%8L $$X. tF|L11L.w7EF|E"**2s5z:**2s5z:L&**84 tJ''Z %AZ %AZ %AMM,,RAq9  *#VUr#   c                    d|d   d   v rv|d   d   d   dk(  r)| j                   j                  ||d   d   d   d          n(| j                   j                  ||d   d   d   d          |d   d   j                  d       d|d   d	   v r|d   d   d   dk(  rb|d   d	   d   d   dk  r| j                  j                  |d   d	   d   d
      x}|d   d	   d   d<   | j                   j                  ||       na|d   d	   d   d   dk  rP| j                  j                  |d   d	   d   d
      x}|d   d	   d   d<   | j                   j                  ||       |d   d	   j                  d       d}|d   D ]  }| j                   j                  |d|       dD ]  }||vsd||   vr||   d   }||   d   }|t|dk(  r)| j                   j                  |||t        |             n5|dk(  r| j                   j                  ||       n|dk(  r| j                   j                  ||       nt        |t              r,t        |      dk(  r|rt        j                   |d      d   s|dk(  r(| j                   j#                  |||t        |             n|dk(  r(| j                   j%                  ||d
t        |             nY|dk(  r(| j                   j'                  |||t        |             n,|dk(  r'| j                   j)                  |||t        |             ||   j                  d        |dz  } d}	|d   D ]  }
| j                   j+                  ||	      }d|
d   v rQ|
d   }| j                   j-                  ||	|d   |d   |d   |d   |d   |d    |d!   	      }|
d   j                  d       d|
d   v r%|
d   d   }| j                   j/                  ||	|       |	dz  }	 d|d   v rSd"|d   v rK|d   d"   }|d   d#   }|d   d$   }| j                   j1                  ||||       |d   j                  d       yyy)%z6Update volume (isosurface/slice) map object propertiesr  r  r  r   r>   r   
isosurfaceslicer  F)r  r  )
isosurf_id)topor  r  r  r  rv  Nr  r  r  grid3r  r  r  r  r   )slice_idr  r  r  r  r  r  r  axisr   r   r  )r   SetIsosurfaceResSetSliceResr  r   r  SetIsosurfaceModeSetSliceModeAddIsosurfaceSetIsosurfaceToporw  UnsetIsosurfaceMaskUnsetIsosurfaceTranspr  r  r3  r  SetIsosurfaceColorSetIsosurfaceMaskSetIsosurfaceTranspSetIsosurfaceShineAddSliceSetSlicePositionSetSliceTranspSetVolumePosition)r!   r   r  	isosurfIdr   isosurfr  rv  r>   sliceIdr  rL  r   trr   r   r  s                    r"   r  zGLWindow.UpdateVolumeProperties  s   tF|L11F|F#G,1..V\2<@I ))V\27;GD L&**84tF|I..F|F#G,1L+L9'BQF ((44"6l95lCE 5 D4<	2<@
 MM33B=<	*73G<q@ ((44"6l95g>u 5 D4<	27;
 MM..r48L#''1
 	L) *	GMM''A)'DE '-'875>+IenU+w/;77IsCPUJW& 99"iH(*;;B	J!%-u:?$$)OOE7$KJ$W$'88YSQVZX& 77	5#e* (*99	3E
 ')88YSQVZX""8,O'-P NIU*	\ '] 	E--((g(>C5,,J'mm44IIIIIIK
 j!%%h/5?*8_W-,,R"=qLG)	. tJ''C4
3C,CZ %AZ %AZ %AMM++B1a8  * -D'r#   c                 d    |dk(  r| j                  |||          y| j                  |||          y)zUpdate vector layer properties

        :param id: layer id
        :param data: properties
        :param type: lines/points
        rN  N)UpdateVectorPointsPropertiesUpdateVectorLinesProperties)r!   r   r  r\   s       r"   r  zGLWindow.UpdateVectorPropertiesw  s4     8--b$t*=,,Rd<r#   c                    d|d   v sd|d   v sd|d   v r|d   d   }|d   d   }|d   d   dk(  rd}d	|d   v r|d   j                  d	       nd
}| j                  j                  ||||       d|d   v r|d   j                  d       d|d   v r|d   j                  d       d|d   v r6| j                  j                  ||d   d          |d   j                  d       d|d   v rdx}}d
}|d   d   s|d   d   rf|d   d   r'|d   d   }| j                  j	                  |d      rd}|d   d   r|d   d   }| j                  j                  ||d   d   |||       n| j                  j                  |       |d   j                  d       d	|d   v rd|d   v rt        t        |d   d	   d               D ]v  }dD ]o  }| j                  ||d   d	   d   |         }	|	dkD  s(|d   d	   d   |   r| j                  j                  ||	       n| j                  j                  ||	        v x d|d   v r|d   j                  d       yy)z(Update vector line map object propertiesr  r  r  r   r>   r\   3dTr+  Fr  thematicNusecolorusewidth	rgbcolumnr.  r   r\   
sizecolumnr<  )r   r<  r  
colorTabler  r   r*  r{  r\   rL  rN   r2  )r  r   SetVectorLineModeSetVectorLineHeightCheckColorTableSetLinesStyleThematicUnsetLinesStyleThematicr  r  
GetLayerIdSetVectorLineSurfaceUnsetVectorLineSurface)
r!   r   r  r  r  use_3Dr!  r  r\   r  s
             r"   r  z$GLWindow.UpdateVectorLinesProperties  s    W%4=(4<'M'*EM'*EF|F#t+V,L$$Y/MM++BufE4=(W!!(+4=(W!!(+ tH~%MM--b$x.2IJNx( tJ''  EEJJ
+tJ/?
/K
#J/ ,[9E}}444I%)

#J/ ,\:E33z*73) 4  555<  *V$T&\)Ac$v,y"9'"BCD 
2 	D//!VY(?(H(N * C Rx<	26:4@ MM>>r3G MM@@SI	
 tF|#LX& $r#   c           	      |   d|d   v sd|d   v sd|d   v sd|d   v r| j                   j                  ||d   d   |d   d   t        |d   d         |d   d   dz         }d}|d	k(  rt        d
      |z  }n|dk(  rt        d      |z  }|rt	        t        d      |z        dD ]  }d||   v s||   j                  d         d|d   v r6| j                   j                  ||d   d          |d   j                  d       d|d   v rdx}}d}|d   d   s|d   d   rf|d   d   r'|d   d   }| j                   j                  |d      rd}|d   d   r|d   d   }| j                   j                  ||d   d   |||       n| j                   j                  |       |d   j                  d       d|d   v r |d   j                  dd      r| j                   j                  |d       nd|d   v r| j                   j                  |d       t        t        |d   d   d               D ]v  }	dD ]o  }
| j                  |
|d   d   d   |	          }|d	kD  s(|d   d   d!   |	   r| j                   j                  ||       n| j                   j!                  ||        v x |d   j                  d       yy)"z)Update vector point map object propertiesr  r^   r  markerr  r>   r   NrN   z&Vector point layer not found (id = %d)r  z-Unable to set data layer properties (id = %d)z)Setting data layer properties failed.

%s)r^   r  r/  r  r  r  Fr  usesizer  rN  r  Tr   r<  )r   r<  r  r!  r^   r"  r   r  r+  r#  r$  r2  )r   SetVectorPointModer   r   r   r  SetVectorPointHeightr'  SetPointsStyleThematicUnsetPointsStyleThematicgetSetVectorPointZModer  r  r*  SetVectorPointSurfaceUnsetVectorPointSurface)r!   r   r  rL  errorpropr  r^   r!  r  r\   r  s               r"   r  z%GLWindow.UpdateVectorPointsProperties  sA    V$4=(4>)4=(--22Wg&Wg&d6l7+,Xw'!+C EbyBCbHIJRO CDuL  = -tDz)JNN8,-
 tH~%MM..r4>'3JKNx( tJ''EDJJ
+tJ/?	/J
#J/ ,[9E}}444J%)

#I.
+L9D44z*73) 5  66"6=  * tF|#F|e,11"d;d6l*11"e<!#d6l9&=g&F"GH 
"D 6 	""oo!%DL,CG,LT,R .  8#F|I6v>tD $ C CB L $ E Eb# N!	"
" LX&! $r#   c                 Z   g }|dk(  rB| j                   D ]1  }|j                  t        d      t        |d   d   d         z          3 |S | j                  D ]R  }| j
                  j                  |d      }||j                         k7  r4|j                  |j                                T |S )z,Return list of map layer names of given typer{  	constant#r  rL  r(  r)  )	rv   r  r   rw  ru   ra   r5  r  rb  )r!   r\   	layerNamer  r  s        r"   r:  zGLWindow.GetLayerNames	  s    	:   kNSj)9()CF)K%LL   59911$J1G8++--  !1!1!345 r#   c                 Z   t        |      dk  ry|dk(  rA| j                  D ]2  }t        d      t        |d   d   d         z   |k(  s'|d   d   d   c S  | j                  D ]  }| j
                  j                  |d	      }||j                         k7  s||j                         k7  rG| j
                  j                  |d
	      }	 |dk(  r|d   d   d   c S |dk(  r*|dk(  r|d   d   d   d   c S |dk(  r"|d   d   d   d   c S |dk(  r|d   d   d   c S  y# t        $ r Y  yw xY w)zGet layer object id or -1r   rN   r{  r<  r  rL  r   r(  r)  rT   r*  r+  r-  vpointrN  vliner.  r  r  )
r  rv   r   rw  ru   ra   r5  r  rb  r  )r!   r\   rL  vsubtypr  r  r  s          r"   r*  zGLWindow.GetLayerId&	  sq   t9q=: <[>CZ(8(B6(J$KKtS
+H5d;;< KK 	Dyy--d
-CHx''))TX5E5E5G-G99))$F);D8#	?84T::X%(*#H~h7A$GG G+#H~g6x@FF[(>(3D99!	&   s$   DD3DD	D*)D*c                 `   | j                   D ]  }| j                  j                  |d      }| j                  j                  |d      }| j                  j                  |d      }|dk(  r| j                  j	                  |d          |dk(  st        j                  |j                               }|d   |d	   z   d
kD  r:| j                  j                  |d   d   | j                  j                                |d   |d   z   d
kD  s| j                  j                  |d   d          ! y)zKDelete nviz data of all loaded layers and reload them from current settingsr\   r)  r(  rT   r*  r+  r-  rN  rg  r   r.  rY  N)ru   ra   r5  r   r  r3  ra  rb  r  r   rE  r  )r!   r  r\   r<  r  re  s         r"   ReloadLayersDatazGLWindow.ReloadLayersDataE	  s   KK 	XD99))$F);DII**4Z*@E99))$F);Dx  66tIGx..u}}?(OeK&88A=$$??Xx0$--2J2J2L 'NU<%88A=$$>>tH~g?VW	Xr#   c                    d}g }g }g }| j                   D ]  }| j                  j                  |d      dk(  r|j                  |       5| j                  j                  |d      dk(  r|j                  |       g| j                  j                  |d      dk(  s|j                  |        | j                  r:d}| j                  D ]  }|d|d	   d
   z  z  } |j                  d      dz   }||z  }|rVd}|D ]3  }|d| j                  j                  |d      j                         z  z  }5 |j                  d      dz   }||z  }d}d}	d}
d}d}d}d}| j                  j                  |d   d      d   d   }|D ]-  }| j                  j                  |d      d   d   }||k7  s,d}/ ||z  }|D ]  }| j                  j                  |d      d   d   }|d|d   d   d   z  z  }|	d|d   d   z  z  }	|
d|d   d    z  z  }
|d|d   d   d!   z  z  }|d|d   d   d"   z  z  }|d|d#   d
   z  z  } | j                  D ]2  }|d$z  }|	d|d	   d   z  z  }	|
d|d	   d   z  z  }
|d%z  }|d&z  }|d'z  }4 g }||	|
|||fD ]D  }|r'|j                  |j                  d(      d   dz          ,|j                  d      dz   }||z  }F |rz||d   z  }d|d   v r	||d)   z  }n'd |d   v r	||d*   z  }nd+|d   v r||d*   z  }||d)   z  }d,|d-   v r||d-   z  }d.|d/   v r||d/   z  }d |d   v sd+|d   v rd.|d-   v r||d0   z  }d1}d2}|D ]  }| j                  j                  |d      d   d3   }d4|vr2|d| j                  j                  |d      j                         z  z  }\|d4   d5   r|d|d4   d
   z  z  }s|d|d4   d
   z  z  } | j                  D ]  }|d|d	   d4   z  z  } |j                  d6      d)   r||j                  d      dz   z  }|j                  d6      d)   r||j                  d      dz   z  }|d7z  }|rdx}x}x}x}x}x}x}x}x}x}x}x}} g d8}!|D ]  }"| j                  j                  |"d      j                         }#t        j                  |#      }$| j                  j                  |"d      d   }|$d9   |$d:   z   dkD  r|d| j                  j                  |"d      j                         z  z  }|d|d9   d;   d
   z  z  }|d|d9   d<   d
   z  z  }|d|d9   d4   d
   z  z  }|d|d9   d   d   z  z  }|d=|d9   d<   d
   z  z  }|$d>   |$d?   z   dkD  s|d| j                  j                  |"d      j                         z  z  }|d|d>   d;   d
   z  z  }|d|d>   d@   d
   z  z  }|d|d>   d4   d
   z  z  }|d|!|d>   dA   d
      z  z  }|d=|d>   d<   d
   z  z  }| dBz  }  |r|dC|j                  d(      z   dz   z  }|dD|j                  d(      z   dz   z  }|dE|j                  d(      z   dz   z  }|dF|j                  d(      z   dz   z  }|dG|j                  d(      z   dz   z  }|dH|j                  d(      z   dz   z  }|r|dI|j                  d(      z   dz   z  }|dJ|j                  d(      z   dz   z  }|dK|j                  d(      z   dz   z  }|dL|j                  d(      z   dz   z  }|dM|j                  d(      z   dz   z  }|dN|j                  d(      z   dz   z  }|dO| j                  d(      z   dz   z  }|d7z  }|rdx}%x}&x}'x}(})dx}*x}+x},}-dx}.x}/}0t        |      D ]T  \  }1}2| j                  j                  |2d      dP   }|%d| j                  j                  |2d      j                         z  z  }%|&d|d   d!   dQ   d   z  z  }&|'d|d   d   dQ   d
   z  z  }'|dR   r|(dS|dR   dT   |dR   dU   |dR   dV   fz  z  }(|dQ   D ]f  }3|3dW   d
   }4|)dX|1d)z   |4fz  z  })|3d4   d5   r|*d|3d4   d
   z  z  }*n|+d|3d4   d
   z  z  }+dY|3v sB|3dY   d5   r|,d|3dY   d
   z  z  },Y|-d|3dY   d
   z  z  }-h |dZ   D ]=  }5d[|5dR   d\      }6|.dX|1d)z   |6fz  z  }.d]D ]  }7|0d^|5dR   |7   z  z  }0 |/d|5dY   d
   z  z  }/? W |d_|%j                  d(      z   dz   z  }|d`|&j                  d(      z   dz   z  }|da|'j                  d(      z   dz   z  }dR   r|db|(j                  d(      z   dz   z  }|)r|dc|)j                  d(      z   dz   z  }|*r|dd|*j                  d(      z   dz   z  }|+r|de|+j                  d(      z   dz   z  }|,r|df|,j                  d(      z   dz   z  }|-r|dg|-j                  d(      z   dz   z  }|.rN|dh|.j                  d(      z   dz   z  }|di|0j                  d(      z   dz   z  }|dj|/j                  d(      z   dz   z  }| j                  j                  j                  | j                  j                  j                  dk   dl         j                         }8	 t!        |8j                         dm         d)z
  }9|9g do}:|dp|9z  z  }|dq| j&                  |9   dr   ds   z  z  }|dt| j&                  |9   dr   du   z  z  }|dv| j&                  |9   dR   dT   | j&                  |9   dR   dU   | j&                  |9   dR   dV   fz  z  }|dw|:| j&                  |9   d!      z  z  }|d7z  }dx| j(                  dR   dT   | j(                  dR   dU   fz  }|dy| j*                  d<   d
   z  z  }|dz| j(                  d{   d
   z  z  }|d|| j(                  d}   d
   z  z  }|d~| j(                  d   d
   | j*                  d   d   z  z  z  }|d| j*                  d   dT   | j*                  d   dU   | j*                  d   dV   fz  z  }||z  }d| j(                  d   d4   dnd- z  }| j(                  d   d4   dk7  r||z  }|d7z  }d| j,                  dR   dT   | j,                  dR   dU   | j,                  dR   dV   dz  fz  }|d| j,                  d   z  z  }|d| j,                  d   z  z  }|d| j,                  d4   dnd- z  z  }||z  }|d7z  }| j                  j                  };d}<dD ]:  }=|;j                  |;j                  d   |=         j/                         s3|<d|=z  z  }<< |<rd|<j                  d(      z  }|;j                  |;j                  d   d4         j1                         }>|d|>d   |>d)   |>d*   fz  z  }|d|;j                  |;j                  d   d         j1                         z  z  }||z  }|d7z  }| j2                  d   d   rbd| j2                  d   dR   dT   | j2                  d   dR   dU   fz  }|d| j2                  d   d4   z  z  }|d| j2                  d   d@   z  z  }||z  }| j5                         \  }?}@d}|dz  }|d|?|@fz  z  }||z  }|S # t"        t$        f$ r dn}9Y w xY w)z<Generate command for m.nviz.image according to current statezm.nviz.image r\   r)  r*  r  r-  zelevation_value=z%d,r{  r>   z, rW  zelevation_map=z%s,r(  zmode=zresolution_fine=zresolution_coarse=zshading=zstyle=zwire_color=z-a r   rT   r+  r  r  r   r  r  r  r  r  r  r  zfine,zgouraud,zsurface,z0:0:0,,r   r5   bothflatr   wirer   r   z
color_map=zcolor=r  r  rv  rq  z\
)
r   boxspherecubediamonddec_treecon_treeastergyro	histogramr.  rY  r  r  z0,0,%d,rN  rg  r^   r/  z1,1,zvline=zvline_width=zvline_color=zvline_height=zvline_mode=zvline_position=zvpoint=zvpoint_width=zvpoint_color=zvpoint_size=zvpoint_marker=zvpoint_position=zvpoint_layer=r  r  r  z	%d,%d,%d,r   r   r  r  z%d:%s,r  r  r  r  )r  r  r  r  r  r  z%f,zvolume=zvolume_shading=zvolume_resolution=zvolume_position=zisosurf_level=zisosurf_color_map=zisosurf_color_value=zisosurf_transp_map=zisosurf_transp_value=zslice=zslice_position=zslice_transparency=r	  planesrN   N)cleartopbottomblendshadedz
cplane=%d zcplane_rotation=%d r  r  zcplane_tilt=%d r  zcplane_position=%d,%d,%d zcplane_shading=%s zposition=%.2f,%.2f z
height=%d zperspective=%d r  z	twist=%d r  z	zexag=%f r$  r%  zfocus=%d,%d,%d r  zbgcolor=%d:%d:%d 
background)   rY  rY  zlight_position=%.2f,%.2f,%.2f r   zlight_brightness=%d r,  zlight_ambient=%d r-  zlight_color=%d:%d:%d )nwneswser,  z
fringe=%s zfringe_color=%d:%d:%d zfringe_elevation=%d elevrZ   r2  zarrow_position=%d,%d zarrow_color=%s zarrow_size=%d zoutput=nviz_output zformat=ppm zsize=%d,%d )ru   ra   r5  r  rv   striprb  rs  r3  ra  r  rb   rT   r7  r8  GetStringSelectionrf   r  rt  rx   rU   r   rY   rS  GetValuer   r   )Ar!   rX  rastersvectorsvolumesr  subcmdr{  cmdModecmdFine	cmdCoarse
cmdShadingcmdStylecmdWireflag_anvizDataFirstnvizDatar   cmdColorMapcmdColorValcmdLines	cmdLWidth
cmdLHeight	cmdLColorcmdLModecmdLPos	cmdPoints	cmdPWidthcmdPSize	cmdPColor
cmdPMarkercmdPPos	cmdPLayermarkersr-  r=  re  cmdNamecmdShadecmdRescmdPoscmdIsocmdIsoColorMapcmdIsoColorValcmdIsoTrMapcmdIsoTrValcmdSlicecmdSliceTranspcmdSlicePosr  r  isolevelr  r  r  r	  
planeIndexr  
toolWindow	directionr  r  r  r  sA                                                                    r"   NvizCmdCommandzGLWindow.NvizCmdCommandW	  sc   KK 	%Dyy%%d%78Ct$''&'9[Ht$''&'9XEt$	% >>'F NN @%(:"6w"???@\\$'#-F6MC%F Y%$))"8"8:"8"N"V"V"XXXY\\$'#-F6MC G(G,I#JH#GF II2271:62J9UM    9911$F1CINvV H,F  6MC C9911$F1CINvV58F#3F#;F#CCC58L#9&#AAAUXl%;H%EEE	ehv&6v&>y&III
EHV$4V$<W$EEE58L#9'#BBBC  $7"54
#3L#AAAUT*%5l%CCC	j(
J&8#$ D"GY
HgV "KKS 1! 4s :;#\\$/#5F6MC" tAwT!W$47NCa(47NCtAw&47NC47NCT!W$47NCT!W$47NCtAw&&DG*;$q'@Q47NC 'K"K J9911$F1CIN (*		 6 6t 6 L T T VVK  (/#ux/@/I'II#ux/@/I'IIJ  AutJ'7'@@@A  %a({((.44  %a({((.446MC  WYYH YY Y
 Y Y Y Y Y %Y (1Y 4>Y AH)G " ( II226z2JRRT	..y99911&f1EhO'NU<%88A=		 6 6v: 6 N V V XXH '):7)CG)L!LLI%(7*;H*Eg*N"NNJ'):7)CG)L!LLI(9&(A&(I IIHy8G+<X+Fw+OOOG(OeK&88A=		 6 6v: 6 N V V XXI ();G)DW)M!MMI(:6(B7(K KKH();G)DW)M!MMI%'(82DX2Nw2W*X"XXJy8H+=h+G+PPPG'I-(. x(.."55;;~	(<<sBB~	(<<sBB)9)9#)>>DD}x~~c'::S@@(7==+==CCy9??3#77#==)==CC)==CC~s(;;cAA'**:*:3*??#EE)GMM#,>>DD)==CC6MC
 <>>G>h>>&6JLLNL^LkK688H8~&w/ G	69911&f1EhODII226z2JRRTT EHV$4Y$?$Mf$UUU%(6"2<"@"Nw"WWWJ'k ,S1 ,S1 ,S1-  F
 $L1 JCK0Eh!a%77F7|E*&%#g,w2G*GG&%#g,w2G*GG3x=/'53x=3I+IIK'53x=3I+IIKJ &g. GE*5+<V+DEDAE4= 88H!E H#uuZ/@/G'GGH"eeHog.F&FFNG5GB 9w}}S11C77C$x~~c'::S@@C'&,,s*;;cAAC
#)FLL,==CC'&,,s*;;cAA!/.2F2Fs2KKcQQC!1N4H4H4MMPSSSC0;3D3DS3IICOOC2[5F5Fs5KKcQQCx(.."55;;(;+<+<S+AACGG,~/C/CC/HH3NN
 ..IINNx(2



 		V\\^B/014J !CG<*,,C(4<<
+CJ+OPU+VVVC$t||J'?
'KF'SSSC.Z(4S9Z(4S9Z(4S92  C
 ''$,,z2J92U*VVVC6MC 'IIj!#&IIj!#&*
 
 	,$**X"6w"?@@#tyy'9''BCC+7!3G!<==+IIh(4::h+?	+JJ
 	
 	#JJw$JJw$JJw$'
 
 	

 	v %		,(?(H!(LM99\"7+>6MCv1JJz"3'JJz"3'JJz"3'%/5
 

 	(DJJx,@AA%I)>??)TZZ-@!-DEEvvYY^^
	+ 	)C(()A#)FGQQSUS[(		) !Y__S%9:F--x(1hj  .%(E!HeAh1OOOF,))*..*B6*JKTTV F 6MC6MC??7#F+,(4S9(4S90 F '$//'*B7*KKKF&)A&)IIIF6MC **,v&--5&/11v
i J' 	J	s   y2 2zzc                 v    | j                   j                  | j                         t        j                         y)z,Generate and write command to command output)notificationN)r   r	  r  r   RAISE_WINDOWr'   s    r"   	OnNvizCmdzGLWindow.OnNvizCmd
  s(    $--/l>W>WXr#   c                 @    | j                   j                  ||||       y)a  This draws the DC to a buffer that can be saved to a file.

        .. todo::
            fix BufferedPaintDC

        :param filename: file name
        :param FileType: type of bitmap
        :param width: image width
        :param height: image height
        N)r   
SaveToFile)r!   FileNameFileTyper  r  s        r"   r  zGLWindow.SaveToFile
  s     	  5&(Cr#   c                     | j                   S r*   r+   r'   s    r"   r,   zGLWindow.GetDisplay
  r-   r#   c                 N    | j                   j                  j                  d       y)z9Reset view

        :param layers: so far unused
        N)rb   rT   OnResetView)r!   ru   s     r"   	ZoomToMapzGLWindow.ZoomToMap
  s    
 			""4(r#   c                      y)z2Use when the class instance is hidden in MapFrame.Nr1   r'   s    r"   DisactivateWinzGLWindow.DisactivateWin
      r#   c                      y)z6Used when the class instance is activated in MapFrame.Nr1   r'   s    r"   ActivateWinzGLWindow.ActivateWin
  r  r#   )F)T)NTr%   )gr.   r/   r0   __doc__r~   ID_ANYr   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r"  rA  rE  rS  rN  r_  re  r   ri  r   rv  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r"  r   r;  rC  r   r  r  rO  rU  r0  r   ro  ry  r  r_  r`  r  r  r  r  r  r   r  rh  ri  r  rc  rj  r1  r   r  r  r  r  r  r  r:  r*  rC  r  r  r  r,   r  r  r  __classcell__)r   s   @r"   r3   r3   K   s   .BD)) V-p/
2$!FO"=*
0(*8)V,&0 1f
)*@A4*X0(#J:x: 40 d#""!F"@+D"
6#.B ?
B
'-,-8./"2Nh.P`99(Rh&&0dM"7L$((4!l9v1%f7rBBPR$hq+f
=A'FK'Z&>X$N`
YD*)r#   r3   )7r  r   rd   rI  r   r   r~  	threadingr   r~   wx.lib.neweventr   r   wx.glcanvasr   r   r   grass.scriptscriptr3  grass.pydispatch.signalr	   	core.gcmdr
   r   r   
core.debugr   mapwin.baser   core.settingsr   nviz.workspacer   nviz.animationr   rT   r   core.globalvarr   
core.utilsr   core.gifacer   r  r   r  r   wxUpdateLightr   wxUpdateCPlaner   r   rh   r3   r1   r#   r"   <module>r     s   ( 
 
 
     	 $  H H  * 2 2  % & ' $  )  $&.j # O (
 o"** $,J !! (F*}h// F*r#   