134 lines
4.8 KiB
Python
134 lines
4.8 KiB
Python
import bpy
|
|
from .utils import get_gp_datas, get_addon_prefs, translate_range
|
|
|
|
|
|
def get_hue_by_name(name, offset=0):
|
|
'''
|
|
Get a string and return a hue value
|
|
offsetted by int [offset] value based on a range of 255
|
|
'''
|
|
|
|
val = []
|
|
add = 0
|
|
for i in name:
|
|
add += ord(i)*8
|
|
#val.append(str(ord(i)))
|
|
#number = ''.join(val)
|
|
#print("number", number)#Dbg
|
|
|
|
# print(add, "% 255 =", add % 1000)#Dbg
|
|
|
|
moduled = (add + offset) % 1000
|
|
|
|
##avoid red
|
|
hue = translate_range(moduled, 0, 1000, 0.1, 0.9)
|
|
|
|
##avoid pink
|
|
#hue = translate_range(moduled, 0, 255, 0.0, 0.7)
|
|
|
|
return hue
|
|
|
|
|
|
class GPT_OT_auto_tint_gp_layers(bpy.types.Operator):
|
|
bl_idname = "gp.auto_tint_gp_layers"
|
|
bl_label = "Pseudo tint layers"
|
|
bl_description = "Put a tint on layers according to namespace (except background)"
|
|
bl_options = {"REGISTER", "UNDO"}
|
|
|
|
# bpy.types.Scene.gp_autotint_offset = bpy.props.IntProperty(name="Tint hue offset", description="offset the tint by this value for better color", default=0, min=-5000, max=5000, soft_min=-999, soft_max=999, step=1)#, subtype='PERCENTAGE'
|
|
# bpy.types.Scene.gp_autotint_namespace = bpy.props.BoolProperty(name="use prefix", description="Put same color on layers unsing the same prefix (separated by '_') of full name withjout separator", default=True)
|
|
|
|
autotint_offset : bpy.props.IntProperty(name="Tint hue offset",
|
|
default=0, min=-5000, max=5000, soft_min=-999, soft_max=999, step=1)#, subtype='PERCENTAGE'
|
|
|
|
reset : bpy.props.BoolProperty(name="Reset GP tints",
|
|
description="Put all tint factor to 0", default=False)
|
|
|
|
selected_GP : bpy.props.BoolProperty(name="Selected",
|
|
description="Work on all selected grease pencil objects, else only active one", default=True)
|
|
|
|
def execute(self, context):
|
|
## TODO create a scene string variable to store serialized list of pre-tinted layers
|
|
addon_prefs = get_addon_prefs()
|
|
separator = addon_prefs.separator
|
|
if not separator:separator = '_'
|
|
# Define GP object to work on
|
|
gp_datas = get_gp_datas(selection = self.selected_GP)
|
|
|
|
if self.reset:
|
|
for gp in gp_datas:
|
|
gpl = gp.layers
|
|
for l in gpl:
|
|
l.tint_factor = 0
|
|
# l.tint_color.hsv = (0,0,0)#Reset tint ?
|
|
# reset color stored if it was different than black on change
|
|
return {"FINISHED"}
|
|
|
|
for gp in gp_datas:
|
|
gpl = gp.layers
|
|
layer_ct = len(gpl)
|
|
hue_offset = self.autotint_offset#context.scene.gptoolprops.autotint_offset
|
|
#context.scene.gp_autotint_offset# scene property or self property
|
|
|
|
|
|
# namespace_order
|
|
namespaces=[]
|
|
for l in gpl:
|
|
ns= l.name.lower().split(separator, 1)[0]
|
|
if ns not in namespaces:
|
|
namespaces.append(ns)
|
|
|
|
ns_len =len(namespaces)
|
|
namespaces.reverse()
|
|
#print("namespaces", namespaces)#Dbg
|
|
#print("ns_len", ns_len)#Dbg
|
|
|
|
|
|
print('--------')
|
|
### step from 0.1 to 0.9
|
|
|
|
for i, l in enumerate(gpl):
|
|
if l.name.lower() not in ('background',):
|
|
print()
|
|
print('>', l.name)
|
|
ns= l.name.lower().split(separator, 1)[0]#get namespace from separator
|
|
print("namespace", ns)#Dbg
|
|
|
|
if context.scene.gptoolprops.autotint_namespace:
|
|
h = get_hue_by_name(ns, hue_offset)#l.name == individuels
|
|
|
|
else:
|
|
h = translate_range((i + hue_offset/100)%layer_ct, 0, layer_ct, 0.1, 0.9)
|
|
# h = hueval + hue_offset/10
|
|
# hueval += step
|
|
print("hue", h)#Dbg
|
|
|
|
## Desaturate for each color per namespace index between defined range (reperesent define depth).
|
|
# s = translate_range(namespaces.index(ns), 0, ns_len, 0.5, 0.8)
|
|
s = 0.8
|
|
|
|
print("index", namespaces.index(ns), '/', ns_len)#Dbg
|
|
print("sat", s)#Dbg
|
|
#v = 0.8
|
|
v = s
|
|
l.tint_factor = 1
|
|
l.tint_color.hsv = (h,s,v)
|
|
|
|
return {"FINISHED"}
|
|
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.prop(self, 'autotint_offset')
|
|
# layout.prop(context.scene, 'gp_autotint_offset')#, text = "offset"
|
|
|
|
def invoke(self, context, event):
|
|
self.autotint_offset = context.scene.gptoolprops.autotint_offset
|
|
return self.execute(context)
|
|
|
|
|
|
def register():
|
|
bpy.utils.register_class(GPT_OT_auto_tint_gp_layers)
|
|
|
|
def unregister():
|
|
bpy.utils.unregister_class(GPT_OT_auto_tint_gp_layers) |