💻 Revit API
Programación
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.
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
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.
NOMBRE | TIPO | DESCRIPCIÓN |
---|---|---|
app | Application | Application app = uiDoc.Application.Application; |
doc | Document | Representa el proyecto donde trabajamos. |
CategorySet | categorySet | Lista de categorías donde asignaremos nuestro parámetro. |
parameterName | string | Nombre del parámetro. |
parameterType | ParameterType | Tipo de parámetro. |
parameterGroup | BuiltInParameterGroup | Grupo donde asignaremos nuestro parámetro. |
visible | bool | definimos si nuestro parámetro será visible. |
crearemos un archivo de texto .txt de manera temporal con el método Path.GetTempFileName() que posteriormente eliminaremos
// 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
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 I&I")
.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 { }
}
}
}
Dentro de nuestro método Execute obtenemos las categorías donde asignaremos nuestro parámetro.
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.
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;
}
}
Para que sea mucho mas fácil entender cómo funcional el aplicativo te dejo el código completo para su análisis.
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.
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