File: r_li.py

package info (click to toggle)
qgis 3.40.6%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 1,181,336 kB
  • sloc: cpp: 1,593,302; python: 370,494; xml: 23,474; perl: 3,664; sh: 3,482; ansic: 2,257; sql: 2,133; yacc: 1,068; lex: 577; javascript: 540; lisp: 411; makefile: 157
file content (154 lines) | stat: -rw-r--r-- 5,542 bytes parent folder | download | duplicates (2)
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)