¿Cómo puedo hacer en un script lo mismo que haría al pulsar shitch+d(al duplicar vértices)? No he encontrado ninguna función en el Api.
¿Cómo puedo hacer en un script lo mismo que haría al pulsar shitch+d(al duplicar vértices)? No he encontrado ninguna función en el Api.
Para duplicar vértices en Blender usando Python, debes operar en el modo de edición y utilizar el operador bmesh. La función específica del API que necesitas es bmesh.ops.duplicate. No hay un operador directo que imite exactamente Shift+D en la interfaz para vértices seleccionados, ya que ese atajo está pensado para duplicar geometría en general. La clave es duplicar los vértices y luego separarlos en un nuevo elemento.
Aquí tienes un ejemplo de script que funciona en Blender actual (versiones 3.x y 4.x). Asegúrate de estar en modo de edición y tener vértices seleccionados antes de ejecutarlo.
Primero, necesitas obtener el contexto de malla activa y crear un objeto bmesh a partir de él. Importa los módulos necesarios.
import bpy
import bmesh
Obtén el objeto activo y entra en modo de edición si no lo está ya. Luego, crea un objeto bmesh desde la malla del objeto.
obj = bpy.context.active_object
mesh = obj.data
bm = bmesh.from_edit_mesh(mesh)
Ahora, define los vértices que tienes seleccionados. La operación de duplicado en bmesh requiere que le pases la geometría que quieres duplicar.
verts_selected = [v for v in bm.verts if v.select]
geom_original = verts_selected[:]
geom_original.extend([e for e in bm.edges if e.select])
geom_original.extend([f for f in bm.faces if f.select])
Realiza la operación de duplicado usando bmesh.ops.duplicate. Esta función devuelve un diccionario con la nueva geometría duplicada.
ret = bmesh.ops.duplicate(bm, geom=geom_original)
geom_duplicated = ret["geom"]
Separa la geometría duplicada del resto. Para esto, usas bmesh.ops.split. Esto crea nuevos elementos separados, similar a lo que hace el duplicado estándar.
new_verts = [v for v in geom_duplicated if isinstance(v, bmesh.types.BMVert)]
new_edges = [e for e in geom_duplicated if isinstance(e, bmesh.types.BMEdge)]
new_faces = [f for f in geom_duplicated if isinstance(f, bmesh.types.BMFace)]
new_geom = new_verts + new_edges + new_faces
bmesh.ops.split(bm, geom=new_geom, use_only_faces=False)
Finalmente, actualiza la malla en modo de edición para ver los cambios y libera el objeto bmesh.
bmesh.update_edit_mesh(mesh)
bm.free()
El script completo hace lo siguiente: toma los vértices, aristas y caras seleccionados, los duplica y luego los separa en elementos independientes. Los vértices duplicados quedarán seleccionados y en la misma ubicación que los originales, listos para ser movidos.
Recuerda que para ejecutar scripts en el modo de edición, a menudo es mejor usar el espacio de scripting de Blender o un panel de herramientas. Si integras esto en un complemento, considera el contexto de ejecución cuidadosamente. Esta es la forma estándar y actual de lograr la funcionalidad de duplicado mediante el API de Blender.