Revit API. Introducción IV

Asignar una URL a una columna. Transacciones

Tras la publicación de la última entrada relacionada con la API de RevitWilliams Espinosa Opazo planteó la siguiente cuestión:

He estado trantando de asignarle una URL a cada columna pero en mi proyecto son demasiadas columnas y queria crear un codigo que pudiera automatizar esto.

Posteriormente me escribió para detallar el proceso a realizar: se trata de “rellenar” un parámetro llamado “URL” con URLs que tuvieran la  estructura:  www.columnas.cl/IDcolumna1www.columnas.cl/IDcolumna2, etc.

He tenido este asunto parado por la avalancha de trabajo que estamos teniendo en Modelical, pero hoy me he decidido a dar respuesta a la consulta (pese a que el ritmo de trabajo no haya disminuído 😐 ). Pues Bien, empecemos!

Emplearé como base el código desarrollado en el post anterior. Para llevar a cabo el proceso comentado, es necesario realizar cambios en el modelo, es decir, tenemos que “escribir” alguna información en el modelo, por lo que será necesario crear transacciones. Las transacciones son, por así decirlo, el espacio en el que deben desarrollarse los cambios que hagamos sobre el modelo cuando trabajamos desde la API. Como vamos a ver, esto tiene algunas implicaciones.  En primer lugar debemos cambiar el modo de transacción a manual, para indicar cuándo ha de producirse una transacción. Además, deberemos crear una transacción que contendrá la asignación de URL a las columnas y cuyo nombre ha de ser corto y suficientemente explicativo, ya que ese nombre es el que veremos al desplegar  el botón “deshacer” en Revit. Posteriormente deberemos iniciar la transacción, realizar las acciones que modifican el modelo y después cerrar la transacción.

Para asignar la URL necesitamos, en primer lugar, almacenar la ID de cada columna como cadena de texto. Para ello, creamos un parámetro llamado “columnIDAsString” y extraemos la id con “el.Id.ToString();”. Posteriormente añadimos la ID al texto fijo, en este caso “www.columnas.cl/”, en el parámetro “url”. Ya sólo queda asignar el valor de “url” al parámetro “URL” de la columna. Este parámetro “URL”, lo he creado directamente en la interface de Revit, antes de ejecutar el Addin, aunque se podría haber hecho desde la API.

Por último, se muestra un cuadro de diálogo en el que se informa de la acción realizada.

using System;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace URLColumnas
{
    //En este caso necesitamos cambiar el modo de transacción a manual
     [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

    public class URLCol:IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document documentoAbierto = commandData.Application.ActiveUIDocument.Document;
            View vistaActiva = documentoAbierto.ActiveView;

            //Filtro de selección y almacenamiento de todas las columnas
            IList columnasEnVista = new FilteredElementCollector(documentoAbierto, vistaActiva.Id).OfCategory(BuiltInCategory.OST_StructuralColumns).ToElements();

            string urlStart = "www.columnas.cl/";

            //Creamos la transacción necesaria para realizar cambios en el modelo
            Transaction transAsigURL = new Transaction(documentoAbierto, "Asignación de URL");

            //Iniciamos la transacción
            transAsigURL.Start();

            //Asignamos al parámetro "URL" la URL deseada
            foreach (Element el in columnasEnVista)
            {
                //Leemos la ID de la columna como cadena de texto
                string columnIDAsString = el.Id.ToString();
                //Combinamos la ID de la columna con el resto de la URL
                string url = urlStart + columnIDAsString;
                //Asignamos al parámetro "URL" el valor de url
                el.get_Parameter("URL").Set(url);

            }

            //Finalizamos la transaccion;
            transAsigURL.Commit();

            //Información de la asignación realizada
            TaskDialog.Show("Modelical Blog", columnasEnVista.Count.ToString()+"  URLs han sido asignadas");


            return Result.Succeeded;
        }
    }
}

En las siguientes capturas de pantalla, se observa como funciona el Addin en un proyecto de ejemplo.

BLOG_URLcolumn1

BLOG_URLcolumn2

BLOG_URLcolumn3
</p

Si estás interesado en el tema o tienes alguna consulta concreta, no dudes en escribirme: juanma@modelical.com.