[Bf-extensions-cvs] [5108c882] master: remove uv_align_distribute.py: author prefers external development
meta-androcto
noreply at git.blender.org
Tue May 16 12:16:17 CEST 2017
Commit: 5108c88216dfbf480f6c358272a5047a85df0577
Author: meta-androcto
Date: Tue May 16 20:15:58 2017 +1000
Branches: master
https://developer.blender.org/rBAC5108c88216dfbf480f6c358272a5047a85df0577
remove uv_align_distribute.py: author prefers external development
===================================================================
D uv_align_distribute.py
===================================================================
diff --git a/uv_align_distribute.py b/uv_align_distribute.py
deleted file mode 100644
index c0be13ed..00000000
--- a/uv_align_distribute.py
+++ /dev/null
@@ -1,1095 +0,0 @@
-# ##### 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; version 2
-# of the License.
-#
-# 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 #####
-
-bl_info = {
- "name": "UV Align/Distribute",
- "author": "Rebellion (Luca Carella)",
- "version": (1, 3),
- "blender": (2, 7, 3),
- "location": "UV/Image editor > Tool Panel, UV/Image editor UVs > menu",
- "description": "Set of tools to help UV alignment\distribution",
- "warning": "",
- "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/UV/UV_Align_Distribution",
- "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
- "category": "UV"}
-
-import math
-from collections import defaultdict
-
-import bmesh
-import bpy
-import mathutils
-from bpy.props import EnumProperty, BoolProperty, FloatProperty
-
-
-# Globals:
-bpy.types.Scene.relativeItems = EnumProperty(
- items=[
- ('UV_SPACE', 'Uv Space', 'Align to UV space'),
- ('ACTIVE', 'Active Face', 'Align to active face\island'),
- ('CURSOR', 'Cursor', 'Align to cursor')],
- name="Relative to")
-
-bpy.types.Scene.selectionAsGroup = BoolProperty(
- name="Selection as group",
- description="Treat selection as group",
- default=False)
-
-bm = None
-uvlayer = None
-
-
-def InitBMesh():
- global bm
- global uvlayer
- bm = bmesh.from_edit_mesh(bpy.context.edit_object.data)
- bm.faces.ensure_lookup_table()
- uvlayer = bm.loops.layers.uv.active
-
-
-def update():
- bmesh.update_edit_mesh(bpy.context.edit_object.data, False, False)
- # bm.to_mesh(bpy.context.object.data)
- # bm.free()
-
-
-def GBBox(islands):
- minX = minY = 1000
- maxX = maxY = -1000
- for island in islands:
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- u, v = loop[uvlayer].uv
- minX = min(u, minX)
- minY = min(v, minY)
- maxX = max(u, maxX)
- maxY = max(v, maxY)
-
- return mathutils.Vector((minX, minY)), mathutils.Vector((maxX, maxY))
-
-
-def GBBoxCenter(islands):
- minX = minY = 1000
- maxX = maxY = -1000
- for island in islands:
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- u, v = loop[uvlayer].uv
- minX = min(u, minX)
- minY = min(v, minY)
- maxX = max(u, maxX)
- maxY = max(v, maxY)
-
- return (mathutils.Vector((minX, minY)) +
- mathutils.Vector((maxX, maxY))) / 2
-
-
-def BBox(island):
- minX = minY = 1000
- maxX = maxY = -1000
- # for island in islands:
- # print(island)
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- u, v = loop[uvlayer].uv
- minX = min(u, minX)
- minY = min(v, minY)
- maxX = max(u, maxX)
- maxY = max(v, maxY)
-
- return mathutils.Vector((minX, minY)), mathutils.Vector((maxX, maxY))
-
-
-def BBoxCenter(island):
- minX = minY = 1000
- maxX = maxY = -1000
- # for island in islands:
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- u, v = loop[uvlayer].uv
- minX = min(u, minX)
- minY = min(v, minY)
- maxX = max(u, maxX)
- maxY = max(v, maxY)
-
- return (mathutils.Vector((minX, minY)) +
- mathutils.Vector((maxX, maxY))) / 2
-
-
-def islandAngle(island):
- uvList = []
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- uv = loop[bm.loops.layers.uv.active].uv
- uvList.append(uv)
-
- angle = math.degrees(mathutils.geometry.box_fit_2d(uvList))
- return angle
-
-
-def moveIslands(vector, island):
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- loop[bm.loops.layers.uv.active].uv += vector
-
-
-def rotateIsland(island, angle):
- rad = math.radians(angle)
- center = BBoxCenter(island)
-
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- uv_act = bm.loops.layers.uv.active
- x, y = loop[uv_act].uv
- xt = x - center.x
- yt = y - center.y
- xr = (xt * math.cos(rad)) - (yt * math.sin(rad))
- yr = (xt * math.sin(rad)) + (yt * math.cos(rad))
- # loop[bm.loops.layers.uv.active].uv = trans
- loop[bm.loops.layers.uv.active].uv.x = xr + center.x
- loop[bm.loops.layers.uv.active].uv.y = yr + center.y
- # print('fired')
-
-
-def scaleIsland(island, scaleX, scaleY):
- scale = mathutils.Vector((scaleX, scaleY))
- center = BBoxCenter(island)
-
- for face_id in island:
- face = bm.faces[face_id]
- for loop in face.loops:
- x = loop[bm.loops.layers.uv.active].uv.x
- y = loop[bm.loops.layers.uv.active].uv.y
- xt = x - center.x
- yt = y - center.y
- xs = xt * scaleX
- ys = yt * scaleY
- loop[bm.loops.layers.uv.active].uv.x = xs + center.x
- loop[bm.loops.layers.uv.active].uv.y = ys + center.y
-
-
-def vectorDistance(vector1, vector2):
- return math.sqrt(
- math.pow((vector2.x - vector1.x), 2) +
- math.pow((vector2.y - vector1.y), 2))
-
-
-def matchIsland(active, thresold, island):
- for active_face_id in active:
- active_face = bm.faces[active_face_id]
-
- for active_loop in active_face.loops:
- activeUVvert = active_loop[bm.loops.layers.uv.active].uv
-
- for face_id in island:
- face = bm.faces[face_id]
-
- for loop in face.loops:
- selectedUVvert = loop[bm.loops.layers.uv.active].uv
- dist = vectorDistance(selectedUVvert, activeUVvert)
-
- if dist <= thresold:
- loop[bm.loops.layers.uv.active].uv = activeUVvert
-
-
-def getTargetPoint(context, islands):
- if context.scene.relativeItems == 'UV_SPACE':
- return mathutils.Vector((0.0, 0.0)), mathutils.Vector((1.0, 1.0))
- elif context.scene.relativeItems == 'ACTIVE':
- activeIsland = islands.activeIsland()
- if not activeIsland:
- return None
- else:
- return BBox(activeIsland)
- elif context.scene.relativeItems == 'CURSOR':
- return context.space_data.cursor_location,\
- context.space_data.cursor_location
-
-
-def IslandSpatialSortX(islands):
- spatialSort = []
- for island in islands:
- spatialSort.append((BBoxCenter(island).x, island))
- spatialSort.sort()
- return spatialSort
-
-
-def IslandSpatialSortY(islands):
- spatialSort = []
- for island in islands:
- spatialSort.append((BBoxCenter(island).y, island))
- spatialSort.sort()
- return spatialSort
-
-
-def averageIslandDist(islands):
- distX = 0
- distY = 0
- counter = 0
-
- for i in range(len(islands)):
- elem1 = BBox(islands[i][1])[1]
- try:
- elem2 = BBox(islands[i + 1][1])[0]
- counter += 1
- except:
- break
-
- distX += elem2.x - elem1.x
- distY += elem2.y - elem1.y
-
- avgDistX = distX / counter
- avgDistY = distY / counter
- return mathutils.Vector((avgDistX, avgDistY))
-
-
-def islandSize(island):
- bbox = BBox(island)
- sizeX = bbox[1].x - bbox[0].x
- sizeY = bbox[1].y - bbox[0].y
-
- return sizeX, sizeY
-
-
-class MakeIslands():
-
- def __init__(self):
- InitBMesh()
- global bm
- global uvlayer
-
- self.face_to_verts = defaultdict(set)
- self.vert_to_faces = defaultdict(set)
- self.selectedIsland = set()
-
- for face in bm.faces:
- for loop in face.loops:
- id = loop[uvlayer].uv.to_tuple(5), loop.vert.index
- self.face_to_verts[face.index].add(id)
- self.vert_to_faces[id].add(face.index)
- if face.select:
- if loop[uvlayer].select:
- self.selectedIsland.add(face.index)
-
- def addToIsland(self, face_id):
- if face_id in self.faces_left:
- # add the face itself
- self.current_island.append(face_id)
- self.faces_left.remove(face_id)
- # and add all faces that share uvs with this face
- verts = self.face_to_verts[face_id]
- for vert in verts:
- # print('looking at vert {}'.format(vert))
- connected_faces = self.vert_to_faces[vert]
- if connected_faces:
- for face in connected_faces:
- self.addToIsland(face)
-
- def getIslands(self):
- self.islands = []
- self.faces_left = set(self.face_to_verts.keys())
- while len(self.faces_left) > 0:
- face_id = list(self.faces_left)[0]
- self.current_island = []
- self.addToIsland(face_id)
- self.islands.append(self.current_island)
-
- return self.islands
-
- def activeIsland(self):
- for island in self.islands:
- try:
- if bm.faces.active.index in island:
- return island
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list