💻 Desarrollo
Revit API
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.
// 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.
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 “aceptar = 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.
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