Update app.py
Browse files
app.py
CHANGED
|
@@ -1,5 +1,17 @@
|
|
| 1 |
import pandas as pd
|
| 2 |
import gradio as gr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
# Função para avaliação de gordura corporal
|
| 5 |
def imc(nome, idade, avaliador, confea,
|
|
@@ -10,6 +22,11 @@ def imc(nome, idade, avaliador, confea,
|
|
| 10 |
d_tríceps, d_peito, d_sub_axilar, d_subescapular, d_abdominal, d_supra_ilíaca, d_coxa,
|
| 11 |
a_flex, a_post, conc):
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
# Converter os valores para float
|
| 14 |
peso = float(peso)
|
| 15 |
altura = float(altura)
|
|
@@ -45,8 +62,10 @@ def imc(nome, idade, avaliador, confea,
|
|
| 45 |
soma_dob = d_tríceps + d_peito + d_sub_axilar + d_subescapular + d_abdominal + d_supra_ilíaca + d_coxa
|
| 46 |
|
| 47 |
# Percentual de gordura
|
| 48 |
-
perc_g = (495 / (1.10938 - (0.0008267 * soma_dob) + (0.0000016 * soma_dob * soma_dob) - (0.0002574 * idade))) - 450
|
| 49 |
-
|
|
|
|
|
|
|
| 50 |
# Peso gordo e peso magro
|
| 51 |
peso_g = peso * (perc_g / 100)
|
| 52 |
peso_m = peso - peso_g
|
|
@@ -57,7 +76,7 @@ def imc(nome, idade, avaliador, confea,
|
|
| 57 |
# Ingesta calórica de equilíbrio
|
| 58 |
ice = (gcb * 0.2) + gcb
|
| 59 |
|
| 60 |
-
#
|
| 61 |
obs ="Os cálculos deste laudo baseiam-se em fórmulas contidas em: Foss,ML e Keteyian,SJ. FOX-Bases fisiológicas do exercício e do esporte. 6a Ed., 2000."
|
| 62 |
|
| 63 |
|
|
@@ -83,13 +102,9 @@ def imc(nome, idade, avaliador, confea,
|
|
| 83 |
Peso alvo (kg): {peso_alvo:.2f}
|
| 84 |
Percentual de gordura alvo (%): {perc_g_alvo:.2f}
|
| 85 |
IMC alvo: {imc_alvo:.2f}
|
| 86 |
-
|
| 87 |
Avaliação de flexibilidade (sit-and-reach): {a_flex}
|
| 88 |
-
|
| 89 |
Avaliação postural: {a_post}
|
| 90 |
-
|
| 91 |
Gasto calórico basal: {gcb:.2f}
|
| 92 |
-
|
| 93 |
Ingesta calórica de equilíbrio: {ice:.2f}
|
| 94 |
"""
|
| 95 |
Conclusão = f"""
|
|
@@ -98,10 +113,78 @@ def imc(nome, idade, avaliador, confea,
|
|
| 98 |
Obs: {obs}
|
| 99 |
"""
|
| 100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
# OUTPUTS
|
| 102 |
return (
|
| 103 |
Informações_resultados,
|
| 104 |
Conclusão,
|
|
|
|
|
|
|
| 105 |
)
|
| 106 |
|
| 107 |
# Interface Gradio
|
|
@@ -173,6 +256,9 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="sky", secondary_hue="sky")) as
|
|
| 173 |
with gr.Column():
|
| 174 |
Informações_resultados = gr.Textbox(label="Informações e resultados")
|
| 175 |
Conclusão = gr.Textbox(label="Conclusão da avaliação")
|
|
|
|
|
|
|
|
|
|
| 176 |
|
| 177 |
|
| 178 |
inputs = [
|
|
@@ -188,9 +274,11 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="sky", secondary_hue="sky")) as
|
|
| 188 |
outputs = [
|
| 189 |
Informações_resultados,
|
| 190 |
Conclusão,
|
|
|
|
|
|
|
| 191 |
]
|
| 192 |
|
| 193 |
button_1.click(imc, inputs=inputs, outputs=outputs)
|
| 194 |
|
| 195 |
if __name__ == "__main__":
|
| 196 |
-
interface.launch(debug=True)
|
|
|
|
| 1 |
import pandas as pd
|
| 2 |
import gradio as gr
|
| 3 |
+
import plotly.express as px
|
| 4 |
+
import plotly.graph_objects as go
|
| 5 |
+
import plotly.io as pio
|
| 6 |
+
from docx import Document
|
| 7 |
+
from docx.shared import Pt
|
| 8 |
+
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
|
| 9 |
+
from docx.shared import Inches
|
| 10 |
+
from docx.oxml.ns import qn
|
| 11 |
+
from docx.oxml import OxmlElement
|
| 12 |
+
from docx.shared import RGBColor
|
| 13 |
+
from fpdf import FPDF
|
| 14 |
+
from datetime import datetime
|
| 15 |
|
| 16 |
# Função para avaliação de gordura corporal
|
| 17 |
def imc(nome, idade, avaliador, confea,
|
|
|
|
| 22 |
d_tríceps, d_peito, d_sub_axilar, d_subescapular, d_abdominal, d_supra_ilíaca, d_coxa,
|
| 23 |
a_flex, a_post, conc):
|
| 24 |
|
| 25 |
+
# Cria uma variável com a data do dia
|
| 26 |
+
data_hoje = datetime.now().date()
|
| 27 |
+
# Formata a data no formato dd-mm-aaaa
|
| 28 |
+
data_formatada = data_hoje.strftime('%d-%m-%Y')
|
| 29 |
+
|
| 30 |
# Converter os valores para float
|
| 31 |
peso = float(peso)
|
| 32 |
altura = float(altura)
|
|
|
|
| 62 |
soma_dob = d_tríceps + d_peito + d_sub_axilar + d_subescapular + d_abdominal + d_supra_ilíaca + d_coxa
|
| 63 |
|
| 64 |
# Percentual de gordura
|
| 65 |
+
#perc_g = (495 / (1.10938 - (0.0008267 * soma_dob) + (0.0000016 * soma_dob * soma_dob) - (0.0002574 * idade))) - 450
|
| 66 |
+
perc_g_1 = 1.112-0.00043499 * (soma_dob) + 0.00000055 * (soma_dob) * 2 - 0.00028826 * (idade)
|
| 67 |
+
perc_g = (495 / perc_g_1) - 450
|
| 68 |
+
|
| 69 |
# Peso gordo e peso magro
|
| 70 |
peso_g = peso * (perc_g / 100)
|
| 71 |
peso_m = peso - peso_g
|
|
|
|
| 76 |
# Ingesta calórica de equilíbrio
|
| 77 |
ice = (gcb * 0.2) + gcb
|
| 78 |
|
| 79 |
+
# Observação
|
| 80 |
obs ="Os cálculos deste laudo baseiam-se em fórmulas contidas em: Foss,ML e Keteyian,SJ. FOX-Bases fisiológicas do exercício e do esporte. 6a Ed., 2000."
|
| 81 |
|
| 82 |
|
|
|
|
| 102 |
Peso alvo (kg): {peso_alvo:.2f}
|
| 103 |
Percentual de gordura alvo (%): {perc_g_alvo:.2f}
|
| 104 |
IMC alvo: {imc_alvo:.2f}
|
|
|
|
| 105 |
Avaliação de flexibilidade (sit-and-reach): {a_flex}
|
|
|
|
| 106 |
Avaliação postural: {a_post}
|
|
|
|
| 107 |
Gasto calórico basal: {gcb:.2f}
|
|
|
|
| 108 |
Ingesta calórica de equilíbrio: {ice:.2f}
|
| 109 |
"""
|
| 110 |
Conclusão = f"""
|
|
|
|
| 113 |
Obs: {obs}
|
| 114 |
"""
|
| 115 |
|
| 116 |
+
# Relatório
|
| 117 |
+
|
| 118 |
+
# Criar um novo documento do Word
|
| 119 |
+
doc = Document()
|
| 120 |
+
|
| 121 |
+
# Definir o título do documento
|
| 122 |
+
doc.add_heading('Avaliação de Índice de Massa Corporal', level=1)
|
| 123 |
+
|
| 124 |
+
# Definir as seções do relatório
|
| 125 |
+
sections = [
|
| 126 |
+
(Informações_resultados, ""),
|
| 127 |
+
(Conclusão, ""),
|
| 128 |
+
]
|
| 129 |
+
|
| 130 |
+
for content, title in sections:
|
| 131 |
+
doc.add_heading(title, level=2)
|
| 132 |
+
p = doc.add_paragraph()
|
| 133 |
+
run = p.add_run(str(content))
|
| 134 |
+
run.font.name = 'Arial'
|
| 135 |
+
run.font.size = Pt(10)
|
| 136 |
+
p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # Define o alinhamento para à esquerda
|
| 137 |
+
|
| 138 |
+
|
| 139 |
+
# Configuração do espaço antes e depois dos parágrafos
|
| 140 |
+
for paragraph in doc.paragraphs:
|
| 141 |
+
if paragraph.style.name.startswith('Heading'):
|
| 142 |
+
paragraph.space_before = Pt(0) # Elimina espaço antes dos títulos
|
| 143 |
+
else:
|
| 144 |
+
paragraph.space_before = Pt(0) # Espaço antes do parágrafo (ajuste conforme necessário)
|
| 145 |
+
paragraph.space_after = Pt(0) # Espaço depois do parágrafo (ajuste conforme necessário)
|
| 146 |
+
|
| 147 |
+
# Salvar o documento em um arquivo .doc
|
| 148 |
+
doc.save('Avaliação_IMC.doc')
|
| 149 |
+
|
| 150 |
+
# Abre o documento do Word
|
| 151 |
+
docx_file = "Avaliação_IMC.doc"
|
| 152 |
+
doc = Document(docx_file)
|
| 153 |
+
# Cria um novo arquivo PDF
|
| 154 |
+
pdf = FPDF()
|
| 155 |
+
pdf.add_page()
|
| 156 |
+
# Define a fonte para Arial e o tamanho da fonte
|
| 157 |
+
pdf.set_font("Arial", size=12)
|
| 158 |
+
# Itera sobre os parágrafos do documento do Word e adiciona ao PDF
|
| 159 |
+
for paragraph in doc.paragraphs:
|
| 160 |
+
pdf.multi_cell(0, 5, paragraph.text)
|
| 161 |
+
pdf.ln()
|
| 162 |
+
# Salva o arquivo PDF
|
| 163 |
+
pdf_file = f"IMC_{nome}_{data_formatada}.pdf"
|
| 164 |
+
pdf.output(pdf_file)
|
| 165 |
+
|
| 166 |
+
# Gráficos
|
| 167 |
+
data = {
|
| 168 |
+
"Metric": ["Peso", "Percentual de Gordura", "IMC"],
|
| 169 |
+
"Atual": [peso, perc_g, imc],
|
| 170 |
+
"Alvo": [peso_alvo, perc_g_alvo, imc_alvo]
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
df = pd.DataFrame(data)
|
| 174 |
+
|
| 175 |
+
fig = go.Figure(data=[
|
| 176 |
+
go.Bar(name='Atual', x=df["Metric"], y=df["Atual"]),
|
| 177 |
+
go.Bar(name='Alvo', x=df["Metric"], y=df["Alvo"])
|
| 178 |
+
])
|
| 179 |
+
|
| 180 |
+
fig.update_layout(barmode='group', title="Comparação Atual x Alvo", yaxis_title="Valores")
|
| 181 |
+
|
| 182 |
# OUTPUTS
|
| 183 |
return (
|
| 184 |
Informações_resultados,
|
| 185 |
Conclusão,
|
| 186 |
+
fig,
|
| 187 |
+
pdf_file,
|
| 188 |
)
|
| 189 |
|
| 190 |
# Interface Gradio
|
|
|
|
| 256 |
with gr.Column():
|
| 257 |
Informações_resultados = gr.Textbox(label="Informações e resultados")
|
| 258 |
Conclusão = gr.Textbox(label="Conclusão da avaliação")
|
| 259 |
+
Grafico = gr.Plot(label="Gráfico Comparativo")
|
| 260 |
+
Avaliação = gr.File(label="Avaliação_IMC")
|
| 261 |
+
|
| 262 |
|
| 263 |
|
| 264 |
inputs = [
|
|
|
|
| 274 |
outputs = [
|
| 275 |
Informações_resultados,
|
| 276 |
Conclusão,
|
| 277 |
+
Grafico,
|
| 278 |
+
Avaliação
|
| 279 |
]
|
| 280 |
|
| 281 |
button_1.click(imc, inputs=inputs, outputs=outputs)
|
| 282 |
|
| 283 |
if __name__ == "__main__":
|
| 284 |
+
interface.launch(debug=True)
|