💻 Desarrollo
Revit API
2022-03-13
4 min read
El siguiente aplicativo a desarrollar tiene como objetivo generar las cotas de manera automática en una vista isométrica 3D.
Iniciaremos creando un nuevo proyecto en Visual Studio al cual nombraremos CotasThreeD, para Autodesk Revit 2020.
Nuestro proyecto seguirá los mismos pasos de la publicación de Mi primer addin con la API de Revit con la única diferencia en el nombre del proyecto, del cual tendríamos el siguiente código.
#region NAMESPACES
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#endregion
namespace CotasThreeD
{
public class CotasThreeD : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
throw new NotImplementedException();
}
}
}
Luego accederemos a la variable Documento, para poder trabajar con propiedades y métodos a lo largo de nuestro proyecto.
// Obtención de variables
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document doc = uiDoc.Document;
Para seleccionar elementos utilizaremos el PickObjects y generaremos una lista de referencias.
// Seleccionar elementos
IList<Reference> pickreferences = uiDoc.Selection
.PickObjects(ObjectType.Element,
"Select element");
Generaremos una condicional Foreach para recorrer todos los elementos
// Recorro todos los elementos
foreach (Reference elementref in pickreferences)
Luego obtendremos el ElementId para así filtrarlos y trabajar solo con las categorías de tuberías
// Obtengo el ElementId desde la referencia
ElementId pipeElementId = elementref.ElementId;
// Condicional (Filtrar los elementos para trabajar solo con tuberías)
Element pipeElement = doc.GetElement(pipeElementId);
if ((BuiltInCategory)pipeElement.Category.Id.IntegerValue != BuiltInCategory.OST_PipeCurves){
continue;
}
// Continue; funciona para omitir los procesos siguientes y continuar con el siguiente elemento en la lista.
// Obtener elemento doc.GetElement(pipeElementId), pero lo voy a convertir en un Pipe
Pipe pipe = doc.GetElement(pipeElementId) as Pipe;
Ahora obtendremos la curva de localización, a su vez el punto de inicio y fin.
// Obtengo la curva, pero primero tengo que obtener la location curve
LocationCurve pipeLocationCurve = pipe.Location as LocationCurve;
// Obtengo la curva
Curve pipeCurve = pipeLocationCurve.Curve;
// Obtengo punto inicio y punto fin
XYZ startPipeCurvePoint = pipeCurve.GetEndPoint(0); // 0: Inicio
XYZ endPipeCurvePoint = pipeCurve.GetEndPoint(1); // 1: final
A partir de dos puntos obtenemos una linea con el método CreateBound.
// Dos puntos son necesarios para crear una linea
Line line = Line.CreateBound(startPipeCurvePoint, endPipeCurvePoint);
Luego crearemos un plano de trabajo con CreateByThreePoints para crearlos en tres puntos (x, y, z).
Plane plane = Plane.CreateByThreePoints(startPipeCurvePoint,
endPipeCurvePoint,
new XYZ(0, 0, endPipeCurvePoint.Z));
Luego creamos un Array de referencias vacías donde recorreremos las geometrías de la tubería, y crearemos una condicional donde si la tubería es diferente de nula nos cree opciones de geometrías y le calcule las referencias dentro de la vista activa.
// Lista vacía para obtener las referencias
ReferenceArray references = new ReferenceArray();
// Llenar esas referencias (Lista)
if (pipe != null)
{
// Configurar opciones de geometría
Options op = doc.Application.Create.NewGeometryOptions();
op.ComputeReferences = true;
op.View = doc.ActiveView;
op.IncludeNonVisibleObjects = true;
Reference R1 = null; // referencia del punto inicial
Reference R2 = null; // referencia del punto final
// recorrer la geometría tratando de obtener la curva
foreach (var geoObj in pipe.get_Geometry(op))
{
// pedimos que la geometría sea una curva
Curve c = geoObj as Curve;
if (c != null)
{
R1 = c.GetEndPointReference(0);
R2 = c.GetEndPointReference(1);
}
}
references.Append(R1);
references.Append(R2);
}
Ahora iniciaremos nuestra transaction, luego definiremos y crearemos un plano de trabajo mediante un SketchPlane.
using (Transaction trans = new Transaction(doc))
{
trans.Start("Create Lines");
// Creamos el plano de trabajo
SketchPlane sp = SketchPlane.Create(doc, plane);
// Establecemos el plano de trabajo
uiDoc.Document.ActiveView.SketchPlane = sp;
//.....
}
Por último creamos la cota, indicando que se generara en la vista activa.
{
//.....
// Método para crear una nueva dimensión
Dimension dimension = doc.Create.NewDimension(doc.ActiveView, line, references);
// Commit de los cambios
trans.Commit();
}
Ya llegado a este punto hemos culminado con el aplicativo, ahora para generar el vínculo entre la (.dll) y Revit, tenemos que generar el archivo manifiesto y agregar los eventos de compilación.
<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Command">
<Assembly>CotasThreeD.dll</Assembly>
<ClientId>e625b384-c38e-4b72-96fd-f1af6e98565f</ClientId>
<FullClassName>CotasThreeD.CmdCotasThreeD</FullClassName>
<Text>CotasThreeD</Text>
<Description>Un simple addin para acotar isometrias 3D</Description>
<VisibilityMode>AlwaysVisible</VisibilityMode>
<VendorId>ADSK</VendorId>
<VendorDescription>Lambda Ingenieria e Innovacion</VendorDescription>
</AddIn>
</RevitAddIns>
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.
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