1
1
import plotly .graph_objects as go
2
2
3
- def get_footer ():
4
- style = """
5
- <style>
6
- # MainMenu {visibility: hidden;}
7
- footer {visibility: hidden;}
8
- .stApp { bottom: 0px; }
9
- </style>
10
- """
11
- return style
12
-
13
- def set_chart (col_widget , ecr2_base : float , abaco : dict , gerar_abaco_completo : bool ) -> None :
3
+ from math import sqrt
4
+ import numpy as np
5
+
6
+ def reset_config (st ) -> None :
7
+
8
+ def _get_footer ():
9
+ style = """
10
+ <style>
11
+ # MainMenu {visibility: hidden;}
12
+ footer {visibility: hidden;}
13
+ .stApp { bottom: 0px; }
14
+ </style>
15
+ """
16
+ return style
14
17
15
- fig = go .Figure ()
18
+ st .set_page_config (
19
+ page_title = "Calculadora" ,
20
+ page_icon = ":coffee:" ,
21
+ layout = "wide" ,
22
+ initial_sidebar_state = "expanded" ,
23
+ menu_items = {
24
+ 'Get Help' :
'mailto:[email protected] ?subject=Ajuda%20-%20Calculadora%20de%20Tensão%20Crítica' ,
25
+ 'Report a bug' :
'mailto:[email protected] ?subject=BUG%20-%20Calculadora%20de%20Tensão%20Crítica' ,
26
+ },
27
+ )
28
+
29
+ st .markdown (_get_footer (), unsafe_allow_html = True )
30
+
31
+ def set_basic_info (st ) -> None :
32
+
33
+ st .title ('Calculadora - Tensão Crítica' )
34
+
35
+ st .markdown ("""
36
+
37
+ Feito por: Marcelo Cardozo • [](https://github.com/marcelogcardozo)
38
+ • [](https://www.linkedin.com/in/marcelogcardozo/)
39
+
40
+ Versão: 1.0
41
+ """ )
42
+
43
+ st .markdown (
44
+ """
45
+ <style>
46
+ img {
47
+ width: 25px; /* Define a largura da imagem */
48
+ height: 25px; /* Define a altura da imagem */
49
+ border-radius: 50%; /* Cria um efeito de círculo */
50
+ }
51
+ </style>
52
+ """ ,
53
+ unsafe_allow_html = True ,
54
+ )
55
+
56
+ st .subheader ('Resultados' )
57
+ st .divider ()
58
+
59
+ def set_sidebar_and_get_params (st ) -> tuple :
60
+
61
+ def _set_dados_do_material () -> tuple :
62
+
63
+ st .sidebar .subheader ('Dados do Material' )
64
+ E = st .sidebar .number_input ('Módulo de Elasticidade (E) [GPa]' , 0.0 , None , 200.0 ) * 1000
65
+ T_esc = st .sidebar .number_input ('Tensão de Escoamento ($\sigma_{y}$) [MPa]' , 0.0 , None , 250.0 )
66
+
67
+ return E , T_esc
68
+
69
+ def _set_dados_secao_transversal () -> tuple :
70
+
71
+ st .sidebar .subheader ('Dados da Seção Transversal' )
72
+ A = st .sidebar .number_input ('Área (A) [mm²]' , 0.0 , None , 0.0 )
73
+ col1 , col2 = st .sidebar .columns ([0.4 , 0.6 ])
74
+ select_box_I_r = col1 .selectbox ('Inércia ou Raio de Giração' , ['I [mm⁴]' , 'r [mm]' ], label_visibility = 'collapsed' )
75
+ value_I_r = col2 .number_input ('uma_label_qualquer' , 0.0 , None , 0.0 , label_visibility = 'collapsed' )
16
76
17
- for ecr2 , pontos in abaco .items ():
77
+ if select_box_I_r == 'I [mm⁴]' :
78
+ I = value_I_r
79
+ try :
80
+ r = sqrt (I / A )
81
+ except ZeroDivisionError :
82
+ r = 0.0
83
+ else :
84
+ r = value_I_r
85
+ I = A * r ** 2
18
86
19
- xs = [p .ler for p in pontos ]
20
- ys = [p .pa for p in pontos ]
87
+ c = st .sidebar .number_input ('Dist. da LN à Fibra de Maior Compressão (c) [mm]' , 0.0 , None , 0.0 )
21
88
22
- dash = 'dash' if (ecr2 == ecr2_base and gerar_abaco_completo ) else None
23
- line_trace = go .Line (x = xs , y = ys , name = f"{ ecr2 :.2f} " , line = dict (dash = dash ))
89
+ return A , I , r , c
24
90
25
- fig . add_trace ( line_trace )
91
+ def _set_dados_do_caso () -> tuple :
26
92
27
- fig .update_layout (
28
- title = 'Ábaco de Euler e Secante' ,
29
- xaxis_title = "Le/r" ,
30
- yaxis_title = "P/A" ,
31
- legend_title = "Ecr2" ,
32
- yaxis_range = [0 , 300.1 ],
33
- xaxis_range = [0 , 200.1 ],
34
- )
93
+ st .sidebar .subheader ('Dados do caso' )
94
+
95
+ col1 , col2 = st .sidebar .columns ([0.4 , 0.6 ])
96
+
97
+ sbox_P = col1 .selectbox ('uma_label' , ['P [kN]' , 'FS' ], label_visibility = 'collapsed' ) #st.sidebar.number_input('Carga aplicada (P) [kN]', 0.0, None, 0.0)
98
+ value_P = col2 .number_input ('uma_label2' , 0.0 , None , 0.0 , label_visibility = 'collapsed' )
99
+
100
+ if sbox_P == 'P [kN]' :
101
+ P = value_P
102
+ FS = 0
103
+ else :
104
+ FS = value_P
105
+ P = 0
106
+
107
+ col1 , col2 = st .sidebar .columns ([0.4 , 0.6 ])
108
+ sbox_Le = col1 .selectbox ('Comprimento efetivo do elemento (Le)' , ['Le [mm]' , 'L [mm]' ], label_visibility = 'collapsed' )
109
+ value_Le = col2 .number_input ('uma_label_qualquer2' , 0.0 , None , 0.0 , label_visibility = 'collapsed' )
110
+
111
+ if sbox_Le == 'L [mm]' :
112
+ k = st .sidebar .select_slider ('Coeficiente de Flambagem (k)' , [str (round (i ,2 )) for i in np .arange (0.5 , 2.05 , 0.05 )])
113
+ Le = float (k ) * value_Le
114
+ else :
115
+ Le = value_Le
116
+ k = 1.0
117
+
118
+ e = st .sidebar .number_input ('Excentricidade (e) [mm]' , 0.0 , None , 0.0 )
119
+
120
+ return P , FS , Le , k , e
121
+
122
+ def _set_gerar_abaco_completo_params () -> tuple :
123
+
124
+ gerar_abaco_completo = st .sidebar .checkbox ('Gerar ábaco completo' , value = False , key = 'gerar_abaco' )
125
+
126
+ if gerar_abaco_completo :
127
+
128
+ faixa_ecr2 = st .sidebar .slider (r'Faixa do $ec/r²$' , 0.0 , 2.0 , (0.0 , 1.0 ), 0.1 )
129
+ de = faixa_ecr2 [0 ]
130
+ ate = faixa_ecr2 [1 ]
131
+
132
+ razao = st .sidebar .number_input ('Razão' , 0.1 , 2.0 , 0.1 )
133
+ else :
134
+ de = 0.0
135
+ ate = 1.0
136
+ razao = 0.1
137
+
138
+ return gerar_abaco_completo , de , ate , razao
139
+
140
+ # Parâmetros de entrada
141
+ st .sidebar .title ('Parâmetros de Entrada' )
142
+
143
+ E , T_esc = _set_dados_do_material ()
144
+ A , I , r , c = _set_dados_secao_transversal ()
145
+ P , FS , Le , k , e = _set_dados_do_caso ()
146
+ abaco_completo , de , ate , razao = _set_gerar_abaco_completo_params ()
147
+
148
+ return E , T_esc , A , I , r , c , P , FS , Le , k , e , abaco_completo , de , ate , razao
149
+
150
+ def set_resultados (st , pcr , P , tensao_normal_critica , tensao_normal_aplicada , v_max , FS , e , ecr2 , abaco , gerar_abaco_completo ) -> None :
151
+
152
+ def set_chart (col_widget , ecr2_base : float , abaco : dict , gerar_abaco_completo : bool ) -> None :
153
+
154
+ fig = go .Figure ()
155
+
156
+ for ecr2 , pontos in abaco .items ():
157
+
158
+ xs = [p .ler for p in pontos ]
159
+ ys = [p .pa for p in pontos ]
160
+
161
+ dash = 'dash' if (ecr2 == ecr2_base and gerar_abaco_completo ) else None
162
+ line_trace = go .Scatter (x = xs , y = ys , name = f"{ ecr2 :.2f} " , mode = 'lines' , line = dict (dash = dash ))
163
+
164
+ fig .add_trace (line_trace )
165
+
166
+ fig .update_layout (
167
+ title = 'Ábaco de Euler e Secante' ,
168
+ xaxis_title = "Le/r" ,
169
+ yaxis_title = "P/A" ,
170
+ legend_title = "Ecr2" ,
171
+ yaxis_range = [0 , 300.1 ],
172
+ xaxis_range = [0 , 200.1 ],
173
+ )
174
+
175
+ col_widget .plotly_chart (fig , use_container_width = True )
176
+
177
+ def set_table (col_widget , ecr2 , abaco ) -> None :
178
+
179
+ data_for_dataframe = {
180
+ 'Le/r' : [round (p .ler , 2 ) for p in abaco [ecr2 ]],
181
+ 'P/A' : [round (p .pa , 2 ) for p in abaco [ecr2 ]],
182
+ }
183
+
184
+ col_widget .dataframe (data_for_dataframe )
185
+
186
+ col1 , col2 , col3 = st .columns (3 )
187
+ col4 , col5 = st .columns ([0.85 , 0.15 ])
188
+
189
+ col1 .latex ('P_{cr} = ' + f'{ pcr :.2f} kN' )
190
+ col1 .latex (f'P = { P :.2f} kN' )
191
+
192
+ col2 .latex ('\sigma_{cr} = ' + f'{ tensao_normal_critica :.2f} MPa' )
193
+ col2 .latex (f'\sigma = { tensao_normal_aplicada :.2f} MPa' )
194
+ col2 .latex ('V_{max} = ' + f'{ v_max :.2f} mm' )
35
195
36
- col_widget .plotly_chart (fig , use_container_width = True )
196
+ col3 .latex (f'FS = { FS :.2f} ' )
197
+ col3 .latex (f'Método: { "Euler" if e == 0 else "Secante" } ' )
37
198
199
+ set_chart (col4 , ecr2 , abaco , gerar_abaco_completo )
200
+ set_table (col5 , ecr2 , abaco )
38
201
39
- def set_table (col_widget , ecr2 , abaco ) -> None :
40
202
41
- data_for_dataframe = {
42
- 'Le/r' : [round (p .ler , 2 ) for p in abaco [ecr2 ]],
43
- 'P/A' : [round (p .pa , 2 ) for p in abaco [ecr2 ]],
44
- }
45
203
46
- col_widget .dataframe (data_for_dataframe )
0 commit comments