fix for crash when setting a shapekeys name in rna, (probably other properties too).

When the shapekey was returned from the object it didnt use the data's ID which is expected elsewhere in RNA.

Transfer shape now also sets the name.
This commit is contained in:
2010-01-06 12:19:46 +00:00
parent 83f677d9cf
commit e292b5badc
3 changed files with 15 additions and 8 deletions

View File

@@ -176,11 +176,12 @@ class ShapeTransfer(bpy.types.Operator):
def me_cos(verts): def me_cos(verts):
return [v.co.copy() for v in verts] return [v.co.copy() for v in verts]
def ob_add_shape(ob): def ob_add_shape(ob, name):
me = ob.data me = ob.data
ob.add_shape_key(from_mix=False) key = ob.add_shape_key(from_mix=False)
if len(me.shape_keys.keys) == 1: if len(me.shape_keys.keys) == 1:
ob.add_shape_key(from_mix=False) # we need a rest key = ob.add_shape_key(from_mix=False) # we need a rest
key.name = name
ob.active_shape_key_index = len(me.shape_keys.keys) - 1 ob.active_shape_key_index = len(me.shape_keys.keys) - 1
ob.shape_key_lock = True ob.shape_key_lock = True
@@ -191,6 +192,7 @@ class ShapeTransfer(bpy.types.Operator):
use_clamp = False use_clamp = False
me = ob_act.data me = ob_act.data
orig_key_name = ob_act.active_shape_key.name
orig_shape_coords = me_cos(ob_act.active_shape_key.data) orig_shape_coords = me_cos(ob_act.active_shape_key.data)
@@ -206,7 +208,7 @@ class ShapeTransfer(bpy.types.Operator):
target_normals = me_nos(me_other.verts) target_normals = me_nos(me_other.verts)
target_coords = me_cos(me_other.verts) target_coords = me_cos(me_other.verts)
ob_add_shape(ob_other) ob_add_shape(ob_other, orig_key_name)
# editing the final coords, only list that stores wrapped coords # editing the final coords, only list that stores wrapped coords
target_shape_coords = [v.co for v in ob_other.active_shape_key.data] target_shape_coords = [v.co for v in ob_other.active_shape_key.data]

View File

@@ -930,7 +930,7 @@ static PointerRNA rna_Object_active_shape_key_get(PointerRNA *ptr)
return PointerRNA_NULL; return PointerRNA_NULL;
kb= BLI_findlink(&key->block, ob->shapenr-1); kb= BLI_findlink(&key->block, ob->shapenr-1);
RNA_pointer_create(&key->id, &RNA_ShapeKey, kb, &keyptr); RNA_pointer_create((ID *)ob->data, &RNA_ShapeKey, kb, &keyptr);
return keyptr; return keyptr;
} }

View File

@@ -310,19 +310,23 @@ static Object *rna_Object_find_armature(Object *ob)
return ob_arm; return ob_arm;
} }
static KeyBlock *rna_Object_add_shape_key(Object *ob, bContext *C, ReportList *reports, char *name, int from_mix) static PointerRNA rna_Object_add_shape_key(Object *ob, bContext *C, ReportList *reports, char *name, int from_mix)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
KeyBlock *kb= NULL; KeyBlock *kb= NULL;
if((kb=object_insert_shape_key(scene, ob, name, from_mix))) { if((kb=object_insert_shape_key(scene, ob, name, from_mix))) {
PointerRNA keyptr;
RNA_pointer_create((ID *)ob->data, &RNA_ShapeKey, kb, &keyptr);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return keyptr;
} }
else { else {
BKE_reportf(reports, RPT_ERROR, "Object \"%s\"does not support shapes.", ob->id.name+2); BKE_reportf(reports, RPT_ERROR, "Object \"%s\"does not support shapes.", ob->id.name+2);
return PointerRNA_NULL;
} }
return kb;
} }
int rna_Object_is_visible(Object *ob, bContext *C) int rna_Object_is_visible(Object *ob, bContext *C)
@@ -476,6 +480,7 @@ void RNA_api_object(StructRNA *srna)
parm= RNA_def_string(func, "name", "Key", 0, "", "Unique name for the new keylock."); /* optional */ parm= RNA_def_string(func, "name", "Key", 0, "", "Unique name for the new keylock."); /* optional */
parm= RNA_def_boolean(func, "from_mix", 1, "", "Create new shape from existing mix of shapes."); parm= RNA_def_boolean(func, "from_mix", 1, "", "Create new shape from existing mix of shapes.");
parm= RNA_def_pointer(func, "key", "ShapeKey", "", "New shape keyblock."); parm= RNA_def_pointer(func, "key", "ShapeKey", "", "New shape keyblock.");
RNA_def_property_flag(parm, PROP_RNAPTR);
RNA_def_function_return(func, parm); RNA_def_function_return(func, parm);
/* Ray Cast */ /* Ray Cast */