def fillTree(self): useCategories = SextanteConfig.getSetting(SextanteConfig.USE_CATEGORIES) if useCategories: self.fillTreeUsingCategories() else: self.fillTreeUsingProviders() self.algorithmTree.sortItems(0, Qt.AscendingOrder) showRecent = SextanteConfig.getSetting(SextanteConfig.SHOW_RECENT_ALGORITHMS) if showRecent: recent = SextanteLog.getRecentAlgorithms() if len(recent) != 0: found = False recentItem = QTreeWidgetItem() recentItem.setText(0, self.tr("Recently used algorithms")) for algname in recent: alg = Sextante.getAlgorithm(algname) if alg is not None: algItem = TreeAlgorithmItem(alg) recentItem.addChild(algItem) found = True if found: self.algorithmTree.insertTopLevelItem(0, recentItem) recentItem.setExpanded(True) self.algorithmTree.setWordWrap(True)
def load(fileName, name=None, crs=None, style=None): if fileName == None: return prjSetting = None settings = QSettings() if crs != None: prjSetting = settings.value("/Projections/defaultBehaviour") settings.setValue("/Projections/defaultBehaviour", QVariant("")) if name == None: name = path.split(fileName)[1] qgslayer = QgsVectorLayer(fileName, name, 'ogr') if qgslayer.isValid(): if crs is not None and qgslayer.crs() is None: qgslayer.setCrs(crs, False) if style == None: if qgslayer.geometryType == 0: style = SextanteConfig.getSetting( SextanteConfig.VECTOR_POINT_STYLE) elif qgslayer.geometryType == 1: style = SextanteConfig.getSetting( SextanteConfig.VECTOR_LINE_STYLE) else: style = SextanteConfig.getSetting( SextanteConfig.VECTOR_POLYGON_STYLE) qgslayer.loadNamedStyle(style) QgsMapLayerRegistry.instance().addMapLayers([qgslayer]) else: qgslayer = QgsRasterLayer(fileName, name) if qgslayer.isValid(): if crs != None: qgslayer.setCrs(crs, False) if style == None: style = SextanteConfig.getSetting( SextanteConfig.RASTER_STYLE) qgslayer.loadNamedStyle(style) QgsMapLayerRegistry.instance().addMapLayers([qgslayer]) QGisLayers.iface.legendInterface().refreshLayerSymbology( qgslayer) else: if prjSetting: settings.setValue("/Projections/defaultBehaviour", prjSetting) raise RuntimeError( "Could not load layer: " + unicode(fileName) + "\nCheck the SEXTANTE log to look for errors") if prjSetting: settings.setValue("/Projections/defaultBehaviour", prjSetting) return qgslayer
def executeSaga(progress): if SextanteUtils.isWindows(): command = ["cmd.exe", "/C ", SagaUtils.sagaBatchJobFilename()] else: os.chmod(SagaUtils.sagaBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) command = [SagaUtils.sagaBatchJobFilename()] loglines = [] loglines.append("SAGA execution console output") proc = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, ).stdout for line in iter(proc.readline, ""): if "%" in line: s = "".join([x for x in line if x.isdigit()]) try: progress.setPercentage(int(s)) except: pass else: line = line.strip() if line != "/" and line != "-" and line != "\\" and line != "|": loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(SagaUtils.SAGA_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def checkBeforeOpeningParametersDialog(self): if SextanteUtils.isWindows(): path = RUtils.RFolder() if path == "": return "R folder is not configured.\nPlease configure it before running R scripts." R_INSTALLED = "R_INSTALLED" settings = QSettings() if settings.contains(R_INSTALLED): return if SextanteUtils.isWindows(): if SextanteConfig.getSetting(RUtils.R_USE64): execDir = "x64" else: execDir = "i386" command = [ RUtils.RFolder() + os.sep + "bin" + os.sep + execDir + os.sep + "R.exe --version" ] else: command = ["R --version"] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "R version" in line: settings.setValue(R_INSTALLED, True) return return "It seems that R is not correctly installed in your system.\nPlease install it before running R Scripts."
def exportVectorLayer(self, orgFilename): #TODO: improve this. We are now exporting if it is not a shapefile, #but the functionality of v.in.ogr could be used for this. #We also export if there is a selection if not os.path.exists(orgFilename) or not orgFilename.endswith("shp"): layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: filename = LayerExporter.exportVectorLayer(layer) else: layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: useSelection = SextanteConfig.getSetting(SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: filename = LayerExporter.exportVectorLayer(layer) else: filename = orgFilename else: filename = orgFilename destFilename = self.getTempFilename() self.exportedLayers[orgFilename]= destFilename command = "v.in.ogr" min_area = self.getParameterValue(self.GRASS_MIN_AREA_PARAMETER); command += " min_area=" + str(min_area) snap = self.getParameterValue(self.GRASS_SNAP_TOLERANCE_PARAMETER); command += " snap=" + str(snap) command += " dsn=\"" + os.path.dirname(filename) + "\"" command += " layer=" + os.path.basename(filename)[:-4] command += " output=" + destFilename; command += " --overwrite -o" return command
def executeRAlgorithm(alg, progress): RUtils.verboseCommands = alg.getVerboseCommands() RUtils.createRScriptFromRCommands(alg.getFullSetOfRCommands()) if SextanteUtils.isWindows(): if SextanteConfig.getSetting(RUtils.R_USE64): execDir = "x64" else: execDir = "i386" command = [ RUtils.RFolder() + os.sep + "bin" + os.sep + execDir + os.sep + "R.exe", "CMD", "BATCH", "--vanilla", RUtils.getRScriptFilename(), RUtils.getConsoleOutputFilename() ] else: os.chmod(RUtils.getRScriptFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) command = "R CMD BATCH --vanilla " + RUtils.getRScriptFilename( ) + " " + RUtils.getConsoleOutputFilename() proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) proc.wait() RUtils.createConsoleOutput() loglines = [] loglines.append("R execution console output") loglines += RUtils.allConsoleResults for line in loglines: progress.setConsoleInfo(line) SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def handleAlgorithmResults(alg, progress, showResults=True): wrongLayers = [] htmlResults = False progress.setText("Loading resulting layers") i = 0 for out in alg.outputs: progress.setPercentage(100 * i / float(len(alg.outputs))) if out.hidden or not out.open: continue if isinstance(out, (OutputRaster, OutputVector, OutputTable)): try: if out.value.startswith("memory:"): layer = out.memoryLayer QgsMapLayerRegistry.instance().addMapLayers([layer]) else: if SextanteConfig.getSetting( SextanteConfig.USE_FILENAME_AS_LAYER_NAME): name = os.path.basename(out.value) else: name = out.description QGisLayers.load( out.value, name, alg.crs, RenderingStyles.getStyle(alg.commandLineName(), out.name)) except Exception, e: wrongLayers.append(out) #QMessageBox.critical(None, "Error", str(e)) elif isinstance(out, OutputHTML): SextanteResults.addResult(out.description, out.value) htmlResults = True
def exportVectorLayer(self, orgFilename): #TODO: improve this. We are now exporting if it is not a shapefile, #but the functionality of v.in.ogr could be used for this. #We also export if there is a selection if not os.path.exists(orgFilename) or not orgFilename.endswith("shp"): layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: filename = LayerExporter.exportVectorLayer(layer) else: layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: useSelection = SextanteConfig.getSetting( SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: filename = LayerExporter.exportVectorLayer(layer) else: filename = orgFilename else: filename = orgFilename destFilename = self.getTempFilename() self.exportedLayers[orgFilename] = destFilename command = "v.in.ogr" min_area = self.getParameterValue(self.GRASS_MIN_AREA_PARAMETER) command += " min_area=" + str(min_area) snap = self.getParameterValue(self.GRASS_SNAP_TOLERANCE_PARAMETER) command += " snap=" + str(snap) command += " dsn=\"" + os.path.dirname(filename) + "\"" command += " layer=" + os.path.basename(filename)[:-4] command += " output=" + destFilename command += " --overwrite -o" return command
def modelsFolder(): folder = SextanteConfig.getSetting(ModelerUtils.MODELS_FOLDER) if folder == None: folder = unicode(os.path.join(SextanteUtils.userFolder(), "models")) mkdir(folder) return os.path.abspath(folder)
def runIli2c(args, progress): #ili2c USAGE # ili2c [Options] file1.ili file2.ili ... # #OPTIONS # #--no-auto don't look automatically after required models. #-o0 Generate no output (default). #-o1 Generate INTERLIS-1 output. #-o2 Generate INTERLIS-2 output. #-oXSD Generate an XML-Schema. #-oFMT Generate an INTERLIS-1 Format. #-oIMD Generate Model as IlisMeta INTERLIS-Transfer (XTF). #-oIOM (deprecated) Generate Model as INTERLIS-Transfer (XTF). #--out file/dir file or folder for output. #--ilidirs %ILI_DIR;http://models.interlis.ch/;%JAR_DIR list of directories with ili-files. #--proxy host proxy server to access model repositories. #--proxyPort port proxy port to access model repositories. #--with-predefined Include the predefined MODEL INTERLIS in # the output. Usually, this is omitted. #--without-warnings Report only errors, no warnings. Usually, # warnings are generated as well. #--trace Display detailed trace messages. #--quiet Suppress info messages. #-h|--help Display this help text. #-u|--usage Display short information about usage. #-v|--version Display the version of ili2c. IliUtils.runJava( SextanteConfig.getSetting(IliUtils.ILI2C_JAR), args, progress )
def exportVectorLayer(layer): '''Takes a QgsVectorLayer and returns the filename to refer to it, which allows external apps which support only file-based layers to use it. It performs the necessary export in case the input layer is not in a standard format suitable for most applications, it is a remote one or db-based (non-file based) one, or if there is a selection and it should be used, exporting just the selected features. Currently, the output is restricted to shapefiles, so anything that is not in a shapefile will get exported. It also export to a new file if the original one contains non-ascii characters''' settings = QSettings() systemEncoding = settings.value( "/UI/encoding", "System" ).toString() output = SextanteUtils.getTempFilename("shp") provider = layer.dataProvider() useSelection = SextanteConfig.getSetting(SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: writer = QgsVectorFileWriter(output, systemEncoding, layer.pendingFields(), provider.geometryType(), layer.crs()) selection = layer.selectedFeatures() for feat in selection: writer.addFeature(feat) del writer return output else: isASCII=True try: unicode(layer.source()).decode("ascii") except UnicodeEncodeError: isASCII=False if (not unicode(layer.source()).endswith("shp") or not isASCII): writer = QgsVectorFileWriter( output, systemEncoding, layer.pendingFields(), provider.geometryType(), layer.crs() ) for feat in layer.getFeatures(): writer.addFeature(feat) del writer return output else: return unicode(layer.source())
def RScriptsFolder(): folder = SextanteConfig.getSetting(RUtils.RSCRIPTS_FOLDER) if folder == None: folder = os.path.join(os.path.dirname(__file__), "scripts") mkdir(folder) return folder
def modelsFolder(): folder = SextanteConfig.getSetting(ModelerUtils.MODELS_FOLDER) if folder == None: folder = SextanteUtils.userFolder() + os.sep + "models" mkdir(folder) return folder
def saveToFile(self): filefilter = self.output.getFileFilter(self.alg) settings = QSettings() if settings.contains("/SextanteQGIS/LastOutputPath"): path = settings.value("/SextanteQGIS/LastOutputPath") else: path = SextanteConfig.getSetting(SextanteConfig.OUTPUT_FOLDER) lastEncoding = settings.value("/SextanteQGIS/encoding", "System") fileDialog = QgsEncodingFileDialog(self, "Save file", path, filefilter, lastEncoding) fileDialog.setFileMode(QFileDialog.AnyFile) fileDialog.setAcceptMode(QFileDialog.AcceptSave) fileDialog.setConfirmOverwrite(True) if fileDialog.exec_() == QDialog.Accepted: files = fileDialog.selectedFiles() encoding = unicode(fileDialog.encoding()) self.output.encoding = encoding filename = unicode(files[0]) selectedFilefilter = unicode(fileDialog.selectedNameFilter()) if not filename.lower().endswith( tuple(re.findall("\*(\.[a-z]{1,5})", filefilter))): ext = re.search("\*(\.[a-z]{1,5})", selectedFilefilter) if ext: filename = filename + ext.group(1) self.text.setText(filename) settings.setValue("/SextanteQGIS/LastOutputPath", os.path.dirname(filename)) settings.setValue("/SextanteQGIS/encoding", encoding)
def processAlgorithm(self, progress): '''Here is where the processing itself takes place''' db = self.getParameterValue(self.DBNAME) connoptions = { "host": self.getParameterValue(self.HOST), "port": self.getParameterValue(self.PORT), "username": self.getParameterValue(self.USER), "password": self.getParameterValue(self.PASSWORD), "template": self.getParameterValue(self.TEMPLATE) } connargs = ['--no-password'] for k, v in connoptions.items(): if len(v) > 0 and k <> 'password': connargs.append("--%s=%s" % (k, v)) #output = self.getOutputValue(self.OUTPUT) IliUtils.runShellCmd([ SextanteConfig.getSetting(IliUtils.CREATEDB_EXEC), ' '.join(connargs), db ], progress) DbConnection.add_connection(db, connoptions["host"], connoptions["port"], db, connoptions["username"], connoptions["password"])
def otbPath(): folder = SextanteConfig.getSetting(OTBUtils.OTB_FOLDER) if folder == None: folder = "" #try to configure the path automatically if SextanteUtils.isMac(): testfolder = os.path.join(str(QgsApplication.prefixPath()), "bin") if os.path.exists(os.path.join(testfolder, "otbcli")): folder = testfolder else: testfolder = "/usr/local/bin" if os.path.exists(os.path.join(testfolder, "otbcli")): folder = testfolder elif SextanteUtils.isWindows(): testfolder = os.path.dirname(str(QgsApplication.prefixPath())) testfolder = os.path.dirname(testfolder) testfolder = os.path.join(testfolder, "bin") path = os.path.join(testfolder, "otbcli.bat") if os.path.exists(path): folder = testfolder else: testfolder = "/usr/bin" if os.path.exists(os.path.join(testfolder, "otbcli")): folder = testfolder return folder
def getRecentAlgorithms(): recentAlgsSetting = SextanteConfig.getSetting(SextanteConfig.RECENT_ALGORITHMS) try: SextanteLog.recentAlgs = recentAlgsSetting.split(';') except: pass return SextanteLog.recentAlgs
def scriptsFolder(): folder = SextanteConfig.getSetting(ScriptUtils.SCRIPTS_FOLDER) if folder == None: folder = SextanteUtils.userFolder() + os.sep + "scripts" mkdir(folder) return folder
def modelsFolder(): folder = SextanteConfig.getSetting(ModelerUtils.MODELS_FOLDER) if folder == None: folder = os.path.join(os.path.dirname(__file__), "models") mkdir(folder) return folder
def addRecentAlgorithms(self, updating): showRecent = SextanteConfig.getSetting( SextanteConfig.SHOW_RECENT_ALGORITHMS) if showRecent: recent = SextanteLog.getRecentAlgorithms() if len(recent) != 0: found = False if updating: recentItem = self.algorithmTree.topLevelItem(0) treeWidget = recentItem.treeWidget() treeWidget.takeTopLevelItem( treeWidget.indexOfTopLevelItem(recentItem)) #self.algorithmTree.removeItemWidget(first, 0) recentItem = QTreeWidgetItem() recentItem.setText(0, self.tr("Recently used algorithms")) for algname in recent: alg = Sextante.getAlgorithm(algname) if alg is not None: algItem = TreeAlgorithmItem(alg) recentItem.addChild(algItem) found = True if found: self.algorithmTree.insertTopLevelItem(0, recentItem) recentItem.setExpanded(True) self.algorithmTree.setWordWrap(True)
def executeGrass(commands, progress): if SextanteUtils.isWindows(): GrassUtils.createGrassScript(commands) command = ["cmd.exe", "/C ", GrassUtils.grassScriptFilename()] else: gisrc = SextanteUtils.userFolder() + os.sep + "sextante.gisrc" os.putenv("GISRC", gisrc) os.putenv("GRASS_MESSAGE_FORMAT", "gui") os.putenv("GRASS_BATCH_JOB", GrassUtils.grassBatchJobFilename()) GrassUtils.createGrassBatchJobFileFromGrassCommands(commands) os.chmod(GrassUtils.grassBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) if SextanteUtils.isMac(): command = GrassUtils.grassPath() + os.sep + "grass.sh " + GrassUtils.grassMapsetFolder() + "/user" else: command = "grass64 " + GrassUtils.grassMapsetFolder() + "/user" loglines = [] loglines.append("GRASS execution console output") proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "GRASS_INFO_PERCENT" in line: try: progress.setPercentage(int(line[len("GRASS_INFO_PERCENT")+ 2:])) except: pass else: loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(GrassUtils.GRASS_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines) shutil.rmtree(GrassUtils.grassMapsetFolder(), True)
def runIli2c(args, progress): # ili2c USAGE # ili2c [Options] file1.ili file2.ili ... # # OPTIONS # #--no-auto don't look automatically after required models. #-o0 Generate no output (default). #-o1 Generate INTERLIS-1 output. #-o2 Generate INTERLIS-2 output. #-oXSD Generate an XML-Schema. #-oFMT Generate an INTERLIS-1 Format. #-oIMD Generate Model as IlisMeta INTERLIS-Transfer (XTF). #-oIOM (deprecated) Generate Model as INTERLIS-Transfer (XTF). #--out file/dir file or folder for output. #--ilidirs %ILI_DIR;http://models.interlis.ch/;%JAR_DIR list of directories with ili-files. #--proxy host proxy server to access model repositories. #--proxyPort port proxy port to access model repositories. #--with-predefined Include the predefined MODEL INTERLIS in # the output. Usually, this is omitted. #--without-warnings Report only errors, no warnings. Usually, # warnings are generated as well. #--trace Display detailed trace messages. #--quiet Suppress info messages. #-h|--help Display this help text. #-u|--usage Display short information about usage. #-v|--version Display the version of ili2c. IliUtils.runJava(SextanteConfig.getSetting(IliUtils.ILI2C_JAR), args, progress)
def WpsDescriptionFolder(): folder = SextanteConfig.getSetting( WpsAlgorithmProvider.WPS_DESCRIPTIONS) if folder == None: folder = unicode(os.path.join(SextanteUtils.userFolder(), "wps")) mkdir(folder) return os.path.abspath(folder)
def saveToFile(self): filefilter = self.output.getFileFilter(self.alg) settings = QSettings() if settings.contains("/SextanteQGIS/LastOutputPath"): path = str( settings.value("/SextanteQGIS/LastOutputPath", QVariant("")).toString()) else: path = SextanteConfig.getSetting(SextanteConfig.OUTPUT_FOLDER) lastEncoding = settings.value("/SextanteQGIS/encoding", "System").toString() fileDialog = QgsEncodingFileDialog(self, "Save file", QString(path), filefilter, lastEncoding) fileDialog.setFileMode(QFileDialog.AnyFile) fileDialog.setAcceptMode(QFileDialog.AcceptSave) fileDialog.setConfirmOverwrite(True) if fileDialog.exec_() == QDialog.Accepted: files = fileDialog.selectedFiles() encoding = unicode(fileDialog.encoding()) self.output.encoding = encoding filename = unicode(files.first()) self.text.setText(filename) settings.setValue("/SextanteQGIS/LastOutputPath", os.path.dirname(str(filename))) settings.setValue("/SextanteQGIS/encoding", encoding)
def exportVectorLayer(layer): '''Takes a QgsVectorLayer and returns the filename to refer to it, which allows external apps which support only file-based layers to use it. It performs the necessary export in case the input layer is not in a standard format suitable for most applications, it is a remote one or db-based (non-file based) one, or if there is a selection and it should be used, exporting just the selected features. Currently, the output is restricted to shapefiles, so anything that is not in a shapefile will get exported''' settings = QSettings() systemEncoding = settings.value( "/UI/encoding", "System" ).toString() output = SextanteUtils.getTempFilename("shp") provider = layer.dataProvider() allAttrs = provider.attributeIndexes() provider.select( allAttrs ) useSelection = SextanteConfig.getSetting(SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: writer = QgsVectorFileWriter( output, systemEncoding,provider.fields(), provider.geometryType(), provider.crs() ) selection = layer.selectedFeatures() for feat in selection: writer.addFeature(feat) del writer return output else: if (not unicode(layer.source()).endswith("shp")): writer = QgsVectorFileWriter( output, systemEncoding,provider.fields(), provider.geometryType(), provider.crs() ) feat = QgsFeature() while provider.nextFeature(feat): writer.addFeature(feat) del writer return output else: return unicode(layer.source())
def executeGrass(commands, progress): if SextanteUtils.isWindows(): GrassUtils.createGrassScript(commands) command = ["cmd.exe", "/C ", GrassUtils.grassScriptFilename()] else: gisrc = SextanteUtils.userFolder() + os.sep + "sextante.gisrc" os.putenv("GISRC", gisrc) os.putenv("GRASS_MESSAGE_FORMAT", "gui") os.putenv("GRASS_BATCH_JOB", GrassUtils.grassBatchJobFilename()) GrassUtils.createGrassBatchJobFileFromGrassCommands(commands) os.chmod(GrassUtils.grassBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) if SextanteUtils.isMac(): command = GrassUtils.grassPath() + os.sep + "grass.sh " + GrassUtils.grassMapsetFolder() + "/user" else: command = "grass64 " + GrassUtils.grassMapsetFolder() + "/user" loglines = [] loglines.append("GRASS execution console output") proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "GRASS_INFO_PERCENT" in line: try: progress.setPercentage(int(line[len("GRASS_INFO_PERCENT")+ 2:])) except: pass else: loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(GrassUtils.GRASS_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def processAlgorithm(self, progress): commands.append(os.path.join(TauDEMUtils.mpiexecPath(), "mpiexec")) processNum = SextanteConfig.getSetting(TauDEMUtils.MPI_PROCESSES) if processNum <= 0: raise GeoAlgorithmExecutionException("Wrong number of MPI processes used.\nPlease set correct number before running TauDEM algorithms.") commands.append("-n") commands.append(str(processNum)) commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName)) commands.append("-ad8") commands.append(self.getParameterValue(self.D8_CONTRIB_AREA_GRID)) commands.append("-p") commands.append(self.getParameterValue(self.D8_FLOW_DIR_GRID)) commands.append("-fel") commands.append(self.getParameterValue(self.PIT_FILLED_GRID)) commands.append("-ssa") commands.append(self.getParameterValue(self.ACCUM_STREAM_SOURCE_GRID)) commands.append("-o") commands.append(self.getParameterValue(self.OUTLETS_SHAPE)) commands.append("-par") commands.append(str(self.getParameterValue(self.MIN_TRESHOLD))) commands.append(str(self.getParameterValue(self.MAX_THRESHOLD))) commands.append(str(self.getParameterValue(self.TRESHOLD_NUM))) commands.append(str(self.getParameterValue(self.STEPS))) commands.append("-drp") commands.append(self.getOutputValue(self.DROP_ANALYSIS_FILE)) loglines = [] loglines.append("TauDEM execution command") for line in commands: loglines.append(line) SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines) TauDEMUtils.executeTauDEM(commands, progress)
def exportVectorLayer(self, orgFilename): #only export to an intermediate shp if the layer is not file-based. #We assume that almost all file formats will be supported by ogr #We also export if there is a selection if not os.path.exists(orgFilename): layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: filename = LayerExporter.exportVectorLayer(layer) else: layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: useSelection = SextanteConfig.getSetting(SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: filename = LayerExporter.exportVectorLayer(layer) else: filename = orgFilename else: filename = orgFilename destFilename = self.getTempFilename() self.exportedLayers[orgFilename]= destFilename command = "v.in.ogr" command += " min_area=-1" command +=" dsn=\"" + os.path.dirname(filename) + "\"" command +=" layer=" + os.path.basename(filename)[:-4] command +=" output=" + destFilename; command +=" --overwrite -o" return command
def processAlgorithm(self, progress): commands = [] commands.append(os.path.join(TauDEMUtils.mpiexecPath(), "mpiexec")) processNum = SextanteConfig.getSetting(TauDEMUtils.MPI_PROCESSES) if processNum <= 0: raise GeoAlgorithmExecutionException("Wrong number of MPI processes used.\nPlease set correct number before running TauDEM algorithms.") commands.append("-n") commands.append(str(processNum)) commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName)) commands.append("-plen") commands.append(self.getParameterValue(self.LENGTH_GRID)) commands.append("-ad8") commands.append(self.getParameterValue(self.CONTRIB_AREA_GRID)) commands.append("-par") commands.append(str(self.getParameterValue(self.THRESHOLD))) commands.append(str(self.getParameterValue(self.EXPONENT))) commands.append("-ss") commands.append(self.getOutputValue(self.STREAM_SOURCE_GRID)) loglines = [] loglines.append("TauDEM execution command") for line in commands: loglines.append(line) SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines) TauDEMUtils.executeTauDEM(commands, progress)
def handleAlgorithmResults(alg, progress, showResults = True): wrongLayers = [] htmlResults = False; progress.setText("Loading resulting layers") i = 0 for out in alg.outputs: progress.setPercentage(100 * i / float(len(alg.outputs))) if out.hidden or not out.open: continue if isinstance(out, (OutputRaster, OutputVector, OutputTable)): try: if out.value.startswith("memory:"): layer = out.memoryLayer QgsMapLayerRegistry.instance().addMapLayers([layer]) else: if SextanteConfig.getSetting(SextanteConfig.USE_FILENAME_AS_LAYER_NAME): name = os.path.basename(out.value) else: name = out.description QGisLayers.load(out.value, name, alg.crs, RenderingStyles.getStyle(alg.commandLineName(),out.name)) except Exception, e: wrongLayers.append(out) #QMessageBox.critical(None, "Error", str(e)) elif isinstance(out, OutputHTML): SextanteResults.addResult(out.description, out.value) htmlResults = True
def getExtendedLayerName(self, layer): authid = layer.crs().authid() if SextanteConfig.getSetting( SextanteConfig.SHOW_CRS_DEF) and authid is not None: return layer.name() + " [" + str(authid) + "]" else: return layer.name()
def handleAlgorithmResults(alg, showResults=True): htmlResults = False for out in alg.outputs: if out.hidden or not out.open: continue if isinstance(out, (OutputRaster, OutputVector, OutputTable)): try: if out.value.startswith("memory:"): layer = out.memoryLayer QgsMapLayerRegistry.instance().addMapLayer(layer) else: if SextanteConfig.getSetting( SextanteConfig.USE_FILENAME_AS_LAYER_NAME): name = os.path.basename(out.value) else: name = out.description QGisLayers.load( out.value, name, alg.crs, RenderingStyles.getStyle(alg.commandLineName(), out.name)) except Exception, e: QMessageBox.critical(None, "Error", str(e)) elif isinstance(out, OutputHTML): SextanteResults.addResult(out.description, out.value) htmlResults = True
def otbLibPath(): folder = SextanteConfig.getSetting(OTBUtils.OTB_LIB_FOLDER) if folder == None: folder = "" #try to configure the path automatically if SextanteUtils.isMac(): testfolder = os.path.join(str(QgsApplication.prefixPath()), "lib/otb/applications") if os.path.exists(testfolder): folder = testfolder else: testfolder = "/usr/local/lib/otb/applications" if os.path.exists(testfolder): folder = testfolder elif SextanteUtils.isWindows(): testfolder = os.path.dirname(str(QgsApplication.prefixPath())) testfolder = os.path.join(testfolder, "orfeotoolbox") testfolder = os.path.join(testfolder, "applications") if os.path.exists(testfolder): folder = testfolder else: testfolder = "/usr/lib/otb/applications" if os.path.exists(testfolder): folder = testfolder return folder
def checkBeforeOpeningParametersDialog(self): if SextanteUtils.isWindows(): path = RUtils.RFolder() if path == "": return "R folder is not configured.\nPlease configure it before running R scripts." R_INSTALLED = "R_INSTALLED" settings = QSettings() if settings.contains(R_INSTALLED): return if SextanteUtils.isWindows(): if SextanteConfig.getSetting(RUtils.R_USE64): execDir = "x64" else: execDir = "i386" command = [RUtils.RFolder() + os.sep + "bin" + os.sep + execDir + os.sep + "R.exe --version"] else: command = ["R --version"] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "R version" in line: settings.setValue(R_INSTALLED, True) return return "It seems that R is not correctly installed in your system.\nPlease install it before running R Scripts."
def saveToFile(self): filefilter = self.output.getFileFilter(self.alg) settings = QSettings() if settings.contains("/SextanteQGIS/LastOutputPath"): path = settings.value( "/SextanteQGIS/LastOutputPath") else: path = SextanteConfig.getSetting(SextanteConfig.OUTPUT_FOLDER) lastEncoding = settings.value("/SextanteQGIS/encoding", "System") fileDialog = QgsEncodingFileDialog(self, "Save file", path, filefilter, lastEncoding) fileDialog.setFileMode(QFileDialog.AnyFile) fileDialog.setAcceptMode(QFileDialog.AcceptSave) fileDialog.setConfirmOverwrite(True) if fileDialog.exec_() == QDialog.Accepted: files = fileDialog.selectedFiles() encoding = unicode(fileDialog.encoding()) self.output.encoding = encoding filename = unicode(files[0]) selectedFilefilter = unicode(fileDialog.selectedNameFilter()) if not filename.lower().endswith(tuple(re.findall("\*(\.[a-z]{1,5})", filefilter))): ext = re.search("\*(\.[a-z]{1,5})", selectedFilefilter) if ext: filename = filename + ext.group(1) self.text.setText(filename) settings.setValue("/SextanteQGIS/LastOutputPath", os.path.dirname(filename)) settings.setValue("/SextanteQGIS/encoding", encoding)
def checkRIsInstalled(ignoreRegistrySettings=False): if SextanteUtils.isWindows(): path = RUtils.RFolder() if path == "": return "R folder is not configured.\nPlease configure it before running R scripts." R_INSTALLED = "R_INSTALLED" settings = QSettings() if not ignoreRegistrySettings: if settings.contains(R_INSTALLED): return if SextanteUtils.isWindows(): if SextanteConfig.getSetting(RUtils.R_USE64): execDir = "x64" else: execDir = "i386" command = [RUtils.RFolder() + os.sep + "bin" + os.sep + execDir + os.sep + "R.exe", "--version"] else: command = ["R --version"] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "R version" in line: settings.setValue(R_INSTALLED, True) return html = ("<p>This algorithm requires R to be run." "Unfortunately, it seems that R is not installed in your system, or it is not correctly configured to be used from QGIS</p>" '<p><a href= "http://docs.qgis.org/2.0/html/en/docs/user_manual/sextante/3rdParty.html">Click here</a>' 'to know more about how to install and configure R to be used with SEXTANTE</p>') return html
def processAlgorithm(self, progress): commands = [] commands.append(os.path.join(TauDEMUtils.mpiexecPath(), "mpiexec")) processNum = SextanteConfig.getSetting(TauDEMUtils.MPI_PROCESSES) if processNum <= 0: raise GeoAlgorithmExecutionException("Wrong number of MPI processes used.\nPlease set correct number before running TauDEM algorithms.") commands.append("-n") commands.append(str(processNum)) commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName)) commands.append("-ang") commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID)) commands.append("-fel") commands.append(self.getParameterValue(self.PIT_FILLED_GRID)) commands.append("-m") commands.append(str(self.STAT_DICT[self.getParameterValue(self.STAT_METHOD)])) commands.append(str(self.DIST_DICT[self.getParameterValue(self.DIST_METHOD)])) commands.append("-thresh") commands.append(str(self.getParameterValue(self.THRESHOLD))) if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == "false": commands.append("-nc") commands.append("-du") commands.append(self.getOutputValue(self.DIST_UP_GRID)) loglines = [] loglines.append("TauDEM execution command") for line in commands: loglines.append(line) SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines) TauDEMUtils.executeTauDEM(commands, progress)
def exportVectorLayer(self, orgFilename): #only export to an intermediate shp if the layer is not file-based. #We assume that almost all file formats will be supported by ogr #We also export if there is a selection if not os.path.exists(orgFilename): layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: filename = LayerExporter.exportVectorLayer(layer) else: layer = QGisLayers.getObjectFromUri(orgFilename, False) if layer: useSelection = SextanteConfig.getSetting( SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: filename = LayerExporter.exportVectorLayer(layer) else: filename = orgFilename else: filename = orgFilename destFilename = self.getTempFilename() self.exportedLayers[orgFilename] = destFilename command = "v.in.ogr" command += " min_area=-1" command += " dsn=\"" + os.path.dirname(filename) + "\"" command += " layer=" + os.path.basename(filename)[:-4] command += " output=" + destFilename command += " --overwrite -o" return command
def executeAlgorithm(self): item = self.algorithmTree.currentItem() if isinstance(item, TreeAlgorithmItem): alg = Sextante.getAlgorithm(item.alg.commandLineName()) message = alg.checkBeforeOpeningParametersDialog() if message: dlg = MissingDependencyDialog(message) dlg.exec_() #QMessageBox.warning(self, self.tr("Warning"), message) return alg = alg.getCopy() dlg = alg.getCustomParametersDialog() if not dlg: dlg = ParametersDialog(alg) canvas = QGisLayers.iface.mapCanvas() prevMapTool = canvas.mapTool() dlg.show() dlg.exec_() if canvas.mapTool()!=prevMapTool: try: canvas.mapTool().reset() except: pass canvas.setMapTool(prevMapTool) if dlg.executed: showRecent = SextanteConfig.getSetting(SextanteConfig.SHOW_RECENT_ALGORITHMS) if showRecent: self.addRecentAlgorithms(True) if isinstance(item, TreeActionItem): action = item.action action.setData(self) action.execute()
def executeGrass(commands, progress, outputCommands = None): loglines = [] loglines.append("GRASS execution console output") grassOutDone = False command = GrassUtils.prepareGrassExecution(commands) proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "GRASS_INFO_PERCENT" in line: try: progress.setPercentage(int(line[len("GRASS_INFO_PERCENT")+ 2:])) except: pass else: if "r.out" in line or "v.out" in line: grassOutDone = True loglines.append(line) progress.setConsoleInfo(line) # Some GRASS scripts, like r.mapcalculator or r.fillnulls, call other GRASS scripts during execution. This may override any commands that are # still to be executed by the subprocess, which are usually the output ones. If that is the case runs the output commands again. if not grassOutDone and outputCommands: command = GrassUtils.prepareGrassExecution(outputCommands) proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "GRASS_INFO_PERCENT" in line: try: progress.setPercentage(int(line[len("GRASS_INFO_PERCENT")+ 2:])) except: pass else: loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(GrassUtils.GRASS_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines) return loglines;
def addRecentAlgorithms(self, updating): showRecent = SextanteConfig.getSetting(SextanteConfig.SHOW_RECENT_ALGORITHMS) if showRecent: recent = SextanteLog.getRecentAlgorithms() if len(recent) != 0: found = False if updating: recentItem = self.algorithmTree.topLevelItem(0) treeWidget = recentItem.treeWidget() treeWidget.takeTopLevelItem(treeWidget.indexOfTopLevelItem(recentItem)) #self.algorithmTree.removeItemWidget(first, 0) recentItem = QTreeWidgetItem() recentItem.setText(0, self.tr("Recently used algorithms")) for algname in recent: alg = Sextante.getAlgorithm(algname) if alg is not None: algItem = TreeAlgorithmItem(alg) recentItem.addChild(algItem) found = True if found: self.algorithmTree.insertTopLevelItem(0, recentItem) recentItem.setExpanded(True) self.algorithmTree.setWordWrap(True)
def executeSaga(progress): if SextanteUtils.isWindows(): command = ["cmd.exe", "/C ", SagaUtils.sagaBatchJobFilename()] else: os.chmod(SagaUtils.sagaBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) command = [SagaUtils.sagaBatchJobFilename()] loglines = [] loglines.append("SAGA execution console output") proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "%" in line: s = "".join([x for x in line if x.isdigit()]) try: progress.setPercentage(int(s)) except: pass else: line = line.strip() if line != "/" and line != "-" and line != "\\" and line != "|": loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(SagaUtils.SAGA_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def RScriptsFolder(): folder = SextanteConfig.getSetting(RUtils.RSCRIPTS_FOLDER) if folder == None: folder = unicode(os.path.join(SextanteUtils.userFolder(), "rscripts")) mkdir(folder) return os.path.abspath(folder)
def executeAlgorithm(self): item = self.algorithmTree.currentItem() if isinstance(item, TreeAlgorithmItem): alg = Sextante.getAlgorithm(item.alg.commandLineName()) message = alg.checkBeforeOpeningParametersDialog() if message: QtGui.QMessageBox.warning(self, "Warning", message) return alg = alg.getCopy() #copy.deepcopy(alg) dlg = alg.getCustomParametersDialog() if not dlg: dlg = ParametersDialog(alg) canvas = QGisLayers.iface.mapCanvas() prevMapTool = canvas.mapTool() dlg.show() dlg.exec_() if canvas.mapTool() != prevMapTool: try: canvas.mapTool().reset() except: pass canvas.setMapTool(prevMapTool) if dlg.executed: showRecent = SextanteConfig.getSetting( SextanteConfig.SHOW_RECENT_ALGORITHMS) if showRecent: self.fillTree() if isinstance(item, TreeActionItem): action = item.action action.setData(self) action.execute()
def grassWinShell(): folder = SextanteConfig.getSetting(GrassUtils.GRASS_WIN_SHELL) if folder == None: folder = plugin_installer.__file__ idx = folder.find('qgis') folder = folder[:idx] + "msys" return folder
def __init__(self, layer): self.layer = layer self.selection = False; if SextanteConfig.getSetting(SextanteConfig.USE_SELECTED): self.selected = layer.selectedFeatures() if len(self.selected) > 0: self.selection = True self.idx = 0;
def fillTree(self): useCategories = SextanteConfig.getSetting(SextanteConfig.USE_CATEGORIES) if useCategories: self.fillTreeUsingCategories() else: self.fillTreeUsingProviders() self.algorithmTree.sortItems(0, Qt.AscendingOrder) self.addRecentAlgorithms(False)
def scriptsFolder(): folder = SextanteConfig.getSetting(ScriptUtils.SCRIPTS_FOLDER) if folder == None: #folder = os.path.join(os.path.dirname(__file__), "scripts") folder = SextanteUtils.userFolder() + os.sep + "scripts" mkdir(folder) return folder
def otbPath(): folder = SextanteConfig.getSetting(OTBUtils.OTB_FOLDER) if folder == None: folder = "" if os.path.exists("/usr/bin/otbcli"): folder = "/usr/bin" return folder
def RScriptsFolder(): folder = SextanteConfig.getSetting(RUtils.RSCRIPTS_FOLDER) if folder == None: folder = unicode( os.path.join(SextanteUtils.userFolder(), "rscripts")) mkdir(folder) return os.path.abspath(folder)