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()