Revit C# : Hello world

nous présentons ici le code minimaliste afin d’afficher la célèbre phase ‘Hello World’.

La boite de dialogue

Revit étant dans un système d’exploitation graphique (par opposition à une console), il nous faut afficher le message dans une simple boite de dialogue.

l’API Revit nous fournit une classe équivalente à MsWindows ‘MessageBox’ qui se nomme ‘TaskDialog’. Elle est dans le namespace ‘Autodesk.Revit.UI’.
Il existe une méthode statique ‘Show()’ qui permet d’utiliser cette classe sans instancier un objet.
Cette méthode statique affiche une boite de dialogue avec un titre, un texte à afficher et un bouton ‘fermer’.
Elle prend donc logiquement deux arguments : un string contenant le titre et un string contenant le texte afficher.

Toutes ces infos sont regroupées dans la signature de la méthode, ci-dessous.

public static TaskDialogResult Autodesk.Revit.UI.TaskDialog.Show(
	string title,
	string mainInstruction
)

Le code complet sans utiliser les using (pour mémoriser les namespaces).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// Hello World 
[Autodesk.Revit.Attributes.Transaction( Autodesk.Revit.Attributes.TransactionMode.Manual )]
public class HelloWorld : Autodesk.Revit.UI.IExternalCommand
{
  public Autodesk.Revit.UI.Result Execute(
    Autodesk.Revit.UI.ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements )
    { 
      Document doc = commandData.Application.ActiveUIDocument.Document;
      using (Transaction trans = new Transaction(doc))
      {
        trans.Start("HelloWorld");
        Autodesk.Revit.UI.TaskDialog.Show("un titre","Hello World!" );
        trans.Commit();
      }
      return Autodesk.Revit.UI.Result.Succeeded;
    }
}

Explication ligne par ligne

ligne 1 : un commentaire (une ligne qui commence par ‘//’)
ligne 2 : un attribut de classe obligatoire qui renseigne l’attribut ‘transaction’ en lui donnant 1 valeur aux choix :
_ TransationMode.ReadOnly lorsque l’on ne modifie pas la base de donnée d’un modèle Revit,
_ TransationMode.Manual dans le cas contraire.
Il est a remarqué que la valeur ‘Automatic’ n’est plus autorisé sous Revit 2017 et supérieur.
ligne 3,4 et 17 : on déclare une classe publique (pour que l’utilisateur puisse y accéder), qui a pour interface IExternalCommand
ligne 5,6 et 7 : on crée une méthode ‘execute’ qui prend 3 paramètres d’entrée. Ces paramètres servent à renvoyer des informations optionnelles à la fin de l’exécution.
ligne 8 : on crée en variable contenant une référence au document en cours. S’il n’y a pas de document en cours, le problème plante (génère un exception).
lignes 9,10 et 14 : on initialise une transaction dans le document en cours
ligne 11 : on démarre la transaction
ligne 12 : on affiche notre boite de dialogue (sans recuperer la valeur de retour)
ligne 13 : on ferme la transaction en demandant d’exécuter les commandes qui la compose.
ligne 15 : on renvoi une valeur de sortie sous forme d’enumeration pour la méthode Execute() afin de définir si l’exécution s’est bien passée, si elle a échouée ou si l’utilisateur l’a annulé.


Le code complet avec les using.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
 
/// Hello World 
[Transaction(TransactionMode.Manual )]
public class HelloWorld : IExternalCommand
{
  public Result Execute(
    ExternalCommandData commandData, ref string message, ElementSet elements )
    { 
      Document doc = commandData.Application.ActiveUIDocument.Document;
      using (Transaction transaction = new Transaction(doc))
      {
        trans.Start("HelloWorld");
        TaskDialog.Show("un titre","Hello World!" );
        trans.Commit();
      }
      return Result.Succeeded;
    }
}
Fermer le menu