2016-12-19 20:48:52 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
"""
|
|
|
|
***************************************************************************
|
|
|
|
InterpolationDataWidget.py
|
|
|
|
---------------------
|
|
|
|
Date : December 2016
|
|
|
|
Copyright : (C) 2016 by Alexander Bruy
|
|
|
|
Email : alexander dot bruy at gmail dot com
|
|
|
|
***************************************************************************
|
|
|
|
* *
|
|
|
|
* 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__ = 'Alexander Bruy'
|
|
|
|
__date__ = 'December 2016'
|
|
|
|
__copyright__ = '(C) 2016, Alexander Bruy'
|
|
|
|
|
|
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
|
|
|
|
|
|
|
__revision__ = '$Format:%H$'
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
from qgis.PyQt import uic
|
2017-03-04 19:41:23 +01:00
|
|
|
from qgis.PyQt.QtCore import pyqtSlot
|
2016-12-19 20:48:52 +02:00
|
|
|
from qgis.PyQt.QtWidgets import (QTreeWidgetItem,
|
|
|
|
QComboBox
|
2016-12-26 23:28:10 +01:00
|
|
|
)
|
2016-12-19 20:48:52 +02:00
|
|
|
from qgis.core import (QgsApplication,
|
|
|
|
QgsMapLayer,
|
|
|
|
QgsMapLayerProxyModel,
|
2017-04-05 18:35:55 +10:00
|
|
|
QgsWkbTypes,
|
2017-05-02 14:47:58 +10:00
|
|
|
QgsProcessingUtils
|
2016-12-26 23:28:10 +01:00
|
|
|
)
|
2017-04-19 11:54:49 +02:00
|
|
|
from qgis.core import QgsFieldProxyModel
|
2016-12-19 20:48:52 +02:00
|
|
|
from qgis.analysis import QgsInterpolator
|
|
|
|
|
|
|
|
from processing.gui.wrappers import WidgetWrapper
|
|
|
|
from processing.tools import dataobjects
|
|
|
|
|
|
|
|
pluginPath = os.path.dirname(__file__)
|
|
|
|
WIDGET, BASE = uic.loadUiType(os.path.join(pluginPath, 'interpolationdatawidgetbase.ui'))
|
|
|
|
|
|
|
|
|
|
|
|
class InterpolationDataWidget(BASE, WIDGET):
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
super(InterpolationDataWidget, self).__init__(None)
|
|
|
|
self.setupUi(self)
|
|
|
|
|
|
|
|
self.btnAdd.setIcon(QgsApplication.getThemeIcon('/symbologyAdd.svg'))
|
|
|
|
self.btnRemove.setIcon(QgsApplication.getThemeIcon('/symbologyRemove.svg'))
|
|
|
|
|
|
|
|
self.cmbLayers.setFilters(QgsMapLayerProxyModel.VectorLayer)
|
|
|
|
self.cmbFields.setFilters(QgsFieldProxyModel.Numeric)
|
|
|
|
self.cmbFields.setLayer(self.cmbLayers.currentLayer())
|
|
|
|
|
|
|
|
@pyqtSlot()
|
|
|
|
def on_btnAdd_clicked(self):
|
|
|
|
layer = self.cmbLayers.currentLayer()
|
|
|
|
|
|
|
|
attribute = ''
|
|
|
|
if self.chkUseZCoordinate.isChecked():
|
|
|
|
attribute = 'Z_COORD'
|
|
|
|
else:
|
|
|
|
attribute = self.cmbFields.currentField()
|
|
|
|
|
|
|
|
self.addLayerData(layer.name(), attribute)
|
|
|
|
|
|
|
|
@pyqtSlot()
|
|
|
|
def on_btnRemove_clicked(self):
|
|
|
|
item = self.layersTree.currentItem()
|
|
|
|
if not item:
|
|
|
|
return
|
|
|
|
self.layersTree.invisibleRootItem().removeChild(item)
|
|
|
|
|
|
|
|
@pyqtSlot(QgsMapLayer)
|
|
|
|
def on_cmbLayers_layerChanged(self, layer):
|
|
|
|
self.chkUseZCoordinate.setEnabled(False)
|
2017-05-01 12:57:05 +03:00
|
|
|
self.chkUseZCoordinate.setChecked(False)
|
2016-12-19 20:48:52 +02:00
|
|
|
|
|
|
|
if layer is None or not layer.isValid():
|
|
|
|
return
|
|
|
|
|
|
|
|
provider = layer.dataProvider()
|
|
|
|
if not provider:
|
|
|
|
return
|
|
|
|
|
|
|
|
if QgsWkbTypes.hasZ(provider.wkbType()):
|
|
|
|
self.chkUseZCoordinate.setEnabled(True)
|
|
|
|
|
|
|
|
self.cmbFields.setLayer(layer)
|
|
|
|
|
|
|
|
def addLayerData(self, layerName, attribute):
|
|
|
|
item = QTreeWidgetItem()
|
2016-12-26 23:28:10 +01:00
|
|
|
item.setText(0, layerName)
|
2016-12-19 20:48:52 +02:00
|
|
|
item.setText(1, attribute)
|
|
|
|
self.layersTree.addTopLevelItem(item)
|
|
|
|
|
|
|
|
comboBox = QComboBox()
|
|
|
|
comboBox.addItem(self.tr('Points'))
|
|
|
|
comboBox.addItem(self.tr('Structure lines'))
|
|
|
|
comboBox.addItem(self.tr('Break lines'))
|
2016-12-26 23:28:10 +01:00
|
|
|
comboBox.setCurrentIndex(0)
|
2016-12-19 20:48:52 +02:00
|
|
|
self.layersTree.setItemWidget(item, 2, comboBox)
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
self.layersTree.clear()
|
|
|
|
rows = value.split(';')
|
|
|
|
for i, r in enumerate(rows):
|
|
|
|
v = r.split(',')
|
|
|
|
self.addLayerData(v[0], v[1])
|
|
|
|
|
|
|
|
comboBox = self.layersTree.itemWidget(self.layersTree.topLevelItem(i), 2)
|
|
|
|
comboBox.setCurrentIndex(comboBox.findText(v[3]))
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
layers = ''
|
2017-05-02 11:40:12 +10:00
|
|
|
context = dataobjects.createContext()
|
2016-12-19 20:48:52 +02:00
|
|
|
for i in range(self.layersTree.topLevelItemCount()):
|
|
|
|
item = self.layersTree.topLevelItem(i)
|
|
|
|
if item:
|
|
|
|
layerName = item.text(0)
|
2017-05-02 11:40:12 +10:00
|
|
|
layer = QgsProcessingUtils.mapLayerFromString(layerName, context)
|
2016-12-19 20:48:52 +02:00
|
|
|
if not layer:
|
|
|
|
continue
|
|
|
|
|
|
|
|
provider = layer.dataProvider()
|
|
|
|
if not provider:
|
|
|
|
continue
|
|
|
|
|
|
|
|
interpolationAttribute = item.text(1)
|
|
|
|
if interpolationAttribute == 'Z_COORD':
|
|
|
|
zCoord = True
|
|
|
|
fieldIndex = -1
|
|
|
|
else:
|
|
|
|
zCoord = False
|
|
|
|
fieldIndex = layer.fields().indexFromName(interpolationAttribute)
|
|
|
|
|
|
|
|
comboBox = self.layersTree.itemWidget(self.layersTree.topLevelItem(i), 2)
|
|
|
|
inputTypeName = comboBox.currentText()
|
|
|
|
if inputTypeName == self.tr('Points'):
|
|
|
|
inputType = QgsInterpolator.POINTS
|
|
|
|
elif inputTypeName == self.tr('Structure lines'):
|
|
|
|
inputType = QgsInterpolator.STRUCTURE_LINES
|
|
|
|
else:
|
|
|
|
inputType = QgsInterpolator.BREAK_LINES
|
|
|
|
|
|
|
|
layers += '{},{},{:d},{:d};'.format(layer.source(),
|
2016-12-26 23:28:10 +01:00
|
|
|
zCoord,
|
|
|
|
fieldIndex,
|
|
|
|
inputType)
|
2016-12-19 20:48:52 +02:00
|
|
|
return layers[:-1]
|
|
|
|
|
|
|
|
|
|
|
|
class InterpolationDataWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
return InterpolationDataWidget()
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
self.widget.setValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
return self.widget.value()
|