การสร้างปลั๊กอิน QCAD
ปลั๊กอิน QCAD สามารถใช้ขยาย QCAD ด้วยฟังก์ชันการทำงานที่พัฒนาด้วย C หรือ C++ ได้
การทำ RPluginInterface
Section titled “การทำ RPluginInterface”ปลั๊กอิน QCAD ทั้งหมดต้องได้รับการสืบทอดโดยตรงหรือโดยอ้อมจาก QObject และคลาสฐานนามธรรม RPluginInterface
ไฟล์ RExamplePlugin.h
Section titled “ไฟล์ 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
Section titled “ไฟล์ 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
Section titled “ไฟล์ exampleplugin.pro”ในการคอมไพล์ปลั๊กอินของเรา เรายังต้องการไฟล์โปรเจกต์ Qt ที่สามารถแปลงเป็น Makefile ด้วย Qt qmake ได้
CONFIG += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -lqcadcore -lqcadgui -lqcadecmaapiinclude ในบรรทัดที่ 3 ควรชี้ไปยังไฟล์ shared.pri ของการติดตั้งซอร์สโค้ด QCAD (เช่น qcad/shared.pri) สำหรับ DESTDIR คุณอาจต้องการเลือกโฟลเดอร์ plugins ของการติดตั้ง QCAD ที่ใช้งานได้ เพื่อให้ปลั๊กอินถูกคอมไพล์ในตำแหน่งที่ถูกต้องซึ่ง QCAD สามารถโหลดได้ด้วย
การคอมไพล์
Section titled “การคอมไพล์”ปลั๊กอินของคุณสามารถคอมไพล์ได้ด้วยไฟล์สามไฟล์นี้ ซึ่งจะสร้างไฟล์ qcad/plugins/qcadexample.dll หรือ libqcadexample.so หรือ libqcadexample.dylib
หมายเหตุ: หากคุณรัน QCAD แบบไบนารีที่คอมไพล์ในโหมดดีบัก ปลั๊กอินต้องถูกคอมไพล์ในโหมดดีบักด้วย หากคุณรัน QCAD ในโหมดรีลีส ปลั๊กอินต้องถูกคอมไพล์ในโหมดรีลีสด้วยเช่นกัน
ในการคอมไพล์ปลั๊กอินในโหมดดีบัก ให้รัน:
Linux / macOS:
qmakemake debugWindows:
qmakenmake debugในการคอมไพล์ในโหมดรีลีส ให้รัน make release หรือ nmake release แทน
แน่นอนว่าปลั๊กอินยังไม่ทำอะไรที่เป็นประโยชน์ แต่คุณควรจะเห็นปลั๊กอินของคุณในกล่องโต้ตอบเกี่ยวกับของ QCAD:
หากคุณไม่เห็นปลั๊กอินของคุณ โปรดตรวจสอบข้อผิดพลาดในเทอร์มินัลขณะเริ่ม QCAD คุณอาจเห็นข้อความแสดงข้อผิดพลาดในกล่องโต้ตอบเกี่ยวกับด้วย
การคอมไพล์สคริปต์เป็นทรัพยากรลงในปลั๊กอิน
Section titled “การคอมไพล์สคริปต์เป็นทรัพยากรลงในปลั๊กอิน”ปลั๊กอิน QCAD อาจใช้คอมไพล์ชุดสคริปต์และทรัพยากรอื่น ๆ (ไฟล์ ui, ไอคอน เป็นต้น) ลงในปลั๊กอินได้ ข้อดีคือโค้ดของไฟล์ ECMAScript หลายไฟล์สามารถรวมเข้าด้วยกันไว้ในไฟล์ไบนารีที่คอมไพล์แล้วเพียงไฟล์เดียว ปลั๊กอินมักโหลดได้เร็วกว่าไฟล์แต่ละไฟล์จากดิสก์และใช้พื้นที่ดิสก์น้อยกว่า
ไฟล์ scripts/MyTool/MyTool.js
Section titled “ไฟล์ 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
Section titled “ไฟล์ 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
ซอร์สโค้ด
Section titled “ซอร์สโค้ด”คุณสามารถหาซอร์สโค้ดฉบับสมบูรณ์สำหรับปลั๊กอินตัวอย่างนี้ได้ที่:
https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin
การแก้ไขปัญหา
Section titled “การแก้ไขปัญหา”- หากปลั๊กอินของคุณคอมไพล์ได้แต่ QCAD โหลดไม่ได้ โปรดตรวจสอบให้แน่ใจว่าใช้ Qt เวอร์ชันเดียวกันกับ QCAD (ดู ช่วยเหลือ > เกี่ยวกับ QCAD) โปรดตรวจสอบให้แน่ใจว่าหาก QCAD รันในโหมดรีลีส ปลั๊กอินของคุณก็ถูกคอมไพล์ในโหมดรีลีสด้วย
- เปิด QCAD จากเทอร์มินัลหรือบรรทัดคำสั่ง และตรวจสอบเอาต์พุตของคอนโซลเพื่อดูข้อความแสดงข้อผิดพลาด แสดงข้อความในปลั๊กอินของคุณเพื่อยืนยันว่ากำลังถูกโหลด เช่น ในฟังก์ชัน init ของคุณ
- ตรวจสอบกล่องโต้ตอบเกี่ยวกับ (ช่วยเหลือ > เกี่ยวกับ QCAD > ปลั๊กอิน) เพื่อดูข้อความแสดงข้อผิดพลาด