
    ը	f                        d Z ddlZddlZej                  j                  dk(  rddlZnddlZddlmZm	Z	m
Z
mZ ddlZ	 ddlmc mc mZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZ dd	l m!Z!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l0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl: ddl; ddl<  G d dejz                        Z> G d dej~                        Z@y# e$ r ddlmc mZ Y w xY w)a  
@package psmap.frame

@brief GUI for ps.map

Classes:
 - frame::PsMapFrame
 - frame::PsMapBufferedWindow

(C) 2011-2012 by Anna Kratochvilova, and 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 Anna Kratochvilova <kratochanna gmail.com> (bachelor's project)
@author Martin Landa <landa.martin gmail.com> (mentor)
    N   )sincospisqrt)	globalvar)Menu)	CmdThreadEVT_CMD_DONE)PsMapToolbar)
RunCommandGErrorGMessage)UserSettings)PilImageToWxImage)GUI)	GNotebook)HyperlinkDialog)ShowAboutDialog)ClientDCPseudoDCRectStockCursorEmptyBitmap)PsMapMenuData)ToolSwitcher)*c                   x   e Zd Zdej                   ed      fdZd Zd Zd Z	d5dZ
d Zd	 Zd
 Zd Zd Zd Zd6dZd Zd Zd Zd Zd Zd7dZd Zd Zd Zd Zd Zd8dZd Zd Zd Z d5dZ!d Z"d7d Z#d7d!Z$d7d"Z%d# Z&d9d$Z'd% Z(d9d&Z)d' Z*d9d(Z+d7d)Z,d* Z-d+ Z.d, Z/d- Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6d4 Z7y):
PsMapFrameNzCartographic Composerc                    || _         t        j                  j                  | f|||dd| | j	                  t        j
                  t        j                  j                  t        j                  d      t        j                               t        | t               j                  d            | _        | j!                  | j                         t#               | _        t'        | | j$                        | _        t*        j,                  dk7  r| j/                  | j(                         d	| _        | j3                  d
      | _        ddgddgdd| _        t9        t        j:                        t9        t        j<                        t9        t        j>                        t9        t        j@                        d| _!        t        jD                  dd
      t        jD                  dd
      t        jD                  t        jF                  ddd      d      t        jD                  t        jF                  ddd      d      t        jD                  t        jF                  ddd      d      t        jD                  t        jF                  ddd      d      t        jD                  t        jF                  ddd      d      t        jD                  t        jF                  ddd      d      t        jD                  t        jF                  d d d       d      t        jD                  t        jF                  d!d!d!      d      t        jD                  t        jF                  ddd      d      t        jD                  d"dt        jH                  #      t        jD                  dd
t        jH                  #      t        jD                  dd
      d$| _%        t        jL                  t        jN                  t        jP                  t        jF                  d%d&d'            t        jP                  t        jF                  d(d)d*            t        jP                  t        jF                  d(d)d*            t        jP                  t        jF                  d+d,d-            t        jP                  t        jF                  d d d             t        jP                  t        jF                  dd d            t        jP                  t        jF                  ddd            t        jP                  t        jF                  d d d             t        jN                  t        jN                  t        jN                  t        jR                  d$| _*        g | _+        t        jX                  j[                         | _.        t_        | | jV                  | j\                  .      | _0        tc               | _2        tg               | _4        d| _5        tm        | | j6                  | jJ                  | jT                  | jB                  | j`                  | jd                  | jh                  | jV                  d/| j\                  0      | _7        | jn                  jq                  | jB                  d1          | js                          tu        jv                         }tu        jx                         | _=        tm        | | j6                  | jB                  | jJ                  | jT                  d| j\                  2      | _>        | j(                  j                          t        j                         | _A        t        j                         | _B        t        | | j                  | j                        | _D        | j                          | j                  t        j                  d3d4             | j                  | j                                | j                  t        j                  | j                         | j                  t        j                  | j                         | j                  t        | j                         t        s t        j                  | j                         y5y5)6zMain window of ps.map GUI

        :param parent: parent window
        :param id: window id
        :param title: window title

        :param kwargs: wx.Frames' arguments
        PsMap)parentidtitlenamez	grass.icoT)
separators)r"   model)r"   toolSwitcherdarwin)   r*      )numberr   pointer)beginenduse)defaultcrosshandsizenwseBLACKcolourwidthGREYV   z      r                           2      d   RED)r7   r8   style)papermarginsmaprasterLegendvectorLegendmapinfoscalebarimage
northArrowpointlineboxselectresize      Z         p            r"   objectsToDrawenvF)r"   mousepenbrushcursorsinstructionopenDialogspageIdobjectIdpreviewrc   r1   )r"   rd   rg   re   rf   rl   rc   i  iX  N)Ur"   wxFrame__init__SetIconIconospathjoinr   ICONDIRBITMAP_TYPE_ICOr	   r   GetModelmenubar
SetMenuBarr   _toolSwitcherr   toolbarsysplatform
SetToolBariconsizeCreateStatusBar	statusbarrd   r   CURSOR_ARROWCURSOR_CROSSCURSOR_HANDCURSOR_SIZENWSErg   PenColour
SHORT_DASHre   WHITE_BRUSHTRANSPARENT_BRUSHBrushBLACK_BRUSHrf   rk   environcopyrc   Instructionrh   dictri   NewIdrj   currentPagePsMapBufferedWindowcanvas	SetCursor
getInitMapgrassgisenvtempfileimgNamepreviewCanvasSelectDefaultQueuerequestQresultQr
   	cmdThread_layout
SetMinSizeSizeSetSizeGetBestSizeBindFNEVT_FLATNOTEBOOK_PAGE_CHANGEDOnPageChanged	EVT_CLOSEOnCloseWindowr   	OnCmdDonehavePILImage	CallAfter_showErrMsg)selfr"   r#   r$   kwargsrc   s         ,/usr/lib/grass83/gui/wxpython/psmap/frame.pyro   zPsMapFrame.__init__9   s    
	
Be'	
EK	
 	GGBGGLL!2!2K@"BTBTU	
 }7747H
 	% *^#4d>P>PQ<<8#OODLL) --Q-7
 Vq6

 #2??3 1/#B$6$67	
 VV7!4vvV15662sB!7qAFF"))Ca*@JFF"))Ca*@JvvRYYq#s%;1EbiiS#&>aHVV299S#r#:!D&&		#sC(@JVV299S#s#;1EFF"))Aq!"4A>66ar}}EffG1BMMJffG15
" ^^++88BIIc334HHRYYsC%=>HHRYYsC%=>xx		#sC 893S!9:XXbiiS"56((299S#s#;<XXbiiS#67((''**nn

$  ::??$ 't}}$((
  6g)****LL((((;;]]
 	dll956 lln~~' 1**LL**
 	""$ {{}"4ES)*T%%'(		"22D4F4FG		",, 2 23		,/LL))*     c                 2    t        | t        d      d       y)z$Show error message (missing preview)zLPython Imaging Library is not available.
'Preview' functionality won't work.F)r"   messageshowTracebackN)r   _r   s    r   r   zPsMapFrame._showErrMsg   s    6  	
r   c                    t        j                  t         j                        }t        | t        j
                        | _        | j                  j                  | j                  d       | j                  j                  | j                  d       | j                  j                  d       |j                  | j                  dt         j                         | j                  |       |j                  |        y)z	Do layout)r"   rI   z
Draft modePreviewr   r+   N)rm   BoxSizerVERTICALr   r   FNPageDStylebookAddPager   r   SetSelectionAddEXPANDSetSizerFit)r   	mainSizers     r   r   zPsMapFrame._layout   s    KK,	T1G1GH			$++|4		$,,i8		q!diiBII.i dr   c                     | j                   j                  d      r&| j                   j                  d      j                  }nd}|s|st        t	        d             yy)zCheck if map frame exists

        :param int type_id: type id (raster, vector,...)

        :return bool: False if map frame doesn't exists
        rL   NzPlease, create map frame first.r   FT)rh   FindInstructionByTyper#   r   r   )r   type_idmapIds      r   _checkMapFrameExistszPsMapFrame._checkMapFrameExists   sS     11%8$$::5ADDEE#D!EFr   c                 H    | j                   j                  |       || _        y)zsSwitch to page (default to Draft page)

        :param int page_index: page index where you want to switch
        N)r   r   r   )r   
page_indexs     r   _switchToPagezPsMapFrame._switchToPage   s    
 			z*%r   c                 <    ddl }d|j                         d   v rdS dS )zPGet Ghostscript program name

        :return: Ghostscript program name
        r   N64gswin64cgswin32c)r}   architecture)r   r}   s     r   _getGhostscriptProgramNamez%PsMapFrame._getGhostscriptProgramName  s'    
 	!X%:%:%<Q%??zOZOr   c                 p   t        | j                        }	 |j                  d      }|S # t        $ r}	 t        |      j	                  d      d   j	                  d      d   j                         }n# t        $ r d}Y nw xY w|rt        d      |z  }nt        d      }t        |	       Y d
}~yd
}~ww xY w)zCreates mapping instructionsLatin_1positionr+   :r    zpCharacters on position %s are not supported by ISO-8859-1 (Latin 1) encoding which is required by module ps.map.zeNot all characters are supported by ISO-8859-1 (Latin 1) encoding which is required by module ps.map.r   N)	strrh   encodeUnicodeEncodeErrorsplitstrip
IndexErrorr   r   )r   texterrposr   s        r   InstructionFilezPsMapFrame.InstructionFile  s     4##$	;;y)D. - " 	#hnnZ0399#>qAGGI >
   :
 W%+	s2   * 	B5=A21B02B =B0?B  +B00B5c                 P    | j                  d      }|r| j                  |       yy)zGenerate PostScriptz<PostScript (*.ps)|*.ps|Encapsulated PostScript (*.eps)|*.epswildcardN)getFilePSFile)r   eventfilenames      r   OnPSFilezPsMapFrame.OnPSFile,  s.    <<S   
 KK! r   c                 >    t        |       j                  dg       y)zLaunch ps.map dialogr"   ps.map)cmdN)r   ParseCommandr   r   s     r   OnPsMapDialogzPsMapFrame.OnPsMapDialog4  s    4%%8*%5r   c                 F   t         j                  dk(  sA	 t        j                  dgt        j                        }|j
                  j                          | j                  d      }|r| j                  |d	
       yy# t        $ r t        | t        d             Y yw xY w)z-Generate PDF from PS with ps2pdf if availablewin32ps2pdf)stderrzGProgram ps2pdf is not available. Please install it first to create PDF.r"   r   NzPDF (*.pdf)|*.pdfr   T)pdf)r|   r}   r   PopenPIPEr   closeOSErrorr   r   r   r   )r   r   pr   s       r   	OnPDFFilezPsMapFrame.OnPDFFile8  s    ||w&KK
5::>  <<)<<=KKdK+   a s   A A> >B B c                 $    | j                          y)zRun ps.map and show resultN)r   r   s     r   	OnPreviewzPsMapFrame.OnPreviewL  s    r   c           
         t        j                         }t        |d      }| j                         }|sy|j	                  |       |j                          |j                          d}t        j                  | j                        }|r|}nd}|r|r|rd}t        j                         }|s| j                  j                  d      rd| j                  j                  d      j                  }	t        d| j                  |	   d	   d
   | j                  |	   d	   d   | j                         ddg}
t        j                  j                  |      d   dk(  r|
j!                  d       | j                  | j"                     d   dk(  r|
j!                  d       |
j!                  d|z         |
j!                  d|z         |r| j%                  t'        d      d       n9|s| j%                  t'        d      d       n| j%                  t'        d      d       | j(                  j+                  |
| j                  |||||d       y)zHCreate temporary instructions file and run ps.map with output = filenamewbmodeNFrc   TrL   rG   rectr      dpir8   heightrc   r   z--overwriter+   z.epsz-eOrientation	Landscapez-rzinput=%sz	output=%szGenerating PDF...r   zGenerating PostScript...zGenerating preview...)	instrFiler   pdfnametemp	regionOld)rc   userData)r   r   openr   writeflushr   regionrc   rh   r   r#   SetResolutionrr   rs   splitextappendrj   SetStatusTextr   r   RunCmd)r   r   r   r  instrFileFdcontentr  regOldr  r   r   s              r   r   zPsMapFrame.PSFileP  s    NN$	940&&('"$((+GGHD~~'H##99%@ ,,BB5ILLE!"..u5f=a@#//6v>qA HH	 '77H%a(F2JJtDKK(7;FJJt

:	)*

;)*q!45q9q!;<a@q!891=&$"# 	 
	
r   c                 4    |j                   dk7  rwt         t        d      |j                   z         t        j                  |j
                  d          |j
                  d   r"t        j                  |j
                  d          y|j
                  d   r@t        j                  d	k(  rddl}|j                         d   }d
}d|v rd}|dddddddddddd|j
                  d   z  ddddddd|j
                  d   g}t        d      j                  |      }t        d      j                  |      }n=d}|dd|j
                  d   |j
                  d   g}t        d       j                  |      }	 t        j                  |      }|j                         }	|	dkD  r t         t        d!      |d   |	d"z         n j                  t        d#      d       n*|j
                  d   s j                  t        d'      d       t&        r|j
                  d   r|j
                  d   st        j(                  |j
                  d(   d)   |j
                  d(   d*    j*                  +       j*                  d,<   t-        j.                  t        d-       .      }t-        j0                         j3                          	 t4        j7                  |j
                  d         } j8                   j:                     d/   d0k(  r:ddl}|j?                  |      }t4        jA                  |jC                  |d1            }|jE                   jF                  d23        jL                  jO                  d;       d; _(         jR                  jU                         }t-        jV                   jF                  t,        jX                         jR                  _-         jR                  j]                  |<       ~ j                  t        d=      d       t        j                  |j
                  d          |j
                  d   r"t        j                  |j
                  d          t-        j^                  d> fd?       _0        y# t        $ r}
t        j                  d	k(  rYt         |t        |
      z   d$t        d%      j                        &      }|j!                          |j#                          Y d}
~
yt%         |t        |
      z          Y d}
~
d}
~
ww xY w# tH        t        f$ rv ~ jK                         }t         t        d4      t        d5      d$t        d6      j                  |d7|v rd8nd9:      &      }|j!                          |j#                          Y yw xY w)@zps.map process finishedr   z!Ps.map exited with return code %sr   r  r  r   Nr  r   r   32r   z-P-z-dSAFERz-dCompatibilityLevel=1.4z-qz	-dNOPAUSEz-dBATCHz-sDEVICE=pdfwritez-dPDFSETTINGS=/prepressz-r1200z-sstdout=%stderrz-sOutputFile=%sz-c30000000setvmthresholdz-fzProgram {} is not available.z*{title} Please install it to create PDF.

)r$   r   z@Program {} is not available. Please install it to create PDF.

 z(%(prg)s exited with return code %(code)s)prgcodezPDF generatedz0https://www.ghostscript.com/releases/gsdnld.htmlz!You can download {} version here.)r$   r   	hyperlinkhyperlinkLabelzPostScript file generatedr  colsrows)r&  r'  rc   GRASS_REGIONzGenerating preview, wait pleaser   r  r  r  PNG)formatzPreview not availablezVPreview is not available probably because Ghostscript is not installed or not on PATH.z/You can download {program} {arch} version here.r   64bit32bit)programarchr+   )r  zPreview generatedi  c                  0     r j                  dd      S d S )Nr   r   )r  r   s   r   <lambda>z&PsMapFrame.OnCmdDone.<locals>.<lambda>  s    D&&r1- 4 r   )1
returncoder   r   r   
try_remover  r|   r}   r   r*  r   waitr  r   r   r   	ShowModalDestroyr   r   
region_envrc   rm   BusyInfoGetAppYieldPILImager  rh   rj   numpyarray	fromarrayrot90saver   IOErrorr   r   r   r   r   	ImageRectImageBITMAP_TYPE_PNGrQ   	DrawImage	CallLaterdelayedCall)r   r   r}   r.  pdf_rendering_progcommandr$   r   procretedlgbusyimnpim_arrayr-  r  s   `                 r   r   zPsMapFrame.OnCmdDone  s    q =>AQAQQ
 U^^K89~~f%  
!;<>>)$||w&,,.q1%/"4<)3&&.'-&%y(AA.$NN:.+. 89@@ASTJKRR S  &."&-NN:.NN9- = &+, >{{7+iik7# !"L M")!*c:!; &&q'91=" 'q!<=qA ENN625>>);T','7'7^^K08^^K08HH(DHH^$ ;;q!BCDQDIIK]]5>>*#=>##DKK0?;N&!xx|H!++BHHXq,ABBU3, II""1% D%%//1D')xxb>P>P'QD$((d(3q!45q945>>&!U^^J78<<?
O  ><<7*)# '#a& 0"T'()L'M'T'T (C MMOKKMdGc!f,<==>J W% 99;%34p Q#$I$f '(,WW   's4   2A%Q6 ;BT 6	T?A'T
+T

TBVVc           	         g }|j                  d      dd d   D ]=  }|j                  d      j                  d      d   }|rd|z   }|j                  |       ? | j                  j	                  d      }|r|j
                  }nd }|r=| j                  |   d   r+| j                  |   d   j                  d      d   |d   z   }nd	}d	}t        j                  | t        d
      d	||t        j                  t        j                  z  t        j                  z        }	|	j                         t        j                  k(  r|	j                         }||	j                            }t         j"                  j%                  |      d   s||z   }nOt         j"                  j%                  |      d   |k7  r*|d	k7  r%t         j"                  j%                  |      d   |z   }|	j'                          |S )N|r+   r   r   .raster@r   r   zSave file asr   
defaultDirdefaultFiler   rI   )r   r   r  rh   r   r#   rm   
FileDialogr   FD_CHANGE_DIRFD_SAVEFD_OVERWRITE_PROMPTr4  ID_OKGetPathGetFilterIndexrr   rs   r  r5  )
r   r   suffixfiltersrT  rasterIdmapNamer   rL  s
             r   r   zPsMapFrame.getFile  s   nnS)!$Q$/ 	FS!'',Q/A!GMM!		
 !!77AyyHH((28<&&x0:@@EaH6RS9TGGmmn%""RZZ/"2H2HH
 ==?bhh&{{}HC..01F77##H-a0#f,!!(+A.&8Vr\77++H5a86Ar   c                     | j                  d      }|rAt        |d      }| j                         }|sy |j                  |       |j	                          y y )Nz9*.psmap|*.psmap|Text file(*.txt)|*.txt|All files(*.*)|*.*r   r  )r   r  r   r  r   )r   r   r   r  r  s        r   OnInstructionFilezPsMapFrame.OnInstructionFileE  sX    <<P   
 Xt,I**,GOOG$OO r   c           	      &   d}t        j                  | ddddt         j                  t         j                  z        }|j	                         t         j
                  k(  r|j                         }|j                          |sy| j                  |       y)z)Launch file dialog and load selected filer   zFind instructions filezAll files (*.*)|*.*rV  N)	rm   rY  rZ  FD_OPENr4  r]  r^  r5  LoadFile)r   r   r   rL  s       r   
OnLoadFilezPsMapFrame.OnLoadFileQ  sr     mm,*""RZZ/
 ==?bhh&{{}Hhr   c                 X   g }t        | || j                        }|j                  |      }|st        t	        d      |z         y|x| _        | j                  _        |x| _        | j                  _        | j
                  j                  d      j                  x| _
        | j                  _
        | j                  j                          d| j                  _        | j                  j                          | j                  j                          | j                  | j                         y)zLoad file and read instructionsra   zFailed to read file %s.pageN)r   rc   Readr   r   rh   r   rk   r   r#   rj   UpdateMapLabeldragIdClearSetPageDialogDataChanged)r   r   readObjectIdreadInstructionoks        r   ri  zPsMapFrame.LoadFilee  s    %|
 !!(+Q01H<=9HHDt{{63??DMDKK0/3/?/?/U/U0bDK$++, KK&&(!#DKKKKKK! ""4==1r   c                    | j                   j                  d      j                  }t        | || j                   | j                        }|j                          |j                         }|t        j                  k(  rP| j                  j                          | j                          | j                  j                  | j                         |j                          y)z+Specify paper size, margins and orientationrl  r#   settingsrc   idsN)rh   r   r#   PageSetupDialogrc   CenterOnParentr4  rm   r]  r   rr  r   RecalculatePositionrk   r5  )r   r   r#   rL  vals        r   OnPageSetupzPsMapFrame.OnPageSetup|  s    33F;>>drD4D4D$((Smmo"((?KK!OOKK+++>r   c                     d| j                   d<   | j                  j                  | j                  d          | j                  j                  | j                  d          y )Nr-   r0   r1   rd   r   r   rg   r   r   s     r   	OnPointerzPsMapFrame.OnPointer  sH    %

5dll956$$T\\)%<=r   c                     d| j                   d<   | j                  j                  | j                  d          | j                  j                  | j                  d          y )Npanr0   r3   r  r   s     r   OnPanzPsMapFrame.OnPan  sH    !

5dll623$$T\\&%9:r   c                     d| j                   d<   | j                  j                  | j                  d          | j                  j                  | j                  d          y )Nzoominr0   r2   r  r   s     r   OnZoomInzPsMapFrame.OnZoomIn  sH    $

5dll734$$T\\'%:;r   c                     d| j                   d<   | j                  j                  | j                  d          | j                  j                  | j                  d          y )Nzoomoutr0   r2   r  r   s     r   	OnZoomOutzPsMapFrame.OnZoomOut  sH    %

5dll734$$T\\'%:;r   c                    | j                   d   | _        | j                  dk(  r | j                  j	                         | _        n9| j                  j	                         | _        | j                  j	                          d| j                   d<   | j                  dk(  r| j                  j                          n| j                  j                          | j                  | j                   d<   | j                  dk(  r&| j                  j                  | j
                         y | j                  j                  | j
                         y )Nr0   r   r  )	rd   mouseOldr   r   	GetCursor	cursorOldr   ZoomAllr   r   s     r   	OnZoomAllzPsMapFrame.OnZoomAll  s    

5)q ![[224DN!//99;DN((*$

5q KK!&&( MM

5q KK!!$..1((8r   c                    | j                   j                  d      r&| j                   j                  d      j                  }nd}|ddg}|r| j                   j                  d      r&| j                   j                  d      j                  }nd}| j                   j                  d      r&| j                   j                  d      j                  }nd}||d<   ||d<   |r| j                  j	                          |rd| j
                  v r| j
                  d   j                  d       d| j
                  v r| j
                  d   j                  d       d| j
                  v r| j
                  d   j                  d       d| j
                  vr3t        | || j                   | j                  |	      }|| j
                  d<   | j
                  d   j                          yd| j
                  v r)| j
                  d   j                  j                  d
       yd| j
                  vr3t        | || j                   | j                  |	      }|| j
                  d<   | j
                  d   j                          yd| j                  d<   | j                  j                  | j                  d          | j                   dk(  r#| j"                  j%                  d
       d
| _        yy)zAdd or edit map framerL   NvectorrT  r+   r   r   mapNotebook)r"   r#   ry  rc   notebookr   addMapr0   r2   )rh   r   r#   r{   r   ri   OnOK	MapDialogrc   Showr  ChangeSelectionrd   r   r   rg   r   r   r   )r   r   r  r   r#   vectorIdrc  rL  s           r   OnAddMapzPsMapFrame.OnAddMap  s   11%8$$::5ADDEET4 55h?++AA(KNN55h?++AA(KNNBqEBqELL&&(D,,,$$U+00t0<t///$$X.33$3?t///$$X.33$3? (8(88##!%!1!1 HH!)C 7:D$$]3  /446 D$4$44$$]3<<LLQOD$4$44'#'!%)%5%5 $%- 36((/$$U+002 !)DJJuKK!!$,,w"781$		&&q)#$  %r   c                    | j                   j                  d      r&| j                   j                  d      j                  }nd}| j                  |      syd| j                  v r)| j                  d   j
                  j                  d       yd| j                  vr2t        | || j                   | j                        }|| j                  d<   | j                  d   j                          y)zAdd raster maprT  Nr   r  r+   rx  )
rh   r   r#   r   ri   r  r  RasterDialogrc   r  r   r   r#   rL  s       r   OnAddRasterzPsMapFrame.OnAddRaster  s    11(;!!77ADDBB(((4 D,,,]+44DDQGt///"4B9I9ItxxX-0  *X&++-r   c                    | j                   j                  d      r&| j                   j                  d      j                  }nd}| j                  |      syd| j                  v r)| j                  d   j
                  j                  d       yd| j                  vr2t        | || j                   | j                        }|| j                  d<   | j                  d   j                          y)zAdd vector mapr  Nr  r  r   rx  )
rh   r   r#   r   ri   r  r  MainVectorDialogrc   r  r  s       r   	OnAddVectzPsMapFrame.OnAddVect  s    11(;!!77ADDBB(((4 D,,,]+44DDQGt///&R$*:*: .1  *X&++-r   c                    t               d   dk(  rt        t        d             y| j                  j	                  d      r&| j                  j	                  d      j
                  }nd}d| j                  vr2t        | || j                  | j                        }|| j                  d<   | j                  d   j                          y)zAdd scalebarprojllz/Scalebar is not appropriate for this projectionr   NrP   rx  )
projInfor   r   rh   r   r#   ri   ScalebarDialogrc   r  r  s       r   OnAddScalebarzPsMapFrame.OnAddScalebar  s    :f%QPQR11*=!!77
CFFBBT--- "t7G7GTXXVC+.DZ($))+r   c                 >   | j                   j                  d      r&| j                   j                  d      j                  }nd}| j                   j                  d      r&| j                   j                  d      j                  }nd}d| j                  vrDt	        | ||g| j                   | j
                  |      }|| j                  d<   || j                  d<   | j                  d   j                  j                  |       | j                  d   j                          y)zAdd raster or vector legendrM   NrN   )r#   ry  rc   rl  )	rh   r   r#   ri   LegendDialogrc   r  r  r  )r   r   rl  idRidVrL  s         r   OnAddLegendzPsMapFrame.OnAddLegend'  s    11.A""88HKKCC11.A""88HKKCC!1!11#sd.>.>DHHSWC 03D^,/2D^,(11AA$G(--/r   c                 D   | j                   j                  d      r&| j                   j                  d      j                  }nd }d| j                  vr2t	        | || j                   | j
                        }|| j                  d<   | j                  d   j                          y )NrO   rx  )rh   r   r#   ri   MapinfoDialogrc   r  r  s       r   OnAddMapinfozPsMapFrame.OnAddMapinfo;  s    11)<!!77	BEEBBD,,,d6F6FDHHUC*-DY'#((*r   c                    d}d| j                   v rY| j                   d   j                         }| j                   d   j                  d       | j                   d   j                          t	        | || j
                  | j                        }|| j                   d<   |r|j                  |       |j                          y)z(Show dialog for image adding and editingNrQ   r  rx  )	ri   GetPositionOnApplyr5  ImageDialogrh   rc   SetPositionr  r   r   r#   r   rL  s        r   
OnAddImagezPsMapFrame.OnAddImageF  s    d&&&''0<<>HW%--D-9W%--/$20@0@dhhO$'!OOH%
r   c                 D   | j                   j                  d      r&| j                   j                  d      j                  }nd}d| j                  vr2t	        | || j                   | j
                        }|| j                  d<   | j                  d   j                          y)z.Show dialog for north arrow adding and editingrR   Nrx  )rh   r   r#   ri   NorthArrowDialogrc   r  r  s       r   OnAddNorthArrowzPsMapFrame.OnAddNorthArrowS  s    11,?!!77EHHBBt///"4B9I9ItxxXC-0D\*&++-r   c                    d}d| j                   v rY| j                   d   j                         }| j                   d   j                  d       | j                   d   j                          t	        | || j
                  | j                        }|| j                   d<   |r|j                  |       |j                          y)z'Show dialog for text adding and editingNr   r  rx  )	ri   r  r  r5  
TextDialogrh   rc   r  r  r  s        r   	OnAddTextzPsMapFrame.OnAddText_  s    T%%%''/;;=HV$,,4,8V$,,."t/?/?TXXN#& OOH%
r   c                     d| j                   d<   | j                  j                  | j                  d          | j	                          y)zAdd point action selectedaddPointr0   r2   Nrd   r   r   rg   r   r   s     r   
OnAddPointzPsMapFrame.OnAddPointl  s7    &

5dll734r   c                    d}d| j                   v rY| j                   d   j                         }| j                   d   j                  d       | j                   d   j                          t	        | || j
                  || j                        }|| j                   d<   |r|j                  |       |r|j                  d       |j                          y)zAdd point and open property dialog.

        :param id: id point id (None if creating new point)
        :param coordinates: coordinates of new point
        NrS   r  )r#   ry  coordinatesrc   )	ri   r  r  r5  PointDialogrh   rc   r  r  r   r#   r  r   rL  s        r   AddPointzPsMapFrame.AddPointr  s     d&&&''0<<>HW%--D-9W%--/%%#
 %(!OOH%KKdK#
r   c                     d| j                   d<   | j                  j                  | j                  d          | j	                          y)zAdd line action selectedaddLiner0   r2   Nr  r   s     r   	OnAddLinezPsMapFrame.OnAddLine  s7    %

5dll734r   c                    d}d| j                   v rY| j                   d   j                         }| j                   d   j                  d       | j                   d   j                          t	        | || j
                  d|| j                        }|| j                   d<   |r|j                  |       |r|j                  d       |j                          y)zAdd line and open property dialog.

        :param id: id line id (None if creating new line)
        :param coordinates: coordinates of new line
        NrT   r  r#   ry  typer  rc   	ri   r  r  r5  RectangleDialogrh   rc   r  r  r  s        r   AddLinezPsMapFrame.AddLine  s     T%%%''/;;=HV$,,4,8V$,,.%%#
 $' OOH%KKdK#
r   c                     d| j                   d<   | j                  j                  | j                  d          | j	                          y)zAdd rectangle action selectedaddRectangler0   r2   Nr  r   s     r   OnAddRectanglezPsMapFrame.OnAddRectangle  s7    *

5dll734r   c                    d}d| j                   v rY| j                   d   j                         }| j                   d   j                  d       | j                   d   j                          t	        | || j
                  d|| j                        }|| j                   d<   |r|j                  |       |r|j                  d       |j                          y)zAdd rectangle and open property dialog.

        :param id: id rectangle id (None if creating new rectangle)
        :param coordinates: coordinates of new rectangle
        N	rectangler  r  r  r  s        r   AddRectanglezPsMapFrame.AddRectangle  s     $***''4@@BH[)111=[)113%%#
 ),%OOH%KKdK#
r   c                 j   | j                   j                  d      r&| j                   j                  d      j                  }nd}| j                  |      syd| j                  vr2t        | || j                   | j                        }|| j                  d<   | j                  d   j                          y)zShow dialog for labelslabelsNr  rx  )rh   r   r#   r   ri   LabelsDialogrc   r  r  s       r   OnAddLabelszPsMapFrame.OnAddLabels  s    11(;!!77ADDBB(((44+++tT5E5E488TC),DX&"'')r   c                    |\  }}t        |      dz  t        z  }t        |      t        |      z  }t        |      t        |      z  }||}
}	t        dz  |cxk  rdt        z  dz  k  rn n||z   }	d|cxk  r	t        k  rn n||z
  }
|dk(  rt	        ||g| S t	        |	|
t        |      t        |            j                  ||      S )z9computes bounding box of rotated text, not very precisely   r   r  r   )floatr   r   r   r   absInflate)r   xy
textExtentrotationwhHWXYs              r   getModifiedTextBoundsz PsMapFrame.getModifiedTextBounds  s    1?S(2-!Hs8}$!Hs8}$!16H*B
*AAx"AAq=1*z**1c!fc!f-55a;;r   c                    t        |d   | j                  j                  z        }|d   j                  d      d   }	 |d   j                  d      d   }|dk(  rt
        j                  }d}nB|d	k(  rt
        j                  }d
}n*|dk(  rt
        j                  }d}nt
        j                  }d}t
        j                  }t
        j                  }d|v rt
        j                  }d|v rt
        j                  }d|v rt
        j                  }	 t        j                  |||||      }	|	S # t        $ r d}Y w xY w#  t        j                  |t
        j                  t
        j                  t
        j                        }	Y |	S xY w)ztcreates a wx.Font object from selected postscript font. To be
        used for estimating bounding rectangle of textfontsizefont-r   r+   r   Timestimes	Helvetica	helveticaCouriercourierObliqueItalicBold)	pointSizefamilyrI   weightface)r  r  rI   r  )roundr   	currScaler   r   rm   FONTFAMILY_ROMANFONTFAMILY_SWISSFONTFAMILY_TELETYPEFONTFAMILY_DEFAULTFONTSTYLE_NORMALFONTWEIGHT_NORMALFONTSTYLE_SLANTFONTSTYLE_ITALICFONTWEIGHT_BOLDFont)
r   textDictr  fontface	fontstyler  r  rI   r  fns
             r   
makePSFontzPsMapFrame.makePSFont  s{    *-0E0EEFF#))#.q1	 (..s3A6I w((FD$((FD"++FD**FD##%%	!&&Ey ''EY''F
	"6vTXB 	Q  	I	@	",,))++	B 	s   D( D9 (D65D69AFc                     t        |       }| j                  |      }	 |j                  |       |j                  |d         \  }}}||fS #  Y yxY w)z$Estimates bounding rectangle of textr   r   r   )r   r  SetFontGetFullMultiLineTextExtent)r   r  dcr  r  r  lhs          r   getTextExtentzPsMapFrame.getTextExtent  sY     d^__X&	JJrN44Xf5EFHAq"q6M	s   ,A Ac                 ^   t        j                         }t        |d      }| j                         }|sy|j	                  |       |j                          |j                          | j                  j                  d      }t        ||d   dk(  | j                        }t        j                  |       t        j                  | j                        }t        |       }|j                  t        |d	   |d
   z
        dd      }|j!                         d   |z  }	| j                  j                  d      }
|
r|
j"                  }nd}|s<t%               }t'        || j                        }
| j                  j)                  |
       | j                  |   j+                  t-        ||	             y)zUCreate default map frame when no map is selected, needed for coordinates in map unitsr  r  Nrl  r  Portrait)portraitrc   r  r  rK  meterinchvaluefromUnittoUnitr   initMapr  scale)r   r   r  r   r  r  r   rh   r   GetMapBoundsrc   r2  r  UnitConversionconvertr  Getr#   r   InitMapAddInstructionSetInstructionr   )r   r  r  r  rl  mapInitRectr  units	realWidthr"  r   r#   s               r   r   zPsMapFrame.getInitMap+  sn   NN$	940&&('"55f="m!4
!B
 	#$((+t$MMfSkF3K/076 " 
	 !!$y0""88CBBBbdhh/G++G4++Dk,OPr   c                    | j                   j                  dk7  r| j                  dk(  r| j                  | j                   j                     j                  dk(  rP| j                  | j                   j                         | j                          | j                   j                          y | j                  | j                   j                         y y y )Nrm  r   rL   )r   rp  r   rh   r  deleteObjectr   RecalculateENr   s     r   OnDeletezPsMapFrame.OnDeleteO  s    ;;#(8(8A(= 2 2388EA!!$++"4"45!))+!!$++"4"45 )>#r   c                 8   | j                   j                  j                  |       || j                   j                  k(  r5| j                   j                  j                          d| j                   _        | j                   j                          | j                  |= y)z"Deletes object, his id and redrawsrm  N)r   pdcObjRemoveIdrp  pdcTmp	RemoveAllRefreshrh   )r   r#   s     r   r.  zPsMapFrame.deleteObjectX  sp     	##B'###KK((*!#DKK R r   c           
      Z   |}t        |t              r|g}|D 
]v  }| j                  |   j                  }|dv r| j                  j                  | j                  |   d   d      }| j                  j                  ||       | j                  j                  | j                  |   | j                  |   | j                  j                  |d|       | j                  j                  |       |dk(  r| j                  j                  ||       | j                  j                  | j                  |   d   d      }| j                  j                  | j                  |   | j                  |   | j                  j                  |d	|       | j                  j                  |       |d
v ri| j                  j                  | j                  |   d   d      }d }|dk(  r| j                  |   d   d   }| j                  |   d   d   }| j                  j                  t        |d      d      d d }| j                  j                  t        |d      d      d d }	||	f}d }
d| j                  |   j                         v r| j                  |   d   }
d }d| j                  |   j                         v r| j                  |   d   }| j                  j                  || j                  |   d   ||
|||       | j                  j                  |       |dk(  ro| j                  |   d   rt        | j                  |   d         }nd}| j!                  | j                  |   j                               }t        | j                  |   d   d      }t#        | j                  j                  |d      d d       | j                  |   d<   | j                  |   d   j%                         d   dk(  r!| j                  |   d   dxx   |d   z  cc<   nI| j                  |   d   j%                         d   dk(  r#| j                  |   d   dxx   |d   dz  z  cc<   | j                  |   d   j%                         d   dk(  rm| j                  |   d   dxx   |d   t'        |dz  t(        z        z  z  cc<   | j                  |   d   dxx   |d   t+        |dz  t(        z        z  z  cc<   n| j                  |   d   j%                         d   dk(  rr| j                  |   d   dxx   |d   dz  t'        |dz  t(        z        z  z  cc<   | j                  |   d   dxx   |d   dz  t+        |dz  t(        z        z  z  cc<   | j                  |   d   dxx   | j                  |   d   z  cc<   | j                  |   d   dxx   | j                  |   d   z  cc<   | j                  |   d   }| j-                  |d   |d   ||      x| j                  |   d<   }| j                  j/                  | j                  j                  || j                  |   j                         ||        | j                  j                  |       |d!v r|d"k(  r[	 t1        j2                  | j                  |   d"         }t1        j4                  |d#   |d$   | j6                  %      | j6                  d&<   d'| j:                  v r| j:                  d'   j=                          | j                  j?                  d(      j@                  }|d"k(  r]tC        | j                  |   d)   | j                  |   d   jD                  | j                  |   d   jF                  | j6                  *       | j                  j                  | j                  |   d   d      }| j                  jI                          | j                  jK                          | j                  j                  | j                  d(   | j                  d(   | j                  j                  |d|       | j                  j                  |       | j                  jL                  jO                  | j                  jP                         |d'k(  r| j                  |   d+   r| j                  j                  ||       | j                  j                  | j                  |   d   d      }| j                  j                  | j                  |   | j                  |   | j                  j                  |d|       | j                  j                  |       n| jS                  |       |d,k(  s	p| j                  j?                  d-      s| jS                  |       	| j                  |   d.   r| j                  j                  ||       | j                  j                  | j                  |   d   d      }| j                  j                  | j                  |   | j                  |   | j                  j                  |d|       | j                  j                  |       
f| jS                  |       
y y # t0        j8                  $ r Y w xY w)/N)rP   rO   rQ   r  Fr  canvasToPaper)ityper#   rectTextre   rf   pdcdrawidpdctypebbrR   bitmaprS   rT   r  rT   wherer   r+   r  r   fcolorr8   color)r>  rE  shaperD  r8   r@  
lineCoordsr   rotater  coordsreflowercenterrightr  xoffsetyoffsetr=  drawIdr  rJ  bounds)rL   r  rT  r  rT  nsresewres)rT  rU  rc   r(  rM   rL   
resolutionr  rLegendrN   r  vLegend)*
isinstanceintrh   r  r   CanvasPaperCoordinatesUpdateLabelDrawre   rf   r2  RedrawSelectBoxRect2DPSGetInstructionDrawGraphicsr  r  listr   r   r   r   r  DrawRotTextr   raster_infor6  rc   CalledModuleErrorri   updateDialogr   r#   r  r8   r
  r/  ro  r4  r3  idZoomBoxTmpr.  )r   r#   r{  r:  drawRectanglerJ  point1point2point1Coordspoint2CoordsrD  r8   rotextentr  rS  info
rectCanvass                     r   rs  zPsMapFrame.DialogDataChangedd  sr
   b#$C F	*B$$R(--E88 $ B B))"-f5U !C ! ''e';  **U+**&$ !  ++B/$''e'; $ B B))"-f5U !C !   **U+**$$ !  ++B/66 $ B B))"-f5U !C ! F?!--b1':1=F!--b1':1=F#';;#E#E%ff5U $F $q$L $(;;#E#E%ff5U $F $q$L +L9F t//3BBDD!--b1(;Fd..r2AACC ,,R09E((**2.w7!$% )  ++B/##B'1 0 0 4X >?CC++!--b1@@B ,    0 0 4W =vF15KK66DPU6V2  $X. ##B'.446q9WD$$R(215B5%%b)%0668;xG$$R(215QF5##B'.446q9WD$$R(215SsUWEX9XX5$$R(215SsUWEX9XX5%%b)%0668;xG$$R(215q	AC#IN(;;5 $$R(215q	AC#IN(;;5   $X.q1T5E5Eb5I)5TT1  $X.q1T5E5Eb5I)5TT1))"-h78<8R8R1Ivay&#9   $V,v ''**!--b1@@B!! (  ++B/==H$$001A1A"1Eh1OP383C3C"&w-tG}$((40 "T%5%55$$^4AAC%%;;EBEE H$! ,,R0>"..r26:@@#//3F;BB HH	 "[[??))"-f5U @ 
 ))+**,  **U+**&! !  ++B/""++DKK,D,DE &##B'	2KK++%B+?$(KK$F$F!--b1&9 %G %M KK$$ HHUO"jj/ KK..! *( %  KK//3%%b)&''==hG%%b)%%b))4KK++%B+?$(KK$F$F!--b1&9 %G %M KK$$ HHUO"jj/ KK..! *( %  KK//3 %%b)MF	*z !22 s   Ajj*)j*c                     | j                   j                  | j                   j                               | _        | j                  dk(  r| j	                  t        d             y| j	                  d       y)zGNotebook page has changedr+   z:Press button with green triangle icon to generate preview.r   N)r   GetPageIndexGetCurrentPager   r  r   r   s     r   r   zPsMapFrame.OnPageChanged0  s[    9911$))2J2J2LMq NO r"r   c                     | j                   rK| j                   j                         dk(  r.| j                   j                         }|j                  ddg       yt	        ddd       y)z	Show helpLayerManagerzg.manualzentry=wxGUI.psmapTzwxGUI.psmap)quietentryN)r"   GetNameGetLogWindowr  r   )r   r   logs      r   OnHelpzPsMapFrame.OnHelp:  sM    ;;4;;..0NB++**,CJJ
$789z]Cr   c                 0    t        t        d      d       y)zDisplay About windowzwxGUI Cartographic Composer2011)prgName	startYearN)r   r   r   s     r   OnAboutzPsMapFrame.OnAboutB  s    "? @FSr   c                 ,   	 t        j                  | j                         t	        j
                  d       t        | d      r4| j                  j                         r| j                  j                          | j                          y# t        $ r Y qw xY w)zClose windowFrF  N)rr   remover   r   r   set_raise_on_errorhasattrrF  	IsRunningStopr5  r   s     r   r   zPsMapFrame.OnCloseWindowF  sq    	IIdll# 	  '4'D,<,<,F,F,H!!#  		s   B 	BB)r   )NFN)F)NN)8__name__
__module____qualname__rm   ID_ANYr   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   rf  rj  ri  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r0  r.  rs  r   r{  r  r    r   r   r   r   8   s   biiq1H/IW+r	
$&P<"6,(8
tS
j$L
 (2.
>
;
<
<
9$>%@.(.,,0(	+
.244*< 0d"QH6
!J*X#DT	r   r   c                   &   e Zd ZdZej
                  ej                  fdZd Zd&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d edddd      dfdZ	 d'dZd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(y)(r   zA buffered window class.c           	      $   t         j                  j                  | |||       || _        | j	                          d| _        d| _        |d   | _        |d   | _        |d   | _	        |d   | _
        |d   | _        d	|v r
|d	   | _        d
|v r
|d
   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        t#        d      t#        d      t#        d      t#        d      t#        d      t#        d      t#        d      d| _        i | _        t)               | _        t)               | _        t)               | _        t)               | _        t)               | _        | j5                  d       t7        | j9                          | _        t;               | _        t;               | _        t;               | _         t;               t;               f| _!        t        jD                  dd      | _#        d| _$        d| _%        | j                  r)d| _&        d| _'        | j                  jP                  | _(        d| _)        | jU                          | jW                  t         jX                  d        | jW                  t         jZ                  | j\                         | jW                  t         j^                  | j`                         | jW                  t         jb                  | jd                         | jW                  t         jf                  | jh                         y)z`
        :param parent: parent window
        :param kwargs: other wx.Window parameters
        )r#   rI   NFrd   rg   rl   re   rf   rh   ri   rj   rk   rc   z	MAP FRAMEzRASTER LEGENDzVECTOR LEGENDzMAP INFOz	SCALE BARIMAGEzNORTH ARROW)rL   rM   rN   rO   rP   rQ   rR   )i  i     rm  i  c                      y r  r  )r  s    r   r0  z.PsMapBufferedWindow.__init__.<locals>.<lambda>  s    r   )5rm   Windowro   r"   	FitInside_bufferrW   rd   rg   rl   re   rf   rh   ri   rj   rk   rc   r   itemLabelsDict
itemLabelsr   r=  r2  pdcPaperr4  pdcImageSetClientSizer   GetClientSizer   idBoxTmprg  idResizeBoxTmpidLinePointsTmpr   resizeBoxSizeshowResizeHelprp  rQ   imageIdr   r   rq  r   EVT_ERASE_BACKGROUND	EVT_PAINTOnPaintEVT_SIZEOnSizeEVT_IDLEOnIdleEVT_MOUSE_EVENTSMouseActions)r   r"   r#   rI   r   s        r   ro   zPsMapBufferedWindow.__init__U  sm    			4Be< G_
i(i(%=G_
F"%m4DF"%m4Dv *DK":.DMF?e}DH [>o.o.}+wZM*
  :j 
j 
:&"D$6$6$89!G#g %1WWQ]#<<DJDL;;..DL

		"))>:		",,-		"++t{{+		"++t{{+		"%%t'8'89r   c                    t         j                  }| j                  j                          | j                  j	                  |       | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  s| j                          yy)zClear canvas and set paperN)rm   LIGHT_GREY_BRUSHr  BeginDrawingSetBackgroundrq  
EndDrawingr2  r5  r4  rl   rr  )r   bgs     r   rq  zPsMapBufferedWindow.Clear  s      ""$##B'  "||LLN r   c                    t        |       }d}d}| j                  j                  | j                        }|j                  |j
                  }}d| j                  z  }	|sTd}d}| j                  }	|j                  |j                   dd      |	z  }|j                  |j
                   dd      |	z  }|j                  |j                         ||      |	z  }
|j                  |j                         ||      |	z  }|j                  |j                         |z
  ||      |	z  }|j                  |j                         |z
  ||      |	z  }|rt        |||
|      S t        t        |      t        |      t        |
      t        |            S )zKConverts canvas (pixel) -> paper (inch) coordinates and size and vice versapixelr  r+   r  )r$  r  GetIdBoundsrj   r  r  r   r%  GetWidth	GetHeightGetXGetYRect2DrZ  )r   r  r9  r+  fromUtoUpRectpRectxpRectyr"  WidthHeightr  r  s                 r   r[  z*PsMapBufferedWindow.CanvasPaperCoordinates  s    t$))$++6%''DNN"ECNNEUWWHwvNQVV  UWWHwvNQVV  DMMOeCPSXXMM 05MMPUU 	 MMv!5sMS 	

 MMv!5sMS 	
 !Qv..c!fc!fc%j#f+>>r   c           
      z   | j                   | j                     }|s<t        | j                  | j                        }| j                   j	                  |       t        j                  |       j                         }| j                         \  }}|d   |d   z  |d   |d   z  }}| j                  t        ||z  ||z        | _	        || j                  z  }|| j                  z  }|dz  |dz  z
  }|dz  |dz  z
  }| j                  t        t        |      t        |      t        |      t        |                   y)z$Sets and changes page, redraws paper)r#   rc   r  r   r  r+   Nr   )rh   rj   	PageSetuprc   r(  rm   r   GetPPIr  r   min	DrawPaperr   rZ  )	r   rl  ppicWcHpWpHr  r  s	            r   rr  zPsMapBufferedWindow.SetPage  s    ,:D++D1kk$&&(##%BgQ'h#a&)@B>>! b"r'2DN$.. $.. FR!VOFR!VOtCFCFCGSW=>r   c                    |j                         dk  r0|j                  |j                         |j                         z          |j                         dk  r0|j	                  |j                         |j                         z          |j                  t        |j                                      |j                  t        |j                                      |S )z0Recalculates rectangle not to have negative sizer   )	r  SetXr  r  SetYr  SetWidthr  	SetHeight)r   rs     r   modifyRectanglez#PsMapBufferedWindow.modifyRectangle  s    ::<!FF1668ajjl*+;;=1FF1668akkm+,	

3qzz|$%	C&'r   c           	      .   	 | j                   j                  d      j                  }dD ]  }| j                   j                  |d      }|D ]  }| j                   |j                     }|dv r,|dk(  ryt	        | j                   |   |d   d	   d	   |d   d	   d
   d| j
                        \  }}t	        | j                   |   |d   d
   d	   |d   d
   d
   d| j
                        \  }}	nt	        | j                   |   |d   j                         |d   j                         d| j
                        \  }}t	        | j                   |   |d   j                         |d   j                         d| j
                        \  }}	||d<   ||d<   ||d<   |	|d<   Nt	        | j                   |   |d   d	   |d   d
   d| j
                        \  }
}|
|c|d<   |d<     y# t        $ r) | j                   j                  d      j                  }Y w xY w)zPRecalculate east and north for texts (eps, points) after their or map's movementrL   r   )r   rQ   rR   rS   rT   r  T)rb  rT   r  rT   rC  r   r+   )mapInstrr  r  
paperToMaprc   r  east1north1east2north2eastnorthN)
rh   r   r#   AttributeErrorPaperMapCoordinatesrc   GetLeftGetTopGetRight	GetBottom)r   r   itemTypeitemsiteminstre1n1e2n2rK  ns               r   r/  z!PsMapBufferedWindow.RecalculateEN  sQ   	I$$::5ADDE V /	9H$$::8$:OE -9((1446)!4%)%5%5e%<#GnQ/2#GnQ/2'+ $"B "5%)%5%5e%<#GnQ/2#GnQ/2'+ $"B "5%)%5%5e%<#Fm335#Fm224'+ $"B "5%)%5%5e%<#Fm446#Fm557'+ $"B &(E'N&(E(O%'E'N&(E(O.!%!1!1%!8.+.+#' HHDAq 56q1E&M5>[-9/	9  	I$$::9EHHE	Is   %G" ".HHc                 @   | j                   syt        j                  | | j                         }|j                  t        j                         |j                          | j                  s| j                  j                  |       | j                         }| j                  s+| j                  j                  ||j                                n*| j                  j                  ||j                                | j                  j                  ||j                                y)zDraw pseudo DC to bufferN)r  rm   BufferedPaintDCr  r  rq  rl   r  DrawToDCGetUpdateRegionr2  DrawToDCClippedGetBoxr  r4  )r   r   r  rgns       r   r  zPsMapBufferedWindow.OnPaint1  s    ||dll3
 	,,-

 ||MM""2& ""$||KK''CJJL9MM))"cjjl;##B

5r   c                 4   | j                   xr | j                  d   dv }|j                         dk7  r| j                  |       y|j	                         r|s| j                  |       y|j                         r|s| j                  |       y|j                         r|s| j                  |       y|j                         r|s| j                  |       y|j                         r| j                  |       y|j                         r| j                  |       yy)z&Mouse motion and button click notifierr0   )r-   rW   r  r  r  r  r   N)rl   rd   GetWheelRotationOnMouseWheelLeftDown
OnLeftDownLeftUpOnLeftUpDragging
OnDraggingButtonDClickOnButtonDClick
MiddleDownOnMiddleDownMovingOnMouseMoving)r   r   disables      r   r  z PsMapBufferedWindow.MouseActionsJ  s    ,, 
4::e#4 9
 $
 !!#q(e$ ^^gOOE" \\^GMM%  ^^gOOE" !'& e$\\^u% r   c                    t        j                  ddd      dk(  r|j                          y|j                         }| j                  d   }|j                         | j                  d<   t        j                  dd	d      r|d
z  }|dkD  rd| j                  d<   nd| j                  d<   | j                  t        dddd            \  }}| j                  ||       || j                  d<   y)z,Mouse wheel scrolled.

        Changes zoom.displaymouseWheelZoom	selection)groupkeysubkeyr   Nr0   r.   scrollDirectionrm  r   r  r  )	r   r&  Skipr  rd   r  ComputeZoomr   Zoom)r   r   zoomoldUse
zoomFactorviews         r   r  z PsMapBufferedWindow.OnMouseWheelo  s    
 92B;W JJL%%'E"#//1

7)1B;WBJD!8 (DJJu )DJJu++DAq!,<=
D		*d#"

5r   c                    | j                   ry| j                  d   dv r|j                         }| j                  j	                  |d   |d         }|rj|d   | j
                  f| j                  z   v rK| j                  | j                  d          | j                  j                  t        d      d       d| _        y| j                  rB| j                  j                  d	d       | j                  | j                  d
          d| _        yyy)zTMouse cursor moving.

        Change cursor when moving over resize marker.
        Nr0   r-   rW   r   r+   r4   zClick and drag to resize objectTr   r1   F)rl   rd   r  r4  FindObjectsr  r  r   rg   r"   r  r   r  )r   r   r   foundResizes       r   r  z!PsMapBufferedWindow.OnMouseMoving  s    
 <<::e 55##%C++11#a&#a&AKNt':':&<t?S?S&SSt||J78))!,M*NPQR&*#&&KK--b!4NN4<<	#:;*/D' ' 6r   c                    |j                         | j                  d<   | j                  d   | _        | j                  d   dk(  r| j                  j	                  | j                  d   d   | j                  d   d         }| j
                  j	                  | j                  d   d   | j                  d   d         }|r |d   | j                  f| j                  z   v r d| j                  d<   | j                  | j                     j                  dk(  rd| _        | j                  j                  | j                        | _        | j                  | j                     d	   d
v r1d| _        | j                  j                  | j                        | _        | j                  | j                     j                  dk(  r$| j                  j                  |d         | _        yy|r|d   | _	        | j!                  | j                         | j                  | j                     j                  dvr5| j
                  j#                  | j                         | j%                          | j                  | j                     j                  dk7  r=| j                  D ]  }| j
                  j#                  |        | j%                          yyd| _	        | j
                  j#                  | j&                         | j
                  j#                  | j                         | j                  D ]  }| j
                  j#                  |        | j%                          yy)zaLeft mouse button pressed.

        Select objects, redraw, prepare for moving/resizing.
        r.   r0   r-   r   r+   rW   rL   F	scaleTyper   r+   r   TrT   rL   r  rm  N)r  rd   r.   r2  r  r4  r  r  rh   rp  r  
constraintr  	mapBoundsindexcurrentLinePointr^  r3  r6  r  )r   r   foundr  r#   s        r   r  zPsMapBufferedWindow.OnLeftDown  s   
 $//1

7ZZ(
 ::e	)KK++

7#A&

7(;A(>E ++11

7#A&

7(;A(>K
 Nt':':&<t?S?S&SS$,

5! ##DKK055>&+DO%)[[%<%<T[[%IDN''4[AYN*.)-)@)@)M##DKK055?,0,@,@,F,F{ST~,VD) @ #Ah$$T[[1##DKK055=QQKK(()<)<=LLN##DKK055?"22 1,,R01LLN @ !$$T]]3$$T%8%89.. -BKK((,-U *r   c           	      b   | j                   d   dv r| j                  j                  | j                        }| j                  j	                  | j                         | j                          | j                  |      \  }}| j                  ||       | j                   d   dk(  r| j                  j                  | j                        }|j                         dk  s|j                         dk  r6| j                  j	                  | j                         | j                          y| j                  |d      }t        | j                  g d| j                  | j                  |	      }|| j                  d
<   | j                  d
   j!                          | j                  j"                  j%                          y| j                   d   dk(  r| j                  j'                  d
      }|s| j                  j'                  d      }|j(                  }	| j*                  |	k(  rx| j,                  j                  |	      }
| j                  |
d      }|| j                  |	   d<   | j                  |	   d   dv rY| j                  |	   d   dk(  rPt/        | d| j                  |	   d
   | j                  | j                  |	   d   | j                  |	   d         \  }}}n| j                  |	   d   dk(  r?t/        | d| j                  | j                  |	   d   | j                  |	   d         \  }}}n-t/        | d| j                  |	   d   | j                        \  }}}|| j                  |	   d<   || j                  |	   d<   | j                  |d      }| j1                  | j2                  d
   | j4                  d
   | j,                  |	d|       nH| j                  |	   d   dk(  r3t7        | | j                  |	   j9                         | j                         t;        | j                  |	   d   | j                  |	   d   j<                  | j                  |	   d   j>                  | j                         | jA                  |	       | j                  dd !       n| j                  | j*                     jB                  d"k(  rf| j                  | j*                     d#   }tE        |d   |d         | j                  | j*                     d<   | jG                  | j*                  g$       nC| j                  | j*                     jB                  d%k(  r| jG                  | j*                  g$       d&| j                   d<   | j                   d   d'v r| j*                  d(k7  r| j                   d)   |jI                         k7  r| jG                  | j*                  g$       | j                  | j*                     jB                  | j                  v r?| j                  | j                  | j*                     jB                     jK                          yyy| j                   d   d*v r| j                  tM        |jO                         |jQ                         dd      d      dd }|jO                         | j                   d)   d   z
  }|jQ                         | j                   d)   d   z
  }| j                   d   d+k(  r| j                  jS                  |,       y| j                   d   d-v rtU        ||z  ||z  z         d.k  r6| j                  j	                  | j                         | j                          y| j                  tM        | j                   d)   d   | j                   d)   d   dd      d      dd }| j                   d   d/k(  r| j                  jW                  ||g,       n| j                  jY                  ||g,       | j                  j	                  | j                         | j                          yyy)0z]Left mouse button released.

        Recalculate zooming/resizing/moving and redraw.
        r0   )r  r  r     NTr8  NNN)r"   r#   ry  rc   r  rL   rW   r   r  r  r  r   mapType)r  rL   rc   r  r  r+   r  )r  rc   r  r  r   )r  r  rc   r"  Fr;  r<  r  )mapDictrc   rV  r  r  )r  r  rT   rC  rz  r  r-   r  rm  r.   )r  r  r  r  )r  r  r  r@   r  )-rd   r4  r  rg  r3  r6  r	  r
  r  r  r[  r  r"   rh   rc   ri   r  r{   r   r   r#   rp  r2  
AutoAdjustr]  re   rf   ComputeSetRegionr`  r  r8   r
  r^  r  Rect2DPPr~  r  rf  r   r  r  r  r   r  r  )r   r   zoomRr  r  rectTmp	rectPaperrL  mapObjr   newRectCanvasnewRectPaperr"  foor  rp  pointsendCoordinatesdiffXdiffYbeginCoordinatess                        r   r  zPsMapBufferedWindow.OnLeftUp  s    ::e 55KK++D,=,=>EKK  !2!23LLN#//6JIIj$' ::e(kk--d.?.?@G!B&'*;*;*=*B$$T%6%6733PT3UI{{%))HHC '*DU#U#((*KK--/ ::e(%%;;EBF))??	JIIE{{e# !% 7 7 >#::&d  ;   3?  '/##E*;79D''.{;q@+5 &' $ 0 0 7 > $$($4$4U$;I$F!%!1!1%!8!@,(sD ))%0=B+5 &' $#'#3#3E#:8#D!%!1!1%!8!@,(sD ,6 &'!%!1!1%!8!@ $	,(sD 7;D$$U+F37<D$$U+G4!%!<!<! "= "J II HHUO"jj/ KK$ *%   %%e,[9Q>$ $ 0 0 7 F F H HH ((/=**51&9??++E26:AA	 $$U+		QV	4!!$++.33v=))$++6w?8@FSTI8V  -f5((dkk](;!!$++.33{B((dkk](; )DJJu ::e 55$++:Kzz'"e&7&7&99((dkk](;##DKK0559I9II$$T%5%5dkk%B%G%GHUUW J :
 ZZ"II!88%**,

a;4 9 qN JJL4::g#6q#99EJJL4::g#6q#99Ezz% J.$$$@E"&AA56:KK(():):;LLN#'#>#>djj1!4djj6I!6LaQRS"& $? $ 1$  ::e$	1KK''5E~4V'WKK,,%5~$F -  $$T%6%67% B Jr   c                    | j                   d   dk(  r| j                  dk7  r| j                  j                  | j                  j                  | j                  j
                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  d}t        d| j                        t        d      t        d      t        d| j                        t        d| j                        t        | j                        t        | j                        t        | j                        t        d      t        dd	
      t        dd      d}| j                  | j                     j                  } ||   di ||    yyy)zOpen object dialog for editing.r0   r-   rm  )r   rO   rP   rQ   rR   rS   rT   r  rM   rN   rL   N)r   r#   r  )r#   r+   )r   rl  T)r   r  r  )rd   rp  r"   r  r  r  r  r  r  r  r  r  r  r   rh   r  )r   r   itemCallitemArgr  s        r   r  z"PsMapBufferedWindow.OnButtonDClickt  sq   ::e	)dkkR.?--;;33 KK55//"kk99--++![[55 $ 7 7 $ 7 7{{++H 4DKK8d+ t,DT[[9"$++>-,!T[[1 $4 0 $4a 8$6G ##DKK055DHTN+WT]+= /@)r   c           	         |j                         rh|j                         | j                  d<   | j                  | j                  d   | j                  d          |j                         | j                  d<   y|j	                         rm| j                  d   dv r|j                         | j                  d<   t        | j                  d   d   | j                  d   d   | j                  d   d   | j                  d   d   z
  | j                  d   d   | j                  d   d   z
        }| j                  |      }| j                  d   dv r| j                  d   d	k(  r!d
}| j                  d   | j                  d   f}nd}d}|d   dk  s|d   dk  ry| j                  | j                  d
   | j                  d
   | j                  | j                  |||       nE| j                  | j                  d   | j                  d   | j                  | j                  d|       | j                  d   dk(  rg|j                         | j                  d<   | j                  | j                  d   | j                  d          |j                         | j                  d<   | j                  d   dk(  r| j                  dk7  r|j                         | j                  d<   | j                  d   d   | j                  d   z
  | j                  d   d   | j                  d   z
  }}| j                  j                  | j                  ||       | j                  j                  | j                   ||       | j                  j                  | j"                  ||       | j$                  D ]  }| j                  j                  |||       ! | j&                  | j                     j(                  dk(  r^| j&                  | j                     d   d   |z   | j&                  | j                     d   d   |z   f| j&                  | j                     d<   |j                         | _        | j+                          | j                  d   dk(  rw|j                         }|d   | j                  d   d   z
  }	|d   | j                  d   d   z
  }
| j&                  | j                     j(                  dk(  r| j,                  j/                         | j,                  j1                         }}| j,                  j3                         | j,                  j5                         }}| j6                  r9||kD  r||	z   }||	t9        |      |z  z  z   }n$||
t9        |      |z  z  z   }||
z   }n
||	z   }||
z   }|dk  s|dk  ryt        ||||      }| j                  | j                  d   | j                  d   | j                  | j                  d|       n| j&                  | j                     j(                  dk(  r| j&                  | j                     }| j;                  |d   d      }|j=                  |j3                         |	z          |j?                  |j5                         |
z          |j3                         dk  s|j5                         dk  ry| jA                  | j                  d|d   |d    |d!   |"       n| j&                  | j                     j(                  d
k(  r| j&                  | j                     }|d#   }| jB                  dk(  r|d   }n|d   }| j;                  tE        |d$      d      dd }tG        j
                  ||      }| jA                  | j                  d
|d   |d!   |||f%       | j;                  t        |d   |d   dd      d&      dd || jB                  <   | jI                  | j                         yyy)'z(Process panning/resizing/drawing/moving.r/   r.   )r.   r/   r0   )r  r  r  r  r  r   r+   r!  r  rT   r  Nr   r  )re   rf   r=  r>  r?  r@  rG  rU   r<  r  r-   rm  r   rJ  rW   rL   
   r;  r  Fr8  r@   rE  rD  r8   )r>  rF  rE  rD  r8   r@  rC  r  )r>  rF  rE  r8   r@  rG  T)%MiddleIsDownr  rd   Pan
LeftIsDownr   r  r]  re   rf   r4  rg  rp  r.   r2  TranslateIdr  r  r  rh   r  r6  r  r  r  r  r  r  r  r[  r  r  ra  r  r_  rm   r^  )r   r   r  pdcTyperG  dxdyr#   r   r.  r/  r  r  r8   r
  newWidth	newHeightrS  r  r  r,  pPaperpCanvass                          r   r  zPsMapBufferedWindow.OnDragging  s}    % 1 1 3DJJuHH4::g.DJJu4EHF"'"3"3"5DJJwzz%  %  %*$5$5$7

5!JJw'*JJw'*JJu%a(4::g+>q+AAJJu%a(4::g+>q+AA	 ((+::e$(CCzz%(I5"(&*jj&94::e;L%M
"(%)
Q4!8qtax"II HHV,"jj0 KK#00 '#-   II HHUO"jj/ KK#00 &   zz% E)$)$5$5$7

5!tzz'2

58IJ&+&7&7&9

7# zz% I-$++2C$)$5$5$7

5!JJu%a(4::a=8JJu%a(4::a=8  ''R<''r2>''(;(;RD.. 8BKK++BB78##DKK055?((5h?BRG((5h?BRG?D$$T[[1(; #..0
 zz% H,'')AG!4Q!77AG!4Q!77##DKK055>>>..0$..2E2E2GqA//1002 "E
  6>',u}H(.%-%:O1P(PI',uev8M/N'NH(.I#(5=$*UN	"}	B!!Q)<FII HHUO"jj/ KK#{{ *!   %%dkk277;F ,,T[[9E66"6]% 7 D MM$--/E"9:NN4>>#3e#;<}}*dnn.>.B%%#{{)#Gn$X#Gn &  %%dkk2776A ,,T[[9E"7^F,,1!'!'"99%ff5U : qG  WWWc2F%%#{{$#Gn#Gn!$'> &  594O4O!#a&#a&!Q7t 5P 5q5F4001 $$T[[1c -Y  r   c                 >    |j                         | j                  d<   y)zMiddle mouse button pressed.r.   N)r  rd   r   s     r   r  z PsMapBufferedWindow.OnMiddleDown=  s    #//1

7r   c                 X    |d   |d   z
  |d   |d   z
  f}d}| j                  ||       y)zMove canvas while dragging.

        :param begin: x,y coordinates of first point
        :param end: x,y coordinates of second point
        r   r+   N)r
  )r   r.   r/   r  r  s        r   r7  zPsMapBufferedWindow.PanA  s;     Qx#a& %(SV"33
		*d#r   c           	      
   |D ]G  }| j                   |   j                  }|dv rM| j                  | j                  j	                  |      d      | j                   |   d<   | j                          n|dv r| j                  | j                  j	                  |      d      | j                   |   d<   | j                  | j                  j	                  |      d      d d | j                   |   d<   |dv s| j                          |d	k(  r| j                  j	                  |      }| j                  |d      | j                   |   d<   |j                  t        |j                         dz        t        |j                         dz        
       | j                  |d      d d | j                   |   d<   | j                          |dk(  r
| j                  j	                  |      }| j                   |   d   }| j                  |d      }|d   |d   z
  }|d   |d   z
  }|| j                   |   d<   t        j                  | j                   |   d   d    }	t        j                  | j                   |   d   d    }
|	t        j                  ||      z  }	|
t        j                  ||      z  }
|	|
g| j                   |   d<   | j                          |dk(  rn| j                  | j                  j	                  |      d      | j                   |   d<   | j                   |   d   j                         | j                   |   d<   I|dk(  sP| j                   |   d   d   | j                   |   d   z
  | j                   |   d   d   | j                   |   d   z   }}| j                  j                  | j                   |         }| j                   |   d   &t        | j                   |   d         dz  t         z  }nd}| j                   |   d   j#                         d   dk(  r	||d   z  }n1| j                   |   d   j#                         d   dk(  r||d   dz  z  }| j                   |   d   j#                         d   dk(  r)||d   t%        |      z  z  }||d   t'        |      z  z  }nT| j                   |   d   j#                         d   dk(  r.||d   dz  t%        |      z  z  }||d   dz  t'        |      z  z  }| j                  t)        ||dd      d      d d | j                   |   d<   | j                          J y )Nr  Tr8  r  )rO   rM   rN   rQ   rR   r   rC  )rQ   rR   rS   )r;  r<  rT   r   r+   rP   r   rJ  rO  rP  rI  rH  r  rK  rL  rM  rN  )rh   r  r[  r2  r  r/  OffsetrZ  r  r  rm   Point2D	GetCentrer"   r  r  r   r   r   r   r  )r   r{  r#   r:  r  oldRectnewRectxDiffyDiffri  rj  r  r  rn  rm  s                  r   r~  z'PsMapBufferedWindow.RecalculatePositionK  s    V	%B$$R(--E,,/3/J/J004D 0K 0  $V, ""$   04/J/J004D 0K 0  $V, 150K0K004D 1L 111  $W- 33&&('!{{..r2/3/J/JT 0K 0  $V, 4==?Q./4>>+a/0   150K0KT 1L 111  $W- ""$&{{..r2**2.v6554t5T
WQZ/
WQZ//6  $V,T%5%5b%9'%B1%EFT%5%5b%9'%B1%EF"**UE22"**UE22170@  $W-""$*$/3/J/J004D 0K 0  $V, 150@0@0DV0L0V0V0X  $W-&$$R(2158H8H8LY8WW$$R(2158H8H8LY8WW  22D<L<LR<P2Q##B'1= 0 0 4X >?#EJCC##B'.446q9WDNA%%b)%0668;xGQ&A##B'.446q9WDSX--ASX--A%%b)%0668;xGQS11AQS11A040K0K1a+4 1L 111  $W- ""$mV	%r   c                    d}| j                         \  }}t        |      }|j                         r=d}| j                  d   dk(  rd|z  }| j                  d   \  }}|||z  z
  }|||z  z
  }n{t        |j	                               t        |j                               }
}		 dt        |	|z  |
|z        z  }t        |dz
        dkD  r|}nd}| j                  d   dk(  rt        |	|z  |
|z        }	 |	|
z  ||z  kD  rw|j                         |	||z  z  |
z
  dz  z
  }|j                         }| j                  d   dk(  r|j                         |	||z  |
z  z
  dz  z   |j                         }}| | }}nv|j                         |
||z  z  |	z
  dz  z
  }|j                         }| j                  d   dk(  r5|j                         |j                         |
||z  |	z  z
  dz  z   }}| | }}|t        |      t        |      ffS # t        $ r d}Y Yw xY w# t        $ r# |j                         |j                         }}Y Uw xY w)	z$Computes zoom factor and scroll viewr+   g      ?r0   r  g      ?r.   g{Gz?r   )r  r  IsEmptyrd   r  r  maxZeroDivisionErrorr  r  r  r  rZ  )r   r  r  r  r  r  r  xViewyViewrWrHs              r   r	  zPsMapBufferedWindow.ComputeZoom  sT   
##%B2Y<<>Jzz% I- :-
::g&DAqJ&EJ&E 4==?+U4>>3C-DBR"Wb2g!66

 :>"T)'
 
zz% I- b"r'2
87R"W$ IIK2b>B+>!*CCE IIKEzz%(I5#yy{bBGr>.AQ-FF		1()rA2u IIK2b>B+>!*CCE IIKEzz%(I5#yy{DIIK2bB;NRS:S,S1()rA2u CJE
3337 % 
2 % 8#yy{DIIKu8s%   !H 1C8H HH)H?>H?c           
       	   | j                   sy| j                   |z  | _         | j                   dkD  s| j                   dk  r| j                   |z  | _         y| j                  s| j                  j                  | j                        }t
        j                  r|j                  |d    |d           n|j                  |d    |d           | j                  ||      }| j                  |       | j                  D ]  }| j                  |   j                  }|dk(  r#| j                  | j                  |   d   d	
      }|dk(  r.| j                  |   d   }t        |      D 	cg c]  \  }}	t!        |	      ||   z
  |z   c}	}x| j                  |   d<   }| j"                  j%                  | j                  |         }
| j                  |   d   rt'        | j                  |   d         }nd}| j"                  j)                  |d   |d   |
|      x| j                  |   d<   }| j+                  | j,                  || j                  |   ||       | j,                  j/                  ||       z|dk(  r=| j1                  | j2                  |   | j4                  |   | j,                  |d|       |dv r| j                  |   }| j                  |   d   }dx}x}}|dv r| j                  |   d   }|dv r| j                  |   d   }|dv rT|d   d   |d   d   }}| j                  t7        |d      d	
      dd }| j                  t7        |d      d	
      dd }||f}| j9                  |||||||       | j1                  | j2                  |   | j4                  |   | j,                  |d|        | j:                  dk7  r| j=                  | j:                         yy| j>                  j                  | j@                        }t
        j                  r|j                  |d    |d           n|j                  |d    |d           | j                  ||      }| jC                  |       yc c}	}w ) z-Zoom to specified region, scroll view, redrawNr5  g?r   r+   r!  r  r  Fr8  r   rJ  rI  rH  rQ  rR   rA  r<  rB  rE  )rS   r  rD  r  r8   rT   rC  r  r   )r>  rF  r@  rG  rE  rD  r8   r;  rm  )"r   rl   r  r  rj   r   wxPythonPhoenixrD  OffsetXY	ScaleRectr  rk   rh   r  r[  	enumeraterZ  r"   r  r  r  rc  r2  SetIdBoundsr]  re   rf   r_  ra  rp  r^  r  r  rD  )r   r  r  r  r#   r  oRectrJ  icoordrn  rm  rS  r  rE  r8   rD  ri  rj  	imageRects                       r   r
  zPsMapBufferedWindow.Zoom  s   ~~*4>>B$..3"6!^^j8DN||MM--dkk:E((d1gXQx0Qx$q'2NNZN@ENN5! mm R''+008#33))"-f5U 4  6>!--b1(;F )2&(9?$Au Ud1g-;? D$$R(2V "[[66@P@PQS@T6UF''+H5#D$4$4R$8$BC "&!B!Bq	6!9fc"D$$R( $$ KK!!%!1!1"!5%% %  KK++B7\)II HHTN"jj. KK! (    ;; ,,R0E ,,R09E.22E2FV55!%!1!1"!5h!?44 $ 0 0 4W =').w):E'N1<M!%!<!<!)&&!9 "= "1" "&!<!<!)&&!9 "= "1" #)&!1%%!" #)#%# &  II HHTN"jj. KK! *   WRh {{b $$T[[1 !
 11$,,?I((  $q'DG84""DG8d1gX6IZHINN9%i?s   (Q:c                 z   | j                   s&| j                  j                  | j                        }n%| j                  j                  | j
                        }|j                  t        |j                  dz        t        |j                  dz              }| j                  |      \  }}| j                  ||       y)zZoom to full extentr  N)rl   r  r  rj   r  r  r  r  r8   r
  r	  r
  )r   rS  zoomPr  r  s        r   r  zPsMapBufferedWindow.ZoomAllG	  s    ||]]..t{{;F]]..t||<FuV\\B%67v}}r?Q9RS++E2
D		*d#r   Nr  r   c                 p   |
t               }|j                         }|j                          |j                  |       |j	                  |       |j                  |       |j                  |       |dk(  rBt        r:| j                  |   d   }| j                  |   d   }	| j                  |||	|       nd}|dv r |j                  |  |dk(  rt        |       }
|
j                         }d}|j                  |       |j                  t        j                          |
j#                  |       |j#                  |       dj%                  | j&                  |         }|
j)                  |      \  }}}||f}t+        d	d	g| j-                  t+        |       }t/        t0        |      }t+        | j3                  |      s|d
k\  r|dz  }|j                  |       |
j#                  |       |j#                  |       |
j5                  |      }t+        d	d	g| j-                  t+        |       }t+        | j3                  |      s|d
k\  r|j7                  t        j8                  dddd             |j;                  t        j<                         |j?                  ||       nW|dk(  r3|jA                  |d	   |d   dz  z   |d   |d   dz  z   |d   dz         n|dk(  r |jB                  g |d	   |d     |jE                  |t+        |        |jG                          | jI                          |S )a  Draw object with given pen and brush.

        :param pdc: PseudoDC
        :param pdctype: 'bitmap'/'rectText'/'rect'/'point'/'line'
        :param bb: bounding box
        :param lineCoords: coordinates of line start, end points (wx.Point, wx.Point)
        rA  epsfilerH  )r=  filePathr  bboxr;  )r  r;  r5  
r   r  r   rG   rF   r   r  rS   r+   r  )r  r  radiusrT   )%r   r&  r  r3  SetIdSetPenSetBrushr   rh   
DrawBitmapDrawRectangler   GetFontSetPointSizeSetStylerm   ITALICr  rt   r  r  r   CenterInrL   rZ  ContainsRectGetTextExtentSetTextForegroundr   SetBackgroundModeTRANSPARENT	DrawLabel
DrawCircleDrawLinePointrX  r  r6  )r   re   rf   r=  r>  r?  r@  rG  filer  r  r  sizer   r  r  r  r  textRectr  s                       r   r]  zPsMapBufferedWindow.DrawQ	  s   " >WFVVXV		&

3Uh''/	:++F3H=C$PRS$**Cr"j $B::<DDd#MM"))$JJtKK99T__V45D44T:HAq"QJAq.:.77b	BHCAAh++H5$!)	!!$'

4 D!--d3
12z2;;D"IF Ah++H5$!) !!"))Cc3"?@!!"..1MMt(M3NNRURUQY."Q%"Q%!)2CBqETUINVC=z!}=z!}=b	*r   c           	         dddd}|dk(  rt         j                  }	ny|6t        |       }
t        |
j	                  |dd      | j
                  z        }nd	}t        j                  t        |      |
      }	|	j                  t         j                         t         j                  }|r$|dk7  rt        j                  t        |            }| j                  |	|| j                  ||   |||       y)a  Draw point/line/rectangle with given color and width

        :param drawid: id of drawn object
        :param shape: drawn shape 'point'/'line'/'rectangle'
        :param color: pen outline color ('RRR:GGG:BBB')
        :param fcolor: brush fill color, if meaningful ('RRR:GGG:BBB')
        :param width: pen width
        :param bb: bounding box
        :param lineCoords: line coordinates (for line only)
        rS   rT   r  rB  noneNr  r  r   r6   )r7   )re   rf   r=  r?  r>  r@  rG  )rm   TRANSPARENT_PENr$  rZ  r%  r   r   
convertRGBSetCapCAP_BUTTr   r   r]  r2  )r   r>  rF  rE  r@  r8   rD  rG  r?  re   r+  rf   s               r   ra  z PsMapBufferedWindow.DrawGraphics	  s     $V&IF?$$C &t,MMMPnn%
 &&
5 1?CJJr{{#$$f&HHJv$67E		EN! 	 	
r   c                 6   t         j                  |      }|r\|j                  d      }|j                  |d      }t         j	                  d|j
                  d      }t         j                  |||      }|j                  t        |d         t        |d         ft         j                        }t        |      }|j                         }	t        j                  |	t        j                        }
|	j                  |
       |j!                  |	|d   |d   d	
       y)zDraw bitmap using PILRGBAr+   )expand)rD   rD   rD   rD   r   r  )resampler   T)useMaskN)r:  r  r%  rH  newry  	compositerW   rZ  BICUBICr   ConvertToBitmaprm   MaskWHITESetMaskri  )r   r=  ra  r  rb  pImgrm  r  imgrA  masks              r   ri  zPsMapBufferedWindow.DrawBitmap	  s    }}X&<<'D++hq+1C,,vsxx<C%%c34D{{CQL#d1g,7(BRBR{S%$$&wwvrxx(tvtAwQ>r   c                    |d   rt        |d         }nd}|d   dk7  r|d   }nd }|j                  |       |j                  |       |j                          |r:|j	                  t        |             |j                  t        j                         n|j                  t        j                         | j                  j                  |      }|j                  |       |j                  t        |d                |dk(  r|j                  |d   |       n/|j                  |d   t!        |d         t!        |d         |       |j#                  |t%        |        | j'                          |j)                          y )	NrH  r   
backgroundr|  rE  r   rd  r+   )r  r3  rf  r  SetTextBackgroundr~  rs  rm   SOLIDrt  r"   r  r  rr  ru  DrawRotatedTextrZ  rX  r   r6  r  )	r   r=  rR  r  rJ  rS  rm  r  r  s	            r   rc  zPsMapBufferedWindow.DrawRotText	  s<   H*+CCL!V+!,/JJV		& !!*Z"89!!"((+!!"..1[[##H-Bj'):;<!8MMx/fM= 0#fQi.#fQi.RUVf.r   c                    | j                   j                  | j                         | j                   j                  | j                         | j                  }|j                         |j                  k7  s|j                         |j                  k7  r&|j                  |j                  |j                        }|j                         }| j                   j                          | j                   j                  ||j                  |j                         | j                   j                  | j                  |       | j                   j!                          | j#                          y)zDraw preview image to pseudoDCN)r  ClearIdr  rf  rQ   r  r8   r  r
  Scaler  r  ri  r  r  rX  r  r6  )r   r  r  rA  s       r   rD  zPsMapBufferedWindow.DrawImage 
  s    dll+DLL)jj<<>TZZ'3==?dkk+I))DJJ4C$$&""$  8!!$,,5  "r   c                 x   | j                   | j                     }|d   |j                         z  }|d   |d   z
  |d   z
  |z  }|d   |d   z
  |d   z
  |z  }|d   |z  |j                         z   }|d   |z  |j	                         z   }| j
                  j                          | j
                  j                  | j                         | j
                  j                  | j                         | j
                  j                  | j                  d          | j
                  j                  | j                  d          | j
                  j                  |       | j
                  j                  | j                  d          | j
                  j                  | j                  d          | j
                  j                  t        |      t        |      t        |      t        |             | j
                  j!                  | j                  |       | j
                  j#                          | j%                          y	)
zDraw paper and marginsr  RightLeftr  TopBottomrJ   rK   N)rh   rj   r  r  r  r  r  r3  rf  rg  re   rh  rf   DrawRectangleRectrj  rZ  rX  r  r6  )r   r  rl  r"  r  r  r  r  s           r   r  zPsMapBufferedWindow.DrawPaper
  s   ,W/']T']*T&\9UB(^d5k)DN:eCL5 499;.K%$))+-""$t{{+DKK(TXXg./tzz'23''-TXXi01tzz)45##CFCFCFCFC!!$++t4  "r   c                    t        j                  | j                  t         j                        }| j	                         \  }}|j                         |j                         }}t        t        |      |z  t        |      |z        | _	        || j                  z  }|| j                  z  }|dz  |dz  z
  }|dz  |dz  z
  }t        t        |      t        |      t        |      t        |            }|S )z0Returns image centered in canvas, computes scaler   )rm   rB  r   rC  r  r  r  r  r  r   r   rZ  )	r   r  r  r  iWiHr  r  r\  s	            r   rA  zPsMapBufferedWindow.ImageRect(
  s    hht||R%7%78##%BBU2Y^U2Y^<$.. $.. FR!VOFR!VOQQR#b':	r   c           
         | j                   |k(  r| j                  j                  |      }| j                  |   j                  dk7  r|j                  dd      }| j                  | j                  d   | j                  d   | j                  | j                  d|       | j                  |   j                  dv r| j                  j                  |      j                         }t        |d   |d   | j                  d   | j                  d         }| j                  | j                  d	   | j                  d	   | j                  | j                  d|       y| j                  |   j                  dk(  rY| j                  |   d
   d   }| j                  |   d
   d   }| j                  t!        |d      d      dd }| j                  t!        |d      d      dd }g }t        dd| j                  d   | j                  d         }|j#                  |j%                  t        |d   |d   dd                   |j#                  |j%                  t        |d   |d   dd                   t'        ||f      D ]P  \  }	}
| j                  | j                  d	   | j                  d	   | j                  | j(                  |	   d||	          R yyy)z8Redraws select box when selected object changes its sizerT   r  rV   r  r<  r  r   r+   rW   rC  r  Fr8  Nr   )rp  r2  r  rh   r  r  r]  re   rf   r4  r  GetBottomRightr   r  r  r[  r_  r  ro  rW  r  )r   r#   r  controlPp1Paperp2Paperp1Canvasp2CanvasrU   rZ  rS   s              r   r^  z#PsMapBufferedWindow.RedrawSelectBox7
  s   ;;";;**2.D#((F2||Aq)IIHHX&jj*KK}}   #((,@@;;2226EEGQKQK&&q)&&q)	 		***X..."   !!"%**f4**2.w7:**2.w7:66!'62% 7 1  66!'62% 7 1 1a!3!3A!68J8J18MNCLLhqk8A;1)MNOCLLhqk8A;1)MNO )8X*> ? HAuII HHX."jj2 KK#33A6 &7   5A r   c                    | j                   j                  d      }|r|j                  }nd}| j                   j                  d      }|r|j                  }nd}d}|r$| j                   |   d   j                  d      d   }| j                   j                  d      j                  }g | j                  |<   | j                  |   j                  | j                  d          | j                  |   j                  d|z          |rM| j                   |   d	   D ]8  }| j                  |   j                  d
|d   j                  d      d   z          : | j                   j                  d      }|rz| j                   |j                     d   }	|	sy|	D 
cg c]  }
|
j                  d      d    }	}
| j                  |   j                  t        d      dj                  |	      z          yyc c}
w )zUpdates map frame labelr  NrT  NonerU  r   rL   zraster: rb  zvector: r  zlabels: z, )	rh   r   r#   r   r  r  r  r   rt   )r   r  r  rT  rc  
rasterNamer   rL   r  
labelFileslFiles              r   ro  z"PsMapBufferedWindow.UpdateMapLabelp
  s    !!77AyyHH!!77AyyHH
))(3H=CCCHKJ  66u=@@!#%%d&9&9%&@A%%j:&=>''1&9 Q&--j3q6<<;LQ;O.OPQ !!77A))&))4X>J;EF%%++c*1-FJFOOE"))!J-$))J:O*OP  Gs   G(c                    g | j                   |<   | j                   |   j                  | j                  |          |dk(  rNt        j                  j                  | j                  |   d         }| j                   |   j                  |       y y )NrQ   r`  )r  r  r  rr   rs   basenamerh   )r   r:  r#   rx  s       r   r\  zPsMapBufferedWindow.UpdateLabel
  sz     ""4#6#6u#=>G77##D$4$4R$8$CDDOOB&&t, r   c                     | j                   r| j                  j                  dk(  s%| j                   s)| j                  j                  dk(  r| j                          | j	                  d       |j                          y)z$Init image size to match window sizer+   r   N)rl   r"   r   r  r  r  r   s     r   r  zPsMapBufferedWindow.OnSize
  sT     LL''1,<<''1,LLND

r   c                     | j                         \  }}t        |d      }t        |d      }t        ||      | _        d| _        y)zcOnly re-render a image during idle time instead of
        multiple times during resizing.
        r  TN)r  rM  r   r  rW   )r   r   r8   r
  s       r   r  zPsMapBufferedWindow.OnIdle
  sC    
 **,v E2VR"5&1r   c           	          t        t        |j                         |z        t        |j                         |z        t        |j	                         d   |z        t        |j	                         d   |z              S )zScale rectangler   r+   )r   rZ  r  r  GetSize)r   r  r"  s      r   rV  zPsMapBufferedWindow.ScaleRect
  se    &'%&q!E)*q!E)*	
 	
r   )Tr  ))r  r  r  __doc__rm   r  NO_FULL_REPAINT_ON_RESIZEro   rq  r[  rr  r  r/  r  r  r  r  r  r  r  r  r  r7  r~  r	  r
  r  r   r]  ra  ri  rc  rD  r  rA  r^  ro  r\  r  r  rV  r  r   r   r   r   R  s    " "*F*FQ:f"?H?*69p62#&J#6003j[z ,De2N2$W%r,4\s&j$ 1aHV MQ)
V? (T 07r!QF-
r   r   )Ar  rr   r|   version_infomajorr   queuemathr   r   r   r   rm   wx.lib.agw.flatnotebooklibagwflatnotebookr   ImportErrorwx.lib.flatnotebookgrass.scriptscriptr   corer   gui_core.menur	   core.gconsoler
   r   psmap.toolbarsr   	core.gcmdr   r   r   core.settingsr   
core.utilsr   gui_core.formsr   gui_core.widgetsr   gui_core.dialogsr   gui_core.ghelpr   gui_core.wrapr   r   r   r   r   psmap.menudatar   gui_core.toolbarsr   psmap.dialogspsmap.instructionspsmap.utilsrn   r   r  r   r  r   r   <module>r     s   " 
 
Q # # 	%((    1 ' 2 2 & (  & , * L L ( *    W Wt(k
")) k
g)  %$$%s   C, ,C=<C=