File size: 3,971 Bytes
99ffd02
1d5744a
 
99ffd02
1d5744a
 
a651679
1d5744a
 
 
 
 
 
 
230b8e8
1d5744a
 
 
 
 
 
 
 
b001341
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52df11a
b001341
52df11a
 
b001341
 
 
 
 
 
 
 
 
 
99ffd02
b001341
 
 
 
52df11a
b001341
52df11a
b001341
52df11a
b001341
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import gradio as gr
import subprocess
import os

# Запуск setup.sh для настройки окружения и source ~/.bashrc
def run_setup_script():
    setup_script_path = os.path.join(os.path.dirname(__file__), "startup.sh")
    try:
        print("Running setup script...")
        # Выполнить setup.sh и source ~/.bashrc в одной сессии bash
        subprocess.run(
            f"bash -c 'source ~/.bashrc && bash {setup_script_path}'",
            shell=True,
            check=True,
        )       
        print("Setup script and environment initialization completed successfully!")
    except subprocess.CalledProcessError as e:
        print(f"Error while running setup script or sourcing .bashrc: {e}")
        exit(1)

# Выполнить setup.sh перед запуском приложения
run_setup_script()

# Структура состояния приложения
class GUIState:
    def __init__(self):
        self.pattern_state = None  # Заглушка для состояния лекал
        self.local_path_3d = Path('./tmp_gui/garm_3d')
        self.local_path_3d.mkdir(parents=True, exist_ok=True)
        self.garm_3d_filename = None

    def update_pattern_ui_state(self, param_dict=None, param=None, new_value=None):
        """Обновление состояния лекал (заглушка)"""
        print("Обновление лекал...")

    def update_3d_scene(self):
        """Обновление 3D модели (заглушка)"""
        print("Обновление 3D модели...")
        self.garm_3d_filename = f'garm_3d_{time.time()}.glb'
        shutil.copy2('./assets/example.glb', self.local_path_3d / self.garm_3d_filename)
        return str(self.local_path_3d / self.garm_3d_filename)

# Инициализация состояния
state = GUIState()

# Функция для загрузки файлов лекал и тела
def upload_files(pattern_file, body_file):
    if pattern_file:
        print(f"Загружен файл лекал: {pattern_file.name}")
    if body_file:
        print(f"Загружен файл тела: {body_file.name}")
    return "Файлы успешно загружены!"

# Функция для обновления 3D сцены
def update_3d():
    path_to_model = state.update_3d_scene()
    return path_to_model

# Интерфейс Gradio
with gr.Blocks() as demo:
    with gr.Row():
        # Левая панель: загрузка файлов и параметры
        with gr.Column(scale=1):
            gr.Markdown("### Параметры генерации")
            pattern_upload = gr.File(label="Загрузите лекала (JSON/SVG)", file_types=[".json", ".svg"])
            body_upload = gr.File(label="Загрузите модель тела (OBJ/USD/FBX)", file_types=[".obj", ".usd", ".fbx"])
            upload_button = gr.Button("Загрузить файлы")
            upload_status = gr.Textbox(label="Статус загрузки", interactive=False)

            upload_button.click(
                fn=upload_files,
                inputs=[pattern_upload, body_upload],
                outputs=upload_status,
            )

            gr.Markdown("### Дополнительные параметры")
            dropdown_menu = gr.Dropdown(["Опция 1", "Опция 2"], label="Выберите режим")

        # Правая панель: 3D просмотрщик
        with gr.Column(scale=2):
            gr.Markdown("### 3D Просмотрщик")
            viewer = gr.Model3D(label="Результат генерации", interactive=True)
            generate_button = gr.Button("Сгенерировать 3D модель")
            
            generate_button.click(
                fn=update_3d,
                inputs=[],
                outputs=viewer,
            )

# Запуск приложения
demo.launch()