Μετάβαση στο περιεχόμενο

Δημιουργία προσθέτου QCAD

Τα πρόσθετα QCAD μπορούν να χρησιμοποιηθούν για την επέκταση του QCAD με λειτουργικότητα υλοποιημένη σε C ή C++.

Όλα τα πρόσθετα QCAD πρέπει να προέρχονται άμεσα ή έμμεσα από το QObject και την αφηρημένη βασική κλάση RPluginInterface.

Για το πρώτο μας, μινιμαλιστικό παράδειγμα προσθέτου, προσθέτουμε κενές ή μινιμαλιστικές υλοποιήσεις για τις περισσότερες μεθόδους του RPluginInterface απευθείας στο αρχείο κεφαλίδας. Αυτή η αρχική δομή του αρχείου κεφαλίδας μπορεί να αντιγραφεί για να ληφθεί ένα πρώτο λειτουργικό πρόσθετο που μπορεί να φορτωθεί στο 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; }
};

Για τη μέθοδο getPluginInfo, προσθέτουμε μια απλή υλοποίηση στο αρχείο cpp ώστε να δούμε κάτι στο παράθυρο διαλόγου «Σχετικά» του 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

Για να μεταγλωττίσουμε το πρόσθετό μας, χρειαζόμαστε επίσης ένα αρχείο έργου Qt που μπορεί να μετατραπεί σε Makefile με το Qt qmake.

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

Το include στη γραμμή 3 θα πρέπει να δείχνει στο αρχείο shared.pri της εγκατάστασης του πηγαίου κώδικα QCAD (π.χ. qcad/shared.pri). Ως DESTDIR, ίσως θελήσετε να επιλέξετε τον φάκελο προσθέτων μιας λειτουργικής εγκατάστασης QCAD, ώστε το πρόσθετο να μεταγλωττιστεί στη σωστή θέση, από όπου μπορεί επίσης να φορτωθεί από το QCAD.

Το πρόσθετό σας μπορεί να μεταγλωττιστεί με αυτά τα τρία αρχεία, δημιουργώντας το αρχείο qcad/plugins/qcadexample.dll ή libqcadexample.so ή libqcadexample.dylib.

Σημείωση: εάν εκτελείτε ένα δυαδικό αρχείο QCAD μεταγλωττισμένο σε λειτουργία εντοπισμού σφαλμάτων (debug), το πρόσθετο πρέπει επίσης να μεταγλωττιστεί σε λειτουργία εντοπισμού σφαλμάτων. Εάν εκτελείτε το QCAD σε λειτουργία release, το πρόσθετο πρέπει να μεταγλωττιστεί επίσης σε λειτουργία release.

Για να μεταγλωττίσετε το πρόσθετο σε λειτουργία εντοπισμού σφαλμάτων, εκτελέστε:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Για να μεταγλωττίσετε σε λειτουργία release, εκτελέστε αντ’ αυτού make release ή nmake release.

Προφανώς, το πρόσθετο δεν θα κάνει ακόμη κάτι χρήσιμο, αλλά θα πρέπει να μπορείτε να δείτε το πρόσθετό σας στο παράθυρο διαλόγου «Σχετικά» του QCAD:

Το παράδειγμα προσθέτου που εμφανίζεται στο παράθυρο διαλόγου «Σχετικά» του QCAD

Εάν δεν μπορείτε να δείτε το πρόσθετό σας, ελέγξτε για σφάλματα στο τερματικό κατά την εκκίνηση του QCAD. Ίσως δείτε επίσης ένα μήνυμα σφάλματος στο παράθυρο διαλόγου «Σχετικά».

Μεταγλώττιση σεναρίων ως πόρων σε ένα πρόσθετο

Ενότητα με τίτλο «Μεταγλώττιση σεναρίων ως πόρων σε ένα πρόσθετο»

Τα πρόσθετα QCAD μπορούν να χρησιμοποιηθούν για τη μεταγλώττιση μιας συλλογής σεναρίων και άλλων πόρων (αρχεία ui, εικονίδια κ.λπ.) σε ένα πρόσθετο. Αυτό έχει το πλεονέκτημα ότι ο κώδικας πολλαπλών αρχείων ECMAScript μπορεί να ομαδοποιηθεί μέσα σε ένα μόνο, μεταγλωττισμένο δυαδικό αρχείο. Τα πρόσθετα τείνουν να φορτώνονται ταχύτερα από μεμονωμένα αρχεία από τον δίσκο και καταλαμβάνουν λιγότερο χώρο στον δίσκο.

Ας υποθέσουμε ότι υπάρχει ένας φάκελος scripts/MyTool με ένα αρχείο MyTool.js που περιέχει ένα εργαλείο QCAD, υλοποιημένο σε ECMAScript. Το εργαλείο προστίθεται στην κορυφή του μενού Διάφορα και εξάγει «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"]);
};

Για να μεταγλωττίσουμε αυτό το εργαλείο σεναρίου στο πρόσθετό μας C++, πρέπει να δημιουργήσουμε ένα αρχείο πόρων Qt που κατευθύνει το qmake στο αρχείο που θέλουμε να μεταγλωττίσουμε στο πρόσθετο:

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

Το αρχείο qrc παραθέτει τις διαδρομές υπό τις οποίες οι πόροι θα διατεθούν στο σύστημα πόρων του Qt (alias=“scripts/MyTool/MyTool.js”) και την πραγματική διαδρομή όπου μπορεί να βρεθεί το αρχείο στον δίσκο (χρησιμοποιείται μόνο για μεταγλώττιση). Το παραπάνω παράδειγμα σημαίνει ότι υπάρχει ένα αρχείο στον δίσκο υπό το scripts/MyTool/MyTool.js που θα μεταγλωττιστεί στο πρόσθετο. Μόλις φορτωθεί το πρόσθετο, το αρχείο θα είναι διαθέσιμο υπό τη διαδρομή “:/scripts/MyTool/MyTool.js”. Το QCAD θα βρει το εργαλείο αυτόματα υπό αυτήν τη διαδρομή, καθώς σαρώνει τον φάκελο «scripts» καθώς και το “:/scripts” για σενάρια.

Πρέπει επίσης να προσθέσουμε το αρχείο qrc στο αρχείο έργου (exampleplugin.pro) προσθέτοντας την ακόλουθη γραμμή:

RESOURCES = scripts.qrc

Μετά την επεξεργασία του αρχείου exampleplugin.pro, εκτελέστε ξανά qmake και make και φορτώστε το πρόσθετο. Θα πρέπει τώρα να υπάρχει μια καταχώρηση μενού «MyTool» στην κορυφή του μενού Διάφορα στο QCAD.

Μπορείτε να βρείτε τον πλήρη πηγαίο κώδικα για αυτό το παράδειγμα προσθέτου στη διεύθυνση:

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

  • Εάν το πρόσθετό σας μεταγλωττίζεται αλλά δεν μπορεί να φορτωθεί από το QCAD, βεβαιωθείτε ότι χρησιμοποιείται η ίδια έκδοση Qt όπως για το QCAD (δείτε Βοήθεια > Σχετικά με το QCAD). Βεβαιωθείτε ότι εάν το QCAD εκτελείται σε λειτουργία release, το πρόσθετό σας μεταγλωττίζεται επίσης σε λειτουργία release.
  • Εκκινήστε το QCAD από ένα τερματικό ή τη γραμμή εντολών και ελέγξτε την έξοδο κονσόλας για μηνύματα σφάλματος. Εξάγετε μηνύματα στο πρόσθετό σας για να επιβεβαιώσετε ότι φορτώνεται. Για παράδειγμα στη συνάρτηση init.
  • Ελέγξτε το παράθυρο διαλόγου «Σχετικά» (Βοήθεια > Σχετικά με το QCAD > Πρόσθετα) για μηνύματα σφάλματος.