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.cs1// 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.
Command.cs1using 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.cs1UIApplication 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.cs1using (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.cs1string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 2openFileDialog.InitialDirectory = path;
Luego activo la opción de selección múltiple de los archivos
Command.cs1openFileDialog.Multiselect = true;
Defino los formatos que podrá seleccionar el usuario
Command.cs1openFileDialog.Filter = "Revit Files (*.rvt)|*.rvt";
Creamos una variable donde almacenar la ruta de los archivos seleccionados
Command.cs1string[] 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.cs1foreach (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.cs1using (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.cs1<?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.cscopy "$(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.cs1using 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.
Suscribirse para recibir actualizaciones
Recibe semanalmente tutoriales, recursos, noticias sobre temas innovadores dentro del sector construcción y destaca profesionalmente.