Interaktīvas skripta darbības
Ievads
Section titled “Ievads”Skripta darbības ir skripti, kas pievieno ierakstu izvēlnei un/vai rīkjoslai un kas var apstrādāt lietotāja mijiedarbības. Skripta darbības paliek aktīvas, līdz lietotājs tās pārtrauc vai līdz tās pašas pārtraucas.
Notikumi
Section titled “Notikumi”Tiklīdz skripta darbība tiek palaista, tā apstrādā dažādus notikumus, līdz tā tiek pārtraukta. Notikums ir kaut kas, kas rodas, ja kaut kas notiek. Piemēram, ja skripta darbība tiek palaista, tiek izsaukts beginEvent. Ja lietotājs noklikšķina uz objekta, tiek aktivizēts pickEntity notikums, ja lietotājs noklikšķina uz koordinātes, rodas pickCoordinate notikums utt.
Skripta darbības minimālā struktūra ir šāda:
include("scripts/EAction.js");
function ExMyMinimal(guiAction) { EAction.call(this, guiAction);}
ExMyMinimal.prototype = new EAction();
ExMyMinimal.init = function(basePath) { var action = new RGuiAction(qsTr("&Minimal Example"), RMainWindowQt.getMainWindow()); action.setRequiresDocument(true); action.setScriptFile(basePath + "/ExMyMinimal.js"); action.setGroupSortOrder(100000); action.setSortOrder(0); action.setWidgetNames(["ExamplesMenu"]);};Šis piemēra skripts pievieno izvēlni izvēlnes Dažādi > Piemēri apakšā. Izvēlnes teksts ir “Minimal Example”.
Ņemiet vērā, ka, lai skripts tiktu atrasts, faila nosaukumam jāatbilst klases nosaukumam, t. i., šajā gadījumā “ExMyMinimal.js”. Tam arī jāatrodas direktorijā ar tādu pašu nosaukumu “ExMyMinimal”, tāpēc šo skriptu var, piemēram, ievietot scripts/Misc/ExMyMinimal/ExMyMinimal.js.
Savus skriptus varat ievietot arī vietējā mapē scripts jūsu lietotāja mājas mapē. Lai noskaidrotu precīzo mapi, atveriet dialoglodziņu „Par“ (Palīdzība > Par QCAD…) un dodieties uz cilni Sistēma. Tur datu atrašanās vietu varat redzēt pie Data directory. Šis ir direktorijs, kurā jums jāizveido apakšmape ar nosaukumu scripts un tajā apakšmapes, pa vienai mapei katram skriptu rīkam, piemēram /ceļš/uz/datu direktoriju/scripts/MyScripts/MyScript1/MyScript1.js
Precīza atrašanās vieta ir atkarīga no jūsu sistēmas un tās konfigurācijas.
beginEvent pievienošana
Section titled “beginEvent pievienošana”Iepriekš minētais skripts ir pilnībā funkcionāls, un to var aktivizēt. Tomēr, kad tas tiek aktivizēts, tas patiesībā neko nedara. Turklāt, kad tas ir aktivizēts, skripts paliek aktīvs, līdz lietotājs to pārtrauc, noklikšķinot ar labo peles pogu. Lai to mainītu, īstenosim beginEvent, lai izdrukātu kaut ko QCAD komandrindas vēsturē un pārtrauktu darbību:
include("scripts/EAction.js");
function ExMyMinimal(guiAction) { EAction.call(this, guiAction);}
ExMyMinimal.prototype = new EAction();
ExMyMinimal.prototype.beginEvent = function() { EAction.prototype.beginEvent.call(this);
EAction.handleUserMessage("Hello World!");
this.terminate();};
ExMyMinimal.init = function(basePath) { var action = new RGuiAction(qsTr("&Minimal Example"), RMainWindowQt.getMainWindow()); action.setRequiresDocument(true); action.setScriptFile(basePath + "/ExMyMinimal.js"); action.setGroupSortOrder(100000); action.setSortOrder(0); action.setWidgetNames(["ExamplesMenu"]);};Ja rīks Dažādi > Piemēri > Minimal Example tagad tiek palaists, tas izdrukā “Hello World!” komandrindas vēsturē (12. rinda) un pēc tam pārtraucas (14. rinda).
Ja skriptam nav nepieciešama nekāda lietotāja mijiedarbība, šādu skriptu var izmantot, lai pievienotu izvēlni, kas kaut ko dara un pēc tam pārtraucas. Šādu darbību piemēri ir Skatīt > Automātiskā tālummaiņa, Atlasīt > Atlasīt visu, Rediģēt > Dzēst utt.
Mijiedarbības pievienošana
Section titled “Mijiedarbības pievienošana”Tiklīdz skriptam nepieciešama jebkāda veida lietotāja mijiedarbība, mums jāīsteno vairāk notikumu apstrādātāju un jāpastāsta skriptam, kas lietotājam jādara tālāk (piem., objekta atlasīšana vai koordinātes definēšana). Nākamajā solī mēs ieejam stāvoklī, kurā darbība gaida koordināti no lietotāja. Pēc tam mēs zīmējam apli katrā pozīcijā, uz kuras lietotājs noklikšķina vai kuru ievada.
include("scripts/EAction.js");
function ExMyMinimal(guiAction) { EAction.call(this, guiAction);
this.pos = undefined;}
ExMyMinimal.prototype = new EAction();
ExMyMinimal.prototype.beginEvent = function() { EAction.prototype.beginEvent.call(this);
var di = this.getDocumentInterface(); di.setClickMode(RAction.PickCoordinate);};
ExMyMinimal.prototype.pickCoordinate = function(event, preview) { this.pos = event.getModelPosition();
if (preview) { this.updatePreview(); } else { this.applyOperation(); }};
ExMyMinimal.prototype.getOperation = function(preview) { var doc = this.getDocument();
var op = new RAddObjectOperation(); var circle = new RCircle(this.pos, 1); op.addObject(shapeToEntity(doc, circle)); return op;};
ExMyMinimal.init = function(basePath) { var action = new RGuiAction(qsTr("&Minimal Example"), RMainWindowQt.getMainWindow()); action.setRequiresDocument(true); action.setScriptFile(basePath + "/ExMyMinimal.js"); action.setGroupSortOrder(100000); action.setSortOrder(0); action.setWidgetNames(["ExamplesMenu"]);};beginEvent metodē mēs vairs nepārtraucam darbību nekavējoties, bet ļaujam tai darboties, līdz lietotājs to pārtrauc (labais klikšķis vai Escape). Pēc tam mēs īstenojam pickCoordinate, lai saglabātu peles kursora pozīciju vai ievadīto koordināti un vai nu atjauninātu priekšskatījumu, vai lietotu operāciju (t. i., pievienotu apli). pickCoordinate tiek izsaukts katru reizi, kad lietotājs pārvieto peli, lai parādītu plānotās operācijas priekšskatījumu. Kad lietotājs noklikšķina vai ievada koordināti, tas tiek izsaukts ar parametru preview, kas iestatīts uz false, lai norādītu, ka ir atlasīta vai ievadīta galīga koordināte.
updatePreview 22. rindā priekšskata operāciju, ko atgriež getOperation, savukārt applyOperation 25. rindā patiešām lieto operāciju mūsu dokumentam.
getOperation jāīsteno tā, lai atgrieztu operāciju, kas jāpriekšskata vai jālieto dokumentam. Tas ir nedaudz sarežģītāk nekā tas, ko mēs redzējām vienkāršajā API iepriekš. Tas ir tāpēc, ka vienu operāciju var izmantot, lai pievienotu vairākus objektus, modificētu objektus vai dzēstu objektus.
Logrīku pievienošana opciju rīkjoslai
Section titled “Logrīku pievienošana opciju rīkjoslai”Mūsu piemērā uzzīmētajam aplim vienmēr ir 1 rasēšanas vienības rādiuss (skatiet 33. rindu). Nākamajā solī mēs vēlamies ļaut lietotājam ievadīt apļa rādiusu. QCAD parasti izmanto opciju rīkjoslu augšpusē, lai parādītu un mainītu šādus rīka parametrus. Tam mums jādefinē, kurus logrīkus mēs vēlamies parādīt opciju rīkjoslā un kādus parametrus tie kontrolē. To var izdarīt ar UI failu, XML failu, kas definē logrīku un tā saturu. UI failus var ērti projektēt, izmantojot programmatūru ar nosaukumu Qt Designer, kas ir daļa no Qt rīkkopas. Šim piemēram mēs izmantojam vienkāršu UI failu, ko var arī izveidot teksta redaktorā (fails ExMyMinimal.ui):
<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>ExMyMinimal</class> <widget class="QWidget" name="ExMyMinimal"> <layout class="QHBoxLayout"> <item> <widget class="QLabel" name="RadiusLabel"> <property name="text"> <string>&Radius:</string> </property> <property name="buddy"> <cstring>Radius</cstring> </property> </widget> </item> <item> <widget class="RMathLineEdit" name="Radius"> <property name="text"> <string notr="true">1</string> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>RMathLineEdit</class> <extends>QLineEdit</extends> <header>RMathLineEdit.h</header> </customwidget> </customwidgets> <resources/> <connections/></ui>UI fails definē divus logrīkus: etiķeti (QLabel) un rindas rediģēšanas lauku (RMathLineEdit). Svarīgs ir rindas rediģēšanas lauka nosaukums (“Radius”). Logrīks caur šo nosaukumu tiek automātiski saistīts ar mūsu skriptu. Viss, kas mums jādara mūsu skriptā, ir jādefinē, kuru UI failu mēs vēlamies izmantot (9. rinda), un jāīsteno jauns notikumu apstrādātājs ar nosaukumu slotRadiusChanged, tas ir “slot” + [mūsu rindas rediģēšanas lauka nosaukums] + “Changed” (45. rinda):
include("scripts/EAction.js");
function ExMyMinimal(guiAction) { EAction.call(this, guiAction);
this.pos = undefined; this.radius = undefined;
this.setUiOptions("ExMyMinimal.ui");}
ExMyMinimal.prototype = new EAction();
ExMyMinimal.prototype.beginEvent = function() { EAction.prototype.beginEvent.call(this);
var di = this.getDocumentInterface(); di.setClickMode(RAction.PickCoordinate);};
ExMyMinimal.prototype.pickCoordinate = function(event, preview) { this.pos = event.getModelPosition();
if (preview) { this.updatePreview(); } else { this.applyOperation(); }};
ExMyMinimal.prototype.getOperation = function(preview) { if (isNull(this.pos) || isNull(this.radius)) { return undefined; }
var doc = this.getDocument();
var op = new RAddObjectOperation(); var circle = new RCircle(this.pos, this.radius); op.addObject(shapeToEntity(doc, circle)); return op;};
ExMyMinimal.prototype.slotRadiusChanged = function(v) { this.radius = v; this.updatePreview();};
ExMyMinimal.init = function(basePath) { var action = new RGuiAction(qsTr("&Minimal Example"), RMainWindowQt.getMainWindow()); action.setRequiresDocument(true); action.setScriptFile(basePath + "/ExMyMinimal.js"); action.setGroupSortOrder(100000); action.setSortOrder(0); action.setWidgetNames(["ExamplesMenu"]);};Šī jaunā funkcija slotRadiusChanged tiek izsaukta katru reizi, kad lietotājs ievada jaunu rādiusu. Tā iestata dalībnieka mainīgo this.radius, kas savukārt tiek izmantots, veidojot apli getOperation metodē.
Visi QCAD skripti ir balstīti uz vienu no šīm koncepcijām, kas izklāstītas šajā pamācībā.
Tā kā katrs QCAD rīks augšējā līmenī ir īstenots kā skripts, ir pieejams daudz piemēra skriptu. Tos varat atrast mūsu git repozitorijā.