diff --git a/src/__init__.py b/src/__init__.py index db9cacb..a7c40e4 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,8 +1,10 @@ import bpy from src.menu import id_mask_select_menu +from src.menu.id_mask_editor_options import IDEDITOR_IDMaskEditorOptionsMenu from src.operators.create_id_mask import CreateIDMaskOperator from src.operators.id_editor_create_id import IDEDITOR_CreateIDOperator +from src.operators.id_editor_find_used_ids import IDEDITOR_FindUsedIDsOperator from src.operators.id_editor_paint import IDEDITOR_PaintIDMaskOperator from src.operators.id_editor_remove_id import IDEDITOR_RemoveIDOperator from src.operators.id_mask_select import IDEDITOR_SelectIDMaskOperator @@ -41,7 +43,9 @@ classes = ( IDEDITOR_CreateIDOperator, IDEDITOR_RemoveIDOperator, IDEDITOR_PaintIDMaskOperator, - IDEDITOR_SelectIDMaskOperator + IDEDITOR_SelectIDMaskOperator, + IDEDITOR_FindUsedIDsOperator, + IDEDITOR_IDMaskEditorOptionsMenu ) menu_additions = [ diff --git a/src/menu/id_mask_editor_options.py b/src/menu/id_mask_editor_options.py new file mode 100644 index 0000000..f1e092f --- /dev/null +++ b/src/menu/id_mask_editor_options.py @@ -0,0 +1,13 @@ +import bpy + +from src.operators.id_editor_find_used_ids import IDEDITOR_FindUsedIDsOperator + + +class IDEDITOR_IDMaskEditorOptionsMenu(bpy.types.Menu): + bl_idname = "VIEW3D_MT_idmask_editor_options" + bl_label = "Options" + + def draw(self, context): + layout = self.layout + + layout.operator(IDEDITOR_FindUsedIDsOperator.bl_idname) \ No newline at end of file diff --git a/src/operators/id_editor_find_used_ids.py b/src/operators/id_editor_find_used_ids.py new file mode 100644 index 0000000..b6f2fe2 --- /dev/null +++ b/src/operators/id_editor_find_used_ids.py @@ -0,0 +1,63 @@ +import bpy + +class IDEDITOR_FindUsedIDsOperator(bpy.types.Operator): + bl_idname = "id_mask_editor.find_used_ids" + bl_label = "Find used colors" + bl_description = "Searches the current ID-mask for colors and adds them to the id-list" + + @classmethod + def poll(cls, context): + obj = context.active_object + if obj.type != 'MESH': + return False + + if not obj.data: + return False + + mesh = obj.data + properties = mesh.id_mask_editor_properties + + if not properties.target_attribute: + return False + + return True + + def execute(self, context): + obj = context.active_object + + old_mode = bpy.context.object.mode + if old_mode != "OBJECT": + bpy.ops.object.mode_set(mode='OBJECT', toggle=False) + + mesh = obj.data + properties = mesh.id_mask_editor_properties + color_attribute = mesh.color_attributes.get(properties.target_attribute) + + colors = [] + for color_data in color_attribute.data: + colors.append((color_data.color[0], color_data.color[1], color_data.color[2])) + + i = 0 + set_colors = set(colors) + for color in set_colors: + has_color = False + for color_id in properties.possible_ids: + has_color = (color_id.color.r == color[0] and + color_id.color.g == color[1] and + color_id.color.b == color[2]) + + if has_color: + break + + if has_color: + continue + + color_identifier = properties.possible_ids.add() + color_identifier.color = (color[0], color[1], color[2]) + color_identifier.name = "Imported ID " + str(i + 1) + i += 1 + + if old_mode != "OBJECT": + bpy.ops.object.mode_set(mode=old_mode, toggle=False) + + return {'FINISHED'} \ No newline at end of file diff --git a/src/panels/id_mask_editor.py b/src/panels/id_mask_editor.py index 51a7709..19afcd8 100644 --- a/src/panels/id_mask_editor.py +++ b/src/panels/id_mask_editor.py @@ -1,5 +1,6 @@ import bpy +from src.menu.id_mask_editor_options import IDEDITOR_IDMaskEditorOptionsMenu from src.operators.create_id_mask import CreateIDMaskOperator from src.operators.id_editor_create_id import IDEDITOR_CreateIDOperator from src.operators.id_editor_paint import IDEDITOR_PaintIDMaskOperator @@ -74,6 +75,9 @@ class IDMaskEditorPanel(bpy.types.Panel): col = row.column(align=True) col.operator(IDEDITOR_CreateIDOperator.bl_idname, icon='ADD', text="") col.operator(IDEDITOR_RemoveIDOperator.bl_idname, icon='REMOVE', text="") + col.separator() + + col.menu(IDEDITOR_IDMaskEditorOptionsMenu.bl_idname, icon='DOWNARROW_HLT', text="")