Ir al contenido

Crear un plugin de QCAD

Los plugins de QCAD se pueden usar para ampliar QCAD con funcionalidad implementada en C o C++.

Todos los plugins de QCAD deben derivar directa o indirectamente de QObject y de la clase base abstracta RPluginInterface.

Para nuestro primer plugin de ejemplo minimalista, añadimos implementaciones vacías o minimalistas para la mayoría de los métodos de RPluginInterface directamente en el archivo de cabecera. Esta estructura inicial del archivo de cabecera se puede copiar para obtener un primer plugin funcional que se pueda cargar en QCAD.

#include <QObject>
#include <QScriptEngine>
#include "RPluginInterface.h"
class RExamplePlugin : public QObject, public RPluginInterface
{
Q_OBJECT
Q_INTERFACES(RPluginInterface)
#if QT_VERSION >= 0x050000
Q_PLUGIN_METADATA(IID "org.qcad.exampleplugin")
#endif
public:
virtual bool init() { return true; }
virtual void uninit(bool) {}
virtual void postInit(InitStatus status) {}
virtual void initScriptExtensions(QScriptEngine& engine) {}
virtual RPluginInfo getPluginInfo();
virtual bool checkLicense() { return true; }
};

Para el método getPluginInfo, añadimos una implementación sencilla al archivo cpp para poder ver algo en el cuadro de diálogo «Acerca de» de QCAD.

#include "RExamplePlugin.h"
RPluginInfo RExamplePlugin::getPluginInfo() {
RPluginInfo ret;
ret.set("Version", "1.0");
ret.set("ID", "EXAMPLE");
ret.set("Name", "Example Plugin");
ret.set("License", "GPLv3");
ret.set("URL", "http://qcad.org");
return ret;
}
#if QT_VERSION < 0x050000
QT_BEGIN_NAMESPACE
Q_EXPORT_PLUGIN2(example, RExamplePlugin)
QT_END_NAMESPACE
#endif

Para compilar nuestro plugin, también necesitamos un archivo de proyecto de Qt que se pueda convertir en un Makefile con Qt qmake.

CONFIG += plugin
TARGET = example
include(../../../shared.pri)
TEMPLATE = lib
HEADERS = RExamplePlugin.h
SOURCES = RExamplePlugin.cpp
DESTDIR = ../../../plugins
LIBS += -lqcadcore -lqcadgui -lqcadecmaapi

El include de la línea 3 debe apuntar al archivo shared.pri de la instalación del código fuente de QCAD (por ejemplo, qcad/shared.pri). Como DESTDIR, quizá desee elegir la carpeta plugins de una instalación de QCAD en funcionamiento, para que el plugin se compile en el lugar correcto, desde donde también pueda ser cargado por QCAD.

Su plugin se puede compilar con estos tres archivos, creando el archivo qcad/plugins/qcadexample.dll o libqcadexample.so o libqcadexample.dylib.

Nota: si ejecuta un binario de QCAD compilado en modo debug, el plugin también debe compilarse en modo debug. Si ejecuta QCAD en modo release, el plugin debe compilarse igualmente en modo release.

Para compilar el plugin en modo debug, ejecute:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Para compilar en modo release, ejecute make release o nmake release en su lugar.

Obviamente, el plugin todavía no hará nada útil, pero debería poder ver su plugin en el cuadro de diálogo «Acerca de» de QCAD:

El plugin de ejemplo listado en el cuadro de diálogo Acerca de de QCAD

Si no ve su plugin, compruebe si hay errores en el terminal al iniciar QCAD. También podría ver un mensaje de error en el cuadro de diálogo «Acerca de».

Los plugins de QCAD se pueden usar para compilar una colección de scripts y otros recursos (archivos UI, iconos, etc.) en un plugin. Esto tiene la ventaja de que el código de varios archivos ECMAScript se puede agrupar dentro de un único archivo binario compilado. Los plugins tienden a cargarse más rápido que los archivos individuales del disco y ocupan menos espacio en disco.

Supongamos que hay una carpeta scripts/MyTool con un archivo MyTool.js que contiene una herramienta de QCAD implementada en ECMAScript. La herramienta se añade a sí misma en la parte superior del menú Misceláneo y muestra “Hello World” cuando se activa.

include("scripts/EAction.js");
function MyTool(guiAction) {
EAction.call(this, guiAction);
}
MyTool.prototype = new EAction();
MyTool.prototype.beginEvent = function() {
EAction.prototype.beginEvent.call(this);
EAction.handleUserMessage("Hello World");
this.terminate();
};
MyTool.init = function(basePath) {
var action = new RGuiAction("&MyTool", RMainWindowQt.getMainWindow());
action.setRequiresDocument(true);
action.setScriptFile(basePath + "/MyTool.js");
action.setGroupSortOrder(0);
action.setSortOrder(0);
action.setWidgetNames(["MiscMenu"]);
};

Para compilar esta herramienta de script en nuestro plugin de C++, necesitamos crear un archivo de recursos de Qt que indique a qmake el archivo que queremos compilar en el plugin:

<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<file alias="scripts/MyTool/MyTool.js">scripts/MyTool/MyTool.js</file>
</qresource>
</RCC>

El archivo qrc enumera las rutas bajo las cuales los recursos deben estar disponibles en el sistema de recursos de Qt (alias=“scripts/MyTool/MyTool.js”) y la ruta real donde se puede encontrar el archivo en el disco (usada solo para la compilación). El ejemplo anterior significa que hay un archivo en el disco bajo scripts/MyTool/MyTool.js que se compilará en el plugin. En cuanto se cargue el plugin, el archivo estará disponible bajo la ruta “:/scripts/MyTool/MyTool.js”. QCAD encontrará la herramienta automáticamente bajo esa ruta, ya que analiza tanto la carpeta “scripts” como “:/scripts” en busca de scripts.

También necesitamos añadir el archivo qrc al archivo de proyecto (exampleplugin.pro) añadiendo la siguiente línea:

RESOURCES = scripts.qrc

Tras editar el archivo exampleplugin.pro, ejecute qmake y make de nuevo y cargue el plugin. Ahora debería haber una entrada de menú “MyTool” en la parte superior del menú Misceláneo en QCAD.

Puede encontrar el código fuente completo de este plugin de ejemplo en:

https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin

  • Si su plugin compila pero no puede ser cargado por QCAD, asegúrese de que se usa la misma versión de Qt que para QCAD (consulte Ayuda > Acerca de QCAD). Asegúrese de que, si QCAD se ejecuta en modo release, su plugin también esté compilado en modo release.
  • Inicie QCAD desde un terminal o la línea de comandos y compruebe la salida de la consola en busca de mensajes de error. Muestre mensajes en su plugin para confirmar que se está cargando, por ejemplo en su función init.
  • Compruebe el cuadro de diálogo «Acerca de» (Ayuda > Acerca de QCAD > Plugins) en busca de mensajes de error.