From 2efbb36ddf8c26d997199f9476963d86b983f8c1 Mon Sep 17 00:00:00 2001 From: Pullusb Date: Thu, 17 Jun 2021 16:21:27 +0200 Subject: [PATCH] check list for file 1.5.1 - fix: eraser brush - change: check file has custom check list in addon prefs --- CHANGELOG.md | 5 ++ OP_file_checker.py | 165 ++++++++++++++++++++++++++------------------- UI_tools.py | 10 +-- __init__.py | 35 ++++++++-- properties.py | 64 +++++++++++++++++- 5 files changed, 202 insertions(+), 77 deletions(-) mode change 100644 => 100755 OP_file_checker.py mode change 100644 => 100755 __init__.py mode change 100644 => 100755 properties.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0400bf8..cbf0efe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +1.5.1 + +- fix: eraser brush +- change: check file has custom check list in addon prefs + 1.5.0 - feat: Eraser Brush Tool (Need to be enable in the preferences) diff --git a/OP_file_checker.py b/OP_file_checker.py old mode 100644 new mode 100755 index 9497393..1db0ab2 --- a/OP_file_checker.py +++ b/OP_file_checker.py @@ -27,92 +27,121 @@ class GPTB_OT_file_checker(bpy.types.Operator): def execute(self, context): prefs = get_addon_prefs() + fix = prefs.fixprops problems = [] ## Lock main cam: - if not 'layout' in Path(bpy.data.filepath).stem:#dont touch layout cameras - if context.scene.camera: - cam = context.scene.camera - if cam.name == 'draw_cam' and cam.parent: - if cam.parent.type == 'CAMERA': - cam = cam.parent - else: - cam = None - if cam: - triple = (True,True,True) - if cam.lock_location[:] != triple or cam.lock_rotation[:] != triple: - problems.append('Lock main camera') - cam.lock_location = cam.lock_rotation = triple + if fix.lock_main_cam: + if not 'layout' in Path(bpy.data.filepath).stem.lower():#dont touch layout cameras + if context.scene.camera: + cam = context.scene.camera + if cam.name == 'draw_cam' and cam.parent: + if cam.parent.type == 'CAMERA': + cam = cam.parent + else: + cam = None + if cam: + triple = (True,True,True) + if cam.lock_location[:] != triple or cam.lock_rotation[:] != triple: + problems.append('Lock main camera') + cam.lock_location = cam.lock_rotation = triple ## set scene res at pref res according to addon pref - rx, ry = prefs.render_res_x, prefs.render_res_y - # TODO set (rx, ry) to camera resolution if specified in camera name - if context.scene.render.resolution_x != rx or context.scene.render.resolution_y != ry: - problems.append(f'Resolution {context.scene.render.resolution_x}x{context.scene.render.resolution_y} >> {rx}x{ry}') - context.scene.render.resolution_x, context.scene.render.resolution_y = rx, ry + if fix.set_scene_res: + rx, ry = prefs.render_res_x, prefs.render_res_y + # TODO set (rx, ry) to camera resolution if specified in camera name + if context.scene.render.resolution_x != rx or context.scene.render.resolution_y != ry: + problems.append(f'Resolution {context.scene.render.resolution_x}x{context.scene.render.resolution_y} >> {rx}x{ry}') + context.scene.render.resolution_x, context.scene.render.resolution_y = rx, ry ## set scene percentage at 100: - if context.scene.render.resolution_percentage != 100: - problems.append('Resolution output to 100%') - context.scene.render.resolution_percentage = 100 - - ## set show slider and sync range - for window in bpy.context.window_manager.windows: - screen = window.screen - for area in screen.areas: - if area.type == 'DOPESHEET_EDITOR': - if hasattr(area.spaces[0], 'show_sliders'): - setattr(area.spaces[0], 'show_sliders', True) - - if hasattr(area.spaces[0], 'show_locked_time'): - setattr(area.spaces[0], 'show_locked_time', True) + if fix.set_res_percentage: + if context.scene.render.resolution_percentage != 100: + problems.append('Resolution output to 100%') + context.scene.render.resolution_percentage = 100 ## set fps according to preferences settings - if context.scene.render.fps != prefs.fps: - problems.append( (f"framerate corrected {context.scene.render.fps} >> {prefs.fps}", 'ERROR') ) - context.scene.render.fps = prefs.fps + if fix.set_fps: + if context.scene.render.fps != prefs.fps: + problems.append( (f"framerate corrected {context.scene.render.fps} >> {prefs.fps}", 'ERROR') ) + context.scene.render.fps = prefs.fps + + ## set show slider and sync range + if fix.set_slider_n_sync: + for window in bpy.context.window_manager.windows: + screen = window.screen + for area in screen.areas: + if area.type == 'DOPESHEET_EDITOR': + if hasattr(area.spaces[0], 'show_sliders'): + setattr(area.spaces[0], 'show_sliders', True) + + if hasattr(area.spaces[0], 'show_locked_time'): + setattr(area.spaces[0], 'show_locked_time', True) ## set cursor type (according to prefs ?) - if context.mode in ("EDIT_GPENCIL", "SCULPT_GPENCIL"): - tool = prefs.select_active_tool - if tool != 'none': - if bpy.context.workspace.tools.from_space_view3d_mode(bpy.context.mode, create=False).idname != tool: - bpy.ops.wm.tool_set_by_id(name=tool)# Tweaktoolcode - problems.append(f'tool changed to {tool.split(".")[1]}') + if fix.set_cursor_type: + if context.mode in ("EDIT_GPENCIL", "SCULPT_GPENCIL"): + tool = prefs.select_active_tool + if tool != 'none': + if bpy.context.workspace.tools.from_space_view3d_mode(bpy.context.mode, create=False).idname != tool: + bpy.ops.wm.tool_set_by_id(name=tool)# Tweaktoolcode + problems.append(f'tool changed to {tool.split(".")[1]}') + + # ## GP use additive drawing (else creating a frame in dopesheet makes it blank...) + # if not context.scene.tool_settings.use_gpencil_draw_additive: + # problems.append(f'Activated Gp additive drawing mode (snowflake)') + # context.scene.tool_settings.use_gpencil_draw_additive = True - ## GP use additive drawing (else creating a frame in dopesheet makes it blank...) - if not context.scene.tool_settings.use_gpencil_draw_additive: - problems.append(f'Activated Gp additive drawing mode (snowflake)') - context.scene.tool_settings.use_gpencil_draw_additive = True ## GP stroke placement/projection check - if context.scene.tool_settings.gpencil_sculpt.lock_axis != 'AXIS_Y': - problems.append('/!\\ Draw axis not "Front" (Need Manual change if not Ok)') + if fix.check_front_axis: + if context.scene.tool_settings.gpencil_sculpt.lock_axis != 'AXIS_Y': + problems.append('/!\\ Draw axis not "Front" (Need Manual change if not Ok)') - if bpy.context.scene.tool_settings.gpencil_stroke_placement_view3d != 'ORIGIN': - problems.append('/!\\ Draw placement not "Origin" (Need Manual change if not Ok)') + if fix.check_placement: + if bpy.context.scene.tool_settings.gpencil_stroke_placement_view3d != 'ORIGIN': + problems.append('/!\\ Draw placement not "Origin" (Need Manual change if not Ok)') + ## Disabled animation - fcu_ct = 0 - for act in bpy.data.actions: - if not act.users: - continue - for fcu in act.fcurves: - if fcu.mute: - fcu_ct += 1 - print(f"muted: {act.name} > {fcu.data_path}") - if fcu_ct: - problems.append(f'{fcu_ct} anim channel disabled (details -> console)') + if fix.list_disabled_anim: + fcu_ct = 0 + for act in bpy.data.actions: + if not act.users: + continue + for fcu in act.fcurves: + if fcu.mute: + fcu_ct += 1 + print(f"muted: {act.name} > {fcu.data_path}") + if fcu_ct: + problems.append(f'{fcu_ct} anim channel disabled (details -> console)') + + ## Use median point + if fix.set_pivot_median_point: + if context.scene.tool_settings.transform_pivot_point != 'MEDIAN_POINT': + problems.append(f"Pivot changed from '{context.scene.tool_settings.transform_pivot_point}' to 'MEDIAN_POINT'") + context.scene.tool_settings.transform_pivot_point = 'MEDIAN_POINT' + + if fix.disable_guide: + if context.scene.tool_settings.gpencil_sculpt.guide.use_guide == True: + problems.append(f"Disabled Draw Guide") + context.scene.tool_settings.gpencil_sculpt.guide.use_guide = False + + if fix.autokey_add_n_replace: + if context.scene.tool_settings.auto_keying_mode != 'ADD_REPLACE_KEYS': + problems.append(f"Autokey mode reset to 'Add & Replace'") + context.scene.tool_settings.auto_keying_mode = 'ADD_REPLACE_KEYS' + + # ## Set onion skin filter to 'All type' + # fix_kf_type = 0 + # for gp in bpy.data.grease_pencils:#from data + # if not gp.is_annotation: + # if gp.onion_keyframe_type != 'ALL': + # gp.onion_keyframe_type = 'ALL' + # fix_kf_type += 1 + # if fix_kf_type: + # problems.append(f"{fix_kf_type} GP onion skin filter to 'All type'") - ## Set onion skin filter to 'All type' - fix_kf_type = 0 - for gp in bpy.data.grease_pencils:#from data - if not gp.is_annotation: - if gp.onion_keyframe_type != 'ALL': - gp.onion_keyframe_type = 'ALL' - fix_kf_type += 1 - if fix_kf_type: - problems.append(f"{fix_kf_type} GP onion skin filter to 'All type'") # for ob in context.scene.objects:#from object # if ob.type == 'GPENCIL': # ob.data.onion_keyframe_type = 'ALL' diff --git a/UI_tools.py b/UI_tools.py index 863a05d..e4f238d 100644 --- a/UI_tools.py +++ b/UI_tools.py @@ -303,10 +303,12 @@ class GPTB_PT_render(bpy.types.Panel): row.operator('render.use_active_object_name', text = '', icon='OUTLINER_DATA_GP_LAYER')#icon = 'OUTPUT' layout.operator('render.setup_render_path', text = 'Setup output', icon = 'TOOL_SETTINGS')#SETTINGS - - blend = Path(bpy.data.filepath) - out = blend.parents[1] / "compo" / "base" - layout.operator("wm.path_open", text='Open render folder', icon='FILE_FOLDER').filepath = str(out) + + blend = bpy.data.filepath + if blend: + blend = Path(blend) + out = blend.parents[1] / "compo" / "base" + layout.operator("wm.path_open", text='Open render folder', icon='FILE_FOLDER').filepath = str(out) diff --git a/__init__.py b/__init__.py old mode 100644 new mode 100755 index 7cff6fe..b50f0b0 --- a/__init__.py +++ b/__init__.py @@ -15,7 +15,7 @@ bl_info = { "name": "GP toolbox", "description": "Set of tools for Grease Pencil in animation production", "author": "Samuel Bernou, Christophe Seux", -"version": (1, 5, 0), +"version": (1, 5, 1), "blender": (2, 91, 0), "location": "Sidebar (N menu) > Gpencil > Toolbox / Gpencil properties", "warning": "", @@ -57,7 +57,7 @@ from .OP_pseudo_tint import GPT_OT_auto_tint_gp_layers from . import UI_tools -from .properties import GP_PG_ToolsSettings +from .properties import GP_PG_ToolsSettings, GP_PG_FixSettings from bpy.props import (FloatProperty, BoolProperty, @@ -122,6 +122,7 @@ class GPTB_prefs(bpy.types.AddonPreferences): items=(('PREF', "Preferences", "Change some preferences of the modal"), ('MAN_OPS', "Operator", "Operator to add Manually"), # ('TUTO', "Tutorial", "How to use the tool"), + ('CHECKS', "Check List", "Customise what should happend when hitting 'check fix' button"), ('UPDATE', "Update", "Check and apply updates"), # ('KEYMAP', "Keymap", "customise the default keymap"), ), @@ -180,7 +181,7 @@ class GPTB_prefs(bpy.types.AddonPreferences): fps : IntProperty( name='Frame Rate', description="Fps of the project, Used to conform the file when you use Check file operator", - default=25, + default=24, min=1, max=10000 ) @@ -307,6 +308,9 @@ class GPTB_prefs(bpy.types.AddonPreferences): description = "add ctrl", default = False) + + fixprops: bpy.props.PointerProperty(type = GP_PG_FixSettings) + ## Temp cutter # temp_cutter_use_shortcut: BoolProperty( # name = "Use temp cutter Shortcut", @@ -437,6 +441,26 @@ class GPTB_prefs(bpy.types.AddonPreferences): box.label(text='Note: You can access user pref file and startup file in config folder') box.operator("wm.path_open", text='Open config location').filepath = bpy.utils.user_resource('CONFIG') + if self.pref_tabs == 'CHECKS': + layout.label(text='Following checks will be made when clicking "Check File" button:') + col = layout.column() + # row = col.row() + col.prop(self.fixprops, 'lock_main_cam') + col.prop(self.fixprops, 'set_scene_res', text=f'Reset Scene Resolution (to {self.render_res_x}x{self.render_res_y})') + col.prop(self.fixprops, 'set_res_percentage') + col.prop(self.fixprops, 'set_fps', text=f'Reset FPS (to {self.fps})') + col.prop(self.fixprops, 'set_slider_n_sync') + col.prop(self.fixprops, 'set_cursor_type') + col.prop(self.fixprops, 'check_front_axis') + col.prop(self.fixprops, 'check_placement') + col.prop(self.fixprops, 'set_pivot_median_point') + col.prop(self.fixprops, 'disable_guide') + col.prop(self.fixprops, 'list_disabled_anim') + col.prop(self.fixprops, 'autokey_add_n_replace') + # row.label(text='lock the active camera if not a draw cam (and if not "layout" in blendfile name)') + + + if self.pref_tabs == 'UPDATE': addon_updater_ops.update_settings_ui(self, context) @@ -448,8 +472,9 @@ class GPTB_prefs(bpy.types.AddonPreferences): classes = ( -GPTB_prefs, +GP_PG_FixSettings, GP_PG_ToolsSettings, +GPTB_prefs, GPT_OT_auto_tint_gp_layers, ) @@ -458,6 +483,7 @@ GPT_OT_auto_tint_gp_layers, def register(): addon_updater_ops.register(bl_info) + # bpy.types.Scene.gpfixprops = bpy.props.PointerProperty(type = GP_PG_FixSettings) # used in prefs for cls in classes: bpy.utils.register_class(cls) OP_helpers.register() @@ -519,6 +545,7 @@ def unregister(): GP_colorize.unregister()## GP_guided_colorize. OP_playblast_bg.unregister() OP_playblast.unregister() + # del bpy.types.Scene.gpfixprops del bpy.types.Scene.gptoolprops diff --git a/properties.py b/properties.py old mode 100644 new mode 100755 index 1809c52..7f91f30 --- a/properties.py +++ b/properties.py @@ -15,7 +15,69 @@ def change_edit_lines_opacity(self, context): if not gp.is_annotation: gp.edit_line_color[3]=self.edit_lines_opacity -class GP_PG_ToolsSettings(bpy.types.PropertyGroup) : + +class GP_PG_FixSettings(bpy.types.PropertyGroup): + lock_main_cam : BoolProperty( + name="Lock Main Cam", + description="Lock the main camera (works only if 'layout' is not in name)", + default=False, options={'HIDDEN'}) + + set_scene_res : BoolProperty( + name="Reset Scene Resolution", + description="Set the scene resolution to current prefs project settings", + default=True, options={'HIDDEN'}) + + set_res_percentage : BoolProperty( + name="Reset Resolution Percentage To 100%", + description="", + default=True, options={'HIDDEN'}) + + set_fps : BoolProperty( + name="Reset Fps", + description="Set the framerate of the scene to current prefs project settings", + default=False, options={'HIDDEN'}) + + set_slider_n_sync : BoolProperty( + name="Dopesheets Show Slider And Sync Range", + description="Toggle on the use of show slider and sync range", + default=True, options={'HIDDEN'}) + + set_cursor_type : BoolProperty( + name="Set Select Cursor Mode", + description="Set the type of the selection cursor (according to addon prefs)", + default=True, options={'HIDDEN'}) + + check_front_axis : BoolProperty( + name="Check If Draw Axis is Front (X-Z)", + description="Alert if the current grease pencil draw axis is not front (X-Z)", + default=True, options={'HIDDEN'}) + + check_placement : BoolProperty( + name="Check Stroke Placement", + description="Alert if the current grease pencil stroke placement is not Origin", + default=True, options={'HIDDEN'}) + + set_pivot_median_point : BoolProperty( + name="Set Pivot To Median Point", + description="Change the pivot point to the most used median point", + default=True, options={'HIDDEN'}) + + disable_guide : BoolProperty( + name="Disable Drawing Guide", + description="Disable constrained guide in draw mode", + default=False, options={'HIDDEN'}) + + list_disabled_anim : BoolProperty( + name="List Disabled Animation", + description="Alert if there are disabled animations", + default=True, options={'HIDDEN'}) + + autokey_add_n_replace : BoolProperty( + name="Autokey Mode Add and Replace", + description="Change autokey mode back to 'Add & Replace'", + default=True, options={'HIDDEN'}) + +class GP_PG_ToolsSettings(bpy.types.PropertyGroup): eraser_radius : IntProperty( name="Tint hue offset", description="Radius of eraser brush", default=20, min=0, max=500, subtype='PIXEL')