@christian.stan

Thank you Christian you’ve inspired me to find a solution how to place my family instances in their corresponding level using python function (**zip**)

here my principal script where I created my family instances…I still have some tweaking to do because I can’t land on the correct count of the family instance **Fut1** (I always end up having 1 more extra if the remaining Height from the division **H_2 = H_Total / H_Shaft** is not equal to **0**) since each instance is related to the level below it

- If H_2 = 0 I got an error in the script which tell me H_2 is not defined that its logic…so how to fix this error?

Please check my script and my dyn file below

```
import sys
import clr
import math
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitNodes')
import Revit
from Revit.Elements import *
R_exter_Shaft = IN[0]
Thk_Shaft = IN[1]
R_inter_Shaft = R_exter_Shaft - Thk_Shaft
H_Total = IN[2]
H_Shaft = IN[3]
Thk_Slab = IN[4]
H_1 = H_Shaft - Thk_Slab
Family_Cat = IN[5]
Family_Path = IN[6]
Material = IN[7]
Family1_name = 'Shaft1'
Family2_name = 'Shaft2'
Long_Trape = 0.8
angle_Trape = math.degrees(math.atan((Long_Trape/2) / R_inter_Shaft))
# Set Levels_List
if H_Total % H_Shaft > 0:
H_Level = [ i * H_Shaft + H_Shaft for i in range(0, int(H_Total //H_Shaft))]
#compute the remaining Height H_2 from the divison (H_Total / H_Shaft)
H_2 = H_Total - H_Level[-1]
else:
H_Level = [ i * H_Shaft + H_Shaft for i in range(0, int(H_Total //H_Shaft) - 1)]
#H_Level.insert(len(H_Level),H_Total)
H_Level.insert(0,0)
#Shaft1_Profil
lst1 = []
Pt1 = Point.ByCoordinates( R_exter_Shaft, 0, -Thk_Slab)
lst1.append(Pt1)
Pt2 = Point.ByCoordinates( R_exter_Shaft, 0, H_1)
lst1.append(Pt2)
Pt3 = Point.ByCoordinates( R_inter_Shaft , 0, H_1)
lst1.append(Pt3)
Pt4 = Point.ByCoordinates( R_inter_Shaft , 0, -Thk_Slab)
lst1.append(Pt4)
vector = Vector.ByCoordinates(0, 0, 1)
Center_pt = Point.ByCoordinates(0, 0, 0)
Shaft1_Profil = Polygon.ByPoints(lst1)
Shaft1 = Solid.ByRevolve(Shaft1_Profil, Center_pt, vector, 0, 360)
#Shaft2_Profil
lst2 = []
Pt_1 = Point.ByCoordinates( R_exter_Shaft, 0, -Thk_Slab)
lst2.append(Pt_1)
Pt_2 = Point.ByCoordinates( R_exter_Shaft, 0, H_2)
lst2.append(Pt_2)
Pt_3 = Point.ByCoordinates( R_inter_Shaft , 0, H_2)
lst2.append(Pt_3)
Pt_4 = Point.ByCoordinates( R_inter_Shaft , 0, -Thk_Slab)
lst2.append(Pt_4)
vector = Vector.ByCoordinates(0, 0, 1)
Center_pt = Point.ByCoordinates(0, 0, 0)
Shaft2_Profil = Polygon.ByPoints(lst2)
Shaft2 = Solid.ByRevolve(Shaft2_Profil, Center_pt, vector, 0, 360)
Slab_Profil = Surface.ByPatch(Circle.ByCenterPointRadius(Center_pt, R_inter_Shaft ))
Slab = Surface.Thicken(Slab_Profil, -Thk_Slab, bool(0))
# opening profil to be subtract from the slab
Trape_arc = Arc.ByCenterPointRadiusAngle(Center_pt, R_inter_Shaft, -angle_Trape, angle_Trape, vector )
Pt1 = Trape_arc.StartPoint
Pt2 = Trape_arc.EndPoint
Pt3 = Pt1.Translate(-Long_Trape)
Pt4 = Pt2.Translate(-Long_Trape)
Line1 = Line.ByStartPointEndPoint(Pt3, Pt4)
Line2 = Line.ByStartPointEndPoint(Pt3, Pt1)
Line3 = Line.ByStartPointEndPoint(Pt4, Pt2)
Profil_Trape = Surface.ByPatch(PolyCurve.ByJoinedCurves([Line1, Line2, Trape_arc, Line3]))
Trape = Surface.Thicken(Profil_Trape, Thk_Slab, bool(0))
Finale_Slab = Solid.Difference(Slab, Trape)
# Shaft1 geometry and Family Type
lst3 = [Shaft1, Finale_Slab]
Final_Shaft1 = Solid.ByUnion(lst3)
Final_Shaft1 = Geometry.Scale(Final_Shaft1, 0.3048)
Final_Shaft1 = FamilyType.ByGeometry(Final_Shaft1, Family1_name, Family_Cat, Family_Path, Material, 'a')
# Shaft2 geometry and Family Type
lst4 = [Shaft2, Finale_Slab]
Final_Shaft2 = Solid.ByUnion(lst4)
Final_Shaft2 = Geometry.Scale(Final_Shaft2, 0.3048)
Final_Shaft2 = FamilyType.ByGeometry(Final_Shaft2, Family2_name, Family_Cat, Family_Path, Material, 'a')
# create Revit Levels
k = 0
Niv = []
for i in H_Level:
k += 1
Lev = Level.ByElevationAndName(i, 'Niveau ' + str(k))
Niv.append(Lev)
print(Lev)
H_Level.sort(reverse=True)
#create and place family Instances Fut1 and Fut2 in their corresponding levels
Fut = []
for i, j in zip(Niv, H_Level):
Fut1 = FamilyInstance.ByPointAndLevel(Final_Shaft1, Point.ByCoordinates(-R_exter_Shaft, -R_exter_Shaft, 0), i )
H_offset = j
print(Fut1)
Fut.append(Fut1)
if H_offset < H_Shaft:
Fut2 = FamilyInstance.ByPointAndLevel(Final_Shaft2, Point.ByCoordinates(-R_exter_Shaft, -R_exter_Shaft, 0), i )
print(Fut2)
Fut.append(Fut2)
OUT = Fut
```

Shaft_python.dyn (23.5 KB)

Thanks.