martes, 24 de junio de 2014

extender la funcionalidad con NET - Primeros pasos (1)

Desde sus comienzos, Autocad permite extender la funcionalidad del programa por medio de piezas de código, propias o de terceros. Si bien en sus comienzos era necesario utilizar una versión del lenguaje LISP, hoy en día es posible hacer uso de la plataforma Microsoft .NET, con la que Autocad está completamente integrado.

Gracias a ello no solo se puede modificar un dibujo de forma automática, sino que se puede hacer uso de las incontables bibliotecas disponibles en .NET, que abren un abanico de posibilidades casi ilimitado. Ahora no solo podremos realizar tareas repetitivas, sino prácticametne cualquier cosa que se nos ocurra.

Para poder escribir el código basta con un simple editor de textos. Sin embargo facilita mucho las cosas utilizar un IDE (entorno de desarrollo integrado). Uno de los más completos es #Develop, especialmente diseñado para la plataforma NET. Entre las ventajas de usar un IDE destacan:

  • las ayudas a la escritura: resalta el código en color, autocompleta y muestra sugerencias en función del contexto, indenta automáticamente..
  • gestiona los proyectos repartidos en múltiples ficheros, permitiendo trabajar con todos ellos como si fueran uno solo
  • facilita las tareas menos agradecidas: compilar y depurar el código, gestiona las referencias a bibliotecas de funciones...

Procedimiento

El procedimiento estándar es crear un nuevo comando personalizado con la funcionalidad deseada. Para ello será necesario seguir estos pasos:

  • Escribir el código del nuevo comando, usando nuestro lenguaje de programación favorito.
  • Compilar el código, que se guardará en una biblioteca de funciones (un archivo .dll)
  • Cargarlo en Autocad mediante el comando NETLOAD (sólo para una sesión) o configurarlo para que se cargue al inicio.

Desde ese momento, podremos usar ese comando como si viniera de serie, tecleándolo en la línea de comandos, creando un icono para las barras de tareas o incluso añadiendolo a la cinta.

Ejemplo

A continuación os muestro un ejemplo de código escrito en lenguaje C#. Es posible utilizar también Visual Basic, y aunque cambia un poco la sintaxis, la estructura del código es idéntica.

// bibliotecas externas
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;

// se debe definir un espacio de nombres
namespace Autocad_NET.Ejemplos
{
  // se debe definir una clase
  public class ejemplo
  {
    // entre corchetes se especifica el nombre 
    // del comando que luego se ejecuta en autocad
    [CommandMethod("ejemplo_01")]
    public static void Comando_de_ejemplo()
    {
      // el codigo aqui...
      Document doc = 
         Application.DocumentManager.MdiActiveDocument; 
      doc.Editor.WriteMessage("hola, mundo");
    }
  }
}

En el ejemplo anterior contiene muchas palabras clave habituales en C# (como 'class', 'namespace', using', 'static'...) y una estructura general que puede resultar engorrosa para los no iniciados en programación.

  • El código se compone de bloques (encerrados entre llaves) e instrucciones (separadas por puntos y comas). Las líneas que comienzan por "//" son comentarios.
  • Al comienzo se declara el listado de bibliotecas de funciones que utiliza nuestro código: son funciones que alguien ha escrito y que nosotros podemos reutilizar. Cada biblioteca va precedida de la palabra clave using
  • Por razones que no vienen al caso, todo el resto se debe incluir en un bloque, denominado espacio de nombres: namespace nombre_del_espacio {...}
  • En general, el objeto (bloque) principal es una clase: class nombre_de_la_clase {...}. debemos definir una.
  • Dentro de la clase definimos nuestra función (técnicamente un método público estático, de nuevo, por razones que sería largo explicar): public static void nombre_de_la_funcion {...}.
  • A esta función le damos un alias que luego utilizaremos en Autocad: [CommandMethod("ejemplo_01")]

Una vez completados los pasos del apartado anterior, se puede ejecutar este programa tecleando ejemplo_01 en la línea de comandos de Autocad. Lo único que hace este ejemplo es mostrar un mensaje en la línea de comandos, pero no está mal para empezar...

Y ahora un par de peros...

  • Es necesario tener instalado Autocad tanto para ejecutar el código. No se puede generar un programa independiente que lea o edite archivos .dwg, solo generar comandos para usar con Autocad instalado y ejecutándose (a no ser que vayas realmente en serio)
  • La API de Autocad no es precisamente sencilla, y no se han esmerado precisamente documentándola. Esto hace que algunas tareas simples pueden no ser tan sencillas de llevar a la práctica.
Si tenemos nuestros script en AutoLisp que nos funcionan y con los que estamos contentos probablemente no merezca la pena cambiar, pero si queremos investigar y probar cosas nuevas, sin duda este es un mundo lleno de posibilidades.

Direcciones útiles