AutoCAD. Menú Personalizado (Parte 3)

viernes, 14 de agosto de 2015

Archivo de recursos de menú. (dll).
En esta nueva entrega de nuestro menú parcial (Parte 3) personalizado (LaMarmita) , vamos a ver como añadir imagenes (iconos) a los elementos de nuestro menú.
Crearemos el archivo de recursos de imágenes (DLL) auxiliar de nuestro menú, donde AutoCAD accederá para localizar nuestros iconos y hacerlos visibles en nuestro menú.


Creación del archivo de recursos de Iconos.(dll)
Desde que empece a personalizar AutoCAD (allá en el pleistoceno), siempre cree mis propios iconos para mis aplicaciones.
Aunque siempre he dado prioridad al teclado por ser la opción más rápida para el trabajo (es mi opinión), tanto por teclas rápidas (ACCELERATORS) y comandos reducidos (acad.pgp), llega un momento en que la cantidad de funciones, macros, etc que usamos se hace grande para memorizar y debemos organizarnos con menús de barras de herramientas, desplegables, cinta o ribbon, etc.
Como una imagen vale mas que mil palabras, lo lógico es añadir a cada elemento personalizado su icono particular, esto hará que localicemos nuestra orden para autocad rápidamente a la hora de trabajar.
Iconos.
En versiones de autocad anteriores a los formatos CUI y CUIX podíamos crear los iconos solo en en formato BMP (Mapa de Bits). y agregarlos al archivo de menú MNL en las barras de herramientas. Primero se tenían que crear los archivos de iconos como BMP, uno grande de 32x32 (opcional, Autocad escalaba el icono si se ponia el mismo nombre a los dos) y uno pequeño de 16x16. Estos iconos se indicaban en el archivo MNL según las instrucciones marcadas por autocad en la sección ***TOOLBARS. Podéis ver un ejemplo de esto a continuación.
...
ID_cota7 [_Button("Longitud de Arco", arc-dim16.bmp, arc-dim32.bmp)]^P^C^Carc_dim
ID_cota8 [_Button("Acotar Polilinea", dimPol16.bmp, dimPol32.bmp)]^P^C^CAcotaLWPol

**SIMBOLOS
ID_Simbolos [_Toolbar("Simbolos", _Floating, _Show, 120, 190, 1)]
ID_simb01 [_Button("Marca-Texto", marca16.bmp, marca32.bmp)]^P^C^Cmarca
ID_simb02 [_Button("Alturas Secciones", caltur16.bmp, caltur32.bmp)]^P^C^Cz2
ID_simb03       [_Button("Sección/Detalle", simb03_16.bmp, simb03_32.bmp)]^P^C^CSIMDETSEC
...
Estos iconos también podían aparecer en los menús desplegables POPn si se indicaba el mismo ID y la misma sentencia de comandos al final (ojo: espaciós en blanco incluidos)
...
***MENU POPn
ID_pv2  [Insertar &Puertas]^P^C^C2dinsp
...
***MENU TOOLBARS
**MITOOLBAR1
ID_pv2  [_Button("Insertar Puertas", A_port1_16.bmp, A_port1_32.bmp)]^P^C^C2dinsp
...
Si nuestras imágenes las tenemos en archivos independientes (como hemos visto hasta ahora) y no en un archivo de recursos DLL (como veremos mas adelante), al crear nuestros comandos siempre escribiremos el nombre y la extensión del archivo donde se indique al crear el comando. (Ver ejemplo en la imagen).
Si nuestro archivo no esta en una ruta registrada en autocad tendremos que añadir tambien la ruta completa al archivo.
Ver Ordenación y carga de nuestros archivos de programación en AutoCAD.
Para que los iconos se visualicen (esto es valido en la actualidad hasta Autocad2016) en nuestro menú, los iconos han de estar en una ruta valida y registrada en las opciones de rutas de soporte de autocad. En caso contrario debemos indicar la ruta completa del archivo.
En la actualidad en Autocad2016 se permiten formatos BMP, PNG e ICO.
Para crear o modificar nuestros iconos se puede utilizar cualquier editor de imágenes, pero como este tema (todo llegará) trata de crear nuestro contenedor de iconos, personalmente os recomiendo que utiliceis un editor exclusivo de iconos, porque aunque veremos como agregar a nuestro contenedor archivos BMP e ICO de diferentes tamaños, al final veremos como agregar un solo icono con varias imágenes en el mismo y así simplificar mas el trabajo. Esta característica de crear varias imágenes en un solo icono (ICO) solo la tienen algunos editores de imagen. (Ver imagen)
Archivo de recursos (DLL).
Siempre me preguntaba (en el pleistoceno) donde guardaba autocad sus iconos. En la actualidad no es así, pero en versiones antiguas, autocad tenia su dll de recursos y su menú llamando a estos por su ID. Como buen programador(autodidacta), busque información y la forma de hacer mi propio archivo de recursos. Por entonces no dominaba mucho de C++ (es el lenguaje con el que crearemos nuestra dll) asi que me busque otros recursos, no muy estéticos, como usar programas como ResHacker (seguro que lo habéis oído nombrar) el cual era tedioso y cometía errores, aunque al final conseguías la dll.
Cuando empece a programar con Visual Studio, una de las premisas fue obtener información y conseguir crear el archivo de recursos para Autocad y vamos a ver como hacerlo.
Nota: Para los que no sepan mucho de C++, podéis seguir las instrucciones paso a paso. El proceso no es complicado. Todo lo que vamos a ver esta realizado en Visual Studio 2012, pero se puede realizar exactamente igual en versiones anteriores.
Al final de la entrada, dejare el proyecto completo para que solo tengáis que añadir mas recursos y compilar.
  1. Abrir Visual Studio y crear un nuevo proyecto. (Imagen 1).
  2. En el cuadro de dialogo de "Nuevo proyecto" indicar proyecto de "Visual C++", elegir el tipo tipo "Proyecto Win32" e indicar un nombre y carpeta para nuestro proyecto. (Imagen 2).
  3. En el cuadro de dialogo "Configuración de la aplicación" indicar "Biblioteca de vínculoas dinámicos"(dll) y Finalizar. (Imagen 3).
Vamos a configurar ahora algunas propiedades de nuestro proyecto:
  1. En el menú "VER" activar(si no están abiertas) el "Explorador de soluciones" y la "Ventana de propiedades".
  2. En el explorador de soluciones hacer clic en nuestro proyecto y en la ventana de propiedades, cambiar el valor de "Espacio de nombres de la raiz" por el nombre de nuestro menú de autocad, en nuestro caso "LaMarmita". (Imagen 4).
  3. En el menú "PROYECTO", seleccionar "Propiedades".
  4. En el cuadro de dialogo de "Páginas de propiedades" de nuestro proyecto, en "Propiedades de configuración" -> "General" -> "Nombre de destino" modificar el valor actual (normalmente $(ProjectName)) por $(RootNameSpace). Esto ara que cuando compilemos la solución nuestra dll tenga el nombre de nuestro espacio de nombres, en nuestro caso "LaMarmita.dll". El nombre de destino tambien se puede indicar escribiendo directamente su valor (ejemplo: "LaMarmita", sin comillas), lo del espacio de nombres es deformación profesional del que suscribe. (Imagen 5).
Ahora vamos a crear nuestro archivo de recursos en el proyecto:
El archivo de recursos del proyecto es un archivo con extensión ".rc" donde el proyecto de C++ administrara las imágenes para después compilarlas en la DLL.
  1. En el "Explorador de soluciones" hacer clic derecho en "Archivo de recursos" y seleccionar "Agregar" -> "Nuevo elemento". (Imagen 6)
  2. En el cuadro de dialogo de "Agregar nuevo elemento" seleccionar "Recurso" -> "Archivo de recursos". Asignar un nombre a nuestro archivo de recursos y Agregar. (Imagen 7).
  3. Por último, para ver el código de nuestro archivo de recursos (rc), en el "Explorador de soluciones" hacer clic derecho sobre el nombre del archivo de recursos creado e indicar "Ver código". (Imagen 8).
Vamos a añadir iconos (BMP e ICO) a nuestro proyecto:
Lo primero es ordenar nuestros archivos de iconos para que no estén mezclados con los archivos de Visual Studio de nuestro proyecto. Para esto crearemos una carpeta en el directorio de nuestro proyecto (por ejemplo: Recursos) y en ella pondremos todos los iconos (archivos BMP e ICO) que necesitemos para nuestra DLL. (Ver imagen).
En Visual Studio hay varias formas de añadir recursos a nuestro "archivo de recursos de proyecto(rc)" pero para no dar muchas vueltas lo vamos a hacer por código. En nuestro caso es mas cómodo y no se nos añadiran elementos que estén "de mas" en nuestro proyecto.
Dentro de la vista de código de nuestro archivo(rc) y antes del último #endif (se puede colocar en mas sitios, pero para los novatos..) colocaremos nuestro código como en el ejemplo a continuación:
Select all
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//  ID                    TIPO                       RUTA\\Nombre.bmp
//
IDB_SIMB01               BITMAP              ".\\Recursos\\SimbEscalaGrph.bmp"
IDB_SIMB02_16            BITMAP              ".\\Recursos\\SimbDetSec16.BMP"
IDB_SIMB02_32            BITMAP              ".\\Recursos\\SimbDetSec32.bmp"


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//  ID                    TIPO                       RUTA\\Nombre.ico
//
IDI_LAMARMITA            RCDATA              ".\\Recursos\\LaMarmita.ico"
IDI_SIMB01               RCDATA              ".\\Recursos\\SimbEscalaGrph.ico"
IDI_SIMB02               RCDATA              ".\\Recursos\\SimbDetSec.ico"

#endif    // Recursos de Español (España, internacional)
/////////////////////////////////////////////////////////////////////////////
Se ve bastante claro, pero vamos a explicarlo un poco.
Cada linea de nuevo recurso contiene tres partes:
  • ID.- Es el identificador de nuestro recurso (icono o bmp) puede ser cualquier nombre. La norma general para los recursos en VS es colocar(en mayúsculas) "ID_"+"XXXX". Este identificador es muy importante, no se puede repetir, y es el que usaremos en autocad para configurar nuestras imágenes de comandos.
    En mi ejemplo uso el identificador como "IDB_"+"XXX" para los archivos BMP(bitmap) y "IDI_"+"XXX" para los archivos ICO(iconos), de esta manera los distinguimos a la hora de colocarlos en autocad y sabemos a que tipo pertenecen.
  • TIPO.- Es el tipo de dato del recurso. Para que c++ lo identifique correctamente hay que poner tipo "BITMAP" para archivos BMP(bitmap) y "RCDATA" para archivos ICO(iconos). Hay que procurar no equivocaros en esto porque el compilador descartará el recurso si el código no es correcto.
  • RUTA\\Nombre.ext.- Es la ruta del archivo/recurso (icono o bmp). En nuestro caso, como hemos colocado nuestra carpeta de iconos dentro de la carpeta del proyecto, podemos usar una ruta parcial (".\\Recursos\\MiFile.ext") y nos evitamos escribir rutas largas. Ya habréis averiguado que los archivos pueden estar en cualquier sitio.
Compilando el proyecto:
  1. En el menú "VER" activar(si no está abierta) la ventana de "Resultados".
  2. Desde el menú "COMPILAR" e indicar "Compilar solución" y esperar a que termine.
  3. Comprobar el resultado en la ventana de resultados. (ver ejemplo )
Fijaros en la ventana de resultados para comprobar si todo esta correcto y en la localización de nuestra dll. Si no se han modificado propiedades en el proyecto, estará en la carpeta "DEBUG" dentro de la carpeta de nuestro proyecto.
Ya tendremos nuestra dll de recursos de imágenes lista para nuestro menú de Autocad.
Cosas a tener en cuenta:
  • La dll ha de tener el mismo nombre(salvo la extensión) que nuestro archivo de menú de autocad.
  • La dll ha de colocarse en la misma ruta que nuestro archivo de menú MNL, CUI o CUIX (segun la versión de AutoCAD).
  • En el caso de tener ya una dll trabajando, autocad ha de estar cerrado para sustituir nuestra nueva dll por la antigua. En caso contrario, el explorador de windows nos dará un aviso de error de "Copia de archivo".
  • Recordar que solo se admiten dos tamaños de iconos 16x16 y 32x32.
Bitmaps vs Iconos
Bitmaps:
  • Los archivos BMP (mapa de bits o bitmap) son un estandar y funcionan en autocad en todas las versiones.
  • Casi todos los editores de imágenes soportan el formato BMP, por lo que son fáciles de crear y modificar.
  • No admiten multi-imagen por lo que siempre habra que crear dos, una pequeña de 16x16 y otra grande de 32x32.
  • No admiten transparencia de imagen.
  • No admiten formato de imagen de 32 bits.
Iconos:
  • Admiten multi-imagen. Autocad administra la imagen pequeña (16x16) y la grande (32x32) automáticamente.
  • Admiten formato de imagen de 32 bits.
  • Admiten tranparencias de imagen.
  • Los editores buenos de iconos multi-imagen son específicos para ellos.
  • No estan soportados en todas las versiones de AutoCAD.
Personalmente y aunque sigo usando el formato BMP, he optado por los iconos, sobre todo por la transparencia de imagen ya que esto nos permite usar los mismos iconos en cualquier "Esquema de color" de autocad. Y sobre todo porque con un solo archivo ICO, tengo las dos imágenes y esto ahorra tiempo, trabajo y mantiene mucho mas orden tanto en el proyecto de la dll en c++ como en la configuración del archivo de AutoCAD. En general todo el proceso es mas sencillo con Iconos. (Ver imagen).
Archivos PNG:
Aunque he leído varios artículos en los que se dice que Autocad 2016 admite formatos de archivo PNG con transparencia y 32 bits, no he probado a integrarlos en un proyecto de dll de recursos.
Si alguien hace pruebas, necesita ayuda o quire discutirlo, hacérmelo saber y lo integraremos en este tutorial.
Descarga
Aquí os adjunto los archivos de proyecto del archivo de recursos dll en Visual Studio (C++) para que podáis ver la configuración y hacer pruebas.
Podeis descargar los archivos de menú de autocad del tutorial(partes 1, 2 y 3) completo desde: Archivos de personalización de La Marmita

Un saludo a tod@s desde España.

No hay comentarios:

Publicar un comentario