[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