OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / operators / editmode / circle.py

72 lines · python ref:
import bpy
from bpy.props import *
from mathutils import Vector
from ... utils.blender_ui import get_dpi, get_dpi_factor
from ... graphics.drawing2d import draw_text, set_drawing_dpi
from ... utility import addon


class HOPS_OT_ModalCircle(bpy.types.Operator):
    bl_idname = "hops.circle"
    bl_label = "Hops Circle"
    bl_options = {"REGISTER", "UNDO", "GRAB_CURSOR", "BLOCKING"}
    bl_description = "Make Circle form selected points"

    @classmethod
    def poll(cls, context):
        if context.active_object != None:
            object = context.active_object
            return(object.type == 'MESH' and context.mode == 'EDIT_MESH')
        return False

    def invoke(self, context, event):

        self.subdivide = 1
        self.start_value = addon.preference().property.Hops_circle_size
        self.offset = 0
        self.start_mouse_position = Vector((event.mouse_region_x, event.mouse_region_y))
        self.last_mouse_x = event.mouse_region_x

        if bpy.context.tool_settings.mesh_select_mode[2] and not bpy.context.tool_settings.mesh_select_mode[0]:
            bpy.ops.mesh.inset(thickness=0.01)
            bpy.ops.mesh.edge_face_add()
        else:
            bpy.ops.mesh.bevel(offset=0.29861, vertex_only=True)

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

    def modal(self, context, event):
        divisor = 1000 if event.shift else 40 if event.ctrl else 230
        offset_x = event.mouse_region_x - self.last_mouse_x
        self.offset += offset_x / divisor / get_dpi_factor()
        self.radius = max((self.start_value - self.offset), 0.001)

        if event.type == "WHEELUPMOUSE" or event.type == 'NUMPAD_PLUS' and event.value == 'PRESS':
            if self.subdivide < 4:
                bpy.ops.mesh.subdivide(number_cuts=1, smoothness=0)
                bpy.ops.mesh.edge_face_add()
                self.subdivide += 1
        if event.type == "WHEELDOWNMOUSE" or event.type == 'NUMPAD_MINUS' and event.value == 'PRESS':
            pass

        # bpy.ops.mesh.looptools_circle(custom_radius=True, fit='best', flatten=True, influence=100, lock_x=False, lock_y=False, lock_z=False, radius=self.radius, regular=True)
        bpy.ops.mesh.looptools_circle(custom_radius=False, fit='inside', flatten=False, influence=100, lock_x=False, lock_y=False, lock_z=False, radius=self.radius, regular=True)

        if event.type in ("ESC", "RIGHTMOUSE"):
            bpy.ops.mesh.looptools_circle(custom_radius=True, fit='best', flatten=True, influence=100, lock_x=False, lock_y=False, lock_z=False, radius=addon.preference().property.Hops_circle_size, regular=True)
            return self.finish()

        if event.type in ("SPACE", "LEFTMOUSE"):
            addon.preference().property.Hops_circle_size = self.radius
            return self.finish()

        self.last_mouse_x = event.mouse_region_x
        context.area.tag_redraw()
        return {"RUNNING_MODAL"}

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