Comb_acciones.py 37 KB

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