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.cs1using 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.cs20// 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}
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.addin1<?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.
Suscribirse para recibir actualizaciones
Recibe semanalmente tutoriales, recursos, noticias sobre temas innovadores dentro del sector construcción y destaca profesionalmente.