The Blender BMesh Python API supports custom-data-layers per vert/edge/face/loop. Per face, it only supports the types (float, int, string, tex), so you'll have to make your own vectors and colors out of floats.
The code would be something like:
import bpy import bmesh ob = bpy.context.object # create a bmesh editing context... bm = bmesh.new() # if we're in edit mode, there is already a BMesh available, else make one if bpy.context.mode == 'EDIT_MESH': bm.from_edit_mesh(ob.data) else: bm.from_mesh(ob.data) # Make the layers.. tag_number = bm.faces.layers.integer.new('number_tag') tag_vector_x = bm.faces.layers.float.new('vector_tag_x') tag_vector_y = bm.faces.layers.float.new('vector_tag_y') tag_vector_z = bm.faces.layers.float.new('vector_tag_z') tag_color_r = bm.faces.layers.float.new('color_tag_r') tag_color_g = bm.faces.layers.float.new('color_tag_g') tag_color_b = bm.faces.layers.float.new('color_tag_b') # fetch the layers tag_number = bm.faces.layers.integer.get('number_tag') tag_vector_x = bm.faces.layers.float.get('vector_tag_x') tag_vector_y = bm.faces.layers.float.get('vector_tag_y') tag_vector_z = bm.faces.layers.float.get('vector_tag_z') tag_color_r = bm.faces.layers.float.get('color_tag_r') tag_color_g = bm.faces.layers.float.get('color_tag_g') tag_color_b = bm.faces.layers.float.get('color_tag_b') # set the tag value for a particular face bm.edges[face_no][tag_number] = new_number_tag_value # retrieve the value for a particular face my_number_tag_value = bm.faces[face_no][tag_number] # save our edits if bpy.context.mode == 'EDIT_MESH': bm.updated_edit_mesh(ob.data) else: bm.to_mesh(ob.data) bm.free()
At some point, you'll probably want to iterate selected faces, like this:
for f in bm.faces: if f.select: print(f.index)
I don't know if the collada exporter does anything with this custom BMesh data. If not, you'll either need to extend it, or write your own exporter.
See also: