11 nov. 2019

[Dynamo+=Python] Copier les états des calques CAO



A défaut de travailler qu'avec des maquettes en liens, travailler avec des liens CAO sous Revit peut poser quelques difficultés

La difficulté n'étant pas dans l'importation du lien CAO ou dans le géo-référencement du DWG ni dans le changement de couleur des calques (via gestionnaire de style d'objet) mais par exemple dans la gestion des états de calques au travers de différents gabarits de vue.

En effet impossible d'enregistrer un état de "calque" d'un lien CAO pour le réattribuer sur un autre gabarit de vue (ou vue).

Quand Revit importe un DWG (Classe ImportInstance) on retrouve les calques en Sous-Catégories, la Catégorie étant le lien CAO.


le Defpoints qui se pensait insupprimable...








Pour collecter les statuts de visibilité des liens CAO on applique la méthode View.GetCategoryHidden(ElementId) en passant en argument l'Id (Objet) de la sous catégorie (calque CAO).

Gist getstatus
def getstatus(view, import_instance):
hidden = []
visible = []
catSub = import_instance.Category.SubCategories
for cat_cad in catSub:
in_view = view.GetCategoryHidden(cat_cad.Id)
if in_view:
hidden.append(cat_cad.Id)
else:
visible.append(cat_cad.Id)
return hidden, visible
view raw getstatus.py hosted with ❤ by GitHub




Ensuite pour appliquer ces états aux autres vues existantes il faut d'abord vérifier si pour chacune d'entre elles l'instance est dépendante d'un gabarit de vue ou non avec la propriété View.ViewTemplateId  et la méthode View.GetNonControlledTemplateParameterIds()

Gist checkview
def checkview(view, import_inst):
if not view.IsTemplate:
#get importinstance in each view
lst_inst = FilteredElementCollector(doc, view.Id).OfClass(ImportInstance).ToElements()
#if import is in this wiew and the view is depend of a viewtemplate
if any([import_inst.Id == x.Id for x in lst_inst]) and doc.GetElement(view.ViewTemplateId) is not None:
#get the view template
viewtempl = doc.GetElement(view.ViewTemplateId)
lstnotcontrol = viewtempl.GetNonControlledTemplateParameterIds()
#if the category is control by the viewtemplate
if any([BuiltInParameter.VIS_GRAPHICS_IMPORT.value__ == x.IntegerValue for x in lstnotcontrol]):
return view
#if the category is not control by the viewtemplate
else:
return viewtempl
#else import is in this wiew and the view is not depend of a viewtemplate
elif any([import_inst.Id == x.Id for x in lst_inst]):
return view
else:
return None
else:
return None
view raw checkview.py hosted with ❤ by GitHub



Enfin pour chaque vue ou gabarit de vue, on applique ces statuts aux autres vues, méthode View.SetCategoryHidden(ElementId, bool).

def SethiddenCad(viewtoset, viewname, visible_lst, hidden_lst):
out = None
TransactionManager.Instance.ForceCloseTransaction()
TransactionManager.Instance.EnsureInTransaction(doc)
for _idV in visible_lst:
viewtoset.SetCategoryHidden(_idV, False)
for _idH in hidden_lst:
viewtoset.SetCategoryHidden(_idH, True)
out = "Etat des calques appliqué sur la vue {}".format(viewname)
TransactionManager.Instance.TransactionTaskDone()
return out
view raw SethiddenCad.py hosted with ❤ by GitHub



aperçu en vidéo du script complété







Related Posts:

0 commentaires:

Enregistrer un commentaire