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() if not CheckWxVersion([2, 9]): wx.InitAllImageHandlers() 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()
def AddLayer(self, *args, **kwargs): """Adds generic map layer to list of layers. For input params and returned data see overridden method in Map class. """ 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" layer = Map.AddLayer(self, *args, **kwargs) del os.environ["GRASS_RENDER_IMMEDIATE"] return layer
class HistogramFrame(wx.Frame): """Main frame for hisgram display window. Uses d.histogram rendered onto canvas """ def __init__(self, parent, giface, id=wx.ID_ANY, title=_("GRASS GIS Histogramming Tool (d.histogram)"), size=wx.Size(500, 350), style=wx.DEFAULT_FRAME_STYLE, **kwargs): wx.Frame.__init__(self, parent, id, title, size=size, style=style, **kwargs) self.SetIcon( wx.Icon(os.path.join(globalvar.ICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO)) self._giface = giface self.Map = Map( ) # instance of render.Map to be associated with display self.layer = None # reference to layer with histogram # Init variables self.params = {} # previously set histogram parameters self.propwin = '' # ID of properties dialog self.font = "" self.encoding = 'ISO-8859-1' # default encoding for display fonts self.toolbar = HistogramToolbar(parent=self) # workaround for http://trac.wxwidgets.org/ticket/13888 if sys.platform != 'darwin': self.SetToolBar(self.toolbar) # find selected map # might by moved outside this class # setting to None but honestly we do not handle no map case # TODO: when self.mapname is None content of map window is showed self.mapname = None layers = self._giface.GetLayerList().GetSelectedLayers( checkedOnly=False) if len(layers) > 0: self.mapname = layers[0].maplayer.name # Add statusbar self.statusbar = self.CreateStatusBar(number=1, style=0) # self.statusbar.SetStatusWidths([-2, -1]) hist_frame_statusbar_fields = ["Histogramming %s" % self.mapname] for i in range(len(hist_frame_statusbar_fields)): self.statusbar.SetStatusText(hist_frame_statusbar_fields[i], i) # Init map display self.InitDisplay() # initialize region values # initialize buffered DC self.HistWindow = BufferedWindow( self, id=wx.ID_ANY, Map=self.Map) # initialize buffered DC # Bind various events self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) # Init print module and classes self.printopt = PrintOptions(self, self.HistWindow) # Add layer to the map self.layer = self.Map.AddLayer(ltype="command", name='histogram', command=[['d.histogram']], active=False, hidden=False, opacity=1, render=False) if self.mapname: self.SetHistLayer(self.mapname, None) else: self.OnErase(None) wx.CallAfter(self.OnOptions, None) def InitDisplay(self): """Initialize histogram display, set dimensions and region """ self.width, self.height = self.GetClientSize() self.Map.geom = self.width, self.height def OnOptions(self, event): """Change histogram settings""" cmd = ['d.histogram'] if self.mapname != '': cmd.append('map=%s' % self.mapname) module = GUI(parent=self) module.ParseCommand(cmd, completed=(self.GetOptData, None, self.params)) def GetOptData(self, dcmd, layer, params, propwin): """Callback method for histogram command generated by dialog created in menuform.py """ if dcmd: name, found = GetLayerNameFromCmd(dcmd, fullyQualified=True, layerType='raster') if not found: GError(parent=propwin, message=_("Raster map <%s> not found") % name) return self.SetHistLayer(name, dcmd) self.params = params self.propwin = propwin self.HistWindow.UpdateHist() def SetHistLayer(self, name, cmd=None): """Set histogram layer """ self.mapname = name if not cmd: cmd = ['d.histogram', ('map=%s' % self.mapname)] self.layer = self.Map.ChangeLayer(layer=self.layer, command=[cmd], active=True) return self.layer def SetHistFont(self, event): """Set font for histogram. If not set, font will be default display font. """ dlg = DefaultFontDialog(parent=self, id=wx.ID_ANY, title=_('Select font for histogram text')) dlg.fontlb.SetStringSelection(self.font, True) if dlg.ShowModal() == wx.ID_CANCEL: dlg.Destroy() return # set default font type, font, and encoding to whatever selected in dialog if dlg.font != None: self.font = dlg.font if dlg.encoding != None: self.encoding = dlg.encoding dlg.Destroy() self.HistWindow.UpdateHist() def OnErase(self, event): """Erase the histogram display """ self.HistWindow.Draw(self.HistWindow.pdc, pdctype='clear') def OnRender(self, event): """Re-render histogram """ self.HistWindow.UpdateHist() def GetWindow(self): """Get buffered window""" return self.HistWindow def SaveToFile(self, event): """Save to file """ filetype, ltype = GetImageHandlers(self.HistWindow.img) # get size dlg = ImageSizeDialog(self) dlg.CentreOnParent() if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() return width, height = dlg.GetValues() dlg.Destroy() # get filename dlg = wx.FileDialog(parent=self, message=_("Choose a file name to save the image " "(no need to add extension)"), wildcard=filetype, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if not path: dlg.Destroy() return base, ext = os.path.splitext(path) fileType = ltype[dlg.GetFilterIndex()]['type'] extType = ltype[dlg.GetFilterIndex()]['ext'] if ext != extType: path = base + '.' + extType self.HistWindow.SaveToFile(path, fileType, width, height) self.HistWindow.UpdateHist() dlg.Destroy() def PrintMenu(self, event): """Print options and output menu """ point = wx.GetMousePosition() printmenu = wx.Menu() # Add items to the menu setup = wx.MenuItem(printmenu, id=wx.ID_ANY, text=_('Page setup')) printmenu.AppendItem(setup) self.Bind(wx.EVT_MENU, self.printopt.OnPageSetup, setup) preview = wx.MenuItem(printmenu, id=wx.ID_ANY, text=_('Print preview')) printmenu.AppendItem(preview) self.Bind(wx.EVT_MENU, self.printopt.OnPrintPreview, preview) doprint = wx.MenuItem(printmenu, id=wx.ID_ANY, text=_('Print display')) printmenu.AppendItem(doprint) self.Bind(wx.EVT_MENU, self.printopt.OnDoPrint, doprint) # Popup the menu. If an item is selected then its handler # will be called before PopupMenu returns. self.PopupMenu(printmenu) printmenu.Destroy() def OnQuit(self, event): self.Close(True) def OnCloseWindow(self, event): """Window closed Also remove associated rendered images """ try: self.propwin.Close(True) except: pass self.Map.Clean() self.Destroy()
def GetLayersFromCmdFile(self): """Get list of map layers from cmdfile """ if not self.cmdfile: return nlayers = 0 try: fd = open(self.cmdfile, 'r') lines = fd.readlines() fd.close() # detect d.out.file, delete the line from the cmd file and export graphics if len(lines) > 0: if lines[-1].startswith('d.out.file') or lines[-1].startswith( 'd.to.rast'): dCmd = lines[-1].strip() fd = open(self.cmdfile, 'w') fd.writelines(lines[:-1]) fd.close() if lines[-1].startswith('d.out.file'): self.saveToFile.emit(cmd=utils.split(dCmd)) else: self.dToRast.emit(cmd=utils.split(dCmd)) return if lines[-1].startswith('d.what'): dWhatCmd = lines[-1].strip() fd = open(self.cmdfile, 'w') fd.writelines(lines[:-1]) fd.close() if '=' in utils.split(dWhatCmd)[1]: maps = utils.split(dWhatCmd)[1].split('=')[1].split( ',') else: maps = utils.split(dWhatCmd)[1].split(',') self.query.emit( ltype=utils.split(dWhatCmd)[0].split('.')[-1], maps=maps) return existingLayers = self.GetListOfLayers() # holds new rendreing order for every layer in existingLayers layersOrder = [-1] * len(self.GetListOfLayers()) # next number in rendering order next_layer = 0 for line in lines: cmd = utils.split(line.strip()) ltype = None try: ltype = utils.command2ltype[cmd[0]] except KeyError: grass.warning(_("Unsupported command %s.") % cmd[0]) continue name = utils.GetLayerNameFromCmd(cmd, fullyQualified=True, layerType=ltype)[0] # creating temporary layer object to compare commands # neccessary to get the same format # supposing that there are no side effects tmpMapLayer = MapLayer(ltype=ltype, name=name, cmd=cmd, Map=None, active=False, hidden=True, opacity=0) exists = False for i, layer in enumerate(existingLayers): if layer.GetCmd(string=True) == tmpMapLayer.GetCmd( string=True): exists = True if layersOrder[i] == -1: layersOrder[i] = next_layer next_layer += 1 # layer must be put higher in render order (same cmd was insered more times) # TODO delete rendurant cmds from cmd file? else: for j, l_order in enumerate(layersOrder): if l_order > layersOrder[i]: layersOrder[j] -= 1 layersOrder[i] = next_layer - 1 break if exists: continue newLayer = Map.AddLayer(self, ltype=ltype, command=cmd, active=True, name=name) existingLayers.append(newLayer) self.ownedLayers.append(newLayer) layersOrder.append(next_layer) next_layer += 1 nlayers += 1 reorderedLayers = [-1] * next_layer for i, layer in enumerate(existingLayers): # owned layer was not found in cmd file -> is deleted if layersOrder[i] == -1 and layer in self.ownedLayers: self.ownedLayers.remove(layer) self.DeleteLayer(layer) # other layer e. g. added by wx.vnet are added to the top elif layersOrder[i] == -1 and layer not in self.ownedLayers: reorderedLayers.append(layer) # owned layer found in cmd file is added into proper rendering position else: reorderedLayers[layersOrder[i]] = layer self.SetLayers(reorderedLayers) except IOError as e: grass.warning(_("Unable to read cmdfile '%(cmd)s'. Details: %(det)s") % \ { 'cmd' : self.cmdfile, 'det' : e }) return self._giface.updateMap.emit() Debug.msg(1, "Map.GetLayersFromCmdFile(): cmdfile=%s" % self.cmdfile) Debug.msg(1, " nlayers=%d" % nlayers)
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()