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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-12-19 10:05:29 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-12-19 10:05:29 +0300
commitc26cc0afa1bde9c388eab27be6cbc3efed7fb399 (patch)
tree1ebc8f25fc54c4bdf5d30ee84f7f8034469d982a /release
parent096369e89d1f036864e01a0e48d745b0d056748a (diff)
bugfix [#25290] Align on text gives a traceback
[#25284] Traceback error on "System Info" script - Align was only working on mesh objects, now operate on all objects, missing boundbox's are treated as single points. - obj.bound_box was returning all nan's for object types with no boundbox. - ENUM_FLAG type enums were showing no text when displayed in operator redo panel.
Diffstat (limited to 'release')
-rw-r--r--release/scripts/modules/bpy/utils.py4
-rw-r--r--release/scripts/op/object_align.py292
2 files changed, 154 insertions, 142 deletions
diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py
index 624f111d85f..54acc4874d1 100644
--- a/release/scripts/modules/bpy/utils.py
+++ b/release/scripts/modules/bpy/utils.py
@@ -560,7 +560,7 @@ def keyconfig_set(filepath):
keyconfigs.active = kc_new
-def user_resource(type, path, create=False):
+def user_resource(type, path="", create=False):
"""
Return a user resource path (normally from the users home directory).
@@ -588,7 +588,7 @@ def user_resource(type, path, create=False):
traceback.print_exc()
target_path = ""
elif not _os.path.isdir(target_path):
- print("Path %r found but isn't a directory!" % path)
+ print("Path %r found but isn't a directory!" % target_path)
target_path = ""
return target_path
diff --git a/release/scripts/op/object_align.py b/release/scripts/op/object_align.py
index ff566206a49..045be5e80b8 100644
--- a/release/scripts/op/object_align.py
+++ b/release/scripts/op/object_align.py
@@ -26,206 +26,213 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to):
cursor = bpy.context.scene.cursor_location
- Left_Up_Front_SEL = [[], [], []]
- Right_Down_Back_SEL = [[], [], []]
+ Left_Up_Front_SEL = [0.0, 0.0, 0.0]
+ Right_Down_Back_SEL = [0.0, 0.0, 0.0]
flag_first = True
+ objs = []
+
for obj in bpy.context.selected_objects:
- if obj.type == 'MESH':
+ matrix_world = obj.matrix_world
+ bb_world = [Vector(v[:]) * matrix_world for v in obj.bound_box]
+ objs.append((obj, bb_world))
+
+ if not objs:
+ return False
- bb_world = [Vector(v[:]) * obj.matrix_world for v in obj.bound_box]
+ for obj, bb_world in objs:
+ Left_Up_Front = bb_world[1]
+ Right_Down_Back = bb_world[7]
- Left_Up_Front = bb_world[1]
- Right_Down_Back = bb_world[7]
+ # Active Center
- # Active Center
+ if obj == bpy.context.active_object:
- if obj == bpy.context.active_object:
+ center_active_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2.0
+ center_active_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2.0
+ center_active_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2.0
- center_active_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2
- center_active_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2
- center_active_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2
+ size_active_x = (Right_Down_Back[0] - Left_Up_Front[0]) / 2.0
+ size_active_y = (Right_Down_Back[1] - Left_Up_Front[1]) / 2.0
+ size_active_z = (Left_Up_Front[2] - Right_Down_Back[2]) / 2.0
- size_active_x = (Right_Down_Back[0] - Left_Up_Front[0]) / 2
- size_active_y = (Right_Down_Back[1] - Left_Up_Front[1]) / 2
- size_active_z = (Left_Up_Front[2] - Right_Down_Back[2]) / 2
+ # Selection Center
- # Selection Center
+ if flag_first:
+ flag_first = False
- if flag_first:
- flag_first = False
+ Left_Up_Front_SEL[0] = Left_Up_Front[0]
+ Left_Up_Front_SEL[1] = Left_Up_Front[1]
+ Left_Up_Front_SEL[2] = Left_Up_Front[2]
+ Right_Down_Back_SEL[0] = Right_Down_Back[0]
+ Right_Down_Back_SEL[1] = Right_Down_Back[1]
+ Right_Down_Back_SEL[2] = Right_Down_Back[2]
+
+ else:
+ # X axis
+ if Left_Up_Front[0] < Left_Up_Front_SEL[0]:
Left_Up_Front_SEL[0] = Left_Up_Front[0]
+ # Y axis
+ if Left_Up_Front[1] < Left_Up_Front_SEL[1]:
Left_Up_Front_SEL[1] = Left_Up_Front[1]
+ # Z axis
+ if Left_Up_Front[2] > Left_Up_Front_SEL[2]:
Left_Up_Front_SEL[2] = Left_Up_Front[2]
+ # X axis
+ if Right_Down_Back[0] > Right_Down_Back_SEL[0]:
Right_Down_Back_SEL[0] = Right_Down_Back[0]
+ # Y axis
+ if Right_Down_Back[1] > Right_Down_Back_SEL[1]:
Right_Down_Back_SEL[1] = Right_Down_Back[1]
+ # Z axis
+ if Right_Down_Back[2] < Right_Down_Back_SEL[2]:
Right_Down_Back_SEL[2] = Right_Down_Back[2]
- else:
- # X axis
- if Left_Up_Front[0] < Left_Up_Front_SEL[0]:
- Left_Up_Front_SEL[0] = Left_Up_Front[0]
- # Y axis
- if Left_Up_Front[1] < Left_Up_Front_SEL[1]:
- Left_Up_Front_SEL[1] = Left_Up_Front[1]
- # Z axis
- if Left_Up_Front[2] > Left_Up_Front_SEL[2]:
- Left_Up_Front_SEL[2] = Left_Up_Front[2]
-
- # X axis
- if Right_Down_Back[0] > Right_Down_Back_SEL[0]:
- Right_Down_Back_SEL[0] = Right_Down_Back[0]
- # Y axis
- if Right_Down_Back[1] > Right_Down_Back_SEL[1]:
- Right_Down_Back_SEL[1] = Right_Down_Back[1]
- # Z axis
- if Right_Down_Back[2] < Right_Down_Back_SEL[2]:
- Right_Down_Back_SEL[2] = Right_Down_Back[2]
-
- center_sel_x = (Left_Up_Front_SEL[0] + Right_Down_Back_SEL[0]) / 2
- center_sel_y = (Left_Up_Front_SEL[1] + Right_Down_Back_SEL[1]) / 2
- center_sel_z = (Left_Up_Front_SEL[2] + Right_Down_Back_SEL[2]) / 2
+ center_sel_x = (Left_Up_Front_SEL[0] + Right_Down_Back_SEL[0]) / 2.0
+ center_sel_y = (Left_Up_Front_SEL[1] + Right_Down_Back_SEL[1]) / 2.0
+ center_sel_z = (Left_Up_Front_SEL[2] + Right_Down_Back_SEL[2]) / 2.0
# Main Loop
- for obj in bpy.context.selected_objects:
- if obj.type == 'MESH':
+ for obj, bb_world in objs:
- loc_world = obj.location
- bb_world = [Vector(v[:]) * obj.matrix_world for v in obj.bound_box]
+ loc_world = obj.location
+ bb_world = [Vector(v[:]) * obj.matrix_world for v in obj.bound_box]
- Left_Up_Front = bb_world[1]
- Right_Down_Back = bb_world[7]
+ Left_Up_Front = bb_world[1]
+ Right_Down_Back = bb_world[7]
- center_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2
- center_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2
- center_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2
+ center_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2.0
+ center_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2.0
+ center_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2.0
- positive_x = Right_Down_Back[0]
- positive_y = Right_Down_Back[1]
- positive_z = Left_Up_Front[2]
+ positive_x = Right_Down_Back[0]
+ positive_y = Right_Down_Back[1]
+ positive_z = Left_Up_Front[2]
- negative_x = Left_Up_Front[0]
- negative_y = Left_Up_Front[1]
- negative_z = Right_Down_Back[2]
+ negative_x = Left_Up_Front[0]
+ negative_y = Left_Up_Front[1]
+ negative_z = Right_Down_Back[2]
- obj_loc = obj.location
+ obj_loc = obj.location
- if align_x:
+ if align_x:
- # Align Mode
+ # Align Mode
- if relative_to == 'OPT_4': # Active relative
- if align_mode == 'OPT_1':
- obj_x = obj_loc[0] - negative_x - size_active_x
+ if relative_to == 'OPT_4': # Active relative
+ if align_mode == 'OPT_1':
+ obj_x = obj_loc[0] - negative_x - size_active_x
- elif align_mode == 'OPT_3':
- obj_x = obj_loc[0] - positive_x + size_active_x
+ elif align_mode == 'OPT_3':
+ obj_x = obj_loc[0] - positive_x + size_active_x
- else: # Everything else relative
- if align_mode == 'OPT_1':
- obj_x = obj_loc[0] - negative_x
+ else: # Everything else relative
+ if align_mode == 'OPT_1':
+ obj_x = obj_loc[0] - negative_x
- elif align_mode == 'OPT_3':
- obj_x = obj_loc[0] - positive_x
+ elif align_mode == 'OPT_3':
+ obj_x = obj_loc[0] - positive_x
- if align_mode == 'OPT_2': # All relative
- obj_x = obj_loc[0] - center_x
+ if align_mode == 'OPT_2': # All relative
+ obj_x = obj_loc[0] - center_x
- # Relative To
+ # Relative To
- if relative_to == 'OPT_1':
- loc_x = obj_x
+ if relative_to == 'OPT_1':
+ loc_x = obj_x
- elif relative_to == 'OPT_2':
- loc_x = obj_x + cursor[0]
+ elif relative_to == 'OPT_2':
+ loc_x = obj_x + cursor[0]
- elif relative_to == 'OPT_3':
- loc_x = obj_x + center_sel_x
+ elif relative_to == 'OPT_3':
+ loc_x = obj_x + center_sel_x
- elif relative_to == 'OPT_4':
- loc_x = obj_x + center_active_x
+ elif relative_to == 'OPT_4':
+ loc_x = obj_x + center_active_x
- obj.location[0] = loc_x
+ obj.location[0] = loc_x
- if align_y:
+ if align_y:
- # Align Mode
+ # Align Mode
- if relative_to == 'OPT_4': # Active relative
- if align_mode == 'OPT_1':
- obj_y = obj_loc[1] - negative_y - size_active_y
+ if relative_to == 'OPT_4': # Active relative
+ if align_mode == 'OPT_1':
+ obj_y = obj_loc[1] - negative_y - size_active_y
- elif align_mode == 'OPT_3':
- obj_y = obj_loc[1] - positive_y + size_active_y
+ elif align_mode == 'OPT_3':
+ obj_y = obj_loc[1] - positive_y + size_active_y
- else: # Everything else relative
- if align_mode == 'OPT_1':
- obj_y = obj_loc[1] - negative_y
+ else: # Everything else relative
+ if align_mode == 'OPT_1':
+ obj_y = obj_loc[1] - negative_y
- elif align_mode == 'OPT_3':
- obj_y = obj_loc[1] - positive_y
+ elif align_mode == 'OPT_3':
+ obj_y = obj_loc[1] - positive_y
- if align_mode == 'OPT_2': # All relative
- obj_y = obj_loc[1] - center_y
+ if align_mode == 'OPT_2': # All relative
+ obj_y = obj_loc[1] - center_y
- # Relative To
+ # Relative To
- if relative_to == 'OPT_1':
- loc_y = obj_y
+ if relative_to == 'OPT_1':
+ loc_y = obj_y
- elif relative_to == 'OPT_2':
- loc_y = obj_y + cursor[1]
+ elif relative_to == 'OPT_2':
+ loc_y = obj_y + cursor[1]
- elif relative_to == 'OPT_3':
- loc_y = obj_y + center_sel_y
+ elif relative_to == 'OPT_3':
+ loc_y = obj_y + center_sel_y
- elif relative_to == 'OPT_4':
- loc_y = obj_y + center_active_y
+ elif relative_to == 'OPT_4':
+ loc_y = obj_y + center_active_y
- obj.location[1] = loc_y
+ obj.location[1] = loc_y
- if align_z:
+ if align_z:
- # Align Mode
+ # Align Mode
- if relative_to == 'OPT_4': # Active relative
- if align_mode == 'OPT_1':
- obj_z = obj_loc[2] - negative_z - size_active_z
+ if relative_to == 'OPT_4': # Active relative
+ if align_mode == 'OPT_1':
+ obj_z = obj_loc[2] - negative_z - size_active_z
- elif align_mode == 'OPT_3':
- obj_z = obj_loc[2] - positive_z + size_active_z
+ elif align_mode == 'OPT_3':
+ obj_z = obj_loc[2] - positive_z + size_active_z
- else: # Everything else relative
- if align_mode == 'OPT_1':
- obj_z = obj_loc[2] - negative_z
+ else: # Everything else relative
+ if align_mode == 'OPT_1':
+ obj_z = obj_loc[2] - negative_z
- elif align_mode == 'OPT_3':
- obj_z = obj_loc[2] - positive_z
+ elif align_mode == 'OPT_3':
+ obj_z = obj_loc[2] - positive_z
- if align_mode == 'OPT_2': # All relative
- obj_z = obj_loc[2] - center_z
+ if align_mode == 'OPT_2': # All relative
+ obj_z = obj_loc[2] - center_z
- # Relative To
+ # Relative To
- if relative_to == 'OPT_1':
- loc_z = obj_z
+ if relative_to == 'OPT_1':
+ loc_z = obj_z
- elif relative_to == 'OPT_2':
- loc_z = obj_z + cursor[2]
+ elif relative_to == 'OPT_2':
+ loc_z = obj_z + cursor[2]
- elif relative_to == 'OPT_3':
- loc_z = obj_z + center_sel_z
+ elif relative_to == 'OPT_3':
+ loc_z = obj_z + center_sel_z
- elif relative_to == 'OPT_4':
- loc_z = obj_z + center_active_z
+ elif relative_to == 'OPT_4':
+ loc_z = obj_z + center_active_z
- obj.location[2] = loc_z
+ obj.location[2] = loc_z
+
+ return True
from bpy.props import *
@@ -254,23 +261,28 @@ class AlignObjects(bpy.types.Operator):
description="",
default='OPT_4')
- align_x = BoolProperty(name="Align X",
- description="Align in the X axis", default=False)
-
- align_y = BoolProperty(name="Align Y",
- description="Align in the Y axis", default=False)
-
- align_z = BoolProperty(name="Align Z",
- description="Align in the Z axis", default=False)
+ align_axis = EnumProperty(items=(
+ ('X', "X", ""),
+ ('Y', "Y", ""),
+ ('Z', "Z", ""),
+ ),
+ name="Align",
+ description="Align to axis",
+ options={'ENUM_FLAG'})
@classmethod
def poll(cls, context):
return context.mode == 'OBJECT'
def execute(self, context):
- align_objects(self.align_x, self.align_y, self.align_z, self.align_mode, self.relative_to)
-
- return {'FINISHED'}
+ align_axis = self.align_axis
+ ret = align_objects('X' in align_axis, 'Y' in align_axis, 'Z' in align_axis, self.align_mode, self.relative_to)
+
+ if not ret:
+ self.report({'WARNING'}, "No objects with bound-box selected")
+ return {'CANCELLED'}
+ else:
+ return {'FINISHED'}
def menu_func(self, context):