Newbie problems with shape keys

I’ve managed to get a script together that creates shape keys and the ‘values’ seem set right and the keys are created.

The problem I’m having is that the vertex doesn’t move :frowning: Can someone see my stupid error - please! It works if I’m not working with shape keys, but not when I am.

import bpy

# Clean up any old crap
bpy.ops.mesh.primitive_cube_add(radius=2, view_align=False, 
    enter_editmode=False, location=(0, 0, 0), 
    layers=(True, False, False, False, False, False, False, 
        False, False, False, False, False, False, False, False, 
        False, False, False, False, False))
bpy.ops.object.mode_set(mode = 'OBJECT')
for ob in bpy.context.scene.objects:
    ob.select = ob.type == 'MESH' and ob.name.startswith("Cube")
bpy.ops.object.delete(use_global=False)

# Create cube working with
bpy.ops.mesh.primitive_cube_add(radius=2, view_align=False, 
    enter_editmode=False, location=(0, 0, 0), 
    layers=(True, False, False, False, False, False, False, 
        False, False, False, False, False, False, False, False, 
        False, False, False, False, False))

obj = bpy.context.active_object
bpy.context.scene.frame_set(1)
# Create Basis and Key 1 Shape Keys
bpy.ops.object.shape_key_add(from_mix=False)
bpy.ops.object.shape_key_add(from_mix=False)


keyName="Key 1"
bpy.context.object.active_shape_key_index = 1
bpy.context.scene.frame_set(1)
obj.data.shape_keys.key_blocks[keyName].value = 0
obj.data.shape_keys.key_blocks[keyName].keyframe_insert("value",frame=1)

# This next bit enters edit mode - but doesn't change the position of the vertext!!!!!
bpy.ops.object.mode_set(mode = 'EDIT')
obj.data.vertices[1].co.z += 2
bpy.ops.object.mode_set(mode = 'OBJECT')

bpy.context.scene.frame_set(20)
obj.data.shape_keys.key_blocks[keyName].value = 1
obj.data.shape_keys.key_blocks[keyName].keyframe_insert("value",frame=20)

The main issue is that you modify the actual vertex coordinate. What you need to adjust is the coordinate in the shape keys key block, shape_keys.key_block[name].data[vertex_index].co

import bpy

# Create cube working with
bpy.ops.mesh.primitive_cube_add(radius=2)
obj = bpy.context.active_object

# Create two shape keys
basis = obj.shape_key_add("Basis", from_mix=False)
key1 = obj.shape_key_add("Key 1", from_mix=False)

# Select Key 1 key block in UI
obj.active_shape_key = key1

# Change vertex location (stored in key block, indices like the original vertices)
key1.data[1].co.z += 2


# Keyframing "value" works, but UI won't indicate the keyframes (bug?)

# works in console, broken in script (bug?),
# starts with "shape_keys." in script, which is not the proper path
#path = key1.path_from_id("value")

# Do it manually instead:
path = 'key_blocks["%s"].value' % key1.name

# Animate "value" property

key1.value = 0.0
#key1.keyframe_insert("value", frame=1)
obj.data.shape_keys.keyframe_insert(path, frame=1)

key1.value = 1.0
#key1.keyframe_insert("value", frame=20)
obj.data.shape_keys.keyframe_insert(path, frame=20)

Thanks, I had to tweak the script slightly (think 2.72 doesn’t return many useful values from function calls), but this works great - THANKS :smiley:

import bpy


# Create cube working with
bpy.ops.mesh.primitive_cube_add(radius=2)
obj = bpy.context.active_object


# Create two shape keys
obj.shape_key_add("Basis", from_mix=False)
keyName="Key 1"
obj.shape_key_add(keyName, from_mix=False)


# Change vertex location (stored in key block, indices like the original vertices)
obj.data.shape_keys.key_blocks[keyName].data[1].co.z += 2


# Do it manually instead:
path = 'key_blocks["%s"].value' % keyName


# Animate "value" property
obj.data.shape_keys.key_blocks[keyName].value = 0.0
obj.data.shape_keys.keyframe_insert(path, frame=1)


obj.data.shape_keys.key_blocks[keyName].value = 1.0
obj.data.shape_keys.keyframe_insert(path, frame=20)