Ejemplo Proyecto¶
En este ejemplo se crea una interfaz que permite seleccionar una carpeta para listar los archivos .lis (cir0, cir1 y cir2) que hay en ella. Finalmente, es posible seleccionar uno de estos archivos para graficar en la interfaz.
Note
Para descargar los archivos .lis, ingresar al archivo que quiere descargar. Dar click derecho al botón Raw
y después “guardar como…” o “guardar enlace como…”. Esto permite descargar los archivos.
Ejemplo¶
# -*- coding: utf-8 -*-
"""
Ejemplo de ventana que procesa archivos .lis de ATP
"""
#Importo las librerías necesarias
import os
import sys
from PyQt5 import QtWidgets, uic
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as Toolbar
import matplotlib.pyplot as plt
import math
class main(QtWidgets.QMainWindow):
"""
Esta es la clase principal
"""
def __init__(self, padre=None):
"""
Define la ventana y conecta los botones con los métodos
"""
QtWidgets.QMainWindow.__init__(self, padre)
uic.loadUi("EjemploProyecto.ui",self) #Carga archivo de designer
#Botones
self.psbCarpeta.clicked.connect(self.getDirectory) #Escoger carpeta
self.psbGraficar.clicked.connect(self.Graficar) #Graficar archivo
self.lwArchivos.itemClicked.connect(self.SelArchivo) #Selec archivo
#Crea las gráficas
self.figure1 = plt.figure(1)
self.canvas1 = FigureCanvas(self.figure1)
self.toolbar1 = Toolbar(self.canvas1, self)
self.figure2 = plt.figure(2)
self.canvas2 = FigureCanvas(self.figure2)
self.toolbar2 = Toolbar(self.canvas2, self)
#Espacio para graficar
self.mplwindow1.addWidget(self.toolbar1) #Widget para herramientas
self.mplwindow1.addWidget(self.canvas1) #Widget para graficar
self.mplwindow2.addWidget(self.toolbar2) #Widget para herramientas
self.mplwindow2.addWidget(self.canvas2) #Widget para graficar
self.ax1 = self.figure1.add_subplot(111)
self.ax2 = self.figure2.add_subplot(111)
def getDirectory(self):
"""
Obtiene y muestra la ruta de la carpeta seleccionada en el dialogo,
también lista los archivos .lis que hay en la carpeta
"""
self.cwd = os.getcwd() #Ubicación actual
#Crea el diálogo para seleccionar carpeta
self.carpeta = QtWidgets.QFileDialog.getExistingDirectory(
None,'Seleccionar Carpeta',self.cwd,
QtWidgets.QFileDialog.ShowDirsOnly)
#Borra los nombres de archivos que se están mostrando en la lista
self.lwArchivos.clear()
#Evalúa si seleccionó una carpeta
if len(self.carpeta) > 1:
#Cambia el texto en el label de la ruta
self.lblRuta.setText("Ruta archivo: "+ self.carpeta)
#Lista de los archivos .lis en la carpeta seleccionada
self.listArchivos = os.listdir(self.carpeta)
for i in self.listArchivos:
if ".lis" in i:
self.lwArchivos.addItem(i)
def SelArchivo(self,item):
"""
Obtiene y muestra la ruta del archivo seleccionado de la lista
"""
text = item.text() #Nombre del archivo seleccionado
self.ruta = os.path.join(self.carpeta,text) #Ruta del archivo
#Cambia el texto en el label de la ruta
self.lblRuta.setText("Ruta archivo: "+self.ruta)
def valorRMS(self,lista):
"""
Recibr una lista con valores numéricos y calcula el valor RMS
discreto
"""
total = 0
for i in lista:
total = total + i**2
return math.sqrt(total/len(lista))
def Graficar(self):
file = open(self.ruta,encoding="ISO-8859-1") #Abre el archivo
#Lee las primeras líneas y obtiene información de cuantas señales hay
for line in file:
if "Column headings for the" in line:
numVar = int(line[24:27])
datos = []
for i in range(numVar+1):
datos.append([])
if " 0" in line[0:7]:
lista_tmp = line.split()
for i in range(1,len(lista_tmp)):
datos[i-1].append(float(lista_tmp[i]))
break
#Lee los datos de las señales y guarda la información en listas
for line in file:
if "\n" == line:
break
if not(" % % % % % %" in line or " Done dumping" in line):
lista_tmp = line.split()
for i in range(1,len(lista_tmp)):
datos[i-1].append(float(lista_tmp[i]))
else:
continue
file.close()
t = datos[0] #tiempo
v = datos[1] #Voltaje
#Encontrar número de datos en un periodo n
for i in range(len(v)):
if v[i] >= 0 and v[i+1] < 0:
i1 = i
break
for i in range(i+1,len(v)):
if v[i] >= 0 and v[i+1] < 0:
i2 = i
break
Vrms = [] #Valores RMS discretos
n = int((i2-i1)/2)
for i in range(0,len(v)):
if i>=n:
Vrms.append(self.valorRMS(v[i-n:i]))
#Descarta la gráfica anterior
self.ax1.cla()
#Grafica la señal
self.ax1.plot(t, v, label="Voltage signal")
self.ax1.plot(t[n:], Vrms, label="Voltage RMS")
self.ax1.set_title("Voltage vs Time")
self.ax1.set_xlabel("Time (s)") #
self.ax1.set_ylabel("Voltage (V)")
self.ax1.grid(True)
self.ax1.legend(loc="best")
self.canvas1.draw()
#Encuentra tiempo caída de tensión
Vref = max(Vrms)
for i in range(len(Vrms)):
if Vrms[i] <= Vref *0.9:
y1 = i
break
for i in range(i+1,len(Vrms)):
if Vrms[i] >= Vref*0.9:
y2 = i
break
#Descarta la gráfica anterior
self.ax2.cla()
#Grafica la parte de la caída en la señal
self.ax2.plot(t[y1-n*2:y2+n*3], v[y1-n*2:y2+n*3], label="Voltage signal")
self.ax2.plot(t[n+y1-n*2:y2+n*3+n], Vrms[y1-n*2:y2+n*3], label="Voltage RMS")
self.ax2.set_title("Voltage vs Time")
self.ax2.set_xlabel("Time (s)") #
self.ax2.set_ylabel("Voltage(V)")
self.ax2.grid(True)
self.ax2.legend(loc="best")
self.canvas2.draw()
#EJECUTA LA APLICACIÓN
app = QtWidgets.QApplication(sys.argv)
myWindow = main(None)
myWindow.show()
sys.exit(app.exec_())