choose pts attribute to dump in layer copy
2.0.2 - added: possibility to select which point attribute is copied by GP layer copy to clipboardgpv2
parent
e1681cd6ad
commit
762b92fbfe
|
@ -1,5 +1,9 @@
|
|||
# Changelog
|
||||
|
||||
2.0.2
|
||||
|
||||
- added: possibility to select which point attribute is copied by GP layer copy to clipboard
|
||||
|
||||
2.0.1
|
||||
|
||||
- added: enable/disable camera animation separately in `animation manager`
|
||||
|
|
|
@ -61,7 +61,8 @@ def getMatrix (layer) :
|
|||
|
||||
default_pt_uv_fill = Vector((0.5, 0.5))
|
||||
|
||||
def dump_gp_point(p, l, obj):
|
||||
def dump_gp_point(p, l, obj,
|
||||
pressure=True, strength=True, vertex_color=True, uv_fill=True, uv_factor=True, uv_rotation=True):
|
||||
'''add properties of a given points to a dic and return it'''
|
||||
pdic = {}
|
||||
#point_attr_list = ('co', 'pressure', 'select', 'strength') #select#'rna_type'
|
||||
|
@ -72,26 +73,30 @@ def dump_gp_point(p, l, obj):
|
|||
pdic['co'] = convertAttr(obj.matrix_world @ mat @ getattr(p,'co'))
|
||||
else:
|
||||
pdic['co'] = convertAttr(obj.matrix_world @ getattr(p,'co'))
|
||||
pdic['pressure'] = convertAttr(getattr(p,'pressure'))
|
||||
|
||||
# pdic['select'] = convertAttr(getattr(p,'select')) # need selection ?
|
||||
if pressure and p.pressure != 1.0:
|
||||
pdic['pressure'] = convertAttr(getattr(p,'pressure'))
|
||||
if strength and p.strength != 1.0:
|
||||
pdic['strength'] = convertAttr(getattr(p,'strength'))
|
||||
|
||||
## get vertex color (long...)
|
||||
if p.vertex_color[:] != (0.0, 0.0, 0.0, 0.0):
|
||||
if vertex_color and p.vertex_color[:] != (0.0, 0.0, 0.0, 0.0):
|
||||
pdic['vertex_color'] = convertAttr(p.vertex_color)
|
||||
|
||||
## UV attr (maybe uv fill is always (0.5,0.5) ? also exists at stroke level...)
|
||||
if p.uv_fill != default_pt_uv_fill:
|
||||
if uv_fill and p.uv_fill != default_pt_uv_fill:
|
||||
pdic['uv_fill'] = convertAttr(p.uv_fill)
|
||||
if p.uv_factor != 0.0:
|
||||
if uv_factor and p.uv_factor != 0.0:
|
||||
pdic['uv_factor'] = convertAttr(p.uv_factor)
|
||||
if p.uv_rotation != 0.0:
|
||||
if uv_rotation and p.uv_rotation != 0.0:
|
||||
pdic['uv_rotation'] = convertAttr(p.uv_rotation)
|
||||
|
||||
return pdic
|
||||
|
||||
|
||||
def dump_gp_stroke_range(s, sid, l, obj):
|
||||
def dump_gp_stroke_range(s, sid, l, obj,
|
||||
pressure=True, strength=True, vertex_color=True, uv_fill=True, uv_factor=True, uv_rotation=True):
|
||||
'''Get a grease pencil stroke and return a dic with attribute
|
||||
(points attribute being a dic of dics to store points and their attributes)
|
||||
'''
|
||||
|
@ -129,16 +134,18 @@ def dump_gp_stroke_range(s, sid, l, obj):
|
|||
points = []
|
||||
if sid is None: # no ids, just full points...
|
||||
for p in s.points:
|
||||
points.append(dump_gp_point(p,l,obj))
|
||||
points.append(dump_gp_point(p,l,obj,
|
||||
pressure=pressure, strength=strength, vertex_color=vertex_color, uv_fill=uv_fill, uv_factor=uv_factor, uv_rotation=uv_rotation))
|
||||
else:
|
||||
for pid in sid:
|
||||
points.append(dump_gp_point(s.points[pid],l,obj))
|
||||
points.append(dump_gp_point(s.points[pid],l,obj,
|
||||
pressure=pressure, strength=strength, vertex_color=vertex_color, uv_fill=uv_fill, uv_factor=uv_factor, uv_rotation=uv_rotation))
|
||||
sdic['points'] = points
|
||||
return sdic
|
||||
|
||||
|
||||
|
||||
def copycut_strokes(layers=None, copy=True, keep_empty=True):# (mayber allow filter)
|
||||
def copycut_strokes(layers=None, copy=True, keep_empty=True):
|
||||
'''
|
||||
copy all visibles selected strokes on active frame
|
||||
layers can be None, a single layer object or list of layer object as filter
|
||||
|
@ -276,7 +283,8 @@ def copy_all_strokes(layers=None):
|
|||
return stroke_list
|
||||
"""
|
||||
|
||||
def copy_all_strokes_in_frame(frame=None, layers=None, obj=None):
|
||||
def copy_all_strokes_in_frame(frame=None, layers=None, obj=None,
|
||||
pressure=True, strength=True, vertex_color=True, uv_fill=True, uv_factor=True, uv_rotation=True):
|
||||
'''
|
||||
copy all stroke, not affected by selection on active frame
|
||||
layers can be None, a single layer object or list of layer object as filter
|
||||
|
@ -309,7 +317,8 @@ def copy_all_strokes_in_frame(frame=None, layers=None, obj=None):
|
|||
## full stroke version
|
||||
# if s.select:
|
||||
# send index of all points to get the whole stroke with "range"
|
||||
stroke_list.append( dump_gp_stroke_range(s, [i for i in range(len(s.points))], l, obj) )
|
||||
stroke_list.append( dump_gp_stroke_range(s, [i for i in range(len(s.points))], l, obj,
|
||||
pressure=pressure,strength=strength,vertex_color=vertex_color,uv_fill=uv_fill,uv_factor=uv_factor,uv_rotation=uv_rotation))
|
||||
|
||||
# print(len(stroke_list), 'strokes copied in', time()-t0, 'seconds')
|
||||
return stroke_list
|
||||
|
@ -408,7 +417,7 @@ def add_multiple_strokes(stroke_list, layer=None, use_current_frame=True, select
|
|||
class GPCLIP_OT_copy_strokes(bpy.types.Operator):
|
||||
bl_idname = "gp.copy_strokes"
|
||||
bl_label = "GP Copy strokes"
|
||||
bl_description = "Copy strokes to str in paperclip"
|
||||
bl_description = "Copy strokes to text in paperclip"
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
#copy = bpy.props.BoolProperty(default=True)
|
||||
|
@ -425,7 +434,7 @@ class GPCLIP_OT_copy_strokes(bpy.types.Operator):
|
|||
#ct = check_pressure()
|
||||
strokelist = copycut_strokes(copy=True, keep_empty=True)
|
||||
if not strokelist:
|
||||
self.report({'ERROR'},'rien a copier')
|
||||
self.report({'ERROR'}, 'Nothing to copy')
|
||||
return {"CANCELLED"}
|
||||
bpy.context.window_manager.clipboard = json.dumps(strokelist)#copy=self.copy
|
||||
#if ct:
|
||||
|
@ -438,7 +447,7 @@ class GPCLIP_OT_copy_strokes(bpy.types.Operator):
|
|||
class GPCLIP_OT_cut_strokes(bpy.types.Operator):
|
||||
bl_idname = "gp.cut_strokes"
|
||||
bl_label = "GP Cut strokes"
|
||||
bl_description = "Cut strokes to str in paperclip"
|
||||
bl_description = "Cut strokes to text in paperclip"
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
@classmethod
|
||||
|
@ -503,6 +512,37 @@ class GPCLIP_OT_copy_multi_strokes(bpy.types.Operator):
|
|||
def poll(cls, context):
|
||||
return context.object and context.object.type == 'GPENCIL'
|
||||
|
||||
pressure : bpy.props.BoolProperty(name='pressure', default=True,
|
||||
description='Dump point pressure attribute (already skipped if at default value)')
|
||||
strength : bpy.props.BoolProperty(name='strength', default=True,
|
||||
description='Dump point strength attribute (already skipped if at default value)')
|
||||
vertex_color : bpy.props.BoolProperty(name='vertex color', default=True,
|
||||
description='Dump point vertex_color attribute (already skipped if at default value)')
|
||||
uv_fill : bpy.props.BoolProperty(name='uv fill', default=True,
|
||||
description='Dump point uv_fill attribute (already skipped if at default value)')
|
||||
uv_factor : bpy.props.BoolProperty(name='uv factor', default=True,
|
||||
description='Dump point uv_factor attribute (already skipped if at default value)')
|
||||
uv_rotation : bpy.props.BoolProperty(name='uv rotation', default=True,
|
||||
description='Dump point uv_rotation attribute (already skipped if at default value)')
|
||||
|
||||
def invoke(self, context, event):
|
||||
# self.file_dump = event.ctrl
|
||||
return context.window_manager.invoke_props_dialog(self) # , width=400
|
||||
# return self.execute(context)
|
||||
|
||||
def draw(self, context):
|
||||
layout=self.layout
|
||||
layout.use_property_split = True
|
||||
col = layout.column()
|
||||
col.label(text='Keep following point attributes:')
|
||||
col.prop(self, 'pressure')
|
||||
col.prop(self, 'strength')
|
||||
col.prop(self, 'vertex_color')
|
||||
col.prop(self, 'uv_fill')
|
||||
col.prop(self, 'uv_factor')
|
||||
col.prop(self, 'uv_rotation')
|
||||
return
|
||||
|
||||
def execute(self, context):
|
||||
bake_moves = True
|
||||
skip_empty_frame = False
|
||||
|
@ -529,7 +569,9 @@ class GPCLIP_OT_copy_multi_strokes(bpy.types.Operator):
|
|||
if skip_empty_frame and not len(f.strokes):
|
||||
continue
|
||||
context.scene.frame_set(f.frame_number) # use matrix of this frame
|
||||
strokelist = copy_all_strokes_in_frame(frame=f, layers=l, obj=obj)
|
||||
strokelist = copy_all_strokes_in_frame(frame=f, layers=l, obj=obj,
|
||||
pressure=self.pressure, strength=self.strength, vertex_color=self.vertex_color,
|
||||
uv_fill=self.uv_fill, uv_factor=self.uv_factor, uv_rotation=self.uv_rotation)
|
||||
|
||||
frame_dic[f.frame_number] = strokelist
|
||||
|
||||
|
@ -537,6 +579,7 @@ class GPCLIP_OT_copy_multi_strokes(bpy.types.Operator):
|
|||
|
||||
else: # bake position: copy frame where object as moved even if frame is unchanged
|
||||
for l in layerpool:
|
||||
print('dump layer:', l.info)
|
||||
if not l.frames:
|
||||
continue# skip empty layers
|
||||
|
||||
|
@ -563,7 +606,10 @@ class GPCLIP_OT_copy_multi_strokes(bpy.types.Operator):
|
|||
if skip_empty_frame and not len(f.strokes):
|
||||
continue
|
||||
|
||||
strokelist = copy_all_strokes_in_frame(frame=f, layers=l, obj=obj)
|
||||
strokelist = copy_all_strokes_in_frame(frame=f, layers=l, obj=obj,
|
||||
pressure=self.pressure, strength=self.strength, vertex_color=self.vertex_color,
|
||||
uv_fill=self.uv_fill, uv_factor=self.uv_factor, uv_rotation=self.uv_rotation)
|
||||
|
||||
frame_dic[i] = strokelist
|
||||
|
||||
prevmat = curmat
|
||||
|
|
|
@ -4,7 +4,7 @@ bl_info = {
|
|||
"name": "GP toolbox",
|
||||
"description": "Tool set for Grease Pencil in animation production",
|
||||
"author": "Samuel Bernou, Christophe Seux",
|
||||
"version": (2, 0, 1),
|
||||
"version": (2, 0, 2),
|
||||
"blender": (2, 91, 0),
|
||||
"location": "Sidebar (N menu) > Gpencil > Toolbox / Gpencil properties",
|
||||
"warning": "",
|
||||
|
|
Loading…
Reference in New Issue