Δημιουργία προσθέτου QCAD
Εισαγωγή
Ενότητα με τίτλο «Εισαγωγή»Τα πρόσθετα QCAD μπορούν να χρησιμοποιηθούν για την επέκταση του QCAD με λειτουργικότητα υλοποιημένη σε C ή C++.
Υλοποίηση του RPluginInterface
Ενότητα με τίτλο «Υλοποίηση του RPluginInterface»Όλα τα πρόσθετα QCAD πρέπει να προέρχονται άμεσα ή έμμεσα από το QObject και την αφηρημένη βασική κλάση RPluginInterface.
Αρχείο RExamplePlugin.h
Ενότητα με τίτλο «Αρχείο RExamplePlugin.h»Για το πρώτο μας, μινιμαλιστικό παράδειγμα προσθέτου, προσθέτουμε κενές ή μινιμαλιστικές υλοποιήσεις για τις περισσότερες μεθόδους του 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; }};Αρχείο RExamplePlugin.cpp
Ενότητα με τίτλο «Αρχείο RExamplePlugin.cpp»Για τη μέθοδο 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 < 0x050000QT_BEGIN_NAMESPACEQ_EXPORT_PLUGIN2(example, RExamplePlugin)QT_END_NAMESPACE#endifΑρχείο exampleplugin.pro
Ενότητα με τίτλο «Αρχείο exampleplugin.pro»Για να μεταγλωττίσουμε το πρόσθετό μας, χρειαζόμαστε επίσης ένα αρχείο έργου Qt που μπορεί να μετατραπεί σε Makefile με το Qt qmake.
CONFIG += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -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:
qmakemake debugWindows:
qmakenmake debugΓια να μεταγλωττίσετε σε λειτουργία release, εκτελέστε αντ’ αυτού make release ή nmake release.
Προφανώς, το πρόσθετο δεν θα κάνει ακόμη κάτι χρήσιμο, αλλά θα πρέπει να μπορείτε να δείτε το πρόσθετό σας στο παράθυρο διαλόγου «Σχετικά» του QCAD:
Εάν δεν μπορείτε να δείτε το πρόσθετό σας, ελέγξτε για σφάλματα στο τερματικό κατά την εκκίνηση του QCAD. Ίσως δείτε επίσης ένα μήνυμα σφάλματος στο παράθυρο διαλόγου «Σχετικά».
Μεταγλώττιση σεναρίων ως πόρων σε ένα πρόσθετο
Ενότητα με τίτλο «Μεταγλώττιση σεναρίων ως πόρων σε ένα πρόσθετο»Τα πρόσθετα QCAD μπορούν να χρησιμοποιηθούν για τη μεταγλώττιση μιας συλλογής σεναρίων και άλλων πόρων (αρχεία ui, εικονίδια κ.λπ.) σε ένα πρόσθετο. Αυτό έχει το πλεονέκτημα ότι ο κώδικας πολλαπλών αρχείων ECMAScript μπορεί να ομαδοποιηθεί μέσα σε ένα μόνο, μεταγλωττισμένο δυαδικό αρχείο. Τα πρόσθετα τείνουν να φορτώνονται ταχύτερα από μεμονωμένα αρχεία από τον δίσκο και καταλαμβάνουν λιγότερο χώρο στον δίσκο.
Αρχείο scripts/MyTool/MyTool.js
Ενότητα με τίτλο «Αρχείο scripts/MyTool/MyTool.js»Ας υποθέσουμε ότι υπάρχει ένας φάκελος 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"]);};Αρχείο scripts.qrc
Ενότητα με τίτλο «Αρχείο scripts.qrc»Για να μεταγλωττίσουμε αυτό το εργαλείο σεναρίου στο πρόσθετό μας 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 > Πρόσθετα) για μηνύματα σφάλματος.