Desventuras en ObjectARX – Parte 1 – Configuración en AutoCAD 2018

ADVERTENCIA: Esta serie de artículos asume que se tiene conocimiento de C++ y AUTOCAD porque no voy a perder mi preciado tiempo en explicar cosas sencillas cómo crear un contenedor dinámico polimórfico usando “templates” (¿?).

Uno de las formas más potentes de automatizar AUTOCAD es mediante el uso de la API ObjectARX . En comparación Autolisp y Visual Basic, son juegos de niños.

Sin embargo, empezar a usar ObjectARX, no es una tarea sencilla (y eso sin considerar que se programa en C++). Pareciera que este conocimiento está reservado para solo unos cuantos iniciados. Y esos iniciados hablan inglés.

En este artículo voy a explicar con detalle, los pasos a seguir para configurar ObjectARX y empezar a trabajar con el.  Para ello se debe instalar el SDK de Object ARX y, adicionalmente, el compilador Visual C++.

Lo primero que tenemos que entender es que existe un SDK de Object ARX para cada versión de AutoCAD. No hay compatibilidad para nada. Así que si queremos usar AutoCAD 2018, no nos queda otra que conseguir el ObjectARX 2018.

Afortunadamente, el SDK de ObjectARX, es gratuito (no faltaba más, con los miles de dólares que cuesta AUTOCAD) y fácil de obtener. Solo hay que llenar un formulario aburrido y proceder.

Luego de que hayamos descargado el archivo con un nombre descriptivo, como “Autodesk_ObjectARX_2018_Win_64_and_32_Bit.sfx”, solo procedemos a ejecutarlo. Luego de una confirmación, nos pedirá una ruta para expandirse (o como decimos por aquí “desparramarser”), porque finalmente de eso se trata; el SDK de 100 megas solo es una carpeta comprimida.

Por defecto nos apuntará a una carpeta existente, pero como yo soy rebelde, le crearé  una carpeta especial llamada: “C:\ObjectARX 2018”, y moveré todos los archivos a esa carpeta si es que al “instalador” se le ocurre crear otra carpeta adicional dentro de esa carpeta.

Después de unos segundos si todo sale bien (Tendría que tener muy mala suerte para lo contrario), tendremos ya “instalado” nuestro ObjectARX en la carpeta elegida.

Ahora viene lo bueno. ¿Cómo diablos configuro un proyecto en Visual C++ para escribir mi primera aplicación ObjectARX?

Porque de que tenemos que usar Visual C++, lo tenemos que usar sí o sí. AUTOCAD está tristemente amarrado a Microsoft en cuanto a desarrollo. No queda otra, a menos que usted se sienta Linus Torvalds y quiera experimentar a meterle el GCC al AUTOCAD, por donde pueda, para ver que sale.

Ahora en cuanto a lenguajes, hasta donde sé se puede usar el C++ y C#. Pero en este artículo solo me centraré en el uso de C++, porque la verdad no tengo ni la más mínima idea (y no me interesa ni tres pepinos) hacerlo en .NET, a menos, claro está, que paguen bien.

Lo primero que tendremos que hacer es instalar Visual C++. La buena noticia es que hay una versión gratuita (Comunity), la mala noticia es que trae restricciones. Yo trabajaré con Visual Studio Comunity 2017.

Como es una tarea sencilla (es más cuestión de tiempo), no voy a explicar cómo instalar Visual C++. Hasta un niño podría hacerlo.

Una vez que tengamos ya el programa, instalado, lo que nos queda es crear un nuevo proyecto en C++, de tipo DLL. Yo lo llamaré “loquesea”, pero usted puede darle el nombre que le de la gana.

Luego de unos segundos (yo no sé que tanto hace Visual Studio para crear un proyecto) tendremos un proyecto vacío para generar un DLL.

Creamos un DLL porque así es como trabajan las aplicaciones en ObjectARX. Son simples archivos DLL, pero con acceso a la memoria y objetos del AUTOCAD. Una aplicación ObjectARX se carga en AUTOCAD y queda allí, hasta que se descargue o se cierre AUTOCAD.

Un detalle importante, es que la aplicación DLL, debe ser de 64 bits, porque no creo que a estas alturas alguien tenga un AUTOCAD 2018 de 32 bits.

También es bueno revisar que estamos trabajando en modo “Debug”, como se indica en la imagen:

Visual Studio nos crea un esqueleto de programa simple, pero nosotros debemos hacer la parte difícil, y es lo que viene: La configuración de las dependencias. Todo un dolor de cabeza en C++, y ni aún con la IDE más moderna se salva uno de esta penuria.

Abrimos la ventana de propiedades del Proyecto. ¿Qué dónde esta esa ventana? ¿Es en serio? Si no sabe ubicar la ventana de propiedades, pues a lo mejor esto no es para usted, así que vuelva cuando aprenda a usar Visual Studio.

En la sección “>Configuration Properties>VC++ directories” (Sí, yo uso la versión en inglés ¿Y qué? así se me hace más fácil encontrar ayuda en San Google) se debe agregar a la sección “Include Directories”, la ruta de la carpeta “inc” del ObjectARX, que en mi caso es “C:\ObjectARX 2018\inc”.

Y también se debe agregar a la sección “Library Directories” la ruta “C:\ObjectARX 2018\lib-x64”. Tener cudiado con usar la carpeta \lib-x64 y no otra.

Ahora si cree que eso es todo, déjeme decirle que está equivocado. Aún falta algo más.

Aunque tal vez no sea necesario, es mejor asegurarse de que la generación de código se haga en modo Multi-thread, porque así trabaja ObjectARX. Eso lo logramos configurando la propiedad “>C/C++>Code generation>Runtime Library”.

Una recomendación adicional sería que las configuraciones  las hagamos en modo “All Configurations” de la ventana de propiedades. De esta forma, evitamos tener que configurar todo de nuevo cuando pasemos a modo “Release”.

Ahora lo que viene es definir que la extensión del DLL que vamos a crear, no sea “DLL”, sino “ARX”, para que así lo pueda reconocer AUTOCAD.

Esto se logra (no es la única forma) cambiando la propiedad >General>TargetExtension de al ventana de propiedades:

Otro detalle, muy importante, es indicar las librerías que vamos a usar en nuestro proyecto. ¿Por qué diablos tenemos que indicar las librerías si ya le hemos dado la ruta donde se encuentran? Bueno, así es Visual C++.

Si no se incluyen las librerías necesarias, el compilador (en realidad el enlazador) nos dará luego un mensaje de error, con el único fin de confundir al programador y hacerle imposible encontrar la solución. A veces funciona.

Para configurar las librerías, primero hay que saber cuál usar. Como yo no lo sé, solo sigo las recomendaciones que encontré por allí: Incluir los archivos “rxapi.lib” y  “acdb22.lib” (o la versión que corresponda) en la sección “Linker>Input>Additional Dependencies”. Estos archivos son necesarios para poder compilar nuestro programa de muestra, pero se tienen que agregar más cuando se hagan  programas de verdad. Ese es uno de problemas a los que alguien nuevo se enfrenta cuando empieza con ObjectARX. Al menos me pasó a mi. No sé usted.

Estoy asumiendo que  sabe como agregar librerías en la configuración. Si no es así, tal vez hay que considerar cambiar de profesión.

Y eso sería todo. No es mentira, Aún falta más.

Todavía necesitamos crear un archivo importante: El archivo de Definición de Módulo. Este archivo sirve para dar información adicional sobre el uso del DLL al enlazador. En nuestro caso es solo una formalidad pero necesaria. Casi como un saludo.

Para crear este archivo podemos seleccionar con el ratón el proyecto, y hacer “click” derecho para seleccionar el menú “Add>New Item>”.  Luego de eso, nos aparecerá una ventana en donde DEBEMOS elegir la opción “Module-Definition File(.def)”:

IMPORTANTE: El nombre del archivo debe ser igual al de su proyecto con la extensión “def”, que en mi caso sería “loquesea.def” y debe quedar en la misma carpeta donde se encuentra el archivo principal *.cpp.

Ahora que tenemos el archivo *.def creado, hace falta escribir su contenido:

En este archivo *.def se definen lo símbolos acrxEntryPoint y acrxGetApiVersion, porque serán buscados por AUTOCAD (aunque estén como privados), de otra forma se quejará y no cargará nuestro *.arx.

De estos símbolos, solo se implementará la rutina acrxEntryPoint(). La otra rutina quedará implementada de forma oculta por la librería “rxapi.lib”.

Ahora que tenemos ya todo configurado (se supone), debemos proceder a escribir nuestro primer “Hola Mundo” en ObjectARX:

// Hola mundo para ObjectARX desde Visual C++.
// Basado en: http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-696C5565-D4F3-459A-B8AB-CA4D8736533A
#include "stdafx.h"
#include "rxregsvc.h"
#include "acutads.h"
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
	switch (msg) {
	case AcRx::kInitAppMsg:
		acrxUnlockApplication(appId);
		acrxRegisterAppMDIAware(appId);
		acutPrintf(L"\nAplicación cargada");
		break;
	case AcRx::kUnloadAppMsg:
		acutPrintf(L"\nAplicación descargada");
		break;
	}
	return AcRx::kRetOK;
}

Este código, implementa las funcionalidades mínimas como es responder a los mensajes kInitAppMsg y kUnloadAppMsg para cargar y descargar la aplicación, porque así es como trabaja una aplicación en ObjectARX: Primero se tiene que cargar antes de acceder a alguna de sus funcionalidades.

La instrucción acutPrintf() nos permitirá escribir mensajes en el panel de comandos del AUTOCAD y nos servirá para depuración, prueba o para simplemente sentirnos importantes.

El código mostrado se vería en la IDE, como se muestra en la siguiente figura:

Ahora, si ha seguido todos los pasos correctamente (cosa que dudo) y tiene un poco de suerte, podrá compilar este código sin errores.  Al presionar <Shift>+<Ctrl>+B dentro de Visual Studio, podremos compilar el código y debería aparecer la confirmación en el panel de salida:

También se puede intentar pulsar esa flecha verde (en la barra de herramientas de Visual Studio) que tanto se usa cuando se quiere ejecutar un programa, pero como nuestra aplicación es un DLL, pues la ejecución no es posible. Pero se hará la compilación aunque con un mensaje de error al momento de intentar la ejecución. No entre en pánico.

Ahora la parte final, la cereza del pastel, es lograr que nuestro “Hola Mundo” se ejecute en AUTOCAD. Eso ya debe ser más sencillo, sobre todo si sabe usar AUTOCAD.

Tal vez la forma más sencilla de cargar (OJO que no dije “ejecutar”) un archivo ARX desde AUTOCAD, sería usar el comando APPLOAD. Al ejecutarlo nos aparecerá una amigable ventanita para poder seleccionar nuestro ARX y poder cargarlo.

Nada del otro mundo, inclusive si no lo ha hecho antes. Solo hay que ubicar nuestro *.arx y darle al botón “Load”. Si tiene la misma configuración que yo, seguramente le aparecerán estos cuadros molestos, pero nada que no se pueda tolerar.

 

Si la carga se realiza con éxito, podrá ver el mensaje esperado en el panel de comandos:

Cualquier otra cosa que le salga, significa que usted no sirve para esto y nunca debió siquiera intentarlo. A lo mejor no es tan grave, solo un error que cometió en el paso 21 o 45.

Tengo entendido que existe una forma más sencilla de configurar un entorno, usando C#, pero aquí hacemos las cosas difíciles por puro placer. Además los valientes usamos C++.

Ahora ¿Qué puede salir mal? Permítame una carcajada, antes de responder: TODO.

Si le sirve de consuelo, a mi tampoco me funcionó a la primera, ni a la segunda. Pero de fracasos se aprende y como he aprendido bastante, es que estoy escribiendo este artículo.

LA YAPA

Una forma alternativa, y a veces más cómoda, de cargar y descargar un programa, es usar comandos de Autolisp:

(Arxload “C:\\Users\\Yo\\puntos\\x64\\Debug\\loquesea”)
(ARXUnload “C:\\Users\\Yo\\puntos\\x64\\Debug\\loquesea”)

SOBRE EL AUTOR

Tito Hinostroza no es experto en nada, tal vez en comer cualquier cosa sin enfermarse. Nunca estudió AUTOCAD ni C++ de manera formal. En sus ratos libres gusta de cazar ratones y cucarachas. Ha programado en casi todos los lenguajes de programación y hasta se ha inventado algunos. Odia al Reguetón y Java porque dice que es basura (No sabemos si se refiere al Reguetón o a Java).

 

Puntuación: 0 / Votos: 0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *