mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			143 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
"""
 | 
						|
***************************************************************************
 | 
						|
    r_li.py
 | 
						|
    -------
 | 
						|
    Date                 : February 2016
 | 
						|
    Copyright            : (C) 2016 by Médéric Ribreux
 | 
						|
    Email                : medspx at medspx dot fr
 | 
						|
***************************************************************************
 | 
						|
*                                                                         *
 | 
						|
*   This program is free software; you can redistribute it and/or modify  *
 | 
						|
*   it under the terms of the GNU General Public License as published by  *
 | 
						|
*   the Free Software Foundation; either version 2 of the License, or     *
 | 
						|
*   (at your option) any later version.                                   *
 | 
						|
*                                                                         *
 | 
						|
***************************************************************************
 | 
						|
"""
 | 
						|
 | 
						|
__author__ = 'Médéric Ribreux'
 | 
						|
__date__ = 'February 2016'
 | 
						|
__copyright__ = '(C) 2016, Médéric Ribreux'
 | 
						|
 | 
						|
import shutil
 | 
						|
from qgis.core import QgsProcessingParameterString
 | 
						|
from processing.tools.system import (isWindows, mkdir,
 | 
						|
                                     getTempFilename)
 | 
						|
import os
 | 
						|
 | 
						|
# for MS-Windows users who have MBCS chars in their name:
 | 
						|
if os.name == 'nt':
 | 
						|
    import win32api
 | 
						|
 | 
						|
 | 
						|
def rliPath():
 | 
						|
    """Return r.li GRASS7 user dir"""
 | 
						|
    if isWindows():
 | 
						|
        homeDir = win32api.GetShortPathName(os.path.expanduser('~'))
 | 
						|
        return os.path.join(homeDir, 'AppData', 'Roaming', 'GRASS7', 'r.li')
 | 
						|
    else:
 | 
						|
        return os.path.join(os.path.expanduser("~"), '.grass7', 'r.li')
 | 
						|
 | 
						|
 | 
						|
def removeConfigFile(alg, parameters, context):
 | 
						|
    """ Remove the r.li user dir config file """
 | 
						|
    configPath = alg.parameterAsString(parameters, 'config', context)
 | 
						|
    if isWindows():
 | 
						|
        command = "DEL {}".format(os.path.join(rliPath(), configPath))
 | 
						|
    else:
 | 
						|
        command = "rm {}".format(os.path.join(rliPath(), configPath))
 | 
						|
    alg.commands.append(command)
 | 
						|
 | 
						|
 | 
						|
def checkMovingWindow(alg, parameters, context, outputTxt=False):
 | 
						|
    """ Verify if we have the right parameters """
 | 
						|
    configTxt = alg.parameterAsString(parameters, 'config_txt', context)
 | 
						|
    config = alg.parameterAsString(parameters, 'config', context)
 | 
						|
    if configTxt and config:
 | 
						|
        return False, alg.tr("You need to set either inline configuration or a configuration file!")
 | 
						|
 | 
						|
    # Verify that configuration is in moving window
 | 
						|
    movingWindow = False
 | 
						|
    if configTxt:
 | 
						|
        if 'MOVINGWINDOW' in configTxt:
 | 
						|
            movingWindow = True
 | 
						|
 | 
						|
    # Read config file:
 | 
						|
    if config:
 | 
						|
        with open(config) as f:
 | 
						|
            for line in f:
 | 
						|
                if 'MOVINGWINDOW' in line:
 | 
						|
                    movingWindow = True
 | 
						|
 | 
						|
    if not movingWindow and not outputTxt:
 | 
						|
        return False, alg.tr('Your configuration needs to be a "moving window" configuration!')
 | 
						|
 | 
						|
    if movingWindow and outputTxt:
 | 
						|
        return False, alg.tr('Your configuration needs to be a non "moving window" configuration!')
 | 
						|
 | 
						|
    return True, None
 | 
						|
 | 
						|
 | 
						|
def configFile(alg, parameters, context, feedback, outputTxt=False):
 | 
						|
    """Handle inline configuration
 | 
						|
    :param parameters:
 | 
						|
    """
 | 
						|
    # Where is the GRASS7 user directory ?
 | 
						|
    userGrass7Path = rliPath()
 | 
						|
    if not os.path.isdir(userGrass7Path):
 | 
						|
        mkdir(userGrass7Path)
 | 
						|
    if not os.path.isdir(os.path.join(userGrass7Path, 'output')):
 | 
						|
        mkdir(os.path.join(userGrass7Path, 'output'))
 | 
						|
 | 
						|
    # If we have a configuration file, we need to copy it into user dir
 | 
						|
    if parameters['config']:
 | 
						|
        fileName = alg.parameterAsString(parameters, 'config', context)
 | 
						|
        configFilePath = os.path.join(userGrass7Path, os.path.basename(fileName))
 | 
						|
        # Copy the file
 | 
						|
        shutil.copy(parameters['config'], configFilePath)
 | 
						|
        # Change the parameter value
 | 
						|
        parameters['config'] = os.path.basename(configFilePath)
 | 
						|
    # Handle inline configuration
 | 
						|
    elif parameters['config_txt']:
 | 
						|
        # Creates a temporary txt file in user r.li directory
 | 
						|
        tempConfig = os.path.basename(getTempFilename())
 | 
						|
        configFilePath = os.path.join(userGrass7Path, tempConfig)
 | 
						|
        # Inject rules into temporary txt file
 | 
						|
        with open(configFilePath, "w") as f:
 | 
						|
            f.write(alg.parameterAsString(parameters, 'config_txt', context))
 | 
						|
            f.write("\n")
 | 
						|
 | 
						|
        # Use temporary file as rules file
 | 
						|
        parameters['config'] = os.path.basename(configFilePath)
 | 
						|
        alg.removeParameter('config_txt')
 | 
						|
 | 
						|
    # For ascii output, we need a virtual output
 | 
						|
    if outputTxt:
 | 
						|
        param = QgsProcessingParameterString(
 | 
						|
            'output', 'virtual output',
 | 
						|
            'a' + os.path.basename(getTempFilename()),
 | 
						|
            False, False)
 | 
						|
        alg.addParameter(param)
 | 
						|
 | 
						|
    alg.processCommand(parameters, context, feedback, outputTxt)
 | 
						|
 | 
						|
    # Remove Config file:
 | 
						|
    removeConfigFile(alg, parameters, context)
 | 
						|
 | 
						|
 | 
						|
def moveOutputTxtFile(alg, parameters, context):
 | 
						|
    # Find output file name:
 | 
						|
    txtPath = alg.parameterAsString(parameters, 'output_txt', context)
 | 
						|
    userGrass7Path = rliPath()
 | 
						|
 | 
						|
    output = os.path.join(userGrass7Path, 'output',
 | 
						|
                          alg.parameterAsString(parameters, 'output', context))
 | 
						|
    # move the file
 | 
						|
    if isWindows():
 | 
						|
        command = "MOVE /Y {} {}".format(output, txtPath)
 | 
						|
    else:
 | 
						|
        command = "mv -f {} {}".format(output, txtPath)
 | 
						|
    alg.commands.append(command)
 |