GarmentCode / app.py
qbhf2's picture
modified: app.py
6779f50
raw
history blame
5.62 kB
import gradio as gr
from custom_utils.setup_env import run_setup_script
from custom_utils import smpl_visualizer
smpl_visualizer.run()
iframe_html = """
<iframe src="http://localhost:8080" width="100%" height="500" style="border:none;"></iframe>
"""
def update_submenu(clothing_type):
"""Функция для динамического обновления подменю в зависимости от типа одежды."""
if clothing_type == "Top":
return (
gr.Dropdown.update(visible=True, label="Front Collar",
choices=["CircleNeckHalf", "CurvyNeckHalf", "VNeckHalf", "SquareNeckHalf",
"TrapezoidNeckHalf", "CircleArcNeckHalf", "Bezier2NeckHalf"]),
gr.Dropdown.update(visible=True, label="Back Collar",
choices=["CircleNeckHalf", "CurvyNeckHalf", "VNeckHalf", "SquareNeckHalf",
"TrapezoidNeckHalf", "CircleArcNeckHalf", "Bezier2NeckHalf"])
)
elif clothing_type == "Down":
return (
gr.Dropdown.update(visible=True, label="Waist Style",
choices=["High Waist", "Low Waist", "Medium Waist"]),
gr.Dropdown.update(visible=False)
)
elif clothing_type == "Full body":
return (
gr.Dropdown.update(visible=True, label="Overall Style",
choices=["Slim Fit", "Loose Fit", "Regular Fit"]),
gr.Dropdown.update(visible=False)
)
else:
return (
gr.Dropdown.update(visible=False),
gr.Dropdown.update(visible=False)
)
with gr.Blocks(title="3D Garment Generator", theme=gr.themes.Default(text_size="sm")) as demo:
# Состояния для хранения выбранных значений
front_collar = gr.State()
back_collar = gr.State()
render_engine = gr.State()
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### Параметры генерации")
with gr.Row():
pattern_upload = gr.File(
label="1. Лекала (JSON/SVG)",
file_types=[".json", ".svg"]
)
body_upload = gr.File(
label="2. Тело (OBJ/GLB/GLTF/FBX)",
file_types=[".obj", ".glb", ".gltf", ".fbx"]
)
with gr.Row():
pattern_specs = gr.File(
label="3.Спецификация (JSON/YAML)",
file_types=[".json",".yaml"]
)
with gr.Row():
with gr.Column(scale=1):
with gr.Accordion("4. Параметры генерации", open=True):
# Выбор типа одежды
clothing_type_dropdown = gr.Dropdown(
label="Тип одежды",
choices=["Top", "Down", "Full body"],
value="Top",
interactive=True
)
# Подменю (изначально скрытое)
front_dropdown = gr.Dropdown(
visible=False,
label="Front Collar",
choices=[],
interactive=True
)
back_dropdown = gr.Dropdown(
visible=False,
label="Back Collar",
choices=[],
interactive=True
)
# Общий параметр (должен быть после дропдаунов)
overall_length = gr.Slider(1, 50, value=25, label="Длина одежды",
info="Выберите значение от 1 до 50",
interactive=True)
# Обновление подменю при изменении типа одежды
clothing_type_dropdown.change(
fn=update_submenu,
inputs=clothing_type_dropdown,
outputs=[front_dropdown, back_dropdown]
)
with gr.Accordion("5. Render engine", open=False):
render_radio = gr.Radio(
label="Движок рендеринга",
choices=["BPY", "Pyrender/Open3D", "Maya"],
value="Pyrender/Open3D"
)
with gr.Column(scale=3):
# viewer = gr.Model3D(label="3D Просмотрщик", interactive=True, height=500,
# clear_color=[255.0, 255.0, 255.0, 0.0]
# )
viewer = gr.HTML(iframe_html, label="3D Рендер")
with gr.Row():
save_render_btn = gr.Button("Сохранить рендер")
save_obj_btn = gr.Button("Сохранить OBJ")
# Обработчики событий
front_dropdown.change(
lambda x: x,
inputs=front_dropdown,
outputs=front_collar
)
back_dropdown.change(
lambda x: x,
inputs=back_dropdown,
outputs=back_collar
)
render_radio.change(
lambda x: x,
inputs=render_radio,
outputs=render_engine
)
body_upload.change(
lambda file: file.name if file else None,
inputs=body_upload,
outputs=viewer
)
if __name__ == "__main__":
run_setup_script()
demo.launch()