# 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()