OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / operators / sculpt / sculpt_tools.py

60 lines · python ref:
import bpy

from bpy.props import FloatProperty


class HOPS_OT_SculptDecimate(bpy.types.Operator):
    bl_idname = "sculpt.decimate_mesh"
    bl_label = "Decimate Sculpt"
    bl_description = """Mesh Decimate
    
    Decimates mesh for continued sculpting
    Default (.25) Shift (.5) Ctrl (.75)
    Alt (.10)
    
    """
    bl_options = {"REGISTER", "UNDO"}

    ratio: FloatProperty(name="Ratio", description="Amount Of Decimation", default=0.25, min=0.01, max=1.0)

    @classmethod
    def poll(cls, context):
        return getattr(context.active_object, "type", "") == "MESH"

    # def draw(self, context):
    #     layout = self.layout
    #     layout.prop(self, "ratio")

    def invoke(self, context, event):
        if event.shift:
            self.ratio = 0.50
            bpy.ops.hops.display_notification(info=F'Decimation Ratio : {self.ratio:.2f}' )
        elif event.ctrl:
            self.ratio = 0.75
            bpy.ops.hops.display_notification(info=F'Decimation Ratio : {self.ratio:.2f}' )
        elif event.alt:
            self.ratio = 0.10
            bpy.ops.hops.display_notification(info=F'Decimation Ratio : {self.ratio:.2f}' )
        else:
            self.ratio = 0.25
            bpy.ops.hops.display_notification(info=F'Decimation Ratio : {self.ratio:.2f}' )
        
        if bpy.context.active_object.mode == 'SCULPT':
            exit_sculpt()
        self.report({'INFO'}, F'Decimation Ratio : {self.ratio:.2f}')
        bpy.ops.hops.display_notification(info= F'Decimation Ratio : {self.ratio:.2f}')
        add_decimate(self.ratio)
        bpy.ops.object.mode_set(mode='SCULPT')
        return {"FINISHED"}


def exit_sculpt():
    bpy.ops.sculpt.sculptmode_toggle()


def add_decimate(ratio):
    bpy.ops.object.modifier_add(type='DECIMATE')
    bpy.context.object.modifiers["Decimate"].ratio = ratio
    bpy.context.object.modifiers["Decimate"].use_symmetry = True
    bpy.ops.object.modifier_apply(modifier="Decimate") # apply_as='DATA',
    bpy.ops.hops.draw_wire_mesh_launcher('INVOKE_DEFAULT', target='SELECTED')