Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'uv_magic_uv/legacy/op/preserve_uv_aspect.py')
-rw-r--r--uv_magic_uv/legacy/op/preserve_uv_aspect.py171
1 files changed, 6 insertions, 165 deletions
diff --git a/uv_magic_uv/legacy/op/preserve_uv_aspect.py b/uv_magic_uv/legacy/op/preserve_uv_aspect.py
index cf9349bc..c6693e9a 100644
--- a/uv_magic_uv/legacy/op/preserve_uv_aspect.py
+++ b/uv_magic_uv/legacy/op/preserve_uv_aspect.py
@@ -24,13 +24,11 @@ __version__ = "5.2"
__date__ = "17 Nov 2018"
import bpy
-import bmesh
from bpy.props import StringProperty, EnumProperty, BoolProperty
-from mathutils import Vector
-from ... import common
from ...utils.bl_class_registry import BlClassRegistry
from ...utils.property_class_registry import PropertyClassRegistry
+from ...impl import preserve_uv_aspect_impl as impl
__all__ = [
@@ -39,27 +37,6 @@ __all__ = [
]
-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
-
-
@PropertyClassRegistry(legacy=True)
class Properties:
idname = "preserve_uv_aspect"
@@ -136,148 +113,12 @@ class MUV_OT_PreserveUVAspect(bpy.types.Operator):
default="CENTER"
)
+ def __init__(self):
+ self.__impl = impl.PreserveUVAspectLegacyImpl()
+
@classmethod
def poll(cls, context):
- # we can not get area/space/region from console
- if common.is_console_mode():
- return True
- return is_valid_context(context)
+ return impl.PreserveUVAspectLegacyImpl.poll(context)
def execute(self, context):
- # Note: the current system only works if the
- # f[tex_layer].image doesn't return None
- # which will happen in certain cases
- obj = context.active_object
- bm = bmesh.from_edit_mesh(obj.data)
-
- if common.check_version(2, 73, 0) >= 0:
- bm.faces.ensure_lookup_table()
-
- if not bm.loops.layers.uv:
- self.report({'WARNING'}, "Object must have more than one UV map")
- return {'CANCELLED'}
-
- uv_layer = bm.loops.layers.uv.verify()
- tex_layer = bm.faces.layers.tex.verify()
-
- sel_faces = [f for f in bm.faces if f.select]
- dest_img = bpy.data.images[self.dest_img_name]
-
- info = {}
-
- for f in sel_faces:
- if not f[tex_layer].image in info.keys():
- info[f[tex_layer].image] = {}
- info[f[tex_layer].image]['faces'] = []
- info[f[tex_layer].image]['faces'].append(f)
-
- for img in info:
- if img is None:
- continue
-
- src_img = img
- ratio = Vector((
- dest_img.size[0] / src_img.size[0],
- dest_img.size[1] / src_img.size[1]))
-
- if self.origin == 'CENTER':
- origin = Vector((0.0, 0.0))
- num = 0
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin = origin + uv
- num = num + 1
- origin = origin / num
- elif self.origin == 'LEFT_TOP':
- origin = Vector((100000.0, -100000.0))
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = min(origin.x, uv.x)
- origin.y = max(origin.y, uv.y)
- elif self.origin == 'LEFT_CENTER':
- origin = Vector((100000.0, 0.0))
- num = 0
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = min(origin.x, uv.x)
- origin.y = origin.y + uv.y
- num = num + 1
- origin.y = origin.y / num
- elif self.origin == 'LEFT_BOTTOM':
- origin = Vector((100000.0, 100000.0))
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = min(origin.x, uv.x)
- origin.y = min(origin.y, uv.y)
- elif self.origin == 'CENTER_TOP':
- origin = Vector((0.0, -100000.0))
- num = 0
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = origin.x + uv.x
- origin.y = max(origin.y, uv.y)
- num = num + 1
- origin.x = origin.x / num
- elif self.origin == 'CENTER_BOTTOM':
- origin = Vector((0.0, 100000.0))
- num = 0
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = origin.x + uv.x
- origin.y = min(origin.y, uv.y)
- num = num + 1
- origin.x = origin.x / num
- elif self.origin == 'RIGHT_TOP':
- origin = Vector((-100000.0, -100000.0))
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = max(origin.x, uv.x)
- origin.y = max(origin.y, uv.y)
- elif self.origin == 'RIGHT_CENTER':
- origin = Vector((-100000.0, 0.0))
- num = 0
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = max(origin.x, uv.x)
- origin.y = origin.y + uv.y
- num = num + 1
- origin.y = origin.y / num
- elif self.origin == 'RIGHT_BOTTOM':
- origin = Vector((-100000.0, 100000.0))
- for f in info[img]['faces']:
- for l in f.loops:
- uv = l[uv_layer].uv
- origin.x = max(origin.x, uv.x)
- origin.y = min(origin.y, uv.y)
-
- info[img]['ratio'] = ratio
- info[img]['origin'] = origin
-
- for img in info:
- if img is None:
- continue
-
- for f in info[img]['faces']:
- f[tex_layer].image = dest_img
- for l in f.loops:
- uv = l[uv_layer].uv
- origin = info[img]['origin']
- ratio = info[img]['ratio']
- diff = uv - origin
- diff.x = diff.x / ratio.x
- diff.y = diff.y / ratio.y
- uv.x = origin.x + diff.x
- uv.y = origin.y + diff.y
- l[uv_layer].uv = uv
-
- bmesh.update_edit_mesh(obj.data)
-
- return {'FINISHED'}
+ return self.__impl.execute(self, context)