[Bf-extensions-cvs] [0f24049] master: Align Tools: T48299 add advanced operator

meta-androcto noreply at git.blender.org
Fri Apr 29 05:35:42 CEST 2016


Commit: 0f24049ead51a3280b132f03bc6bd1ce5b728641
Author: meta-androcto
Date:   Fri Apr 29 13:35:16 2016 +1000
Branches: master
https://developer.blender.org/rBAC0f24049ead51a3280b132f03bc6bd1ce5b728641

Align Tools: T48299 add advanced operator

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

A	space_view3d_align_tools.py
D	space_view3d_simple_align.py

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

diff --git a/space_view3d_align_tools.py b/space_view3d_align_tools.py
new file mode 100644
index 0000000..665265d
--- /dev/null
+++ b/space_view3d_align_tools.py
@@ -0,0 +1,975 @@
+# -*- coding: utf-8 -*-
+# ##### 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 #####
+# Contributed to by gabhead, Lell, Anfeo, meta-androcto
+
+bl_info = {
+    "name": "Align Tools",
+    "author": "gabhead, Lell, Anfeo",
+    "version": (0, 3, 0),
+    "blender": (2, 77, 0),
+    "location": "View3D > Tool Shelf > Tools",
+    "description": "Align Selected Objects to Active Object",
+    "warning": "",
+    "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
+        "Scripts/3D interaction/Align_Tools",
+    "tracker_url": "https://developer.blender.org/maniphest/task/create/?project=3&type=Bug",
+    "category": "3D View",
+}
+
+import bpy
+from bpy.props import EnumProperty, PointerProperty, FloatProperty, BoolProperty, FloatVectorProperty
+from mathutils import Vector, Matrix
+from math import *
+
+## Simple Align Defs ##
+
+## Align all
+def main(context):
+    for i in bpy.context.selected_objects:
+        i.location = bpy.context.active_object.location
+        i.rotation_euler = bpy.context.active_object.rotation_euler
+
+## Align Location
+def LocAll(context):
+    for i in bpy.context.selected_objects:
+        i.location = bpy.context.active_object.location
+
+def LocX(context):
+    for i in bpy.context.selected_objects:
+        i.location.x = bpy.context.active_object.location.x
+
+def LocY(context):
+    for i in bpy.context.selected_objects:
+        i.location.y = bpy.context.active_object.location.y
+
+def LocZ(context):
+    for i in bpy.context.selected_objects:
+        i.location.z = bpy.context.active_object.location.z
+
+## Align Rotation
+def RotAll(context):
+    for i in bpy.context.selected_objects:
+        i.rotation_euler = bpy.context.active_object.rotation_euler
+
+def RotX(context):
+    for i in bpy.context.selected_objects:
+        i.rotation_euler.x = bpy.context.active_object.rotation_euler.x
+
+def RotY(context):
+    for i in bpy.context.selected_objects:
+        i.rotation_euler.y = bpy.context.active_object.rotation_euler.y
+
+def RotZ(context):
+    for i in bpy.context.selected_objects:
+        i.rotation_euler.z = bpy.context.active_object.rotation_euler.z
+
+## Align Scale
+def ScaleAll(context):
+    for i in bpy.context.selected_objects:
+        i.scale = bpy.context.active_object.scale
+
+def ScaleX(context):
+    for i in bpy.context.selected_objects:
+        i.scale.x = bpy.context.active_object.scale.x
+
+def ScaleY(context):
+    for i in bpy.context.selected_objects:
+        i.scale.y = bpy.context.active_object.scale.y
+
+def ScaleZ(context):
+    for i in bpy.context.selected_objects:
+        i.scale.z = bpy.context.active_object.scale.z
+
+## Advanced Align Defs ##
+
+# subject to object 0, 1 and 2 to pivot for cursor
+def align_function(subject, active_too, consistent, self_or_active, loc_x, loc_y, loc_z, ref1, ref2, loc_offset,
+        rot_x, rot_y, rot_z, rot_offset, scale_x, scale_y, scale_z, scale_offset,
+         fit_x, fit_y, fit_z):
+
+    sel_obj = bpy.context.selected_objects
+    act_obj = bpy.context.active_object
+
+    global sel_max
+    global sel_min
+    global sel_center
+    global ref2_co
+
+    def get_reference_points(obj, space):
+
+        me = obj.data
+        co_list = []
+        # let's get all the points coodinates
+        if space == "global":
+            ok = False
+            obj_mtx = obj.matrix_world
+            if obj.type == 'MESH' and len(me.vertices) > 0:
+                ok = True
+                for p in me.vertices:
+                    co_list.append((obj_mtx * p.co))
+
+            elif obj.type == 'SURFACE' and len(me.splines) > 0:
+                ok = True
+                for s in me.splines:
+                    for p in s.points:
+                        co_list.append((obj_mtx * p.co))
+            elif obj.type == 'FONT' and len(me.splines) > 0:
+                ok = True
+                for s in me.splines:
+                    for p in s.bezier_points:
+                        co_list.append((obj_mtx * p.co))
+
+        elif space == "local":
+            ok = False
+            if obj.type == 'MESH' and len(me.vertices) > 0:
+                ok = True
+                for p in me.vertices:
+                    co_list.append(p.co)
+
+            elif o.type == 'SURFACE' and len(me.splines) > 0:
+                ok = True
+                for s in me.splines:
+                    for p in s.points:
+                        co_list.append(p.co)
+            elif o.type == 'FONT' and len(o.data.splines) > 0:
+                ok = True
+                for s in me.splines:
+                    for p in s.bezier_points:
+                        co_list.append(p.co)
+
+        #if a valid point found
+        #proceed to calculate the extremes
+        if ok:
+            max_x = co_list[0][0]
+            min_x = co_list[0][0]
+            max_y = co_list[0][1]
+            min_y = co_list[0][1]
+            max_z = co_list[0][2]
+            min_z = co_list[0][2]
+
+            for v in co_list:
+
+                #the strings of the list compared with the smaller and more found
+                #in order to find the minor and major for each axis
+                act_x = v[0]
+                if act_x > max_x:    max_x = act_x
+                if act_x < min_x:    min_x = act_x
+
+                act_y = v[1]
+                if act_y > max_y:    max_y = act_y
+                if act_y < min_y:    min_y = act_y
+
+                act_z = v[2]
+                if act_z > max_z:    max_z = act_z
+                if act_z < min_z:    min_z = act_z
+
+        else:
+            #otherwise use the pivot object
+            a = obj.location
+            min_x = a[0]
+            max_x = a[0]
+            min_y = a[1]
+            max_y = a[1]
+            min_z = a[2]
+            max_z = a[2]
+
+        center_x = min_x + ((max_x - min_x) / 2)
+        center_y = min_y + ((max_y - min_y) / 2)
+        center_z = min_z + ((max_z - min_z) / 2)
+
+        reference_points = [min_x, center_x, max_x, min_y, center_y, max_y, min_z, center_z, max_z]
+        return reference_points
+
+    def get_sel_ref(ref_co, sel_obj): #I look for the selection end points
+
+        sel_min = ref_co.copy()
+        sel_max = ref_co.copy()
+
+        for obj in sel_obj:
+            if obj != act_obj or (active_too and obj == act_obj):
+
+                ref_points = get_reference_points(obj, "global")
+                ref_min = Vector([ref_points[0], ref_points[3], ref_points[6]])
+                ref_max = Vector([ref_points[2], ref_points[5], ref_points[8]])
+
+                if ref_min[0] < sel_min[0]:
+                    sel_min[0] = ref_min[0]
+                if ref_max[0] > sel_max[0]:
+                    sel_max[0] = ref_max[0]
+                if ref_min[1] < sel_min[1]:
+                    sel_min[1] = ref_min[1]
+                if ref_max[1] > sel_max[1]:
+                    sel_max[1] = ref_max[1]
+                if ref_min[2] < sel_min[2]:
+                    sel_min[2] = ref_min[2]
+                if ref_max[2] > sel_max[2]:
+                    sel_max[2] = ref_max[2]
+
+        return sel_min, sel_max;
+
+    def find_ref2_co(act_obj):
+        #It contains the coordinates of the reference point for the positioning
+        if ref2 == "0":
+            ref_points = get_reference_points(act_obj, "global")
+            ref2_co = [ref_points[0], ref_points[3], ref_points[6]]
+            ref2_co = Vector(ref2_co)
+        elif ref2 == "1":
+            ref_points = get_reference_points(act_obj, "global")
+            ref2_co = [ref_points[1], ref_points[4], ref_points[7]]
+            ref2_co = Vector(ref2_co)
+        elif ref2 == "2":
+            ref2_co = act_obj.location
+            ref2_co = Vector(ref2_co)
+        elif ref2 == "3":
+            ref_points = get_reference_points(act_obj, "global")
+            ref2_co = [ref_points[2], ref_points[5], ref_points[8]]
+            ref2_co = Vector(ref2_co)
+        elif ref2 == "4":
+            ref2_co = bpy.context.scene.cursor_location
+
+        return ref2_co
+
+    def find_new_coord(obj):
+
+        ref_points = get_reference_points(obj, "global")
+
+        if loc_x == True:
+            if ref1 == "0":
+                min_x = ref_points[0]
+                new_x = ref2_co[0] + (obj.location[0] - min_x) + loc_offset[0]
+            elif ref1 == "1":
+                center_x = ref_points[1]
+                new_x = ref2_co[0] + (obj.location[0] - center_x) + loc_offset[0]
+            elif ref1 == "2":
+                new_x = ref2_co[0] + loc_offset[0]
+            elif ref1 == "3":
+                max_x = ref_points[2]
+                new_x = ref2_co[0] - (max_x - obj.location[0]) + loc_offset[0]
+            obj.location[0] = new_x
+        if loc_y == True:
+            if ref1 == "0":
+                min_y = ref_points[3]
+                new_y = ref2_co[1] + (obj.location[1] - min_y) + loc_offset[1]
+            elif ref1 == "1":
+                center_y = ref_points[4]
+                new_y = ref2_co[1] + (obj.location[1] - center_y) + loc_offset[1]
+            elif ref1 == "2":
+                new_y = ref2_co[1] + loc_offset[1]
+            elif ref1 == "3":
+                max_y = ref_points[5]
+                n

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list