Revit C# : dynamic model update

Lorsque qu’un élément du modèle en cours est modifié, on peut demander au logiciel de lancer un code. Ce code ne sera donc exécuté qu’une seule fois par modification. Ainsi, les performances ne sont pas trop altérées.
On a besoin d’une méthode contenant le code a exécuter et des fonctions pour respectivement démarrer l’écoute et l’arrêter. Ces deux dernières fonctions seront en générale liée à une commande personnalisée Revit (un bouton).

Démarrage et arrêt des écouteurs

1
2
3
4
5
6
public void RunFamilyUpdater() {
    FamilleUpdater updater = new FamilleUpdater(this.Application.ActiveAddInId);
    UpdaterRegistry.RegisterUpdater(updater);
    ElementClassFilter familyInstanceFilter = new ElementClassFilter(typeof(FamilyInstance));
    UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), familyInstanceFilter, Element.GetChangeTypeElementAddition());
}

explication ligne par ligne
ligne 1 : on crée une fonction qui va démarrer l’écouteur et qui ne renvoi rien
ligne 2 : on démarre une instance de notre futur écouteur.
ligne 3 : on enregistre l’élément crée ci-dessus.
ligne 4 : on crée un filtre afin de ne conserver que les éléments de type FamilyInstance
ligne 5 : on ajoute un écouteur en précisant son implémentation, son filtre et son type.
L’écouteur peut être :
.GetChangeTypeElementAddition : se déclenche quand un élément a été ajouté.
.GetChangeTypeElementDeletion : se déclenche quand un élément à été supprimé.
.GetChangeTypeGeometry : se déclenche quand un élément à été modifié.
.GetChangeTypeParameter : se déclenche quand un paramètre d’une famille a été modifier.
.GetChangeTypeAny : se déclenche quand quelque à changé dans le modèle Revit.

1
2
3
4
public void StopFamilyUpdater() {
    FamilleUpdater updater = new FamilleUpdater(this.Application.ActiveAddInId);
    UpdaterRegistry.UnregisterUpdater(updater.GetUpdaterId());
}

explication ligne par ligne
ligne 1 : on crée une fonction qui va arrêter l’écouteur et qui ne renvoi rien.
ligne 3 : on supprime l’écouteur.

Le code à lancer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FamilleUpdater : IUpdater {
    static AddInId m_appId;
    static UpdaterId m_updaterId;
    public FamilleUpdater(AddInId id) {    {
        m_appId = id;
        m_updaterId = new UpdaterId(m_appId, new Guid("c286f42d-9ab0-4fa0-a578-00d19768ae22"));
    }
    public void Execute(UpdaterData data)     {
        Document doc = data.GetDocument();
        foreach (ElementId elemId in data.GetAddedElementIds())
        {
            FamilyInstance fi = doc.GetElement(elemId) as FamilyInstance;
            if (fi != null)
            {
                // code a ajouter lié à l'instance de famille en cours
            }
        }
    }
    public string GetAdditionalInformation(){return "description de l'écouteur";}
    public ChangePriority GetChangePriority(){return ChangePriority.FloorsRoofsStructuralWalls;}
    public UpdaterId GetUpdaterId(){return m_updaterId;}
    public string GetUpdaterName(){return "nom de l'écouteur";}
}

explication ligne par ligne
ligne 1 : on crée une classe qui implémente d’interface IUpdater.
lignes 2-3 : on crée 2 variables private qui seront utilisées par le constructeur.
lignes 4-7 : on définit le constructeur de la classe.
ligne 8 : la méthode Execute contient le code à exécuter.
ligne 9 : on déclare une variable de type Document.
ligne 10 : on démarre une boucle contenant les éléments qui sont à l’origine de l’écouteur.
ligne 12 : on récupère chaque élément.

Fermer le menu