Código fuente para dialogo_csv
# -*- coding: utf-8 -*-
import os
from PyQt4 import QtGui, uic
from PyQt4.QtGui import QFileDialog, QAbstractItemView, QMessageBox
from PyQt4.QtCore import QFileInfo, Qt
from qgis.core import QgsVectorLayer
from dialogs.dialogo_csv_base import Ui_DialogoCSV
# FORM_CLASS, _ = uic.loadUiType(os.path.join(
# os.path.dirname(__file__), 'dialogo_csv_base.ui'))
CSV_SUFFIX = '?type=csv&geomType=none&subsetIndex=no&watchFile=no&delimiter=,'
[documentos]class CSVDialog(QtGui.QDialog, Ui_DialogoCSV):
""" Este diálogo es el encargado de cargar un archivo CSV, y
de recolectar la información necesaria para unirlo con la
capa de secciones.
"""
def __init__(self, fields, parent=None):
"""Constructor de la clase.
:param fields: Lista de strings que usara para llenar el combo box
self.comboJoinFieldTarget.
:type a: Lista str
"""
super(CSVDialog, self).__init__(parent)
self.setupUi(self)
self.fields = fields
self._layer = None
self.configWidgets()
[documentos] def getLayer(self):
"""Devuelve la el archivo CSV cargado como capa de QGIS.
:returns: La capa de qgis del archivo CSV que el usuario cargo.
:rtype: QgsVectorLayer.
"""
return self._layer
[documentos] def getJoinField(self):
""" Retorna el campo del archivo CSV sobre el cual se va a hacer la unión.
:returns: Campo sobre el cual se a hacer la unión
:rtype: str
"""
return str(self.comboJoinField.currentText())
[documentos] def getJoinFieldTarget(self):
""" Retorna el campo de la capa secciones sobre el cual se va a hacer la unión con el archivo CSV.
:returns: Campo sobre el cual se a hacer la unión
:rtype: str
"""
return str(self.comboJoinFieldTarget.currentText())
[documentos] def getSelectedColumns(self):
""" Retorna todos los campos de self.listTarget, los cuales contienen
las columnas seleccionadas para unir a la capa de secciones.
:returns: Lista de las columnas seleccionadas.
:rtype: Lista str.
"""
if self.listTarget.count() > 0:
""" En caso de que self.listTarget no contenga elementos, se seleccionarán
los elementos de self.listSource.
"""
items = self.getItems(self.listTarget)
else:
items = self.getItems(self.listSource)
if self.getJoinField() in items:
items.remove(self.getJoinField())
return items
[documentos] def getItems(self, list):
"""Función auxiliar que extrae el texto de los items gráficos de la lista
que se le pase.
:param list: Lista de items a los cuales se les va a extraer el texto.
:type list: QListWidget
:returns: Lista del título de cada item.
:rtype: Lista str
"""
return [str(list.item(i).text()) for i in xrange(list.count())]
[documentos] def clear(self):
"""Limpia los componentes gráficos del diálogo.
"""
self.editPath.setText('')
self.listSource.clear()
self.listTarget.clear()
self.comboJoinField.clear()
[documentos] def handler(self):
"""Maneja el evento de click del botón self.buttonLoadFile"""
layerPath = QFileDialog.getOpenFileName(self, u'Abrir CSV', '.', 'CSV (*.CSV)')
layerInfo = QFileInfo(layerPath)
self.editPath.setText(layerPath)
try:
self._layer = self.loadLayer(layerPath)
columns = [field.name() for field in self._layer.pendingFields()]
self.pupulateLists(columns)
except:
self.errorDialog(u'Error al cargar el archivo CSV',
u'Asegurate de que el archivo no esta corrupto.')
self.editPath.setText('')
[documentos] def pupulateLists(self, columns = []):
"""Llena las listas self.listSource, y self.comboJoinField con los nombres columnas del archivo CSV.
:param columns: Son las columnas que se van a instertar en las listas.
:type columns: Lista str
"""
self.listSource.addItems(columns)
self.comboJoinField.addItems(columns)
[documentos] def addItem(self):
"""Agrega los items seleccionados de self.listSource a self.listTarget.
"""
for item in self.listSource.selectedItems():
item.setHidden(True)
self.listTarget.addItem(item.text())
[documentos] def removeItem(self):
"""Remueve los items seleccionados de self.listTarget."""
for item in self.listTarget.selectedItems():
source_index = self.listSource.findItems(item.text(), Qt.MatchExactly)
source_index[0].setHidden(False)
self.deleteItem(self.listTarget, item)
[documentos] def deleteItem(self, list, item):
"""Función auxiliar que remueve un item de una lista.
:param list: Lista de la cual se va a eliminar el item.
:type list: QListWidget
:param item: Item que se va a eliminar.
:type item: QListWidgetItem
"""
list.takeItem(list.row(item))
[documentos] def loadLayer(self, path, name = 'csv'):
"""Esta función crea una capa de QGIS, a partir de un archivo CSV, lanza una excepción en caso de que el archivo no sea válido.
:param path: Ruta del archivo CSV.
:type path: str
:param name: Nombre que se le asignará a la capa, por defecto es csv.
:type name: str
:returns: En caso de que no acurra ningun error, retorna la capa del archivo
CSV.
:rtype: QgsVectorLayer
"""
#Formating the uri
path = 'file:///' + path.replace('\\', '/') + CSV_SUFFIX
layer = QgsVectorLayer(path, name, 'delimitedtext')
if not layer.isValid():
raise Error('Invalid Layer')
return layer
[documentos] def errorDialog(selg, text, detail):
"""Dialogo de error que se lanzará cuando el usuario intente hacer una
operación que no esta permitida.
:param text: Identificador principal del error.
:type text: str
:param name: Información detallada del error.
:type name: str
"""
msg = QMessageBox()
msg.setIcon(QMessageBox.Critical)
msg.setText(text)
msg.setInformativeText(detail)
msg.setWindowTitle("Error")
msg.exec_()