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++.
Implementácia RPluginInterface
Section titled “Implementácia RPluginInterface”Všetky zásuvné moduly QCAD musia byť priamo alebo nepriamo odvodené od QObject a abstraktnej základnej triedy RPluginInterface.
Súbor RExamplePlugin.h
Section titled “Súbor RExamplePlugin.h”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; }};Súbor RExamplePlugin.cpp
Section titled “Súbor RExamplePlugin.cpp”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 < 0x050000QT_BEGIN_NAMESPACEQ_EXPORT_PLUGIN2(example, RExamplePlugin)QT_END_NAMESPACE#endifSúbor exampleplugin.pro
Section titled “Súbor exampleplugin.pro”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 += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -lqcadcore -lqcadgui -lqcadecmaapiVlož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ť.
Kompilácia
Section titled “Kompilácia”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:
qmakemake debugWindows:
qmakenmake debugNa 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:
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.
Súbor scripts/MyTool/MyTool.js
Section titled “Súbor scripts/MyTool/MyTool.js”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"]);};Súbor scripts.qrc
Section titled “Súbor scripts.qrc”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.qrcPo ú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“.
Zdrojový kód
Section titled “Zdrojový kód”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
Riešenie problémov
Section titled “Riešenie problémov”- 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.