Skip to content

Створення плагіна 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

Включення в рядку 3 має вказувати на файл shared.pri інсталяції вихідного коду QCAD (напр., qcad/shared.pri). Як DESTDIR ви, можливо, захочете вибрати папку plugins робочої інсталяції 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. Ви також можете побачити повідомлення про помилку в діалоговому вікні «Про програму».

Компіляція скриптів як ресурсів у плагін

Section titled “Компіляція скриптів як ресурсів у плагін”

Плагіни 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 і завантажте плагін. Тепер у верхній частині меню Різне в QCAD має бути пункт меню «MyTool».

Повний вихідний код для цього прикладу плагіна можна знайти за адресою:

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

Усунення несправностей

Section titled “Усунення несправностей”
  • Якщо ваш плагін компілюється, але QCAD не може його завантажити, переконайтеся, що використовується та сама версія Qt, що й для QCAD (див. Довідка > Про QCAD). Переконайтеся, що якщо QCAD запущено в режимі release, ваш плагін також скомпільовано в режимі release.
  • Запустіть QCAD з термінала або командного рядка та перевірте вивід консолі на наявність повідомлень про помилки. Виводьте повідомлення у вашому плагіні, щоб підтвердити, що він завантажується. Наприклад, у вашій функції init.
  • Перевірте діалогове вікно «Про програму» (Довідка > Про QCAD > Плагіни) на наявність повідомлень про помилки.