File size: 2,512 Bytes
874d30f
 
eb96a8a
874d30f
 
eb96a8a
 
 
 
874d30f
eb96a8a
 
 
874d30f
eb96a8a
 
 
 
874d30f
 
 
eb96a8a
 
 
 
 
 
874d30f
eb96a8a
874d30f
 
 
eb96a8a
874d30f
 
eb96a8a
 
 
874d30f
 
eb96a8a
 
 
 
874d30f
eb96a8a
 
 
 
 
874d30f
eb96a8a
 
 
 
 
874d30f
 
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
import gradio as gr
from gradio_client import Client
import shutil
import os

# Подключаемся к стабильному API Shap-E
# Если этот адрес перестанет работать, его можно заменить на другой активный спейс
API_URL = "huggingface-projects/Shap-E"

def generate_3d(prompt):
    if not prompt:
        return None, "Введите описание!"
    
    try:
        client = Client(API_URL)
        # Вызываем генерацию
        result_path = client.predict(
            prompt=prompt,
            api_name="/predict"
        )
        
        # result_path — это путь к временному файлу (например, .glb)
        # Создаем копию в нашей рабочей директории, чтобы Gradio мог его отдать
        final_filename = f"model_{os.path.basename(result_path)}"
        shutil.copy(result_path, final_filename)
        
        return final_filename, final_filename
    except Exception as e:
        return None, f"Ошибка: {str(e)}. Попробуйте другой промпт или подождите."

css = """
.gradio-container { background-color: #050505 !important; color: #d8b4fe !important; }
.main-btn { background: linear-gradient(to right, #4c1d95, #2563eb) !important; border: none !important; color: white !important; }
"""

with gr.Blocks(theme=gr.themes.Monochrome(), css=css) as demo:
    gr.Markdown("# 🚀 3D Forge: Download Edition")
    gr.Markdown("Генерация 3D моделей через внешнее API. Бесплатно и доступно для скачивания.")
    
    with gr.Row():
        with gr.Column(scale=1):
            inp = gr.Textbox(label="Что создаем?", placeholder="A futuristic cyber-helmet, neon details")
            btn = gr.Button("⚒️ СГЕНЕРИРОВАТЬ", variant="primary", elem_classes="main-btn")
            error_msg = gr.Markdown("") # Для вывода ошибок
        
        with gr.Column(scale=2):
            # Предпросмотр модели (можно крутить)
            out_preview = gr.Model3D(label="3D Preview")
            # Кнопка для скачивания самого файла
            out_file = gr.File(label="📥 СКАЧАТЬ МОДЕЛЬ")

    btn.click(
        fn=generate_3d, 
        inputs=inp, 
        outputs=[out_preview, out_file]
    )

demo.launch()