From 99eb3277d2cc43fd45be356160592b64034191a0 Mon Sep 17 00:00:00 2001 From: Andrea Ghensi Date: Sat, 24 Feb 2024 14:56:43 +0100 Subject: [PATCH 1/2] refactor: catch specific exception on _pick_obj --- pyrevitlib/pyrevit/revit/selection.py | 107 +++++++++++--------------- 1 file changed, 43 insertions(+), 64 deletions(-) diff --git a/pyrevitlib/pyrevit/revit/selection.py b/pyrevitlib/pyrevit/revit/selection.py index 14a4ae759..aaff2965c 100644 --- a/pyrevitlib/pyrevit/revit/selection.py +++ b/pyrevitlib/pyrevit/revit/selection.py @@ -5,6 +5,7 @@ from pyrevit.revit import ensure from pyrevit.revit import query +from Autodesk.Revit import Exceptions as RevitExceptions __all__ = ('pick_element', 'pick_element_by_category', @@ -145,74 +146,52 @@ def AllowReference(self, refer, point): # pylint: disable=W0613 def _pick_obj(obj_type, message, multiple=False, world=False, selection_filter=None): - refs = [] - + mlogger.debug( + "Picking elements: %s " "message: %s " "multiple: %s " "world: %s", + obj_type, + message, + multiple, + world, + ) + picker_func = ( + HOST_APP.uidoc.Selection.PickObjects + if multiple + else HOST_APP.uidoc.Selection.PickObject + ) try: - mlogger.debug('Picking elements: %s ' - 'message: %s ' - 'multiple: %s ' - 'world: %s', obj_type, message, multiple, world) - - # decide which picker method to use - picker_func = HOST_APP.uidoc.Selection.PickObject - if multiple: - picker_func = HOST_APP.uidoc.Selection.PickObjects - - # call the correct signature of the picker function - # if selection filter is provided - if selection_filter: - pick_result = \ - picker_func( - obj_type, - selection_filter, - message - ) - else: - pick_result = \ - picker_func( - obj_type, - message - ) - - # process the results - if multiple: - refs = list(pick_result) - else: - refs = [] - refs.append(pick_result) - - if not refs: - mlogger.debug('Nothing picked by user...Returning None') - return None - - mlogger.debug('Picked elements are: %s', refs) - - if obj_type == UI.Selection.ObjectType.Element: - return_values = \ - [DOCS.doc.GetElement(ref) - for ref in refs] - elif obj_type == UI.Selection.ObjectType.PointOnElement: - if world: - return_values = [ref.GlobalPoint for ref in refs] - else: - return_values = [ref.UVPoint for ref in refs] - else: - return_values = \ - [DOCS.doc.GetElement(ref) - .GetGeometryObjectFromReference(ref) - for ref in refs] + pick_result = ( + picker_func(obj_type, selection_filter, message) + if selection_filter + else picker_func(obj_type, message) + ) + except RevitExceptions.OperationCanceledException: + return None + refs = list(pick_result) if multiple else [pick_result] + if not refs: + mlogger.debug("Nothing picked by user") + return None - mlogger.debug('Processed return elements are: %s', return_values) + mlogger.debug("Picked elements are: %s", refs) - if len(return_values) > 1 or multiple: - return return_values - elif len(return_values) == 1: - return return_values[0] + if obj_type == UI.Selection.ObjectType.Element: + return_values = [DOCS.doc.GetElement(ref) for ref in refs] + elif obj_type == UI.Selection.ObjectType.PointOnElement: + if world: + return_values = [ref.GlobalPoint for ref in refs] else: - mlogger.error('Error processing picked elements. ' - 'return_values should be a list.') - except Exception: - return None + return_values = [ref.UVPoint for ref in refs] + else: + return_values = [ + DOCS.doc.GetElement(ref).GetGeometryObjectFromReference(ref) for ref in refs + ] + + mlogger.debug("Processed return elements are: %s", return_values) + + if len(return_values) > 1 or multiple: + return return_values + if len(return_values) == 1: + return return_values[0] + mlogger.error("Error processing picked elements. return_values should be a list.") def pick_element(message=''): From a946fc76e4ffdeccdcbd2a572a4877f05a93964a Mon Sep 17 00:00:00 2001 From: Andrea Ghensi Date: Sat, 24 Feb 2024 15:29:14 +0100 Subject: [PATCH 2/2] add debug message on selection cancel --- pyrevitlib/pyrevit/revit/selection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyrevitlib/pyrevit/revit/selection.py b/pyrevitlib/pyrevit/revit/selection.py index aaff2965c..f5b2f2206 100644 --- a/pyrevitlib/pyrevit/revit/selection.py +++ b/pyrevitlib/pyrevit/revit/selection.py @@ -165,6 +165,7 @@ def _pick_obj(obj_type, message, multiple=False, world=False, selection_filter=N else picker_func(obj_type, message) ) except RevitExceptions.OperationCanceledException: + mlogger.debug("Operation canceled by user") return None refs = list(pick_result) if multiple else [pick_result] if not refs: