[Bf-extensions-cvs] [15b00e93] master: space_view3d_align_tools: initial commit to release: T65739
meta-androcto
noreply at git.blender.org
Sat Jun 15 02:42:06 CEST 2019
Commit: 15b00e9396dfdf955fa1122d2464d5e96f2810b6
Author: meta-androcto
Date: Sat Jun 15 10:38:12 2019 +1000
Branches: master
https://developer.blender.org/rBA15b00e9396dfdf955fa1122d2464d5e96f2810b6
space_view3d_align_tools: initial commit to release: T65739
===================================================================
A space_view3d_align_tools.py
===================================================================
diff --git a/space_view3d_align_tools.py b/space_view3d_align_tools.py
new file mode 100644
index 00000000..1c3afb77
--- /dev/null
+++ b/space_view3d_align_tools.py
@@ -0,0 +1,1173 @@
+# -*- 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, 4),
+ "blender": (2, 80, 0),
+ "location": "View3D > Tool Shelf > Tools",
+ "description": "Align Selected Objects to Active Object",
+ "warning": "",
+ "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
+ "Scripts/3D interaction/Align_Tools",
+ "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
+ "category": "3D View",
+}
+
+import bpy
+from bpy.types import (
+ Operator,
+ Panel,
+ AddonPreferences,
+ )
+from bpy.props import (
+ EnumProperty,
+ BoolProperty,
+ FloatVectorProperty,
+ StringProperty,
+ )
+from mathutils import (
+ Vector,
+ Matrix,
+ )
+
+
+# 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 obj.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 obj.type == 'FONT' and len(obj.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 is 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 is True:
+ if ref1 == "0":
+ min_y = ref_points[3]
+ new_y = ref2_co[1] + (obj.location[1] - min_y) + loc_offset[1]
+ elif ref1 ==
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list