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"""

Mariana Casa Nova

Educadora Física """) 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)