Skip to content

Stvaranje QCAD dodatka

QCAD dodaci mogu se koristiti za proširenje QCAD-a funkcionalnošću implementiranom u jeziku C ili C++.

Svi QCAD dodaci moraju biti izravno ili neizravno izvedeni iz QObject i apstraktne osnovne klase RPluginInterface.

Za naš prvi, minimalistički primjer dodatka dodajemo prazne ili minimalističke implementacije za većinu metoda sučelja RPluginInterface izravno u datoteku zaglavlja. Ova početna struktura datoteke zaglavlja može se kopirati kako bi se dobio prvi funkcionalni dodatak koji se može učitati u 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 metodu getPluginInfo dodajemo jednostavnu implementaciju u cpp datoteku kako bismo nešto vidjeli u dijalogu o programu 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 prevođenje našeg dodatka potrebna nam je i Qt projektna datoteka koja se pomoću Qt qmake može pretvoriti u Makefile.

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

Uključivanje u retku 3 treba upućivati na datoteku shared.pri instalacije izvornog koda QCAD-a (npr. qcad/shared.pri). Kao DESTDIR možda ćete htjeti odabrati mapu plugins radne QCAD instalacije, tako da se dodatak prevede na pravo mjesto s kojeg ga QCAD može i učitati.

Vaš dodatak može se prevesti pomoću ove tri datoteke, stvarajući datoteku qcad/plugins/qcadexample.dll ili libqcadexample.so ili libqcadexample.dylib.

Napomena: ako pokrećete QCAD binarnu datoteku prevedenu u načinu za ispravljanje pogrešaka (debug), dodatak također mora biti preveden u istom načinu. Ako pokrećete QCAD u načinu izdanja (release), dodatak također mora biti preveden u načinu izdanja.

Za prevođenje dodatka u načinu za ispravljanje pogrešaka pokrenite:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Za prevođenje u načinu izdanja umjesto toga pokrenite make release ili nmake release.

Očito, dodatak još neće raditi ništa korisno, ali biste trebali moći vidjeti svoj dodatak u dijalogu o programu QCAD:

Primjer dodatka naveden u QCAD dijalogu o programu

Ako ne možete vidjeti svoj dodatak, provjerite ima li pogrešaka u terminalu prilikom pokretanja QCAD-a. Možda ćete vidjeti i poruku o pogrešci u dijalogu o programu.

QCAD dodaci mogu se koristiti za prevođenje zbirke skripti i drugih resursa (ui datoteke, ikone itd.) u dodatak. To ima prednost da se kod više ECMAScript datoteka može objediniti unutar jedne, prevedene binarne datoteke. Dodaci se obično učitavaju brže od pojedinačnih datoteka s diska i zauzimaju manje prostora na disku.

Pretpostavimo da postoji mapa scripts/MyTool s datotekom MyTool.js koja sadrži QCAD alat implementiran u ECMAScriptu. Alat se dodaje na vrh izbornika Razno i ispisuje “Hello World” kada se pokrene.

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 prevođenje ovog skriptnog alata u naš C++ dodatak, moramo stvoriti Qt datoteku resursa koja upućuje qmake na datoteku koju želimo prevesti u dodatak:

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

Datoteka qrc navodi putanje pod kojima će resursi biti dostupni u Qt sustavu resursa (alias=“scripts/MyTool/MyTool.js”) i stvarnu putanju gdje se datoteka može pronaći na disku (koristi se samo za prevođenje). Gornji primjer znači da na disku postoji datoteka pod scripts/MyTool/MyTool.js koja će biti prevedena u dodatak. Čim se dodatak učita, datoteka će biti dostupna pod putanjom “:/scripts/MyTool/MyTool.js”. QCAD će automatski pronaći alat pod tom putanjom jer pretražuje mapu “scripts” kao i “:/scripts” za skriptama.

Također moramo dodati qrc datoteku u projektnu datoteku (exampleplugin.pro) dodavanjem sljedećeg retka:

RESOURCES = scripts.qrc

Nakon uređivanja datoteke exampleplugin.pro, ponovno pokrenite qmake i make te učitajte dodatak. Sada bi na vrhu izbornika Razno u QCAD-u trebala postojati stavka izbornika “MyTool”.

Potpuni izvorni kod za ovaj primjer dodatka možete pronaći na:

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

  • Ako se vaš dodatak prevodi, ali ga QCAD ne može učitati, provjerite koristi li se ista verzija Qt-a kao za QCAD (pogledajte Pomoć > O programu QCAD). Provjerite je li vaš dodatak, ako se QCAD pokreće u načinu izdanja, također preveden u načinu izdanja.
  • Pokrenite QCAD iz terminala ili naredbenog retka i provjerite izlaz konzole za poruke o pogreškama. Ispišite poruke u svom dodatku kako biste potvrdili da se učitava. Na primjer, u funkciji init.
  • Provjerite ima li poruka o pogreškama u dijalogu o programu (Pomoć > O programu QCAD > Dodaci).