Beispiel #1
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)

        self.lista = []
        self.listaMenor = []

        self.capturador = Capturador()

        self.ui.pushButton.clicked.connect(self.click)
        self.ui.pushButton_2.clicked.connect(self.mostrar)

        self.ui.actionGuardar.triggered.connect(self.guardar)
        self.ui.actionAbrir_2.triggered.connect(self.abrir)
        self.ui.actionMostar.triggered.connect(self.mostarParticulasPuntos)

        self.ui.actionPuntos_Cercanos.triggered.connect(self.puntos_cercanos)

        self.ui.pushButton_3.clicked.connect(self.ordenar_velocidad)

        self.ui.pushButton_4.clicked.connect(self.ordenar_distancia)

    @Slot()
    def puntos_cercanos(self):
        for i in range(len(self.lista) - 1):
            particulaMenor = self.lista[i + 1]

            for j in range(len(self.lista) - 1):
                particula2 = self.lista[j]
                if (j == 0):
                    auxDistancia = math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2))
                    aux = {'origen': particulaMenor, 'destino': particula2}

                if ((math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2)) < auxDistancia)
                        and (particulaMenor != particula2)):
                    auxDistancia = math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2))
                    aux = {'origen': particulaMenor, 'destino': particula2}
            self.listaMenor.append(aux)
            self.dibujar()

    @Slot()
    def mostarParticulasPuntos(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_velocidad()
        for particula in self.capturador.lista:
            self.lista.append({
                'x': particula.origenX,
                'y': particula.origenY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.lista.append({
                'x': particula.destinoX,
                'y': particula.destinoY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addEllipse(
                particula.origenX, particula.origenY, 5, 5, self.pen,
                QBrush(
                    QColor(particula.red, 10, particula.green,
                           particula.blue)))

    @Slot()
    def ordenar_velocidad(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_velocidad()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    def dibujar(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_distancia()

        for new in self.listaMenor:
            self.scene.addEllipse(
                new['origen']['x'], new['origen']['y'], 5, 5, self.pen,
                QBrush(
                    QColor(new['origen']['color']['red'], 10,
                           new['origen']['color']['green'],
                           new['origen']['color']['blue'])))
            self.pen.setColor(
                QColor(new['origen']['color']['red'],
                       new['origen']['color']['green'],
                       new['origen']['color']['blue']))
            self.scene.addLine(new['origen']['x'], new['origen']['y'],
                               new['destino']['x'], new['destino']['y'],
                               self.pen)

    @Slot()
    def ordenar_distancia(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_distancia()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    @Slot()
    def guardar(self):
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        file = QFileDialog.getSaveFileName(self, 'Guardar archivo...', '.',
                                           'JSON (*.json)')
        print(file)
        self.capturador.guardar(file[0], self.pen, self.scene)

    @Slot()
    def abrir(self):
        file = QFileDialog.getOpenFileName(self, 'Abrir archivo', '.',
                                           'JSON (*.json)')
        self.capturador.recuperar(file[0])

    @Slot()
    def mostrar(self):
        self.scene.clear()
        self.scene.addLine(0, 0, 499, 0, self.pen)
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2
        #for particula in self.capturador.lista:
        #   self.ui.plainTextEdit.insertPlainText(str(particula))
        #  self.pen.setColor(QColor(particula.red, particula.green, particula.blue))
        # self.scene.addEllipse(particula.origenX, particula.origenY, 5, 5, self.pen, QBrush(QColor(particula.red, 10,particula.green, particula.blue)))
        #self.scene.addLine(particula.origenX, particula.origenY, particula.destinoX, particula.destinoY, self.pen)
        #self.paqueteria.mostrar()

    @Slot()
    def click(self):

        id = self.ui.lineEdit.text()
        origenX = self.ui.lineEdit_2.text()
        origenY = self.ui.lineEdit_6.text()
        destinoX = self.ui.lineEdit_3.text()
        destinoY = self.ui.lineEdit_7.text()
        velocidad = self.ui.lineEdit_4.text()
        red = self.ui.lineEdit_5.text()
        green = self.ui.lineEdit_8.text()
        blue = self.ui.lineEdit_9.text()

        print(id, origenX, origenY, destinoX, destinoY, velocidad, red, green,
              blue)

        partiula = Particula()
        partiula.id = id
        partiula.origenX = int(origenX)
        partiula.origenY = int(origenY)
        partiula.destinoX = int(destinoX)
        partiula.destinoY = int(destinoY)
        partiula.distancia = math.sqrt(
            pow((int(destinoX) - int(origenX)), 2) +
            pow((int(destinoY) - int(origenY)), 2))
        partiula.red = int(red)
        partiula.green = int(green)
        partiula.blue = int(blue)
        partiula.velocidad = int(velocidad)

        self.capturador.agregar(partiula)

        msg = QMessageBox.information(
            self, 'Exito', 'Se agrego paquete con exito'
        )  #Ventana de mensaje de la libreria QMessageBox

        self.ui.lineEdit.clear()  #Limpiar campos
        self.ui.lineEdit_2.clear()
        self.ui.lineEdit_3.clear()
        self.ui.lineEdit_4.clear()
        self.ui.lineEdit_5.clear()
        self.ui.lineEdit_6.clear()
        self.ui.lineEdit_7.clear()
        self.ui.lineEdit_8.clear()
        self.ui.lineEdit_9.clear()
Beispiel #2
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)

        self.capturador = Capturador()

        self.ui.pushButton.clicked.connect(self.click)
        self.ui.pushButton_2.clicked.connect(self.mostrar)

        self.ui.actionGuardar.triggered.connect(self.guardar)
        self.ui.actionAbrir_2.triggered.connect(self.abrir)

        self.ui.pushButton_3.clicked.connect(self.ordenar_velocidad)

        self.ui.pushButton_4.clicked.connect(self.ordenar_distancia)

    @Slot()
    def ordenar_velocidad(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_velocidad()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    @Slot()
    def ordenar_distancia(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_distancia()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    @Slot()
    def guardar(self):
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        file = QFileDialog.getSaveFileName(self, 'Guardar archivo...', '.',
                                           'JSON (*.json)')
        print(file)
        self.capturador.guardar(file[0], self.pen, self.scene)

    @Slot()
    def abrir(self):
        file = QFileDialog.getOpenFileName(self, 'Abrir archivo', '.',
                                           'JSON (*.json)')
        self.capturador.recuperar(file[0])

    @Slot()
    def mostrar(self):
        self.scene.clear()
        self.scene.addLine(0, 0, 499, 0, self.pen)
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2
        #for particula in self.capturador.lista:
        #   self.ui.plainTextEdit.insertPlainText(str(particula))
        #  self.pen.setColor(QColor(particula.red, particula.green, particula.blue))
        # self.scene.addEllipse(particula.origenX, particula.origenY, 5, 5, self.pen, QBrush(QColor(particula.red, 10,particula.green, particula.blue)))
        #self.scene.addLine(particula.origenX, particula.origenY, particula.destinoX, particula.destinoY, self.pen)
        #self.paqueteria.mostrar()

    @Slot()
    def click(self):

        id = self.ui.lineEdit.text()
        origenX = self.ui.lineEdit_2.text()
        origenY = self.ui.lineEdit_6.text()
        destinoX = self.ui.lineEdit_3.text()
        destinoY = self.ui.lineEdit_7.text()
        velocidad = self.ui.lineEdit_4.text()
        red = self.ui.lineEdit_5.text()
        green = self.ui.lineEdit_8.text()
        blue = self.ui.lineEdit_9.text()

        print(id, origenX, origenY, destinoX, destinoY, velocidad, red, green,
              blue)

        partiula = Particula()
        partiula.id = id
        partiula.origenX = int(origenX)
        partiula.origenY = int(origenY)
        partiula.destinoX = int(destinoX)
        partiula.destinoY = int(destinoY)
        partiula.distancia = math.sqrt(
            pow((int(destinoX) - int(origenX)), 2) +
            pow((int(destinoY) - int(origenY)), 2))
        partiula.red = int(red)
        partiula.green = int(green)
        partiula.blue = int(blue)
        partiula.velocidad = int(velocidad)

        self.capturador.agregar(partiula)

        msg = QMessageBox.information(
            self, 'Exito', 'Se agrego paquete con exito'
        )  #Ventana de mensaje de la libreria QMessageBox

        self.ui.lineEdit.clear()  #Limpiar campos
        self.ui.lineEdit_2.clear()
        self.ui.lineEdit_3.clear()
        self.ui.lineEdit_4.clear()
        self.ui.lineEdit_5.clear()
        self.ui.lineEdit_6.clear()
        self.ui.lineEdit_7.clear()
        self.ui.lineEdit_8.clear()
        self.ui.lineEdit_9.clear()
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)

        self.lista = []
        self.listaMenor = []
        self.grafoG = dict()
        self.grafoN = dict()
        self.pila = []
        self.cola = []
        self.visitados = []
        self.capturador = Capturador()
        self.disjointSet = []
        self.grafoKruskal = dict()

        self.ui.pushButton.clicked.connect(self.click)
        self.ui.pushButton_2.clicked.connect(self.mostrar)

        self.ui.actionGuardar.triggered.connect(self.guardar)
        self.ui.actionAbrir_2.triggered.connect(self.abrir)
        self.ui.actionMostar.triggered.connect(self.mostarParticulasPuntos)

        self.ui.actionPuntos_Cercanos.triggered.connect(self.puntos_cercanos)

        self.ui.pushButton_3.clicked.connect(self.ordenar_velocidad)

        self.ui.pushButton_4.clicked.connect(self.ordenar_distancia)

        self.ui.pushButton_5.clicked.connect(self.grafo)

        self.ui.pushButton_6.clicked.connect(self.rProfundidad)

        self.ui.pushButton_7.clicked.connect(self.rAnchura)

        self.ui.pushButton_8.clicked.connect(self.algoritmoPrim)

        self.ui.pushButton_9.clicked.connect(self.mostrarGrafo)

        self.ui.pushButton_10.clicked.connect(self.mostrarGrafoG)

        self.ui.actionkrustal.triggered.connect(self.kruskal)

    @Slot()
    def kruskal(self):
        self.visitados = []
        self.grafoN = dict()
        self.llenarGrafo()
        self.pq = PriorityQueue()
        self.disjointSet = []
        self.grafoKruskal = dict()

        for particula in self.capturador.lista:
            self.pq.put([
                particula.distancia,
                ((particula.origenX, particula.origenY), (particula.destinoX,
                                                          particula.destinoY))
            ])

        #self.llenarDisjointSet()

        #for particula in self.capturador.lista:
        #    self.pq.put([particula.distancia,((particula.origenX,particula.origenY),(particula.destinoX,particula.destinoY))])

        while not self.pq.empty():
            actual = self.pq.get()

            if len(self.disjointSet) == 0:
                self.disjointSet.append(actual[1][0])

            print("Elemento A Buscar: " + str(actual[1][0]), str(actual[1][1]),
                  str(actual[0]))
            print("Conjunto")
            print(self.disjointSet)

            if actual[1][1] not in self.disjointSet or actual[1][
                    0] not in self.disjointSet:
                self.llenarGrafoKrustal(actual[1][0], actual[1][1], actual[0])
                self.disjointSet.append(actual[1][1])
                self.disjointSet.append(actual[1][0])

        print("Grafo Krustal  -------------------")
        print(str(self.grafoKruskal))

        self.mostrarGrafoG()

        print("Grafo Original ---------")
        print(str(self.grafoN))

        print("----------------------------")
        self.pen.setWidth(3)
        for item in self.grafoKruskal.items():
            print(item)
            for item2 in item[1]:
                self.pen.setColor(QColor(0, 0, 0))
                self.scene.addLine(item[0][0], item[0][1], item2[0][0],
                                   item2[0][1], self.pen)
                print(item[0][0], item[0][1], item2[0][0], item2[0][1])
        self.pen.setWidth(1)

    def union(self, set1, set2):
        root1 = self.find(set1)
        root2 = self.find(set2)
        self.parent[root1] = root2

    def llenarDisjointSet(self):
        pqAux = self.pq

        while not pqAux.empty():
            actual = pqAux.get()
            #print(actual[1][0],actual[1][1])
            if actual[1][0] not in self.disjointSet:
                self.disjointSet.append(actual[1][0])
            if actual[1][1] not in self.disjointSet:
                self.disjointSet.append(actual[1][1])

    @Slot()
    def mostrarGrafoG(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_velocidad()
        for particula in self.capturador.lista:
            self.lista.append({
                'x': particula.origenX,
                'y': particula.origenY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.lista.append({
                'x': particula.destinoX,
                'y': particula.destinoY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addEllipse(
                particula.origenX, particula.origenY, 5, 5, self.pen,
                QBrush(
                    QColor(particula.red, 10, particula.green,
                           particula.blue)))
            self.scene.addLine(particula.origenX, particula.origenY,
                               particula.destinoX, particula.destinoY,
                               self.pen)

    @Slot()
    def mostrarGrafo(self):
        str = pprint.pformat(self.grafoN, width=40)
        self.ui.plainTextEdit.insertPlainText(str)

        self.mostrarGrafoG()

        self.pen.setWidth(3)
        for origen in self.grafoN:
            for destino in self.grafoN[origen]:
                self.pen.setColor(QColor(0, 0, 0))
                self.scene.addLine(origen[0], origen[1], destino[0][0],
                                   destino[0][1], self.pen)
        self.pen.setWidth(1)

    @Slot()
    def algoritmoPrim(self):
        self.visitados = []
        self.grafoN = dict()
        self.llenarGrafo()
        pq = PriorityQueue()
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())

        origen = (origenX, origenY)

        self.visitados.append(origen)

        for actual in self.grafoG[origen]:
            pq.put([actual[1], (origen, actual[0])])
        #distancia, origen. Destino

        while not pq.empty():
            actual = pq.get()
            print("Actual")
            print(actual[1][1])

            if self.buscarPila(actual[1][1]) == False:
                self.visitados.append(actual[1][1])

                print("Adyacentes")
                for adyacentes in self.grafoG[actual[1][1]]:
                    print(adyacentes[1], actual[1][1], adyacentes[0])
                    pq.put([adyacentes[1], (actual[1][1], adyacentes[0])])
                #NodoOrigen, NodoOrigen, Peso
                self.llenarGrafoPrim(actual[1][0], actual[1][1], actual[0])

    def llenarGrafoKrustal(self, origen, destino, distancia):
        if origen in self.grafoKruskal:
            self.grafoKruskal[origen].append((destino, distancia))
        else:
            self.grafoKruskal[origen] = [(destino, distancia)]
        if destino in self.grafoKruskal:
            self.grafoKruskal[destino].append((origen, distancia))
        else:
            self.grafoKruskal[destino] = [(origen, distancia)]

    def llenarGrafoPrim(self, origen, destino, distancia):
        if origen in self.grafoN:
            self.grafoN[origen].append((destino, distancia))
        else:
            self.grafoN[origen] = [(destino, distancia)]
        if destino in self.grafoN:
            self.grafoN[destino].append((origen, distancia))
        else:
            self.grafoN[destino] = [(origen, distancia)]

    def buscarPila(self, busqueda):
        for actual in self.visitados:
            if actual == busqueda:
                return True
        return False

    @Slot()
    def rAnchura(self):
        self.ui.plainTextEdit.clear()
        self.llenarGrafo()
        self.visitados = []
        self.scene.clear()
        self.scene = QGraphicsScene()
        self.ui.graphicsView.setScene(self.scene)
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())
        self.cola.append((origenX, origenY))

        while len(self.cola) != 0:
            actual = self.cola[0]
            print(actual)
            self.cola.pop(0)
            print(actual)
            if self.buscarPila(actual) == False:
                self.visitados.append(actual)
                print(actual)
                str = pprint.pformat(actual)
                self.ui.plainTextEdit.insertPlainText(str + '\n')
                for vecino in self.grafoG[actual]:
                    if (self.buscarPila(vecino) == False):
                        self.cola.append(vecino[0])

    def llenarGrafo(self):
        self.grafoG = dict()
        for particula in self.capturador.lista:
            origen = (particula.origenX, particula.origenY)
            destino = (particula.destinoX, particula.destinoY)
            if origen in self.grafoG:
                self.grafoG[origen].append((destino, particula.distancia))
            else:
                self.grafoG[origen] = [(destino, particula.distancia)]
            if destino in self.grafoG:
                self.grafoG[destino].append((origen, particula.distancia))
            else:
                self.grafoG[destino] = [(origen, particula.distancia)]

    @Slot()
    def rProfundidad(self):
        self.ui.plainTextEdit.clear()
        self.llenarGrafo()
        self.visitados = []
        self.scene.clear()
        self.scene = QGraphicsScene()
        self.ui.graphicsView.setScene(self.scene)
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())
        self.pila.append((origenX, origenY))

        while len(self.pila) != 0:
            actual = self.pila[len(self.pila) - 1]
            self.pila.pop()
            if self.buscarPila(actual) == False:
                self.visitados.append(actual)
                print(actual)
                str = pprint.pformat(actual)
                self.ui.plainTextEdit.insertPlainText(str + '\n')
                for vecino in self.grafoG[actual]:
                    if (self.buscarPila(vecino) == False):
                        self.pila.append(vecino[0])

    @Slot()
    def grafo(self):
        # {}
        self.scene.clear()
        self.scene = QGraphicsScene()
        self.ui.graphicsView.setScene(self.scene)
        for particula in self.capturador.lista:
            origen = (particula.origenX, particula.origenY)
            destino = (particula.destinoX, particula.destinoY)
            if origen in self.grafoG:
                self.grafoG[origen].append((destino, particula.distancia))
            else:
                self.grafoG[origen] = [(destino, particula.distancia)]
            if destino in self.grafoG:
                self.grafoG[destino].append((origen, particula.distancia))
            else:
                self.grafoG[destino] = [(origen, particula.distancia)]
        str = pprint.pformat(self.grafoG, width=40)
        self.ui.plainTextEdit.insertPlainText(str)

    @Slot()
    def puntos_cercanos(self):
        self.listaMenor = []
        for i in range(len(self.lista) - 1):
            particulaMenor = self.lista[i + 1]

            for j in range(len(self.lista) - 1):
                particula2 = self.lista[j]
                if (j == 0):
                    auxDistancia = math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2))
                    aux = {'origen': particulaMenor, 'destino': particula2}

                if ((math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2)) < auxDistancia)
                        and (particulaMenor != particula2)):
                    auxDistancia = math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2))
                    aux = {'origen': particulaMenor, 'destino': particula2}
            self.listaMenor.append(aux)
            self.dibujar()

    @Slot()
    def mostarParticulasPuntos(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setWidth(1)

        for particula in self.capturador.lista:

            print(particula.origenX, particula.origenY)
            ## Problema
            ## Si hay un nodo que no tenga origen solo nodos que van hacia el no se dibuja
            ## Soluccion
            ## comparar en un nueva lista si el destino se encuentra en la lista de origenes
            ## si no se encuentra dibujar

            ##posible solucion
            self.scene.addEllipse(
                particula.destinoX, particula.destinoY, 5, 5, self.pen,
                QBrush(QColor(particula.red, particula.green, particula.blue)))
            self.scene.addEllipse(
                particula.origenX, particula.origenY, 5, 5, self.pen,
                QBrush(QColor(particula.red, particula.green, particula.blue)))

            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.lista.append({
                'x': particula.origenX,
                'y': particula.origenY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.lista.append({
                'x': particula.destinoX,
                'y': particula.destinoY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })

    @Slot()
    def ordenar_velocidad(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_velocidad()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    def dibujar(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_distancia()

        for new in self.listaMenor:
            self.scene.addEllipse(
                new['origen']['x'], new['origen']['y'], 5, 5, self.pen,
                QBrush(
                    QColor(new['origen']['color']['red'], 10,
                           new['origen']['color']['green'],
                           new['origen']['color']['blue'])))
            self.pen.setColor(
                QColor(new['origen']['color']['red'],
                       new['origen']['color']['green'],
                       new['origen']['color']['blue']))
            self.scene.addLine(new['origen']['x'], new['origen']['y'],
                               new['destino']['x'], new['destino']['y'],
                               self.pen)

    @Slot()
    def ordenar_distancia(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_distancia()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    @Slot()
    def guardar(self):
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        file = QFileDialog.getSaveFileName(self, 'Guardar archivo...', '.',
                                           'JSON (*.json)')
        print(file)
        self.capturador.guardar(file[0], self.pen, self.scene)

    @Slot()
    def abrir(self):
        file = QFileDialog.getOpenFileName(self, 'Abrir archivo', '.',
                                           'JSON (*.json)')
        self.capturador.recuperar(file[0])

    @Slot()
    def mostrar(self):
        self.scene.clear()
        self.scene.addLine(0, 0, 499, 0, self.pen)
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    @Slot()
    def click(self):

        id = self.ui.lineEdit.text()
        origenX = self.ui.lineEdit_2.text()
        origenY = self.ui.lineEdit_6.text()
        destinoX = self.ui.lineEdit_3.text()
        destinoY = self.ui.lineEdit_7.text()
        velocidad = self.ui.lineEdit_4.text()
        red = self.ui.lineEdit_5.text()
        green = self.ui.lineEdit_8.text()
        blue = self.ui.lineEdit_9.text()

        print(id, origenX, origenY, destinoX, destinoY, velocidad, red, green,
              blue)

        partiula = Particula()
        partiula.id = id
        partiula.origenX = int(origenX)
        partiula.origenY = int(origenY)
        partiula.destinoX = int(destinoX)
        partiula.destinoY = int(destinoY)
        partiula.distancia = math.sqrt(
            pow((int(destinoX) - int(origenX)), 2) +
            pow((int(destinoY) - int(origenY)), 2))
        partiula.red = int(red)
        partiula.green = int(green)
        partiula.blue = int(blue)
        partiula.velocidad = int(velocidad)

        self.capturador.agregar(partiula)

        msg = QMessageBox.information(
            self, 'Exito', 'Se agrego paquete con exito'
        )  #Ventana de mensaje de la libreria QMessageBox

        self.ui.lineEdit.clear()  #Limpiar campos
        self.ui.lineEdit_2.clear()
        self.ui.lineEdit_3.clear()
        self.ui.lineEdit_4.clear()
        self.ui.lineEdit_5.clear()
        self.ui.lineEdit_6.clear()
        self.ui.lineEdit_7.clear()
        self.ui.lineEdit_8.clear()
        self.ui.lineEdit_9.clear()
Beispiel #4
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.capturador = Capturador()

        self.ui.pushButton.clicked.connect(self.click)
        self.ui.pushButton_2.clicked.connect(self.mostrar)

        self.ui.actionGuardar.triggered.connect(self.guardar)
        self.ui.actionAbrir_2.triggered.connect(self.abrir)

    @Slot()
    def guardar(self):
        file = QFileDialog.getSaveFileName(self, 'Guardar archivo...', '.',
                                           'JSON (*.json)')
        print(file)
        self.capturador.guardar(file[0])

    @Slot()
    def abrir(self):
        file = QFileDialog.getOpenFileName(self, 'Abrir archivo', '.',
                                           'JSON (*.json)')
        self.capturador.recuperar(file[0])

    @Slot()
    def mostrar(self):
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
        #self.paqueteria.mostrar()

    @Slot()
    def click(self):
        id = self.ui.lineEdit.text()
        origenX = self.ui.lineEdit_2.text()
        origenY = self.ui.lineEdit_6.text()
        destinoX = self.ui.lineEdit_3.text()
        destinoY = self.ui.lineEdit_7.text()
        velocidad = self.ui.lineEdit_4.text()
        red = self.ui.lineEdit_5.text()
        green = self.ui.lineEdit_8.text()
        blue = self.ui.lineEdit_9.text()

        print(id, origenX, origenY, destinoX, destinoY, velocidad, red, green,
              blue)

        partiula = Particula()
        partiula.id = id
        partiula.origenX = int(origenX)
        partiula.origenY = int(origenY)
        partiula.destinoX = int(destinoX)
        partiula.destinoY = int(destinoY)
        partiula.distancia = math.sqrt(
            pow((int(destinoX) - int(origenX)), 2) +
            pow((int(destinoY) - int(origenY)), 2))
        partiula.red = int(red)
        partiula.green = int(green)
        partiula.blue = int(blue)
        partiula.velocidad = int(velocidad)

        self.capturador.agregar(partiula)

        msg = QMessageBox.information(
            self, 'Exito', 'Se agrego paquete con exito'
        )  #Ventana de mensaje de la libreria QMessageBox

        self.ui.lineEdit.clear()  #Limpiar campos
        self.ui.lineEdit_2.clear()
        self.ui.lineEdit_3.clear()
        self.ui.lineEdit_4.clear()
        self.ui.lineEdit_5.clear()
        self.ui.lineEdit_6.clear()
        self.ui.lineEdit_7.clear()
        self.ui.lineEdit_8.clear()
        self.ui.lineEdit_9.clear()
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)

        self.lista = []
        self.listaMenor = []
        self.grafoG = dict()
        self.grafoN = dict()
        self.pila = []
        self.cola = []
        self.visitados = []
        self.capturador = Capturador()
        self.disjointSet = []
        self.grafoKruskal = dict()

        self.ui.pushButton.clicked.connect(self.click)
        self.ui.pushButton_2.clicked.connect(self.mostrar)

        self.ui.actionGuardar.triggered.connect(self.guardar)
        self.ui.actionAbrir_2.triggered.connect(self.abrir)
        self.ui.actionMostar.triggered.connect(self.mostarParticulasPuntos)

        self.ui.actionPuntos_Cercanos.triggered.connect(self.puntos_cercanos)

        self.ui.pushButton_3.clicked.connect(self.ordenar_velocidad)

        self.ui.pushButton_4.clicked.connect(self.ordenar_distancia)

        self.ui.pushButton_5.clicked.connect(self.grafo)

        self.ui.pushButton_6.clicked.connect(self.rProfundidad)

        self.ui.pushButton_7.clicked.connect(self.rAnchura)

        self.ui.pushButton_8.clicked.connect(self.algoritmoPrim)

        self.ui.pushButton_9.clicked.connect(self.mostrarGrafo)

        self.ui.pushButton_10.clicked.connect(self.mostrarGrafoG)

        self.ui.actionkrustal.triggered.connect(self.kruskal)

        self.ui.actionDijkstra.triggered.connect(self.disjkstra)

        self.ui.actionCamino_Dijkstra.triggered.connect(self.camino_disjktra)

    @Slot()
    def camino_disjktra(self):
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())

        destino = (origenX, origenY)
        print("Camino")

        siguiente = destino

        var = True
        caminoNew = []
        caminoNew.append(destino)

        while var:
            for item in self.camino:
                if siguiente == item[0] and siguiente == item[1]:
                    caminoNew.append(item[1])
                    var = False
                    break
                    return
                elif item[0] == siguiente:
                    caminoNew.append(item[1])
                    siguiente = item[1]

        nuev = caminoNew.pop()

        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(3)
        while len(caminoNew) > 0:
            dest = caminoNew.pop()
            self.scene.addLine(nuev[0], nuev[1], dest[0], dest[1], self.pen)
            print(nuev, dest)
            nuev = dest
        self.pen.setWidth(1)

    @Slot()
    def disjkstra(self):
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())

        self.pq = PriorityQueue()
        self.disjointSet = []
        self.arregloDistancias = []

        origen = (origenX, origenY)

        self.llenarGrafo()

        # obtenemos Todos los Nodos sin repetir en una lista disjointSet
        for particula in self.capturador.lista:
            if (particula.origenX == origenX and particula.origenY == origenY):
                self.pq.put([
                    particula.distancia,
                    ((particula.origenX, particula.origenY),
                     (particula.destinoX, particula.destinoY))
                ])
            else:
                self.pq.put([
                    9999,
                    ((particula.origenX, particula.origenY),
                     (particula.destinoX, particula.destinoY))
                ])

        self.llenarDisjointSet()
        #Fin

        #Tenemos Todos los minimos desde el orgien los demas que no hay conexion directa es su peso 9999
        '''for particula in self.capturador.lista:
            if (particula.origenX == origenX and particula.origenY == origenY):
                if particula not in  self.arregloDistancias:
                    self.arregloDistancias.append([(particula.destinoX, particula.destinoY),particula.distancia])
        '''
        self.arregloDistancias.append([origen, 0])

        for item in self.disjointSet:
            if self.buscarEnArregloDistancia(item):
                self.arregloDistancias.append([item, 9999])

        print("Arreglo De Distancias")
        for item in self.arregloDistancias:
            print(item)

        #fin#

        #se crea un Camino
        self.camino = []
        for item in self.arregloDistancias:
            if item[0] == origen:
                self.camino.append((item[0], item[0]))
            else:
                self.camino.append((item[0], 0))

        print("Camino")
        for item in self.camino:
            print(item)

        #se crea una lista ordenada y se agrega el origen con una distancia 0
        listaOrdenada = PriorityQueue()
        for item in self.arregloDistancias:
            if item[0] == origen:
                listaOrdenada.put([item[1], item[0]])

        #Miestras la Lista Ordenada no este vacia extraer el nodo revisar cada conexion del nodo
        while not listaOrdenada.empty():
            actual = listaOrdenada.get()
            print("Adyacentes----de-----")
            print(actual)
            for adyacentes in self.grafoG[actual[1]]:
                print("Adyacente")
                print(adyacentes)
                if self.buscarEnArregloDistancia(adyacentes[0]) == False:
                    elem = self.obtenerElemEnArregloDistancia(adyacentes[0])
                    ori = self.obtenerElemEnArregloDistancia(actual[1])
                    if adyacentes[1] + ori[1] < elem[1]:
                        idx = 0
                        for item in self.arregloDistancias:
                            if item[0] == adyacentes[0]:
                                self.arregloDistancias[idx] = ((elem[0],
                                                                adyacentes[1] +
                                                                ori[1]))
                            idx = idx + 1
                        '''
                            a el nodo elem[0] en su camino[elem[0]]:actual[1]
                            es un decir a el nodo que tenemos el elemento en su   
                        '''
                        idx = 0
                        for item in self.camino:
                            if item[0] == elem[0]:
                                self.camino[idx] = ((item[0], actual[1]))
                            idx = idx + 1
                        listaOrdenada.put([adyacentes[1] + ori[1], elem[0]])

            print("Camino New")
            for item in self.camino:
                print(item)
            print("arreglo distancias")
            for item in self.arregloDistancias:
                print(item)

    def obtenerElemEnArregloDistancia(self, item):
        for particula in self.arregloDistancias:
            print(particula)
        for particula in self.arregloDistancias:
            if item == particula[0]:
                return particula
        return False

    def buscarEnArregloDistancia(self, item):
        for particula in self.arregloDistancias:
            if item == particula[0]:
                return False
        return True

    @Slot()
    def kruskal(self):
        self.visitados = []
        self.grafoN = dict()
        self.llenarGrafo()
        self.pq = PriorityQueue()
        self.disjointSet = []
        self.grafoKruskal = dict()

        for particula in self.capturador.lista:
            self.pq.put([
                particula.distancia,
                ((particula.origenX, particula.origenY), (particula.destinoX,
                                                          particula.destinoY))
            ])

        self.llenarDisjointSet()

        for particula in self.capturador.lista:
            self.pq.put([
                particula.distancia,
                ((particula.origenX, particula.origenY), (particula.destinoX,
                                                          particula.destinoY))
            ])

        conjunto = DisjointSet(self.disjointSet)
        print(conjunto.get())

        while not self.pq.empty():
            actual = self.pq.get()

            if actual[1][0] not in conjunto.find(actual[1][1]):
                self.llenarGrafoKrustal(actual[1][0], actual[1][1], actual[0])
                print(actual[1][0], actual[1][1])
                conjunto.union(actual[1][0], actual[1][1])

        self.mostrarGrafoG()

        self.pen.setWidth(3)
        for item in self.grafoKruskal.items():
            print(item)
            for item2 in item[1]:
                self.pen.setColor(QColor(0, 0, 0))
                self.scene.addLine(item[0][0], item[0][1], item2[0][0],
                                   item2[0][1], self.pen)
                print(item[0][0], item[0][1], item2[0][0], item2[0][1])
        self.pen.setWidth(1)

    def llenarDisjointSet(self):
        pqAux = self.pq

        while not pqAux.empty():
            actual = pqAux.get()
            #print(actual[1][0],actual[1][1])
            if actual[1][0] not in self.disjointSet:
                self.disjointSet.append(actual[1][0])
            if actual[1][1] not in self.disjointSet:
                self.disjointSet.append(actual[1][1])

    @Slot()
    def mostrarGrafoG(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_velocidad()
        for particula in self.capturador.lista:
            self.lista.append({
                'x': particula.origenX,
                'y': particula.origenY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.lista.append({
                'x': particula.destinoX,
                'y': particula.destinoY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addEllipse(
                particula.origenX, particula.origenY, 5, 5, self.pen,
                QBrush(
                    QColor(particula.red, 10, particula.green,
                           particula.blue)))
            self.scene.addLine(particula.origenX, particula.origenY,
                               particula.destinoX, particula.destinoY,
                               self.pen)

    @Slot()
    def mostrarGrafo(self):
        str = pprint.pformat(self.grafoN, width=40)
        self.ui.plainTextEdit.insertPlainText(str)

        self.mostrarGrafoG()

        self.pen.setWidth(3)
        for origen in self.grafoN:
            for destino in self.grafoN[origen]:
                self.pen.setColor(QColor(0, 0, 0))
                self.scene.addLine(origen[0], origen[1], destino[0][0],
                                   destino[0][1], self.pen)
        self.pen.setWidth(1)

    @Slot()
    def algoritmoPrim(self):
        self.visitados = []
        self.grafoN = dict()
        self.llenarGrafo()
        pq = PriorityQueue()
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())

        origen = (origenX, origenY)

        self.visitados.append(origen)

        for actual in self.grafoG[origen]:
            pq.put([actual[1], (origen, actual[0])])
        #distancia, origen. Destino

        while not pq.empty():
            actual = pq.get()
            print("Actual")
            print(actual[1][1])

            if self.buscarPila(actual[1][1]) == False:
                self.visitados.append(actual[1][1])

                print("Adyacentes")
                for adyacentes in self.grafoG[actual[1][1]]:
                    print(adyacentes[1], actual[1][1], adyacentes[0])
                    pq.put([adyacentes[1], (actual[1][1], adyacentes[0])])
                #NodoOrigen, NodoOrigen, Peso
                self.llenarGrafoPrim(actual[1][0], actual[1][1], actual[0])

    def llenarGrafoKrustal(self, origen, destino, distancia):
        if origen in self.grafoKruskal:
            self.grafoKruskal[origen].append((destino, distancia))
        else:
            self.grafoKruskal[origen] = [(destino, distancia)]
        if destino in self.grafoKruskal:
            self.grafoKruskal[destino].append((origen, distancia))
        else:
            self.grafoKruskal[destino] = [(origen, distancia)]

    def llenarGrafoPrim(self, origen, destino, distancia):
        if origen in self.grafoN:
            self.grafoN[origen].append((destino, distancia))
        else:
            self.grafoN[origen] = [(destino, distancia)]
        if destino in self.grafoN:
            self.grafoN[destino].append((origen, distancia))
        else:
            self.grafoN[destino] = [(origen, distancia)]

    def buscarPila(self, busqueda):
        for actual in self.visitados:
            if actual == busqueda:
                return True
        return False

    @Slot()
    def rAnchura(self):
        self.ui.plainTextEdit.clear()
        self.llenarGrafo()
        self.visitados = []
        self.scene.clear()
        self.scene = QGraphicsScene()
        self.ui.graphicsView.setScene(self.scene)
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())
        self.cola.append((origenX, origenY))

        while len(self.cola) != 0:
            actual = self.cola[0]
            print(actual)
            self.cola.pop(0)
            print(actual)
            if self.buscarPila(actual) == False:
                self.visitados.append(actual)
                print(actual)
                str = pprint.pformat(actual)
                self.ui.plainTextEdit.insertPlainText(str + '\n')
                for vecino in self.grafoG[actual]:
                    if (self.buscarPila(vecino) == False):
                        self.cola.append(vecino[0])

    def llenarGrafo(self):
        self.grafoG = dict()
        for particula in self.capturador.lista:
            origen = (particula.origenX, particula.origenY)
            destino = (particula.destinoX, particula.destinoY)
            if origen in self.grafoG:
                self.grafoG[origen].append((destino, particula.distancia))
            else:
                self.grafoG[origen] = [(destino, particula.distancia)]
            if destino in self.grafoG:
                self.grafoG[destino].append((origen, particula.distancia))
            else:
                self.grafoG[destino] = [(origen, particula.distancia)]

    @Slot()
    def rProfundidad(self):
        self.ui.plainTextEdit.clear()
        self.llenarGrafo()
        self.visitados = []
        self.scene.clear()
        self.scene = QGraphicsScene()
        self.ui.graphicsView.setScene(self.scene)
        origenX = int(self.ui.lineEdit_2.text())
        origenY = int(self.ui.lineEdit_6.text())
        self.pila.append((origenX, origenY))

        while len(self.pila) != 0:
            actual = self.pila[len(self.pila) - 1]
            self.pila.pop()
            if self.buscarPila(actual) == False:
                self.visitados.append(actual)
                print(actual)
                str = pprint.pformat(actual)
                self.ui.plainTextEdit.insertPlainText(str + '\n')
                for vecino in self.grafoG[actual]:
                    if (self.buscarPila(vecino) == False):
                        self.pila.append(vecino[0])

    @Slot()
    def grafo(self):
        # {}
        self.scene.clear()
        self.scene = QGraphicsScene()
        self.ui.graphicsView.setScene(self.scene)
        for particula in self.capturador.lista:
            origen = (particula.origenX, particula.origenY)
            destino = (particula.destinoX, particula.destinoY)
            if origen in self.grafoG:
                self.grafoG[origen].append((destino, particula.distancia))
            else:
                self.grafoG[origen] = [(destino, particula.distancia)]
            if destino in self.grafoG:
                self.grafoG[destino].append((origen, particula.distancia))
            else:
                self.grafoG[destino] = [(origen, particula.distancia)]
        str = pprint.pformat(self.grafoG, width=40)
        self.ui.plainTextEdit.insertPlainText(str)

    @Slot()
    def puntos_cercanos(self):
        self.listaMenor = []
        for i in range(len(self.lista) - 1):
            particulaMenor = self.lista[i + 1]

            for j in range(len(self.lista) - 1):
                particula2 = self.lista[j]
                if (j == 0):
                    auxDistancia = math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2))
                    aux = {'origen': particulaMenor, 'destino': particula2}

                if ((math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2)) < auxDistancia)
                        and (particulaMenor != particula2)):
                    auxDistancia = math.sqrt(
                        pow((int(particula2['x']) -
                             int(particulaMenor['x'])), 2) +
                        pow((int(particula2['y']) -
                             int(particulaMenor['y'])), 2))
                    aux = {'origen': particulaMenor, 'destino': particula2}
            self.listaMenor.append(aux)
            self.dibujar()

    @Slot()
    def mostarParticulasPuntos(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setWidth(1)

        for particula in self.capturador.lista:

            print(particula.origenX, particula.origenY)
            ## Problema
            ## Si hay un nodo que no tenga origen solo nodos que van hacia el no se dibuja
            ## Soluccion
            ## comparar en un nueva lista si el destino se encuentra en la lista de origenes
            ## si no se encuentra dibujar

            ##posible solucion
            self.scene.addEllipse(
                particula.destinoX, particula.destinoY, 5, 5, self.pen,
                QBrush(QColor(particula.red, particula.green, particula.blue)))
            self.scene.addEllipse(
                particula.origenX, particula.origenY, 5, 5, self.pen,
                QBrush(QColor(particula.red, particula.green, particula.blue)))

            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.lista.append({
                'x': particula.origenX,
                'y': particula.origenY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })
            self.lista.append({
                'x': particula.destinoX,
                'y': particula.destinoY,
                'color': {
                    'red': particula.red,
                    'green': particula.green,
                    'blue': particula.blue
                }
            })

    @Slot()
    def ordenar_velocidad(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_velocidad()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    def dibujar(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        # self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_distancia()

        for new in self.listaMenor:
            self.scene.addEllipse(
                new['origen']['x'], new['origen']['y'], 5, 5, self.pen,
                QBrush(
                    QColor(new['origen']['color']['red'], 10,
                           new['origen']['color']['green'],
                           new['origen']['color']['blue'])))
            self.pen.setColor(
                QColor(new['origen']['color']['red'],
                       new['origen']['color']['green'],
                       new['origen']['color']['blue']))
            self.scene.addLine(new['origen']['x'], new['origen']['y'],
                               new['destino']['x'], new['destino']['y'],
                               self.pen)

    @Slot()
    def ordenar_distancia(self):
        self.scene.clear()
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        self.capturador.ordenar_distancia()
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    @Slot()
    def guardar(self):
        self.scene = QGraphicsScene()
        #self.scene.setSceneRect(0,500)
        self.ui.graphicsView.setScene(self.scene)

        self.pen = QPen()
        self.pen.setColor(QColor(0, 0, 0))
        self.pen.setWidth(1)
        file = QFileDialog.getSaveFileName(self, 'Guardar archivo...', '.',
                                           'JSON (*.json)')
        print(file)
        self.capturador.guardar(file[0], self.pen, self.scene)

    @Slot()
    def abrir(self):
        file = QFileDialog.getOpenFileName(self, 'Abrir archivo', '.',
                                           'JSON (*.json)')
        self.capturador.recuperar(file[0])

    @Slot()
    def mostrar(self):
        self.scene.clear()
        self.scene.addLine(0, 0, 499, 0, self.pen)
        y = 0
        for particula in self.capturador.lista:
            self.ui.plainTextEdit.insertPlainText(str(particula))
            self.pen.setColor(
                QColor(particula.red, particula.green, particula.blue))
            self.scene.addLine(0, y, particula.distancia, y, self.pen)
            y = y + 2

    @Slot()
    def click(self):

        id = self.ui.lineEdit.text()
        origenX = self.ui.lineEdit_2.text()
        origenY = self.ui.lineEdit_6.text()
        destinoX = self.ui.lineEdit_3.text()
        destinoY = self.ui.lineEdit_7.text()
        velocidad = self.ui.lineEdit_4.text()
        red = self.ui.lineEdit_5.text()
        green = self.ui.lineEdit_8.text()
        blue = self.ui.lineEdit_9.text()

        print(id, origenX, origenY, destinoX, destinoY, velocidad, red, green,
              blue)

        partiula = Particula()
        partiula.id = id
        partiula.origenX = int(origenX)
        partiula.origenY = int(origenY)
        partiula.destinoX = int(destinoX)
        partiula.destinoY = int(destinoY)
        partiula.distancia = math.sqrt(
            pow((int(destinoX) - int(origenX)), 2) +
            pow((int(destinoY) - int(origenY)), 2))
        partiula.red = int(red)
        partiula.green = int(green)
        partiula.blue = int(blue)
        partiula.velocidad = int(velocidad)

        self.capturador.agregar(partiula)

        msg = QMessageBox.information(
            self, 'Exito', 'Se agrego paquete con exito'
        )  #Ventana de mensaje de la libreria QMessageBox

        self.ui.lineEdit.clear()  #Limpiar campos
        self.ui.lineEdit_2.clear()
        self.ui.lineEdit_3.clear()
        self.ui.lineEdit_4.clear()
        self.ui.lineEdit_5.clear()
        self.ui.lineEdit_6.clear()
        self.ui.lineEdit_7.clear()
        self.ui.lineEdit_8.clear()
        self.ui.lineEdit_9.clear()