21 sept. 2019

[Dynamo+=Python] Voyez le Changement!








Au sommaire de la visibilité des changements entre 2 modèles et la gestion du changement de méthodes entre plusieurs versions de SDK (API Revit) 


Ne travaillant essentiellement qu'avec des modèles liés et des familles hébergées par face, l'un des avantages, c'est lorsque vient une mise à jour de la maquette Archi (maquette liée), soit les instances suivent la modification si la référence a été déplacée ou Revit m'alerte si celle-ci a été supprimée.


Cependant il est quand même utile de voir ces différences, par exemple si une porte a été rajoutée ou déplacée dans la maquette Archi, on ne verra pas forcément l'information lors de la mise à jour de la maquette liée et donc aucune information sur l'éventuel bloc de secours ou interrupteur à repositionner.



Quelques outils qui existent pour comparer 2 maquettes (liste non exhaustive)



  • BIM 360 (payant)
  • Navisworks (payant)
  • Script_Dynamo DataShape (gratuit)
  • quelques plugins comme Metamorphosis  (gratuit ou payant)
  • d'autres plugins en cours de développement 


En attendant de passer à BIM360 sur tous les projets 😁 et après avoir testé quelques solutions, j'ai fini par développer une solution seulement basée sur la comparaison des Id des éléments et de leur localisation.

Je n'ai pas nécessairement besoin d'avoir une comparaison basée sur la géométrie des éléments et/ou leurs paramètres et puis si je peux éviter d'extraire la géométrie complexe d'une centaine de porte de ce type, c'est mieux 😀😆





L'action du script est une résultante de comparaison de 2 dictionnaires de type 
{Id : Localisation} ou {Id : [Localisation, Symbol.Name] } ou encore {Id : BoundingBox } entre l'ancienne maquette et la nouvelle. Le résultat s'affiche sous forme de listes et de couleurs.


Dans les grandes lignes du script...


  • Après les "imports",  on définit et on récupère les variables importantes dont la version de Revit en cours ainsi que la liste des fenêtres ouvertes :
#after all imports...

link_model = UnwrapElement(IN[0])
apply_color = IN[1]
doclink = link_model.GetLinkDocument()
open_views = [doc.GetElement(view.ViewId) for view in uidoc.GetOpenUIViews()]

#get SDK version 

#for memory: app = DocumentManager.Instance.CurrentUIApplication.Application 
sdk_number = int(app.VersionNumber)
#Set color for element change location
color_change = Autodesk.Revit.DB.Color(255,0,0)
#Set color for new element 
color_new = Autodesk.Revit.DB.Color(255,0,255)
#Get Uni fillpatern
fillpatt = FilteredElementCollector(doc).OfClass(FillPatternElement).ToElements()
unifillid = [f.Id for f in fillpatt if f.Name == 'Uni'][0]


  • On collectionne les éléments des 2 maquettes (l'instance de la maquette liée "n-1" est récupèrer via le noeud "Links" du package Rhythm)

coll_in = FilteredElementCollector(doc).WhereElementIsNotElementType().ToElements()
collink = FilteredElementCollector(doclink).WhereElementIsNotElementType().ToElements()





  • La fonction pour coloriser les éléments selon la version de Revit

def overridecolor(element, rvtcolor, fillpatternid, view):
    if sdk_number < 2019:
        gSettings = OverrideGraphicSettings()
        gSettings.SetProjectionFillColor(rvtcolor)
        gSettings.SetProjectionFillPatternId(fillpatternid)
        gSettings.SetProjectionLineColor(rvtcolor)
        gSettings.SetProjectionLineWeight(10)
        gSettings.SetCutFillColor(rvtcolor)
        gSettings.SetCutFillPatternId(fillpatternid)

  TransactionManager.Instance.EnsureInTransaction(doc)
        view.SetElementOverrides(element.Id, gSettings)

        TransactionManager.Instance.TransactionTaskDone()
        return element
    else:
        gSettings = OverrideGraphicSettings()
        gSettings.SetSurfaceForegroundPatternColor(rvtcolor)
        gSettings.SetSurfaceForegroundPatternId(fillpatternid)
        gSettings.SetProjectionLineColor(rvtcolor)
        gSettings.SetProjectionLineWeight(10)
        gSettings.SetCutForegroundPatternColor(rvtcolor)
        gSettings.SetCutForegroundPatternId(fillpatternid)

        TransactionManager.Instance.EnsureInTransaction(doc)
        view.SetElementOverrides(element.Id, gSettings)

        TransactionManager.Instance.TransactionTaskDone()
        return element  



  • Puis on compare les dictionnaires avec des boucles classiques.
  • Et enfin on applique la fonction ci-dessus avec une couleur différente selon si les éléments sont nouveaux ou déplacés.

 Aperçu en vidéo





  • Note sur les Dictionnaires 
Avec Dynamo Il est tout à fait possible de travailler avec des dictionnaires Python, néanmoins pour les attribuer à la variable OUT, il est nécessaire de passer par des Dictionnaires DotNet   avec en plus une petite spécificité  "In Dynamo 2.0, keys can only be strings"





Néanmoins il est toujours possible de convertir un dictionnaire Python en liste




4 sept. 2019

[Revit] Visibilité & graphisme des éléments






Un petit rappel pour éviter les maux de têtes quand des éléments ne s'affichent pas ou ne veulent pas changer de couleur sous Revit.

  • Pour la visibilité & graphisme des éléments
il existe un certain nombre de méthodes pour remplacer l'affichage d'un élément.

Par ordre de priorité on retrouve les fonctions :


  1. Traits, outil
  2. Remplacer les graphismes dans la vuepar élément Demi-teinte
  3. Options d'affichage des graphismes - Silhouette des arêtes
  4. Remplacer les graphismes dans la vuepar élément
  5. Filtres de vue
  6. Profondeur de la vue - Au-delà du style de ligne
  7. Phase de constructions des remplacements de graphisme
  8. Remplacements de visibilité/graphismeRemplacer les calques hôteStyles de lignes de coupe
  9. Remplacements de visibilité/graphismeProjection/Lignes de coupe
  10. Styles d'objet du projet




source Autodesk 
Voici un très bon résumé par Rob Cross


Pyramide par Rob Cross
Pyramide par Rob Cross



Donc en cas de problème de graphisme  avec un ou plusieurs 
objets on descend la pyramide.


À cela vient s'ajouter les graphismes des Systèmes de Gaines





  • Concernant la visibilité seule des éléments 















Il existe également plusieurs méthodes pour contrôler l’affichage d'un élément, voici une liste non exhaustive :


  • Par le Remplacement visibilité / graphisme 
- Les filtres de vue
- La sélection des catégories de modèles
- La gestion de l'affichage des sous projets


  • Par la barre de Contrôle Vue
Le niveau de détail, une famille peut si elle a été mal modélisée se retrouver masquée selon le niveau de détail choisi.


  • Par le menu contextuel après sélection d'un élément 
La fonction « masquer dans la vue » ou la coche "visible" du menu "Remplacer les graphismes dans la vue par élément". Pour faire réapparaître ces éléments utiliser la fonction « Afficher les éléments cachés ».


  • Par la Palette de Propriété de la Vue
- La plage de vue. (ou la profondeur de la coupe)
- Le type de délimitation de la profondeur
- La discipline. La discipline affecte la manière dont les éléments sont affichés.
- Le filtre des phases (Les phases de construction).
- La zone cadrée (si l’élément est en dehors de cette zone)
- Le gabarit de vue (qui reprend la majorité des cas ci-dessus).
Attention à l’inclusion ou l'exclusion des propriétés de la vue dans les gabarits (ça vous évitera de modifier le mauvais "Remplacement visibilité / graphisme " )

























  • Par les Familles elles-mêmes :
- Il est possible qu’un ou plusieurs paramètres contrôlent la visibilité de la famille
- La Famille est développée pour ne pas être affichée dans certains plans de vue ou pour certains niveaux de détails.


  • Par les caractéristiques de certains éléments  :
Par exemple il est possible de ne pas afficher les repères de coupe en fonction de la discipline ou de l'échelle 



  • Et puis ...
- Par la gestion des sous-projets. Si l’élément se trouve dans un sous-projet fermé.
- Par la gestion des variantes (l'élément est une variante)
- Par une zone de masquage qui cacherait un objet


  • Concernant l'affichage des modèles liés : 

De même que la maquette hôte la visibilité des éléments des maquettes liées peut être contrôlée



  • Par la Visibilité des modèles liés :






  • Par les Filtres de Vues des modèles liés







ParamètreDescription
Par vue d'hôteApplique le filtre (et d'autres paramètres de visibilité/graphismes) pour la vue d'hôte aux éléments du modèle hôte, du modèle lié et des modèles imbriqués.
Remarque : Si le paramètre d'affichage d'un lien est défini sur Par vue hôte et que vous exportez des vues au format DWG ou DXF, le lien est traité comme une valeur de remplacement. Pour vous assurer que les couleurs et autres paramètres d'affichage des graphismes du lien sont conservés dans le fichier exporté, sélectionnez Exporter toutes les propriétés BYLAYER mais pas les remplacements dans la boîte de dialogue Modifier la configuration d'exportation DWG/DXF (onglet Calques). VoirCalques pour l'exportation au DWG/DXF.
Par vue liéeApplique le filtre (et d'autres paramètres de visibilité/graphismes) pour la vue d'hôte au modèle hôte uniquement. Le modèle lié et les modèles imbriqués s'affichent selon la vue liée spécifiée.
SpécifiquePermet de définir d'autres personnalisations des paramètres de graphismes et de visibilité pour les modèles liés et les modèles imbriqués dans la vue d'hôte.
Vue liéeDisponible uniquement pour l'option Spécifique ou Par vue liée. Définit la vue dans le modèle lié dont les paramètres doivent être utilisés pour afficher ce dernier (et les modèles imbriqués, sauf indication contraire) dans la vue d'hôte.
Filtres de vueDisponible uniquement pour l'option Spécifique. Indique si le modèle lié s'affiche à l'aide du filtre appliqué à la vue liée ou à la vue d'hôte. Ne permet pas de contrôler l'affichage des modèles imbriqués.
Liens imbriquésDisponible uniquement pour l'option Spécifique. Indique comment les modèles liés imbriqués s'affichent dans la vue d'hôte.




Modèle hôte CModèle lié BModèle imbriqué AModèle hôte C affichant le modèle lié B et le modèle imbriqué A
Avec le filtre diagonal bleu appliquéAvec le filtre solide orange appliquéAvec le filtre horizontal vert appliquéAvec les trois filtres affichés dans la vue d'hôte


ObjectifRésultatDans le modèle hôte CDans le modèle lié B
Le filtre appliqué à une vue du modèle hôte C s'applique également au modèle lié B et au modèle imbriqué A.
Par vue d'hôte.(aucun filtre requis)
Le filtre appliqué à une vue du modèle hôte C s'applique uniquement à ce modèle.
Le modèle lié B et le modèle imbriqué A s'affichent avec un filtre appliqué à une vue du modèle lié B.
Par vue liée.
Vue liée : sélectionnez une vue du modèle lié à laquelle un filtre (solide orange) a été appliqué.
Le modèle lié (modèle imbriqué A) est affiché par vue d'hôte.
Le filtre appliqué à une vue du modèle hôte C s'applique uniquement à ce modèle.
Le modèle lié B s'affiche avec un filtre appliqué à une de ses vues.
Le modèle imbriqué A s'affiche avec un filtre appliqué à une de ses vues.
Par vue liée.
Vue liée : sélectionnez une vue du modèle lié à laquelle un filtre (solide orange) a été appliqué.
Le modèle lié (modèle imbriqué A) est affiché par vue liée.
Dans le modèle imbriqué A, un filtre horizontal vert est appliqué à la vue.
Le filtre appliqué à une vue du modèle hôte C s'applique également au modèle lié B.
Le modèle imbriqué A s'affiche avec un filtre appliqué à une vue du modèle lié B.
Spécifique.
Vue liée : sélectionnez une vue du modèle lié à laquelle un filtre (solide orange) a été appliqué. Filtres de vue : Par vue d'hôte.
Liens imbriqués : Par vue liée.
Le modèle lié (modèle imbriqué A) est affiché par vue d'hôte.
Le filtre appliqué à une vue du modèle hôte C s'applique également au modèle lié B.
Le modèle imbriqué A s'affiche tel qu'il s'affiche dans une de ses vues.
Spécifique.
Vue liée : sélectionnez une vue du modèle lié dans laquelle un filtre (horizontal vert) a été appliqué au modèle imbriqué A.
Filtres de vue : Par vue d'hôte.
Liens imbriqués : Par vue liée.
Le modèle lié (modèle imbriqué A) est affiché par vue liée.
Le filtre appliqué à une vue du modèle hôte C s'applique uniquement à ce modèle.
Le modèle lié B et le modèle imbriqué A s'affichent en fonction d'une vue du modèle lié B, mais aucun filtre n'y est appliqué.
Spécifique.
Vue liée : sélectionnez une vue du modèle lié.
Filtres de vue : Aucun.
Liens imbriqués : Par lien parent.
(aucun filtre requis)
Le filtre appliqué à une vue du modèle hôte C s'applique uniquement à ce modèle.
Le modèle lié B s'affiche conformément à l'une de ses vues, mais aucun filtre n'y est appliqué.
Le modèle imbriqué A s'affiche conformément à une de ses vues.
Spécifique.
Vue liée : sélectionnez une vue du modèle lié.
Filtres de vue : Aucun.
Liens imbriqués : Par vue liée.
Le modèle lié (modèle imbriqué A) est affiché par vu





  • Par la vue liée des modèles liés

Les maquettes Architecte et autres lots contiennent parfois des familles 2D (ou 2.5D) 
ou des éléments détails qui peuvent utiles à la conception.
Ces éléments sont propres aux vues des maquettes liées (par niveau en plancher haut ou en plancher bas)
Ils peuvent être rendus visible en modifiant le paramètre d'affichage des liens et en sélection la vue liée souhaitée.







  


  • Par les Affectations de phases avec les modèles liés

Veillez à ce que les affectations des phases soient en phase 😁


Exemple 1 


Exemple d'une maquette où tous les éléments Architecturaux sont affectés à la phase 1 (sans connaissance de cela, impossible de créer des Espaces)


  • Résumé du "Pourquoi mon élément n'est pas visible dans Revit?"

Allez pour finir un petit résumé trouver sur le forum https://www.revitforum.org/

1. L'objet ou la catégorie est temporairement masqué
2. L'objet ou la catégorie est masqué dans la vue
3. L'objet est masqué par un autre élément
4. La catégorie ou la sous-catégorie de l'objet est masquée dans la vue
5. L'objet est en dehors de la plage de vue de la vue
6. La profondeur de découpe éloignée de la vue n'est pas suffisante pour afficher l'objet
7. L'objet réside sur un sous-projet qui n'est pas chargé dans le projet
8. L'objet réside sur un sous-projet qui n'est pas visible dans la vue
9. L'objet réside sur un sous-projet qui n'est pas chargé dans un fichier lié
10. L'objet réside sur un sous-projet qui n'est pas visible dans un fichier lié
11. L'objet réside dans un groupe (modèle de détail) et il a été exclu du groupe
12. L'objet fait partie d'une variante qui n'est pas visible dans la vue
13. L'objet fait partie d'un fichier lié qui n'est pas visible dans la vue
14. L'objet a un ou plusieurs de ses bords remplacés pour s'afficher comme '<Lignes invisibles>'
15. L'objet est une famille et aucune de ses géométries n'est définie pour être visible dans le type de vue
16. L'objet est une famille et aucune de ses géométries n'est définie pour être visible au niveau de détail de la vue
17. L'objet est défini pour ne pas être visible au niveau de détail de la catégorie
18. L'élément a été placé en dehors de la zone cadrée de la vue (étendue visible)
19. L'élément est un objet d'annotation et ne réside pas entièrement dans la zone cadrée d'annotation
20. Les paramètres de phase de l'objet ou les paramètres de phase de la vue empêchent l'objet de s'afficher dans la vue
21. La discipline de la vue interdit la visibilité de l'objet
22. L'objet est affecté par un filtre appliqué à la vue
23. L'objet est soumis à un remplacement d'élément, défini sur la couleur
24. L'objet est soumis à un remplacement de catégorie, défini sur la couleur
25. L'objet est un Symbole d'Annotation (ex Symbole Elec) dont son plan de contruction n'est pas aligné avec la vue
26. Le style d'objet est défini sur la couleur
27. L'objet est contraint à une zone de définition qui n'est pas visible dans la vue
28. L'étendue de l'objet lui-même ne permet pas de le voir
29. L'objet est une masse et "Afficher la masse" est désactivé
30. La vue hôte de l'objet a été supprimée (limites de zone)
31. L'échelle de la vue interdit la visibilité de l'objet
32. L'objet est une instance liée avec des coordonnées trop grandes pour que Revit puisse les gérer
33. L'utilisateur a mal identifié l'instance de lien à laquelle appartient l'élément
34. L'objet est dans un lien qui n'est pas dans sa position correcte
35. Le mur est subsumé par un mur-rideau intégré automatiquement
36. Quelque chose est vraiment loin du milieu du projet et lorsque la vue est agrandie pour s'adapter, tout disparaît
37. L'élément est blanc et ses bords coïncident avec d'autres objets. Par exemple, plafond GWB dans RCP.

Alors finis les maux de crânes ou d’autres sont-ils à venir ?😂




Voilà pourquoi il est préférable de travailler avec ses propres gabarits et familles plutôt que d'essayer de retravailler et comprendre ceux des autres 😝 (du moins sans mode d'emploi) 😉