import gradio as gr from custom_utils.setup_env import run_setup_script from custom_utils import smpl_visualizer smpl_visualizer.run() iframe_html = """ """ 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()