From 33c5b99dd6e1860cca8cf55c9eea911553bd7b50 Mon Sep 17 00:00:00 2001 From: Andrew Hale <TrumanBlending@gmail.com> Date: Thu, 5 Jan 2012 14:39:45 +0000 Subject: [PATCH] Added selection_utils module. It contains a modal operator which allows the order in which objects were selected to be stored for use in other operators. The list of object names is stored in selection_utils.selected --- modules/selection_utils.py | 75 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 modules/selection_utils.py diff --git a/modules/selection_utils.py b/modules/selection_utils.py new file mode 100644 index 000000000..002461b74 --- /dev/null +++ b/modules/selection_utils.py @@ -0,0 +1,75 @@ +# ##### 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 ##### + +import bpy + +selected = [] + + +class SelectionOrder(bpy.types.Operator): + '''Store the object names in the order they are selected. + Use RETURN key to confirm selection, ESCAPE key to cancel''' + bl_idname = "object.select_order" + bl_label = "Select with Order" + bl_options = {'UNDO'} + + num_selected = 0 + + @classmethod + def poll(self, context): + return bpy.context.mode == 'OBJECT' + + def update(self, context): + # Get the currently selected objects + sel = context.selected_objects + num = len(sel) + + if num == 0: + # Reset the list + selected[:] = [] + elif num > self.num_selected: + # Get all the newly selected objects and add + new = [ob.name for ob in sel if ob.name not in selected] + selected.extend(new) + elif num < self.num_selected: + # Get the selected objects and remove from list + curnames = {ob.name for ob in sel} + selected[:] = [name for name in selected if name in curnames] + + # Set the number of currently select objects + self.num_selected = len(selected) + + def modal(self, context, event): + if event.type == 'RET': + # If return is pressed, finish the operator + return {'FINISHED'} + elif event.type == 'ESC': + # If escape is pressed, cancel the operator + return {'CANCELLED'} + + # Update selection if we need to + self.update(context) + return {'PASS_THROUGH'} + + def invoke(self, context, event): + context.window_manager.modal_handler_add(self) + self.update(context) + return {'RUNNING_MODAL'} + + +bpy.utils.register_module(__name__) \ No newline at end of file -- GitLab