Sincronizar vistas en Revit (con dynamo)

Hace unos días nos preguntaron si era posible tener en Revit algún comando que teniendo varias plantas abiertas a la vez, las pusiera todas en la misma posición y con el mismo nivel de zoom, para poder comparar diferentes plantas como si estuviéramos trabajando con capas de papel sulfurizado sobre nuestra mesa de dibujo, sin tener que usar la opción de "subyacente" del propio Revit. 

La respuesta, como para muchas de las preguntas que nos realizan, debía de estar en Dynamo, aunque con un gran "pero". Porque para poder trabajar con las vistas abiertas, no tenemos herramientas directamente en Dynamo, sino que hay que pasar a través del API de Revit, pero afortunadamente tenemos la opción de programar nuestros propios componentes dentro de Dynamo con Python, así que después de trastear un rato con ello, llegamos a la pequeña pieza de código que nos daba la solución buscada:

import clr

clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *

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

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

for uv in uidoc.GetOpenUIViews():
	if uv.ViewId.Equals( doc.ActiveView.Id ):
		uiview = uv

rect = uiview.GetZoomCorners()
exit = []
for view in uidoc.GetOpenUIViews():
	if not view.ViewId.Equals( doc.ActiveView.Id ):
		view.ZoomAndCenterRectangle(rect[0], rect[1])
		exit.append(view.ViewId)

OUT = exit
    

Tan sólo hay que copiar el código anterior en un componente de python en una nueva definición de dynamo y guardarla en nuestra carpeta de scripts. En la imagen anterior podéis ver una serie de componentes adicionales que nos permiten completar el script mostrando una lista con los nombres de las vistas actualizadas en cada ejecución. 

A continuación podéis ver el script en funcionamiento: