# Add Sizes to a pipe segment

**URL:** <https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208>\
**Category:** Revit\
**Created:** [September 27, 2019, 4:30pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208 "2019-09-27T16:30:16Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![abdallahzakaria](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/abdallahzakaria/32/99152_2.png) [@abdallahzakaria](https://forum.dynamobim.com/u/abdallahzakaria)\
**Post date:** [September 27, 2019, 4:30pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/1 "2019-09-27T16:30:16Z")

</div>

Dears,  
I’m trying to create a python code to add a new sizes for a certain pipe segment, but i get an error of " The float is not iterable" as shown below, Please Advise??

 ![issue](https://us1.discourse-cdn.com/flex022/uploads/dynamobim/original/3X/c/d/cd631864e39221713d4c80e4929349428d72db46.png)  
The Python code is as following :

import clr  
clr.AddReference(“RevitAPI”)  
from Autodesk.Revit.DB import \*  
from Autodesk.Revit.DB.Plumbing import PipeSegment  
clr.AddReference(“RevitServices”)  
from RevitServices.Persistence import DocumentManager  
from RevitServices.Transactions import TransactionManager  
doc = DocumentManager.Instance.CurrentDBDocument  
#Les entrées effectuées dans ce noeud sont stockées sous forme de liste dans les variables IN.  
dataEnteringNode = IN  
elem = UnwrapElement(IN[0])  
TransactionManager.Instance.EnsureInTransaction(doc)  
for NominalDiameter, InnerDiameter, OuterDiameter in zip(IN[1], IN[2], IN[3]):  
NominalDiameter = UnitUtils.ConvertToInternalUnits(NominalDiameter , DisplayUnitType.DUT\_MILLIMETERS)  
InnerDiameter = UnitUtils.ConvertToInternalUnits(InnerDiameter , DisplayUnitType.DUT\_MILLIMETERS)  
OuterDiameter = UnitUtils.ConvertToInternalUnits(OuterDiameter , DisplayUnitType.DUT\_MILLIMETERS)  
try:  
elem.AddSize(MEPSize(NominalDiameter,InnerDiameter,OuterDiameter,True,True))  
except:  
elem.RemoveSize(NominalDiameter)  
elem.AddSize(MEPSize(NominalDiameter,InnerDiameter,OuterDiameter,True,True))

#Affectez la sortie à la variable OUT.  
OUT = IN

---

<div class="post-metadata">

**Author:** ![cgartland](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/cgartland/32/45378_2.png) [@cgartland](https://forum.dynamobim.com/u/cgartland)\
**Post date:** [September 27, 2019, 5:03pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/2 "2019-09-27T17:03:29Z")

</div>

You are providing a single object, not a list, to at least one of the inputs. If you do not want to modify the python code, you can use a List.Create node to ensure that your input will be a list. Otherwise, you can write a function like this and apply it to each input to ensure that each input will be a list:

```
def make_list(lst):
    if not isinstance(lst, list):
        return [lst]
    return lst
```

---

<div class="post-metadata">

**Author:** ![abdallahzakaria](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/abdallahzakaria/32/99152_2.png) [@abdallahzakaria](https://forum.dynamobim.com/u/abdallahzakaria)\
**Post date:** [September 27, 2019, 11:14pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/3 "2019-09-27T23:14:06Z")

</div>

I tried using list but with no success, I got another error as shown below,

 ![issue2](https://us1.discourse-cdn.com/flex022/uploads/dynamobim/original/3X/6/1/613d8415c56038a39393a74abd9f1bc1cedaccc2.png)

---

<div class="post-metadata">

**Author:** ![cgartland](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/cgartland/32/45378_2.png) [@cgartland](https://forum.dynamobim.com/u/cgartland)\
**Post date:** [September 27, 2019, 11:19pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/4 "2019-09-27T23:19:16Z")

</div>

Instead of `isinstance(lst, list)` try `hasattr(lst, ' __iter__')`

---

<div class="post-metadata">

**Author:** ![abdallahzakaria](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/abdallahzakaria/32/99152_2.png) [@abdallahzakaria](https://forum.dynamobim.com/u/abdallahzakaria)\
**Post date:** [September 28, 2019, 12:33am UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/5 "2019-09-28T00:33:30Z")

</div>

> [@cgartland](#):
>
> def make\_list(lst): if not isinstance(lst, list): return [lst] return lst

do you mind if you put it into my script in order to get your point

---

<div class="post-metadata">

**Author:** ![cgartland](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/cgartland/32/45378_2.png) [@cgartland](https://forum.dynamobim.com/u/cgartland)\
**Post date:** [September 28, 2019, 2:20am UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/6 "2019-09-28T02:20:06Z")

</div>

You can use the above function to make your single element into a list containing the single element. For example:

```
def make_list(lst):
    if not hasattr(lst, ' __iter__'):
        return [lst]
    return lst

elem = make_list(UnwrapElement(IN[0]))

```

You can do the same for each of the other inputs and assign them each to a variable, e.g.:

```
nominal = make_list(IN[1])
inner = make_list(IN[2])
outer = make_list(IN[3])
```

---

<div class="post-metadata">

**Author:** ![abdallahzakaria](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/abdallahzakaria/32/99152_2.png) [@abdallahzakaria](https://forum.dynamobim.com/u/abdallahzakaria)\
**Post date:** [September 28, 2019, 8:30am UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/7 "2019-09-28T08:30:39Z")

</div>

> [@cgartland](#):
>
> nominal = make\_list(IN[1]) inner = make\_list(IN[2]) outer = make\_list(IN[3])

the same error occured, I think the problem is not creating a list

---

<div class="post-metadata">

**Author:** ![cgartland](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/cgartland/32/45378_2.png) [@cgartland](https://forum.dynamobim.com/u/cgartland)\
**Post date:** [September 28, 2019, 2:37pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/8 "2019-09-28T14:37:52Z")

</div>

I would add your list of elements to your zip function. The way your script is currently set up, you are trying to modify the list of elements rather than the element itself.

```
for elem, innerD, outerD, nominalD in zip(elems, inner, outer, nominal):
    # Convert each measurement and modify each element here
```

---

<div class="post-metadata">

**Author:** ![abdallahzakaria](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/abdallahzakaria/32/99152_2.png) [@abdallahzakaria](https://forum.dynamobim.com/u/abdallahzakaria)\
**Post date:** [September 28, 2019, 3:04pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/9 "2019-09-28T15:04:38Z")

</div>

got the error " unknown Element is not iterable" ☹

---

<div class="post-metadata">

**Author:** ![abdallahzakaria](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/abdallahzakaria/32/99152_2.png) [@abdallahzakaria](https://forum.dynamobim.com/u/abdallahzakaria)\
**Post date:** [September 28, 2019, 3:08pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/10 "2019-09-28T15:08:08Z")

</div>

I’m trying to use the script like this :

```
import clr
clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Plumbing import PipeSegment

clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument

#Les entrées effectuées dans ce noeud sont stockées sous forme de liste dans les variables IN.
dataEnteringNode = IN

elem = doc.GetElement(IN[0])

TransactionManager.Instance.EnsureInTransaction(doc)

for dn, di, de in zip(IN[1], IN[2], IN[3]):
	DN = UnitUtils.ConvertToInternalUnits(dn , DisplayUnitType.DUT_MILLIMETERS)
	Di = UnitUtils.ConvertToInternalUnits(di , DisplayUnitType.DUT_MILLIMETERS)
	De = UnitUtils.ConvertToInternalUnits(de , DisplayUnitType.DUT_MILLIMETERS)
	try:
		elem.AddSize(MEPSize(DN,Di,De,True,True))
	except:
		elem.RemoveSize(DN)
		elem.AddSize(MEPSize(DN,Di,De,True,True))
		
#Affectez la sortie à la variable OUT.
OUT = IN

```

**finally i got another error of "Expected reference got list"**

---

<div class="post-metadata">

**Author:** ![cgartland](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/cgartland/32/45378_2.png) [@cgartland](https://forum.dynamobim.com/u/cgartland)\
**Post date:** [September 28, 2019, 4:11pm UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/11 "2019-09-28T16:11:39Z")

</div>

You are using a list as your argument for the Document.GetElement method. GetElement accepts the following overloads:

String (UniqueId)  
ElementId  
Reference

However, you already have the elements themselves as your input, so using GetElement isn’t necessary. You need to unwrap the DesignScript elements to use them with the Revit API using the UnwrapElement function as you were doing before. Add “elem” to your zip function and process each pipe segment with its respective measurements.

---

<div class="post-metadata">

**Author:** ![mansonchen](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.dynamobim.com/mansonchen/32/98076_2.png) [@mansonchen](https://forum.dynamobim.com/u/mansonchen)\
**Post date:** [October 21, 2022, 2:45am UTC](https://forum.dynamobim.com/t/add-sizes-to-a-pipe-segment/41208/13 "2022-10-21T02:45:08Z")

</div>

![image](https://us1.discourse-cdn.com/flex022/uploads/dynamobim/original/3X/b/1/b110437e46b18cf65b6c43816f6d1607dc027d72.png)

```auto
import clr
clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Plumbing import PipeSegment

clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument

#Les entrées effectuées dans ce noeud sont stockées sous forme de liste dans les variables IN.
dataEnteringNode = IN

elem = UnwrapElement(IN[0])

TransactionManager.Instance.EnsureInTransaction(doc)

for dn, di, de in zip(IN[1], IN[2], IN[3]):
	DN = UnitUtils.ConvertToInternalUnits(dn , DisplayUnitType.DUT_MILLIMETERS)
	Di = UnitUtils.ConvertToInternalUnits(di , DisplayUnitType.DUT_MILLIMETERS)
	De = UnitUtils.ConvertToInternalUnits(de , DisplayUnitType.DUT_MILLIMETERS)
	try:
		elem.AddSize(MEPSize(DN,Di,De,True,True))
	except:
		elem.RemoveSize(DN)
		elem.AddSize(MEPSize(DN,Di,De,True,True))
		
#Affectez la sortie à la variable OUT.
OUT = IN

```
