Tiempo de lectura: ~ 6 minutos

171 vistas

Vincular multiples archivos de Revit

# Revit API

Actualizado 26 de diciembre de 2024

En esta oportunidad desarrollaremos un aplicativo para los usuarios del software de Revit. El cual será de gran ayuda al momento de querer vincular múltiples modelos. La finalidad es optimizar el proceso y disminuir tiempo de esta actividad, ya que cuando trabajamos de proyectos de gran envergadura, la cantidad de especialidades nos obliga a crear múltiples modelos.

Empezaremos creando un nuevo proyecto en Visual Studio, la plantilla de Librería de Clases (.NET Framework) usando el lenguaje C#. A este proyecto lo nombraremos MultipleLinks y usaremos .NET Framework 4.7.2. Para Autodesk Revit 2019.

Iniciaremos nuestro proyecto según la publicación de Mi primer addin con la API de Revit y tendríamos el siguiente código.

Nota: Los siguientes pasos que se realizaran se explicaran de manera clara y resumida para el aplicativo que crearemos, pero si tienen dudas sobre primeros pasos de creación de un proyecto hasta la creación del interfaz los invito a revisar mi publicación de Mi primer addin con la API de Revit para su mejor entendimiento.

Command.cs
1// Revit API Namespaces
2using Autodesk.Revit.Attributes;
3using Autodesk.Revit.DB;
4using Autodesk.Revit.UI;
5using Autodesk.Revit.UI.Selection;
6
7namespace MultipleLinks
8{
9    public class CmdQuantityBox : IExternalCommand
10    {
11        public Result Execute(ExternalCommandData commandData,
12                              ref string message,
13                              ElementSet elements)
14        {
15            TaskDialog.show("Mi primer aplicativo", "Hola Mundo");
16            return Result.Succeeded;
17        }
18    }
19}

Agregaremos la referencia de windows form.

Inicio de la API de Revit

Command.cs
1using System.Windows.Forms; // Agregar la referencia de Windows forms

Agregaremos la referencia de windows form. Luego accederemos a la variable Documento, para poder trabajar con propiedades y métodos a lo largo de nuestro proyecto.

Command.cs
1UIApplication uiApp = commandData.Application;
2UIDocument uiDoc = uiApp.ActiveUIDocument;
3Document doc = uiDoc.Document;

Luego utilizamos el openFiledialog para abrir una interfaz de búsqueda de archivos

Command.cs
1using (OpenFileDialog openFileDialog = new OpenFileDialog())
2{
3   // Codigo a ejectuar
4}

Seleccionaremos una ruta de abertura para nuestro openFiledialog, que para este caso será el escritorio.

Command.cs
1string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
2openFileDialog.InitialDirectory = path;

Luego activo la opción de selección múltiple de los archivos

Command.cs
1openFileDialog.Multiselect = true;

Defino los formatos que podrá seleccionar el usuario

Command.cs
1openFileDialog.Filter = "Revit Files (*.rvt)|*.rvt";

Creamos una variable donde almacenar la ruta de los archivos seleccionados

Command.cs
1string[] filePaths = null;

Si el usuario selecciona la opción “aceptar = Ok” guardamos la ruta de los archivos seleccionados dentro de Revit.

1if (openFileDialog.ShowDialog() == DialogResult.OK)
2{
3  filePaths = openFileDialog.FileNames;
4}

Ahora recorremos las lista de rutas de los elementos seleccionas a través del uso de foreach. Dentro de nuestro Foreach, obtendremos variables como el ModelPath y definiremos RevitLinkOptions,

Command.cs
1foreach (string filePath in filePaths)
2{
3    ModelPath modelPath = ModelPathUtils.ConvertUserVisiblePathToModelPath(filePath);
4  RevitLinkOptions revitLinkOptions = new RevitLinkOptions(false);
5}

Dado que modificaremos el elemento es necesario crear una Transaction donde generaremos un RevitLinkType que define los parámetros del modelo que sera Linkeado y el cual nos servirá para generar nuestra instancia mediante el método RevitLinkInstance.Create. En caso tengamos un error en la creación de nuestra instancia, mostraremos un mensaje de la excepción con el método MessageBox.Show y un trans.RollBack() para anular los cambios realizados

Command.cs
1using (Transaction trans = new Transaction(doc))
2{
3   trans.Start("Cargar modelo");
4   try
5   {
6      var linkType = RevitLinkType.Create(doc, modelPath, revitLinkOptions);
7        var instance = RevitLinkInstance.Create(doc, linkType.ElementId);
8      trans.Commit();
9   }
10   catch (Exception ex)
11   {
12      MessageBox.Show(ex.Message);
13            trans.RollBack();
14   }
15}

Para ya terminar el aplicativo, nos faltaría agregar el archivo manifiesto

Command.cs
1<?xml version="1.0" encoding="utf-8"?>
2<RevitAddIns>
3    <AddIn Type="Command">
4        <Assembly>MultipleLinks.dll</Assembly>
5        <ClientId>deb1c920-7acc-4ea3-ac97-036606906a23</ClientId>
6        <FullClassName>MultipleLinks.CmdMultipleLinks</FullClassName>
7        <Text>Multiple Links</Text>
8        <Description>Un simple addin que saluda con carita de feliz :)</Description>
9        <VisibilityMode>AlwaysVisible</VisibilityMode>
10        <VendorId>ADSK</VendorId>
11        <VendorDescription>Lambda Ingenieria e Innovacion</VendorDescription>
12    </AddIn>
13</RevitAddIns>

Y por último agregaremos a Visual Studio los eventos de compilación, los cuales después de compilar un addin dentro de Revit, permite compilar los archivos .dll y .addin dentro de una carpeta que Revit leerá el manifiesto y podrá cargar nuestro addin, podemos encontrar estos eventos en el siguiente link.

Command.cs
copy "$(ProjectDir)*.addin" "$(AppData)\Autodesk\REVIT\Addins\2019"
copy "$(ProjectDir)bin\debug\*.dll" "$(AppData)\Autodesk\REVIT\Addins\2019"

Siguiendo lo pasos anteriores llegaríamos a tener el siguiente código del aplicativo.

Command.cs
1using Autodesk.Revit.Attributes;
2using Autodesk.Revit.DB;
3using Autodesk.Revit.UI;
4using System;
5using System.Collections.Generic;
6using System.IO;
7using System.Linq;
8using System.Text;
9using System.Threading.Tasks;
10using System.Windows.Forms; 
11
12namespace MultipleLinks
13{
14    [Transaction(TransactionMode.Manual)]
15    public class CmdMultipleLinks : IExternalCommand
16    {
17        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
18        {
19            // Obtener las variables para trabajar con el documento
20            UIApplication uiApp = commandData.Application;
21            UIDocument uiDoc = uiApp.ActiveUIDocument;
22            Document doc = uiDoc.Document;
23
24            // Crear una variable donde almacenar la ruta de los archivos seleccionados
25            string[] filePaths = null;
26
27            using (OpenFileDialog openFileDialog = new OpenFileDialog())
28            {
29                // selecciono una ruta de abertura para nuestr ofd
30                string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
31                openFileDialog.InitialDirectory = path;
32
33                // Activo la opcion de seleccion multiple de archivos
34                openFileDialog.Multiselect = true;
35
36                // Defines los formatos que podra seleccionar el usuario
37                openFileDialog.Filter = "Revit Files (*.rvt)|*.rvt";
38
39                // Si el usuario clickea Aceptar guardamos la ruta de los archivos seleccionados
40                if (openFileDialog.ShowDialog() == DialogResult.OK)
41                {
42                    filePaths = openFileDialog.FileNames;
43                }
44            }
45            // recorremos cada una de las rutas seleccionada
46            foreach (string filePath in filePaths)
47            {
48                // Creamos un Model path a partir de un path = ruta
49                ModelPath modelPath = ModelPathUtils.ConvertUserVisiblePathToModelPath(filePath);
50
51                // Creamos revit link options de manera predefinida
52                RevitLinkOptions revitLinkOptions = new RevitLinkOptions(false);
53
54                // Generamos la transaccion para modificar el documento
55                using (Transaction trans = new Transaction(doc))
56                {
57                    trans.Start("Cargar modelo");
58                    try
59                    {
60                        // Generamos un Revit Linktype -> Define como se carga el modelo linkeado
61                        var linkType = RevitLinkType.Create(doc, modelPath, revitLinkOptions);
62
63                        // Cargamos el modelo.
64                        var instance = RevitLinkInstance.Create(doc, linkType.ElementId);
65                        trans.Commit();
66                    }
67                    catch (Exception ex)
68                    {
69                        // en caso encuentres un error mostrar mensaje
70                        MessageBox.Show(ex.Message);
71
72                        // eliminar los cambios hechos
73                        trans.RollBack();
74                    }
75                }
76            }
77            return Result.Succeeded;
78        }
79    }
80}

Y eso es todo. Es un proceso que vale la pena intentarlo y probarlo, sumémonos todos para poder formar una comunidad de personas que tengan las ganas de ingresar a este nuevo mundo de la programación.

Si necesitan más información sobre este increíble mundo de la automatización de procesos a través de la creación de aplicaciones en Autodesk Revit no duden en escribirme a mi LinkedIn Bryan Espinoza Allcca o dejar comentarios debajo de este post.

Comparte este artículo

Suscribirse para recibir actualizaciones

Recibe semanalmente tutoriales, recursos, noticias sobre temas innovadores dentro del sector construcción y destaca profesionalmente.