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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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
où rvtlink est l'instance de la maquette liée.
souceDoc = rvtlink.GetLinkDocument |
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
0 commentaires:
Enregistrer un commentaire