dimanche 15 janvier 2017

Utiliser Visual Studio pour créer des API en C# pour Revit

La création d'application avec Dynamo a de grandes qualités mais aussi des limites assez vite atteintes (travaille sur les listes de plusieurs niveaux par exemple).
J'ai donc très vite utilisé le langage Python qui est naturellement supporté par les Nodes de Dynamo. Le langage Python permet de faire énormément d'applications sur Revit (même graphique), mais je me confronte au manque de littérature sur l'utilisation des librairies Revit en Python. J'ai donc trouvé très fastidieux de progressé avec le langage Python.
De plus, à ce stade d'avancement dans mes applications, je veux pouvoir interagir avec le modèle Revit et pour cela avoir a ma disposition de la littérature fournie (cours, Blog, Forums, librairies d'objets et méthodes,...). 
Le logiciel Revit étant créé sous c# (C Sharp), je me tourne naturellement vers ce langage pour aller plus loin dans la programmation d'application pour Revit.
Pour programmer en C#, je choisi d'utiliser Visual Studio Express 2015 (version gratuite).
Les difficultés apparaissent des la première application que je veux créer... Utiliser l’environnement de programmation est fastidieux et la fameuse littérature date un peu et demande donc beaucoup de travail de recherche pour déboguer les cours. 
Cet article à donc pour objectif de tracer les points de blocage que j'ai rencontré et leurs solutions (qui sont souvent très simples après avoir passé des heures à chercher).

Version logiciels utilisés lors de cet article :
 - Revit 2017
 - Dynamo 1.2.1
 - Visual studio expert 2015


Liens qui m'ont été utiles pour progresser :


1) Création d'un projet pour Revit de type librairie : Solution manuelle
Il faut être vigilant sur le type de projet choisi dans la fenêtre de création, la vérification se fait au niveau des références de la deuxième image.

Vérifier après la création du projet que les références soient conforme :

Il faut ensuite ajouter les références concernant Revit : RevitAPI et RevitAPIUI, avec le réglage copie locale sur False dans la fenêtre propriété.

Paramétrer le Déboguage pour les librairies :
Pour déboguer les librairies et créer le fichier .DLL, il faut utiliser 'Générer la solution" qui ne se trouve pas dans le menu déboguer.
Générer la solution par : Ctrl + Maj + B ou bouton droit de la souris sur le projet dans l'explorateur de solution.

Lancer le débogueur en même temps que Revit :
Pour lancer Revit lors du déboguage il faut modifier les réglages ci-dessous:
Visual Studio : Déboguer : Propriétés "projet en cours"

Fournir le lien du fichier Exe de Revit au système :

Créer avec le bloc note de windows le fichier "VotreProgramme.addin" (l'extension doit impérativement être .addin) contenant une copie du texte ci-dessous. Remplacer le texte surligné par le chemin vers le fichier .dll de votre programme (dans le répertoire débug). (Lien vers page anglaise)
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
<AddIn Type="Command">
    <Name>HelloWorld</Name>
    <FullClassName>HelloWorld.HelloWorld</FullClassName>
    <Text>HelloWorld</Text>
    <Description>Show Hello World.</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
    <Assembly>C:\Samples\HelloWorld\HelloWorld\bin\Debug\HelloWorld.dll</Assembly>
    <AddInId>239BD853-36E4-461f-9171-C5ACEDA4E723</AddInId>
    <VendorId>ADSK</VendorId>
    <VendorDescription>Autodesk, Inc, www.autodesk.com</VendorDescription>
  </AddIn>
</RevitAddIns>
Enregistrer le fichier "VotreProgramme.addin" dans le répertoire Addins de Révit.
Modifier l'option de débogage pour éviter l'erreur "Le programme '[764] Revit.exe' s'est arrêté avec le code 0 (0x0)." dans la fenêtre de sortie, de la façon suivante :
 - Outils > options > Débogage > Général > Utiliser le mode de compatibilité managé (sur on).
Pour lancer le débogage, il suffit de taper F5. Revit se lance pendant le débogage...


2) Installation d'Add-in avec la méthode de thebuildingcoder (Lien vers la page en anglais) en automatique.

Le fichier .zip est à télécharger ici : revit2017addinwizardcs0 (1).zip (dernière version pour Revit 2017).
Copier le fichier zip à cet emplacement sur cotre pc (sans le déziper) :
"C:\Users\NomUtilisateur\Documents\Visual Studio 2015\Templates\ProjectTemplates\Visual C#"

Vérifier dans Menu > déboguer > Propriétés du projet en cours : que le fichier lien de la ligne "Démarrer le programme externe" pointe correctement Revit.exe.

Lors de la création d'un nouveau projet on obtient maintenant l'icone Revit 2017. Il faut l'utiliser pour créer un projet Revit :





jeudi 5 janvier 2017

Transformer un symbole DWG en Curves Revit

On utilise cet applicatif Dynamo pour transformer les anciens symboles DWG et polycurves sur Revit.
Cela nous évite de redessiner les Symboles 2D utilisés pour les familles types.

Liens de téléchargement :
 - Fichier Dynamo

Développé sur Revit 2016/2017 - Dynamo 1.2.1


Résultat obtenu ci-dessous, à droite les curves dessinées sur la base du fond de plan DWG.
Sur la photo, le fond de plan a été déplacé pour. lors de l'exécution de l'applicatif les curves se juxtaposent aux symboles DWG.




samedi 31 décembre 2016

Dessiner des familles sur Revit

A la base je voulais juste dessiner un ensemble de familles appartenant à une catégorie pour pouvoir les contrôler visuellement et vérifier la cohérence des symboles.

Le programme Dynamo que j'ai créé m'a révélé des difficultés que je pense être intéressant de partager.

Liens de téléchargement :

Développé sur Revit 2016/17 - Dynamo 1.2


A partir d'un répertoire contenant des familles, je vais dessiner sur le plan chaque familles types.
Les familles doivent être préalablement chargées dans le plan.

liste des répertoires :
Initialiser l'application en donnant le chemin racine des familles et du fichier excel dans lequel on écrira la liste des familles.
Vue d'ensemble du WorkFlow :



Zone 1 -  On pointe sur le répertoire racine donné dans la zone d'initialisation, et on récupère la liste de tous les fichiers .rfa avec leur chemin d'accès.


Zone 2 -  La zone commence par un bout de programme en Python.
La première image concerne les initialisations....


Dans la deuxième image, je soustrait la chaîne contenant le nom de la famille de la chaîne complète.
Il y a une méthode plus directe en utilisant  l_chemin.split("\"),...


Il faut ensuite convertir la chaîne de caractères récupérée dans le programme Python en Famille type en utilisant le paramètre Nom.

Zone 3 - J'écris dans un fichier Excel les infos que j'ai pu récupérer. Ca peut toujours servir pour une vérification.

Zone 4 : 
C'est là que j'ai été confronté à un vrai problème !
Suivant la catégorie dans laquelle la famille a été créé, il faut (ou pas) un hôte pour pouvoir implanter la famille dans le plan.
Pour les familles qui ne sont pas accrochées à un mur, on peut utiliser le Node "FamilyInstance.Bypoint". 

Pour les familles accrochées à un mur, il faut utiliser le Node créé par Springs : "Springs.HostedInstance.Bypoints". 

J'applique donc le Node Springs.HostedInstance.Bypoints. en premier (zone 4) :



Zone 5 : 
Je filtre les éléments qui ne sont pas pris en compte par la méthode (renvoi nul) dans un bout de programme Python : 


J'applique la méthode FamilyInstance.Bypoint sur le reste des family types. 
Pour l'instant je n'ai pas trouvé de meilleure solution.... 


Zone 6 : Suppression des doublons éventuels



Résultats :
Le fichier excel sera utile pour pouvoir dessiner grace à Dynamo des familles. 


L'affichage de toutes les familles ensemble.






jeudi 29 décembre 2016

Familles : Charger toutes les familles d'un répertoire dans le plan

Cet applicatif permet de charger en une seule fois tout un ensemble de familles dans le plan courant. Les familles déjà chargées ne sont pas rechargées.

Réalisable grâce au Node de Clockwork "Document.LoadFamily"

Liens de téléchargement :

Développé sur Revit 2016/17 - Dynamo 1.2


Pièces Plan MEP vers Excel

Dans cet article, je présente l'applicatif Dynamo qui me permet de récupérer les informations liées aux pièces et aux murs du plan MEP pour les stocker dans un fichier Excel.
Ces données Excel, complétées des données des fiches espaces du programme, me serviront ensuite dans un deuxième applicatif à créer les objets (familles) dans chaque pièces du plan MEP.

Liens de téléchargement :
 - Fichier Dynamo

Développé sur Revit 2016/2017 - Dynamo 1.2.1

A quoi sert l'applicatif Dynamo ? :
A partir du plan MEP dans lequel on a récupéré les pièces du plan Archi, nous créons un fichier Excel dans lequel on retrouvera toutes les informations nécessaires à l'identification des pièces du bâtiment.

Le fichier Excel sera ensuite renseigné et dans chaque pièces du fichier Excel, je déterminerai le nombre d'éléments à dessiner dans la pièce (en fonction de la fiche espace client).

Pour utiliser cet applicatif il faut :
 - Un Plan Revit MEP avec les pièces et leur libellés,

L'applicatif Dynamo :









mardi 27 décembre 2016

Excel vers Revit : Etiquettes de pièces vers Plan Revit MEP

Cet applicatif permet de renseigner les libellés des pièces créées dans le plan Revit MEP avec les libellés du plan Revit Archi qui ont été enregistrés dans un fichier Excel précédemment (Voir article correspondant)

Liens de téléchargement :

Développé sur Revit 2016/17 - Dynamo 1.2

A quoi sert l'application Dynamo ? :
Le développement Dynamo présenté ci-dessous permet de transférer les paramètres des pièces d'un plan Revit ARchi (généralement renseignés par l'Archi sur son modèle Revit) vers le plan MEP sur lequel je dois travailler.

Fond de plan Revit Archi avec le nom des pièces


Plan Revit MEP avant exécution de l'applicatif. Les étiquettes ne sont sélectionnables.



Plan Revit MEP après exécution de l'applicatif. Les étiquettes sont sélectionnables et modifiables dans le plan MEP.




Pour utiliser ce programme, il faut :
 1) Un fond de plan Revit Archi avec les murs et les étiquettes des pièces (Nom, Numéros, ..) lié à Revit (Revit->Insérer->Lier revit).

 2) Un plan Revit MEP avec les pièces créées. Voir l'article sur la création de pièces dans un plan MEP à partir des pièces du plan Revit Archi dans le Sommaire.

Faire apparaître les noms de pièces du plan Archi dans le plan MEP (Revit->VV (ou modification du gabarit de vue)->Lien Revit->Paramètres d'affichage : Par vue liée)

Les pièces du plan Archi sont maintenant visibles. 
Positionner la croix de la pièce de référence sur le texte de l'étiquette du plan Archi.



 3) Le fichier Excel qui a été renseigné avec l'applicatif Dynamo suivant (applicatif Dynamo). Ce fichier contient les infos nécessaires au transfert des étiquettes ( Texte du libellé, position de l'étiquette dans les coordonnées du plan Revit Archi, Coefficient d'échelle). Le coef d'échelle est enregistré avec l'applicatif N°2.


Quelques explications sur le programme :
Le programme est assez grand, je vais donc le décomposer.



Zone 1 : Zone d’initialisation des données avant exécution du programme


Zone 2 : Récupération de la totalité des pièces créées dans le Plan Revit MEP


Zone 3  - On récupère les caractéristiques (id et coordonnées) de la pièce du plan Revit qui à été sélectionnée sur le plan Revit MEP. Cela permet de créer une référence pour relier le plan Revit MEP au plan Revit ARchi.



Zone 4 - Dans cette partie on récupère les infos du fichier Excel et on isole les données de la pièce définie dans la zone 1 (la pièce de référence sur laquelle on à cliqué).
Le node string.contains permet de trouver l'index de la liste qui contient la chaîne de caractère "Nom de pièce" défini dans la zone 1.
Le node List.Slice nous permet de récupérer la sous liste qui concerne uniquement les données de la pièce de référence qui nous intéresse.



Zone 5 :  Les premiers blocs modifient les paramètres de la pièces en pointant sur la pièce de référence dans Revit que l'on a isolé dans la zone 3 de notre programme.
Les deux autres blocs récupèrent les coordonnées de la pièces.



Zone 6 :  Récupération des coordonnées X et Y de toutes les pièces Autocad sur le fichier Excel.
Avec "List.DorpItems" j'enlève les éléments de la colonne A du fichier Excel.
"List.map" permet de traiter le 2eme niveau de la liste sans déstructurer la liste.


Zone 7 : Cette zone récupère le coefficient d'échelle dans le fichier Excel qui a été calculée lors de la création des murs avec l'applicatif N°2.



Zone 8 :  Cette zone de Node permet de convertir les coordonnées des pièces du plan Archi en coordonnées sur le plan MEP. Il suffira ensuite de vérifier dans qu'elles pièces se trouvent les différents points.


Je calcul d'abord le décalage (en X et Y) entre chaque pièces (coordonnées Archi) et la pièce de référence (cliquée).
Yref : Coordonnée Y de la pièce de référence.
Y : liste des coordonnées des pièces Archi (fichier Excel).
Le Node de soustraction calcul les coordonnées de chaque pièces dans le système de coordonnées de Revit.


Zone 9 :  Cette zone de Node permet de retrouver et de classer les pièces du plan MEP en fonction des coordonnées des pièces du plan Archi transformées précédemment en coordonnées MEP.


On va vérifier pour chaque point de coordonnées de pièce Archi s'il se trouve à l'intérieur d'une pièce créé dans MEP. C'est le Node "Room.IsInsideRoom" qui calcul cela. 
Afin de pouvoir traiter tous les cas, il faut que les deux listes soient de même longueur. J'utilise le Node "List.OfRepeatedItem".
Le node "List.FilterByBoolMask" permet de récupérer toutes les pièces de Revit dans l'ordre dans lequel elles ont été trouvées.

Zone 10 :  Cette zone de Node écrit dans les pièces le contenu des 4 premières lignes du fichier Excel.




lundi 26 décembre 2016

Murs et pièces Revit vers Excel

Dans cet article, je présente l'applicatif Dynamo qui me permet de récupérer les informations liées aux pièces et aux murs du plan Archi de référence pour les stocker dans un fichier Excel.
Ces données Excel me serviront ensuite dans un deuxième applicatif à créer les pièces du plan Archi dans mon plan MEP.

Liens de téléchargement :
 - Fichier Dynamo

Développé sur Revit 2016/2017 - Dynamo 1.2.1

A quoi sert l'applicatif Dynamo ? :
A partir d'un plan fournit par l'architecte (appelé Revit Archi dans le reste du document) sur lequel il a créé des pièces et renseigné les libellés de ces pièces, nous créons un fichier Excel dans lequel on retrouvera toutes les informations nécessaires à la création de ces pièces dans le plan MEP que l'on utilisera pour les lots techniques (MEP ELEC ou CVC)

Fond de plan Archi (les murs et les pièces sont sélectionnables) :



Fichier Excel après exécution de l'applicatif Dynamo :


Pour utiliser cet applicatif, il faut :
 - Un plan Revit Archi sur lequel les murs et les pièces sont créés,
 - Le patch de Node Clockwork,
 - Un fichier Excel vierge,

Vue d'ensemble de l'applicatif :




Zone 1 : Zone d'initialisation de l'applicatif


Zone 2 : Zone de Node dans laquelle on récupère les données des pièces du niveau.

Le node "List.FilterByBoolMask" permet de filtrer la liste de pièce et de ne garder que les pièces du niveau choisi.
Le node "List.AddItemToFront" permet d'ajouter en tête de liste un libellé qui apparaîtra dans la colonne A du fichier Excel.


Zone 3 : Zone de Node qui permet de récupérer les coordonnées des murs du niveau.

Le Node "Element.Location" est un Node emprunté au Patch Clockwork. Il permet de récupérer les couples de coordonnées (start et End point).

Je récupère le point de début et le point de fin de chaque mur.


Zone 4 : Zone qui permet de récupérer les coordonnées des lignes séparatives de pièces


Zone 5 :



Zone 6 : Récupération du mur de référence.



Zone 7 : Zone de création de la liste et d'écriture dans le fichier Excel.

Chaque ligne Item du Node List.create correspond à une ligne du fichier Excel.
Chaque niveau aura sa propre feuille de calcul Excel avec l'entrée "sheetName" du Node "Excel.WriteToFile" renseignée avec le nom du niveau choisi en zone 1.