OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / operators / misc / empty_image_tools.py

166 lines · python ref:
import bpy
from bpy.props import *
from bpy_extras import view3d_utils
from mathutils import Vector
from ... utils.objects import get_current_selected_status
from ... utils.blender_ui import get_dpi, get_dpi_factor
from ... graphics.drawing2d import set_drawing_dpi
from ... utility import addon


class HOPS_OT_EmptyToImageOperator(bpy.types.Operator):
    bl_idname = "hops.set_empty_image"
    bl_label = "Convert empty object to image"
    bl_description = "Convert empty object to image"
    bl_options = {"REGISTER", "UNDO"}

    img : bpy.props.StringProperty()

    def execute(self, context):

        active_object, other_objects, other_object = get_current_selected_status()
        active_object.empty_display_type = 'IMAGE'
        if self.img in bpy.data.images:
            active_object.data = bpy.data.images[self.img]

        return {"FINISHED"}


class HOPS_OT_CenterEmptyOperator(bpy.types.Operator):
    bl_idname = "hops.center_empty"
    bl_label = "Center image"
    bl_description = "Center the image on the empty"
    bl_options = {"REGISTER", "UNDO"}

    def execute(self, context):

        active_object, other_objects, other_object = get_current_selected_status()
        active_object.empty_image_offset = [-0.5, -0.5]

        return {"FINISHED"}


class HOPS_OT_EmptyTransparencyModal(bpy.types.Operator):
    bl_idname = "hops.empty_transparency_modal"
    bl_label = "Change Transparency"
    bl_description = "Modal operator to set the transparency of the image"
    bl_options = {"REGISTER", "UNDO"}

    def execute(self, context):

        # centerX, centerY = context.region.width / 2, context.region.height / 2
        # self.active_object.color[3] = min(self.rx / centerX, 1)
        return {'FINISHED'}

    def modal(self, context, event):

        if event.type == 'MOUSEMOVE':  # Apply
            centerX, centerY = context.region.width / 2, context.region.height / 2

            self.rx = event.mouse_region_x
            self.ry = event.mouse_region_y

            self.active_object.color[3] = min(self.rx / centerX, 1)

            self.report({'INFO'}, F'Transparency set to: {round(self.active_object.color[3], 2)}')
            return {'RUNNING_MODAL'}
            # self.execute(context)

        elif event.type == 'LEFTMOUSE':  # Confirm

            return {'FINISHED'}

        elif event.type in {'RIGHTMOUSE', 'ESC'}:  # Cancel

            self.active_object.color[3] = self.init_value
            # self.finish()

            return {'CANCELLED'}

        return {'RUNNING_MODAL'}

    def invoke(self, context, event):
        self.active_object, self.other_objects, self.other_object = get_current_selected_status()
        bpy.context.object.use_empty_image_alpha = True
        self.init_value = self.active_object.color[3]
        self.rx = event.mouse_region_x
        self.ry = event.mouse_region_y
        self.start_mouse_position = Vector((self.rx, self.ry))

        self.active_object.use_empty_image_alpha = True

        # args = (context, )
        # self.draw_handler = bpy.types.SpaceView3D.draw_handler_add(self.draw, args, "WINDOW", "POST_PIXEL")
        self.execute(context)
        context.window_manager.modal_handler_add(self)

        return {'RUNNING_MODAL'}

    def finish(self):
        # bpy.types.SpaceView3D.draw_handler_remove(self.draw_handler, "WINDOW")
        return {"FINISHED"}


class HOPS_OT_EmptyOffsetModal(bpy.types.Operator):
    bl_idname = "hops.empty_position_modal"
    bl_label = "Change Offset"
    bl_description = "Modal operator to set the offset of the image"
    bl_options = {"REGISTER", "UNDO"}

    def execute(self, context):

        region = bpy.context.region
        region3D = bpy.context.space_data.region_3d
        view_vector = view3d_utils.region_2d_to_vector_3d(region, region3D, self.mouse_pos)
        self.loc = view3d_utils.region_2d_to_location_3d(region, region3D, self.mouse_pos, view_vector)
        self.loc = self.active_object.matrix_world.inverted() @ self.loc
        self.active_object.empty_image_offset[0] = self.loc[0]/4
        self.active_object.empty_image_offset[1] = self.loc[1]/4
        #  self.active_object.empty_image_offset[1] = self.loc[1] * 1.5


    def modal(self, context, event):

        if event.type == "H" and event.value == "PRESS":
            addon.preference().property.hops_modal_help = not addon.preference().property.hops_modal_help

        if event.type == 'MOUSEMOVE':  # Apply
            self.rx = event.mouse_region_x
            self.ry = event.mouse_region_y
            self.mouse_pos = Vector((self.rx, self.ry))
            self.execute(context)

        elif event.type == 'LEFTMOUSE':  # Confirm
            return self.finish()

        elif event.type == 'C':  # Center
            bpy.ops.hops.center_empty()
            self.loc = Vector((0, 0, 0))

        elif event.type in {'RIGHTMOUSE', 'ESC'}:  # Cancel
            self.active_object.empty_image_offset = self.init_value
            self.finish()
            return {'CANCELLED'}

        return {'RUNNING_MODAL'}

    def invoke(self, context, event):

        self.active_object, self.other_objects, self.other_object = get_current_selected_status()
        self.init_value = Vector(self.active_object.empty_image_offset)
        self.rx = event.mouse_region_x
        self.ry = event.mouse_region_y
        self.mouse_pos = Vector((self.rx, self.ry))
        self.start_mouse_position = Vector((self.rx, self.ry))
        self.loc = Vector((0, 0, 0))

        args = (context, )
        #self.draw_handler = bpy.types.SpaceView3D.draw_handler_add(self.draw, args, "WINDOW", "POST_PIXEL")
        self.execute(context)
        context.window_manager.modal_handler_add(self)

        return {'RUNNING_MODAL'}

    def finish(self):
        #bpy.types.SpaceView3D.draw_handler_remove(self.draw_handler, "WINDOW")
        return {"FINISHED"}