Source code for dtutils
# -*- coding: utf-8 -*-
"""
/***************************************************************************
DigitizingTools
A QGIS plugin
Subsumes different tools neded during digitizing sessions
some code from fTools plugin contained
-------------------
begin : 2013-02-25
copyright : (C) 2013 by Bernhard Ströbl
email : bernhard.stroebl@jena.de
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
"""
from PyQt4 import QtCore, QtGui
from qgis.core import *
[docs]def dtGetFeatureForId(layer, fid):
'''function that returns a QgsFeature'''
feat = QgsFeature()
if QGis.QGIS_VERSION_INT >= 10900:
if layer.getFeatures(QgsFeatureRequest().setFilterFid(fid)).nextFeature(feat):
return feat
else:
return None
else:
if layer.featureAtId(fid, feat, True, True):
return feat
else:
return None
[docs]def dtCreateFeature(layer):
'''create an empty feature for the layer'''
if isinstance(layer, QgsVectorLayer):
newFeature = QgsFeature()
provider = layer.dataProvider()
fields = layer.pendingFields()
if QGis.QGIS_VERSION_INT >= 10900:
newFeature.initAttributes(fields.count())
for i in range(fields.count()):
newFeature.setAttribute(i, provider.defaultValue(i))
else:
for i in fields:
newFeature.addAttribute(i, provider.defaultValue(i))
return newFeature
else:
return None
[docs]def dtCopyFeature(layer, srcFid):
srcFeature = dtGetFeatureForId(layer, srcFid)
if srcFeature:
newFeature = dtCreateFeature(layer)
#copy the attribute values#
if QGis.QGIS_VERSION_INT >= 10900:
pkFields = layer.dataProvider().pkAttributeIndexes()
fields = layer.pendingFields()
for i in range(fields.count()):
# do not copy the PK value if there is a PK field
if i in pkFields:
continue
else:
newFeature.setAttribute(i, srcFeature.attribute(i))
else:
newFeature.setAttributeMap(srcFeature.attributeMap())
return newFeature
else:
return None
else:
return None
[docs]def dtGetVectorLayersByType(iface, geomType = None, skipActive = False):
'''returns a dict of layers[name: id] in the project for the given
geomType; geomTypes are 0: point, 1: line, 2: polygon'''
layerList = {}
for aLayer in iface.legendInterface().layers():
if 0 == aLayer.type(): # vectorLayer
if skipActive and (iface.mapCanvas().currentLayer().id() == aLayer.id()):
continue
else:
if geomType:
if isinstance(geomType, int):
if aLayer.geometryType() == geomType:
layerList[aLayer.name()] = aLayer.id()
else:
layerList[aLayer.name()] = aLayer.id()
return layerList
[docs]def dtChooseVectorLayer(iface, geomType = None, skipActive = True, msg = None):
layerList = dtGetVectorLayersByType(iface, geomType, skipActive)
chooseFrom = QtCore.QStringList()
retValue = None
if len(layerList) > 0:
for aName in layerList:
chooseFrom.append(aName)
if not msg:
msg = ""
selectedLayer, ok = QtGui.QInputDialog.getItem(None, QtGui.QApplication.translate("dtutils", "Choose Layer"),
msg, chooseFrom, editable = False)
if ok:
for aLayer in iface.legendInterface().layers():
if 0 == aLayer.type():
if aLayer.id() == layerList[selectedLayer]:
retValue = aLayer
break
return retValue
[docs]def dtGetNoSelMessage():
noSelMsg1 = QtCore.QCoreApplication.translate("digitizingtools", "No Selection in layer")
noSelMsg2 = QtCore.QCoreApplication.translate("digitizingtools", "Use all features for process?")
return [noSelMsg1, noSelMsg2]
[docs]def dtGetErrorMessage():
return QtCore.QCoreApplication.translate("digitizingtools", "Error occured during")
# code taken from fTools plugin