| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495 |
- 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)
- '''
|