Set the family instance's Point location at its center in Python

@jacob.small

I chosed this option to solve my problem…the idea came to me is alter levels creation or otherwise set two levels groups (even and odd that alternate between them) which allows me to alter the position of my instances and finally to be able to rotate the even ones and get the desired orientation.

Here my code for any suggestions (to reduce its length or shorten the steps):

Final_Shaft
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
n = int(math.ceil(H_Total / H_Shaft))
if H_Total % H_Shaft > 0:
    H_2 = H_Total - (n-1) * H_Shaft
else:
    H_2 = 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.Translate(Final_Shaft1, -Thk_Slab)
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
vect = Vector.ByCoordinates(0,0,-Thk_Slab)
lst4 = [Shaft2, Finale_Slab]
Final_Shaft2 = Solid.ByUnion(lst4)
Final_Shaft2 = Geometry.Translate(Final_Shaft2, -Thk_Slab)
Final_Shaft2 = Geometry.Scale(Final_Shaft2, 0.3048)
Final_Shaft2 = Final_Shaft2.Translate(vect)
Final_Shaft2 = FamilyType.ByGeometry(Final_Shaft2, Family2_name, Family_Cat, Family_Path, Material, 'a')

levels = []
shafts = []
remainder = []
      
for i in range(n):
    if i % 2 == 0:
        currentHeight1 = i * H_Shaft
        name1 = "Niveau " + str(i+1)
        level1 = Level.ByElevationAndName(currentHeight1, name1)
        remainingHeight1 = H_Total - currentHeight1
        remainder.append(remainingHeight1)
        if remainingHeight1 <= H_Shaft:
            if remainingHeight1 != H_Shaft:
                Shaft2 = FamilyInstance.ByPointAndLevel(Final_Shaft2, Point.ByCoordinates(-R_exter_Shaft, -R_exter_Shaft, 0), level1)
                shafts.append(Shaft2)
            else:    
                Shaft1 = FamilyInstance.ByPointAndLevel(Final_Shaft1, Point.ByCoordinates(-R_exter_Shaft, -R_exter_Shaft, 0), level1 )
                shafts.append(Shaft1)
            name1 = "Niveau " + str(i+2) 
            level1 = Level.ByElevationAndName(H_Total, name1)
        else:
            Shaft1 = FamilyInstance.ByPointAndLevel(Final_Shaft1, Point.ByCoordinates(-R_exter_Shaft, -R_exter_Shaft, 0), level1 )
            shafts.append(Shaft1)  
      
    else:
        currentHeight2 = i * H_Shaft
        name2 = "Niveau " + str(i+1)
        level2 = Level.ByElevationAndName(currentHeight2, name2)
        remainingHeight2 = H_Total - currentHeight2
        remainder.append(remainingHeight2)
        levels.append(level2)
        if remainingHeight2 <= H_Shaft:
            if remainingHeight2 != H_Shaft:
                Shaft2 = FamilyInstance.ByPointAndLevel(Final_Shaft2, Point.ByCoordinates(-R_exter_Shaft, -R_exter_Shaft, 0), level2)
                shafts.append(Shaft2)
            else:    
                Shaft1 = FamilyInstance.ByPointAndLevel(Final_Shaft1, Point.ByCoordinates(R_exter_Shaft, R_exter_Shaft, 0), level2 )
                shafts.append(Shaft1)
        
            name2 = "Niveau " + str(i+2) 
            level2 = Level.ByElevationAndName(H_Total, name2)
            levels.append(level2)        
        else:
            Shaft1 = FamilyInstance.ByPointAndLevel(Final_Shaft1, Point.ByCoordinates(R_exter_Shaft, R_exter_Shaft, 0), level2 )
            shafts.append(Shaft1)  
        
shafts1 = [FamilyInstance.SetRotation(i, 180) for count, i in enumerate(shafts) if count % 2 == 1]

for i in range(len(shafts),2):
    for j in range(len(shafts_1)):
        shafts_1[j] = shafts[i]
OUT = shafts, remainder

I still have a small trick to fix :
my instances are placed with an offset of 10cm (which is the slab thickness) compared to their levels… I know that I can move them manualy or using Element.MoveByVector node but in this case I loose the instances proprities, so any suggetion to correct this trick?

Thanks.