[Bf-extensions-cvs] [fe5e51dd] master: Magic UV: Phase 1 for porting to Blender 2.8

Nutti noreply at git.blender.org
Thu Dec 13 14:59:16 CET 2018


Commit: fe5e51ddcd0bcd1f87428cb3c6098fc66f6962f1
Author: Nutti
Date:   Thu Dec 13 22:57:08 2018 +0900
Branches: master
https://developer.blender.org/rBAfe5e51ddcd0bcd1f87428cb3c6098fc66f6962f1

Magic UV: Phase 1 for porting to Blender 2.8

Below features are available for now.

* Copy/Paste UV
* Transfer UV
* Flip/Rotate UV
* Mirror UV
* Move UV
* UVW

Also, Magic UV remains to work at Blender 2.7x by the legacy code.

===================================================================

M	uv_magic_uv/__init__.py
M	uv_magic_uv/common.py
A	uv_magic_uv/impl/__init__.py
A	uv_magic_uv/impl/copy_paste_uv_impl.py
A	uv_magic_uv/impl/copy_paste_uv_uvedit_impl.py
A	uv_magic_uv/impl/flip_rotate_impl.py
A	uv_magic_uv/impl/mirror_uv_impl.py
A	uv_magic_uv/impl/move_uv_impl.py
A	uv_magic_uv/impl/transfer_uv_impl.py
A	uv_magic_uv/impl/uvw_impl.py
A	uv_magic_uv/legacy/__init__.py
A	uv_magic_uv/legacy/op/__init__.py
R098	uv_magic_uv/op/align_uv.py	uv_magic_uv/legacy/op/align_uv.py
R096	uv_magic_uv/op/align_uv_cursor.py	uv_magic_uv/legacy/op/align_uv_cursor.py
A	uv_magic_uv/legacy/op/copy_paste_uv.py
A	uv_magic_uv/legacy/op/copy_paste_uv_object.py
A	uv_magic_uv/legacy/op/copy_paste_uv_uvedit.py
A	uv_magic_uv/legacy/op/flip_rotate_uv.py
A	uv_magic_uv/legacy/op/mirror_uv.py
A	uv_magic_uv/legacy/op/move_uv.py
R096	uv_magic_uv/op/pack_uv.py	uv_magic_uv/legacy/op/pack_uv.py
R096	uv_magic_uv/op/preserve_uv_aspect.py	uv_magic_uv/legacy/op/preserve_uv_aspect.py
R090	uv_magic_uv/op/select_uv.py	uv_magic_uv/legacy/op/select_uv.py
R096	uv_magic_uv/op/smooth_uv.py	uv_magic_uv/legacy/op/smooth_uv.py
R093	uv_magic_uv/op/texture_lock.py	uv_magic_uv/legacy/op/texture_lock.py
R093	uv_magic_uv/op/texture_projection.py	uv_magic_uv/legacy/op/texture_projection.py
R095	uv_magic_uv/op/texture_wrap.py	uv_magic_uv/legacy/op/texture_wrap.py
A	uv_magic_uv/legacy/op/transfer_uv.py
R094	uv_magic_uv/op/unwrap_constraint.py	uv_magic_uv/legacy/op/unwrap_constraint.py
R097	uv_magic_uv/op/uv_bounding_box.py	uv_magic_uv/legacy/op/uv_bounding_box.py
R089	uv_magic_uv/op/uv_inspection.py	uv_magic_uv/legacy/op/uv_inspection.py
R096	uv_magic_uv/op/uv_sculpt.py	uv_magic_uv/legacy/op/uv_sculpt.py
A	uv_magic_uv/legacy/op/uvw.py
R096	uv_magic_uv/op/world_scale_uv.py	uv_magic_uv/legacy/op/world_scale_uv.py
A	uv_magic_uv/legacy/preferences.py
A	uv_magic_uv/legacy/properites.py
A	uv_magic_uv/legacy/ui/IMAGE_MT_uvs.py
A	uv_magic_uv/legacy/ui/VIEW3D_MT_object.py
A	uv_magic_uv/legacy/ui/VIEW3D_MT_uv_map.py
A	uv_magic_uv/legacy/ui/__init__.py
A	uv_magic_uv/legacy/ui/uvedit_copy_paste_uv.py
R070	uv_magic_uv/ui/uvedit_editor_enhancement.py	uv_magic_uv/legacy/ui/uvedit_editor_enhancement.py
R084	uv_magic_uv/ui/uvedit_uv_manipulation.py	uv_magic_uv/legacy/ui/uvedit_uv_manipulation.py
A	uv_magic_uv/legacy/ui/view3d_copy_paste_uv_editmode.py
A	uv_magic_uv/legacy/ui/view3d_copy_paste_uv_objectmode.py
A	uv_magic_uv/legacy/ui/view3d_uv_manipulation.py
A	uv_magic_uv/legacy/ui/view3d_uv_mapping.py
M	uv_magic_uv/op/__init__.py
M	uv_magic_uv/op/copy_paste_uv.py
M	uv_magic_uv/op/copy_paste_uv_object.py
M	uv_magic_uv/op/copy_paste_uv_uvedit.py
M	uv_magic_uv/op/flip_rotate_uv.py
M	uv_magic_uv/op/mirror_uv.py
M	uv_magic_uv/op/move_uv.py
M	uv_magic_uv/op/transfer_uv.py
M	uv_magic_uv/op/uvw.py
M	uv_magic_uv/preferences.py
M	uv_magic_uv/properites.py
M	uv_magic_uv/ui/IMAGE_MT_uvs.py
M	uv_magic_uv/ui/VIEW3D_MT_object.py
M	uv_magic_uv/ui/VIEW3D_MT_uv_map.py
M	uv_magic_uv/ui/__init__.py
M	uv_magic_uv/ui/uvedit_copy_paste_uv.py
M	uv_magic_uv/ui/view3d_copy_paste_uv_editmode.py
M	uv_magic_uv/ui/view3d_copy_paste_uv_objectmode.py
M	uv_magic_uv/ui/view3d_uv_manipulation.py
M	uv_magic_uv/ui/view3d_uv_mapping.py
A	uv_magic_uv/utils/__init__.py
A	uv_magic_uv/utils/bl_class_registry.py
A	uv_magic_uv/utils/property_class_registry.py

===================================================================

diff --git a/uv_magic_uv/__init__.py b/uv_magic_uv/__init__.py
index 20709e79..63591526 100644
--- a/uv_magic_uv/__init__.py
+++ b/uv_magic_uv/__init__.py
@@ -28,8 +28,8 @@ bl_info = {
     "name": "Magic UV",
     "author": "Nutti, Mifth, Jace Priester, kgeogeo, mem, imdjs"
               "Keith (Wahooney) Boshoff, McBuff, MaxRobinot, Alexander Milovsky",
-    "version": (5, 2, 0),
-    "blender": (2, 79, 0),
+    "version": (5, 3, 0),
+    "blender": (2, 80, 0),
     "location": "See Add-ons Preferences",
     "description": "UV Toolset. See Add-ons Preferences for details",
     "warning": "",
@@ -40,43 +40,80 @@ bl_info = {
     "category": "UV"
 }
 
+def check_version(major, minor, _):
+    """
+    Check blender version
+    """
+
+    if bpy.app.version[0] == major and bpy.app.version[1] == minor:
+        return 0
+    if bpy.app.version[0] > major:
+        return 1
+    if bpy.app.version[1] > minor:
+        return 1
+    return -1
+
+
 if "bpy" in locals():
     import importlib
-    importlib.reload(op)
-    importlib.reload(ui)
     importlib.reload(common)
-    importlib.reload(preferences)
-    importlib.reload(properites)
-    importlib.reload(addon_updater_ops)
-    importlib.reload(addon_updater)
+    importlib.reload(utils)
+    utils.bl_class_registry.BlClassRegistry.cleanup()
+    if check_version(2, 80, 0) >= 0:
+        importlib.reload(op)
+        importlib.reload(ui)
+        importlib.reload(properites)
+        importlib.reload(preferences)
+        importlib.reload(addon_updater_ops)
+        importlib.reload(addon_updater)
+    else:
+        importlib.reload(legacy)
 else:
-    from . import op
-    from . import ui
+    import bpy
     from . import common
-    from . import preferences
-    from . import properites
-    from . import addon_updater_ops
-    from . import addon_updater
+    from . import utils
+    if check_version(2, 80, 0) >= 0:
+        from . import op
+        from . import ui
+        from . import properites
+        from . import preferences
+        from . import addon_updater_ops
+        from . import addon_updater
+    else:
+        from . import legacy
+
 
 import bpy
 
 
 def register():
-    if not common.is_console_mode():
-        addon_updater_ops.register(bl_info)
-    properites.init_props(bpy.types.Scene)
-    bpy.utils.register_module(__name__)
-    if preferences.Preferences.enable_builtin_menu:
-        preferences.add_builtin_menu()
+    if common.check_version(2, 80, 0) >= 0:
+        utils.bl_class_registry.BlClassRegistry.register()
+        properites.init_props(bpy.types.Scene)
+        if preferences.Preferences.enable_builtin_menu:
+            preferences.add_builtin_menu()
+    else:
+        utils.bl_class_registry.BlClassRegistry.register()
+        legacy.properites.init_props(bpy.types.Scene)
+        if legacy.preferences.Preferences.enable_builtin_menu:
+            legacy.preferences.add_builtin_menu()
+        if not common.is_console_mode():
+            addon_updater_ops.register(bl_info)
 
 
 def unregister():
-    if preferences.Preferences.enable_builtin_menu:
-        preferences.remove_builtin_menu()
-    bpy.utils.unregister_module(__name__)
-    properites.clear_props(bpy.types.Scene)
-    if not common.is_console_mode():
-        addon_updater_ops.unregister()
+    if common.check_version(2, 80, 0) >= 0:
+        if preferences.Preferences.enable_builtin_menu:
+            preferences.remove_builtin_menu()
+        properites.clear_props(bpy.types.Scene)
+        utils.bl_class_registry.BlClassRegistry.unregister()
+    else:
+        if not common.is_console_mode():
+            addon_updater_ops.unregister()
+        if legacy.preferences.Preferences.enable_builtin_menu:
+            legacy.preferences.remove_builtin_menu()
+        legacy.properites.clear_props(bpy.types.Scene)
+        utils.bl_class_registry.BlClassRegistry.unregister()
 
 
 if __name__ == "__main__":
diff --git a/uv_magic_uv/common.py b/uv_magic_uv/common.py
index b0c4306e..bad88167 100644
--- a/uv_magic_uv/common.py
+++ b/uv_magic_uv/common.py
@@ -35,10 +35,16 @@ import bmesh
 
 __all__ = [
     'is_console_mode',
+    'is_debug_mode',
+    'enable_debugg_mode',
+    'disable_debug_mode',
     'debug_print',
     'check_version',
     'redraw_all_areas',
     'get_space',
+    'mouse_on_region',
+    'mouse_on_area',
+    'mouse_on_regions',
     'create_bmesh',
     'create_new_uv_map',
     'get_island_info',
@@ -51,10 +57,12 @@ __all__ = [
     'measure_uv_area',
     'diff_point_to_segment',
     'get_loop_sequences',
+    'get_overlapped_uv_info',
+    'get_flipped_uv_info',
 ]
 
 
-__DEBUG_MODE = False
+__DEBUG_MODE = True
 
 
 def is_console_mode():
diff --git a/uv_magic_uv/impl/__init__.py b/uv_magic_uv/impl/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/uv_magic_uv/impl/copy_paste_uv_impl.py b/uv_magic_uv/impl/copy_paste_uv_impl.py
new file mode 100644
index 00000000..ed44637b
--- /dev/null
+++ b/uv_magic_uv/impl/copy_paste_uv_impl.py
@@ -0,0 +1,271 @@
+# <pep8-80 compliant>
+
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+__author__ = "imdjs, Nutti <nutti.metro at gmail.com>"
+__status__ = "production"
+__version__ = "5.2"
+__date__ = "17 Nov 2018"
+
+
+import bmesh
+
+from .. import common
+
+
+__all__ = [
+    'is_valid_context',
+    'get_copy_uv_layers',
+    'get_paste_uv_layers',
+    'get_src_face_info',
+    'get_dest_face_info',
+    'get_select_history_src_face_info',
+    'get_select_history_dest_face_info',
+    'paste_uv',
+]
+
+
+def is_valid_context(context):
+    obj = context.object
+
+    # only edit mode is allowed to execute
+    if obj is None:
+        return False
+    if obj.type != 'MESH':
+        return False
+    if context.object.mode != 'EDIT':
+        return False
+
+    # only 'VIEW_3D' space is allowed to execute
+    for space in context.area.spaces:
+        if space.type == 'VIEW_3D':
+            break
+    else:
+        return False
+
+    return True
+
+
+def get_copy_uv_layers(ops_obj, bm, uv_map):
+    uv_layers = []
+    if uv_map == "__default":
+        if not bm.loops.layers.uv:
+            ops_obj.report(
+                {'WARNING'}, "Object must have more than one UV map")
+            return None
+        uv_layers.append(bm.loops.layers.uv.verify())
+        ops_obj.report({'INFO'}, "Copy UV coordinate")
+    elif uv_map == "__all":
+        for uv in bm.loops.layers.uv.keys():
+            uv_layers.append(bm.loops.layers.uv[uv])
+        ops_obj.report({'INFO'}, "Copy UV coordinate (UV map: ALL)")
+    else:
+        uv_layers.append(bm.loops.layers.uv[uv_map])
+        ops_obj.report(
+            {'INFO'}, "Copy UV coordinate (UV map:{})".format(uv_map))
+
+    return uv_layers
+
+
+def get_paste_uv_layers(ops_obj, obj, bm, src_info, uv_map):
+    uv_layers = []
+    if uv_map == "__default":
+        if not bm.loops.layers.uv:
+            ops_obj.report(
+                {'WARNING'}, "Object must have more than one UV map")
+            return None
+        uv_layers.append(bm.loops.layers.uv.verify())
+        ops_obj.report({'INFO'}, "Paste UV coordinate")
+    elif uv_map == "__new":
+        new_uv_map = common.create_new_uv_map(obj)
+        if not new_uv_map:
+            ops_obj.report({'WARNING'},
+                           "Reached to the maximum number of UV map")
+            return None
+        uv_layers.append(bm.loops.layers.uv[new_uv_map.name])
+        ops_obj.report(
+            {'INFO'}, "Paste UV coordinate (UV map:{})".format(new_uv_map))
+    elif uv_map == "__all":
+        for src_layer in src_info.keys():
+            if src_layer not in bm.loops.layers.uv.keys():
+                new_uv_map = common.create_new_uv_map(obj, src_layer)
+                if not new_uv_map:
+                    ops_obj.report({'WARNING'},
+                                   "Reached to the maximum number of UV map")
+                    return None
+            uv_layers.append(bm.loops.layers.uv[src_layer])
+        ops_obj.report({'INFO'}, "Paste UV coordinate (UV map: ALL)")
+    else:
+        uv_layers.append(bm.loops.layers.uv[uv_map])
+        ops_obj.report(
+            {'INFO'}, "Paste UV coordinate (UV map:{})".format(uv_map))
+
+    return uv_layers
+
+
+def get_src_face_info(ops_obj, bm, uv_layers, only_select=False):
+    src_info = {}
+    for layer in uv_layers:
+        face_info = []
+        for face in bm.faces:
+            if not only_select or face.select:
+                info = {
+                    "index": face.index,
+                    "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)
+        if not face_info:
+            ops_obj.report({'WARNING'}, "No faces are selected")
+            return None
+        src_info[layer.name] = face_info
+
+    return src_info
+
+
+def get_dest_face_info(ops_obj, bm, uv_layers, src_info, strategy,
+                       only_select=False):
+    dest_info = {}
+    for layer in uv_layers:
+        face_info = []
+        for face in bm.faces:
+            if not only_select or face.select:
+                info = {
+                    "index": face.index,
+                    "uvs": [l[layer].uv.copy() for l in face.loops],
+                }
+                face_in

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list