def remover_nodo(self): try: mensaje("remover_nodo") numero_tipo = entrada(">>> ") while numero_tipo.strip() not in Tupla("0", "1", "2", "3", "4"): mensaje("error") numero_tipo = entrada(">>> ") print("-" * 80) grupos = Tupla(self.generadoras, self.elevadoras, self.transmision, self.distribucion, self.casas) grupo = grupos[int(numero_tipo)] numero_nodo = input_lista( grupo.valores(), f">>> " f"{self.nombres[int(numero_tipo)]}: ") nodo_ = grupo.valores()[numero_nodo] borrado = grupo.pop(nodo_.id).valor print(f"Se quitó el nodo: {borrado}") except Volver: self.remover_nodo()
def consulta(self): try: opcion = mensaje("consultas") if int(opcion) == 0: mensaje("consumo_total") respuesta = input_lista(self.comunas, otro=True) if respuesta == "*": comuna = entrada(">>> Comuna: ").strip().upper() else: comuna = self.comunas[respuesta] consumo, porcentaje = self.consumo_total(comuna) print(f"La comuna {comuna} tiene un consumo de " f"{consumo} kW (un {round(porcentaje, 2)}% del " f"total)") elif int(opcion) in Tupla(1, 2): mensaje("mayor_menor_consumo") sigla = entrada(">>> Sigla: ") accion, id_, provincia, comuna = self.mayor_menor_consumo( sigla, opcion) print(f"Los datos de la casa con {accion} consumo son:") print(f"Casa: id = {id_}, Provincia = {provincia}, Comuna =" f" {comuna}") elif int(opcion) == 3: mensaje("perdida_potencia") id_ = entrada(">>> id: ") resultado = self.potencia_perdida(id_) print(f"La potencia de perdida en la transmisión es de " f"{resultado} kW.") elif int(opcion) == 4: tipo, id_ = mensaje("consumo_subestacion") respuesta = self.consumo_subestacion(id_, tipo) print(f"El consumo total de esta subestación es de " f"{respuesta} kW.") except InvalidQuery as error: mensaje("excepcion", Tupla("InvalidQuery", error)) self.consulta() except Volver: self.consulta()
def mensaje(tipo="-", opcional=""): grupos = Tupla("Central Generadora", "Estación de Elevación", "Subestación de Transmisión", "Subestación de " "Distribución", "Casa") if tipo == "modificar_arista": print("_" * 80) print("AGREGAR O ELIMINAR CONEXIÓN") print("-" * 80) print("A continuación, puede ingresar lo conexión a agregar/eliminar") print("La forma para ingresarlo es:") print("Xi * Yj") print("Donde:\n" "* <X> corresponde al tipo de conexión del nodo de donde " "comienza la conexión") print("* <Y> es el tipo de conexión del nodo de destino") print("* <i> es la id del nodo X") print("* <j> es la id del nodo Y") print("* <*> corresponde a la acción a realizar") print("-" * 80) print("Tipos de conexión y acciones:") print("G: Central Generadora, E: Estación de Elevación") print("T: Subestación de Transmisión, D: Subestación de Distribución") print("C: Casas, +: Agragar Conexión, -: Quitar Conexión") print("-" * 80) print("Ejemplos:") print("G0 - E2 ---> Quita conexión entre la Central(0) y la " "EstaciónElevadora(2)") print("T2 + D3 ---> Agrega una conexión entre el Transmisor(2) y la " "Distribuidora(3)") print("-" * 80) elif tipo == "modificar_aristas_clasico": print("_" * 80) print("AGREGAR O ELIMINAR CONEXIÓN (CLÁSICO)") print("-" * 80) mensaje("listado") print("-" * 80) print("A continuación puede ingresar el [número] correspondiente al " "tipo de nodo :D") elif tipo == "consultas": print("_" * 80) print("CONSULTAS") print("-" * 80) print("A continuación puede ingresar el [número] de la consulta :D") return input_lista(Tupla("Energía total consumida en una comuna", "Cliente " "con mayor consumo energético", "Cliente con menor " "consumo energético", "Potencia perdida en " "transmisión", "Consumo de una subestación"), ">>> ") elif tipo == "consumo_total": print("-" * 80) print("Ahora puede ingresar el [numero] de la comuna :D") elif tipo == "mayor_menor_consumo": print("-" * 80) print("Ahora puede ingresar la sigla del sistema eléctrico a " "consultar :D") elif tipo == "perdida_potencia": print("-" * 80) print("Ahora puede ingresar la id de la casa a consultar :D") elif tipo == "consumo_subestacion": print("-" * 80) print("¿Qué tipo de subestación desea consultar?") num = input_lista(Tupla("Subestación de Transmisión", "Subestación de " "Distribución")) if int(num) == 0: nodo = "T" elif int(num) == 1: nodo = "D" print("Ahora puede ingresar la id de la subestación a consultar :D") id_ = entrada(">>> id:") return Tupla(nodo, id_) elif tipo == "error_entrada": print("(Error) ErrorEntrada", opcional) print("Lo sentimos :O Estamos teniendo problemas para " "entender lo ingresado") print("Por favor, inténtelo de nuevo :D") elif tipo in Tupla("agregar_nodo", "remover_nodo"): print("_" * 80) if tipo == "agregar_nodo": print("AGREGAR NODO") elif tipo == "remover_nodo": print("REMOVER NODO") print("-" * 80) mensaje("listado") print("-" * 80) print("A continuación puede ingresar el [número] correspondiente al " "tipo de nodo :D") elif tipo == "error": print("Estamos teniendo problemas para entender el input") print("Por favor, inténtelo de nuevo :D") elif tipo == "excepcion": print(f"(Error) {opcional[0]}: {opcional[1]}") print("¡Lo sentimos! Puedes intentarlo de nuevo :D ") elif tipo == "listado": for n in range_(len(grupos)): print(f"[{n}] {grupos[n]}") elif tipo == "menu": print("_" * 80) print("Bienvenid@ a Electromatic :D") print("_" * 80) print("A continuación se muestran las opciones disponibles:")
if __name__ == '__main__': grafo = SistemaElectrico() grafo.cargar_datos(ruta) grafo.cargar_conexiones(ruta) grafo.calcular_demanda() grafo.simular_flujo() while True: try: mensaje("menu") opciones = Tupla("Generar Consulta", "Agregar Nodo", "Remover Nodo", "Añadir o Quitar Conexiones (Classic)", "Añadir o Quitar Conexiones (Modo Hackermen)") respuesta = int(input_lista(opciones, ">>> ")) if respuesta == 0: grafo.consulta() elif respuesta == 1: grafo.agregar_nodo() elif respuesta == 2: grafo.remover_nodo() elif respuesta == 3: grafo.modificar_aristas_clasico() elif respuesta == 4: grafo.modificar_aristas() except Volver: pass except VolverMenu:
def agregar_nodo(self): try: mensaje("agregar_nodo") numero_tipo = entrada(">>> ") while numero_tipo.strip() not in Tupla("0", "1", "2", "3", "4"): mensaje("error") numero_tipo = entrada(">>> ") print("-" * 80) presentacion = "A continuación puede ingresar los datos de la {} " \ "nueva.\nEn algunos campos se tiene la " \ "posibilidad de presionar [ENTER] para " \ "ingresar un valor al azar." titulos = self.nombres grupos = Tupla(self.generadoras, self.elevadoras, self.transmision, self.distribucion, self.casas) grupo = grupos[int(numero_tipo)] tipo_estacion = "GETDC"[int(numero_tipo)] print(presentacion.format(f"{titulos[int(numero_tipo)]}")) # 0. ID print("-" * 80) id_ = entrada(">>> id: ") while grupo.existe(id_): if id_ == "": id_ = grupo.llave_random() else: print("Esta id ya existe, por favor elige otra :D") id_ = entrada(">>> id: ") if id_ == "": id_ = grupo.llave_random() print(f"id seleccionada: {id_}") print("-" * 80) if int(numero_tipo) != 4: # 1. Nombre nombre_ = entrada(">>> Nombre: ") print("-" * 80) print(f"nombre seleccionada: {nombre_}") # 2. Sistema numero_sistema = input_lista(self.sistemas.llaves(), ">>> Sistema Eléctrico: ") sistema_ = self.sistemas.llaves()[numero_sistema] print(f"sistema electrico seleccionada: {sistema_}") print("-" * 80) # 3. Provincia numero_provincia = input_lista(self.sistemas[sistema_], ">>> Provincia: ", True) if numero_provincia == "*": provincia_ = entrada(">>> Provincia (nombre): ").upper() else: provincia_ = self.sistemas[sistema_][numero_provincia] print(f"provincia seleccionada: {provincia_}") print("-" * 80) # 4. Comuna numero_comuna = input_lista(self.lugares[provincia_], ">>> Comuna: ", True) if numero_comuna == "*": comuna_ = entrada(">>> Comuna (nombre): ").upper() else: comuna_ = self.lugares[provincia_][numero_comuna] print(f"comuna seleccionada: {comuna_}") print("-" * 80) if int(numero_tipo) == 0: # 5. Tipo numero_tipo = input_lista(self.tipos_centrales, ">>> Tipo: ") tipo_ = self.tipos_centrales[numero_tipo] print(f"tipo seleccionado: {tipo_}") print("-" * 80) # 6. Potencia potencia_ = entrada(">>> Potencia (MW): ") while not potencia_.replace('.', '', 1).isnumeric(): print("No pudimos entender tu input :O " "inténtelo de nuevo por favor :D") potencia_ = entrada(">>> Potencia (MW): ") central_ = Generadora(Tupla(id_, nombre_, sistema_, provincia_, comuna_, tipo_, potencia_), inicio=False) self.generadoras[central_.id] = central_ self.lugares[provincia_].add(comuna_) self.comunas.add(comuna_) elif int(numero_tipo) in Tupla(1, 2, 3): # 6. Consumo consumo_ = entrada(">>> Consumo (MW): ") while not consumo_.replace('.', '', 1).isnumeric(): print("No pudimos entender tu input :O " "inténtelo de nuevo por favor :D") consumo_ = entrada(">>> Consumo (MW): ") estacion_ = Estacion(Tupla(id_, nombre_, sistema_, provincia_, comuna_, consumo_), inicio=False, tipo=tipo_estacion) grupo[estacion_.id] = estacion_ self.lugares[provincia_].add(comuna_) self.comunas.add(comuna_) elif int(numero_tipo) == 4: # 6. Consumo consumo_ = entrada(">>> Consumo (kW): ") while not consumo_.replace('.', '', 1).isnumeric(): print("No pudimos entender tu input :O " "inténtelo de nuevo por favor :D") consumo_ = entrada(">>> Consumo (kW): ") casa_ = Casa(Tupla(id_, sistema_, provincia_, comuna_, consumo_), inicio=False) self.casas[casa_.id] = casa_ self.lugares[provincia_].add(comuna_) self.comunas.add(comuna_) except Volver: self.agregar_nodo()
def modificar_aristas_clasico(self): try: mensaje("modificar_aristas_clasico") numero_tipo = entrada(">>> ") while numero_tipo.strip() not in Tupla("0", "1", "2", "3", "4"): mensaje("error") numero_tipo = entrada(">>> ") print("-" * 80) grupos = Tupla(self.generadoras, self.elevadoras, self.transmision, self.distribucion, self.casas, self.casas) grupo = grupos[int(numero_tipo)] numero_nodo = input_lista( grupo.valores(), f">>> " f"{self.nombres[int(numero_tipo)]}: ") nodo_ = grupo.valores()[numero_nodo] print("-" * 80) print("¿Qué acción desea realizar?") numero_accion = int( input_lista(Tupla("Añadir Conexión", "Quitar " "Conexión"), ">>> ")) if int(numero_tipo) == 0: numero_respuesta = 0 else: numero_respuesta = int( input_lista( Tupla("Este nodo es quien " "inicia la conexión", "Este nodo es el receptor"), ">>> ")) print("-" * 80) print("Ahora puede elegir el otro nodo :D") if numero_accion == 0: if numero_respuesta == 0: numero_child = input_lista( grupos[int(numero_tipo) + 1].valores(), ">>> ") desde = nodo_ hasta = desde.children.descomprimir(0)[numero_child] elif numero_respuesta == 1: numero_parent = input_lista( grupos[int(numero_tipo) - 1].valores(), ">>> ") hasta = nodo_ desde = hasta.parent.descomprimir(0)[numero_parent] print("Ahora, puedes ingresar la distancia que hay entre los " "nodos :D") distancia = entrada(">>> Distancia: ") while not distancia.replace('.', '', 1).isnumeric(): print("Estamos teniendo problemas para leer el " "input") print("Por favor, inténtelo de nuevo :D") distancia = entrada(">>> Distancia: ") try: self.agregar_conexion(desde, hasta, distancia) except ForbiddenAction as error: mensaje("excepcion", Tupla("ForbiddenAction", error)) raise Volver() elif numero_accion == 1: if numero_respuesta == 0: numero_child = input_lista(nodo_.children.descomprimir(0), ">>> ") desde = nodo_ hasta = desde.children.descomprimir(0)[numero_child] elif numero_respuesta == 1: numero_parent = input_lista(nodo_.parent.descomprimir(0), ">>> ") hasta = nodo_ desde = hasta.parent.descomprimir(0)[numero_parent] try: self.remover_conexion(desde, hasta, confirmado=True) except ForbiddenAction as error: mensaje("excepcion", Tupla("ForbbidenAction", error)) raise Volver() except Volver: self.modificar_aristas_clasico()