Tiempo de lectura: ~ 4 minutos

1229 vistas

Crear acotación en Isometría en vistas 3D usando la API de Revit

# Revit API

Actualizado 26 de diciembre de 2024

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.

Inicialización de nuestro proyecto

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.

CotasThreeD.cs
1using Autodesk.Revit.Attributes;
2using Autodesk.Revit.DB;
3using Autodesk.Revit.DB.Plumbing;
4using Autodesk.Revit.UI;
5using Autodesk.Revit.UI.Selection;
6using System;
7using System.Collections.Generic;
8using System.Linq;
9using System.Text;
10using System.Threading.Tasks;
11
12namespace CotasThreeD
13{
14   public class CotasThreeD : IExternalCommand
15   {
16      public Result Execute(ExternalCommandData commandData, 
17                            ref string message, 
18                            ElementSet elements)
19      {
20         throw new NotImplementedException();
21      }
22   }
23}

Obtener variables del proyecto

Luego accederemos a la variable Documento, para poder trabajar con propiedades y métodos a lo largo de nuestro proyecto.

CotasThreeD.cs
20// Obtención de variables
21UIApplication uiApp = commandData.Application;
22UIDocument uiDoc = uiApp.ActiveUIDocument;
23Document doc = uiDoc.Document;

Recolectar elementos

Para seleccionar elementos, utilizaremos el PickObjects y generaremos una lista de referencias.

25IList<Reference> pickreferences = uiDoc.Selection
26                                  .PickObjects(ObjectType.Element,
27                                  "Select element");

Ahora crearemos un Foreach para recorrer todas las referencias. A partir de las referencias obtendremos los elementos, esta conversión es necesaria dado que es más sencillo trabajar con elementos.

28foreach (Reference elementref in pickreferences)
29{
30    ElementId pipeElementId = elementref.ElementId;
31    Element pipeElement = doc.GetElement(pipeElementId);
32    // (Filtrar los elementos para trabajar solo con tuberías)
33    int piteElementId = pipeElement.Category.Id.IntegerValue
34    if ((BuiltInCategory)piteElementId  != BuiltInCategory.OST_PipeCurves) 
35    {
36        continue;
37    }
38    Pipe pipe = doc.GetElement(pipeElementId) as Pipe;
39}
Importante
Continúe; funciona para omitir los procesos siguientes y continuar con el siguiente elemento en la lista.

Trabajar con geometrías de tuberías

Ahora obtendremos la curva de localización, a su vez el punto de inicio y fin.

40// Obtengo la curva, pero primero tengo que obtener la location curve
41LocationCurve pipeLocationCurve = pipe.Location as LocationCurve;
42
43// Obtengo la curva
44Curve pipeCurve = pipeLocationCurve.Curve;
45
46// Obtengo punto inicio y punto fin
47XYZ startPipeCurvePoint = pipeCurve.GetEndPoint(0); // 0: Inicio
48XYZ endPipeCurvePoint = pipeCurve.GetEndPoint(1); // 1: final

A partir de dos puntos obtenemos una línea con el método CreateBound.

50// Dos puntos son necesarios para crear una linea
51Line line = Line.CreateBound(startPipeCurvePoint, endPipeCurvePoint);

Luego crearemos un plano de trabajo con CreateByThreePoints para generarlos en tres puntos (x, y, z).

53Plane plane = Plane.CreateByThreePoints(startPipeCurvePoint,
54                    endPipeCurvePoint,
55                    new XYZ(0, 0, endPipeCurvePoint.Z));

Luego generemos un Array de referencias vacías donde recorreremos las geometrías de la tubería, y produciremos 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.

57// Lista vacía para obtener las referencias
58ReferenceArray references = new ReferenceArray();
59
60// Llenar esas referencias (Lista)
61if (pipe != null)
62{
63  // Configurar opciones de geometría
64  Options op = doc.Application.Create.NewGeometryOptions();
65  op.ComputeReferences = true;
66  op.View = doc.ActiveView;
67  op.IncludeNonVisibleObjects = true;
68
69  Reference R1 = null; // referencia del punto inicial
70  Reference R2 = null; // referencia del punto final
71
72  // recorrer la geometría tratando de obtener la curva
73  foreach (var geoObj in pipe.get_Geometry(op))
74  {
75        // pedimos que la geometría sea una curva
76        Curve c = geoObj as Curve;
77        if (c != null)
78        {
79           R1 = c.GetEndPointReference(0);
80           R2 = c.GetEndPointReference(1);
81        }
82   }
83   references.Append(R1);
84   references.Append(R2);
85}

Ahora iniciaremos nuestra transaction, luego definiremos y crearemos un plano de trabajo mediante un SketchPlane.

87using (Transaction trans = new Transaction(doc))
88   {
89     trans.Start("Create Lines");
90
91      // Creamos el plano de trabajo
92      SketchPlane sp = SketchPlane.Create(doc, plane);
93      // Establecemos el plano de trabajo
94      uiDoc.Document.ActiveView.SketchPlane = sp;
95
96      Dimension dimension = doc.Create.NewDimension(doc.ActiveView, line, references);
97   // Commit de los cambios
98    trans.Commit();
99   }

Compilar nuestro desarrollo

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.

CotasThreeD.addin
1<?xml version="1.0" encoding="utf-8"? >
2<RevitAddIns>
3    <AddIn Type="Command">
4        <Assembly>CotasThreeD.dll</Assembly>
5        <ClientId>e625b384-c38e-4b72-96fd-f1af6e98565f</ClientId>
6        <FullClassName>CotasThreeD.CmdCotasThreeD</FullClassName>
7        <Text>CotasThreeD</Text>
8        <Description>Un simple addin para acotar isometrias 3D</Description>
9        <VisibilityMode>AlwaysVisible</VisibilityMode>
10        <VendorId>ADSK</VendorId>
11        <VendorDescription>Lambda Ingenieria e Innovacion</VendorDescription>
12    </AddIn>
13</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.

Comparte este artículo

Suscribirse para recibir actualizaciones

Recibe semanalmente tutoriales, recursos, noticias sobre temas innovadores dentro del sector construcción y destaca profesionalmente.