void_gryph / modules /blender_ext.py
Gryphus314's picture
feat: prototipo funcional multi-módulo con arquitectura optimizada
f6174cf
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")