OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / src / operator / add / screw.py

517 lines · python ref:
import bpy
import math
import bmesh
from .... utility import addon


class HOPS_OT_ADD_circle(bpy.types.Operator):
    bl_idname = "hops.add_circle"
    bl_label = "Add smart circle"
    bl_options = {"REGISTER", "UNDO", "GRAB_CURSOR", "BLOCKING"}
    bl_description = """Create Smart circle"""

    def execute(self, context):
        verts = [(0, 0, 0)]
        obj = bpy.data.objects.new("Circle", bpy.data.meshes.new("Circle"))

        bpy.ops.object.select_all(action='DESELECT')
        context.collection.objects.link(obj)
        context.view_layer.objects.active = obj
        obj.select_set(True)

        bpy.ops.view3d.snap_selected_to_cursor(use_offset=False)
        if addon.preference().behavior.cursor_boolshapes:
            obj.rotation_euler = bpy.context.scene.cursor.rotation_euler

        bm = bmesh.new()
        for v in verts:
            bm.verts.new(v)
        bm.to_mesh(context.object.data)
        bm.free()

        self.add_screw_modifier(obj, 'X', 'HOPS_screw_x')
        self.add_screw_modifier2(obj, 'Z', 'HOPS_screw', True)
        self.add_decimate_modifier(obj, 'HOPS_decimate_c')
        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True
            bpy.context.object.data.auto_smooth_angle = math.radians(30)

        return {"FINISHED"}


    def add_screw_modifier(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(0)
        screw_modifier.axis = axis
        screw_modifier.steps = 2
        screw_modifier.render_steps = 2
        screw_modifier.screw_offset = 1
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_screw_modifier2(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(360)
        screw_modifier.axis = axis
        screw_modifier.steps = 36
        screw_modifier.render_steps = 36
        screw_modifier.screw_offset = 0
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_decimate_modifier(self, object, name='HOPS_decimate_c'):
        modifier = object.modifiers.new('Decimate', 'DECIMATE')
        modifier.angle_limit = math.radians(0.25)
        modifier.decimate_type = 'DISSOLVE'


class HOPS_OT_ADD_cylinder(bpy.types.Operator):
    bl_idname = "hops.add_cylinder"
    bl_label = "Add smart Cylinder"
    bl_options = {"REGISTER", "UNDO", "GRAB_CURSOR", "BLOCKING"}
    bl_description = """Create Smart Cylinder"""

    def execute(self, context):
        verts = [(0, 0, 0)]
        obj = bpy.data.objects.new("Cylinder", bpy.data.meshes.new("Cylinder"))

        bpy.ops.object.select_all(action='DESELECT')
        context.collection.objects.link(obj)
        context.view_layer.objects.active = obj
        obj.select_set(True)

        bpy.ops.view3d.snap_selected_to_cursor(use_offset=False)
        if addon.preference().behavior.cursor_boolshapes:
            obj.rotation_euler = bpy.context.scene.cursor.rotation_euler

        bm = bmesh.new()
        for v in verts:
            bm.verts.new(v)
        bm.to_mesh(context.object.data)
        bm.free()

        self.add_screw_modifier(obj, 'X', 'HOPS_screw_x')
        self.add_screw_modifier2(obj, 'Z', 'HOPS_screw', True)
        self.add_solidify_modifier(obj, 'HOPS_solidify_z')
        self.add_decimate_modifier(obj, 'HOPS_decimate_c')
        self.add_bevel_modifier(context, obj, True, math.radians(30))
        if (2, 82, 4) < bpy.app.version:
            self.add_weld_modifier(obj, 'HOPS_weld')
        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True
            bpy.context.object.data.auto_smooth_angle = math.radians(30)

        return {"FINISHED"}


    def add_screw_modifier(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(0)
        screw_modifier.axis = axis
        screw_modifier.steps = 2
        screw_modifier.render_steps = 2
        screw_modifier.screw_offset = 1
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_screw_modifier2(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(360)
        screw_modifier.axis = axis
        screw_modifier.steps = 32
        screw_modifier.render_steps = 32
        screw_modifier.screw_offset = 0
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip

    def add_weld_modifier(self, object, name='HOPS_weld'):
        if (2, 82, 4) < bpy.app.version:
            modifier = object.modifiers.new('HOPS_weld', 'WELD')
        else:
            pass

    def add_solidify_modifier(self, object, name='HOPS_solidify_z'):
        solidify_modifier = object.modifiers.new(name, "SOLIDIFY")
        solidify_modifier.thickness = 2
        solidify_modifier.offset = 1
        solidify_modifier.use_even_offset = True
        solidify_modifier.use_quality_normals = True
        solidify_modifier.use_rim_only = False
        solidify_modifier.show_on_cage = True


    def add_bevel_modifier(self, context, object, clamp, angle):
        bevel_modifier = object.modifiers.new(name="HOPS_bevel_c", type="BEVEL")
        bevel_modifier.limit_method = "ANGLE"
        bevel_modifier.angle_limit = angle
        bevel_modifier.miter_outer = 'MITER_ARC'
        bevel_modifier.width = 0.15
        bevel_modifier.profile = 0.50
        bevel_modifier.segments = 1
        bevel_modifier.loop_slide = True
        bevel_modifier.use_clamp_overlap = clamp

        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True


    def add_displace_modifier(self, object, strength, axis='X', name='HOPS_displace_x'):
        displace_modifier = object.modifiers.new(name=name, type="DISPLACE")
        displace_modifier.direction = axis
        displace_modifier.strength = strength


    def add_decimate_modifier(self, object, name='HOPS_decimate_c'):
        modifier = object.modifiers.new('Decimate', 'DECIMATE')
        modifier.angle_limit = math.radians(0.25)
        modifier.decimate_type = 'DISSOLVE'


class HOPS_OT_ADD_cone(bpy.types.Operator):
    bl_idname = "hops.add_cone"
    bl_label = "Add smart Cone"
    bl_options = {"REGISTER", "UNDO", "GRAB_CURSOR", "BLOCKING"}
    bl_description = """Create Smart Cone"""


    def execute(self, context):
        verts = [(0, 0, 0)]
        obj = bpy.data.objects.new("Cone", bpy.data.meshes.new("Cone"))

        bpy.ops.object.select_all(action='DESELECT')
        context.collection.objects.link(obj)
        context.view_layer.objects.active = obj
        obj.select_set(True)

        bpy.ops.view3d.snap_selected_to_cursor(use_offset=False)
        if addon.preference().behavior.cursor_boolshapes:
            obj.rotation_euler = bpy.context.scene.cursor.rotation_euler

        bm = bmesh.new()
        for v in verts:
            bm.verts.new(v)
        bm.to_mesh(context.object.data)
        bm.free()

        self.add_screw_modifier(obj, 'X', 'HOPS_screw_x')
        self.add_screw_modifier2(obj, 'Z', 'HOPS_screw', True)
        self.add_subsurf_modifier(obj, name='SUBSURF')
        self.add_solidify_modifier(obj, 'HOPS_solidify_z')
        self.add_deform_modifier(obj, 'HOPS_taper_z')
        self.add_decimate_modifier(obj, 'HOPS_decimate_c')
        self.add_bevel_modifier(context, obj, math.radians(30), True)
        if (2, 82, 4) < bpy.app.version:
            self.add_weld_modifier(obj, 'HOPS_weld')
        #self.add_bevel_modifier(context, obj, math.radians(60), True)


        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True
            bpy.context.object.data.auto_smooth_angle = math.radians(30)

        return {"FINISHED"}


    def add_subsurf_modifier(self, object, name='HOPS_deform_z'):
        subsurf_mod = object.modifiers.new(name=name, type="SUBSURF")
        subsurf_mod.subdivision_type = 'CATMULL_CLARK'
        subsurf_mod.levels = 2

    def add_weld_modifier(self, object, name='HOPS_weld'):
        if (2, 82, 4) < bpy.app.version:
            modifier = object.modifiers.new('HOPS_weld', 'WELD')
        else:
            pass

    def add_deform_modifier(self, object, name='HOPS_deform_z'):
        modifier = object.modifiers.new(name, "SIMPLE_DEFORM")
        modifier.factor = -0.8
        modifier.deform_method = 'TAPER'
        # modifier.deform_method = 'BEND'
        # modifier.deform_method = 'TAPER'
        # modifier.deform_method = 'STRETCH'
        modifier.deform_axis = 'Z'
        modifier.show_render = False


    def add_screw_modifier(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(0)
        screw_modifier.axis = axis
        screw_modifier.steps = 2
        screw_modifier.render_steps = 2
        screw_modifier.screw_offset = 0.738
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_screw_modifier2(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(360)
        screw_modifier.axis = axis
        screw_modifier.steps = 16
        screw_modifier.render_steps = 1
        screw_modifier.screw_offset = 0
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_solidify_modifier(self, object, name='HOPS_solidify_z'):
        solidify_modifier = object.modifiers.new(name, "SOLIDIFY")
        solidify_modifier.thickness = 2
        solidify_modifier.offset = 1
        solidify_modifier.use_even_offset = True
        solidify_modifier.use_quality_normals = True
        solidify_modifier.use_rim_only = False
        solidify_modifier.show_on_cage = True


    def add_bevel_modifier(self, context, object, angle, clamp):
        bevel_modifier = object.modifiers.new(name="HOPS_bevel_c", type="BEVEL")
        bevel_modifier.limit_method = "ANGLE"
        bevel_modifier.angle_limit = angle
        bevel_modifier.miter_outer = 'MITER_ARC'
        bevel_modifier.width = 0.028
        bevel_modifier.profile = 0.50
        bevel_modifier.segments =4
        bevel_modifier.loop_slide = True
        bevel_modifier.use_clamp_overlap = clamp

        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True


    def add_displace_modifier(self, object, strength, axis='X', name='HOPS_displace_x'):
        displace_modifier = object.modifiers.new(name=name, type="DISPLACE")
        displace_modifier.direction = axis
        displace_modifier.strength = strength
        displace_modifier.show_render = False

    def add_decimate_modifier(self, object, name='HOPS_decimate_c'):
        modifier = object.modifiers.new('Decimate', 'DECIMATE')
        modifier.angle_limit = math.radians(0.25)
        modifier.decimate_type = 'DISSOLVE'


class HOPS_OT_ADD_ring(bpy.types.Operator):
    bl_idname = "hops.add_ring"
    bl_label = "Add smart ring"
    bl_options = {"REGISTER", "UNDO", "GRAB_CURSOR", "BLOCKING"}
    bl_description = """Create Smart ring"""


    def execute(self, context):
        verts = [(0, 0, 0)]
        obj = bpy.data.objects.new("Ring", bpy.data.meshes.new("Ring"))

        bpy.ops.object.select_all(action='DESELECT')
        context.collection.objects.link(obj)
        context.view_layer.objects.active = obj
        obj.select_set(True)

        bpy.ops.view3d.snap_selected_to_cursor(use_offset=False)
        if addon.preference().behavior.cursor_boolshapes:
            obj.rotation_euler = bpy.context.scene.cursor.rotation_euler

        bm = bmesh.new()
        for v in verts:
            bm.verts.new(v)
        bm.to_mesh(context.object.data)
        bm.free()

        self.add_displace_modifier(obj, "HOPS_displace_x")
        self.add_screw_modifier(obj, 'X', 'HOPS_screw_x')
        self.add_screw_modifier2(obj, 'Z', 'HOPS_screw', True)
        self.add_solidify_modifier(obj, 'HOPS_solidify_z')

        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True
            bpy.context.object.data.auto_smooth_angle = math.radians(30)
        # self.add_bevel_modifier(context, obj, math.radians(30))
        # self.add_bevel_modifier2(context, obj, math.radians(30))

        return {"FINISHED"}


    def add_screw_modifier(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(0)
        screw_modifier.axis = axis
        screw_modifier.steps = 2
        screw_modifier.render_steps = 2
        screw_modifier.screw_offset = 0.5
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_screw_modifier2(self, object, axis='X', name='HOPS_screw_x', flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = math.radians(360)
        screw_modifier.axis = axis
        screw_modifier.steps = 64
        screw_modifier.render_steps = 64
        screw_modifier.screw_offset = 0
        screw_modifier.iterations = 1
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_displace_modifier(self, object, name="HOPS_displace_x",):
        modifier = object.modifiers.new(name=name, type="DISPLACE")
        modifier.direction = 'X'
        modifier.strength = 1
        modifier.space = 'LOCAL'


    def add_solidify_modifier(self, object, name='HOPS_solidify_z'):
        solidify_modifier = object.modifiers.new(name, "SOLIDIFY")
        solidify_modifier.thickness = 0.475
        solidify_modifier.offset = 1
        solidify_modifier.use_even_offset = True
        solidify_modifier.use_quality_normals = True
        solidify_modifier.use_rim_only = False
        solidify_modifier.show_on_cage = True


    def add_bevel_modifier(self, context, object, angle):
        bevel_modifier = object.modifiers.new(name="HOPS_bevel_a", type="BEVEL")
        bevel_modifier.limit_method = "ANGLE"
        bevel_modifier.angle_limit = angle
        bevel_modifier.miter_outer = 'MITER_ARC'
        bevel_modifier.width = 0.22
        bevel_modifier.profile = 0.50
        bevel_modifier.segments = 6
        bevel_modifier.loop_slide = True
        bevel_modifier.use_clamp_overlap = False

        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True


    def add_bevel_modifier2(self, context, object, angle):
        bevel_modifier = object.modifiers.new(name="HOPS_bevel_b", type="BEVEL")
        bevel_modifier.limit_method = "ANGLE"
        bevel_modifier.angle_limit = angle
        bevel_modifier.miter_outer = 'MITER_ARC'
        bevel_modifier.width = 0.1
        bevel_modifier.profile = 0.70
        bevel_modifier.segments = 6
        bevel_modifier.loop_slide = True
        bevel_modifier.use_clamp_overlap = False

        if addon.preference().behavior.auto_smooth:
            bpy.context.object.data.use_auto_smooth = True


class HOPS_OT_ADD_screw(bpy.types.Operator):
    bl_idname = "hops.add_screw"
    bl_label = "Add smart screw"
    bl_options = {"REGISTER", "UNDO", "GRAB_CURSOR", "BLOCKING"}
    bl_description = """Create Smart screw"""


    def execute(self, context):
        verts = [(0, 0, 0)]
        obj = bpy.data.objects.new("Plane", bpy.data.meshes.new("Plane"))

        bpy.ops.object.select_all(action='DESELECT')
        context.collection.objects.link(obj)
        context.view_layer.objects.active = obj
        obj.select_set(True)

        bpy.ops.view3d.snap_selected_to_cursor(use_offset=False)

        if addon.preference().behavior.cursor_boolshapes:
            obj.rotation_euler = bpy.context.scene.cursor.rotation_euler

        bm = bmesh.new()
        for v in verts:
            bm.verts.new(v)
        bm.to_mesh(context.object.data)
        bm.free()


        self.add_displace_modifier(obj, "HOPS_displace_y",)
        self.add_screw_modifier(obj, 'Y', 'HOPS_screw_y', 2, math.radians(0))
        self.add_screw_modifier(obj, 'Z', 'HOPS_screw_z', 2, math.radians(0))
        self.add_decimate_modifier(obj, 'HOPS_decimate')
        self.add_screw_modifier(obj, 'Z', 'HOPS_screw_z2', offset=0.31)
        self.add_Subdivision_modifier(obj, 'CATMULL_CLARK')

        namey = "HOPS_screw_y"
        namez = "HOPS_screw_z"

        driver = obj.driver_add("modifiers[\"" + namez + "\"].screw_offset").driver
        driver.type = 'SCRIPTED'

        var = driver.variables.new()
        var.targets[0].id_type = 'OBJECT'
        var.targets[0].id = obj.id_data
        var.targets[0].data_path = "modifiers[\"" + namey + "\"].screw_offset"
        var.name = "HopsScrew"

        driver.expression = var.name


        return {"FINISHED"}


    def add_displace_modifier(self, object, name="HOPS_displace_y",):
        modifier = object.modifiers.new(name=name, type="DISPLACE")
        modifier.direction = 'Y'
        modifier.strength = 1.75
        modifier.space = 'LOCAL'


    def add_screw_modifier(self, object, axis='X', name='HOPS_screw_x', steps=32, angle=math.radians(720), offset=0.02, flip=False):
        screw_modifier = object.modifiers.new(name=name, type="SCREW")
        screw_modifier.angle = angle
        screw_modifier.axis = axis
        screw_modifier.steps = steps
        screw_modifier.render_steps = steps
        screw_modifier.screw_offset = offset
        screw_modifier.iterations = 6
        screw_modifier.use_smooth_shade = True
        screw_modifier.use_merge_vertices = True
        screw_modifier.use_normal_flip = flip


    def add_solidify_modifier(self, object, name='HOPS_solidify_z'):
        solidify_modifier = object.modifiers.new(name, "SOLIDIFY")
        solidify_modifier.thickness = 0.2
        solidify_modifier.offset = 0
        solidify_modifier.use_even_offset = True
        solidify_modifier.use_quality_normals = True
        solidify_modifier.use_rim_only = False
        solidify_modifier.show_on_cage = True


    def add_Subdivision_modifier(self, object, subtype='CATMULL_CLARK'):
        subsurf_mod = object.modifiers.new(name="Subdivision", type="SUBSURF")
        subsurf_mod.subdivision_type = subtype #'SIMPLE' or 'CATMULL_CLARK'
        subsurf_mod.levels = 2


    def add_decimate_modifier(self, object, name='HOPS_decimate_c'):
        modifier = object.modifiers.new('Decimate', 'DECIMATE')
        modifier.angle_limit = math.radians(0.25)
        modifier.decimate_type = 'DISSOLVE'