class OgrImportDialog(ImportDialog): def __init__(self, parent, giface, link=False): """Dialog for bulk import of various vector data .. todo:: split importing logic from gui code :param parent: parent window :param link: True for linking data otherwise importing data """ self._giface = giface self.link = link self.layersData = [] ImportDialog.__init__(self, parent, giface=giface, itype='ogr') self.list.SetValidator( LayersListValidator(condition='vector', callback=self._nameValidationFailed)) if link: self.SetTitle(_("Link external vector data")) else: self.SetTitle(_("Import vector data")) self.dsnInput = GdalSelect(parent=self, panel=self.panel, ogr=True, link=link) self.dsnInput.AttachSettings() self.dsnInput.reloadDataRequired.connect(self.reload) if link: self.add.SetLabel(_("Add linked layers into layer tree")) else: self.add.SetLabel(_("Add imported layers into layer tree")) self.add.SetValue( UserSettings.Get(group='cmd', key='addNewLayer', subkey='enabled')) if link: self.btn_run.SetLabel(_("&Link")) self.btn_run.SetToolTip(_("Link selected layers")) else: self.btn_run.SetLabel(_("&Import")) self.btn_run.SetToolTip(_("Import selected layers")) self.doLayout() def reload(self, data, listData): self.list.LoadData(listData) self.list.SelectAll(select=True) self.layersData = data def OnRun(self, event): """Import/Link data (each layes as separate vector map)""" self.commandId = -1 data = self.list.GetLayers() data = self._getLayersToReprojetion(3, 4) if data is None: return if not data: GMessage(_("No layers selected. Operation canceled."), parent=self) return if not self._validateOutputMapName(): return dsn = self.dsnInput.GetDsn() ext = self.dsnInput.GetFormatExt() # determine data driver for PostGIS links self.popOGR = False if self.dsnInput.GetType() == 'db' and \ self.dsnInput.GetFormat() == 'PostgreSQL' and \ 'GRASS_VECTOR_OGR' not in os.environ: self.popOGR = True os.environ['GRASS_VECTOR_OGR'] = '1' for layer, output, listId in data: userData = {} if ext and layer.rfind(ext) > -1: layer = layer.replace('.' + ext, '') if '|' in layer: layer, geometry = layer.split('|', 1) else: geometry = None # TODO: v.import has no geometry option # if geometry: # cmd.append('geometry=%s' % geometry) cmd = self.getSettingsPageCmd() cmd.append('input=%s' % dsn) cmd.append('layer=%s' % layer) cmd.append('output=%s' % output) if self.override.IsChecked(): cmd.append('-o') if self.overwrite.IsChecked(): cmd.append('--overwrite') # TODO options if UserSettings.Get(group='cmd', key='overwrite', subkey='enabled') and '--overwrite' not in cmd: cmd.append('--overwrite') # run in Layer Manager self._giface.RunCmd(cmd, onDone=self.OnCmdDone, userData=userData, addLayer=False) def OnCmdDone(self, event): """Load layers and close if required""" if not hasattr(self, 'AddLayers'): return self.AddLayers(event.returncode, event.cmd, event.userData) if self.popOGR: os.environ.pop('GRASS_VECTOR_OGR') if event.returncode == 0 and self.closeOnFinish.IsChecked(): self.Close() def _getCommand(self): """Get command""" if self.link: return 'v.external' else: return 'v.import' def _getBlackListedParameters(self): """Get parametrs which will not be showed in Settings page""" return ['input', 'output', 'layer'] def _getBlackListedFlags(self): """Get flags which will not be showed in Settings page""" return ['overwrite', 'o', 'l', 'f']
class GdalOutputDialog(wx.Dialog): def __init__(self, parent, id=wx.ID_ANY, ogr=False, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, *kwargs): """Dialog for setting output format for rasters/vectors .. todo:: Split into GdalOutputDialog and OgrOutputDialog :param parent: parent window :param id: window id :param ogr: True for OGR (vector) otherwise GDAL (raster) :param style: window style :param *kwargs: other wx.Dialog's arguments """ self.parent = parent # GMFrame self.ogr = ogr wx.Dialog.__init__(self, parent, id=id, style=style, *kwargs) if self.ogr: self.SetTitle(_("Define output format for vector data")) else: self.SetTitle(_("Define output format for raster data")) self.panel = wx.Panel(parent=self, id=wx.ID_ANY) # buttons self.btnCancel = Button(parent=self.panel, id=wx.ID_CANCEL) self.btnCancel.SetToolTip(_("Close dialog")) self.btnOk = Button(parent=self.panel, id=wx.ID_OK) self.btnOk.SetToolTip(_("Set external format and close dialog")) self.btnOk.SetDefault() self.dsnInput = GdalSelect(parent=self, panel=self.panel, ogr=ogr, exclude=['file', 'protocol'], dest=True) self.dsnInput.AttachSettings() self.Bind(wx.EVT_BUTTON, self.OnCancel, self.btnCancel) self.Bind(wx.EVT_BUTTON, self.OnOK, self.btnOk) self._layout() def _layout(self): dialogSizer = wx.BoxSizer(wx.VERTICAL) dialogSizer.Add(self.dsnInput, proportion=1, flag=wx.EXPAND) btnSizer = wx.BoxSizer(orient=wx.HORIZONTAL) btnSizer.Add(self.btnCancel, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER, border=10) btnSizer.Add(self.btnOk, proportion=0, flag=wx.RIGHT | wx.ALIGN_CENTER, border=10) dialogSizer.Add(btnSizer, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_RIGHT, border=10) self.panel.SetAutoLayout(True) self.panel.SetSizer(dialogSizer) dialogSizer.Fit(self.panel) size = wx.Size(globalvar.DIALOG_GSELECT_SIZE[0] + 320, self.GetBestSize()[1] + 35) self.SetMinSize(size) self.SetSize((size.width, size.height)) self.Layout() def OnCancel(self, event): self.Destroy() def OnOK(self, event): if self.dsnInput.GetType() == 'native': RunCommand('v.external.out', parent=self, flags='r') else: dsn = self.dsnInput.GetDsn() frmt = self.dsnInput.GetFormat() options = self.dsnInput.GetOptions() if not dsn: GMessage(_("No data source selected."), parent=self) return RunCommand('v.external.out', parent=self, output=dsn, format=frmt, options=options) self.Close()
class GdalImportDialog(ImportDialog): def __init__(self, parent, giface, link=False): """Dialog for bulk import of various raster data .. todo:: split importing logic from gui code :param parent: parent window :param link: True for linking data otherwise importing data """ self._giface = giface self.link = link self.layersData = [] ImportDialog.__init__(self, parent, giface=giface, itype='gdal') self.list.SetValidator( LayersListValidator(condition='raster', callback=self._nameValidationFailed)) if link: self.SetTitle(_("Link external raster data")) else: self.SetTitle(_("Import raster data")) self.dsnInput = GdalSelect(parent=self, panel=self.panel, ogr=False, link=link) self.dsnInput.AttachSettings() self.dsnInput.reloadDataRequired.connect(self.reload) if link: self.add.SetLabel(_("Add linked layers into layer tree")) else: self.add.SetLabel(_("Add imported layers into layer tree")) self.add.SetValue( UserSettings.Get(group='cmd', key='addNewLayer', subkey='enabled')) if link: self.btn_run.SetLabel(_("&Link")) self.btn_run.SetToolTip(_("Link selected layers")) else: self.btn_run.SetLabel(_("&Import")) self.btn_run.SetToolTip(_("Import selected layers")) self.doLayout() def reload(self, data, listData): self.list.LoadData(listData) self.list.SelectAll(select=True) self.layersData = data def OnRun(self, event): """Import/Link data (each layes as separate vector map)""" self.commandId = -1 data = self.list.GetLayers() data = self._getLayersToReprojetion(2, 3) if data is None: return if not data: GMessage(_("No layers selected. Operation canceled."), parent=self) return if not self._validateOutputMapName(): return dsn = self.dsnInput.GetDsn() ext = self.dsnInput.GetFormatExt() for layer, output, listId in data: userData = {} if self.dsnInput.GetType() == 'dir': idsn = os.path.join(dsn, layer) else: idsn = dsn # check number of bands nBandsStr = RunCommand('r.in.gdal', flags='p', input=idsn, read=True) nBands = -1 if nBandsStr: try: nBands = int(nBandsStr.rstrip('\n')) except: pass if nBands < 0: GWarning(_("Unable to determine number of raster bands"), parent=self) nBands = 1 userData['nbands'] = nBands cmd = self.getSettingsPageCmd() cmd.append('input=%s' % idsn) cmd.append('output=%s' % output) if self.override.IsChecked(): cmd.append('-o') if self.overwrite.IsChecked(): cmd.append('--overwrite') if UserSettings.Get(group='cmd', key='overwrite', subkey='enabled') and '--overwrite' not in cmd: cmd.append('--overwrite') # run in Layer Manager self._giface.RunCmd(cmd, onDone=self.OnCmdDone, userData=userData, addLayer=False) def OnCmdDone(self, event): """Load layers and close if required""" if not hasattr(self, 'AddLayers'): return self.AddLayers(event.returncode, event.cmd, event.userData) if event.returncode == 0 and self.closeOnFinish.IsChecked(): self.Close() def _getCommand(self): """Get command""" if self.link: return 'r.external' else: return 'r.import' def _getBlackListedParameters(self): """Get flags which will not be showed in Settings page""" return ['input', 'output'] def _getBlackListedFlags(self): """Get flags which will not be showed in Settings page""" return ['overwrite', 'o']