Revit API. Introducción II
Programación Orientada a Objetos
Hace ya algún tiempo me aventuré a dar los primeros pasos en la API de Revit. Como todo el mundo, comencé siguiendo el tutorial “My First Plug In” en la página de Autodesk. Hice el tutorial completo, vi los videos, leí la documentación y mi pánico ante la complejidad de la API creció unos cuantos puntos. Teniendo en cuenta que ya disponía de una considerable experiencia trabajando con Revit ¿Qué era lo que fallaba?

Pues fallaba el dominio de la programación orientada a objetos. Anteriormente había programado rutinas para resolver distintos tipos de problemas, pero nunca había trabajado con un lenguaje orientado a objetos. Por tanto, faltaba comprender lo que es una clase y lo que es un método. Faltaba saber cómo se estructura la información y las implicaciones que tiene definir un método de una u otra manera. Por tanto, mi primer consejo para empezar a trabajar con la API de Revit es sencillo pero ambicioso: Aprende a manejarte con la programación orientada a objetos y, por supuesto, aprende a manejarte con Revit.
Si ya conoces algo de programación estructurada y eres capaz de definir bucles, crear subrutinas, etc, ya tienes mucho avanzado, sólo deberás acostumbrarte a la sintaxis del lenguaje que elijas (en el caso de la API de Revit C#.NET o VB.NET) y entender las reglas básicas de la programación orientada a objetos. Yo me he decantado por C#, por lo que los ejemplos y explicaciones que se expongan aquí estarán programadas en este lenguaje. Uno de los conceptos principales de la programación orientada a objetos es la clase. Una clase podría definirse como un objeto. Por así decirlo, es una manera de crear un “contenedor de información” sobre ese objeto. La utilidad de esta forma de estructurar la información y la forma de manejarla, se ve mejor a través de un sencillo ejemplo. Vamos a crear una clase que sea un punto en el espacio, llamada “Point3D”. La información básica de ese objeto son sus coordenadas (x,y,z), por lo que dentro de la clase se definen las tres variables.
class Point3D
{
public double x;
public double y;
public double z;
}
}
Con esto, lo que hemos hecho es definir la estructura de un contenedor de puntos, de modo que ahora es posible crear un punto empleando la clase definida. Para ello, hay que “instanciar” la clase, que no es más que crear un punto objeto Point3D con nombre y apellidos:
Point3D punto1 = new Point3D();
Una vez creado el ejemplar punto1, podemos dar valor a sus variables accediendo a ellas a través del propio ejemplar escribiendo un punto y el nombre de la variable:
punto1.x = 2.5;
punto1.y = 2.5;
punto1.z = 2.5;
Además, dentro de una clase pueden definirse métodos, que no son más que funciones relaticionadas al tipo de objeto que se ha creado. La definición de los métodos se puede hacer de dos maneras:
1. Haciendo que la función tenga que ser llamada desde un ejemplar concreto, esto quiere decir que en nuestro ejemplo el método sólo podría ser llamada desde “punto1”. Ejemplo: punto1.MetodoQueQueremosUsar
2. Haciendo que el método pueda ser llamado desde la clase, sin necesidad de hacerlo desde una instancia. Para ello, deberemos incluir la palabra “static” en la declaración del método. Ejemplo: Point3D.MetodoQueQueremosUsar
En el siguiente bloque de código se muestra la clase empleada como ejemplo más arriba, completada con la implementación de un método de cada tipo.
class Point3D
{
public double x;
public double y;
public double z;
public double Distance(Point3D p)
{
double d = Math.Sqrt(Math.Pow(x - p.x, 2) + Math.Pow(y - p.y, 2) + Math.Pow(z - p.z, 2));
return d;
}
public static Point3D MeanPoint(Point3D p1, Point3D p2)
{
Point3D meanP = new Point3D();
meanP.x = (p1.x+p2.x)/2;
meanP.y = (p1.y+p2.y)/2;
meanP.z = (p1.z+p2.z)/2;
return meanP;
}
}
Como hemos dicho, en el primer caso para calcular la distancia de un punto p1 a un punto p2, deberíamos llamar al método desde uno de los puntos, por ejemplo: double dist = p1.Distance(p2);.
Para emplear el segundo método, bastaría con llamarlo desde la clase: double midPt = Point3D.MeanPoint(p1,p2);.
Existe una gran cantidad de manuales de aprendizaje de C#, si vas a empezar de cero te recomiendo C# 2010 All-In-One For Dummies.