Skip to content

Vytvorenie zásuvného modulu QCAD

Zásuvné moduly QCAD možno použiť na rozšírenie QCAD o funkcie implementované v jazyku C alebo C++.

Všetky zásuvné moduly QCAD musia byť priamo alebo nepriamo odvodené od QObject a abstraktnej základnej triedy RPluginInterface.

Pre náš prvý, minimalistický ukážkový zásuvný modul pridáme prázdne alebo minimalistické implementácie väčšiny metód RPluginInterface priamo do hlavičkového súboru. Túto počiatočnú štruktúru hlavičkového súboru možno skopírovať a získať tak prvý funkčný zásuvný modul, ktorý možno načítať do 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; }
};

Pre metódu getPluginInfo pridáme do súboru cpp jednoduchú implementáciu, aby sme niečo videli v dialógu O programe v 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

Na kompiláciu nášho zásuvného modulu potrebujeme aj projektový súbor Qt, ktorý možno pomocou Qt qmake premeniť na Makefile.

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

Vloženie (include) na riadku 3 by malo smerovať na súbor shared.pri inštalácie zdrojového kódu QCAD (napr. qcad/shared.pri). Ako DESTDIR môžete zvoliť priečinok plugins fungujúcej inštalácie QCAD, aby sa zásuvný modul skompiloval na správne miesto, odkiaľ ho QCAD môže aj načítať.

Váš zásuvný modul možno skompilovať z týchto troch súborov, čím vznikne súbor qcad/plugins/qcadexample.dll alebo libqcadexample.so alebo libqcadexample.dylib.

Poznámka: ak spúšťate binárny súbor QCAD skompilovaný v ladiacom režime (debug), aj zásuvný modul musí byť skompilovaný v ladiacom režime. Ak spúšťate QCAD vo vydávanom režime (release), aj zásuvný modul musí byť skompilovaný vo vydávanom režime.

Na kompiláciu zásuvného modulu v ladiacom režime spustite:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Na kompiláciu vo vydávanom režime spustite namiesto toho make release alebo nmake release.

Zásuvný modul samozrejme ešte nerobí nič užitočné, no váš zásuvný modul by ste mali vidieť v dialógu O programe v QCAD:

Ukážkový zásuvný modul uvedený v dialógu O programe v QCAD

Ak svoj zásuvný modul nevidíte, skontrolujte, či sa pri spúšťaní QCAD v termináli nevyskytujú chyby. Chybové hlásenie sa môže objaviť aj v dialógu O programe.

Kompilácia skriptov ako zdrojov do zásuvného modulu

Section titled “Kompilácia skriptov ako zdrojov do zásuvného modulu”

Zásuvné moduly QCAD možno použiť na kompiláciu kolekcie skriptov a iných zdrojov (súbory ui, ikony atď.) do zásuvného modulu. To má tú výhodu, že kód viacerých súborov ECMAScript možno zabaliť do jedného, skompilovaného binárneho súboru. Zásuvné moduly sa zvyknú načítavať rýchlejšie ako jednotlivé súbory z disku a zaberajú menej miesta na disku.

Predpokladajme, že existuje priečinok scripts/MyTool so súborom MyTool.js, ktorý obsahuje nástroj QCAD implementovaný v jazyku ECMAScript. Nástroj sa pridá na začiatok ponuky Rôzne a po spustení vypíše „Hello World“.

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"]);
};

Na kompiláciu tohto skriptového nástroja do nášho zásuvného modulu C++ potrebujeme vytvoriť súbor zdrojov Qt, ktorý nasmeruje qmake na súbor, ktorý chceme skompilovať do zásuvného modulu:

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

Súbor qrc uvádza cesty, pod ktorými sa majú zdroje sprístupniť v systéme zdrojov Qt (alias=“scripts/MyTool/MyTool.js”), a skutočnú cestu, kde možno súbor nájsť na disku (používa sa iba na kompiláciu). Vyššie uvedený príklad znamená, že na disku existuje súbor pod scripts/MyTool/MyTool.js, ktorý sa skompiluje do zásuvného modulu. Hneď po načítaní zásuvného modulu bude súbor dostupný pod cestou „:/scripts/MyTool/MyTool.js“. QCAD nájde nástroj pod touto cestou automaticky, keďže prehľadáva priečinok „scripts“, ako aj „:/scripts“ na skripty.

Do projektového súboru (exampleplugin.pro) musíme pridať aj súbor qrc pridaním nasledujúceho riadka:

RESOURCES = scripts.qrc

Po úprave súboru exampleplugin.pro znova spustite qmake a make a načítajte zásuvný modul. Na začiatku ponuky Rôzne v QCAD by teraz mala byť položka „MyTool“.

Kompletný zdrojový kód tohto ukážkového zásuvného modulu nájdete na:

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

  • Ak sa váš zásuvný modul skompiluje, ale QCAD ho nedokáže načítať, uistite sa, že sa používa rovnaká verzia Qt ako pre QCAD (pozri Pomoc > O programe QCAD). Uistite sa, že ak sa QCAD spúšťa vo vydávanom režime, aj váš zásuvný modul je skompilovaný vo vydávanom režime.
  • Spustite QCAD z terminálu alebo z príkazového riadka a skontrolujte výstup konzoly, či neobsahuje chybové hlásenia. Vypisujte hlásenia vo svojom zásuvnom module, aby ste potvrdili, že sa načítava. Napríklad vo svojej funkcii init.
  • Skontrolujte dialóg O programe (Pomoc > O programe QCAD > Zásuvné moduly), či neobsahuje chybové hlásenia.