15 févr. 2020

[Dynamo+=Python] Transfert de Légendes



L'outil d'insertion  de vue à partir de fichier de Revit ne permet pas à ce jour de copier des Légendes, mais...

Il existe quelques utilitaires qui permettent de réaliser cette tâche sans avoir à faire du "copier-coller" manuel.
Parmi ces utilitaires on retrouve notamment Torsion Tools ou encore PyRevit qui intègrent cette fonction.


Voici une alternative avec une fonction Ironpython sous Dynamo en utilisant la classe ElementTransformUtils

Gist
#written by Cyril.P
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
import System
from System.Collections.Generic import List
current_doc = DocumentManager.Instance.CurrentDBDocument
current_uiapp = DocumentManager.Instance.CurrentUIApplication
current_app = current_uiapp.Application
current_uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
class CustomCopyHandler(IDuplicateTypeNamesHandler):
def OnDuplicateTypeNamesFound(self, args):
return DuplicateTypeAction.UseDestinationTypes
def copyLegendView(souceDoc, current_doc):
lst_viewname = []
lstViews = FilteredElementCollector(souceDoc).OfClass(View).WhereElementIsNotElementType().ToElements()
viewsproject = [view for view in lstViews if not view.IsTemplate ]
legendview = [ view for view in viewsproject if view.ViewType == ViewType.Legend ]
TransactionManager.Instance.ForceCloseTransaction()
TransactionManager.Instance.EnsureInTransaction(current_doc)
for v in legendview:
#create .Net List
tmpIlst = List[ElementId]()
tmpIlst.Add(v.Id)
copyOptions = CopyPasteOptions()
copyOptions.SetDuplicateTypeNamesHandler(CustomCopyHandler())
newViewCollId = ElementTransformUtils.CopyElements(souceDoc, tmpIlst, current_doc, None , copyOptions)
current_doc.Regenerate()
newViewId = list(newViewCollId)[0]
newView = current_doc.GetElement(newViewId)
elementsInLegendId = FilteredElementCollector(souceDoc, v.Id).ToElementIds()
newelemId = ElementTransformUtils.CopyElements(v, List[ElementId](elementsInLegendId), newView, None, copyOptions)
lst_viewname.append(newView.Name)
#delete duplicate view
current_doc.Delete(newViewId)
TransactionManager.Instance.TransactionTaskDone()
return lst_viewname

_
la fonction prend en paramètres le document source et le document courant.

  • Pour le document courant on obtient l'objet avec la classe DocumentManager.
currentdoc = DocumentManager.Instance.CurrentDBDocument
  • Pour le document source cela dépendra du contexte.
- si celui ci est lié (maquette liée) on retrouve l'objet avec la classe RevitLinkInstance
souceDoc = rvtlink.GetLinkDocument
  où rvtlink est l'instance de la maquette liée.

Note :
la liste des instances des maquettes liées peut être obtenue via la méthode :
FileteredElementCollector(doc).OfClass(RevitLinkInstance).ToElements()

il est possible également d'utiliser les nœuds Links et GetDocument du package Rhythm




- si le document n'est pas lié,  il est possible de l'ouvrir en arrière-plan et de récupérer l'objet Document avec les méthodes FileOpenDialog(string filter) et  OpenDocumentFile(ModelPath, OpenOptions):

Gist
oOptions = OpenOptions()
oOptions.DetachFromCentralOption = DetachFromCentralOption.DetachAndPreserveWorksets
oOptions.Audit = True
dialog = FileOpenDialog("Revit Projet and Template (*.rvt, *.rte)|*.rvt;*.rte")
dialog.Show()
mpath = dialog.GetSelectedModelPath()
filepath = ModelPathUtils.ConvertModelPathToUserVisiblePath(mpath)
modelpath = FilePath(filepath)
souceDoc = current_app.OpenDocumentFile(modelpath, oOptions)

_
avec
current_app = DocumentManager.Instance.CurrentUIApplication.Application
et il faudra penser à la fin script à fermer le document source :
souceDoc.Close(False)

ou bien utiliser le nœud Application.OpenDocumentFile du package Rhythm


voilà il ne vous reste plus qu'à appeler la fonction

newCopylegendviews = copyLegendView(souceDoc, current_doc)




Sur ce, Bonne Pythonnade!



Related Posts:

  • [Dynamo+=Python] Transfert de Légendes L'outil d'insertion  de vue à partir de fichier de Revit ne permet pas à ce jour de copier des Légendes, mais... Il existe quelques utilitaires qui permettent de réaliser cette tâche sans avoir à faire du "cop… Read More

0 commentaires:

Enregistrer un commentaire