BERATools 0.2.0__py3-none-any.whl → 0.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- beratools/__init__.py +1 -7
- beratools/core/algo_centerline.py +491 -351
- beratools/core/algo_common.py +497 -0
- beratools/core/algo_cost.py +192 -0
- beratools/core/{dijkstra_algorithm.py → algo_dijkstra.py} +503 -460
- beratools/core/algo_footprint_rel.py +577 -0
- beratools/core/algo_line_grouping.py +944 -0
- beratools/core/algo_merge_lines.py +214 -0
- beratools/core/algo_split_with_lines.py +304 -0
- beratools/core/algo_tiler.py +428 -0
- beratools/core/algo_vertex_optimization.py +469 -0
- beratools/core/constants.py +52 -86
- beratools/core/logger.py +76 -85
- beratools/core/tool_base.py +196 -133
- beratools/gui/__init__.py +11 -15
- beratools/gui/{beratools.json → assets/beratools.json} +2185 -2300
- beratools/gui/batch_processing_dlg.py +513 -463
- beratools/gui/bt_data.py +481 -487
- beratools/gui/bt_gui_main.py +710 -691
- beratools/gui/main.py +26 -0
- beratools/gui/map_window.py +162 -146
- beratools/gui/tool_widgets.py +725 -493
- beratools/tools/Beratools_r_script.r +1120 -1120
- beratools/tools/Ht_metrics.py +116 -116
- beratools/tools/__init__.py +7 -7
- beratools/tools/batch_processing.py +136 -132
- beratools/tools/canopy_threshold_relative.py +672 -670
- beratools/tools/canopycostraster.py +222 -222
- beratools/tools/centerline.py +136 -176
- beratools/tools/common.py +857 -885
- beratools/tools/fl_regen_csf.py +428 -428
- beratools/tools/forest_line_attributes.py +408 -408
- beratools/tools/line_footprint_absolute.py +213 -363
- beratools/tools/line_footprint_fixed.py +436 -282
- beratools/tools/line_footprint_functions.py +733 -720
- beratools/tools/line_footprint_relative.py +73 -64
- beratools/tools/line_grouping.py +45 -0
- beratools/tools/ln_relative_metrics.py +615 -615
- beratools/tools/r_cal_lpi_elai.r +24 -24
- beratools/tools/r_generate_pd_focalraster.r +100 -100
- beratools/tools/r_interface.py +79 -79
- beratools/tools/r_point_density.r +8 -8
- beratools/tools/rpy_chm2trees.py +86 -86
- beratools/tools/rpy_dsm_chm_by.py +81 -81
- beratools/tools/rpy_dtm_by.py +63 -63
- beratools/tools/rpy_find_cellsize.py +43 -43
- beratools/tools/rpy_gnd_csf.py +74 -74
- beratools/tools/rpy_hummock_hollow.py +85 -85
- beratools/tools/rpy_hummock_hollow_raster.py +71 -71
- beratools/tools/rpy_las_info.py +51 -51
- beratools/tools/rpy_laz2las.py +40 -40
- beratools/tools/rpy_lpi_elai_lascat.py +466 -466
- beratools/tools/rpy_normalized_lidar_by.py +56 -56
- beratools/tools/rpy_percent_above_dbh.py +80 -80
- beratools/tools/rpy_points2trees.py +88 -88
- beratools/tools/rpy_vegcoverage.py +94 -94
- beratools/tools/tiler.py +48 -206
- beratools/tools/tool_template.py +69 -54
- beratools/tools/vertex_optimization.py +61 -620
- beratools/tools/zonal_threshold.py +144 -144
- beratools-0.2.2.dist-info/METADATA +108 -0
- beratools-0.2.2.dist-info/RECORD +74 -0
- {beratools-0.2.0.dist-info → beratools-0.2.2.dist-info}/WHEEL +1 -1
- {beratools-0.2.0.dist-info → beratools-0.2.2.dist-info}/licenses/LICENSE +22 -22
- beratools/gui/cli.py +0 -18
- beratools/gui/gui.json +0 -8
- beratools/gui_tk/ASCII Banners.txt +0 -248
- beratools/gui_tk/__init__.py +0 -20
- beratools/gui_tk/beratools_main.py +0 -515
- beratools/gui_tk/bt_widgets.py +0 -442
- beratools/gui_tk/cli.py +0 -18
- beratools/gui_tk/img/BERALogo.png +0 -0
- beratools/gui_tk/img/closed.gif +0 -0
- beratools/gui_tk/img/closed.png +0 -0
- beratools/gui_tk/img/open.gif +0 -0
- beratools/gui_tk/img/open.png +0 -0
- beratools/gui_tk/img/tool.gif +0 -0
- beratools/gui_tk/img/tool.png +0 -0
- beratools/gui_tk/main.py +0 -14
- beratools/gui_tk/map_window.py +0 -144
- beratools/gui_tk/runner.py +0 -1481
- beratools/gui_tk/tooltip.py +0 -55
- beratools/third_party/pyqtlet2/__init__.py +0 -9
- beratools/third_party/pyqtlet2/leaflet/__init__.py +0 -26
- beratools/third_party/pyqtlet2/leaflet/control/__init__.py +0 -6
- beratools/third_party/pyqtlet2/leaflet/control/control.py +0 -59
- beratools/third_party/pyqtlet2/leaflet/control/draw.py +0 -52
- beratools/third_party/pyqtlet2/leaflet/control/layers.py +0 -20
- beratools/third_party/pyqtlet2/leaflet/core/Parser.py +0 -24
- beratools/third_party/pyqtlet2/leaflet/core/__init__.py +0 -2
- beratools/third_party/pyqtlet2/leaflet/core/evented.py +0 -180
- beratools/third_party/pyqtlet2/leaflet/layer/__init__.py +0 -5
- beratools/third_party/pyqtlet2/leaflet/layer/featuregroup.py +0 -34
- beratools/third_party/pyqtlet2/leaflet/layer/icon/__init__.py +0 -1
- beratools/third_party/pyqtlet2/leaflet/layer/icon/icon.py +0 -30
- beratools/third_party/pyqtlet2/leaflet/layer/imageoverlay.py +0 -18
- beratools/third_party/pyqtlet2/leaflet/layer/layer.py +0 -105
- beratools/third_party/pyqtlet2/leaflet/layer/layergroup.py +0 -45
- beratools/third_party/pyqtlet2/leaflet/layer/marker/__init__.py +0 -1
- beratools/third_party/pyqtlet2/leaflet/layer/marker/marker.py +0 -91
- beratools/third_party/pyqtlet2/leaflet/layer/tile/__init__.py +0 -2
- beratools/third_party/pyqtlet2/leaflet/layer/tile/gridlayer.py +0 -4
- beratools/third_party/pyqtlet2/leaflet/layer/tile/tilelayer.py +0 -16
- beratools/third_party/pyqtlet2/leaflet/layer/vector/__init__.py +0 -5
- beratools/third_party/pyqtlet2/leaflet/layer/vector/circle.py +0 -15
- beratools/third_party/pyqtlet2/leaflet/layer/vector/circlemarker.py +0 -18
- beratools/third_party/pyqtlet2/leaflet/layer/vector/path.py +0 -5
- beratools/third_party/pyqtlet2/leaflet/layer/vector/polygon.py +0 -14
- beratools/third_party/pyqtlet2/leaflet/layer/vector/polyline.py +0 -18
- beratools/third_party/pyqtlet2/leaflet/layer/vector/rectangle.py +0 -14
- beratools/third_party/pyqtlet2/leaflet/map/__init__.py +0 -1
- beratools/third_party/pyqtlet2/leaflet/map/map.py +0 -220
- beratools/third_party/pyqtlet2/mapwidget.py +0 -45
- beratools/third_party/pyqtlet2/web/custom.js +0 -43
- beratools/third_party/pyqtlet2/web/map.html +0 -23
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/layers-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/layers.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-icon-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-icon.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-shadow.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/leaflet.css +0 -656
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/leaflet.js +0 -6
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.codeclimate.yml +0 -14
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.editorconfig +0 -4
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.gitattributes +0 -22
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.travis.yml +0 -43
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/LICENSE +0 -20
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/layers-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/layers.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-icon-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-icon.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-shadow.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet.svg +0 -156
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/leaflet.draw.css +0 -10
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/leaflet.draw.js +0 -10
- beratools/third_party/pyqtlet2/web/modules/leaflet_rotatedMarker_020/LICENSE +0 -22
- beratools/third_party/pyqtlet2/web/modules/leaflet_rotatedMarker_020/leaflet.rotatedMarker.js +0 -57
- beratools/tools/forest_line_ecosite.py +0 -216
- beratools/tools/lapis_all.py +0 -103
- beratools/tools/least_cost_path_from_chm.py +0 -152
- beratools-0.2.0.dist-info/METADATA +0 -63
- beratools-0.2.0.dist-info/RECORD +0 -142
- /beratools/gui/{img → assets}/BERALogo.png +0 -0
- /beratools/gui/{img → assets}/closed.gif +0 -0
- /beratools/gui/{img → assets}/closed.png +0 -0
- /beratools/{gui_tk → gui/assets}/gui.json +0 -0
- /beratools/gui/{img → assets}/open.gif +0 -0
- /beratools/gui/{img → assets}/open.png +0 -0
- /beratools/gui/{img → assets}/tool.gif +0 -0
- /beratools/gui/{img → assets}/tool.png +0 -0
- {beratools-0.2.0.dist-info → beratools-0.2.2.dist-info}/entry_points.txt +0 -0
|
@@ -1,515 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
""" This file is intended to be a helper for running BERA tools from a Python script.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
# This script is part of the BERA Tools geospatial library.
|
|
6
|
-
# Original Authors: Dr. John Lindsay
|
|
7
|
-
# Created: 28/11/2017
|
|
8
|
-
# Modified: 23/03/2023
|
|
9
|
-
# Author: Richard Zeng
|
|
10
|
-
# License: MIT
|
|
11
|
-
|
|
12
|
-
# from __future__ import print_function
|
|
13
|
-
import os
|
|
14
|
-
from os import path
|
|
15
|
-
import sys
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
import platform
|
|
18
|
-
import re
|
|
19
|
-
import json
|
|
20
|
-
import multiprocessing
|
|
21
|
-
from subprocess import CalledProcessError, Popen, PIPE, STDOUT
|
|
22
|
-
|
|
23
|
-
from beratools.tools.lapis_all import *
|
|
24
|
-
from beratools.tools.common import *
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
running_windows = platform.system() == 'Windows'
|
|
28
|
-
if running_windows:
|
|
29
|
-
from subprocess import STARTUPINFO, STARTF_USESHOWWINDOW
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def default_callback(value):
|
|
33
|
-
"""
|
|
34
|
-
A simple default callback that outputs using the print function. When
|
|
35
|
-
tools are called without providing a custom callback, this function
|
|
36
|
-
will be used to print to standard output.
|
|
37
|
-
"""
|
|
38
|
-
print(value)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class BeraTools(object):
|
|
42
|
-
"""
|
|
43
|
-
An object for interfacing with the BERA Tools executable.
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
def __init__(self):
|
|
47
|
-
if running_windows:
|
|
48
|
-
self.ext = '.exe'
|
|
49
|
-
else:
|
|
50
|
-
self.ext = ''
|
|
51
|
-
self.exe_name = "BERA_tools{}".format(self.ext)
|
|
52
|
-
self.exe_path = path.dirname(path.abspath(__file__))
|
|
53
|
-
|
|
54
|
-
self.work_dir = ""
|
|
55
|
-
self.verbose = False
|
|
56
|
-
self.show_advanced = BT_SHOW_ADVANCED_OPTIONS
|
|
57
|
-
self.__compress_rasters = False
|
|
58
|
-
self.__max_procs = -1
|
|
59
|
-
self.recent_tool = None
|
|
60
|
-
self.ascii_art = None
|
|
61
|
-
|
|
62
|
-
# set maximum available cpu core for tools
|
|
63
|
-
self.__max_cpu_cores = min(BT_MAXIMUM_CPU_CORES, multiprocessing.cpu_count())
|
|
64
|
-
|
|
65
|
-
# load bera tools
|
|
66
|
-
self.bera_tools = None
|
|
67
|
-
self.tools_list = []
|
|
68
|
-
self.sorted_tools = []
|
|
69
|
-
self.upper_toolboxes = []
|
|
70
|
-
self.lower_toolboxes = []
|
|
71
|
-
self.get_bera_tools()
|
|
72
|
-
self.get_bera_tool_list()
|
|
73
|
-
self.get_bera_toolboxes()
|
|
74
|
-
self.toolbox_list = self.get_bera_toolboxes()
|
|
75
|
-
self.sort_toolboxes()
|
|
76
|
-
|
|
77
|
-
self.setting_file = os.path.join(self.exe_path, '..\..\.data\saved_tool_parameters.json')
|
|
78
|
-
if os.path.isfile(self.setting_file):
|
|
79
|
-
# read the saved_tool_parameters.json file if it exists
|
|
80
|
-
with open(self.setting_file, 'r') as settings_file:
|
|
81
|
-
settings = json.load(settings_file)
|
|
82
|
-
|
|
83
|
-
# parse file
|
|
84
|
-
if 'gui_parameters' in settings.keys():
|
|
85
|
-
gui_settings = settings['gui_parameters']
|
|
86
|
-
if 'working_directory' in gui_settings.keys():
|
|
87
|
-
self.work_dir = str(gui_settings['working_directory'])
|
|
88
|
-
if 'verbose_mode' in gui_settings.keys():
|
|
89
|
-
self.verbose = str(gui_settings['verbose_mode'])
|
|
90
|
-
if 'compress_rasters' in gui_settings.keys():
|
|
91
|
-
self.__compress_rasters = gui_settings['compress_rasters']
|
|
92
|
-
if 'max_procs' in gui_settings.keys():
|
|
93
|
-
self.__max_procs = gui_settings['max_procs']
|
|
94
|
-
if 'recent_tool' in gui_settings.keys():
|
|
95
|
-
self.recent_tool = gui_settings['recent_tool']
|
|
96
|
-
if not self.get_bera_tool_api(self.recent_tool):
|
|
97
|
-
self.recent_tool = None
|
|
98
|
-
else:
|
|
99
|
-
print("Settings.json not exist.")
|
|
100
|
-
|
|
101
|
-
self.gui_setting_file = os.path.join(self.exe_path, '..\gui\gui.json')
|
|
102
|
-
if os.path.isfile(self.gui_setting_file):
|
|
103
|
-
# read the settings.json file if it exists
|
|
104
|
-
with open(self.gui_setting_file, 'r') as gui_setting_file:
|
|
105
|
-
gui_settings = json.load(gui_setting_file)
|
|
106
|
-
|
|
107
|
-
# parse file
|
|
108
|
-
if 'ascii_art' in gui_settings.keys():
|
|
109
|
-
bera_art = ''
|
|
110
|
-
for line_of_art in gui_settings['ascii_art']:
|
|
111
|
-
bera_art += line_of_art
|
|
112
|
-
self.ascii_art = bera_art
|
|
113
|
-
else:
|
|
114
|
-
print("Settings.json not exist.")
|
|
115
|
-
|
|
116
|
-
self.cancel_op = False
|
|
117
|
-
self.default_callback = default_callback
|
|
118
|
-
self.start_minimized = False
|
|
119
|
-
|
|
120
|
-
def set_bera_dir(self, path_str):
|
|
121
|
-
"""
|
|
122
|
-
Sets the directory to the BERA Tools executable file.
|
|
123
|
-
"""
|
|
124
|
-
self.exe_path = path_str
|
|
125
|
-
|
|
126
|
-
def save_setting(self, key, value):
|
|
127
|
-
# check setting directory existence
|
|
128
|
-
data_path = Path(self.setting_file).resolve().parent
|
|
129
|
-
if not data_path.exists():
|
|
130
|
-
data_path.mkdir()
|
|
131
|
-
|
|
132
|
-
settings = {}
|
|
133
|
-
if os.path.isfile(self.setting_file):
|
|
134
|
-
# read the settings.json file if it exists
|
|
135
|
-
with open(self.setting_file, 'r') as read_settings_file:
|
|
136
|
-
settings = json.load(read_settings_file)
|
|
137
|
-
|
|
138
|
-
if not settings:
|
|
139
|
-
settings = {}
|
|
140
|
-
else:
|
|
141
|
-
print("Settings file not exist, creating one.")
|
|
142
|
-
|
|
143
|
-
if value is not None:
|
|
144
|
-
if 'gui_parameters' not in settings.keys():
|
|
145
|
-
settings['gui_parameters'] = {}
|
|
146
|
-
|
|
147
|
-
settings['gui_parameters'][key] = value
|
|
148
|
-
|
|
149
|
-
with open(self.setting_file, 'w') as write_settings_file:
|
|
150
|
-
json.dump(settings, write_settings_file, indent=4)
|
|
151
|
-
|
|
152
|
-
def set_working_dir(self, path_str):
|
|
153
|
-
"""
|
|
154
|
-
Sets the working directory, i.e. the directory in which
|
|
155
|
-
the data files are located. By setting the working
|
|
156
|
-
directory, tool input parameters that are files need only
|
|
157
|
-
specify the file name rather than the complete file path.
|
|
158
|
-
"""
|
|
159
|
-
self.work_dir = path.normpath(path_str)
|
|
160
|
-
self.save_setting('working_directory', self.work_dir)
|
|
161
|
-
|
|
162
|
-
def get_working_dir(self):
|
|
163
|
-
return self.work_dir
|
|
164
|
-
|
|
165
|
-
def get_verbose_mode(self):
|
|
166
|
-
return self.verbose
|
|
167
|
-
|
|
168
|
-
def set_verbose_mode(self, val=True):
|
|
169
|
-
"""
|
|
170
|
-
Sets verbose mode. If verbose mode is False, tools will not
|
|
171
|
-
print output messages. Tools will frequently provide substantial
|
|
172
|
-
feedback while they are operating, e.g. updating progress for
|
|
173
|
-
various sub-routines. When the user has scripted a workflow
|
|
174
|
-
that ties many tools in sequence, this level of tool output
|
|
175
|
-
can be problematic. By setting verbose mode to False, these
|
|
176
|
-
messages are suppressed and tools run as background processes.
|
|
177
|
-
"""
|
|
178
|
-
self.verbose = val
|
|
179
|
-
self.save_setting('verbose_mode', val)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def set_max_procs(self, val=-1):
|
|
183
|
-
"""
|
|
184
|
-
Sets the flag used by BERA Tools to determine whether to use compression for output rasters.
|
|
185
|
-
"""
|
|
186
|
-
self.__max_procs = val
|
|
187
|
-
|
|
188
|
-
self.save_setting('max_procs', val)
|
|
189
|
-
|
|
190
|
-
def get_max_procs(self):
|
|
191
|
-
return self.__max_procs
|
|
192
|
-
|
|
193
|
-
def get_max_cpu_cores(self):
|
|
194
|
-
return self.__max_cpu_cores
|
|
195
|
-
|
|
196
|
-
def save_recent_tool(self):
|
|
197
|
-
gui_settings = {}
|
|
198
|
-
if os.path.isfile(self.setting_file):
|
|
199
|
-
# read the settings.json file if it exists
|
|
200
|
-
with open(self.setting_file, 'r') as settings_file:
|
|
201
|
-
gui_settings = json.load(settings_file)
|
|
202
|
-
else:
|
|
203
|
-
print("Settings.json not exist, creat one.")
|
|
204
|
-
|
|
205
|
-
if self.recent_tool and len(self.recent_tool) > 0:
|
|
206
|
-
if 'gui_parameters' not in gui_settings.keys():
|
|
207
|
-
gui_settings['gui_parameters'] = {}
|
|
208
|
-
|
|
209
|
-
gui_settings['gui_parameters']['recent_tool'] = self.recent_tool
|
|
210
|
-
with open(self.setting_file, 'w') as settings_file:
|
|
211
|
-
json.dump(gui_settings, settings_file, indent=4)
|
|
212
|
-
|
|
213
|
-
def run_tool_bt(self, tool_api, args, callback=None, verbose=True):
|
|
214
|
-
"""
|
|
215
|
-
Runs a tool and specifies tool arguments.
|
|
216
|
-
Returns 0 if completes without error.
|
|
217
|
-
Returns 1 if error encountered (details are sent to callback).
|
|
218
|
-
Returns 2 if process is cancelled by user.
|
|
219
|
-
"""
|
|
220
|
-
|
|
221
|
-
try:
|
|
222
|
-
if callback is None:
|
|
223
|
-
callback = self.default_callback
|
|
224
|
-
|
|
225
|
-
work_dir = os.getcwd()
|
|
226
|
-
os.chdir(self.exe_path)
|
|
227
|
-
|
|
228
|
-
except (OSError, ValueError, CalledProcessError) as err:
|
|
229
|
-
callback(str(err))
|
|
230
|
-
return 1
|
|
231
|
-
finally:
|
|
232
|
-
os.chdir(work_dir)
|
|
233
|
-
|
|
234
|
-
# Call script using new process to make GUI responsive
|
|
235
|
-
try:
|
|
236
|
-
proc = None
|
|
237
|
-
|
|
238
|
-
# convert to valid json string
|
|
239
|
-
args_string = str(args).replace("'", '"')
|
|
240
|
-
args_string = args_string.replace('True', 'true')
|
|
241
|
-
args_string = args_string.replace('False', 'false')
|
|
242
|
-
|
|
243
|
-
tool_name = self.get_bera_tool_name(tool_api)
|
|
244
|
-
tool_type = self.get_bera_tool_type(tool_name)
|
|
245
|
-
if tool_type == 'python':
|
|
246
|
-
args_tool = ['python', os.path.join(r'..\tools', tool_api + '.py'),
|
|
247
|
-
'-i', args_string, '-p', str(self.get_max_procs()), '-v', str(self.verbose)]
|
|
248
|
-
elif tool_type == 'executable':
|
|
249
|
-
print(globals().get(tool_api))
|
|
250
|
-
args_tool = globals()[tool_api](args_string)
|
|
251
|
-
# change working dir
|
|
252
|
-
work_dir = os.getcwd()
|
|
253
|
-
lapis_path = Path(work_dir).parent.joinpath('./third_party/Lapis_0_8')
|
|
254
|
-
os.chdir(lapis_path.as_posix())
|
|
255
|
-
|
|
256
|
-
if running_windows and self.start_minimized:
|
|
257
|
-
si = STARTUPINFO()
|
|
258
|
-
si.dwFlags = STARTF_USESHOWWINDOW
|
|
259
|
-
si.wShowWindow = 7 # Set window minimized and not activated
|
|
260
|
-
proc = Popen(args_tool, shell=False, stdout=PIPE,
|
|
261
|
-
stderr=STDOUT, bufsize=1, universal_newlines=True,
|
|
262
|
-
startupinfo=si)
|
|
263
|
-
else:
|
|
264
|
-
proc = Popen(args_tool, shell=False, stdout=PIPE,
|
|
265
|
-
stderr=STDOUT, bufsize=1, universal_newlines=True)
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
while proc is not None:
|
|
269
|
-
line = proc.stdout.readline()
|
|
270
|
-
sys.stdout.flush()
|
|
271
|
-
if line != '':
|
|
272
|
-
if not self.cancel_op:
|
|
273
|
-
# remove esc string which origin is unknown
|
|
274
|
-
rm_str = '\x1b[0m'
|
|
275
|
-
if rm_str in line:
|
|
276
|
-
if BT_DEBUGGING:
|
|
277
|
-
callback('Problem caught: '+line)
|
|
278
|
-
line = line.replace(rm_str, '')
|
|
279
|
-
|
|
280
|
-
callback(line.strip())
|
|
281
|
-
else:
|
|
282
|
-
self.cancel_op = False
|
|
283
|
-
proc.terminate()
|
|
284
|
-
callback('Tool operation terminated.')
|
|
285
|
-
callback('------------------------------------')
|
|
286
|
-
return 2
|
|
287
|
-
|
|
288
|
-
else:
|
|
289
|
-
break
|
|
290
|
-
|
|
291
|
-
out_str = '{} tool finished'.format(self.get_bera_tool_name(tool_api))
|
|
292
|
-
sep_str = '-' * len(out_str)
|
|
293
|
-
callback(sep_str)
|
|
294
|
-
callback(out_str)
|
|
295
|
-
callback(sep_str)
|
|
296
|
-
|
|
297
|
-
return 0
|
|
298
|
-
except (OSError, ValueError, CalledProcessError) as err:
|
|
299
|
-
callback(str(err))
|
|
300
|
-
return 1
|
|
301
|
-
|
|
302
|
-
def about(self):
|
|
303
|
-
"""
|
|
304
|
-
Retrieves the help description for BERA Tools.
|
|
305
|
-
"""
|
|
306
|
-
work_dir = None
|
|
307
|
-
try:
|
|
308
|
-
work_dir = os.getcwd()
|
|
309
|
-
os.chdir(self.exe_path)
|
|
310
|
-
|
|
311
|
-
about_text = 'BERA Tools provide a series of tools developed by AppliedGRG lab.\n\n'
|
|
312
|
-
about_text += self.ascii_art
|
|
313
|
-
|
|
314
|
-
return about_text
|
|
315
|
-
|
|
316
|
-
except (OSError, ValueError, CalledProcessError) as err:
|
|
317
|
-
return err
|
|
318
|
-
finally:
|
|
319
|
-
os.chdir(work_dir)
|
|
320
|
-
|
|
321
|
-
def license(self):
|
|
322
|
-
"""
|
|
323
|
-
Retrieves the license information for BERA Tools.
|
|
324
|
-
"""
|
|
325
|
-
|
|
326
|
-
work_dir = os.getcwd()
|
|
327
|
-
os.chdir(self.exe_path)
|
|
328
|
-
|
|
329
|
-
try:
|
|
330
|
-
with open(os.path.join(self.exe_path, r'..\..\LICENSE.txt'), 'r') as f:
|
|
331
|
-
ret = f.read()
|
|
332
|
-
|
|
333
|
-
return ret
|
|
334
|
-
except (OSError, ValueError, CalledProcessError) as err:
|
|
335
|
-
return err
|
|
336
|
-
finally:
|
|
337
|
-
os.chdir(work_dir)
|
|
338
|
-
|
|
339
|
-
def get_saved_tool_parameter(self, tool, variable):
|
|
340
|
-
data_path = Path(__file__).resolve().cwd().parent.parent.joinpath(r'.data')
|
|
341
|
-
if not data_path.exists():
|
|
342
|
-
data_path.mkdir()
|
|
343
|
-
|
|
344
|
-
json_file = data_path.joinpath(data_path, 'saved_tool_parameters.json')
|
|
345
|
-
if json_file.exists():
|
|
346
|
-
with open(json_file) as open_file:
|
|
347
|
-
saved_parameters = json.load(open_file)
|
|
348
|
-
if tool in list(saved_parameters.keys()):
|
|
349
|
-
tool_params = saved_parameters[tool]
|
|
350
|
-
if tool_params:
|
|
351
|
-
if variable in tool_params.keys():
|
|
352
|
-
saved_value = tool_params[variable]
|
|
353
|
-
return saved_value
|
|
354
|
-
|
|
355
|
-
return None
|
|
356
|
-
|
|
357
|
-
def get_bera_tools(self):
|
|
358
|
-
tool_json = Path(self.exe_path).parent.joinpath(r'gui/beratools.json')
|
|
359
|
-
if tool_json.exists():
|
|
360
|
-
json_file = open(tool_json.as_posix())
|
|
361
|
-
self.bera_tools = json.load(json_file)
|
|
362
|
-
else:
|
|
363
|
-
print('Tool configuration file not exists')
|
|
364
|
-
|
|
365
|
-
def get_bera_tool_list(self):
|
|
366
|
-
self.tools_list = []
|
|
367
|
-
self.sorted_tools = []
|
|
368
|
-
|
|
369
|
-
for toolbox in self.bera_tools['toolbox']:
|
|
370
|
-
category = []
|
|
371
|
-
for item in toolbox['tools']:
|
|
372
|
-
if item['name']:
|
|
373
|
-
category.append(item['name'])
|
|
374
|
-
self.tools_list.append(item['name']) # add tool to list
|
|
375
|
-
|
|
376
|
-
self.sorted_tools.append(category)
|
|
377
|
-
|
|
378
|
-
def sort_toolboxes(self):
|
|
379
|
-
for toolbox in self.toolbox_list:
|
|
380
|
-
if toolbox.find('/') == (-1): # Does not contain a sub toolbox, i.e. does not contain '/'
|
|
381
|
-
self.upper_toolboxes.append(toolbox) # add to both upper toolbox list and lower toolbox list
|
|
382
|
-
self.lower_toolboxes.append(toolbox)
|
|
383
|
-
else: # Contains a sub toolbox
|
|
384
|
-
self.lower_toolboxes.append(toolbox) # add to only the lower toolbox list
|
|
385
|
-
|
|
386
|
-
def get_bera_toolboxes(self):
|
|
387
|
-
toolboxes = []
|
|
388
|
-
for toolbox in self.bera_tools['toolbox']:
|
|
389
|
-
tb = toolbox['category']
|
|
390
|
-
toolboxes.append(tb)
|
|
391
|
-
return toolboxes
|
|
392
|
-
|
|
393
|
-
def get_bera_tool_info(self, tool_name):
|
|
394
|
-
for toolbox in self.bera_tools['toolbox']:
|
|
395
|
-
for tool in toolbox['tools']:
|
|
396
|
-
if tool['name'] == tool_name:
|
|
397
|
-
return tool['info']
|
|
398
|
-
|
|
399
|
-
def get_bera_tool_parameters(self, tool_name):
|
|
400
|
-
new_params = {'parameters': []}
|
|
401
|
-
tool = {}
|
|
402
|
-
batch_tool_list = []
|
|
403
|
-
for toolbox in self.bera_tools['toolbox']:
|
|
404
|
-
for single_tool in toolbox['tools']:
|
|
405
|
-
if single_tool['batch_processing']:
|
|
406
|
-
batch_tool_list.append(single_tool['name'])
|
|
407
|
-
|
|
408
|
-
if tool_name == single_tool['name']:
|
|
409
|
-
tool = single_tool
|
|
410
|
-
|
|
411
|
-
for key, value in tool.items():
|
|
412
|
-
if key != 'parameters':
|
|
413
|
-
new_params[key] = value
|
|
414
|
-
|
|
415
|
-
# convert json format for parameters
|
|
416
|
-
for param in tool['parameters']:
|
|
417
|
-
new_param = {'name': param['parameter']}
|
|
418
|
-
if 'variable' in param.keys():
|
|
419
|
-
new_param['flag'] = param['variable']
|
|
420
|
-
# restore saved parameters
|
|
421
|
-
saved_value = self.get_saved_tool_parameter(tool['tool_api'], param['variable'])
|
|
422
|
-
if saved_value is not None:
|
|
423
|
-
new_param['saved_value'] = saved_value
|
|
424
|
-
else:
|
|
425
|
-
new_param['flag'] = 'FIXME'
|
|
426
|
-
|
|
427
|
-
if not param['output']:
|
|
428
|
-
if param['type'] == 'list':
|
|
429
|
-
if tool_name == 'Batch Processing':
|
|
430
|
-
new_param['parameter_type'] = {'OptionList': batch_tool_list}
|
|
431
|
-
new_param['data_type'] = 'String'
|
|
432
|
-
else:
|
|
433
|
-
new_param['parameter_type'] = {'OptionList': param['data']}
|
|
434
|
-
new_param['data_type'] = 'String'
|
|
435
|
-
if param['typelab'] == 'text':
|
|
436
|
-
new_param['data_type'] = 'String'
|
|
437
|
-
elif param['typelab'] == 'int':
|
|
438
|
-
new_param['data_type'] = 'Integer'
|
|
439
|
-
elif param['typelab'] == 'float':
|
|
440
|
-
new_param['data_type'] = 'Float'
|
|
441
|
-
elif param['typelab'] == 'bool':
|
|
442
|
-
new_param['data_type'] = 'Boolean'
|
|
443
|
-
elif param['type'] == 'text':
|
|
444
|
-
new_param['parameter_type'] = 'String'
|
|
445
|
-
elif param['type'] == 'number':
|
|
446
|
-
if param['typelab'] == 'int':
|
|
447
|
-
new_param['parameter_type'] = 'Integer'
|
|
448
|
-
else:
|
|
449
|
-
new_param['parameter_type'] = 'Float'
|
|
450
|
-
elif param['type'] == 'file':
|
|
451
|
-
new_param['parameter_type'] = {'ExistingFile': [param['typelab']]}
|
|
452
|
-
else:
|
|
453
|
-
new_param['parameter_type'] = {'ExistingFile': ''}
|
|
454
|
-
else:
|
|
455
|
-
new_param["parameter_type"] = {'NewFile': [param['typelab']]}
|
|
456
|
-
|
|
457
|
-
new_param['description'] = param['description']
|
|
458
|
-
|
|
459
|
-
if param['type'] == 'raster':
|
|
460
|
-
for i in new_param["parameter_type"].keys():
|
|
461
|
-
new_param['parameter_type'][i] = 'Raster'
|
|
462
|
-
elif param['type'] == 'lidar':
|
|
463
|
-
for i in new_param["parameter_type"].keys():
|
|
464
|
-
new_param['parameter_type'][i] = 'Lidar'
|
|
465
|
-
elif param['type'] == 'vector':
|
|
466
|
-
for i in new_param["parameter_type"].keys():
|
|
467
|
-
new_param['parameter_type'][i] = 'Vector'
|
|
468
|
-
elif param['type'] == 'Directory':
|
|
469
|
-
new_param['parameter_type'] = {'Directory': [param['typelab']]}
|
|
470
|
-
|
|
471
|
-
new_param['default_value'] = param['default']
|
|
472
|
-
if "optional" in param.keys():
|
|
473
|
-
new_param['optional'] = param['optional']
|
|
474
|
-
else:
|
|
475
|
-
new_param['optional'] = False
|
|
476
|
-
|
|
477
|
-
new_params['parameters'].append(new_param)
|
|
478
|
-
|
|
479
|
-
return new_params
|
|
480
|
-
|
|
481
|
-
def get_bera_tool_parameters_list(self, tool_name):
|
|
482
|
-
params = self.get_bera_tool_parameters(tool_name)
|
|
483
|
-
param_list = {}
|
|
484
|
-
for item in params['parameters']:
|
|
485
|
-
param_list[item['flag']] = item['default_value']
|
|
486
|
-
|
|
487
|
-
return param_list
|
|
488
|
-
|
|
489
|
-
def get_bera_tool_name(self, tool_api):
|
|
490
|
-
tool_name = None
|
|
491
|
-
for toolbox in self.bera_tools['toolbox']:
|
|
492
|
-
for tool in toolbox['tools']:
|
|
493
|
-
if tool_api == tool['tool_api']:
|
|
494
|
-
tool_name = tool['name']
|
|
495
|
-
|
|
496
|
-
return tool_name
|
|
497
|
-
|
|
498
|
-
def get_bera_tool_api(self, tool_name):
|
|
499
|
-
tool_api = None
|
|
500
|
-
for toolbox in self.bera_tools['toolbox']:
|
|
501
|
-
for tool in toolbox['tools']:
|
|
502
|
-
if tool_name == tool['name']:
|
|
503
|
-
tool_api = tool['tool_api']
|
|
504
|
-
|
|
505
|
-
return tool_api
|
|
506
|
-
|
|
507
|
-
def get_bera_tool_type(self, tool_name):
|
|
508
|
-
tool_type = None
|
|
509
|
-
for toolbox in self.bera_tools['toolbox']:
|
|
510
|
-
for tool in toolbox['tools']:
|
|
511
|
-
if tool_name == tool['name']:
|
|
512
|
-
tool_type = tool['tool_type']
|
|
513
|
-
|
|
514
|
-
return tool_type
|
|
515
|
-
|