Skip to content
Snippets Groups Projects
bTrace_panel.py 17.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • # SPDX-License-Identifier: GPL-2.0-or-later
    
    
    import bpy
    from bpy.types import Panel
    
    # Draw Brush panel in Toolbar
    class addTracerObjectPanel(Panel):
        bl_idname = "BTRACE_PT_object_brush"
    
        bl_label = "BTracer"
    
        bl_space_type = "VIEW_3D"
        bl_region_type = "UI"
        bl_context = "objectmode"
        bl_category = "Create"
        bl_options = {'DEFAULT_CLOSED'}
    
        def draw(self, context):
            layout = self.layout
            Btrace = context.window_manager.curve_tracer
            addon_prefs = context.preferences.addons[__package__].preferences
            switch_expand = addon_prefs.expand_enum
            obj = context.object
    
            # Color Blender Panel options
            def color_blender():
                # Buttons for Color Blender
                row = box.row()
                row.label(text="Color palette")
                row.prop(Btrace, "mmColors", text="")
    
                # Show Custom Colors if selected
                if Btrace.mmColors == 'CUSTOM':
                    row = box.row(align=True)
                    for i in range(1, 9):
                        row.prop(Btrace, "mmColor" + str(i), text="")
                # Show Earth Colors
                elif Btrace.mmColors == 'BW':
                    row = box.row(align=True)
                    row.prop(Btrace, "bwColor1", text="")
                    row.prop(Btrace, "bwColor2", text="")
                # Show Earth Colors
                elif Btrace.mmColors == 'BRIGHT':
                    row = box.row(align=True)
                    for i in range(1, 5):
                        row.prop(Btrace, "brightColor" + str(i), text="")
                # Show Earth Colors
                elif Btrace.mmColors == 'EARTH':
                    row = box.row(align=True)
                    for i in range(1, 6):
                        row.prop(Btrace, "earthColor" + str(i), text="")
                # Show Earth Colors
                elif Btrace.mmColors == 'GREENBLUE':
                    row = box.row(align=True)
                    for i in range(1, 4):
                        row.prop(Btrace, "greenblueColor" + str(i), text="")
                elif Btrace.mmColors == 'RANDOM':
                    row = box.row()
    
            # Curve noise settings
            def curve_noise():
                row = box.row()
                row.label(text="F-Curve Noise", icon='RNDCURVE')
                row = box.row(align=True)
                row.prop(Btrace, "fcnoise_rot", toggle=True)
                row.prop(Btrace, "fcnoise_loc", toggle=True)
                row.prop(Btrace, "fcnoise_scale", toggle=True)
    
                col = box.column(align=True)
                col.prop(Btrace, "fcnoise_amp")
                col.prop(Btrace, "fcnoise_timescale")
                box.prop(Btrace, "fcnoise_key")
    
            # Curve Panel options
            def curve_settings():
                # Button for curve options
                row = self.layout.row()
                row = box.row(align=True)
    
                row.prop(Btrace, "show_curve_settings",
                         icon='CURVE_BEZCURVE', text="Curve Settings")
                row.prop(Btrace, "material_settings",
                         icon='MATERIAL_DATA', text="Material Settings")
    
                if Btrace.material_settings:
                    row = box.row()
                    row.label(text="Material Settings", icon='COLOR')
                    row = box.row()
                    row.prop(Btrace, "trace_mat_random")
                    if not Btrace.trace_mat_random:
                        row = box.row()
                        row.prop(Btrace, "trace_mat_color", text="")
                    else:
                        row.prop(Btrace, "mat_run_color_blender")
                        if Btrace.mat_run_color_blender:
                            row = box.row()
                            row.operator("object.colorblenderclear",
                                         text="Reset Material Keyframes",
                                         icon="KEY_DEHLT")
                            row.prop(Btrace, "mmSkip", text="Keyframe every")
                        color_blender()
                    row = box.row()
    
                if Btrace.show_curve_settings:
                    # selected curve options
                    if len(context.selected_objects) > 0 and obj.type == 'CURVE':
                        col = box.column(align=True)
                        col.label(text="Edit Curves for:", icon='IPO_BEZIER')
                        col.separator()
                        col.label(text="Selected Curve Bevel Options")
                        row = col.row(align=True)
                        row.prop(obj.data, "bevel_depth", text="Depth")
                        row.prop(obj.data, "bevel_resolution", text="Resolution")
                        row = col.row(align=True)
                        row.prop(obj.data, "resolution_u")
                    else:  # For new curve
                        box.label(text="New Curve Settings", icon='CURVE_BEZCURVE')
                        box.prop(Btrace, "curve_spline")
                        box.prop(Btrace, "curve_handle")
                        box.label(text="Bevel Options")
                        col = box.column(align=True)
                        row = col.row(align=True)
                        row.prop(Btrace, "curve_depth", text="Depth")
                        row.prop(Btrace, "curve_resolution", text="Resolution")
                        row = col.row(align=True)
                        row.prop(Btrace, "curve_u")
    
            # Grow Animation Panel options
            def add_grow():
                # Button for grow animation option
                row = box.row()
                row.label(text="Animate Final Curve", icon="NONE")
                row = box.row()
                row.prop(Btrace, "animate", text="Add Grow Curve Animation", icon="META_BALL")
                box.separator()
                if Btrace.animate:
                    box.label(text="Frame Animation Settings:", icon="META_BALL")
                    col = box.column(align=True)
                    col.prop(Btrace, "anim_auto")
                    if not Btrace.anim_auto:
                        row = col.row(align=True)
                        row.prop(Btrace, "anim_f_start")
                        row.prop(Btrace, "anim_length")
                    row = col.row(align=True)
                    row.prop(Btrace, "anim_delay")
                    row.prop(Btrace, "anim_f_fade")
    
                    box.label(text="Additional Settings")
                    row = box.row()
                    row.prop(Btrace, "anim_tails")
                    row.prop(Btrace, "anim_keepr")
    
            # Start Btrace Panel
            if switch_expand == 'list':
                layout.label(text="Available Tools:", icon="COLLAPSEMENU")
                col = layout.column(align=True)
                col.prop(Btrace, "btrace_toolmenu", text="")
            elif switch_expand == 'col':
                col = layout.column(align=True)
                col.prop(Btrace, "btrace_toolmenu", expand=True)
            elif switch_expand == 'row':
                row = layout.row(align=True)
                row.alignment = 'CENTER'
                row.prop(Btrace, "btrace_toolmenu", text="", expand=True)
    
            # Start Object Tools
            sel = context.selected_objects
    
            # Default option (can be expanded into help)
            if Btrace.btrace_toolmenu == 'tool_help':
                row = layout.row()
                row.label(text="Pick an option", icon="HELP")
    
            # Object Trace
            elif Btrace.btrace_toolmenu == 'tool_objectTrace':
                row = layout.row()
                row.label(text="  Trace Tool:", icon="FORCE_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text="Object Trace", icon="FORCE_MAGNETIC")
                row.operator("object.btobjecttrace", text="Run!", icon="PLAY")
                row = box.row()
                row.prop(Btrace, "settings_toggle", icon="MODIFIER", text="Settings")
                myselected = "Selected %d" % len(context.selected_objects)
                row.label(text=myselected)
                if Btrace.settings_toggle:
                    box.label(text="Edge Type for Curves:", icon="IPO_CONSTANT")
                    row = box.row(align=True)
                    row.prop(Btrace, "convert_edgetype", text="")
                    box.prop(Btrace, "object_duplicate")
                    if len(sel) > 1:
                        box.prop(Btrace, "convert_joinbefore")
                    else:
                        Btrace.convert_joinbefore = False
                    row = box.row()
                    row.prop(Btrace, "distort_curve")
                    if Btrace.distort_curve:
                        col = box.column(align=True)
                        col.prop(Btrace, "distort_modscale")
                        col.prop(Btrace, "distort_noise")
                    row = box.row()
                    curve_settings()  # Show Curve/material settings
                    add_grow()        # Grow settings here
    
            # Objects Connect
            elif Btrace.btrace_toolmenu == 'tool_objectsConnect':
                row = layout.row()
                row.label(text="  Trace Tool:", icon="FORCE_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text="Objects Connect", icon="OUTLINER_OB_EMPTY")
                row.operator("object.btobjectsconnect", text="Run!", icon="PLAY")
                row = box.row()
                row.prop(Btrace, "settings_toggle", icon='MODIFIER', text='Settings')
                row.label(text="")
                if Btrace.settings_toggle:
                    row = box.row()
                    row.prop(Btrace, "respect_order", text="Selection Options")
                    if Btrace.respect_order:
                        box.operator("object.select_order",
                                     text="Click to start order selection",
                                     icon='UV_SYNC_SELECT')
                    row = box.row()
                    row.prop(Btrace, "connect_noise", text="Add F-Curve Noise")
                    if Btrace.connect_noise:
                        curve_noise()     # Show Curve Noise settings
    
                    curve_settings()      # Show Curve/material settings
                    add_grow()            # Grow settings here
    
            # Mesh Follow
            elif Btrace.btrace_toolmenu == 'tool_meshFollow':
                row = layout.row()
                row.label(text="  Trace Tool:", icon="FORCE_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text="Mesh Follow", icon="DRIVER")
                row.operator("object.btmeshfollow", text="Run!", icon="PLAY")
                row = box.row()
                if Btrace.fol_mesh_type == 'OBJECT':
                    a, b = "Trace Object", "SNAP_VOLUME"
                if Btrace.fol_mesh_type == 'VERTS':
                    a, b = "Trace Verts", "SNAP_VERTEX"
                if Btrace.fol_mesh_type == 'EDGES':
                    a, b = "Trace Edges", "SNAP_EDGE"
                if Btrace.fol_mesh_type == 'FACES':
                    a, b = "Trace Faces", "SNAP_FACE"
                row.prop(Btrace, "settings_toggle", icon='MODIFIER', text='Settings')
                row.label(text=a, icon=b)
                if Btrace.settings_toggle:
                    col = box.column(align=True)
                    row = col.row(align=True)
                    row.prop(Btrace, "fol_mesh_type", expand=True)
                    row = col.row(align=True)
                    if Btrace.fol_mesh_type != 'OBJECT':
                        row.prop(Btrace, "fol_sel_option", expand=True)
                        row = box.row()
                        if Btrace.fol_sel_option == 'RANDOM':
                            row.label(text="Random Select of Total")
                            row.prop(Btrace, "fol_perc_verts", text="%")
                        if Btrace.fol_sel_option == 'CUSTOM':
                            row.label(text="Choose selection in Edit Mode")
                        if Btrace.fol_sel_option == 'ALL':
                            row.label(text="Select All items")
                    col = box.column(align=True)
                    col.label(text="Time Options", icon="TIME")
                    col.prop(Btrace, "particle_step")
                    row = col.row(align=True)
                    row.prop(Btrace, "fol_start_frame")
                    row.prop(Btrace, "fol_end_frame")
                    curve_settings()  # Show Curve/material settings
                    add_grow()        # Grow settings here
    
            # Handwriting Tools
            elif Btrace.btrace_toolmenu == 'tool_handwrite':
                row = layout.row()
                row.label(text="  Trace Tool:", icon="FORCE_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text='Handwriting', icon='BRUSH_DATA')
                row.operator("curve.btwriting", text="Run!", icon='PLAY')
                row = box.row()
                row = box.row()
                row.label(text='Grease Pencil Writing Tools')
                col = box.column(align=True)
                row = col.row(align=True)
                row.operator("gpencil.draw", text="Draw", icon='BRUSH_DATA').mode = 'DRAW'
                row.operator("gpencil.draw", text="Poly", icon='VPAINT_HLT').mode = 'DRAW_POLY'
                row = col.row(align=True)
                row.operator("gpencil.draw", text="Line", icon='ZOOM_OUT').mode = 'DRAW_STRAIGHT'
                row.operator("gpencil.draw", text="Erase", icon='TPAINT_HLT').mode = 'ERASER'
                row = box.row()
                row.operator("gpencil.data_unlink", text="Delete Grease Pencil Layer", icon="CANCEL")
                row = box.row()
                curve_settings()  # Show Curve/material settings
                add_grow()        # Grow settings here
    
            # Particle Trace
            elif Btrace.btrace_toolmenu == 'tool_particleTrace':
                row = layout.row()
                row.label(text="  Trace Tool:", icon="FORCE_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text="Particle Trace", icon="PARTICLES")
                row.operator("particles.particletrace", text="Run!", icon="PLAY")
                row = box.row()
                row.prop(Btrace, "settings_toggle", icon='MODIFIER', text='Settings')
                row.label(text="")
                if Btrace.settings_toggle:
                    box.prop(Btrace, "particle_step")
                    row = box.row()
                    row.prop(Btrace, "curve_join")
                    curve_settings()  # Show Curve/material settings
                    add_grow()        # Grow settings here
    
            # Connect Particles
            elif Btrace.btrace_toolmenu == 'tool_particleConnect':
                row = layout.row()
                row.label(text="  Trace Tool:", icon="FORCE_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text='Particle Connect', icon='MOD_PARTICLES')
                row.operator("particles.connect", icon="PLAY", text='Run!')
                row = box.row()
                row.prop(Btrace, "settings_toggle", icon='MODIFIER', text='Settings')
                row.label(text="")
                if Btrace.settings_toggle:
                    box.prop(Btrace, "particle_step")
                    row = box.row()
                    row.prop(Btrace, 'particle_auto')
                    if not Btrace.particle_auto:
                        row = box.row(align=True)
                        row.prop(Btrace, 'particle_f_start')
                        row.prop(Btrace, 'particle_f_end')
                    curve_settings()  # Show Curve/material settings
                    add_grow()        # Grow settings here
    
            # Grow Animation
            elif Btrace.btrace_toolmenu == 'tool_growCurve':
                row = layout.row()
                row.label(text="  Curve Tool:", icon="OUTLINER_OB_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text="Grow Curve", icon="META_BALL")
                row.operator("curve.btgrow", text="Run!", icon="PLAY")
                row = box.row()
                row.prop(Btrace, "settings_toggle", icon="MODIFIER", text="Settings")
                row.operator("object.btreset", icon="KEY_DEHLT")
                if Btrace.settings_toggle:
                    box.label(text="Frame Animation Settings:")
                    col = box.column(align=True)
                    col.prop(Btrace, "anim_auto")
                    if not Btrace.anim_auto:
                        row = col.row(align=True)
                        row.prop(Btrace, "anim_f_start")
                        row.prop(Btrace, "anim_length")
                    row = col.row(align=True)
                    row.prop(Btrace, "anim_delay")
                    row.prop(Btrace, "anim_f_fade")
    
                    box.label(text="Additional Settings")
                    row = box.row()
                    row.prop(Btrace, "anim_tails")
                    row.prop(Btrace, "anim_keepr")
    
            # F-Curve Noise Curve
            elif Btrace.btrace_toolmenu == 'tool_fcurve':
                row = layout.row()
                row.label(text="  Curve Tool:", icon="OUTLINER_OB_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text="F-Curve Noise", icon='RNDCURVE')
                row.operator("object.btfcnoise", icon='PLAY', text="Run!")
                row = box.row()
                row.prop(Btrace, "settings_toggle", icon='MODIFIER', text='Settings')
                row.operator("object.btreset", icon='KEY_DEHLT')
                if Btrace.settings_toggle:
                    curve_noise()
    
            # Color Blender
            elif Btrace.btrace_toolmenu == 'tool_colorblender':
                row = layout.row()
                row.label(text="  Curve/Object Tool:", icon="OUTLINER_OB_CURVE")
                box = self.layout.box()
                row = box.row()
                row.label(text="Color Blender", icon="COLOR")
                row.operator("object.colorblender", icon='PLAY', text="Run!")
                row = box.row()
                row.operator("object.colorblenderclear", text="Reset Keyframes", icon="KEY_DEHLT")
                row.prop(Btrace, "mmSkip", text="Keyframe every")
                color_blender()