dacowars hace 2 meses
commit
3fe85acbfe
Se han modificado 3 ficheros con 495 adiciones y 0 borrados
  1. 495 0
      Comb_acciones.py
  2. BIN
      Comb_acciones.xlsx
  3. BIN
      ~$Comb_acciones.xlsx

+ 495 - 0
Comb_acciones.py

@@ -0,0 +1,495 @@
+import os
+import sys
+import comtypes.client
+import pandas as pd
+import itertools
+import tkinter as tk
+from tkinter import *
+from tkinter.filedialog import askopenfilename
+import math
+import numpy as np
+
+
+#diccionario donde se encuentran todos los coef de comb acciones de las normas
+normas = {
+    "IAPF" : {
+        "CoefVar" : {
+            "Trafico" : {
+                "psi0" : 0.8,
+                "psi1" : {
+                    "1" : 0.8,
+                    "2" : 0.6,
+                    "3" : 0.4
+                },
+                "psi2" : 0
+            },
+            "Resto" : {
+                "psi0" : 0.6,
+                "psi1" : 0.5,
+                "psi2" : 0.2
+            }
+        },
+        "ELU" : {
+            "Favorable" : {
+                "Persistente" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 0
+                },
+                "Accidental" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 0,
+                    "Accidental" : 1
+                }
+            },
+            "Desfavorable" : {
+                "Persistente" : {
+                    "Cte" : 1.35,
+                    "NoCte" : 1.5,
+                    "Variable" : 1.5
+                },
+                "Accidental" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 1,
+                    "Accidental" : 1
+                }
+            }
+        },
+        "ELS" : {
+            "Favorable" : {
+                "Persistente" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 0
+                }
+            },
+            "Desfavorable" : {
+                "Persistente" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 1
+                }
+            }
+        }
+    },
+    "IAP" : {
+        "CoefVar" : {
+            "SCUso" : {
+                "CVerticales" : {
+                    "psi0" : 0.4, #cuidado que para vehiculos pesados es 0.75
+                    "psi1" : 0.4, #cuidado que para vehiculos pesados es 0.75
+                    "psi2" : 0
+                },
+                "CHorizontales" : {
+                    "psi0" : 0, 
+                    "psi1" : 0, 
+                    "psi2" : 0
+                },
+            },
+            "SCConstruccion" : {
+                "psi0" : 1, 
+                "psi1" : 0, 
+                "psi2" : 1
+            },
+        },
+        "ELU" : {
+            "Favorable" : {
+                "Persistente" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 0
+                }
+            },
+            "Desfavorable" : {
+                "Persistente" : {
+                    "Cte" : 1.35,
+                    "NoCte" : 1.5,
+                    "Variable" : 1.5
+                }
+            }
+        },
+        "ELS" : {
+            "Favorable" : {
+                "Persistente" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 0
+                }
+            },
+            "Desfavorable" : {
+                "Persistente" : {
+                    "Cte" : 1,
+                    "NoCte" : 1,
+                    "Variable" : 1
+                }
+            }
+        }
+    }
+}
+
+
+#Conexion con SAP2000
+
+helper = comtypes.client.CreateObject('SAP2000v1.Helper')
+helper = helper.QueryInterface(comtypes.gen.SAP2000v1.cHelper)
+mySapObject = helper.GetObject("CSI.SAP2000.API.SapObject")
+SapModel = mySapObject.SapModel
+SapModel.SetModelisLocked(False)
+
+#se pregunta si se desea borrar todo lo que hay en el SAP
+
+def borrar_combos_existentes():
+    comboNames = SapModel.RespCombo.GetNameList()
+    if comboNames[0] > 0:
+        for name in comboNames[1]:
+            ret = SapModel.RespCombo.Delete(name)
+        print(f"Se han eliminado {comboNames[0]} combinaciones de respuesta.")
+
+def borrar_load_cases():
+    case_names = SapModel.LoadCases.GetNameList()
+    if case_names[0] > 0:
+        for name in case_names[1]:
+            ret = SapModel.LoadCases.Delete(name)
+        print(f"Se han eliminado {case_names[0]} casos de carga.")
+
+
+def borrar_patrones_carga():
+    patternNames = SapModel.LoadPatterns.GetNameList()
+    if patternNames[0] > 0:
+        for name in patternNames[1]:
+            ret = SapModel.LoadPatterns.Delete(name)
+        print(f"Se han eliminado {patternNames[0]} patrones de carga.")
+
+
+respuesta = input("¿Deseas borrar todos las combinaciones existentes? (Y/n): ")
+if respuesta.lower() == 'y' or len(respuesta) == 0:
+    borrar_combos_existentes()
+
+respuesta = input("¿Deseas borrar todos las cargas existentes? (Y/n): ")
+if respuesta.lower() == 'y' or len(respuesta) == 0:
+    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"
+
+
+#Extraccion de datos del excel
+
+
+tk.Tk().withdraw()
+ruta_excel = askopenfilename()
+
+#ruta_excel = "C:/Users/Daniel.p/Documents/14. Ay-A 0042 Foso ataque empuje tubos y cimentaciones grua ( PALENCIA)/1. MEMORIA/Comb_acciones.xlsx"
+
+compatibilidades_df = pd.read_excel(ruta_excel,
+                              sheet_name='Compatibilidades')
+
+restricciones_df = pd.read_excel(ruta_excel,
+                              sheet_name='Restricciones')
+
+
+#Limpieza de filas vacias
+
+x, y = compatibilidades_df.shape
+
+for i in range(x):
+    if (compatibilidades_df.loc[i, compatibilidades_df.columns.values[0]] == 0):
+        compatibilidades_df=compatibilidades_df.drop(i)
+
+
+
+for i in range(y-1, 0, -1):
+    col_name = compatibilidades_df.columns.values[i]
+    if (isinstance(compatibilidades_df[col_name].name, int)):
+        compatibilidades_df = compatibilidades_df.drop(col_name, axis=1)
+    elif isinstance(col_name, str) and col_name.startswith("0"):
+        compatibilidades_df = compatibilidades_df.drop(col_name, axis=1) 
+
+
+x, y = compatibilidades_df.shape
+
+for i in range(1, x+1):
+    for j in range(i-1):
+        if not isinstance(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]], str):
+            if math.isnan(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]]):
+                compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]] = 'r'
+
+
+
+#cambio de los valores Nan por 0
+compatibilidades_df = compatibilidades_df.fillna(0)
+print(compatibilidades_df)
+
+restricciones_df = restricciones_df.fillna(0)
+
+
+ 
+#creacion de load patterns
+
+for i in restricciones_df.loc[:, "Definición de 'Load Cases'"]:
+    ret = SapModel.LoadPatterns.Add(i, 3) #el numero indica el tipo de carga: 1 dead, 3 live ..
+
+
+#Se almacena en esta variable un diccionario indicando los estado en los que se puede encontrar la carga
+
+valores_por_patron = {}
+for index, row in restricciones_df.iterrows():
+    patron = restricciones_df.loc[:,restricciones_df.columns[0]]
+
+    valores = [0, 1]
+
+    if row["Bidireccional?"]:
+        valores.append(-1)
+    
+    valores_por_patron[patron[index]] = list(set(valores))
+
+
+#creacion del array donde se almancenan los nombres de las cargas
+patrones = list(valores_por_patron.keys())
+
+
+
+#se hace con itertools todas las combinaciones de carga posibles sin ninguna restriccion
+todas_combinaciones = list(itertools.product(*[valores_por_patron[pat] for pat in patrones]))
+
+
+#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'
+    for i in range(len(patrones)):
+        if comb[i]:
+            for j in range(i+1, len(patrones)):
+                if comb[j]:
+                    if compatibilidad_df.iloc[i,j+1] == 'r':
+                        return False
+    #se comprueba que la carga que esta activa esta con otra carga especificada como condicional
+    #para que la primera exista
+    restriccion = restricciones_df.loc[:,"Si y solo si"]           
+    for iter, res in enumerate(restriccion):
+        if res:
+            if comb[iter]:
+                idx = patrones.index(res)
+                if not(comb[idx]):
+                    return False
+    #comprueba que las cargas especificadas como permanentes se encuentran en este caso de carga
+    permanentes = restricciones_df.loc[:,"Permanentes"]
+    for iter, per in enumerate(permanentes):
+        if per != 0:
+            if not(per=='x' and comb[iter]):
+                return False
+    #si no cumple ninguna de las restricciones se considera válida la combinacion
+    return True
+
+
+#comprobacion de la validez de las combinaciones
+combinaciones_validas = []
+for comb in todas_combinaciones:
+    if validar_combinacion(comb, patrones, compatibilidades_df, restricciones_df):
+        combinaciones_validas.append(comb)
+
+
+#funcion para hacer la suma en valor absoluto de un array
+def suma_abs(lista):
+
+    for _ in range(len(lista)): total += abs(lista[_])
+
+    return total
+
+
+#se obtiene el numero de cargas que son permanentes
+for iter, per in enumerate(restricciones_df.loc[:,"Permanentes"]):
+    if per == 'x' : num_permanentes += 1
+
+
+
+def CrearCombo(nombre, numero, combo, coef):
+
+    global SapModel
+    global patrones
+
+    nombre_combo = nombre + "{:04}".format(numero)
+
+    ret = SapModel.RespCombo.Add(nombre_combo, 0)
+
+    for idx, patron in enumerate(patrones):
+        coeficiente = combo[idx]
+        if coeficiente != 0:
+            ret = SapModel.RespCombo.SetCaseList(nombre_combo, 0, patron, coeficiente*coef[idx])
+
+
+
+
+
+
+for combo in combinaciones_validas:
+
+    coeficientes_ELUP = np.zeros(len(patrones))
+    coeficientes_ELUA = np.zeros(len(patrones))
+    coeficientes_ELUS = np.zeros(len(patrones))
+    coeficientes_ELSC = np.zeros(len(patrones))
+    coeficientes_ELSF = np.zeros(len(patrones))
+    coeficientes_ELSCP = np.zeros(len(patrones))
+    n_var = 0
+
+    for i in range(combo):
+
+
+        if norma_proyecto == "IAPF":
+            #primero se comprueba si la carga es permanente o no
+            if restricciones_df.loc[i+1,"Permanentes"]:
+                #luego constante o no
+                if restricciones_df.loc[i+1,"Tipo"] == "Constante":
+                    if restricciones_df.loc[i+1,"Direccion"] == "Desfavorable":
+                        #ELU
+                        coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Cte"]
+                        coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
+                        coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
+                        #ELS
+                        coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
+                        coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
+                        coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
+                    elif restricciones_df.loc[i+1,"Direccion"] == "Favorable":
+                        #ELU
+                        coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Cte"]
+                        coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
+                        coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
+                        #ELS
+                        coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
+                        coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
+                        coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
+                elif restricciones_df.loc[i+1,"Tipo"] == "No Constante":
+                    if restricciones_df.loc[i+1,"Direccion"] == "Desfavorable":
+                        #ELU
+                        coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["NoCte"]
+                        coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
+                        coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
+                        #ELS
+                        coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
+                        coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
+                        coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
+                    elif restricciones_df.loc[i+1,"Direccion"] == "Favorable":
+                        coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["NoCte"]
+                        coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
+                        coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
+                        #ELS
+                        coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
+                        coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
+                        coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
+            elif restricciones_df.loc[i+1,"Tipo"] == "Accidental":
+                if restricciones_df.loc[i+1,"Direccion"] == "Desfavorable":
+                    #ELU
+                    coeficientes_ELUP[i] = 0
+                    coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
+                    coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
+                    #ELS
+                    coeficientes_ELSC[i] =  0
+                    coeficientes_ELSF[i] =  0
+                    coeficientes_ELSCP[i] = 0
+                elif restricciones_df.loc[i+1,"Direccion"] == "Favorable":
+                    #ELU
+                    coeficientes_ELUP[i] = 0
+                    coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
+                    coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
+                    #ELS
+                    coeficientes_ELSC[i] =  0
+                    coeficientes_ELSF[i] =  0
+                    coeficientes_ELSCP[i] = 0
+            elif restricciones_df.loc[i+1,"Tipo"] == "Variable":
+                n_var += 1
+                if restricciones_df.loc[i+1,"Direccion"] == "Desfavorable":
+                    #ELU
+                    coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Variable"]
+                    coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
+                    coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
+                    #ELS
+                    coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
+                    coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
+                    coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
+                elif restricciones_df.loc[i+1,"Direccion"] == "Favorable":
+                    #ELU
+                    coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Variable"]
+                    coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
+                    coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
+                    #ELS
+                    coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
+                    coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
+                    coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
+        elif norma_proyecto == "IAP":
+            pass    
+
+        if n_var :
+            while n_var:
+                n_var -= 1 
+                #se busca la primera variable en el combo y se asigna el coeficiente
+                for i in range(len(combo)):
+                    if restricciones_df.loc[i+1,"Tipo"] == "Variable":
+                        for j in range(len(combo)):
+                            if (restricciones_df.loc[j+1,"Tipo"] == "Variable") and (j != i):
+                                    #se asigna el coeficiente de la variable al resto de variables
+                                    
+
+            
+
+#ahora hay que buscar en el combo cual es la primera variable y asignar al resto el coeficiente y luego pasar a la siguiente variable y hacer lo mismo con todas y con la antigua
+
+
+
+
+
+
+
+
+
+
+
+
+    pass
+
+
+
+
+
+
+
+'''
+
+combo_num = 1 
+
+coeficiente_EL = restricciones_df.loc[:, "Coeficiente"]
+
+for combo in combinaciones_validas:
+    combo_name = "Combo {:03d}".format(combo_num)
+    ret = SapModel.RespCombo.Add(combo_name, 0)
+    for idx, patron in enumerate(patrones):
+        coeficiente = combo[idx]
+        if coeficiente != 0:
+            ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente*coeficiente_EL[idx])
+    combo_num += 1
+
+
+#creacion del combo envolvente 
+
+
+combo_name = "Combo ENV"
+ret = SapModel.RespCombo.Add(combo_name, 1)
+comboNames = SapModel.RespCombo.GetNameList()
+patron = []
+for i in range(comboNames[0]):
+    patron.append(1)
+for idx, name in enumerate(comboNames[1]):
+    ret = SapModel.RespCombo.SetCaseList(combo_name, 1, comboNames[1][idx], 1)
+
+
+'''
+

BIN
Comb_acciones.xlsx


BIN
~$Comb_acciones.xlsx