Interaktyvūs scenarijaus veiksmai
Įvadas
Section titled “Įvadas”Scenarijaus veiksmai yra scenarijai, kurie prideda įrašą į meniu ir (arba) įrankių juostą ir kurie gali apdoroti naudotojo sąveikas. Scenarijaus veiksmai lieka aktyvūs, kol naudotojas juos nutraukia arba kol jie patys nutrūksta.
Įvykiai
Section titled “Įvykiai”Vos tik scenarijaus veiksmas paleidžiamas, jis apdoroja įvairius įvykius, kol nutraukiamas. Įvykis yra kažkas, kas įvyksta, jei kažkas vyksta. Pavyzdžiui, jei scenarijaus veiksmas paleidžiamas, iškviečiamas beginEvent. Jei naudotojas spustelėja objektą, suaktyvinamas pickEntity įvykis, jei naudotojas spustelėja koordinatę, įvyksta pickCoordinate įvykis ir t. t.
Minimali scenarijaus veiksmo struktūra yra tokia:
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 pavyzdinis scenarijus prideda meniu prie meniu Įvairūs > Pavyzdžiai apačios. Meniu tekstas yra “Minimal Example”.
Atkreipkite dėmesį, kad tam, jog scenarijus būtų surastas, failo pavadinimas turi atitikti klasės pavadinimą, t. y. šiuo atveju “ExMyMinimal.js”. Jis taip pat turi būti tokio paties pavadinimo “ExMyMinimal” kataloge, todėl šis scenarijus, pavyzdžiui, gali būti įdėtas į scripts/Misc/ExMyMinimal/ExMyMinimal.js.
Savo scenarijus taip pat galite įdėti į vietinį aplanką scripts, esantį jūsų naudotojo namų aplanke. Norėdami sužinoti tikslų aplanką, atverkite dialogo langą „Apie“ (Pagalba > Apie QCAD…) ir pereikite į kortelę Sistema. Ten duomenų vietą matysite prie Data directory. Tai katalogas, kuriame turite sukurti poaplankį pavadinimu scripts, o jame – poaplankius, po vieną aplanką kiekvienam scenarijaus įrankiui, pavyzdžiui /kelias/iki/duomenų katalogo/scripts/MyScripts/MyScript1/MyScript1.js
Tiksli vieta priklauso nuo jūsų sistemos ir jos konfigūracijos.
beginEvent pridėjimas
Section titled “beginEvent pridėjimas”Aukščiau pateiktas scenarijus yra visiškai veikiantis ir jį galima suaktyvinti. Tačiau suaktyvinus jis iš tikrųjų nieko nedaro. Be to, suaktyvintas scenarijus lieka aktyvus, kol naudotojas jį nutraukia spustelėdamas dešinįjį pelės klavišą. Kad tai pakeistume, įgyvendinkime beginEvent, kad išvestų kai ką į QCAD komandų eilutės istoriją ir nutrauktų veiksmą:
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"]);};Jei įrankis Įvairūs > Pavyzdžiai > Minimal Example dabar paleidžiamas, jis išveda “Hello World!” į komandų eilutės istoriją (12 eilutė) ir tada nutrūksta (14 eilutė).
Jei scenarijui nereikia jokios naudotojo sąveikos, tokį scenarijų galima naudoti norint pridėti meniu, kuris kažką padaro ir tada nutrūksta. Tokių veiksmų pavyzdžiai yra Peržiūrėti > Automatinis mastelis, Pasirinkti > Pasirinkti viską, Redaguoti > Ištrinti ir t. t.
Sąveikos pridėjimas
Section titled “Sąveikos pridėjimas”Vos tik scenarijui prireikia bet kokios naudotojo sąveikos, turime įgyvendinti daugiau įvykių apdorotuvų ir pasakyti scenarijui, ką naudotojas turi daryti toliau (pvz., pasirinkti objektą arba apibrėžti koordinatę). Kitame žingsnyje įeiname į būseną, kurioje veiksmas tikisi koordinatės iš naudotojo. Tada nubrėžiame apskritimą kiekvienoje pozicijoje, kurią naudotojas spustelėja arba įveda.
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 metode nebeliekame veiksmo iš karto, o leidžiame jam veikti, kol naudotojas jį nutrauks (dešinysis spustelėjimas arba Escape). Tada įgyvendiname pickCoordinate, kad išsaugotume pelės žymeklio poziciją arba įvestą koordinatę ir arba atnaujintume peržiūrą, arba pritaikytume operaciją (t. y. pridėtume apskritimą). pickCoordinate iškviečiamas kiekvieną kartą, kai naudotojas judina pelę, kad būtų parodyta planuojamos operacijos peržiūra. Kai naudotojas spustelėja arba įveda koordinatę, jis iškviečiamas su parametru preview, nustatytu į false, kad nurodytų, jog buvo pasirinkta arba įvesta galutinė koordinatė.
updatePreview 22 eilutėje parodo operacijos, kurią grąžina getOperation, peržiūrą, o applyOperation 25 eilutėje iš tikrųjų pritaiko operaciją mūsų dokumentui.
getOperation turi būti įgyvendintas taip, kad grąžintų operaciją, kurią reikia peržiūrėti arba pritaikyti dokumentui. Tai šiek tiek sudėtingiau nei tai, ką matėme paprastoje API aukščiau. Taip yra todėl, kad viena operacija gali būti naudojama keliems objektams pridėti, objektams modifikuoti arba objektams ištrinti.
Valdiklių pridėjimas prie parinkčių įrankių juostos
Section titled “Valdiklių pridėjimas prie parinkčių įrankių juostos”Mūsų pavyzdyje nubrėžto apskritimo spindulys visada yra 1 brėžinio vienetas (žr. 33 eilutę). Kitame žingsnyje norime leisti naudotojui įvesti apskritimo spindulį. QCAD paprastai naudoja viršuje esančią parinkčių įrankių juostą tokiems įrankio parametrams rodyti ir keisti. Tam turime apibrėžti, kokius valdiklius norime rodyti parinkčių įrankių juostoje ir kokius parametrus jie valdo. Tai galima padaryti su UI failu, XML failu, kuris apibrėžia valdiklį ir jo turinį. UI failus patogu projektuoti naudojant programinę įrangą, vadinamą Qt Designer, kuri yra Qt įrankių rinkinio dalis. Šiam pavyzdžiui naudojame paprastą UI failą, kurį taip pat galima sukurti teksto redaktoriuje (failas 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 failas apibrėžia du valdiklius: etiketę (QLabel) ir eilutės redagavimo lauką (RMathLineEdit). Svarbus yra eilutės redagavimo lauko pavadinimas (“Radius”). Valdiklis per šį pavadinimą automatiškai susiejamas su mūsų scenarijumi. Viskas, ką turime padaryti savo scenarijuje, tai apibrėžti, kurį UI failą norime naudoti (9 eilutė), ir įgyvendinti naują įvykio apdorotuvą, vadinamą slotRadiusChanged, tai yra “slot” + [mūsų eilutės redagavimo lauko pavadinimas] + “Changed” (45 eilutė):
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"]);};Ši nauja funkcija slotRadiusChanged iškviečiama kiekvieną kartą, kai naudotojas įveda naują spindulį. Ji nustato nario kintamąjį this.radius, kuris savo ruožtu naudojamas kuriant apskritimą getOperation metode.
Visi QCAD scenarijai pagrįsti viena iš šių šioje pamokoje aprašytų koncepcijų.
Kadangi kiekvienas QCAD įrankis aukščiausiu lygiu įgyvendinamas kaip scenarijus, yra daug prieinamų pavyzdinių scenarijų. Juos galite rasti mūsų git saugykloje.