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: