# coding=utf-8
"""
InaSAFE Disaster risk assessment tool developed by AusAid -
**Helper module for gui script functions.**
Contact : [email protected]
.. note:: 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__ = '[email protected]'
__version__ = '0.5.1'
__revision__ = '$Format:%H$'
__date__ = '10/01/2011'
__copyright__ = 'Copyright 2012, Australia Indonesia Facility for '
__copyright__ += 'Disaster Reduction'
import os
import logging
from qgis.core import QgsMapLayerRegistry, QgsRasterLayer, QgsVectorLayer
from qgis.gui import QgsMapCanvasLayer # pylint: disable=no-name-in-module
from qgis.utils import iface
import PyQt4.QtCore as QtCore
from safe.common.exceptions import FileNotFoundError
LOGGER = logging.getLogger('InaSAFE')
global_status_flag = False
[docs]def get_map_canvas():
"""Return map canvas object
"""
return iface.mapCanvas()
[docs]def run_scenario(dock=None):
"""Run the current scenario.
:param dock: Dock instance
"""
# pylint: disable=W0603
global global_status_flag
global_status_flag = False
def completed(flag):
"""Listen for completion and set myFlag according to exit value.
:param flag:
"""
global global_status_flag
global_status_flag = flag
LOGGER.debug("scenario done")
dock.analysis_done.disconnect(completed)
dock.analysis_done.connect(completed)
# Start the analysis
dock.accept()
return global_status_flag
# pylint: enable=W0603
[docs]def add_layers(scenario_dir, paths, iface): # pylint: disable=W0621
"""Add the layers described in a scenario file to QGIS.
:param scenario_dir: Base directory to find path.
:type scenario_dir: str
:param paths: Path of scenario file (or a list of paths).
:type paths: str, list
:param iface: iface instance to do necessary things to QGIS.
:type iface: QgsInterface
:raises: Exception, TypeError, FileNotFoundError
Note:
* Exception - occurs when paths have illegal extension
* TypeError - occurs when paths is not string or list
* FileNotFoundError - occurs when file not found
"""
path_list = []
if isinstance(paths, str):
path_list.append(extract_path(scenario_dir, paths))
elif isinstance(paths, list):
path_list = [extract_path(scenario_dir, path) for path in paths]
else:
message = "Paths must be string or list not %s" % type(paths)
raise TypeError(message)
layer_set = []
for path, base_name in path_list:
extension = os.path.splitext(path)[-1]
if not os.path.exists(path):
raise FileNotFoundError('File not found: %s' % path)
if extension in ['.asc', '.tif']:
LOGGER.debug("add raster layer %s" % path)
# noinspection PyCallingNonCallable
layer = QgsRasterLayer(path, base_name)
layer_set.append(layer)
elif extension in ['.shp']:
LOGGER.debug("add vector layer %s" % path)
# noinspection PyCallingNonCallable
layer = QgsVectorLayer(path, base_name, 'ogr')
layer_set.append(layer)
else:
raise Exception('File %s had illegal extension' % path)
# noinspection PyUnresolvedReferences
QgsMapLayerRegistry.instance().addMapLayers(layer_set)
# noinspection PyCallingNonCallable
iface.mapCanvas().setLayerSet([QgsMapCanvasLayer(layer) for layer in
layer_set])
[docs]def set_function_id(function_id, dock=None):
"""Set the function combo to use the function with the given id.
:param function_id: str - a string representing the unique identifier for
the desired function.
:param dock: a dock instance
:returns bool: True on success, False in the case that the function is not
present in the function selector (based on the context of loaded
hazard and exposure layers.
"""
if function_id is None or function_id == '':
return False
for count in range(0, dock.cboFunction.count()):
current_id = dock.get_function_id(count)
if current_id == function_id:
dock.cboFunction.setCurrentIndex(count)
return True
return False
[docs]def set_aggregation_layer(aggregation_layer, dock=None):
"""Set the aggregation combo to use the layer with the given name.
:param aggregation_layer: str - a string representing the source name of
the desired aggregation layer.
:param dock: a dock instance
:returns bool: True on success, False in the case that the aggregation
layer is not in the aggregation selector.
.. note:: Probably won't work for sublayers and anything else other than
file based layers (e.g. shp).
"""
if aggregation_layer is None or aggregation_layer == '':
return False
for count in range(0, dock.cboAggregation.count()):
layer_id = dock.cboAggregation.itemData(
count, QtCore.Qt.UserRole)
# noinspection PyArgumentList
layer = QgsMapLayerRegistry.instance().mapLayer(layer_id)
if layer is None:
continue
if layer.source() == aggregation_layer:
dock.cboAggregation.setCurrentIndex(count)
return True
return False