OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / operators / modifiers / weighted_normal.py

65 lines · python ref:
import bpy
from ... utility import addon
from ...ui_framework.operator_ui import Master


class HOPS_OT_MOD_Weighted_Normal(bpy.types.Operator):
    bl_idname = "hops.mod_weighted_normal"
    bl_label = "Add Weighted Normal Modifier"
    bl_options = {'REGISTER', 'UNDO'}
    bl_description = """LMB - Add Weighted Normal Modifier
LMB + SHIFT - Add Weighted Normal Modifier without Keep Sharp option"""

    keep_sharp: bpy.props.BoolProperty(
        name="Keep Sharp",
        description="",
        default=True)

    called_ui = False

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        HOPS_OT_MOD_Weighted_Normal.called_ui = False

    @classmethod
    def poll(cls, context):
        return any(o.type == 'MESH' for o in context.selected_objects)

    def draw(self, context):
        self.layout.prop(self, "keep_sharp")

    def invoke(self, context, event):
        self.keep_sharp = False if event.shift else True
        return self.execute(context)

    def execute(self, context):
        for obj in [o for o in context.selected_objects if o.type == 'MESH']:
            if addon.preference().behavior.auto_smooth:
                obj.data.use_auto_smooth = True
                for f in obj.data.polygons:
                    f.use_smooth = True

            for mod in obj.modifiers:
                if mod.type == 'WEIGHTED_NORMAL':
                    obj.modifiers.remove(mod)

            if obj.hops.status != 'BOOLSHAPE':
                prefix = addon.preference().property.mod_prefix_WN
                mod = obj.modifiers.new(name=f"{prefix}Weighted Normal", type='WEIGHTED_NORMAL')
                mod.keep_sharp = self.keep_sharp

        # Operator UI
        if not HOPS_OT_MOD_Weighted_Normal.called_ui:
            HOPS_OT_MOD_Weighted_Normal.called_ui = True

            ui = Master()
            draw_data = [
                ["WEIGHTED NORMAL"],
                ["Keep Sharp", self.keep_sharp]]
            ui.receive_draw_data(draw_data=draw_data)
            ui.draw(draw_bg=addon.preference().ui.Hops_operator_draw_bg, draw_border=addon.preference().ui.Hops_operator_draw_border)


        return {"FINISHED"}