8 nov. 2020

[Dynamo += Python] Ouvrir plusieurs Vues





Une petite astuce pour ouvrir plusieurs vues avec Dynamo.


Celle-ci consiste à utiliser la propriété  ActiveView du document de l'interface Revit  (Classe UIDocument) à partir d'un contexte différent (un autre Thread).

Note :
On utilise ici un objet Winform avec une fenêtre non bloquante pour laisser finir le Thread de Dynamo.

Le script Python est à placer en fin de fin de chaine et accepte une liste de vues en entrée.

Un exemple avec une duplication de vue





#written by Cyril P
import clr
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument

clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')
import System.Drawing
import System.Windows.Forms

from System.Drawing import *
from System.Windows.Forms import *

class MainForm(Form):
    def __init__(self, listView, uidoc):
        self._dictView = {x.Name : x for x in listView}
        self._uidoc = uidoc
        self.InitializeComponent()
        self.CheckPreselect()
    
    def InitializeComponent(self):
        self._checkedListBox1 = System.Windows.Forms.CheckedListBox()
        self._buttonOpen = System.Windows.Forms.Button()
        self.SuspendLayout()
        # 
        # checkedListBox1
        self._checkedListBox1.FormattingEnabled = True
        self._checkedListBox1.Items.AddRange(System.Array[System.Object](self._dictView.keys()))
        self._checkedListBox1.Location = System.Drawing.Point(24, 27)
        self._checkedListBox1.Name = "checkedListBox1"
        self._checkedListBox1.Size = System.Drawing.Size(340, 440)
        self._checkedListBox1.TabIndex = 0
        # 
        # buttonOpen
        self._buttonOpen.Location = System.Drawing.Point(24, 480)
        self._buttonOpen.Name = "buttonOpen"
        self._buttonOpen.Size = System.Drawing.Size(234, 53)
        self._buttonOpen.TabIndex = 1
        self._buttonOpen.Text = "Opens Select Views"
        self._buttonOpen.UseVisualStyleBackColor = True
        self._buttonOpen.Click += self.ButtonOpenClick
        # 
        # MainForm
        self.ClientSize = System.Drawing.Size(400, 550)
        self.Controls.Add(self._buttonOpen)
        self.Controls.Add(self._checkedListBox1)
        self.Name = "MainForm"
        self.Text = "UI_OpenMulti"
        self.ResumeLayout(False)

    def CheckPreselect(self):
        for i in range(self._checkedListBox1.Items.Count):
            self._checkedListBox1.SetItemChecked(i, True)
    
    def ButtonOpenClick(self, sender, e):
        for viewName in self._checkedListBox1.CheckedItems :
            view = self._dictView.get(viewName)
            self._uidoc.ActiveView = view
        self.Close()        
    
lstView = UnwrapElement(IN[0])  
objForm = MainForm(lstView, uidoc)
objForm.Show()

OUT = 0

Aperçu  en Vidéo






0 commentaires:

Enregistrer un commentaire