I was wondering if there’s any node to pick multiple elements in order that uses the object picking UI (Finish/Cancel) and has the option of deselecting last picks using Shift + Right Click.
there is one in datashape package. select in order
That does not have the option bar buttons and the deselect last picks feature. It’s a bit confusing at times what elements you selected.
the idea of selecting in order is to put select element in a loop usuing python, so i think there is no option of deselecting while selecting. you may make an additional step to show your selection using eg. listView in datashape also so you can select what you want and neglect the others
Here in this video you can see the PickObjects method where the pointer has + and - sign. At the end you can simply click on Finish in the options bar.
this is standalone addin, you can make something similar to it, using UI in datashape again , make 2 button , + and - , make them both to select elements , the final result will be substracting the elements selected in the - button from the elements selected in the + button
Ordered selection with the finish button is not possible in the API.
The workaround that we have all been using for a while now is what you are experiencing. Pick each element (singular) in a loop and add to a list.
This came up quite a while back on the Autodesk Revit API forums and that is where the solution was presented.
Sometimes if you’re not careful, you might miss picking one or two items from in a long chain of selection. If the selected items get faded or highlighted blue, it’d be a great help. Deselection would be an added advantage.
Agreed. Another option might be to use the selection with the finish option, but sort the elements after the fact by some criteria/parameters?
An idea of workaround
import clr import sys import System clr.AddReference('RevitAPI') import Autodesk from Autodesk.Revit.DB import * import Autodesk.Revit.DB as DB clr.AddReference('RevitAPIUI') from Autodesk.Revit.UI import * from Autodesk.Revit.UI.Selection import * from System.Collections.Generic import List clr.AddReference('RevitServices') import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument uiapp = DocumentManager.Instance.CurrentUIApplication uidoc = uiapp.ActiveUIDocument def overridecolor(elementId, reset = False): t = Transaction(doc, "Selection") t.Start() view = doc.ActiveView color_rgb = DB.Color(30,144,255) gSettings = OverrideGraphicSettings() if not reset: gSettings.SetSurfaceForegroundPatternColor(color_rgb) gSettings.SetProjectionLineColor(color_rgb) gSettings.SetCutLineColor(color_rgb) gSettings.SetCutForegroundPatternColor(color_rgb) gSettings.SetProjectionLineWeight(8) view.SetElementOverrides(elementId, gSettings) doc.Regenerate() uidoc.RefreshActiveView() t.Commit() t.Dispose() flag = True selectId =  TransactionManager.Instance.ForceCloseTransaction() TaskDialog.Show('Selection', 'Pick elements in the desired order (re-select to Remove), hit ESC to stop picking.') tg = TransactionGroup(doc, "Selection") tg.Start() while flag: try: ref = uidoc.Selection.PickObject(ObjectType.Element, 'Pick elements in the desired order (re-select to Remove), hit ESC to stop picking.') e_id = ref.ElementId if e_id not in selectId: overridecolor(e_id) selectId.append(e_id) else: overridecolor(e_id, True) selectId.pop(selectId.index(e_id)) except Exception as ex: flag = False break tg.RollBack() elemenSelect = [doc.GetElement(xId) for xId in selectId] OUT = elemenSelect
This is exactly what I need. If only data-shapes would have this feature. @Mostafa_El_Ayoubi