|
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 |
|
|
|
|
|
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): |
|
|
|
|
|
data_hoje = datetime.now().date() |
|
|
|
data_formatada = data_hoje.strftime('%d-%m-%Y') |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
imc = peso * 10000 / (altura * altura) |
|
|
|
|
|
imc_alvo = peso_alvo * 10000 / (altura * altura) |
|
|
|
|
|
soma_dob = d_tríceps + d_peito + d_sub_axilar + d_subescapular + d_abdominal + d_supra_ilíaca + d_coxa |
|
|
|
|
|
|
|
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_g = peso * (perc_g / 100) |
|
peso_m = peso - peso_g |
|
|
|
|
|
gcb = 66 + (13.7 * peso) + (5 * altura) - (6.9 * idade) |
|
|
|
|
|
ice = (gcb * 0.2) + gcb |
|
|
|
|
|
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." |
|
|
|
|
|
|
|
|
|
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} |
|
""" |
|
|
|
|
|
|
|
|
|
doc = Document() |
|
|
|
|
|
doc.add_heading('Avaliação de Índice de Massa Corporal', level=1) |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
for paragraph in doc.paragraphs: |
|
if paragraph.style.name.startswith('Heading'): |
|
paragraph.space_before = Pt(0) |
|
else: |
|
paragraph.space_before = Pt(0) |
|
paragraph.space_after = Pt(0) |
|
|
|
|
|
doc.save('Avaliação_IMC.doc') |
|
|
|
|
|
docx_file = "Avaliação_IMC.doc" |
|
doc = Document(docx_file) |
|
|
|
pdf = FPDF() |
|
pdf.add_page() |
|
|
|
pdf.set_font("Arial", size=12) |
|
|
|
for paragraph in doc.paragraphs: |
|
pdf.multi_cell(0, 5, paragraph.text) |
|
pdf.ln() |
|
|
|
pdf_file = f"IMC_{nome}_{data_formatada}.pdf" |
|
pdf.output(pdf_file) |
|
|
|
|
|
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") |
|
|
|
|
|
return ( |
|
Informações_resultados, |
|
Conclusão, |
|
fig, |
|
pdf_file, |
|
) |
|
|
|
|
|
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") |
|
idade = gr.Number(label="Idade", value=42) |
|
avaliador = gr.Textbox(label="Avaliador físico", value="Mariana Casa Nova") |
|
confea = gr.Textbox(label="Registro conselho", value="-") |
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
with gr.Group(): |
|
|
|
a_flex = gr.Radio(["Realizado", "Não realizado"], label="Avaliação de flexibilidade", value="Não realizado") |
|
|
|
a_post = gr.Radio(["Realizado", "Não realizado"], label="Avaliação postural", value="Não realizado") |
|
|
|
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) |