Duplicar vértices mediante scripts

simon666 - 11/07/2010 01:53
¿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.
LaUrA-28 - 04/01/2026 06:35
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.