Comb_acciones.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  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.filedialog import askopenfilename
  9. import math
  10. import numpy as np
  11. # Print iterations progress
  12. def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"):
  13. """
  14. Call in a loop to create terminal progress bar
  15. @params:
  16. iteration - Required : current iteration (Int)
  17. total - Required : total iterations (Int)
  18. prefix - Optional : prefix string (Str)
  19. suffix - Optional : suffix string (Str)
  20. decimals - Optional : positive number of decimals in percent complete (Int)
  21. length - Optional : character length of bar (Int)
  22. fill - Optional : bar fill character (Str)
  23. printEnd - Optional : end character (e.g. "\r", "\r\n") (Str)
  24. """
  25. percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
  26. filledLength = int(length * iteration // total)
  27. bar = fill * filledLength + '-' * (length - filledLength)
  28. print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)
  29. # Print New Line on Complete
  30. if iteration == total:
  31. print()
  32. #diccionario donde se encuentran todos los coef de comb acciones de las normas
  33. normas = {
  34. "IAPF" : {
  35. "CoefVar" : {
  36. "Trafico" : {
  37. "psi0" : 0.8,
  38. "psi1" : {
  39. "1" : 0.8,
  40. "2" : 0.6,
  41. "3" : 0.4
  42. },
  43. "psi2" : 0
  44. },
  45. "Resto" : {
  46. "psi0" : 0.6,
  47. "psi1" : 0.5,
  48. "psi2" : 0.2
  49. }
  50. },
  51. "ELU" : {
  52. "Favorable" : {
  53. "Persistente" : {
  54. "Cte" : 1,
  55. "NoCte" : 1,
  56. "Variable" : 0
  57. },
  58. "Accidental" : {
  59. "Cte" : 1,
  60. "NoCte" : 1,
  61. "Variable" : 0,
  62. "Accidental" : 1
  63. }
  64. },
  65. "Desfavorable" : {
  66. "Persistente" : {
  67. "Cte" : 1.35,
  68. "NoCte" : 1.5,
  69. "Variable" : 1.5
  70. },
  71. "Accidental" : {
  72. "Cte" : 1,
  73. "NoCte" : 1,
  74. "Variable" : 1,
  75. "Accidental" : 1
  76. }
  77. }
  78. },
  79. "ELS" : {
  80. "Favorable" : {
  81. "Persistente" : {
  82. "Cte" : 1,
  83. "NoCte" : 1,
  84. "Variable" : 0
  85. }
  86. },
  87. "Desfavorable" : {
  88. "Persistente" : {
  89. "Cte" : 1,
  90. "NoCte" : 1,
  91. "Variable" : 1
  92. }
  93. }
  94. }
  95. },
  96. "IAP" : {
  97. "CoefVar" : {
  98. "SCUso" : {
  99. "CVerticales" : {
  100. "psi0" : 0.4, #cuidado que para vehiculos pesados es 0.75
  101. "psi1" : 0.4, #cuidado que para vehiculos pesados es 0.75
  102. "psi2" : 0
  103. },
  104. "CHorizontales" : {
  105. "psi0" : 0,
  106. "psi1" : 0,
  107. "psi2" : 0
  108. },
  109. },
  110. "SCConstruccion" : {
  111. "psi0" : 1,
  112. "psi1" : 0,
  113. "psi2" : 1
  114. },
  115. },
  116. "ELU" : {
  117. "Favorable" : {
  118. "Persistente" : {
  119. "Cte" : 1,
  120. "NoCte" : 1,
  121. "Variable" : 0
  122. }
  123. },
  124. "Desfavorable" : {
  125. "Persistente" : {
  126. "Cte" : 1.35,
  127. "NoCte" : 1.5,
  128. "Variable" : 1.5
  129. }
  130. }
  131. },
  132. "ELS" : {
  133. "Favorable" : {
  134. "Persistente" : {
  135. "Cte" : 1,
  136. "NoCte" : 1,
  137. "Variable" : 0
  138. }
  139. },
  140. "Desfavorable" : {
  141. "Persistente" : {
  142. "Cte" : 1,
  143. "NoCte" : 1,
  144. "Variable" : 1
  145. }
  146. }
  147. }
  148. }
  149. }
  150. #Conexion con SAP2000
  151. helper = comtypes.client.CreateObject('SAP2000v1.Helper')
  152. helper = helper.QueryInterface(comtypes.gen.SAP2000v1.cHelper)
  153. mySapObject = helper.GetObject("CSI.SAP2000.API.SapObject")
  154. SapModel = mySapObject.SapModel
  155. SapModel.SetModelisLocked(False)
  156. #se pregunta si se desea borrar todo lo que hay en el SAP
  157. def borrar_combos_existentes():
  158. comboNames = SapModel.RespCombo.GetNameList()
  159. if comboNames[0] > 0:
  160. for name in comboNames[1]:
  161. ret = SapModel.RespCombo.Delete(name)
  162. printProgressBar(comboNames[1].index(name)+1, comboNames[0], prefix = 'Borrando combinaciones existentes:', suffix = 'Completado', length = 50)
  163. def borrar_load_cases():
  164. case_names = SapModel.LoadCases.GetNameList()
  165. if case_names[0] > 0:
  166. for name in case_names[1]:
  167. ret = SapModel.LoadCases.Delete(name)
  168. printProgressBar(case_names[1].index(name)+1, case_names[0], prefix = 'Borrando casos de carga existentes:', suffix = 'Completado', length = 50)
  169. def borrar_patrones_carga():
  170. patternNames = SapModel.LoadPatterns.GetNameList()
  171. if patternNames[0] > 0:
  172. for name in patternNames[1]:
  173. ret = SapModel.LoadPatterns.Delete(name)
  174. printProgressBar(patternNames[1].index(name)+1, patternNames[0], prefix = 'Borrando patrones de carga existentes:', suffix = 'Completado', length = 50)
  175. respuesta = input("¿Deseas borrar todos las combinaciones existentes? (Y/n): ")
  176. if respuesta.lower() == 'y' or len(respuesta) == 0:
  177. borrar_combos_existentes()
  178. respuesta = input("¿Deseas borrar todos las cargas existentes? (Y/n): ")
  179. if respuesta.lower() == 'y' or len(respuesta) == 0:
  180. borrar_load_cases()
  181. borrar_patrones_carga()
  182. #se selecciona la norma a utilizar para la comb acciones
  183. respuesta = input("¿La norma a seguir es la IAPF - 07? (Y / n [IAP - 11]): ")
  184. if respuesta.lower() == 'y' or len(respuesta) == 0:
  185. norma_proyecto = "IAPF"
  186. vias_cargadas = input("¿Cuantas vias hay cargadas a la vez 1, 2 o 3 (o más)?")
  187. else: "IAP"
  188. #Extraccion de datos del excel
  189. tk.Tk().withdraw()
  190. ruta_excel = askopenfilename()
  191. #ruta_excel = "C:/Users/Daniel.p/Documents/14. Ay-A 0042 Foso ataque empuje tubos y cimentaciones grua ( PALENCIA)/1. MEMORIA/Comb_acciones.xlsx"
  192. compatibilidades_df = pd.read_excel(ruta_excel,
  193. sheet_name='Compatibilidades')
  194. restricciones_df = pd.read_excel(ruta_excel,
  195. sheet_name='Restricciones')
  196. #Limpieza de filas vacias
  197. x, y = compatibilidades_df.shape
  198. for i in range(x):
  199. if (compatibilidades_df.loc[i, compatibilidades_df.columns.values[0]] == 0):
  200. compatibilidades_df=compatibilidades_df.drop(i)
  201. for i in range(y-1, 0, -1):
  202. col_name = compatibilidades_df.columns.values[i]
  203. if (isinstance(compatibilidades_df[col_name].name, int)):
  204. compatibilidades_df = compatibilidades_df.drop(col_name, axis=1)
  205. elif isinstance(col_name, str) and col_name.startswith("0"):
  206. compatibilidades_df = compatibilidades_df.drop(col_name, axis=1)
  207. x, y = compatibilidades_df.shape
  208. for i in range(1, x+1):
  209. for j in range(i-1):
  210. if not isinstance(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]], str):
  211. if math.isnan(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]]):
  212. compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]] = 'r'
  213. #cambio de los valores Nan por 0
  214. compatibilidades_df = compatibilidades_df.fillna(0)
  215. print(compatibilidades_df)
  216. restricciones_df = restricciones_df.fillna(0)
  217. #creacion de load patterns
  218. for i in restricciones_df.loc[:, "Definición de 'Load Cases'"]:
  219. ret = SapModel.LoadPatterns.Add(i, 3) #el numero indica el tipo de carga: 1 dead, 3 live ..
  220. #Se almacena en esta variable un diccionario indicando los estado en los que se puede encontrar la carga
  221. valores_por_patron = {}
  222. for index, row in restricciones_df.iterrows():
  223. patron = restricciones_df.loc[:,restricciones_df.columns[0]]
  224. valores = [0, 1]
  225. if row["Bidireccional?"]:
  226. valores.append(-1)
  227. valores_por_patron[patron[index]] = list(set(valores))
  228. #creacion del array donde se almancenan los nombres de las cargas
  229. patrones = list(valores_por_patron.keys())
  230. #se hace con itertools todas las combinaciones de carga posibles sin ninguna restriccion
  231. todas_combinaciones = list(itertools.product(*[valores_por_patron[pat] for pat in patrones]))
  232. #funcion para comprobar que la combiacion de cargas es posible debido a las restricciones
  233. def validar_combinacion(comb, patrones, compatibilidad_df, restricciones_df):
  234. #se comprueba la matriz de compatibilidad buscando por cada caga que este activa en este combo
  235. #otra targa que este activa y se comprueba en la matriz buscando una 'r'
  236. for i in range(len(patrones)):
  237. if comb[i]:
  238. for j in range(i+1, len(patrones)):
  239. if comb[j]:
  240. if compatibilidad_df.iloc[i,j+1] == 'r':
  241. return False
  242. #se comprueba que la carga que esta activa esta con otra carga especificada como condicional
  243. #para que la primera exista
  244. restriccion = restricciones_df.loc[:,"Si y solo si"]
  245. for iter, res in enumerate(restriccion):
  246. if res:
  247. idx = patrones.index(res)
  248. if comb[iter] and not comb[idx]:
  249. return False
  250. #comprueba que las cargas especificadas como permanentes se encuentran en este caso de carga
  251. permanentes = restricciones_df.loc[:,"Permanentes"]
  252. for iter, per in enumerate(permanentes):
  253. if per != 0:
  254. if not(per=='x' and comb[iter]):
  255. return False
  256. #comprueba que no hay dos acciones accidentales en la misma combinacion
  257. accidentales = restricciones_df.loc[:,"Tipo"]
  258. num_acc = 0
  259. for iter, acc in enumerate(accidentales):
  260. if acc == "Accidental":
  261. if comb[iter]:
  262. num_acc += 1
  263. if num_acc > 1:
  264. return False
  265. #comprueba que con sismo solo hay una carga variable
  266. sismo = restricciones_df.loc[:,"Accion IAPF"]
  267. num_var = 0
  268. for iter, sis in enumerate(sismo):
  269. if sis == "Sismo":
  270. if comb[iter]:
  271. for jter, _ in enumerate(comb):
  272. if (restricciones_df.loc[jter,"Tipo"] == "Variable") and comb[jter] != 0:
  273. num_var += 1
  274. if num_var > 1:
  275. return False
  276. #si no cumple ninguna de las restricciones se considera válida la combinacion
  277. return True
  278. #comprobacion de la validez de las combinaciones
  279. combinaciones_validas = []
  280. for comb in todas_combinaciones:
  281. if validar_combinacion(comb, patrones, compatibilidades_df, restricciones_df):
  282. combinaciones_validas.append(comb)
  283. #funcion para hacer la suma en valor absoluto de un array
  284. def suma_abs(lista):
  285. for _ in range(len(lista)): total += abs(lista[_])
  286. return total
  287. num_permanentes = 0
  288. #se obtiene el numero de cargas que son permanentes
  289. for iter, per in enumerate(restricciones_df.loc[:,"Permanentes"]):
  290. if per == 'x' : num_permanentes += 1
  291. def CrearCombo(nombre, numero, combo, coef):
  292. global SapModel
  293. global patrones
  294. nombre_combo = nombre + "{:04}".format(numero)
  295. ret = SapModel.RespCombo.Add(nombre_combo, 0)
  296. for idx, patron in enumerate(patrones):
  297. coeficiente = combo[idx]
  298. if coeficiente != 0:
  299. ret = SapModel.RespCombo.SetCaseList(nombre_combo, 0, patron, coeficiente*coef[idx])
  300. combos_ELUP = []
  301. combos_ELUA = []
  302. combos_ELUS = []
  303. combos_ELSC = []
  304. combos_ELSF = []
  305. combos_ELSCP = []
  306. minorados_ELUP = []
  307. minorados_ELSC = []
  308. minorados_ELSF = []
  309. minorados_ELSCP = []
  310. minorados_ELUA = []
  311. minorados_ELUS = []
  312. for combo in combinaciones_validas:
  313. coeficientes_ELUP = np.zeros(len(patrones))
  314. coeficientes_ELUA = np.zeros(len(patrones))
  315. coeficientes_ELUS = np.zeros(len(patrones))
  316. coeficientes_ELSC = np.zeros(len(patrones))
  317. coeficientes_ELSF = np.zeros(len(patrones))
  318. coeficientes_ELSCP = np.zeros(len(patrones))
  319. n_var = 0
  320. n_acc = 0
  321. for i in range(len(combo)):
  322. if norma_proyecto == "IAPF":
  323. #primero se comprueba si la carga es permanente o no
  324. if restricciones_df.loc[i,"Permanentes"]:
  325. #luego constante o no
  326. if restricciones_df.loc[i,"Tipo"] == "Constante":
  327. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  328. #ELU
  329. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Cte"]
  330. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
  331. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
  332. #ELS
  333. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  334. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  335. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  336. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  337. #ELU
  338. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Cte"]
  339. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
  340. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
  341. #ELS
  342. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  343. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  344. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  345. elif restricciones_df.loc[i,"Tipo"] == "No Constante":
  346. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  347. #ELU
  348. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["NoCte"]
  349. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
  350. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
  351. #ELS
  352. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  353. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  354. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  355. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  356. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["NoCte"]
  357. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
  358. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
  359. #ELS
  360. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  361. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  362. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  363. elif restricciones_df.loc[i,"Tipo"] == "Accidental":
  364. if combo[i] != 0: n_acc += 1
  365. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  366. #ELU
  367. coeficientes_ELUP[i] = 0
  368. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
  369. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
  370. #ELS
  371. coeficientes_ELSC[i] = 0
  372. coeficientes_ELSF[i] = 0
  373. coeficientes_ELSCP[i] = 0
  374. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  375. #ELU
  376. coeficientes_ELUP[i] = 0
  377. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
  378. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
  379. #ELS
  380. coeficientes_ELSC[i] = 0
  381. coeficientes_ELSF[i] = 0
  382. coeficientes_ELSCP[i] = 0
  383. elif restricciones_df.loc[i,"Tipo"] == "Variable":
  384. if combo[i] != 0: n_var += 1
  385. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  386. #ELU
  387. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Variable"]
  388. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
  389. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
  390. #ELS
  391. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  392. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  393. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  394. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  395. #ELU
  396. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Variable"]
  397. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
  398. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
  399. #ELS
  400. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  401. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  402. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  403. elif norma_proyecto == "IAP":
  404. pass
  405. minorados_ELUP.clear()
  406. minorados_ELUA.clear()
  407. minorados_ELUS.clear()
  408. minorados_ELSC.clear()
  409. minorados_ELSF.clear()
  410. minorados_ELSCP.clear()
  411. if n_acc:
  412. coef_var_ELUS = np.ones(len(patrones))
  413. coef_var_ELUA = np.ones(len(patrones))
  414. for i in range(len(combo)):
  415. if (restricciones_df.loc[i,"Accion IAPF"] == "Sismo") and combo[i] != 0:
  416. for j in range(len(combo)):
  417. if (restricciones_df.loc[j,"Tipo"] == "Variable") and j:
  418. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  419. coef_var_ELUS[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  420. if restricciones_df.loc[j,"Accion IAPF"] == "Resto":
  421. coef_var_ELUS[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  422. minorados_ELUS.append(coef_var_ELUS)
  423. if (restricciones_df.loc[i,"Accion IAPF"] != "Sismo") and (restricciones_df.loc[i,"Tipo"] == "Accidental") and combo[i] != 0:
  424. for k in range(len(combo)):
  425. coef_var_ELUA = np.ones(len(patrones))
  426. if restricciones_df.loc[k,"Tipo"] == "Variable":
  427. if restricciones_df.loc[k,"Accion IAPF"] == "Trafico":
  428. coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  429. else:
  430. coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  431. for j in range(len(combo)):
  432. if (restricciones_df.loc[j,"Tipo"] == "Variable") and (j != k):
  433. #se asigna el coeficiente de la variable al resto de variables
  434. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  435. coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  436. else:
  437. coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  438. minorados_ELUP.append(coef_var_ELUA)
  439. else:
  440. if n_var == 1:
  441. coef_var_ELSF = np.ones(len(patrones))
  442. coef_var_ELSCP = np.ones(len(patrones))
  443. for i in range(len(combo)):
  444. if (restricciones_df.loc[i,"Tipo"] == "Variable") and combo[i] != 0:
  445. if restricciones_df.loc[i,"Accion IAPF"] == "Trafico":
  446. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  447. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  448. else:
  449. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  450. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  451. while n_var > 1:
  452. n_var -= 1
  453. #se busca la primera variable en el combo y se asigna el coeficiente
  454. for i in range(len(combo)):
  455. coef_var_ELUP = np.ones(len(patrones))
  456. coef_var_ELSC = np.ones(len(patrones))
  457. coef_var_ELSF = np.ones(len(patrones))
  458. coef_var_ELSCP = np.ones(len(patrones))
  459. if (restricciones_df.loc[i,"Tipo"] == "Variable") and combo[i] != 0:
  460. if restricciones_df.loc[i,"Accion IAPF"] == "Trafico":
  461. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  462. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  463. else:
  464. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  465. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  466. for j in range(len(combo)):
  467. if (restricciones_df.loc[j,"Tipo"] == "Variable") and (j != i):
  468. #se asigna el coeficiente de la variable al resto de variables
  469. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  470. coef_var_ELUP[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi0"]
  471. coef_var_ELSC[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi0"]
  472. coef_var_ELSF[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  473. coef_var_ELSCP[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  474. else:
  475. coef_var_ELUP[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi0"]
  476. coef_var_ELSC[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi0"]
  477. coef_var_ELSF[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  478. coef_var_ELSCP[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  479. minorados_ELUP.append(coef_var_ELUP)
  480. minorados_ELSC.append(coef_var_ELSC)
  481. minorados_ELSF.append(coef_var_ELSF)
  482. minorados_ELSCP.append(coef_var_ELSCP)
  483. if minorados_ELUP:
  484. for minorado in minorados_ELUP:
  485. combos_ELUP.append(np.multiply(np.multiply(coeficientes_ELUP, combo),minorado))
  486. for minorado in minorados_ELSC:
  487. combos_ELSC.append(np.multiply(np.multiply(coeficientes_ELSC, combo),minorado))
  488. for minorado in minorados_ELSF:
  489. combos_ELSF.append(np.multiply(np.multiply(coeficientes_ELSF, combo),minorado))
  490. for minorado in minorados_ELSCP:
  491. combos_ELSCP.append(np.multiply(np.multiply(coeficientes_ELSCP, combo),minorado))
  492. else:
  493. combos_ELUP.append(np.multiply(coeficientes_ELUP, combo))
  494. combos_ELSC.append(np.multiply(coeficientes_ELSC, combo))
  495. 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))
  496. 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))
  497. if minorados_ELUS:
  498. for minorado in minorados_ELUS:
  499. combos_ELUS.append(np.multiply(np.multiply(coeficientes_ELUS, combo),minorado))
  500. if minorados_ELUA:
  501. for minorado in minorados_ELUA:
  502. combos_ELUA.append(np.multiply(np.multiply(coeficientes_ELUA, combo),minorado))
  503. combos_ELUP = np.unique(np.array(combos_ELUP), axis=0)
  504. combos_ELUA = np.unique(np.array(combos_ELUA), axis=0)
  505. combos_ELUS = np.unique(np.array(combos_ELUS), axis=0)
  506. combos_ELSC = np.unique(np.array(combos_ELSC), axis=0)
  507. combos_ELSF = np.unique(np.array(combos_ELSF), axis=0)
  508. combos_ELSCP = np.unique(np.array(combos_ELSCP), axis=0)
  509. print("------------------------------------------------")
  510. print(combos_ELUP)
  511. print(len(combos_ELUP))
  512. print("------------------------------------------------")
  513. print(combos_ELUA)
  514. print(len(combos_ELUA))
  515. print("------------------------------------------------")
  516. print(combos_ELUS)
  517. print(len(combos_ELUS))
  518. print("------------------------------------------------")
  519. print(combos_ELSC)
  520. print(len(combos_ELSC))
  521. print("------------------------------------------------")
  522. print(combos_ELSF)
  523. print(len(combos_ELSF))
  524. print("------------------------------------------------")
  525. print(combos_ELSCP)
  526. print(len(combos_ELSCP))
  527. total_combos = len(combos_ELUP) + len(combos_ELSC) + len(combos_ELSF) + len(combos_ELSCP) + len(combos_ELUA) + len(combos_ELUS)
  528. #creacion de los combos en SAP2000
  529. #creacion de los combos ELU Permantentes
  530. combo_num = 0
  531. for combo in combos_ELUP:
  532. combo_name = "ELU_P_{:03d}".format(combo_num)
  533. ret = SapModel.RespCombo.Add(combo_name, 0)
  534. for idx, patron in enumerate(patrones):
  535. coeficiente = combo[idx]
  536. if coeficiente != 0:
  537. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  538. printProgressBar(combo_num, total_combos, prefix = 'Creando combos ELU Persistente:', suffix = 'Completado', length = 50)
  539. combo_num += 1
  540. #creacion de los combos ELU Accidentales
  541. tot = combo_num
  542. combo_num = 0
  543. for combo in combos_ELUA:
  544. combo_name = "ELU_ACC_{:03d}".format(combo_num)
  545. ret = SapModel.RespCombo.Add(combo_name, 0)
  546. for idx, patron in enumerate(patrones):
  547. coeficiente = combo[idx]
  548. if coeficiente != 0:
  549. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  550. printProgressBar(combo_num, total_combos, prefix = 'Creando combos ELU Accidental:', suffix = 'Completado', length = 50)
  551. combo_num += 1
  552. #creacion de los combos ELU Sismo
  553. tot += combo_num
  554. combo_num = 0
  555. for combo in combos_ELUS:
  556. combo_name = "ELU_SIS_{:03d}".format(combo_num)
  557. ret = SapModel.RespCombo.Add(combo_name, 0)
  558. for idx, patron in enumerate(patrones):
  559. coeficiente = combo[idx]
  560. if coeficiente != 0:
  561. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  562. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELU Sismo:', suffix = 'Completado', length = 50)
  563. combo_num += 1
  564. #creacion de los combos ELS Caracteristico
  565. tot += combo_num
  566. combo_num = 0
  567. for combo in combos_ELSC:
  568. combo_name = "ELS_C_{:03d}".format(combo_num)
  569. ret = SapModel.RespCombo.Add(combo_name, 0)
  570. for idx, patron in enumerate(patrones):
  571. coeficiente = combo[idx]
  572. if coeficiente != 0:
  573. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  574. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELS Caracteristico:', suffix = 'Completado', length = 50)
  575. combo_num += 1
  576. #creacion de los combos ELS Frecuente
  577. tot += combo_num
  578. combo_num = 0
  579. for combo in combos_ELSF:
  580. combo_name = "ELS_F_{:03d}".format(combo_num)
  581. ret = SapModel.RespCombo.Add(combo_name, 0)
  582. for idx, patron in enumerate(patrones):
  583. coeficiente = combo[idx]
  584. if coeficiente != 0:
  585. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  586. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELS Frecuente:', suffix = 'Completado', length = 50)
  587. combo_num += 1
  588. #creacion de los combos ELS Cuasi Permanente
  589. tot += combo_num
  590. combo_num = 0
  591. for combo in combos_ELSCP:
  592. combo_name = "ELS_CP_{:03d}".format(combo_num)
  593. ret = SapModel.RespCombo.Add(combo_name, 0)
  594. for idx, patron in enumerate(patrones):
  595. coeficiente = combo[idx]
  596. if coeficiente != 0:
  597. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  598. printProgressBar(tot+combo_num, total_combos, prefix = 'Creando combos ELS Cuasipermanente:', suffix = 'Completado', length = 50)
  599. combo_num += 1
  600. printProgressBar(total_combos, total_combos, prefix = 'Creando combos ELS Cuasipermanente:', suffix = 'Completado', length = 50)
  601. #creacion del combo envolvente
  602. print()
  603. combo_name = "1. ENV ELU P"
  604. ret = SapModel.RespCombo.Add(combo_name, 1)
  605. comboNames = SapModel.RespCombo.GetNameList()
  606. patron = []
  607. for i in range(comboNames[0]):
  608. if "ELU_P" in comboNames[1][i]: patron.append(comboNames[1][i])
  609. for i, name in enumerate(patron):
  610. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  611. printProgressBar(i+1, comboNames[0], prefix = 'Creando combo envolvente ELU P:', suffix = 'Completado', length = 50)
  612. n=i
  613. combo_name = "2. ENV ELU ACC"
  614. ret = SapModel.RespCombo.Add(combo_name, 1)
  615. comboNames = SapModel.RespCombo.GetNameList()
  616. patron = []
  617. for i in range(comboNames[0]):
  618. if "ELU_ACC" in comboNames[1][i]: patron.append(comboNames[1][i])
  619. for i, name in enumerate(patron):
  620. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  621. printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELU ACC:', suffix = 'Completado', length = 50)
  622. n+=i
  623. combo_name = "3. ENV ELU SIS"
  624. ret = SapModel.RespCombo.Add(combo_name, 1)
  625. comboNames = SapModel.RespCombo.GetNameList()
  626. patron = []
  627. for i in range(comboNames[0]):
  628. if "ELU_SIS" in comboNames[1][i]: patron.append(comboNames[1][i])
  629. for i, name in enumerate(patron):
  630. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  631. printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELU ACC:', suffix = 'Completado', length = 50)
  632. n+=i
  633. combo_name = "4. ENV ELS C"
  634. ret = SapModel.RespCombo.Add(combo_name, 1)
  635. comboNames = SapModel.RespCombo.GetNameList()
  636. patron = []
  637. for i in range(comboNames[0]):
  638. if "ELS_C_" in comboNames[1][i]: patron.append(comboNames[1][i])
  639. for i, name in enumerate(patron):
  640. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  641. printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELS C:', suffix = 'Completado', length = 50)
  642. n+=i
  643. combo_name = "5. ENV ELS F"
  644. ret = SapModel.RespCombo.Add(combo_name, 1)
  645. comboNames = SapModel.RespCombo.GetNameList()
  646. patron = []
  647. for i in range(comboNames[0]):
  648. if "ELS_F_" in comboNames[1][i]: patron.append(comboNames[1][i])
  649. for i, name in enumerate(patron):
  650. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  651. printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELS F:', suffix = 'Completado', length = 50)
  652. n+=i
  653. combo_name = "6. ENV ELS CP"
  654. ret = SapModel.RespCombo.Add(combo_name, 1)
  655. comboNames = SapModel.RespCombo.GetNameList()
  656. patron = []
  657. for i in range(comboNames[0]):
  658. if "ELS_CP" in comboNames[1][i]: patron.append(comboNames[1][i])
  659. for i, name in enumerate(patron):
  660. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  661. printProgressBar(n+i+1, comboNames[0], prefix = 'Creando combo envolvente ELS CP:', suffix = 'Completado', length = 50)
  662. printProgressBar(comboNames[0], comboNames[0], prefix = 'Creando combo envolvente ELS CP:', suffix = 'Completado', length = 50)
  663. print()
  664. print("Combinaciones de acciones creadas con éxito.")