Skip to content

Instantly share code, notes, and snippets.

@tamask
Created May 4, 2012 01:04
Show Gist options
  • Save tamask/2590850 to your computer and use it in GitHub Desktop.
Save tamask/2590850 to your computer and use it in GitHub Desktop.
Select By Color (Blender)
import bpy
from mathutils import Color
bl_info = {
'name': 'Select By Color',
'author': 'Tamas Kemenczy',
'version': (0, 1),
'blender': (2, 6, 1),
'location': 'View3D > Specials > Select By Color',
'description': 'Select all faces with the same vertex color of the selected face',
'category': 'Mesh'
}
def select_by_color(obj, threshold=0.01):
# get wierd behavior/errors when in editmode
bpy.ops.object.editmode_toggle()
colors = obj.data.vertex_colors.active.data
selected_polygons = list(filter(lambda p: p.select, obj.data.polygons))
if len(selected_polygons):
p = selected_polygons[0]
r = g = b = 0
for i in p.loop_indices:
c = colors[i].color
r += c.r
g += c.g
b += c.b
r /= p.loop_total
g /= p.loop_total
b /= p.loop_total
target = Color((r, g, b))
for p in obj.data.polygons:
r = g = b = 0
for i in p.loop_indices:
c = colors[i].color
r += c.r
g += c.g
b += c.b
r /= p.loop_total
g /= p.loop_total
b /= p.loop_total
source = Color((r, g, b))
print(target, source)
if (abs(source.r - target.r) < threshold and
abs(source.g - target.g) < threshold and
abs(source.b - target.b) < threshold):
p.select = True
bpy.ops.object.editmode_toggle()
class SelectByColor(bpy.types.Operator):
bl_idname = 'mesh.select_by_color'
bl_label = 'Select By Color'
bl_options = {'REGISTER', 'UNDO'}
threshold = bpy.props.FloatProperty(name='Threshold', default=0.01, min=0.001, max=1.0, step=1)
@classmethod
def poll(cls, context):
obj = context.active_object
return (obj and obj.type == 'MESH')
def execute(self, context):
select_by_color(context.active_object, self.threshold)
return {'FINISHED'}
def menu_func(self, context):
self.layout.operator(SelectByColor.bl_idname, text='Select By Color')
def register():
bpy.utils.register_module(__name__)
bpy.types.VIEW3D_MT_edit_mesh_specials.append(menu_func)
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.VIEW3D_MT_edit_mesh_specials.remove(menu_func)
if __name__ == "__main__":
register()
@ThatsAMorais
Copy link

Newb question of the month: Where d'I put the dang thing?

@ThatsAMorais
Copy link

I apologize for that. No longer needed.

@froxi
Copy link

froxi commented Oct 2, 2014

Great tool! Excactly what I was looking for, thanks a lot!!!

@a40yostudent
Copy link

Works with .ply imported from magicavoxel.

@Discartyptics
Copy link

Discartyptics commented Jan 16, 2017

What license is this under? I'd like to use it while manipulating commercial assets

Edit: Never mind, I just read on the Blender.org FAQ that python plugins that use the Blender API are part of the same license as Blender (GNU GPL). Commented for anybody else who might be interested.

@Skyemou5
Copy link

Skyemou5 commented Nov 6, 2019

how do you use this?

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