💻 Revit API

Programación

Crear un parámetro compartido con la API de Revit.

2021-12-29

5 min read

Todos tenemos claro que lo mas importante de BIM es la I de información. En Revit tenemos esta información almacenada en los parámetros. Para este pequeño artículo hablaremos como haremos para crear un parámetro compartido y asignarlo a ciertas categorías.

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

command.cs
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SetFowrwork
{
    [Transaction(TransactionMode.Manual)]
    public class CmdSetFowrwork : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData,
                              ref string message,
                              ElementSet elements)
        {
                        TaskDialog.show("Mi primer aplicativo", "Hola Mundo");
            return Result.Succeeded;
        }
    }
}

Hemos elegido TransactionMode.Manual ya que haremos cambios en el documento, además hemos iniciado mostrando un mensaje con TaskDialog.show para saber si nuestro aplicativo funciona. Obteniendo como resultado una ventana simple como la que se muestra en la imagen

CreateParameter

Este método será el que usaremos para crear nuestro parámetro y asignarlo a las categorías elegidas. Para que nuestro código sea reutilizable asignaremos los siguientes parámetros.

NOMBRETIPODESCRIPCIÓN
appApplicationApplication app = uiDoc.Application.Application;
docDocumentRepresenta el proyecto donde trabajamos.
CategorySetcategorySetLista de categorías donde asignaremos nuestro parámetro.
parameterNamestringNombre del parámetro.
parameterTypeParameterTypeTipo de parámetro.
parameterGroupBuiltInParameterGroupGrupo donde asignaremos nuestro parámetro.
visiblebooldefinimos si nuestro parámetro será visible.

Crear un archivo de texto para almacenar nuestro SharedParameter

crearemos un archivo de texto .txt de manera temporal con el método Path.GetTempFileName() que posteriormente eliminaremos

command.cs
// Obtenemos la ruta de nuestro archivo actual de SharedParameter
string sharedParametersFilename = app.SharedParametersFilename;

string str = string.Concat(Path.GetTempFileName(), ".txt"); // Nombre del archivo temporal.
FileStream fileStream = File.Create(str) // Crear el archivo temporal

Definimos propiedades de nuestro SharedParameter

command.cs
app.SharedParametersFilename = str;
ExternalDefinitionCreationOptions externalDefinitionCreationOption = new ExternalDefinitionCreationOptions(parameterName, parameterType);
externalDefinitionCreationOption.Visible = visible;
externalDefinitionCreationOption.UserModifiable = true;

string newGuid = Guid.NewGuid().ToString();
externalDefinitionCreationOption.GUID = new Guid(newGuid);

Creamos un grupo dentro de nuestro SharedParameter

command.cs
ExternalDefinition externalDefinition = app.OpenSharedParameterFile()
                                            .Groups.Create("Lambda I&I")
                                            .Definitions
                                            .Create(externalDefinitionCreationOption) as ExternalDefinition;

Eliminamos nuestro archivo temporal

command.cs
app.SharedParametersFilename = sharedParametersFilename;
File.Delete(str);

Seleccionamos las categorías donde estará nuestro parámetro

command.cs
Binding binding = app.Create.NewInstanceBinding(categorySet);
BindingMap bindingMap = new UIApplication(app).ActiveUIDocument.Document.ParameterBindings;
bindingMap.Insert(externalDefinition, binding, parameterGroup);
DefinitionBindingMapIterator definitionBindingMapIterator = doc.ParameterBindings.ForwardIterator();
definitionBindingMapIterator.Reset();

while (definitionBindingMapIterator.MoveNext())
{
   if ((definitionBindingMapIterator.Key == null
                || !(definitionBindingMapIterator.Key.Name.ToUpper() == parameterName.ToUpper())
                ? false
                : ParameterType.Text == definitionBindingMapIterator.Key.ParameterType))
   {
       InternalDefinition key = definitionBindingMapIterator.Key as InternalDefinition;
       if (key != null)
       {
          try
          {
            key.SetAllowVaryBetweenGroups(doc, true);
          }
          catch { }
        }
    }
}

Ejecutar nuestro método para crear el parámetro

Dentro de nuestro método Execute obtenemos las categorías donde asignaremos nuestro parámetro.

command.cs
CategorySet categorySet = new CategorySet();

categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_StructuralColumns));
categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_StructuralFraming));
categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_StructuralFoundation));
categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Walls));
categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Floors));
categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Stairs));

Finalmente generamos una Transaction para hacer las modificaciones en el documento.

command.cs
using (Transaction trans = new Transaction(doc))
{
    trans.Start("Create Parameter");
    try
    {
       CreateParameter(app,
                       doc,
                       categorySet,
                       ParameterType.Text,
                       BuiltInParameterGroup.PG_SUPPORT,
                       "Lambda test",
                       true);
       trans.Commit();
    }
       catch (Exception ex)
    {
       TaskDialog.Show("Error", ex.Message);
       trans.RollBack();
       return Result.Failed;
    }

}

Codigo Completo

Para que sea mucho mas fácil entender cómo funcional el aplicativo te dejo el código completo para su análisis.

command.cs
using System;
using System.IO;

using Autodesk.Revit.Attributes;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace SetFowrwork
{
    [Transaction(TransactionMode.Manual)]
    public class CmdSetFowrwork : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData,
                              ref string message,
                              ElementSet elements)
        {
            UIApplication uiApp = commandData.Application;
            UIDocument uiDoc = uiApp.ActiveUIDocument;
            Document doc = uiDoc.Document;

            Application app = uiDoc.Application.Application;

            CategorySet categorySet = new CategorySet();

            categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_StructuralColumns));
            categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_StructuralFraming));
            categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_StructuralFoundation));
            categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Walls));
            categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Floors));
            categorySet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Stairs));

            using (Transaction trans = new Transaction(doc))
            {
                    trans.Start("Create Lines");
                try
                {
                    CreateParameter(app,
                                    doc,
                                    categorySet,
                                    ParameterType.Text,
                                    BuiltInParameterGroup.PG_SUPPORT,
                                    "Lambda test",
                                    true);
                    trans.Commit();
                }
                catch (Exception ex)
                {

                    TaskDialog.Show("Error", ex.Message);
                    trans.RollBack();
                    return Result.Failed;
                }

            }
            return Result.Succeeded;
        }

        public void CreateParameter(Application app,
                                    Document doc,
                                    CategorySet categorySet,
                                    ParameterType parameterType,
                                    BuiltInParameterGroup parameterGroup,
                                    string parameterName,
                                    bool visible)
        {

            string sharedParametersFilename = app.SharedParametersFilename;
            string str = string.Concat(Path.GetTempFileName(), ".txt");
            using (FileStream fileStream = File.Create(str)) { }

            app.SharedParametersFilename = str;
            ExternalDefinitionCreationOptions externalDefinitionCreationOption = new ExternalDefinitionCreationOptions(parameterName, parameterType);
            externalDefinitionCreationOption.Visible = visible;
            externalDefinitionCreationOption.UserModifiable = true;

            string newGuid = Guid.NewGuid().ToString();
            externalDefinitionCreationOption.GUID = new Guid(newGuid);

            ExternalDefinition externalDefinition = app.OpenSharedParameterFile()
                                                       .Groups.Create("Lambda")
                                                       .Definitions.Create(externalDefinitionCreationOption) as ExternalDefinition;

            app.SharedParametersFilename = sharedParametersFilename;
            File.Delete(str);

            Binding binding = app.Create.NewInstanceBinding(categorySet);
            BindingMap bindingMap = new UIApplication(app).ActiveUIDocument.Document.ParameterBindings;
            bindingMap.Insert(externalDefinition, binding, parameterGroup);
            DefinitionBindingMapIterator definitionBindingMapIterator = doc.ParameterBindings.ForwardIterator();
            definitionBindingMapIterator.Reset();

            while (definitionBindingMapIterator.MoveNext())
            {
                if ((definitionBindingMapIterator.Key == null
                                         || !(definitionBindingMapIterator.Key.Name.ToUpper() == parameterName.ToUpper())
                                         ? false
                                         : ParameterType.Text == definitionBindingMapIterator.Key.ParameterType))
                {
                    InternalDefinition key = definitionBindingMapIterator.Key as InternalDefinition;
                    if (key != null)
                    {
                        try
                        {
                            key.SetAllowVaryBetweenGroups(doc, true);
                        }
                        catch
                        {
                        }
                    }
                }
            }
        }
    }
}

Espero que les sirva el pequeño tutorial sobre como crear. ¿Cómo apoyarme a seguir creando contenido? simplemente compartan el artículo, síganme en YouTube, Instagram y Facebook.

Ú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

;