OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / operators / modifiers / triangulate.py

86 lines · python ref:
import bpy
from bpy.props import BoolProperty

from ... utility import addon
from ... ui_framework.operator_ui import Master


DESC = """LMB - Add Triangulate Modifier
LMB + CTRL - Add new Triangulate Modifier
"""


class HOPS_OT_MOD_Triangulate(bpy.types.Operator):
    bl_idname = "hops.mod_triangulate"
    bl_label = "Add Triangulate Modifier"
    bl_options = {'REGISTER', 'UNDO'}
    bl_description = DESC

    keep_custom_normals: BoolProperty(
        name='keep_custom_normals',
        description='Keep Custom Normals',
        default=False)

    called_ui = False

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        HOPS_OT_MOD_Triangulate.called_ui = False

    @staticmethod
    def triangulate_modifiers(object):
        return [modifier for modifier in object.modifiers if modifier.type == "TRIANGULATE"]

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


    def invoke(self, context, event):
        self.ctrl = event.ctrl
        return self.execute(context)


    def execute(self, context):

        for object in [o for o in context.selected_objects if o.type == 'MESH']:

            if self.ctrl:
                self.add_triangulate_modifier(object)

            else:
                if not self.triangulate_modifiers(object):
                    self.add_triangulate_modifier(object)
                else:
                    bpy.ops.hops.display_notification(info=F'No Triangulate Added ', name='Use Ctrl to Add')
                    bpy.ops.hops.draw_wire_mesh_launcher('INVOKE_DEFAULT', target='SELECTED')
                    return {"CANCELLED"}

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

            ui = Master()
            draw_data = [
                ["TRIANGULATE"],
                ["Min Vertices : ", self.tri_mod.min_vertices]]
            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'}


    def draw(self, context):
        layout = self.layout
        column = layout.column()
        row = column.row()
        row.prop(self, 'keep_custom_normals', text='Keep Custom Normals')


    def add_triangulate_modifier(self, object):
        self.tri_mod = object.modifiers.new(name="Triangulate", type="TRIANGULATE")
        self.tri_mod.min_vertices = 5
        self.tri_mod.show_in_editmode = False
        #self.tri_mod.keep_custom_normals = self.keep_custom_normals
        bpy.ops.hops.draw_wire_mesh_launcher('INVOKE_DEFAULT', target='SELECTED')