1

do you know how I can iterate through all the vertices of a mesh, and add a new Empty object as a hook to them via using a script? Like you would do by clicking on them in Edit Mode and then pressing Ctrl+H.

I'm trying to achieve this by the following code unsuccessfully so far:

# I import the bpy and do various things here which work, but the below one doesn't

current_obj = bpy.context.object

for vert in current_obj.data.vertices:          
    vert.hook_add_newob()

Thank you for the support in advance!

MatX
  • 161
  • 10
  • bpy.ops.object.hook_add_newob() – yhoyo Feb 22 '16 at 15:43
  • Yes I tried this already and it also doesn't work. I can't even read the error message just that "Phython script fail, look in the console" - but there is nothing in the console... – MatX Feb 22 '16 at 15:58

2 Answers2

3

Try this:

import bpy, bmesh

# Create a persistent reference to current object
current_obj = bpy.data.objects[ bpy.context.object.name ]

bpy.ops.object.mode_set( mode = 'EDIT' ) # Go to edit mode

bm = bmesh.from_edit_mesh( current_obj.data )

for i in range( len( bm.verts ) ):
    bpy.context.scene.objects.active = current_obj
    bpy.ops.mesh.select_all( action = 'DESELECT' ) # Deselect all vertices
    bm = bmesh.from_edit_mesh( current_obj.data )
    bm.verts.ensure_lookup_table()
    v  = bm.verts[i]
    v.select = True
    bm.select_flush( True )
    bpy.ops.object.hook_add_newob()

bpy.ops.object.mode_set( mode = 'OBJECT' )     # Back to object mode
TLousky
  • 16,043
  • 1
  • 40
  • 72
2

It is now possible without edit mode nor operators.

Can add a modifier assign it vertices and an object without requiring to be in edit mode, or running any operators.

Have lazily added the empty with add empty operator below, but could be replaced with existing objects or bpy.data.objects.new(name, None) and linking to a collection linked to scene. (Adding an object without operators has been well covered on BSE)

import bpy

context = bpy.context scene = context.scene tri = context.object if tri and tri.type == 'MESH': me = tri.data for v in me.vertices: name = f"Vert_{v.index}" bpy.ops.object.empty_add( location=tri.matrix_world @ v.co ) mt = context.object mt.name = name hm = tri.modifiers.new( name=name, type='HOOK', ) hm.object = mt hm.vertex_indices_set([v.index])

Used in answer here https://blender.stackexchange.com/a/197166/15543

batFINGER
  • 84,216
  • 10
  • 108
  • 233