9

I am using the the CollectionProperty class to store a list of properties, so something like this:

class MyPropertyGroup(bpy.types.PropertyGroup):
    name = bpy.props.StringProperty(name="Property Name", default="Something")
    value = bpy.props.IntProperty(name="Property Name", default=22)

bpy.utils.register_class(MyPropertyGroup)
bpy.types.World.my_collection_prop = bpy.props.CollectionProperty(type=MyPropertyGroup)

Then in an Operator I am calling the add() method to create additional properties:

class MyOperator(bpy.types.Operator):
    # some irrelevant code here...

    def execute(self, context):
        my_prop = context.world.my_collection_prop.add()
        my_prop.name = "test"
        my_prop.value = 123

Now my problem is doing the opposite of add().

How do I go about removing an instance from a CollectionProperty?

twiz
  • 291
  • 3
  • 9

2 Answers2

10

As I was about to click the button to post this question, I realized maybe the CollectionProperty class extends/has the same methods as a dictionary or list. Anyway, with a little trial and error I found that it does (sort of).

To remove a single element:

context.world.my_collection_prop.remove(2)

To clear the whole collection:

context.world.my_collection_prop.clear()

I really don't understand how details like this get left out of the Blender API documentation.

twiz
  • 291
  • 3
  • 9
  • And how to find the index of the element? – mifth Jan 18 '15 at 10:16
  • @mifth to remove one element you have to have it's index. This is usually possible when you are using for example id obtained from UIList from gui - when user click on an item, you'll got it's id. Other than that you have to search thru the whole collection for specified elements, or just operate on numbers less than the total len of the collection. – piotao Apr 20 '16 at 03:00
  • Related to this I just opened this: https://blender.stackexchange.com/questions/114190/missing-a-proper-documentation-for-collectionproperty I also find it really annoying that the methods are not in the documentation. Are just missing them and they are burried in some place? – IARI Jul 18 '18 at 08:46
  • 2.91 - it seems it doesn't anymore. – Andrey Sokolov Feb 17 '21 at 19:43
5

Use the CollectionProperty.find(name) to find the index of the item to remove. Then remove the item with remove(index) method. For example:

def remove_item(collection, item):
     collection.remove(collection.find(item.name))

Then use like this:

remove_from_collection(context.world.my_collection, my_item)
Justas
  • 624
  • 6
  • 12