def on_cmdSaveRasterFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + "/BASE_OUT_FOLDER") pixel_size_str = numeric_pixelsize_to_string(self.dsbPixelSize.value()) filename = '{}_BlockGrid_{}'.format(self.mcboTargetLayer.currentText(), pixel_size_str) filename = re.sub('[^A-Za-z0-9_-]+', '', filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("Tiff") + " (*.tif);;", default_name=os.path.join(lastFolder, filename + '.tif')) if s == '' or s is None: return write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s)) self.lneSaveRasterFile.setText(s) self.lneSaveRasterFile.setStyleSheet('color:black')
def on_cmdInVesperCtrlFile_clicked(self): self.lneInVesperCtrlFile.clear() inFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder") if inFolder is None or not os.path.exists(inFolder): inFolder = read_setting(PLUGIN_NAME + '/BASE_IN_FOLDER') s,_f = QFileDialog.getOpenFileName( self, caption=self.tr("Select a vesper control file to import"), directory=inFolder, filter=self.tr("Vesper Control File") + " (*control*.txt);;" + self.tr("All Files") + " (*.*);;") if s == '': self.lblInVesperCtrlFile.setStyleSheet('color:red') return else: s = os.path.normpath(s) self.lblInVesperCtrlFile.setStyleSheet('color:black') self.lneInVesperCtrlFile.setText(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder", os.path.dirname(s)) with open(s) as f: for line in f: if "epsg=" in line: epsg = int(line.strip().split('=')[-1]) self.mCRSinput.setCrs(QgsCoordinateReferenceSystem().fromEpsgId(epsg)) break
def on_chkSaveLinesFile_stateChanged(self, state): self.lneSaveLinesFile.setEnabled(state) if state: lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + "/BASE_OUT_FOLDER") if self.lneSavePointsFile.text() == '': filename = os.path.join( lastFolder, self.mcboLineLayer.currentText() + '_strip-trial-lines.shp') else: path, file = os.path.split(self.lneSavePointsFile.text()) file, ext = os.path.splitext(file) filename = os.path.join( path, file.replace('-points', '') + '-lines' + ext) self.lneSaveLinesFile.setText(filename) self.chkSaveLinesFile.setStyleSheet('color:black') self.lneSaveLinesFile.setStyleSheet('color:black') else: self.lneSaveLinesFile.setText('')
def on_cmdSaveFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + "/BASE_OUT_FOLDER") filename = self.mcboTargetLayer.currentLayer().name() + '_{}randompts'.format(int(self.dsbSize.value())) # Only use alpha numerics and underscore and hyphens. filename = re.sub('[^A-Za-z0-9_-]+', '', filename) # replace more than one instance of underscore with a single one. filename = re.sub(r"_+", "_", filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("ESRI Shapefile") + " (*.shp);;", default_name=os.path.join(lastFolder, filename)) if s == '' or s is None: return s = os.path.normpath(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s)) self.lneSaveFile.setText(s) self.lblSaveFile.setStyleSheet('color:black') self.lneSaveFile.setStyleSheet('color:black')
def on_cmdVesperFold_clicked(self): self.messageBar.clearWidgets() if self.lneVesperFold.text() is None: outFolder = '' else: outFolder = self.lneVesperFold.text() if outFolder == '': outFolder = read_setting( PLUGIN_NAME + "/" + self.toolKey + "/LastVesperOutFolder") if outFolder is None or not os.path.exists(outFolder): outFolder = read_setting(PLUGIN_NAME + '/BASE_OUT_FOLDER') s = QtGui.QFileDialog.getExistingDirectory(self, self.tr( "Vesper processing folder. A Vesper sub-folder will be created."), outFolder, QtGui.QFileDialog.ShowDirsOnly) self.cleanMessageBars(self) if s == '' or s is None: return s = os.path.normpath(s) self.lblVesperFold.setStyleSheet('color:black') self.lneVesperFold.setStyleSheet('color:black') self.lneVesperFold.setText(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastVesperOutFolder", s)
def on_cmdSaveRasterFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + "/BASE_OUT_FOLDER") filename = self.mcboTargetLayer.currentLayer().name( ) + '_' + self.cboMethod.currentText() if self.cboMethod.currentText() == 'Rescale': filename = self.mcboTargetLayer.currentLayer().name( ) + '_{}{}-{}'.format(self.cboMethod.currentText(), int(self.dsbRescaleLower.value()), int(self.dsbRescaleUpper.value())) filename = re.sub('[^A-Za-z0-9_-]+', '', filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("Tiff") + " (*.tif);;", default_name=os.path.join(lastFolder, filename + '.tif')) if s == '' or s is None: return s = os.path.normpath(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s)) self.lneSaveRasterFile.setText(s) self.lblOutputFile.setStyleSheet('color:black') self.lneSaveRasterFile.setStyleSheet('color:black')
def on_cmdOutputFolder_clicked(self): self.messageBar.clearWidgets() if self.lneOutputFolder.text() is None: outFolder = '' else: outFolder = self.lneOutputFolder.text() if outFolder == '': outFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if outFolder is None or not os.path.exists(outFolder): outFolder = read_setting(PLUGIN_NAME + '/BASE_OUT_FOLDER') s = QtGui.QFileDialog.getExistingDirectory( self, self. tr("Save output files to a folder. A sub-folder will be created from the image name" ), outFolder, QtGui.QFileDialog.ShowDirsOnly) self.cleanMessageBars(self) if s == '' or s is None: return s = os.path.normpath(s) self.lblOutputFolder.setStyleSheet('color:black') self.lneOutputFolder.setStyleSheet('color:black') self.lneOutputFolder.setText(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", s)
def on_cmdSaveFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + '/BASE_OUT_FOLDER') # get first layer in the list str_pixel_size = numeric_pixelsize_to_string(float(self.pixel_size[0])) filename = 'k-means_{}clusters_{}rasters_{}'.format( self.spnClusters.value(), self.tabList.rowCount(), str_pixel_size) # replace more than one instance of underscore with a single one. # ie'file____norm__control___yield_h__' to 'file_norm_control_yield_h_' filename = re.sub(r"_+", "_", filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("Tiff") + " (*.tif);;", default_name=os.path.join(lastFolder, filename + '.tif')) if s == '' or s is None: return s = os.path.normpath(s) self.lneSaveFile.setText(s) if file_in_use(s): self.lneSaveFile.setStyleSheet('color:red') self.lblSaveFile.setStyleSheet('color:red') else: self.lblSaveFile.setStyleSheet('color:black') self.lneSaveFile.setStyleSheet('color:black') write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s))
def on_cmdSaveCSVFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + '/BASE_OUT_FOLDER') lyrTarget = self.mcboPointsLayer.currentLayer() filename = os.path.splitext(lyrTarget.name())[0] + '_pixelvals.csv' # replace more than one instance of underscore with a single one. # ie'file____norm__control___yield_h__' to 'file_norm_control_yield_h_' filename = re.sub(r"_+", "_", filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("Comma Delimited") + " (*.csv);;", default_name=os.path.join(lastFolder, filename)) if s == '' or s is None: return s = os.path.normpath(s) self.lneSaveCSVFile.setText(s) if file_in_use(s): self.lneSaveCSVFile.setStyleSheet('color:red') self.lblSaveCSVFile.setStyleSheet('color:red') else: self.lblSaveCSVFile.setStyleSheet('color:black') self.lneSaveCSVFile.setStyleSheet('color:black') write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s))
def on_cmdSaveFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + '/BASE_OUT_FOLDER') if self.cboMethod.currentText() == 'Target Over All Years': filename = 'persistor_allyears.tif' else: filename = 'persistor_targetprob.tif' # replace more than one instance of underscore with a single one. # ie'file____norm__control___yield_h__' to 'file_norm_control_yield_h_' filename = re.sub(r"_+", "_", filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("GeoTIFF, TIFF") + " (*.tif);;", default_name=os.path.join(lastFolder, filename)) if s == '' or s is None: return s = os.path.normpath(s) self.lneSaveFile.setText(s) if file_in_use(s): self.lneSaveFile.setStyleSheet('color:red') self.lblSaveFile.setStyleSheet('color:red') else: self.lblSaveFile.setStyleSheet('color:black') self.lneSaveFile.setStyleSheet('color:black') write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s))
def on_cmdSavePointsFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + '/BASE_OUT_FOLDER') if self.optLayer.isChecked(): lyrTarget = self.mcboTargetLayer.currentLayer() filename = lyrTarget.name() + '_points.shp' else: filename = os.path.splitext(self.lneInCSVFile.text())[0] + '_points.shp' # replace more than one instance of underscore with a single one. # ie'file____norm__control___yield_h__' to 'file_norm_control_yield_h_' filename = re.sub(r"_+", "_", filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("ESRI Shapefile") + " (*.shp);;", default_name=os.path.join(lastFolder, filename)) if s == '' or s is None: return s = os.path.normpath(s) self.lneSavePointsFile.setText(s) self.lneSavePointsFile.setEnabled(True) self.lblSavePointsFile.setStyleSheet('color:black') self.lblSavePolyFile.setStyleSheet('color:black') write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s))
def on_cmdInFile_clicked(self): self.resetFormToDefaults() inFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder") if inFolder is None or not os.path.exists(inFolder): inFolder = read_setting(PLUGIN_NAME + '/BASE_IN_FOLDER') """Click Button Event.""" self.optFile.setChecked(True) s = QFileDialog.getOpenFileName( self, caption=self.tr("Choose a file to open"), directory=inFolder, filter=self.tr("Delimited files") + " (*.csv *.txt);;") # + self.tr("Spreadsheet files") + " (*.ods *.xls *.xlsx);;" # + self.tr("GDAL Virtual Format") + " (*.vrt);;") if type(s) == tuple: s = s[0] if s == '': return self.lneInCSVFile.setText(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder", os.path.dirname(s))
def on_cmdSavePointsFile_clicked(self): self.messageBar.clearWidgets() lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + "/BASE_OUT_FOLDER") filename = self.mcboLineLayer.currentLayer().name( ) + '_strip-trial-points' s = save_as_dialog(self, self.tr("Save As"), self.tr("ESRI Shapefile") + " (*.shp);;", default_name=os.path.join(lastFolder, filename)) if s == '' or s is None: return s = os.path.normpath(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s)) self.lneSavePointsFile.setText(s) self.lblSavePointsFile.setStyleSheet('color:black') self.lneSavePointsFile.setStyleSheet('color:black')
def on_cmdInVesperCtrlFile_clicked(self): self.lneInVesperCtrlFile.clear() inFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder") if inFolder is None or not os.path.exists(inFolder): inFolder = read_setting(PLUGIN_NAME + '/BASE_IN_FOLDER') s = QtGui.QFileDialog.getOpenFileName( self, caption=self.tr("Select a vesper control file to import"), directory=inFolder, filter=self.tr("Vesper Control File") + " (*control*.txt);;" + self.tr("All Files") + " (*.*);;") if s == '': self.lblInVesperCtrlFile.setStyleSheet('color:red') return else: s = os.path.normpath(s) self.lblInVesperCtrlFile.setStyleSheet('color:black') self.lneInVesperCtrlFile.setText(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder", os.path.dirname(s)) with open(s) as f: for line in f: if "epsg=" in line: if line.strip().split('=') > 2: epsg = line.strip().replace("'", '').split('=')[-1] self.vesper_qgscrs = QgsCoordinateReferenceSystem("EPSG:{}".format(epsg)) self.vesper_qgscrs.validate() self.lneInCRS.setText('{} - {}'.format(self.vesper_qgscrs.description(), self.vesper_qgscrs.authid())) break
def __init__(self, iface, parent=None): super(RandomPixelSelectionDialog, self).__init__(parent) # Set up the user interface from Designer. self.setupUi(self) # The qgis interface self.iface = iface self.DISP_TEMP_LAYERS = read_setting(PLUGIN_NAME + '/DISP_TEMP_LAYERS', bool) # Catch and redirect python errors directed at the log messages python error tab. QgsMessageLog.instance().messageReceived.connect(errorCatcher) if not os.path.exists(TEMPDIR): os.mkdir(TEMPDIR) # Setup for validation messagebar on gui -------------------------- self.messageBar = QgsMessageBar(self) # leave this message bar for bailouts self.validationLayout = QtGui.QFormLayout(self) # new layout to gui if isinstance(self.layout(), QtGui.QFormLayout): # create a validation layout so multiple messages can be added and cleaned up. self.layout().insertRow(0, self.validationLayout) self.layout().insertRow(0, self.messageBar) else: self.layout().insertWidget(0, self.messageBar) # for use with Vertical/horizontal layout box # GUI Customisation ----------------------------------------------- self.setWindowIcon(QtGui.QIcon(':/plugins/pat/icons/icon_randomPixel.svg')) if read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastSize") > 0: self.dsbSize.setValue(read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastSize", int))
def check_R_dependency(): updated = False r_installfold = read_setting('Processing/Configuration/R_FOLDER') if platform.system() == 'Windows': try: aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE) aKey = OpenKey(aReg, r"SOFTWARE\R-core\R") aVal = os.path.normpath(QueryValueEx(aKey, "InstallPath")[0]) if os.path.exists(aVal): if r_installfold is not None and r_installfold != aVal: r_installfold = aVal write_setting('Processing/Configuration/R_FOLDER', aVal) LOGGER.info( 'Setting ... R Install folder: {}'.format(aVal)) r_installed = True except EnvironmentError: r_installed = False write_setting('Processing/Configuration/R_FOLDER', '') write_setting('Processing/Configuration/ACTIVATE_R', False) return 'R is not installed or not configured for QGIS.\n See "Configuring QGIS to use R" in help documentation' else: # Linux/OSX - https://stackoverflow.com/a/25330049 try: subprocess.check_call(['which', 'R']) except subprocess.CalledProcessError: r_installed = False else: r_installed = True if not r_installed: write_setting('Processing/Configuration/R_FOLDER', '') write_setting('Processing/Configuration/ACTIVATE_R', False) return 'R is not installed or not configured for QGIS.\n See "Configuring QGIS to use R" in help documentation' # Get the users R script folder - returns none if not set. r_scripts_fold = read_setting('Processing/Configuration/R_SCRIPTS_FOLDER') if r_scripts_fold is None: return 'R is not installed or not configured for QGIS.\n See "Configuring QGIS to use R" in help documentation' files = glob.glob(os.path.join(PLUGIN_DIR, "R-Scripts", "Whole*.rsx")) for src_file in files: dest_file = os.path.join(r_scripts_fold, os.path.basename(src_file)) # update flag will only update if file doesnt exist or is newer and returns a tuple of # all files with a 1 if the file was copied if file_util.copy_file(src_file, dest_file, update=True)[-1]: LOGGER.info('Installing or Updating Whole-of-block analysis tool.') # # only copy if it doesn't exist or it is newer by 1 second. # if not os.path.exists(dest_file) or os.stat(src_file).st_mtime - os.stat( # dest_file).st_mtime > 1: # shutil.copy2(src_file, dest_file) return True
def get_plugin_state(): from qgis.utils import pluginMetadata """TODO: Make the paths clickable links to open folder def create_path_link(path): path = os.path.normpath(path) #"<a href={}>Open Project Folder</a>".format("`C:/Progra~1/needed"`) return '<a href= file:///"`{0}"`>{0}</a>'.format(path) """ plug_state = 'QGIS Environment :\n' plug_state += ' {:20}\t{}\n'.format('QGIS :', Qgis.QGIS_VERSION) qgis_prefix = qgis.core.QgsApplication.prefixPath() if platform.system() == 'Windows': qgis_prefix = os.path.abspath(win32api.GetLongPathName(qgis_prefix)) plug_state += ' {:20}\t{}\n'.format('Install Path : ', qgis_prefix) plug_state += ' {:20}\t{}\n'.format('Plugin Dir :', os.path.normpath(PLUGIN_DIR)) plug_state += ' {:20}\t{}\n'.format( 'Temp Folder :', os.path.normpath(tempfile.gettempdir())) plug_state += ' {:20}\t{}\n'.format('Python :', sys.version) plug_state += ' {:20}\t{}\n'.format( 'GDAL :', os.environ.get('GDAL_VERSION', None)) plug_state += '\nPAT Version :\n' plug_state += ' {:20}\t{} {}\n'.format( 'PAT :', pluginMetadata('pat', 'version'), pluginMetadata('pat', 'update_date')) plug_state += ' {:20}\t{}\n'.format( 'pyPrecAg :', get_distribution('pyprecag').version) plug_state += ' {:20}\t{}\n'.format( 'Geopandas :', get_distribution('geopandas').version) plug_state += ' {:20}\t{}\n'.format( 'Rasterio :', get_distribution('rasterio').version) plug_state += ' {:20}\t{}\n'.format('Fiona :', get_distribution('fiona').version) plug_state += ' {:20}\t{}\n'.format('Pandas :', get_distribution('pandas').version) plug_state += '\nR Configuration :\n' plug_state += ' {:20}\t{}\n'.format( 'R Active :', read_setting('Processing/Configuration/ACTIVATE_R')) plug_state += ' {:20}\t{}\n'.format( 'R Install Folder :', read_setting('Processing/Configuration/R_FOLDER')) return plug_state
def check_pat_symbols(): pat_xml = os.path.join(PLUGIN_DIR, 'PAT_Symbols.xml') if not os.path.exists(pat_xml): return loaded_date = read_setting(PLUGIN_NAME + "/PAT_SYMBOLOGY") if loaded_date is not None: loaded_date = datetime.strptime(loaded_date, '%Y-%m-%d %H:%M:%S') xml_date = datetime.fromtimestamp( os.path.getmtime(pat_xml)).replace(microsecond=0) styles = QgsStyle().defaultStyle() if 'PAT' not in styles.tags() or (loaded_date is None or xml_date > loaded_date): if styles.isXmlStyleFile(pat_xml): if styles.importXml(pat_xml): LOGGER.info('Loaded PAT Symbology') write_setting(PLUGIN_NAME + '/PAT_SYMBOLOGY', xml_date.strftime('%Y-%m-%d %H:%M:%S')) else: LOGGER.warning('Loading PAT Symbology failed') else: LOGGER.debug('Could not open file {}'.format(pat_xml)) return
def setup_logger(logger_name, log_file=None): """ Run once when the module is loaded and enable logging. logger_name (str): The logger name that we want to set up. log_file (str): Optional full path to a file to write logs to. Borrowed heavily from http://docs.python.org/howto/logging-cookbook.html Now to log a message do:: LOGGER.debug('Some debug message') Args: logger_name (): The name call the logger log_file (): the file to write log messages to. """ if not os.path.exists(TEMPDIR): os.mkdir(TEMPDIR) if read_setting(PLUGIN_NAME + "/" + 'DEBUG', bool): default_handler_level = logging.DEBUG else: default_handler_level = logging.INFO # Suppress the IOError: [Errno 9] Bad file descriptor when logging. # source: https://stackoverflow.com/a/35152695 logging.raiseExceptions = False logger = logging.getLogger(logger_name) logger.setLevel(default_handler_level) add_logging_handler_once(logger, logging.NullHandler()) # create formatter that will be added to the handlers formatter = logging.Formatter( "%(asctime)s.%(msecs)03d %(name)-10s %(levelname)-8s %(message)s", "%Y-%m-%d %H:%M:%S") # create syslog handler which logs even debug messages log_path = os.path.join(TEMPDIR, 'PAT.log') if log_file is None: file_handler = logging.FileHandler(log_path, delay=True) else: file_handler = logging.FileHandler(log_file, delay=True) file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(formatter) add_logging_handler_once(logger, file_handler) # create console handler with a higher log level # console_handler = logging.StreamHandler() # console_handler.setLevel(default_handler_level) # console_handler.setFormatter(formatter) # add_logging_handler_once(logger, console_handler) # create a QGIS handler qgis_handler = QgsLogHandler(default_handler_level) qgis_handler.setFormatter(formatter) add_logging_handler_once(logger, qgis_handler)
def check_pip_for_update(package): """ Check a package against online pip via json get the most current release version number source: https://stackoverflow.com/a/40745656 """ # only check once a month for pyprecag updates. last_pip_check = read_setting(PLUGIN_NAME + "/LAST_PIP_CHECK") if last_pip_check is not None: last_pip_check = datetime.strptime(last_pip_check, '%Y-%m-%d') if last_pip_check is None or (datetime.now() - last_pip_check).days > 30: url = 'https://pypi.python.org/pypi/{}/json'.format(package) try: releases = requests.get(url).json()['releases'] current_version = sorted(releases, key=parse_version, reverse=True)[0] write_setting(PLUGIN_NAME + '/LAST_PIP_CHECK', datetime.now().strftime('%Y-%m-%d')) return current_version except requests.ConnectionError: LOGGER.info( 'Skipping pyprecag version check. Cannot reach {}'.format(url)) return
def __init__(self, iface, parent=None): super(PreVesperDialog, self).__init__(iface.mainWindow()) # Set up the user interface from Designer. self.setupUi(self) # The qgis interface self.iface = iface self.DISP_TEMP_LAYERS = read_setting( PLUGIN_NAME + '/DISP_TEMP_LAYERS', bool) self.DEBUG = config.get_debug_mode() # Catch and redirect python errors directed at the log messages python # error tab. QgsMessageLog.instance().messageReceived.connect(errorCatcher) if not os.path.exists(TEMPDIR): os.mkdir(TEMPDIR) # Setup for validation messagebar on gui----------------------------- self.setWindowIcon(QtGui.QIcon( ':/plugins/pat/icons/icon_vesperKriging.svg')) self.validationLayout = QtGui.QFormLayout(self) # source: https://nathanw.net/2013/08/02/death-to-the-message-box-use-the-qgis-messagebar/ # Add the error messages to top of form via a message bar. # leave this message bar for bailouts self.messageBar = QgsMessageBar(self) if isinstance(self.layout(), (QtGui.QFormLayout, QtGui.QGridLayout)): # create a validation layout so multiple messages can be added and # cleaned up. self.layout().insertRow(0, self.validationLayout) self.layout().insertRow(0, self.messageBar) else: # for use with Vertical/horizontal layout box self.layout().insertWidget(0, self.messageBar) # Set Class default variables ------------------------------------- self.vesp_dict = None self.in_qgscrs = None self.dfCSV = None # this is a validation flag self.OverwriteCtrlFile = False self.cboMethod.addItems( ['High Density Kriging', 'Low Density Kriging (Advanced)']) # To allow only integers for the min number of pts. self.onlyInt = QIntValidator() self.lneMinPoint.setValidator(self.onlyInt) self.vesper_exe = check_vesper_dependency() if self.vesper_exe is None or self.vesper_exe == '': self.gbRunVesper.setTitle( 'WARNING:Vesper not found please configure using the about dialog.') self.gbRunVesper.setChecked(False) self.gbRunVesper.setCheckable(False) self.gbRunVesper.setEnabled(False)
def on_cmdSaveFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + '/BASE_OUT_FOLDER') if self.cboMethod.currentText() == 'Target Over All Years': if self.optGreaterThan.isChecked(): result_operator = 'gt' else: result_operator = 'lt' filename = 'persistor_allyears_{}{}'.format( result_operator, self.cboAllYearTargetPerc.currentText()) else: filename = 'persistor_targetprob_{}gte{}_{}lt{}'.format( self.cboUpperProb.currentText(), self.cboUpperPerc.currentText(), self.cboLowerProb.currentText(), self.cboLowerPerc.currentText()) # Only use alpha numerics and underscore and hyphens. filename = re.sub('[^A-Za-z0-9_-]+', '', filename) # replace more than one instance of underscore with a single one. # ie'file____norm__control___yield_h__' to 'file_norm_control_yield_h_' filename = re.sub(r"_+", "_", filename) s = save_as_dialog(self, self.tr("Save As"), self.tr("GeoTIFF, TIFF") + " (*.tif);;", default_name=os.path.join(lastFolder, filename)) if s == '' or s is None: return s = os.path.normpath(s) self.lneSaveFile.setText(s) if file_in_use(s): self.lneSaveFile.setStyleSheet('color:red') self.lblSaveFile.setStyleSheet('color:red') else: self.lblSaveFile.setStyleSheet('color:black') self.lneSaveFile.setStyleSheet('color:black') write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s))
def on_cmdInGridFile_clicked(self): self.lneInGridFile.clear() self.messageBar.clearWidgets() inFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder_VesperGrid") if inFolder is None or not os.path.exists(inFolder): inFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder_CSV") if inFolder is None or not os.path.exists(inFolder): inFolder = read_setting(PLUGIN_NAME + '/BASE_IN_FOLDER') s, _f = QFileDialog.getOpenFileName( self, caption=self.tr("Choose the Vesper Grid File"), directory=inFolder, filter='{} (*_v.txt);;{} (*.*);;'.format( self.tr("Vesper Grid File(s)"), self.tr("All Files"))) self.cleanMessageBars(self) s = os.path.normpath(s) self.lneInGridFile.clear() self.lneInGridFile.setStyleSheet('color:red') self.lblInGridFile.setStyleSheet('color:red') overlaps, message = self.validate_csv_grid_files( self.lneInCSVFile.text(), s) if overlaps or message is None: self.lneInGridFile.setStyleSheet('color:black') self.lblInGridFile.setStyleSheet('color:black') if overlaps: self.lneInGridFile.setText(s) write_setting( PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder_VesperGrid", os.path.dirname(s)) else: self.send_to_messagebar(message, level=Qgis.Critical, duration=0, addToLog=True, showLogPanel=True, exc_info=sys.exc_info())
def on_cmdVariogramFile_clicked(self): self.lneVariogramFile.clear() self.messageBar.clearWidgets() inFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder_Variogram") if inFolder is None or not os.path.exists(inFolder): inFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder_Variogram") if inFolder is None or not os.path.exists(inFolder): inFolder = read_setting(PLUGIN_NAME + '/BASE_IN_FOLDER') s, _f = QFileDialog.getOpenFileName( self, caption=self.tr("Choose the Vesper Variogram File"), directory=inFolder, filter='{} (*.txt);;{} (*.*);;'.format( self.tr("Variogram Text File(s)"), self.tr("All Files"))) self.cleanMessageBars(self) if s == '': self.lneVariogramFile.setStyleSheet('color:red') self.lblVariogramFile.setStyleSheet('color:red') return if 'Variogram Model' not in open(s).read(): self.lneVariogramFile.setStyleSheet('color:red') self.lblVariogramFile.setStyleSheet('color:red') self.send_to_messagebar("Invalid Variogram File", level=Qgis.Critical, duration=0, addToLog=True, showLogPanel=True, exc_info=sys.exc_info()) # self.lneVariogramFile.clear() return s = os.path.normpath(s) self.lblVariogramFile.setStyleSheet('color:black') self.lneVariogramFile.setStyleSheet('color:black') self.lneVariogramFile.setText(s) write_setting( PLUGIN_NAME + "/" + self.toolKey + "/LastInFolder_Variogram", os.path.dirname(s))
def __init__(self, iface, parent=None): super(tTestAnalysisDialog, self).__init__(parent) # Set up the user interface from Designer. self.setupUi(self) self.iface = iface self.DISP_TEMP_LAYERS = read_setting(PLUGIN_NAME + '/DISP_TEMP_LAYERS', bool) self.DEBUG = config.get_debug_mode() # Catch and redirect python errors directed at the log messages python error tab. QgsApplication.messageLog().messageReceived.connect(errorCatcher) if not os.path.exists(TEMPDIR): os.mkdir(TEMPDIR) # Setup for validation messagebar on gui----------------------------- self.messageBar = QgsMessageBar( self) # leave this message bar for bailouts self.validationLayout = QtWidgets.QFormLayout( self) # new layout to gui self.raster_filter_message = self.lblLayerFilter.text() self.pixel_size = ['0', 'm', ''] self.layer_table = build_layer_table() if isinstance(self.layout(), (QtWidgets.QFormLayout, QtWidgets.QGridLayout)): # create a validation layout so multiple messages can be added and cleaned up. self.layout().insertRow(0, self.validationLayout) self.layout().insertRow(0, self.messageBar) else: # for use with Vertical/horizontal layout box self.layout().insertWidget(0, self.messageBar) for cbo in [ self.mcboRasterLayer, self.mcboCtrlRasterLayer, self.mcboZoneRasterLyr ]: cbo.setFilters(QgsMapLayerProxyModel.RasterLayer) cbo.setExcludedProviders(['wms']) cbo.setAllowEmptyLayer(True) cbo.setCurrentIndex(0) self.mcboPointsLayer.setFilters(QgsMapLayerProxyModel.PointLayer) self.mcboPointsLayer.setExcludedProviders(['wms']) self.mcboPointsLayer.setAllowEmptyLayer(True) self.mcboPointsLayer.setCurrentIndex(0) self.setMapLayers() self.updateUseSelected() # GUI Runtime Customisation ----------------------------------------------- self.setWindowIcon(QtGui.QIcon(':/plugins/pat/icons/icon_t-test.svg'))
def __init__(self, iface, parent=None): super(GridExtractDialog, self).__init__(parent) # Set up the user interface from Designer. self.setupUi(self) self.iface = iface self.DISP_TEMP_LAYERS = read_setting(PLUGIN_NAME + '/DISP_TEMP_LAYERS', bool) self.DEBUG = config.get_debug_mode() # Catch and redirect python errors directed at the log messages python error tab. QgsMessageLog.instance().messageReceived.connect(errorCatcher) if not os.path.exists(TEMPDIR): os.mkdir(TEMPDIR) # Setup for validation messagebar on gui----------------------------- self.messageBar = QgsMessageBar( self) # leave this message bar for bailouts self.validationLayout = QtGui.QFormLayout(self) # new layout to gui if isinstance(self.layout(), QtGui.QFormLayout): # create a validation layout so multiple messages can be added and cleaned up. self.layout().insertRow(0, self.validationLayout) self.layout().insertRow(0, self.messageBar) else: self.layout().insertWidget( 0, self.messageBar) # for use with Vertical/horizontal layout box # GUI Runtime Customisation ----------------------------------------------- self.setWindowIcon( QtGui.QIcon(':/plugins/pat/icons/icon_gridExtract.svg')) self.chkgrpStatistics.setExclusive(False) self.tabList.setColumnCount(2) self.tabList.setHorizontalHeaderItem(0, QTableWidgetItem("ID")) self.tabList.setHorizontalHeaderItem(1, QTableWidgetItem("0 Raster(s)")) self.tabList.horizontalHeader().setResizeMode( QtGui.QHeaderView.Stretch) self.tabList.hideColumn(0) # don't need to display the unique layer ID self.pixel_size = 0 self.lblPixelFilter.setText( 'Only process rasters with one pixel size. Adding the first raster layer will set this pixel size' ) self.statsMapping = { 'mean': np.nanmean, 'minimum': np.nanmin, 'maximum': np.nanmax, 'standard deviation': np.nanstd, 'coefficient of variation': raster_ops.nancv, 'pixel count': raster_ops.pixelcount, }
def on_cmdSaveFile_clicked(self): lastFolder = read_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder") if lastFolder is None or not os.path.exists(lastFolder): lastFolder = read_setting(PLUGIN_NAME + "/BASE_OUT_FOLDER") filename = self.mcboTargetLayer.currentText() + '_{}randompts'.format(int(self.dsbSize.value())) s = save_as_dialog(self, self.tr("Save As"), self.tr("ESRI Shapefile") + " (*.shp);;", default_name=os.path.join(lastFolder, filename)) if s == '' or s is None: return s = os.path.normpath(s) write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastOutFolder", os.path.dirname(s)) self.lneSaveFile.setText(s) self.lblSaveFile.setStyleSheet('color:black') self.lneSaveFile.setStyleSheet('color:black')
def get_plugin_state(): version = get_plugin_version() """TODO: Make the paths clickable links to open folder def create_path_link(path): path = os.path.normpath(path) #"<a href={}>Open Project Folder</a>".format("`C:/Progra~1/needed"`) return '<a href= file:///"`{0}"`>{0}</a>'.format(path) """ plug_state = ['QGIS Environment:'] plug_state.append(' {:20}\t{}'.format('QGIS :', qgis.utils.QGis.QGIS_VERSION)) if platform.system() == 'Windows': plug_state.append(' {:20}\t{}'.format('Install Path : ', os.path.abspath(win32api.GetLongPathName( os.environ['QGIS_PREFIX_PATH'])))) else: plug_state.append( ' {:20}\t{}'.format('Install Path : ', qgis.core.QgsApplication.prefixPath())) plug_state.append(' {:20}\t{}'.format('Plugin Dir:', os.path.normpath(PLUGIN_DIR))) plug_state.append( ' {:20}\t{}'.format('Temp Folder:', os.path.normpath(tempfile.gettempdir()))) plug_state.append(' {:20}\t{}'.format('Python :', sys.version)) plug_state.append(' {:20}\t{}'.format('GDAL :', os.environ.get('GDAL_VERSION', None))) plug_state.append('\nPAT Version:') plug_state.append(' {:20}\t{})'.format('PAT:',' ('.join(version))) plug_state.append(' {:20}\t{}'.format('pyPrecAg:', get_distribution('pyprecag').version)) plug_state.append(' {:20}\t{}'.format('Geopandas:', get_distribution('geopandas').version)) plug_state.append(' {:20}\t{}'.format('Rasterio:', get_distribution('rasterio').version)) plug_state.append(' {:20}\t{}'.format('Fiona:', get_distribution('fiona').version)) plug_state.append(' {:20}\t{}'.format('Pandas:', get_distribution('pandas').version)) plug_state.append('\nR Configuration') plug_state.append( ' {:20}\t{}'.format('R Active :', read_setting('Processing/Configuration/ACTIVATE_R'))) plug_state.append(' {:20}\t{}'.format('R Install Folder :', read_setting('Processing/Configuration/R_FOLDER'))) return '\n'.join(plug_state)
def get_plugin_state(self): # Retrieve values from the plugin metadata file cfg = configparser.SafeConfigParser() cfg.read(os.path.join(pluginPath, 'metadata.txt')) version = cfg.get('general', 'version') """TODO: Make the paths clickable links to open folder def create_path_link(path): path = os.path.normpath(path) #"<a href={}>Open Project Folder</a>".format("`C:/Progra~1/needed"`) return '<a href= file:///"`{0}"`>{0}</a>'.format(path) """ self.pteVersions.setText( 'QGIS Environment:') self.pteVersions.append(' {:20}\t{}'.format('QGIS :', qgis.utils.QGis.QGIS_VERSION)) if platform.system() == 'Windows': import win32file self.pteVersions.append(' {:20}\t{}'.format('Install Path : ', win32file.GetLongPathName(qgis.core.QgsApplication.prefixPath()))) else: self.pteVersions.append(' {:20}\t{}'.format('Install Path : ', qgis.core.QgsApplication.prefixPath())) self.pteVersions.append(' {:20}\t{}'.format('Plugin Dir:', os.path.normpath(PLUGIN_DIR))) self.pteVersions.append(' {:20}\t{}'.format('Temp Folder:', os.path.normpath(TEMPDIR))) self.pteVersions.append(' {:20}\t{}'.format('Python :', sys.version)) self.pteVersions.append(' {:20}\t{}'.format('GDAL :', os.environ.get('GDAL_VERSION', None))) self.pteVersions.append('\nPAT Version:') self.pteVersions.append(' {:20}\t{}'.format('PAT:', version)) self.pteVersions.append(' {:20}\t{}'.format('pyPrecAg:', get_distribution('pyprecag').version)) self.pteVersions.append(' {:20}\t{}'.format('Geopandas:', get_distribution('geopandas').version)) self.pteVersions.append(' {:20}\t{}'.format('Rasterio:', get_distribution('rasterio').version)) self.pteVersions.append(' {:20}\t{}'.format('Fiona:', get_distribution('fiona').version)) self.pteVersions.append(' {:20}\t{}'.format('Pandas:', get_distribution('pandas').version)) self.pteVersions.append('\nR Configuration') self.pteVersions.append(' {:20}\t{}'.format('R Active :', read_setting('Processing/Configuration/ACTIVATE_R'))) self.pteVersions.append(' {:20}\t{}'.format('R Install Folder :', read_setting('Processing/Configuration/R_FOLDER')))
def __init__(self, iface, parent=None): super(KMeansClusterDialog, self).__init__(parent) # Set up the user interface from Designer. self.setupUi(self) self.iface = iface self.DISP_TEMP_LAYERS = read_setting(PLUGIN_NAME + '/DISP_TEMP_LAYERS', bool) self.DEBUG = config.get_debug_mode() self.layers_df = None self.pixel_size = ['0', '', ''] # Catch and redirect python errors directed at the log messages python error tab. QgsApplication.messageLog().messageReceived.connect(errorCatcher) if not os.path.exists(TEMPDIR): os.mkdir(TEMPDIR) # Setup for validation messagebar on gui----------------------------- self.messageBar = QgsMessageBar( self) # leave this message bar for bailouts self.validationLayout = QtWidgets.QFormLayout( self) # new layout to gui if isinstance(self.layout(), QtWidgets.QFormLayout): # create a validation layout so multiple messages can be added and cleaned up. self.layout().insertRow(0, self.validationLayout) self.layout().insertRow(0, self.messageBar) else: self.layout().insertWidget( 0, self.messageBar) # for use with Vertical/horizontal layout box # GUI Runtime Customisation ----------------------------------------------- self.mcboRasterLayer.setFilters(QgsMapLayerProxyModel.RasterLayer) self.mcboRasterLayer.setExcludedProviders(['wms']) # self.setMapLayers() self.setWindowIcon( QtGui.QIcon(':/plugins/pat/icons/icon_kMeansCluster.svg')) self.tabList.setColumnCount(2) self.tabList.setHorizontalHeaderItem(0, QTableWidgetItem("ID")) self.tabList.setHorizontalHeaderItem(1, QTableWidgetItem("0 Raster(s)")) self.tabList.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.Stretch) self.tabList.hideColumn(0) # don't need to display the unique layer ID