馃捇 Desarrollo

Revit API

Vincular multiples archivos de Revit

2022-01-13

5 min read

En esta oportunidad desarrollaremos un aplicativo para los usuarios del software de Revit. El cual sera de gran ayuda al momento de querer vincular multiples 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 multiples 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
// Revit API Namespaces
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;

namespace MultipleLinks
{
    public class CmdQuantityBox : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData,
                              ref string message,
                              ElementSet elements)
        {
            TaskDialog.show("Mi primer aplicativo", "Hola Mundo");
            return Result.Succeeded;
        }
    }
}

Agregaremos la referencia de windows form.

Resaltado

using 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.

UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document doc = uiDoc.Document;

Luego utilizamos el openFiledialog para abrir un interfaz de b煤squeda de archivos

using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
   // Codigo a ejectuar
}

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

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
openFileDialog.InitialDirectory = path;

Luego activo la opci贸n de selecci贸n multiple de los archivos

openFileDialog.Multiselect = true;

Defino los formatos que podr谩 seleccionar el usuario

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

Creamos una variable donde almacenar la ruta de los archivos seleccionados

string[] filePaths = null;

Si el usuario selecciona la opci贸n 鈥渁ceptar = Ok鈥 guardamos la ruta de los archivos seleccionados dentro de Revit.

if (openFileDialog.ShowDialog() == DialogResult.OK)
{
  filePaths = openFileDialog.FileNames;
}

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

foreach (string filePath in filePaths)
{
    ModelPath modelPath = ModelPathUtils.ConvertUserVisiblePathToModelPath(filePath);
  RevitLinkOptions revitLinkOptions = new RevitLinkOptions(false);
}

Dado que modificaremos el elemento es necesario crear una Transaction donde crearemos un RevitLinkType que define los par谩metros del modelo que sera Linkeado y el cual nos servir谩 para crear 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

using (Transaction trans = new Transaction(doc))
{
   trans.Start("Cargar modelo");
   try
   {
      var linkType = RevitLinkType.Create(doc, modelPath, revitLinkOptions);
        var instance = RevitLinkInstance.Create(doc, linkType.ElementId);
      trans.Commit();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
            trans.RollBack();
   }
}

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

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

Y por ultimo 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.

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.

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; 

namespace MultipleLinks
{
    [Transaction(TransactionMode.Manual)]
    public class CmdMultipleLinks : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            // Obtener las variables para trabajar con el documento
            UIApplication uiApp = commandData.Application;
            UIDocument uiDoc = uiApp.ActiveUIDocument;
            Document doc = uiDoc.Document;

            // Crear una variable donde almacenar la ruta de los archivos seleccionados
            string[] filePaths = null;

            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                // selecciono una ruta de abertura para nuestr ofd
                string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                openFileDialog.InitialDirectory = path;

                // Activo la opcion de seleccion multiple de archivos
                openFileDialog.Multiselect = true;

                // Defines los formatos que podra seleccionar el usuario
                openFileDialog.Filter = "Revit Files (*.rvt)|*.rvt";

                // Si el usuario clickea Aceptar guardamos la ruta de los archivos seleccionados
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    filePaths = openFileDialog.FileNames;
                }
            }
            // recorremos cada una de las rutas seleccionada
            foreach (string filePath in filePaths)
            {
                // Creamos un Model path a partir de un path = ruta
                ModelPath modelPath = ModelPathUtils.ConvertUserVisiblePathToModelPath(filePath);

                // Creamos revit link options de manera predefinida
                RevitLinkOptions revitLinkOptions = new RevitLinkOptions(false);

                // Generamos la transaccion para modificar el documento
                using (Transaction trans = new Transaction(doc))
                {
                    trans.Start("Cargar modelo");
                    try
                    {
                        // Generamos un Revit Linktype -> Define como se carga el modelo linkeado
                        var linkType = RevitLinkType.Create(doc, modelPath, revitLinkOptions);

                        // Cargamos el modelo.
                        var instance = RevitLinkInstance.Create(doc, linkType.ElementId);
                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        // en caso encuentres un error mostrar mensaje
                        MessageBox.Show(ex.Message);

                        // eliminar los cambios hechos
                        trans.RollBack();
                    }
                }
            }
            return Result.Succeeded;
        }
    }
}

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.

脷nete a nuestra comunidad y mantente actualizado.

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

Subscribi茅ndose, est谩s de acuerdo con los T茅rminos y condiciones de la Pol铆tica de Privacidad. de Lambda Ingenier铆a e Innovaci贸n

Deja tus comentarios

;