BON CODE SOUS REVIT (1/3)

BON CODE SOUS REVIT

Vous êtes utilisateur de Revit, et vous avez besoin de bout de code pour améliorer votre processus de travail.
Cela tombe bien, Revit offre de nombreux outils pour réaliser des scripts. On peut citer Python et C# au sein d’applications externes, de scripts de console, et même de programmations graphiques ‘No-Code’, type Dynamo.
Vous vous y êtes mis et vous avez réussi à créer vos premiers scripts à l’aide d’exemples en ligne. Bravo, vous êtes développeur de logiciels !
Si vous souhaitez approfondir dans cette discipline pour créer des plugins puissants, seul ou en équipe, il va falloir écrire du bon code, sous peine de se perdre dans son propre code…
Je parle de non code pour ne pas dire clean code car cela fait référence a quelque chose de bien précis.
Je vous propose donc une série d’articles afin d’apprendre à écrire du bon code. Dans ces articles, nous parlerons de programmation en C# pour Revit.
Notre premier exemple est une commande ultra simpliste qui va permettre de créer une ligne de modèle cercle dans la vue courante de centre identique à un cercle existant (ligne de modèle) et de rayon supérieur de 1 mètre à ce dernier cercle existant.
C’est parti !
Voici le code que je vous propose et qui fonctionne :

Code initial

namespace ing3d.example
{
    [Transaction(TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        private const double M_TO_FEET = 3.2808399;
        private const double DEGRES360 = 2.0 * Math.PI;
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            using (Transaction transaction = new Transaction(doc))
            {
                transaction.Start("Transaction");
                ModelArc m = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element, "Selectionner le cercle : ")) as ModelArc;
                Arc arc = m.GeometryCurve as Arc;
                XYZ Center = arc.Center;
                double rayon = arc.Radius;
                arc = Arc.Create(Center, rayon + 3.2808399, 0.0, 2.0 * Math.PI, XYZ.BasisX, XYZ.BasisY);
                doc.Create.NewModelCurve(arc, uidoc.ActiveView.SketchPlane);
                transaction.Commit();
            }
            return Result.Succeeded;
        }
    }
}

Je ne parlerai pas volontairement de mise en forme et je laisserai l’éditeur de code formater le texte selon ses paramètres par défaut.

Les conventions de minuscules / majuscules.

En programmation C#, nous sommes sensibles à la casse. Pour parler plus simplement, une variable en majuscule et une variable en minuscule ne représente pas la même chose.
C’est pourquoi il faut adopter une règle de nommage pour tout le code et s’y tenir.
Je vous propose la convention suivante (qui est un standard) :
Les noms des variables commencent par une minuscule et sont ensuite composé d’une suite de mot commençant par une majuscule.
Les noms des méthodes et des classes commencent par une majuscule.

Modification 1 : les noms de variable doivent commencer par une majuscule.

On remplace les lignes :

XYZ Center = arc.Center;
arc = Arc.Create(Center, rayon + 3.2808399, 0.0, 2.0 * Math.PI, XYZ.BasisX, XYZ.BasisY);

Par

XYZ center = arc.Center;
arc = Arc.Create(center, rayon + 3.2808399, 0.0, 2.0 * Math.PI, XYZ.BasisX, XYZ.BasisY);

La langue de travail

L’anglais est omniprésent dans l’informatique et on travaillera en anglais par défaut.
On évitera de traduire des données implicites au logiciel.
Cependant, il est tout à fait acceptable de garder le français pour la logique métier. Par exemple, on peut ne pas traduire des termes techniques comme ‘beton brosse’, ‘beton desactive’, tout en supprimant les accents.

Modification 2 : les noms des objets Revit ne doivent pas être traduit.

On remplace :

double rayon = arc.Radius;

par

double radius = arc.Radius;

Les noms de variable

Les noms de variable doivent permettre de bien comprendre ce qu’elles contiennent.
C’est un vaste sujet et nous veillerons dans un premier temps à que les abréviations soient explicites et sans ambigüité.

Modification 3 : modification des noms de variables trop courts.

On remplace :

ModelArc modelArc = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element, "Selectionner le cercle : ")) as ModelArc;

par

ModelArc modelArc = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element, "Selectionner le cercle : ")) as ModelArc;

Ligne de code trop complexe

Lorsqu’une ligne de code appelle plusieurs objets en cascade, il peut être plus lisible de décomposer la ligne en plusieurs lignes.

Modification 4 : décomposition de ligne de code

On remplace :

ModelArc modelArc = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element, "Selectionner le cercle : ")) as ModelArc;

par

Reference referenceSelection = uidoc.Selection.PickObject(ObjectType.Element, "Selectionner le cercle : ") ;
ModelArc modelArc = doc.GetElement(referenceSelection) as ModelArc;

Avec ces 4 modifications, on a nettoyé notre code, mais on est encore loin d’un code correct !

Fermer le menu