Aller au contenu

PyRevit : Glossaire

Je vais partager ici des exemples de code par fonction qui m’ont été utile pour mes scripts. Je le compléterai au fur et à mesure et je vous invite à m’envoyer les vôtres afin d’avoir un document le plus complet possible. Il vous suffit de copier les lignes dans la console RevitPythonShell avant de l’exécuter.

***

Collecter des éléments

Création d’une liste des dimensions des accessoires de gaines:

#Je crée une liste vide python
DA_size = []
#Je créer une liste Revit des accessoires de gaine qui utilse la synthaxe de l'API
DAs = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_DuctAccessory)\
.WhereElementIsNotElementType().ToElements()
#Pour chaque accessoires de gaine dans la liste je collecte les dimensions que je copie
#dans ma liste python
for DA in DAs:
	#Size - Instance Parameter
	size = DA.get_Parameter(BuiltInParameter.RBS_CALCULATED_SIZE)
	DA_size.append(size.AsString())
#J'affiche ma liste de dimensions d'accessoires de gaine que je pourrais utiliser
#plus loin dans mon script.
print(DA_size)

Pour collecter les paramètre de type il y a une ligne de code à ajouter :

#Je créer une liste vide pour stocker les noms des familles
DA_family_name = []

for DA in DAs:

	#C'est la ligne à ajouter pour lire les paramètres de type
	DA_type = doc.GetElement(DA.GetTypeId())

	# Family Name - Type Parameter
	family_name = DA_type.get_Parameter(
					BuiltInParameter.SYMBOL_FAMILY_NAME_PARAM)
	DA_family_name.append(family_name.AsString())

***

Collecter les espaces des éléments

Récupérer les noms et numéros d’espaces des éléments

### Collecte les Air Terminal ###
ATs = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_DuctTerminal)\
.WhereElementIsNotElementType().ToElements()

for AT in ATs:
 #Selection de la phase des espaces à collecter
 phase = doc.Phases[1] #[1]Phase New, [0]Phase Existing

 #Récupération de la l'espace de l'élément
 space = AT.Space[phase]

 #Numéro de l'espace
 space_number = space.Number
 #Nom de l'espace
 space_name = space.Name

#Pour la même opération sur les pièces remplacer "AT.Space" par "AT.Room"

***

Localiser des éléments

Récupérer les coordonnées x,y,z d’un ou plusieurs élements par catégories.

#Collecte des Mechanical equipmnent du projet
MEs = FilteredElementCollector(doc)\
.OfCategory(BuiltInCategory.OST_MechanicalEquipment)\
.WhereElementIsNotElementType().ToElements()

#Affiche les coordonnées
for ME in MEs:
 loc = ME.Location.Point
 print(loc.X, loc.Y, loc.Z)

***

Nom des paramètres

Nous appellerons paramètres visibles ceux que nous voyons dans l’interface utilisateur Revit (front end) et paramètres internes ceux utilisés par le language de programmation pour piloter le logiciel (back end).

Pour connaitre le nom des paramètres interne afin de communiquer avec Revit il vous suffit de lancer ce code qui vous donnera les paramètres de type et les paramètres d’instance. Pour cela j’ouvre un nouveau fichier Revit et j’insère l’élément dont je veux connaitre les paramètres.

import clr
import System
clr.AddReference('RevitAPI') 
clr.AddReference('RevitAPIUI') 
from Autodesk.Revit.DB import * 

app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document


#Is element type

print('#'*20)
print('Is element type')
print('-'*20)

PA1 = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeAccessory).WhereElementIsElementType().FirstElement()

for p in PA1.Parameters:
    print(p.Definition.Name)
    try:
        print(p.GUID)
    except:
        print(p.Definition.BuiltInParameter)
    print('-'*20)
    
#Is NOT element type

print('#'*20)
print('Is NOT element type')
print('-'*20)

PA2 = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeAccessory).WhereElementIsNotElementType().FirstElement()

for p in PA2.Parameters:
    print(p.Definition.Name)
    try:
        print(p.GUID)
    except:
        print(p.Definition.BuiltInParameter)
    print('-'*20)

Nous obtenons en minuscule le nom du paramètre visible dans Revit suivi en majuscule du paramètre interne :

Affichage des paramètre dans la console RevitPythonShell

***

Paramètre partagé

Pour utiliser un paramètre partagé dans votre code il faut utiliser la fonction Guid.

from System import Guid
num_equip = Guid(r'f463541e-6891-4d37-a171-ee91b3c956ef')

Nous aurons au préalable récupérer l’identifiant du paramètre partagé en ayant suivi les instructions du chapitre “Nom des paramètre”.

***

Sélectionner des éléments

from System.Collections.Generic import List
from Autodesk.Revit import UI

### Collecte les Pipe Accessories ###
PAs = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeAccessory)\
.WhereElementIsNotElementType().ToElements()

#Créer une liste vide d'élements Revit
id_list = List[ElementId]()

#Ajoute des éléments avec leur Id (ici des Pipe Accessories) à la liste
for PA in PAs:
	id_list.Add(PA.Id)

#Sélectionne les éléments
uidoc.Selection.SetElementIds(id_list)
#Zoom sur les éléments
UI.UIDocument.ShowElements(uidoc, id_list)

Bien sûr ce code seul n’a que peu d’intérêt mais imaginez que vous pouvez l’associer à n’importe quelle valeur d’un paramètre ! Par exemple vous pouvez chercher/trouver le code GMAO d’une vanne en un click et sans passer par un Schedule. Très utile quand vous avez 1000 équipements !

***

Simplifier les dimensions des éléments MEP

Il peut être utile de simplifier les dimensions de type “DN200-DN200” en “200” pour la lisibilité ou l’utilisation dans des applications externes à Revit. Je vous partage quelques exemples dans les lignes de codes suivantes.

### Collecte les Pipe Accessories ###
PAs = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeAccessory)\
.WhereElementIsNotElementType().ToElements()

for PA in PAs:
  #Extraction de la dimension du Pipe Accessories
  size = PA.get_Parameter(BuiltInParameter.RBS_CALCULATED_SIZE)
  size_out = size.AsString() #DN200-DN200 ou DN50-DN50
  #Supression du DN
  size_out = size_out[2:5] #200 ou 50-

  #Suppression du "-" si DN à 2 chiffres
  size_out = size_out.strip('-') #200 ou 50


### Collecte les Duct Accessories ###
DAs = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_DuctAccessory)\
.WhereElementIsNotElementType().ToElements()

for DA in DAs:
  #Extraction de la dimension du Duct Accessories
  size = DA.get_Parameter(BuiltInParameter.RBS_CALCULATED_SIZE)
  size_out = size.AsString() #Ø315-Ø315 ou 1200x600-1200x600
  #Supression du "-" et du doublon
  if len(size_out) >= 3: 
    pos = size_out.index('-')
    size_out = size_out[0:pos] #Ø315 ou 1200x600

***

Types de donnée

#Chaîne de caractères
family_name.AsString()
#Variable numérique
length.AsDouble()
#Variable numérique avec unités (par exemple 25 m²)
area.AsValueString()

***

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *