1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
"""
***************************************************************************
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
from grassprovider.grass_utils import GrassUtils
import os
# for MS-Windows users who have MBCS chars in their name:
if os.name == "nt":
import win32api
def rliPath():
"""Return r.li GRASS user dir"""
grass_version = GrassUtils.installedVersion().split(".")[0]
if isWindows():
homeDir = win32api.GetShortPathName(os.path.expanduser("~"))
return os.path.join(
homeDir, "AppData", "Roaming", f"GRASS{grass_version}", "r.li"
)
else:
return os.path.join(os.path.expanduser("~"), f".grass{grass_version}", "r.li")
def removeConfigFile(alg, parameters, context):
"""Remove the r.li user dir config file"""
configPath = alg.parameterAsString(parameters, "config", context)
if isWindows():
command = f"DEL {os.path.join(rliPath(), configPath)}"
else:
command = f"rm {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 GRASS user directory ?
user_grass_path = rliPath()
if not os.path.isdir(user_grass_path):
mkdir(user_grass_path)
if not os.path.isdir(os.path.join(user_grass_path, "output")):
mkdir(os.path.join(user_grass_path, "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(user_grass_path, 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(context=context))
configFilePath = os.path.join(user_grass_path, 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(context=context)),
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)
user_grass_path = rliPath()
output = os.path.join(
user_grass_path, "output", alg.parameterAsString(parameters, "output", context)
)
# move the file
if isWindows():
command = f"MOVE /Y {output} {txtPath}"
else:
command = f"mv -f {output} {txtPath}"
alg.commands.append(command)
|