Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from modules.assistant_client import ask_gemini | |
| def render(): | |
| st.header("Blender Python Extensions") | |
| st.markdown(""" | |
| Genera y depura scripts de Python para Blender. | |
| Debido a restricciones del entorno, estos scripts están diseñados para ser copiados y ejecutados en tu instancia local de Blender. | |
| """) | |
| script_type = st.selectbox("Tipo de Script", [ | |
| "Crear Primitivas Aleatorias", | |
| "Animación de Rotación Básica", | |
| "Setup de Material Procedural", | |
| "Custom Script (Generado por Gemini)" | |
| ]) | |
| if script_type == "Crear Primitivas Aleatorias": | |
| code = """import bpy | |
| import random | |
| def create_random_cubes(count=10): | |
| for i in range(count): | |
| x = random.uniform(-10, 10) | |
| y = random.uniform(-10, 10) | |
| z = random.uniform(0, 5) | |
| bpy.ops.mesh.primitive_cube_add(location=(x, y, z)) | |
| create_random_cubes(20)""" | |
| elif script_type == "Animación de Rotación Básica": | |
| code = """import bpy | |
| obj = bpy.context.active_object | |
| if obj: | |
| obj.animation_data_clear() | |
| obj.rotation_mode = 'XYZ' | |
| # Keyframe en frame 1 | |
| obj.rotation_euler = (0, 0, 0) | |
| obj.keyframe_insert(data_path="rotation_euler", frame=1) | |
| # Keyframe en frame 100 | |
| obj.rotation_euler = (0, 0, 6.28318) # 360 grados | |
| obj.keyframe_insert(data_path="rotation_euler", frame=100)""" | |
| elif script_type == "Setup de Material Procedural": | |
| code = """import bpy | |
| def create_simple_material(): | |
| mat = bpy.data.materials.new(name="AutoMaterial") | |
| mat.use_nodes = True | |
| nodes = mat.node_tree.nodes | |
| # Limpiar nodos | |
| for node in nodes: | |
| nodes.remove(node) | |
| node_principled = nodes.new(type='ShaderNodeBsdfPrincipled') | |
| node_output = nodes.new(type='ShaderNodeOutputMaterial') | |
| node_principled.inputs['Base Color'].default_value = (0, 0.5, 0.8, 1) | |
| links = mat.node_tree.links | |
| links.new(node_principled.outputs[0], node_output.inputs[0]) | |
| return mat | |
| obj = bpy.context.active_object | |
| if obj: | |
| obj.data.materials.append(create_simple_material())""" | |
| else: | |
| user_req = st.text_area("¿Qué quieres que haga el script de Blender?", "Crea un sistema de partículas simple que siga un path") | |
| if st.button("Generar con Gemini"): | |
| with st.spinner("Gemini redactando script..."): | |
| prompt = f"Escribe un script de Python para Blender (bpy) que haga lo siguiente: {user_req}. Solo el código, sin explicaciones largas." | |
| code = ask_gemini(prompt) | |
| else: | |
| code = "# Describe tu requerimiento arriba y presiona Generar" | |
| st.subheader("Código Generado") | |
| st.code(code, language="python") | |
| st.download_button("Descargar .py", code, file_name="blender_script.py") |