Bladeren bron

Funciona todo a falta de comprobaciones mas complejas

dacowars 3 weken geleden
bovenliggende
commit
a9984037ec
2 gewijzigde bestanden met toevoegingen van 209 en 77 verwijderingen
  1. BIN
      AYRE.ico
  2. 209 77
      Comb_acciones.py

BIN
AYRE.ico


+ 209 - 77
Comb_acciones.py

@@ -5,14 +5,24 @@ import pandas as pd
 import itertools
 import tkinter as tk
 from tkinter import *
+from tkinter import ttk
 from tkinter.filedialog import askopenfilename
 import math
 import numpy as np
+import warnings
+warnings.filterwarnings('ignore', category=UserWarning, module='openpyxl')
 
 
 
+# Códigos ANSI de color
+ROJO = '\033[91m'
+VERDE = '\033[92m'
+AMARILLO = '\033[93m'
+AZUL = '\033[94m'
+RESET = '\033[0m'
+
 # Print iterations progress
-def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"):
+def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r", clear_line = False):
     """
     Call in a loop to create terminal progress bar
     @params:
@@ -24,14 +34,20 @@ def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1,
         length      - Optional  : character length of bar (Int)
         fill        - Optional  : bar fill character (Str)
         printEnd    - Optional  : end character (e.g. "\r", "\r\n") (Str)
+        clear_line  - Optional  : if True, clears the line instead of adding newline when complete (Bool)
     """
     percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
     filledLength = int(length * iteration // total)
     bar = fill * filledLength + '-' * (length - filledLength)
-    print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)
+    line = f'{prefix} |{bar}| {percent}% {suffix}'
+    # Agregar espacios al final para limpiar líneas anteriores más largas
+    print(f'\r{line:<150}', end = printEnd)
     # Print New Line on Complete
-    if iteration == total: 
-        print()
+    if iteration == total:
+        if clear_line:
+            print('\r' + ' ' * 150 + '\r', end = '')
+        else:
+            print()
 
 
 #diccionario donde se encuentran todos los coef de comb acciones de las normas
@@ -187,31 +203,102 @@ def borrar_patrones_carga():
             printProgressBar(patternNames[1].index(name)+1, patternNames[0], prefix = 'Borrando patrones de carga existentes:', suffix = 'Completado', length = 50)
 
 
-respuesta = input("¿Deseas borrar todos las combinaciones existentes? (Y/n): ")
-if respuesta.lower() == 'y' or len(respuesta) == 0:
+def crear_ventana_configuracion():
+    """Crea una ventana gráfica para configuración inicial"""
+    resultado = {'borrar_combos': False, 'borrar_cargas': False, 'norma': 'IAPF', 'vias': '1', 'elu_p_1_5': True}
+    
+    ventana = tk.Tk()
+    ventana.title("Configuración de Combinaciones")
+    ventana.geometry("400x380")
+    ventana.attributes('-topmost', True)
+    script_dir = os.path.dirname(os.path.abspath(__file__))
+    icon_path = os.path.join(script_dir, 'AYRE.ico')
+    ventana.iconbitmap(icon_path)
+
+    
+    # Título
+    titulo = tk.Label(ventana, text="Configuración Inicial", font=("Arial", 14, "bold"))
+    titulo.pack(pady=10)
+    
+    # Checkbox 1: Borrar combinaciones
+    var_combos = tk.BooleanVar(value=True)
+    check_combos = tk.Checkbutton(ventana, text="Borrar combinaciones existentes", variable=var_combos, font=("Arial", 10))
+    check_combos.pack(anchor=tk.W, padx=20, pady=5)
+    
+    # Checkbox 2: Borrar cargas
+    var_cargas = tk.BooleanVar(value=True)
+    check_cargas = tk.Checkbutton(ventana, text="Borrar cargas existentes", variable=var_cargas, font=("Arial", 10))
+    check_cargas.pack(anchor=tk.W, padx=20, pady=5)
+    
+    # Frame para norma
+    frame_norma = tk.Frame(ventana)
+    frame_norma.pack(anchor=tk.W, padx=20, pady=10)
+    label_norma = tk.Label(frame_norma, text="Norma:", font=("Arial", 10))
+    label_norma.pack(side=tk.LEFT, padx=5)
+    var_norma = tk.StringVar(value="IAPF")
+    combo_norma = tk.ttk.Combobox(frame_norma, textvariable=var_norma, values=["IAPF", "IAP"], state="readonly", width=15)
+    combo_norma.pack(side=tk.LEFT, padx=5)
+    
+    # Frame para vías
+    frame_vias = tk.Frame(ventana)
+    frame_vias.pack(anchor=tk.W, padx=20, pady=10)
+    label_vias = tk.Label(frame_vias, text="Vías cargadas:", font=("Arial", 10))
+    label_vias.pack(side=tk.LEFT, padx=5)
+    var_vias = tk.StringVar(value="1")
+    combo_vias = tk.ttk.Combobox(frame_vias, textvariable=var_vias, values=["1", "2", "3", "Más de 3"], state="readonly", width=15)
+    combo_vias.pack(side=tk.LEFT, padx=5)
+    
+    # Checkbox 3: Combos ELU P con coeficientes 1.5
+    var_elu_p_1_5 = tk.BooleanVar(value=False)
+    check_elu_p = tk.Checkbutton(ventana, text="Combos ELU P con coeficientes a '1.5'", variable=var_elu_p_1_5, font=("Arial", 10))
+    check_elu_p.pack(anchor=tk.W, padx=20, pady=5)
+    
+    # Botón OK
+    def on_ok():
+        resultado['borrar_combos'] = var_combos.get()
+        resultado['borrar_cargas'] = var_cargas.get()
+        resultado['norma'] = var_norma.get()
+        resultado['vias'] = var_vias.get()
+        resultado['elu_p_1_5'] = var_elu_p_1_5.get()
+        ventana.destroy()
+    
+    boton_ok = tk.Button(ventana, text="Aceptar", command=on_ok, font=("Arial", 11), bg="#4CAF50", fg="white", padx=20, pady=10)
+    boton_ok.pack(pady=20)
+    
+    ventana.mainloop()
+    return resultado
+
+
+# Mostrar ventana de configuración
+config = crear_ventana_configuracion()
+
+# Asignar valores
+if config['borrar_combos']:
     borrar_combos_existentes()
 
-respuesta = input("¿Deseas borrar todos las cargas existentes? (Y/n): ")
-if respuesta.lower() == 'y' or len(respuesta) == 0:
+if config['borrar_cargas']:
     borrar_load_cases()
     borrar_patrones_carga()
 
-
-#se selecciona la norma a utilizar para la comb acciones
-respuesta = input("¿La norma a seguir es la IAPF - 07? (Y / n [IAP - 11]): ")
-if respuesta.lower() == 'y' or len(respuesta) == 0:
-    norma_proyecto = "IAPF"
-    vias_cargadas = input("¿Cuantas vias hay cargadas a la vez 1, 2 o 3 (o más)?")
-
-else: "IAP"
+norma_proyecto = config['norma']
+vias_cargadas = config['vias']
 
 
 
 #Extraccion de datos del excel
 
-
-tk.Tk().withdraw()
-ruta_excel = askopenfilename()
+# Crear ventana para el diálogo de selección con icono
+root = tk.Tk()
+root.withdraw()  # Oculta la ventana
+script_dir = os.path.dirname(os.path.abspath(__file__))
+try:
+    icon_path = os.path.join(script_dir, 'AYRE.ico')
+    root.iconbitmap(icon_path)
+except:
+    pass
+root.attributes('-topmost', True)
+ruta_excel = askopenfilename(parent=root)
+root.destroy()
 
 #ruta_excel = "C:/Users/Daniel.p/Documents/14. Ay-A 0042 Foso ataque empuje tubos y cimentaciones grua ( PALENCIA)/1. MEMORIA/Comb_acciones.xlsx"
 
@@ -290,8 +377,8 @@ todas_combinaciones = list(itertools.product(*[valores_por_patron[pat] for pat i
 #funcion para comprobar que la combiacion de cargas es posible debido a las restricciones
 
 def validar_combinacion(comb, patrones, compatibilidad_df, restricciones_df):
-    #se comprueba la matriz de compatibilidad buscando por cada caga que este activa en este combo
-    #otra targa que este activa y se comprueba en la matriz buscando una 'r'
+    #se comprueba la matriz de compatibilidad buscando por cada carga que este activa en este combo
+    #otra carga que este activa y se comprueba en la matriz buscando una 'r'
     for i in range(len(patrones)):
         if comb[i]:
             for j in range(i+1, len(patrones)):
@@ -508,21 +595,26 @@ for combo in combinaciones_validas:
                             coef_var_ELUS[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
                 minorados_ELUS.append(coef_var_ELUS)
             if (restricciones_df.loc[i,"Accion IAPF"] != "Sismo") and (restricciones_df.loc[i,"Tipo"] == "Accidental") and combo[i] != 0:
+                appended_for_acc = False
                 for k in range(len(combo)):
                     coef_var_ELUA = np.ones(len(patrones))
-                    if restricciones_df.loc[k,"Tipo"] == "Variable":
+                    if (restricciones_df.loc[k,"Tipo"] == "Variable") and combo[k] != 0:
                         if restricciones_df.loc[k,"Accion IAPF"] == "Trafico":
                             coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
                         else:
                             coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
                         for j in range(len(combo)):
                             if (restricciones_df.loc[j,"Tipo"] == "Variable") and (j != k):
-                                    #se asigna el coeficiente de la variable al resto de variables
+                                #se asigna el coeficiente de la variable al resto de variables
                                 if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
                                     coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
                                 else:
                                     coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
-                        minorados_ELUP.append(coef_var_ELUA)
+                        minorados_ELUA.append(coef_var_ELUA)
+                        appended_for_acc = True
+                # Si no se encontraron variables activas, añadimos el vector por defecto (unos)
+                if not appended_for_acc:
+                    minorados_ELUA.append(np.ones(len(patrones)))
 
     else:
         if n_var == 1:
@@ -545,7 +637,7 @@ for combo in combinaciones_validas:
                 coef_var_ELUP = np.ones(len(patrones))
                 coef_var_ELSC = np.ones(len(patrones))
                 coef_var_ELSF = np.ones(len(patrones))
-                coef_var_ELSCP = np.ones(len(patrones))
+                coef_var_ELSCP =np.ones(len(patrones))
                 if (restricciones_df.loc[i,"Tipo"] == "Variable") and combo[i] != 0:
                     if restricciones_df.loc[i,"Accion IAPF"] == "Trafico":
                         coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
@@ -602,24 +694,54 @@ combos_ELSC =  np.unique(np.array(combos_ELSC), axis=0)
 combos_ELSF =  np.unique(np.array(combos_ELSF), axis=0)
 combos_ELSCP =  np.unique(np.array(combos_ELSCP), axis=0)
 
-print("------------------------------------------------")
-print(combos_ELUP)
-print(len(combos_ELUP))
-print("------------------------------------------------")
-print(combos_ELUA)
-print(len(combos_ELUA))
-print("------------------------------------------------")
-print(combos_ELUS)
-print(len(combos_ELUS))
-print("------------------------------------------------")
-print(combos_ELSC)
-print(len(combos_ELSC))
-print("------------------------------------------------")
-print(combos_ELSF)
-print(len(combos_ELSF))
-print("------------------------------------------------")
-print(combos_ELSCP)
-print(len(combos_ELSCP))
+
+restricciones_array = restricciones_df.loc[:,"Tipo"]
+
+mascara = np.multiply(np.ones(len(restricciones_array)), (restricciones_array == "Variable").astype(int))
+
+
+def limpiar_combos(combos, mascara, coef_comp):
+    combos_limpios = []
+    for combo in combos:
+        peligro = 0 
+        combo_masc = np.multiply(combo, mascara)
+        for i, _ in enumerate(combo_masc):
+            if combo_masc[i] == coef_comp:
+                peligro += 1
+        if peligro < 2:
+            combos_limpios.append(combo)
+    return np.array(combos_limpios)
+
+
+if not config['elu_p_1_5']:
+    combos_ELUP = limpiar_combos(combos_ELUP, mascara, 1.5)
+
+
+combos_ELSC = limpiar_combos(combos_ELSC, mascara, 1)
+combos_ELSF = limpiar_combos(combos_ELSF, mascara, 1)
+combos_ELSCP = limpiar_combos(combos_ELSCP, mascara, 1)
+
+
+
+#print("------------------------------------------------")
+#print(combos_ELUP)
+#print(len(combos_ELUP), "ELU Persistente" )
+#print("------------------------------------------------")
+#print(combos_ELUA)
+#print(len(combos_ELUA), "ELU Accidental")
+#print("------------------------------------------------")
+#print(combos_ELUS)
+#print(len(combos_ELUS), "ELU Sismo")
+#print("------------------------------------------------")
+#print(combos_ELSC)
+#print(len(combos_ELSC), "ELS Caracteristico")
+#print("------------------------------------------------")
+#print(combos_ELSF)
+#print(len(combos_ELSF), "ELS Frecuente")
+#print("------------------------------------------------")
+#print(combos_ELSCP)
+#print(len(combos_ELSCP), "ELS Cuasipermanente")
+#print()
 
 total_combos = len(combos_ELUP) + len(combos_ELSC) + len(combos_ELSF) + len(combos_ELSCP) + len(combos_ELUA) + len(combos_ELUS)
 #creacion de los combos en SAP2000
@@ -640,7 +762,7 @@ for combo in combos_ELUP:
 
 #creacion de los combos ELU Accidentales
 tot = combo_num
-combo_num = 0 
+combo_num = 0
 
 for combo in combos_ELUA:
     combo_name = "ELU_ACC_{:03d}".format(combo_num)
@@ -649,7 +771,7 @@ for combo in combos_ELUA:
         coeficiente = combo[idx]
         if coeficiente != 0:
             ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
-    printProgressBar(combo_num, total_combos, prefix = 'Creando combos ELU Accidental:', suffix = 'Completado', length = 50)
+    printProgressBar(tot + combo_num, total_combos, prefix = 'Creando combos ELU Accidental:', suffix = 'Completado', length = 50)
     combo_num += 1
 
 #creacion de los combos ELU Sismo
@@ -667,7 +789,7 @@ for combo in combos_ELUS:
 
 #creacion de los combos ELS Caracteristico
 tot += combo_num
-combo_num = 0 
+combo_num = 0
 
 for combo in combos_ELSC:
     combo_name = "ELS_C_{:03d}".format(combo_num)
@@ -695,7 +817,7 @@ for combo in combos_ELSF:
 
 #creacion de los combos ELS Cuasi Permanente
 tot += combo_num
-combo_num = 0 
+combo_num = 0
 
 for combo in combos_ELSCP:
     combo_name = "ELS_CP_{:03d}".format(combo_num)
@@ -707,6 +829,8 @@ for combo in combos_ELSCP:
     printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELS Cuasipermanente:', suffix = 'Completado', length = 50)
     combo_num += 1
 printProgressBar(total_combos, total_combos, prefix = 'Creando combos ELS Cuasipermanente:', suffix = 'Completado', length = 50)
+print(f"{VERDE}Combos creados exitosamente{RESET}")
+
 #creacion del combo envolvente 
 print()
 
@@ -715,69 +839,77 @@ combo_name = "1. ENV ELU P"
 ret = SapModel.RespCombo.Add(combo_name, 1)
 comboNames = SapModel.RespCombo.GetNameList()
 patron = []
-for i in range(comboNames[0]):
-    if "ELU_P" in comboNames[1][i]: patron.append(comboNames[1][i])  
+for j in range(comboNames[0]):
+    if "ELU_P" in comboNames[1][j]: patron.append(comboNames[1][j])  
+
+# Calcular total de combos envolventes a crear
+total_envolventes = 0
+temp_comboNames = SapModel.RespCombo.GetNameList()
+for combo_type in ["ELU_P", "ELU_ACC", "ELU_SIS", "ELS_C_", "ELS_F_", "ELS_CP"]:
+    total_envolventes += sum(1 for idx in range(temp_comboNames[0]) if combo_type in temp_comboNames[1][idx])
+
+contador_envolvente = 0
 for i, name in enumerate(patron):
     ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
-    printProgressBar(i+1, comboNames[0], prefix = 'Creando combo envolvente ELU P:', suffix = 'Completado', length = 50)
-n=i
-
+    contador_envolvente += 1
+    printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELU P envolvente:', suffix = 'Completado', length = 50)
+print()
 combo_name = "2. ENV ELU ACC"
 ret = SapModel.RespCombo.Add(combo_name, 1)
 comboNames = SapModel.RespCombo.GetNameList()
 patron = []
-for i in range(comboNames[0]):
-    if "ELU_ACC" in comboNames[1][i]: patron.append(comboNames[1][i])  
+for j in range(comboNames[0]):
+    if "ELU_ACC" in comboNames[1][j]: patron.append(comboNames[1][j])  
 for i, name in enumerate(patron):
     ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
-    printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELU ACC:', suffix = 'Completado', length = 50)
-n+=i
-
+    contador_envolvente += 1
+    printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELU Acc envolvente:', suffix = 'Completado', length = 50)
+print()
 combo_name = "3. ENV ELU SIS"
 ret = SapModel.RespCombo.Add(combo_name, 1)
 comboNames = SapModel.RespCombo.GetNameList()
 patron = []
-for i in range(comboNames[0]):
-    if "ELU_SIS" in comboNames[1][i]: patron.append(comboNames[1][i])  
+for j in range(comboNames[0]):
+    if "ELU_SIS" in comboNames[1][j]: patron.append(comboNames[1][j])  
 for i, name in enumerate(patron):
     ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
-    printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELU ACC:', suffix = 'Completado', length = 50)
-n+=i
-
+    contador_envolvente += 1
+    printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELU Sis envolvente:', suffix = 'Completado', length = 50)
+print()
 combo_name = "4. ENV ELS C"
 ret = SapModel.RespCombo.Add(combo_name, 1)
 comboNames = SapModel.RespCombo.GetNameList()
 patron = []
-for i in range(comboNames[0]):
-    if "ELS_C_" in comboNames[1][i]: patron.append(comboNames[1][i])  
+for j in range(comboNames[0]):
+    if "ELS_C_" in comboNames[1][j]: patron.append(comboNames[1][j])  
 for i, name in enumerate(patron):
     ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
-    printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELS C:', suffix = 'Completado', length = 50)
-n+=i   
-
+    contador_envolvente += 1
+    printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELS C envolvente:', suffix = 'Completado', length = 50)
+print()
 
 combo_name = "5. ENV ELS F"
 ret = SapModel.RespCombo.Add(combo_name, 1)
 comboNames = SapModel.RespCombo.GetNameList()
 patron = []
-for i in range(comboNames[0]):
-    if "ELS_F_" in comboNames[1][i]: patron.append(comboNames[1][i])  
+for j in range(comboNames[0]):
+    if "ELS_F_" in comboNames[1][j]: patron.append(comboNames[1][j])  
 for i, name in enumerate(patron):
     ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
-    printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELS F:', suffix = 'Completado', length = 50)
-n+=i
-    
+    contador_envolvente += 1
+    printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELS F envolvente:', suffix = 'Completado', length = 50)
+print()
 
 combo_name = "6. ENV ELS CP"
 ret = SapModel.RespCombo.Add(combo_name, 1)
 comboNames = SapModel.RespCombo.GetNameList()
 patron = []
-for i in range(comboNames[0]):
-    if "ELS_CP" in comboNames[1][i]: patron.append(comboNames[1][i])  
+for j in range(comboNames[0]):
+    if "ELS_CP" in comboNames[1][j]: patron.append(comboNames[1][j])  
 for i, name in enumerate(patron):
     ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
-    printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELS CP:', suffix = 'Completado', length = 50)
-printProgressBar(comboNames[0], comboNames[0], prefix = 'Creando combo envolvente ELS CP:', suffix = 'Completado', length = 50)
+    contador_envolvente += 1
+    printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELS CP envolvente:', suffix = 'Completado', length = 50)
 
 print()
-print("Combinaciones de acciones creadas con éxito.")
+print(f"{VERDE}Envolventes creadas con éxito.{RESET}")