- dir() now works for collection functions
authorCampbell Barton <ideasman42@gmail.com>
Fri, 20 Nov 2009 10:00:54 +0000 (10:00 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 20 Nov 2009 10:00:54 +0000 (10:00 +0000)
- group.objects.link/unlink use exceptions rather then return values
- scene.add_object/remove_object --> scene.objects.link/unlink

release/scripts/io/export_obj.py
release/scripts/io/import_scene_3ds.py
release/scripts/io/import_scene_obj.py
release/scripts/op/add_mesh_torus.py
source/blender/makesrna/intern/rna_group.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_scene_api.c
source/blender/python/intern/bpy_rna.c

index 34e05c44846ae6b64374318e99bf47951142d336..feeb7cb1f34c4420667e21b7d2b39b460755fe95 100644 (file)
@@ -485,10 +485,10 @@ def write(filename, objects, scene,
                                        newob = bpy.data.add_object('MESH', 'temp_object')
                                        newob.data = me
                                        # if we forget to set Object.data - crash
-                                       scene.add_object(newob)
+                                       scene.objects.link(newob)
                                        newob.convert_to_triface(scene)
                                        # mesh will still be there
-                                       scene.remove_object(newob)
+                                       scene.objects.unlink(newob)
                        '''
                        
                        # Make our own list so it can be sorted to reduce context switching
index 35cd4028a4bef41fc7318607d99472a93a73116a..dd8c24398ae42d688127b0f50e5795ce7f573890 100644 (file)
@@ -465,7 +465,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
                        # bmesh.transform(contextMatrix)
                        ob = bpy.data.add_object("MESH", tempName)
                        ob.data = bmesh
-                       SCN.add_object(ob)
+                       SCN.objects.link(ob)
 #                      ob = SCN_OBJECTS.new(bmesh, tempName)
                        '''
                        if contextMatrix_tx:
@@ -766,7 +766,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
 
                        ob = bpy.data.add_object("LAMP", "Lamp")
                        ob.data = bpy.data.add_lamp("Lamp")
-                       SCN.add_object(ob)
+                       SCN.objects.link(ob)
                        
                        contextLamp[1]= ob.data
 #                      contextLamp[1]= bpy.data.lamps.new()
index 6e67c14d37a560ec7fe9512e9b9c5bef530845f9..2bce99ffb3e5a818709bb210c5c064f15d3babb1 100644 (file)
@@ -864,7 +864,7 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
        
        ob= bpy.data.add_object("MESH", "Mesh")
        ob.data= me
-       scn.add_object(ob)
+       scn.objects.link(ob)
 #      ob= scn.objects.new(me)
        new_objects.append(ob)
 
index 2321c0bbeaba2152daf5820d24d5b494f1b75287..33866de18bb781f65eceb403638c32551421fe9e 100644 (file)
@@ -116,7 +116,7 @@ class AddTorus(bpy.types.Operator):
         mesh.update()
         ob_new = bpy.data.add_object('MESH', "Torus")
         ob_new.data = mesh
-        scene.add_object(ob_new)
+        scene.objects.link(ob_new)
         scene.objects.active = ob_new
         ob_new.selected = True
 
index 7cd0bac402a1b1e65b405b88cfb914a9d3705c86..a05485986d15ff08e8053cc40a118e49a210dc14 100644 (file)
@@ -49,16 +49,24 @@ static PointerRNA rna_Group_objects_get(CollectionPropertyIterator *iter)
        return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, ((GroupObject*)internal->link)->ob);
 }
 
-static int rna_Group_objects_link(Group *group, bContext *C, Object *object)
+static void rna_Group_objects_link(Group *group, bContext *C, ReportList *reports, Object *object)
 {
+       if(!add_to_group(group, object, CTX_data_scene(C), NULL)) {
+               BKE_reportf(reports, RPT_ERROR, "Object \"%s\" already in group \"%s\".", object->id.name+2, group->id.name+2);
+               return;
+       }
+
        WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, &object->id);
-       return add_to_group(group, object, CTX_data_scene(C), NULL);
 }
 
-static int rna_Group_objects_unlink(Group *group, bContext *C, Object *object)
+static void rna_Group_objects_unlink(Group *group, bContext *C, ReportList *reports, Object *object)
 {
+       if(!rem_from_group(group, object, CTX_data_scene(C), NULL)) {
+               BKE_reportf(reports, RPT_ERROR, "Object \"%s\" not in group \"%s\".", object->id.name+2, group->id.name+2);
+               return;
+       }
+
        WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, &object->id);
-       return rem_from_group(group, object, CTX_data_scene(C), NULL);
 }
 
 #else
@@ -79,11 +87,8 @@ static void rna_def_group_objects(BlenderRNA *brna, PropertyRNA *cprop)
 
        /* add object */
        func= RNA_def_function(srna, "link", "rna_Group_objects_link");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Add this object to a group");
-       /* return type */
-       parm= RNA_def_boolean(func, "success", 0, "Success", "");
-       RNA_def_function_return(func, parm);
        /* object to add */
        parm= RNA_def_pointer(func, "object", "Object", "", "Object to add.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -91,10 +96,7 @@ static void rna_def_group_objects(BlenderRNA *brna, PropertyRNA *cprop)
        /* remove object */
        func= RNA_def_function(srna, "unlink", "rna_Group_objects_unlink");
        RNA_def_function_ui_description(func, "Remove this object to a group");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
-       /* return type */
-       parm= RNA_def_boolean(func, "success", 0, "Success", "");
-       RNA_def_function_return(func, parm);
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
        /* object to remove */
        parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
index b9f5d64333f1707d259c0b3635e0567cc761a6a5..64a9f8d521f003af28adac73238bed2b56eb6078 100644 (file)
@@ -80,6 +80,7 @@ EnumPropertyItem proportional_editing_items[] = {
 #include "BKE_node.h"
 #include "BKE_pointcache.h"
 #include "BKE_scene.h"
+#include "BKE_depsgraph.h"
 
 #include "BLI_threads.h"
 
@@ -97,6 +98,34 @@ static PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)
        return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, ((Base*)internal->link)->object);
 }
 
+static void rna_Scene_link_object(Scene *sce, ReportList *reports, Object *ob)
+{
+       Base *base= object_in_scene(ob, sce);
+       if (base) {
+               BKE_report(reports, RPT_ERROR, "Object is already in this scene.");
+               return;
+       }
+       base= scene_add_base(sce, ob);
+       ob->id.us++;
+
+       /* this is similar to what object_add_type and add_object do */
+       ob->lay= base->lay= sce->lay;
+       ob->recalc |= OB_RECALC;
+
+       DAG_scene_sort(sce);
+}
+
+static void rna_Scene_unlink_object(Scene *sce, ReportList *reports, Object *ob)
+{
+       Base *base= object_in_scene(ob, sce);
+       if (!base) {
+               BKE_report(reports, RPT_ERROR, "Object is not in this scene.");
+               return;
+       }
+       /* as long as ED_base_object_free_and_unlink calls free_libblock_us, we don't have to decrement ob->id.us */
+       ED_base_object_free_and_unlink(sce, base);
+}
+
 static void rna_Scene_skgen_etch_template_set(PointerRNA *ptr, PointerRNA value)
 {
        ToolSettings *ts = (ToolSettings*)ptr->data;
@@ -2176,37 +2205,25 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
        StructRNA *srna;
        PropertyRNA *prop;
 
-//     FunctionRNA *func;
-//     PropertyRNA *parm;
+       FunctionRNA *func;
+       PropertyRNA *parm;
        
        RNA_def_property_srna(cprop, "SceneObjects");
        srna= RNA_def_struct(brna, "SceneObjects", NULL);
-       RNA_def_struct_sdna(srna, "Object");
+       RNA_def_struct_sdna(srna, "Scene");
        RNA_def_struct_ui_text(srna, "Scene Objects", "Collection of scene objects.");
 
-#if 0
-       /* add object */
-       func= RNA_def_function(srna, "link", "rna_Scene_objects_link");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
-       RNA_def_function_ui_description(func, "Add this object to this scene");
-       /* return type */
-       parm= RNA_def_boolean(func, "success", 0, "Success", "");
-       RNA_def_function_return(func, parm);
-       /* object to add */
-       parm= RNA_def_pointer(func, "object", "Object", "", "Object to add.");
+       func= RNA_def_function(srna, "link", "rna_Scene_link_object");
+       RNA_def_function_ui_description(func, "Link object to scene.");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+       parm= RNA_def_pointer(func, "object", "Object", "", "Object to add to scene.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
-       /* remove object */
-       func= RNA_def_function(srna, "unlink", "rna_Scene_objects_unlink");
-       RNA_def_function_ui_description(func, "Remove this object to a scene");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
-       /* return type */
-       parm= RNA_def_boolean(func, "success", 0, "Success", "");
-       RNA_def_function_return(func, parm);
-       /* object to remove */
-       parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove.");
+       func= RNA_def_function(srna, "unlink", "rna_Scene_unlink_object");
+       RNA_def_function_ui_description(func, "Unlink object from scene.");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+       parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove from scene.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
-#endif
 
        prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "Object");
index 40f2db6d4a4f5d647a151653ac31c47acfe65d05..6b21f886712d8964f5673758b8756f6d784f9edb 100644 (file)
 
 #include "WM_api.h"
 
-static void rna_Scene_add_object(Scene *sce, ReportList *reports, Object *ob)
-{
-       Base *base= object_in_scene(ob, sce);
-       if (base) {
-               BKE_report(reports, RPT_ERROR, "Object is already in this scene.");
-               return;
-       }
-       base= scene_add_base(sce, ob);
-       ob->id.us++;
-
-       /* this is similar to what object_add_type and add_object do */
-       ob->lay= base->lay= sce->lay;
-       ob->recalc |= OB_RECALC;
-
-       DAG_scene_sort(sce);
-}
-
-static void rna_Scene_remove_object(Scene *sce, ReportList *reports, Object *ob)
-{
-       Base *base= object_in_scene(ob, sce);
-       if (!base) {
-               BKE_report(reports, RPT_ERROR, "Object is not in this scene.");
-               return;
-       }
-       /* as long as ED_base_object_free_and_unlink calls free_libblock_us, we don't have to decrement ob->id.us */
-       ED_base_object_free_and_unlink(sce, base);
-}
-
 static void rna_Scene_set_frame(Scene *sce, bContext *C, int frame)
 {
        sce->r.cfra= frame;
@@ -118,18 +90,6 @@ void RNA_api_scene(StructRNA *srna)
        FunctionRNA *func;
        PropertyRNA *parm;
 
-       func= RNA_def_function(srna, "add_object", "rna_Scene_add_object");
-       RNA_def_function_ui_description(func, "Add object to scene.");
-       RNA_def_function_flag(func, FUNC_USE_REPORTS);
-       parm= RNA_def_pointer(func, "object", "Object", "", "Object to add to scene.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-
-       func= RNA_def_function(srna, "remove_object", "rna_Scene_remove_object");
-       RNA_def_function_ui_description(func, "Remove object from scene.");
-       RNA_def_function_flag(func, FUNC_USE_REPORTS);
-       parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove from scene.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-
        func= RNA_def_function(srna, "set_frame", "rna_Scene_set_frame");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
        RNA_def_function_ui_description(func, "Set scene frame updating all objects immediately.");
index b63e41248f3888995d9b2484d6052a2787c8f60d..aca07e2916c72235d885eb2b7d772f209f97bb8a 100644 (file)
@@ -1428,54 +1428,66 @@ static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *value)
        Py_RETURN_NONE;
 }
 
-static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
+
+static void pyrna_dir_members_py(PyObject *list, PyObject *self)
+{
+       PyObject *dict;
+       PyObject **dict_ptr;
+       PyObject *list_tmp;
+
+       dict_ptr= _PyObject_GetDictPtr((PyObject *)self);
+
+       if(dict_ptr && (dict=*dict_ptr)) {
+               list_tmp = PyDict_Keys(dict);
+               PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
+               Py_DECREF(list_tmp);
+       }
+
+       dict= ((PyTypeObject *)Py_TYPE(self))->tp_dict;
+       if(dict) {
+               list_tmp = PyDict_Keys(dict);
+               PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
+               Py_DECREF(list_tmp);
+       }
+}
+
+static void pyrna_dir_members_rna(PyObject *list, PointerRNA *ptr)
 {
-       PyObject *ret, *dict;
        PyObject *pystring;
-       
+       const char *idname;
+
        /* for looping over attrs and funcs */
+       PointerRNA tptr;
        PropertyRNA *iterprop;
-       
-       /* Include this incase this instance is a subtype of a python class
-        * In these instances we may want to return a function or variable provided by the subtype
-        * */
 
-       if (BPy_StructRNA_CheckExact(self)) {
-               ret = PyList_New(0);
-       } else {
-               PyObject *list;
-               /* class instances */
-               dict = *_PyObject_GetDictPtr((PyObject *)self);
+       {
+               RNA_pointer_create(NULL, &RNA_Struct, ptr->type, &tptr);
+               iterprop= RNA_struct_find_property(&tptr, "functions");
 
-               if (dict==NULL) {
-                       ret = PyList_New(0);
-               }
-               else {
-                       ret = PyDict_Keys(dict);
-               }
+               RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
+                       idname= RNA_function_identifier(itemptr.data);
 
-               /* classes dict */
-               dict= ((PyTypeObject *)Py_TYPE(self))->tp_dict;
-               list = PyDict_Keys(dict);
-               PyList_SetSlice(ret, INT_MAX, INT_MAX, list);
-               Py_DECREF(list);
+                       pystring = PyUnicode_FromString(idname);
+                       PyList_Append(list, pystring);
+                       Py_DECREF(pystring);
+               }
+               RNA_PROP_END;
        }
-       
-       /* Collect RNA items*/
+
        {
                /*
                 * Collect RNA attributes
                 */
                char name[256], *nameptr;
 
-               iterprop= RNA_struct_iterator_property(self->ptr.type);
+               iterprop= RNA_struct_iterator_property(ptr->type);
 
-               RNA_PROP_BEGIN(&self->ptr, itemptr, iterprop) {
+               RNA_PROP_BEGIN(ptr, itemptr, iterprop) {
                        nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name));
 
                        if(nameptr) {
                                pystring = PyUnicode_FromString(nameptr);
-                               PyList_Append(ret, pystring);
+                               PyList_Append(list, pystring);
                                Py_DECREF(pystring);
 
                                if(name != nameptr)
@@ -1484,27 +1496,23 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
                }
                RNA_PROP_END;
        }
-       
-       
-       {
-               /*
-                * Collect RNA function items
-                */
-               PointerRNA tptr;
-               const char *idname;
+}
 
-               RNA_pointer_create(NULL, &RNA_Struct, self->ptr.type, &tptr);
-               iterprop= RNA_struct_find_property(&tptr, "functions");
 
-               RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
-                       idname= RNA_function_identifier(itemptr.data);
+static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
+{
+       PyObject *ret;
+       PyObject *pystring;
 
-                       pystring = PyUnicode_FromString(idname);
-                       PyList_Append(ret, pystring);
-                       Py_DECREF(pystring);
-               }
-               RNA_PROP_END;
-       }
+       /* Include this incase this instance is a subtype of a python class
+        * In these instances we may want to return a function or variable provided by the subtype
+        * */
+       ret = PyList_New(0);
+
+       if (!BPy_StructRNA_CheckExact(self))
+               pyrna_dir_members_py(ret, (PyObject *)self);
+
+       pyrna_dir_members_rna(ret, &self->ptr);
 
        if(self->ptr.type == &RNA_Context) {
                ListBase lb = CTX_data_dir_get(self->ptr.data);
@@ -1663,6 +1671,26 @@ static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObjec
        return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "StructRNA - item.attr = val:");
 }
 
+static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self)
+{
+       PyObject *ret;
+       PointerRNA r_ptr;
+
+       /* Include this incase this instance is a subtype of a python class
+        * In these instances we may want to return a function or variable provided by the subtype
+        * */
+       ret = PyList_New(0);
+
+       if (!BPy_PropertyRNA_CheckExact(self))
+               pyrna_dir_members_py(ret, (PyObject *)self);
+
+       if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr))
+               pyrna_dir_members_rna(ret, &r_ptr);
+
+       return ret;
+}
+
+
 static PyObject *pyrna_prop_getattro( BPy_PropertyRNA *self, PyObject *pyname )
 {
        char *name = _PyUnicode_AsString(pyname);
@@ -2172,6 +2200,7 @@ static struct PyMethodDef pyrna_prop_methods[] = {
        /* array accessor function */
        {"foreach_get", (PyCFunction)pyrna_prop_foreach_get, METH_VARARGS, NULL},
        {"foreach_set", (PyCFunction)pyrna_prop_foreach_set, METH_VARARGS, NULL},
+       {"__dir__", (PyCFunction)pyrna_prop_dir, METH_NOARGS, NULL},
        {NULL, NULL, 0, NULL}
 };
 
@@ -3753,7 +3782,7 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
                        pret= RNA_function_return(func);
                        RNA_pointer_create(NULL, &RNA_Function, func, &funcptr);
 
-                       args = PyTuple_New(rna_function_arg_count(func));
+                       args = PyTuple_New(rna_function_arg_count(func)); /* first arg is included in 'item' */
                        PyTuple_SET_ITEM(args, 0, py_class_instance);
 
                        RNA_parameter_list_begin(parms, &iter);
@@ -3778,7 +3807,8 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
                        Py_DECREF(args);
                }
                else {
-                       Py_DECREF(py_class_instance);
+                       PyErr_Print();
+                       PyErr_Clear();
                        PyErr_Format(PyExc_TypeError, "could not find function %.200s in %.200s to execute callback.", RNA_function_identifier(func), RNA_struct_identifier(ptr->type));
                        err= -1;
                }