OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / src / property / preference / operators / mirror.py

142 lines · python ref:
import bpy

from bpy.types import PropertyGroup
from bpy.props import BoolProperty, EnumProperty, FloatProperty


def active_obj_mirror_mods(scene, context):

    modifiers = []
    obj = context.active_object
    if obj:
        if len(context.selected_objects) == 2:
            others = [obj for obj in context.selected_objects if obj != context.active_object]
            obj = others[0]

        if obj.type == "GPENCIL":
            mods = [mod for mod in obj.grease_pencil_modifiers if mod.type == "GP_MIRROR"]
        elif obj.type == "GREASEPENCIL":
            mods = [mod for mod in obj.modifiers if mod.type == "GREASE_PENCIL_MIRROR"]
        else:
            mods = [mod for mod in obj.modifiers if mod.type == "MIRROR"]

        for mod in mods:
            modifiers.append((f"{mod.name}", f"{mod.name}", ""))
        if len(mods) == 0:
            modifiers.append(("new", "New", ""))
    else:
        modifiers.append(("new", "New", ""))
    return modifiers


class props(PropertyGroup):

    running: BoolProperty(
        name='Mirror is Running',
        description='Mirror modal operation is running',
        default=False)

    advanced: BoolProperty(
        name='Mirror Advanced options',
        description='''Advanced / Simple Toggle

        Mirror Advanced options display

        Shortcut: Tab
        ''',
        default=False)

    modifier: EnumProperty(
        name="Mirror Modifiers",
        description="Mirror modifier to be affected",
        items=active_obj_mirror_mods)

    mode: EnumProperty(
        name="Mirror Mode",
        description="Mirror mode",
        items=[("MODIFIER", "Modifier", "Modify last mirror modifier options"),
               ("NEWMODIFIER", "New Modifier", "Create new mirror modifier"),
               ("MODIFIERAPPLY", "Modifier&Apply", "Apply mirror modifier (symmetrize)"),
               ("BISECTMOD", "Bisect&Modifier", "Bisect the mesh and add mirror modifier"),
               ("BISECT", "Bisect", "Bisect the mesh"),
               ("SYMMETRY", "Symmetry", "Use symetrize operator"),
               ("FLIP", "Flip", "Flip the mesh to another side")],
        default='MODIFIER')

    orientation: EnumProperty(
        name="Mirror Orientation",
        description="Mirror selected objects using orientation",
        items=[("LOCAL", "Local", "Local Orientation", "ORIENTATION_LOCAL", 1),
               ("GLOBAL", "Global", "Global Orientation", "ORIENTATION_GLOBAL", 2),
               ("VIEW", "View", "View Orientation", "ORIENTATION_VIEW", 3),
               ("CURSOR", "Cursor", "Cursor Orientation", "ORIENTATION_CURSOR", 4)],
        default='LOCAL')

    pivot: EnumProperty(
        name="Mirror Pivot Point",
        description="Mirror selected objects across pivot point",
        items=[("ACTIVE", "Active Origin", "", "PIVOT_ACTIVE", 1),
               ("MEDIAN", "Median Point", "", "PIVOT_MEDIAN", 2),
               ("CURSOR", "Cursor", "", "PIVOT_CURSOR", 3),
               ("INDIVIDUAL", "Individual Origins", "", "PIVOT_INDIVIDUAL", 4)],
        default='ACTIVE')

    include_active: BoolProperty(
        name='Include Active',
        description='Include Active Object in Group Mirroring',
        default=False)

    close: BoolProperty(
        name='Close After Operation',
        description='Close when first mirror operation is done using gizmo',
        default=True)

    parent_empty: BoolProperty(
        name='Parent Empty',
        description='Parent empty to active object',
        default=False)

    revert: BoolProperty(
        name='Revert Gizmo Handlers',
        description='Reverting gizmo manipulator handlers',
        default=False)

    symmetrize_selected: BoolProperty(
        name='Symmetrize only selected mesh',
        description='Olny selected mesh in edit mode will be symmetrize',
        default=False)

    mirror_u: BoolProperty(
        name='Modifier mirror_u property',
        description='Set mirror_u on modifier',
        default=False)

    mirror_v: BoolProperty(
        name='Modifier mirror_v property',
        description='Set mirror_v on modifier',
        default=False)

    scale: FloatProperty(
        name='Gizmo Scale',
        description='Scale of mirros gizmo',
        default= 1.8)

    width: FloatProperty(
        name='Gizmo width',
        description='Width of mirros gizmo lines',
        default= 0.5)

    merge_threshold: FloatProperty(
        name='Merge Distance',
        description='Distance within which mirrorred vertices are merged',
        precision=3,
        default= 0.001,
        min=0.0)

    bisect_threshold: FloatProperty(
        name='Bisect Distance',
        description='Distance from the bisect plane within which mirrorred vertices are merged',
        precision=3,
        default= 0.001,
        min=0.0)