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
|
# -*- 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'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
import shutil
from processing.tools.system import isWindows, isMac, userFolder, mkdir
from processing.core.parameters import getParameterFromString
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):
""" Remove the r.li user dir config file """
configPath = alg.getParameterValue('config')
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, outputTxt=False):
""" Verify if we have the right parameters """
configTxt = alg.getParameterValue('config_txt')
config = alg.getParameterValue('config')
if configTxt and config:
return 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 alg.tr('Your configuration needs to be a "moving window" configuration!')
if movingWindow and outputTxt:
return alg.tr('Your configuration needs to be a non "moving window" configuration!')
return None
def configFile(alg, outputTxt=False):
""" Handle inline configuration """
# 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'))
origConfigFile = alg.getParameterValue('config')
# Handle inline configuration
configTxt = alg.getParameterFromName('config_txt')
if configTxt.value:
# Creates a temporary txt file in user r.li directory
tempConfig = alg.getTempFilename()
configFilePath = os.path.join(userGrass7Path, tempConfig)
# Inject rules into temporary txt file
with open(configFilePath, "w") as f:
f.write(configTxt.value)
# Use temporary file as rules file
alg.setParameterValue('config', os.path.basename(configFilePath))
alg.parameters.remove(configTxt)
# If we have a configuration file, we need to copy it into user dir
if origConfigFile:
configFilePath = os.path.join(userGrass7Path, os.path.basename(origConfigFile))
# Copy the file
shutil.copy(origConfigFile, configFilePath)
# Change the parameter value
alg.setParameterValue('config', os.path.basename(configFilePath))
origOutput = alg.getOutputFromName('output')
if outputTxt:
param = getParameterFromString("ParameterString|output|txt output|None|False|True")
param.value = os.path.basename(origOutput.value)
alg.addParameter(param)
alg.removeOutputFromName('output')
alg.processCommand()
# Remove Config file:
removeConfigFile(alg)
# re-add configTxt
alg.addParameter(configTxt)
alg.setParameterValue('config', origConfigFile)
if outputTxt:
for param in [f for f in alg.parameters if f.name == 'output']:
alg.parameters.remove(param)
alg.addOutput(origOutput)
def moveOutputTxtFile(alg):
# Find output file name:
origOutput = alg.getOutputValue('output')
userGrass7Path = rliPath()
outputDir = os.path.join(userGrass7Path, 'output')
output = os.path.join(outputDir, os.path.basename(origOutput))
# move the file
if isWindows():
command = "MOVE /Y {} {}".format(output, origOutput)
else:
command = "mv -f {} {}".format(output, origOutput)
alg.commands.append(command)
|