Comb_acciones.py 37 KB

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