IMC / app.py
DavidSB's picture
Update app.py
9028d9a verified
import pandas as pd
import gradio as gr
import plotly.express as px
import plotly.graph_objects as go
import plotly.io as pio
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Inches
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
from docx.shared import RGBColor
from fpdf import FPDF
from datetime import datetime
# Função para avaliação de gordura corporal
def imc(nome, idade, avaliador, confea,
peso, altura, peso_alvo, perc_g_alvo,
pantur_d, coxa_d, braço_d,
pantur_e, coxa_e, braço_e,
quadril, abdomem, cintura, tórax,
d_tríceps, d_peito, d_sub_axilar, d_subescapular, d_abdominal, d_supra_ilíaca, d_coxa,
a_flex, a_post, conc):
# Cria uma variável com a data do dia
data_hoje = datetime.now().date()
# Formata a data no formato dd-mm-aaaa
data_formatada = data_hoje.strftime('%d-%m-%Y')
# Converter os valores para float
peso = float(peso)
altura = float(altura)
peso_alvo = float(peso_alvo)
perc_g_alvo = float(perc_g_alvo)
pantur_d = float(pantur_d)
coxa_d = float(coxa_d)
braço_d = float(braço_d)
pantur_e = float(pantur_e)
coxa_e = float(coxa_e)
braço_e = float(braço_e)
quadril = float(quadril)
abdomem = float(abdomem)
cintura = float(cintura)
tórax = float(tórax)
# Converter os valores de dobras cutâneas para inteiros
d_tríceps = int(d_tríceps)
d_peito = int(d_peito)
d_sub_axilar = int(d_sub_axilar)
d_subescapular = int(d_subescapular)
d_abdominal = int(d_abdominal)
d_supra_ilíaca = int(d_supra_ilíaca)
d_coxa = int(d_coxa)
# Índice de massa corporal
imc = peso * 10000 / (altura * altura)
# Índice de massa corporal
imc_alvo = peso_alvo * 10000 / (altura * altura)
# Soma das dobras
soma_dob = d_tríceps + d_peito + d_sub_axilar + d_subescapular + d_abdominal + d_supra_ilíaca + d_coxa
# Percentual de gordura
#perc_g = (495 / (1.10938 - (0.0008267 * soma_dob) + (0.0000016 * soma_dob * soma_dob) - (0.0002574 * idade))) - 450
perc_g_1 = 1.112-0.00043499 * (soma_dob) + 0.00000055 * (soma_dob) * 2 - 0.00028826 * (idade)
perc_g = (495 / perc_g_1) - 450
# Peso gordo e peso magro
peso_g = peso * (perc_g / 100)
peso_m = peso - peso_g
# Gasto calórico basal
gcb = 66 + (13.7 * peso) + (5 * altura) - (6.9 * idade)
# Ingesta calórica de equilíbrio
ice = (gcb * 0.2) + gcb
# Observação
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."
# criação de strings para os relatórios da interface e do pdf
Informações_resultados = f"""
Informações_gerais
Nome: {nome}
Idade: {idade}
Avaliador: {avaliador}
Nº Registro: {confea}
Controle_biométrico
Peso (kg): {peso:.2f}
Altura (cm): {altura:.2f}
IMC: {imc:.2f}
Soma das dobras (mm): {soma_dob}
Percentual de gordura (%): {perc_g:.2f}
Peso gordo (kg): {peso_g:.2f}
Peso magro (kg): {peso_m:.2f}
> Objetivos:
Peso alvo (kg): {peso_alvo:.2f}
Percentual de gordura alvo (%): {perc_g_alvo:.2f}
IMC alvo: {imc_alvo:.2f}
Avaliação de flexibilidade (sit-and-reach): {a_flex}
Avaliação postural: {a_post}
Gasto calórico basal: {gcb:.2f}
Ingesta calórica de equilíbrio: {ice:.2f}
"""
Conclusão = f"""
Conclusão da avaliação: {conc}
_____________________________
Obs: {obs}
"""
# Relatório
# Criar um novo documento do Word
doc = Document()
# Definir o título do documento
doc.add_heading('Avaliação de Índice de Massa Corporal', level=1)
# Definir as seções do relatório
sections = [
(Informações_resultados, ""),
(Conclusão, ""),
]
for content, title in sections:
doc.add_heading(title, level=2)
p = doc.add_paragraph()
run = p.add_run(str(content))
run.font.name = 'Arial'
run.font.size = Pt(10)
p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # Define o alinhamento para à esquerda
# Configuração do espaço antes e depois dos parágrafos
for paragraph in doc.paragraphs:
if paragraph.style.name.startswith('Heading'):
paragraph.space_before = Pt(0) # Elimina espaço antes dos títulos
else:
paragraph.space_before = Pt(0) # Espaço antes do parágrafo (ajuste conforme necessário)
paragraph.space_after = Pt(0) # Espaço depois do parágrafo (ajuste conforme necessário)
# Salvar o documento em um arquivo .doc
doc.save('Avaliação_IMC.doc')
# Abre o documento do Word
docx_file = "Avaliação_IMC.doc"
doc = Document(docx_file)
# Cria um novo arquivo PDF
pdf = FPDF()
pdf.add_page()
# Define a fonte para Arial e o tamanho da fonte
pdf.set_font("Arial", size=12)
# Itera sobre os parágrafos do documento do Word e adiciona ao PDF
for paragraph in doc.paragraphs:
pdf.multi_cell(0, 5, paragraph.text)
pdf.ln()
# Salva o arquivo PDF
pdf_file = f"IMC_{nome}_{data_formatada}.pdf"
pdf.output(pdf_file)
# Gráficos
data = {
"Metric": ["Peso", "Percentual de Gordura", "IMC"],
"Atual": [peso, perc_g, imc],
"Alvo": [peso_alvo, perc_g_alvo, imc_alvo]
}
df = pd.DataFrame(data)
fig = go.Figure(data=[
go.Bar(name='Atual', x=df["Metric"], y=df["Atual"]),
go.Bar(name='Alvo', x=df["Metric"], y=df["Alvo"])
])
fig.update_layout(barmode='group', title="Comparação Atual x Alvo", yaxis_title="Valores")
# OUTPUTS
return (
Informações_resultados,
Conclusão,
fig,
pdf_file,
)
# Interface Gradio
with gr.Blocks(theme=gr.themes.Soft(primary_hue="sky", secondary_hue="sky")) as interface:
gr.Markdown(f"""
<p style="text-align: left;">
<b><span style='color: grey; font-size: 20px;'>Mariana Casa Nova</span></b>
</p
<p style="text-align: left;">
<b><span style='color: sky; font-size: 15px;'>Educadora Física</span></b>
""")
with gr.Tab("IMC"):
with gr.Row():
with gr.Column():
nome = gr.Textbox(label="Nome") #, scale=2
idade = gr.Number(label="Idade", value=42) #, scale=1
avaliador = gr.Textbox(label="Avaliador físico", value="Mariana Casa Nova")
confea = gr.Textbox(label="Registro conselho", value="-")
# Controle biométrico
with gr.Group():
with gr.Row():
peso = gr.Number(label="Peso (kg)", value=92.8)
altura = gr.Number(label="Altura (cm)", value=161)
with gr.Row():
peso_alvo = gr.Number(label="Peso alvo (kg)", value=70)
perc_g_alvo = gr.Number(label="% gordura alvo", value=28)
# Perímetros
with gr.Group():
with gr.Row():
pantur_d = gr.Number(label="Panturrilha direita (cm)", value=0)
pantur_e = gr.Number(label="Panturrilha esquerda (cm)", value=0)
with gr.Row():
coxa_e = gr.Number(label="Coxa esquerda (cm)", value=0)
coxa_d = gr.Number(label="Coxa direita (cm)", value=0)
with gr.Row():
braço_d = gr.Number(label="Braço direito (cm)", value=0)
braço_e = gr.Number(label="Braço esquerdo (cm)", value=0)
with gr.Row():
quadril = gr.Number(label="Quadril (cm)", value=0)
cintura = gr.Number(label="Cintura (cm)", value=0)
with gr.Row():
abdomem = gr.Number(0, 200, label="Abdômen (cm)", value=0)
tórax = gr.Number(label="Tórax (cm)", value=0)
# Dobras cutâneas
with gr.Group():
d_tríceps = gr.Slider(0, 100, label="Tríceps (mm)", value=36, step=1)
d_peito = gr.Slider(0, 100, label="Peito", value=0, step=1)
d_sub_axilar = gr.Slider(0, 100, label="Sub-axilar (mm)", value=0, step=1)
d_subescapular = gr.Slider(0, 100, label="Subescapular (mm)", value=0, step=1)
d_abdominal = gr.Slider(0, 100, label="Abdominal (mm)", value=0, step=1)
d_supra_ilíaca = gr.Slider(0, 100, label="Supra-ilíaca (mm)", value=31, step=1)
d_coxa = gr.Slider(0, 100, label="Coxa (mm)", value=53, step=1)
# Avaliações
with gr.Group():
# Avaliação de flexibilidade
a_flex = gr.Radio(["Realizado", "Não realizado"], label="Avaliação de flexibilidade", value="Não realizado")
# Avaliação postural
a_post = gr.Radio(["Realizado", "Não realizado"], label="Avaliação postural", value="Não realizado")
# Conclusão
with gr.Group():
conc = gr.Textbox(label ="Conclusão da avaliação")
button_1 = gr.Button("Calcular")
with gr.Column():
Informações_resultados = gr.Textbox(label="Informações e resultados")
Conclusão = gr.Textbox(label="Conclusão da avaliação")
Grafico = gr.Plot(label="Gráfico Comparativo")
Avaliação = gr.File(label="Avaliação_IMC")
inputs = [
nome, idade, avaliador, confea,
peso, altura, peso_alvo, perc_g_alvo,
pantur_d, coxa_d, braço_d,
pantur_e, coxa_e, braço_e,
quadril, abdomem, cintura, tórax,
d_tríceps, d_peito, d_sub_axilar, d_subescapular, d_abdominal, d_supra_ilíaca, d_coxa,
a_flex, a_post, conc
]
outputs = [
Informações_resultados,
Conclusão,
Grafico,
Avaliação
]
button_1.click(imc, inputs=inputs, outputs=outputs)
if __name__ == "__main__":
interface.launch(debug=True)