# Pick elements by either drag or click on the elements

**URL:** <https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924>\
**Category:** Revit\
**Tags:** revit, python, dynamo\
**Created:** [March 29, 2022, 9:28am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924 "2022-03-29T09:28:03Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![shashank.baganeACM](https://avatars.discourse-cdn.com/v4/letter/s/35a633/32.png) [@shashank.baganeACM](https://forum.dynamobim.com/u/shashank.baganeACM)\
**Post date:** [March 29, 2022, 9:28am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/1 "2022-03-29T09:28:03Z")

</div>

Hi all I am trying to use the following python script to pick the objects by clicking on the objects. Reference has been taken from [Node for Picking Elements in Order with Revit UI](https://forum.dynamobim.com/t/node-for-picking-elements-in-order-with-revit-ui/66508) @c.poupin

I wanted include both drag and click option for the user to pick the elements exactly like the node called “Element.PickObjectsByCategory” from DynaMEP. Kindly let me know what should I add to have drag option also in the script.

```auto
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 = IN[0]
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

```

Thanks in advance

---

<div class="post-metadata">

**Author:** ![Elie.Trad](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/elie.trad/32/110373_2.png) [@Elie.Trad](https://forum.dynamobim.com/u/Elie.Trad)\
**Post date:** [March 29, 2022, 11:14am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/2 "2022-03-29T11:14:21Z")

</div>

@shashank.baganeACM try this:

```auto
mSel = IN[0]
sel = []
if mSel == True:
	ref = uidoc.Selection.PickElementsByRectangle()
	elemenSelect = ref
else:
	ref = uidoc.Selection.PickObject(ObjectType.Element)
	sel.append(ref)
	elemenSelect = [doc.GetElement(xId) for xId in sel]

OUT = elemenSelect

```

or this:

```auto
mSel = IN[0]
sel = []
if mSel == True:
	ref = uidoc.Selection.PickObjects(ObjectType.Element)
	elemenSelect = [doc.GetElement(xId) for xId in ref]
else:
	ref = uidoc.Selection.PickObject(ObjectType.Element)
	sel.append(ref)
	elemenSelect = [doc.GetElement(xId) for xId in sel]

OUT = elemenSelect

```

![image](https://us1.discourse-cdn.com/flex022/uploads/dynamobim/original/3X/4/6/464feaca7e4acfbe50fc65608ac4208cab6b38fe.png)

---

<div class="post-metadata">

**Author:** ![shashank.baganeACM](https://avatars.discourse-cdn.com/v4/letter/s/35a633/32.png) [@shashank.baganeACM](https://forum.dynamobim.com/u/shashank.baganeACM)\
**Post date:** [March 29, 2022, 11:21am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/3 "2022-03-29T11:21:07Z")

</div>

@Elie.Trad thanks for your response. No its not working I mean I am not able to select the elements by drag option.

above scripts only allow me to pick the elements but I want both the options like drag and pick elements

---

<div class="post-metadata">

**Author:** ![Elie.Trad](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/elie.trad/32/110373_2.png) [@Elie.Trad](https://forum.dynamobim.com/u/Elie.Trad)\
**Post date:** [March 29, 2022, 11:25am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/4 "2022-03-29T11:25:18Z")

</div>

@shashank.baganeACM you can do only one task at a time, either pick or drag-select by specifying the Bool node, I do not know if it is possible to do both at the same time, maybe someone else knows.

---

<div class="post-metadata">

**Author:** ![shashank.baganeACM](https://avatars.discourse-cdn.com/v4/letter/s/35a633/32.png) [@shashank.baganeACM](https://forum.dynamobim.com/u/shashank.baganeACM)\
**Post date:** [March 29, 2022, 11:26am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/5 "2022-03-29T11:26:38Z")

</div>

@Elie.Trad thanks for your response.

---

<div class="post-metadata">

**Author:** ![shashank.baganeACM](https://avatars.discourse-cdn.com/v4/letter/s/35a633/32.png) [@shashank.baganeACM](https://forum.dynamobim.com/u/shashank.baganeACM)\
**Post date:** [March 30, 2022, 4:51am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/6 "2022-03-30T04:51:48Z")

</div>

Hi @Elie.Trad I found it. I have used part of yous and part of select model elements from Datashapes package and merged it.

It works fine for me and thank you so much for giving me part of the solution. So now I can select elements either by drag or click on the elements.

Thanks once again I really appreciate that you took time for this. The script something looks like below

```auto
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()

class uiselectelements():

    def __init__ (self,inputname,buttontext,multi):
        self.inputname = inputname
        self.buttontext = buttontext
        self.multi = multi

    def __repr__ (self):
        return 'UI.SelectElements input'

class uiselectelementsofcat():

    def __init__ (self,inputname,buttontext,category,multi):
        self.inputname = inputname
        self.buttontext = buttontext
        self.category = category
        self.multi = multi

    def __repr__ (self):
        return 'UI.SelectElementsOfCategory input'
				
if IN[2] == [""]:
	x = uiselectelements(IN[0],IN[1],IN[3])
else:
	if isinstance(IN[2],list):
		catnames = ', '.join([UnwrapElement(i).Name for i in IN[2]])
		if IN[1] == "Select Model Element(s)":
			buttontext = 'Select %s' %(catnames)
		else:
			buttontext = IN[1]
	else:
		buttontext = IN[1]
		
	x = uiselectelementsofcat(IN[0],buttontext,IN[2],IN[3])

flag = IN[4]
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
OUT = x

```

and the inputs are

![image](https://us1.discourse-cdn.com/flex022/uploads/dynamobim/original/3X/7/0/70c27973cd4bbeb3d8def1ab5ecefcd3534e0576.png)

---

<div class="post-metadata">

**Author:** ![shashank.baganeACM](https://avatars.discourse-cdn.com/v4/letter/s/35a633/32.png) [@shashank.baganeACM](https://forum.dynamobim.com/u/shashank.baganeACM)\
**Post date:** [March 30, 2022, 5:03am UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/7 "2022-03-30T05:03:52Z")

</div>

Hay @Elie.Trad if you could reduce the script by removing unwanted things, please post it here the final one which will be fine tuned.

Thanks in advance

---

<div class="post-metadata">

**Author:** ![c.poupin](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/c.poupin/32/89152_2.png) [@c.poupin](https://forum.dynamobim.com/u/c.poupin)\
**Post date:** [March 30, 2022, 3:32pm UTC](https://forum.dynamobim.com/t/pick-elements-by-either-drag-or-click-on-the-elements/74924/8 "2022-03-30T15:32:57Z")

</div>

> [@shashank.baganeACM](#):
>
> I wanted include both drag and click option for the user to pick the elements exactly like the node called “Element.PickObjectsByCategory”

Hi,  
It’s necessary to implement a ISelectionFilter class  
 ![image](https://us1.discourse-cdn.com/flex022/uploads/dynamobim/original/3X/a/2/a202dd845fe3719e21539685a95f38723aac3b02.png)

```auto
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()

class CustomSelectionElem(ISelectionFilter):
	def __init__ (self, bic_cat):
		self.bic_cat = bic_cat
	def AllowElement(self, e):
		if e.Category.Id == self.bic_cat.Id:
			return True
		else:
			return False
	def AllowReference(self, ref, point):
		return True 
				
flag = IN[0]
bic = UnwrapElement(IN[1])
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, CustomSelectionElem(bic), '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

```
