[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