import bpy from bpy_extras import view3d_utils class RP_OT_add_material(bpy.types.Operator): bl_label = "Add Ui Material" bl_idname = "rigpicker.add_mat" # bl_options = {'REGISTER', 'UNDO'} def execute(self, context): scene = context.scene mat = bpy.data.materials.new("UI") mat.use_nodes = True for node in mat.node_tree.nodes: if node.type == "OUTPUT_MATERIAL": mat_output = node else: mat.node_tree.nodes.remove(node) emission = mat.node_tree.nodes.new("ShaderNodeEmission") mat.node_tree.links.new(emission.outputs[0], mat_output.inputs[0]) if not context.object.data.materials: context.object.data.materials.append(mat) else: context.object.material_slots[0].material = mat return {"FINISHED"} class RP_OT_remove_material(bpy.types.Operator): bl_label = "Remove Ui Material" bl_idname = "rigpicker.remove_mat" # bl_options = {'REGISTER', 'UNDO'} def execute(self, context): scene = context.scene # print(self.shape_type) for mat in context.object.data.materials: bpy.data.materials.remove(mat) context.area.tag_redraw() return {"FINISHED"} class RP_OT_eyedropper_material(bpy.types.Operator): """Tooltip""" bl_idname = "rigpicker.eyedropper_mat" bl_label = "Eye Dropper mat" # bl_options = {'REGISTER', 'UNDO'} # first_mouse_x = IntProperty() # first_value = FloatProperty() def modal(self, context, event): context.area.tag_redraw() context.window.cursor_modal_set("EYEDROPPER") scene = context.scene region = context.region rv3d = context.region_data if event.type == "LEFTMOUSE" and event.value == "RELEASE": self.mouse = event.mouse_region_x, event.mouse_region_y dg = context.evaluated_depsgraph_get() view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, self.mouse) ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, self.mouse) raycast = scene.ray_cast(dg, ray_origin, view_vector) if raycast[0] == True: ob = raycast[4] if ob.data.materials: mat = ob.data.materials[0] for shape in [ o for o in context.selected_objects if o.type in ("MESH", "CURVE", "FONT") ]: if not shape.data.materials: shape.data.materials.append(mat) else: shape.material_slots[0].material = mat # context.space_data.draw_handler_remove(self._handle, 'WINDOW') context.window.cursor_modal_restore() for ob in self.temp_ob: bpy.data.objects.remove(ob) return {"FINISHED"} # return {'FINISHED'} elif event.type in {"RIGHTMOUSE", "ESC"}: # context.object.location.x = self.first_value context.window.cursor_modal_restore() for ob in self.temp_ob: bpy.data.objects.remove(ob) return {"CANCELLED"} return {"RUNNING_MODAL"} def invoke(self, context, event): scene = context.scene # self.local_cursor = tuple(context.space_data.cursor.location) # self.cursor = tuple(context.scene.cursor.location) curves = [o for o in context.visible_objects if o.type in ("CURVE", "FONT")] self.temp_ob = [] dg = bpy.context.evaluated_depsgraph_get() for c in curves: mesh = bpy.data.meshes.new_from_object(c.evaluated_get(dg)) copy = bpy.data.objects.new(c.name + "_tmp", mesh) copy.matrix_world = c.matrix_world for mat in c.data.materials: copy.data.materials.append(mat) scene.collection.objects.link(copy) self.temp_ob.append(copy) # args = (self,context) # self._handle = context.space_data.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL') context.window_manager.modal_handler_add(self) return {"RUNNING_MODAL"} classes = ( RP_OT_add_material, RP_OT_remove_material, RP_OT_eyedropper_material, ) register, unregister = bpy.utils.register_classes_factory(classes)