diff options
Diffstat (limited to 'uv_magic_uv/op/copy_paste_uv_object.py')
-rw-r--r-- | uv_magic_uv/op/copy_paste_uv_object.py | 140 |
1 files changed, 63 insertions, 77 deletions
diff --git a/uv_magic_uv/op/copy_paste_uv_object.py b/uv_magic_uv/op/copy_paste_uv_object.py index eb6d87c9..d9f42447 100644 --- a/uv_magic_uv/op/copy_paste_uv_object.py +++ b/uv_magic_uv/op/copy_paste_uv_object.py @@ -23,27 +23,24 @@ __status__ = "production" __version__ = "5.2" __date__ = "17 Nov 2018" -import bpy import bmesh +import bpy from bpy.props import ( StringProperty, BoolProperty, ) +from ..impl import copy_paste_uv_impl as impl from .. import common -from .copy_paste_uv import ( - get_copy_uv_layers, - get_paste_uv_layers, - paste_uv -) - +from ..utils.bl_class_registry import BlClassRegistry +from ..utils.property_class_registry import PropertyClassRegistry __all__ = [ 'Properties', - 'OperatorCopyUV', - 'MenuCopyUV', - 'OperatorPasteUV', - 'MenuPasteUV', + 'MUV_OT_CopyPasteUVObject_CopyUV', + 'MUV_MT_CopyPasteUVObject_CopyUV', + 'MUV_OT_CopyPasteUVObject_PasteUV', + 'MUV_MT_CopyPasteUVObject_PasteUV', ] @@ -68,16 +65,10 @@ def is_valid_context(context): return True -def memorize_view_3d_mode(fn): - def __memorize_view_3d_mode(self, context): - mode_orig = bpy.context.object.mode - result = fn(self, context) - bpy.ops.object.mode_set(mode=mode_orig) - return result - return __memorize_view_3d_mode - - +@PropertyClassRegistry() class Properties: + idname = "copy_paste_uv_object" + @classmethod def init_props(cls, scene): class Props(): @@ -97,7 +88,17 @@ class Properties: del scene.muv_copy_paste_uv_object_copy_seams -class OperatorCopyUV(bpy.types.Operator): +def memorize_view_3d_mode(fn): + def __memorize_view_3d_mode(self, context): + mode_orig = bpy.context.object.mode + result = fn(self, context) + bpy.ops.object.mode_set(mode=mode_orig) + return result + return __memorize_view_3d_mode + + +@BlClassRegistry() +class MUV_OT_CopyPasteUVObject_CopyUV(bpy.types.Operator): """ Operation class: Copy UV coordinate among objects """ @@ -107,7 +108,7 @@ class OperatorCopyUV(bpy.types.Operator): bl_description = "Copy UV coordinate (Among Objects)" bl_options = {'REGISTER', 'UNDO'} - uv_map = StringProperty(default="__default", options={'HIDDEN'}) + uv_map: StringProperty(default="__default", options={'HIDDEN'}) @classmethod def poll(cls, context): @@ -124,23 +125,15 @@ class OperatorCopyUV(bpy.types.Operator): bm = common.create_bmesh(obj) # get UV layer - uv_layers = get_copy_uv_layers(self, bm) + uv_layers = impl.get_copy_uv_layers(self, bm, self.uv_map) if not uv_layers: return {'CANCELLED'} # get selected face - props.src_info = {} - for layer in uv_layers: - face_info = [] - for face in bm.faces: - if face.select: - info = { - "uvs": [l[layer].uv.copy() for l in face.loops], - "pin_uvs": [l[layer].pin_uv for l in face.loops], - "seams": [l.edge.seam for l in face.loops], - } - face_info.append(info) - props.src_info[layer.name] = face_info + src_info = impl.get_src_face_info(self, bm, uv_layers) + if src_info is None: + return {'CANCELLED'} + props.src_info = src_info self.report({'INFO'}, "{}'s UV coordinates are copied".format(obj.name)) @@ -148,7 +141,8 @@ class OperatorCopyUV(bpy.types.Operator): return {'FINISHED'} -class MenuCopyUV(bpy.types.Menu): +@BlClassRegistry() +class MUV_MT_CopyPasteUVObject_CopyUV(bpy.types.Menu): """ Menu class: Copy UV coordinate among objects """ @@ -164,20 +158,24 @@ class MenuCopyUV(bpy.types.Menu): def draw(self, _): layout = self.layout # create sub menu - uv_maps = bpy.context.active_object.data.uv_textures.keys() + uv_maps = bpy.context.active_object.data.uv_layers.keys() - ops = layout.operator(OperatorCopyUV.bl_idname, text="[Default]") + ops = layout.operator(MUV_OT_CopyPasteUVObject_CopyUV.bl_idname, + text="[Default]") ops.uv_map = "__default" - ops = layout.operator(OperatorCopyUV.bl_idname, text="[All]") + ops = layout.operator(MUV_OT_CopyPasteUVObject_CopyUV.bl_idname, + text="[All]") ops.uv_map = "__all" for m in uv_maps: - ops = layout.operator(OperatorCopyUV.bl_idname, text=m) + ops = layout.operator(MUV_OT_CopyPasteUVObject_CopyUV.bl_idname, + text=m) ops.uv_map = m -class OperatorPasteUV(bpy.types.Operator): +@BlClassRegistry() +class MUV_OT_CopyPasteUVObject_PasteUV(bpy.types.Operator): """ Operation class: Paste UV coordinate among objects """ @@ -187,8 +185,8 @@ class OperatorPasteUV(bpy.types.Operator): bl_description = "Paste UV coordinate (Among Objects)" bl_options = {'REGISTER', 'UNDO'} - uv_map = StringProperty(default="__default", options={'HIDDEN'}) - copy_seams = BoolProperty( + uv_map: StringProperty(default="__default", options={'HIDDEN'}) + copy_seams: BoolProperty( name="Seams", description="Copy Seams", default=True @@ -213,52 +211,35 @@ class OperatorPasteUV(bpy.types.Operator): return {'CANCELLED'} for o in bpy.data.objects: - if not hasattr(o.data, "uv_textures") or not o.select: + if not hasattr(o.data, "uv_layers") or not o.select_get(): continue bpy.ops.object.mode_set(mode='OBJECT') - bpy.context.scene.objects.active = o + bpy.context.view_layer.objects.active = o bpy.ops.object.mode_set(mode='EDIT') obj = context.active_object bm = common.create_bmesh(obj) # get UV layer - uv_layers = get_paste_uv_layers(self, obj, bm, props.src_info) + uv_layers = impl.get_paste_uv_layers(self, obj, bm, props.src_info, + self.uv_map) if not uv_layers: return {'CANCELLED'} # get selected face - dest_info = {} - for layer in uv_layers: - face_info = [] - for face in bm.faces: - if face.select: - info = { - "uvs": [l[layer].uv.copy() for l in face.loops], - } - face_info.append(info) - key = list(props.src_info.keys())[0] - src_face_count = len(props.src_info[key]) - dest_face_count = len(face_info) - if src_face_count != dest_face_count: - self.report( - {'WARNING'}, - "Number of selected faces is different from copied" + - "(src:{}, dest:{})" - .format(src_face_count, dest_face_count)) - return {'CANCELLED'} - dest_info[layer.name] = face_info + dest_info = impl.get_dest_face_info(self, bm, uv_layers, + props.src_info, 'N_N') + if dest_info is None: + return {'CANCELLED'} # paste - ret = paste_uv(self, bm, props.src_info, dest_info, uv_layers, - 'N_N', 0, 0, self.copy_seams) + ret = impl.paste_uv(self, bm, props.src_info, dest_info, uv_layers, + 'N_N', 0, 0, self.copy_seams) if ret: return {'CANCELLED'} bmesh.update_edit_mesh(obj.data) - if self.copy_seams is True: - obj.data.show_edge_seams = True self.report( {'INFO'}, "{}'s UV coordinates are pasted".format(obj.name)) @@ -266,7 +247,8 @@ class OperatorPasteUV(bpy.types.Operator): return {'FINISHED'} -class MenuPasteUV(bpy.types.Menu): +@BlClassRegistry() +class MUV_MT_CopyPasteUVObject_PasteUV(bpy.types.Menu): """ Menu class: Paste UV coordinate among objects """ @@ -289,22 +271,26 @@ class MenuPasteUV(bpy.types.Menu): # create sub menu uv_maps = [] for obj in bpy.data.objects: - if hasattr(obj.data, "uv_textures") and obj.select: - uv_maps.extend(obj.data.uv_textures.keys()) + if hasattr(obj.data, "uv_layers") and obj.select_get(): + uv_maps.extend(obj.data.uv_layers.keys()) - ops = layout.operator(OperatorPasteUV.bl_idname, text="[Default]") + ops = layout.operator(MUV_OT_CopyPasteUVObject_PasteUV.bl_idname, + text="[Default]") ops.uv_map = "__default" ops.copy_seams = sc.muv_copy_paste_uv_object_copy_seams - ops = layout.operator(OperatorPasteUV.bl_idname, text="[New]") + ops = layout.operator(MUV_OT_CopyPasteUVObject_PasteUV.bl_idname, + text="[New]") ops.uv_map = "__new" ops.copy_seams = sc.muv_copy_paste_uv_object_copy_seams - ops = layout.operator(OperatorPasteUV.bl_idname, text="[All]") + ops = layout.operator(MUV_OT_CopyPasteUVObject_PasteUV.bl_idname, + text="[All]") ops.uv_map = "__all" ops.copy_seams = sc.muv_copy_paste_uv_object_copy_seams for m in uv_maps: - ops = layout.operator(OperatorPasteUV.bl_idname, text=m) + ops = layout.operator(MUV_OT_CopyPasteUVObject_PasteUV.bl_idname, + text=m) ops.uv_map = m ops.copy_seams = sc.muv_copy_paste_uv_object_copy_seams |