123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- #!/usr/bin/env python3
- ############################################################################
- #
- # MODULE: Map window and mapdisplay test module
- # AUTHOR(S): Vaclav Petras
- # PURPOSE: Test functionality using small GUI applications.
- # COPYRIGHT: (C) 2013 by Vaclav Petras, and the GRASS Development Team
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- ############################################################################
- # %module
- # % description: Tests map display and map window widgets
- # % keyword: general
- # % keyword: GUI
- # % keyword: test
- # %end
- # %option
- # % key: test
- # % description: Test to run
- # % options: mapwindow,mapdisplay,apitest,distance,profile
- # % descriptions: mapwindow;Opens map window ;mapdisplay;Opens map display; apitest;Open an application to test API of map window; distance;Starts map window with distance measurement activated; profile;Starts map window with profile tool activated
- # % required: yes
- # %end
- # %option G_OPT_R_INPUT
- # % key: raster
- # % multiple: yes
- # % required: no
- # %end
- # %option G_OPT_V_INPUT
- # % key: vector
- # % multiple: yes
- # % required: no
- # %end
- """
- Module to run test map window (BufferedWidnow) and map display (MapFrame).
- @author Vaclav Petras <wenzeslaus gmail.com>
- """
- import os
- import sys
- import wx
- import grass.script as grass
- from grass.script.setup import set_gui_path
- set_gui_path()
- # GUI imports require path to GUI code to be set.
- from core.settings import UserSettings # noqa: E402
- from core.giface import StandaloneGrassInterface # noqa: E402
- from mapwin.base import MapWindowProperties # noqa: E402
- from mapwin.buffered import BufferedMapWindow # noqa: E402
- from core.render import Map # noqa: E402
- from rlisetup.sampling_frame import RLiSetupMapPanel # noqa: E402
- from mapdisp.main import LayerList # noqa: E402
- from gui_core.wrap import StaticText # noqa: E402
- class MapdispGrassInterface(StandaloneGrassInterface):
- """@implements GrassInterface"""
- def __init__(self, map_):
- StandaloneGrassInterface.__init__(self)
- self._map = map_
- self.mapWindow = None
- def GetLayerList(self):
- return LayerList(self._map, giface=self)
- def GetMapWindow(self):
- return self.mapWindow
- # this is a copy of method from some frame class
- def copyOfInitMap(map_, width, height):
- """Initialize map display, set dimensions and map region
- """
- if not grass.find_program('g.region', '--help'):
- sys.exit(_("GRASS module '%s' not found. Unable to start map "
- "display window.") % 'g.region')
- map_.ChangeMapSize((width, height))
- map_.region = map_.GetRegion() # g.region -upgc
- # self.Map.SetRegion() # adjust region to match display window
- class TextShower(object):
- def __init__(self, parent, title):
- self._cf = wx.Frame(parent=parent, title=title)
- self._cp = wx.Panel(parent=self._cf, id=wx.ID_ANY)
- self._cs = wx.BoxSizer(wx.VERTICAL)
- self._cl = StaticText(
- parent=self._cp,
- id=wx.ID_ANY,
- label="No text set yet")
- self._cs.Add(
- self._cl,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- self._cp.SetSizer(self._cs)
- self._cp.Layout()
- self._cf.Show()
- def SetLabel(self, text):
- self._cl.SetLabel(text)
- class Tester(object):
- def _listenToAllMapWindowSignals(self, window):
- output = sys.stderr
- # will make bad thigs after it is closed but who cares
- coordinatesShower = TextShower(window, "Coordinates")
- window.zoomChanged.connect(lambda: output.write("zoomChanged\n"))
- window.zoomHistoryUnavailable.connect(
- lambda: output.write("zoomHistoryUnavailable\n"))
- window.zoomHistoryAvailable.connect(
- lambda: output.write("zoomHistoryAvailable\n"))
- window.mapQueried.connect(lambda: output.write("mapQueried\n"))
- window.mouseEntered.connect(lambda: output.write("mouseEntered\n"))
- window.mouseLeftUpPointer.connect(
- lambda: output.write("mouseLeftUpPointer\n"))
- window.mouseLeftUp.connect(lambda: output.write("mouseLeftUp\n"))
- window.mouseMoving.connect(
- lambda x, y: coordinatesShower.SetLabel(
- "%s , %s" %
- (x, y)))
- window.mouseHandlerRegistered.connect(
- lambda: output.write("mouseHandlerRegistered\n"))
- window.mouseHandlerUnregistered.connect(
- lambda: output.write("mouseHandlerUnregistered\n"))
- def testMapWindow(self, giface, map_):
- self.frame = wx.Frame(parent=None, title=_("Map window test frame"))
- panel = wx.Panel(parent=self.frame, id=wx.ID_ANY)
- sizer = wx.BoxSizer(wx.VERTICAL)
- mapWindowProperties = MapWindowProperties()
- mapWindowProperties.setValuesFromUserSettings()
- width, height = self.frame.GetClientSize()
- copyOfInitMap(map_, width, height)
- window = BufferedMapWindow(parent=panel, giface=giface, Map=map_,
- properties=mapWindowProperties)
- sizer.Add(window, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- panel.SetSizer(sizer)
- panel.Layout()
- self.frame.Show()
- def testMapDisplay(self, giface, map_):
- from mapdisp.frame import MapFrame
- # known issues (should be similar with d.mon):
- # * opening map in digitizer ends with: vdigit/toolbars.py:723: 'selection' referenced before assignment
- # * nviz start fails (closes window? segfaults?) after mapdisp/frame.py:306: 'NoneType' object has no attribute 'GetLayerNotebook'
- frame = MapFrame(parent=None, title=_("Map display test"),
- giface=giface, Map=map_)
- # this is questionable: how complete the giface when creating objects
- # which are in giface
- giface.mapWindow = frame.GetMapWindow()
- frame.GetMapWindow().ZoomToMap()
- frame.Show()
- def testMapWindowApi(self, giface, map_):
- self.frame = wx.Frame(parent=None,
- title=_("Map window API test frame"))
- panel = wx.Panel(parent=self.frame, id=wx.ID_ANY)
- sizer = wx.BoxSizer(wx.VERTICAL)
- mapWindowProperties = MapWindowProperties()
- mapWindowProperties.setValuesFromUserSettings()
- mapWindowProperties.showRegion = True
- width, height = self.frame.GetClientSize()
- copyOfInitMap(map_, width, height)
- window = BufferedMapWindow(parent=panel, giface=giface, Map=map_,
- properties=mapWindowProperties)
- giface.mapWindow = window
- sizer.Add(window, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- panel.SetSizer(sizer)
- panel.Layout()
- window.ZoomToWind()
- self.frame.Show()
- def testMapWindowDistance(self, giface, map_):
- self.frame = wx.Frame(parent=None, title=_(
- "Map window distance measurement test frame"))
- panel = wx.Panel(parent=self.frame, id=wx.ID_ANY)
- sizer = wx.BoxSizer(wx.VERTICAL)
- mapWindowProperties = MapWindowProperties()
- mapWindowProperties.setValuesFromUserSettings()
- mapWindowProperties.showRegion = True
- width, height = self.frame.GetClientSize()
- copyOfInitMap(map_, width, height)
- window = BufferedMapWindow(parent=panel, giface=giface, Map=map_,
- properties=mapWindowProperties)
- giface.mapWindow = window
- sizer.Add(window, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- panel.SetSizer(sizer)
- panel.Layout()
- window.ZoomToWind()
- self._listenToAllMapWindowSignals(window)
- self.frame.Show()
- from mapwin.analysis import MeasureDistanceController
- self.controller = MeasureDistanceController(giface, window)
- self.controller.Start()
- def testMapWindowProfile(self, giface, map_):
- self.frame = wx.Frame(parent=None,
- title=_("Map window profile tool test frame"))
- panel = wx.Panel(parent=self.frame, id=wx.ID_ANY)
- sizer = wx.BoxSizer(wx.VERTICAL)
- mapWindowProperties = MapWindowProperties()
- mapWindowProperties.setValuesFromUserSettings()
- mapWindowProperties.showRegion = True
- width, height = self.frame.GetClientSize()
- copyOfInitMap(map_, width, height)
- window = BufferedMapWindow(parent=panel, giface=giface, Map=map_,
- properties=mapWindowProperties)
- giface.mapWindow = window
- sizer.Add(window, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- panel.SetSizer(sizer)
- panel.Layout()
- window.ZoomToWind()
- self._listenToAllMapWindowSignals(window)
- self.frame.Show()
- from mapwin.analysis import ProfileController
- self.controller = ProfileController(giface, window)
- self.controller.Start()
- rasters = []
- for layer in giface.GetLayerList().GetSelectedLayers():
- if layer.maplayer.GetType() == 'raster':
- rasters.append(layer.maplayer.GetName())
- from wxplot.profile import ProfileFrame
- profileWindow = ProfileFrame(parent=self.frame,
- giface=giface,
- controller=self.controller,
- units=map_.projinfo['units'],
- rasterList=rasters)
- profileWindow.CentreOnParent()
- profileWindow.Show()
- # Open raster select dialog to make sure that a raster (and
- # the desired raster) is selected to be profiled
- profileWindow.OnSelectRaster(None)
- def testMapWindowRlisetup(self, map_):
- self.frame = wx.Frame(parent=None,
- title=_("Map window rlisetup test frame"))
- RLiSetupMapPanel(parent=self.frame, map_=map_)
- self.frame.Show()
- def main():
- """Sets the GRASS display driver
- """
- driver = UserSettings.Get(group='display', key='driver', subkey='type')
- if driver == 'png':
- os.environ['GRASS_RENDER_IMMEDIATE'] = 'png'
- else:
- os.environ['GRASS_RENDER_IMMEDIATE'] = 'cairo'
- # TODO: message format should not be GUI
- # TODO: should messages here be translatable?
- # (for test its great, for translator not)
- options, flags = grass.parser()
- test = options['test']
- app = wx.App()
- map_ = Map()
- if options['raster']:
- names = options['raster']
- for name in names.split(','):
- cmdlist = ['d.rast', 'map=%s' % name]
- map_.AddLayer(ltype='raster', command=cmdlist, active=True,
- name=name, hidden=False, opacity=1.0,
- render=True)
- if options['vector']:
- names = options['vector']
- for name in names.split(','):
- cmdlist = ['d.vect', 'map=%s' % name]
- map_.AddLayer(ltype='vector', command=cmdlist, active=True,
- name=name, hidden=False, opacity=1.0,
- render=True)
- giface = MapdispGrassInterface(map_=map_)
- tester = Tester()
- if test == 'mapwindow':
- tester.testMapWindow(giface, map_)
- elif test == 'mapdisplay':
- tester.testMapDisplay(giface, map_)
- elif test == 'apitest':
- tester.testMapWindowApi(giface, map_)
- elif test == 'distance':
- tester.testMapWindowDistance(giface, map_)
- elif test == 'profile':
- tester.testMapWindowProfile(giface, map_)
- elif test == 'rlisetup':
- tester.testMapWindowRlisetup(map_)
- else:
- # TODO: this should not happen but happens
- import grass.script as sgrass
- sgrass.fatal(_("Unknown value %s of test parameter." % test))
- app.MainLoop()
- if __name__ == '__main__':
- main()
|