
    ը	f                        d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ 	 e 	 ddl ddl ddl dadadad Zd Z d Z!	  e" e#e$      e%e$      Z& e&e      a' e" e#e$      e$      Z( e(e       a) G d d      Z*y# e$ r eZY cw xY w# eeef$ r-Z ed	j5                  e      ej6                  
       Y dZ[dZ[ww xY w# e$ r Y Ww xY w)a  
@package vdigit.wxdisplay

@brief wxGUI vector digitizer (display driver)

Code based on wxVdigit C++ component from GRASS 6.4.0
(gui/wxpython/vdigit). Converted to Python in 2010/12-2011/01.

List of classes:
 - wxdisplay::DisplayDriver

(C) 2007-2016 by the GRASS Development Team

This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.

@author Martin Landa <landa.martin gmail.com>
    )print_functionN)Debug)UserSettings)DecodeString)Rect)*zwxdigit.py: {})file c                     t         rYt        j                  j                  dk\  rt	        | j
                        } t         j                  | t        j                  z          nt        |        t        d| z   z  a
y)zRedirect stderr    r   )logsysversion_infomajorr   datawriteoslinesepprint
last_error)msgtypes     1/usr/lib/grass83/gui/wxpython/vdigit/wxdisplay.pyprint_errorr   2   sV     !!Q&sxx(C		#

"#c
#)J    c                 >    t         rt         j                  |        y	 y)zRedirect progress infor   )progressSetValue)values    r   print_progressr!   A   s"     %   	r   c                  0    t         } | d   dk7  r| dz  } da | S )N.r
   )r   )rets    r   GetLastErrorr&   L   s%    
C
2w#~s
JJr   c                       e Zd Zd Zd Zd Zd Zd#dZd Zd Z	d Z
d$d	Zd
 Zd Zd$dZd Zd Zd%dZd&dZd'dZd Zd&dZd(dZd)dZd Zd Zd Zd Zd*dZd Zd+dZd Zd,dZ d  Z!d! Z"d" Z#y)-DisplayDriverc                 ,   |a |at        d       t        j                  dk7  r$t        j                  t
        j                  d       t        t               t        t               d| _        d| _        d| _        || _        || _        || _        |j%                         | _        || _        t         | _         d| _        d| _        t/               | _        t3               | _        dt7               t7               t7               d| _        i d	dd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd| _        | j=                          d| _        d| _         | jC                          y)a  Display driver used by vector digitizer

        :param device: wx.PseudoDC device where to draw vector objects
        :param deviceTmp: wx.PseudoDC device where to draw temporary vector objects
        :param mapOng: Map Object (render.Map)
        :param windiow: parent window for dialogs
        :param glog: logging device (None to discard messages)
        :param gprogress: progress bar device (None to discard message)
        wxvdigitwin32CNFTr#   )fieldcatsidsidsDupl	highlighthighlightDupl)enabledcolorpointline
boundaryNoboundaryOneboundaryTwo
centroidIncentroidOutcentroidDupnodeOnenodeTwovertexarea	direction	lineWidth)"r   r   	G_gisinitr   platformlocale	setlocale
LC_NUMERICG_set_error_routineerrfuncG_set_percent_routineperfuncmapInfo	poMapInfois3DdcdcTmpmapObjGetCurrentRegionregionwindow	firstNode
lastNodeIdVect_new_line_structpoPointsVect_new_cats_structpoCatslistselectedsettings_resetTopology_drawSelected_drawSegmentsUpdateSettings)selfdevice	deviceTmprQ   rT   glog	gprogresss          r   __init__zDisplayDriver.__init__a   s    *<<7"V..4G$g& 	
--/ -.*, F6v	


>
 6
 5	

 ed;
 ut<
 ut<
 ed;
 ut<
 ut<
 548
 548
 %$7
 5
 UT:
  !
( 	""r   c                     t                t                | j                  r| j                          t	        | j
                         t        | j                         y)zClose currently open vector mapN)G_unset_error_routineG_unset_percent_routinerM   CloseMapVect_destroy_line_structrX   Vect_destroy_cats_structrZ   rb   s    r   __del__zDisplayDriver.__del__   s6    !>>MMO / -r   c                 ,    ddddddddddddd| _         y)zReset topology dictr   )r1   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   N)topologyrn   s    r   r^   zDisplayDriver._resetTopology   s1     
r   c                 B   t        | j                  d   | j                  d         }| j                  d   | j                  j                  dz  |z  z
  }| j                  d   | j                  j                  dz  |z  z   }t        ||z
  |z        t        ||z
  |z        fS )a!  Conversion from geographic coordinates (east, north)
        to screen (x, y)

        .. todo::
            3D stuff...

        :param east: east coordinate
        :param north: north coordinate
        :param elev: elevation

        :return: x, y screen coordinates (integer)
        ewresnsrescenter_easting   center_northing)maxrS   rQ   widthheightint)rb   eastnorthelevmap_reswns          r   _cell2PixelzDisplayDriver._cell2Pixel   s     dkk'*DKK,@AKK()T[[->->-Bg,MMKK)*dkk.@.@1.D-OOD1H'(#q5yG.C*DDDr   c                    |r|sy|j                  |j                  |z
  |j                  |j                  |z   |j                         |j                  |j                  |j                  |z
  |j                  |j                  |z          y)a(  Draw cross symbol of given size to device content

        Used for points, nodes, vertices

        :param pdc: PseudoDC where to draw
        :param point: coordinates of center
        :param size: size of the cross symbol

        :return: 0 on success
        :return: -1 on failure
        r#   r   )DrawLinexy)rb   pdcr5   sizes       r   
_drawCrosszDisplayDriver._drawCross   sc     %UWWt^UWWeggneggFUWWeggnegguww~Fr   c           
         | j                   r| j                  syt        j                  dd|j                  |j
                  |j                         d}|j
                  t        k(  r| j                  t        | j                  |j                              rS| j                  }t        j                  }t        j                  }d}| j                  dxx   dz  cc<   | j                  s<y|j
                  t        k7  r| j                  |j                        r| j                  }| j                   d   d   r^| j#                  |j                        rCt        j$                  | j                   d   d	   | j                   d
   t        j&                        }n?t        j$                  | j                   d   | j                   d
   t        j&                        }d}| j                  dxx   dz  cc<   | j                  s-y| j                   }| j)                  |j
                        \  }}d}|j+                  |       |r|j-                  |       |j
                  t.        t0        z  t2        z  t4        z  t6        z  t8        z  t:        z  z  r|dkD  rR|j
                  t:        k(  rd}n<|j
                  t6        t8        z  z  r"| j<                  r
d}d| _        n| j>                  }tA        |j                        D ]>  }|jB                  |   }|dkD  r|jE                  |       |dz  }| jG                  ||       @ y|dkD  rK| jH                  r>d| _%        |j                  dz  dz
  | _        d}d}||j                  dz
  k  rt        jL                  |jB                  |   jN                  |jB                  |   jP                        }t        jL                  |jB                  |dz      jN                  |jB                  |dz      jP                        }	|jE                  |       |j+                  |       |jS                  |dz
  tU        |jN                  |jP                  dd             |jS                  |tU        |jN                  |jP                  |	jN                  |jN                  z
  |	jP                  |jP                  z
               |jW                  |jN                  |jP                  |	jN                  |	jP                         |dz  }|dz  }||j                  dz
  k  r|jS                  |dz
  tU        |jB                  |j                  dz
     jN                  |jB                  |j                  dz
     jP                  dd             ytY               }
tA        |j                        D ]J  }|jB                  |   }|
j[                  t        jL                  |jN                  |jP                               L t]        |
      dk  r%| j^                  ja                  tc        d             y|j
                  t        k(  r|je                  |
       y|jg                  |
       y)zDraw given object to the device

        The object is defined as robject() from vedit.h.

        :param robj: object to be rendered

        :return:  1 on success
        :return: -1 on failure (vector feature marked as dead, etc.)
        r#      z)_drawObject(): line=%d type=%d npoints=%dN   r1   r2   r3   r4   rB   r   r   Frv   TzPWARNING: Zero-length line or boundary drawing skipped. Use v.clean to remove it.)4rO   rP   r   r   fidr   npoints	TYPE_AREA_isSelectedVect_get_area_centroidrM   wxTRANSPARENT_PENTRANSPARENT_BRUSHrq   r_   r]   _isDuplicatedPenSOLID
_definePenSetPenSetBrush
TYPE_POINTTYPE_CENTROIDINTYPE_CENTROIDOUTTYPE_CENTROIDDUPTYPE_NODEONETYPE_NODETWOTYPE_VERTEXrU   rV   ranger5   SetIdr   r`   	fisrtNodePointr   r   SetIdBoundsr   r   r[   appendlenr   r   _DrawPolygon	DrawLines)rb   robjbrushr   pendcIdip	point_beg	point_endpointss              r   _drawObjectzDisplayDriver._drawObject   s
    wwdjj		7HHIILL	
 99	!d&6&6"4>>488<'
 **C$$C((EDMM+&!+&%%YY)#(8(8(B**C}}_-i8T=O=O> ffMM/27;MM+.HH ffMM+.k0JBHH DMM+&!+&%%''C3JCD

3LL99  	
  
 ax99+DYY,"=>~~ ).#4<<( (JJqM!8IIdOAIDQ'( axD..!%"&,,"2Q"6$,,** "A$**Q-// JI "AE):)<)<djjQ>O>Q>Q RIIIdOJJsOOOD1Hd9;;	QPQ.RSOO%KK%KK%KK)++5%KK)++5	 LLikk9;;	TFAAID% $,,**& 1H

4<<!#3466

4<<!#3466	 t||, 6A

1AMM"((133"456 v;!#HHNN8 99	)OOF+MM&)r   c                    |t         k(  rd}n|t        k(  rd}n|t        k(  rd}n|t        k(  rd}nw|t        k(  rd}nk|t
        k(  rd}n_|t        k(  rd}nS|t        k(  rd}nG|t        k(  rd	}n;|t        k(  rd
}n/|t        k(  rd}n#|t        k(  rd}n|t        k(  rd}n|t        k(  rd}dvr| j                  |xx   dz  cc<   |dv rat        j                   }|dk(  r8t        j"                  | j$                  |   d   t        j&                        }||fS t        j(                  }||fS t        j*                  | j$                  |   d   | j$                  d   t        j&                        }d}||fS )zyDefine pen/brush based on rendered object)

        Updates also self.topology dict

        :return: pen, brush
        r5   r6   r7   r9   r8   r:   r;   r<   r=   r>   r?   r@   islerA   )rA   r@   r   r   )r@   r   r4   rB   N)r   	TYPE_LINETYPE_BOUNDARYNOTYPE_BOUNDARYTWOTYPE_BOUNDARYONEr   r   r   r   r   r   r   	TYPE_ISLETYPE_DIRECTIONrq   r   r   Brushr]   r   r   r   )rb   rtypekeyr   r   s        r   r   zDisplayDriver._definePenz  s    JCiCo%C&&C&&Co%C&&C&&Cl"Cl"Ck!CiCiCn$C33MM#!#""$$Cf}s!3G!<bhhG Ez ,, Ez &&c"7+T]];-GC EEzr   c                    d}| j                   d   d   r	|t        z  }| j                   d   d   r	|t        z  }| j                   d   d   r	|t        z  }| j                   d   d   r	|t        z  }| j                   d   d   r	|t
        z  }| j                   d   d   r	|t        z  }| j                   d	   d   r	|t        z  }| j                   d
   d   r	|t        z  }| j                   d   d   r	|t        z  }| j                   d   d   r	|t        z  }| j                   d   d   r	|t        z  }| j                   d   d   r	|t        z  }| j                   d   d   r	|t        z  }|S )zwGet draw flag from the settings

        See vedit.h for list of draw flags.

        :return: draw flag (int)
        r   r5   r3   r6   r7   r9   r8   r:   r;   r<   r=   r>   r?   r@   rA   )r]   
DRAW_POINT	DRAW_LINEDRAW_BOUNDARYNODRAW_BOUNDARYTWODRAW_BOUNDARYONEDRAW_CENTROIDINDRAW_CENTROIDOUTDRAW_CENTROIDDUPDRAW_NODEONEDRAW_NODETWODRAW_VERTEX	DRAW_AREADRAW_DIRECTIONrb   r%   s     r   _getDrawFlagzDisplayDriver._getDrawFlag  sq    ==!),:C== +9C==&y1?"C=='	2##C=='	2##C==&y1?"C=='	2##C=='	2##C==#I.<C==#I.<C=="9-;C== +9C==%i0>!C
r   c                 (    || j                   d   v ryy)zCheck if vector object selected?

        :param line: feature id

        :return: True if vector object is selected
        :return: False if vector object is not selected
        r/   TFr\   )rb   r6   forces      r   r   zDisplayDriver._isSelected  s     4==''r   c                 $    || j                   d   v S )zCheck for already marked duplicates

        :param line: feature id

        :return: True line already marked as duplicated
        :return: False not duplicated
        r0   r   rb   r6   s     r   r   zDisplayDriver._isDuplicated  s     t}}Y///r   c                     t               }| j                  d   |_        | j                  d   |_        | j                  d   |_        | j                  d   |_        t        |_        t         |_        |S )zHGet bound_box() from current region

        :return: bound_box
        r   ser   )		bound_boxrS   NSEWPORT_DOUBLE_MAXTB)rb   boxs     r   _getRegionBoxzDisplayDriver._getRegionBox  sa    
 kC C C C   
r   c                    t        j                  dd|       | j                  r| j                  r| j                  syt        | j                  t        | j                               | j                         | j                  d   | j                  d   | j                  j                  | j                  j                  t        | j                  d   | j                  d               j                  }| j                          | j                  j!                          | j                  j!                          t#        |j$                        D ],  }|j&                  |   j                  }| j)                  |       . | j                  j+                          | j                  j+                          d| j,                  d<   t/               | j,                  d	<   y
)zDraw content of the vector map to the device

        :param force: force drawing
        :type force: bool
        :return: number of drawn features
        :return: -1 on error
        r   z!DisplayDriver.DrawMap(): force=%dr#   ru   rw   rt   rs   r-   r.   N)r   r   rM   rO   rP   Vedit_render_mapbyrefr   r   rS   rQ   ry   rz   rx   contentsr^   BeginDrawingr   nitemsitemr   
EndDrawingr\   r[   )rb   r   rlistr   r   s        r   DrawMapzDisplayDriver.DrawMap  s^    			!8%@~~TWWDJJ NN$$$&'KK()KK)*KKKKG$dkk'&:;	
 ( 	 	

! u||$ 	#A::a=))DT"	# 	

 "$g $fr   c                     d}dt         fdt        fdt        fdt        ffD ](  }t	        j
                  dd|d   dg	      s!||d
   z  }* |S )z_Get type(s) to be selected

        Used by SelectLinesByBox() and SelectLineByPoint()
        r   r5   r6   centroidboundaryvdigit
selectTyper3   groupr   subkeyr   )GV_POINTGV_LINEGV_CENTROIDGV_BOUNDARYr   Get)rb   ftypefeatures      r   _getSelectTypezDisplayDriver._getSelectType%  sq    
 hW%%	
 		$G L'!*i9P #		$ r   c                 @    |dkD  r|t        | j                        k  ryy)zCheck if feature id is valid

        :param line: feature id

        :return: True valid feature id
        :return: False invalid
        r   TF)Vect_get_num_linesrM   r   s     r   
_validLinezDisplayDriver._validLine8  s"     !8 24>> BBr   Nc                 D   |du }|s| j                   }|sy|r%|| _        d| _        t               | j                  d<   t               }|d   \  }}|d   \  }	}
t               }t        |||d       t        ||	|d       t        ||	|
d       t        |||
d       t        |||d       |s| j                         }t        ||dd||       |j                  }|j                  }t        j                  dd|       t        |      D ]  }|j                  |   }t!        j"                  dd	d
      rd}| j%                  |      s yt'        || j(                  d|       | j(                  j                  }t        |j*                        D ]-  }t-        |j.                  |   |j0                  |   |      r+d} n |s| j3                  |      s| j                  d   j5                  |       | j                  d   j7                  |        t9        |       t;        |       |S )a  Select vector objects by given bounding box

        If line id is already in the list of selected lines, then it will
        be excluded from this list.

        :param bbox: bounding box definition
        :param ltype: feature type or None for default
        :param drawSeg: True to draw segments of line
        :param poMapInfo: use external Map_info, None for self.poMapInfo

        :return: number of selected features
        :return: None on error
        NTr.   r   r           z)DisplayDriver.SelectLinesByBox() num = %dr   selectInsider3   r   Fr/   )rM   r`   r_   r[   r\   Vect_new_listrW   Vect_append_pointr   Vect_select_lines_by_polygonr   n_valuesr   r   r   r    r   r   r   Vect_read_linerX   n_pointsVect_point_in_polyr   r   r   r   removerl   Vect_destroy_list)rb   bboxltypedrawSegrM   thisMapInfopoListx1y1x2y2poBboxflistnlinesr   r6   insider   r   s                      r   SelectLinesByBoxzDisplayDriver.SelectLinesByBoxE  s     4'I!(D!%D %)FDMM&!aBaB%'&"b#.&"b#.&"b#.&"b#.&"b#.'')E$Y4O		!@&Iv 	2A;;q>DhN9Ut,y$--tD//v/ A-fhhqk688A;O!&
 ##D)e$++D1e$++D1'	2* 	!(&!r   c           
         |d u }|s| j                   }|sdddS |rd| _        t               }t        dt	        |      dz         D ]  }t        ||t        |             t        |d   |d   ||t        |            dk(  s;t        ||      }| j                  |      s| j                  d   j                  |       n| j                  d   j                  |       ||dc S  dddS )Nr#   )r@   r   Tr   r   r/   )rM   r_   r   r   Vect_get_num_areasVect_get_area_boxr   Vect_point_in_arear   r   r\   r   r
  )rb   r5   rM   r  r   r@   r   s          r   SelectAreaByPointzDisplayDriver.SelectAreaByPoint  s    4'IB//!%Dk!/	:Q>? 		<DiuSz:!%(E!HiuSzRVWW1)TB''1MM%(//9MM%(//9 $(;;		< ++r   c                 J   |du }|s| j                   }|sdddS |rd| _        t               | j                  d<   t	               }|| j                         }t        ||d   |d   d|| j                         | j                  d|	      }t        j                  dd|       |dkD  rN| j                  |      s| j                  d	   j                  |       n| j                  d	   j                  |       t               }t               }t               }	| j                  |      sdddS t!        || j"                  | j$                  |      }
t'        | j"                  |d   |d   d
| j                  t)        |      t)        |      t)        |	      ddd       | j*                  d   d   r|j,                  }t/        |j0                        D ]5  }|j2                  |   }||k7  s| j                  d	   j                  |       7 | j5                          t/        |j0                        D ]G  }|j2                  |   }||k7  s| j7                  |      r*| j                  d	   j                  |       I t9        |       |rd| _        ||j2                  |j2                  |	j2                  fdS )a  Select vector feature by given point in given
        threshold

        Only one vector object can be selected. Bounding boxes of
        all segments are stores.

        :param point: points coordinates (x, y)
        :param ltype: feature type or None for default
        :param poMapInfo: use external Map_info, None for self.poMapInfo

        :return: dict {'line' : feature id, 'point' : point on line}
        Nr#   )r6   r5   Tr.   r   r   z,DisplayDriver.SelectLineByPoint() found = %dr/   r  r2   r3   )rM   r_   r[   r\   r  r   Vect_find_line_listGetThresholdrN   r   r   r   r   r
  c_doubler   r  rX   rZ   Vect_line_distancer   r]   r   r   r  r    GetDuplicatesr   r  r`   )rb   r5   r  rM   r  poFoundlineNearestpxpypzr   foundr   r6   s                 r   SelectLineByPointzDisplayDriver.SelectLineByPoint  sl     4'I..!%D$(FDMM&!/='')E)!H!HII

 			!C[Q?##K0e$++K8e$++K8ZZZ{+..y$--kRMM!H!HII"I"I"I	
 ==))4$$E5>>* 6{{1~;&MM%(//56
  5>>* 6{{1~;&t/A/A$/GMM%(//56
 	'" "&D#rxx288.LMMr   c                 @    t               }|D ]  }t        ||        |S )zGenerate from list struct_ilist)r  Vect_list_append)rb   plistilistvals       r   _listToIListzDisplayDriver._listToIList  s)     	)CUC(	) r   c                 d    |r| j                  |      S | j                  | j                  d         S )zGet list of selected objects as struct_ilist

        Returned IList must be freed by Vect_destroy_list().

        :return: struct_ilist
        r/   )r1  r\   )rb   r/  s     r   GetSelectedIListzDisplayDriver.GetSelectedIList	  s2     $$U++  u!566r   c                    |r| j                   d   S t               }| j                  s|j                  d       |S t	        | j                   d         dkD  rwt        | j                  | j                  d| j                   d   d          | j                  j                  }t        dd|j                  z        D ]  }|j                  |        |S )zGet ids of selected objects

        :param grassId: True for feature id, False for PseudoDC id

        :return: list of ids of selected vector objects
        r/   r   r   Nrv   )r\   r[   r`   r   r   r  rM   rX   r   r   r  )rb   grassIddc_idsr   r   s        r   GetSelectedzDisplayDriver.GetSelected  s     ==''!!MM!  u%&*4>>4==$e@TUV@WX]]++F1a&//12 !a ! r   c                    |rd| _         nd| _         || j                  d<   |dkD  r|| j                  d<   t               | j                  d<   t        | j                        }t        d|dz         D ]  }t        | j                  |      st        | j                  d| j                  |      }|t        t        z  z  sMd}| j                  j                  }t        d|j                        D ],  }| j                  d   D ]  }	|j                  |   |	k(  sd} , . |s| j                  d   j                  |        y|| j                  d<   g | j                  d<   y)	zSet selected vector objects

        :param list: of ids (None to unselect features)
        :param layer: layer number for features selected based on category number
        TFr-   r   r.   r/   r   N)r_   r\   r[   r   rM   r   Vect_line_aliver  rZ   	GV_POINTSGV_LINESr   n_catscatr   )
rb   r/   layerr  r6   r  r*  r.   r   r=  s
             r   SetSelectedzDisplayDriver.SetSelected-  sE    !%D!&D!&g19$'DMM&!#'6DMM%  (7Fa!, 6&t~~t<&t~~tT[[$OX!56{{++q$++. "A#}}V4 "88A;#-$(E!""
 MM%(//5!6$ $'DMM% $&DMM&!r   c           
      &   t               }t        | j                  d         dk7  s| j                  s|S d}| j                  d   d   }| j	                  |      syt        | j                  | j                  | j                  |      }d}d}d}| j                  j                  }	t        |	j                        D ]  }
t        |d   |d   d|	j                  |
   |	j                  |
   |	j                  |
   d      }|
dk(  r|}|
}n	||kD  r|}|
}| j!                  |	j                  |
   |	j                  |
   |	j                  |
         \  }}t#        ||dd      }| j$                  j'                  ||       |dz  } || j)                         kD  r|S |dz  dz   }|j+                  |       ||k(  r|j+                  d       n|j+                  |dz
         ||	j                  dz
  dz  |z   k(  r|j+                  d       |S |j+                  |dz          |S )zGet PseudoDC vertex id of selected line

        Set bounding box for vertices of line.

        :param pos: position

        :return: id of center, left and right vertex
        :return: 0 no line found
        :return: -1 on error
        r/   r   r   r#   r  rv   )r[   r   r\   r`   r   r  rM   rX   rZ   r   r   r  Vect_points_distancer   r   zr   r   rO   r   r!  r   )rb   posreturnIdstartIdr6   r   minDistGidDCidr   idxdistvxvyrects                  r   GetSelectedVertexzDisplayDriver.GetSelectedVertexT  s    6t}}U#$)1C1CO}}U#A&t$t~~t}}dkk4P'') 	C'AAVXXc]FHHSM688C=RSD axT>"GC%%fhhsmVXXc]FHHSMRFBB1%DGGd+AID!	$ T&&((O Qw{ 	7?OOBOOD1H%FOOa'1,w66OOB  OOD1H%r   c                 "   t               }t               }d}t        | j                        }| j                  d   D ]  }t	        | j                  |      }|dkD  r&||k  r!t        | j                  |t        |            s"Dt        | j                  |t        |            se|r!t        t        |      t        |             d}t        t        |      t        |              |j                  |j                  |j                  |j                  fS )zQGet minimal region extent of selected features

        :return: n,s,w,e
        Tr/   r   F)r   r  rM   r\   Vect_get_centroid_arear  r   Vect_get_line_boxVect_box_copyVect_box_extendr   r   r   r   )rb   	regionBoxlineBox	setRegionnareasr6   r@   s          r   GetRegionSelectedzDisplayDriver.GetRegionSelected  s    
 K	+	#DNN3MM%( 	BD)$..$?DaxDFN(uW~N(uW~NeI.g?!	i 0%.A	B  {{IKKikkAAr   c                 $    t        |      | _        y)zmDraw selected features

        :param flag: True to draw selected features
        :type flag: bool
        N)boolr_   )rb   flags     r   DrawSelectedzDisplayDriver.DrawSelected  s     "$Zr   c                    | j                   sy| j                   j                  j                  t        k(  r/t	        | j                   t
               t        | j                          t        | j                         }| `dx| _         | _        |S )z[Close vector map

        :return: 0 on success
        :return: non-zero on error
        r   N)	rM   r   mode
GV_MODE_RWVect_build_partialGV_BUILD_NONE
Vect_build
Vect_closerL   r   s     r   rk   zDisplayDriver.CloseMap  sh     ~~>>""'':5t~~}=t~~& (L(,,
r   c                 >   t        j                  dd|||       | j                  s)t               | _        t	        | j                        | _        |r|rt        }nt        }n|rt        }nt        } || j
                  ||      }|dk(  r| `dx| _        | _        n|dk  rt        j                  | j                  t        d      |z  t        d      t        j                  t        j                  z  t        j                   z  t        j"                  z        }|j%                         }|t        j&                  k7  r| `dx| _        | _        nt)        | j
                         |rt+        | j
                  d	       t-        | j
                        | _        | j
                  S )
a  Open vector map by the driver

        :param name: name of vector map to be open
        :type name: str
        :param mapset: name of mapset where the vector map lives
        :tryp mapset: str
        :param update: True to open vector map in update mode
        :type update: bool
        :param tmp: True to open temporary vector map
        :type tp: bool
        :return: map_info
        :return: None on error
        r   z5DisplayDriver.OpenMap(): name=%s mapset=%s updated=%dr#   Nrv   zTopology for vector map <%s> is not available. Topology is required by digitizer. Do you want to rebuild topology (takes some time) and open the vector map for editing?zTopology missing)parentmessagecaptionstyleT)r   r   rL   Map_infopointerrM   Vect_open_tmp_updateVect_open_updateVect_open_tmp_oldVect_open_oldr   MessageDialogrT   r   YES_NOYES_DEFAULTICON_QUESTIONCENTRE	ShowModalID_YESrb  Vect_set_updated
Vect_is_3drN   )rb   namemapsetupdatetmpopen_fnr%   dlgs           r   OpenMapzDisplayDriver.OpenMap  sS    			C	
 ||#:DL$T\\2DN .*+'dnndF3"9,00DNT\1W""{{#  ,-ii"..023C3CCbiiOC --/CbiiL0444>>*T^^T2t~~.	~~r   c                     | j                   syt               }t        | j                   t        |             |j                  |j
                  |j                  |j                  |j                  |j                  fS )zVGet bounding box of (opened) vector map layer

        :return: (w,s,b,e,n,t)
        N)
rM   r   Vect_get_map_boxr   r   r   r   r   r   r   )rb   r  s     r   GetMapBoundingBoxzDisplayDriver.GetMapBoundingBox  sR    
 ~~{t5vvtvvtvvtvvtvvtvv==r   c                    t               }| j                  j                         D ]1  }|dk(  r/t        t	        j
                  ddd            | j                  |<   8t        j                  t	        j
                  dd|dg      d   t	        j
                  dd|dg      d   t	        j
                  dd|dg      d	   |      }|d
k(  r|| j                  |<   |dk(  r2t        t	        j
                  ddd            | j                  |   d<   n3t        t	        j
                  dd|dg            | j                  |   d<   || j                  |   d<   4 y)zUpdate display driver settings

        .. todo::
            map units

        :param alpha: color value for alpha channel
        rB   r   r    r   symbolr4   r   r   rv   r1   r2   checkForDuplr3   N)	dictr]   keysr{   r   r   r   ColourrZ  )rb   alphar4   r   s       r   ra   zDisplayDriver.UpdateSettings%  sd    ==%%' %	0Ck!%( $$8WU&c" II  xXsGnU   xXsGnU   xXsGnU E k!%*c"o%04 $$&N91c"9- 15 $$&Hc9=M1c"9- +0DMM#w'K%	0r   c                 B    | j                   j                         | _        y)z1Update geographical region used by display driverN)rQ   rR   rS   rn   s    r   UpdateRegionzDisplayDriver.UpdateRegionU  s    kk224r   c                 b   |t        j                  d|d      }|;t        j                  d|d      }|!t        j                  d|d      }|dk(  rdnd}|dk  r"| j                  d	   | j                  d
   z   dz  }|dk(  r+t        | j                  d	   | j                  d
         }||z  S |S )zReturn threshold value in map units

        :param type: snapping mode (node, vertex)
        :param value: threshold to be set up
        :param units: units (0 for screen pixels, 1 for map units)

        :return: threshold value
        r   r    r   unitunitszscreen pixelsr   r   rt   rs   g       @)r   r   rS   rx   )rb   r   r    r  ress        r   r!  zDisplayDriver.GetThresholdY  s     = $$8gNE= $$8fME}$((xT'R"o5119[[)DKK,@@CGEA:dkk'*DKK,@AC3;r   c                 V   | j                   syt               }t               }t               }t               | j                  d<   t        t        | j                  d               D ]+  }| j                  d   |   }| j                  |      r(t        | j                   |d|       | j                  d   D ]  }||k(  s| j                  |      rt        | j                   |d|       t        ||t              sD||vrPt               ||<   ||   j                  || j                  |      f       | j                  d   j                  |       ||   j                  || j                  |      f       | j                  d   j                  |        . t        |       t        |       |S )z3Return ids of (selected) duplicated vector featuresNr0   r/   )rM   r  rW   r[   r\   r   r   r   r  Vect_line_check_duplicate	WITHOUT_Zr   _getCatStringrl   )rb   r/   APointsBPointsr   line1line2s          r   r$  zDisplayDriver.GetDuplicatesv  so   ~~f&(&(#'6i s4==/01 	;AMM%(+E!!%(4>>7D%@u- ;E>T%7%7%>t~~weD,WgyI|!%AAud.@.@.G&HIi077>FMM5$*<*<U*C"DEMM),33E:;	;, 	!) )
r   c           	         t        | j                  d | j                  |       | j                  j                  }t	               }t        |j                        D ]C  }|j                  |   }||vrt               ||<   ||   j                  |j                  |          E d}t        j                  |      D ])  \  }}d|dj                  t        t        |            fz  }+ |S )Nr
   z%d: (%s),)r  rM   rZ   r   r  r   r<  r-   r[   r   r=  six	iteritemsjoinmapstr)	rb   r6   r.   catsDictr   r>  catsStrlcs	            r   r  zDisplayDriver._getCatString  s    t~~tT[[$?{{##6t{{# 	0AJJqMEH$"&&UO""488A;/		0 MM(+ 	>DAq AsxxC'<#==G	> r   c                    d}|D ]X  }| j                  |      r| j                  d   j                  |       | j                  d   d   sE| j	                  |      sWd}Z |r| j                          t        | j                  d         S )zNUnselect vector features

        :param lines: list of feature id(s)
        Fr/   r2   r3   T)r   r\   r
  r]   r   r$  r   )rb   linesr  r6   s       r   UnSelectzDisplayDriver.UnSelect  s    
  	$D%e$++D1}}_-i8T=O=OPT=U#		$  4=='((r   )   )F)NFN)N)NN)T)r#   )TF)   )snappingNN)$__name__
__module____qualname__rg   ro   r^   r   r   r   r   r   r   r   r   r   r   r   r  r  r+  r1  r3  r7  r?  rN  rX  r\  rk   r~  r  ra   r  r!  r$  r  r   r   r   r(   r(   `   s    IV	.
"E&(I*V3j#J0 ('T&EN,2ZNx
70%'NAFB8(*FP>.0`5:$L")r   r(   )+__doc__
__future__r   rE   r  r   r   r   
core.debugr   core.settingsr   	core.gcmdr   gui_core.wrapr   WindowsError	NameErrorOSErrorgrass.lib.gisgrass.lib.vectorgrass.lib.veditImportError	TypeErrorr   r   formatstderrr   r   r   r   r!   r&   	CFUNCTYPE	UNCHECKEDc_intStringerrtyperI   pertyperK   r(   r  r   r   <module>r     s	  & &  
 	 
 	  & " 7"! 
		%(&%8Gk"G	%(%0Gn%G
]) ])y  L 	\9- 7	

!
!!
$3::667d  		s:   B B /C BBC'#CCCC