Comb_acciones.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. import os
  2. import sys
  3. import comtypes.client
  4. import pandas as pd
  5. import itertools
  6. import tkinter as tk
  7. from tkinter import *
  8. from tkinter import ttk
  9. from tkinter.filedialog import askopenfilename
  10. import math
  11. import numpy as np
  12. import warnings
  13. warnings.filterwarnings('ignore', category=UserWarning, module='openpyxl')
  14. from extraer_comb import extraer_combinaciones_a_excel
  15. # Códigos ANSI de color
  16. ROJO = '\033[91m'
  17. VERDE = '\033[92m'
  18. AMARILLO = '\033[93m'
  19. AZUL = '\033[94m'
  20. RESET = '\033[0m'
  21. # Print iterations progress
  22. def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r", clear_line = False):
  23. """
  24. Call in a loop to create terminal progress bar
  25. @params:
  26. iteration - Required : current iteration (Int)
  27. total - Required : total iterations (Int)
  28. prefix - Optional : prefix string (Str)
  29. suffix - Optional : suffix string (Str)
  30. decimals - Optional : positive number of decimals in percent complete (Int)
  31. length - Optional : character length of bar (Int)
  32. fill - Optional : bar fill character (Str)
  33. printEnd - Optional : end character (e.g. "\r", "\r\n") (Str)
  34. clear_line - Optional : if True, clears the line instead of adding newline when complete (Bool)
  35. """
  36. percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
  37. filledLength = int(length * iteration // total)
  38. bar = fill * filledLength + '-' * (length - filledLength)
  39. line = f'{prefix} |{bar}| {percent}% {suffix}'
  40. # Agregar espacios al final para limpiar líneas anteriores más largas
  41. print(f'\r{line:<150}', end = printEnd)
  42. # Print New Line on Complete
  43. if iteration == total:
  44. if clear_line:
  45. print('\r' + ' ' * 150 + '\r', end = '')
  46. else:
  47. print()
  48. #diccionario donde se encuentran todos los coef de comb acciones de las normas
  49. normas = {
  50. "IAPF" : {
  51. "CoefVar" : {
  52. "Trafico" : {
  53. "psi0" : 0.8,
  54. "psi1" : {
  55. "1" : 0.8,
  56. "2" : 0.6,
  57. "3" : 0.4
  58. },
  59. "psi2" : 0
  60. },
  61. "Resto" : {
  62. "psi0" : 0.6,
  63. "psi1" : 0.5,
  64. "psi2" : 0.2
  65. }
  66. },
  67. "ELU" : {
  68. "Favorable" : {
  69. "Persistente" : {
  70. "Cte" : 1,
  71. "NoCte" : 1,
  72. "Variable" : 0
  73. },
  74. "Accidental" : {
  75. "Cte" : 1,
  76. "NoCte" : 1,
  77. "Variable" : 0,
  78. "Accidental" : 1
  79. }
  80. },
  81. "Desfavorable" : {
  82. "Persistente" : {
  83. "Cte" : 1.35,
  84. "NoCte" : 1.5,
  85. "Variable" : 1.5
  86. },
  87. "Accidental" : {
  88. "Cte" : 1,
  89. "NoCte" : 1,
  90. "Variable" : 1,
  91. "Accidental" : 1
  92. }
  93. }
  94. },
  95. "ELS" : {
  96. "Favorable" : {
  97. "Persistente" : {
  98. "Cte" : 1,
  99. "NoCte" : 1,
  100. "Variable" : 0
  101. }
  102. },
  103. "Desfavorable" : {
  104. "Persistente" : {
  105. "Cte" : 1,
  106. "NoCte" : 1,
  107. "Variable" : 1
  108. }
  109. }
  110. }
  111. },
  112. "IAP" : {
  113. "CoefVar" : {
  114. "SCUso" : {
  115. "CVerticales" : {
  116. "psi0" : 0.4, #cuidado que para vehiculos pesados es 0.75
  117. "psi1" : 0.4, #cuidado que para vehiculos pesados es 0.75
  118. "psi2" : 0
  119. },
  120. "CHorizontales" : {
  121. "psi0" : 0,
  122. "psi1" : 0,
  123. "psi2" : 0
  124. },
  125. },
  126. "SCConstruccion" : {
  127. "psi0" : 1,
  128. "psi1" : 0,
  129. "psi2" : 1
  130. },
  131. },
  132. "ELU" : {
  133. "Favorable" : {
  134. "Persistente" : {
  135. "Cte" : 1,
  136. "NoCte" : 1,
  137. "Variable" : 0
  138. }
  139. },
  140. "Desfavorable" : {
  141. "Persistente" : {
  142. "Cte" : 1.35,
  143. "NoCte" : 1.5,
  144. "Variable" : 1.5
  145. }
  146. }
  147. },
  148. "ELS" : {
  149. "Favorable" : {
  150. "Persistente" : {
  151. "Cte" : 1,
  152. "NoCte" : 1,
  153. "Variable" : 0
  154. }
  155. },
  156. "Desfavorable" : {
  157. "Persistente" : {
  158. "Cte" : 1,
  159. "NoCte" : 1,
  160. "Variable" : 1
  161. }
  162. }
  163. }
  164. }
  165. }
  166. #Conexion con SAP2000
  167. helper = comtypes.client.CreateObject('SAP2000v1.Helper')
  168. helper = helper.QueryInterface(comtypes.gen.SAP2000v1.cHelper)
  169. mySapObject = helper.GetObject("CSI.SAP2000.API.SapObject")
  170. SapModel = mySapObject.SapModel
  171. SapModel.SetModelisLocked(False)
  172. #se pregunta si se desea borrar todo lo que hay en el SAP
  173. def borrar_combos_existentes():
  174. comboNames = SapModel.RespCombo.GetNameList()
  175. if comboNames[0] > 0:
  176. for name in comboNames[1]:
  177. ret = SapModel.RespCombo.Delete(name)
  178. printProgressBar(comboNames[1].index(name)+1, comboNames[0], prefix = 'Borrando combinaciones existentes:', suffix = 'Completado', length = 50)
  179. def borrar_load_cases():
  180. case_names = SapModel.LoadCases.GetNameList()
  181. if case_names[0] > 0:
  182. for name in case_names[1]:
  183. ret = SapModel.LoadCases.Delete(name)
  184. printProgressBar(case_names[1].index(name)+1, case_names[0], prefix = 'Borrando casos de carga existentes:', suffix = 'Completado', length = 50)
  185. def borrar_patrones_carga():
  186. patternNames = SapModel.LoadPatterns.GetNameList()
  187. if patternNames[0] > 0:
  188. for name in patternNames[1]:
  189. ret = SapModel.LoadPatterns.Delete(name)
  190. printProgressBar(patternNames[1].index(name)+1, patternNames[0], prefix = 'Borrando patrones de carga existentes:', suffix = 'Completado', length = 50)
  191. def crear_ventana_configuracion():
  192. """Crea una ventana gráfica para configuración inicial"""
  193. resultado = {'borrar_combos': False, 'borrar_cargas': False, 'norma': 'IAPF', 'vias': '1', 'elu_p_1_5': True}
  194. ventana = tk.Tk()
  195. ventana.title("Configuración de Combinaciones")
  196. ventana.geometry("400x380")
  197. ventana.attributes('-topmost', True)
  198. script_dir = os.path.dirname(os.path.abspath(__file__))
  199. icon_path = os.path.join(script_dir, 'AYRE.ico')
  200. ventana.iconbitmap(icon_path)
  201. # Título
  202. titulo = tk.Label(ventana, text="Configuración Inicial", font=("Arial", 14, "bold"))
  203. titulo.pack(pady=10)
  204. # Checkbox 1: Borrar combinaciones
  205. var_combos = tk.BooleanVar(value=True)
  206. check_combos = tk.Checkbutton(ventana, text="Borrar combinaciones existentes", variable=var_combos, font=("Arial", 10))
  207. check_combos.pack(anchor=tk.W, padx=20, pady=5)
  208. # Checkbox 2: Borrar cargas
  209. var_cargas = tk.BooleanVar(value=True)
  210. check_cargas = tk.Checkbutton(ventana, text="Borrar cargas existentes", variable=var_cargas, font=("Arial", 10))
  211. check_cargas.pack(anchor=tk.W, padx=20, pady=5)
  212. # Frame para norma
  213. frame_norma = tk.Frame(ventana)
  214. frame_norma.pack(anchor=tk.W, padx=20, pady=10)
  215. label_norma = tk.Label(frame_norma, text="Norma:", font=("Arial", 10))
  216. label_norma.pack(side=tk.LEFT, padx=5)
  217. var_norma = tk.StringVar(value="IAPF")
  218. combo_norma = tk.ttk.Combobox(frame_norma, textvariable=var_norma, values=["IAPF", "IAP"], state="readonly", width=15)
  219. combo_norma.pack(side=tk.LEFT, padx=5)
  220. # Frame para vías
  221. frame_vias = tk.Frame(ventana)
  222. frame_vias.pack(anchor=tk.W, padx=20, pady=10)
  223. label_vias = tk.Label(frame_vias, text="Vías cargadas:", font=("Arial", 10))
  224. label_vias.pack(side=tk.LEFT, padx=5)
  225. var_vias = tk.StringVar(value="1")
  226. combo_vias = tk.ttk.Combobox(frame_vias, textvariable=var_vias, values=["1", "2", "3", "Más de 3"], state="readonly", width=15)
  227. combo_vias.pack(side=tk.LEFT, padx=5)
  228. # Checkbox 3: Combos ELU P con coeficientes 1.5
  229. var_elu_p_1_5 = tk.BooleanVar(value=False)
  230. check_elu_p = tk.Checkbutton(ventana, text="Combos ELU P con coeficientes a '1.5'", variable=var_elu_p_1_5, font=("Arial", 10))
  231. check_elu_p.pack(anchor=tk.W, padx=20, pady=5)
  232. # Botón OK
  233. def on_ok():
  234. resultado['borrar_combos'] = var_combos.get()
  235. resultado['borrar_cargas'] = var_cargas.get()
  236. resultado['norma'] = var_norma.get()
  237. resultado['vias'] = var_vias.get()
  238. resultado['elu_p_1_5'] = var_elu_p_1_5.get()
  239. ventana.destroy()
  240. boton_ok = tk.Button(ventana, text="Aceptar", command=on_ok, font=("Arial", 11), bg="#4CAF50", fg="white", padx=20, pady=10)
  241. boton_ok.pack(pady=20)
  242. ventana.mainloop()
  243. return resultado
  244. # Mostrar ventana de configuración
  245. config = crear_ventana_configuracion()
  246. # Asignar valores
  247. if config['borrar_combos']:
  248. borrar_combos_existentes()
  249. if config['borrar_cargas']:
  250. borrar_load_cases()
  251. borrar_patrones_carga()
  252. norma_proyecto = config['norma']
  253. vias_cargadas = config['vias']
  254. #Extraccion de datos del excel
  255. # Crear ventana para el diálogo de selección con icono
  256. root = tk.Tk()
  257. root.withdraw() # Oculta la ventana
  258. script_dir = os.path.dirname(os.path.abspath(__file__))
  259. try:
  260. icon_path = os.path.join(script_dir, 'AYRE.ico')
  261. root.iconbitmap(icon_path)
  262. except:
  263. pass
  264. root.attributes('-topmost', True)
  265. ruta_excel = askopenfilename(parent=root)
  266. root.destroy()
  267. #ruta_excel = "C:/Users/Daniel.p/Documents/14. Ay-A 0042 Foso ataque empuje tubos y cimentaciones grua ( PALENCIA)/1. MEMORIA/Comb_acciones.xlsx"
  268. compatibilidades_df = pd.read_excel(ruta_excel,
  269. sheet_name='Compatibilidades')
  270. restricciones_df = pd.read_excel(ruta_excel,
  271. sheet_name='Restricciones')
  272. #Limpieza de filas vacias
  273. x, y = compatibilidades_df.shape
  274. for i in range(x):
  275. if (compatibilidades_df.loc[i, compatibilidades_df.columns.values[0]] == 0):
  276. compatibilidades_df=compatibilidades_df.drop(i)
  277. for i in range(y-1, 0, -1):
  278. col_name = compatibilidades_df.columns.values[i]
  279. if (isinstance(compatibilidades_df[col_name].name, int)):
  280. compatibilidades_df = compatibilidades_df.drop(col_name, axis=1)
  281. elif isinstance(col_name, str) and col_name.startswith("0"):
  282. compatibilidades_df = compatibilidades_df.drop(col_name, axis=1)
  283. x, y = compatibilidades_df.shape
  284. for i in range(1, x+1):
  285. for j in range(i-1):
  286. if not isinstance(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]], str):
  287. if math.isnan(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]]):
  288. compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]] = 'r'
  289. #cambio de los valores Nan por 0
  290. compatibilidades_df = compatibilidades_df.fillna(0)
  291. print(compatibilidades_df)
  292. restricciones_df = restricciones_df.fillna(0)
  293. #creacion de load patterns
  294. for i in restricciones_df.loc[:, "Definición de 'Load Cases'"]:
  295. ret = SapModel.LoadPatterns.Add(i, 3) #el numero indica el tipo de carga: 1 dead, 3 live ..
  296. #Se almacena en esta variable un diccionario indicando los estado en los que se puede encontrar la carga
  297. valores_por_patron = {}
  298. for index, row in restricciones_df.iterrows():
  299. patron = restricciones_df.loc[:,restricciones_df.columns[0]]
  300. valores = [0, 1]
  301. if row["Bidireccional?"]:
  302. valores.append(-1)
  303. valores_por_patron[patron[index]] = list(set(valores))
  304. #creacion del array donde se almancenan los nombres de las cargas
  305. patrones = list(valores_por_patron.keys())
  306. #se hace con itertools todas las combinaciones de carga posibles sin ninguna restriccion
  307. todas_combinaciones = list(itertools.product(*[valores_por_patron[pat] for pat in patrones]))
  308. #funcion para comprobar que la combiacion de cargas es posible debido a las restricciones
  309. def validar_combinacion(comb, patrones, compatibilidad_df, restricciones_df):
  310. #se comprueba la matriz de compatibilidad buscando por cada carga que este activa en este combo
  311. #otra carga que este activa y se comprueba en la matriz buscando una 'r'
  312. for i in range(len(patrones)):
  313. if comb[i]:
  314. for j in range(i+1, len(patrones)):
  315. if comb[j]:
  316. if compatibilidad_df.iloc[i,j+1] == 'r':
  317. return False
  318. #se comprueba que la carga que esta activa esta con otra carga especificada como condicional
  319. #para que la primera exista
  320. restriccion = restricciones_df.loc[:,"Si y solo si"]
  321. for iter, res in enumerate(restriccion):
  322. if res:
  323. idx = patrones.index(res)
  324. if comb[iter] and not comb[idx]:
  325. return False
  326. #comprueba que las cargas especificadas como permanentes se encuentran en este caso de carga
  327. permanentes = restricciones_df.loc[:,"Permanentes"]
  328. for iter, per in enumerate(permanentes):
  329. if per != 0:
  330. if not(per=='x' and comb[iter]):
  331. return False
  332. #comprueba que no hay dos acciones accidentales en la misma combinacion
  333. accidentales = restricciones_df.loc[:,"Tipo"]
  334. num_acc = 0
  335. for iter, acc in enumerate(accidentales):
  336. if acc == "Accidental":
  337. if comb[iter]:
  338. num_acc += 1
  339. if num_acc > 1:
  340. return False
  341. #comprueba que con sismo solo hay una carga variable
  342. sismo = restricciones_df.loc[:,"Accion IAPF"]
  343. num_var = 0
  344. for iter, sis in enumerate(sismo):
  345. if sis == "Sismo":
  346. if comb[iter]:
  347. for jter, _ in enumerate(comb):
  348. if (restricciones_df.loc[jter,"Tipo"] == "Variable") and comb[jter] != 0:
  349. num_var += 1
  350. if num_var > 1:
  351. return False
  352. #si no cumple ninguna de las restricciones se considera válida la combinacion
  353. return True
  354. #comprobacion de la validez de las combinaciones
  355. combinaciones_validas = []
  356. for comb in todas_combinaciones:
  357. if validar_combinacion(comb, patrones, compatibilidades_df, restricciones_df):
  358. combinaciones_validas.append(comb)
  359. #funcion para hacer la suma en valor absoluto de un array
  360. def suma_abs(lista):
  361. for _ in range(len(lista)): total += abs(lista[_])
  362. return total
  363. num_permanentes = 0
  364. #se obtiene el numero de cargas que son permanentes
  365. for iter, per in enumerate(restricciones_df.loc[:,"Permanentes"]):
  366. if per == 'x' : num_permanentes += 1
  367. def CrearCombo(nombre, numero, combo, coef):
  368. global SapModel
  369. global patrones
  370. nombre_combo = nombre + "{:04}".format(numero)
  371. ret = SapModel.RespCombo.Add(nombre_combo, 0)
  372. for idx, patron in enumerate(patrones):
  373. coeficiente = combo[idx]
  374. if coeficiente != 0:
  375. ret = SapModel.RespCombo.SetCaseList(nombre_combo, 0, patron, coeficiente*coef[idx])
  376. combos_ELUP = []
  377. combos_ELUA = []
  378. combos_ELUS = []
  379. combos_ELSC = []
  380. combos_ELSF = []
  381. combos_ELSCP = []
  382. minorados_ELUP = []
  383. minorados_ELSC = []
  384. minorados_ELSF = []
  385. minorados_ELSCP = []
  386. minorados_ELUA = []
  387. minorados_ELUS = []
  388. for combo in combinaciones_validas:
  389. coeficientes_ELUP = np.zeros(len(patrones))
  390. coeficientes_ELUA = np.zeros(len(patrones))
  391. coeficientes_ELUS = np.zeros(len(patrones))
  392. coeficientes_ELSC = np.zeros(len(patrones))
  393. coeficientes_ELSF = np.zeros(len(patrones))
  394. coeficientes_ELSCP = np.zeros(len(patrones))
  395. n_var = 0
  396. n_acc = 0
  397. for i in range(len(combo)):
  398. if norma_proyecto == "IAPF":
  399. #primero se comprueba si la carga es permanente o no
  400. if restricciones_df.loc[i,"Permanentes"]:
  401. #luego constante o no
  402. if restricciones_df.loc[i,"Tipo"] == "Constante":
  403. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  404. #ELU
  405. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Cte"]
  406. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
  407. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
  408. #ELS
  409. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  410. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  411. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  412. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  413. #ELU
  414. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Cte"]
  415. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
  416. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
  417. #ELS
  418. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  419. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  420. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  421. elif restricciones_df.loc[i,"Tipo"] == "No Constante":
  422. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  423. #ELU
  424. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["NoCte"]
  425. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
  426. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
  427. #ELS
  428. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  429. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  430. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  431. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  432. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["NoCte"]
  433. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
  434. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
  435. #ELS
  436. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  437. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  438. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  439. elif restricciones_df.loc[i,"Tipo"] == "Accidental":
  440. if combo[i] != 0: n_acc += 1
  441. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  442. #ELU
  443. coeficientes_ELUP[i] = 0
  444. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
  445. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
  446. #ELS
  447. coeficientes_ELSC[i] = 0
  448. coeficientes_ELSF[i] = 0
  449. coeficientes_ELSCP[i] = 0
  450. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  451. #ELU
  452. coeficientes_ELUP[i] = 0
  453. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
  454. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
  455. #ELS
  456. coeficientes_ELSC[i] = 0
  457. coeficientes_ELSF[i] = 0
  458. coeficientes_ELSCP[i] = 0
  459. elif restricciones_df.loc[i,"Tipo"] == "Variable":
  460. if combo[i] != 0: n_var += 1
  461. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  462. #ELU
  463. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Variable"]
  464. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
  465. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
  466. #ELS
  467. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  468. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  469. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  470. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  471. #ELU
  472. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Variable"]
  473. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
  474. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
  475. #ELS
  476. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  477. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  478. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  479. elif norma_proyecto == "IAP":
  480. pass
  481. minorados_ELUP.clear()
  482. minorados_ELUA.clear()
  483. minorados_ELUS.clear()
  484. minorados_ELSC.clear()
  485. minorados_ELSF.clear()
  486. minorados_ELSCP.clear()
  487. if n_acc:
  488. coef_var_ELUS = np.ones(len(patrones))
  489. coef_var_ELUA = np.ones(len(patrones))
  490. for i in range(len(combo)):
  491. if (restricciones_df.loc[i,"Accion IAPF"] == "Sismo") and combo[i] != 0:
  492. for j in range(len(combo)):
  493. if (restricciones_df.loc[j,"Tipo"] == "Variable") and j:
  494. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  495. coef_var_ELUS[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  496. if restricciones_df.loc[j,"Accion IAPF"] == "Resto":
  497. coef_var_ELUS[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  498. minorados_ELUS.append(coef_var_ELUS)
  499. if (restricciones_df.loc[i,"Accion IAPF"] != "Sismo") and (restricciones_df.loc[i,"Tipo"] == "Accidental") and combo[i] != 0:
  500. appended_for_acc = False
  501. for k in range(len(combo)):
  502. coef_var_ELUA = np.ones(len(patrones))
  503. if (restricciones_df.loc[k,"Tipo"] == "Variable") and combo[k] != 0:
  504. if restricciones_df.loc[k,"Accion IAPF"] == "Trafico":
  505. coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  506. else:
  507. coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  508. for j in range(len(combo)):
  509. if (restricciones_df.loc[j,"Tipo"] == "Variable") and (j != k):
  510. #se asigna el coeficiente de la variable al resto de variables
  511. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  512. coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  513. else:
  514. coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  515. minorados_ELUA.append(coef_var_ELUA)
  516. appended_for_acc = True
  517. # Si no se encontraron variables activas, añadimos el vector por defecto (unos)
  518. if not appended_for_acc:
  519. minorados_ELUA.append(np.ones(len(patrones)))
  520. else:
  521. if n_var == 1:
  522. coef_var_ELSF = np.ones(len(patrones))
  523. coef_var_ELSCP = np.ones(len(patrones))
  524. for i in range(len(combo)):
  525. if (restricciones_df.loc[i,"Tipo"] == "Variable") and combo[i] != 0:
  526. if restricciones_df.loc[i,"Accion IAPF"] == "Trafico":
  527. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  528. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  529. else:
  530. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  531. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  532. while n_var > 1:
  533. n_var -= 1
  534. #se busca la primera variable en el combo y se asigna el coeficiente
  535. for i in range(len(combo)):
  536. coef_var_ELUP = np.ones(len(patrones))
  537. coef_var_ELSC = np.ones(len(patrones))
  538. coef_var_ELSF = np.ones(len(patrones))
  539. coef_var_ELSCP =np.ones(len(patrones))
  540. if (restricciones_df.loc[i,"Tipo"] == "Variable") and combo[i] != 0:
  541. if restricciones_df.loc[i,"Accion IAPF"] == "Trafico":
  542. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  543. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  544. else:
  545. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  546. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  547. for j in range(len(combo)):
  548. if (restricciones_df.loc[j,"Tipo"] == "Variable") and (j != i):
  549. #se asigna el coeficiente de la variable al resto de variables
  550. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  551. coef_var_ELUP[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi0"]
  552. coef_var_ELSC[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi0"]
  553. coef_var_ELSF[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  554. coef_var_ELSCP[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  555. else:
  556. coef_var_ELUP[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi0"]
  557. coef_var_ELSC[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi0"]
  558. coef_var_ELSF[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  559. coef_var_ELSCP[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  560. minorados_ELUP.append(coef_var_ELUP)
  561. minorados_ELSC.append(coef_var_ELSC)
  562. minorados_ELSF.append(coef_var_ELSF)
  563. minorados_ELSCP.append(coef_var_ELSCP)
  564. if minorados_ELUP:
  565. for minorado in minorados_ELUP:
  566. combos_ELUP.append(np.multiply(np.multiply(coeficientes_ELUP, combo),minorado))
  567. for minorado in minorados_ELSC:
  568. combos_ELSC.append(np.multiply(np.multiply(coeficientes_ELSC, combo),minorado))
  569. for minorado in minorados_ELSF:
  570. combos_ELSF.append(np.multiply(np.multiply(coeficientes_ELSF, combo),minorado))
  571. for minorado in minorados_ELSCP:
  572. combos_ELSCP.append(np.multiply(np.multiply(coeficientes_ELSCP, combo),minorado))
  573. else:
  574. combos_ELUP.append(np.multiply(coeficientes_ELUP, combo))
  575. combos_ELSC.append(np.multiply(coeficientes_ELSC, combo))
  576. combos_ELSF.append(np.multiply(coeficientes_ELSF, combo))if not n_var else combos_ELSF.append(np.multiply(np.multiply(coeficientes_ELSF, combo),coef_var_ELSF))
  577. combos_ELSCP.append(np.multiply(coeficientes_ELSCP, combo)) if not n_var else combos_ELSCP.append(np.multiply(np.multiply(coeficientes_ELSCP, combo),coef_var_ELSCP))
  578. if minorados_ELUS:
  579. for minorado in minorados_ELUS:
  580. combos_ELUS.append(np.multiply(np.multiply(coeficientes_ELUS, combo),minorado))
  581. if minorados_ELUA:
  582. for minorado in minorados_ELUA:
  583. combos_ELUA.append(np.multiply(np.multiply(coeficientes_ELUA, combo),minorado))
  584. combos_ELUP = np.unique(np.array(combos_ELUP), axis=0)
  585. combos_ELUA = np.unique(np.array(combos_ELUA), axis=0)
  586. combos_ELUS = np.unique(np.array(combos_ELUS), axis=0)
  587. combos_ELSC = np.unique(np.array(combos_ELSC), axis=0)
  588. combos_ELSF = np.unique(np.array(combos_ELSF), axis=0)
  589. combos_ELSCP = np.unique(np.array(combos_ELSCP), axis=0)
  590. restricciones_array = restricciones_df.loc[:,"Tipo"]
  591. mascara = np.multiply(np.ones(len(restricciones_array)), (restricciones_array == "Variable").astype(int))
  592. def limpiar_combos(combos, mascara, coef_comp):
  593. combos_limpios = []
  594. for combo in combos:
  595. peligro = 0
  596. combo_masc = np.multiply(combo, mascara)
  597. for i, _ in enumerate(combo_masc):
  598. if combo_masc[i] == coef_comp:
  599. peligro += 1
  600. if peligro < 2:
  601. combos_limpios.append(combo)
  602. return np.array(combos_limpios)
  603. if not config['elu_p_1_5']:
  604. combos_ELUP = limpiar_combos(combos_ELUP, mascara, 1.5)
  605. combos_ELSC = limpiar_combos(combos_ELSC, mascara, 1)
  606. combos_ELSF = limpiar_combos(combos_ELSF, mascara, 1)
  607. combos_ELSCP = limpiar_combos(combos_ELSCP, mascara, 1)
  608. #print("------------------------------------------------")
  609. #print(combos_ELUP)
  610. #print(len(combos_ELUP), "ELU Persistente" )
  611. #print("------------------------------------------------")
  612. #print(combos_ELUA)
  613. #print(len(combos_ELUA), "ELU Accidental")
  614. #print("------------------------------------------------")
  615. #print(combos_ELUS)
  616. #print(len(combos_ELUS), "ELU Sismo")
  617. #print("------------------------------------------------")
  618. #print(combos_ELSC)
  619. #print(len(combos_ELSC), "ELS Caracteristico")
  620. #print("------------------------------------------------")
  621. #print(combos_ELSF)
  622. #print(len(combos_ELSF), "ELS Frecuente")
  623. #print("------------------------------------------------")
  624. #print(combos_ELSCP)
  625. #print(len(combos_ELSCP), "ELS Cuasipermanente")
  626. #print()
  627. total_combos = len(combos_ELUP) + len(combos_ELSC) + len(combos_ELSF) + len(combos_ELSCP) + len(combos_ELUA) + len(combos_ELUS)
  628. #creacion de los combos en SAP2000
  629. #creacion de los combos ELU Permantentes
  630. combo_num = 0
  631. for combo in combos_ELUP:
  632. combo_name = "ELU_P_{:03d}".format(combo_num)
  633. ret = SapModel.RespCombo.Add(combo_name, 0)
  634. for idx, patron in enumerate(patrones):
  635. coeficiente = combo[idx]
  636. if coeficiente != 0:
  637. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  638. printProgressBar(combo_num, total_combos, prefix = 'Creando combos ELU Persistente:', suffix = 'Completado', length = 50)
  639. combo_num += 1
  640. #creacion de los combos ELU Accidentales
  641. tot = combo_num
  642. combo_num = 0
  643. for combo in combos_ELUA:
  644. combo_name = "ELU_ACC_{:03d}".format(combo_num)
  645. ret = SapModel.RespCombo.Add(combo_name, 0)
  646. for idx, patron in enumerate(patrones):
  647. coeficiente = combo[idx]
  648. if coeficiente != 0:
  649. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  650. printProgressBar(tot + combo_num, total_combos, prefix = 'Creando combos ELU Accidental:', suffix = 'Completado', length = 50)
  651. combo_num += 1
  652. #creacion de los combos ELU Sismo
  653. tot += combo_num
  654. combo_num = 0
  655. for combo in combos_ELUS:
  656. combo_name = "ELU_SIS_{:03d}".format(combo_num)
  657. ret = SapModel.RespCombo.Add(combo_name, 0)
  658. for idx, patron in enumerate(patrones):
  659. coeficiente = combo[idx]
  660. if coeficiente != 0:
  661. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  662. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELU Sismo:', suffix = 'Completado', length = 50)
  663. combo_num += 1
  664. #creacion de los combos ELS Caracteristico
  665. tot += combo_num
  666. combo_num = 0
  667. for combo in combos_ELSC:
  668. combo_name = "ELS_C_{:03d}".format(combo_num)
  669. ret = SapModel.RespCombo.Add(combo_name, 0)
  670. for idx, patron in enumerate(patrones):
  671. coeficiente = combo[idx]
  672. if coeficiente != 0:
  673. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  674. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELS Caracteristico:', suffix = 'Completado', length = 50)
  675. combo_num += 1
  676. #creacion de los combos ELS Frecuente
  677. tot += combo_num
  678. combo_num = 0
  679. for combo in combos_ELSF:
  680. combo_name = "ELS_F_{:03d}".format(combo_num)
  681. ret = SapModel.RespCombo.Add(combo_name, 0)
  682. for idx, patron in enumerate(patrones):
  683. coeficiente = combo[idx]
  684. if coeficiente != 0:
  685. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  686. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELS Frecuente:', suffix = 'Completado', length = 50)
  687. combo_num += 1
  688. #creacion de los combos ELS Cuasi Permanente
  689. tot += combo_num
  690. combo_num = 0
  691. for combo in combos_ELSCP:
  692. combo_name = "ELS_CP_{:03d}".format(combo_num)
  693. ret = SapModel.RespCombo.Add(combo_name, 0)
  694. for idx, patron in enumerate(patrones):
  695. coeficiente = combo[idx]
  696. if coeficiente != 0:
  697. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  698. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELS Cuasipermanente:', suffix = 'Completado', length = 50)
  699. combo_num += 1
  700. printProgressBar(total_combos, total_combos, prefix = 'Creando combos ELS Cuasipermanente:', suffix = 'Completado', length = 50)
  701. print(f"{VERDE}Combos creados exitosamente{RESET}")
  702. #creacion del combo envolvente
  703. print()
  704. combo_name = "1. ENV ELU P"
  705. ret = SapModel.RespCombo.Add(combo_name, 1)
  706. comboNames = SapModel.RespCombo.GetNameList()
  707. patron = []
  708. for j in range(comboNames[0]):
  709. if "ELU_P" in comboNames[1][j]: patron.append(comboNames[1][j])
  710. # Calcular total de combos envolventes a crear
  711. total_envolventes = 0
  712. temp_comboNames = SapModel.RespCombo.GetNameList()
  713. for combo_type in ["ELU_P", "ELU_ACC", "ELU_SIS", "ELS_C_", "ELS_F_", "ELS_CP"]:
  714. total_envolventes += sum(1 for idx in range(temp_comboNames[0]) if combo_type in temp_comboNames[1][idx])
  715. contador_envolvente = 0
  716. for i, name in enumerate(patron):
  717. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  718. contador_envolvente += 1
  719. printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELU P envolvente:', suffix = 'Completado', length = 50)
  720. print()
  721. combo_name = "2. ENV ELU ACC"
  722. ret = SapModel.RespCombo.Add(combo_name, 1)
  723. comboNames = SapModel.RespCombo.GetNameList()
  724. patron = []
  725. for j in range(comboNames[0]):
  726. if "ELU_ACC" in comboNames[1][j]: patron.append(comboNames[1][j])
  727. for i, name in enumerate(patron):
  728. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  729. contador_envolvente += 1
  730. printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELU Acc envolvente:', suffix = 'Completado', length = 50)
  731. print()
  732. combo_name = "3. ENV ELU SIS"
  733. ret = SapModel.RespCombo.Add(combo_name, 1)
  734. comboNames = SapModel.RespCombo.GetNameList()
  735. patron = []
  736. for j in range(comboNames[0]):
  737. if "ELU_SIS" in comboNames[1][j]: patron.append(comboNames[1][j])
  738. for i, name in enumerate(patron):
  739. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  740. contador_envolvente += 1
  741. printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELU Sis envolvente:', suffix = 'Completado', length = 50)
  742. print()
  743. combo_name = "4. ENV ELS C"
  744. ret = SapModel.RespCombo.Add(combo_name, 1)
  745. comboNames = SapModel.RespCombo.GetNameList()
  746. patron = []
  747. for j in range(comboNames[0]):
  748. if "ELS_C_" in comboNames[1][j]: patron.append(comboNames[1][j])
  749. for i, name in enumerate(patron):
  750. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  751. contador_envolvente += 1
  752. printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELS C envolvente:', suffix = 'Completado', length = 50)
  753. print()
  754. combo_name = "5. ENV ELS F"
  755. ret = SapModel.RespCombo.Add(combo_name, 1)
  756. comboNames = SapModel.RespCombo.GetNameList()
  757. patron = []
  758. for j in range(comboNames[0]):
  759. if "ELS_F_" in comboNames[1][j]: patron.append(comboNames[1][j])
  760. for i, name in enumerate(patron):
  761. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  762. contador_envolvente += 1
  763. printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELS F envolvente:', suffix = 'Completado', length = 50)
  764. print()
  765. combo_name = "6. ENV ELS CP"
  766. ret = SapModel.RespCombo.Add(combo_name, 1)
  767. comboNames = SapModel.RespCombo.GetNameList()
  768. patron = []
  769. for j in range(comboNames[0]):
  770. if "ELS_CP" in comboNames[1][j]: patron.append(comboNames[1][j])
  771. for i, name in enumerate(patron):
  772. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  773. contador_envolvente += 1
  774. printProgressBar(contador_envolvente, total_envolventes, prefix = 'Creando ELS CP envolvente:', suffix = 'Completado', length = 50)
  775. print()
  776. print(f"{VERDE}Envolventes creadas con éxito.{RESET}")
  777. extraer_combinaciones_a_excel(SapModel, ruta_excel)