Codigo Fuente de Analisis Matricial de Porticos en Python
Codigo Fuente de Analisis Matricial de Porticos en Python
Codigo Fuente de Analisis Matricial de Porticos en Python
ANEXOS
@author: PROFESIONAL
"""
import sys
from PyQt5 import uic, QtWidgets
from scipy.io import wavfile
import numpy as np
import sympy as sp
from sympy import integrate, latex,Heaviside,sin,cos,tan,exp,ln,pi,solve,zoo
from sympy import MatrixSymbol, Inverse,ZeroMatrix,MatMul,MatAdd,eye,Matrix
class MyApp():
def analizar_estructura
(apoyos,matriz_de_nodos,matrix_de_conexiones,matriz_de_cargas,matriz_de_fuerzas,matriz_de_mom
entos):
global lista_de_ecuaciones
global reaciones_globales,num_nodos,MN
r,L,l,H,p,a=symbols('r,L,l,H,p,a',positive=True)
E,I,A=symbols('E,I,A',positive=True)
matriz_de_nodos=Matrix(matriz_de_nodos)
dim_conect=np.size(matrix_de_conexiones,0)
nuevo_conect=Matrix(np.zeros((dim_conect,8)))
LRMEP=[]
for i in range(dim_conect):
nuevo_conect[i,0]=matrix_de_conexiones[i][0]
nuevo_conect[i,1]=matrix_de_conexiones[i][1]
ni=int(matrix_de_conexiones[i][0]-1);nf=int(matrix_de_conexiones[i][1]-1);
dx=matriz_de_nodos[nf,0]-matriz_de_nodos[ni,0];dy=matriz_de_nodos[nf,1]-
matriz_de_nodos[ni,1]
long=(dx**2+dy**2)**0.5
nuevo_conect[i,2]=long
nuevo_conect[i,3]=dy/long
nuevo_conect[i,4]=dx/long
nuevo_conect[i,5]=matrix_de_conexiones[i][2]
nuevo_conect[i,6]=matrix_de_conexiones[i][3]
nuevo_conect[i,7]=matrix_de_conexiones[i][4]
rig=[0,[],[],[],0,0,0]
LRMEP+=[rig]
MN=matriz_de_nodos
MC=nuevo_conect
# lista_elemento=[]
# print("Analizando la estructural")
# try:
num_elemet=dim_conect
num_nodos=np.size(MN,0)
# LMEP=[]
P=[]
GLL_global=[]
for k in range(num_nodos):
GLL_global+=[int((k+1)*3-2),int((k+1)*3-1),int((k+1)*3)]
P+=[[[],[],[]]]
#print('lista vacia de añad node: ',P)
# numeros_a_evaluar=[]
# for k in range(num_elemet):
# numeros_a_evaluar+=[[]]
# dash=[[],[],[]]
# LMEP+=[dash]
# lista_elemento+=['elemento '+str(k+1)+' de nodo '+str(int(MC[k,0]))+' a '+str(int(MC[k,1]))]
GLR_global=[]
for i in range(np.size(apoyos,0)):
if apoyos[i][1]=='Apoyo Movil':
GLR_global+=[apoyos[i][0]*3-1]
elif apoyos[i][1]=='Apoyo Fijo':
GLR_global+=[apoyos[i][0]*3-2,apoyos[i][0]*3-1]
else:
GLR_global+=[apoyos[i][0]*3-2,apoyos[i][0]*3-1,apoyos[i][0]*3]
glr=np.sort(GLR_global)
gll=np.setxor1d(GLL_global,GLR_global)
gll=np.sort(gll)
# print('')
# print("grados de libertad Restringidos")
# print(glr)
# print("grados de libertad Libres")
# print(gll)
LRMEP_local_global=[]
# matriz_de_fuerzas, matriz_de_momentos, matriz_de_cargas
if matriz_de_fuerzas==0:
pass
else:
for i in range(np.size(matriz_de_fuerzas,0)):
fuerza=[matriz_de_fuerzas[i][0],matriz_de_fuerzas[i][1],matriz_de_fuerzas[i][2]]
LRMEP[int(matriz_de_fuerzas[i][3]-1)][2]+=[fuerza]
if matriz_de_momentos==0:
pass
else:
for i in range(np.size(matriz_de_momentos,0)):
moment=[matriz_de_momentos[i][0],matriz_de_momentos[i][1]]
LRMEP[int(matriz_de_momentos[i][2]-1)][3]+=[moment]
if matriz_de_cargas==0:
pass
else:
for i in range(np.size( matriz_de_cargas,0)):
carg=[ matriz_de_cargas[i][0], matriz_de_cargas[i][1], matriz_de_cargas[i][2]]
LRMEP[int(matriz_de_cargas[i][3]-1)][1]+=[carg]
# print('')
# print('lista acomulada de los MEPs')
# print(LMEP)
lista_elementos_RLL=[]
lista_elementos_RLG=[]
lista_elementos_RG=[]
lista_de_transf=[]
#rigidez_global=np.zeros((num_nodos*3,num_nodos*3))
suma_RG=Matrix(np.zeros((num_nodos*3,num_nodos*3)))
LRMEPF=[]
for inc in range(num_elemet):
# print("analizando elemento: ",inc+1)
n=MC[inc,3]
u=MC[inc,4]
A=MC[inc,5]*MC[inc,6]/MC[inc,2]
B=2*MC[inc,7]*MC[inc,6]/MC[inc,2]
C=6*MC[inc,7]*MC[inc,6]/MC[inc,2]**2
D=12*MC[inc,7]*MC[inc,6]/MC[inc,2]**3
lista_elementos_RLL+=[Matrix([ [A,0,0,-A,0,0],
[0,D,C,0,-D,C],
[0,C,2*B,0,-C,B],
[-A,0,0,A,0,0],
[0,-D,-C,0,D,-C],
[0,C,B,0,-C,2*B]])]
lista_de_transf+=[Matrix([[u,n,0,0,0,0],
[-n,u,0,0,0,0],
[0,0,1,0,0,0],
[0,0,0,u,n,0],
[0,0,0,-n,u,0],
[0,0,0,0,0,1]])]
inv_T=Inverse(lista_de_transf[inc])
factor_2=lista_elementos_RLL[inc]
T=lista_de_transf[inc]
prod=inv_T*factor_2*T
lista_elementos_RLG+=[prod]
ni=MC[inc,0]
nf=MC[inc,1]
glg=[3*ni-2,3*ni-1,3*ni,3*nf-2,3*nf-1,3*nf]
# print("grados de libertad: ", glg)
RG=MyApp.matriz_ensab(Matrix(np.zeros((num_nodos*3,num_nodos*3))),prod,glg)
lista_elementos_RG+=[RG]
suma_RG=Matrix(RG)+suma_RG
# print(MC[inc,2],LRMEP[inc][1],LRMEP[inc][2],LRMEP[inc][3],MC[inc,6],MC[inc,7],MC[inc,5])
res=MyApp.vigas(MC[inc,2],LRMEP[inc][1],LRMEP[inc][2],LRMEP[inc][3],MC[inc,6],MC
[inc,7],MC[inc,5])
# print("los MEP son: ",res)
LRMEPF+=[res]
res_l_g=MyApp.transpuesta(T)*Matrix(res)
LRMEP_local_global+=[res_l_g]
suma_n=res_l_g[0,0];suma_n_j=res_l_g[3,0]
suma_v=res_l_g[1,0];suma_v_j=res_l_g[4,0]
suma_m=res_l_g[2,0];suma_m_j=res_l_g[5,0]
P[ni-1][0]+=[suma_n ]
P[ni-1][1]+=[suma_v ]
P[ni-1][2]+=[suma_m ]
# LRMEP
P[nf-1][0]+=[suma_n_j ]
P[nf-1][1]+=[suma_v_j ]
P[nf-1][2]+=[suma_m_j ]
print("P: ",P)
FP=[]
for k in range(num_nodos):
añad=[-sum(P[k][0]),-sum(P[k][1]),-sum(P[k][2])]
FP+=añad
print("Fp: ",FP)
lista_de_rigideces=MyApp.rigidez_por_partes(suma_RG,glr,gll)
# print('K_aa,K_ab,K_ba,K_bb= ')
# print(lista_de_rigideces)
kbb=lista_de_rigideces[3]
kab=lista_de_rigideces[1]
# kba=np.matrix(lista_de_rigideces[2])
# kaa=np.matrix(lista_de_rigideces[0])
# print("Fp :",FP)
# print("glr :",glr)
# print("gll :",gll)
pb=Matrix(MyApp.extracion_de_Q(FP,gll))
pa=Matrix(MyApp.extracion_de_Q(FP,glr))
desp_global=Matrix(np.zeros((num_nodos*3,1)))
reactor_global=Matrix(np.zeros((num_nodos*3,1)))
list_de_desplazamiento=[]
try:
# print("kbb= ",kbb)
# print("Pb= ",pb)
# print("Pa= ",pa)
desplazamientos_desc=Inverse(kbb)*pb
print("desplazamientos_desc: ",desplazamientos_desc)
reaciones=kab*desplazamientos_desc-pa
reaciones_globales=MyApp.llenando_valores_a_matrix(reactor_global,reaciones,glr)
# L7:={Kaa,kab,kba,kbb,FP_libre,FP_restringido,Mδa=despla_restrin,FFN,FFC};
# M6=inv(MKnn)*MFn-inv(MKnn)*MKna*Mδa;
# reaciones=kab*np.matrix(linalg.inv(kbb))*np.matrix(pb) -np.matrix(pb) #+(kaa-
kba*np.matrix(linalg.inv(kaa))*kba)*Mδa# REACIONES
# reaciones_globales=MyApp.llenando_valores_a_matrix(reactor_global,reaciones,glr)
DESPLAZAMIENTO=MyApp.llenando_valores_a_matrix
(desp_global,desplazamientos_desc,gll)
for i in range(np.size(DESPLAZAMIENTO,0)):
list_de_desplazamiento+=[DESPLAZAMIENTO[i,0]]
except:
for i in range(np.size(desp_global,0)):
list_de_desplazamiento+=[desp_global[i,0]]
reaciones=-np.matrix(pa)
reaciones_globales=MyApp.llenando_valores_a_matrix(reactor_global,reaciones,glr)
reaciones_globales=Matrix(res)
# lista_de_reaciones=[]
lista_de_fuerzas_N_V_M=[]
lista_de_giros_y_flechas=[]
lista_de_ecuaciones=[]
for k in range(num_elemet):
ni=int(MC[k,0])
nf=int(MC[k,1])
longitud=MC[k,2]
gl=[3*ni-2,3*ni-1,3*ni,3*nf-2,3*nf-1,3*nf]
lista_desp=MyApp.extracion_de_Q(list_de_desplazamiento,gl)
D_1=Matrix(lista_desp)
# print("d_enesimo= ",D_1)
K=lista_elementos_RLL[k]
T=lista_de_transf[k]
desplazgiros=T*D_1
lista_de_giros_y_flechas+=[desplazgiros]
# desplaz&giros=np.matrix(D_1)*T
# print("desplazamientos y firos locales del elemento : ",k+1)
# print(desplazgiros)
RES=K*T*D_1+Matrix(LRMEPF[k])
# RES_n=K*np.matrix(D_1)+np.matrix(MyApp.transpuesta(LRMEP[k]))
# lista_de_reaciones+=[RES_n]
lista_de_fuerzas_N_V_M+=[RES]
carga=LRMEP[k][1]
fuerzas=LRMEP[k][2]
momentos=LRMEP[k][3]
# for j in range(np.size(carga,0)):
# numeros_a_evaluar[k]+=[carga[j][0],carga[j][1]]
#
# for j in range(np.size(fuerzas,0)):
# numeros_a_evaluar[k]+=[fuerzas[j][0]]
# for j in range(np.size(momentos,0)):
# numeros_a_evaluar[k]+=[momentos[j][0]]
# numeros_a_evaluar[k]+=[0,longitud]
ecuaciones=MyApp.calculando_ecuaciones_del_portico
(desplazgiros,RES,longitud,carga,fuerzas,momentos,MC[k,6],MC[k,7],MC[k,5])
lista_de_ecuaciones+=[ecuaciones]
print("las ecuaciones son")
print(lista_de_ecuaciones)
print("Analisis Completo")
print("---------------------------------------------")
print('los desplazamientos generales en cada nodo son:')
print(list_de_desplazamiento)
print('')
print("---------------------------------------------")
print('fuerzas internas en cada elemento')
print(lista_de_fuerzas_N_V_M)
print("---------------------------------------------")
print("las reaciones son:")
print(reaciones)
print("---------------------------------------------")
print("las reaciones globales son:")
print(reaciones_globales)
# except:
# QMessageBox.question(self, "Correcto","!Analisis estructural con exito¡" )
def llenando_valores_a_matrix(vac,data,gl):
dim=np.size(data,0)
for i in range(dim):
vac[int(gl[i]-1),0]=data[i]
return vac
def matriz_ensab(mak,matu,gl):
nk=np.size(matu,0)
for i in range(nk):
for j in range(nk):
xt=int(gl[i])
yt=int(gl[j])
mak[xt-1,yt-1]=matu[i,j]
# print("rigidez asociado K:")
# print(mak)
return mak
def vigas(long,lcd,lfp,lmp,elasty,iner,area):
r1x,r2x,r1y,r2y,m1,m2,c1,c2=symbols('r1x,r2x,r1y,r2y,m1,m2,c1,c2')
#programando para la carga distribuida
Qx=0
vx=0
fpx=0
mpx=0
sumatoria_de_momentos=0
sumatoria_de_fuerzas_result=0
sumatoria_fx=0
Nx=0
# integral para la carga distribuida
if np.sum(lcd)==0:
pass
else:
dim_de_lcd=np.size(lcd,0)
sumatoria_de_momentos=0
sumatoria_de_fuerzas_result=0
for k in range(dim_de_lcd):
qx=lcd[k][2]*Heaviside(x-lcd[k][0]) - lcd[k][2]*Heaviside(x-lcd[k][1])
Qx=qx+Qx
vx=vx+integrate(-qx,x,meijerg=False)
fuerza_result=-integrate(lcd[k][2],(x,lcd[k][0],lcd[k][1]))
if fuerza_result==0:
xcentro=0
else:
xcentro=-integrate(x*lcd[k][2],(x,lcd[k][0],lcd[k][1]))/fuerza_result
sumatoria_de_momentos=(fuerza_result)*( xcentro)+sumatoria_de_momentos
sumatoria_de_fuerzas_result=fuerza_result+sumatoria_de_fuerzas_result;
Nx=fxx*Heaviside(x-lfp[k][0])+Nx
Vx=vx+fpx #fuerza cortante Vx
Vx=Vx+r1y*Heaviside(x)+r2y*Heaviside(x-long)
Nx=Nx+r1x*Heaviside(x)+r2x*Heaviside(x-long)
int_Nx=integrate(Nx/(elasty*area),(x,0,long),meijerg=False)
if np.sum(lmp)==0:
pass
else:
dim_de_lmp=np.size(lmp,0)
for k in range(dim_de_lmp):
mpx=mpx-lmp[k][1]*Heaviside(x-lmp[k][0])
sumatoria_de_momentos=lmp[k][1]+sumatoria_de_momentos
mpx=mpx-m1*Heaviside(x)-m2*Heaviside(x-long)
Mx=mpx+integrate(Vx,x,meijerg=False)
gx=integrate(Mx,x,meijerg=False)+c1
fx=integrate(gx,x,meijerg=False)+c2
def calculando_ecuaciones_del_portico(lista_desplaz,lista,long,lcd,lfp,lmp,elasty,iner,area) :
x,c1,c2,c3=symbols('x,c1,c2,c3')
Qx=0;vx=0;fpx=0;mpx=0;Nx=0
else:
dim_de_lfp=np.size(lfp,0)
for k in range(dim_de_lfp):
ang=np.pi/180
fy=-lfp[k][1]*sin(lfp[k][2]*ang)
fxx=-lfp[k][1]*cos(lfp[k][2]*ang)
if long!=lfp[k][0]:
fpx=fpx+fy*Heaviside(x-lfp[k][0])
Nx=fxx*Heaviside(x-lfp[k][0])+Nx
if np.sum(lmp)==0:
print('')
else:
dim_de_lmp=np.size(lmp,0)
for k in range(dim_de_lmp):
if long!=lmp[k][0]:
mpx=mpx-lmp[k][1]*Heaviside(x-lmp[k][0])
mpx=mpx-lista[2,0]*Heaviside(x)#-lista[5,0]*Heaviside(x-long)
Mx=mpx+integrate(Vx,x,meijerg=False)
gx=integrate(Mx,x,meijerg=False)/(elasty*iner)+c1
fx=integrate(gx,x,meijerg=False)+c2
gx_eval=fx.replace(x,long)
gx_eval=gx_eval.replace(Heaviside(0),1)-lista_desplaz[4,0]
fx_eval=fx.replace(x,0)
fx_eval=fx_eval.replace(Heaviside(0),1)-lista_desplaz[1,0]
solucion=solve([gx_eval,fx_eval],[c1,c2],dict=True)
k1=solucion[0][c1]
k2=solucion[0][c2]
gx=gx.replace(c1,k1)
fx=fx.replace(c1,k1)
fx=fx.replace(c2,k2)
lista_de_ecuaciones=[-Nx,Vx,-Mx,gx,fx,delta_lx]
return lista_de_ecuaciones
def rigidez_por_partes(rg,glr,gll):
lista_de_rigideces=[]
dim_glr=np.size(glr,0)
dim_gll=np.size(gll,0)
kaa=Matrix(np.zeros((dim_glr,dim_glr)))
kab=Matrix(np.zeros((dim_glr,dim_gll)))
kba=Matrix(np.zeros((dim_gll,dim_glr)))
kbb=Matrix(np.zeros((dim_gll,dim_gll)))
#para: Kaa
for i in range(dim_glr):
for j in range(dim_glr):
kaa[i,j]=rg[glr[i]-1,glr[j]-1]
#para: Kab
for i in range(dim_glr):
for j in range(dim_gll):
kab[i,j]=rg[glr[i]-1,gll[j]-1]
#para: Kba
for i in range(dim_gll):
for j in range(dim_glr):
kba[i,j]=rg[gll[i]-1,glr[j]-1]
#para: Kbb
for i in range(dim_gll):
for j in range(dim_gll):
kbb[i,j]=rg[gll[i]-1,gll[j]-1]
lista_de_rigideces=[kaa,kab,kba,kbb]
return lista_de_rigideces
def extracion_de_Q(Qt,gl):
dim=np.size(gl)
nQ=[]
for i in range(dim):
nQ+=[Qt[gl[i]-1]]
return nQ
def transpuesta(matwork):
das=Matrix(matwork)
n=np.size(das,0)
m=np.size(das,1)
new=Matrix(np.zeros((m,n)))
for i in range(m):
for j in range(n):
new[i,j]=das[j,i]
return new
def extracion_de_Q_matrix(Qt,gl):
dim=np.size(gl)
nQ=[]
for i in range(dim):
nQ+=[Qt[gl[i]-1,0]]
return nQ
self.actionexit.triggered.connect(self.salir)
self.actionnormal.triggered.connect(self.plot_n)
self.actioncortante.triggered.connect(self.plot_v)
self.actionflector.triggered.connect(self.plot_m)
self.actiongiro.triggered.connect(self.plot_g)
self.actionflecha.triggered.connect(self.plot_dx)
self.actiondeformada_vertical.triggered.connect(self.plot_dy)
self.actionEvaluar.triggered.connect(self.evaluaciones)
self.btn_calc.clicked.connect(self.eval_f)
# para los nodos
self.menos_nodos.clicked.connect(self.eliminar_nodos)
self.mas_nodos.clicked.connect(self.agregar_nodos)
self.actionanalizar.triggered.connect(self.analizar)
self.actionnormal.setEnabled(False)
self.actioncortante.setEnabled(False)
self.actionflector.setEnabled(False)
self.actiongiro.setEnabled(False)
self.actionflecha.setEnabled(False)
self.actiondeformada_vertical.setEnabled(False)
def rotacion_de_sis_coord(xxxx,yyyy,angulo):
ndim=np.size(xxxx)
lista_x=[]
lista_y=[]
for k in range(ndim):
xo=xxxx[k];yo=yyyy[k]
x_nuevo=xo*np.cos(angulo)-yo*np.sin(angulo)
y_nuevo=yo*np.cos(angulo)+xo*np.sin(angulo)
x_nuevo=float(x_nuevo);y_nuevo=float(y_nuevo)
lista_x=np.append(lista_x,[x_nuevo],0)
lista_y=np.append(lista_y,[y_nuevo],0)
return lista_x,lista_y
def calculo_de_pendiente(xo,yo,xf,yf):
if xo!=xf and yo!=yf:
m=(yf-yo)/(xf-xo)
ang=np.arctan(m)
return ang
else:
if xo== xf :
#print("la pendiente es: ",90)
return np.pi/2
else:
#print("la pendiente es: ",0)
return 0
def añadir_db_de_reaciones_y_momentos():
global reaciones_globales,num_nodos,MN
for i in range(num_nodos):
k=i+1
dir_x=round(reaciones_globales[int(3*k-3),0],2)
dir_y=round(reaciones_globales[int(3*k-2),0],2)
print("Reaciones en el nodo "+str(i+1))
print("-----------------------")
print(dir_x,dir_y)
# moment=round(reaciones_globales[int(3*k-1),0],2)
if dir_x!=0:
xn=float(MN[i,0]);yn=float(MN[i,1])
if dir_x>0:
# ventana_de_diagramas.plot_resultado_fp(self,x,y,np.pi,round(dir_x,2))
plt.annotate(str(round(dir_x,2)), xy=(xn,yn), xytext=(xn-2,yn),
bbox=dict(boxstyle='square', fc='blue', linewidth=0.1),
arrowprops=dict(facecolor='red', shrink=0.01, width=0.1),
fontsize=12, color='white', horizontalalignment='center')
if dir_y!=0:
xn=float(MN[i,0]);yn=float(MN[i,1])
if dir_y>0:
plt.annotate(str(round(dir_y,2)), xy=(xn,yn), xytext=(xn,yn-2),
bbox=dict(boxstyle='square', fc='blue', linewidth=0.1),
arrowprops=dict(facecolor='red', shrink=0.01, width=0.1),
fontsize=12, color='white', horizontalalignment='center')
else:
plt.annotate(str(round(dir_y,2)), xy=(xn,yn), xytext=(xn,yn+2),
bbox=dict(boxstyle='square', fc='blue', linewidth=0.1),
arrowprops=dict(facecolor='red', shrink=0.01, width=0.1),
fontsize=12, color='white', horizontalalignment='center')
# if moment!=0:
# x=MN[i,1];y=MN[i,2]
# if moment>0:
# ventana_de_diagramas.plot_resultado_antihorario(self,x,y,round(moment,2))
# else:
# ventana_de_diagramas.plot_resultado_horario(self,x,y,round(abs(moment),2))
def plot_n(self):
global matriz_de_nodos,matrix_de_conexiones,lista_de_ecuaciones
fun=lista_de_ecuaciones[j][0]
xc = np.arange(0,long, 0.01)
yc=[]
xcc=[]
yang=[]
vlav=[]
for l in np.arange(0,long, 1):
try:
tg=fun.subs({x:l})
tg=tg.replace(zoo,0)
vlav+=[float(tg)]
except:
vlav+=[0]
mini=min(vlav)
maxi=max(vlav)
new_maxi=max(maxi,abs(mini))
if new_maxi!=0:
for i in xc:
try:
dx=xo+i
xcc+=[dx]
yang+=[float(yo+i*np.tan(ang))]
evalf = yo+fun.subs({x:i})/new_maxi
evalf=evalf.replace(zoo,0)
yc+= [float(evalf.replace(Heaviside(0),1))]
except:
yc+= [0]
plt.plot(xcc,yc)
plt.grid()
plt.show()
def plot_v(self):
global matriz_de_nodos,matrix_de_conexiones,lista_de_ecuaciones
fun=lista_de_ecuaciones[j][1]
xc = np.arange(0,long, 0.01)
yc=[]
xcc=[]
yang=[]
vlav=[]
for l in np.arange(0,long, 1):
try:
tg=fun.subs({x:l})
tg=tg.replace(zoo,0)
vlav+=[float(tg)]
except:
vlav+=[0]
mini=min(vlav)
maxi=max(vlav)
new_maxi=max(maxi,abs(mini))
if new_maxi!=0:
for i in xc:
try:
dx=xo+i
xcc+=[dx]
yang+=[float(yo+i*np.tan(ang))]
evalf = yo+fun.subs({x:i})/new_maxi
evalf=evalf.replace(zoo,0)
yc+= [float(evalf.replace(Heaviside(0),1))]
except:
yc+= [0]
plt.plot(xcc,yc)
plt.grid()
plt.show()
def plot_m(self):
global matriz_de_nodos,matrix_de_conexiones,lista_de_ecuaciones
fun=lista_de_ecuaciones[j][2]
xc = np.arange(0,long, 0.01)
yc=[]
xcc=[]
yang=[]
vlav=[]
for l in np.arange(0,long, 1):
try:
tg=fun.subs({x:l})
tg=tg.replace(zoo,0)
vlav+=[float(tg)]
except:
vlav+=[0]
mini=min(vlav)
maxi=max(vlav)
new_maxi=max(maxi,abs(mini))
if new_maxi!=0:
for i in xc:
try:
dx=xo+i
xcc+=[dx]
yang+=[float(yo+i*np.tan(ang))]
evalf = yo+fun.subs({x:i})/new_maxi
evalf=evalf.replace(zoo,0)
yc+= [float(evalf.replace(Heaviside(0),1))]
except:
yc+= [0]
plt.plot(xcc,yc)
plt.grid()
plt.show()
def plot_g(self):
global matriz_de_nodos,matrix_de_conexiones,lista_de_ecuaciones
xc = np.arange(0,long, 0.01)
yc=[]
xcc=[]
yang=[]
vlav=[]
for l in np.arange(0,long, 1):
try:
tg=fun.subs({x:l})
tg=tg.replace(zoo,0)
vlav+=[float(tg)]
except:
vlav+=[0]
mini=min(vlav)
maxi=max(vlav)
new_maxi=max(maxi,abs(mini))
if new_maxi!=0:
for i in xc:
try:
dx=xo+i
xcc+=[dx]
yang+=[float(yo+i*np.tan(ang))]
evalf = yo+fun.subs({x:i})/new_maxi
evalf=evalf.replace(zoo,0)
yc+= [float(evalf.replace(Heaviside(0),1))]
except:
yc+= [0]
plt.plot(xcc,yc)
def plot_dy(self):
global matriz_de_nodos,matrix_de_conexiones,lista_de_ecuaciones
fun=lista_de_ecuaciones[j][5]
xc = np.arange(0,long, 0.01)
yc=[]
xcc=[]
yang=[]
vlav=[]
for l in np.arange(0,long, 1):
try:
tg=fun.subs({x:l})
tg=tg.replace(zoo,0)
vlav+=[float(tg)]
except:
vlav+=[0]
mini=min(vlav)
maxi=max(vlav)
new_maxi=max(maxi,abs(mini))
if new_maxi!=0:
for i in xc:
try:
dx=xo+i
xcc+=[dx]
yang+=[float(yo+i*np.tan(ang))]
evalf = yo+fun.subs({x:i})/new_maxi
evalf=evalf.replace(zoo,0)
yc+= [float(evalf.replace(Heaviside(0),1))]
except:
yc+= [0]
plt.plot(xcc,yc)
plt.grid()
plt.show()
def plot_dx(self):
global matriz_de_nodos,matrix_de_conexiones,lista_de_ecuaciones
fun=lista_de_ecuaciones[j][4]
xc = np.arange(0,long, 0.01)
yc=[]
xcc=[]
yang=[]
vlav=[]
for l in np.arange(0,long, 1):
try:
tg=fun.subs({x:l})
tg=tg.replace(zoo,0)
vlav+=[float(tg)]
except:
vlav+=[0]
mini=min(vlav)
maxi=max(vlav)
new_maxi=max(maxi,abs(mini))
if new_maxi!=0:
for i in xc:
try:
dx=xo+i
xcc+=[dx]
yang+=[float(yo+i*np.tan(ang))]
evalf = yo+fun.subs({x:i})/new_maxi
evalf=evalf.replace(zoo,0)
yc+= [float(evalf.replace(Heaviside(0),1))]
except:
yc+= [0]
plt.plot(xcc,yc)
plt.grid()
plt.show()
def analizar(self):
global typs,matriz_de_nodos,matrix_de_conexiones
from sympy.parsing.sympy_parser import parse_expr
#
tabladenodos,tabladeapoyos,tabla_de_coneccion,tabladefuerzas,tablademomentos,tabladecargasdist
r
try:
numero_de_nodos=self.tabladenodos.rowCount()
matriz_de_nodos=[]
for i in range(numero_de_nodos):
dx=parse_expr(self.tabladenodos.item(i, 0).text())
dy=parse_expr(self.tabladenodos.item(i, 1).text())
nodos=[dx,dy]
matriz_de_nodos+=[nodos]
print("Matrix de nodos: ")
print("-----------------------")
print(matriz_de_nodos)
#----------------------------------------------------------------------
numero_de_apoyos=self.tabladeapoyos.rowCount()
apoyos=[]
for i in range(numero_de_apoyos):
nodo=int(self.tabladeapoyos.item(i, 0).text())
typo=typs[i]
nodos=[nodo,typo]
apoyos+=[nodos]
print("Matrix de Apoyos: ")
print("-----------------------")
print(apoyos)
#----------------------------------------------------------------------
numero_de_conect=self.tabla_de_coneccion.rowCount()
matrix_de_conexiones=[]
for i in range(numero_de_conect):
ni=int(self.tabla_de_coneccion.item(i, 0).text())
nf=int(self.tabla_de_coneccion.item(i, 1).text())
A=parse_expr(self.tabla_de_coneccion.item(i, 2).text())
E=parse_expr(self.tabla_de_coneccion.item(i, 3).text())
I=parse_expr(self.tabla_de_coneccion.item(i, 4).text())
cone=[ni,nf,A,E,I]
matrix_de_conexiones+=[cone]
print("Matrix de CONECIONES: ")
print("-----------------------")
print(matrix_de_conexiones)
#----------------------------------------------------------------------
numero_de_FUERZA=self.tabladefuerzas.rowCount()
matriz_de_fuerzas=[]
for i in range(numero_de_FUERZA):
dist=parse_expr(self.tabladefuerzas.item(i, 0).text())
fuer=parse_expr(self.tabladefuerzas.item(i,1).text())
angle=parse_expr(self.tabladefuerzas.item(i, 2).text())
ele=int(self.tabladefuerzas.item(i, 3).text())
cone=[dist,fuer,angle,ele]
matriz_de_fuerzas+=[cone]
print("Matrix de fuerzas: ")
print("-----------------------")
print(matriz_de_fuerzas)
#----------------------------------------------------------------------
numero_de_momentos=self.tablademomentos.rowCount()
matriz_de_momentos=[]
for i in range(numero_de_momentos):
dist=parse_expr(self.tablademomentos.item(i, 0).text())
fuer=parse_expr(self.tablademomentos.item(i,1).text())
ele=int(self.tablademomentos.item(i,2).text())
cone=[dist,fuer,ele]
matriz_de_momentos+=[cone]
print("Matrix de Momentos: ")
print("-----------------------")
print(matriz_de_momentos)
#----------------------------------------------------------------------
numero_de_cargas=self.tabladecargasdistr.rowCount()
matriz_de_cargas=[]
for i in range(numero_de_cargas):
dist_ini=parse_expr(self.tabladecargasdistr.item(i, 0).text())
dist_fin=parse_expr(self.tabladecargasdistr.item(i,1).text())
qx=parse_expr(self.tabladecargasdistr.item(i,2).text())
ele=int(self.tabladecargasdistr.item(i,3).text())
cone=[dist_ini,dist_fin,qx,ele]
matriz_de_cargas+=[cone]
print("Matrix de Cargas: ")
print("-----------------------")
print(matriz_de_cargas)
try:
MyApp.analizar_estructura
(apoyos,matriz_de_nodos,matrix_de_conexiones,matriz_de_cargas,matriz_de_fuerzas,matriz_de_mom
entos)
self.actionnormal.setEnabled(True)
self.actioncortante.setEnabled(True)
self.actionflector.setEnabled(True)
self.actiongiro.setEnabled(True)
self.actionflecha.setEnabled(True)
self.actiondeformada_vertical.setEnabled(True)
except:
QMessageBox.question(self, "Los datos son incorrectos","!ingrese bien los datos¡" )
def Combo_indexchanged(self):
global typs
combo = self.sender()
fila = combo.property('row')
tipo = combo.currentText()
typs[fila]=tipo
def adsendecuaciones(self,N):
global lista_de_ecuaciones
tipo_de_selecion='elemento'
try:
if tipo_de_selecion=='elemento':
self.lista_de_ecuaciones_widgets.clear()
ecuaciones=lista_de_ecuaciones[N]
else:
self.lista_de_ecuaciones_widgets.clear()
self.lista_de_ecuaciones_widgets.addItems(('Selecione un elemento para visualizar las
ecuaciones',))
except:
self.lista_de_ecuaciones_widgets.clear()
self.lista_de_ecuaciones_widgets.addItems(("Para Ver las ecuaciones, primero tiene que
analizar la estructura",))
def eliminar_mom(self):
numrows = self.tablademomentos.rowCount()
self.tablademomentos.removeRow(numrows-1)
def agregar_mom(self):
numrows = self.tablademomentos.rowCount() #contamos
self.tablademomentos.insertRow(numrows) #agregamos al final
etiq_de_nodos=[]
for i in range(numrows+1):
etiq_de_nodos+=['M-'+str(i+1)]
self.tablademomentos.setVerticalHeaderLabels(etiq_de_nodos) #etiquetamos las filas
def eliminar_cargas(self):
numrows = self.tabladecargasdistr.rowCount()
self.tabladecargasdistr.removeRow(numrows-1)
def agregar_cargas(self):
numrows = self.tabladecargasdistr.rowCount() #contamos
self.tabladecargasdistr.insertRow(numrows) #agregamos al final
etiq_de_nodos=[]
for i in range(numrows+1):
etiq_de_nodos+=['C-'+str(i+1)]
self.tabladecargasdistr.setVerticalHeaderLabels(etiq_de_nodos) #etiquetamos las filas
def eliminar_fuerzas(self):
numrows = self.tabladefuerzas.rowCount()
self.tabladefuerzas.removeRow(numrows-1)
def agregar_fuerzas(self):
numrows = self.tabladefuerzas.rowCount() #contamos
self.tabladefuerzas.insertRow(numrows) #agregamos al final
etiq_de_nodos=[]
for i in range(numrows+1):
etiq_de_nodos+=['F-'+str(i+1)]
self.tabladefuerzas.setVerticalHeaderLabels(etiq_de_nodos) #etiquetamos las filas
def eliminar_conec(self):
numrows = self.tabla_de_coneccion.rowCount()
self.tabla_de_coneccion.removeRow(numrows-1)
def agregar_conec(self):
numrows = self.tabla_de_coneccion.rowCount() #contamos
self.tabla_de_coneccion.insertRow(numrows) #agregamos al final
etiq_de_nodos=[]
for i in range(numrows+1):
etiq_de_nodos+=['Elemento-'+str(i+1)]
self.tabla_de_coneccion.setVerticalHeaderLabels(etiq_de_nodos) #etiquetamos las filas
def eliminar_nodos(self):
numrows = self.tabladenodos.rowCount()
self.tabladenodos.removeRow(numrows-1)
def agregar_nodos(self):
numrows = self.tabladenodos.rowCount() #contamos
self.tabladenodos.insertRow(numrows) #agregamos al final
etiq_de_nodos=[]
for i in range(numrows+1):
etiq_de_nodos+=['N-'+str(i+1)]
self.tabladenodos.setVerticalHeaderLabels(etiq_de_nodos) #etiquetamos las filas
def eliminar_apoyos(self):
global typs
numrows = self.tabladeapoyos.rowCount()
self.tabladeapoyos.removeRow(numrows-1)
typs=np.delete(typs,numrows-1)
print("tipos de apoyo que quedan: ",typs)
if numrows-1==0:
typs=[]
def agregar_apoyos(self):
global typs
numrows = self.tabladeapoyos.rowCount() #contamos
self.tabladeapoyos.insertRow(numrows) #agregamos al final
etiq_de_nodos=[]
typs+=['Apoyo Movil']
print("los tipos de apoyos son:",typs)
for i in range(numrows+1):
etiq_de_nodos+=['A-'+str(i+1)]
# c = QtGui.QComboBox()
# c.addItems(['Apoyo Movil','Apoyo Fijo','Apoyo Empotrado'])
combobox = QtGui.QComboBox()
for txt in ['Apoyo Movil','Apoyo Fijo','Apoyo Empotrado']:
combobox.addItem(txt)
combobox.setProperty('row', i)
combobox.currentIndexChanged.connect(self.Combo_indexchanged)
self.tabladeapoyos.setCellWidget(i, 1, combobox)
# c.currentIndexChanged.connect(self.Combo_indexchanged)
# i = self.tabladeapoyos.model().index(i,1)
# self.tabladeapoyos.setIndexWidget(i,c)
def evaluaciones(self):
self.dockWidget_EVAL.setVisible(True)
def salir(self):
mensaje = QMessageBox.question(self, 'Desea salir de la App', "Sí o No ?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
if mensaje == QMessageBox.Yes:
self.close()
def regresar_atras(self):
self.dockWidget_EVAL.setVisible(False)
def eval_f(self):
global lista_de_ecuaciones
tipo_de_selecion='elemento'
if tipo_de_selecion=='elemento':
try:
valor_x=float(self.widgets_eval.text())
N=int(int(self.elemento.text())-1)
ventana.adsendecuaciones(self,N)
nx=lista_de_ecuaciones[N][0]
vx=lista_de_ecuaciones[N][1]
mx=lista_de_ecuaciones[N][2]
gx=lista_de_ecuaciones[N][3]
fy=lista_de_ecuaciones[N][4]
fx=lista_de_ecuaciones[N][5]
eval_axial=nx.replace(x,valor_x)
eval_axial=eval_axial.replace(Heaviside(0),1)
eval_vx=vx.replace(x,valor_x)
eval_vx=eval_vx.replace(Heaviside(0),1)
eval_mx=mx.replace(x,valor_x)
eval_mx=eval_mx.replace(Heaviside(0),1)
eval_gx=gx.replace(x,valor_x)
eval_gx=eval_gx.replace(Heaviside(0),1)
eval_fy=fy.replace(x,valor_x)
eval_fy=eval_fy.replace(Heaviside(0),1)
eval_fx=fx.replace(x,valor_x)
eval_fx=eval_fx.replace(Heaviside(0),1)
eval_axial=nx.replace(x,valor_x)
eval_axial=eval_axial.replace(Heaviside(0),1)
self.lineEdit_2.setText(str(eval_axial))
self.lineEdit_3.setText(str(eval_vx))
self.lineEdit_4.setText(str(-eval_mx))
self.lineEdit_5.setText(str(eval_gx))
self.lineEdit_6.setText(str(eval_fy))
self.lineEdit_7.setText(str(eval_fx))
except:
QMessageBox.question(self, 'Error de casilla', "íngrese una distancia?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
else:
QMessageBox.question(self, 'Error de selecion', "Selecione un elemento?", QMessageBox.Yes
| QMessageBox.No, QMessageBox.No)
def createMenus(self):
self.viewMenu = self.menuBar().addMenu("&ver")
def createDockWindows(self):
self.menuDatos.addAction(self.dockWidget_DATOS_2.toggleViewAction())
self.menufuerzas.addAction(self.dockWidget_carga.toggleViewAction())
self.menuMomentos.addAction(self.dockWidget_moment.toggleViewAction())
self.menuEvaluar.addAction(self.dockWidget_EVAL.toggleViewAction())
self.dockWidget_EVAL.setVisible(False)
dock.setWidget(self.lista_de_ecuaciones_widgets)
self.addDockWidget(Qt.RightDockWidgetArea, dock)
self.viewMenu.addAction(dock.toggleViewAction())
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = ventana()
window.show()
sys.exit(app.exec_())