Skip to content

Ustvarjanje vtičnika QCAD

Vtičnike QCAD je mogoče uporabiti za razširitev QCAD s funkcionalnostjo, implementirano v C ali C++.

Vsi vtičniki QCAD morajo biti neposredno ali posredno izpeljani iz QObject in abstraktnega osnovnega razreda RPluginInterface.

Za naš prvi, minimalistični primer vtičnika dodamo prazne ali minimalistične implementacije za večino metod RPluginInterface neposredno v glavo datoteke. To začetno strukturo datoteke glave je mogoče kopirati, da dobite prvi delujoč vtičnik, ki ga je mogoče naložiti v 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; }
};

Za metodo getPluginInfo v datoteko cpp dodamo preprosto implementacijo, da lahko nekaj vidimo v pogovornem oknu “O programu” 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

Za prevajanje našega vtičnika potrebujemo tudi projektno datoteko Qt, ki jo je mogoče z Qt qmake spremeniti v Makefile.

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

Vključitev v vrstici 3 mora kazati na datoteko shared.pri namestitve izvorne kode QCAD (npr. qcad/shared.pri). Kot DESTDIR boste morda želeli izbrati mapo plugins delujoče namestitve QCAD, tako da se vtičnik prevede na pravem mestu, od koder ga lahko QCAD tudi naloži.

Vaš vtičnik je mogoče prevesti s temi tremi datotekami, kar ustvari datoteko qcad/plugins/qcadexample.dll ali libqcadexample.so ali libqcadexample.dylib.

Opomba: če zaganjate binarno datoteko QCAD, prevedeno v načinu za razhroščevanje (debug), mora biti tudi vtičnik preveden v načinu za razhroščevanje. Če zaganjate QCAD v načinu release, mora biti tudi vtičnik preveden v načinu release.

Za prevajanje vtičnika v načinu za razhroščevanje zaženite:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Za prevajanje v načinu release namesto tega zaženite make release ali nmake release.

Vtičnik seveda še ne bo počel nič uporabnega, vendar bi morali svoj vtičnik videti v pogovornem oknu “O programu” v QCAD:

Primer vtičnika, naveden v pogovornem oknu 'O programu' v QCAD

Če svojega vtičnika ne vidite, preverite napake v terminalu med zagonom QCAD. Sporočilo o napaki lahko vidite tudi v pogovornem oknu “O programu”.

Vtičnike QCAD je mogoče uporabiti za prevajanje zbirke skriptov in drugih virov (datotek ui, ikon itd.) v vtičnik. To ima prednost, da je mogoče kodo več datotek ECMAScript združiti znotraj ene same prevedene binarne datoteke. Vtičniki se ponavadi naložijo hitreje kot posamezne datoteke z diska in zavzamejo manj prostora na disku.

Predpostavimo, da obstaja mapa scripts/MyTool z datoteko MyTool.js, ki vsebuje orodje QCAD, implementirano v ECMAScript. Orodje se doda na vrh menija Razno in ob sprožitvi izpiš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"]);
};

Za prevajanje tega skriptnega orodja v naš vtičnik C++ moramo ustvariti datoteko virov Qt, ki qmake usmeri na datoteko, ki jo želimo prevesti v vtičnik:

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

Datoteka qrc navaja poti, pod katerimi naj bodo viri na voljo v sistemu virov Qt (alias=“scripts/MyTool/MyTool.js”), in dejansko pot, kjer je datoteko mogoče najti na disku (uporablja se samo za prevajanje). Zgornji primer pomeni, da na disku pod scripts/MyTool/MyTool.js obstaja datoteka, ki bo prevedena v vtičnik. Takoj ko je vtičnik naložen, bo datoteka na voljo pod potjo “:/scripts/MyTool/MyTool.js”. QCAD bo orodje samodejno našel pod to potjo, saj za skripte pregleduje mapo “scripts” in tudi “:/scripts”.

Datoteko qrc moramo dodati tudi v projektno datoteko (exampleplugin.pro) z dodajanjem naslednje vrstice:

RESOURCES = scripts.qrc

Po urejanju datoteke exampleplugin.pro znova zaženite qmake in make ter naložite vtičnik. Zdaj bi moral biti na vrhu menija Razno v QCAD vnos menija “MyTool”.

Celotno izvorno kodo za ta primer vtičnika najdete na:

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

  • Če se vaš vtičnik prevede, vendar ga QCAD ne more naložiti, se prepričajte, da je uporabljena enaka različica Qt kot za QCAD (glejte Pomoč > O programu QCAD). Prepričajte se, da je, če se QCAD zaganja v načinu release, vaš vtičnik prav tako preveden v načinu release.
  • Zaženite QCAD iz terminala ali ukazne vrstice in preverite izpis konzole za sporočila o napakah. Izpišite sporočila v svojem vtičniku, da potrdite, da se nalaga. Na primer v svoji funkciji init.
  • Preverite pogovorno okno “O programu” (Pomoč > O programu QCAD > Vtičniki) za sporočila o napakah.