first verison of layer name builder
1.5.3 - feat: quick-prefix for layer using pref separator - list editable in addon pref - add interface button above layers - code: added environnement variable for prefix and separator: - `PREFIXES` : list of prefix (comma separated uppercase letters between 1 and 6 character, ex: 'AN,SP,L') - `SEPARATOR` : Separator character to determine prefixes, default is '_' (should not be a special regex character) - UI: add addon prefs namespace ui-box in project settingsgpv2
parent
f599964296
commit
0740e835d8
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -1,6 +1,17 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
|
||||||
|
1.5.3
|
||||||
|
|
||||||
|
- feat: layer aquick-prefix for layer using pref separator
|
||||||
|
- list editable in addon pref
|
||||||
|
- add interface button above layers
|
||||||
|
- code: added environnement variable for prefix and separator:
|
||||||
|
- `PREFIXES` : list of prefix (comma separated uppercase letters between 1 and 6 character, ex: 'AN,SP,L')
|
||||||
|
- `SEPARATOR` : Separator character to determine prefixes, default is '_' (should not be a special regex character)
|
||||||
|
- UI: add addon prefs namespace ui-box in project settings
|
||||||
|
|
||||||
|
|
||||||
1.5.2
|
1.5.2
|
||||||
|
|
||||||
- add environnement variables to set addon preferences project settings at register through `os.getenv('KEY')`:
|
- add environnement variables to set addon preferences project settings at register through `os.getenv('KEY')`:
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
import bpy
|
||||||
|
import re
|
||||||
|
from bpy.types import Operator
|
||||||
|
from bpy.props import StringProperty, BoolProperty
|
||||||
|
|
||||||
|
|
||||||
|
from .utils import get_addon_prefs
|
||||||
|
|
||||||
|
|
||||||
|
# --- OPS ---
|
||||||
|
|
||||||
|
## multi-prefix solution (Caps letters)
|
||||||
|
class PROJ_OT_layer_name_build(Operator):
|
||||||
|
bl_idname = "gp.layer_name_build"
|
||||||
|
bl_label = "Layer Name Build"
|
||||||
|
bl_description = "Change prefix of layer name"
|
||||||
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return True
|
||||||
|
|
||||||
|
prefix : StringProperty(default='', options={'SKIP_SAVE'})
|
||||||
|
prefix2 : StringProperty(default='', options={'SKIP_SAVE'})
|
||||||
|
desc : StringProperty(default='', options={'SKIP_SAVE'})
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
prefs = get_addon_prefs()
|
||||||
|
sep = prefs.separator
|
||||||
|
ob = context.object
|
||||||
|
gpl = ob.data.layers
|
||||||
|
act = gpl.active
|
||||||
|
if not act:
|
||||||
|
self.report({'ERROR'}, 'no layer active')
|
||||||
|
return {"CANCELLED"}
|
||||||
|
|
||||||
|
name = act.info
|
||||||
|
|
||||||
|
# pattern = r'([A-Z]{2})?_?([A-Z]{2})?_?(.*)' # bad ! match whithout separator
|
||||||
|
# pattern = r'(?:(^[A-Z]{2})_)?(?:([A-Z]{2})_)?(.*)' # matching only two letter
|
||||||
|
# pattern = r'^([A-Z]{2}_)?([A-Z]{2}_)?(.*)' # matching letters with separator
|
||||||
|
pattern = r'^([A-Z]{1,6}_)?([A-Z]{1,6}_)?(.*)' # matching capital letters from one to six
|
||||||
|
pattern = pattern.replace('_', sep) # set separator
|
||||||
|
|
||||||
|
res = re.search(pattern, name)
|
||||||
|
p1, p2, p3 = res.group(1), res.group(2), res.group(3)
|
||||||
|
|
||||||
|
## empty instead of None
|
||||||
|
p1 = '' if p1 is None else p1
|
||||||
|
p2 = '' if p2 is None else p2
|
||||||
|
p3 = '' if p3 is None else p3
|
||||||
|
|
||||||
|
if self.prefix:
|
||||||
|
if self.prefix == 'prefixkillcode':
|
||||||
|
p1 = ''
|
||||||
|
else:
|
||||||
|
p1 = self.prefix.upper() + sep
|
||||||
|
|
||||||
|
if self.prefix2:
|
||||||
|
p2 = self.prefix2.upper() + sep
|
||||||
|
if self.desc:
|
||||||
|
p3 = self.desc
|
||||||
|
|
||||||
|
new = f'{p1}{p2}{p3}'
|
||||||
|
|
||||||
|
act.info = new
|
||||||
|
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
## --- UI ---
|
||||||
|
|
||||||
|
def layer_name_builder(self, context):
|
||||||
|
prefs = get_addon_prefs()
|
||||||
|
if not prefs.prefixes:
|
||||||
|
return
|
||||||
|
|
||||||
|
layout = self.layout
|
||||||
|
# {'EDIT_GPENCIL', 'PAINT_GPENCIL','SCULPT_GPENCIL','WEIGHT_GPENCIL', 'VERTEX_GPENCIL'}
|
||||||
|
# layout.separator()
|
||||||
|
col = layout.column()
|
||||||
|
|
||||||
|
all_prefixes = prefs.prefixes.split(',')
|
||||||
|
line_limit = 8
|
||||||
|
|
||||||
|
## first prefix
|
||||||
|
for i, prefix in enumerate(all_prefixes):
|
||||||
|
if i % line_limit == 0:
|
||||||
|
row = col.row(align=True)
|
||||||
|
row.operator("gp.layer_name_build", text=prefix.upper() ).prefix = prefix
|
||||||
|
|
||||||
|
row.operator("gp.layer_name_build", text='', icon='X').prefix = 'prefixkillcode'
|
||||||
|
|
||||||
|
|
||||||
|
## secondary prefix
|
||||||
|
# row = layout.row(align=True)
|
||||||
|
# for task in prefs.prefixes: # 'PO', 'AN'
|
||||||
|
# row.operator("me.set_layer_name", text=task).prefix2 = task
|
||||||
|
|
||||||
|
row = col.row(align=True)
|
||||||
|
row.prop(context.scene.gptoolprops, 'layer_name', text='')
|
||||||
|
row.operator("gp.layer_name_build", text='', icon='EVENT_RETURN').desc = context.scene.gptoolprops.layer_name
|
||||||
|
|
||||||
|
|
||||||
|
classes=(
|
||||||
|
PROJ_OT_layer_name_build,
|
||||||
|
)
|
||||||
|
|
||||||
|
def register():
|
||||||
|
for cls in classes:
|
||||||
|
bpy.utils.register_class(cls)
|
||||||
|
bpy.types.DATA_PT_gpencil_layers.prepend(layer_name_builder)
|
||||||
|
|
||||||
|
def unregister():
|
||||||
|
bpy.types.DATA_PT_gpencil_layers.remove(layer_name_builder)
|
||||||
|
for cls in reversed(classes):
|
||||||
|
bpy.utils.unregister_class(cls)
|
|
@ -31,13 +31,17 @@ Note about palette : For now the importer is not working with linked palette as
|
||||||
|
|
||||||
### Environnement Variables
|
### Environnement Variables
|
||||||
|
|
||||||
Since 1.5.2, Following _environnement variable_ can set the project properties in toolbox preferences at register launch.
|
> Mainly for devellopers to set project environnement
|
||||||
|
|
||||||
|
Since 1.5.2, following _environnement variable_ can set the project properties in toolbox preferences at register launch.
|
||||||
|
|
||||||
`RENDER_WIDTH` : resolution x
|
`RENDER_WIDTH` : resolution x
|
||||||
`RENDER_HEIGHT` : resolution y
|
`RENDER_HEIGHT` : resolution y
|
||||||
`FPS` : project frame rate
|
`FPS` : project frame rate
|
||||||
`PALETTES` : path to the blends (or json) containing materials palettes
|
`PALETTES` : path to the blends (or json) containing materials palettes
|
||||||
`BRUSHES` : path to the blend containing brushes to load
|
`BRUSHES` : path to the blend containing brushes to load
|
||||||
|
`PREFIXES` : list of prefix (comma separated uppercase letters between 1 and 6 character, ex: 'AN,SP,L')
|
||||||
|
`SEPARATOR` : Separator character to determine prefixes, default is '_' (should not be a special regex character)
|
||||||
|
|
||||||
### Passive action
|
### Passive action
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@ Il est recommandé de désactiver l'addon natif "Grease pencil tools" car ces o
|
||||||
|
|
||||||
### Variables d'environnement
|
### Variables d'environnement
|
||||||
|
|
||||||
|
> Cette partie s'adresse surtout aux dévellopeurs qui préparent les environement de projets.
|
||||||
|
|
||||||
Depuis la version 1.5.2, les variables d'environnement suivantes peuvent surcharger les préférences projet dans blender (au moment du register)
|
Depuis la version 1.5.2, les variables d'environnement suivantes peuvent surcharger les préférences projet dans blender (au moment du register)
|
||||||
|
|
||||||
`RENDER_WIDTH` : résolution x
|
`RENDER_WIDTH` : résolution x
|
||||||
|
@ -21,6 +23,8 @@ Depuis la version 1.5.2, les variables d'environnement suivantes peuvent surchar
|
||||||
`FPS` : Vitesse du projet
|
`FPS` : Vitesse du projet
|
||||||
`PALETTES` : Chemin vers le dossier des blends (ou json) contenant des palettes de matériaux
|
`PALETTES` : Chemin vers le dossier des blends (ou json) contenant des palettes de matériaux
|
||||||
`BRUSHES` : Chemin vers le dossier des blends contenant les brushes a charger
|
`BRUSHES` : Chemin vers le dossier des blends contenant les brushes a charger
|
||||||
|
`PREFIXES` : Liste de prefixes du projet pour les noms de calques
|
||||||
|
`SEPARATOR` : Caractère de séparation pour determiner les prefixes, par défaut '_' (ne doit pas être un caractère spécial de regex !)
|
||||||
|
|
||||||
### Exposition dans l'UI de fonction native
|
### Exposition dans l'UI de fonction native
|
||||||
|
|
||||||
|
|
40
__init__.py
40
__init__.py
|
@ -15,7 +15,7 @@ bl_info = {
|
||||||
"name": "GP toolbox",
|
"name": "GP toolbox",
|
||||||
"description": "Set of tools for Grease Pencil in animation production",
|
"description": "Set of tools for Grease Pencil in animation production",
|
||||||
"author": "Samuel Bernou, Christophe Seux",
|
"author": "Samuel Bernou, Christophe Seux",
|
||||||
"version": (1, 5, 2),
|
"version": (1, 5, 3),
|
||||||
"blender": (2, 91, 0),
|
"blender": (2, 91, 0),
|
||||||
"location": "Sidebar (N menu) > Gpencil > Toolbox / Gpencil properties",
|
"location": "Sidebar (N menu) > Gpencil > Toolbox / Gpencil properties",
|
||||||
"warning": "",
|
"warning": "",
|
||||||
|
@ -48,6 +48,7 @@ from . import OP_copy_paste
|
||||||
from . import OP_realign
|
from . import OP_realign
|
||||||
from . import OP_depth_move
|
from . import OP_depth_move
|
||||||
from . import OP_key_duplicate_send
|
from . import OP_key_duplicate_send
|
||||||
|
from . import OP_layer_name_builder
|
||||||
from . import OP_eraser_brush
|
from . import OP_eraser_brush
|
||||||
from . import TOOL_eraser_brush
|
from . import TOOL_eraser_brush
|
||||||
from . import handler_draw_cam
|
from . import handler_draw_cam
|
||||||
|
@ -167,7 +168,7 @@ class GPTB_prefs(bpy.types.AddonPreferences):
|
||||||
|
|
||||||
## addon prefs
|
## addon prefs
|
||||||
|
|
||||||
## Project preferences
|
#--# PROJECT PREFERENCES #--#
|
||||||
# subtype (string) – Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILE_NAME', 'BYTE_STRING', 'PASSWORD', 'NONE'].
|
# subtype (string) – Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILE_NAME', 'BYTE_STRING', 'PASSWORD', 'NONE'].
|
||||||
|
|
||||||
## fps
|
## fps
|
||||||
|
@ -201,11 +202,6 @@ class GPTB_prefs(bpy.types.AddonPreferences):
|
||||||
description="Path relative to blend to place render",
|
description="Path relative to blend to place render",
|
||||||
default="//render", maxlen=0, subtype='DIR_PATH')
|
default="//render", maxlen=0, subtype='DIR_PATH')
|
||||||
|
|
||||||
separator : StringProperty(
|
|
||||||
name="Namespace separator",
|
|
||||||
description="Character delimiter to use for detecting namespace (prefix), default is '_', space if nothing specified",
|
|
||||||
default="_", maxlen=0, subtype='NONE')
|
|
||||||
|
|
||||||
use_env_palettes : BoolProperty(
|
use_env_palettes : BoolProperty(
|
||||||
name="Use Project Palettes",
|
name="Use Project Palettes",
|
||||||
description="Load the palette path in environnement at startup (key 'PALETTES')",
|
description="Load the palette path in environnement at startup (key 'PALETTES')",
|
||||||
|
@ -228,6 +224,16 @@ class GPTB_prefs(bpy.types.AddonPreferences):
|
||||||
description="Path to brushes containing the blends holding the brushes",
|
description="Path to brushes containing the blends holding the brushes",
|
||||||
default="//", maxlen=0, subtype='DIR_PATH')#, update = set_palette_path
|
default="//", maxlen=0, subtype='DIR_PATH')#, update = set_palette_path
|
||||||
|
|
||||||
|
separator : StringProperty(
|
||||||
|
name="Separator",
|
||||||
|
description="Character delimiter to use for detecting namespace (prefix), default is '_', space if nothing specified",
|
||||||
|
default="_", maxlen=0, subtype='NONE')
|
||||||
|
|
||||||
|
prefixes : StringProperty(
|
||||||
|
name="Layers Prefixes",
|
||||||
|
description="List of prefixes (two capital letters) available for layers(ex: AN,CO,CL)",
|
||||||
|
default="", maxlen=0)
|
||||||
|
|
||||||
## Playblast prefs
|
## Playblast prefs
|
||||||
playblast_auto_play : BoolProperty(
|
playblast_auto_play : BoolProperty(
|
||||||
name="Playblast auto play",
|
name="Playblast auto play",
|
||||||
|
@ -363,6 +369,13 @@ class GPTB_prefs(bpy.types.AddonPreferences):
|
||||||
|
|
||||||
## render output
|
## render output
|
||||||
subbox.prop(self, 'output_path')
|
subbox.prop(self, 'output_path')
|
||||||
|
|
||||||
|
## render output
|
||||||
|
subbox = box.box()
|
||||||
|
subbox.label(text='Namespace:')
|
||||||
|
subbox.prop(self, 'separator')
|
||||||
|
subbox.prop(self, 'prefixes')
|
||||||
|
|
||||||
box.prop(self, 'use_relative_remap_on_save')
|
box.prop(self, 'use_relative_remap_on_save')
|
||||||
|
|
||||||
### TODO add render settings
|
### TODO add render settings
|
||||||
|
@ -416,10 +429,6 @@ class GPTB_prefs(bpy.types.AddonPreferences):
|
||||||
|
|
||||||
box.prop(self, "render_obj_exclusion", icon='FILTER')#
|
box.prop(self, "render_obj_exclusion", icon='FILTER')#
|
||||||
|
|
||||||
## random color character separator
|
|
||||||
box = layout.box()
|
|
||||||
box.label(text='Random color options:')
|
|
||||||
box.prop(self, 'separator')
|
|
||||||
|
|
||||||
box = layout.box()
|
box = layout.box()
|
||||||
box.label(text='Tools options:')
|
box.label(text='Tools options:')
|
||||||
|
@ -479,8 +488,6 @@ class GPTB_prefs(bpy.types.AddonPreferences):
|
||||||
col.prop(self.fixprops, 'autokey_add_n_replace')
|
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)')
|
# row.label(text='lock the active camera if not a draw cam (and if not "layout" in blendfile name)')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if self.pref_tabs == 'UPDATE':
|
if self.pref_tabs == 'UPDATE':
|
||||||
addon_updater_ops.update_settings_ui(self, context)
|
addon_updater_ops.update_settings_ui(self, context)
|
||||||
|
|
||||||
|
@ -508,6 +515,11 @@ def set_env_properties():
|
||||||
if prefs.use_env_brushes:
|
if prefs.use_env_brushes:
|
||||||
prefs.brush_path = brushes if brushes else prefs.brush_path
|
prefs.brush_path = brushes if brushes else prefs.brush_path
|
||||||
|
|
||||||
|
prefix_list = os.getenv('PREFIXES')
|
||||||
|
prefs.prefixes = prefix_list if prefix_list else prefs.prefixes
|
||||||
|
|
||||||
|
separator = os.getenv('SEPARATOR')
|
||||||
|
prefs.separator = separator if separator else prefs.separator
|
||||||
|
|
||||||
### --- REGISTER ---
|
### --- REGISTER ---
|
||||||
|
|
||||||
|
@ -546,6 +558,7 @@ def register():
|
||||||
OP_realign.register()
|
OP_realign.register()
|
||||||
OP_depth_move.register()
|
OP_depth_move.register()
|
||||||
OP_key_duplicate_send.register()
|
OP_key_duplicate_send.register()
|
||||||
|
OP_layer_name_builder.register()
|
||||||
OP_eraser_brush.register()
|
OP_eraser_brush.register()
|
||||||
TOOL_eraser_brush.register()
|
TOOL_eraser_brush.register()
|
||||||
handler_draw_cam.register()
|
handler_draw_cam.register()
|
||||||
|
@ -574,6 +587,7 @@ def unregister():
|
||||||
handler_draw_cam.unregister()
|
handler_draw_cam.unregister()
|
||||||
OP_eraser_brush.unregister()
|
OP_eraser_brush.unregister()
|
||||||
TOOL_eraser_brush.unregister()
|
TOOL_eraser_brush.unregister()
|
||||||
|
OP_layer_name_builder.unregister()
|
||||||
OP_key_duplicate_send.unregister()
|
OP_key_duplicate_send.unregister()
|
||||||
OP_depth_move.unregister()
|
OP_depth_move.unregister()
|
||||||
OP_realign.unregister()
|
OP_realign.unregister()
|
||||||
|
|
|
@ -127,6 +127,10 @@ class GP_PG_ToolsSettings(bpy.types.PropertyGroup):
|
||||||
('JITTER', 'Jitter', '', 'KEYTYPE_JITTER_VEC', 5),
|
('JITTER', 'Jitter', '', 'KEYTYPE_JITTER_VEC', 5),
|
||||||
))
|
))
|
||||||
|
|
||||||
|
layer_name : StringProperty(
|
||||||
|
name="Layer Name",
|
||||||
|
description="The layer name, should describe the content of the layer",
|
||||||
|
default="")# update=None, get=None, set=None
|
||||||
"""
|
"""
|
||||||
reconnect_parent = bpy.props.PointerProperty(type =bpy.types.Object,poll=poll_armature)
|
reconnect_parent = bpy.props.PointerProperty(type =bpy.types.Object,poll=poll_armature)
|
||||||
render_settings = bpy.props.BoolProperty(default = False)
|
render_settings = bpy.props.BoolProperty(default = False)
|
||||||
|
|
Loading…
Reference in New Issue