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

include ในบรรทัดที่ 3 ควรชี้ไปยังไฟล์ shared.pri ของการติดตั้งซอร์สโค้ด QCAD (เช่น qcad/shared.pri) สำหรับ DESTDIR คุณอาจต้องการเลือกโฟลเดอร์ plugins ของการติดตั้ง QCAD ที่ใช้งานได้ เพื่อให้ปลั๊กอินถูกคอมไพล์ในตำแหน่งที่ถูกต้องซึ่ง QCAD สามารถโหลดได้ด้วย

ปลั๊กอินของคุณสามารถคอมไพล์ได้ด้วยไฟล์สามไฟล์นี้ ซึ่งจะสร้างไฟล์ qcad/plugins/qcadexample.dll หรือ libqcadexample.so หรือ libqcadexample.dylib

หมายเหตุ: หากคุณรัน QCAD แบบไบนารีที่คอมไพล์ในโหมดดีบัก ปลั๊กอินต้องถูกคอมไพล์ในโหมดดีบักด้วย หากคุณรัน QCAD ในโหมดรีลีส ปลั๊กอินต้องถูกคอมไพล์ในโหมดรีลีสด้วยเช่นกัน

ในการคอมไพล์ปลั๊กอินในโหมดดีบัก ให้รัน:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

ในการคอมไพล์ในโหมดรีลีส ให้รัน 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

  • หากปลั๊กอินของคุณคอมไพล์ได้แต่ QCAD โหลดไม่ได้ โปรดตรวจสอบให้แน่ใจว่าใช้ Qt เวอร์ชันเดียวกันกับ QCAD (ดู ช่วยเหลือ > เกี่ยวกับ QCAD) โปรดตรวจสอบให้แน่ใจว่าหาก QCAD รันในโหมดรีลีส ปลั๊กอินของคุณก็ถูกคอมไพล์ในโหมดรีลีสด้วย
  • เปิด QCAD จากเทอร์มินัลหรือบรรทัดคำสั่ง และตรวจสอบเอาต์พุตของคอนโซลเพื่อดูข้อความแสดงข้อผิดพลาด แสดงข้อความในปลั๊กอินของคุณเพื่อยืนยันว่ากำลังถูกโหลด เช่น ในฟังก์ชัน init ของคุณ
  • ตรวจสอบกล่องโต้ตอบเกี่ยวกับ (ช่วยเหลือ > เกี่ยวกับ QCAD > ปลั๊กอิน) เพื่อดูข้อความแสดงข้อผิดพลาด