[Bf-extensions-cvs] [fdc914d6] master: Magic UV: Release v5.0

Nutti noreply at git.blender.org
Fri Feb 16 13:07:49 CET 2018


Commit: fdc914d653d4cf9e8c6ad5ea3d71fdefb9529491
Author: Nutti
Date:   Fri Feb 16 21:04:36 2018 +0900
Branches: master
https://developer.blender.org/rBAfdc914d653d4cf9e8c6ad5ea3d71fdefb9529491

Magic UV: Release v5.0

* Add features
  - Align UV Cursor
  - UV Cursor Location
  - Align UV
  - Smooth UV
  - UV Inspection
  - Select UV
  - Texture Wrap
  - UV Sculpt
* Improve features
  - Copy/Paste UV: Add menu to UV/Image Editor
  - World Scale UV: Add information about Texel Density
  - UV Bounding Box: Add option "Bound"
  - Texture Projection: Add option "Assign UVMap"
  - UVW: Add option "Assign UVMap"
* Improve UI
* Fixed bugs
* Optimization/Refactoring

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

M	uv_magic_uv/__init__.py
A	uv_magic_uv/common.py
D	uv_magic_uv/muv_common.py
D	uv_magic_uv/muv_cpuv_selseq_ops.py
D	uv_magic_uv/muv_menu.py
D	uv_magic_uv/muv_preferences.py
D	uv_magic_uv/muv_props.py
A	uv_magic_uv/op/__init__.py
A	uv_magic_uv/op/align_uv.py
A	uv_magic_uv/op/align_uv_cursor.py
R050	uv_magic_uv/muv_cpuv_ops.py	uv_magic_uv/op/copy_paste_uv.py
A	uv_magic_uv/op/copy_paste_uv_object.py
A	uv_magic_uv/op/copy_paste_uv_uvedit.py
R097	uv_magic_uv/muv_fliprot_ops.py	uv_magic_uv/op/flip_rotate_uv.py
R097	uv_magic_uv/muv_mirroruv_ops.py	uv_magic_uv/op/mirror_uv.py
R094	uv_magic_uv/muv_mvuv_ops.py	uv_magic_uv/op/move_uv.py
R069	uv_magic_uv/muv_packuv_ops.py	uv_magic_uv/op/pack_uv.py
R092	uv_magic_uv/muv_preserve_uv_aspect.py	uv_magic_uv/op/preserve_uv_aspect.py
A	uv_magic_uv/op/smooth_uv.py
R096	uv_magic_uv/muv_texlock_ops.py	uv_magic_uv/op/texture_lock.py
R080	uv_magic_uv/muv_texproj_ops.py	uv_magic_uv/op/texture_projection.py
A	uv_magic_uv/op/texture_wrap.py
R097	uv_magic_uv/muv_transuv_ops.py	uv_magic_uv/op/transfer_uv.py
R094	uv_magic_uv/muv_unwrapconst_ops.py	uv_magic_uv/op/unwrap_constraint.py
R094	uv_magic_uv/muv_uvbb_ops.py	uv_magic_uv/op/uv_bounding_box.py
A	uv_magic_uv/op/uv_inspection.py
A	uv_magic_uv/op/uv_sculpt.py
R086	uv_magic_uv/muv_uvw_ops.py	uv_magic_uv/op/uvw.py
R070	uv_magic_uv/muv_wsuv_ops.py	uv_magic_uv/op/world_scale_uv.py
A	uv_magic_uv/preferences.py
A	uv_magic_uv/properites.py
A	uv_magic_uv/ui/__init__.py
A	uv_magic_uv/ui/uvedit_copy_paste_uv.py
A	uv_magic_uv/ui/uvedit_editor_enhance.py
A	uv_magic_uv/ui/uvedit_uv_manipulation.py
A	uv_magic_uv/ui/view3d_copy_paste_uv_editmode.py
A	uv_magic_uv/ui/view3d_copy_paste_uv_objectmode.py
A	uv_magic_uv/ui/view3d_uv_manipulation.py
A	uv_magic_uv/ui/view3d_uv_mapping.py

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

diff --git a/uv_magic_uv/__init__.py b/uv_magic_uv/__init__.py
index 171a5ac4..97f8bb79 100644
--- a/uv_magic_uv/__init__.py
+++ b/uv_magic_uv/__init__.py
@@ -20,18 +20,18 @@
 
 __author__ = "Nutti <nutti.metro at gmail.com>"
 __status__ = "production"
-__version__ = "4.5"
-__date__ = "19 Nov 2017"
+__version__ = "5.0"
+__date__ = "16 Feb 2018"
 
 
 bl_info = {
     "name": "Magic UV",
-    "author": "Nutti, Mifth, Jace Priester, kgeogeo, mem, "
+    "author": "Nutti, Mifth, Jace Priester, kgeogeo, mem, imdjs"
               "Keith (Wahooney) Boshoff, McBuff, MaxRobinot, Alexander Milovsky",
-    "version": (4, 5, 0),
+    "version": (5, 0, 0),
     "blender": (2, 79, 0),
     "location": "See Add-ons Preferences",
-    "description": "UV Manipulator Tools. See Add-ons Preferences for details",
+    "description": "UV Toolset. See Add-ons Preferences for details",
     "warning": "",
     "support": "COMMUNITY",
     "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/"
@@ -42,98 +42,29 @@ bl_info = {
 
 if "bpy" in locals():
     import importlib
-    importlib.reload(muv_preferences)
-    importlib.reload(muv_menu)
-    importlib.reload(muv_common)
-    importlib.reload(muv_props)
-    importlib.reload(muv_cpuv_ops)
-    importlib.reload(muv_cpuv_selseq_ops)
-    importlib.reload(muv_fliprot_ops)
-    importlib.reload(muv_transuv_ops)
-    importlib.reload(muv_uvbb_ops)
-    importlib.reload(muv_mvuv_ops)
-    importlib.reload(muv_texproj_ops)
-    importlib.reload(muv_packuv_ops)
-    importlib.reload(muv_texlock_ops)
-    importlib.reload(muv_mirroruv_ops)
-    importlib.reload(muv_wsuv_ops)
-    importlib.reload(muv_unwrapconst_ops)
-    importlib.reload(muv_preserve_uv_aspect)
-    importlib.reload(muv_uvw_ops)
+    importlib.reload(op)
+    importlib.reload(ui)
+    importlib.reload(common)
+    importlib.reload(preferences)
+    importlib.reload(properites)
 else:
-    from . import muv_preferences
-    from . import muv_menu
-    from . import muv_common
-    from . import muv_props
-    from . import muv_cpuv_ops
-    from . import muv_cpuv_selseq_ops
-    from . import muv_fliprot_ops
-    from . import muv_transuv_ops
-    from . import muv_uvbb_ops
-    from . import muv_mvuv_ops
-    from . import muv_texproj_ops
-    from . import muv_packuv_ops
-    from . import muv_texlock_ops
-    from . import muv_mirroruv_ops
-    from . import muv_wsuv_ops
-    from . import muv_unwrapconst_ops
-    from . import muv_preserve_uv_aspect
-    from . import muv_uvw_ops
+    from . import op
+    from . import ui
+    from . import common
+    from . import preferences
+    from . import properites
 
 import bpy
 
 
-def view3d_uvmap_menu_fn(self, context):
-    self.layout.separator()
-    self.layout.menu(muv_menu.MUV_CPUVMenu.bl_idname, icon="IMAGE_COL")
-    self.layout.operator(
-        muv_fliprot_ops.MUV_FlipRot.bl_idname, icon="IMAGE_COL")
-    self.layout.menu(muv_menu.MUV_TransUVMenu.bl_idname, icon="IMAGE_COL")
-    self.layout.operator(muv_mvuv_ops.MUV_MVUV.bl_idname, icon="IMAGE_COL")
-    self.layout.menu(muv_menu.MUV_TexLockMenu.bl_idname, icon="IMAGE_COL")
-    self.layout.operator(
-        muv_mirroruv_ops.MUV_MirrorUV.bl_idname, icon="IMAGE_COL")
-    self.layout.menu(muv_menu.MUV_WSUVMenu.bl_idname, icon="IMAGE_COL")
-    self.layout.operator(
-        muv_unwrapconst_ops.MUV_UnwrapConstraint.bl_idname, icon='IMAGE_COL')
-    self.layout.menu(
-        muv_preserve_uv_aspect.MUV_PreserveUVAspectMenu.bl_idname,
-        icon='IMAGE_COL')
-    self.layout.menu(muv_menu.MUV_UVWMenu.bl_idname, icon="IMAGE_COL")
-
-
-def image_uvs_menu_fn(self, context):
-    self.layout.separator()
-    self.layout.operator(muv_packuv_ops.MUV_PackUV.bl_idname, icon="IMAGE_COL")
-
-
-def view3d_object_menu_fn(self, context):
-    self.layout.separator()
-    self.layout.menu(muv_menu.MUV_CPUVObjMenu.bl_idname, icon="IMAGE_COL")
-
-
 def register():
     bpy.utils.register_module(__name__)
-    bpy.types.VIEW3D_MT_uv_map.append(view3d_uvmap_menu_fn)
-    bpy.types.IMAGE_MT_uvs.append(image_uvs_menu_fn)
-    bpy.types.VIEW3D_MT_object.append(view3d_object_menu_fn)
-    try:
-        bpy.types.VIEW3D_MT_Object.append(view3d_object_menu_fn)
-    except:
-        pass
-    muv_props.init_props(bpy.types.Scene)
+    properites.init_props(bpy.types.Scene)
 
 
 def unregister():
     bpy.utils.unregister_module(__name__)
-    bpy.types.VIEW3D_MT_uv_map.remove(view3d_uvmap_menu_fn)
-    bpy.types.IMAGE_MT_uvs.remove(image_uvs_menu_fn)
-    bpy.types.VIEW3D_MT_object.remove(view3d_object_menu_fn)
-    try:
-        bpy.types.VIEW3D_MT_Object.remove(view3d_object_menu_fn)
-    except:
-        pass
-    muv_props.clear_props(bpy.types.Scene)
+    properites.clear_props(bpy.types.Scene)
 
 
 if __name__ == "__main__":
diff --git a/uv_magic_uv/common.py b/uv_magic_uv/common.py
new file mode 100644
index 00000000..dc8876a0
--- /dev/null
+++ b/uv_magic_uv/common.py
@@ -0,0 +1,592 @@
+# <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__ = "Nutti <nutti.metro at gmail.com>"
+__status__ = "production"
+__version__ = "5.0"
+__date__ = "16 Feb 2018"
+
+from collections import defaultdict
+from pprint import pprint
+from math import fabs, sqrt
+
+import bpy
+from mathutils import Vector
+import bmesh
+
+
+DEBUG = False
+
+
+def debug_print(*s):
+    """
+    Print message to console in debugging mode
+    """
+
+    if DEBUG:
+        pprint(s)
+
+
+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
+
+
+def redraw_all_areas():
+    """
+    Redraw all areas
+    """
+
+    for area in bpy.context.screen.areas:
+        area.tag_redraw()
+
+
+def get_space(area_type, region_type, space_type):
+    """
+    Get current area/region/space
+    """
+
+    area = None
+    region = None
+    space = None
+
+    for area in bpy.context.screen.areas:
+        if area.type == area_type:
+            break
+    else:
+        return (None, None, None)
+    for region in area.regions:
+        if region.type == region_type:
+            break
+    for space in area.spaces:
+        if space.type == space_type:
+            break
+
+    return (area, region, space)
+
+
+def __get_island_info(uv_layer, islands):
+    """
+    get information about each island
+    """
+
+    island_info = []
+    for isl in islands:
+        info = {}
+        max_uv = Vector((-10000000.0, -10000000.0))
+        min_uv = Vector((10000000.0, 10000000.0))
+        ave_uv = Vector((0.0, 0.0))
+        num_uv = 0
+        for face in isl:
+            n = 0
+            a = Vector((0.0, 0.0))
+            ma = Vector((-10000000.0, -10000000.0))
+            mi = Vector((10000000.0, 10000000.0))
+            for l in face['face'].loops:
+                uv = l[uv_layer].uv
+                ma.x = max(uv.x, ma.x)
+                ma.y = max(uv.y, ma.y)
+                mi.x = min(uv.x, mi.x)
+                mi.y = min(uv.y, mi.y)
+                a = a + uv
+                n = n + 1
+            ave_uv = ave_uv + a
+            num_uv = num_uv + n
+            a = a / n
+            max_uv.x = max(ma.x, max_uv.x)
+            max_uv.y = max(ma.y, max_uv.y)
+            min_uv.x = min(mi.x, min_uv.x)
+            min_uv.y = min(mi.y, min_uv.y)
+            face['max_uv'] = ma
+            face['min_uv'] = mi
+            face['ave_uv'] = a
+        ave_uv = ave_uv / num_uv
+
+        info['center'] = ave_uv
+        info['size'] = max_uv - min_uv
+        info['num_uv'] = num_uv
+        info['group'] = -1
+        info['faces'] = isl
+        info['max'] = max_uv
+        info['min'] = min_uv
+
+        island_info.append(info)
+
+    return island_info
+
+
+def __parse_island(bm, face_idx, faces_left, island,
+                   face_to_verts, vert_to_faces):
+    """
+    Parse island
+    """
+
+    if face_idx in faces_left:
+        faces_left.remove(face_idx)
+        island.append({'face': bm.faces[face_idx]})
+        for v in face_to_verts[face_idx]:
+            connected_faces = vert_to_faces[v]
+            if connected_faces:
+                for cf in connected_faces:
+                    __parse_island(bm, cf, faces_left, island, face_to_verts,
+                                   vert_to_faces)
+
+
+def __get_island(bm, face_to_verts, vert_to_faces):
+    """
+    Get island list
+    """
+
+    uv_island_lists = []
+    faces_left = set(face_to_verts.keys())
+    while faces_left:
+        current_island = []
+        face_idx = list(faces_left)[0]
+        __parse_island(bm, face_idx, faces_left, current_island,
+                       face_to_verts, vert_to_faces)
+        uv_island_lists.append(current_island)
+
+    return uv_island_lists
+
+
+def __create_vert_face_db(faces, uv_layer):
+    # create mesh database for all faces
+    face_to_verts = defaultdict(set)
+    vert_to_faces = defaultdict(set)
+    for f in faces:
+        for l in f.loops:
+            id_ = l[uv_layer].uv.to_tuple(5), l.vert.index
+            face_to_verts[f.index].add(id_)
+            vert_to_faces[id_].add(f.index)
+
+    return (face_to_verts, vert_to_faces)
+
+
+def get_island_info(obj, only_selected=True):
+    bm = bmesh.from_edit_mesh(obj.data)
+    if check_version(2,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list