Skip to content

Създаване на приставка за QCAD

Приставките за QCAD могат да се използват за разширяване на QCAD с функционалност, реализирана на C или C++.

Реализиране на RPluginInterface

Section titled “Реализиране на RPluginInterface”

Всички приставки за 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 може да искате да изберете папката с приставки на работеща инсталация на 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 отново и заредете приставката. Сега трябва да има елемент от менюто „MyTool” в горната част на менюто Разни в QCAD.

Можете да намерите пълния изходен код за тази примерна приставка на:

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

Отстраняване на неизправности

Section titled “Отстраняване на неизправности”
  • Ако вашата приставка се компилира, но не може да бъде заредена от QCAD, моля, уверете се, че се използва същата версия на Qt като за QCAD (вижте Помощ > За QCAD). Моля, уверете се, че ако QCAD се изпълнява в режим release, вашата приставка също е компилирана в режим release.
  • Стартирайте QCAD от терминал или командния ред и проверете конзолния изход за съобщения за грешки. Извеждайте съобщения във вашата приставка, за да потвърдите, че се зарежда. Например във вашата функция init.
  • Проверете диалога „За” (Помощ > За QCAD > Приставки) за съобщения за грешки.