Announcements
Attention for Customers without Multi-Factor Authentication or Single Sign-On - OTP Verification rolls out April 2025. Read all about it here.

Creación de Parámetros Compartidos e Inyección de Datos con Excel y Dynamo en Modelos Revit

EjercicioInyeccionDatos_2024-10-10_04-01-12.png

Espero te encuentres muy bien al leer este Artículo. Retomaré el punto en el que nos quedamos anteriormente.

 

Puedes consultar el artículo base en el siguiente link: Creación de Tablas Multicategoría con Dynamo.

 

Me gustaría recordarte que este artículo surge a través de consultas en los Foros Autodesk en Español.

 

Introducción.

 

Este artículo es el segundo de una serie de artículos mensuales que buscan ayudar a proporcionar una alternativas de solución a ciertos requerimientos expresados por la comunidad en los foros en Español. La idea es proporcionar una ruta de solución alternativa usando Dynamo aplicado a Modelos con Revit.

 

Es importante que el usuario tenga en cuenta que no se pretende dar una solución absoluta, al contrario, es un punto de partida. De hecho, si como lector del Blog detectas un punto a optimizar o mejorar te invito a que proporciones tu aportación de mejora, así nutramos esta base para lograr una rutina mucho más eficiente.  

 

Planteamiento.

 

Este artículo surge a través de una consulta de los Foros Autodesk en Español, acerca de qué, de cómo poder vaciar información contenida en un Excel dentro de un Modelo de Revit, creando nuevos campos desde Dynamo

 

Por favor toma en cuenta que este artículo tiene un objetivo muy específico, no pretende ser un curso ni de Dynamo ni de Revit. Sin embargo, si a partir de lo visto aquí, surgen dudas o se quiere profundizar en otros temas, podemos crear artículos en paralelo que apoyen y profundicen.

 

El objetivo de este ejercicio será obtener un listado de elementos, en este caso, los diferentes tipos de Columnas Estructurales y Cimentación Estrcutural en el modelo (Retomando lo visto en el ejercicio anterior). De ellos extraeremos los siguientes datos:

 

  • ID 
  • Nombre (Tipo).
  • Volumen Total por Tipo
  • Código

En este caso, el campo código será un parámetro compartido que usaremos para cargar información desde un Excel e inyectarlo en el modelo. La tabla de Excel final quedará así:

 

ID Nombre Volumen total por Tipo Código
1040365 Family Type: 200UB25.4, Family: UB-Universal Beams-Column (AS 3679_1) 0.22 UB123
1411287 Family Type: 450 x 450mm, Family: M_Concrete-Square-Column 0.61 CSP45
1213376 Family Type: HSS63.5X63.5X7.9, Family: M_HSS Square-Column 0.06 HSS63
512173 Family Type: 600 x 600 x 900mm, Family: M_Pile Cap-600 Pile 0.86 PC600
509468 Family Type: 600mm Diameter, Family: M_Pile-Steel Pipe 7.21 PSC60
1175081 Family Type: 3800 x 3800 x 600mm, Family: Pile Cap-9 Pile 14.44 PCDF9
85113 ElementType 14.56 SEG01
1177859 Family Type: 400 x 400 x 900mm, Family: Pile Cap-Rectangular 0.86 PCR40

 

Partiremos desde un punto anterior al que nos habíamos quedado: Obtener la suma de volúmenes total de Columnas Estructurales y Cimentación Estructural.

 

Retrocederé un poco en el script anterior, al punto en que se unificaron la lista de volúmenes de las columnas y cimentaciones por medio de un List Create:

DidierRamirezDarjo_21-1724050788568.png

La intención de esto es generar un nuevo listado en Excel con cada Tipo de Columna y cada Tipo de Cimentación, y relacionar la suma de volúmenes a cada Tipo. De tal manera que, ahora colocaré un nodo de Math.Sum a cada salida de los nodos de suma, para que proporcionen valores redondeados a dos decimales.

 

Esto ya lo habíamos hecho, pero de forma general a la suma de todo, aquí lo haremos individualmente:

DidierRamirezDarjo_1-1728584608147.png

Las sumas redondeadas las conectaremos a un List Create para unificarlas en una sola lista y aplanaré la lista con un List.Flatten para que no tenga niveles:

DidierRamirezDarjo_2-1728584661911.png

Hasta este punto no hice más que reordenar la información para que no me diera la suma total, sino que lo dé separado para cada categoría. 

 

Ahora obtendré los Nombres de los Elementos por medio del Type Name y los IDs. Para lograrlo, conectaré los puertos de salida tipo ElementType de los nodos Element.ElementType que habíamos usado para extraer los tipos de los elementos seleccionados al inicio del Script.

 

Estos se conectarán a dos nuevos nodos independientes de tipo List.UniqueItems en el puerto de entrada List. La intención de esto es que unifique el listado a tipos únicos. Es decir, con el nodo anterior Element.ElementType, obtuvimos el listado de todos los elementos de forma individual, aunque esto significara tener tipos repetidos:

DidierRamirezDarjo_1-1728585482503.png

Con el List.UniqueItems unificamos los tipos y ahora solo muestra un tipo que engloba a todos los elementos que sean del mismo tipo:

DidierRamirezDarjo_2-1728585542736.png

El resultado de todo esto:

DidierRamirezDarjo_0-1728585260769.png

Una vez condensados los tipos únicos:

DidierRamirezDarjo_3-1728585811478.png

Los unificaré en un List.Create y posteriormente aplanaré la lista para no tener niveles con un List.Flatten:

DidierRamirezDarjo_4-1728585874479.png

Ahora, por medio de un nodo tipo Element.Id extraeré los IDs de los elementos:

DidierRamirezDarjo_5-1728585911124.png

En este punto, crearemos una lista general con toda la información, usando un List.Create con tres puertos:

DidierRamirezDarjo_0-1728586354283.png

Recordemos el orden de información que queremos en la tabla:

  • ID 
  • Nombre (Tipo).
  • Volumen Total por Tipo
  • Código (Parámetro compartido)

Por lo tanto, debemos ordenar el listado de esta manera. Conectaré en el primer puerto los IDs que extrajimos anteriormente:

DidierRamirezDarjo_1-1728586693633.png

En el segundo puerto conectaré los Tipos únicos para que den el nombre:

DidierRamirezDarjo_2-1728586739606.png

En el tercer puerto los volúmenes sumados para cada tipo:

DidierRamirezDarjo_3-1728586771994.png

Todo esto lo conectaré a un nodo tipo List.Traspose, la intención de este nodo es que reagrupe la información de tal manera que en cada nivel tengamos un ITEM de cada grupo de información, de tal forma que en el excel, se vacíe esta información en las columnas correctas:

DidierRamirezDarjo_4-1728586939642.png

Todo esto lo reconectaremos a los nodos que habíamos configurado anteriormente para exportar a Excel. En este caso el puerto de salida del Lis.Traspose al puerto de entrada del nodo List.AddItemFront que ya teníamos del script anterior:

DidierRamirezDarjo_5-1728587038759.png

Es importante que el Code Block que habíamos creado para dar nombre a los encabezados de las columnas, se modifique para tener las columnas correctas:

DidierRamirezDarjo_6-1728587114211.png

Los nombres son opcionales, puedes colocar los que gustes. Este es el resultado a obtener: 

DidierRamirezDarjo_7-1728587154978.png

Al ejecutar el Script, debe abrirse automáticamente el Excel dándonos este resultado:

DidierRamirezDarjo_8-1728587218186.png

Yo le di un formato rápido, Totalmente Opcional:

DidierRamirezDarjo_9-1728587286393.png

Te recomiendo que a partir de aquí Congeles (Freeze) y desactives el Previo (Preview Geometry), del nodo de creación del Excel, para que no te sobreescriba los datos cada que ejecutes el Script. Esto pensando en hacer todo en un solo archivo. También puedes optar por separar los scripts en archivos distintos:

DidierRamirezDarjo_11-1728587574349.png

Ahora crearé el parámetro compartido. Como primer paso, debemos dejar configurado en Revit el archivo de Parámetros compartidos para que Dynamo lo reconozca. Entonces, iremos al menú Manage+Shared Parameters:

DidierRamirezDarjo_12-1728587628580.png

Lo único que debes hacer es crear el archivo y dejarlo cargado.

 

Regresando a Dynamo, crearé un nodo de tipo Parameter.CreateSharedParameterForAllCategories para crear el parámetro para todas las categorías del modelo. El parámetro "Código" bien puede aplicar a todo. Sin embargo, toma en cuenta que también hay otro nodo que te permite crearlo solo para una categoría específica y se llama: Parameter.CreateSharedParameter. Tu decides como quieres manejarlo, la configuración es la misma.

 

A este nodo le conectaremos dos Code Block, uno para indicarle el nombre del nuevo parámetro y otro para indicarle como se llamará el grupo de los parámetros compartidos en donde lo queremos crear:

DidierRamirezDarjo_0-1728588045284.png

Esto en Revit lo verás así en la configuración de los Shared Parameter una vez se ejecute el script:

DidierRamirezDarjo_1-1728588110725.png

Posteriormente, deberé indicar la tipología del Parámetro, en este caso será de Texto con un nodo tipo Spec Types:

DidierRamirezDarjo_2-1728588617033.png

Así mismo, deberé indicar en qué grupo dentro de las propiedades del elemento se clasificará, en este caso lo ingresaremos dentro de Identity Data por medio de un nodo tipo Group Types:

DidierRamirezDarjo_3-1728588656182.png

Por último, indicaremos con un nodo tipo Boolean (SI/NO) si el parámetro es de tipo o instancia:

DidierRamirezDarjo_4-1728588707519.png

Al ejecutar el Script, debes notar que todos los elementos del modelo, sin importar que elemento selecciones, deben tener en las Propiedades de Tipo un Parámetro de Código tal y como se lo indicamos:

DidierRamirezDarjo_5-1728588859165.png

Recuerda que si a partir de este punto no quieres que el Script de creación de Parámetros Compartidos se ejecute de nuevo, puede quitarle el Preview Geometry y Congelarlo:

DidierRamirezDarjo_0-1728589404224.png

Ahora rescataremos la información contenida en el Excel para inyectar los códigos en el modelo. Es importante considerar que para este punto, debemos haber creado códigos en el Excel (Para el ejercicio los inventé, puedes manejar los datos que quieras, incluso valores calculados, resultado de alguna fórmula en Excel), algo como esto:

Código
UB123
CSP45
HSS63
PC600
PSC60
PCDF9
SEG01
PCR40

DidierRamirezDarjo_0-1728589681071.png

Crearé un nodo de tipo Data.ImportExcel, al que en el puerto de entrada "File" le conectaré un nodo "File From Path" al cual le conectaré el nodo con el que extraje la ruta del archivo de Excel en el script anterior para crearlo:

DidierRamirezDarjo_1-1728589821843.png

Por otro lado, en el puerto de entrada tipo "readAsStrings" un nodo Tipo Boolean configurado en "True" para que los datos del Excel sean interpretados como cadenas de Texto:

DidierRamirezDarjo_2-1728589976155.png

Conectaremos el Nodo de Data.ImportExcel a un nodo tipo List.RemoveItemAtIndex este me servirá para eliminar el primer grupo de información del Excel correspondiente a los encabezados de las columnas:

DidierRamirezDarjo_1-1728591253545.png

Eliminada esta información agruparemos por tipología de columna, los datos con un nodo de List.Traspose:

DidierRamirezDarjo_3-1728591326419.png

Es importante notar que la información que queremos inyectar en el modelo, en este caso los Códigos, está en el nivel 3 de la lista. Por lo que ahora usaremos un nodo de tipo List.GetItemAtIndex para extraer este nivel de la lista.

 

Esto funciona como un tipo de filtro. Para lo cual conectaremos el List.Traspose a este nodo en el puerto "list" y al puerto "index" le conectaremos un Code Block con el número 3 para que identifique el listado correspondiente:

DidierRamirezDarjo_4-1728591583764.png

Podremos ver que, efectivamente, está aislando esta información. Como paso final, usaremos dos nodos tipo Element.SetParameterByName para que ubique dentro del modelo el Parámetro Compartido "Código" y dentro de el vacíe los códigos del nivel 3 del listado. 

 

Por lo tanto, en el primer nodo Element.SetParameterByName, conectaremos en el puerto element el nodo con los tipos que extrajimos al inicio, tanto para columnas como para cimentaciones:

DidierRamirezDarjo_6-1728591766323.pngDidierRamirezDarjo_7-1728591813130.png

En el puerto de entrada "parameterName" conectaré un Code Block con el nombre del parámetro:

DidierRamirezDarjo_8-1728591890554.png

Y por último, el List.GetitemAtIndex al Value para que esos datos los inyecte en el parámetro determinado:

DidierRamirezDarjo_9-1728591951533.png

Como resultado de todo esto, si revisas las propiedades de tipo de tus elementos, podrás notar que los campos de Código han sido llandos correctamente para todos los elementos (Puedes comprobarlo en las propiedades o creando tablas de cuantificación):

DidierRamirezDarjo_10-1728592494417.png

Este es un vistazo del Excel final:

DidierRamirezDarjo_10-1728587317714.png

De esta manera hemos logrado inyectar Multiples Datos desde Excel al modelo.

 

Espero te sea de utilidad, de ser así no dejes de comentar y si consideras que puedes aportar para mejorar la rutina será bienvenido. Nos vemos en un mes para el siguiente artículo.

 

Saludos!