Comb_acciones.py 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144
  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, messagebox, scrolledtext
  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 *
  16. import threading
  17. import time
  18. # Códigos ANSI de color
  19. ROJO = '\033[91m'
  20. VERDE = '\033[92m'
  21. AMARILLO = '\033[93m'
  22. AZUL = '\033[94m'
  23. RESET = '\033[0m'
  24. # Print iterations progress
  25. def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r", clear_line = False):
  26. """
  27. Call in a loop to create terminal progress bar
  28. @params:
  29. iteration - Required : current iteration (Int)
  30. total - Required : total iterations (Int)
  31. prefix - Optional : prefix string (Str)
  32. suffix - Optional : suffix string (Str)
  33. decimals - Optional : positive number of decimals in percent complete (Int)
  34. length - Optional : character length of bar (Int)
  35. fill - Optional : bar fill character (Str)
  36. printEnd - Optional : end character (e.g. "\r", "\r\n") (Str)
  37. clear_line - Optional : if True, clears the line instead of adding newline when complete (Bool)
  38. """
  39. percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
  40. filledLength = int(length * iteration // total)
  41. bar = fill * filledLength + '-' * (length - filledLength)
  42. line = f'{prefix} |{bar}| {percent}% {suffix}'
  43. # Agregar espacios al final para limpiar líneas anteriores más largas
  44. print(f'\r{line:<150}', end = printEnd)
  45. # Print New Line on Complete
  46. if iteration == total:
  47. if clear_line:
  48. print('\r' + ' ' * 150 + '\r', end = '')
  49. else:
  50. print()
  51. time.sleep(0.01)
  52. #diccionario donde se encuentran todos los coef de comb acciones de las normas
  53. normas = {
  54. "IAPF" : {
  55. "CoefVar" : {
  56. "Trafico" : {
  57. "psi0" : 0.8,
  58. "psi1" : {
  59. "1" : 0.8,
  60. "2" : 0.6,
  61. "3" : 0.4
  62. },
  63. "psi2" : 0
  64. },
  65. "Resto" : {
  66. "psi0" : 0.6,
  67. "psi1" : 0.5,
  68. "psi2" : 0.2
  69. }
  70. },
  71. "ELU" : {
  72. "Favorable" : {
  73. "Persistente" : {
  74. "Cte" : 1,
  75. "NoCte" : 1,
  76. "Variable" : 0
  77. },
  78. "Accidental" : {
  79. "Cte" : 1,
  80. "NoCte" : 1,
  81. "Variable" : 0,
  82. "Accidental" : 1
  83. }
  84. },
  85. "Desfavorable" : {
  86. "Persistente" : {
  87. "Cte" : 1.35,
  88. "NoCte" : 1.5,
  89. "Variable" : 1.5
  90. },
  91. "Accidental" : {
  92. "Cte" : 1,
  93. "NoCte" : 1,
  94. "Variable" : 1,
  95. "Accidental" : 1
  96. }
  97. }
  98. },
  99. "ELS" : {
  100. "Favorable" : {
  101. "Persistente" : {
  102. "Cte" : 1,
  103. "NoCte" : 1,
  104. "Variable" : 0
  105. }
  106. },
  107. "Desfavorable" : {
  108. "Persistente" : {
  109. "Cte" : 1,
  110. "NoCte" : 1,
  111. "Variable" : 1
  112. }
  113. }
  114. }
  115. },
  116. "IAP" : {
  117. "CoefVar" : {
  118. "SCUso" : {
  119. "CVerticales" : {
  120. "psi0" : 0.4, #cuidado que para vehiculos pesados es 0.75
  121. "psi1" : 0.4, #cuidado que para vehiculos pesados es 0.75
  122. "psi2" : 0
  123. },
  124. "CHorizontales" : {
  125. "psi0" : 0,
  126. "psi1" : 0,
  127. "psi2" : 0
  128. },
  129. },
  130. "SCConstruccion" : {
  131. "psi0" : 1,
  132. "psi1" : 0,
  133. "psi2" : 1
  134. },
  135. },
  136. "ELU" : {
  137. "Favorable" : {
  138. "Persistente" : {
  139. "Cte" : 1,
  140. "NoCte" : 1,
  141. "Variable" : 0
  142. }
  143. },
  144. "Desfavorable" : {
  145. "Persistente" : {
  146. "Cte" : 1.35,
  147. "NoCte" : 1.5,
  148. "Variable" : 1.5
  149. }
  150. }
  151. },
  152. "ELS" : {
  153. "Favorable" : {
  154. "Persistente" : {
  155. "Cte" : 1,
  156. "NoCte" : 1,
  157. "Variable" : 0
  158. }
  159. },
  160. "Desfavorable" : {
  161. "Persistente" : {
  162. "Cte" : 1,
  163. "NoCte" : 1,
  164. "Variable" : 1
  165. }
  166. }
  167. }
  168. }
  169. }
  170. class TimeoutException(Exception):
  171. pass
  172. def raise_timeout():
  173. raise TimeoutException()
  174. timer = threading.Timer(20.0, raise_timeout) #se crea un timer de 20 segundos
  175. timer.start()
  176. try:
  177. #Conexion con SAP2000
  178. helper = comtypes.client.CreateObject('SAP2000v1.Helper')
  179. helper = helper.QueryInterface(comtypes.gen.SAP2000v1.cHelper)
  180. mySapObject = helper.GetObject("CSI.SAP2000.API.SapObject")
  181. SapModel = mySapObject.SapModel
  182. if not SapModel.GetModelisLocked(): SapModel.SetModelisLocked(False)
  183. except TimeoutException as exc:
  184. messagebox.showerror(
  185. "Error",
  186. "No se encuentra una instancia de SAP2000 abierta. Por favor, abra SAP2000 e intente de nuevo."
  187. )
  188. sys.exit(1)
  189. finally:
  190. timer.cancel()
  191. # Creacion del material B500 SD
  192. ret_get, _, _, _, _ = SapModel.PropMaterial.GetMaterial("B500 SD")
  193. if ret_get == 0:
  194. ret =SapModel.PropMaterial.AddQuick("Rebar", 6)
  195. SapModel.PropMaterial.ChangeName(ret[0], "B500 SD")
  196. SapModel.SetPresentUnits(6) #kN, m, C
  197. SapModel.PropMaterial.SetMPUniaxial("B500 SD", 2e8, 1.17e-5)
  198. SapModel.PropMaterial.SetORebar_1("B500 SD", 500000, 620000, 540000, 680000, 0, 0, 0, 0, 0, False)
  199. #se pregunta si se desea borrar todo lo que hay en el SAP
  200. def borrar_combos_existentes():
  201. comboNames = SapModel.RespCombo.GetNameList()
  202. if comboNames[0] > 0:
  203. for name in comboNames[1]:
  204. ret = SapModel.RespCombo.Delete(name)
  205. printProgressBar(comboNames[1].index(name)+1, comboNames[0], prefix = 'Borrando combinaciones existentes:', suffix = 'Completado', length = 50)
  206. def borrar_load_cases():
  207. case_names = SapModel.LoadCases.GetNameList()
  208. if case_names[0] > 0:
  209. for name in case_names[1]:
  210. ret = SapModel.LoadCases.Delete(name)
  211. printProgressBar(case_names[1].index(name)+1, case_names[0], prefix = 'Borrando casos de carga existentes:', suffix = 'Completado', length = 50)
  212. def borrar_patrones_carga():
  213. patternNames = SapModel.LoadPatterns.GetNameList()
  214. if patternNames[0] > 0:
  215. for name in patternNames[1]:
  216. ret = SapModel.LoadPatterns.Delete(name)
  217. printProgressBar(patternNames[1].index(name)+1, patternNames[0], prefix = 'Borrando patrones de carga existentes:', suffix = 'Completado', length = 50)
  218. def extraer_datos_excel(ruta_excel):
  219. compatibilidades_df = pd.read_excel(ruta_excel,
  220. sheet_name='Compatibilidades')
  221. compatibilidades_df = compatibilidades_df.astype(object)
  222. restricciones_df = pd.read_excel(ruta_excel,
  223. sheet_name='Restricciones')
  224. #Limpieza de filas vacias
  225. x, y = compatibilidades_df.shape
  226. for i in range(x):
  227. if (compatibilidades_df.loc[i, compatibilidades_df.columns.values[0]] == 0):
  228. compatibilidades_df=compatibilidades_df.drop(i)
  229. for i in range(y-1, 0, -1):
  230. col_name = compatibilidades_df.columns.values[i]
  231. if (isinstance(compatibilidades_df[col_name].name, int)):
  232. compatibilidades_df = compatibilidades_df.drop(col_name, axis=1)
  233. elif isinstance(col_name, str) and col_name.startswith("0"):
  234. compatibilidades_df = compatibilidades_df.drop(col_name, axis=1)
  235. x, y = compatibilidades_df.shape
  236. for i in range(1, x+1):
  237. for j in range(i-1):
  238. if not isinstance(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]], str):
  239. if math.isnan(compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]]):
  240. compatibilidades_df.loc[j, compatibilidades_df.columns.values[i]] = 'x'
  241. #cambio de los valores Nan por 0
  242. compatibilidades_df = compatibilidades_df.fillna(0).infer_objects(copy=False)
  243. restricciones_df = restricciones_df.fillna(0)
  244. return compatibilidades_df, restricciones_df
  245. def creaccion_acciones(restricciones_df):
  246. #creacion de load patterns
  247. for i in restricciones_df.loc[:, "Definición de 'Load Cases'"]:
  248. ret = SapModel.LoadPatterns.Add(i, 3) #el numero indica el tipo de carga: 1 dead, 3 live ..
  249. #funcion para comprobar que la combiacion de cargas es posible debido a las restricciones
  250. def validar_combinacion(comb, patrones, compatibilidad_df, restricciones_df):
  251. #se comprueba la matriz de compatibilidad buscando por cada carga que este activa en este combo
  252. #otra carga que este activa y se comprueba en la matriz buscando una 'r'
  253. for i in range(len(patrones)):
  254. if comb[i]:
  255. for j in range(i+1, len(patrones)):
  256. if comb[j]:
  257. if compatibilidad_df.iloc[i,j+1] == 'r':
  258. return False
  259. #se comprueba que la carga que esta activa esta con otra carga especificada como condicional
  260. #para que la primera exista
  261. restriccion = restricciones_df.loc[:,"Si y solo si"]
  262. for iter, res in enumerate(restriccion):
  263. if res:
  264. idx = patrones.index(res)
  265. if comb[iter] and not comb[idx]:
  266. return False
  267. #comprueba que las cargas especificadas como permanentes se encuentran en este caso de carga
  268. permanentes = restricciones_df.loc[:,"Permanentes"]
  269. for iter, per in enumerate(permanentes):
  270. if per != 0:
  271. if not(per=='x' and comb[iter]):
  272. return False
  273. #comprueba que no hay dos acciones accidentales en la misma combinacion
  274. accidentales = restricciones_df.loc[:,"Tipo"]
  275. num_acc = 0
  276. for iter, acc in enumerate(accidentales):
  277. if acc == "Accidental":
  278. if comb[iter]:
  279. num_acc += 1
  280. if num_acc > 1:
  281. return False
  282. #comprueba que con sismo solo hay una carga variable
  283. sismo = restricciones_df.loc[:,"Accion IAPF"]
  284. num_var = 0
  285. for iter, sis in enumerate(sismo):
  286. if sis == "Sismo":
  287. if comb[iter]:
  288. for jter, _ in enumerate(comb):
  289. if (restricciones_df.loc[jter,"Tipo"] == "Variable") and comb[jter] != 0:
  290. num_var += 1
  291. if num_var > 1:
  292. return False
  293. #si no cumple ninguna de las restricciones se considera válida la combinacion
  294. return True
  295. #funcion principal para crear y validar las combinaciones de cargas
  296. def crear_validar_combinaciones(restricciones_df, compatibilidades_df):
  297. #Se almacena en esta variable un diccionario indicando los estado en los que se puede encontrar la carga
  298. valores_por_patron = {}
  299. for index, row in restricciones_df.iterrows():
  300. patron = restricciones_df.loc[:,restricciones_df.columns[0]]
  301. valores = [0, 1]
  302. if row["Bidireccional?"]:
  303. valores.append(-1)
  304. valores_por_patron[patron[index]] = list(set(valores))
  305. #creacion del array donde se almancenan los nombres de las cargas
  306. patrones = list(valores_por_patron.keys())
  307. #se hace con itertools todas las combinaciones de carga posibles sin ninguna restriccion
  308. todas_combinaciones = list(itertools.product(*[valores_por_patron[pat] for pat in patrones]))
  309. #comprobacion de la validez de las combinaciones
  310. combinaciones_validas = []
  311. for comb in todas_combinaciones:
  312. if validar_combinacion(comb, patrones, compatibilidades_df, restricciones_df):
  313. combinaciones_validas.append(comb)
  314. return combinaciones_validas, patrones
  315. def limpiar_combos(combos, mascara, coef_comp, restricciones_df):
  316. num_permanentes = 0
  317. for i, _ in enumerate(restricciones_df.loc[:,"Tipo"]):
  318. if restricciones_df.loc[i,"Tipo"] == "No constante":
  319. num_permanentes += 1
  320. combos_limpios = []
  321. for combo in combos:
  322. peligro = 0
  323. combo_masc = np.multiply(combo, mascara)
  324. for i, _ in enumerate(combo_masc):
  325. if combo_masc[i] == coef_comp:
  326. peligro += 1
  327. if peligro < 2 + num_permanentes:
  328. combos_limpios.append(combo)
  329. return np.array(combos_limpios)
  330. def generar_combinaciones_norma_IAPF(combinaciones_validas, restricciones_df, norma_proyecto, vias_cargadas, patrones):
  331. combos_ELUP = []
  332. combos_ELUA = []
  333. combos_ELUS = []
  334. combos_ELSC = []
  335. combos_ELSF = []
  336. combos_ELSCP = []
  337. minorados_ELUP = []
  338. minorados_ELSC = []
  339. minorados_ELSF = []
  340. minorados_ELSCP = []
  341. minorados_ELUA = []
  342. minorados_ELUS = []
  343. for combo in combinaciones_validas:
  344. coeficientes_ELUP = np.zeros(len(patrones))
  345. coeficientes_ELUA = np.zeros(len(patrones))
  346. coeficientes_ELUS = np.zeros(len(patrones))
  347. coeficientes_ELSC = np.zeros(len(patrones))
  348. coeficientes_ELSF = np.zeros(len(patrones))
  349. coeficientes_ELSCP = np.zeros(len(patrones))
  350. n_var = 0
  351. n_acc = 0
  352. for i in range(len(combo)):
  353. if norma_proyecto == "IAPF":
  354. #primero se comprueba si la carga es permanente o no
  355. if restricciones_df.loc[i,"Permanentes"]:
  356. #luego constante o no
  357. if restricciones_df.loc[i,"Tipo"] == "Constante":
  358. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  359. #ELU
  360. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Cte"]
  361. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
  362. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Cte"]
  363. #ELS
  364. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  365. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  366. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Cte"]
  367. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  368. #ELU
  369. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Cte"]
  370. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
  371. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Cte"]
  372. #ELS
  373. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  374. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  375. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Cte"]
  376. elif restricciones_df.loc[i,"Tipo"] == "No constante":
  377. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  378. #ELU
  379. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["NoCte"]
  380. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
  381. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["NoCte"]
  382. #ELS
  383. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  384. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  385. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["NoCte"]
  386. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  387. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["NoCte"]
  388. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
  389. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["NoCte"]
  390. #ELS
  391. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  392. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  393. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["NoCte"]
  394. elif restricciones_df.loc[i,"Tipo"] == "Accidental":
  395. if combo[i] != 0: n_acc += 1
  396. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  397. #ELU
  398. coeficientes_ELUP[i] = 0
  399. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
  400. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Accidental"]
  401. #ELS
  402. coeficientes_ELSC[i] = 0
  403. coeficientes_ELSF[i] = 0
  404. coeficientes_ELSCP[i] = 0
  405. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  406. #ELU
  407. coeficientes_ELUP[i] = 0
  408. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
  409. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Accidental"]
  410. #ELS
  411. coeficientes_ELSC[i] = 0
  412. coeficientes_ELSF[i] = 0
  413. coeficientes_ELSCP[i] = 0
  414. elif restricciones_df.loc[i,"Tipo"] == "Variable":
  415. if combo[i] != 0: n_var += 1
  416. if restricciones_df.loc[i,"Direccion"] == "Desfavorable":
  417. #ELU
  418. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Persistente"]["Variable"]
  419. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
  420. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Desfavorable"]["Accidental"]["Variable"]
  421. #ELS
  422. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  423. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  424. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Desfavorable"]["Persistente"]["Variable"]
  425. elif restricciones_df.loc[i,"Direccion"] == "Favorable":
  426. #ELU
  427. coeficientes_ELUP[i] = normas["IAPF"]["ELU"]["Favorable"]["Persistente"]["Variable"]
  428. coeficientes_ELUA[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
  429. coeficientes_ELUS[i] = normas["IAPF"]["ELU"]["Favorable"]["Accidental"]["Variable"]
  430. #ELS
  431. coeficientes_ELSC[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  432. coeficientes_ELSF[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  433. coeficientes_ELSCP[i] = normas["IAPF"]["ELS"]["Favorable"]["Persistente"]["Variable"]
  434. elif norma_proyecto == "IAP":
  435. pass
  436. minorados_ELUP.clear()
  437. minorados_ELUA.clear()
  438. minorados_ELUS.clear()
  439. minorados_ELSC.clear()
  440. minorados_ELSF.clear()
  441. minorados_ELSCP.clear()
  442. if n_acc:
  443. coef_var_ELUS = np.ones(len(patrones))
  444. coef_var_ELUA = np.ones(len(patrones))
  445. for i in range(len(combo)):
  446. if (restricciones_df.loc[i,"Accion IAPF"] == "Sismo") and combo[i] != 0:
  447. for j in range(len(combo)):
  448. if (restricciones_df.loc[j,"Tipo"] == "Variable") and j:
  449. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  450. coef_var_ELUS[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  451. if restricciones_df.loc[j,"Accion IAPF"] == "Resto":
  452. coef_var_ELUS[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  453. minorados_ELUS.append(coef_var_ELUS)
  454. if (restricciones_df.loc[i,"Accion IAPF"] != "Sismo") and (restricciones_df.loc[i,"Tipo"] == "Accidental") and combo[i] != 0:
  455. appended_for_acc = False
  456. for k in range(len(combo)):
  457. coef_var_ELUA = np.ones(len(patrones))
  458. if (restricciones_df.loc[k,"Tipo"] == "Variable") and combo[k] != 0:
  459. if restricciones_df.loc[k,"Accion IAPF"] == "Trafico":
  460. coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  461. else:
  462. coef_var_ELUA[k] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  463. for j in range(len(combo)):
  464. if (restricciones_df.loc[j,"Tipo"] == "Variable") and (j != k):
  465. #se asigna el coeficiente de la variable al resto de variables
  466. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  467. coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  468. else:
  469. coef_var_ELUA[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  470. minorados_ELUA.append(coef_var_ELUA)
  471. appended_for_acc = True
  472. # Si no se encontraron variables activas, añadimos el vector por defecto (unos)
  473. if not appended_for_acc:
  474. minorados_ELUA.append(np.ones(len(patrones)))
  475. else:
  476. if n_var == 1:
  477. coef_var_ELSF = np.ones(len(patrones))
  478. coef_var_ELSCP = np.ones(len(patrones))
  479. for i in range(len(combo)):
  480. if (restricciones_df.loc[i,"Tipo"] == "Variable") and combo[i] != 0:
  481. if restricciones_df.loc[i,"Accion IAPF"] == "Trafico":
  482. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  483. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  484. else:
  485. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  486. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  487. while n_var > 1:
  488. n_var -= 1
  489. #se busca la primera variable en el combo y se asigna el coeficiente
  490. for i in range(len(combo)):
  491. coef_var_ELUP = np.ones(len(patrones))
  492. coef_var_ELSC = np.ones(len(patrones))
  493. coef_var_ELSF = np.ones(len(patrones))
  494. coef_var_ELSCP =np.ones(len(patrones))
  495. minorados_ELUP.append(coef_var_ELUP)
  496. minorados_ELSC.append(coef_var_ELSC)
  497. if (restricciones_df.loc[i,"Tipo"] == "Variable") and combo[i] != 0:
  498. if restricciones_df.loc[i,"Accion IAPF"] == "Trafico":
  499. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi1"][vias_cargadas if int(vias_cargadas) < 4 else "3"]
  500. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  501. else:
  502. coef_var_ELSF[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi1"]
  503. coef_var_ELSCP[i] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  504. for j in range(len(combo)):
  505. if (restricciones_df.loc[j,"Tipo"] == "Variable") and (j != i):
  506. #se asigna el coeficiente de la variable al resto de variables
  507. if restricciones_df.loc[j,"Accion IAPF"] == "Trafico":
  508. coef_var_ELUP[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi0"]
  509. coef_var_ELSC[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi0"]
  510. coef_var_ELSF[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  511. coef_var_ELSCP[j] = normas["IAPF"]["CoefVar"]["Trafico"]["psi2"]
  512. else:
  513. coef_var_ELUP[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi0"]
  514. coef_var_ELSC[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi0"]
  515. coef_var_ELSF[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  516. coef_var_ELSCP[j] = normas["IAPF"]["CoefVar"]["Resto"]["psi2"]
  517. minorados_ELUP.append(coef_var_ELUP)
  518. minorados_ELSC.append(coef_var_ELSC)
  519. minorados_ELSF.append(coef_var_ELSF)
  520. minorados_ELSCP.append(coef_var_ELSCP)
  521. if minorados_ELUP:
  522. for minorado in minorados_ELUP:
  523. combos_ELUP.append(np.multiply(np.multiply(coeficientes_ELUP, combo),minorado))
  524. for minorado in minorados_ELSC:
  525. combos_ELSC.append(np.multiply(np.multiply(coeficientes_ELSC, combo),minorado))
  526. for minorado in minorados_ELSF:
  527. combos_ELSF.append(np.multiply(np.multiply(coeficientes_ELSF, combo),minorado))
  528. for minorado in minorados_ELSCP:
  529. combos_ELSCP.append(np.multiply(np.multiply(coeficientes_ELSCP, combo),minorado))
  530. else:
  531. combos_ELUP.append(np.multiply(coeficientes_ELUP, combo))
  532. combos_ELSC.append(np.multiply(coeficientes_ELSC, combo))
  533. 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))
  534. 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))
  535. if minorados_ELUS:
  536. for minorado in minorados_ELUS:
  537. combos_ELUS.append(np.multiply(np.multiply(coeficientes_ELUS, combo),minorado))
  538. if minorados_ELUA:
  539. for minorado in minorados_ELUA:
  540. combos_ELUA.append(np.multiply(np.multiply(coeficientes_ELUA, combo),minorado))
  541. combos_ELUP = np.unique(np.array(combos_ELUP), axis=0)
  542. combos_ELUA = np.unique(np.array(combos_ELUA), axis=0)
  543. combos_ELUS = np.unique(np.array(combos_ELUS), axis=0)
  544. combos_ELSC = np.unique(np.array(combos_ELSC), axis=0)
  545. combos_ELSF = np.unique(np.array(combos_ELSF), axis=0)
  546. combos_ELSCP = np.unique(np.array(combos_ELSCP), axis=0)
  547. restricciones_array = restricciones_df.loc[:,"Tipo"]
  548. #mascara = np.multiply(np.ones(len(restricciones_array)), (restricciones_array == "Variable").astype(int))
  549. #combos_ELUP = limpiar_combos(combos_ELUP, mascara, 1.5, restricciones_df)
  550. #combos_ELSC = limpiar_combos(combos_ELSC, mascara, 1, restricciones_df)
  551. #combos_ELSF = limpiar_combos(combos_ELSF, mascara, 1, restricciones_df)
  552. #combos_ELSCP = limpiar_combos(combos_ELSCP, mascara, 1, restricciones_df)
  553. return combos_ELUP, combos_ELUA, combos_ELUS, combos_ELSC, combos_ELSF, combos_ELSCP
  554. def agregar_combinaciones_carga(combos_data, nombre_tipo, total_combos, patrones, acum):
  555. combo_num = 0
  556. for combo in combos_data:
  557. combo_name = f"{nombre_tipo}_{combo_num:03d}"
  558. ret = SapModel.RespCombo.Add(combo_name, 0)
  559. for idx, patron in enumerate(patrones):
  560. coeficiente = combo[idx]
  561. if coeficiente != 0:
  562. ret = SapModel.RespCombo.SetCaseList(combo_name, 0, patron, coeficiente)
  563. printProgressBar(combo_num + acum, total_combos, prefix = f'Creando combos {nombre_tipo}:', suffix = 'Completado', length = 50)
  564. combo_num += 1
  565. return combo_num
  566. def crear_combo_envolvente(combo_name = "", busca = "", total_envolventes = 0, acumulador = 0):
  567. contador_envolvente = 0
  568. comboNames = SapModel.RespCombo.GetNameList()
  569. patron = []
  570. for j in range(comboNames[0]):
  571. if busca in comboNames[1][j]: patron.append(comboNames[1][j])
  572. if len(patron):
  573. ret = SapModel.RespCombo.Add(combo_name, 1)
  574. for _, name in enumerate(patron):
  575. ret = SapModel.RespCombo.SetCaseList(combo_name, 1, name, 1)
  576. contador_envolvente += 1
  577. printProgressBar(contador_envolvente + acumulador, total_envolventes, prefix = f'Creando {combo_name} envolvente:', suffix = 'Completado', length = 50)
  578. return len(patron)
  579. def main(ruta_excel, norma_proyecto, vias_cargadas):
  580. compatibilidades_df, restricciones_df =extraer_datos_excel(ruta_excel)
  581. creaccion_acciones(restricciones_df)
  582. combinaciones_validas, patrones = crear_validar_combinaciones(restricciones_df, compatibilidades_df)
  583. combos_ELUP, combos_ELUA, combos_ELUS, combos_ELSC, combos_ELSF, combos_ELSCP = \
  584. generar_combinaciones_norma_IAPF(combinaciones_validas, restricciones_df, norma_proyecto, vias_cargadas, patrones)
  585. tot_combos = len(combos_ELUP) + len(combos_ELSC) + len(combos_ELSF) + len(combos_ELSCP) + len(combos_ELUA) + len(combos_ELUS)
  586. acum_c = agregar_combinaciones_carga(combos_ELUP, "ELU_P", tot_combos, patrones, 0)
  587. acum_c += agregar_combinaciones_carga(combos_ELUA, "ELU_ACC", tot_combos, patrones, acum_c)
  588. acum_c += agregar_combinaciones_carga(combos_ELUS, "ELU_SIS", tot_combos, patrones, acum_c)
  589. acum_c += agregar_combinaciones_carga(combos_ELSC, "ELS_C", tot_combos, patrones, acum_c)
  590. acum_c += agregar_combinaciones_carga(combos_ELSF, "ELS_F", tot_combos, patrones, acum_c)
  591. _ = agregar_combinaciones_carga(combos_ELSCP, "ELS_CP", tot_combos, patrones, acum_c)
  592. print("")
  593. total_envolventes = 0
  594. temp_comboNames = SapModel.RespCombo.GetNameList()
  595. for combo_type in ["ELU_P", "ELU_ACC", "ELU_SIS", "ELS_C_", "ELS_F_", "ELS_CP"]:
  596. total_envolventes += sum(1 for idx in range(temp_comboNames[0]) if combo_type in temp_comboNames[1][idx])
  597. acum = crear_combo_envolvente("1. ENV ELU P", "ELU_P_", total_envolventes, 0)
  598. acum += crear_combo_envolvente("2. ENV ELU ACC", "ELU_ACC_", total_envolventes, acum)
  599. acum += crear_combo_envolvente("3. ENV ELU SIS", "ELU_SIS_", total_envolventes, acum)
  600. acum += crear_combo_envolvente("4. ENV ELS C", "ELS_C_", total_envolventes, acum)
  601. acum += crear_combo_envolvente("5. ENV ELS F", "ELS_F_", total_envolventes, acum)
  602. _ = crear_combo_envolvente("6. ENV ELS CP", "ELS_CP_", total_envolventes, acum)
  603. ret = SapModel.RespCombo.Add("7. ENV ELU TODO", 1)
  604. ret = SapModel.RespCombo.SetCaseList("7. ENV ELU TODO", 1, "1. ENV ELU P", 1)
  605. if ("2. ENV ELU ACC" in temp_comboNames): ret = SapModel.RespCombo.SetCaseList("7. ENV ELU TODO", 1, "2. ENV ELU ACC", 1)
  606. if ("3. ENV ELU SIS" in temp_comboNames): ret = SapModel.RespCombo.SetCaseList("7. ENV ELU TODO", 1, "3. ENV ELU SIS", 1)
  607. def crear_ventana_configuracion(parent):
  608. """Crea una ventana gráfica para configuración inicial"""
  609. ventana = tk.Toplevel(parent)
  610. ventana.title("Configuración de Combinaciones")
  611. ventana.geometry("600x800")
  612. ventana.attributes('-topmost', True)
  613. ventana.attributes('-topmost', False)
  614. script_dir = os.path.dirname(os.path.abspath(__file__))
  615. icon_path = os.path.join(script_dir, 'AYRE.ico')
  616. ventana.iconbitmap(icon_path)
  617. ventana.protocol("WM_DELETE_WINDOW", lambda: ventana.destroy() and ventana.grab_release())
  618. # Título
  619. titulo = tk.Label(ventana, text="Configuración Inicial", font=("Arial", 14, "bold"))
  620. titulo.pack(pady=10)
  621. # Checkbox 1: Borrar combinaciones
  622. var_combos = tk.BooleanVar(value=False)
  623. check_combos = tk.Checkbutton(ventana, text="Borrar combinaciones existentes", variable=var_combos, font=("Arial", 10))
  624. check_combos.pack(anchor=tk.W, padx=20, pady=5)
  625. # Checkbox 2: Borrar cargas
  626. var_cargas = tk.BooleanVar(value=False)
  627. check_cargas = tk.Checkbutton(ventana, text="Borrar cargas existentes", variable=var_cargas, font=("Arial", 10))
  628. check_cargas.pack(anchor=tk.W, padx=20, pady=5)
  629. # Botón Borrar Todo
  630. def on_borrar_todo():
  631. if var_combos.get():
  632. borrar_combos_existentes()
  633. if var_cargas.get():
  634. borrar_load_cases()
  635. borrar_patrones_carga()
  636. boton_borrar = tk.Button(ventana, text="Borrar Selección", command=on_borrar_todo, font=("Arial", 11), bg="#f44336", fg="white", padx=10, pady=5)
  637. boton_borrar.pack()
  638. # Frame para norma
  639. frame_norma = tk.Frame(ventana)
  640. frame_norma.pack(anchor=tk.W, padx=20, pady=10)
  641. label_norma = tk.Label(frame_norma, text="Norma:", font=("Arial", 10))
  642. label_norma.pack(side=tk.LEFT, padx=5)
  643. var_norma = tk.StringVar(value="IAPF")
  644. combo_norma = tk.ttk.Combobox(frame_norma, textvariable=var_norma, values=["IAPF", "IAP"], state="readonly", width=15)
  645. combo_norma.pack(side=tk.LEFT, padx=5)
  646. # Frame para vías
  647. frame_vias = tk.Frame(ventana)
  648. frame_vias.pack(anchor=tk.W, padx=20, pady=10)
  649. label_vias = tk.Label(frame_vias, text="Vías cargadas:", font=("Arial", 10))
  650. label_vias.pack(side=tk.LEFT, padx=5)
  651. var_vias = tk.StringVar(value="1")
  652. combo_vias = tk.ttk.Combobox(frame_vias, textvariable=var_vias, values=["1", "2", "3", "Más de 3"], state="readonly", width=15)
  653. combo_vias.pack(side=tk.LEFT, padx=5)
  654. # Frame para selección de archivo Excel
  655. frame_excel = tk.Frame(ventana)
  656. frame_excel.pack(anchor=tk.W, padx=20, pady=10)
  657. label_excel = tk.Label(frame_excel, text="Archivo Excel:", font=("Arial", 10))
  658. label_excel.pack(side=tk.LEFT, padx=5)
  659. var_excel = tk.StringVar()
  660. entry_excel = tk.Entry(frame_excel, textvariable=var_excel, width=40)
  661. entry_excel.pack(side=tk.LEFT, padx=5)
  662. def browse_excel():
  663. ruta = askopenfilename(filetypes=[("Excel files", "*.xlsx *.xls")])
  664. if ruta:
  665. var_excel.set(ruta)
  666. boton_ok.config(state=tk.NORMAL)
  667. boton_browse = tk.Button(frame_excel, text="Seleccionar", command=browse_excel, font=("Arial", 10))
  668. boton_browse.pack(side=tk.LEFT, padx=5)
  669. # Botón OK
  670. def on_ok():
  671. main(var_excel.get(), var_norma.get(), var_vias.get())
  672. boton_ok = tk.Button(ventana, text="Crear combos", command=on_ok, font=("Arial", 11), bg="#4CAF50", fg="white", padx=10, pady=5)
  673. boton_ok.pack(pady=20)
  674. boton_ok.config(state=tk.DISABLED)
  675. # Boton extraer datos
  676. def on_extraer():
  677. extraer_combinaciones_a_excel(SapModel, var_excel.get())
  678. boton_extraer = tk.Button(ventana, text="Extraer datos", command=on_extraer, font=("Arial", 11), bg="#FF9800", fg="white", padx=10, pady=5)
  679. boton_extraer.pack(pady=20)
  680. # Boton extraer flechas
  681. def on_deflection():
  682. extraer_flechas(SapModel, var_excel.get(), var_flechas.get())
  683. # Frame para flechas
  684. frame_flechas = tk.Frame(ventana)
  685. frame_flechas.pack(anchor=tk.CENTER, padx=20, pady=10)
  686. var_flechas = tk.StringVar(value="1. ENV ELU P")
  687. combo_flechas = tk.ttk.Combobox(frame_flechas, textvariable=var_flechas,
  688. values=["1. ENV ELU P", "2. ENV ELU ACC", "3. ENV ELU SIS", "4. ENV ELS C", "5. ENV ELS F", "6. ENV ELS CP", "7. ENV ELU TODO"],
  689. state="readonly", width=15)
  690. combo_flechas.pack(side=tk.RIGHT, padx=5)
  691. boton_deflection = tk.Button(ventana, text="Extraer flechas", command=on_deflection, font=("Arial", 11), bg="#2196F3", fg="white", padx=10, pady=5)
  692. boton_deflection.pack(pady=20)
  693. # Boton extraer esfuerzos
  694. def on_esfuerzos():
  695. extraer_esfuerzos(SapModel, var_excel.get(), var_esfuerzos.get())
  696. # Frame para esfuerzos
  697. frame_esfuerzos = tk.Frame(ventana)
  698. frame_esfuerzos.pack(anchor=tk.CENTER, padx=20, pady=10)
  699. var_esfuerzos = tk.StringVar(value="1. ENV ELU P")
  700. combo_esfuerzos = tk.ttk.Combobox(frame_esfuerzos, textvariable=var_esfuerzos,
  701. values=["1. ENV ELU P", "2. ENV ELU ACC", "3. ENV ELU SIS", "4. ENV ELS C", "5. ENV ELS F", "6. ENV ELS CP", "7. ENV ELU TODO"],
  702. state="readonly", width=15)
  703. combo_esfuerzos.pack(side=tk.RIGHT, padx=5)
  704. boton_esfuerzos = tk.Button(ventana, text="Extraer esfuerzos", command=on_esfuerzos, font=("Arial", 11), bg="#2196F3", fg="white", padx=10, pady=5)
  705. boton_esfuerzos.pack(pady=20)
  706. def comprobacion_SAP_cerrado():
  707. try:
  708. ret = SapModel.Analyze.GetCaseStatus()
  709. if ret[0] > 0:
  710. estados = ret[2]
  711. if any(estado == 4 for estado in estados):
  712. boton_extraer.config(state=tk.NORMAL)
  713. boton_deflection.config(state=tk.NORMAL)
  714. boton_esfuerzos.config(state=tk.NORMAL)
  715. else:
  716. boton_extraer.config(state=tk.DISABLED)
  717. boton_deflection.config(state=tk.DISABLED)
  718. boton_esfuerzos.config(state=tk.DISABLED)
  719. except (comtypes.COMError, Exception) as e:
  720. sys.exit(0) # Cierra la aplicación si SAP2000 está cerrado
  721. ventana.after(1000, comprobacion_SAP_cerrado) # Verifica cada segundo
  722. comprobacion_SAP_cerrado()
  723. ventana.grab_set()
  724. def crear_ventana_materiales(parent):
  725. """Crea una ventana gráfica para definición de materiales y secciones"""
  726. ventana_mat = tk.Toplevel(parent)
  727. ventana_mat.title("Definición de Geometría")
  728. ventana_mat.geometry("500x400")
  729. ventana_mat.attributes('-topmost', True)
  730. ventana_mat.attributes('-topmost', False)
  731. script_dir = os.path.dirname(os.path.abspath(__file__))
  732. icon_path = os.path.join(script_dir, 'AYRE.ico')
  733. ventana_mat.iconbitmap(icon_path)
  734. ventana_mat.protocol("WM_DELETE_WINDOW", lambda: ventana_mat.destroy() and ventana_mat.grab_release())
  735. # Título
  736. titulo = tk.Label(ventana_mat, text="Definición de Materiales y Secciones", font=("Arial", 14, "bold"))
  737. titulo.pack(pady=20)
  738. # Boton crear seccion
  739. def on_section():
  740. if not SapModel.GetModelisLocked(): SapModel.SetModelisLocked(False)
  741. ret = SapModel.SetPresentUnits(6)
  742. if ret != 0:
  743. confirmacion.config(text="Error al establecer las unidades.", fg="red")
  744. return
  745. ret_get, _, _, _, _ = SapModel.PropMaterial.GetMaterial(var_material.get())
  746. print(ret_get)
  747. if ret_get == 0:
  748. ret = SapModel.PropMaterial.AddMaterial(var_material.get(),
  749. 2,
  750. Region = "Europe",
  751. Standard = "EN 1992-1-1 per EN 206-1",
  752. Grade = var_material.get())
  753. print(ret)
  754. #if (ret[0] != var_material.get()):
  755. # confirmacion.config(text="Error al añadir el material.", fg="red")
  756. ret = SapModel.PropFrame.SetRectangle(var_nombre.get(),
  757. var_material.get(),
  758. float(var_canto.get()),
  759. float(var_ancho.get()))
  760. if ret != 0:
  761. confirmacion.config(text="Error al añadir la sección.", fg="red")
  762. return
  763. #aqui se puede añadir la cuantia de armado que se quiera
  764. ret = SapModel.PropFrame.SetRebarBeam(var_nombre.get(),
  765. "B500 SD",
  766. "B500 SD",
  767. 0.05,
  768. 0.05,
  769. 0,
  770. 0,
  771. 0,
  772. 0)
  773. if ret != 0:
  774. confirmacion.config(text="Error al asignar el armado.", fg="red")
  775. return
  776. confirmacion.config(text=f"Sección '{var_nombre.get()}' añadida correctamente.", fg="green")
  777. # Frame para flechas
  778. frame_material = tk.Frame(ventana_mat)
  779. frame_material.pack(anchor=tk.W, padx=20, pady=10)
  780. label_material = tk.Label(frame_material, text="Hormigón:", font=("Arial", 10))
  781. label_material.pack(side=tk.LEFT, padx=5)
  782. var_material = tk.StringVar(value="C30/37")
  783. combo_material = tk.ttk.Combobox(frame_material, textvariable=var_material,
  784. values=["C12/15","C16/20","C20/25","C25/30","C30/37","C35/45","C40/50","C45/55",
  785. "C50/60","C55/67","C60/75","C70/85","C80/95","C90/105"],
  786. state="readonly", width=15)
  787. combo_material.pack(side=tk.LEFT, padx=5)
  788. frame_canto = tk.Frame(ventana_mat)
  789. frame_canto.pack(anchor=tk.W, padx=20, pady=10)
  790. label_canto = tk.Label(frame_canto, text="Canto de la sección (m):", font=("Arial", 10))
  791. label_canto.pack(side=tk.LEFT, padx=5)
  792. var_canto = tk.StringVar(value="0.4")
  793. entry_canto = tk.Entry(frame_canto, textvariable=var_canto, width=10)
  794. entry_canto.pack(side=tk.LEFT, padx=5)
  795. frame_ancho = tk.Frame(ventana_mat)
  796. frame_ancho.pack(anchor=tk.W, padx=20, pady=10)
  797. label_ancho = tk.Label(frame_ancho, text="Ancho de la sección (m):", font=("Arial", 10))
  798. label_ancho.pack(side=tk.LEFT, padx=5)
  799. var_ancho = tk.StringVar(value="1.0")
  800. entry_ancho = tk.Entry(frame_ancho, textvariable=var_ancho, width=10)
  801. entry_ancho.pack(side=tk.LEFT, padx=4)
  802. entry_ancho.config(state=tk.DISABLED)
  803. var_checkbox = tk.BooleanVar(value=False)
  804. def toggle_ancho():
  805. if var_checkbox.get():
  806. entry_ancho.config(state=tk.NORMAL)
  807. else:
  808. entry_ancho.config(state=tk.DISABLED)
  809. check_ancho = tk.Checkbutton(frame_ancho, variable=var_checkbox, command=toggle_ancho)
  810. check_ancho.pack(side=tk.LEFT, padx = 5)
  811. frame_nombre = tk.Frame(ventana_mat)
  812. frame_nombre.pack(anchor=tk.W, padx=20, pady=10)
  813. label_nombre = tk.Label(frame_nombre, text="Nombre de la sección:", font=("Arial", 10))
  814. label_nombre.pack(side=tk.LEFT, padx=5)
  815. var_nombre = tk.StringVar(value="Losa 0.40 m")
  816. entry_nombre = tk.Entry(frame_nombre, textvariable=var_nombre, width=20)
  817. entry_nombre.pack(side=tk.LEFT, padx=5)
  818. confirmacion = tk.Label(ventana_mat, text="", font=("Arial", 10), fg="green")
  819. confirmacion.pack(pady=10)
  820. boton_canto = tk.Button(ventana_mat, text="Añadir sección", command=on_section, font=("Arial", 11), bg="#2196F3", fg="white", padx=10, pady=5)
  821. boton_canto.pack(pady=20)
  822. ventana_mat.grab_set()
  823. def crear_ventana_geometria(parent):
  824. """Crea una ventana gráfica para definición de la geometría"""
  825. ventana_geo = tk.Toplevel(parent)
  826. ventana_geo.title("Definición de Geometría")
  827. ventana_geo.geometry("550x400")
  828. ventana_geo.attributes('-topmost', True)
  829. ventana_geo.attributes('-topmost', False)
  830. script_dir = os.path.dirname(os.path.abspath(__file__))
  831. icon_path = os.path.join(script_dir, 'AYRE.ico')
  832. ventana_geo.iconbitmap(icon_path)
  833. ventana_geo.protocol("WM_DELETE_WINDOW", lambda: ventana_geo.destroy() and ventana_geo.grab_release())
  834. # Título
  835. titulo = tk.Label(ventana_geo, text="Definición de Geometría", font=("Arial", 14, "bold"))
  836. titulo.pack(pady=20)
  837. frame_geometria =tk.Frame(ventana_geo)
  838. frame_geometria.pack(anchor=tk.W, padx=0, pady=10, fill = tk.X)
  839. label_geometria = tk.Label(frame_geometria, text="LI\t LS\t HI\t HD", font=("Arial", 10))
  840. label_geometria.pack(side=tk.LEFT, padx=120)
  841. frame_seccion = tk.Frame(ventana_geo)
  842. frame_seccion.pack(anchor=tk.W, padx=10, pady=10)
  843. label_seccion = tk.Label(frame_seccion, text="Sección:", font=("Arial", 10))
  844. label_seccion.pack(side=tk.LEFT, padx=5)
  845. # utilizar los valores de ret para hacer un desplegable con las secciones disponibles
  846. ret = SapModel.PropFrame.GetNameList()
  847. var_seccion_LI = tk.StringVar(value=ret[1][0])
  848. var_seccion_LD = tk.StringVar(value=ret[1][0])
  849. var_seccion_HI = tk.StringVar(value=ret[1][0])
  850. var_seccion_HD = tk.StringVar(value=ret[1][0])
  851. combo_seccion_LI = tk.ttk.Combobox(frame_seccion, textvariable=var_seccion_LI,
  852. values=ret[1],
  853. state="readonly", width=10)
  854. combo_seccion_LI.pack(side=tk.LEFT, padx=5)
  855. combo_seccion_LD = tk.ttk.Combobox(frame_seccion, textvariable=var_seccion_LD,
  856. values=ret[1],
  857. state="readonly", width=10)
  858. combo_seccion_LD.pack(side=tk.LEFT, padx=5)
  859. combo_seccion_HI = tk.ttk.Combobox(frame_seccion, textvariable=var_seccion_HI,
  860. values=ret[1],
  861. state="readonly", width=10)
  862. combo_seccion_HI.pack(side=tk.LEFT, padx=5)
  863. combo_seccion_HD = tk.ttk.Combobox(frame_seccion, textvariable=var_seccion_HD,
  864. values=ret[1],
  865. state="readonly", width=10)
  866. combo_seccion_HD.pack(side=tk.LEFT, padx=5)
  867. frame_ancho = tk.Frame(ventana_geo)
  868. frame_ancho.pack(anchor=tk.W, padx=10, pady=10)
  869. label_ancho = tk.Label(frame_ancho, text="Ancho modelo (m):", font=("Arial", 10))
  870. label_ancho.pack(side=tk.LEFT, padx=5)
  871. var_ancho = tk.StringVar(value="1.0")
  872. entry_ancho = tk.Entry(frame_ancho, textvariable=var_ancho, width=10)
  873. entry_ancho.pack(side=tk.LEFT, padx=5)
  874. frame_alto = tk.Frame(ventana_geo)
  875. frame_alto.pack(anchor=tk.W, padx=10, pady=10)
  876. label_alto = tk.Label(frame_alto, text="Alto modelo (m):", font=("Arial", 10))
  877. label_alto.pack(side=tk.LEFT, padx=5)
  878. var_alto = tk.StringVar(value="1.0")
  879. entry_alto = tk.Entry(frame_alto, textvariable=var_alto, width=10)
  880. entry_alto.pack(side=tk.LEFT, padx=5)
  881. def on_geometria():
  882. SapModel.SetPresentUnits(6)
  883. ancho = float(var_ancho.get())
  884. alto = float(var_alto.get())
  885. FrameName1 = ""
  886. FrameName2 = ""
  887. FrameName3 = ""
  888. FrameName4 = ""
  889. [FrameName1, ret] = SapModel.FrameObj.AddByCoord(0, 0, 0, ancho, 0, 0, FrameName1, var_seccion_LI.get(), "LI", "Global")
  890. [FrameName2, ret] = SapModel.FrameObj.AddByCoord(0, 0, 0, 0, 0, alto, FrameName2, var_seccion_HI.get(), "HI", "Global")
  891. [FrameName3, ret] = SapModel.FrameObj.AddByCoord(0, 0, alto, ancho, 0, alto, FrameName3, var_seccion_LD.get(), "LD", "Global")
  892. [FrameName4, ret] = SapModel.FrameObj.AddByCoord(ancho, 0, 0, ancho, 0, alto, FrameName4, var_seccion_HD.get(), "HD", "Global")
  893. SapModel.View.RefreshView(0, False)
  894. boton_geometria = tk.Button(ventana_geo, text="Definir geometría", command=on_geometria, font=("Arial", 11), bg="#2196F3", fg="white", padx=10, pady=5)
  895. boton_geometria.pack(pady=20)
  896. ventana_geo.grab_set()
  897. def crear_ventana_cargas(parent):
  898. """Crea una ventana gráfica para definición de cargas"""
  899. ventana_cargas = tk.Toplevel(parent)
  900. ventana_cargas.title("Definición de Cargas")
  901. ventana_cargas.geometry("500x400")
  902. ventana_cargas.attributes('-topmost', True)
  903. ventana_cargas.attributes('-topmost', False)
  904. script_dir = os.path.dirname(os.path.abspath(__file__))
  905. icon_path = os.path.join(script_dir, 'AYRE.ico')
  906. ventana_cargas.iconbitmap(icon_path)
  907. ventana_cargas.protocol("WM_DELETE_WINDOW", lambda: ventana_cargas.destroy() and ventana_cargas.grab_release())
  908. # Título
  909. titulo = tk.Label(ventana_cargas, text="Definición de Cargas", font=("Arial", 14, "bold"))
  910. titulo.pack(pady=20)
  911. frame = tk.Frame(ventana_cargas)
  912. scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL)
  913. hscrollbar = tk.Scrollbar(frame, orient=tk.HORIZONTAL)
  914. label_lista_cargas = tk.Listbox(frame, font=("Arial", 10), bg="white", selectbackground="#2196F3",
  915. selectforeground="black", yscrollcommand = scrollbar.set,
  916. xscrollcommand = hscrollbar.set, width=20, height=15)
  917. scrollbar.config(command=label_lista_cargas.yview)
  918. hscrollbar.config(command=label_lista_cargas.xview)
  919. scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
  920. hscrollbar.pack(side=tk.BOTTOM, fill=tk.X)
  921. label_lista_cargas.pack(side =tk.LEFT, padx=5, pady=5)
  922. frame.pack()
  923. ruta_excel = "C:/Users/Daniel.p/Documents/2. Petrucco/114. A 1472 R1 Campo de Criptana/3. Calculo/2. Cajon/SAP/Comb_acciones.xlsx"
  924. compatibilidades_df, restricciones_df =extraer_datos_excel(ruta_excel)
  925. label_lista_cargas.insert(tk.END, *restricciones_df.loc[:, "Definición de 'Load Cases'"])
  926. def on_double_click(event):
  927. print("hola")
  928. label_lista_cargas.bind('<Double-Button-1>', on_double_click)
  929. ventana_cargas.grab_set()
  930. def crear_ventana_ppal():
  931. ventana_ppal = tk.Tk()
  932. ventana_ppal.title("AYRE")
  933. ventana_ppal.geometry("400x600")
  934. ventana_ppal.attributes('-topmost', True)
  935. ventana_ppal.attributes('-topmost', False)
  936. script_dir = os.path.dirname(os.path.abspath(__file__))
  937. icon_path = os.path.join(script_dir, 'AYRE.ico')
  938. ventana_ppal.iconbitmap(icon_path)
  939. # Título
  940. titulo = tk.Label(ventana_ppal, text="Modelizado por SAP2000", font=("Arial", 14, "bold"))
  941. titulo.pack(pady=20)
  942. # Boton para abrir la ventana de materiales y secciones
  943. def abrir_materiales():
  944. crear_ventana_materiales(ventana_ppal)
  945. boton_materiales = tk.Button(ventana_ppal, text="Definición de Materiales y Secciones", command=abrir_materiales, font=("Arial", 11), bg="#2F42AC", fg="white", padx=10, pady=5)
  946. boton_materiales.pack(pady=20)
  947. # Boton para abrir la ventana de definicion de la geometria
  948. def abrir_geometria():
  949. if not SapModel.PropFrame.GetNameList()[1] :
  950. tk.messagebox.showerror("Error", "No hay secciones definidas")
  951. else:
  952. crear_ventana_geometria(ventana_ppal)
  953. boton_geometria = tk.Button(ventana_ppal, text="Definición de Geometría", command=abrir_geometria, font=("Arial", 11), bg="#673AB7", fg="white", padx=10, pady=5)
  954. boton_geometria.pack(pady=20)
  955. # Botón para abrir ventana de configuración
  956. def abrir_configuracion():
  957. crear_ventana_configuracion(ventana_ppal)
  958. boton_config = tk.Button(ventana_ppal, text="Configuración Combinaciones", command=abrir_configuracion, font=("Arial", 11), bg="#4CAF50", fg="white", padx=10, pady=5)
  959. boton_config.pack(pady=20)
  960. # Botón para abrir ventana de cargas
  961. def abrir_cargas():
  962. crear_ventana_cargas(ventana_ppal)
  963. boton_cargas = tk.Button(ventana_ppal, text="Definición de Cargas", command=abrir_cargas, font=("Arial", 11), bg="#FF9800", fg="white", padx=10, pady=5)
  964. boton_cargas.pack(pady=20)
  965. ventana_ppal.mainloop()
  966. # Mostrar ventana de configuración
  967. config = crear_ventana_ppal()