116 lines
3.3 KiB
Python
116 lines
3.3 KiB
Python
|
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)
|