Skip to content

QCAD-liitännäisen luominen

QCAD-liitännäisillä voidaan laajentaa QCADia C- tai C++-kielellä toteutetulla toiminnallisuudella.

Kaikki QCAD-liitännäiset on johdettava suoraan tai epäsuorasti QObjectista ja abstraktista kantaluokasta RPluginInterface.

Ensimmäistä, minimalistista esimerkkiliitännäistämme varten lisäämme tyhjät tai minimalistiset toteutukset useimmille RPluginInterfacen metodeille suoraan otsikkotiedostoon. Tämän otsikkotiedoston lähtörakenteen voi kopioida saadakseen ensimmäisen toimivan liitännäisen, joka voidaan ladata QCADiin.

#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; }
};

Metodille getPluginInfo lisäämme yksinkertaisen toteutuksen cpp-tiedostoon, jotta näemme jotakin QCADin tietoja-valintaikkunassa.

#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

Liitännäisemme kääntämiseksi tarvitsemme myös Qt-projektitiedoston, joka voidaan muuntaa Makefileksi Qt qmake -työkalulla.

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

Rivin 3 include-määrityksen tulisi osoittaa QCADin lähdekoodiasennuksen tiedostoon shared.pri (esim. qcad/shared.pri). DESTDIR-kohteeksi kannattaa valita toimivan QCAD-asennuksen plugins-kansio, jotta liitännäinen käännetään oikeaan paikkaan, josta QCAD voi myös ladata sen.

Liitännäisesi voidaan kääntää näillä kolmella tiedostolla, jolloin syntyy tiedosto qcad/plugins/qcadexample.dll, libqcadexample.so tai libqcadexample.dylib.

Huomaa: jos ajat vianjäljitystilassa (debug) käännettyä QCAD-binaaria, myös liitännäinen on käännettävä vianjäljitystilassa. Jos ajat QCADia julkaisutilassa (release), myös liitännäinen on käännettävä julkaisutilassa.

Kääntääksesi liitännäisen vianjäljitystilassa suorita:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Kääntääksesi julkaisutilassa suorita sen sijaan make release tai nmake release.

Liitännäinen ei tietenkään vielä tee mitään hyödyllistä, mutta sinun pitäisi nähdä liitännäisesi QCADin tietoja-valintaikkunassa:

Esimerkkiliitännäinen lueteltuna QCADin tietoja-valintaikkunassa

Jos et näe liitännäistäsi, tarkista päätteestä virheet QCADia käynnistettäessä. Saatat myös nähdä virheilmoituksen tietoja-valintaikkunassa.

Skriptien kääntäminen resursseiksi liitännäiseen

Section titled “Skriptien kääntäminen resursseiksi liitännäiseen”

QCAD-liitännäisiä voidaan käyttää kokoelman skriptejä ja muita resursseja (ui-tiedostoja, kuvakkeita jne.) kääntämiseen liitännäiseen. Tästä on se etu, että useiden ECMAScript-tiedostojen koodi voidaan niputtaa yhteen käännettyyn binaaritiedostoon. Liitännäiset latautuvat yleensä nopeammin kuin yksittäiset tiedostot levyltä ja vievät vähemmän levytilaa.

Oletetaan, että on olemassa kansio scripts/MyTool, jossa on tiedosto MyTool.js, joka sisältää ECMAScriptillä toteutetun QCAD-työkalun. Työkalu lisää itsensä Sekalaiset-valikon yläosaan ja tulostaa “Hello World” käynnistettäessä.

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

Kääntääksemme tämän skriptityökalun C++-liitännäiseemme meidän on luotava Qt-resurssitiedosto, joka osoittaa qmakelle tiedoston, jonka haluamme kääntää liitännäiseen:

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

qrc-tiedosto luettelee polut, joiden alla resurssit saatetaan käytettäviksi Qt:n resurssijärjestelmässä (alias=“scripts/MyTool/MyTool.js”), sekä varsinaisen polun, josta tiedosto löytyy levyltä (käytetään vain kääntämiseen). Yllä oleva esimerkki tarkoittaa, että levyllä on tiedosto polussa scripts/MyTool/MyTool.js, joka käännetään liitännäiseen. Heti kun liitännäinen ladataan, tiedosto on käytettävissä polussa “:/scripts/MyTool/MyTool.js”. QCAD löytää työkalun automaattisesti tästä polusta, koska se etsii skriptejä sekä “scripts”- että “:/scripts”-kansiosta.

Meidän on myös lisättävä qrc-tiedosto projektitiedostoon (exampleplugin.pro) lisäämällä seuraava rivi:

RESOURCES = scripts.qrc

Kun olet muokannut tiedostoa exampleplugin.pro, suorita qmake ja make uudelleen ja lataa liitännäinen. Nyt QCADin Sekalaiset-valikon yläosassa pitäisi olla valikkokohta “MyTool”.

Löydät tämän esimerkkiliitännäisen täydellisen lähdekoodin osoitteesta:

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

  • Jos liitännäisesi kääntyy mutta QCAD ei voi ladata sitä, varmista, että käytössä on sama Qt-versio kuin QCADilla (katso Ohje > Tietoja QCADista). Varmista, että jos QCAD ajetaan julkaisutilassa, myös liitännäisesi on käännetty julkaisutilassa.
  • Käynnistä QCAD päätteestä tai komentoriviltä ja tarkista konsolitulosteesta virheilmoitukset. Tulosta viestejä liitännäisestäsi vahvistaaksesi, että se latautuu. Esimerkiksi init-funktiossasi.
  • Tarkista tietoja-valintaikkuna (Ohje > Tietoja QCADista > Liitännäiset) virheilmoitusten varalta.