Skip to content

Instantly share code, notes, and snippets.

@jirihnidek
Last active August 29, 2015 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jirihnidek/bf0a8cb6bb2f306a39a7 to your computer and use it in GitHub Desktop.
Save jirihnidek/bf0a8cb6bb2f306a39a7 to your computer and use it in GitHub Desktop.
Blender Python API: Example of BMesh layers
import bpy
import bmesh
def element_id_layer(bm, elems, id_name):
"""
This function will create/print verts/edges/faces layer
"""
# Try to get layer of elem IDs
elems_iter = getattr(bm, elems)
lay = elems_iter.layers.int.get(id_name)
if lay is not None:
print('Layer ', id_name, ' exist')
# Print values in layer
for elem in elems_iter:
print(elem[lay], elem.tag)
else:
print('Creating layer ', id_name)
# Set values in layer
lay = elems_iter.layers.int.new(id_name)
# NEW: values will not be copied
lay.use_force_default = True
# NEW: it is possible to set default value
lay.default_value = -1
for elem in elems_iter:
elem[lay] = elem.index
elem.tag = True
print(elem[lay], elem.tag)
def update_layers():
"""
This function update (add) layers to active mesh object
"""
obj = bpy.context.active_object
mesh = obj.data
edit_obj = bpy.context.edit_object
if edit_obj is None:
bm = bmesh.new()
bm.from_mesh(mesh)
elif obj == edit_obj and edit_obj.type == 'MESH':
bm = bmesh.from_edit_mesh(mesh)
else:
pass
element_id_layer(bm, 'verts', 'VertIDs')
element_id_layer(bm, 'edges', 'EdgeIDs')
element_id_layer(bm, 'faces', 'FaceIDs')
if edit_obj is None:
bm.to_mesh(mesh)
bm.free()
if __name__ == '__main__':
update_layers()
@jirihnidek
Copy link
Author

This example requires this patch: https://developer.blender.org/T42865

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment