2017-11-15 4 views
-1

Wie soll ich (manuell) den von Matlab GUIDE GUI erstellten Code konvertieren, um Octaves UI-Komponenten zu verwenden?Manuelle Umwandlung von Matlab GUIDE GUI-Code in Octave UI-Komponenten

Stuff wie folgt aus:

gui_Singleton = 1; 
gui_State = struct('gui_Name',  mfilename, ... 
       'gui_Singleton', gui_Singleton, ... 
       'gui_OpeningFcn', @Mat_to_Octave_OpeningFcn, ... 
       'gui_OutputFcn', @Mat_to_Octave_OutputFcn, ... 
       'gui_LayoutFcn', [] , ... 
       'gui_Callback', []); 
if nargin && ischar(varargin{1}) 
    gui_State.gui_Callback = str2func(varargin{1}); 
end 

etc. etc.

  1. Wo kann ich eine umfassende Liste der Elemente finden, die ich brauche zu ersetzen?

  2. Wie erstelle ich das Äquivalent der GUIDE Callback-Funktion für Octave UI elements und kann ich eine einzelne Callback-Funktion für alle Elemente machen? Vielleicht gibt es hier einen Unterschied zwischen den beiden.

  3. Ist der GUID-GUI-Code geöffnet oder Open Source? Es surely seems so here.

  4. Ist das UI-Layout, das vom Benutzer im GUIDE festgelegt wurde, zugänglich? Wir wissen, wo die Einstellungen für die Breite und die Textfarbe der Schaltfläche gespeichert sind.

  5. Gibt es irgendwo eine umfassende Liste? Wenn ja, wo? Sind alle oder zumindest die meisten Elemente von GUIDE in UI-Komponenten verfügbar? Wie kann ich das überprüfen?

  6. Gibt es etwas, das ich vor Beginn der Aufgabe weggelassen habe?

+0

Nicht sicher, wo ich damit anfangen soll. Die Syntax zum Erstellen von UI-Elementen in Matlab sollte der Oktave entsprechen. GUIDE ist ein grafisches "Werkzeug", mit dem Matlab unerfahrenen Benutzern hilft, aber ansonsten sollte es nur den relevanten Code generieren, der in der Oktave größtenteils identisch sein sollte. Es ist ganz sicher nicht "Open Source", geschweige denn Copyleft; Ich denke nicht, dass der von Ihnen angegebene Link etwas damit zu tun hat. Ich bin mir nicht sicher, was der obige Code tun soll. Die verschiedenen Eigenschaften (z.B. Breite, Farbe) sind Teil des erzeugten Objekts und können unter Verwendung der Standard-Get/Set-Funktionen abgefragt werden. –

+0

Vielen Dank. Also GUIDE erstellt tatsächlich Code, der "UI-Elemente" verwendet, und diese sind die gleichen für Octave? Ich denke nicht. Die Octave-UI-Elemente wurden erst spät in der Entwicklung hinzugefügt, und die aktuellen Octave-Versionen (2017) erkennen die von GUIDE erstellten Seiten nicht. Vielleicht bin ich falsch. Ich habe begrenzte Erfahrungen bei der Portierung von Projekten von Matlab ot Octave. – pashute

+0

Ich habe keinen Zugang mehr zu Matlab, um das zu testen, aber im Allgemeinen sollten Matlab und Octave GUI-Code größtenteils kompatibel sein. Ein kleiner Haken ist, dass Octave ein wenig unglücklich ist über Callback-Funktionen, die vorerst als verschachtelte Funktionen definiert sind; Ich glaube, dass der meiste Matlab-Code auf diese Weise geschachtelte Funktionen verwendet, also könnte das der Fehler sein, den Sie haben. Beispiele für eine einfache GUI in beiden Sprachen finden Sie unter https://stackoverflow.com/q/40570494/4183191 und https://stackoverflow.com/q/43519040/4183191, insbesondere Andys Beispiel in der zweiten Frage. Diese richten sich auch an die Verwendung der Callback-Funktion. –

Antwort

1

In den meisten Fällen ist die GUI-Erstellung auf Oktave identisch mit Matlab. GUI-Erstellung ist eine relativ neue Ergänzung zur Oktave, also erwarten Sie, dass einige der neueren Additionen in der Matlab-Familie es noch nicht in Oktave geschafft haben, aber Matlab-Code, der eine GUI-Anwendung implementiert, sollte Octave mit Octaves funktionieren keine oder sehr wenig Notwendigkeit zum Tweaking. Hier finden Sie die entsprechenden manuellen Eingaben für matlab und octave; Sie werden feststellen, dass die Kernfunktionen identisch sind.

Ein wichtiger "Haken" ist, dass Octave keine Griffe für verschachtelte Funktionen unterstützt (dies könnte sich später ändern). Betrachten Sie zum Beispiel den folgenden Matlab-Code, der eine einfache GUI mit einem Schieberegler implementiert, der sich auf ein Diagramm auswirkt (aus this answer).

%%%%%% In file myplot.m %%%%% 
function myplot 

    %% Create initial figure and spiral plot 
    figure; axes ('position', [0.1, 0.3, 0.8, 0.6]); 
    t = linspace (0, 8*pi, 100); x = t .* cos(t); y = t .* sin(t); 
    plot (x, y); axis ([-100, 100, -100, 100]); 

    %% Add ui 'slider' element  
    hslider = uicontrol (     ... 
     'style', 'slider',    ... 
     'Units', 'normalized',   ... 
     'position', [0.1, 0.1, 0.8, 0.1], ... 
     'min', 1,       ... 
     'max', 50,      ... 
     'value', 10,      ... 
     'callback', {@plotstuff}   ... 
     ); 

    %% Callback function called by slider event 
    function plotstuff (h, event) 
    n = get (h, 'value'); 
    x = n * t .* cos(t); y = n * t .* sin(t); 
    plot (x, y); axis ([-100, 100, -100, 100]); 
    end 
end 

Wenn Sie dies auf Oktave versuchen läuft, wird die folgende Fehlermeldung erhalten:

>> myplot
error: handles to nested functions are not yet supported
error: called from myplot at line 10 column 11

Konvertieren der verschachtelten Funktion in eine eigenständige Funktion oder Unterfunktion dies löst (wie in this answer gezeigt).

Wie bei GUIDE, während Octave kein ähnliches "benutzerfreundliches" grafisches Werkzeug für die GUI-App-Erstellung hat, am Ende des Tages, alle GUIDE-Does produzieren entsprechenden zugrunde liegenden Code für die Erstellung von UI-Elementen, welches in der Theorie mit Oktave kompatibel sein sollte. Nichtsdestotrotz lohnt es sich, genau zu lesen, welche Dateien GUIDE erstellt, nämlich eine '.fig'-Datei, die das Figurenelement lädt, und eine'Funktion'-Datei, die Rückrufe und tatsächlichen Code usw. enthält In der Oktave wird wahrscheinlich zuerst die Figur "geladen". Außerdem kann GUIDE in der Praxis verschachtelte Funktionen für Rückrufe verwenden, so dass der Code einige Anpassungen vornehmen kann, um diese in geeignete Unterfunktionen umzuwandeln, damit sie in der Oktave funktionieren.

Having said that, GUIDE wirklich mehr für Leute, die gerne ‚tatsächlichen‘ Code zu vermeiden, aber in der Tat, die Codierung der GUI in Matlab/Oktave direkt wahrscheinlich viel einfacher ist, wenn Sie mit vertraut sind, wie get/set Befehle bearbeiten die ui-Element-Eigenschaften. Und wenn Sie nach GUI-Lösungen suchen, die sowohl für Oktave als auch für Matlab geeignet sind, würde ich Ihnen raten, diesen Weg zu gehen und sich an Unterfunktionen anstelle von verschachtelten Funktionen zu halten.

die restlichen zwei Fragen zu beantworten, die nicht durch die oben abgedeckt haben:

  • Nein, GUIDE nicht Open Source ist (allein freie Software lassen). Es handelt sich um proprietären Code von Mathworks, der ihre Lizenz verwendet. Insbesondere könnte es theoretisch zu Lizenzproblemen bei der Verwendung von GUIDE-generiertem Code mit Oktav kommen, aber ich weiß es nicht genau.

  • GUIDE generiert direkt eine .fig-Datei. Dies ist eine Binärdatei, die auf Matlab (und theoretisch Oktave) geladen werden kann. Mit GUIDE gibt es keine andere Quelldatei, in der die Elemente und ihre Eigenschaften aufgeführt sind, mit denen diese Figur erstellt wurde. Nachdem Sie die Matlab geladen haben, können Sie, sobald die Figur geladen ist, den Quellcode aus dem grafischen Menü der Figur exportieren, das diese Figur bei Bedarf neu erstellt. Dies ist jedoch möglicherweise nicht der benutzerfreundlichste Code zum Anschauen. Dies ist einer der Gründe, den programmatischen Ansatz gegenüber GUIDE zu bevorzugen: Sie haben sauberen, klaren Quellcode, der die Eigenschaften der Uielements programmatisch detailliert, anstatt sie durch Laden einer Figur und Durchsuchen ihrer Eigenschaften auszufischen.

+1

Sie beantworteten meine Fragen vollständig, obwohl für den Rekord: Wir haben Hunderttausende von Codezeilen, die viele von ihnen mit GUIDE gemacht haben und sie portieren wollten, ohne in den eigentlichen Code zu gehen und es ein zweites Mal zu schreiben. – pashute

+0

Ah. Danke, das bringt mehr Licht in Ihre spezielle Situation. Ich denke, in einem Extremfall ist es sehr unwahrscheinlich, dass GUIDE-generierte Dateien ohne jede Feinabstimmung auf Octaves "einfach funktionieren", auf der anderen Seite sollte es eher darum gehen, etwas zu tun, anstatt es komplett neu zu schreiben. Es lohnt sich wahrscheinlich, das oben beschriebene Verfahren mit den Originaldateien in Matlab durchzuführen, um Skripte aus .fig-Dateien zu generieren und diese (z. B. um verschachtelte Funktionen in Unterfunktionen umzuwandeln) entsprechend anzupassen. Wenn Sie bestimmte Dateien haben, die fehlschlagen, können Sie hier immer einen solchen speziellen Anwendungsfall stellen. –

+0

Der Code in meiner Frage ist typisch dafür.Erstellt von GUIDE – pashute

Verwandte Themen