Revision: 27070
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27070
Author:   campbellbarton
Date:     2010-02-22 01:07:46 +0100 (Mon, 22 Feb 2010)

Log Message:
-----------
bugfix [#21233] Crash in pyapi, with new object.
pass the obdata as an argument rather then assigning later so as not to allow 
an invalid state.

Modified Paths:
--------------
    trunk/blender/release/scripts/extensions/add_mesh_gears.py
    trunk/blender/release/scripts/io/export_obj.py
    trunk/blender/release/scripts/io/import_anim_bvh.py
    trunk/blender/release/scripts/io/import_scene_3ds.py
    trunk/blender/release/scripts/io/import_scene_obj.py
    trunk/blender/release/scripts/modules/rigify/__init__.py
    trunk/blender/release/scripts/op/add_mesh_torus.py
    trunk/blender/release/scripts/op/object.py
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c

Modified: trunk/blender/release/scripts/extensions/add_mesh_gears.py
===================================================================
--- trunk/blender/release/scripts/extensions/add_mesh_gears.py  2010-02-21 
22:55:35 UTC (rev 27069)
+++ trunk/blender/release/scripts/extensions/add_mesh_gears.py  2010-02-22 
00:07:46 UTC (rev 27070)
@@ -322,8 +322,7 @@
 
         mesh.update()
         
-        ob_new = bpy.data.objects.new('Gear','MESH')
-        ob_new.data = mesh
+        ob_new = bpy.data.objects.new('Gear', mesh)
 
         tipgroup = ob_new.add_vertex_group('Tips')
         # for some reason the name does not 'stick' and we have to set it this 
way:

Modified: trunk/blender/release/scripts/io/export_obj.py
===================================================================
--- trunk/blender/release/scripts/io/export_obj.py      2010-02-21 22:55:35 UTC 
(rev 27069)
+++ trunk/blender/release/scripts/io/export_obj.py      2010-02-22 00:07:46 UTC 
(rev 27070)
@@ -447,8 +447,7 @@
                         break
 
                 if has_quads:
-                    newob = bpy.data.objects.new('temp_object', 'MESH')
-                    newob.data = me
+                    newob = bpy.data.objects.new('temp_object', me)
                     # if we forget to set Object.data - crash
                     scene.objects.link(newob)
                     newob.convert_to_triface(scene)

Modified: trunk/blender/release/scripts/io/import_anim_bvh.py
===================================================================
--- trunk/blender/release/scripts/io/import_anim_bvh.py 2010-02-21 22:55:35 UTC 
(rev 27069)
+++ trunk/blender/release/scripts/io/import_anim_bvh.py 2010-02-22 00:07:46 UTC 
(rev 27070)
@@ -295,7 +295,7 @@
     objects = []
 
     def add_ob(name):
-        ob = scn.objects.new('Empty')
+        ob = scn.objects.new('Empty', None)
         objects.append(ob)
         return ob
 
@@ -352,8 +352,7 @@
     scn.set_frame(IMPORT_START_FRAME)
 
     arm_data = bpy.data.armatures.new("MyBVH")
-    arm_ob = bpy.data.objects.new("MyBVH", 'ARMATURE')
-    arm_ob.data = arm_data
+    arm_ob = bpy.data.objects.new("MyBVH", arm_data)
 
     scn.objects.link(arm_ob)
 

Modified: trunk/blender/release/scripts/io/import_scene_3ds.py
===================================================================
--- trunk/blender/release/scripts/io/import_scene_3ds.py        2010-02-21 
22:55:35 UTC (rev 27069)
+++ trunk/blender/release/scripts/io/import_scene_3ds.py        2010-02-22 
00:07:46 UTC (rev 27070)
@@ -418,8 +418,7 @@
                                 uf.tex = True 
 
             # bmesh.transform(contextMatrix)
-            ob = bpy.data.objects.new(tempName, 'MESH')
-            ob.data = bmesh
+            ob = bpy.data.objects.new(tempName, bmesh)
             SCN.objects.link(ob)
 #                      ob = SCN_OBJECTS.new(bmesh, tempName)
             '''
@@ -638,8 +637,7 @@
             x,y,z = struct.unpack('<3f', temp_data)
             new_chunk.bytes_read += STRUCT_SIZE_3FLOAT
 
-            ob = bpy.data.objects.new("Lamp", 'LAMP')
-            ob.data = bpy.data.lamps.new("Lamp")
+            ob = bpy.data.objects.new("Lamp", bpy.data.lamps.new("Lamp"))
             SCN.objects.link(ob)
 
             contextLamp[1]= ob.data

Modified: trunk/blender/release/scripts/io/import_scene_obj.py
===================================================================
--- trunk/blender/release/scripts/io/import_scene_obj.py        2010-02-21 
22:55:35 UTC (rev 27069)
+++ trunk/blender/release/scripts/io/import_scene_obj.py        2010-02-22 
00:07:46 UTC (rev 27070)
@@ -863,10 +863,8 @@
     me.update()
 #      me.calcNormals()
 
-    ob= bpy.data.objects.new("Mesh", 'MESH')
-    ob.data= me
+    ob= bpy.data.objects.new("Mesh", me)
     scn.objects.link(ob)
-#      ob= scn.objects.new(me)
     new_objects.append(ob)
 
     # Create the vertex groups. No need to have the flag passed here since we 
test for the

Modified: trunk/blender/release/scripts/modules/rigify/__init__.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/__init__.py    2010-02-21 
22:55:35 UTC (rev 27069)
+++ trunk/blender/release/scripts/modules/rigify/__init__.py    2010-02-22 
00:07:46 UTC (rev 27070)
@@ -182,8 +182,7 @@
     try:
         obj = scene.objects[name]
     except KeyError:
-        obj = bpy.data.objects.new(name, type='ARMATURE')
-        obj.data = bpy.data.armatures.new(name)
+        obj = bpy.data.objects.new(name, bpy.data.armatures.new(name))
         scene.objects.link(obj)
 
     obj.data.pose_position = 'POSE'
@@ -487,9 +486,8 @@
     scene = context.scene
 
     def create_empty_armature(name):
-        obj_new = bpy.data.objects.new(name, 'ARMATURE')
         armature = bpy.data.armatures.new(name)
-        obj_new.data = armature
+        obj_new = bpy.data.objects.new(name, armature)
         scene.objects.link(obj_new)
         scene.objects.active = obj_new
         for obj in scene.objects:

Modified: trunk/blender/release/scripts/op/add_mesh_torus.py
===================================================================
--- trunk/blender/release/scripts/op/add_mesh_torus.py  2010-02-21 22:55:35 UTC 
(rev 27069)
+++ trunk/blender/release/scripts/op/add_mesh_torus.py  2010-02-22 00:07:46 UTC 
(rev 27070)
@@ -130,8 +130,7 @@
             ob.selected = False
 
         mesh.update()
-        ob_new = bpy.data.objects.new("Torus", 'MESH')
-        ob_new.data = mesh
+        ob_new = bpy.data.objects.new("Torus", mesh)
         scene.objects.link(ob_new)
         ob_new.selected = True
 

Modified: trunk/blender/release/scripts/op/object.py
===================================================================
--- trunk/blender/release/scripts/op/object.py  2010-02-21 22:55:35 UTC (rev 
27069)
+++ trunk/blender/release/scripts/op/object.py  2010-02-22 00:07:46 UTC (rev 
27070)
@@ -447,13 +447,11 @@
             # pick an object to use 
             obj = objects[0]
 
-            ob_new = bpy.data.objects.new(mesh.name, 'MESH')
-            ob_new.data = mesh
+            ob_new = bpy.data.objects.new(mesh.name, mesh)
             base = scene.objects.link(ob_new)
             base.layers[:] = obj.layers
             
-            ob_inst = bpy.data.objects.new(data.name, obj.type)
-            ob_inst.data = data
+            ob_inst = bpy.data.objects.new(data.name, data)
             base = scene.objects.link(ob_inst)
             base.layers[:] = obj.layers
             

Modified: trunk/blender/source/blender/makesrna/intern/rna_main_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_main_api.c 2010-02-21 
22:55:35 UTC (rev 27069)
+++ trunk/blender/source/blender/makesrna/intern/rna_main_api.c 2010-02-22 
00:07:46 UTC (rev 27070)
@@ -30,6 +30,7 @@
 #include <stdio.h>
 
 #include "RNA_define.h"
+#include "RNA_access.h"
 #include "RNA_types.h"
 #include "RNA_enum_types.h"
 
@@ -38,6 +39,7 @@
 #ifdef RNA_RUNTIME
 
 #include "BKE_main.h"
+#include "BKE_curve.h"
 #include "BKE_mesh.h"
 #include "BKE_armature.h"
 #include "BKE_library.h"
@@ -109,12 +111,54 @@
        unlink_scene(bmain, scene, newscene);
 }
 
-Object *rna_Main_objects_new(Main *bmain, char* name, int type)
+Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID 
*data)
 {
-       Object *ob= add_only_object(type, name);
+       Object *ob;
+       int type= OB_EMPTY;
+       if(data) {
+               switch(GS(data->name)) {
+                       case ID_ME:
+                               type= OB_MESH;
+                               break;
+                       case ID_CU:
+                               type= curve_type((struct Curve *)data);
+                               break;
+                       case ID_MB:
+                               type= OB_MBALL;
+                               break;
+                       case ID_LA:
+                               type= OB_LAMP;
+                               break;
+                       case ID_CA:
+                               type= OB_CAMERA;
+                               break;
+                       case ID_LT:
+                               type= OB_LATTICE;
+                               break;
+                       case ID_AR:
+                               type= OB_ARMATURE;
+                               break;
+                       default:
+                       {
+                               const char *idname;
+                               if(RNA_enum_id_from_value(id_type_items, 
GS(data->name), &idname) == 0)
+                                       idname= "UNKNOWN";
+
+                               BKE_reportf(reports, RPT_ERROR, "ID type '%s' 
is not valid for a object.", idname);
+                               return NULL;
+                       }
+               }
+
+               data->us++;
+       }
+
+       ob= add_only_object(type, name);
        ob->id.us--;
+
+       ob->data= data;
        return ob;
 }
+
 void rna_Main_objects_remove(Main *bmain, ReportList *reports, struct Object 
*object)
 {
        /*
@@ -337,10 +381,11 @@
        RNA_def_struct_ui_text(srna, "Main Objects", "Collection of objects");
 
        func= RNA_def_function(srna, "new", "rna_Main_objects_new");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Add a new object to the main 
database");
        parm= RNA_def_string(func, "name", "Object", 0, "", "New name for the 
datablock.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_enum(func, "type", object_type_items, 0, "", "Type of 
Object.");
+       parm= RNA_def_pointer(func, "object_data", "ID", "", "Object data or 
None for an empty object.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
        /* return type */


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to