[Revit] Créer un tuyau d’un point A à un point B façon python

Plusieurs articles montrent comment créer un tuyau en C# :
http://pastebin.com/RZn1WnMW
http://thebuildingcoder.typepad.com/blog/2014/01/final-rolling-offset-using-pipecreate.html

Voici un code très court qui montre comment faire en python.

Il ne faut pas oublier d’ajouter la ligne suivante pour importer les fonctions liées aux tuyaux :

from Autodesk.Revit.DB.Plumbing import *

Pour créer un tube entre 0.0.0 et 10.0.0, le code est le suivant (on utilise le premier type de système et de tube qui nous tombe sous la main).

t = Transaction(doc, "Création d'un tuyau")
t.Start()
def pickobject():
	from Autodesk.Revit.UI.Selection import ObjectType
	__window__.Hide()
	picked = uidoc.Selection.PickObject(ObjectType.Element)
	__window__.Show()
	__window__.Topmost = True
	return picked
#Trouve un type de tuyau, un type de système et le niveau de la vue courante
idtypetuyau = FilteredElementCollector(doc).OfClass(PipeType).FirstElement().Id
idtypesystem = FilteredElementCollector(doc).OfClass(PipingSystemType).FirstElement().Id
idniveau = doc.ActiveView.GenLevel.Id
#Création du point de départ et d'arrivée du tuyau
p1 = XYZ(0, 0, 0)
p2 = XYZ(10, 0, 0)
#Création du tuyau
Pipe.Create(doc, idtypesystem, idtypetuyau, idniveau, p1, p2)
t.Commit()

[Revit] Rotation de famille sur l’axe X

L’outil rotation de Revit permet de faire une rotation sur l’axe z uniquement. Pour une rotation sur l’axe X, il faut aller en coupe et je n’aime pas devoir changer de vue pour une opération aussi simple. Voici un script pour effectuer une rotation sur l’axe X, on peut utiliser la même méthode sur l’axe Y :

t = Transaction(doc, "Rotation axe x")
t.Start()
point2 = XYZ(0,0,1)
for e in getselection():
	o = doc.GetElement(e).Location.Point
	z = XYZ(o.X + 1, o.Y, o.Z)
	axis = Line.CreateBound(o, z)
	ElementTransformUtils.RotateElement(doc,e,axis,pi/2)
t.Commit()

Voici une vidéo démo d’un application simple et utile :

[Revit] Supprimer un système MEP

Même principe que pour les familles, le code suivant supprime les systèmes des objets sélectionnés :

uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
getselection = uidoc.Selection.GetElementIds

t = Transaction(doc, "supprimer_système")
t.Start()
#Trouve l'Id des systèmes des objets sélectionnés et supprime ces systèmes
s = []
for e in getselection():    
    try:
        s.append(doc.GetElement(e).MEPSystem.Id)
    except:
        c = doc.GetElement(e).MEPModel.ConnectorManager.Connectors
        for i in c:
            if i.MEPSystem != None:
                id = Element.Id.GetValue(i.MEPSystem)
                print id
                s.append(id)                
for id in s:
    print id
    doc.Delete(id)
t.Commit()

Cette fonction est très utile pour gérer les systèmes. Il arrive souvent avec Revit que les systèmes ne fonctionnent pas comme on le voudrait et qu’il faille supprimer des systèmes polluant le projet. Supprimer un système est parfois le seul moyen de remettre les choses en ordre et il n’est pas pratique d’aller chercher le système dans le navigateur de système qui en contient parfois des centaines.

Vidéo démo (dsl pour les parasites, il faut que je trouve d’où ils viennent pour la prochaine) :

 

 

[Revit] Supprimer des familles sélectionnées du projet

Quand vous devez nettoyer un projet des familles inutiles, il existe bien sûr la fonction « Purger les éléments inutilisés ». Mais lorsque l’on veut supprimer des familles spécifiques que l’on a sous les yeux :
– une purge est longue et fastidieuse : le lancement de la fonction dure un certain moment pour un gros projet et il ne faut pas se tromper de nom.
– Si on va chercher les éléments dans l’arborescence : plus le projet est gros, plus cela sera pénible.
– En faisant une recherche dans les familles : Il faut taper le nom de la famille, qu’il faut connaître.

Voici une petite fonction pour simplement supprimer les familles sélectionnées du projet :

uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
getselection = uidoc.Selection.GetElementIds

t = Transaction(doc, "supprimer_famille")
t.Start()
#Trouve l'Id des familles sélectionnées et supprime ces familles
for e in getselection():
	s = doc.GetElement(e).Symbol.Family.Id
	doc.Delete(s)
t.Commit()
exit()

Vidéo démo :

 

[Revit] Renommer automatiquement les vues de manière plus intelligente

Quand vous devez créer plusieurs vues d’un même niveau (ventilation, chauffage de sol, électricité etc…), Revit a la brillante idée de rajouter  (1), (2) etc…

revitnommevuepythonnommevue

Voici un petit script pour renommer automatiquement les vues en ajoutant le nom du type de plan :

uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
getselection = uidoc.Selection.GetElementIds

t = Transaction(doc, "Renomme la vue")
t.Start()
for e in getselection(): #Cherche l'Id des éléments sélectionnés
    view = doc.GetElement(e) #Cherche l'élément correspondant à l'Id
    vft = doc.GetElement(view.GetTypeId()) #Get ViewFamilyType Id
    vft_name = Element.Name.GetValue(vft) #Get ViewFamilyType Name
    view.Name = view.GenLevel.Name + " - " + vft_name #Nomme la vue avec nom du niveau associé + nom du type de la vue
t.Commit()

Vous pouvez facilement modifier le code pour mettre un suffixe, un préfixe ou prendre un autre nom de paramètre existant .