[GRASS-SVN] r52256 - grass/trunk/gui/wxpython/mapdisp
svn_grass at osgeo.org
svn_grass at osgeo.org
Sun Jul 1 03:27:45 PDT 2012
Author: martinl
Date: 2012-07-01 03:27:45 -0700 (Sun, 01 Jul 2012)
New Revision: 52256
Modified:
grass/trunk/gui/wxpython/mapdisp/mapwindow.py
Log:
wxGUI: GraphicsSet/GraphicsSetItem implemented by Stepan Turek
Modified: grass/trunk/gui/wxpython/mapdisp/mapwindow.py
===================================================================
--- grass/trunk/gui/wxpython/mapdisp/mapwindow.py 2012-07-01 08:46:09 UTC (rev 52255)
+++ grass/trunk/gui/wxpython/mapdisp/mapwindow.py 2012-07-01 10:27:45 UTC (rev 52256)
@@ -5,6 +5,8 @@
Classes:
- mapwindow::BufferedWindow
+ - mapwindow::GraphicsSet
+ - mapwindow::GraphicsSetItem
(C) 2006-2012 by the GRASS Development Team
@@ -15,13 +17,14 @@
@author Michael Barton
@author Jachym Cepicky
@author Vaclav Petras <wenzeslaus gmail.com> (handlers support)
- at author Stepan Turek <stepan.turek seznam.cz> (handlers support)
+ at author Stepan Turek <stepan.turek seznam.cz> (handlers support, GraphicsSet)
"""
import os
import time
import math
import sys
+from copy import copy
import wx
@@ -113,6 +116,9 @@
self.dragid = -1
self.lastpos = (0, 0)
+ # list for registration of graphics to draw
+ self.graphicsSetList = []
+
def _definePseudoDC(self):
"""!Define PseudoDC objects to use
"""
@@ -636,20 +642,27 @@
#
# redraw pdcTmp if needed
#
+
+ # draw registered graphics
+ if len(self.graphicsSetList) > 0:
+ penOrig = self.pen
+ polypenOrig = self.polypen
+
+ for item in self.graphicsSetList:
+ try:
+ item.Draw(self.pdcTmp)
+ except:
+ GError(parent = self,
+ message = _('Unable to draw registered graphics. '
+ 'The graphics was unregistered.'))
+ self.UnregisterGraphicsToDraw(item)
+
+ self.pen = penOrig
+ self.polypen = polypenOrig
+
if len(self.polycoords) > 0:
self.DrawLines(self.pdcTmp)
-
- if not self.parent.IsStandalone() and \
- self.parent.GetLayerManager().gcpmanagement:
- # -> georectifier (redraw GCPs)
- if 'gcpdisp' in self.parent.toolbars.keys():
- if self == self.parent.TgtMapWindow:
- coordtype = 'target'
- else:
- coordtype = 'source'
-
- self.parent.DrawGCP(coordtype)
-
+
#
# clear measurement
#
@@ -873,7 +886,7 @@
@todo implement rotation
@param pdc PseudoDC
- @param coord center coordinates
+ @param coords center coordinates
@param rotation rotate symbol
@param text draw also text (text, font, color, rotation)
@param textAlign alignment (default 'lower-right')
@@ -1716,7 +1729,7 @@
os.environ["GRASS_REGION"] = tmpreg
def Distance(self, beginpt, endpt, screen = True):
- """!Calculete distance
+ """!Calculates distance
Ctypes required for LL-locations
@@ -1759,3 +1772,334 @@
toolbar.action['id'] = vars(toolbar)["pointer"]
toolbar.OnTool(None)
self.parent.OnPointer(event = None)
+
+ def RegisterGraphicsToDraw(self, graphicsType, setStatusFunc = None, drawFunc = None):
+ """! Method allows to register graphics to draw.
+
+ @param type (string) - graphics type: "point" or "line"
+ @param setStatusFunc (function reference) - function called before drawing each item
+ Status function should be in this form: setStatusFunc(item, itemOrderNum)
+ item - passes instance of GraphicsSetItem which will be drawn
+ itemOrderNum - number of item in drawing order (from O)
+ Hidden items are also counted in drawing order.
+ @param drawFunc (function reference) - allows to define own function for drawing
+ If function is not defined DrawCross method is used for type "point"
+ or DrawLines method for type "line".
+
+ @return reference to GraphicsSet, which was added.
+ """
+ item = GraphicsSet(parentMapWin = self,
+ graphicsType = graphicsType,
+ setStatusFunc = setStatusFunc,
+ drawFunc = drawFunc)
+ self.graphicsSetList.append(item)
+
+ return item
+
+ def UnregisterGraphicsToDraw(self, item):
+ """!Unregisteres GraphicsSet instance
+
+ @param item (GraphicsSetItem) - item to unregister
+
+ @return True - if item was unregistered
+ @return False - if item was not found
+ """
+ if item in self.graphicsSetList:
+ self.graphicsSetList.remove(item)
+ return True
+
+ return False
+
+class GraphicsSet:
+ def __init__(self, parentMapWin, graphicsType, setStatusFunc = None, drawFunc = None):
+ """!Class, which contains instances of GraphicsSetItem and
+ draws them For description of parameters look at method
+ RegisterGraphicsToDraw in BufferedWindow class.
+ """
+ self.pens = {
+ "default" : wx.Pen(colour = wx.BLACK, width = 2, style = wx.SOLID),
+ "selected" : wx.Pen(colour = wx.GREEN, width = 2, style = wx.SOLID),
+ "unused" : wx.Pen(colour = wx.LIGHT_GREY, width = 2, style = wx.SOLID),
+ "highest" : wx.Pen(colour = wx.RED, width = 2, style = wx.SOLID)
+ }
+
+ # list contains instances of GraphicsSetItem
+ self.itemsList = []
+
+ self.properties = {}
+ self.graphicsType = graphicsType
+ self.parentMapWin = parentMapWin
+ self.setStatusFunc = setStatusFunc
+
+ if drawFunc:
+ self.drawFunc = drawFunc
+
+ elif self.graphicsType == "point":
+ self.properties["size"] = 5
+
+ self.properties["text"] = {}
+ self.properties["text"]['font'] = wx.Font(pointSize = self.properties["size"],
+ family = wx.FONTFAMILY_DEFAULT,
+ style = wx.FONTSTYLE_NORMAL,
+ weight = wx.FONTWEIGHT_NORMAL)
+ self.properties["text"]['active'] = True
+
+ self.drawFunc = self.parentMapWin.DrawCross
+
+ elif self.graphicsType == "line":
+ self.drawFunc = self.parentMapWin.DrawLines
+
+ def Draw(self, pdc):
+ """!Draws all containing items.
+
+ @param pdc - device context, where items are drawn
+ """
+ itemOrderNum = 0
+ for item in self.itemsList:
+ if self.setStatusFunc is not None:
+ self.setStatusFunc(item, itemOrderNum)
+
+ if item.GetPropertyVal("hide") == True:
+ itemOrderNum += 1
+ continue
+
+ if self.graphicsType == "point":
+ if item.GetPropertyVal("penName"):
+ self.parentMapWin.pen = self.pens[item.GetPropertyVal("penName")]
+ else:
+ self.parentMapWin.pen = self.pens["default"]
+
+ coords = self.parentMapWin.Cell2Pixel(item.GetCoords())
+ size = self.properties["size"]
+
+ self.properties["text"]['coords'] = [coords[0] + size, coords[1] + size, size, size]
+ self.properties["text"]['color'] = self.parentMapWin.pen.GetColour()
+ self.properties["text"]['text'] = item.GetPropertyVal("label")
+
+ self.drawFunc(pdc = pdc,
+ coords = coords,
+ text = self.properties["text"],
+ size = self.properties["size"])
+
+ elif self.graphicsType == "line":
+ if item.GetPropertyVal("pen"):
+ self.parentMapWin.polypen = self.pens[item.GetPropertyVal("pen")]
+ else:
+ self.parentMapWin.polypen = self.pens["default"]
+ self.drawFunc(pdc = pdc,
+ polycoords = coords)
+ itemOrderNum += 1
+
+ def AddItem(self, coords, penName = None, label = None, hide = False):
+ """!Append item to the list.
+
+ Added item is put to the last place in drawing order.
+ Could be 'point' or 'line' according to graphicsType.
+
+ @param coords - list of east, north coordinates (double) of item
+ Example: point: [1023, 122]
+ line: [[10, 12],[20,40],[23, 2334]]
+ @param penName (string) - the 'default' pen is used if is not defined
+ @param label (string) - label, which will be drawn with point. It is relavant just for 'point' type.
+ @param hide (bool) - If it is True, the item is not drawn, when self.Draw is called.
+ Hidden items are also counted in drawing order.
+
+ @return (GraphicsSetItem) - added item reference
+ """
+ item = GraphicsSetItem(coords = coords, penName = None, label = None, hide = False)
+ self.itemsList.append(item)
+
+ return item
+
+ def DeleteItem(self, item):
+ """!Deletes item
+
+ @param item (GraphicsSetItem) - item to remove
+
+ @return True if item was removed
+ @return False if item was not found
+ """
+ try:
+ self.itemsList.remove(item)
+ except:
+ return False
+
+ return True
+
+ def GetAllItems(self):
+ """!Returns list of all containing instances of GraphicsSetItem, in order
+ as they are drawn. If you want to change order of drawing use: SetItemDrawOrder method.
+ """
+ # user can edit objects but not order in list, that is reason,
+ # why is returned shallow copy of data list it should be used
+ # SetItemDrawOrder for changing order
+ return copy(self.itemsList)
+
+ def GetItem(self, drawNum):
+ """!Get given item from the list.
+
+ @param drawNum (int) - drawing order (index) number of item
+
+ @return instance of GraphicsSetItem which is drawn in drawNum order
+ @return False if drawNum was out of range
+ """
+ if drawNum < len(self.itemsList) and drawNum >= 0:
+ return self.itemsList[drawNum]
+ else:
+ return False
+
+ def SetPropertyVal(self, propName, propVal):
+ """!Set property value
+
+ @param propName (string) - property name: "size", "text"
+ - both properties are relevant for "point" type
+ @param propVal - property value to be set
+
+ @return True - if value was set
+ @return False - if propName is not "size" or "text" or type is "line"
+ """
+ if self.properties.has_key(propName):
+ self.properties[propName] = propVal
+ return True
+
+ return False
+
+ def GetPropertyVal(self, propName):
+ """!Get property value
+
+ Raises KeyError if propName is not "size" or "text" or type is
+ "line"
+
+ @param propName (string) - property name: "size", "text"
+ - both properties are relevant for "point" type
+
+ @return value of property
+ """
+ if self.properties.has_key(propName):
+ return self.properties[propName]
+
+ raise KeyError(_("Property does not exist: %s") % (propName))
+
+ def AddPen(self, penName, pen):
+ """!Add pen
+
+ @param penName (string) - name of added pen
+ @param pen (wx.Pen) - added pen
+
+ @return True - if pen was added
+ @return False - if pen already exists
+ """
+ if self.pens.has_key(penName):
+ return False
+
+ self.pens[penName] = pen
+ return True
+
+ def GetPen(self, penName):
+ """!Get existing pen
+
+ @param penName (string) - name of pen
+
+ @return wx.Pen reference if is found
+ @return None if penName was not found
+ """
+ if self.pens.has_key(penName):
+ return self.pens[penName]
+
+ return None
+
+ def SetItemDrawOrder(self, item, drawNum):
+ """!Set draw order for item
+
+ @param item (GraphicsSetItem)
+ @param drawNum (int) - drawing order of item to be set
+
+ @return True - if order was changed
+ @return False - if drawNum is out of range or item was not found
+ """
+ if drawNum < len(self.itemsList) and drawNum >= 0 and \
+ item in self.itemsList:
+ self.itemsList.insert(drawNum, self.itemsList.pop(self.itemsList.index(item)))
+ return True
+
+ return False
+
+ def GetItemDrawOrder(self, item):
+ """!Get draw order for given item
+
+ @param item (GraphicsSetItem)
+
+ @return (int) - drawing order of item
+ @return None - if item was not found
+ """
+ try:
+ return self.itemsList.index(item)
+ except:
+ return None
+
+class GraphicsSetItem:
+ def __init__(self, coords, penName = None, label = None, hide = False):
+ """!Could be point or line according to graphicsType in
+ GraphicsSet class
+
+ @param coords - list of coordinates (double) of item
+ Example: point: [1023, 122]
+ line: [[10, 12],[20,40],[23, 2334]]
+ @param penName (string) - if it is not defined 'default' pen is used
+ @param label (string) - label, which will be drawn with point. It is relevant just for 'point' type
+ @param hide (bool) - if it is True, item is not drawn
+ Hidden items are also counted in drawing order in GraphicsSet class.
+ """
+ self.coords = coords
+
+ self.properties = { "penName" : penName,
+ "hide" : hide,
+ "label" : label }
+
+ def SetPropertyVal(self, propName, propVal):
+ """!Set property value
+
+ @param propName (string) - property name: "penName", "hide" or "label"
+ - property "label" is relevant just for 'point' type
+ @param propVal - property value to be set
+
+ @return True - if value was set
+ @return False - if propName is not "penName", "hide" or "label"
+ """
+ if self.properties.has_key(propName):
+ self.properties[propName] = propVal
+ return True
+
+ return False
+
+ def GetPropertyVal(self, propName):
+ """!Get property value
+
+ Raises KeyError if propName is not "penName", "hide" or
+ "label".
+
+ @param propName (string) - property name: "penName", "hide" or "label"
+ - property "label" is relevant just for 'point' type
+
+ @return value of property
+ """
+ if self.properties.has_key(propName):
+ return self.properties[propName]
+
+ raise KeyError(_("Property does not exist: %s") % (propName))
+
+ def SetCoords(self, coords):
+ """!Set coordinates of item
+
+ @param coords - list of east, north coordinates (double) of item
+ Example: point: [1023, 122]
+ line: [[10, 12],[20,40],[23, 2334]]
+ """
+ self.coords = coords
+
+ def GetCoords(self):
+ """!Get item coordinates
+
+ @returns coordinates
+ """
+ return self.coords
More information about the grass-commit
mailing list