Spaces:
Sleeping
Sleeping
| 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() | |